From de55db2352f84c101f8197ee7aca80d72807fbc5 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Mon, 10 Jun 2024 08:14:23 +0000 Subject: [PATCH 001/471] 8333522: JFR SwapSpace event might read wrong free swap space size Reviewed-by: sgehwolf, lucy --- src/hotspot/os/linux/os_linux.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp index 20d3c99cd3eac..00ee35193011c 100644 --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -314,7 +314,10 @@ static jlong host_free_swap() { } jlong os::free_swap_space() { - jlong host_free_swap_val = host_free_swap(); + // os::total_swap_space() might return the containerized limit which might be + // less than host_free_swap(). The upper bound of free swap needs to be the lower of the two. + jlong host_free_swap_val = MIN2(os::total_swap_space(), host_free_swap()); + assert(host_free_swap_val >= 0, "sysinfo failed?"); if (OSContainer::is_containerized()) { jlong mem_swap_limit = OSContainer::memory_and_swap_limit_in_bytes(); jlong mem_limit = OSContainer::memory_limit_in_bytes(); From 8aa35cacfcc94d261de102b628eb954c71eae98e Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Mon, 10 Jun 2024 08:18:27 +0000 Subject: [PATCH 002/471] 8333833: Remove the use of ByteArrayLittleEndian from UUID::toString Reviewed-by: liach, redestad --- .../share/classes/java/util/UUID.java | 43 ++++++------------- .../classes/jdk/internal/util/HexDigits.java | 31 ++++++------- 2 files changed, 27 insertions(+), 47 deletions(-) diff --git a/src/java.base/share/classes/java/util/UUID.java b/src/java.base/share/classes/java/util/UUID.java index a82f523a66ffa..e334f7263e46f 100644 --- a/src/java.base/share/classes/java/util/UUID.java +++ b/src/java.base/share/classes/java/util/UUID.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,6 @@ import jdk.internal.access.JavaLangAccess; import jdk.internal.access.SharedSecrets; -import jdk.internal.util.ByteArrayLittleEndian; import jdk.internal.util.HexDigits; /** @@ -467,38 +466,24 @@ public long node() { */ @Override public String toString() { - long lsb = leastSigBits; - long msb = mostSigBits; + int i0 = (int) (mostSigBits >> 32); + int i1 = (int) mostSigBits; + int i2 = (int) (leastSigBits >> 32); + int i3 = (int) leastSigBits; + byte[] buf = new byte[36]; - ByteArrayLittleEndian.setLong( - buf, - 0, - HexDigits.packDigits((int) (msb >> 56), (int) (msb >> 48), (int) (msb >> 40), (int) (msb >> 32))); + HexDigits.put4(buf, 0, i0 >> 16); + HexDigits.put4(buf, 4, i0); buf[8] = '-'; - ByteArrayLittleEndian.setInt( - buf, - 9, - HexDigits.packDigits(((int) msb) >> 24, ((int) msb) >> 16)); + HexDigits.put4(buf, 9, i1 >> 16); buf[13] = '-'; - ByteArrayLittleEndian.setInt( - buf, - 14, - HexDigits.packDigits(((int) msb) >> 8, (int) msb)); + HexDigits.put4(buf, 14, i1); buf[18] = '-'; - ByteArrayLittleEndian.setInt( - buf, - 19, - HexDigits.packDigits((int) (lsb >> 56), (int) (lsb >> 48))); + HexDigits.put4(buf, 19, i2 >> 16); buf[23] = '-'; - ByteArrayLittleEndian.setLong( - buf, - 24, - HexDigits.packDigits((int) (lsb >> 40), (int) (lsb >> 32), ((int) lsb) >> 24, ((int) lsb) >> 16)); - ByteArrayLittleEndian.setInt( - buf, - 32, - HexDigits.packDigits(((int) lsb) >> 8, (int) lsb)); - + HexDigits.put4(buf, 24, i2); + HexDigits.put4(buf, 28, i3 >> 16); + HexDigits.put4(buf, 32, i3); try { return jla.newStringNoRepl(buf, StandardCharsets.ISO_8859_1); } catch (CharacterCodingException cce) { diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index 075443571e198..c08db4f5b48fd 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -114,24 +114,19 @@ public static short digitPair(int i, boolean ucase) { } /** - * Return a little-endian packed integer for the 4 ASCII bytes for an input unsigned 2-byte integer. - * {@code b0} is the most significant byte and {@code b1} is the least significant byte. - * The integer is passed byte-wise to allow reordering of execution. + * Insert the unsigned 2-byte integer into the buffer as 4 hexadecimal digit ASCII bytes, + * only least significant 16 bits of {@code value} are used. + * @param buffer byte buffer to copy into + * @param index insert point + * @param value to convert */ - public static int packDigits(int b0, int b1) { - return DIGITS[b0 & 0xff] | (DIGITS[b1 & 0xff] << 16); - } - - /** - * Return a little-endian packed long for the 8 ASCII bytes for an input unsigned 4-byte integer. - * {@code b0} is the most significant byte and {@code b3} is the least significant byte. - * The integer is passed byte-wise to allow reordering of execution. - */ - public static long packDigits(int b0, int b1, int b2, int b3) { - return DIGITS[b0 & 0xff] - | (DIGITS[b1 & 0xff] << 16) - | (((long) DIGITS[b2 & 0xff]) << 32) - | (((long) DIGITS[b3 & 0xff]) << 48); + public static void put4(byte[] buffer, int index, int value) { + // Prepare an int value so C2 generates a 4-byte write instead of two 2-byte writes + int v = (DIGITS[value & 0xff] << 16) | DIGITS[(value >> 8) & 0xff]; + buffer[index] = (byte) v; + buffer[index + 1] = (byte) (v >> 8); + buffer[index + 2] = (byte) (v >> 16); + buffer[index + 3] = (byte) (v >> 24); } /** From 83b34410e326c47f357a37c3a337b7dedb8cbbda Mon Sep 17 00:00:00 2001 From: Thomas Stuefe Date: Mon, 10 Jun 2024 09:00:05 +0000 Subject: [PATCH 003/471] 8322811: jcmd System.dump_map help info has conflicting statements Reviewed-by: dholmes, kevinw --- src/hotspot/share/services/diagnosticCommand.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/services/diagnosticCommand.cpp b/src/hotspot/share/services/diagnosticCommand.cpp index b440a6cbb5e71..6a7e4d1bd20ce 100644 --- a/src/hotspot/share/services/diagnosticCommand.cpp +++ b/src/hotspot/share/services/diagnosticCommand.cpp @@ -1190,18 +1190,25 @@ void SystemMapDCmd::execute(DCmdSource source, TRAPS) { MemMapPrinter::print_all_mappings(output(), _human_readable.value()); } +static constexpr char default_filename[] = "vm_memory_map_.txt"; + SystemDumpMapDCmd::SystemDumpMapDCmd(outputStream* output, bool heap) : DCmdWithParser(output, heap), _human_readable("-H", "Human readable format", "BOOLEAN", false, "false"), - _filename("-F", "file path (defaults: \"vm_memory_map_.txt\")", "STRING", false) { + _filename("-F", "file path", "STRING", false, default_filename) { _dcmdparser.add_dcmd_option(&_human_readable); _dcmdparser.add_dcmd_option(&_filename); } void SystemDumpMapDCmd::execute(DCmdSource source, TRAPS) { - stringStream default_name; - default_name.print("vm_memory_map_%d.txt", os::current_process_id()); - const char* name = _filename.is_set() ? _filename.value() : default_name.base(); + stringStream defaultname; + const char* name = nullptr; + if (::strcmp(default_filename, _filename.value()) == 0) { + defaultname.print("vm_memory_map_%d.txt", os::current_process_id()); + name = defaultname.base(); + } else { + name = _filename.value(); + } fileStream fs(name); if (fs.is_open()) { if (!MemTracker::enabled()) { From 5f9d3e3af8342592242cb304b2c219508d56ed3a Mon Sep 17 00:00:00 2001 From: Volker Simonis Date: Mon, 10 Jun 2024 09:37:43 +0000 Subject: [PATCH 004/471] 8333722: Fix CompilerDirectives for non-compiler JVM variants Reviewed-by: kvn --- src/hotspot/share/compiler/compilerDirectives.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/compiler/compilerDirectives.cpp b/src/hotspot/share/compiler/compilerDirectives.cpp index b48eb4fb817d8..74259c8e5d436 100644 --- a/src/hotspot/share/compiler/compilerDirectives.cpp +++ b/src/hotspot/share/compiler/compilerDirectives.cpp @@ -761,7 +761,7 @@ DirectiveSet* DirectivesStack::getMatchingDirective(const methodHandle& method, if (dir->is_default_directive() || dir->match(method)) { match = dir->get_for(comp); assert(match != nullptr, "Consistency"); - if (match->EnableOption) { + if (match->EnableOption || dir->is_default_directive()) { // The directiveSet for this compile is also enabled -> success dir->inc_refcount(); break; From 7b43a8cd7c663facbe490f889838d7ead0eba0f9 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Mon, 10 Jun 2024 10:05:14 +0000 Subject: [PATCH 005/471] 8333824: Unused ClassValue in VarHandles Reviewed-by: mcimadamore --- .../share/classes/java/lang/invoke/VarHandles.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/java.base/share/classes/java/lang/invoke/VarHandles.java b/src/java.base/share/classes/java/lang/invoke/VarHandles.java index bd608619e58ec..95b5a01550f34 100644 --- a/src/java.base/share/classes/java/lang/invoke/VarHandles.java +++ b/src/java.base/share/classes/java/lang/invoke/VarHandles.java @@ -25,7 +25,6 @@ package java.lang.invoke; -import jdk.internal.foreign.Utils; import sun.invoke.util.Wrapper; import java.lang.reflect.Constructor; @@ -36,8 +35,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import java.util.stream.Stream; import static java.lang.invoke.MethodHandleStatics.UNSAFE; @@ -47,13 +44,6 @@ final class VarHandles { - static ClassValue> ADDRESS_FACTORIES = new ClassValue<>() { - @Override - protected ConcurrentMap computeValue(Class type) { - return new ConcurrentHashMap<>(); - } - }; - static VarHandle makeFieldHandle(MemberName f, Class refc, boolean isWriteAllowedOnFinalFields) { if (!f.isStatic()) { long foffset = MethodHandleNatives.objectFieldOffset(f); From e22fc121aed56dad2eedfdc3a53f2a655c3b200b Mon Sep 17 00:00:00 2001 From: Thomas Stuefe Date: Mon, 10 Jun 2024 12:33:32 +0000 Subject: [PATCH 006/471] 8333775: Small improvement to outputStream auto-indentation mode Reviewed-by: jsjolen, mbaesken --- src/hotspot/share/nmt/memReporter.cpp | 8 +------ src/hotspot/share/nmt/memReporter.hpp | 2 +- src/hotspot/share/utilities/ostream.cpp | 6 +++++ src/hotspot/share/utilities/ostream.hpp | 22 ++++++++++++++----- test/hotspot/gtest/utilities/test_ostream.cpp | 5 ++++- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/hotspot/share/nmt/memReporter.cpp b/src/hotspot/share/nmt/memReporter.cpp index e5969bbaf8f86..bd2f38acdd0a0 100644 --- a/src/hotspot/share/nmt/memReporter.cpp +++ b/src/hotspot/share/nmt/memReporter.cpp @@ -51,13 +51,7 @@ static ssize_t counter_diff(size_t c1, size_t c2) { } MemReporterBase::MemReporterBase(outputStream* out, size_t scale) : - _scale(scale), _output(out) { - _output->set_autoindent(true); -} - -MemReporterBase::~MemReporterBase() { - _output->set_autoindent(false); -} + _scale(scale), _output(out), _auto_indentor(out) {} size_t MemReporterBase::reserved_total(const MallocMemory* malloc, const VirtualMemory* vm) { return malloc->malloc_size() + malloc->arena_size() + vm->reserved(); diff --git a/src/hotspot/share/nmt/memReporter.hpp b/src/hotspot/share/nmt/memReporter.hpp index 3f08ecbd2844f..c10a99795080a 100644 --- a/src/hotspot/share/nmt/memReporter.hpp +++ b/src/hotspot/share/nmt/memReporter.hpp @@ -38,6 +38,7 @@ class MemReporterBase : public StackObj { private: const size_t _scale; // report in this scale outputStream* const _output; // destination + StreamAutoIndentor _auto_indentor; public: @@ -45,7 +46,6 @@ class MemReporterBase : public StackObj { static const size_t default_scale = K; MemReporterBase(outputStream* out, size_t scale = default_scale); - ~MemReporterBase(); // Helper functions // Calculate total reserved and committed amount diff --git a/src/hotspot/share/utilities/ostream.cpp b/src/hotspot/share/utilities/ostream.cpp index 6057d1a7710b0..5d6731785a3ac 100644 --- a/src/hotspot/share/utilities/ostream.cpp +++ b/src/hotspot/share/utilities/ostream.cpp @@ -277,6 +277,12 @@ outputStream& outputStream::indent() { return *this; } +bool outputStream::set_autoindent(bool value) { + const bool old = _autoindent; + _autoindent = value; + return old; +} + void outputStream::print_jlong(jlong value) { print(JLONG_FORMAT, value); } diff --git a/src/hotspot/share/utilities/ostream.hpp b/src/hotspot/share/utilities/ostream.hpp index b4ce7c32c60cb..bff682a3e5aa9 100644 --- a/src/hotspot/share/utilities/ostream.hpp +++ b/src/hotspot/share/utilities/ostream.hpp @@ -109,7 +109,8 @@ class outputStream : public CHeapObjBase { // line starts depending on the current indentation level: // print(), print_cr(), print_raw(), print_raw_cr() // Other APIs are unaffected - void set_autoindent(bool value) { _autoindent = value; } + // Returns old autoindent state. + bool set_autoindent(bool value); // sizing int position() const { return _position; } @@ -175,17 +176,26 @@ class outputStream : public CHeapObjBase { extern outputStream* tty; // tty output class streamIndentor : public StackObj { - private: - outputStream* _str; - int _amount; - - public: + outputStream* const _str; + const int _amount; + NONCOPYABLE(streamIndentor); +public: streamIndentor(outputStream* str, int amt = 2) : _str(str), _amount(amt) { _str->inc(_amount); } ~streamIndentor() { _str->dec(_amount); } }; +class StreamAutoIndentor : public StackObj { + outputStream* const _os; + const bool _old; + NONCOPYABLE(StreamAutoIndentor); + public: + StreamAutoIndentor(outputStream* os) : + _os(os), _old(os->set_autoindent(true)) {} + ~StreamAutoIndentor() { _os->set_autoindent(_old); } +}; + // advisory locking for the shared tty stream: class ttyLocker: StackObj { friend class ttyUnlocker; diff --git a/test/hotspot/gtest/utilities/test_ostream.cpp b/test/hotspot/gtest/utilities/test_ostream.cpp index 26fd9d227c11e..5d25c51f3f982 100644 --- a/test/hotspot/gtest/utilities/test_ostream.cpp +++ b/test/hotspot/gtest/utilities/test_ostream.cpp @@ -106,7 +106,8 @@ TEST_VM(ostream, bufferedStream_dynamic_small) { static void test_autoindent(bool on) { stringStream ss; - ss.set_autoindent(on); + const bool prior = ss.set_autoindent(on); + EXPECT_FALSE(prior); { streamIndentor si(&ss, 5); ss.print("ABC"); @@ -146,6 +147,8 @@ static void test_autoindent(bool on) { "end" ); } + bool prior2 = ss.set_autoindent(prior); + EXPECT_EQ(prior2, on); } TEST_VM(ostream, autoindent_on) { test_autoindent(true); } From ec1664e8c9413890ce2dae5c2dbbce3449d67882 Mon Sep 17 00:00:00 2001 From: Daniel Fuchs Date: Mon, 10 Jun 2024 12:44:36 +0000 Subject: [PATCH 007/471] 8333804: java/net/httpclient/ForbiddenHeadTest.java threw an exception with 0 failures Reviewed-by: jpai --- test/jdk/java/net/httpclient/ForbiddenHeadTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/java/net/httpclient/ForbiddenHeadTest.java b/test/jdk/java/net/httpclient/ForbiddenHeadTest.java index 4b651eb48131a..1498aa118b324 100644 --- a/test/jdk/java/net/httpclient/ForbiddenHeadTest.java +++ b/test/jdk/java/net/httpclient/ForbiddenHeadTest.java @@ -381,7 +381,7 @@ public void setup() throws Exception { public void teardown() throws Exception { authClient = noAuthClient = null; Thread.sleep(100); - AssertionError fail = TRACKER.check(500); + AssertionError fail = TRACKER.check(1500); try { proxy.stop(); authproxy.stop(); From e7dc76b5776e05082281fb640d1592479cfe9e6b Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Mon, 10 Jun 2024 12:47:09 +0000 Subject: [PATCH 008/471] 8333849: (dc) DatagramChannel send/receive fails with UOE if buffer backed by memory segment allocated from shared arena Reviewed-by: dfuchs --- .../sun/nio/ch/DatagramChannelImpl.java | 18 +- .../java/nio/channels/etc/MemorySegments.java | 494 ++++++++++++++++++ 2 files changed, 509 insertions(+), 3 deletions(-) create mode 100644 test/jdk/java/nio/channels/etc/MemorySegments.java diff --git a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java index 4790ee75dd961..31823cfbb871a 100644 --- a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java @@ -806,14 +806,19 @@ private int receive(ByteBuffer dst, boolean connected) throws IOException { } } + /** + * Receives a datagram into a direct buffer. + */ private int receiveIntoNativeBuffer(ByteBuffer bb, int rem, int pos, boolean connected) throws IOException { NIO_ACCESS.acquireSession(bb); try { + long bufAddress = NIO_ACCESS.getBufferAddress(bb); int n = receive0(fd, - ((DirectBuffer)bb).address() + pos, rem, + bufAddress + pos, + rem, sourceSockAddr.address(), connected); if (n > 0) @@ -991,6 +996,9 @@ private int send(FileDescriptor fd, ByteBuffer src, InetSocketAddress target) } } + /** + * Send a datagram contained in a direct buffer. + */ private int sendFromNativeBuffer(FileDescriptor fd, ByteBuffer bb, InetSocketAddress target) throws IOException @@ -1003,9 +1011,13 @@ private int sendFromNativeBuffer(FileDescriptor fd, ByteBuffer bb, int written; NIO_ACCESS.acquireSession(bb); try { + long bufAddress = NIO_ACCESS.getBufferAddress(bb); int addressLen = targetSocketAddress(target); - written = send0(fd, ((DirectBuffer)bb).address() + pos, rem, - targetSockAddr.address(), addressLen); + written = send0(fd, + bufAddress + pos, + rem, + targetSockAddr.address(), + addressLen); } catch (PortUnreachableException pue) { if (isConnected()) throw pue; diff --git a/test/jdk/java/nio/channels/etc/MemorySegments.java b/test/jdk/java/nio/channels/etc/MemorySegments.java new file mode 100644 index 0000000000000..77da11759c75e --- /dev/null +++ b/test/jdk/java/nio/channels/etc/MemorySegments.java @@ -0,0 +1,494 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8333849 + * @summary Test ByteChannel implementations of read and write with ByteBuffers that are + * backed by MemorySegments allocated from an Arena + * @run junit MemorySegments + */ + +import java.io.IOException; +import java.lang.foreign.Arena; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.DatagramChannel; +import java.nio.channels.FileChannel; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Random; +import java.util.function.Supplier; +import java.util.stream.Stream; +import static java.nio.file.StandardOpenOption.*; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.*; + +class MemorySegments { + private static final int SIZE = 100; // buffer size used by tests + + /** + * Return a stream of suppliers for each Arena type. A supplier is used to avoid JUnit + * closing the Arena and failing (as some Arenas are not closable). + */ + static Stream> arenaSuppliers() { + return Stream.of(Arena::global, Arena::ofAuto, Arena::ofConfined, Arena::ofShared); + } + + /** + * SocketChannel read/write(ByteBuffer). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testSocketChannelReadWrite(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + try (ServerSocketChannel ssc = ServerSocketChannel.open()) { + ssc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + + try (SocketChannel sc1 = SocketChannel.open(ssc.getLocalAddress()); + SocketChannel sc2 = ssc.accept()) { + + // write + ByteBuffer src = arena.allocate(SIZE).asByteBuffer(); + fillRandom(src); + int nwritten = sc1.write(src); + assertTrue(nwritten > 0); + assertTrue(nwritten <= SIZE); + assertEquals(nwritten, src.position()); + + // read + ByteBuffer dst = arena.allocate(SIZE + 100).asByteBuffer(); + int nread = sc2.read(dst); + assertTrue(nread > 0); + assertTrue(nread <= nwritten); + assertEquals(nread, dst.position()); + + // check contents + dst.flip(); + assertEquals(src.slice(0, nread), dst); + } + + } finally { + tryClose(arena); + } + } + + /** + * SocketChannel write(ByteBuffer[]). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testSocketChannelGatheringWrite(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + try (ServerSocketChannel ssc = ServerSocketChannel.open()) { + ssc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + + try (SocketChannel sc1 = SocketChannel.open(ssc.getLocalAddress()); + SocketChannel sc2 = ssc.accept()) { + + // gathering write + ByteBuffer src = arena.allocate(SIZE * 2).asByteBuffer(); + fillRandom(src); + ByteBuffer src1 = src.slice(0, SIZE); + ByteBuffer src2 = src.slice(SIZE, SIZE); + var srcs = new ByteBuffer[] { src1, src2 }; + int nwritten = (int) sc1.write(srcs); + assertTrue(nwritten > 0); + assertEquals(Math.min(nwritten, SIZE), src1.position()); + assertEquals(nwritten, src1.position() + src2.position()); + + // read + ByteBuffer dst = arena.allocate(SIZE * 2 + 50).asByteBuffer(); + int nread = sc2.read(dst); + assertTrue(nread > 0); + assertTrue(nread <= nwritten); + assertEquals(nread, dst.position()); + + // check contents + dst.flip(); + assertEquals(src.slice(0, nread), dst); + } + + } finally { + tryClose(arena); + } + } + + /** + * SocketChannel read(ByteBuffer[]). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testSocketChannelScatteringRead(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + try (ServerSocketChannel ssc = ServerSocketChannel.open()) { + ssc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + + try (SocketChannel sc1 = SocketChannel.open(ssc.getLocalAddress()); + SocketChannel sc2 = ssc.accept()) { + + // write + ByteBuffer src = arena.allocate(SIZE).asByteBuffer(); + fillRandom(src); + int nwritten = sc1.write(src); + assertTrue(nwritten > 0); + assertTrue(nwritten <= SIZE); + assertEquals(nwritten, src.position()); + + // scattering read + ByteBuffer dst = arena.allocate(SIZE + 50).asByteBuffer(); + ByteBuffer dst1 = dst.slice(0, 50); + ByteBuffer dst2 = dst.slice(50, dst.capacity() - 50); + var dsts = new ByteBuffer[]{ dst1, dst2 }; + int nread = (int) sc2.read(dsts); + assertTrue(nread > 0); + assertTrue(nread <= nwritten); + assertTrue(dst1.position() > 0); + assertEquals(nread, dst1.position() + dst2.position()); + + // check contents + src.flip(); + assertEquals(src, dst.slice(0, nread)); + } + + } finally { + tryClose(arena); + } + } + + /** + * DatagramChannel send/receive(ByteBuffer). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testDatagramChannelSendReceive(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + try (DatagramChannel dc = DatagramChannel.open()) { + dc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + SocketAddress target = dc.getLocalAddress(); + + // send + ByteBuffer src = arena.allocate(SIZE).asByteBuffer(); + fillRandom(src); + int n = dc.send(src, target); + assertEquals(SIZE, n); + assertFalse(src.hasRemaining()); + + // receive + ByteBuffer dst = arena.allocate(SIZE + 100).asByteBuffer(); + SocketAddress remote = dc.receive(dst); + assertEquals(remote, target); + assertEquals(SIZE, dst.position()); + + // check contents + src.clear(); + dst.flip(); + assertEquals(src, dst); + } finally { + tryClose(arena); + } + } + + /** + * DatagramChannel read/write(ByteBuffer). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testDatagramChannelReadWrite(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + try (DatagramChannel dc = DatagramChannel.open()) { + dc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + SocketAddress target = dc.getLocalAddress(); + dc.connect(target); + + // write + ByteBuffer src = arena.allocate(SIZE).asByteBuffer(); + fillRandom(src); + int n = dc.write(src); + assertEquals(SIZE, n); + assertFalse(src.hasRemaining()); + + // read + ByteBuffer dst = arena.allocate(SIZE + 100).asByteBuffer(); + n = dc.read(dst); + assertEquals(SIZE, n); + assertEquals(SIZE, dst.position()); + + // check contents + src.clear(); + dst.flip(); + assertEquals(src, dst); + } finally { + tryClose(arena); + } + } + + /** + * DatagramChannel write(ByteBuffer[]). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testDatagramChannelGatheringWrite(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + try (DatagramChannel dc = DatagramChannel.open()) { + dc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + SocketAddress target = dc.getLocalAddress(); + dc.connect(target); + + // gathering write + ByteBuffer src1 = arena.allocate(SIZE).asByteBuffer(); + ByteBuffer src2 = arena.allocate(SIZE).asByteBuffer(); + fillRandom(src1); + fillRandom(src2); + var srcs = new ByteBuffer[] { src1, src2 }; + int nwritten = (int) dc.write(srcs); + assertEquals(SIZE*2, nwritten); + assertFalse(src1.hasRemaining()); + assertFalse(src2.hasRemaining()); + + // read + ByteBuffer dst = arena.allocate(SIZE*2 + 50).asByteBuffer(); + int nread = dc.read(dst); + assertEquals(SIZE*2, nread); + assertEquals(SIZE*2, dst.position()); + + // check contents + src1.flip(); + src2.flip(); + assertEquals(src1, dst.slice(0, SIZE)); + assertEquals(src2, dst.slice(SIZE, SIZE)); + } finally { + tryClose(arena); + } + } + + /** + * DatagramChannel read(ByteBuffer[]). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testDatagramChannelScatteringRead(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + try (DatagramChannel dc = DatagramChannel.open()) { + dc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + SocketAddress target = dc.getLocalAddress(); + dc.connect(target); + + // write + ByteBuffer src = arena.allocate(SIZE*2).asByteBuffer(); + fillRandom(src); + int nwritten = dc.write(src); + assertEquals(SIZE*2, nwritten); + assertEquals(nwritten, src.position()); + + // scattering read + ByteBuffer dst1 = arena.allocate(SIZE).asByteBuffer(); + ByteBuffer dst2 = arena.allocate(SIZE + 50).asByteBuffer(); + var dsts = new ByteBuffer[] { dst1, dst2 }; + int nread = (int) dc.read(dsts); + assertEquals(SIZE*2, nread); + assertEquals(nread, dst1.position() + dst2.position()); + + // check contents + dst1.flip(); + assertEquals(src.slice(0, SIZE), dst1); + dst2.flip(); + assertEquals(src.slice(SIZE, SIZE), dst2); + } finally { + tryClose(arena); + } + } + + /** + * FileChannel read/write(ByteBuffer). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testFileChannelReadWrite(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + Path file = Files.createTempFile(Path.of("."), "test", "dat"); + try (FileChannel fc = FileChannel.open(file, READ, WRITE)) { + + // write + ByteBuffer src = arena.allocate(SIZE).asByteBuffer(); + fillRandom(src); + int nwritten = fc.write(src); + assertTrue(nwritten > 0); + assertTrue(nwritten <= SIZE); + assertEquals(nwritten, src.position()); + assertEquals(nwritten, (int) fc.position()); + assertEquals(nwritten, (int) fc.size()); + + // read + ByteBuffer dst = arena.allocate(SIZE + 100).asByteBuffer(); + fc.position(0); + int nread = fc.read(dst); + assertTrue(nread > 0); + assertTrue(nread <= nwritten); + assertEquals(nread, dst.position()); + assertEquals(nread, (int) fc.position()); + + // check contents + dst.flip(); + assertEquals(src.slice(0, nread), dst); + + // reset + fc.truncate(0L); + src.clear(); + dst.clear(); + + // write with position + nwritten = fc.write(src, 10L); + assertTrue(nwritten > 0); + assertTrue(nwritten <= SIZE); + assertEquals(nwritten, src.position()); + assertEquals(0, (int) fc.position()); + assertEquals(nwritten + 10, (int) fc.size()); + + // read with position + nread = fc.read(dst, 10L); + assertTrue(nread > 0); + assertTrue(nread <= nwritten); + assertEquals(nread, dst.position()); + assertEquals(0, (int)fc.position()); + + // check contents + dst.flip(); + assertEquals(src.slice(0, nread), dst); + } finally { + tryClose(arena); + } + } + + /** + * FileChannel write(ByteBuffer[]). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testFileChannelGatheringWrite(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + Path file = Files.createTempFile(Path.of(""), "test", "dat"); + try (FileChannel fc = FileChannel.open(file, READ, WRITE)) { + + // gathering write + ByteBuffer src = arena.allocate(SIZE * 2).asByteBuffer(); + fillRandom(src); + ByteBuffer src1 = src.slice(0, SIZE); + ByteBuffer src2 = src.slice(SIZE, SIZE); + var srcs = new ByteBuffer[] { src1, src2 }; + int nwritten = (int) fc.write(srcs); + assertTrue(nwritten > 0); + assertEquals(Math.min(nwritten, SIZE), src1.position()); + assertEquals(nwritten, src1.position() + src2.position()); + assertEquals(nwritten, (int) fc.position()); + assertEquals(nwritten, (int) fc.size()); + + // read + ByteBuffer dst = arena.allocate(SIZE*2 + 50).asByteBuffer(); + fc.position(0); + int nread = fc.read(dst); + assertTrue(nread > 0); + assertTrue(nread <= nwritten); + assertEquals(nread, dst.position()); + assertEquals(nread, (int) fc.position()); + + // check contents + dst.flip(); + assertEquals(src.slice(0, nread), dst); + } finally { + tryClose(arena); + } + } + + /** + * FileChannel read(ByteBuffer[]). + */ + @ParameterizedTest + @MethodSource("arenaSuppliers") + void testFileChannelScatteringRead(Supplier arenaSupplier) throws IOException { + Arena arena = arenaSupplier.get(); + Path file = Files.createTempFile(Path.of(""), "test", "dat"); + try (FileChannel fc = FileChannel.open(file, READ, WRITE)) { + + // write + ByteBuffer src = arena.allocate(SIZE).asByteBuffer(); + fillRandom(src); + int nwritten = fc.write(src); + assertTrue(nwritten > 0); + assertTrue(nwritten <= SIZE); + assertEquals(nwritten, src.position()); + assertEquals(nwritten, (int) fc.position()); + assertEquals(nwritten, (int) fc.size()); + + // scattering read + ByteBuffer dst = arena.allocate(SIZE + 50).asByteBuffer(); + ByteBuffer dst1 = dst.slice(0, 50); + ByteBuffer dst2 = dst.slice(50, dst.capacity() - 50); + var dsts = new ByteBuffer[] { dst1, dst2 }; + fc.position(0); + int nread = (int) fc.read(dsts); + assertTrue(nread > 0); + assertTrue(nread <= nwritten); + assertTrue(dst1.position() > 0); + assertEquals(nread, dst1.position() + dst2.position()); + assertEquals(nread, (int) fc.position()); + + // check contents + dst.limit(nread); + assertEquals(src.slice(0, nread), dst); + } finally { + tryClose(arena); + } + } + + /** + * Fill the buffer with random bytes. + */ + private void fillRandom(ByteBuffer bb) { + Random r = new Random(); + int pos = bb.position(); + while (bb.hasRemaining()) { + bb.put((byte) r.nextInt(256)); + } + bb.position(pos); + } + + /** + * Attempt to close the given Arena. + */ + private boolean tryClose(Arena arena) { + try { + arena.close(); + return true; + } catch (UnsupportedOperationException e) { + return false; + } + } + +} From 2a242db01ed1d502affa4a954e601266fa98dfbe Mon Sep 17 00:00:00 2001 From: Kuai Wei Date: Mon, 10 Jun 2024 12:57:03 +0000 Subject: [PATCH 009/471] 8325821: [REDO] use "dmb.ishst+dmb.ishld" for release barrier Reviewed-by: shade, aph --- src/hotspot/cpu/aarch64/aarch64.ad | 8 +- src/hotspot/cpu/aarch64/globals_aarch64.hpp | 2 + .../cpu/aarch64/macroAssembler_aarch64.cpp | 36 +- .../cpu/aarch64/macroAssembler_aarch64.hpp | 1 + .../cpu/aarch64/vm_version_aarch64.cpp | 5 +- src/hotspot/share/asm/codeBuffer.cpp | 15 +- src/hotspot/share/asm/codeBuffer.hpp | 8 + .../gtest/aarch64/test_assembler_aarch64.cpp | 376 +++++++++++++++++- .../vm/compiler/FinalFieldInitialize.java | 85 ++++ 9 files changed, 523 insertions(+), 13 deletions(-) create mode 100644 test/micro/org/openjdk/bench/vm/compiler/FinalFieldInitialize.java diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 1b8b9801f3c71..190bfdd1f6767 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -7780,7 +7780,7 @@ instruct membar_acquire() %{ ins_cost(VOLATILE_REF_COST); format %{ "membar_acquire\n\t" - "dmb ish" %} + "dmb ishld" %} ins_encode %{ __ block_comment("membar_acquire"); @@ -7834,11 +7834,13 @@ instruct membar_release() %{ ins_cost(VOLATILE_REF_COST); format %{ "membar_release\n\t" - "dmb ish" %} + "dmb ishst\n\tdmb ishld" %} ins_encode %{ __ block_comment("membar_release"); - __ membar(Assembler::LoadStore|Assembler::StoreStore); + // These will be merged if AlwaysMergeDMB is enabled. + __ membar(Assembler::StoreStore); + __ membar(Assembler::LoadStore); %} ins_pipe(pipe_serial); %} diff --git a/src/hotspot/cpu/aarch64/globals_aarch64.hpp b/src/hotspot/cpu/aarch64/globals_aarch64.hpp index 2f83838fc0fd1..9c20e3737c868 100644 --- a/src/hotspot/cpu/aarch64/globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/globals_aarch64.hpp @@ -124,6 +124,8 @@ define_pd_global(intx, InlineSmallCode, 1000); range(1, 99) \ product(ccstr, UseBranchProtection, "none", \ "Branch Protection to use: none, standard, pac-ret") \ + product(bool, AlwaysMergeDMB, true, DIAGNOSTIC, \ + "Always merge DMB instructions in code emission") \ // end of ARCH_FLAGS diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp index 1929077fa167a..f90aefc8fd3e6 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp @@ -2350,14 +2350,36 @@ void MacroAssembler::membar(Membar_mask_bits order_constraint) { address last = code()->last_insn(); if (last != nullptr && nativeInstruction_at(last)->is_Membar() && prev == last) { NativeMembar *bar = NativeMembar_at(prev); - // We are merging two memory barrier instructions. On AArch64 we - // can do this simply by ORing them together. - bar->set_kind(bar->get_kind() | order_constraint); - BLOCK_COMMENT("merged membar"); - } else { - code()->set_last_insn(pc()); - dmb(Assembler::barrier(order_constraint)); + if (AlwaysMergeDMB) { + bar->set_kind(bar->get_kind() | order_constraint); + BLOCK_COMMENT("merged membar(always)"); + return; + } + // Don't promote DMB ST|DMB LD to DMB (a full barrier) because + // doing so would introduce a StoreLoad which the caller did not + // intend + if (bar->get_kind() == order_constraint + || bar->get_kind() == AnyAny + || order_constraint == AnyAny) { + // We are merging two memory barrier instructions. On AArch64 we + // can do this simply by ORing them together. + bar->set_kind(bar->get_kind() | order_constraint); + BLOCK_COMMENT("merged membar"); + return; + } else { + // A special case like "DMB ST;DMB LD;DMB ST", the last DMB can be skipped + // We need check the last 2 instructions + address prev2 = prev - NativeMembar::instruction_size; + if (last != code()->last_label() && nativeInstruction_at(prev2)->is_Membar()) { + NativeMembar *bar2 = NativeMembar_at(prev2); + assert(bar2->get_kind() == order_constraint, "it should be merged before"); + BLOCK_COMMENT("merged membar(elided)"); + return; + } + } } + code()->set_last_insn(pc()); + dmb(Assembler::barrier(order_constraint)); } bool MacroAssembler::try_merge_ldst(Register rt, const Address &adr, size_t size_in_bytes, bool is_store) { diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp index 7b7ecf49c8c34..3bfd6e70872ce 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp @@ -150,6 +150,7 @@ class MacroAssembler: public Assembler { void bind(Label& L) { Assembler::bind(L); code()->clear_last_insn(); + code()->set_last_label(pc()); } void membar(Membar_mask_bits order_constraint); diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp index 18f310c746cd4..aa64f411dbfb9 100644 --- a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2020, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -230,6 +230,9 @@ void VM_Version::initialize() { if (FLAG_IS_DEFAULT(OnSpinWaitInstCount)) { FLAG_SET_DEFAULT(OnSpinWaitInstCount, 1); } + if (FLAG_IS_DEFAULT(AlwaysMergeDMB)) { + FLAG_SET_DEFAULT(AlwaysMergeDMB, false); + } } if (_cpu == CPU_ARM) { diff --git a/src/hotspot/share/asm/codeBuffer.cpp b/src/hotspot/share/asm/codeBuffer.cpp index d0c8feda24a87..ea47e435c0bb0 100644 --- a/src/hotspot/share/asm/codeBuffer.cpp +++ b/src/hotspot/share/asm/codeBuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -928,6 +928,10 @@ void CodeBuffer::expand(CodeSection* which_cs, csize_t amount) { // Move all the code and relocations to the new blob: relocate_code_to(&cb); + // some internal addresses, _last_insn _last_label, are used during code emission, + // adjust them in expansion + adjust_internal_address(insts_begin(), cb.insts_begin()); + // Copy the temporary code buffer into the current code buffer. // Basically, do {*this = cb}, except for some control information. this->take_over_code_from(&cb); @@ -949,6 +953,15 @@ void CodeBuffer::expand(CodeSection* which_cs, csize_t amount) { #endif //PRODUCT } +void CodeBuffer::adjust_internal_address(address from, address to) { + if (_last_insn != nullptr) { + _last_insn += to - from; + } + if (_last_label != nullptr) { + _last_label += to - from; + } +} + void CodeBuffer::take_over_code_from(CodeBuffer* cb) { // Must already have disposed of the old blob somehow. assert(blob() == nullptr, "must be empty"); diff --git a/src/hotspot/share/asm/codeBuffer.hpp b/src/hotspot/share/asm/codeBuffer.hpp index 48476bedfe2f6..343981e1a7bc5 100644 --- a/src/hotspot/share/asm/codeBuffer.hpp +++ b/src/hotspot/share/asm/codeBuffer.hpp @@ -433,6 +433,7 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) { Arena* _overflow_arena; address _last_insn; // used to merge consecutive memory barriers, loads or stores. + address _last_label; // record last bind label address, it's also the start of current bb. SharedStubToInterpRequests* _shared_stub_to_interp_requests; // used to collect requests for shared iterpreter stubs SharedTrampolineRequests* _shared_trampoline_requests; // used to collect requests for shared trampolines @@ -457,6 +458,7 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) { _oop_recorder = nullptr; _overflow_arena = nullptr; _last_insn = nullptr; + _last_label = nullptr; _finalize_stubs = false; _shared_stub_to_interp_requests = nullptr; _shared_trampoline_requests = nullptr; @@ -510,6 +512,9 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) { // moves code sections to new buffer (assumes relocs are already in there) void relocate_code_to(CodeBuffer* cb) const; + // adjust some internal address during expand + void adjust_internal_address(address from, address to); + // set up a model of the final layout of my contents void compute_final_layout(CodeBuffer* dest) const; @@ -679,6 +684,9 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) { void set_last_insn(address a) { _last_insn = a; } void clear_last_insn() { set_last_insn(nullptr); } + address last_label() const { return _last_label; } + void set_last_label(address a) { _last_label = a; } + #ifndef PRODUCT AsmRemarks &asm_remarks() { return _asm_remarks; } DbgStrings &dbg_strings() { return _dbg_strings; } diff --git a/test/hotspot/gtest/aarch64/test_assembler_aarch64.cpp b/test/hotspot/gtest/aarch64/test_assembler_aarch64.cpp index 1d75685475527..60999f2bf3494 100644 --- a/test/hotspot/gtest/aarch64/test_assembler_aarch64.cpp +++ b/test/hotspot/gtest/aarch64/test_assembler_aarch64.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2020, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -28,8 +28,10 @@ #include "asm/assembler.hpp" #include "asm/assembler.inline.hpp" +#include "asm/macroAssembler.hpp" #include "compiler/disassembler.hpp" #include "memory/resourceArea.hpp" +#include "nativeInst_aarch64.hpp" #include "unittest.hpp" #define __ _masm. @@ -81,4 +83,376 @@ TEST_VM(AssemblerAArch64, validate) { BufferBlob::free(b); } +constexpr uint32_t test_encode_dmb_ld = 0xd50339bf; +constexpr uint32_t test_encode_dmb_st = 0xd5033abf; +constexpr uint32_t test_encode_dmb = 0xd5033bbf; +constexpr uint32_t test_encode_nop = 0xd503201f; + +static void asm_dump(address start, address end) { + ResourceMark rm; + stringStream ss; + ss.print_cr("Insns:"); + Disassembler::decode(start, end, &ss); + printf("%s\n", ss.as_string()); +} + +void test_merge_dmb() { + BufferBlob* b = BufferBlob::create("aarch64Test", 400); + CodeBuffer code(b); + MacroAssembler _masm(&code); + + { + // merge with same type + __ membar(Assembler::Membar_mask_bits::StoreStore); + __ membar(Assembler::Membar_mask_bits::StoreStore); + __ membar(Assembler::Membar_mask_bits::StoreStore); + __ nop(); + __ membar(Assembler::Membar_mask_bits::LoadStore); + __ membar(Assembler::Membar_mask_bits::LoadStore); + __ membar(Assembler::Membar_mask_bits::LoadStore); + __ membar(Assembler::Membar_mask_bits::LoadStore); + __ nop(); + // merge with high rank + __ membar(Assembler::Membar_mask_bits::LoadStore); + __ membar(Assembler::Membar_mask_bits::LoadStore); + __ membar(Assembler::Membar_mask_bits::AnyAny); + __ membar(Assembler::Membar_mask_bits::StoreStore); + __ membar(Assembler::Membar_mask_bits::StoreStore); + __ nop(); + // merge with different type + __ membar(Assembler::Membar_mask_bits::LoadStore); + __ membar(Assembler::Membar_mask_bits::StoreStore); + __ membar(Assembler::Membar_mask_bits::LoadStore); + __ membar(Assembler::Membar_mask_bits::StoreStore); + } + asm_dump(code.insts()->start(), code.insts()->end()); + // AlwaysMergeDMB + static const unsigned int insns1[] = { + test_encode_dmb_st, + test_encode_nop, + test_encode_dmb_ld, + test_encode_nop, + test_encode_dmb, + test_encode_nop, + test_encode_dmb, + }; + // !AlwaysMergeDMB + static const unsigned int insns2[] = { + test_encode_dmb_st, + test_encode_nop, + test_encode_dmb_ld, + test_encode_nop, + test_encode_dmb, + test_encode_nop, + test_encode_dmb_ld, + test_encode_dmb_st, + }; + if (AlwaysMergeDMB) { + EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns1)); + asm_check((const unsigned int *)code.insts()->start(), insns1, sizeof insns1 / sizeof insns1[0]); + } else { + EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns2)); + asm_check((const unsigned int *)code.insts()->start(), insns2, sizeof insns2 / sizeof insns2[0]); + } + + BufferBlob::free(b); +} + +TEST_VM(AssemblerAArch64, merge_dmb_1) { + FlagSetting fs(AlwaysMergeDMB, true); + test_merge_dmb(); +} + +TEST_VM(AssemblerAArch64, merge_dmb_2) { + FlagSetting fs(AlwaysMergeDMB, false); + test_merge_dmb(); +} + +TEST_VM(AssemblerAArch64, merge_dmb_block_by_label) { + BufferBlob* b = BufferBlob::create("aarch64Test", 400); + CodeBuffer code(b); + MacroAssembler _masm(&code); + + { + Label l; + // merge can not cross the label + __ membar(Assembler::Membar_mask_bits::StoreStore); + __ bind(l); + __ membar(Assembler::Membar_mask_bits::StoreStore); + } + asm_dump(code.insts()->start(), code.insts()->end()); + static const unsigned int insns[] = { + 0xd5033abf, // dmb.ishst + 0xd5033abf, // dmb.ishst + }; + EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns)); + asm_check((const unsigned int *)code.insts()->start(), insns, sizeof insns / sizeof insns[0]); + + BufferBlob::free(b); +} + +TEST_VM(AssemblerAArch64, merge_dmb_after_expand) { + ResourceMark rm; + BufferBlob* b = BufferBlob::create("aarch64Test", 400); + CodeBuffer code(b); + code.set_blob(b); + MacroAssembler _masm(&code); + + { + __ membar(Assembler::Membar_mask_bits::StoreStore); + code.insts()->maybe_expand_to_ensure_remaining(50000); + __ membar(Assembler::Membar_mask_bits::StoreStore); + } + asm_dump(code.insts()->start(), code.insts()->end()); + static const unsigned int insns[] = { + 0xd5033abf, // dmb.ishst + }; + EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns)); + asm_check((const unsigned int *)code.insts()->start(), insns, sizeof insns / sizeof insns[0]); +} + +void expect_dmbld(void* addr) { + if (*((uint32_t *) addr) != test_encode_dmb_ld) { + tty->print_cr("Expected dmb.ld"); + FAIL(); + } +} + +void expect_dmbst(void* addr) { + if (*((uint32_t *) addr) != test_encode_dmb_st) { + tty->print_cr("Expected dmb.st"); + FAIL(); + } +} + +void expect_dmb(void* addr) { + if (*((uint32_t *) addr) != test_encode_dmb) { + tty->print_cr("Expected dmb"); + FAIL(); + } +} + +void expect_any_dmb(void* addr) { + uint32_t encode = *((uint32_t *) addr); + if (encode != test_encode_dmb && encode != test_encode_dmb_ld && encode != test_encode_dmb_st) { + tty->print_cr("Expected a dmb.* instruction"); + FAIL(); + } +} + +void expect_different_dmb_kind(void* addr) { + uint32_t pos1 = *((uint32_t *) addr); + uint32_t pos2 = *(((uint32_t *) addr) + 1); + if (pos1 == pos2) { + tty->print_cr("Expected different dmb kind"); + FAIL(); + } +} + +void expect_dmb_at_least_one(void* addr) { + uint32_t pos1 = *((uint32_t *) addr); + uint32_t pos2 = *(((uint32_t *) addr) + 1); + if (pos1 != test_encode_dmb && pos2 != test_encode_dmb) { + tty->print_cr("Expected at least one dmb"); + FAIL(); + } +} + +void expect_dmb_none(void* addr) { + uint32_t pos1 = *((uint32_t *) addr); + uint32_t pos2 = *(((uint32_t *) addr) + 1); + if (pos1 == test_encode_dmb || pos2 == test_encode_dmb) { + tty->print_cr("Expected no dmb"); + FAIL(); + } +} + +void test_merge_dmb_all_kinds() { + BufferBlob* b = BufferBlob::create("aarch64Test", 20000); + CodeBuffer code(b); + MacroAssembler _masm(&code); + + constexpr int count = 5; + struct { + const char* label; + Assembler::Membar_mask_bits flavor; + // Two groups of two bits describing the ordering, can be OR-ed to figure out composite semantics. + // First group describes ops before the barrier. Second group describes ops after the barrier. + // "01" means "load", "10" means "store", "100" means "any". + int mask; + } kind[count] = { + {"storestore", Assembler::StoreStore, 0b010010}, + {"loadstore", Assembler::LoadStore, 0b001010}, + {"loadload", Assembler::LoadLoad, 0b001001}, + {"storeload", Assembler::StoreLoad, 0b100100}, // quirk: StoreLoad is as powerful as AnyAny + {"anyany", Assembler::AnyAny, 0b100100}, + }; + + for (int b1 = 0; b1 < count; b1++) { + for (int b2 = 0; b2 < count; b2++) { + for (int b3 = 0; b3 < count; b3++) { + for (int b4 = 0; b4 < count; b4++) { + // tty->print_cr("%s + %s + %s + %s", kind[b1].label, kind[b2].label, kind[b3].label, kind[b4].label); + + address start = __ pc(); + __ membar(kind[b1].flavor); + __ membar(kind[b2].flavor); + __ membar(kind[b3].flavor); + __ membar(kind[b4].flavor); + address end = __ pc(); + __ nop(); + + size_t size = pointer_delta(end, start, 1); + if (AlwaysMergeDMB) { + // Expect only a single barrier. + EXPECT_EQ(size, (size_t) NativeMembar::instruction_size); + } else { + EXPECT_LE(size, (size_t) NativeMembar::instruction_size * 2); + } + + // Composite ordering for this group of barriers. + int composite_mask = kind[b1].mask | kind[b2].mask | kind[b3].mask | kind[b4].mask; + + if (size == NativeMembar::instruction_size) { + // If there is a single barrier, we can easily test its type. + switch (composite_mask) { + case 0b001001: + case 0b001010: + case 0b001011: + case 0b001101: + case 0b001110: + case 0b001111: + // Any combination of Load(Load|Store|Any) gets dmb.ld + expect_dmbld(start); + break; + case 0b010010: + // Only StoreStore gets dmb.st + expect_dmbst(start); + break; + default: + // Everything else gets folded into full dmb + expect_dmb(start); + break; + } + } else if (size == 2 * NativeMembar::instruction_size) { + // There are two barriers. Make a few sanity checks. + // They must be different kind + expect_any_dmb(start); + expect_any_dmb(start + NativeMembar::instruction_size); + expect_different_dmb_kind(start); + if ((composite_mask & 0b100100) != 0) { + // There was "any" barrier in the group, a full dmb is expected + expect_dmb_at_least_one(start); + } else { + // Otherwise expect no full dmb + expect_dmb_none(start); + } + } else { + // Merging code does not produce this result. + FAIL(); + } + } + } + } + } + + BufferBlob::free(b); +} + +TEST_VM(AssemblerAArch64, merge_dmb_all_kinds_1) { + FlagSetting fs(AlwaysMergeDMB, true); + test_merge_dmb_all_kinds(); +} + +TEST_VM(AssemblerAArch64, merge_dmb_all_kinds_2) { + FlagSetting fs(AlwaysMergeDMB, false); + test_merge_dmb_all_kinds(); +} + +TEST_VM(AssemblerAArch64, merge_ldst) { + BufferBlob* b = BufferBlob::create("aarch64Test", 400); + CodeBuffer code(b); + MacroAssembler _masm(&code); + + { + Label l; + // merge ld/st into ldp/stp + __ ldr(r0, Address(sp, 8)); + __ ldr(r1, Address(sp, 0)); + __ nop(); + __ str(r0, Address(sp, 0)); + __ str(r1, Address(sp, 8)); + __ nop(); + __ ldrw(r0, Address(sp, 0)); + __ ldrw(r1, Address(sp, 4)); + __ nop(); + __ strw(r0, Address(sp, 4)); + __ strw(r1, Address(sp, 0)); + __ nop(); + // can not merge + __ ldrw(r0, Address(sp, 4)); + __ ldr(r1, Address(sp, 8)); + __ nop(); + __ ldrw(r0, Address(sp, 0)); + __ ldrw(r1, Address(sp, 8)); + __ nop(); + __ str(r0, Address(sp, 0)); + __ bind(l); // block by label + __ str(r1, Address(sp, 8)); + __ nop(); + } + asm_dump(code.insts()->start(), code.insts()->end()); + static const unsigned int insns1[] = { + 0xa94003e1, // ldp x1, x0, [sp] + 0xd503201f, // nop + 0xa90007e0, // stp x0, x1, [sp] + 0xd503201f, // nop + 0x294007e0, // ldp w0, w1, [sp] + 0xd503201f, // nop + 0x290003e1, // stp w1, w0, [sp] + 0xd503201f, // nop + 0xb94007e0, // ldr w0, [sp, 4] + 0xf94007e1, // ldr x1, [sp, 8] + 0xd503201f, // nop + 0xb94003e0, // ldr w0, [sp] + 0xb9400be1, // ldr w1, [sp, 8] + 0xd503201f, // nop + 0xf90003e0, // str x0, [sp] + 0xf90007e1, // str x1, [sp, 8] + 0xd503201f, // nop + }; + EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns1)); + asm_check((const unsigned int *)code.insts()->start(), insns1, sizeof insns1 / sizeof insns1[0]); + + BufferBlob::free(b); +} + +TEST_VM(AssemblerAArch64, merge_ldst_after_expand) { + ResourceMark rm; + BufferBlob* b = BufferBlob::create("aarch64Test", 400); + CodeBuffer code(b); + code.set_blob(b); + MacroAssembler _masm(&code); + + { + __ ldr(r0, Address(sp, 8)); + code.insts()->maybe_expand_to_ensure_remaining(10000); + __ ldr(r1, Address(sp, 0)); + __ nop(); + __ str(r0, Address(sp, 0)); + code.insts()->maybe_expand_to_ensure_remaining(100000); + __ str(r1, Address(sp, 8)); + __ nop(); + } + asm_dump(code.insts()->start(), code.insts()->end()); + static const unsigned int insns[] = { + 0xa94003e1, // ldp x1, x0, [sp] + 0xd503201f, // nop + 0xa90007e0, // stp x0, x1, [sp] + 0xd503201f, // nop + }; + EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns)); + asm_check((const unsigned int *)code.insts()->start(), insns, sizeof insns / sizeof insns[0]); +} + #endif // AARCH64 diff --git a/test/micro/org/openjdk/bench/vm/compiler/FinalFieldInitialize.java b/test/micro/org/openjdk/bench/vm/compiler/FinalFieldInitialize.java new file mode 100644 index 0000000000000..ee0779faecf2a --- /dev/null +++ b/test/micro/org/openjdk/bench/vm/compiler/FinalFieldInitialize.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2024, Alibaba Group 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. + */ +package org.openjdk.bench.vm.compiler; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.*; + +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.infra.Blackhole; + +/* test allocation speed of object with final field */ +@BenchmarkMode(Mode.Throughput) +@OutputTimeUnit(TimeUnit.SECONDS) +@State(Scope.Benchmark) +@Warmup(iterations = 5, time = 3, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 3, time = 3, timeUnit = TimeUnit.SECONDS) +@Fork(value = 3) +public class FinalFieldInitialize { + final static int LEN = 100_000; + Object arr[] = null; + @Setup + public void setup(){ + arr = new Object[LEN]; + } + + @Benchmark + public void testAlloc(Blackhole bh) { + for (int i=0; i Date: Mon, 10 Jun 2024 13:41:56 +0000 Subject: [PATCH 010/471] 8326085: Remove unnecessary UpcallContext constructor Reviewed-by: kbarrett, stuefe --- src/hotspot/share/prims/upcallLinker.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hotspot/share/prims/upcallLinker.cpp b/src/hotspot/share/prims/upcallLinker.cpp index 4b924b5302d1b..b02746911a808 100644 --- a/src/hotspot/share/prims/upcallLinker.cpp +++ b/src/hotspot/share/prims/upcallLinker.cpp @@ -48,7 +48,6 @@ extern struct JavaVM_ main_vm; struct UpcallContext { Thread* attachedThread; - UpcallContext() {} // Explicit constructor to address XL C compiler bug. ~UpcallContext() { if (attachedThread != nullptr) { JavaVM_ *vm = (JavaVM *)(&main_vm); From ce5727df4436425b24b89f24c6e6b708575ec7c6 Mon Sep 17 00:00:00 2001 From: Gui Cao Date: Mon, 10 Jun 2024 13:44:43 +0000 Subject: [PATCH 011/471] 8333652: RISC-V: compiler/vectorapi/VectorGatherMaskFoldingTest.java fails when using RVV Reviewed-by: fyang --- src/hotspot/cpu/riscv/assembler_riscv.hpp | 2 + src/hotspot/cpu/riscv/riscv_v.ad | 98 +++++++++++++++++++---- 2 files changed, 84 insertions(+), 16 deletions(-) diff --git a/src/hotspot/cpu/riscv/assembler_riscv.hpp b/src/hotspot/cpu/riscv/assembler_riscv.hpp index 616aee82b996a..fbb3200f40b0d 100644 --- a/src/hotspot/cpu/riscv/assembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/assembler_riscv.hpp @@ -1828,10 +1828,12 @@ enum Nf { // Vector unordered indexed load instructions INSN( vluxei8_v, 0b0000111, 0b000, 0b01, 0b0); INSN(vluxei32_v, 0b0000111, 0b110, 0b01, 0b0); + INSN(vluxei64_v, 0b0000111, 0b111, 0b01, 0b0); // Vector unordered indexed store instructions INSN( vsuxei8_v, 0b0100111, 0b000, 0b01, 0b0); INSN(vsuxei32_v, 0b0100111, 0b110, 0b01, 0b0); + INSN(vsuxei64_v, 0b0100111, 0b111, 0b01, 0b0); #undef INSN diff --git a/src/hotspot/cpu/riscv/riscv_v.ad b/src/hotspot/cpu/riscv/riscv_v.ad index db2c28619490f..4a71da9f20c65 100644 --- a/src/hotspot/cpu/riscv/riscv_v.ad +++ b/src/hotspot/cpu/riscv/riscv_v.ad @@ -4795,12 +4795,11 @@ instruct vcountTrailingZeros(vReg dst, vReg src) %{ // ------------------------------ Vector Load Gather --------------------------- -instruct gather_load(vReg dst, indirect mem, vReg idx) %{ - predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4 || - type2aelembytes(Matcher::vector_element_basic_type(n)) == 8); +instruct gather_loadS(vReg dst, indirect mem, vReg idx) %{ + predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4); match(Set dst (LoadVectorGather mem idx)); effect(TEMP_DEF dst); - format %{ "gather_load $dst, $mem, $idx" %} + format %{ "gather_loadS $dst, $mem, $idx" %} ins_encode %{ __ vmv1r_v(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg)); BasicType bt = Matcher::vector_element_basic_type(this); @@ -4813,12 +4812,28 @@ instruct gather_load(vReg dst, indirect mem, vReg idx) %{ ins_pipe(pipe_slow); %} -instruct gather_load_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{ - predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4 || - type2aelembytes(Matcher::vector_element_basic_type(n)) == 8); +instruct gather_loadD(vReg dst, indirect mem, vReg idx) %{ + predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 8); + match(Set dst (LoadVectorGather mem idx)); + effect(TEMP_DEF dst); + format %{ "gather_loadD $dst, $mem, $idx" %} + ins_encode %{ + BasicType bt = Matcher::vector_element_basic_type(this); + Assembler::SEW sew = Assembler::elemtype_to_sew(bt); + __ vsetvli_helper(bt, Matcher::vector_length(this)); + __ vzext_vf2(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg)); + __ vsll_vi(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), (int)sew); + __ vluxei64_v(as_VectorRegister($dst$$reg), as_Register($mem$$base), + as_VectorRegister($dst$$reg)); + %} + ins_pipe(pipe_slow); +%} + +instruct gather_loadS_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{ + predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4); match(Set dst (LoadVectorGatherMasked mem (Binary idx v0))); effect(TEMP_DEF dst, TEMP tmp); - format %{ "gather_load_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %} + format %{ "gather_loadS_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %} ins_encode %{ __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg)); BasicType bt = Matcher::vector_element_basic_type(this); @@ -4833,14 +4848,32 @@ instruct gather_load_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vR ins_pipe(pipe_slow); %} +instruct gather_loadD_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{ + predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 8); + match(Set dst (LoadVectorGatherMasked mem (Binary idx v0))); + effect(TEMP_DEF dst, TEMP tmp); + format %{ "gather_loadD_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %} + ins_encode %{ + BasicType bt = Matcher::vector_element_basic_type(this); + Assembler::SEW sew = Assembler::elemtype_to_sew(bt); + __ vsetvli_helper(bt, Matcher::vector_length(this)); + __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg)); + __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew); + __ vxor_vv(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), + as_VectorRegister($dst$$reg)); + __ vluxei64_v(as_VectorRegister($dst$$reg), as_Register($mem$$base), + as_VectorRegister($tmp$$reg), Assembler::v0_t); + %} + ins_pipe(pipe_slow); +%} + // ------------------------------ Vector Store Scatter ------------------------- -instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{ - predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4 || - type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8); +instruct scatter_storeS(indirect mem, vReg src, vReg idx, vReg tmp) %{ + predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4); match(Set mem (StoreVectorScatter mem (Binary src idx))); effect(TEMP tmp); - format %{ "scatter_store $mem, $idx, $src\t# KILL $tmp" %} + format %{ "scatter_storeS $mem, $idx, $src\t# KILL $tmp" %} ins_encode %{ __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg)); BasicType bt = Matcher::vector_element_basic_type(this, $src); @@ -4853,12 +4886,28 @@ instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{ ins_pipe(pipe_slow); %} -instruct scatter_store_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{ - predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4 || - type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8); +instruct scatter_storeD(indirect mem, vReg src, vReg idx, vReg tmp) %{ + predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8); + match(Set mem (StoreVectorScatter mem (Binary src idx))); + effect(TEMP tmp); + format %{ "scatter_storeD $mem, $idx, $src\t# KILL $tmp" %} + ins_encode %{ + BasicType bt = Matcher::vector_element_basic_type(this, $src); + Assembler::SEW sew = Assembler::elemtype_to_sew(bt); + __ vsetvli_helper(bt, Matcher::vector_length(this, $src)); + __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg)); + __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew); + __ vsuxei64_v(as_VectorRegister($src$$reg), as_Register($mem$$base), + as_VectorRegister($tmp$$reg)); + %} + ins_pipe(pipe_slow); +%} + +instruct scatter_storeS_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{ + predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4); match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0)))); effect(TEMP tmp); - format %{ "scatter_store_masked $mem, $idx, $src, $v0\t# KILL $tmp" %} + format %{ "scatter_storeS_masked $mem, $idx, $src, $v0\t# KILL $tmp" %} ins_encode %{ __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg)); BasicType bt = Matcher::vector_element_basic_type(this, $src); @@ -4871,6 +4920,23 @@ instruct scatter_store_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, ins_pipe(pipe_slow); %} +instruct scatter_storeD_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{ + predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8); + match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0)))); + effect(TEMP tmp); + format %{ "scatter_storeD_masked $mem, $idx, $src, $v0\t# KILL $tmp" %} + ins_encode %{ + BasicType bt = Matcher::vector_element_basic_type(this, $src); + Assembler::SEW sew = Assembler::elemtype_to_sew(bt); + __ vsetvli_helper(bt, Matcher::vector_length(this, $src)); + __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg)); + __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew); + __ vsuxei64_v(as_VectorRegister($src$$reg), as_Register($mem$$base), + as_VectorRegister($tmp$$reg), Assembler::v0_t); + %} + ins_pipe(pipe_slow); +%} + // ------------------------------ Populate Index to a Vector ------------------- instruct populateindex(vReg dst, iRegIorL2I src1, iRegIorL2I src2, vReg tmp) %{ From 6ea28fb30ce7d48e2f053cb9faf4f2a5dba52b06 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Mon, 10 Jun 2024 15:23:32 +0000 Subject: [PATCH 012/471] 8333641: Serial: Remove Generation::supports_tlab_allocation Reviewed-by: tschatzl --- src/hotspot/share/gc/serial/defNewGeneration.hpp | 1 - src/hotspot/share/gc/serial/generation.hpp | 3 --- src/hotspot/share/gc/serial/serialHeap.cpp | 7 +------ src/hotspot/share/gc/serial/tenuredGeneration.hpp | 2 +- 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp index 65ee52cf4ea31..baf565e28629b 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.hpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp @@ -191,7 +191,6 @@ class DefNewGeneration: public Generation { size_t max_survivor_size() const { return _max_survivor_size; } // Thread-local allocation buffers - bool supports_tlab_allocation() const { return true; } size_t tlab_capacity() const; size_t tlab_used() const; size_t unsafe_max_tlab_alloc() const; diff --git a/src/hotspot/share/gc/serial/generation.hpp b/src/hotspot/share/gc/serial/generation.hpp index 9f73caacb192a..5e5aad5d0c1b2 100644 --- a/src/hotspot/share/gc/serial/generation.hpp +++ b/src/hotspot/share/gc/serial/generation.hpp @@ -114,9 +114,6 @@ class Generation: public CHeapObj { // Like "allocate", but performs any necessary locking internally. virtual HeapWord* par_allocate(size_t word_size, bool is_tlab) = 0; - // Thread-local allocation buffers - virtual bool supports_tlab_allocation() const { return false; } - // Perform a heap collection, attempting to create (at least) enough // space to support an allocation of the given "word_size". If // successful, perform the allocation and return the resulting diff --git a/src/hotspot/share/gc/serial/serialHeap.cpp b/src/hotspot/share/gc/serial/serialHeap.cpp index 9e3bd0b81db8e..8dd8a9c0e6766 100644 --- a/src/hotspot/share/gc/serial/serialHeap.cpp +++ b/src/hotspot/share/gc/serial/serialHeap.cpp @@ -833,20 +833,15 @@ bool SerialHeap::block_is_obj(const HeapWord* addr) const { } size_t SerialHeap::tlab_capacity(Thread* thr) const { - assert(!_old_gen->supports_tlab_allocation(), "Old gen supports TLAB allocation?!"); - assert(_young_gen->supports_tlab_allocation(), "Young gen doesn't support TLAB allocation?!"); + // Only young-gen supports tlab allocation. return _young_gen->tlab_capacity(); } size_t SerialHeap::tlab_used(Thread* thr) const { - assert(!_old_gen->supports_tlab_allocation(), "Old gen supports TLAB allocation?!"); - assert(_young_gen->supports_tlab_allocation(), "Young gen doesn't support TLAB allocation?!"); return _young_gen->tlab_used(); } size_t SerialHeap::unsafe_max_tlab_alloc(Thread* thr) const { - assert(!_old_gen->supports_tlab_allocation(), "Old gen supports TLAB allocation?!"); - assert(_young_gen->supports_tlab_allocation(), "Young gen doesn't support TLAB allocation?!"); return _young_gen->unsafe_max_tlab_alloc(); } diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.hpp b/src/hotspot/share/gc/serial/tenuredGeneration.hpp index 5d6c19afbfc4b..dc2730eaf419d 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.hpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.hpp @@ -143,7 +143,7 @@ class TenuredGeneration: public Generation { bool should_allocate(size_t word_size, bool is_tlab) { bool result = false; size_t overflow_limit = (size_t)1 << (BitsPerSize_t - LogHeapWordSize); - if (!is_tlab || supports_tlab_allocation()) { + if (!is_tlab) { result = (word_size > 0) && (word_size < overflow_limit); } return result; From b68609f80d629846870c45d34046d8c47941003b Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Mon, 10 Jun 2024 15:23:41 +0000 Subject: [PATCH 013/471] 8333779: Parallel: Remove Summary phase related debug print during Full GC Reviewed-by: tschatzl --- .../share/gc/parallel/psParallelCompact.cpp | 222 ------------------ .../share/gc/parallel/psParallelCompact.hpp | 19 -- .../gc/parallel/test_psParallelCompact.cpp | 61 ----- 3 files changed, 302 deletions(-) delete mode 100644 test/hotspot/gtest/gc/parallel/test_psParallelCompact.cpp diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index 7b8ae42aaa4ec..ffce35ed03c7a 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -200,188 +200,6 @@ void PSParallelCompact::print_on_error(outputStream* st) { _mark_bitmap.print_on_error(st); } -#ifndef PRODUCT -const char* PSParallelCompact::space_names[] = { - "old ", "eden", "from", "to " -}; - -void PSParallelCompact::print_region_ranges() { - if (!log_develop_is_enabled(Trace, gc, compaction)) { - return; - } - Log(gc, compaction) log; - ResourceMark rm; - LogStream ls(log.trace()); - Universe::print_on(&ls); - log.trace("space bottom top end new_top"); - log.trace("------ ---------- ---------- ---------- ----------"); - - for (unsigned int id = 0; id < last_space_id; ++id) { - const MutableSpace* space = _space_info[id].space(); - log.trace("%u %s " - SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10) " " - SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10) " ", - id, space_names[id], - summary_data().addr_to_region_idx(space->bottom()), - summary_data().addr_to_region_idx(space->top()), - summary_data().addr_to_region_idx(space->end()), - summary_data().addr_to_region_idx(_space_info[id].new_top())); - } -} - -static void -print_generic_summary_region(size_t i, const ParallelCompactData::RegionData* c) -{ -#define REGION_IDX_FORMAT SIZE_FORMAT_W(7) -#define REGION_DATA_FORMAT SIZE_FORMAT_W(5) - - ParallelCompactData& sd = PSParallelCompact::summary_data(); - size_t dci = c->destination() ? sd.addr_to_region_idx(c->destination()) : 0; - log_develop_trace(gc, compaction)( - REGION_IDX_FORMAT " " - REGION_IDX_FORMAT " " PTR_FORMAT " " - REGION_DATA_FORMAT " " REGION_DATA_FORMAT " " - REGION_DATA_FORMAT " " REGION_IDX_FORMAT " %d", - i, dci, p2i(c->destination()), - c->partial_obj_size(), c->live_obj_size(), - c->data_size(), c->source_region(), c->destination_count()); - -#undef REGION_IDX_FORMAT -#undef REGION_DATA_FORMAT -} - -void -print_generic_summary_data(ParallelCompactData& summary_data, - HeapWord* const beg_addr, - HeapWord* const end_addr) -{ - size_t total_words = 0; - size_t i = summary_data.addr_to_region_idx(beg_addr); - const size_t last = summary_data.addr_to_region_idx(end_addr); - HeapWord* pdest = 0; - - while (i < last) { - ParallelCompactData::RegionData* c = summary_data.region(i); - if (c->data_size() != 0 || c->destination() != pdest) { - print_generic_summary_region(i, c); - total_words += c->data_size(); - pdest = c->destination(); - } - ++i; - } - - log_develop_trace(gc, compaction)("summary_data_bytes=" SIZE_FORMAT, total_words * HeapWordSize); -} - -void -PSParallelCompact::print_generic_summary_data(ParallelCompactData& summary_data, - HeapWord* const beg_addr, - HeapWord* const end_addr) { - ::print_generic_summary_data(summary_data,beg_addr, end_addr); -} - -static void -print_initial_summary_data(ParallelCompactData& summary_data, - const MutableSpace* space) { - if (space->top() == space->bottom()) { - return; - } - - const size_t region_size = ParallelCompactData::RegionSize; - typedef ParallelCompactData::RegionData RegionData; - HeapWord* const top_aligned_up = summary_data.region_align_up(space->top()); - const size_t end_region = summary_data.addr_to_region_idx(top_aligned_up); - const RegionData* c = summary_data.region(end_region - 1); - HeapWord* end_addr = c->destination() + c->data_size(); - const size_t live_in_space = pointer_delta(end_addr, space->bottom()); - - // Print (and count) the full regions at the beginning of the space. - size_t full_region_count = 0; - size_t i = summary_data.addr_to_region_idx(space->bottom()); - while (i < end_region && summary_data.region(i)->data_size() == region_size) { - ParallelCompactData::RegionData* c = summary_data.region(i); - log_develop_trace(gc, compaction)( - SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d", - i, p2i(c->destination()), - c->partial_obj_size(), c->live_obj_size(), - c->data_size(), c->source_region(), c->destination_count()); - ++full_region_count; - ++i; - } - - size_t live_to_right = live_in_space - full_region_count * region_size; - - double max_reclaimed_ratio = 0.0; - size_t max_reclaimed_ratio_region = 0; - size_t max_dead_to_right = 0; - size_t max_live_to_right = 0; - - // Print the 'reclaimed ratio' for regions while there is something live in - // the region or to the right of it. The remaining regions are empty (and - // uninteresting), and computing the ratio will result in division by 0. - while (i < end_region && live_to_right > 0) { - c = summary_data.region(i); - HeapWord* const region_addr = summary_data.region_to_addr(i); - const size_t used_to_right = pointer_delta(space->top(), region_addr); - const size_t dead_to_right = used_to_right - live_to_right; - const double reclaimed_ratio = double(dead_to_right) / live_to_right; - - if (reclaimed_ratio > max_reclaimed_ratio) { - max_reclaimed_ratio = reclaimed_ratio; - max_reclaimed_ratio_region = i; - max_dead_to_right = dead_to_right; - max_live_to_right = live_to_right; - } - - ParallelCompactData::RegionData* c = summary_data.region(i); - log_develop_trace(gc, compaction)( - SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d" - "%12.10f " SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10), - i, p2i(c->destination()), - c->partial_obj_size(), c->live_obj_size(), - c->data_size(), c->source_region(), c->destination_count(), - reclaimed_ratio, dead_to_right, live_to_right); - - - live_to_right -= c->data_size(); - ++i; - } - - // Any remaining regions are empty. Print one more if there is one. - if (i < end_region) { - ParallelCompactData::RegionData* c = summary_data.region(i); - log_develop_trace(gc, compaction)( - SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d", - i, p2i(c->destination()), - c->partial_obj_size(), c->live_obj_size(), - c->data_size(), c->source_region(), c->destination_count()); - } - - log_develop_trace(gc, compaction)("max: " SIZE_FORMAT_W(4) " d2r=" SIZE_FORMAT_W(10) " l2r=" SIZE_FORMAT_W(10) " max_ratio=%14.12f", - max_reclaimed_ratio_region, max_dead_to_right, max_live_to_right, max_reclaimed_ratio); -} - -static void -print_initial_summary_data(ParallelCompactData& summary_data, - SpaceInfo* space_info) { - if (!log_develop_is_enabled(Trace, gc, compaction)) { - return; - } - - unsigned int id = PSParallelCompact::old_space_id; - const MutableSpace* space; - do { - space = space_info[id].space(); - print_initial_summary_data(summary_data, space); - } while (++id < PSParallelCompact::eden_space_id); - - do { - space = space_info[id].space(); - print_generic_summary_data(summary_data, space->bottom(), space->top()); - } while (++id < PSParallelCompact::last_space_id); -} -#endif // #ifndef PRODUCT - ParallelCompactData::ParallelCompactData() : _heap_start(nullptr), DEBUG_ONLY(_heap_end(nullptr) COMMA) @@ -1008,29 +826,6 @@ void PSParallelCompact::fill_dense_prefix_end(SpaceId id) { } } -#ifndef PRODUCT -void PSParallelCompact::summary_phase_msg(SpaceId dst_space_id, - HeapWord* dst_beg, HeapWord* dst_end, - SpaceId src_space_id, - HeapWord* src_beg, HeapWord* src_end) -{ - log_develop_trace(gc, compaction)( - "Summarizing %d [%s] into %d [%s]: " - "src=" PTR_FORMAT "-" PTR_FORMAT " " - SIZE_FORMAT "-" SIZE_FORMAT " " - "dst=" PTR_FORMAT "-" PTR_FORMAT " " - SIZE_FORMAT "-" SIZE_FORMAT, - src_space_id, space_names[src_space_id], - dst_space_id, space_names[dst_space_id], - p2i(src_beg), p2i(src_end), - _summary_data.addr_to_region_idx(src_beg), - _summary_data.addr_to_region_idx(src_end), - p2i(dst_beg), p2i(dst_end), - _summary_data.addr_to_region_idx(dst_beg), - _summary_data.addr_to_region_idx(dst_end)); -} -#endif // #ifndef PRODUCT - bool PSParallelCompact::reassess_maximum_compaction(bool maximum_compaction, size_t total_live_words, MutableSpace* const old_space, @@ -1114,8 +909,6 @@ void PSParallelCompact::summary_phase(bool maximum_compaction) space->bottom()); const size_t available = pointer_delta(dst_space_end, *new_top_addr); - NOT_PRODUCT(summary_phase_msg(dst_space_id, *new_top_addr, dst_space_end, - SpaceId(id), space->bottom(), space->top());) if (live > 0 && live <= available) { // All the live data will fit. bool done = _summary_data.summarize(_space_info[id].split_info(), @@ -1143,9 +936,6 @@ void PSParallelCompact::summary_phase(bool maximum_compaction) dst_space_id = SpaceId(id); dst_space_end = space->end(); new_top_addr = _space_info[id].new_top_addr(); - NOT_PRODUCT(summary_phase_msg(dst_space_id, - space->bottom(), dst_space_end, - SpaceId(id), next_src_addr, space->top());) done = _summary_data.summarize(_space_info[id].split_info(), next_src_addr, space->top(), nullptr, @@ -1155,10 +945,6 @@ void PSParallelCompact::summary_phase(bool maximum_compaction) assert(*new_top_addr <= space->top(), "usage should not grow"); } } - - log_develop_trace(gc, compaction)("Summary_phase: after final summarization"); - NOT_PRODUCT(print_region_ranges()); - NOT_PRODUCT(print_initial_summary_data(_summary_data, _space_info)); } // This method should contain all heap-specific policy for invoking a full @@ -2126,15 +1912,12 @@ void PSParallelCompact::verify_complete(SpaceId space_id) { const size_t new_top_region = sd.addr_to_region_idx(new_top_addr); const size_t old_top_region = sd.addr_to_region_idx(old_top_addr); - bool issued_a_warning = false; - size_t cur_region; for (cur_region = beg_region; cur_region < new_top_region; ++cur_region) { const RegionData* const c = sd.region(cur_region); if (!c->completed()) { log_warning(gc)("region " SIZE_FORMAT " not filled: destination_count=%u", cur_region, c->destination_count()); - issued_a_warning = true; } } @@ -2143,13 +1926,8 @@ void PSParallelCompact::verify_complete(SpaceId space_id) { if (!c->available()) { log_warning(gc)("region " SIZE_FORMAT " not empty: destination_count=%u", cur_region, c->destination_count()); - issued_a_warning = true; } } - - if (issued_a_warning) { - print_region_ranges(); - } } #endif // #ifdef ASSERT diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.hpp b/src/hotspot/share/gc/parallel/psParallelCompact.hpp index b30ed0ab98a43..5b5e38b72a4b8 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.hpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.hpp @@ -695,8 +695,6 @@ class PSParallelCompact : AllStatic { virtual bool do_object_b(oop p); }; - friend class PSParallelCompactTest; - private: static STWGCTimer _gc_timer; static ParallelOldTracer _gc_tracer; @@ -755,13 +753,6 @@ class PSParallelCompact : AllStatic { // Add available regions to the stack and draining tasks to the task queue. static void prepare_region_draining_tasks(uint parallel_gc_threads); -#ifndef PRODUCT - // Print generic summary data - static void print_generic_summary_data(ParallelCompactData& summary_data, - HeapWord* const beg_addr, - HeapWord* const end_addr); -#endif // #ifndef PRODUCT - static void fill_range_in_dense_prefix(HeapWord* start, HeapWord* end); public: @@ -857,16 +848,6 @@ class PSParallelCompact : AllStatic { static void print_on_error(outputStream* st); -#ifndef PRODUCT - // Debugging support. - static const char* space_names[last_space_id]; - static void print_region_ranges(); - static void summary_phase_msg(SpaceId dst_space_id, - HeapWord* dst_beg, HeapWord* dst_end, - SpaceId src_space_id, - HeapWord* src_beg, HeapWord* src_end); -#endif // #ifndef PRODUCT - #ifdef ASSERT // Sanity check the new location of a word in the heap. static inline void check_new_location(HeapWord* old_addr, HeapWord* new_addr); diff --git a/test/hotspot/gtest/gc/parallel/test_psParallelCompact.cpp b/test/hotspot/gtest/gc/parallel/test_psParallelCompact.cpp deleted file mode 100644 index 4820a01cc5771..0000000000000 --- a/test/hotspot/gtest/gc/parallel/test_psParallelCompact.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include "precompiled.hpp" -#include "gc/parallel/parMarkBitMap.inline.hpp" -#include "gc/parallel/psCompactionManager.inline.hpp" -#include "gc/parallel/psParallelCompact.hpp" -#include "unittest.hpp" - -#ifndef PRODUCT - -class PSParallelCompactTest : public ::testing::Test { - public: - static void print_generic_summary_data(ParallelCompactData& summary_data, - HeapWord* const beg_addr, - HeapWord* const end_addr) { - PSParallelCompact::print_generic_summary_data(summary_data, - beg_addr, end_addr); - } -}; - -// @requires UseParallelGC -TEST_VM(PSParallelCompact, print_generic_summary_data) { - if (!UseParallelGC) { - return; - } - // Check that print_generic_summary_data() does not print the - // end region by placing a bad value in the destination of the - // end region. The end region should not be printed because it - // corresponds to the space after the end of the heap. - ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); - HeapWord* begin_heap = - (HeapWord*) heap->old_gen()->virtual_space()->low_boundary(); - HeapWord* end_heap = - (HeapWord*) heap->young_gen()->virtual_space()->high_boundary(); - - PSParallelCompactTest::print_generic_summary_data(PSParallelCompact::summary_data(), - begin_heap, end_heap); -} - -#endif From b25476200ab8bea4f25a671d5b9351662d11c5b4 Mon Sep 17 00:00:00 2001 From: Matthew Donovan Date: Mon, 10 Jun 2024 15:41:30 +0000 Subject: [PATCH 014/471] 8333829: ProblemList sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java due to JDK-8333317 Reviewed-by: mullan --- test/jdk/ProblemList.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 74218cc55b340..da674d6a0471d 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -621,7 +621,7 @@ sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.java 8039280 gene sun/security/provider/PolicyParser/PrincipalExpansionError.java 8039280 generic-all javax/net/ssl/SSLSession/CertMsgCheck.java 8326705 generic-all -sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183 linux-ppc64le +sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183,8333317 generic-all security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java#teliasonerarootcav1 8333640 generic-all From 13642cb4b8895ad07b2249c9e215a6a037e5cf71 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Mon, 10 Jun 2024 17:15:32 +0000 Subject: [PATCH 015/471] 8333828: Use value javadoc tag in java.lang.{Float, Double} Reviewed-by: liach, rgiulietti --- .../share/classes/java/lang/Double.java | 24 ++++++++++--------- .../share/classes/java/lang/Float.java | 18 +++++++------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/java.base/share/classes/java/lang/Double.java b/src/java.base/share/classes/java/lang/Double.java index c472f5c3fcf37..277e1c14480c1 100644 --- a/src/java.base/share/classes/java/lang/Double.java +++ b/src/java.base/share/classes/java/lang/Double.java @@ -411,41 +411,43 @@ public final class Double extends Number public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324 /** - * The number of bits used to represent a {@code double} value. + * The number of bits used to represent a {@code double} value, + * {@value}. * * @since 1.5 */ public static final int SIZE = 64; /** - * The number of bits in the significand of a {@code double} value. - * This is the parameter N in section {@jls 4.2.3} of - * The Java Language Specification. + * The number of bits in the significand of a {@code double} + * value, {@value}. This is the parameter N in section {@jls + * 4.2.3} of The Java Language Specification. * * @since 19 */ public static final int PRECISION = 53; /** - * Maximum exponent a finite {@code double} variable may have. - * It is equal to the value returned by - * {@code Math.getExponent(Double.MAX_VALUE)}. + * Maximum exponent a finite {@code double} variable may have, + * {@value}. It is equal to the value returned by {@code + * Math.getExponent(Double.MAX_VALUE)}. * * @since 1.6 */ public static final int MAX_EXPONENT = (1 << (SIZE - PRECISION - 1)) - 1; // 1023 /** - * Minimum exponent a normalized {@code double} variable may - * have. It is equal to the value returned by - * {@code Math.getExponent(Double.MIN_NORMAL)}. + * Minimum exponent a normalized {@code double} variable may have, + * {@value}. It is equal to the value returned by {@code + * Math.getExponent(Double.MIN_NORMAL)}. * * @since 1.6 */ public static final int MIN_EXPONENT = 1 - MAX_EXPONENT; // -1022 /** - * The number of bytes used to represent a {@code double} value. + * The number of bytes used to represent a {@code double} value, + * {@value}. * * @since 1.8 */ diff --git a/src/java.base/share/classes/java/lang/Float.java b/src/java.base/share/classes/java/lang/Float.java index fab92d5c4c920..63a4cc0fab29b 100644 --- a/src/java.base/share/classes/java/lang/Float.java +++ b/src/java.base/share/classes/java/lang/Float.java @@ -127,15 +127,16 @@ public final class Float extends Number public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f /** - * The number of bits used to represent a {@code float} value. + * The number of bits used to represent a {@code float} value, + * {@value}. * * @since 1.5 */ public static final int SIZE = 32; /** - * The number of bits in the significand of a {@code float} value. - * This is the parameter N in section {@jls 4.2.3} of + * The number of bits in the significand of a {@code float} value, + * {@value}. This is the parameter N in section {@jls 4.2.3} of * The Java Language Specification. * * @since 19 @@ -143,8 +144,8 @@ public final class Float extends Number public static final int PRECISION = 24; /** - * Maximum exponent a finite {@code float} variable may have. It - * is equal to the value returned by {@code + * Maximum exponent a finite {@code float} variable may have, + * {@value}. It is equal to the value returned by {@code * Math.getExponent(Float.MAX_VALUE)}. * * @since 1.6 @@ -152,8 +153,8 @@ public final class Float extends Number public static final int MAX_EXPONENT = (1 << (SIZE - PRECISION - 1)) - 1; // 127 /** - * Minimum exponent a normalized {@code float} variable may have. - * It is equal to the value returned by {@code + * Minimum exponent a normalized {@code float} variable may have, + * {@value}. It is equal to the value returned by {@code * Math.getExponent(Float.MIN_NORMAL)}. * * @since 1.6 @@ -161,7 +162,8 @@ public final class Float extends Number public static final int MIN_EXPONENT = 1 - MAX_EXPONENT; // -126 /** - * The number of bytes used to represent a {@code float} value. + * The number of bytes used to represent a {@code float} value, + * {@value}. * * @since 1.8 */ From 96911537557dd95cd11598cd9a9f4e64e05e6aac Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Mon, 10 Jun 2024 17:58:22 +0000 Subject: [PATCH 016/471] 8329141: Obsolete RTM flags and code Reviewed-by: chagedorn --- src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp | 369 +----------------- src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp | 30 +- src/hotspot/cpu/x86/globalDefinitions_x86.hpp | 7 +- src/hotspot/cpu/x86/globals_x86.hpp | 45 --- src/hotspot/cpu/x86/macroAssembler_x86.hpp | 1 - src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp | 19 - src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp | 19 - src/hotspot/cpu/x86/vm_version_x86.cpp | 49 --- src/hotspot/cpu/x86/x86_32.ad | 23 +- src/hotspot/cpu/x86/x86_64.ad | 22 +- src/hotspot/share/adlc/output_c.cpp | 11 +- src/hotspot/share/ci/ciEnv.cpp | 14 +- src/hotspot/share/ci/ciEnv.hpp | 5 +- src/hotspot/share/ci/ciMethodData.hpp | 13 +- src/hotspot/share/code/nmethod.cpp | 3 - src/hotspot/share/code/nmethod.hpp | 12 - .../share/compiler/compilerDefinitions.hpp | 17 - src/hotspot/share/compiler/compilerOracle.hpp | 2 - src/hotspot/share/oops/methodData.cpp | 15 - src/hotspot/share/oops/methodData.hpp | 21 - src/hotspot/share/opto/c2_globals.hpp | 3 - src/hotspot/share/opto/classes.hpp | 1 - src/hotspot/share/opto/compile.cpp | 21 +- src/hotspot/share/opto/compile.hpp | 5 - src/hotspot/share/opto/graphKit.cpp | 3 - src/hotspot/share/opto/locknode.cpp | 16 - src/hotspot/share/opto/locknode.hpp | 12 - src/hotspot/share/opto/loopTransform.cpp | 18 - src/hotspot/share/opto/machnode.hpp | 5 +- src/hotspot/share/opto/macro.cpp | 25 -- src/hotspot/share/opto/opaquenode.cpp | 18 +- src/hotspot/share/opto/opaquenode.hpp | 22 +- src/hotspot/share/opto/output.cpp | 9 +- src/hotspot/share/opto/output.hpp | 5 +- src/hotspot/share/opto/parse.hpp | 2 - src/hotspot/share/opto/parse1.cpp | 41 +- src/hotspot/share/opto/runtime.cpp | 15 +- src/hotspot/share/opto/runtime.hpp | 15 +- src/hotspot/share/runtime/arguments.cpp | 18 +- src/hotspot/share/runtime/deoptimization.cpp | 14 +- src/hotspot/share/runtime/deoptimization.hpp | 1 - .../flags/jvmFlagConstraintsCompiler.cpp | 14 - .../flags/jvmFlagConstraintsCompiler.hpp | 1 - src/hotspot/share/runtime/java.cpp | 2 +- src/hotspot/share/runtime/rtmLocking.cpp | 77 ---- src/hotspot/share/runtime/rtmLocking.hpp | 112 ------ src/hotspot/share/runtime/threads.cpp | 7 - src/hotspot/share/runtime/vmStructs.cpp | 1 - src/java.base/share/man/java.1 | 52 +-- test/hotspot/jtreg/ProblemList.txt | 12 - test/hotspot/jtreg/TEST.groups | 1 - .../cli/RTMGenericCommandLineOptionTest.java | 214 ---------- .../compiler/rtm/cli/RTMLockingAwareTest.java | 158 -------- ...tPrintPreciseRTMLockingStatisticsBase.java | 102 ----- ...kingStatisticsOptionOnSupportedConfig.java | 81 ---- ...ngStatisticsOptionOnUnsupportedConfig.java | 46 --- .../rtm/cli/TestRTMAbortThresholdOption.java | 51 --- .../TestRTMLockingCalculationDelayOption.java | 50 --- .../cli/TestRTMLockingThresholdOption.java | 50 --- .../rtm/cli/TestRTMRetryCountOption.java | 50 --- .../rtm/cli/TestRTMSpinLoopCountOption.java | 51 --- ...lCountIncrRateOptionOnSupportedConfig.java | 56 --- ...estUseRTMDeoptOptionOnSupportedConfig.java | 87 ----- ...tUseRTMDeoptOptionOnUnsupportedConfig.java | 71 ---- ...MForStackLocksOptionOnSupportedConfig.java | 118 ------ ...orStackLocksOptionOnUnsupportedConfig.java | 105 ----- ...tUseRTMLockingOptionOnSupportedConfig.java | 95 ----- ...stUseRTMLockingOptionOnUnsupportedCPU.java | 98 ----- ...estUseRTMLockingOptionOnUnsupportedVM.java | 73 ---- .../cli/TestUseRTMXendForLockBusyOption.java | 50 --- .../rtm/locking/TestRTMAbortRatio.java | 165 -------- .../rtm/locking/TestRTMAbortThreshold.java | 105 ----- .../rtm/locking/TestRTMAfterNonRTMDeopt.java | 212 ---------- .../locking/TestRTMDeoptOnHighAbortRatio.java | 116 ------ .../locking/TestRTMDeoptOnLowAbortRatio.java | 169 -------- .../TestRTMLockingCalculationDelay.java | 106 ----- .../rtm/locking/TestRTMLockingThreshold.java | 180 --------- .../rtm/locking/TestRTMRetryCount.java | 103 ----- .../rtm/locking/TestRTMSpinLoopCount.java | 121 ------ .../locking/TestRTMTotalCountIncrRate.java | 163 -------- .../locking/TestUseRTMAfterLockInflation.java | 128 ------ .../compiler/rtm/locking/TestUseRTMDeopt.java | 89 ----- .../locking/TestUseRTMForInflatedLocks.java | 93 ----- .../rtm/locking/TestUseRTMForStackLocks.java | 95 ----- .../locking/TestUseRTMXendForLockBusy.java | 113 ------ .../TestNoRTMLockElidingOption.java | 105 ----- .../TestUseRTMLockElidingOption.java | 119 ------ .../TestPrintPreciseRTMLockingStatistics.java | 142 ------- .../testlibrary/rtm/AbortProvoker.java | 216 ---------- .../compiler/testlibrary/rtm/AbortType.java | 102 ----- .../rtm/BufferOverflowProvoker.java | 47 --- .../compiler/testlibrary/rtm/BusyLock.java | 125 ------ .../testlibrary/rtm/CompilableTest.java | 40 -- .../rtm/MemoryConflictProvoker.java | 99 ----- .../testlibrary/rtm/NestedAbortProvoker.java | 60 --- .../testlibrary/rtm/RTMLockingStatistics.java | 226 ----------- .../compiler/testlibrary/rtm/RTMTestBase.java | 280 ------------- .../testlibrary/rtm/XAbortProvoker.java | 68 ---- .../testlibrary/rtm/libXAbortProvoker.c | 34 -- 99 files changed, 64 insertions(+), 6408 deletions(-) delete mode 100644 src/hotspot/share/runtime/rtmLocking.cpp delete mode 100644 src/hotspot/share/runtime/rtmLocking.hpp delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/RTMGenericCommandLineOptionTest.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/RTMLockingAwareTest.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestRTMAbortThresholdOption.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingThresholdOption.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestRTMRetryCountOption.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestRTMSpinLoopCountOption.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortRatio.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortThreshold.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingCalculationDelay.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingThreshold.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMRetryCount.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMSpinLoopCount.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestRTMTotalCountIncrRate.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMAfterLockInflation.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMDeopt.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForInflatedLocks.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForStackLocks.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMXendForLockBusy.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/method_options/TestNoRTMLockElidingOption.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/method_options/TestUseRTMLockElidingOption.java delete mode 100644 test/hotspot/jtreg/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/AbortProvoker.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/AbortType.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/BufferOverflowProvoker.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/BusyLock.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/CompilableTest.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/MemoryConflictProvoker.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/NestedAbortProvoker.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/RTMLockingStatistics.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/RTMTestBase.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/XAbortProvoker.java delete mode 100644 test/hotspot/jtreg/compiler/testlibrary/rtm/libXAbortProvoker.c diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp index bec63210df9c5..66a782ba9c622 100644 --- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp @@ -172,310 +172,6 @@ inline Assembler::AvxVectorLen C2_MacroAssembler::vector_length_encoding(int vle } } -#if INCLUDE_RTM_OPT - -// Update rtm_counters based on abort status -// input: abort_status -// rtm_counters (RTMLockingCounters*) -// flags are killed -void C2_MacroAssembler::rtm_counters_update(Register abort_status, Register rtm_counters) { - - atomic_incptr(Address(rtm_counters, RTMLockingCounters::abort_count_offset())); - if (PrintPreciseRTMLockingStatistics) { - for (int i = 0; i < RTMLockingCounters::ABORT_STATUS_LIMIT; i++) { - Label check_abort; - testl(abort_status, (1< 0) { - // Delay calculation - movptr(tmpReg, ExternalAddress((address) RTMLockingCounters::rtm_calculation_flag_addr())); - testptr(tmpReg, tmpReg); - jccb(Assembler::equal, L_done); - } - // Abort ratio calculation only if abort_count > RTMAbortThreshold - // Aborted transactions = abort_count * 100 - // All transactions = total_count * RTMTotalCountIncrRate - // Set no_rtm bit if (Aborted transactions >= All transactions * RTMAbortRatio) - - movptr(tmpReg, Address(rtm_counters_Reg, RTMLockingCounters::abort_count_offset())); - cmpptr(tmpReg, RTMAbortThreshold); - jccb(Assembler::below, L_check_always_rtm2); - imulptr(tmpReg, tmpReg, 100); - - Register scrReg = rtm_counters_Reg; - movptr(scrReg, Address(rtm_counters_Reg, RTMLockingCounters::total_count_offset())); - imulptr(scrReg, scrReg, RTMTotalCountIncrRate); - imulptr(scrReg, scrReg, RTMAbortRatio); - cmpptr(tmpReg, scrReg); - jccb(Assembler::below, L_check_always_rtm1); - if (method_data != nullptr) { - // set rtm_state to "no rtm" in MDO - mov_metadata(tmpReg, method_data); - lock(); - orl(Address(tmpReg, MethodData::rtm_state_offset()), NoRTM); - } - jmpb(L_done); - bind(L_check_always_rtm1); - // Reload RTMLockingCounters* address - lea(rtm_counters_Reg, ExternalAddress((address)rtm_counters)); - bind(L_check_always_rtm2); - movptr(tmpReg, Address(rtm_counters_Reg, RTMLockingCounters::total_count_offset())); - cmpptr(tmpReg, RTMLockingThreshold / RTMTotalCountIncrRate); - jccb(Assembler::below, L_done); - if (method_data != nullptr) { - // set rtm_state to "always rtm" in MDO - mov_metadata(tmpReg, method_data); - lock(); - orl(Address(tmpReg, MethodData::rtm_state_offset()), UseRTM); - } - bind(L_done); -} - -// Update counters and perform abort ratio calculation -// input: abort_status_Reg -// rtm_counters_Reg, flags are killed -void C2_MacroAssembler::rtm_profiling(Register abort_status_Reg, - Register rtm_counters_Reg, - RTMLockingCounters* rtm_counters, - Metadata* method_data, - bool profile_rtm) { - - assert(rtm_counters != nullptr, "should not be null when profiling RTM"); - // update rtm counters based on rax value at abort - // reads abort_status_Reg, updates flags - lea(rtm_counters_Reg, ExternalAddress((address)rtm_counters)); - rtm_counters_update(abort_status_Reg, rtm_counters_Reg); - if (profile_rtm) { - // Save abort status because abort_status_Reg is used by following code. - if (RTMRetryCount > 0) { - push(abort_status_Reg); - } - assert(rtm_counters != nullptr, "should not be null when profiling RTM"); - rtm_abort_ratio_calculation(abort_status_Reg, rtm_counters_Reg, rtm_counters, method_data); - // restore abort status - if (RTMRetryCount > 0) { - pop(abort_status_Reg); - } - } -} - -// Retry on abort if abort's status is 0x6: can retry (0x2) | memory conflict (0x4) -// inputs: retry_count_Reg -// : abort_status_Reg -// output: retry_count_Reg decremented by 1 -// flags are killed -void C2_MacroAssembler::rtm_retry_lock_on_abort(Register retry_count_Reg, Register abort_status_Reg, Label& retryLabel) { - Label doneRetry; - assert(abort_status_Reg == rax, ""); - // The abort reason bits are in eax (see all states in rtmLocking.hpp) - // 0x6 = conflict on which we can retry (0x2) | memory conflict (0x4) - // if reason is in 0x6 and retry count != 0 then retry - andptr(abort_status_Reg, 0x6); - jccb(Assembler::zero, doneRetry); - testl(retry_count_Reg, retry_count_Reg); - jccb(Assembler::zero, doneRetry); - pause(); - decrementl(retry_count_Reg); - jmp(retryLabel); - bind(doneRetry); -} - -// Spin and retry if lock is busy, -// inputs: box_Reg (monitor address) -// : retry_count_Reg -// output: retry_count_Reg decremented by 1 -// : clear z flag if retry count exceeded -// tmp_Reg, scr_Reg, flags are killed -void C2_MacroAssembler::rtm_retry_lock_on_busy(Register retry_count_Reg, Register box_Reg, - Register tmp_Reg, Register scr_Reg, Label& retryLabel) { - Label SpinLoop, SpinExit, doneRetry; - int owner_offset = OM_OFFSET_NO_MONITOR_VALUE_TAG(owner); - - testl(retry_count_Reg, retry_count_Reg); - jccb(Assembler::zero, doneRetry); - decrementl(retry_count_Reg); - movptr(scr_Reg, RTMSpinLoopCount); - - bind(SpinLoop); - pause(); - decrementl(scr_Reg); - jccb(Assembler::lessEqual, SpinExit); - movptr(tmp_Reg, Address(box_Reg, owner_offset)); - testptr(tmp_Reg, tmp_Reg); - jccb(Assembler::notZero, SpinLoop); - - bind(SpinExit); - jmp(retryLabel); - bind(doneRetry); - incrementl(retry_count_Reg); // clear z flag -} - -// Use RTM for normal stack locks -// Input: objReg (object to lock) -void C2_MacroAssembler::rtm_stack_locking(Register objReg, Register tmpReg, Register scrReg, - Register retry_on_abort_count_Reg, - RTMLockingCounters* stack_rtm_counters, - Metadata* method_data, bool profile_rtm, - Label& DONE_LABEL, Label& IsInflated) { - assert(UseRTMForStackLocks, "why call this otherwise?"); - assert(tmpReg == rax, ""); - assert(scrReg == rdx, ""); - Label L_rtm_retry, L_decrement_retry, L_on_abort; - - if (RTMRetryCount > 0) { - movl(retry_on_abort_count_Reg, RTMRetryCount); // Retry on abort - bind(L_rtm_retry); - } - movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes())); - testptr(tmpReg, markWord::monitor_value); // inflated vs stack-locked|neutral - jcc(Assembler::notZero, IsInflated); - - if (PrintPreciseRTMLockingStatistics || profile_rtm) { - Label L_noincrement; - if (RTMTotalCountIncrRate > 1) { - // tmpReg, scrReg and flags are killed - branch_on_random_using_rdtsc(tmpReg, scrReg, RTMTotalCountIncrRate, L_noincrement); - } - assert(stack_rtm_counters != nullptr, "should not be null when profiling RTM"); - atomic_incptr(ExternalAddress((address)stack_rtm_counters->total_count_addr()), scrReg); - bind(L_noincrement); - } - xbegin(L_on_abort); - movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes())); // fetch markword - andptr(tmpReg, markWord::lock_mask_in_place); // look at 2 lock bits - cmpptr(tmpReg, markWord::unlocked_value); // bits = 01 unlocked - jcc(Assembler::equal, DONE_LABEL); // all done if unlocked - - Register abort_status_Reg = tmpReg; // status of abort is stored in RAX - if (UseRTMXendForLockBusy) { - xend(); - movptr(abort_status_Reg, 0x2); // Set the abort status to 2 (so we can retry) - jmp(L_decrement_retry); - } - else { - xabort(0); - } - bind(L_on_abort); - if (PrintPreciseRTMLockingStatistics || profile_rtm) { - rtm_profiling(abort_status_Reg, scrReg, stack_rtm_counters, method_data, profile_rtm); - } - bind(L_decrement_retry); - if (RTMRetryCount > 0) { - // retry on lock abort if abort status is 'can retry' (0x2) or 'memory conflict' (0x4) - rtm_retry_lock_on_abort(retry_on_abort_count_Reg, abort_status_Reg, L_rtm_retry); - } -} - -// Use RTM for inflating locks -// inputs: objReg (object to lock) -// boxReg (on-stack box address (displaced header location) - KILLED) -// tmpReg (ObjectMonitor address + markWord::monitor_value) -void C2_MacroAssembler::rtm_inflated_locking(Register objReg, Register boxReg, Register tmpReg, - Register scrReg, Register retry_on_busy_count_Reg, - Register retry_on_abort_count_Reg, - RTMLockingCounters* rtm_counters, - Metadata* method_data, bool profile_rtm, - Label& DONE_LABEL) { - assert(UseRTMLocking, "why call this otherwise?"); - assert(tmpReg == rax, ""); - assert(scrReg == rdx, ""); - Label L_rtm_retry, L_decrement_retry, L_on_abort; - int owner_offset = OM_OFFSET_NO_MONITOR_VALUE_TAG(owner); - - movptr(Address(boxReg, 0), checked_cast(markWord::unused_mark().value())); - movptr(boxReg, tmpReg); // Save ObjectMonitor address - - if (RTMRetryCount > 0) { - movl(retry_on_busy_count_Reg, RTMRetryCount); // Retry on lock busy - movl(retry_on_abort_count_Reg, RTMRetryCount); // Retry on abort - bind(L_rtm_retry); - } - if (PrintPreciseRTMLockingStatistics || profile_rtm) { - Label L_noincrement; - if (RTMTotalCountIncrRate > 1) { - // tmpReg, scrReg and flags are killed - branch_on_random_using_rdtsc(tmpReg, scrReg, RTMTotalCountIncrRate, L_noincrement); - } - assert(rtm_counters != nullptr, "should not be null when profiling RTM"); - atomic_incptr(ExternalAddress((address)rtm_counters->total_count_addr()), scrReg); - bind(L_noincrement); - } - xbegin(L_on_abort); - movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes())); - movptr(tmpReg, Address(tmpReg, owner_offset)); - testptr(tmpReg, tmpReg); - jcc(Assembler::zero, DONE_LABEL); - if (UseRTMXendForLockBusy) { - xend(); - jmp(L_decrement_retry); - } - else { - xabort(0); - } - bind(L_on_abort); - Register abort_status_Reg = tmpReg; // status of abort is stored in RAX - if (PrintPreciseRTMLockingStatistics || profile_rtm) { - rtm_profiling(abort_status_Reg, scrReg, rtm_counters, method_data, profile_rtm); - } - if (RTMRetryCount > 0) { - // retry on lock abort if abort status is 'can retry' (0x2) or 'memory conflict' (0x4) - rtm_retry_lock_on_abort(retry_on_abort_count_Reg, abort_status_Reg, L_rtm_retry); - } - - movptr(tmpReg, Address(boxReg, owner_offset)) ; - testptr(tmpReg, tmpReg) ; - jccb(Assembler::notZero, L_decrement_retry) ; - - // Appears unlocked - try to swing _owner from null to non-null. - // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand. -#ifdef _LP64 - Register threadReg = r15_thread; -#else - get_thread(scrReg); - Register threadReg = scrReg; -#endif - lock(); - cmpxchgptr(threadReg, Address(boxReg, owner_offset)); // Updates tmpReg - - if (RTMRetryCount > 0) { - // success done else retry - jccb(Assembler::equal, DONE_LABEL) ; - bind(L_decrement_retry); - // Spin and retry if lock is busy. - rtm_retry_lock_on_busy(retry_on_busy_count_Reg, boxReg, tmpReg, scrReg, L_rtm_retry); - } - else { - bind(L_decrement_retry); - } -} - -#endif // INCLUDE_RTM_OPT - // fast_lock and fast_unlock used by C2 // Because the transitions from emitted code to the runtime @@ -554,21 +250,13 @@ void C2_MacroAssembler::rtm_inflated_locking(Register objReg, Register boxReg, R // scr: tmp -- KILLED void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmpReg, Register scrReg, Register cx1Reg, Register cx2Reg, Register thread, - RTMLockingCounters* rtm_counters, - RTMLockingCounters* stack_rtm_counters, - Metadata* method_data, - bool use_rtm, bool profile_rtm) { + Metadata* method_data) { assert(LockingMode != LM_LIGHTWEIGHT, "lightweight locking should use fast_lock_lightweight"); // Ensure the register assignments are disjoint assert(tmpReg == rax, ""); - - if (use_rtm) { - assert_different_registers(objReg, boxReg, tmpReg, scrReg, cx1Reg, cx2Reg); - } else { - assert(cx1Reg == noreg, ""); - assert(cx2Reg == noreg, ""); - assert_different_registers(objReg, boxReg, tmpReg, scrReg); - } + assert(cx1Reg == noreg, ""); + assert(cx2Reg == noreg, ""); + assert_different_registers(objReg, boxReg, tmpReg, scrReg); // Possible cases that we'll encounter in fast_lock // ------------------------------------------------ @@ -594,15 +282,6 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp jcc(Assembler::notZero, DONE_LABEL); } -#if INCLUDE_RTM_OPT - if (UseRTMForStackLocks && use_rtm) { - assert(LockingMode != LM_MONITOR, "LockingMode == 0 (LM_MONITOR) and +UseRTMForStackLocks are mutually exclusive"); - rtm_stack_locking(objReg, tmpReg, scrReg, cx2Reg, - stack_rtm_counters, method_data, profile_rtm, - DONE_LABEL, IsInflated); - } -#endif // INCLUDE_RTM_OPT - movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes())); // [FETCH] testptr(tmpReg, markWord::monitor_value); // inflated vs stack-locked|neutral jcc(Assembler::notZero, IsInflated); @@ -632,14 +311,6 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp bind(IsInflated); // The object is inflated. tmpReg contains pointer to ObjectMonitor* + markWord::monitor_value -#if INCLUDE_RTM_OPT - // Use the same RTM locking code in 32- and 64-bit VM. - if (use_rtm) { - rtm_inflated_locking(objReg, boxReg, tmpReg, scrReg, cx1Reg, cx2Reg, - rtm_counters, method_data, profile_rtm, DONE_LABEL); - } else { -#endif // INCLUDE_RTM_OPT - #ifndef _LP64 // The object is inflated. @@ -700,9 +371,6 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp incq(Address(scrReg, OM_OFFSET_NO_MONITOR_VALUE_TAG(recursions))); xorq(rax, rax); // Set ZF = 1 (success) for recursive lock, denoting locking success #endif // _LP64 -#if INCLUDE_RTM_OPT - } // use_rtm() -#endif bind(DONE_LABEL); // ZFlag == 1 count in fast path @@ -755,27 +423,13 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp // A perfectly viable alternative is to elide the owner check except when // Xcheck:jni is enabled. -void C2_MacroAssembler::fast_unlock(Register objReg, Register boxReg, Register tmpReg, bool use_rtm) { +void C2_MacroAssembler::fast_unlock(Register objReg, Register boxReg, Register tmpReg) { assert(LockingMode != LM_LIGHTWEIGHT, "lightweight locking should use fast_unlock_lightweight"); assert(boxReg == rax, ""); assert_different_registers(objReg, boxReg, tmpReg); Label DONE_LABEL, Stacked, COUNT, NO_COUNT; -#if INCLUDE_RTM_OPT - if (UseRTMForStackLocks && use_rtm) { - assert(LockingMode != LM_MONITOR, "LockingMode == 0 (LM_MONITOR) and +UseRTMForStackLocks are mutually exclusive"); - Label L_regular_unlock; - movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes())); // fetch markword - andptr(tmpReg, markWord::lock_mask_in_place); // look at 2 lock bits - cmpptr(tmpReg, markWord::unlocked_value); // bits = 01 unlocked - jccb(Assembler::notEqual, L_regular_unlock); // if !HLE RegularLock - xend(); // otherwise end... - jmp(DONE_LABEL); // ... and we're done - bind(L_regular_unlock); - } -#endif - if (LockingMode == LM_LEGACY) { cmpptr(Address(boxReg, 0), NULL_WORD); // Examine the displaced header jcc (Assembler::zero, COUNT); // 0 indicates recursive stack-lock @@ -788,19 +442,6 @@ void C2_MacroAssembler::fast_unlock(Register objReg, Register boxReg, Register t // It's inflated. -#if INCLUDE_RTM_OPT - if (use_rtm) { - Label L_regular_inflated_unlock; - int owner_offset = OM_OFFSET_NO_MONITOR_VALUE_TAG(owner); - movptr(boxReg, Address(tmpReg, owner_offset)); - testptr(boxReg, boxReg); - jccb(Assembler::notZero, L_regular_inflated_unlock); - xend(); - jmp(DONE_LABEL); - bind(L_regular_inflated_unlock); - } -#endif - // Despite our balanced locking property we still check that m->_owner == Self // as java routines or native JNI code called by this thread might // have released the lock. diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp index 676382225c241..e268ed3dd7a46 100644 --- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp +++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp @@ -37,39 +37,13 @@ // See full description in macroAssembler_x86.cpp. void fast_lock(Register obj, Register box, Register tmp, Register scr, Register cx1, Register cx2, Register thread, - RTMLockingCounters* rtm_counters, - RTMLockingCounters* stack_rtm_counters, - Metadata* method_data, - bool use_rtm, bool profile_rtm); - void fast_unlock(Register obj, Register box, Register tmp, bool use_rtm); + Metadata* method_data); + void fast_unlock(Register obj, Register box, Register tmp); void fast_lock_lightweight(Register obj, Register box, Register rax_reg, Register t, Register thread); void fast_unlock_lightweight(Register obj, Register reg_rax, Register t, Register thread); -#if INCLUDE_RTM_OPT - void rtm_counters_update(Register abort_status, Register rtm_counters); - void branch_on_random_using_rdtsc(Register tmp, Register scr, int count, Label& brLabel); - void rtm_abort_ratio_calculation(Register tmp, Register rtm_counters_reg, - RTMLockingCounters* rtm_counters, - Metadata* method_data); - void rtm_profiling(Register abort_status_Reg, Register rtm_counters_Reg, - RTMLockingCounters* rtm_counters, Metadata* method_data, bool profile_rtm); - void rtm_retry_lock_on_abort(Register retry_count, Register abort_status, Label& retryLabel); - void rtm_retry_lock_on_busy(Register retry_count, Register box, Register tmp, Register scr, Label& retryLabel); - void rtm_stack_locking(Register obj, Register tmp, Register scr, - Register retry_on_abort_count, - RTMLockingCounters* stack_rtm_counters, - Metadata* method_data, bool profile_rtm, - Label& DONE_LABEL, Label& IsInflated); - void rtm_inflated_locking(Register obj, Register box, Register tmp, - Register scr, Register retry_on_busy_count, - Register retry_on_abort_count, - RTMLockingCounters* rtm_counters, - Metadata* method_data, bool profile_rtm, - Label& DONE_LABEL); -#endif - // Generic instructions support for use in .ad files C2 code generation void vabsnegd(int opcode, XMMRegister dst, XMMRegister src); void vabsnegd(int opcode, XMMRegister dst, XMMRegister src, int vector_len); diff --git a/src/hotspot/cpu/x86/globalDefinitions_x86.hpp b/src/hotspot/cpu/x86/globalDefinitions_x86.hpp index 2e82453b38002..12ac26aff21ac 100644 --- a/src/hotspot/cpu/x86/globalDefinitions_x86.hpp +++ b/src/hotspot/cpu/x86/globalDefinitions_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,11 +52,6 @@ const bool CCallingConventionRequiresIntsAsLongs = false; #define DEFAULT_PADDING_SIZE DEFAULT_CACHE_LINE_SIZE #endif -#if defined(COMPILER2) -// Include Restricted Transactional Memory lock eliding optimization -#define INCLUDE_RTM_OPT 1 -#endif - #if defined(LINUX) || defined(__APPLE__) #define SUPPORT_RESERVED_STACK_AREA #endif diff --git a/src/hotspot/cpu/x86/globals_x86.hpp b/src/hotspot/cpu/x86/globals_x86.hpp index edcd9b58963a4..03fd26195c0ad 100644 --- a/src/hotspot/cpu/x86/globals_x86.hpp +++ b/src/hotspot/cpu/x86/globals_x86.hpp @@ -155,51 +155,6 @@ define_pd_global(intx, InitArrayShortSize, 8*BytesPerLong); product(bool, UseFastStosb, false, \ "Use fast-string operation for zeroing: rep stosb") \ \ - /* Use Restricted Transactional Memory for lock eliding */ \ - product(bool, UseRTMLocking, false, \ - "(Deprecated) Enable RTM lock eliding for inflated locks " \ - "in compiled code") \ - \ - product(bool, UseRTMForStackLocks, false, EXPERIMENTAL, \ - "Enable RTM lock eliding for stack locks in compiled code") \ - \ - product(bool, UseRTMDeopt, false, \ - "(Deprecated) Perform deopt and recompilation based on " \ - "RTM abort ratio") \ - \ - product(int, RTMRetryCount, 5, \ - "(Deprecated) Number of RTM retries on lock abort or busy") \ - range(0, max_jint) \ - \ - product(int, RTMSpinLoopCount, 100, EXPERIMENTAL, \ - "Spin count for lock to become free before RTM retry") \ - range(0, max_jint) \ - \ - product(int, RTMAbortThreshold, 1000, EXPERIMENTAL, \ - "Calculate abort ratio after this number of aborts") \ - range(0, max_jint) \ - \ - product(int, RTMLockingThreshold, 10000, EXPERIMENTAL, \ - "Lock count at which to do RTM lock eliding without " \ - "abort ratio calculation") \ - range(0, max_jint) \ - \ - product(int, RTMAbortRatio, 50, EXPERIMENTAL, \ - "Lock abort ratio at which to stop use RTM lock eliding") \ - range(0, 100) /* natural range */ \ - \ - product(int, RTMTotalCountIncrRate, 64, EXPERIMENTAL, \ - "Increment total RTM attempted lock count once every n times") \ - range(1, max_jint) \ - constraint(RTMTotalCountIncrRateConstraintFunc,AfterErgo) \ - \ - product(intx, RTMLockingCalculationDelay, 0, EXPERIMENTAL, \ - "Number of milliseconds to wait before start calculating aborts " \ - "for RTM locking") \ - \ - product(bool, UseRTMXendForLockBusy, true, EXPERIMENTAL, \ - "Use RTM Xend instead of Xabort when lock busy") \ - \ /* assembler */ \ product(bool, UseCountLeadingZerosInstruction, false, \ "Use count leading zeros instruction") \ diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.hpp b/src/hotspot/cpu/x86/macroAssembler_x86.hpp index fd989c7bd229d..492ea99e04536 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.hpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.hpp @@ -30,7 +30,6 @@ #include "code/vmreg.inline.hpp" #include "compiler/oopMap.hpp" #include "utilities/macros.hpp" -#include "runtime/rtmLocking.hpp" #include "runtime/vm_version.hpp" #include "utilities/checkedCast.hpp" diff --git a/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp b/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp index febc1b2c3b143..79a573763dcc1 100644 --- a/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp @@ -1476,13 +1476,6 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, // Frame is now completed as far as size and linkage. int frame_complete = ((intptr_t)__ pc()) - start; - if (UseRTMLocking) { - // Abort RTM transaction before calling JNI - // because critical section will be large and will be - // aborted anyway. Also nmethod could be deoptimized. - __ xabort(0); - } - // Calculate the difference between rsp and rbp,. We need to know it // after the native call because on windows Java Natives will pop // the arguments and it is painful to do rsp relative addressing @@ -2422,11 +2415,6 @@ void SharedRuntime::generate_uncommon_trap_blob() { address start = __ pc(); - if (UseRTMLocking) { - // Abort RTM transaction before possible nmethod deoptimization. - __ xabort(0); - } - // Push self-frame. __ subptr(rsp, return_off*wordSize); // Epilog! @@ -2609,13 +2597,6 @@ SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_t bool cause_return = (poll_type == POLL_AT_RETURN); bool save_vectors = (poll_type == POLL_AT_VECTOR_LOOP); - if (UseRTMLocking) { - // Abort RTM transaction before calling runtime - // because critical section will be large and will be - // aborted anyway. Also nmethod could be deoptimized. - __ xabort(0); - } - // If cause_return is true we are at a poll_return and there is // the return address on the stack to the caller on the nmethod // that is safepoint. We can leave this return on the stack and diff --git a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp index 31bbfb747f8a6..ac7baeaf74ff5 100644 --- a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp @@ -1959,13 +1959,6 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, // Frame is now completed as far as size and linkage. int frame_complete = ((intptr_t)__ pc()) - start; - if (UseRTMLocking) { - // Abort RTM transaction before calling JNI - // because critical section will be large and will be - // aborted anyway. Also nmethod could be deoptimized. - __ xabort(0); - } - #ifdef ASSERT __ check_stack_alignment(rsp, "improperly aligned stack"); #endif /* ASSERT */ @@ -2921,11 +2914,6 @@ void SharedRuntime::generate_uncommon_trap_blob() { address start = __ pc(); - if (UseRTMLocking) { - // Abort RTM transaction before possible nmethod deoptimization. - __ xabort(0); - } - // Push self-frame. We get here with a return address on the // stack, so rsp is 8-byte aligned until we allocate our frame. __ subptr(rsp, SimpleRuntimeFrame::return_off << LogBytesPerInt); // Epilog! @@ -3112,13 +3100,6 @@ SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_t bool cause_return = (poll_type == POLL_AT_RETURN); bool save_wide_vectors = (poll_type == POLL_AT_VECTOR_LOOP); - if (UseRTMLocking) { - // Abort RTM transaction before calling runtime - // because critical section will be large and will be - // aborted anyway. Also nmethod could be deoptimized. - __ xabort(0); - } - // Make room for return address (or push it again) if (!cause_return) { __ push(rbx); diff --git a/src/hotspot/cpu/x86/vm_version_x86.cpp b/src/hotspot/cpu/x86/vm_version_x86.cpp index cdefa3922be1a..103a7726276c7 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.cpp +++ b/src/hotspot/cpu/x86/vm_version_x86.cpp @@ -1322,55 +1322,6 @@ void VM_Version::get_processor_features() { FLAG_SET_DEFAULT(UseSHA, false); } - if (!supports_rtm() && UseRTMLocking) { - vm_exit_during_initialization("RTM instructions are not available on this CPU"); - } - -#if INCLUDE_RTM_OPT - if (UseRTMLocking) { - if (!CompilerConfig::is_c2_enabled()) { - // Only C2 does RTM locking optimization. - vm_exit_during_initialization("RTM locking optimization is not supported in this VM"); - } - if (is_intel_family_core()) { - if ((_model == CPU_MODEL_HASWELL_E3) || - (_model == CPU_MODEL_HASWELL_E7 && _stepping < 3) || - (_model == CPU_MODEL_BROADWELL && _stepping < 4)) { - // currently a collision between SKL and HSW_E3 - if (!UnlockExperimentalVMOptions && UseAVX < 3) { - vm_exit_during_initialization("UseRTMLocking is only available as experimental option on this " - "platform. It must be enabled via -XX:+UnlockExperimentalVMOptions flag."); - } else { - warning("UseRTMLocking is only available as experimental option on this platform."); - } - } - } - if (!FLAG_IS_CMDLINE(UseRTMLocking)) { - // RTM locking should be used only for applications with - // high lock contention. For now we do not use it by default. - vm_exit_during_initialization("UseRTMLocking flag should be only set on command line"); - } - } else { // !UseRTMLocking - if (UseRTMForStackLocks) { - if (!FLAG_IS_DEFAULT(UseRTMForStackLocks)) { - warning("UseRTMForStackLocks flag should be off when UseRTMLocking flag is off"); - } - FLAG_SET_DEFAULT(UseRTMForStackLocks, false); - } - if (UseRTMDeopt) { - FLAG_SET_DEFAULT(UseRTMDeopt, false); - } - if (PrintPreciseRTMLockingStatistics) { - FLAG_SET_DEFAULT(PrintPreciseRTMLockingStatistics, false); - } - } -#else - if (UseRTMLocking) { - // Only C2 does RTM locking optimization. - vm_exit_during_initialization("RTM locking optimization is not supported in this VM"); - } -#endif - #ifdef COMPILER2 if (UseFPUForSpilling) { if (UseSSE < 2) { diff --git a/src/hotspot/cpu/x86/x86_32.ad b/src/hotspot/cpu/x86/x86_32.ad index 240e9b10323bd..49a3cad37df2f 100644 --- a/src/hotspot/cpu/x86/x86_32.ad +++ b/src/hotspot/cpu/x86/x86_32.ad @@ -13613,25 +13613,8 @@ instruct RethrowException() // inlined locking and unlocking -instruct cmpFastLockRTM(eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eDXRegI scr, rRegI cx1, rRegI cx2, eRegP thread) %{ - predicate(Compile::current()->use_rtm()); - match(Set cr (FastLock object box)); - effect(TEMP tmp, TEMP scr, TEMP cx1, TEMP cx2, USE_KILL box, TEMP thread); - ins_cost(300); - format %{ "FASTLOCK $object,$box\t! kills $box,$tmp,$scr,$cx1,$cx2" %} - ins_encode %{ - __ get_thread($thread$$Register); - __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, - $scr$$Register, $cx1$$Register, $cx2$$Register, $thread$$Register, - _rtm_counters, _stack_rtm_counters, - ((Method*)(ra_->C->method()->constant_encoding()))->method_data(), - true, ra_->C->profile_rtm()); - %} - ins_pipe(pipe_slow); -%} - instruct cmpFastLock(eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eRegP scr, eRegP thread) %{ - predicate(LockingMode != LM_LIGHTWEIGHT && !Compile::current()->use_rtm()); + predicate(LockingMode != LM_LIGHTWEIGHT); match(Set cr (FastLock object box)); effect(TEMP tmp, TEMP scr, USE_KILL box, TEMP thread); ins_cost(300); @@ -13639,7 +13622,7 @@ instruct cmpFastLock(eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eRegP ins_encode %{ __ get_thread($thread$$Register); __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, - $scr$$Register, noreg, noreg, $thread$$Register, nullptr, nullptr, nullptr, false, false); + $scr$$Register, noreg, noreg, $thread$$Register, nullptr); %} ins_pipe(pipe_slow); %} @@ -13651,7 +13634,7 @@ instruct cmpFastUnlock(eFlagsReg cr, eRegP object, eAXRegP box, eRegP tmp ) %{ ins_cost(300); format %{ "FASTUNLOCK $object,$box\t! kills $box,$tmp" %} ins_encode %{ - __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, ra_->C->use_rtm()); + __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register); %} ins_pipe(pipe_slow); %} diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad index f3ad721dfcb9d..34eb990340178 100644 --- a/src/hotspot/cpu/x86/x86_64.ad +++ b/src/hotspot/cpu/x86/x86_64.ad @@ -12260,31 +12260,15 @@ instruct jmpConUCF2_short(cmpOpUCF2 cop, rFlagsRegUCF cmp, label labl) %{ // ============================================================================ // inlined locking and unlocking -instruct cmpFastLockRTM(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI tmp, rdx_RegI scr, rRegI cx1, rRegI cx2) %{ - predicate(Compile::current()->use_rtm()); - match(Set cr (FastLock object box)); - effect(TEMP tmp, TEMP scr, TEMP cx1, TEMP cx2, USE_KILL box); - ins_cost(300); - format %{ "fastlock $object,$box\t! kills $box,$tmp,$scr,$cx1,$cx2" %} - ins_encode %{ - __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, - $scr$$Register, $cx1$$Register, $cx2$$Register, r15_thread, - _rtm_counters, _stack_rtm_counters, - ((Method*)(ra_->C->method()->constant_encoding()))->method_data(), - true, ra_->C->profile_rtm()); - %} - ins_pipe(pipe_slow); -%} - instruct cmpFastLock(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI tmp, rRegP scr) %{ - predicate(LockingMode != LM_LIGHTWEIGHT && !Compile::current()->use_rtm()); + predicate(LockingMode != LM_LIGHTWEIGHT); match(Set cr (FastLock object box)); effect(TEMP tmp, TEMP scr, USE_KILL box); ins_cost(300); format %{ "fastlock $object,$box\t! kills $box,$tmp,$scr" %} ins_encode %{ __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, - $scr$$Register, noreg, noreg, r15_thread, nullptr, nullptr, nullptr, false, false); + $scr$$Register, noreg, noreg, r15_thread, nullptr); %} ins_pipe(pipe_slow); %} @@ -12296,7 +12280,7 @@ instruct cmpFastUnlock(rFlagsReg cr, rRegP object, rax_RegP box, rRegP tmp) %{ ins_cost(300); format %{ "fastunlock $object,$box\t! kills $box,$tmp" %} ins_encode %{ - __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, ra_->C->use_rtm()); + __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register); %} ins_pipe(pipe_slow); %} diff --git a/src/hotspot/share/adlc/output_c.cpp b/src/hotspot/share/adlc/output_c.cpp index 77332b21c0112..804e8f1a4e6c3 100644 --- a/src/hotspot/share/adlc/output_c.cpp +++ b/src/hotspot/share/adlc/output_c.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1614,11 +1614,6 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) { fprintf(fp, " ((MachIfNode*)n%d)->_fcnt = _fcnt;\n", cnt); } - if (node->is_ideal_fastlock() && new_inst->is_ideal_fastlock()) { - fprintf(fp, " ((MachFastLockNode*)n%d)->_rtm_counters = _rtm_counters;\n", cnt); - fprintf(fp, " ((MachFastLockNode*)n%d)->_stack_rtm_counters = _stack_rtm_counters;\n", cnt); - } - // Fill in the bottom_type where requested if (node->captures_bottom_type(_globalNames) && new_inst->captures_bottom_type(_globalNames)) { @@ -4008,10 +4003,6 @@ void ArchDesc::buildMachNode(FILE *fp_cpp, InstructForm *inst, const char *inden if (inst->is_ideal_jump()) { fprintf(fp_cpp, "%s node->_probs = _leaf->as_Jump()->_probs;\n", indent); } - if( inst->is_ideal_fastlock() ) { - fprintf(fp_cpp, "%s node->_rtm_counters = _leaf->as_FastLock()->rtm_counters();\n", indent); - fprintf(fp_cpp, "%s node->_stack_rtm_counters = _leaf->as_FastLock()->stack_rtm_counters();\n", indent); - } } diff --git a/src/hotspot/share/ci/ciEnv.cpp b/src/hotspot/share/ci/ciEnv.cpp index 6d11a436f65d9..565300f43b4ff 100644 --- a/src/hotspot/share/ci/ciEnv.cpp +++ b/src/hotspot/share/ci/ciEnv.cpp @@ -1032,8 +1032,7 @@ void ciEnv::register_method(ciMethod* target, bool has_unsafe_access, bool has_wide_vectors, bool has_monitors, - int immediate_oops_patched, - RTMState rtm_state) { + int immediate_oops_patched) { VM_ENTRY_MARK; nmethod* nm = nullptr; { @@ -1090,14 +1089,6 @@ void ciEnv::register_method(ciMethod* target, // Check for {class loads, evolution, breakpoints, ...} during compilation validate_compile_task_dependencies(target); } -#if INCLUDE_RTM_OPT - if (!failing() && (rtm_state != NoRTM) && - (method()->method_data() != nullptr) && - (method()->method_data()->rtm_state() != rtm_state)) { - // Preemptive decompile if rtm state was changed. - record_failure("RTM state change invalidated rtm code"); - } -#endif if (failing()) { // While not a true deoptimization, it is a preemptive decompile. @@ -1134,9 +1125,6 @@ void ciEnv::register_method(ciMethod* target, nm->set_has_wide_vectors(has_wide_vectors); nm->set_has_monitors(has_monitors); assert(!method->is_synchronized() || nm->has_monitors(), ""); -#if INCLUDE_RTM_OPT - nm->set_rtm_state(rtm_state); -#endif if (entry_bci == InvocationEntryBci) { if (TieredCompilation) { diff --git a/src/hotspot/share/ci/ciEnv.hpp b/src/hotspot/share/ci/ciEnv.hpp index 5d3a61f809e7c..be63632ba4eef 100644 --- a/src/hotspot/share/ci/ciEnv.hpp +++ b/src/hotspot/share/ci/ciEnv.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -383,8 +383,7 @@ class ciEnv : StackObj { bool has_unsafe_access, bool has_wide_vectors, bool has_monitors, - int immediate_oops_patched, - RTMState rtm_state = NoRTM); + int immediate_oops_patched); // Access to certain well known ciObjects. #define VM_CLASS_FUNC(name, ignore_s) \ diff --git a/src/hotspot/share/ci/ciMethodData.hpp b/src/hotspot/share/ci/ciMethodData.hpp index dedbfc9f4d68a..a43d011b77ea2 100644 --- a/src/hotspot/share/ci/ciMethodData.hpp +++ b/src/hotspot/share/ci/ciMethodData.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -479,17 +479,6 @@ class ciMethodData : public ciMetadata { int invocation_count() { return _invocation_counter; } -#if INCLUDE_RTM_OPT - // return cached value - int rtm_state() { - if (is_empty()) { - return NoRTM; - } else { - return get_MethodData()->rtm_state(); - } - } -#endif - // Transfer information about the method to MethodData*. // would_profile means we would like to profile this method, // meaning it's not trivial. diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index fab77fbbdb23f..bcfbae49fd992 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -1229,9 +1229,6 @@ void nmethod::init_defaults(CodeBuffer *code_buffer, CodeOffsets* offsets) { _oops_do_mark_link = nullptr; _compiled_ic_data = nullptr; -#if INCLUDE_RTM_OPT - _rtm_state = NoRTM; -#endif _is_unloading_state = 0; _state = not_installed; diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp index 9972b89ae4026..e3ac422ca7093 100644 --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -260,12 +260,6 @@ class nmethod : public CodeBlob { CompLevel _comp_level; // compilation level (s1) CompilerType _compiler_type; // which compiler made this nmethod (u1) -#if INCLUDE_RTM_OPT - // RTM state at compile time. Used during deoptimization to decide - // whether to restart collecting RTM locking abort statistic again. - RTMState _rtm_state; -#endif - // Local state used to keep track of whether unloading is happening or not volatile uint8_t _is_unloading_state; @@ -629,12 +623,6 @@ class nmethod : public CodeBlob { bool is_unloading(); void do_unloading(bool unloading_occurred); -#if INCLUDE_RTM_OPT - // rtm state accessing and manipulating - RTMState rtm_state() const { return _rtm_state; } - void set_rtm_state(RTMState state) { _rtm_state = state; } -#endif - bool make_in_use() { return try_transition(in_use); } diff --git a/src/hotspot/share/compiler/compilerDefinitions.hpp b/src/hotspot/share/compiler/compilerDefinitions.hpp index 9b69501a5986d..03b7d446b1ab3 100644 --- a/src/hotspot/share/compiler/compilerDefinitions.hpp +++ b/src/hotspot/share/compiler/compilerDefinitions.hpp @@ -98,23 +98,6 @@ inline bool is_compile(int comp_level) { return is_c1_compile(comp_level) || is_c2_compile(comp_level); } - -// States of Restricted Transactional Memory usage. -enum RTMState: u1 { - NoRTM = 0x2, // Don't use RTM - UseRTM = 0x1, // Use RTM - ProfileRTM = 0x0 // Use RTM with abort ratio calculation -}; - -#ifndef INCLUDE_RTM_OPT -#define INCLUDE_RTM_OPT 0 -#endif -#if INCLUDE_RTM_OPT -#define RTM_OPT_ONLY(code) code -#else -#define RTM_OPT_ONLY(code) -#endif - class CompilerConfig : public AllStatic { public: // Scale compile thresholds diff --git a/src/hotspot/share/compiler/compilerOracle.hpp b/src/hotspot/share/compiler/compilerOracle.hpp index 1a85e0629f93e..5864ca5dc0dd7 100644 --- a/src/hotspot/share/compiler/compilerOracle.hpp +++ b/src/hotspot/share/compiler/compilerOracle.hpp @@ -77,8 +77,6 @@ class methodHandle; option(CompileThresholdScaling, "CompileThresholdScaling", Double) \ option(ControlIntrinsic, "ControlIntrinsic", Ccstrlist) \ option(DisableIntrinsic, "DisableIntrinsic", Ccstrlist) \ - option(NoRTMLockEliding, "NoRTMLockEliding", Bool) \ - option(UseRTMLockEliding, "UseRTMLockEliding", Bool) \ option(BlockLayoutByFrequency, "BlockLayoutByFrequency", Bool) \ option(TraceOptoPipelining, "TraceOptoPipelining", Bool) \ option(TraceOptoOutput, "TraceOptoOutput", Bool) \ diff --git a/src/hotspot/share/oops/methodData.cpp b/src/hotspot/share/oops/methodData.cpp index 08dfc1fe95a36..af19d59f28123 100644 --- a/src/hotspot/share/oops/methodData.cpp +++ b/src/hotspot/share/oops/methodData.cpp @@ -1333,21 +1333,6 @@ void MethodData::init() { _failed_speculations = nullptr; #endif -#if INCLUDE_RTM_OPT - _rtm_state = NoRTM; // No RTM lock eliding by default - if (UseRTMLocking && - !CompilerOracle::has_option(mh, CompileCommandEnum::NoRTMLockEliding)) { - if (CompilerOracle::has_option(mh, CompileCommandEnum::UseRTMLockEliding) || !UseRTMDeopt) { - // Generate RTM lock eliding code without abort ratio calculation code. - _rtm_state = UseRTM; - } else if (UseRTMDeopt) { - // Generate RTM lock eliding code and include abort ratio calculation - // code if UseRTMDeopt is on. - _rtm_state = ProfileRTM; - } - } -#endif - // Initialize escape flags. clear_escape_info(); } diff --git a/src/hotspot/share/oops/methodData.hpp b/src/hotspot/share/oops/methodData.hpp index 4fa42eec960d7..b6e2a1c965212 100644 --- a/src/hotspot/share/oops/methodData.hpp +++ b/src/hotspot/share/oops/methodData.hpp @@ -2070,11 +2070,6 @@ class MethodData : public Metadata { int _invoke_mask; // per-method Tier0InvokeNotifyFreqLog int _backedge_mask; // per-method Tier0BackedgeNotifyFreqLog -#if INCLUDE_RTM_OPT - // State of RTM code generation during compilation of the method - int _rtm_state; -#endif - // Number of loops and blocks is computed when compiling the first // time with C1. It is used to determine if method is trivial. short _num_loops; @@ -2270,22 +2265,6 @@ class MethodData : public Metadata { } #endif -#if INCLUDE_RTM_OPT - int rtm_state() const { - return _rtm_state; - } - void set_rtm_state(RTMState rstate) { - _rtm_state = (int)rstate; - } - void atomic_set_rtm_state(RTMState rstate) { - Atomic::store(&_rtm_state, (int)rstate); - } - - static ByteSize rtm_state_offset() { - return byte_offset_of(MethodData, _rtm_state); - } -#endif - void set_would_profile(bool p) { _would_profile = p ? profile : no_profile; } bool would_profile() const { return _would_profile != no_profile; } diff --git a/src/hotspot/share/opto/c2_globals.hpp b/src/hotspot/share/opto/c2_globals.hpp index f2445e4f13688..7288533cd33e7 100644 --- a/src/hotspot/share/opto/c2_globals.hpp +++ b/src/hotspot/share/opto/c2_globals.hpp @@ -457,9 +457,6 @@ develop(bool, PrintLockStatistics, false, \ "Print precise statistics on the dynamic lock usage") \ \ - product(bool, PrintPreciseRTMLockingStatistics, false, DIAGNOSTIC, \ - "Print per-lock-site statistics of rtm locking in JVM") \ - \ develop(bool, PrintEliminateLocks, false, \ "Print out when locks are eliminated") \ \ diff --git a/src/hotspot/share/opto/classes.hpp b/src/hotspot/share/opto/classes.hpp index db6cb817d77f6..7908f21de10ba 100644 --- a/src/hotspot/share/opto/classes.hpp +++ b/src/hotspot/share/opto/classes.hpp @@ -269,7 +269,6 @@ macro(Opaque1) macro(OpaqueLoopInit) macro(OpaqueLoopStride) macro(OpaqueZeroTripGuard) -macro(Opaque3) macro(Opaque4) macro(OpaqueInitializedAssertionPredicate) macro(ProfileBoolean) diff --git a/src/hotspot/share/opto/compile.cpp b/src/hotspot/share/opto/compile.cpp index 25c7ced8aebfe..3687bc70efdc4 100644 --- a/src/hotspot/share/opto/compile.cpp +++ b/src/hotspot/share/opto/compile.cpp @@ -713,10 +713,9 @@ Compile::Compile( ciEnv* ci_env, ciMethod* target, int osr_bci, set_print_intrinsics(directive->PrintIntrinsicsOption); set_has_irreducible_loop(true); // conservative until build_loop_tree() reset it - if (ProfileTraps RTM_OPT_ONLY( || UseRTMLocking )) { + if (ProfileTraps) { // Make sure the method being compiled gets its own MDO, // so we can at least track the decompile_count(). - // Need MDO to record RTM code generation state. method()->ensure_method_data(); } @@ -1075,25 +1074,8 @@ void Compile::Init(bool aliasing) { set_use_cmove(UseCMoveUnconditionally /* || do_vector_loop()*/); //TODO: consider do_vector_loop() mandate use_cmove unconditionally NOT_PRODUCT(if (use_cmove() && Verbose && has_method()) {tty->print("Compile::Init: use CMove without profitability tests for method %s\n", method()->name()->as_quoted_ascii());}) - set_rtm_state(NoRTM); // No RTM lock eliding by default _max_node_limit = _directive->MaxNodeLimitOption; -#if INCLUDE_RTM_OPT - if (UseRTMLocking && has_method() && (method()->method_data_or_null() != nullptr)) { - int rtm_state = method()->method_data()->rtm_state(); - if (method_has_option(CompileCommandEnum::NoRTMLockEliding) || ((rtm_state & NoRTM) != 0)) { - // Don't generate RTM lock eliding code. - set_rtm_state(NoRTM); - } else if (method_has_option(CompileCommandEnum::UseRTMLockEliding) || ((rtm_state & UseRTM) != 0) || !UseRTMDeopt) { - // Generate RTM lock eliding code without abort ratio calculation code. - set_rtm_state(UseRTM); - } else if (UseRTMDeopt) { - // Generate RTM lock eliding code and include abort ratio calculation - // code if UseRTMDeopt is on. - set_rtm_state(ProfileRTM); - } - } -#endif if (VM_Version::supports_fast_class_init_checks() && has_method() && !is_osr_compilation() && method()->needs_clinit_barrier()) { set_clinit_barrier_on_entry(true); } @@ -3222,7 +3204,6 @@ void Compile::final_graph_reshaping_main_switch(Node* n, Final_Reshape_Counts& f frc.inc_double_count(); break; case Op_Opaque1: // Remove Opaque Nodes before matching - case Op_Opaque3: n->subsume_by(n->in(1), this); break; case Op_CallStaticJava: diff --git a/src/hotspot/share/opto/compile.hpp b/src/hotspot/share/opto/compile.hpp index e1d9b61f7f8d1..7c998d59d37fc 100644 --- a/src/hotspot/share/opto/compile.hpp +++ b/src/hotspot/share/opto/compile.hpp @@ -355,7 +355,6 @@ class Compile : public Phase { bool _has_method_handle_invokes; // True if this method has MethodHandle invokes. bool _has_monitors; // Metadata transfered to nmethod to enable Continuations lock-detection fastpath bool _clinit_barrier_on_entry; // True if clinit barrier is needed on nmethod entry - RTMState _rtm_state; // State of Restricted Transactional Memory usage int _loop_opts_cnt; // loop opts round uint _stress_seed; // Seed for stress testing @@ -667,10 +666,6 @@ class Compile : public Phase { void set_print_inlining(bool z) { _print_inlining = z; } bool print_intrinsics() const { return _print_intrinsics; } void set_print_intrinsics(bool z) { _print_intrinsics = z; } - RTMState rtm_state() const { return _rtm_state; } - void set_rtm_state(RTMState s) { _rtm_state = s; } - bool use_rtm() const { return (_rtm_state & NoRTM) == 0; } - bool profile_rtm() const { return _rtm_state == ProfileRTM; } uint max_node_limit() const { return (uint)_max_node_limit; } void set_max_node_limit(uint n) { _max_node_limit = n; } bool clinit_barrier_on_entry() { return _clinit_barrier_on_entry; } diff --git a/src/hotspot/share/opto/graphKit.cpp b/src/hotspot/share/opto/graphKit.cpp index 614a4123c0dbe..134d21e5bad18 100644 --- a/src/hotspot/share/opto/graphKit.cpp +++ b/src/hotspot/share/opto/graphKit.cpp @@ -3491,9 +3491,6 @@ FastLockNode* GraphKit::shared_lock(Node* obj) { FastLockNode * flock = _gvn.transform(new FastLockNode(0, obj, box) )->as_FastLock(); - // Create the rtm counters for this fast lock if needed. - flock->create_rtm_lock_counter(sync_jvms()); // sync_jvms used to get current bci - // Add monitor to debug info for the slow path. If we block inside the // slow path and de-opt, we need the monitor hanging around map()->push_monitor( flock ); diff --git a/src/hotspot/share/opto/locknode.cpp b/src/hotspot/share/opto/locknode.cpp index 17d26d620e5b0..917d9d2bada12 100644 --- a/src/hotspot/share/opto/locknode.cpp +++ b/src/hotspot/share/opto/locknode.cpp @@ -194,22 +194,6 @@ bool FastUnlockNode::cmp( const Node &n ) const { return (&n == this); // Always fail except on self } -void FastLockNode::create_rtm_lock_counter(JVMState* state) { -#if INCLUDE_RTM_OPT - Compile* C = Compile::current(); - if (C->profile_rtm() || (PrintPreciseRTMLockingStatistics && C->use_rtm())) { - RTMLockingNamedCounter* rlnc = (RTMLockingNamedCounter*) - OptoRuntime::new_named_counter(state, NamedCounter::RTMLockingCounter); - _rtm_counters = rlnc->counters(); - if (UseRTMForStackLocks) { - rlnc = (RTMLockingNamedCounter*) - OptoRuntime::new_named_counter(state, NamedCounter::RTMLockingCounter); - _stack_rtm_counters = rlnc->counters(); - } - } -#endif -} - //============================================================================= //------------------------------do_monitor_enter------------------------------- void Parse::do_monitor_enter() { diff --git a/src/hotspot/share/opto/locknode.hpp b/src/hotspot/share/opto/locknode.hpp index fcc8da0eb343e..0a7e4bd4905c7 100644 --- a/src/hotspot/share/opto/locknode.hpp +++ b/src/hotspot/share/opto/locknode.hpp @@ -29,8 +29,6 @@ #include "opto/opcodes.hpp" #include "opto/subnode.hpp" -class RTMLockingCounters; - //------------------------------BoxLockNode------------------------------------ class BoxLockNode : public Node { private: @@ -130,16 +128,10 @@ class BoxLockNode : public Node { //------------------------------FastLockNode----------------------------------- class FastLockNode: public CmpNode { -private: - RTMLockingCounters* _rtm_counters; // RTM lock counters for inflated locks - RTMLockingCounters* _stack_rtm_counters; // RTM lock counters for stack locks - public: FastLockNode(Node *ctrl, Node *oop, Node *box) : CmpNode(oop,box) { init_req(0,ctrl); init_class_id(Class_FastLock); - _rtm_counters = nullptr; - _stack_rtm_counters = nullptr; } Node* obj_node() const { return in(1); } Node* box_node() const { return in(2); } @@ -153,10 +145,6 @@ class FastLockNode: public CmpNode { virtual int Opcode() const; virtual const Type* Value(PhaseGVN* phase) const { return TypeInt::CC; } const Type *sub(const Type *t1, const Type *t2) const { return TypeInt::CC;} - - void create_rtm_lock_counter(JVMState* state); - RTMLockingCounters* rtm_counters() const { return _rtm_counters; } - RTMLockingCounters* stack_rtm_counters() const { return _stack_rtm_counters; } }; diff --git a/src/hotspot/share/opto/loopTransform.cpp b/src/hotspot/share/opto/loopTransform.cpp index b4faced574d09..a02690778a019 100644 --- a/src/hotspot/share/opto/loopTransform.cpp +++ b/src/hotspot/share/opto/loopTransform.cpp @@ -901,15 +901,6 @@ bool IdealLoopTree::policy_maximally_unroll(PhaseIdealLoop* phase) const { case Op_CountPositives: { return false; } -#if INCLUDE_RTM_OPT - case Op_FastLock: - case Op_FastUnlock: { - // Don't unroll RTM locking code because it is large. - if (UseRTMLocking) { - return false; - } - } -#endif } // switch } @@ -1074,15 +1065,6 @@ bool IdealLoopTree::policy_unroll(PhaseIdealLoop *phase) { // String intrinsics are large and have loops. return false; } -#if INCLUDE_RTM_OPT - case Op_FastLock: - case Op_FastUnlock: { - // Don't unroll RTM locking code because it is large. - if (UseRTMLocking) { - return false; - } - } -#endif } // switch } diff --git a/src/hotspot/share/opto/machnode.hpp b/src/hotspot/share/opto/machnode.hpp index 677e1bcd1d1a5..6dbaa8a13969a 100644 --- a/src/hotspot/share/opto/machnode.hpp +++ b/src/hotspot/share/opto/machnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,6 @@ class MachSpillCopyNode; class Matcher; class PhaseRegAlloc; class RegMask; -class RTMLockingCounters; class State; //---------------------------MachOper------------------------------------------ @@ -802,8 +801,6 @@ class MachGotoNode : public MachBranchNode { class MachFastLockNode : public MachNode { virtual uint size_of() const { return sizeof(*this); } // Size is bigger public: - RTMLockingCounters* _rtm_counters; // RTM lock counters for inflated locks - RTMLockingCounters* _stack_rtm_counters; // RTM lock counters for stack locks MachFastLockNode() : MachNode() {} }; diff --git a/src/hotspot/share/opto/macro.cpp b/src/hotspot/share/opto/macro.cpp index ce1a8a6113471..21dfacf9fe1ce 100644 --- a/src/hotspot/share/opto/macro.cpp +++ b/src/hotspot/share/opto/macro.cpp @@ -2428,7 +2428,6 @@ void PhaseMacroExpand::eliminate_macro_nodes() { break; default: assert(n->Opcode() == Op_LoopLimit || - n->Opcode() == Op_Opaque3 || n->is_Opaque4() || n->is_OpaqueInitializedAssertionPredicate() || n->Opcode() == Op_MaxL || @@ -2481,30 +2480,6 @@ bool PhaseMacroExpand::expand_macro_nodes() { } else if (n->is_Opaque1()) { _igvn.replace_node(n, n->in(1)); success = true; -#if INCLUDE_RTM_OPT - } else if ((n->Opcode() == Op_Opaque3) && ((Opaque3Node*)n)->rtm_opt()) { - assert(C->profile_rtm(), "should be used only in rtm deoptimization code"); - assert((n->outcnt() == 1) && n->unique_out()->is_Cmp(), ""); - Node* cmp = n->unique_out(); -#ifdef ASSERT - // Validate graph. - assert((cmp->outcnt() == 1) && cmp->unique_out()->is_Bool(), ""); - BoolNode* bol = cmp->unique_out()->as_Bool(); - assert((bol->outcnt() == 1) && bol->unique_out()->is_If() && - (bol->_test._test == BoolTest::ne), ""); - IfNode* ifn = bol->unique_out()->as_If(); - assert((ifn->outcnt() == 2) && - ifn->proj_out(1)->is_uncommon_trap_proj(Deoptimization::Reason_rtm_state_change) != nullptr, ""); -#endif - Node* repl = n->in(1); - if (!_has_locks) { - // Remove RTM state check if there are no locks in the code. - // Replace input to compare the same value. - repl = (cmp->in(1) == n) ? cmp->in(2) : cmp->in(1); - } - _igvn.replace_node(n, repl); - success = true; -#endif } else if (n->is_Opaque4()) { // With Opaque4 nodes, the expectation is that the test of input 1 // is always equal to the constant value of input 2. So we can diff --git a/src/hotspot/share/opto/opaquenode.cpp b/src/hotspot/share/opto/opaquenode.cpp index 0abc6f86ed022..14fd0d5f1a7a9 100644 --- a/src/hotspot/share/opto/opaquenode.cpp +++ b/src/hotspot/share/opto/opaquenode.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,16 +45,6 @@ Node* Opaque1Node::Identity(PhaseGVN* phase) { return this; } -// Do NOT remove the opaque node until no more loop opts can happen. -Node* Opaque3Node::Identity(PhaseGVN* phase) { - if (phase->C->post_loop_opts_phase()) { - return in(1); - } else { - phase->C->record_for_post_loop_opts_igvn(this); - } - return this; -} - #ifdef ASSERT CountedLoopNode* OpaqueZeroTripGuardNode::guarded_loop() const { Node* iff = if_node(); @@ -92,12 +82,6 @@ IfNode* OpaqueZeroTripGuardNode::if_node() const { return iff->as_If(); } -// Do not allow value-numbering -uint Opaque3Node::hash() const { return NO_HASH; } -bool Opaque3Node::cmp(const Node &n) const { - return (&n == this); // Always fail except on self -} - const Type* Opaque4Node::Value(PhaseGVN* phase) const { return phase->type(in(1)); } diff --git a/src/hotspot/share/opto/opaquenode.hpp b/src/hotspot/share/opto/opaquenode.hpp index 2337989e974f7..4617979c2e494 100644 --- a/src/hotspot/share/opto/opaquenode.hpp +++ b/src/hotspot/share/opto/opaquenode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,26 +91,6 @@ class OpaqueZeroTripGuardNode : public Opaque1Node { IfNode* if_node() const; }; -//------------------------------Opaque3Node------------------------------------ -// A node to prevent unwanted optimizations. Will be optimized only during -// macro nodes expansion. -class Opaque3Node : public Node { - int _opt; // what optimization it was used for - virtual uint hash() const; - virtual bool cmp(const Node &n) const; - public: - enum { RTM_OPT }; - Opaque3Node(Compile* C, Node* n, int opt) : Node(0, n), _opt(opt) { - // Put it on the Macro nodes list to removed during macro nodes expansion. - init_flags(Flag_is_macro); - C->add_macro_node(this); - } - virtual int Opcode() const; - virtual const Type* bottom_type() const { return TypeInt::INT; } - virtual Node* Identity(PhaseGVN* phase); - bool rtm_opt() const { return (_opt == RTM_OPT); } -}; - // Input 1 is a check that we know implicitly is always true or false // but the compiler has no way to prove. If during optimizations, that // check becomes true or false, the Opaque4 node is replaced by that diff --git a/src/hotspot/share/opto/output.cpp b/src/hotspot/share/opto/output.cpp index 0ad56184d4d12..d8a9b14c4ad44 100644 --- a/src/hotspot/share/opto/output.cpp +++ b/src/hotspot/share/opto/output.cpp @@ -3388,8 +3388,7 @@ void PhaseOutput::install() { C->entry_bci(), CompileBroker::compiler2(), C->has_unsafe_access(), - SharedRuntime::is_wide_vector(C->max_vector_size()), - C->rtm_state()); + SharedRuntime::is_wide_vector(C->max_vector_size())); } } @@ -3397,8 +3396,7 @@ void PhaseOutput::install_code(ciMethod* target, int entry_bci, AbstractCompiler* compiler, bool has_unsafe_access, - bool has_wide_vectors, - RTMState rtm_state) { + bool has_wide_vectors) { // Check if we want to skip execution of all compiled code. { #ifndef PRODUCT @@ -3436,8 +3434,7 @@ void PhaseOutput::install_code(ciMethod* target, has_unsafe_access, SharedRuntime::is_wide_vector(C->max_vector_size()), C->has_monitors(), - 0, - C->rtm_state()); + 0); if (C->log() != nullptr) { // Print code cache state into compiler log C->log()->code_cache_state(); diff --git a/src/hotspot/share/opto/output.hpp b/src/hotspot/share/opto/output.hpp index 1717955360256..9431ef3d5089f 100644 --- a/src/hotspot/share/opto/output.hpp +++ b/src/hotspot/share/opto/output.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -121,8 +121,7 @@ class PhaseOutput : public Phase { int entry_bci, AbstractCompiler* compiler, bool has_unsafe_access, - bool has_wide_vectors, - RTMState rtm_state); + bool has_wide_vectors); void install_stub(const char* stub_name); diff --git a/src/hotspot/share/opto/parse.hpp b/src/hotspot/share/opto/parse.hpp index d5f12c8bc8134..a55c9cb0cb12e 100644 --- a/src/hotspot/share/opto/parse.hpp +++ b/src/hotspot/share/opto/parse.hpp @@ -501,8 +501,6 @@ class Parse : public GraphKit { void clinit_deopt(); - void rtm_deopt(); - // Pass current map to exits void return_current(Node* value); diff --git a/src/hotspot/share/opto/parse1.cpp b/src/hotspot/share/opto/parse1.cpp index 80cb6721fceaa..4dc3ac3704231 100644 --- a/src/hotspot/share/opto/parse1.cpp +++ b/src/hotspot/share/opto/parse1.cpp @@ -597,12 +597,9 @@ Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses) // Add check to deoptimize the nmethod once the holder class is fully initialized clinit_deopt(); } - - // Add check to deoptimize the nmethod if RTM state was changed - rtm_deopt(); } - // Check for bailouts during method entry or RTM state check setup. + // Check for bailouts during method entry. if (failing()) { if (log) log->done("parse"); C->set_default_node_notes(caller_nn); @@ -2201,42 +2198,6 @@ void Parse::clinit_deopt() { guard_klass_being_initialized(holder); } -// Add check to deoptimize if RTM state is not ProfileRTM -void Parse::rtm_deopt() { -#if INCLUDE_RTM_OPT - if (C->profile_rtm()) { - assert(C->has_method(), "only for normal compilations"); - assert(!C->method()->method_data()->is_empty(), "MDO is needed to record RTM state"); - assert(depth() == 1, "generate check only for main compiled method"); - - // Set starting bci for uncommon trap. - set_parse_bci(is_osr_parse() ? osr_bci() : 0); - - // Load the rtm_state from the MethodData. - const TypePtr* adr_type = TypeMetadataPtr::make(C->method()->method_data()); - Node* mdo = makecon(adr_type); - int offset = in_bytes(MethodData::rtm_state_offset()); - Node* adr_node = basic_plus_adr(mdo, mdo, offset); - Node* rtm_state = make_load(control(), adr_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered); - - // Separate Load from Cmp by Opaque. - // In expand_macro_nodes() it will be replaced either - // with this load when there are locks in the code - // or with ProfileRTM (cmp->in(2)) otherwise so that - // the check will fold. - Node* profile_state = makecon(TypeInt::make(ProfileRTM)); - Node* opq = _gvn.transform( new Opaque3Node(C, rtm_state, Opaque3Node::RTM_OPT) ); - Node* chk = _gvn.transform( new CmpINode(opq, profile_state) ); - Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) ); - // Branch to failure if state was changed - { BuildCutout unless(this, tst, PROB_ALWAYS); - uncommon_trap(Deoptimization::Reason_rtm_state_change, - Deoptimization::Action_make_not_entrant); - } - } -#endif -} - //------------------------------return_current--------------------------------- // Append current _map to _exit_return void Parse::return_current(Node* value) { diff --git a/src/hotspot/share/opto/runtime.cpp b/src/hotspot/share/opto/runtime.cpp index a6f9a7e54703d..2953a1f7b726a 100644 --- a/src/hotspot/share/opto/runtime.cpp +++ b/src/hotspot/share/opto/runtime.cpp @@ -1856,14 +1856,6 @@ void OptoRuntime::print_named_counters() { eliminated_lock_count += count; } } -#if INCLUDE_RTM_OPT - } else if (c->tag() == NamedCounter::RTMLockingCounter) { - RTMLockingCounters* rlc = ((RTMLockingNamedCounter*)c)->counters(); - if (rlc->nonzero()) { - tty->print_cr("%s", c->name()); - rlc->print_on(tty); - } -#endif } c = c->next(); } @@ -1905,12 +1897,7 @@ NamedCounter* OptoRuntime::new_named_counter(JVMState* youngest_jvms, NamedCount st.print("@%d", bci); // To print linenumbers instead of bci use: m->line_number_from_bci(bci) } - NamedCounter* c; - if (tag == NamedCounter::RTMLockingCounter) { - c = new RTMLockingNamedCounter(st.freeze()); - } else { - c = new NamedCounter(st.freeze(), tag); - } + NamedCounter* c = new NamedCounter(st.freeze(), tag); // atomically add the new counter to the head of the list. We only // add counters so this is safe. diff --git a/src/hotspot/share/opto/runtime.hpp b/src/hotspot/share/opto/runtime.hpp index 9ca8ac0494339..6aadab9712243 100644 --- a/src/hotspot/share/opto/runtime.hpp +++ b/src/hotspot/share/opto/runtime.hpp @@ -29,7 +29,6 @@ #include "opto/machnode.hpp" #include "opto/optoreg.hpp" #include "opto/type.hpp" -#include "runtime/rtmLocking.hpp" #include "runtime/deoptimization.hpp" #include "runtime/vframe.hpp" @@ -61,8 +60,7 @@ class NamedCounter : public CHeapObj { enum CounterTag { NoTag, LockCounter, - EliminatedLockCounter, - RTMLockingCounter + EliminatedLockCounter }; private: @@ -98,17 +96,6 @@ class NamedCounter : public CHeapObj { }; -class RTMLockingNamedCounter : public NamedCounter { - private: - RTMLockingCounters _counters; - - public: - RTMLockingNamedCounter(const char *n) : - NamedCounter(n, RTMLockingCounter), _counters() {} - - RTMLockingCounters* counters() { return &_counters; } -}; - typedef const TypeFunc*(*TypeFunc_generator)(); class OptoRuntime : public AllStatic { diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 6c98f379db073..b80aa50534dca 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -507,11 +507,6 @@ static SpecialFlag const special_jvm_flags[] = { { "PreserveAllAnnotations", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "UseNotificationThread", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "UseEmptySlotsInSupers", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, -#if defined(X86) - { "UseRTMLocking", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, - { "UseRTMDeopt", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, - { "RTMRetryCount", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, -#endif // X86 // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, @@ -545,6 +540,11 @@ static SpecialFlag const special_jvm_flags[] = { { "ParallelOldDeadWoodLimiterStdDev", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, { "UseNeon", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, { "ScavengeBeforeFullGC", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, +#if defined(X86) + { "UseRTMLocking", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, + { "UseRTMDeopt", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, + { "RTMRetryCount", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, +#endif // X86 #ifdef ASSERT { "DummyObsoleteTestFlag", JDK_Version::undefined(), JDK_Version::jdk(18), JDK_Version::undefined() }, #endif @@ -1847,14 +1847,6 @@ bool Arguments::check_vm_args_consistency() { "LockingMode == 0 (LM_MONITOR) is not fully implemented on this architecture\n"); return false; } -#endif -#if defined(X86) && !defined(ZERO) - if (LockingMode == LM_MONITOR && UseRTMForStackLocks) { - jio_fprintf(defaultStream::error_stream(), - "LockingMode == 0 (LM_MONITOR) and -XX:+UseRTMForStackLocks are mutually exclusive\n"); - - return false; - } #endif if (VerifyHeavyMonitors && LockingMode != LM_MONITOR) { jio_fprintf(defaultStream::error_stream(), diff --git a/src/hotspot/share/runtime/deoptimization.cpp b/src/hotspot/share/runtime/deoptimization.cpp index 1748768844563..cf82ad7c0277a 100644 --- a/src/hotspot/share/runtime/deoptimization.cpp +++ b/src/hotspot/share/runtime/deoptimization.cpp @@ -2076,8 +2076,7 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* current, jint tr gather_statistics(reason, action, trap_bc); // Ensure that we can record deopt. history: - // Need MDO to record RTM code generation state. - bool create_if_missing = ProfileTraps RTM_OPT_ONLY( || UseRTMLocking ); + bool create_if_missing = ProfileTraps; methodHandle profiled_method; #if INCLUDE_JVMCI @@ -2425,16 +2424,6 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* current, jint tr pdata->set_trap_state(tstate1); } -#if INCLUDE_RTM_OPT - // Restart collecting RTM locking abort statistic if the method - // is recompiled for a reason other than RTM state change. - // Assume that in new recompiled code the statistic could be different, - // for example, due to different inlining. - if ((reason != Reason_rtm_state_change) && (trap_mdo != nullptr) && - UseRTMDeopt && (nm->rtm_state() != ProfileRTM)) { - trap_mdo->atomic_set_rtm_state(ProfileRTM); - } -#endif // For code aging we count traps separately here, using make_not_entrant() // as a guard against simultaneous deopts in multiple threads. if (reason == Reason_tenured && trap_mdo != nullptr) { @@ -2724,7 +2713,6 @@ const char* Deoptimization::_trap_reason_name[] = { "speculate_class_check", "speculate_null_check", "speculate_null_assert", - "rtm_state_change", "unstable_if", "unstable_fused_if", "receiver_constraint", diff --git a/src/hotspot/share/runtime/deoptimization.hpp b/src/hotspot/share/runtime/deoptimization.hpp index 61e85d19fd7c5..0a2bafb383085 100644 --- a/src/hotspot/share/runtime/deoptimization.hpp +++ b/src/hotspot/share/runtime/deoptimization.hpp @@ -113,7 +113,6 @@ class Deoptimization : AllStatic { Reason_speculate_class_check, // saw unexpected object class from type speculation Reason_speculate_null_check, // saw unexpected null from type speculation Reason_speculate_null_assert, // saw unexpected null from type speculation - Reason_rtm_state_change, // rtm state change detected Reason_unstable_if, // a branch predicted always false was taken Reason_unstable_fused_if, // fused two ifs that had each one untaken branch. One is now taken. Reason_receiver_constraint, // receiver subtype check failed diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp index 2cd7371909d1e..ad2e755e69868 100644 --- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp +++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp @@ -378,20 +378,6 @@ JVMFlag::Error NodeLimitFudgeFactorConstraintFunc(intx value, bool verbose) { } #endif // COMPILER2 -JVMFlag::Error RTMTotalCountIncrRateConstraintFunc(int value, bool verbose) { -#if INCLUDE_RTM_OPT - if (UseRTMLocking && !is_power_of_2(RTMTotalCountIncrRate)) { - JVMFlag::printError(verbose, - "RTMTotalCountIncrRate (%d) must be " - "a power of 2, resetting it to 64\n", - RTMTotalCountIncrRate); - FLAG_SET_DEFAULT(RTMTotalCountIncrRate, 64); - } -#endif - - return JVMFlag::SUCCESS; -} - #ifdef COMPILER2 JVMFlag::Error LoopStripMiningIterConstraintFunc(uintx value, bool verbose) { if (UseCountedLoopSafepoints && LoopStripMiningIter == 0) { diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.hpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.hpp index 60adf4903a328..cfca8ecf8eef7 100644 --- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.hpp +++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.hpp @@ -49,7 +49,6 @@ f(uint, TypeProfileLevelConstraintFunc) \ f(uint, VerifyIterativeGVNConstraintFunc) \ f(intx, InitArrayShortSizeConstraintFunc) \ - f(int , RTMTotalCountIncrRateConstraintFunc) \ f(ccstrlist, DisableIntrinsicConstraintFunc) \ f(ccstrlist, ControlIntrinsicConstraintFunc) \ COMPILER2_PRESENT( \ diff --git a/src/hotspot/share/runtime/java.cpp b/src/hotspot/share/runtime/java.cpp index d78e35c4e6812..5271bdcda0be6 100644 --- a/src/hotspot/share/runtime/java.cpp +++ b/src/hotspot/share/runtime/java.cpp @@ -265,7 +265,7 @@ void print_statistics() { #endif //COMPILER1 } - if (PrintLockStatistics || PrintPreciseRTMLockingStatistics) { + if (PrintLockStatistics) { OptoRuntime::print_named_counters(); } #ifdef ASSERT diff --git a/src/hotspot/share/runtime/rtmLocking.cpp b/src/hotspot/share/runtime/rtmLocking.cpp deleted file mode 100644 index c375288242379..0000000000000 --- a/src/hotspot/share/runtime/rtmLocking.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include "precompiled.hpp" -#include "compiler/compilerDefinitions.hpp" - -#if INCLUDE_RTM_OPT - -#include "memory/allocation.inline.hpp" -#include "runtime/task.hpp" -#include "runtime/rtmLocking.hpp" - - -// One-shot PeriodicTask subclass for enabling RTM locking -uintx RTMLockingCounters::_calculation_flag = 0; - -class RTMLockingCalculationTask : public PeriodicTask { - public: - RTMLockingCalculationTask(size_t interval_time) : PeriodicTask(interval_time){ } - - virtual void task() { - RTMLockingCounters::_calculation_flag = 1; - // Reclaim our storage and disenroll ourself - delete this; - } -}; - -void RTMLockingCounters::init() { - if (UseRTMLocking && RTMLockingCalculationDelay > 0) { - RTMLockingCalculationTask* task = new RTMLockingCalculationTask(RTMLockingCalculationDelay); - task->enroll(); - } else { - _calculation_flag = 1; - } -} - -const char* RTMLockingCounters::_abortX_desc[ABORT_STATUS_LIMIT] = { - "abort instruction ", - "may succeed on retry", - "thread conflict ", - "buffer overflow ", - "debug or trap hit ", - "maximum nested depth" -}; - -//------------------------------print_on------------------------------- -void RTMLockingCounters::print_on(outputStream* st) const { - tty->print_cr("# rtm locks total (estimated): " UINTX_FORMAT, _total_count * RTMTotalCountIncrRate); - tty->print_cr("# rtm lock aborts (total): " UINTX_FORMAT, _abort_count); - for (int i = 0; i < ABORT_STATUS_LIMIT; i++) { - tty->print_cr("# rtm lock aborts %d (%s): " UINTX_FORMAT, i, _abortX_desc[i], _abortX_count[i]); - } -} -void RTMLockingCounters::print() const { print_on(tty); } - -#endif diff --git a/src/hotspot/share/runtime/rtmLocking.hpp b/src/hotspot/share/runtime/rtmLocking.hpp deleted file mode 100644 index db9678b17b10d..0000000000000 --- a/src/hotspot/share/runtime/rtmLocking.hpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#ifndef SHARE_RUNTIME_RTMLOCKING_HPP -#define SHARE_RUNTIME_RTMLOCKING_HPP - -// Generate RTM (Restricted Transactional Memory) locking code for all inflated -// locks when "UseRTMLocking" option is on with normal locking mechanism as fall back -// handler. -// -// On abort/lock busy the lock will be retried a fixed number of times under RTM -// as specified by "RTMRetryCount" option. The locks which abort too often -// can be auto tuned or manually tuned. -// -// Auto-tuning can be done on an option like UseRTMDeopt and it will need abort -// ratio calculation for each lock. The abort ratio will be calculated after -// "RTMAbortThreshold" number of aborts is reached. The formulas are: -// -// Aborted transactions = abort_count * 100 -// All transactions = total_count * RTMTotalCountIncrRate -// -// Aborted transactions >= All transactions * RTMAbortRatio -// -// If "UseRTMDeopt" is on and the aborts ratio reaches "RTMAbortRatio" -// the method containing the lock will be deoptimized and recompiled with -// all locks as normal locks. If the abort ratio continues to remain low after -// "RTMLockingThreshold" locks are attempted, then the method will be deoptimized -// and recompiled with all locks as RTM locks without abort ratio calculation code. -// The abort ratio calculation can be delayed by specifying flag -// -XX:RTMLockingCalculationDelay in millisecond. -// -// For manual tuning the abort statistics for each lock needs to be provided -// to the user on some JVM option like "PrintPreciseRTMLockingStatistics". -// Based on the abort statistics users can create a .hotspot_compiler file -// or use -XX:CompileCommand=option,class::method,NoRTMLockEliding -// to specify for which methods to disable RTM locking. -// -// When UseRTMForStackLocks option is enabled along with UseRTMLocking option, -// the RTM locking code is generated for stack locks too. -// The retries, auto-tuning support and rtm locking statistics are all -// supported for stack locks just like inflated locks. - -// RTM locking counters -class RTMLockingCounters { - private: - uintx _total_count; // Total RTM locks count - uintx _abort_count; // Total aborts count - - public: - enum { ABORT_STATUS_LIMIT = 6 }; - // Counters per RTM Abort Status. Incremented with +PrintPreciseRTMLockingStatistics - // RTM uses the EAX register to communicate abort status to software. - // Following an RTM abort the EAX register has the following definition. - // - // EAX register bit position Meaning - // 0 Set if abort caused by XABORT instruction. - // 1 If set, the transaction may succeed on a retry. This bit is always clear if bit 0 is set. - // 2 Set if another logical processor conflicted with a memory address that was part of the transaction that aborted. - // 3 Set if an internal buffer overflowed. - // 4 Set if a debug breakpoint was hit. - // 5 Set if an abort occurred during execution of a nested transaction. - private: - uintx _abortX_count[ABORT_STATUS_LIMIT]; - static const char* _abortX_desc[ABORT_STATUS_LIMIT]; - - public: - static uintx _calculation_flag; - static uintx* rtm_calculation_flag_addr() { return &_calculation_flag; } - - static void init(); - - RTMLockingCounters() : _total_count(0), _abort_count(0) { - for (int i = 0; i < ABORT_STATUS_LIMIT; i++) { - _abortX_count[i] = 0; - } - } - - uintx* total_count_addr() { return &_total_count; } - - static int total_count_offset() { return (int)offset_of(RTMLockingCounters, _total_count); } - static int abort_count_offset() { return (int)offset_of(RTMLockingCounters, _abort_count); } - static int abortX_count_offset() { return (int)offset_of(RTMLockingCounters, _abortX_count[0]); } - - - bool nonzero() { return (_abort_count + _total_count) > 0; } - - void print_on(outputStream* st) const; - void print() const; -}; - -#endif // SHARE_RUNTIME_RTMLOCKING_HPP diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index 051c2901fa067..eb83dda1ff5ff 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -109,9 +109,6 @@ #ifdef COMPILER2 #include "opto/idealGraphPrinter.hpp" #endif -#if INCLUDE_RTM_OPT -#include "runtime/rtmLocking.hpp" -#endif #if INCLUDE_JFR #include "jfr/jfr.hpp" #endif @@ -802,10 +799,6 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { StatSampler::engage(); if (CheckJNICalls) JniPeriodicChecker::engage(); -#if INCLUDE_RTM_OPT - RTMLockingCounters::init(); -#endif - call_postVMInitHook(THREAD); // The Java side of PostVMInitHook.run must deal with all // exceptions and provide means of diagnosis. diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index 4381bb973bbec..8ff766af128b7 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -2259,7 +2259,6 @@ declare_constant(Deoptimization::Reason_speculate_class_check) \ declare_constant(Deoptimization::Reason_speculate_null_check) \ declare_constant(Deoptimization::Reason_speculate_null_assert) \ - declare_constant(Deoptimization::Reason_rtm_state_change) \ declare_constant(Deoptimization::Reason_unstable_if) \ declare_constant(Deoptimization::Reason_unstable_fused_if) \ declare_constant(Deoptimization::Reason_receiver_constraint) \ diff --git a/src/java.base/share/man/java.1 b/src/java.base/share/man/java.1 index 6cef707d19acd..05b1ec6cdd87c 100644 --- a/src/java.base/share/man/java.1 +++ b/src/java.base/share/man/java.1 @@ -36,7 +36,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JAVA" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JAVA" "1" "2024" "JDK 24" "JDK Commands" .hy .SH NAME .PP @@ -186,7 +186,7 @@ with new values added and old values removed. You\[aq]ll get an error message if you use a value of \f[I]N\f[R] that is no longer supported. The supported values of \f[I]N\f[R] are the current Java SE release -(\f[V]23\f[R]) and a limited number of previous releases, detailed in +(\f[V]24\f[R]) and a limited number of previous releases, detailed in the command-line help for \f[V]javac\f[R], under the \f[V]--source\f[R] and \f[V]--release\f[R] options. .RE @@ -1195,7 +1195,7 @@ or directories. \f[V]--source\f[R] \f[I]version\f[R] Sets the version of the source in source-file mode. .TP -\f[V]--sun-misc-unsafe-memory-acces=\f[R] \f[I]value\f[R] +\f[V]--sun-misc-unsafe-memory-access=\f[R] \f[I]value\f[R] Allow or deny usage of unsupported API \f[V]sun.misc.Unsafe\f[R]. \f[I]value\f[R] is one of: .RS @@ -3484,16 +3484,6 @@ By default, this option is disabled. Enables printing of information about adaptive-generation sizing. By default, this option is disabled. .TP -\f[V]-XX:+ScavengeBeforeFullGC\f[R] -Enables GC of the young generation before each full GC. -This option is enabled by default. -It is recommended that you \f[I]don\[aq]t\f[R] disable it, because -scavenging the young generation before a full GC can reduce the number -of objects reachable from the old generation space into the young -generation space. -To disable GC of the young generation before each full GC, specify the -option \f[V]-XX:-ScavengeBeforeFullGC\f[R]. -.TP \f[V]-XX:SoftRefLRUPolicyMSPerMB=\f[R]\f[I]time\f[R] Sets the amount of time (in milliseconds) a softly reachable object is kept active on the heap after the last time it was referenced. @@ -3786,6 +3776,28 @@ The default value is 2. .PP Use the option \f[V]-XX:MinRAMPercentage\f[R] instead. .RE +.SH OBSOLETE JAVA OPTIONS +.PP +These \f[V]java\f[R] options are still accepted but ignored, and a +warning is issued when they\[aq]re used. +.TP +\f[V]--illegal-access=\f[R]\f[I]parameter\f[R] +Controlled \f[I]relaxed strong encapsulation\f[R], as defined in +\f[B]JEP 261\f[R] +[https://openjdk.org/jeps/261#Relaxed-strong-encapsulation]. +This option was deprecated in JDK 16 by \f[B]JEP 396\f[R] +[https://openjdk.org/jeps/396] and made obsolete in JDK 17 by \f[B]JEP +403\f[R] [https://openjdk.org/jeps/403]. +.TP +\f[V]-XX:+ScavengeBeforeFullGC\f[R] +Enables GC of the young generation before each full GC. +This option is enabled by default. +It is recommended that you \f[I]don\[aq]t\f[R] disable it, because +scavenging the young generation before a full GC can reduce the number +of objects reachable from the old generation space into the young +generation space. +To disable GC of the young generation before each full GC, specify the +option \f[V]-XX:-ScavengeBeforeFullGC\f[R]. .TP \f[V]-XX:RTMAbortRatio=\f[R]\f[I]abort_ratio\f[R] Specifies the RTM abort ratio is specified as a percentage (%) of all @@ -3863,21 +3875,9 @@ As a result, the processors repeatedly invalidate the cache lines of other processors, which forces them to read from main memory instead of their cache. .RE -.SH OBSOLETE JAVA OPTIONS -.PP -These \f[V]java\f[R] options are still accepted but ignored, and a -warning is issued when they\[aq]re used. -.TP -\f[V]--illegal-access=\f[R]\f[I]parameter\f[R] -Controlled \f[I]relaxed strong encapsulation\f[R], as defined in -\f[B]JEP 261\f[R] -[https://openjdk.org/jeps/261#Relaxed-strong-encapsulation]. -This option was deprecated in JDK 16 by \f[B]JEP 396\f[R] -[https://openjdk.org/jeps/396] and made obsolete in JDK 17 by \f[B]JEP -403\f[R] [https://openjdk.org/jeps/403]. .SH REMOVED JAVA OPTIONS .PP -These \f[V]java\f[R] options have been removed in JDK 23 and using them +These \f[V]java\f[R] options have been removed in JDK 24 and using them results in an error of: .RS .PP diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 55fc22b4e759c..5da6ebaa6d573 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -51,18 +51,6 @@ compiler/cpuflags/TestAESIntrinsicsOnSupportedConfig.java 8190680 generic-all compiler/runtime/Test8168712.java 8211769,8211771 generic-ppc64,generic-ppc64le,linux-s390x compiler/loopopts/TestUnreachableInnerLoop.java 8288981 linux-s390x -compiler/rtm/locking/TestRTMAbortRatio.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestRTMAbortThreshold.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestRTMLockingCalculationDelay.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestRTMLockingThreshold.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestRTMSpinLoopCount.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestUseRTMDeopt.java 8183263 generic-x64,generic-i586 -compiler/rtm/locking/TestUseRTMXendForLockBusy.java 8183263 generic-x64,generic-i586 -compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java 8183263 generic-x64,generic-i586 - compiler/c2/Test8004741.java 8235801 generic-all compiler/c2/irTests/TestDuplicateBackedge.java 8318904 generic-all diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups index 78db6d017755b..ecded09f4cc0c 100644 --- a/test/hotspot/jtreg/TEST.groups +++ b/test/hotspot/jtreg/TEST.groups @@ -254,7 +254,6 @@ tier2_compiler = \ compiler/parsing/ \ compiler/rangechecks/ \ compiler/reflection/ \ - compiler/rtm/ \ compiler/runtime/Test6826736.java \ compiler/stable/ \ compiler/stringopts/ \ diff --git a/test/hotspot/jtreg/compiler/rtm/cli/RTMGenericCommandLineOptionTest.java b/test/hotspot/jtreg/compiler/rtm/cli/RTMGenericCommandLineOptionTest.java deleted file mode 100644 index ffe510a0f3246..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/RTMGenericCommandLineOptionTest.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.Platform; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.function.BooleanSupplier; - -/** - * Base for all RTM-related CLI tests. - */ -public abstract class RTMGenericCommandLineOptionTest { - - protected static final String RTM_INSTR_ERROR - = "RTM instructions are not available on this CPU"; - protected static final String RTM_UNSUPPORTED_VM_ERROR - = "RTM locking optimization is not supported in this VM"; - protected static final String RTM_FOR_STACK_LOCKS_WARNING - = "UseRTMForStackLocks flag should be off when UseRTMLocking " - + "flag is off"; - protected static final String RTM_COUNT_INCR_WARNING - = "must be a power of 2, resetting it to 64"; - - protected final String optionName; - protected final String errorMessage; - protected final String experimentalOptionError; - protected final boolean isExperimental; - protected final boolean isBoolean; - protected final String defaultValue; - protected final String[] optionValues; - - /** - * Constructs new genetic RTM CLI test, for option {@code optionName} which - * has default value {@code defaultValue}. Test cases will use option's - * values passed via {@code optionValues} for verification of correct - * option processing. - * - * Test constructed using this ctor will be started on any cpu regardless - * it's architecture and supported/unsupported features. - * - * @param optionName name of option to be tested - * @param isBoolean {@code true} if option is binary - * @param isExperimental {@code true} if option is experimental - * @param defaultValue default value of tested option - * @param optionValues different option values - */ - public RTMGenericCommandLineOptionTest( - String optionName, boolean isBoolean, boolean isExperimental, - String defaultValue, String... optionValues) { - this.optionName = optionName; - this.isExperimental = isExperimental; - this.isBoolean = isBoolean; - this.defaultValue = defaultValue; - this.optionValues = optionValues; - this.errorMessage = CommandLineOptionTest. - getUnrecognizedOptionErrorMessage(optionName); - this.experimentalOptionError = CommandLineOptionTest. - getExperimentalOptionErrorMessage(optionName); - } - - public void runTestCases() throws Throwable { - if (Platform.isX86() || Platform.isX64()) { - if (Platform.isServer()) { - runX86SupportedVMTestCases(); - } else { - runX86UnsupportedVMTestCases(); - } - } else { - runNonX86TestCases(); - } - } - - /** - * Runs test cases on X86 CPU if VM supports RTM locking. - * @throws Throwable - */ - protected void runX86SupportedVMTestCases() throws Throwable { - runGenericX86TestCases(); - } - - /** - * Runs test cases on X86 CPU if VM does not support RTM locking. - * @throws Throwable - */ - protected void runX86UnsupportedVMTestCases() throws Throwable { - runGenericX86TestCases(); - } - - /** - * Runs test cases on non-X86 CPU. - * @throws Throwable - */ - protected void runNonX86TestCases() throws Throwable { - CommandLineOptionTest.verifySameJVMStartup( - new String[] { errorMessage }, null, - String.format("Option '%s' should be unknown on non-X86CPUs.%n" - + "JVM startup should fail", optionName), "", ExitCode.FAIL, - prepareOptionValue(defaultValue)); - } - - /** - * Runs generic X86 test cases. - * @throws Throwable - */ - protected void runGenericX86TestCases() throws Throwable { - verifyJVMStartup(); - verifyOptionValues(); - } - - protected void verifyJVMStartup() throws Throwable { - String optionValue = prepareOptionValue(defaultValue); - String shouldFailMessage = String.format("VM option '%s' is " - + "experimental.%nVM startup expected to fail without " - + "-XX:+UnlockExperimentalVMOptions option", optionName); - String shouldPassMessage = String.format("VM option '%s' is " - + "experimental%nVM startup should pass with " - + "-XX:+UnlockExperimentalVMOptions option", optionName); - if (isExperimental) { - // verify that option is experimental - CommandLineOptionTest.verifySameJVMStartup( - new String[] { experimentalOptionError }, - new String[] { errorMessage }, shouldFailMessage, - shouldFailMessage, ExitCode.FAIL, optionValue); - // verify that it could be passed if experimental options - // are unlocked - CommandLineOptionTest.verifySameJVMStartup(null, - new String[] { - experimentalOptionError, - errorMessage - }, - shouldPassMessage, - "JVM should start without any warnings or errors", - ExitCode.OK, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - optionValue); - } else { - // verify that option could be passed - CommandLineOptionTest.verifySameJVMStartup(null, - new String[]{errorMessage}, - String.format("VM startup shuld pass with '%s' option", - optionName), - "JVM should start without any warnings or errors", - ExitCode.OK, optionValue); - } - } - - protected void verifyOptionValues() throws Throwable { - // verify default value - if (isExperimental) { - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - defaultValue, - String.format("Option '%s' is expected to have '%s' " - + "default value", optionName, defaultValue), - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); - } else { - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - defaultValue, - String.format("Option '%s' is expected to have '%s' " - + "default value", optionName, defaultValue)); - } - // verify other specified option values - if (optionValues == null) { - return; - } - - for (String value : optionValues) { - if (isExperimental) { - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - value, - String.format("Option '%s' is set to have '%s' value", - optionName, value), - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - prepareOptionValue(value)); - } else { - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - value, - String.format("Option '%s' is set to have '%s' value", - optionName, value), prepareOptionValue(value)); - } - } - } - - protected String prepareOptionValue(String value) { - if (isBoolean) { - return CommandLineOptionTest.prepareBooleanFlag(optionName, - Boolean.valueOf(value)); - } else { - return String.format("-XX:%s=%s", optionName, value); - } - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/RTMLockingAwareTest.java b/test/hotspot/jtreg/compiler/rtm/cli/RTMLockingAwareTest.java deleted file mode 100644 index 394d73e2283ec..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/RTMLockingAwareTest.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.LinkedList; -import java.util.List; - -/** - * Base for all RTM-related CLI tests on options whose processing depends - * on UseRTMLocking value. - * - * Since UseRTMLocking option could be used when both CPU and VM supports RTM - * locking, this test will be skipped on all unsupported configurations. - */ -public abstract class RTMLockingAwareTest - extends RTMGenericCommandLineOptionTest { - protected final String warningMessage; - protected final String[] correctValues; - protected final String[] incorrectValues; - /** - * Constructs new test for option {@code optionName} that should be executed - * only on CPU with RTM support. - * Test will be executed using set of correct values from - * {@code correctValues} and set of incorrect values from - * {@code incorrectValues}. - * - * @param optionName name of option to be tested - * @param isBoolean {@code true} if tested option is binary - * @param isExperimental {@code true} if tested option is experimental - * @param defaultValue default value of tested option - * @param correctValues array with correct values, that should not emit - * {@code warningMessage} to VM output - * @param incorrectValues array with incorrect values, that should emit - * {@code waningMessage} to VM output - * @param warningMessage warning message associated with tested option - */ - protected RTMLockingAwareTest(String optionName, boolean isBoolean, - boolean isExperimental, String defaultValue, - String[] correctValues, String[] incorrectValues, - String warningMessage) { - super(optionName, isBoolean, isExperimental, defaultValue); - this.correctValues = correctValues; - this.incorrectValues = incorrectValues; - this.warningMessage = warningMessage; - } - - @Override - protected void verifyJVMStartup() throws Throwable { - // Run generic sanity checks - super.verifyJVMStartup(); - // Verify how option values will be processed depending on - // UseRTMLocking value. - if (correctValues != null) { - for (String correctValue : correctValues) { - // For correct values it is expected to see no warnings - // regardless to UseRTMLocking - verifyStartupWarning(correctValue, true, false); - verifyStartupWarning(correctValue, false, false); - } - } - - if (incorrectValues != null) { - for (String incorrectValue : incorrectValues) { - // For incorrect values it is expected to see warning - // only with -XX:+UseRTMLocking - verifyStartupWarning(incorrectValue, true, true); - verifyStartupWarning(incorrectValue, false, false); - } - } - } - - @Override - protected void verifyOptionValues() throws Throwable { - super.verifyOptionValues(); - // Verify how option values will be setup after processing - // depending on UseRTMLocking value - if (correctValues != null) { - for (String correctValue : correctValues) { - // Correct value could be set up regardless to UseRTMLocking - verifyOptionValues(correctValue, false, correctValue); - verifyOptionValues(correctValue, true, correctValue); - } - } - - if (incorrectValues != null) { - for (String incorrectValue : incorrectValues) { - // With -XX:+UseRTMLocking, incorrect value will be changed to - // default value. - verifyOptionValues(incorrectValue, false, incorrectValue); - verifyOptionValues(incorrectValue, true, defaultValue); - } - } - } - - private void verifyStartupWarning(String value, boolean useRTMLocking, - boolean isWarningExpected) throws Throwable { - String warnings[] = new String[] { warningMessage }; - List options = new LinkedList<>(); - options.add(CommandLineOptionTest.prepareBooleanFlag("UseRTMLocking", - useRTMLocking)); - - if (isExperimental) { - options.add(CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); - } - options.add(prepareOptionValue(value)); - - String errorString = String.format("JVM should start with option '%s'" - + "'%nWarnings should be shown: %s", optionName, - isWarningExpected); - CommandLineOptionTest.verifySameJVMStartup( - (isWarningExpected ? warnings : null), - (isWarningExpected ? null : warnings), - errorString, errorString, ExitCode.OK, - options.toArray(new String[options.size()])); - } - - private void verifyOptionValues(String value, boolean useRTMLocking, - String expectedValue) throws Throwable { - List options = new LinkedList<>(); - options.add(CommandLineOptionTest.prepareBooleanFlag("UseRTMLocking", - useRTMLocking)); - - if (isExperimental) { - options.add(CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); - } - options.add(prepareOptionValue(value)); - - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - expectedValue, String.format("Option '%s' should have '%s' " - + "value if '%s' flag set", - optionName, expectedValue, prepareOptionValue(value)), - options.toArray(new String[options.size()])); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java b/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java deleted file mode 100644 index 8cf3149904776..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.Platform; -import jdk.test.lib.cli.CommandLineOptionTest; - -public abstract class TestPrintPreciseRTMLockingStatisticsBase - extends RTMGenericCommandLineOptionTest { - protected static final String DEFAULT_VALUE = "false"; - - protected TestPrintPreciseRTMLockingStatisticsBase() { - super("PrintPreciseRTMLockingStatistics", true, false, - TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE); - } - - @Override - protected void runNonX86TestCases() throws Throwable { - verifyJVMStartup(); - verifyOptionValues(); - } - - @Override - protected void verifyJVMStartup() throws Throwable { - if (Platform.isServer()) { - if (!Platform.isDebugBuild()) { - String shouldFailMessage = String.format("VM option '%s' is " - + "diagnostic%nJVM startup should fail without " - + "-XX:\\+UnlockDiagnosticVMOptions flag", optionName); - String shouldPassMessage = String.format("VM option '%s' is " - + "diagnostic%nJVM startup should pass with " - + "-XX:\\+UnlockDiagnosticVMOptions in debug build", - optionName); - String errorMessage = CommandLineOptionTest. - getDiagnosticOptionErrorMessage(optionName); - // verify that option is actually diagnostic - CommandLineOptionTest.verifySameJVMStartup( - new String[] { errorMessage }, null, shouldFailMessage, - shouldFailMessage, ExitCode.FAIL, - prepareOptionValue("true")); - - CommandLineOptionTest.verifySameJVMStartup(null, - new String[] { errorMessage }, shouldPassMessage, - shouldPassMessage + "without any warnings", ExitCode.OK, - CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, - prepareOptionValue("true")); - } else { - String shouldPassMessage = String.format("JVM startup should " - + "pass with '%s' option in debug build", - optionName); - CommandLineOptionTest.verifySameJVMStartup(null, null, - shouldPassMessage, shouldPassMessage, - ExitCode.OK, prepareOptionValue("true")); - } - } else { - String errorMessage = CommandLineOptionTest. - getUnrecognizedOptionErrorMessage(optionName); - String shouldFailMessage = String.format("JVM startup should fail" - + " with '%s' option in not debug build", optionName); - CommandLineOptionTest.verifySameJVMStartup( - new String[]{errorMessage}, null, shouldFailMessage, - shouldFailMessage, ExitCode.FAIL, - CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, - prepareOptionValue("true")); - } - } - - @Override - protected void verifyOptionValues() throws Throwable { - if (Platform.isServer()) { - // Verify default value - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE, - String.format("Option '%s' should have '%s' default value", - optionName, - TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE), - CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS); - } - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java deleted file mode 100644 index b4a71cd21b6d3..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify PrintPreciseRTMLockingStatistics on CPUs and OSs with - * rtm support and on VM with rtm locking support, - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig - */ - -package compiler.rtm.cli; - -import jdk.test.lib.cli.CommandLineOptionTest; - -public class TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig - extends TestPrintPreciseRTMLockingStatisticsBase { - - @Override - protected void verifyOptionValues() throws Throwable { - super.verifyOptionValues(); - // verify default value - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE, - String.format("Option '%s' should have '%s' default value on" - + " supported CPU", optionName, - TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE), - CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMLocking"); - - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE, - String.format("Option '%s' should have '%s' default value on" - + " supported CPU when -XX:-UseRTMLocking flag set", - optionName, - TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE), - CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:-UseRTMLocking", prepareOptionValue("true")); - - // verify that option could be turned on - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true", - String.format("Option '%s' should have 'true' value when set " - + "on supported CPU and -XX:+UseRTMLocking flag set", - optionName), - CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMLocking", prepareOptionValue("true")); - } - - public static void main(String args[]) throws Throwable { - new TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig() - .runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java deleted file mode 100644 index 274c335363743..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify PrintPreciseRTMLockingStatistics on CPUs or OSs without - * rtm support and/or unsupported VM. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires !vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig - */ - -package compiler.rtm.cli; - -public class TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig - extends TestPrintPreciseRTMLockingStatisticsBase { - - public static void main(String args[]) throws Throwable { - new TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig() - .runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMAbortThresholdOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMAbortThresholdOption.java deleted file mode 100644 index 54690fec69181..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMAbortThresholdOption.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify processing of RTMAbortThreshold option. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.compiler - * @run driver compiler.rtm.cli.TestRTMAbortThresholdOption - */ - -package compiler.rtm.cli; - -public class TestRTMAbortThresholdOption - extends RTMGenericCommandLineOptionTest { - private static final String DEFAULT_VALUE = "1000"; - - private TestRTMAbortThresholdOption() { - super("RTMAbortThreshold", false, true, - TestRTMAbortThresholdOption.DEFAULT_VALUE, - "0", "42", "100", "10000"); - } - - public static void main(String args[]) throws Throwable { - new TestRTMAbortThresholdOption().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java deleted file mode 100644 index bc6185f62b05c..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify processing of RTMLockingCalculationDelay option. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.compiler - * @run driver compiler.rtm.cli.TestRTMLockingCalculationDelayOption - */ - -package compiler.rtm.cli; - -public class TestRTMLockingCalculationDelayOption - extends RTMGenericCommandLineOptionTest { - private static final String DEFAULT_VALUE = "0"; - - private TestRTMLockingCalculationDelayOption() { - super("RTMLockingCalculationDelay", false, - true, TestRTMLockingCalculationDelayOption.DEFAULT_VALUE); - } - - public static void main(String agrs[]) throws Throwable { - new TestRTMLockingCalculationDelayOption().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingThresholdOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingThresholdOption.java deleted file mode 100644 index 0eb0cc24dc42c..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingThresholdOption.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify processing of RTMLockingThreshold option. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.compiler - * @run driver compiler.rtm.cli.TestRTMLockingThresholdOption - */ - -package compiler.rtm.cli; - -public class TestRTMLockingThresholdOption - extends RTMGenericCommandLineOptionTest { - private static final String DEFAULT_VALUE = "10000"; - - private TestRTMLockingThresholdOption() { - super("RTMLockingThreshold", false, true, - TestRTMLockingThresholdOption.DEFAULT_VALUE); - } - - public static void main(String args[]) throws Throwable { - new TestRTMLockingThresholdOption().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMRetryCountOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMRetryCountOption.java deleted file mode 100644 index 79e32af0e52e3..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMRetryCountOption.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify processing of RTMRetryCount option. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.compiler - * @run driver compiler.rtm.cli.TestRTMRetryCountOption - */ - -package compiler.rtm.cli; - -public class TestRTMRetryCountOption extends RTMGenericCommandLineOptionTest { - private static final String DEFAULT_VALUE = "5"; - - private TestRTMRetryCountOption() { - super("RTMRetryCount", false, false, - TestRTMRetryCountOption.DEFAULT_VALUE, - "0", "10", "100", "1000"); - } - - public static void main(String args[]) throws Throwable { - new TestRTMRetryCountOption().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMSpinLoopCountOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMSpinLoopCountOption.java deleted file mode 100644 index e138b3372ff6a..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMSpinLoopCountOption.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify processing of RTMSpinLoopCount option. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.compiler - * @run driver compiler.rtm.cli.TestRTMSpinLoopCountOption - */ - -package compiler.rtm.cli; - -public class TestRTMSpinLoopCountOption - extends RTMGenericCommandLineOptionTest { - private static final String DEFAULT_VALUE = "100"; - - private TestRTMSpinLoopCountOption() { - super("RTMSpinLoopCount", false, true, - TestRTMSpinLoopCountOption.DEFAULT_VALUE, - "0", "10", "42", "1000"); - } - - public static void main(String args[]) throws Throwable { - new TestRTMSpinLoopCountOption().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java deleted file mode 100644 index 929838dad060b..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify RTMTotalCountIncrRate option processing on CPU and OS with - * rtm support and on VM with rtm locking support. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestRTMTotalCountIncrRateOptionOnSupportedConfig - */ - -package compiler.rtm.cli; - -public class TestRTMTotalCountIncrRateOptionOnSupportedConfig - extends RTMLockingAwareTest { - private static final String DEFAULT_VALUE = "64"; - - private TestRTMTotalCountIncrRateOptionOnSupportedConfig() { - super("RTMTotalCountIncrRate", false, true, - TestRTMTotalCountIncrRateOptionOnSupportedConfig.DEFAULT_VALUE, - /* correct values */ - new String[] { "1", "2", "128", "1024" }, - /* incorrect values */ - new String[] { "3", "5", "7", "42" }, - RTMGenericCommandLineOptionTest.RTM_COUNT_INCR_WARNING); - } - - public static void main(String args[]) throws Throwable { - new TestRTMTotalCountIncrRateOptionOnSupportedConfig().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java deleted file mode 100644 index cc9f93165d029..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify UseRTMDeopt option processing on CPUs with rtm support - * when rtm locking is supported by VM. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestUseRTMDeoptOptionOnSupportedConfig - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.cli.CommandLineOptionTest; - -public class TestUseRTMDeoptOptionOnSupportedConfig { - private static final String DEFAULT_VALUE = "false"; - - public void runTestCases() throws Throwable { - String shouldPassMessage = " JVM should startup with option '" - + "-XX:+UseRTMDeopt' without any warnings"; - // verify that option could be turned on - CommandLineOptionTest.verifySameJVMStartup( - null, null, shouldPassMessage, shouldPassMessage, ExitCode.OK, - "-XX:+UseRTMDeopt"); - shouldPassMessage = " JVM should startup with option '" - + "-XX:-UseRTMDeopt' without any warnings"; - // verify that option could be turned off - CommandLineOptionTest.verifySameJVMStartup( - null, null, shouldPassMessage, shouldPassMessage, ExitCode.OK, - "-XX:-UseRTMDeopt"); - String defValMessage = String.format("UseRTMDeopt should have '%s'" - + "default value", - TestUseRTMDeoptOptionOnSupportedConfig.DEFAULT_VALUE); - // verify default value - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", - TestUseRTMDeoptOptionOnSupportedConfig.DEFAULT_VALUE, - defValMessage); - // verify default value - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", - TestUseRTMDeoptOptionOnSupportedConfig.DEFAULT_VALUE, - defValMessage, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMLocking"); - // verify that option is off when UseRTMLocking is off - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", - "false", "UseRTMDeopt should be off when UseRTMLocking is off", - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:-UseRTMLocking", "-XX:+UseRTMDeopt"); - // verify that option could be turned on - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", "true", - "UseRTMDeopt should be on when UseRTMLocking is on and " - + "'-XX:+UseRTMDeopt' flag set", - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMLocking", "-XX:+UseRTMDeopt"); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMDeoptOptionOnSupportedConfig().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java deleted file mode 100644 index b018e8d078f6f..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify UseRTMDeopt option processing on CPUs or OSs without rtm support - * or on VMs without rtm locking support. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires !vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestUseRTMDeoptOptionOnUnsupportedConfig - */ - -package compiler.rtm.cli; - -import jdk.test.lib.cli.CommandLineOptionTest; - -public class TestUseRTMDeoptOptionOnUnsupportedConfig - extends RTMGenericCommandLineOptionTest { - private static final String DEFAULT_VALUE = "false"; - - private TestUseRTMDeoptOptionOnUnsupportedConfig() { - super("UseRTMDeopt", true, false, - TestUseRTMDeoptOptionOnUnsupportedConfig.DEFAULT_VALUE, - "true"); - } - - @Override - protected void runX86SupportedVMTestCases() throws Throwable { - super.verifyJVMStartup(); - // verify default value - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - defaultValue, String.format("'%s' should have '%s' " - + "default value on unsupported configs.", - optionName, DEFAULT_VALUE)); - // verify that until RTMLocking is not used, value - // will be set to default false. - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - defaultValue, String.format("'%s' should be off on unsupported" - + " configs even if '-XX:+%s' flag set", optionName, - optionName), - "-XX:+UseRTMDeopt"); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMDeoptOptionOnUnsupportedConfig().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java deleted file mode 100644 index 37d8a6bcaaa48..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify UseRTMForStackLocks option processing on CPU and OS with - * rtm support when VM supports rtm locking. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestUseRTMForStackLocksOptionOnSupportedConfig - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.cli.CommandLineOptionTest; - -public class TestUseRTMForStackLocksOptionOnSupportedConfig { - private static final String DEFAULT_VALUE = "false"; - - public void runTestCases() throws Throwable { - String errorMessage - = CommandLineOptionTest.getExperimentalOptionErrorMessage( - "UseRTMForStackLocks"); - String warningMessage - = RTMGenericCommandLineOptionTest.RTM_FOR_STACK_LOCKS_WARNING; - - String shouldFailMessage = " VM option 'UseRTMForStackLocks' is " - + "experimental%nJVM startup should fail without " - + "-XX:+UnlockExperimentalVMOptions flag"; - - CommandLineOptionTest.verifySameJVMStartup( - new String[] { errorMessage }, null, shouldFailMessage, - shouldFailMessage + "%nError message expected", ExitCode.FAIL, - "-XX:+UseRTMForStackLocks"); - String shouldPassMessage = " VM option 'UseRTMForStackLocks'" - + " is experimental%nJVM startup should pass with " - + "-XX:+UnlockExperimentalVMOptions flag"; - // verify that we get a warning when trying to use rtm for stack - // lock, but not using rtm locking. - CommandLineOptionTest.verifySameJVMStartup( - new String[] { warningMessage }, null, shouldPassMessage, - "There should be warning when trying to use rtm for stack " - + "lock, but not using rtm locking", ExitCode.OK, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMForStackLocks", - "-XX:-UseRTMLocking"); - // verify that we don't get a warning when no using rtm for stack - // lock and not using rtm locking. - CommandLineOptionTest.verifySameJVMStartup(null, - new String[] { warningMessage }, shouldPassMessage, - "There should not be any warning when use both " - + "-XX:-UseRTMForStackLocks and -XX:-UseRTMLocking " - + "flags", - ExitCode.OK, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:-UseRTMForStackLocks", - "-XX:-UseRTMLocking"); - // verify that we don't get a warning when using rtm for stack - // lock and using rtm locking. - CommandLineOptionTest.verifySameJVMStartup(null, - new String[] { warningMessage }, shouldPassMessage, - "There should not be any warning when use both " - + "-XX:+UseRTMForStackLocks and -XX:+UseRTMLocking" - + " flags", - ExitCode.OK, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMForStackLocks", - "-XX:+UseRTMLocking"); - // verify that default value if false - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks", - TestUseRTMForStackLocksOptionOnSupportedConfig.DEFAULT_VALUE, - "Default value of option 'UseRTMForStackLocks' should be false", - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); - // verify that default value is false even with +UseRTMLocking - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks", - TestUseRTMForStackLocksOptionOnSupportedConfig.DEFAULT_VALUE, - "Default value of option 'UseRTMForStackLocks' should be false", - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMLocking"); - // verify that we can turn the option on - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks", - "true", "Value of option 'UseRTMForStackLocks' should " - + "be able to be set as 'true' when both " - + "-XX:+UseRTMForStackLocks and " - + "-XX:+UseRTMLocking flags used", - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMLocking", "-XX:+UseRTMForStackLocks"); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMForStackLocksOptionOnSupportedConfig().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java deleted file mode 100644 index 13159dbd8955e..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify UseRTMForStackLocks option processing on CPUs or OSs without - * rtm support and/or on VMs without rtm locking support. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires !vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestUseRTMForStackLocksOptionOnUnsupportedConfig - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.cli.CommandLineOptionTest; - -public class TestUseRTMForStackLocksOptionOnUnsupportedConfig - extends RTMGenericCommandLineOptionTest { - private static final String DEFAULT_VALUE = "false"; - - private TestUseRTMForStackLocksOptionOnUnsupportedConfig() { - super("UseRTMForStackLocks", true, true, - TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE, - "true"); - } - - @Override - protected void runX86SupportedVMTestCases() throws Throwable { - String shouldFailMessage = String.format("VM option '%s' is " - + "experimental%nJVM startup should fail without " - + "-XX:+UnlockExperimentalVMOptions flag", optionName); - - // verify that option is experimental - CommandLineOptionTest.verifySameJVMStartup( - new String[] { experimentalOptionError }, null, - shouldFailMessage, shouldFailMessage + "%nError message " - + "should be shown", ExitCode.FAIL, - prepareOptionValue("true")); - - CommandLineOptionTest.verifySameJVMStartup( - new String[]{ experimentalOptionError }, null, - shouldFailMessage, shouldFailMessage + "%nError message " - + "should be shown", ExitCode.FAIL, - prepareOptionValue("false")); - - String shouldPassMessage = String.format("VM option '%s' is " - + " experimental%nJVM startup should pass with " - + "-XX:+UnlockExperimentalVMOptions flag", optionName); - // verify that if we turn it on, then VM output will contain - // warning saying that this option could be turned on only - // when we use rtm locking - CommandLineOptionTest.verifySameJVMStartup( - new String[]{ - RTMGenericCommandLineOptionTest.RTM_FOR_STACK_LOCKS_WARNING - }, null, shouldPassMessage, "There should be warning when try " - + "to use rtm for stack lock, but not using rtm locking", - ExitCode.OK, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - prepareOptionValue("true") - ); - // verify that options is turned off by default - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE, - String.format("Default value of option '%s' should be '%s'", - optionName, DEFAULT_VALUE), - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); - // verify that it could not be turned on without rtm locking - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, - TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE, - String.format("Value of '%s' shouldn't able to be set to " - + "'true' without setting -XX:+UseRTMLocking flag", - optionName), - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - prepareOptionValue("true")); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMForStackLocksOptionOnUnsupportedConfig().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java deleted file mode 100644 index ff0a7623da0e5..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify UseRTMLocking option processing on CPU and OS with rtm support and - * on VM with rtm locking support. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestUseRTMLockingOptionOnSupportedConfig - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.cli.CommandLineOptionTest; - -public class TestUseRTMLockingOptionOnSupportedConfig { - private static final String DEFAULT_VALUE = "false"; - - public void runTestCases() throws Throwable { - String unrecongnizedOption - = CommandLineOptionTest.getUnrecognizedOptionErrorMessage( - "UseRTMLocking"); - String shouldPassMessage = "VM option 'UseRTMLocking' is experimental" - + "%nJVM startup should pass with " - + "-XX:+UnlockExperimentalVMOptions flag"; - // verify that there are no warning or error in VM output - CommandLineOptionTest.verifySameJVMStartup(null, - new String[]{ - RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR, - unrecongnizedOption - }, shouldPassMessage, "There should not be any warning when use" - + "with -XX:+UnlockExperimentalVMOptions", ExitCode.OK, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMLocking" - ); - - CommandLineOptionTest.verifySameJVMStartup(null, - new String[]{ - RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR, - unrecongnizedOption - }, shouldPassMessage, "There should not be any warning when use" - + "with -XX:+UnlockExperimentalVMOptions", ExitCode.OK, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:-UseRTMLocking" - ); - // verify that UseRTMLocking is of by default - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", - TestUseRTMLockingOptionOnSupportedConfig.DEFAULT_VALUE, - String.format("Default value of option 'UseRTMLocking' should " - + "be '%s'", DEFAULT_VALUE), - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); - // verify that we can change UseRTMLocking value - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", - TestUseRTMLockingOptionOnSupportedConfig.DEFAULT_VALUE, - String.format("Default value of option 'UseRTMLocking' should " - + "be '%s'", DEFAULT_VALUE), - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:-UseRTMLocking"); - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", - "true", "Value of 'UseRTMLocking' should be set " - + "to 'true' if -XX:+UseRTMLocking flag set", - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-XX:+UseRTMLocking"); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMLockingOptionOnSupportedConfig().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java deleted file mode 100644 index 973c5cccbd96a..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify UseRTMLocking option processing on CPUs without - * rtm support. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires !vm.rtm.cpu & vm.rtm.compiler - * @run driver compiler.rtm.cli.TestUseRTMLockingOptionOnUnsupportedCPU - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.Platform; -import jdk.test.lib.cli.CommandLineOptionTest; - -public class TestUseRTMLockingOptionOnUnsupportedCPU { - private static final String DEFAULT_VALUE = "false"; - - public void runTestCases() throws Throwable { - String unrecognizedOption - = CommandLineOptionTest.getUnrecognizedOptionErrorMessage( - "UseRTMLocking"); - String errorMessage = RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR; - - if (Platform.isX86() || Platform.isX64()) { - String shouldFailMessage = "JVM startup should fail with option " + - "-XX:+UseRTMLocking on unsupported CPU"; - - // verify that we get an error when use +UseRTMLocking - // on unsupported CPU - CommandLineOptionTest.verifySameJVMStartup( - new String[] { errorMessage }, - new String[] { unrecognizedOption }, shouldFailMessage, - shouldFailMessage + ". Error message should be shown.", - ExitCode.FAIL, "-XX:+UseRTMLocking"); - - String shouldPassMessage = "JVM startup should pass with option " - + "-XX:-UseRTMLocking even on unsupported CPU"; - // verify that we can pass -UseRTMLocking without - // getting any error messages - CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - errorMessage, unrecognizedOption }, shouldPassMessage, - shouldPassMessage + " without any warnings", ExitCode.OK, - "-XX:-UseRTMLocking"); - - // verify that UseRTMLocking is false by default - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", - TestUseRTMLockingOptionOnUnsupportedCPU.DEFAULT_VALUE, - String.format("Default value of option 'UseRTMLocking' " - +"should be '%s'", DEFAULT_VALUE)); - } else { - String shouldFailMessage = "RTMLocking should be unrecognized" - + " on non-x86 CPUs. JVM startup should fail." - + "Error message should be shown"; - // verify that on non-x86 CPUs RTMLocking could not be used - CommandLineOptionTest.verifySameJVMStartup( - new String[] { unrecognizedOption }, - null, shouldFailMessage, shouldFailMessage, - ExitCode.FAIL, "-XX:+UseRTMLocking"); - - CommandLineOptionTest.verifySameJVMStartup( - new String[] { unrecognizedOption }, - null, shouldFailMessage, shouldFailMessage, - ExitCode.FAIL, "-XX:-UseRTMLocking"); - } - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMLockingOptionOnUnsupportedCPU().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java deleted file mode 100644 index a26b8ffbad57c..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify UseRTMLocking option processing on CPU with rtm support - * in case when VM should not support this option. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.cpu & !(vm.flavor == "server" & !vm.emulatedClient) - * @run driver compiler.rtm.cli.TestUseRTMLockingOptionOnUnsupportedVM - */ - -package compiler.rtm.cli; - -import jdk.test.lib.process.ExitCode; -import jdk.test.lib.cli.CommandLineOptionTest; - -public class TestUseRTMLockingOptionOnUnsupportedVM { - private static final String DEFAULT_VALUE = "false"; - - public void runTestCases() throws Throwable { - String errorMessage - = RTMGenericCommandLineOptionTest.RTM_UNSUPPORTED_VM_ERROR; - String shouldFailMessage = "JVM startup should fail with option " - + "-XX:+UseRTMLocking even on unsupported VM. Error message" - + " should be shown"; - String shouldPassMessage = "JVM startup should pass with option " - + "-XX:-UseRTMLocking even on unsupported VM"; - // verify that we can't use +UseRTMLocking - CommandLineOptionTest.verifySameJVMStartup( - new String[] { errorMessage }, null, shouldFailMessage, - shouldFailMessage, ExitCode.FAIL, - "-XX:+UseRTMLocking"); - // verify that we can turn it off - CommandLineOptionTest.verifySameJVMStartup(null, - new String[] { errorMessage }, shouldPassMessage, - shouldPassMessage + " without any warnings", ExitCode.OK, - "-XX:-UseRTMLocking"); - // verify that it is off by default - CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", - TestUseRTMLockingOptionOnUnsupportedVM.DEFAULT_VALUE, - String.format("Default value of option 'UseRTMLocking' should" - + " be '%s'", DEFAULT_VALUE)); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMLockingOptionOnUnsupportedVM().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java deleted file mode 100644 index d38bf0a7f2ba7..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify processing of UseRTMXendForLockBusy option. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.flagless - * @requires vm.rtm.compiler - * @run driver compiler.rtm.cli.TestUseRTMXendForLockBusyOption - */ - -package compiler.rtm.cli; - -public class TestUseRTMXendForLockBusyOption - extends RTMGenericCommandLineOptionTest { - private static final String DEFAULT_VALUE = "true"; - - public TestUseRTMXendForLockBusyOption() { - super("UseRTMXendForLockBusy", true, true, - TestUseRTMXendForLockBusyOption.DEFAULT_VALUE, "true"); - } - - public static void main(String agrs[]) throws Throwable { - new TestUseRTMXendForLockBusyOption().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortRatio.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortRatio.java deleted file mode 100644 index 20713301da57b..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortRatio.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that RTMAbortRatio affects amount of aborts before - * deoptimization. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMAbortRatio - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.XAbortProvoker; -import compiler.testlibrary.rtm.CompilableTest; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that method will be deoptimized on high abort ratio - * as soon as abort ratio reaches RTMAbortRatio's value. - */ -public class TestRTMAbortRatio { - - protected void runTestCases() throws Throwable { - verifyAbortRatio(0, false); - verifyAbortRatio(10, false); - verifyAbortRatio(50, false); - verifyAbortRatio(100, false); - - verifyAbortRatio(0, true); - verifyAbortRatio(10, true); - verifyAbortRatio(50, true); - verifyAbortRatio(100, true); - } - - private void verifyAbortRatio(int abortRatio, boolean useStackLock) - throws Throwable { - CompilableTest test = new Test(); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - test, - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - "-XX:+UseRTMDeopt", - "-XX:RTMTotalCountIncrRate=1", - "-XX:RTMAbortThreshold=0", - CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold", - 10 * Test.TOTAL_ITERATIONS), - CommandLineOptionTest.prepareNumericFlag("RTMAbortRatio", - abortRatio), - "-XX:+PrintPreciseRTMLockingStatistics", - test.getClass().getName(), - Boolean.toString(!useStackLock)); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - test.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, "VM output should contain " - + "exactly one RTM locking statistics entry."); - - RTMLockingStatistics lock = statistics.get(0); - int actualRatio; - - if (lock.getTotalAborts() == 1L) { - actualRatio = 0; - } else { - actualRatio = (int) (lock.getTotalLocks() - / (lock.getTotalAborts() - 1L)); - } - - Asserts.assertLTE(actualRatio, abortRatio, String.format( - "Actual abort ratio (%d) should lower or equal to " - + "specified (%d).", actualRatio, abortRatio)); - } - - /** - * Force abort after {@code Test.WARMUP_ITERATIONS} is done. - */ - public static class Test implements CompilableTest { - private static final int TOTAL_ITERATIONS = 10000; - private static final int WARMUP_ITERATIONS = 1000; - private final XAbortProvoker xabort = new XAbortProvoker(); - private final Object monitor = new Object(); - // Following field have to be static in order to avoid escape analysis. - @SuppressWarnings("UnsuedDeclaration") - private static int field = 0; - - @Override - public String getMethodWithLockName() { - return this.getClass().getName() + "::lock"; - } - - @Override - public String[] getMethodsToCompileNames() { - return new String[] { getMethodWithLockName(), "*.doAbort" }; - } - - public void lock(boolean abort) { - synchronized(monitor) { - if (abort) { - xabort.doAbort(); - } - } - } - - /** - * Usage: - * Test <inflate monitor> - */ - public static void main(String args[]) throws Throwable { - Asserts.assertGTE(args.length, 1, "One argument required."); - Test t = new Test(); - boolean shouldBeInflated = Boolean.valueOf(args[0]); - if (shouldBeInflated) { - AbortProvoker.inflateMonitor(t.monitor); - } - for (int i = 0; i < Test.TOTAL_ITERATIONS; i++) { - AbortProvoker.verifyMonitorState(t.monitor, shouldBeInflated); - t.lock(i >= Test.WARMUP_ITERATIONS); - } - } - } - - public static void main(String args[]) throws Throwable { - new TestRTMAbortRatio().runTestCases(); - } -} - diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortThreshold.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortThreshold.java deleted file mode 100644 index 4eddead8e5e22..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortThreshold.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that RTMAbortThreshold option affects - * amount of aborts after which abort ratio is calculated. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMAbortThreshold - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that on RTMAbortThreshold option actually affects how soon - * method will be deoptimized on high abort ratio. - */ -public class TestRTMAbortThreshold { - - protected void runTestCases() throws Throwable { - verifyAbortThreshold(false, 1); - verifyAbortThreshold(false, 10); - verifyAbortThreshold(false, 1000); - - verifyAbortThreshold(true, 1); - verifyAbortThreshold(true, 10); - verifyAbortThreshold(true, 1000); - } - - private void verifyAbortThreshold(boolean useStackLock, - long abortThreshold) throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - provoker, - "-XX:+UseRTMDeopt", - "-XX:RTMAbortRatio=0", - CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", - abortThreshold), - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - "-XX:RTMTotalCountIncrRate=1", - "-XX:+PrintPreciseRTMLockingStatistics", - AbortProvoker.class.getName(), - AbortType.XABORT.toString(), - Boolean.toString(!useStackLock)); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, "VM output should contain " - + "exactly one RTM locking statistics entry for method " - + provoker.getMethodWithLockName()); - - Asserts.assertEQ(statistics.get(0).getTotalLocks(), abortThreshold, - String.format("Expected that method with rtm lock elision was" - + " deoptimized after %d lock attempts", - abortThreshold)); - } - - public static void main(String args[]) throws Throwable { - new TestRTMAbortThreshold().runTestCases(); - } -} - diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java deleted file mode 100644 index 03f56769bffeb..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that if we use RTMDeopt, then deoptimization - * caused by reason other then rtm_state_change will reset - * method's RTM state. And if we don't use RTMDeopt, then - * RTM state remain the same after such deoptimization. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMAfterNonRTMDeopt - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.XAbortProvoker; -import compiler.testlibrary.rtm.CompilableTest; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * To verify that with +UseRTMDeopt method's RTM state will be - * changed to ProfileRTM on deoptimization unrelated to - * rtm_state_change following sequence of events is used: - *
- *
- *     rtm state ^
- *               |
- *       UseRTM  |      ******|     ******
- *               |            |
- *   ProfileRTM  |******|     |*****|
- *               |      |     |     |
- *              0-------|-----|-----|---------------------> time
- *                      |     |     \ force abort
- *                      |     |
- *                      |     \ force deoptimization
- *                      |
- *                      \ force xabort
- * 
- * When xabort is forced by native method call method should - * change it's state to UseRTM, because we use RTMAbortRatio=100 - * and low RTMLockingThreshold, so at this point actual abort - * ratio will be below 100% and there should be enough lock - * attempts to recompile method without RTM profiling. - */ -public class TestRTMAfterNonRTMDeopt { - private static final int ABORT_THRESHOLD = 1000; - private static final String RANGE_CHECK = "range_check"; - - protected void runTestCases() throws Throwable { - verifyRTMAfterDeopt(false, false); - verifyRTMAfterDeopt(true, false); - - verifyRTMAfterDeopt(false, true); - verifyRTMAfterDeopt(true, true); - } - - private void verifyRTMAfterDeopt(boolean useStackLock, - boolean useRTMDeopt) throws Throwable { - CompilableTest test = new Test(); - String logFile = String.format("rtm_%s_stack_lock_%s_deopt.xml", - (useStackLock ? "use" : "no"), (useRTMDeopt ? "use" : "no")); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - logFile, - test, - "-XX:CompileThreshold=1", - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - CommandLineOptionTest.prepareBooleanFlag("UseRTMDeopt", - useRTMDeopt), - "-XX:RTMAbortRatio=100", - CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", - TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD), - CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold", - TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD / 2L), - "-XX:RTMTotalCountIncrRate=1", - "-XX:+PrintPreciseRTMLockingStatistics", - Test.class.getName(), - Boolean.toString(!useStackLock) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - int traps = RTMTestBase.firedRTMStateChangeTraps(logFile); - - if (useRTMDeopt) { - Asserts.assertEQ(traps, 2, "Two uncommon traps with " - + "reason rtm_state_change should be fired."); - } else { - Asserts.assertEQ(traps, 0, "No uncommon traps with " - + "reason rtm_state_change should be fired."); - } - - int rangeCheckTraps = RTMTestBase.firedUncommonTraps(logFile, - TestRTMAfterNonRTMDeopt.RANGE_CHECK); - - Asserts.assertEQ(rangeCheckTraps, 1, - "One range_check uncommon trap should be fired."); - - List statistics = RTMLockingStatistics.fromString( - test.getMethodWithLockName(), outputAnalyzer.getOutput()); - - int expectedStatEntries = (useRTMDeopt ? 4 : 2); - - Asserts.assertEQ(statistics.size(), expectedStatEntries, - String.format("VM output should contain %d RTM locking " - + "statistics entries.", expectedStatEntries)); - } - - public static class Test implements CompilableTest { - // Following field have to be static in order to avoid escape analysis. - @SuppressWarnings("UnsuedDeclaration") - private static int field = 0; - private static final int ITERATIONS = 10000; - private static final int RANGE_CHECK_AT = ITERATIONS / 2; - private final XAbortProvoker xabort = new XAbortProvoker(); - private final Object monitor = new Object(); - - @Override - public String getMethodWithLockName() { - return this.getClass().getName() + "::forceAbort"; - } - - @Override - public String[] getMethodsToCompileNames() { - return new String[] { getMethodWithLockName(), - XAbortProvoker.class.getName() + "::doAbort()" }; - } - - public void forceAbort(int a[], boolean abort) { - try { - synchronized(monitor) { - a[0]++; - if (abort) { - Test.field = xabort.doAbort(); - } - } - } catch (Throwable t) { - // suppress any throwables - } - } - - /** - * Usage: - * Test <inflate monitor> - */ - public static void main(String args[]) throws Throwable { - Test t = new Test(); - - boolean shouldBeInflated = Boolean.valueOf(args[0]); - if (shouldBeInflated) { - AbortProvoker.inflateMonitor(t.monitor); - } - - int tmp[] = new int[1]; - - for (int i = 0; i < Test.ITERATIONS; i++ ) { - AbortProvoker.verifyMonitorState(t.monitor, shouldBeInflated); - if (i == Test.RANGE_CHECK_AT) { - t.forceAbort(new int[0], false); - } else { - boolean isThreshold - = (i == TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD); - boolean isThresholdPlusRange - = (i == TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD - + Test.RANGE_CHECK_AT); - t.forceAbort(tmp, isThreshold || isThresholdPlusRange); - } - } - } - } - - public static void main(String args[]) throws Throwable { - new TestRTMAfterNonRTMDeopt().runTestCases(); - } -} - diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java deleted file mode 100644 index 5faec082fc29c..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that on high abort ratio method will be recompiled - * without rtm locking. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMDeoptOnHighAbortRatio - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that on high abort ratio method wil be deoptimized with - * rtm_state_change reason and after that RTM-based lock elision will not - * be used for that method. - * This test make asserts on total locks count done by compiled method, - * so in order to avoid issue with retriable locks -XX:RTMRetryCount=0 is used. - * For more details on that issue see {@link TestUseRTMAfterLockInflation}. - */ -public class TestRTMDeoptOnHighAbortRatio { - private static final long ABORT_THRESHOLD - = AbortProvoker.DEFAULT_ITERATIONS / 2L; - - protected void runTestCases() throws Throwable { - verifyDeopt(false); - verifyDeopt(true); - } - - private void verifyDeopt(boolean useStackLock) throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - String logFileName = String.format("rtm_deopt_%s_stack_lock.xml", - (useStackLock ? "use" : "no")); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - logFileName, - provoker, - "-XX:+UseRTMDeopt", - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - "-XX:RTMRetryCount=0", - CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", - TestRTMDeoptOnHighAbortRatio.ABORT_THRESHOLD), - "-XX:RTMAbortRatio=100", - "-XX:CompileThreshold=1", - "-XX:RTMTotalCountIncrRate=1", - "-XX:+PrintPreciseRTMLockingStatistics", - AbortProvoker.class.getName(), - AbortType.XABORT.toString(), - Boolean.toString(!useStackLock) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName); - - Asserts.assertEQ(firedTraps, 1, "Expected to get only one " - + "deoptimization due to rtm state change"); - - List statistics = RTMLockingStatistics.fromString( - provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, "VM output should contain " - + "exactly one RTM locking statistics entry for method " - + provoker.getMethodWithLockName()); - - Asserts.assertEQ(statistics.get(0).getTotalLocks(), - TestRTMDeoptOnHighAbortRatio.ABORT_THRESHOLD, - "After AbortThreshold was reached, method should be" - + " recompiled without rtm lock eliding."); - } - - public static void main(String args[]) throws Throwable { - new TestRTMDeoptOnHighAbortRatio().runTestCases(); - } -} - diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java deleted file mode 100644 index 404d076e5caa6..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that on low abort ratio method will be recompiled. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMDeoptOnLowAbortRatio - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.XAbortProvoker; -import compiler.testlibrary.rtm.CompilableTest; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that low abort ratio method will be deoptimized with - * rtm_state_change reason and will continue to use RTM-based lock - * elision after that. - * This test make asserts on total locks count done by compiled method, - * so in order to avoid issue with retriable locks -XX:RTMRetryCount=0 is used. - * For more details on that issue see {@link TestUseRTMAfterLockInflation}. - */ -public class TestRTMDeoptOnLowAbortRatio { - private static final long LOCKING_THRESHOLD = 100L; - private static final long ABORT_THRESHOLD = LOCKING_THRESHOLD / 2L; - - protected void runTestCases() throws Throwable { - verifyRTMDeopt(false); - verifyRTMDeopt(true); - } - - private void verifyRTMDeopt(boolean useStackLock) throws Throwable { - CompilableTest test = new Test(); - String logFileName = String.format("rtm_deopt_%s_stack_lock.xml", - useStackLock ? "use" : "no"); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - logFileName, - test, - "-XX:+UseRTMDeopt", - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold", - TestRTMDeoptOnLowAbortRatio.LOCKING_THRESHOLD), - CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", - TestRTMDeoptOnLowAbortRatio.ABORT_THRESHOLD), - "-XX:RTMAbortRatio=100", - "-XX:CompileThreshold=1", - "-XX:RTMRetryCount=0", - "-XX:RTMTotalCountIncrRate=1", - "-XX:+PrintPreciseRTMLockingStatistics", - Test.class.getName(), - Boolean.toString(!useStackLock) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName); - - Asserts.assertEQ(firedTraps, 1, - "Expected to get only one deoptimization due to rtm" - + " state change"); - - List statistics = RTMLockingStatistics.fromString( - test.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 2, - "VM output should contain two RTM locking " - + "statistics entries for method " - + test.getMethodWithLockName()); - - RTMLockingStatistics statisticsBeforeDeopt = null; - - for (RTMLockingStatistics s : statistics) { - if (s.getTotalLocks() - == TestRTMDeoptOnLowAbortRatio.LOCKING_THRESHOLD) { - Asserts.assertNull(statisticsBeforeDeopt, - "Only one abort was expected during test run"); - statisticsBeforeDeopt = s; - } - } - - Asserts.assertNotNull(statisticsBeforeDeopt, - "After LockThreshold was reached, method should be recompiled " - + "with rtm lock eliding."); - } - - public static class Test implements CompilableTest { - private final XAbortProvoker xabort = new XAbortProvoker(); - private final Object monitor = new Object(); - - @Override - public String getMethodWithLockName() { - return this.getClass().getName() + "::forceAbort"; - } - - @Override - public String[] getMethodsToCompileNames() { - return new String[] { getMethodWithLockName(), - XAbortProvoker.class.getName() + "::doAbort" }; - } - - public void forceAbort(boolean abort) { - synchronized(monitor) { - if (abort) { - xabort.doAbort(); - } - } - } - - /** - * Usage: - * Test <inflate monitor> - */ - public static void main(String args[]) throws Throwable { - Asserts.assertGTE(args.length, 1, "One argument required."); - Test t = new Test(); - boolean shouldBeInflated = Boolean.valueOf(args[0]); - if (shouldBeInflated) { - AbortProvoker.inflateMonitor(t.monitor); - } - for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) { - AbortProvoker.verifyMonitorState(t.monitor, shouldBeInflated); - t.forceAbort(i >= TestRTMDeoptOnLowAbortRatio.ABORT_THRESHOLD); - } - } - } - - public static void main(String args[]) throws Throwable { - new TestRTMDeoptOnLowAbortRatio().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingCalculationDelay.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingCalculationDelay.java deleted file mode 100644 index 053e14d583fb8..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingCalculationDelay.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that RTMLockingCalculationDelay affect when - * abort ratio calculation is started. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMLockingCalculationDelay - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -/** - * Test verifies that abort ratio calculation could be delayed using - * RTMLockingCalculationDelay option. - */ -public class TestRTMLockingCalculationDelay { - private static final boolean INFLATE_MONITOR = true; - - protected void runTestCases() throws Throwable { - // verify that calculation will be started immediately - verifyLockingCalculationDelay(0, 0, true); - - // verify that calculation will not be started during - // first 10 minutes, while test will be started immediately - verifyLockingCalculationDelay(600000, 0, false); - - // verify that calculation will be started after a second - verifyLockingCalculationDelay(1000, 1000, true); - } - - private void verifyLockingCalculationDelay(long delay, long testDelay, - boolean deoptExpected) throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - String logFileName = String.format("rtm_delay_%d_%d.xml", delay, - testDelay); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - logFileName, - provoker, - "-XX:+UseRTMDeopt", - CommandLineOptionTest.prepareNumericFlag( - "RTMLockingCalculationDelay", delay), - "-XX:RTMAbortRatio=0", - "-XX:RTMAbortThreshold=0", - AbortProvoker.class.getName(), - AbortType.XABORT.toString(), - Boolean.toString( - TestRTMLockingCalculationDelay.INFLATE_MONITOR), - Long.toString(AbortProvoker.DEFAULT_ITERATIONS), - Long.toString(testDelay) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - int deopts = RTMTestBase.firedRTMStateChangeTraps(logFileName); - - if (deoptExpected) { - Asserts.assertGT(deopts, 0, "At least one deoptimization due to " - + "rtm_state_chage is expected"); - } else { - Asserts.assertEQ(deopts, 0, "No deoptimizations due to " - + "rtm_state_chage are expected"); - } - } - - public static void main(String args[]) throws Throwable { - new TestRTMLockingCalculationDelay().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingThreshold.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingThreshold.java deleted file mode 100644 index 913fac3068b21..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingThreshold.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that RTMLockingThreshold affects rtm state transition - * ProfileRTM => UseRTM. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMLockingThreshold - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.XAbortProvoker; -import compiler.testlibrary.rtm.CompilableTest; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that RTMLockingThreshold option actually affects how soon - * method will be deoptimized on low abort ratio. - */ -public class TestRTMLockingThreshold { - - /** - * We use non-zero abort threshold to avoid abort related to - * interrupts, VMM calls, etc. during first lock attempt. - * - */ - private static final int MIN_ABORT_THRESHOLD = 10; - - protected void runTestCases() throws Throwable { - verifyLockingThreshold(0, false); - verifyLockingThreshold(100, false); - verifyLockingThreshold(1000, false); - - verifyLockingThreshold(0, true); - verifyLockingThreshold(100, true); - verifyLockingThreshold(1000, true); - } - - private void verifyLockingThreshold(int lockingThreshold, - boolean useStackLock) throws Throwable { - CompilableTest test = new Test(); - - int abortThreshold = Math.max(lockingThreshold / 2, - TestRTMLockingThreshold.MIN_ABORT_THRESHOLD); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - test, - "-XX:CompileThreshold=1", - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - "-XX:+UseRTMDeopt", - "-XX:RTMTotalCountIncrRate=1", - "-XX:RTMRetryCount=0", - CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", - abortThreshold), - CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold", - lockingThreshold), - "-XX:RTMAbortRatio=100", - "-XX:+PrintPreciseRTMLockingStatistics", - Test.class.getName(), - Boolean.toString(!useStackLock), - Integer.toString(lockingThreshold) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - test.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 2, "VM output should contain two " - + "RTM locking statistics entries."); - - /** - * If RTMLockingThreshold==0, then we have to make at least 1 call. - */ - long expectedValue = lockingThreshold; - if (expectedValue == 0) { - expectedValue++; - } - - RTMLockingStatistics statBeforeDeopt = null; - for (RTMLockingStatistics s : statistics) { - if (s.getTotalLocks() == expectedValue) { - Asserts.assertNull(statBeforeDeopt, - "Only one statistics entry should contain aborts"); - statBeforeDeopt = s; - } - } - - Asserts.assertNotNull(statBeforeDeopt, "There should be exactly one " - + "statistics entry corresponding to ProfileRTM state."); - } - - public static class Test implements CompilableTest { - // Following field have to be static in order to avoid escape analysis. - @SuppressWarnings("UnsuedDeclaration") - private static int field = 0; - private static final int TOTAL_ITERATIONS = 10000; - private final XAbortProvoker xabort = new XAbortProvoker(); - private final Object monitor = new Object(); - - @Override - public String getMethodWithLockName() { - return this.getClass().getName() + "::lock"; - } - - @Override - public String[] getMethodsToCompileNames() { - return new String[] { getMethodWithLockName(), - XAbortProvoker.class.getName() + "::doAbort" }; - } - - public void lock(boolean abort) { - synchronized(monitor) { - if (abort) { - Test.field += xabort.doAbort(); - } - } - } - - /** - * Usage: - * Test <inflate monitor> - */ - public static void main(String args[]) throws Throwable { - Asserts.assertGTE(args.length, 2, "Two arguments required."); - Test t = new Test(); - boolean shouldBeInflated = Boolean.valueOf(args[0]); - int lockingThreshold = Integer.valueOf(args[1]); - if (shouldBeInflated) { - AbortProvoker.inflateMonitor(t.monitor); - } - for (int i = 0; i < Test.TOTAL_ITERATIONS; i++) { - AbortProvoker.verifyMonitorState(t.monitor, shouldBeInflated); - t.lock(i >= lockingThreshold / 2); - } - } - } - - public static void main(String args[]) throws Throwable { - new TestRTMLockingThreshold().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMRetryCount.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMRetryCount.java deleted file mode 100644 index ed09be05d212d..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMRetryCount.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that RTMRetryCount affects actual amount of retries. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMRetryCount - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.BusyLock; -import compiler.testlibrary.rtm.CompilableTest; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that RTMRetryCount option actually affects amount of - * retries on lock busy. - */ -public class TestRTMRetryCount { - /** - * Time in ms, during which busy lock will be locked. - */ - private static final int LOCKING_TIME = 5000; - private static final boolean INFLATE_MONITOR = true; - - protected void runTestCases() throws Throwable { - verifyRTMRetryCount(0); - verifyRTMRetryCount(1); - verifyRTMRetryCount(5); - verifyRTMRetryCount(10); - } - - private void verifyRTMRetryCount(int retryCount) throws Throwable { - CompilableTest busyLock = new BusyLock(); - long expectedAborts = retryCount + 1L; - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - busyLock, - "-XX:-UseRTMXendForLockBusy", - "-XX:RTMTotalCountIncrRate=1", - CommandLineOptionTest.prepareNumericFlag("RTMRetryCount", - retryCount), - "-XX:RTMTotalCountIncrRate=1", - "-XX:+PrintPreciseRTMLockingStatistics", - BusyLock.class.getName(), - Boolean.toString(TestRTMRetryCount.INFLATE_MONITOR), - Integer.toString(TestRTMRetryCount.LOCKING_TIME) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - busyLock.getMethodWithLockName(), outputAnalyzer.getStdout()); - - Asserts.assertEQ(statistics.size(), 1, "VM output should contain " - + "exactly one rtm locking statistics entry for method " - + busyLock.getMethodWithLockName()); - - Asserts.assertEQ(statistics.get(0).getTotalAborts(), expectedAborts, - String.format("It is expected to get %d aborts", - expectedAborts)); - } - - public static void main(String args[]) throws Throwable { - new TestRTMRetryCount().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMSpinLoopCount.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMSpinLoopCount.java deleted file mode 100644 index 8702ae0b73439..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMSpinLoopCount.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that RTMSpinLoopCount affects time spent - * between locking attempts. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMSpinLoopCount - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.BusyLock; -import compiler.testlibrary.rtm.CompilableTest; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; -import jdk.test.lib.Platform; - -import java.util.List; - -/** - * Test verifies that RTMSpinLoopCount increase time spent between retries - * by comparing amount of retries done with different RTMSpinLoopCount's values. - */ -public class TestRTMSpinLoopCount { - private static final int LOCKING_TIME = 1000; - private static final int RTM_RETRY_COUNT = 1000; - private static final boolean INFLATE_MONITOR = true; - private static final long MAX_ABORTS = RTM_RETRY_COUNT + 1L; - private static int[] SPIN_LOOP_COUNTS; - - protected void runTestCases() throws Throwable { - - SPIN_LOOP_COUNTS = new int[] { 0, 100, 1_000, 10_000, 100_000 }; - - long[] aborts = new long[TestRTMSpinLoopCount.SPIN_LOOP_COUNTS.length]; - - for (int i = 0; i < TestRTMSpinLoopCount.SPIN_LOOP_COUNTS.length; i++) { - aborts[i] = getAbortsCountOnLockBusy( - TestRTMSpinLoopCount.SPIN_LOOP_COUNTS[i]); - } - - for (int i = 1; i < aborts.length; i++) { - Asserts.assertLTE(aborts[i], aborts[i - 1], "Increased spin loop " - + "count should not increase retries count."); - } - } - - private long getAbortsCountOnLockBusy(int spinLoopCount) throws Throwable { - CompilableTest test = new BusyLock(); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - test, - CommandLineOptionTest.prepareNumericFlag("RTMRetryCount", - TestRTMSpinLoopCount.RTM_RETRY_COUNT), - CommandLineOptionTest.prepareNumericFlag("RTMSpinLoopCount", - spinLoopCount), - "-XX:-UseRTMXendForLockBusy", - "-XX:RTMTotalCountIncrRate=1", - "-XX:+PrintPreciseRTMLockingStatistics", - BusyLock.class.getName(), - Boolean.toString(TestRTMSpinLoopCount.INFLATE_MONITOR), - Integer.toString(TestRTMSpinLoopCount.LOCKING_TIME) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - test.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, - "VM output should contain exactly one entry for method " - + test.getMethodWithLockName()); - - RTMLockingStatistics lock = statistics.get(0); - - Asserts.assertLTE(lock.getTotalAborts(), - TestRTMSpinLoopCount.MAX_ABORTS, String.format("Total aborts " - + "count (%d) should be less or equal to %d", - lock.getTotalAborts(), - TestRTMSpinLoopCount.MAX_ABORTS)); - - return lock.getTotalAborts(); - } - - public static void main(String args[]) throws Throwable { - new TestRTMSpinLoopCount().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMTotalCountIncrRate.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMTotalCountIncrRate.java deleted file mode 100644 index e0a8394570e03..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMTotalCountIncrRate.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that RTMTotalCountIncrRate option affects - * RTM locking statistics. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestRTMTotalCountIncrRate - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.XAbortProvoker; -import compiler.testlibrary.rtm.CompilableTest; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that with RTMTotalCountIncrRate=1 RTM locking statistics - * contains precise information abort attempted locks and that with other values - * statistics contains information abort non-zero locking attempts. - * Since assert done for RTMTotalCountIncrRate=1 is pretty strict, test uses - * -XX:RTMRetryCount=0 to avoid issue with retriable aborts. For more details on - * that issue see {@link TestUseRTMAfterLockInflation}. - */ -public class TestRTMTotalCountIncrRate { - protected void runTestCases() throws Throwable { - verifyLocksCount(1, false); - verifyLocksCount(64, false); - verifyLocksCount(128, false); - verifyLocksCount(1, true); - verifyLocksCount(64, true); - verifyLocksCount(128, true); - } - - private void verifyLocksCount(int incrRate, boolean useStackLock) - throws Throwable{ - CompilableTest test = new Test(); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - test, - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - CommandLineOptionTest.prepareNumericFlag( - "RTMTotalCountIncrRate", incrRate), - "-XX:RTMRetryCount=0", - "-XX:+PrintPreciseRTMLockingStatistics", - Test.class.getName(), - Boolean.toString(!useStackLock) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - test.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, "VM output should contain " - + "exactly one RTM locking statistics entry for method " - + test.getMethodWithLockName()); - - RTMLockingStatistics lock = statistics.get(0); - if (incrRate == 1) { - Asserts.assertEQ(lock.getTotalLocks(), Test.TOTAL_ITERATIONS, - "Total locks should be exactly the same as amount of " - + "iterations."); - } - } - - public static class Test implements CompilableTest { - private static final long TOTAL_ITERATIONS = 10000L; - private final XAbortProvoker xabort = new XAbortProvoker(); - private final Object monitor = new Object(); - // Following field have to be static in order to avoid escape analysis. - @SuppressWarnings("UnsuedDeclaration") - private static int field = 0; - - @Override - public String getMethodWithLockName() { - return this.getClass().getName() + "::lock"; - } - - @Override - public String[] getMethodsToCompileNames() { - return new String[] { getMethodWithLockName(), "*.doAbort" }; - } - - public void lock(boolean forceAbort) { - synchronized(monitor) { - if (forceAbort) { - // We're calling native method in order to force - // abort. It's done by explicit xabort call emitted - // in SharedRuntime::generate_native_wrapper. - // If an actual JNI call will be replaced by - // intrinsic - we'll be in trouble, since xabort - // will be no longer called and test may fail. - xabort.doAbort(); - } - Test.field++; - } - } - - /** - * Usage: - * Test <inflate monitor> - */ - public static void main(String args[]) throws Throwable { - Asserts.assertGTE(args.length, 1, "One argument required."); - Test test = new Test(); - boolean shouldBeInflated = Boolean.valueOf(args[0]); - if (shouldBeInflated) { - AbortProvoker.inflateMonitor(test.monitor); - } - for (long i = 0L; i < Test.TOTAL_ITERATIONS; i++) { - AbortProvoker.verifyMonitorState(test.monitor, - shouldBeInflated); - // Force abort on first iteration to avoid rare case when - // there were no aborts and locks count was not incremented - // with RTMTotalCountIncrRate > 1 (in such case JVM won't - // print JVM locking statistics). - test.lock(i == 0); - } - } - } - - public static void main(String args[]) throws Throwable { - new TestRTMTotalCountIncrRate().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMAfterLockInflation.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMAfterLockInflation.java deleted file mode 100644 index d99a59ab84fd7..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMAfterLockInflation.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that rtm locking is used for stack locks before - * inflation and after it used for inflated locks. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestUseRTMAfterLockInflation - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; - -import java.util.List; - -/** - * Test verifies that RTM is used after lock inflation by executing compiled - * method with RTM-based lock elision using stack lock first, then that lock - * is inflated and the same compiled method invoked again. - * - * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times before - * lock inflation and the same amount of times after inflation. - * As a result total locks count should be equal to - * {@code 2 * AbortProvoker.DEFAULT_ITERATIONS}. - * It is a pretty strict assertion which could fail if some retriable abort - * happened: it could be {@code AbortType.RETRIABLE} or - * {@code AbortType.MEM_CONFLICT}, but unfortunately abort can has both these - * reasons simultaneously. In order to avoid false negative failures related - * to incorrect aborts counting, -XX:RTMRetryCount=0 is used. - */ -public class TestUseRTMAfterLockInflation { - private static final long EXPECTED_LOCKS - = 2L * AbortProvoker.DEFAULT_ITERATIONS; - - protected void runTestCases() throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - long totalLocksCount = 0; - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - provoker, - "-XX:+UseRTMForStackLocks", - "-XX:RTMTotalCountIncrRate=1", - "-XX:RTMRetryCount=0", - "-XX:+PrintPreciseRTMLockingStatistics", - Test.class.getName(), - AbortType.XABORT.toString()); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 2, - "VM output should contain two rtm locking statistics entries " - + "for method " + provoker.getMethodWithLockName()); - - for (RTMLockingStatistics s : statistics) { - totalLocksCount += s.getTotalLocks(); - } - - Asserts.assertEQ(totalLocksCount, - TestUseRTMAfterLockInflation.EXPECTED_LOCKS, - "Total lock count should be greater or equal to " - + TestUseRTMAfterLockInflation.EXPECTED_LOCKS); - } - - public static class Test { - /** - * Usage: - * Test <provoker type> - */ - public static void main(String args[]) throws Throwable { - Asserts.assertGT(args.length, 0, - "AbortType name is expected as first argument."); - - AbortProvoker provoker - = AbortType.lookup(Integer.valueOf(args[0])).provoker(); - for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) { - AbortProvoker.verifyMonitorState(provoker, false /*deflated*/); - provoker.forceAbort(); - } - provoker.inflateMonitor(); - for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) { - AbortProvoker.verifyMonitorState(provoker, true /*inflated*/); - provoker.forceAbort(); - } - } - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMAfterLockInflation().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMDeopt.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMDeopt.java deleted file mode 100644 index facf686739c92..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMDeopt.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that UseRTMDeopt affects uncommon trap installation in - * compiled methods with synchronized block. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestUseRTMDeopt - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -/** - * Test verifies that usage of UseRTMDeopt option affects uncommon traps usage - * for methods that use locking. - */ -public class TestUseRTMDeopt { - - protected void runTestCases() throws Throwable { - verifyUseRTMDeopt(false); - verifyUseRTMDeopt(true); - } - - private void verifyUseRTMDeopt(boolean useRTMDeopt) throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - String logFileName = String.format("rtm_%s_deopt.xml", - useRTMDeopt ? "use" : "no"); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - logFileName, - provoker, - CommandLineOptionTest.prepareBooleanFlag("UseRTMDeopt", - useRTMDeopt), - AbortProvoker.class.getName(), - AbortType.XABORT.toString() - ); - - outputAnalyzer.shouldHaveExitValue(0); - - int expectedUncommonTraps = useRTMDeopt ? 1 : 0; - int installedUncommonTraps - = RTMTestBase.installedRTMStateChangeTraps(logFileName); - - Asserts.assertEQ(expectedUncommonTraps, installedUncommonTraps, - String.format("Expected to find %d uncommon traps " - + "installed with reason rtm_state_change.", - expectedUncommonTraps)); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMDeopt().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForInflatedLocks.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForInflatedLocks.java deleted file mode 100644 index 0b5267a3ef6ae..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForInflatedLocks.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that rtm locking is used for inflated locks. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestUseRTMForInflatedLocks - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; - -import java.util.List; - -/** - * Test verifies that RTM-based lock elision could be used for inflated locks - * by calling compiled method that use RTM-based lock elision and using - * manually inflated lock. - * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times, - * so total locks count should be the same. - * This test could also be affected by retriable aborts, so -XX:RTMRetryCount=0 - * is used. For more information abort that issue see - * {@link TestUseRTMAfterLockInflation}. - */ -public class TestUseRTMForInflatedLocks { - - protected void runTestCases() throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - RTMLockingStatistics lock; - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - provoker, - "-XX:-UseRTMForStackLocks", - "-XX:RTMTotalCountIncrRate=1", - "-XX:RTMRetryCount=0", - "-XX:+PrintPreciseRTMLockingStatistics", - AbortProvoker.class.getName(), - AbortType.XABORT.toString()); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, - "VM output should contain exactly one rtm locking statistics " - + "entry for method " + provoker.getMethodWithLockName()); - - lock = statistics.get(0); - Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS, - "Total lock count should be greater or equal to " - + AbortProvoker.DEFAULT_ITERATIONS); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMForInflatedLocks().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForStackLocks.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForStackLocks.java deleted file mode 100644 index 720fedb613b56..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForStackLocks.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that rtm locking is used for stack locks. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestUseRTMForStackLocks - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; - -import java.util.List; - -/** - * Test verifies that RTM-based lock elision could be used for stack locks - * by calling compiled method that use RTM-based lock elision and using - * stack lock. - * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times, - * so total locks count should be the same. - * This test could also be affected by retriable aborts, so -XX:RTMRetryCount=0 - * is used. For more information abort that issue see - * {@link TestUseRTMAfterLockInflation}. - */ -public class TestUseRTMForStackLocks { - private static final boolean INFLATE_MONITOR = false; - - protected void runTestCases() throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - RTMLockingStatistics lock; - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - provoker, - "-XX:+UseRTMForStackLocks", - "-XX:RTMTotalCountIncrRate=1", - "-XX:RTMRetryCount=0", - "-XX:+PrintPreciseRTMLockingStatistics", - AbortProvoker.class.getName(), - AbortType.XABORT.toString(), - Boolean.toString(TestUseRTMForStackLocks.INFLATE_MONITOR)); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, - "VM output should contain exactly one rtm locking statistics " - + "entry for method " + provoker.getMethodWithLockName()); - - lock = statistics.get(0); - Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS, - "Total locks count should be greater or equal to " - + AbortProvoker.DEFAULT_ITERATIONS); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMForStackLocks().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMXendForLockBusy.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMXendForLockBusy.java deleted file mode 100644 index 2eb3735855ed2..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMXendForLockBusy.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that UseRTMXendForLockBusy option affects - * method behaviour if lock is busy. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.locking.TestUseRTMXendForLockBusy - */ - -package compiler.rtm.locking; - -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.BusyLock; -import compiler.testlibrary.rtm.CompilableTest; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that with +UseRTMXendForLockBusy there will be no aborts - * forced by the test. - */ -public class TestUseRTMXendForLockBusy { - private final static int LOCKING_TIME = 5000; - - protected void runTestCases() throws Throwable { - // inflated lock, xabort on lock busy - verifyXendForLockBusy(true, false); - // inflated lock, xend on lock busy - verifyXendForLockBusy(true, true); - // stack lock, xabort on lock busy - verifyXendForLockBusy(false, false); - // stack lock, xend on lock busy - verifyXendForLockBusy(false, true); - } - - private void verifyXendForLockBusy(boolean inflateMonitor, - boolean useXend) throws Throwable { - CompilableTest test = new BusyLock(); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - test, - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - !inflateMonitor), - CommandLineOptionTest.prepareBooleanFlag( - "UseRTMXendForLockBusy", - useXend), - "-XX:RTMRetryCount=0", - "-XX:RTMTotalCountIncrRate=1", - "-XX:+PrintPreciseRTMLockingStatistics", - BusyLock.class.getName(), - Boolean.toString(inflateMonitor), - Integer.toString(TestUseRTMXendForLockBusy.LOCKING_TIME) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - test.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, "VM output should contain " - + "exactly one rtm locking statistics entry for method " - + test.getMethodWithLockName()); - - long aborts = statistics.get(0).getAborts(AbortType.XABORT); - - if (useXend) { - Asserts.assertEQ(aborts, 0L, - "Expected to get no aborts on busy lock"); - } else { - Asserts.assertGT(aborts, 0L, - "Expected to get at least one abort on busy lock"); - } - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMXendForLockBusy().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/method_options/TestNoRTMLockElidingOption.java b/test/hotspot/jtreg/compiler/rtm/method_options/TestNoRTMLockElidingOption.java deleted file mode 100644 index 07514e4fc37a3..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/method_options/TestNoRTMLockElidingOption.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that NoRTMLockEliding option could be applied to - * specified method and that such method will not use rtm. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.method_options.TestNoRTMLockElidingOption - */ - -package compiler.rtm.method_options; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that method tagged with option NoRTMLockElidingOption - * will not use RTM-based lock elision. - * Test invokes compiled method and checks that no deoptimization with - * rtm_state_change reason had happened and that that VM output - * does not contain RTM locking statistics for compiled method. - */ -public class TestNoRTMLockElidingOption { - - public void runTestCases() throws Throwable { - verifyOption(false); - verifyOption(true); - } - - public void verifyOption(boolean useStackLock) throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - String logFileName = String.format("rtm_deopt_%s_stack_lock.xml", - (useStackLock ? "use" : "no")); - String methodOption = String.format("-XX:CompileCommand=option," + - "%s,NoRTMLockEliding", provoker.getMethodWithLockName()); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - logFileName, - provoker, - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - methodOption, - "-XX:RTMTotalCountIncrRate=1", - "-XX:+UseRTMDeopt", - "-XX:+PrintPreciseRTMLockingStatistics", - AbortProvoker.class.getName(), - AbortType.XABORT.toString(), - Boolean.toString(!useStackLock) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName); - - Asserts.assertEQ(firedTraps, 0, - "No deoptimizations with rtm_state_change reason are expected"); - - List statistics = RTMLockingStatistics.fromString( - provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 0, - "VM output should not contain RTM locking statistics entries " - + "for method " + provoker.getMethodWithLockName()); - } - - public static void main(String args[]) throws Throwable { - new TestNoRTMLockElidingOption().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/method_options/TestUseRTMLockElidingOption.java b/test/hotspot/jtreg/compiler/rtm/method_options/TestUseRTMLockElidingOption.java deleted file mode 100644 index 4007121b4aaca..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/method_options/TestUseRTMLockElidingOption.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that UseRTMLockEliding option could be applied to - * specified method and that such method will not be deoptimized - * on high abort ratio. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.method_options.TestUseRTMLockElidingOption - */ - -package compiler.rtm.method_options; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.util.List; - -/** - * Test verifies that method tagged with option UseRTMLockElidingOption - * will use RTM-based lock elision, but will be never deoptimized with - * rtm_state_change reason. - * Test invokes compiled method and checks that no deoptimization with - * rtm_state_change reason had happened and that that VM output - * contains RTM locking statistics for compiled method and that total locks - * count equals to method's invocations. - * Since last assert is pretty strict, test uses -XX:RTMRetryCount=0 in order - * to avoid issue with retriable aborts described in - * {@link TestUseRTMAfterLockInflation}. - */ -public class TestUseRTMLockElidingOption { - - public void runTestCases() throws Throwable { - verifyOption(false); - verifyOption(true); - } - - public void verifyOption(boolean useStackLock) throws Throwable { - AbortProvoker provoker = AbortType.XABORT.provoker(); - String logFileName = String.format("rtm_deopt_%s_stack_lock.xml", - (useStackLock ? "use" : "no")); - String methodOption = String.format("-XX:CompileCommand=option," + - "%s,UseRTMLockEliding", provoker.getMethodWithLockName()); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - logFileName, - provoker, - CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", - useStackLock), - methodOption, - "-XX:RTMTotalCountIncrRate=1", - "-XX:RTMRetryCount=0", - "-XX:+UseRTMDeopt", - "-XX:+PrintPreciseRTMLockingStatistics", - provoker.getClass().getName(), - AbortType.XABORT.toString(), - Boolean.toString(!useStackLock) - ); - - outputAnalyzer.shouldHaveExitValue(0); - - int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName); - - Asserts.assertEQ(firedTraps, 0, - "Method deoptimization with rtm_state_change is unexpected"); - - List statistics = RTMLockingStatistics.fromString( - provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 1, - "VM output should contain exactly one RTM locking " - + "statistics entry for method " - + provoker.getMethodWithLockName()); - - RTMLockingStatistics lock = statistics.get(0); - - Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS, - "Expected to get total locks count equal to total amount of " - + "lock attempts."); - } - - public static void main(String args[]) throws Throwable { - new TestUseRTMLockElidingOption().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java b/test/hotspot/jtreg/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java deleted file mode 100644 index 4223924b9bde3..0000000000000 --- a/test/hotspot/jtreg/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8031320 - * @summary Verify that rtm locking statistics contain proper information - * on overall aborts and locks count and count of aborts of - * different types. Test also verify that VM output does not - * contain rtm locking statistics when it should not. - * @library /test/lib / - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.rtm.cpu & vm.rtm.compiler - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions - * -XX:+WhiteBoxAPI - * compiler.rtm.print.TestPrintPreciseRTMLockingStatistics - */ - - -package compiler.rtm.print; - -import compiler.testlibrary.rtm.AbortProvoker; -import compiler.testlibrary.rtm.AbortType; -import compiler.testlibrary.rtm.RTMLockingStatistics; -import compiler.testlibrary.rtm.RTMTestBase; -import jdk.test.lib.Asserts; -import jdk.test.lib.process.OutputAnalyzer; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -/** - * Test verifies that VM output does not contain RTM locking statistics when it - * should not (when PrintPreciseRTMLockingStatistics is off) and that with - * -XX:+PrintPreciseRTMLockingStatistics locking statistics contains sane - * total locks and aborts count as well as for specific abort types. - */ -public class TestPrintPreciseRTMLockingStatistics { - - public void runTestCases() throws Throwable { - verifyNoStatistics(); - verifyStatistics(); - } - - // verify that VM output does not contain - // rtm locking statistics - private void verifyNoStatistics() throws Throwable { - verifyNoStatistics(AbortType.XABORT); - - verifyNoStatistics(AbortType.XABORT, - "-XX:-PrintPreciseRTMLockingStatistics"); - - verifyNoStatistics(AbortType.XABORT, "-XX:-UseRTMLocking", - "-XX:+PrintPreciseRTMLockingStatistics"); - } - - // verify that rtm locking statistics contain information - // about each type of aborts - private void verifyStatistics() throws Throwable { - verifyAbortsCount(AbortType.XABORT); - verifyAbortsCount(AbortType.MEM_CONFLICT); - verifyAbortsCount(AbortType.BUF_OVERFLOW); - verifyAbortsCount(AbortType.NESTED_ABORT); - } - - private void verifyNoStatistics(AbortType abortProvokerType, - String... vmOpts) throws Throwable { - AbortProvoker provoker = abortProvokerType.provoker(); - List finalVMOpts = new LinkedList<>(); - Collections.addAll(finalVMOpts, vmOpts); - Collections.addAll(finalVMOpts, AbortProvoker.class.getName(), - abortProvokerType.toString()); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(provoker, - finalVMOpts.toArray(new String[finalVMOpts.size()])); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - outputAnalyzer.getOutput()); - - Asserts.assertEQ(statistics.size(), 0, "VM output should not contain " - + "any RTM locking statistics"); - } - - private void verifyAbortsCount(AbortType abortType) throws Throwable { - AbortProvoker provoker = abortType.provoker(); - - OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( - provoker, - "-XX:+PrintPreciseRTMLockingStatistics", - AbortProvoker.class.getName(), - abortType.toString()); - - outputAnalyzer.shouldHaveExitValue(0); - - List statistics = RTMLockingStatistics.fromString( - provoker.getMethodWithLockName(),outputAnalyzer.getOutput()); - - Asserts.assertGT(statistics.size(), 0, "VM output should contain one " - + "rtm locking statistics entry for method " - + provoker.getMethodWithLockName()); - - RTMLockingStatistics lock = statistics.get(0); - - Asserts.assertGT(lock.getTotalAborts(), 0L, - "RTM locking statistics should contain non zero total aborts " - + "count"); - - Asserts.assertGT(lock.getAborts(abortType), 0L, String.format( - "RTM locking statistics should contain non zero aborts count " - + "for abort reason %s", abortType)); - } - - public static void main(String args[]) throws Throwable { - new TestPrintPreciseRTMLockingStatistics().runTestCases(); - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortProvoker.java deleted file mode 100644 index cf74942aadfd2..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortProvoker.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -import jdk.test.lib.Asserts; -import jdk.test.whitebox.WhiteBox; - -import java.util.Objects; -import java.util.concurrent.BrokenBarrierException; -import java.util.concurrent.CyclicBarrier; - -/** - * Base class for different transactional execution abortion - * provokers aimed to force abort due to specified reason. - */ -public abstract class AbortProvoker implements CompilableTest { - public static final long DEFAULT_ITERATIONS = 10000L; - private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); - @SuppressWarnings("unused") - private static int sharedState = 0; - /** - * Inflates monitor associated with object {@code monitor}. - * Inflation is forced by entering the same monitor from - * two different threads. - * - * @param monitor monitor to be inflated. - * @return inflated monitor. - * @throws Exception if something went wrong. - */ - public static Object inflateMonitor(Object monitor) throws Exception { - CyclicBarrier barrier = new CyclicBarrier(2); - - Runnable inflatingRunnable = () -> { - synchronized (monitor) { - try { - barrier.await(); - } catch (BrokenBarrierException | InterruptedException e) { - throw new RuntimeException( - "Synchronization issue occurred.", e); - } - try { - monitor.wait(); - } catch (InterruptedException e) { - throw new AssertionError("The thread waiting on an" - + " inflated monitor was interrupted, thus test" - + " results may be incorrect.", e); - } - } - }; - - Thread t = new Thread(inflatingRunnable); - t.setDaemon(true); - t.start(); - // Wait until thread t enters the monitor. - barrier.await(); - synchronized (monitor) { - // At this point thread t is already waiting on the monitor. - // Modifying static field just to avoid lock's elimination. - sharedState++; - } - verifyMonitorState(monitor, true /* inflated */); - return monitor; - } - - /** - * Verifies that {@code monitor} is a stack-lock or inflated lock depending - * on {@code shouldBeInflated} value. If {@code monitor} is inflated while - * it is expected that it should be a stack-lock, then this method attempts - * to deflate it by forcing a safepoint and then verifies the state once - * again. - * - * @param monitor monitor to be verified. - * @param shouldBeInflated flag indicating whether or not monitor is - * expected to be inflated. - * @throws RuntimeException if the {@code monitor} in a wrong state. - */ - public static void verifyMonitorState(Object monitor, - boolean shouldBeInflated) { - if (!shouldBeInflated && WHITE_BOX.isMonitorInflated(monitor)) { - boolean did_deflation = WHITE_BOX.deflateIdleMonitors(); - Asserts.assertEQ(did_deflation, true, - "deflateIdleMonitors() should have worked."); - } - Asserts.assertEQ(WHITE_BOX.isMonitorInflated(monitor), shouldBeInflated, - "Monitor in a wrong state."); - } - /** - * Verifies that monitor used by the {@code provoker} is a stack-lock or - * inflated lock depending on {@code shouldBeInflated} value. If such - * monitor is inflated while it is expected that it should be a stack-lock, - * then this method attempts to deflate it by forcing a safepoint and then - * verifies the state once again. - * - * @param provoker AbortProvoker whose monitor's state should be verified. - * @param shouldBeInflated flag indicating whether or not monitor is - * expected to be inflated. - * @throws RuntimeException if the {@code monitor} in a wrong state. - */ - public static void verifyMonitorState(AbortProvoker provoker, - boolean shouldBeInflated) { - verifyMonitorState(provoker.monitor, shouldBeInflated); - } - - /** - * Get instance of specified AbortProvoker, inflate associated monitor - * if needed and then invoke forceAbort method in a loop. - * - * Usage: - * AbortProvoker <AbortType name> [<inflate monitor> - * [<iterations> [ <delay>]]] - * - * Default parameters are: - *
    - *
  • inflate monitor = true
  • - *
  • iterations = {@code AbortProvoker.DEFAULT_ITERATIONS}
  • - *
  • delay = 0
  • - *
- */ - public static void main(String args[]) throws Throwable { - Asserts.assertGT(args.length, 0, "At least one argument is required."); - - AbortType abortType = AbortType.lookup(Integer.valueOf(args[0])); - boolean monitorShouldBeInflated = true; - long iterations = AbortProvoker.DEFAULT_ITERATIONS; - - if (args.length > 1) { - monitorShouldBeInflated = Boolean.valueOf(args[1]); - - if (args.length > 2) { - iterations = Long.valueOf(args[2]); - - if (args.length > 3) { - Thread.sleep(Integer.valueOf(args[3])); - } - } - } - - AbortProvoker provoker = abortType.provoker(); - - if (monitorShouldBeInflated) { - provoker.inflateMonitor(); - } - - for (long i = 0; i < iterations; i++) { - AbortProvoker.verifyMonitorState(provoker, monitorShouldBeInflated); - provoker.forceAbort(); - } - } - - protected final Object monitor; - - protected AbortProvoker() { - this(new Object()); - } - - protected AbortProvoker(Object monitor) { - this.monitor = Objects.requireNonNull(monitor); - } - - /** - * Inflates monitor used by this AbortProvoker instance. - * @throws Exception - */ - public void inflateMonitor() throws Exception { - AbortProvoker.inflateMonitor(monitor); - } - - /** - * Forces transactional execution abortion. - */ - public abstract void forceAbort(); - - /** - * Returns names of all methods that have to be compiled - * in order to successfully force transactional execution - * abortion. - * - * @return array with methods' names that have to be compiled. - */ - @Override - public String[] getMethodsToCompileNames() { - return new String[] { getMethodWithLockName() }; - } - - /** - * Returns name of the method that will contain monitor whose locking - * will be elided using transactional execution. - * - * @return name of the method that will contain elided lock. - */ - @Override - public String getMethodWithLockName() { - return this.getClass().getName() + "::forceAbort"; - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortType.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortType.java deleted file mode 100644 index dd439111afa4c..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortType.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -import jdk.test.lib.Asserts; - -import java.util.HashMap; -import java.util.Map; - -/** - * Type of transactional execution abort. - * For more details on different abort types please see - * shared/vm/runtime/rtmLocking.hpp - */ -public enum AbortType { - XABORT(0), - RETRIABLE(1), - MEM_CONFLICT(2), - BUF_OVERFLOW(3), - DEBUG_BREAKPOINT(4), - NESTED_ABORT(5); - - private final int type; - private static final Map LOOKUP_MAP = new HashMap<>(); - - static { - for (AbortType abortType : AbortType.values()) { - Asserts.assertFalse(LOOKUP_MAP.containsKey(abortType.type), - "Abort type values should be unique."); - LOOKUP_MAP.put(abortType.type, abortType); - } - } - - private AbortType(int type) { - this.type = type; - } - - /** - * Returns AbortProvoker for aborts represented by this abort type. - * - * @return an AbortProvoker instance - */ - public AbortProvoker provoker() { - return AbortType.createNewProvoker(this); - } - - public static AbortType lookup(int type) { - Asserts.assertLT(type, AbortType.values().length, - "Unknown abort type."); - return LOOKUP_MAP.get(type); - } - - /** - * Returns transaction execution abort provoker for specified abortion type. - * - * @param type a type of abort which will be forced by returned - * AbortProvoker instance. - * @return AbortProvoker instance that will force abort of specified type - * @throws RuntimeException if there is no provoker for specified type - */ - private static AbortProvoker createNewProvoker(AbortType type) { - switch (type) { - case XABORT: - return new XAbortProvoker(); - case MEM_CONFLICT: - return new MemoryConflictProvoker(); - case BUF_OVERFLOW: - return new BufferOverflowProvoker(); - case NESTED_ABORT: - return new NestedAbortProvoker(); - default: - throw new RuntimeException("No provoker exists for type " - + type.name()); - } - } - - @Override - public String toString() { - return Integer.toString(type); - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/BufferOverflowProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/BufferOverflowProvoker.java deleted file mode 100644 index 6a3ab4e35aa1b..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/BufferOverflowProvoker.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -/** - * In order to provoke transactional execution abort due to - * internal's buffer overflow BufferOverflowProvoker modifies - * 1MB of BYTES during single transaction. - */ -class BufferOverflowProvoker extends AbortProvoker { - /** - * To force buffer overflow abort we modify memory region with - * size more then L1d cache size. - */ - private static final int MORE_THAN_L1D_SIZE = 1024 * 1024; - private static final byte[] DATA = new byte[MORE_THAN_L1D_SIZE]; - - @Override - public void forceAbort() { - synchronized(monitor) { - for (int i = 0; i < BufferOverflowProvoker.DATA.length; i++) { - BufferOverflowProvoker.DATA[i]++; - } - } - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/BusyLock.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/BusyLock.java deleted file mode 100644 index 79120a64136f7..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/BusyLock.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -import java.util.concurrent.BrokenBarrierException; -import java.util.concurrent.CyclicBarrier; - -/** - * Test case for busy lock scenario. - * One thread enters the monitor and sleep for a while. - * Another thread is blocked on the same monitor. - */ -public class BusyLock implements CompilableTest, Runnable { - private static final int DEFAULT_TIMEOUT = 1000; - private final CyclicBarrier barrier; - - // Following field have to be static in order to avoid escape analysis. - @SuppressWarnings("UnsuedDeclaration") - private static int field = 0; - protected final Object monitor; - protected final int timeout; - - public BusyLock() { - this(BusyLock.DEFAULT_TIMEOUT); - } - - public BusyLock(int timeout) { - this.timeout = timeout; - this.monitor = new Object(); - this.barrier = new CyclicBarrier(2); - } - - @Override - public void run() { - try { - synchronized (monitor) { - barrier.await(); - Thread.sleep(timeout); - } - } catch (InterruptedException | BrokenBarrierException e) { - throw new RuntimeException("Synchronization error happened.", e); - } - } - - public void syncAndTest() { - try { - // wait until monitor is locked by a ::run method - barrier.await(); - } catch (InterruptedException | BrokenBarrierException e) { - throw new RuntimeException("Synchronization error happened.", e); - } - test(); - } - - public void test() { - synchronized(monitor) { - BusyLock.field++; - } - } - - @Override - public String getMethodWithLockName() { - return this.getClass().getName() + "::test"; - } - - @Override - public String[] getMethodsToCompileNames() { - return new String[] { getMethodWithLockName() }; - } - - /** - * Usage: - * BusyLock [ <inflate monitor> [ <timeout> ] ] - * - * Default values are: - *
    - *
  • inflate monitor = {@code true}
  • - *
  • timeout = {@code BusyLock.DEFAULT_TIMEOUT}
  • - *
- */ - public static void main(String args[]) throws Exception { - int timeoutValue = BusyLock.DEFAULT_TIMEOUT; - boolean inflateMonitor = true; - - if (args.length > 0 ) { - inflateMonitor = Boolean.valueOf(args[0]); - - if (args.length > 1) { - timeoutValue = Integer.valueOf(args[1]); - } - } - - BusyLock busyLock = new BusyLock(timeoutValue); - - if (inflateMonitor) { - AbortProvoker.inflateMonitor(busyLock.monitor); - } - - Thread t = new Thread(busyLock); - t.start(); - busyLock.syncAndTest(); - t.join(); - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/CompilableTest.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/CompilableTest.java deleted file mode 100644 index da701fa30a65d..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/CompilableTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -/** - * Interface for test scenarios that contain methods - * that should be compiled. - */ -public interface CompilableTest { - /** - * @return array with methods' names that should be compiled. - */ - String[] getMethodsToCompileNames(); - - /** - * @return name of method with RTM-elided lock. - */ - String getMethodWithLockName(); -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/MemoryConflictProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/MemoryConflictProvoker.java deleted file mode 100644 index 7926c9e23b45b..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/MemoryConflictProvoker.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -import java.util.concurrent.BrokenBarrierException; -import java.util.concurrent.CyclicBarrier; - -/** - * To force transactional execution abort due to memory conflict - * one thread should access memory region from transactional region - * while another thread should modify the same memory region. - * Since this scenario is based on the race condition between threads - * you should not expect some particular amount of aborts. - */ -class MemoryConflictProvoker extends AbortProvoker { - // Following field have to be static in order to avoid escape analysis. - @SuppressWarnings("UnsuedDeclaration") - private static int field = 0; - private static final int INNER_ITERATIONS = 10000; - private final CyclicBarrier barrier; - /** - * This thread will access and modify memory region - * from outside of the transaction. - */ - private final Runnable conflictingThread; - - public MemoryConflictProvoker() { - this(new Object()); - } - - public MemoryConflictProvoker(Object monitor) { - super(monitor); - barrier = new CyclicBarrier(2); - conflictingThread = () -> { - try { - barrier.await(); - } catch (Exception e) { - throw new RuntimeException(e); - } - for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) { - MemoryConflictProvoker.field++; - } - }; - } - - /** - * Accesses and modifies memory region from within the transaction. - */ - public void transactionalRegion() { - for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) { - synchronized(monitor) { - MemoryConflictProvoker.field--; - } - } - } - - @Override - public void forceAbort() { - try { - Thread t = new Thread(conflictingThread); - t.start(); - try { - barrier.await(); - } catch (InterruptedException | BrokenBarrierException e) { - throw new RuntimeException(e); - } - transactionalRegion(); - t.join(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public String getMethodWithLockName() { - return this.getClass().getName() + "::transactionalRegion"; - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/NestedAbortProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/NestedAbortProvoker.java deleted file mode 100644 index 7123f2d562f66..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/NestedAbortProvoker.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -import java.util.Arrays; - -/** - * In order to force nested transaction abort NestedAbortProvoker - * invoke BufferOverflowProvoker from transactional region. - */ -class NestedAbortProvoker extends AbortProvoker { - // Following field have to be static in order to avoid escape analysis. - @SuppressWarnings("UnsuedDeclaration") - private static int field = 0; - private final AbortProvoker nestedAbortProvoker; - - public NestedAbortProvoker() { - this.nestedAbortProvoker = new XAbortProvoker(monitor); - } - - @Override - public void forceAbort() { - synchronized(monitor) { - NestedAbortProvoker.field++; - nestedAbortProvoker.forceAbort(); - NestedAbortProvoker.field--; - } - } - - @Override - public String[] getMethodsToCompileNames() { - String nestedProvokerMethods[] - = nestedAbortProvoker.getMethodsToCompileNames(); - String methods[] = Arrays.copyOf(nestedProvokerMethods, - nestedProvokerMethods.length + 1); - methods[methods.length - 1] = getMethodWithLockName(); - return methods; - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMLockingStatistics.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMLockingStatistics.java deleted file mode 100644 index 351b1a96bd83a..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMLockingStatistics.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -import java.util.EnumMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Wrapper for +UsePreciseRTMLockingStatistics output. - * - * Example of locking statistics: - * - * java/lang/ClassLoader.loadClass@7 - * # rtm locks total (estimated): 6656 - * # rtm lock aborts (total): 10000 - * # rtm lock aborts 0 (abort instruction ): 9999 - * # rtm lock aborts 1 (may succeed on retry): 9999 - * # rtm lock aborts 2 (thread conflict ): 0 - * # rtm lock aborts 3 (buffer overflow ): 1 - * # rtm lock aborts 4 (debug or trap hit ): 0 - * # rtm lock aborts 5 (maximum nested depth): 0 - */ -public class RTMLockingStatistics { - /** - * Pattern for aborts per abort type entries. - */ - private static final Pattern ABORT_PATTERN; - - /** - * Pattern for whole statistics. - */ - private static final Pattern RTM_LOCKING_STATISTICS_PATTERN; - - static { - String abortRe - = "# rtm lock aborts\\s+(?[0-9]+)\\s+\\([a-z\\s]+\\):\\s(?[0-9]+)"; - - ABORT_PATTERN = Pattern.compile(abortRe); - RTM_LOCKING_STATISTICS_PATTERN = Pattern.compile( - "(?[^.\n]+)\\." + - "(?[^@\n]+)@(?[0-9]+)\n" + - "# rtm locks total \\(estimated\\):\\s*" + - "(?[0-9]+)\n" + - "# rtm lock aborts\\s+\\(total\\):\\s*(?[0-9]+)\n" + - "(?(" + abortRe + "\n)+)"); - } - - private final long totalLocks; - private final long totalAborts; - private final String className; - private final String methodName; - private final int bci; - private final Map aborts = new EnumMap<>(AbortType.class); - - /** - * Constructs RTMLockingStatistics from matcher captured statistics entry. - * @param matcher Matcher captured statistics entry. - */ - private RTMLockingStatistics(Matcher matcher) { - className = matcher.group("className"); - methodName = matcher.group("methodName"); - bci = Integer.valueOf(matcher.group("bci")); - totalLocks = Long.valueOf(matcher.group("totalLocks")); - totalAborts = Long.valueOf(matcher.group("totalAborts")); - - Matcher abortMatcher = ABORT_PATTERN.matcher(matcher. - group("abortStats")); - - while (abortMatcher.find()) { - int type = Integer.valueOf(abortMatcher.group("type")); - long count = Long.valueOf(abortMatcher.group("count")); - setAborts(AbortType.lookup(type), count); - } - } - - - /** - * Parses string and return all founded RTM locking statistics entries. - * - * @param str the string to be parsed. - * @return list with all founded RTM locking statistics entries or - * empty list if nothing was found. - */ - public static List fromString(String str) { - List statistics = new LinkedList<>(); - Matcher matcher = RTM_LOCKING_STATISTICS_PATTERN.matcher(str); - - while (matcher.find()) { - RTMLockingStatistics lock = new RTMLockingStatistics(matcher); - statistics.add(lock); - } - - return statistics; - } - - /** - * Parses string and return all founded RTM locking statistics entries - * for locks in method {@code methodName}. - * - * @param methodName a name of the method for locks from which statistics - * should be gathered. - * @param str the string to be parsed. - * @return list with all founded RTM locking statistics entries or - * empty list if nothing was found. - */ - public static List fromString(String methodName, - String str) { - String formattedMethodName = formatMethodName(methodName); - - List statisticsForMethod = new LinkedList<>(); - for (RTMLockingStatistics statistics : fromString(str)) { - if (statistics.getLockName().startsWith(formattedMethodName)) { - statisticsForMethod.add(statistics); - } - } - return statisticsForMethod; - } - - /** - * Formats method's name so it will have the same format as - * in rtm locking statistics. - * - *
-     * Example:
-     * com/example/Klass::method => com/example/Klass.method
-     * com/example/Klass.method  => com/example/Klass.method
-     * com.example.Klass::method => com/example/Klass.method
-     * com.example.Klass.method  => com/example/Klass.method
-     * 
- * - * @param methodName method's name that should be formatted. - * @return formatted method's name. - */ - private static String formatMethodName(String methodName) { - String m[]; - if (methodName.contains("::")) { - m = methodName.split("::"); - } else { - int splitAt = methodName.lastIndexOf('.'); - m = new String[2]; - m[0] = methodName.substring(0, splitAt); - m[1] = methodName.substring(splitAt + 1); - } - return String.format("%s.%s", m[0].replaceAll("\\.", "/"), m[1]); - } - - /** - * Returns name of lock for which this statistics was collected. - * Lock name has following format: - * <class name>.<method name>@<bci> - * - * @return name of lock. - */ - public String getLockName() { - return String.format("%s.%s@%d", className, methodName, bci); - } - - /** - * Returns aborts count for specified abort type. - * - * @param type an abort type. - * @return count of aborts. - */ - public long getAborts(AbortType type) { - return aborts.getOrDefault(type, 0L); - } - - /** - * Sets aborts count for specified abort type. - * - * @param type an abort type. - * @param count count of aborts. - */ - public void setAborts(AbortType type, long count) { - aborts.put(type, count); - } - - public long getTotalLocks() { - return totalLocks; - } - - public long getTotalAborts() { - return totalAborts; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append(getLockName()).append('\n'); - builder.append(String.format("# rtm locks total (estimated): %d\n", - getTotalLocks())); - builder.append(String.format("# rtm lock aborts: %d\n", - getTotalLocks())); - - for (AbortType type : AbortType.values()) { - builder.append(String.format("# rtm lock aborts %s %d\n", - type.toString(), getAborts(type))); - } - return builder.toString(); - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMTestBase.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMTestBase.java deleted file mode 100644 index b6535e65428c3..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMTestBase.java +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.process.ProcessTools; -import jdk.test.lib.Utils; -import jdk.test.lib.cli.CommandLineOptionTest; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Auxiliary methods used for RTM testing. - */ -public class RTMTestBase { - private static final String RTM_STATE_CHANGE_REASON = "rtm_state_change"; - /** - * We don't parse compilation log as XML-document and use regular - * expressions instead, because in some cases it could be - * malformed. - */ - private static final String FIRED_UNCOMMON_TRAP_PATTERN_TEMPLATE - = "rtm_state_change - * installed during compilation. - * - * @param compilationLogFile a path to file with LogCompilation output. - * @return count of installed uncommon traps with reason - * rtm_state_change. - * @throws IOException - */ - public static int installedRTMStateChangeTraps(String compilationLogFile) - throws IOException { - return RTMTestBase.installedUncommonTraps(compilationLogFile, - RTMTestBase.RTM_STATE_CHANGE_REASON); - } - - /** - * Finds count of fired uncommon traps with reason {@code reason}. - * - * @param compilationLogFile a path to file with LogCompilation output. - * @param reason a reason of fired uncommon traps. - * @return count of fired uncommon traps with reason {@code reason}. - * @throws IOException - */ - public static int firedUncommonTraps(String compilationLogFile, - String reason) throws IOException { - String pattern = String.format( - RTMTestBase.FIRED_UNCOMMON_TRAP_PATTERN_TEMPLATE, - reason); - return RTMTestBase.findTraps(compilationLogFile, pattern); - } - - /** - * Finds count of fired uncommon traps with reason rtm_state_change. - * - * @param compilationLogFile a path to file with LogCompilation output. - * @return count of fired uncommon traps with reason - * rtm_state_change. - * @throws IOException - */ - public static int firedRTMStateChangeTraps(String compilationLogFile) - throws IOException { - return RTMTestBase.firedUncommonTraps(compilationLogFile, - RTMTestBase.RTM_STATE_CHANGE_REASON); - } - - /** - * Finds count of uncommon traps that matches regular - * expression in {@code re}. - * - * @param compilationLogFile a path to file with LogCompilation output. - * @param re regular expression to match uncommon traps. - * @throws IOException - */ - private static int findTraps(String compilationLogFile, String re) - throws IOException { - String compilationLog = RTMTestBase.fileAsString(compilationLogFile); - Pattern pattern = Pattern.compile(re); - Matcher matcher = pattern.matcher(compilationLog); - int traps = 0; - while (matcher.find()) { - traps++; - } - return traps; - } - - /** - * Returns file's content as a string. - * - * @param path a path to file to operate on. - * @return string with content of file. - * @throws IOException - */ - private static String fileAsString(String path) throws IOException { - byte[] fileAsBytes = Files.readAllBytes(Paths.get(path)); - return new String(fileAsBytes); - } - - /** - * Prepares VM options for test execution. - * This method get test java options, filter out all RTM-related options, - * adds CompileCommand=compileonly,method_name options for each method - * from {@code methodToCompile} and finally appends all {@code vmOpts}. - * - * @param test test case whose methods that should be compiled. - * If {@code null} then no additional compileonly - * commands will be added to VM options. - * @param vmOpts additional options to pass to VM. - * @return Array with VM options. - */ - private static String[] prepareTestOptions(CompilableTest test, - String... vmOpts) { - return RTMTestBase.prepareFilteredTestOptions(test, null, vmOpts); - } - - /** - * Prepares VM options for test execution. - * This method get test java options, filter out all RTM-related options - * and all options that matches regexps in {@code additionalFilters}, - * adds CompileCommand=compileonly,method_name options for each method - * from {@code methodToCompile} and finally appends all {@code vmOpts}. - * - * @param test test case whose methods that should be compiled. - * If {@code null} then no additional compileonly - * commands will be added to VM options. - * @param additionalFilters array with regular expression that will be - * used to filter out test java options. - * If {@code null} then no additional filters - * will be used. - * @param vmOpts additional options to pass to VM. - * @return array with VM options. - */ - private static String[] prepareFilteredTestOptions(CompilableTest test, - String[] additionalFilters, String... vmOpts) { - List finalVMOpts = new LinkedList<>(); - String[] filters; - - if (additionalFilters != null) { - filters = Arrays.copyOf(additionalFilters, - additionalFilters.length + 1); - } else { - filters = new String[1]; - } - - filters[filters.length - 1] = "RTM"; - String[] filteredVMOpts = Utils.getFilteredTestJavaOpts(filters); - Collections.addAll(finalVMOpts, filteredVMOpts); - Collections.addAll(finalVMOpts, "-Xcomp", "-server", - "-XX:-TieredCompilation", "-XX:+UseRTMLocking", - CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, - CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, - "-Xbootclasspath/a:.", "-XX:+WhiteBoxAPI", - "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED"); - - if (test != null) { - for (String method : test.getMethodsToCompileNames()) { - finalVMOpts.add("-XX:CompileCommand=compileonly," + method); - } - } - Collections.addAll(finalVMOpts, vmOpts); - return finalVMOpts.toArray(new String[finalVMOpts.size()]); - } - - /** - * Adds additional options for VM required for successful execution of test. - * - * @param logFileName a name of compilation log file - * @param test a test case to execute - * @param options additional options to VM - * @return an array with VM options - */ - private static String[] prepareTestOptions(String logFileName, - CompilableTest test, String... options) { - String[] preparedOptions = RTMTestBase.prepareFilteredTestOptions( - test, - new String[] { - "LogCompilation", - "LogFile" - }); - List updatedOptions = new LinkedList<>(); - Collections.addAll(updatedOptions, preparedOptions); - Collections.addAll(updatedOptions, - "-XX:+LogCompilation", - "-XX:LogFile=" + logFileName); - Collections.addAll(updatedOptions, options); - - return updatedOptions.toArray(new String[updatedOptions.size()]); - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/XAbortProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/XAbortProvoker.java deleted file mode 100644 index 23b7b7792881f..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/XAbortProvoker.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package compiler.testlibrary.rtm; - -/** - * Current RTM locking implementation force transaction abort - * before native method call by explicit xabort(0) call. - */ -public class XAbortProvoker extends AbortProvoker { - - static { - try { - System.loadLibrary("XAbortProvoker"); - } catch (UnsatisfiedLinkError e) { - System.out.println("Could not load native library: " + e); - } - } - - public native int doAbort(); - - // Following field have to be static in order to avoid escape analysis. - @SuppressWarnings("UnsuedDeclaration") - private static int field = 0; - - public XAbortProvoker() { - this(new Object()); - } - - public XAbortProvoker(Object monitor) { - super(monitor); - } - - @Override - public void forceAbort() { - synchronized(monitor) { - XAbortProvoker.field = doAbort(); - } - } - - @Override - public String[] getMethodsToCompileNames() { - return new String[] { - getMethodWithLockName(), - XAbortProvoker.class.getName() + "::doAbort" - }; - } -} diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/libXAbortProvoker.c b/test/hotspot/jtreg/compiler/testlibrary/rtm/libXAbortProvoker.c deleted file mode 100644 index b87882771d4a3..0000000000000 --- a/test/hotspot/jtreg/compiler/testlibrary/rtm/libXAbortProvoker.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include "jni.h" - -/** - * Simply calling a JNI method from the JVM will abort any active transaction, - * so doAbort() does nothing special and only returns after being called. - * The transaction abortion happens right before the JNI method is called. - */ -JNIEXPORT int JNICALL -Java_compiler_testlibrary_rtm_XAbortProvoker_doAbort(JNIEnv *env, jobject o) { - return 0; -} From 3a01b47ac97714608356ce3faf797c37dc63e9af Mon Sep 17 00:00:00 2001 From: David Holmes Date: Tue, 11 Jun 2024 01:05:19 +0000 Subject: [PATCH 017/471] 8330205: Initial troff manpage generation for JDK 24 Reviewed-by: alanb, iris --- src/java.base/share/man/java.1 | 2 +- src/java.base/share/man/keytool.1 | 6 +++--- src/java.rmi/share/man/rmiregistry.1 | 2 +- src/java.scripting/share/man/jrunscript.1 | 2 +- src/jdk.compiler/share/man/javac.1 | 4 ++-- src/jdk.compiler/share/man/serialver.1 | 2 +- src/jdk.hotspot.agent/share/man/jhsdb.1 | 2 +- src/jdk.httpserver/share/man/jwebserver.1 | 2 +- src/jdk.jartool/share/man/jar.1 | 2 +- src/jdk.jartool/share/man/jarsigner.1 | 2 +- src/jdk.javadoc/share/man/javadoc.1 | 21 ++++++++++----------- src/jdk.jcmd/share/man/jcmd.1 | 2 +- src/jdk.jcmd/share/man/jinfo.1 | 2 +- src/jdk.jcmd/share/man/jmap.1 | 2 +- src/jdk.jcmd/share/man/jps.1 | 2 +- src/jdk.jcmd/share/man/jstack.1 | 2 +- src/jdk.jcmd/share/man/jstat.1 | 2 +- src/jdk.jconsole/share/man/jconsole.1 | 2 +- src/jdk.jdeps/share/man/javap.1 | 2 +- src/jdk.jdeps/share/man/jdeprscan.1 | 2 +- src/jdk.jdeps/share/man/jdeps.1 | 2 +- src/jdk.jdi/share/man/jdb.1 | 2 +- src/jdk.jfr/share/man/jfr.1 | 2 +- src/jdk.jlink/share/man/jlink.1 | 2 +- src/jdk.jlink/share/man/jmod.1 | 2 +- src/jdk.jpackage/share/man/jpackage.1 | 2 +- src/jdk.jshell/share/man/jshell.1 | 2 +- src/jdk.jstatd/share/man/jstatd.1 | 2 +- 28 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/java.base/share/man/java.1 b/src/java.base/share/man/java.1 index 05b1ec6cdd87c..4bd0306b2b804 100644 --- a/src/java.base/share/man/java.1 +++ b/src/java.base/share/man/java.1 @@ -36,7 +36,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JAVA" "1" "2024" "JDK 24" "JDK Commands" +.TH "JAVA" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/java.base/share/man/keytool.1 b/src/java.base/share/man/keytool.1 index a61095d45048c..63a134eb932cc 100644 --- a/src/java.base/share/man/keytool.1 +++ b/src/java.base/share/man/keytool.1 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. +.\" Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. .\" .\" This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "KEYTOOL" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "KEYTOOL" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP @@ -1747,7 +1747,7 @@ risk. The \f[V]keytool\f[R] command supports these named extensions. The names aren\[aq]t case-sensitive. .TP -\f[V]BC\f[R] or \f[V]BasicContraints\f[R] +\f[V]BC\f[R] or \f[V]BasicConstraints\f[R] Values: .RS .PP diff --git a/src/java.rmi/share/man/rmiregistry.1 b/src/java.rmi/share/man/rmiregistry.1 index 29a2e2c965aa9..c168e1482a6f3 100644 --- a/src/java.rmi/share/man/rmiregistry.1 +++ b/src/java.rmi/share/man/rmiregistry.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "RMIREGISTRY" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "RMIREGISTRY" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/java.scripting/share/man/jrunscript.1 b/src/java.scripting/share/man/jrunscript.1 index 43029582b3ea4..59389c274d1ea 100644 --- a/src/java.scripting/share/man/jrunscript.1 +++ b/src/java.scripting/share/man/jrunscript.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JRUNSCRIPT" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JRUNSCRIPT" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.compiler/share/man/javac.1 b/src/jdk.compiler/share/man/javac.1 index de374e7d0c7d6..ebee036923849 100644 --- a/src/jdk.compiler/share/man/javac.1 +++ b/src/jdk.compiler/share/man/javac.1 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1994, 2024, Oracle and/or its affiliates. All rights reserved. +.\" Copyright (c) 1994, 2023, Oracle and/or its affiliates. All rights reserved. .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. .\" .\" This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JAVAC" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JAVAC" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.compiler/share/man/serialver.1 b/src/jdk.compiler/share/man/serialver.1 index cd437b7e9bf3e..bad14872ee6d0 100644 --- a/src/jdk.compiler/share/man/serialver.1 +++ b/src/jdk.compiler/share/man/serialver.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "SERIALVER" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "SERIALVER" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.hotspot.agent/share/man/jhsdb.1 b/src/jdk.hotspot.agent/share/man/jhsdb.1 index 30b2d3fe95c82..5b65f7eafb465 100644 --- a/src/jdk.hotspot.agent/share/man/jhsdb.1 +++ b/src/jdk.hotspot.agent/share/man/jhsdb.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JHSDB" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JHSDB" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.httpserver/share/man/jwebserver.1 b/src/jdk.httpserver/share/man/jwebserver.1 index 3c48d81fc9cba..4fbaf9dd09dc2 100644 --- a/src/jdk.httpserver/share/man/jwebserver.1 +++ b/src/jdk.httpserver/share/man/jwebserver.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JWEBSERVER" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JWEBSERVER" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jartool/share/man/jar.1 b/src/jdk.jartool/share/man/jar.1 index 49a028e0f293b..2d983eb561e3b 100644 --- a/src/jdk.jartool/share/man/jar.1 +++ b/src/jdk.jartool/share/man/jar.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JAR" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JAR" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jartool/share/man/jarsigner.1 b/src/jdk.jartool/share/man/jarsigner.1 index ea8f686a4c84d..d085efcfcd079 100644 --- a/src/jdk.jartool/share/man/jarsigner.1 +++ b/src/jdk.jartool/share/man/jarsigner.1 @@ -36,7 +36,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JARSIGNER" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JARSIGNER" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.javadoc/share/man/javadoc.1 b/src/jdk.javadoc/share/man/javadoc.1 index 73d12efbf30f2..4e256a7ce38b2 100644 --- a/src/jdk.javadoc/share/man/javadoc.1 +++ b/src/jdk.javadoc/share/man/javadoc.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JAVADOC" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JAVADOC" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP @@ -218,7 +218,7 @@ summary is required. For more explicit control in any individual documentation comment, enclose the contents of the first sentence in a \f[V]{\[at]summary ...}\f[R] tag, or when applicable, in a -\[ga]{\[at]return ...} tag. +\f[V]{\[at]return ...}\f[R] tag. .RE .TP \f[V]-doclet\f[R] \f[I]class\f[R] @@ -522,7 +522,8 @@ Allow JavaScript in documentation comments, and options whose value is \f[I]html-code\f[R]. .TP \f[V]-author\f[R] -Includes the \f[V]\[at]author\f[R] text in the generated docs. +Includes the text of any \f[V]author\f[R] tags in the generated +documentation. .TP \f[V]-bottom\f[R] \f[I]html-code\f[R] Specifies the text to be placed at the bottom of each generated page. @@ -986,8 +987,8 @@ is used. .RE .TP \f[V]-nosince\f[R] -Omits from the generated documents the \f[V]Since\f[R] sections -associated with the \f[V]\[at]since\f[R] tags. +Omits from the generated documentation the \f[V]Since\f[R] sections +derived from any \f[V]since\f[R] tags. .TP \f[V]-notimestamp\f[R] Suppresses the time stamp, which is hidden in an HTML comment in the @@ -1020,9 +1021,6 @@ to the current working directory. .PP The file may be an HTML file, with a filename ending in \f[V].html\f[R], or a Markdown file, with a filename ending in \f[V].md\f[R]. -.PD 0 -.P -.PD If the file is an HTML file, the content for the overview documentation is taken from the \f[V]
\f[R] element in the file, if one is present, or from the \f[V]\f[R] element is there is no @@ -1213,10 +1211,11 @@ To access the generated Use page, go to the class or package and click the \f[B]USE\f[R] link in the navigation bar. .TP \f[V]-version\f[R] -Includes the version text in the generated docs. +Includes the text of any \f[V]version\f[R] tags in the generated +documentation. This text is omitted by default. -To find out what version of the \f[V]javadoc\f[R] tool you are using, -use the \f[V]--version\f[R] option (with two hyphens). +Note: To find out what version of the \f[V]javadoc\f[R] tool you are +using, use the \f[V]--version\f[R] option (with two hyphens). .TP \f[V]-windowtitle\f[R] \f[I]title\f[R] Specifies the title to be placed in the HTML \f[V]\f[R] tag. diff --git a/src/jdk.jcmd/share/man/jcmd.1 b/src/jdk.jcmd/share/man/jcmd.1 index c88d2a22a4134..2befaf5a94993 100644 --- a/src/jdk.jcmd/share/man/jcmd.1 +++ b/src/jdk.jcmd/share/man/jcmd.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JCMD" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JCMD" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jcmd/share/man/jinfo.1 b/src/jdk.jcmd/share/man/jinfo.1 index fc87807c6fec0..49d8a85263373 100644 --- a/src/jdk.jcmd/share/man/jinfo.1 +++ b/src/jdk.jcmd/share/man/jinfo.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JINFO" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JINFO" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jcmd/share/man/jmap.1 b/src/jdk.jcmd/share/man/jmap.1 index 4865f43d1c4cd..42831aa68acf5 100644 --- a/src/jdk.jcmd/share/man/jmap.1 +++ b/src/jdk.jcmd/share/man/jmap.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JMAP" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JMAP" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jcmd/share/man/jps.1 b/src/jdk.jcmd/share/man/jps.1 index be506be2e8209..cbc69872b607b 100644 --- a/src/jdk.jcmd/share/man/jps.1 +++ b/src/jdk.jcmd/share/man/jps.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JPS" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JPS" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jcmd/share/man/jstack.1 b/src/jdk.jcmd/share/man/jstack.1 index 9effcb0902f57..933db5fc80db5 100644 --- a/src/jdk.jcmd/share/man/jstack.1 +++ b/src/jdk.jcmd/share/man/jstack.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JSTACK" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JSTACK" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jcmd/share/man/jstat.1 b/src/jdk.jcmd/share/man/jstat.1 index dd7d383290896..22e111a812beb 100644 --- a/src/jdk.jcmd/share/man/jstat.1 +++ b/src/jdk.jcmd/share/man/jstat.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JSTAT" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JSTAT" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jconsole/share/man/jconsole.1 b/src/jdk.jconsole/share/man/jconsole.1 index ce1f948e6f160..ec70040acf4e8 100644 --- a/src/jdk.jconsole/share/man/jconsole.1 +++ b/src/jdk.jconsole/share/man/jconsole.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JCONSOLE" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JCONSOLE" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jdeps/share/man/javap.1 b/src/jdk.jdeps/share/man/javap.1 index f9ec998e0af83..27b0a29d0ba10 100644 --- a/src/jdk.jdeps/share/man/javap.1 +++ b/src/jdk.jdeps/share/man/javap.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JAVAP" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JAVAP" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jdeps/share/man/jdeprscan.1 b/src/jdk.jdeps/share/man/jdeprscan.1 index ac850cf78de11..fc13f05c4496e 100644 --- a/src/jdk.jdeps/share/man/jdeprscan.1 +++ b/src/jdk.jdeps/share/man/jdeprscan.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JDEPRSCAN" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JDEPRSCAN" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jdeps/share/man/jdeps.1 b/src/jdk.jdeps/share/man/jdeps.1 index 53891441665d0..d3dde37e3b9b7 100644 --- a/src/jdk.jdeps/share/man/jdeps.1 +++ b/src/jdk.jdeps/share/man/jdeps.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JDEPS" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JDEPS" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jdi/share/man/jdb.1 b/src/jdk.jdi/share/man/jdb.1 index 530c9bed6a118..88097ffeae4bc 100644 --- a/src/jdk.jdi/share/man/jdb.1 +++ b/src/jdk.jdi/share/man/jdb.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JDB" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JDB" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jfr/share/man/jfr.1 b/src/jdk.jfr/share/man/jfr.1 index c6a568582c09b..71a487f558ed2 100644 --- a/src/jdk.jfr/share/man/jfr.1 +++ b/src/jdk.jfr/share/man/jfr.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JFR" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JFR" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jlink/share/man/jlink.1 b/src/jdk.jlink/share/man/jlink.1 index 1a0b79a39c1ab..9f4bf38ffa580 100644 --- a/src/jdk.jlink/share/man/jlink.1 +++ b/src/jdk.jlink/share/man/jlink.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JLINK" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JLINK" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jlink/share/man/jmod.1 b/src/jdk.jlink/share/man/jmod.1 index b26685615ed4c..4475505e524a2 100644 --- a/src/jdk.jlink/share/man/jmod.1 +++ b/src/jdk.jlink/share/man/jmod.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JMOD" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JMOD" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jpackage/share/man/jpackage.1 b/src/jdk.jpackage/share/man/jpackage.1 index f98482000592f..13d9c41c31d6a 100644 --- a/src/jdk.jpackage/share/man/jpackage.1 +++ b/src/jdk.jpackage/share/man/jpackage.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JPACKAGE" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JPACKAGE" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jshell/share/man/jshell.1 b/src/jdk.jshell/share/man/jshell.1 index 28160bb49fd91..6f478e57442a0 100644 --- a/src/jdk.jshell/share/man/jshell.1 +++ b/src/jdk.jshell/share/man/jshell.1 @@ -36,7 +36,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JSHELL" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JSHELL" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP diff --git a/src/jdk.jstatd/share/man/jstatd.1 b/src/jdk.jstatd/share/man/jstatd.1 index cbbaeaf49f292..4bd90104624b1 100644 --- a/src/jdk.jstatd/share/man/jstatd.1 +++ b/src/jdk.jstatd/share/man/jstatd.1 @@ -35,7 +35,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "JSTATD" "1" "2024" "JDK 23-ea" "JDK Commands" +.TH "JSTATD" "1" "2025" "JDK 24-ea" "JDK Commands" .hy .SH NAME .PP From 41c88bc395ab8c927bcafca9dc6c8a77de72dfc7 Mon Sep 17 00:00:00 2001 From: Jaikiran Pai <jpai@openjdk.org> Date: Tue, 11 Jun 2024 03:48:03 +0000 Subject: [PATCH 018/471] 8333756: java/lang/instrument/NativeMethodPrefixApp.java failed due to missing intrinsic Reviewed-by: amenkov, cjplummer --- test/jdk/java/lang/instrument/NativeMethodPrefixApp.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/jdk/java/lang/instrument/NativeMethodPrefixApp.java b/test/jdk/java/lang/instrument/NativeMethodPrefixApp.java index 5060e67ca87b4..65cc54793cbed 100644 --- a/test/jdk/java/lang/instrument/NativeMethodPrefixApp.java +++ b/test/jdk/java/lang/instrument/NativeMethodPrefixApp.java @@ -25,6 +25,7 @@ import java.io.File; import java.nio.file.Path; import java.lang.management.*; +import java.util.zip.CRC32; import bootreporter.*; import jdk.test.lib.helpers.ClassFileInstaller; @@ -96,6 +97,10 @@ private static void launchApp(final Path agentJar) throws Exception { final OutputAnalyzer oa = ProcessTools.executeTestJava( "--enable-preview", // due to usage of ClassFile API PreviewFeature in the agent "-javaagent:" + agentJar.toString(), + // We disable CheckIntrinsic because the NativeMethodPrefixAgent modifies + // the native method names, which then causes a failure in the VM check + // for the presence of an intrinsic on a @IntrinsicCandidate native method. + "-XX:+UnlockDiagnosticVMOptions", "-XX:-CheckIntrinsics", NativeMethodPrefixApp.class.getName()); oa.shouldHaveExitValue(0); // make available stdout/stderr in the logs, even in case of successful completion @@ -109,6 +114,10 @@ private void run() throws Exception { java.lang.reflect.Array.getLength(new short[5]); RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean(); System.err.println(mxbean.getVmVendor()); + // Simply load a class containing an @IntrinsicCandidate on a native method + // to exercise the VM code which verifies the presence of the intrinsic + // implementation for that method. + System.err.println(new CRC32()); NativeMethodPrefixAgent.checkErrors(); From fe9c63cf73db7833646345e362cbda020ac403d1 Mon Sep 17 00:00:00 2001 From: Serguei Spitsyn <sspitsyn@openjdk.org> Date: Tue, 11 Jun 2024 05:35:33 +0000 Subject: [PATCH 019/471] 8333931: Problemlist serviceability/jvmti/vthread/CarrierThreadEventNotification Reviewed-by: serb --- test/hotspot/jtreg/ProblemList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 5da6ebaa6d573..78e09c0627afa 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -122,6 +122,7 @@ serviceability/sa/TestRevPtrsForInvokeDynamic.java 8241235 generic-all serviceability/jvmti/ModuleAwareAgents/ThreadStart/MAAThreadStart.java 8225354 windows-all serviceability/jvmti/vthread/GetThreadStateMountedTest/GetThreadStateMountedTest.java 8318090,8318729 generic-all serviceability/jvmti/vthread/GetSetLocalTest/GetSetLocalTest.java 8286836 generic-all +serviceability/jvmti/vthread/CarrierThreadEventNotification/CarrierThreadEventNotification.java 8333681 generic-all serviceability/dcmd/gc/RunFinalizationTest.java 8227120 generic-all serviceability/sa/ClhsdbCDSCore.java 8267433 macosx-x64 From 4d6064a76003addf38e6eb6b925dad8043581768 Mon Sep 17 00:00:00 2001 From: Robbin Ehn <rehn@openjdk.org> Date: Tue, 11 Jun 2024 05:48:16 +0000 Subject: [PATCH 020/471] 8333649: Allow different NativeCall encodings Reviewed-by: kvn, mli --- src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp | 1 + src/hotspot/cpu/arm/nativeInst_arm_32.hpp | 1 + src/hotspot/cpu/ppc/nativeInst_ppc.hpp | 2 ++ src/hotspot/cpu/riscv/nativeInst_riscv.hpp | 1 + src/hotspot/cpu/s390/nativeInst_s390.hpp | 1 + src/hotspot/cpu/x86/nativeInst_x86.hpp | 1 + src/hotspot/cpu/zero/nativeInst_zero.hpp | 2 ++ src/hotspot/share/code/nmethod.inline.hpp | 4 ++-- src/hotspot/share/opto/output.cpp | 2 +- 9 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp index 84caef57f87ca..974214d985b5d 100644 --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp @@ -168,6 +168,7 @@ class NativeCall: public NativeInstruction { return_address_offset = 4 }; + static int byte_size() { return instruction_size; } address instruction_address() const { return addr_at(instruction_offset); } address next_instruction_address() const { return addr_at(return_address_offset); } int displacement() const { return (int_at(displacement_offset) << 6) >> 4; } diff --git a/src/hotspot/cpu/arm/nativeInst_arm_32.hpp b/src/hotspot/cpu/arm/nativeInst_arm_32.hpp index 15b57188730df..e26c23cd9836c 100644 --- a/src/hotspot/cpu/arm/nativeInst_arm_32.hpp +++ b/src/hotspot/cpu/arm/nativeInst_arm_32.hpp @@ -415,6 +415,7 @@ inline NativeJump* nativeJump_at(address address) { class NativeCall: public RawNativeCall { public: + static int byte_size() { return instruction_size; } // NativeCall::next_instruction_address() is used only to define the // range where to look for the relocation information. We need not // walk over composed instructions (as long as the relocation information diff --git a/src/hotspot/cpu/ppc/nativeInst_ppc.hpp b/src/hotspot/cpu/ppc/nativeInst_ppc.hpp index 113cedfee7cab..f21d76f8a675e 100644 --- a/src/hotspot/cpu/ppc/nativeInst_ppc.hpp +++ b/src/hotspot/cpu/ppc/nativeInst_ppc.hpp @@ -137,6 +137,8 @@ class NativeCall: public NativeInstruction { instruction_size = 16 // Used in shared code for calls with reloc_info. }; + static int byte_size() { return instruction_size; } + static bool is_call_at(address a) { return Assembler::is_bl(*(int*)(a)); } diff --git a/src/hotspot/cpu/riscv/nativeInst_riscv.hpp b/src/hotspot/cpu/riscv/nativeInst_riscv.hpp index e9b3624d9d29d..f925f8950aa23 100644 --- a/src/hotspot/cpu/riscv/nativeInst_riscv.hpp +++ b/src/hotspot/cpu/riscv/nativeInst_riscv.hpp @@ -126,6 +126,7 @@ class NativeCall: public NativeInstruction { return_address_offset = 4 }; + static int byte_size() { return instruction_size; } address instruction_address() const { return addr_at(instruction_offset); } address next_instruction_address() const { return addr_at(return_address_offset); } address return_address() const { return addr_at(return_address_offset); } diff --git a/src/hotspot/cpu/s390/nativeInst_s390.hpp b/src/hotspot/cpu/s390/nativeInst_s390.hpp index 13f15224f8bf5..8003e1d42f267 100644 --- a/src/hotspot/cpu/s390/nativeInst_s390.hpp +++ b/src/hotspot/cpu/s390/nativeInst_s390.hpp @@ -212,6 +212,7 @@ class NativeCall: public NativeInstruction { call_far_pcrelative_displacement_alignment = 4 }; + static int byte_size() { return instruction_size; } // Maximum size (in bytes) of a call to an absolute address. // Used when emitting call to deopt handler blob, which is a diff --git a/src/hotspot/cpu/x86/nativeInst_x86.hpp b/src/hotspot/cpu/x86/nativeInst_x86.hpp index f8cbf70f18961..70cb61793661e 100644 --- a/src/hotspot/cpu/x86/nativeInst_x86.hpp +++ b/src/hotspot/cpu/x86/nativeInst_x86.hpp @@ -160,6 +160,7 @@ class NativeCall: public NativeInstruction { return_address_offset = 5 }; + static int byte_size() { return instruction_size; } address instruction_address() const { return addr_at(instruction_offset); } address next_instruction_address() const { return addr_at(return_address_offset); } int displacement() const { return (jint) int_at(displacement_offset); } diff --git a/src/hotspot/cpu/zero/nativeInst_zero.hpp b/src/hotspot/cpu/zero/nativeInst_zero.hpp index 77a7d511ac5e8..2f3d9b80617ce 100644 --- a/src/hotspot/cpu/zero/nativeInst_zero.hpp +++ b/src/hotspot/cpu/zero/nativeInst_zero.hpp @@ -70,6 +70,8 @@ class NativeCall : public NativeInstruction { instruction_size = 0 // not used within the interpreter }; + static int byte_size() { return instruction_size; } + address instruction_address() const { ShouldNotCallThis(); return nullptr; diff --git a/src/hotspot/share/code/nmethod.inline.hpp b/src/hotspot/share/code/nmethod.inline.hpp index 4af4d3ffaedd9..49af1e0b95f2f 100644 --- a/src/hotspot/share/code/nmethod.inline.hpp +++ b/src/hotspot/share/code/nmethod.inline.hpp @@ -37,7 +37,7 @@ inline bool nmethod::is_deopt_pc(address pc) { return is_deopt_entry(pc) || is_d inline bool nmethod::is_deopt_entry(address pc) { return pc == deopt_handler_begin() #if INCLUDE_JVMCI - || (is_compiled_by_jvmci() && pc == (deopt_handler_begin() + NativeCall::instruction_size)) + || (is_compiled_by_jvmci() && pc == (deopt_handler_begin() + NativeCall::byte_size())) #endif ; } @@ -45,7 +45,7 @@ inline bool nmethod::is_deopt_entry(address pc) { inline bool nmethod::is_deopt_mh_entry(address pc) { return pc == deopt_mh_handler_begin() #if INCLUDE_JVMCI - || (is_compiled_by_jvmci() && pc == (deopt_mh_handler_begin() + NativeCall::instruction_size)) + || (is_compiled_by_jvmci() && pc == (deopt_mh_handler_begin() + NativeCall::byte_size())) #endif ; } diff --git a/src/hotspot/share/opto/output.cpp b/src/hotspot/share/opto/output.cpp index d8a9b14c4ad44..8ea456d3417da 100644 --- a/src/hotspot/share/opto/output.cpp +++ b/src/hotspot/share/opto/output.cpp @@ -1321,7 +1321,7 @@ CodeBuffer* PhaseOutput::init_buffer() { int code_req = _buf_sizes._code; int const_req = _buf_sizes._const; - int pad_req = NativeCall::instruction_size; + int pad_req = NativeCall::byte_size(); BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); stub_req += bs->estimate_stub_size(); From badf1cb9ce9dcae6cca92046f7cc1231067ca799 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Tue, 11 Jun 2024 06:57:05 +0000 Subject: [PATCH 021/471] 8331675: gtest CollectorPolicy.young_min_ergo_vm fails after 8272364 Reviewed-by: tschatzl, zgu, gli --- .../hotspot/gtest/gc/shared/test_collectorPolicy.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp b/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp index 40df20ba964b3..102ede42de63f 100644 --- a/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp +++ b/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp @@ -212,18 +212,6 @@ class TestGenCollectorPolicy { // depends on so many other configurable variables. These tests only try to // verify that there are some basic rules for NewSize honored by the policies. -// If NewSize has been ergonomically set, the collector policy -// should use it for min -// This test doesn't work with 64k pages. See JDK-8331675. -#if !defined(PPC) -TEST_VM(CollectorPolicy, young_min_ergo) { - TestGenCollectorPolicy::SetNewSizeErgo setter(20 * M); - TestGenCollectorPolicy::CheckYoungMin checker(20 * M); - - TestGenCollectorPolicy::TestWrapper::test(&setter, &checker); -} -#endif - // If NewSize has been ergonomically set, the collector policy // should use it for min but calculate the initial young size // using NewRatio. From 0e4d4a0c3150c01d927bd69cc578cea053cf16b3 Mon Sep 17 00:00:00 2001 From: Bhavana Kilambi <bkilambi@openjdk.org> Date: Tue, 11 Jun 2024 07:16:56 +0000 Subject: [PATCH 022/471] 8320725: AArch64: C2: Add "requires_strict_order" flag for floating-point add and mul reduction Co-authored-by: Eric Liu <eliu@openjdk.org> Reviewed-by: gli, epeter, aph --- src/hotspot/cpu/aarch64/aarch64_vector.ad | 62 +++-- src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 | 50 +++-- src/hotspot/share/opto/loopnode.hpp | 4 +- src/hotspot/share/opto/loopopts.cpp | 53 +++-- src/hotspot/share/opto/node.hpp | 3 - src/hotspot/share/opto/vectorIntrinsics.cpp | 30 +-- src/hotspot/share/opto/vectornode.cpp | 21 +- src/hotspot/share/opto/vectornode.hpp | 148 +++++++++--- .../superword/TestVectorFPReduction.java | 111 +++++++++ .../vectorapi/TestVectorAddMulReduction.java | 211 ++++++++++++++++++ 10 files changed, 575 insertions(+), 118 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java create mode 100644 test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java diff --git a/src/hotspot/cpu/aarch64/aarch64_vector.ad b/src/hotspot/cpu/aarch64/aarch64_vector.ad index b14295ca15c88..1ebc6408a6094 100644 --- a/src/hotspot/cpu/aarch64/aarch64_vector.ad +++ b/src/hotspot/cpu/aarch64/aarch64_vector.ad @@ -135,9 +135,9 @@ source %{ (opcode == Op_VectorCastL2X && bt == T_FLOAT) || (opcode == Op_CountLeadingZerosV && bt == T_LONG) || (opcode == Op_CountTrailingZerosV && bt == T_LONG) || - // The vector implementation of Op_AddReductionVD/F is for the Vector API only. - // It is not suitable for auto-vectorization because it does not add the elements - // in the same order as sequential code, and FP addition is non-associative. + // The implementations of Op_AddReductionVD/F in Neon are for the Vector API only. + // They are not suitable for auto-vectorization because the result would not conform + // to the JLS, Section Evaluation Order. opcode == Op_AddReductionVD || opcode == Op_AddReductionVF || opcode == Op_MulReductionVD || opcode == Op_MulReductionVF || opcode == Op_MulVL) { @@ -2858,14 +2858,14 @@ instruct reduce_addL_sve(iRegLNoSp dst, iRegL isrc, vReg vsrc, vRegD tmp) %{ %} // reduction addF -// Floating-point addition is not associative, so the rules for AddReductionVF -// on NEON can't be used to auto-vectorize floating-point reduce-add. -// Currently, on NEON, AddReductionVF is only generated by Vector API. -instruct reduce_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{ - predicate(UseSVE == 0 && Matcher::vector_length(n->in(2)) == 2); + +instruct reduce_non_strict_order_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{ + // Non-strictly ordered floating-point add reduction for a 64-bits-long vector. This rule is + // intended for the VectorAPI (which allows for non-strictly ordered add reduction). + predicate(Matcher::vector_length(n->in(2)) == 2 && !n->as_Reduction()->requires_strict_order()); match(Set dst (AddReductionVF fsrc vsrc)); effect(TEMP_DEF dst); - format %{ "reduce_add2F_neon $dst, $fsrc, $vsrc" %} + format %{ "reduce_non_strict_order_add2F_neon $dst, $fsrc, $vsrc" %} ins_encode %{ __ faddp($dst$$FloatRegister, $vsrc$$FloatRegister, __ S); __ fadds($dst$$FloatRegister, $dst$$FloatRegister, $fsrc$$FloatRegister); @@ -2873,11 +2873,13 @@ instruct reduce_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{ ins_pipe(pipe_slow); %} -instruct reduce_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{ - predicate(UseSVE == 0 && Matcher::vector_length(n->in(2)) == 4); +instruct reduce_non_strict_order_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{ + // Non-strictly ordered floating-point add reduction for 128-bits-long vector. This rule is + // intended for the VectorAPI (which allows for non-strictly ordered add reduction). + predicate(Matcher::vector_length(n->in(2)) == 4 && !n->as_Reduction()->requires_strict_order()); match(Set dst (AddReductionVF fsrc vsrc)); effect(TEMP_DEF dst, TEMP tmp); - format %{ "reduce_add4F_neon $dst, $fsrc, $vsrc\t# KILL $tmp" %} + format %{ "reduce_non_strict_order_add4F_neon $dst, $fsrc, $vsrc\t# KILL $tmp" %} ins_encode %{ __ faddp($tmp$$FloatRegister, __ T4S, $vsrc$$FloatRegister, $vsrc$$FloatRegister); __ faddp($dst$$FloatRegister, $tmp$$FloatRegister, __ S); @@ -2886,11 +2888,21 @@ instruct reduce_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{ ins_pipe(pipe_slow); %} +// This rule calculates the reduction result in strict order. Two cases will +// reach here: +// 1. Non strictly-ordered AddReductionVF when vector size > 128-bits. For example - +// AddReductionVF generated by Vector API. For vector size > 128-bits, it is more +// beneficial performance-wise to generate direct SVE instruction even if it is +// strictly ordered. +// 2. Strictly-ordered AddReductionVF. For example - AddReductionVF generated by +// auto-vectorization on SVE machine. instruct reduce_addF_sve(vRegF dst_src1, vReg src2) %{ - predicate(UseSVE > 0); + predicate(!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(2))) || + n->as_Reduction()->requires_strict_order()); match(Set dst_src1 (AddReductionVF dst_src1 src2)); format %{ "reduce_addF_sve $dst_src1, $dst_src1, $src2" %} ins_encode %{ + assert(UseSVE > 0, "must be sve"); uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src2); assert(length_in_bytes == MaxVectorSize, "invalid vector length"); __ sve_fadda($dst_src1$$FloatRegister, __ S, ptrue, $src2$$FloatRegister); @@ -2899,14 +2911,14 @@ instruct reduce_addF_sve(vRegF dst_src1, vReg src2) %{ %} // reduction addD -// Floating-point addition is not associative, so the rule for AddReductionVD -// on NEON can't be used to auto-vectorize floating-point reduce-add. -// Currently, on NEON, AddReductionVD is only generated by Vector API. -instruct reduce_addD_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{ - predicate(UseSVE == 0); + +instruct reduce_non_strict_order_add2D_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{ + // Non-strictly ordered floating-point add reduction for doubles. This rule is + // intended for the VectorAPI (which allows for non-strictly ordered add reduction). + predicate(!n->as_Reduction()->requires_strict_order()); match(Set dst (AddReductionVD dsrc vsrc)); effect(TEMP_DEF dst); - format %{ "reduce_addD_neon $dst, $dsrc, $vsrc\t# 2D" %} + format %{ "reduce_non_strict_order_add2D_neon $dst, $dsrc, $vsrc\t# 2D" %} ins_encode %{ __ faddp($dst$$FloatRegister, $vsrc$$FloatRegister, __ D); __ faddd($dst$$FloatRegister, $dst$$FloatRegister, $dsrc$$FloatRegister); @@ -2914,11 +2926,21 @@ instruct reduce_addD_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{ ins_pipe(pipe_slow); %} +// This rule calculates the reduction result in strict order. Two cases will +// reach here: +// 1. Non strictly-ordered AddReductionVD when vector size > 128-bits. For example - +// AddReductionVD generated by Vector API. For vector size > 128-bits, it is more +// beneficial performance-wise to generate direct SVE instruction even if it is +// strictly ordered. +// 2. Strictly-ordered AddReductionVD. For example - AddReductionVD generated by +// auto-vectorization on SVE machine. instruct reduce_addD_sve(vRegD dst_src1, vReg src2) %{ - predicate(UseSVE > 0); + predicate(!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(2))) || + n->as_Reduction()->requires_strict_order()); match(Set dst_src1 (AddReductionVD dst_src1 src2)); format %{ "reduce_addD_sve $dst_src1, $dst_src1, $src2" %} ins_encode %{ + assert(UseSVE > 0, "must be sve"); uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src2); assert(length_in_bytes == MaxVectorSize, "invalid vector length"); __ sve_fadda($dst_src1$$FloatRegister, __ D, ptrue, $src2$$FloatRegister); diff --git a/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 b/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 index 060bb4a11d4ad..29f927723688f 100644 --- a/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 +++ b/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 @@ -125,9 +125,9 @@ source %{ (opcode == Op_VectorCastL2X && bt == T_FLOAT) || (opcode == Op_CountLeadingZerosV && bt == T_LONG) || (opcode == Op_CountTrailingZerosV && bt == T_LONG) || - // The vector implementation of Op_AddReductionVD/F is for the Vector API only. - // It is not suitable for auto-vectorization because it does not add the elements - // in the same order as sequential code, and FP addition is non-associative. + // The implementations of Op_AddReductionVD/F in Neon are for the Vector API only. + // They are not suitable for auto-vectorization because the result would not conform + // to the JLS, Section Evaluation Order. opcode == Op_AddReductionVD || opcode == Op_AddReductionVF || opcode == Op_MulReductionVD || opcode == Op_MulReductionVF || opcode == Op_MulVL) { @@ -1752,14 +1752,14 @@ REDUCE_ADD_INT_NEON_SVE_PAIRWISE(I, iRegIorL2I) REDUCE_ADD_INT_NEON_SVE_PAIRWISE(L, iRegL) // reduction addF -// Floating-point addition is not associative, so the rules for AddReductionVF -// on NEON can't be used to auto-vectorize floating-point reduce-add. -// Currently, on NEON, AddReductionVF is only generated by Vector API. -instruct reduce_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{ - predicate(UseSVE == 0 && Matcher::vector_length(n->in(2)) == 2); + +instruct reduce_non_strict_order_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{ + // Non-strictly ordered floating-point add reduction for a 64-bits-long vector. This rule is + // intended for the VectorAPI (which allows for non-strictly ordered add reduction). + predicate(Matcher::vector_length(n->in(2)) == 2 && !n->as_Reduction()->requires_strict_order()); match(Set dst (AddReductionVF fsrc vsrc)); effect(TEMP_DEF dst); - format %{ "reduce_add2F_neon $dst, $fsrc, $vsrc" %} + format %{ "reduce_non_strict_order_add2F_neon $dst, $fsrc, $vsrc" %} ins_encode %{ __ faddp($dst$$FloatRegister, $vsrc$$FloatRegister, __ S); __ fadds($dst$$FloatRegister, $dst$$FloatRegister, $fsrc$$FloatRegister); @@ -1767,11 +1767,13 @@ instruct reduce_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{ ins_pipe(pipe_slow); %} -instruct reduce_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{ - predicate(UseSVE == 0 && Matcher::vector_length(n->in(2)) == 4); +instruct reduce_non_strict_order_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{ + // Non-strictly ordered floating-point add reduction for 128-bits-long vector. This rule is + // intended for the VectorAPI (which allows for non-strictly ordered add reduction). + predicate(Matcher::vector_length(n->in(2)) == 4 && !n->as_Reduction()->requires_strict_order()); match(Set dst (AddReductionVF fsrc vsrc)); effect(TEMP_DEF dst, TEMP tmp); - format %{ "reduce_add4F_neon $dst, $fsrc, $vsrc\t# KILL $tmp" %} + format %{ "reduce_non_strict_order_add4F_neon $dst, $fsrc, $vsrc\t# KILL $tmp" %} ins_encode %{ __ faddp($tmp$$FloatRegister, __ T4S, $vsrc$$FloatRegister, $vsrc$$FloatRegister); __ faddp($dst$$FloatRegister, $tmp$$FloatRegister, __ S); @@ -1783,11 +1785,21 @@ dnl dnl REDUCE_ADD_FP_SVE($1, $2 ) dnl REDUCE_ADD_FP_SVE(type, size) define(`REDUCE_ADD_FP_SVE', ` +// This rule calculates the reduction result in strict order. Two cases will +// reach here: +// 1. Non strictly-ordered AddReductionV$1 when vector size > 128-bits. For example - +// AddReductionV$1 generated by Vector API. For vector size > 128-bits, it is more +// beneficial performance-wise to generate direct SVE instruction even if it is +// strictly ordered. +// 2. Strictly-ordered AddReductionV$1. For example - AddReductionV$1 generated by +// auto-vectorization on SVE machine. instruct reduce_add$1_sve(vReg$1 dst_src1, vReg src2) %{ - predicate(UseSVE > 0); + predicate(!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(2))) || + n->as_Reduction()->requires_strict_order()); match(Set dst_src1 (AddReductionV$1 dst_src1 src2)); format %{ "reduce_add$1_sve $dst_src1, $dst_src1, $src2" %} ins_encode %{ + assert(UseSVE > 0, "must be sve"); uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src2); assert(length_in_bytes == MaxVectorSize, "invalid vector length"); __ sve_fadda($dst_src1$$FloatRegister, __ $2, ptrue, $src2$$FloatRegister); @@ -1798,14 +1810,14 @@ dnl REDUCE_ADD_FP_SVE(F, S) // reduction addD -// Floating-point addition is not associative, so the rule for AddReductionVD -// on NEON can't be used to auto-vectorize floating-point reduce-add. -// Currently, on NEON, AddReductionVD is only generated by Vector API. -instruct reduce_addD_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{ - predicate(UseSVE == 0); + +instruct reduce_non_strict_order_add2D_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{ + // Non-strictly ordered floating-point add reduction for doubles. This rule is + // intended for the VectorAPI (which allows for non-strictly ordered add reduction). + predicate(!n->as_Reduction()->requires_strict_order()); match(Set dst (AddReductionVD dsrc vsrc)); effect(TEMP_DEF dst); - format %{ "reduce_addD_neon $dst, $dsrc, $vsrc\t# 2D" %} + format %{ "reduce_non_strict_order_add2D_neon $dst, $dsrc, $vsrc\t# 2D" %} ins_encode %{ __ faddp($dst$$FloatRegister, $vsrc$$FloatRegister, __ D); __ faddd($dst$$FloatRegister, $dst$$FloatRegister, $dsrc$$FloatRegister); diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp index ad603439e5973..90ef4da4f1e0e 100644 --- a/src/hotspot/share/opto/loopnode.hpp +++ b/src/hotspot/share/opto/loopnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1460,7 +1460,7 @@ class PhaseIdealLoop : public PhaseTransform { }; AutoVectorizeStatus auto_vectorize(IdealLoopTree* lpt, VSharedData &vshared); - // Move UnorderedReduction out of loop if possible + // Move an unordered Reduction out of loop if possible void move_unordered_reduction_out_of_loop(IdealLoopTree* loop); // Create a scheduled list of nodes control dependent on ctrl set. diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp index a3227d4783266..b0effb6d4f526 100644 --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -4310,11 +4310,19 @@ PhaseIdealLoop::auto_vectorize(IdealLoopTree* lpt, VSharedData &vshared) { return AutoVectorizeStatus::Success; } +// Returns true if the Reduction node is unordered. +static bool is_unordered_reduction(Node* n) { + return n->is_Reduction() && !n->as_Reduction()->requires_strict_order(); +} + // Having ReductionNodes in the loop is expensive. They need to recursively // fold together the vector values, for every vectorized loop iteration. If // we encounter the following pattern, we can vector accumulate the values // inside the loop, and only have a single UnorderedReduction after the loop. // +// Note: UnorderedReduction represents a ReductionNode which does not require +// calculating in strict order. +// // CountedLoop init // | | // +------+ | +-----------------------+ @@ -4354,21 +4362,24 @@ PhaseIdealLoop::auto_vectorize(IdealLoopTree* lpt, VSharedData &vshared) { // wise. This is a single operation per vector_accumulator, rather than many // for a UnorderedReduction. We can then reduce the last vector_accumulator // after the loop, and also reduce the init value into it. +// // We can not do this with all reductions. Some reductions do not allow the -// reordering of operations (for example float addition). +// reordering of operations (for example float addition/multiplication require +// strict order). void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) { assert(!C->major_progress() && loop->is_counted() && loop->is_innermost(), "sanity"); - // Find all Phi nodes with UnorderedReduction on backedge. + // Find all Phi nodes with an unordered Reduction on backedge. CountedLoopNode* cl = loop->_head->as_CountedLoop(); for (DUIterator_Fast jmax, j = cl->fast_outs(jmax); j < jmax; j++) { Node* phi = cl->fast_out(j); - // We have a phi with a single use, and a UnorderedReduction on the backedge. - if (!phi->is_Phi() || phi->outcnt() != 1 || !phi->in(2)->is_UnorderedReduction()) { + // We have a phi with a single use, and an unordered Reduction on the backedge. + if (!phi->is_Phi() || phi->outcnt() != 1 || !is_unordered_reduction(phi->in(2))) { continue; } - UnorderedReductionNode* last_ur = phi->in(2)->as_UnorderedReduction(); + ReductionNode* last_ur = phi->in(2)->as_Reduction(); + assert(!last_ur->requires_strict_order(), "must be"); // Determine types const TypeVect* vec_t = last_ur->vect_type(); @@ -4385,14 +4396,14 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) { continue; // not implemented -> fails } - // Traverse up the chain of UnorderedReductions, checking that it loops back to - // the phi. Check that all UnorderedReductions only have a single use, except for + // Traverse up the chain of unordered Reductions, checking that it loops back to + // the phi. Check that all unordered Reductions only have a single use, except for // the last (last_ur), which only has phi as a use in the loop, and all other uses // are outside the loop. - UnorderedReductionNode* current = last_ur; - UnorderedReductionNode* first_ur = nullptr; + ReductionNode* current = last_ur; + ReductionNode* first_ur = nullptr; while (true) { - assert(current->is_UnorderedReduction(), "sanity"); + assert(!current->requires_strict_order(), "sanity"); // Expect no ctrl and a vector_input from within the loop. Node* ctrl = current->in(0); @@ -4409,7 +4420,7 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) { break; // Chain traversal fails. } - // Expect single use of UnorderedReduction, except for last_ur. + // Expect single use of an unordered Reduction, except for last_ur. if (current == last_ur) { // Expect all uses to be outside the loop, except phi. for (DUIterator_Fast kmax, k = current->fast_outs(kmax); k < kmax; k++) { @@ -4427,12 +4438,13 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) { } } - // Expect another UnorderedReduction or phi as the scalar input. + // Expect another unordered Reduction or phi as the scalar input. Node* scalar_input = current->in(1); - if (scalar_input->is_UnorderedReduction() && + if (is_unordered_reduction(scalar_input) && scalar_input->Opcode() == current->Opcode()) { - // Move up the UnorderedReduction chain. - current = scalar_input->as_UnorderedReduction(); + // Move up the unordered Reduction chain. + current = scalar_input->as_Reduction(); + assert(!current->requires_strict_order(), "must be"); } else if (scalar_input == phi) { // Chain terminates at phi. first_ur = current; @@ -4456,7 +4468,7 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) { VectorNode* identity_vector = VectorNode::scalar2vector(identity_scalar, vector_length, bt_t); register_new_node(identity_vector, C->root()); assert(vec_t == identity_vector->vect_type(), "matching vector type"); - VectorNode::trace_new_vector(identity_vector, "UnorderedReduction"); + VectorNode::trace_new_vector(identity_vector, "Unordered Reduction"); // Turn the scalar phi into a vector phi. _igvn.rehash_node_delayed(phi); @@ -4465,7 +4477,7 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) { phi->as_Type()->set_type(vec_t); _igvn.set_type(phi, vec_t); - // Traverse down the chain of UnorderedReductions, and replace them with vector_accumulators. + // Traverse down the chain of unordered Reductions, and replace them with vector_accumulators. current = first_ur; while (true) { // Create vector_accumulator to replace current. @@ -4474,11 +4486,12 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) { VectorNode* vector_accumulator = VectorNode::make(vopc, last_vector_accumulator, vector_input, vec_t); register_new_node(vector_accumulator, cl); _igvn.replace_node(current, vector_accumulator); - VectorNode::trace_new_vector(vector_accumulator, "UnorderedReduction"); + VectorNode::trace_new_vector(vector_accumulator, "Unordered Reduction"); if (current == last_ur) { break; } - current = vector_accumulator->unique_out()->as_UnorderedReduction(); + current = vector_accumulator->unique_out()->as_Reduction(); + assert(!current->requires_strict_order(), "must be"); } // Create post-loop reduction. @@ -4495,7 +4508,7 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) { } } register_new_node(post_loop_reduction, get_late_ctrl(post_loop_reduction, cl)); - VectorNode::trace_new_vector(post_loop_reduction, "UnorderedReduction"); + VectorNode::trace_new_vector(post_loop_reduction, "Unordered Reduction"); assert(last_accumulator->outcnt() == 2, "last_accumulator has 2 uses: phi and post_loop_reduction"); assert(post_loop_reduction->outcnt() > 0, "should have taken over all non loop uses of last_accumulator"); diff --git a/src/hotspot/share/opto/node.hpp b/src/hotspot/share/opto/node.hpp index dc9dc6654b558..ae379c4833a56 100644 --- a/src/hotspot/share/opto/node.hpp +++ b/src/hotspot/share/opto/node.hpp @@ -175,7 +175,6 @@ class SubTypeCheckNode; class Type; class TypeNode; class UnlockNode; -class UnorderedReductionNode; class VectorNode; class LoadVectorNode; class LoadVectorMaskedNode; @@ -739,7 +738,6 @@ class Node { DEFINE_CLASS_ID(ExpandV, Vector, 5) DEFINE_CLASS_ID(CompressM, Vector, 6) DEFINE_CLASS_ID(Reduction, Vector, 7) - DEFINE_CLASS_ID(UnorderedReduction, Reduction, 0) DEFINE_CLASS_ID(NegV, Vector, 8) DEFINE_CLASS_ID(Con, Type, 8) DEFINE_CLASS_ID(ConI, Con, 0) @@ -991,7 +989,6 @@ class Node { DEFINE_CLASS_QUERY(Sub) DEFINE_CLASS_QUERY(SubTypeCheck) DEFINE_CLASS_QUERY(Type) - DEFINE_CLASS_QUERY(UnorderedReduction) DEFINE_CLASS_QUERY(Vector) DEFINE_CLASS_QUERY(VectorMaskCmp) DEFINE_CLASS_QUERY(VectorUnbox) diff --git a/src/hotspot/share/opto/vectorIntrinsics.cpp b/src/hotspot/share/opto/vectorIntrinsics.cpp index 3ef6ae02534b9..b31f6ace5a6e2 100644 --- a/src/hotspot/share/opto/vectorIntrinsics.cpp +++ b/src/hotspot/share/opto/vectorIntrinsics.cpp @@ -1616,21 +1616,23 @@ bool LibraryCallKit::inline_vector_reduction() { } Node* init = ReductionNode::make_identity_con_scalar(gvn(), opc, elem_bt); - Node* value = nullptr; - if (mask == nullptr) { - assert(!is_masked_op, "Masked op needs the mask value never null"); - value = ReductionNode::make(opc, nullptr, init, opd, elem_bt); - } else { - if (use_predicate) { - value = ReductionNode::make(opc, nullptr, init, opd, elem_bt); - value->add_req(mask); - value->add_flag(Node::Flag_is_predicated_vector); - } else { - Node* reduce_identity = gvn().transform(VectorNode::scalar2vector(init, num_elem, Type::get_const_basic_type(elem_bt))); - value = gvn().transform(new VectorBlendNode(reduce_identity, opd, mask)); - value = ReductionNode::make(opc, nullptr, init, value, elem_bt); - } + Node* value = opd; + + assert(mask != nullptr || !is_masked_op, "Masked op needs the mask value never null"); + if (mask != nullptr && !use_predicate) { + Node* reduce_identity = gvn().transform(VectorNode::scalar2vector(init, num_elem, Type::get_const_basic_type(elem_bt))); + value = gvn().transform(new VectorBlendNode(reduce_identity, value, mask)); } + + // Make an unordered Reduction node. This affects only AddReductionVF/VD and MulReductionVF/VD, + // as these operations are allowed to be associative (not requiring strict order) in VectorAPI. + value = ReductionNode::make(opc, nullptr, init, value, elem_bt, /* requires_strict_order */ false); + + if (mask != nullptr && use_predicate) { + value->add_req(mask); + value->add_flag(Node::Flag_is_predicated_vector); + } + value = gvn().transform(value); Node* bits = nullptr; diff --git a/src/hotspot/share/opto/vectornode.cpp b/src/hotspot/share/opto/vectornode.cpp index b14a7f7b16512..d560f112039a3 100644 --- a/src/hotspot/share/opto/vectornode.cpp +++ b/src/hotspot/share/opto/vectornode.cpp @@ -1296,7 +1296,8 @@ int ReductionNode::opcode(int opc, BasicType bt) { } // Return the appropriate reduction node. -ReductionNode* ReductionNode::make(int opc, Node *ctrl, Node* n1, Node* n2, BasicType bt) { +ReductionNode* ReductionNode::make(int opc, Node* ctrl, Node* n1, Node* n2, BasicType bt, + bool requires_strict_order) { int vopc = opcode(opc, bt); @@ -1306,17 +1307,17 @@ ReductionNode* ReductionNode::make(int opc, Node *ctrl, Node* n1, Node* n2, Basi switch (vopc) { case Op_AddReductionVI: return new AddReductionVINode(ctrl, n1, n2); case Op_AddReductionVL: return new AddReductionVLNode(ctrl, n1, n2); - case Op_AddReductionVF: return new AddReductionVFNode(ctrl, n1, n2); - case Op_AddReductionVD: return new AddReductionVDNode(ctrl, n1, n2); + case Op_AddReductionVF: return new AddReductionVFNode(ctrl, n1, n2, requires_strict_order); + case Op_AddReductionVD: return new AddReductionVDNode(ctrl, n1, n2, requires_strict_order); case Op_MulReductionVI: return new MulReductionVINode(ctrl, n1, n2); case Op_MulReductionVL: return new MulReductionVLNode(ctrl, n1, n2); - case Op_MulReductionVF: return new MulReductionVFNode(ctrl, n1, n2); - case Op_MulReductionVD: return new MulReductionVDNode(ctrl, n1, n2); - case Op_MinReductionV: return new MinReductionVNode(ctrl, n1, n2); - case Op_MaxReductionV: return new MaxReductionVNode(ctrl, n1, n2); - case Op_AndReductionV: return new AndReductionVNode(ctrl, n1, n2); - case Op_OrReductionV: return new OrReductionVNode(ctrl, n1, n2); - case Op_XorReductionV: return new XorReductionVNode(ctrl, n1, n2); + case Op_MulReductionVF: return new MulReductionVFNode(ctrl, n1, n2, requires_strict_order); + case Op_MulReductionVD: return new MulReductionVDNode(ctrl, n1, n2, requires_strict_order); + case Op_MinReductionV: return new MinReductionVNode (ctrl, n1, n2); + case Op_MaxReductionV: return new MaxReductionVNode (ctrl, n1, n2); + case Op_AndReductionV: return new AndReductionVNode (ctrl, n1, n2); + case Op_OrReductionV: return new OrReductionVNode (ctrl, n1, n2); + case Op_XorReductionV: return new XorReductionVNode (ctrl, n1, n2); default: assert(false, "unknown node: %s", NodeClassNames[vopc]); return nullptr; diff --git a/src/hotspot/share/opto/vectornode.hpp b/src/hotspot/share/opto/vectornode.hpp index 17c7482d88ce1..6c5402eb511f5 100644 --- a/src/hotspot/share/opto/vectornode.hpp +++ b/src/hotspot/share/opto/vectornode.hpp @@ -203,7 +203,9 @@ class ReductionNode : public Node { init_class_id(Class_Reduction); } - static ReductionNode* make(int opc, Node* ctrl, Node* in1, Node* in2, BasicType bt); + static ReductionNode* make(int opc, Node* ctrl, Node* in1, Node* in2, BasicType bt, + // This only effects floating-point add and mul reductions. + bool requires_strict_order = true); static int opcode(int opc, BasicType bt); static bool implemented(int opc, uint vlen, BasicType bt); // Make an identity scalar (zero for add, one for mul, etc) for scalar opc. @@ -225,47 +227,97 @@ class ReductionNode : public Node { // Needed for proper cloning. virtual uint size_of() const { return sizeof(*this); } -}; -//---------------------------UnorderedReductionNode------------------------------------- -// Order of reduction does not matter. Example int add. Not true for float add. -class UnorderedReductionNode : public ReductionNode { -public: - UnorderedReductionNode(Node * ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) { - init_class_id(Class_UnorderedReduction); + // Floating-point addition and multiplication are non-associative, so + // AddReductionVF/D and MulReductionVF/D require strict ordering + // in auto-vectorization. Vector API can generate AddReductionVF/D + // and MulReductionVF/VD without strict ordering, which can benefit + // some platforms. + // + // Other reductions don't need strict ordering. + virtual bool requires_strict_order() const { + return false; + } + +#ifndef PRODUCT + void dump_spec(outputStream* st) const { + if (requires_strict_order()) { + st->print("requires_strict_order"); + } else { + st->print("no_strict_order"); + } } +#endif }; //------------------------------AddReductionVINode-------------------------------------- // Vector add byte, short and int as a reduction -class AddReductionVINode : public UnorderedReductionNode { +class AddReductionVINode : public ReductionNode { public: - AddReductionVINode(Node * ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + AddReductionVINode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; //------------------------------AddReductionVLNode-------------------------------------- // Vector add long as a reduction -class AddReductionVLNode : public UnorderedReductionNode { +class AddReductionVLNode : public ReductionNode { public: - AddReductionVLNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + AddReductionVLNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; //------------------------------AddReductionVFNode-------------------------------------- // Vector add float as a reduction class AddReductionVFNode : public ReductionNode { +private: + // True if add reduction operation for floats requires strict ordering. + // As an example - The value is true when add reduction for floats is auto-vectorized + // as auto-vectorization mandates strict ordering but the value is false when this node + // is generated through VectorAPI as VectorAPI does not impose any such rules on ordering. + const bool _requires_strict_order; public: - AddReductionVFNode(Node *ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} + //_requires_strict_order is set to true by default as mandated by auto-vectorization + AddReductionVFNode(Node* ctrl, Node* in1, Node* in2, bool requires_strict_order = true) : + ReductionNode(ctrl, in1, in2), _requires_strict_order(requires_strict_order) {} + virtual int Opcode() const; + + virtual bool requires_strict_order() const { return _requires_strict_order; } + + virtual uint hash() const { return Node::hash() + _requires_strict_order; } + + virtual bool cmp(const Node& n) const { + return Node::cmp(n) && _requires_strict_order == ((ReductionNode&)n).requires_strict_order(); + } + + virtual uint size_of() const { return sizeof(*this); } }; //------------------------------AddReductionVDNode-------------------------------------- // Vector add double as a reduction class AddReductionVDNode : public ReductionNode { +private: + // True if add reduction operation for doubles requires strict ordering. + // As an example - The value is true when add reduction for doubles is auto-vectorized + // as auto-vectorization mandates strict ordering but the value is false when this node + // is generated through VectorAPI as VectorAPI does not impose any such rules on ordering. + const bool _requires_strict_order; public: - AddReductionVDNode(Node *ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} + //_requires_strict_order is set to true by default as mandated by auto-vectorization + AddReductionVDNode(Node* ctrl, Node* in1, Node* in2, bool requires_strict_order = true) : + ReductionNode(ctrl, in1, in2), _requires_strict_order(requires_strict_order) {} + virtual int Opcode() const; + + virtual bool requires_strict_order() const { return _requires_strict_order; } + + virtual uint hash() const { return Node::hash() + _requires_strict_order; } + + virtual bool cmp(const Node& n) const { + return Node::cmp(n) && _requires_strict_order == ((ReductionNode&)n).requires_strict_order(); + } + + virtual uint size_of() const { return sizeof(*this); } }; //------------------------------SubVBNode-------------------------------------- @@ -400,34 +452,70 @@ class FmaVFNode : public FmaVNode { //------------------------------MulReductionVINode-------------------------------------- // Vector multiply byte, short and int as a reduction -class MulReductionVINode : public UnorderedReductionNode { +class MulReductionVINode : public ReductionNode { public: - MulReductionVINode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + MulReductionVINode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; //------------------------------MulReductionVLNode-------------------------------------- // Vector multiply int as a reduction -class MulReductionVLNode : public UnorderedReductionNode { +class MulReductionVLNode : public ReductionNode { public: - MulReductionVLNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + MulReductionVLNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; //------------------------------MulReductionVFNode-------------------------------------- // Vector multiply float as a reduction class MulReductionVFNode : public ReductionNode { + // True if mul reduction operation for floats requires strict ordering. + // As an example - The value is true when mul reduction for floats is auto-vectorized + // as auto-vectorization mandates strict ordering but the value is false when this node + // is generated through VectorAPI as VectorAPI does not impose any such rules on ordering. + const bool _requires_strict_order; public: - MulReductionVFNode(Node *ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} + //_requires_strict_order is set to true by default as mandated by auto-vectorization + MulReductionVFNode(Node* ctrl, Node* in1, Node* in2, bool requires_strict_order = true) : + ReductionNode(ctrl, in1, in2), _requires_strict_order(requires_strict_order) {} + virtual int Opcode() const; + + virtual bool requires_strict_order() const { return _requires_strict_order; } + + virtual uint hash() const { return Node::hash() + _requires_strict_order; } + + virtual bool cmp(const Node& n) const { + return Node::cmp(n) && _requires_strict_order == ((ReductionNode&)n).requires_strict_order(); + } + + virtual uint size_of() const { return sizeof(*this); } }; //------------------------------MulReductionVDNode-------------------------------------- // Vector multiply double as a reduction class MulReductionVDNode : public ReductionNode { + // True if mul reduction operation for doubles requires strict ordering. + // As an example - The value is true when mul reduction for doubles is auto-vectorized + // as auto-vectorization mandates strict ordering but the value is false when this node + // is generated through VectorAPI as VectorAPI does not impose any such rules on ordering. + const bool _requires_strict_order; public: - MulReductionVDNode(Node *ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} + //_requires_strict_order is set to true by default as mandated by auto-vectorization + MulReductionVDNode(Node* ctrl, Node* in1, Node* in2, bool requires_strict_order = true) : + ReductionNode(ctrl, in1, in2), _requires_strict_order(requires_strict_order) {} + virtual int Opcode() const; + + virtual bool requires_strict_order() const { return _requires_strict_order; } + + virtual uint hash() const { return Node::hash() + _requires_strict_order; } + + virtual bool cmp(const Node& n) const { + return Node::cmp(n) && _requires_strict_order == ((ReductionNode&)n).requires_strict_order(); + } + + virtual uint size_of() const { return sizeof(*this); } }; //------------------------------DivVFNode-------------------------------------- @@ -753,9 +841,9 @@ class AndVNode : public VectorNode { //------------------------------AndReductionVNode-------------------------------------- // Vector and byte, short, int, long as a reduction -class AndReductionVNode : public UnorderedReductionNode { +class AndReductionVNode : public ReductionNode { public: - AndReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + AndReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; @@ -770,9 +858,9 @@ class OrVNode : public VectorNode { //------------------------------OrReductionVNode-------------------------------------- // Vector xor byte, short, int, long as a reduction -class OrReductionVNode : public UnorderedReductionNode { +class OrReductionVNode : public ReductionNode { public: - OrReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + OrReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; @@ -787,25 +875,25 @@ class XorVNode : public VectorNode { //------------------------------XorReductionVNode-------------------------------------- // Vector and int, long as a reduction -class XorReductionVNode : public UnorderedReductionNode { +class XorReductionVNode : public ReductionNode { public: - XorReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + XorReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; //------------------------------MinReductionVNode-------------------------------------- // Vector min byte, short, int, long, float, double as a reduction -class MinReductionVNode : public UnorderedReductionNode { +class MinReductionVNode : public ReductionNode { public: - MinReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + MinReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; //------------------------------MaxReductionVNode-------------------------------------- // Vector min byte, short, int, long, float, double as a reduction -class MaxReductionVNode : public UnorderedReductionNode { +class MaxReductionVNode : public ReductionNode { public: - MaxReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {} + MaxReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {} virtual int Opcode() const; }; diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java new file mode 100644 index 0000000000000..327e6e5e12de0 --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.loopopts.superword; + +import compiler.lib.ir_framework.*; + +/* + * @test + * @bug 8320725 + * @summary Ensure strictly ordered AddReductionVF/VD and MulReductionVF/VD nodes + are generated when these operations are auto-vectorized + * @library /test/lib / + * @run driver compiler.loopopts.superword.TestVectorFPReduction + */ + +public class TestVectorFPReduction { + + final private static int SIZE = 1024; + + private static double[] da = new double[SIZE]; + private static double[] db = new double[SIZE]; + private static float[] fa = new float[SIZE]; + private static float[] fb = new float[SIZE]; + private static float fresult; + private static double dresult; + + public static void main(String[] args) { + TestFramework.run(); + } + + @Test + @IR(failOn = {IRNode.ADD_REDUCTION_VF}, + applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"}) + @IR(counts = {"requires_strict_order", ">=1", IRNode.ADD_REDUCTION_VF, ">=1"}, + failOn = {"no_strict_order"}, + applyIfCPUFeatureOr = {"sve", "true", "sse2", "true"}, + phase = CompilePhase.PRINT_IDEAL) + private static void testAddReductionVF() { + float result = 1; + for (int i = 0; i < SIZE; i++) { + result += (fa[i] + fb[i]); + } + fresult += result; + } + + @Test + @IR(failOn = {IRNode.ADD_REDUCTION_VD}, + applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"}) + @IR(counts = {"requires_strict_order", ">=1", IRNode.ADD_REDUCTION_VD, ">=1"}, + failOn = {"no_strict_order"}, + applyIfCPUFeatureOr = {"sve", "true", "sse2", "true"}, + phase = CompilePhase.PRINT_IDEAL) + private static void testAddReductionVD() { + double result = 1; + for (int i = 0; i < SIZE; i++) { + result += (da[i] + db[i]); + } + dresult += result; + } + + @Test + @IR(failOn = {IRNode.MUL_REDUCTION_VF}, + applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"}) + @IR(counts = {"requires_strict_order", ">=1", IRNode.MUL_REDUCTION_VF, ">=1"}, + failOn = {"no_strict_order"}, + applyIfCPUFeatureOr = {"sve", "true", "sse2", "true"}, + phase = CompilePhase.PRINT_IDEAL) + private static void testMulReductionVF() { + float result = 1; + for (int i = 0; i < SIZE; i++) { + result *= (fa[i] + fb[i]); + } + fresult += result; + } + + @Test + @IR(failOn = {IRNode.MUL_REDUCTION_VD}, + applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"}) + @IR(counts = {"requires_strict_order", ">=1", IRNode.MUL_REDUCTION_VD, ">=1"}, + failOn = {"no_strict_order"}, + applyIfCPUFeatureOr = {"sve", "true", "sse2", "true"}, + phase = CompilePhase.PRINT_IDEAL) + private static void testMulReductionVD() { + double result = 1; + for (int i = 0; i < SIZE; i++) { + result *= (da[i] + db[i]); + } + dresult += result; + } +} diff --git a/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java b/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java new file mode 100644 index 0000000000000..549d9aa5d4946 --- /dev/null +++ b/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.vectorapi; + +import compiler.lib.ir_framework.*; + +import jdk.incubator.vector.DoubleVector; +import jdk.incubator.vector.FloatVector; +import jdk.incubator.vector.VectorOperators; +import jdk.incubator.vector.VectorSpecies; + +import java.util.Random; + +import jdk.test.lib.Asserts; +import jdk.test.lib.Utils; + +/** + * @test + * @bug 8320725 + * @library /test/lib / + * @summary Verify non-strictly ordered AddReductionVF/VD and MulReductionVF/VD + * nodes are generated in VectorAPI + * @modules jdk.incubator.vector + * @run driver compiler.vectorapi.TestVectorAddMulReduction + */ + +public class TestVectorAddMulReduction { + + private static final int SIZE = 1024; + private static final Random RD = Utils.getRandomInstance(); + + private static float[] fa; + private static float fres; + private static double[] da; + private static double dres; + + static { + fa = new float[SIZE]; + da = new double[SIZE]; + fres = 1; + dres = 1; + for (int i = 0; i < SIZE; i++) { + fa[i] = RD.nextFloat(); + da[i] = RD.nextDouble(); + } + } + + // Test add reduction operation for floats + @ForceInline + public static void testFloatAddKernel(VectorSpecies SPECIES, float[] f) { + for (int i = 0; i < SPECIES.loopBound(f.length); i += SPECIES.length()) { + var av = FloatVector.fromArray(SPECIES, f, i); + fres += av.reduceLanes(VectorOperators.ADD); + } + } + + @Test + @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=8"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testFloatAdd_64() { + testFloatAddKernel(FloatVector.SPECIES_64, fa); + } + + @Test + @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=16"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testFloatAdd_128() { + testFloatAddKernel(FloatVector.SPECIES_128, fa); + } + + @Test + @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=32"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testFloatAdd_256() { + testFloatAddKernel(FloatVector.SPECIES_256, fa); + } + + @Test + @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=64"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testFloatAdd_512() { + testFloatAddKernel(FloatVector.SPECIES_512, fa); + } + + // Test add reduction operation for doubles + @ForceInline + public static void testDoubleAddKernel(VectorSpecies SPECIES, double[] d) { + for (int i = 0; i < SPECIES.loopBound(d.length); i += SPECIES.length()) { + var av = DoubleVector.fromArray(SPECIES, d, i); + dres += av.reduceLanes(VectorOperators.ADD); + } + } + + @Test + @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=16"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testDoubleAdd_128() { + testDoubleAddKernel(DoubleVector.SPECIES_128, da); + } + + @Test + @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=32"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testDoubleAdd_256() { + testDoubleAddKernel(DoubleVector.SPECIES_256, da); + } + + @Test + @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=64"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testDoubleAdd_512() { + testDoubleAddKernel(DoubleVector.SPECIES_512, da); + } + + // Test mul reduction operation for floats + // On aarch64, there are no direct vector mul reduction instructions for float/double mul reduction + // and scalar instructions are emitted for 64-bit/128-bit vectors. Thus MulReductionVF/VD nodes are generated + // only for vector length of 8B/16B on vectorAPI. + @ForceInline + public static void testFloatMulKernel(VectorSpecies SPECIES, float[] f) { + for (int i = 0; i < SPECIES.loopBound(f.length); i += SPECIES.length()) { + var av = FloatVector.fromArray(SPECIES, f, i); + fres += av.reduceLanes(VectorOperators.MUL); + } + } + + @Test + @IR(counts = {IRNode.MUL_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=8"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testFloatMul_64() { + testFloatMulKernel(FloatVector.SPECIES_64, fa); + } + + @Test + @IR(counts = {IRNode.MUL_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=16"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testFloatMul_128() { + testFloatMulKernel(FloatVector.SPECIES_128, fa); + } + + // Test mul reduction operation for doubles + @ForceInline + public static void testDoubleMulKernel(VectorSpecies SPECIES, double[] d) { + for (int i = 0; i < SPECIES.loopBound(d.length); i += SPECIES.length()) { + var av = DoubleVector.fromArray(SPECIES, d, i); + dres += av.reduceLanes(VectorOperators.MUL); + } + } + + @Test + @IR(counts = {IRNode.MUL_REDUCTION_VD, ">=1", "no_strict_order", ">=1"}, + failOn = {"requires_strict_order"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIf = {"MaxVectorSize", ">=16"}, + phase = CompilePhase.PRINT_IDEAL) + public static void testDoubleMul_128() { + testDoubleMulKernel(DoubleVector.SPECIES_128, da); + } + + public static void main(String[] args) { + TestFramework.runWithFlags("--add-modules=jdk.incubator.vector"); + } +} From 788b876ebd631bdaea99954196eae47b18c49e86 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Tue, 11 Jun 2024 07:53:53 +0000 Subject: [PATCH 023/471] 8333917: G1: Refactor G1CollectedHeap::register_old_region_with_region_attr Reviewed-by: gli, tschatzl --- src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp index ed594d72d06e7..49f1c82a98ab0 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp @@ -227,7 +227,7 @@ void G1CollectedHeap::register_region_with_region_attr(G1HeapRegion* r) { void G1CollectedHeap::register_old_region_with_region_attr(G1HeapRegion* r) { assert(!r->has_pinned_objects(), "must be"); assert(r->rem_set()->is_complete(), "must be"); - _region_attr.set_in_old(r->hrm_index(), r->rem_set()->is_tracked()); + _region_attr.set_in_old(r->hrm_index(), true); _rem_set->exclude_region_from_scan(r->hrm_index()); } From 93f3918ee16fd4360f1d57c379a4bdc4baa88f2b Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Tue, 11 Jun 2024 08:37:47 +0000 Subject: [PATCH 024/471] 8333954: Parallel: Remove unused arguments of type ParCompactionManager* Reviewed-by: iwalulya --- .../share/gc/parallel/psParallelCompact.cpp | 12 +++++------- .../share/gc/parallel/psParallelCompact.hpp | 14 ++++---------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index ffce35ed03c7a..e0d174dcc6ace 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -2228,7 +2228,7 @@ void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosu if (closure.is_full()) { decrement_destination_counts(cm, src_space_id, src_region_idx, closure.source()); - closure.complete_region(cm, dest_addr, region_ptr); + closure.complete_region(dest_addr, region_ptr); return; } @@ -2271,7 +2271,7 @@ void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosu if (closure.is_full()) { decrement_destination_counts(cm, src_space_id, src_region_idx, closure.source()); - closure.complete_region(cm, dest_addr, region_ptr); + closure.complete_region(dest_addr, region_ptr); return; } @@ -2304,7 +2304,7 @@ void PSParallelCompact::fill_and_update_shadow_region(ParCompactionManager* cm, region_ptr->shadow_to_normal(); return fill_region(cm, cl, region_idx); } else { - MoveAndUpdateShadowClosure cl(mark_bitmap(), cm, region_idx, shadow_region); + MoveAndUpdateShadowClosure cl(mark_bitmap(), region_idx, shadow_region); return fill_region(cm, cl, region_idx); } } @@ -2381,8 +2381,7 @@ void MoveAndUpdateClosure::copy_partial_obj(size_t partial_obj_size) update_state(words); } -void MoveAndUpdateClosure::complete_region(ParCompactionManager *cm, HeapWord *dest_addr, - PSParallelCompact::RegionData *region_ptr) { +void MoveAndUpdateClosure::complete_region(HeapWord* dest_addr, PSParallelCompact::RegionData* region_ptr) { assert(region_ptr->shadow_state() == ParallelCompactData::RegionData::NormalRegion, "Region should be finished"); region_ptr->set_completed(); } @@ -2412,8 +2411,7 @@ void MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) { update_state(words); } -void MoveAndUpdateShadowClosure::complete_region(ParCompactionManager *cm, HeapWord *dest_addr, - PSParallelCompact::RegionData *region_ptr) { +void MoveAndUpdateShadowClosure::complete_region(HeapWord* dest_addr, PSParallelCompact::RegionData* region_ptr) { assert(region_ptr->shadow_state() == ParallelCompactData::RegionData::ShadowRegion, "Region should be shadow"); // Record the shadow region index region_ptr->set_shadow_region(_shadow); diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.hpp b/src/hotspot/share/gc/parallel/psParallelCompact.hpp index 5b5e38b72a4b8..93ea7aed78e9f 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.hpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.hpp @@ -895,8 +895,7 @@ class MoveAndUpdateClosure: public StackObj { // updated. void copy_partial_obj(size_t partial_obj_size); - virtual void complete_region(ParCompactionManager* cm, HeapWord* dest_addr, - PSParallelCompact::RegionData* region_ptr); + virtual void complete_region(HeapWord* dest_addr, PSParallelCompact::RegionData* region_ptr); }; inline void MoveAndUpdateClosure::decrement_words_remaining(size_t words) { @@ -932,11 +931,9 @@ inline void MoveAndUpdateClosure::update_state(size_t words) class MoveAndUpdateShadowClosure: public MoveAndUpdateClosure { inline size_t calculate_shadow_offset(size_t region_idx, size_t shadow_idx); public: - inline MoveAndUpdateShadowClosure(ParMarkBitMap* bitmap, ParCompactionManager* cm, - size_t region, size_t shadow); + inline MoveAndUpdateShadowClosure(ParMarkBitMap* bitmap, size_t region, size_t shadow); - virtual void complete_region(ParCompactionManager* cm, HeapWord* dest_addr, - PSParallelCompact::RegionData* region_ptr); + virtual void complete_region(HeapWord* dest_addr, PSParallelCompact::RegionData* region_ptr); private: size_t _shadow; @@ -950,10 +947,7 @@ inline size_t MoveAndUpdateShadowClosure::calculate_shadow_offset(size_t region_ } inline -MoveAndUpdateShadowClosure::MoveAndUpdateShadowClosure(ParMarkBitMap *bitmap, - ParCompactionManager *cm, - size_t region, - size_t shadow) : +MoveAndUpdateShadowClosure::MoveAndUpdateShadowClosure(ParMarkBitMap* bitmap, size_t region, size_t shadow) : MoveAndUpdateClosure(bitmap, region), _shadow(shadow) { _offset = calculate_shadow_offset(region, shadow); From 28437459fb78eda616d50917580c10ed16a4aeff Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Tue, 11 Jun 2024 11:23:53 +0000 Subject: [PATCH 025/471] 8333972: Parallel: Remove unused methods in PSOldGen Reviewed-by: iwalulya --- src/hotspot/share/gc/parallel/psOldGen.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/hotspot/share/gc/parallel/psOldGen.hpp b/src/hotspot/share/gc/parallel/psOldGen.hpp index 35cefec8a0a8d..68cac7128da20 100644 --- a/src/hotspot/share/gc/parallel/psOldGen.hpp +++ b/src/hotspot/share/gc/parallel/psOldGen.hpp @@ -108,11 +108,6 @@ class PSOldGen : public CHeapObj<mtGC> { // Size info size_t capacity_in_bytes() const { return object_space()->capacity_in_bytes(); } size_t used_in_bytes() const { return object_space()->used_in_bytes(); } - size_t free_in_bytes() const { return object_space()->free_in_bytes(); } - - size_t capacity_in_words() const { return object_space()->capacity_in_words(); } - size_t used_in_words() const { return object_space()->used_in_words(); } - size_t free_in_words() const { return object_space()->free_in_words(); } bool is_maximal_no_gc() const { return virtual_space()->uncommitted_size() == 0; From ef101f1bf20f2813f855af4bc4eb317565175208 Mon Sep 17 00:00:00 2001 From: Christian Hagedorn <chagedorn@openjdk.org> Date: Tue, 11 Jun 2024 11:32:12 +0000 Subject: [PATCH 026/471] 8332920: C2: Partial Peeling is wrongly applied for CmpU with negative limit Reviewed-by: kvn, thartmann, epeter --- src/hotspot/share/opto/loopopts.cpp | 204 +++++++++-- ...rtialPeelAtUnsignedTestsNegativeLimit.java | 327 ++++++++++++++++++ 2 files changed, 493 insertions(+), 38 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/TestPartialPeelAtUnsignedTestsNegativeLimit.java diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp index b0effb6d4f526..b19c71fdd8689 100644 --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -2987,52 +2987,101 @@ RegionNode* PhaseIdealLoop::insert_region_before_proj(ProjNode* proj) { return reg; } -//------------------------------ insert_cmpi_loop_exit ------------------------------------- -// Clone a signed compare loop exit from an unsigned compare and -// insert it before the unsigned cmp on the stay-in-loop path. -// All new nodes inserted in the dominator tree between the original -// if and it's projections. The original if test is replaced with -// a constant to force the stay-in-loop path. +// Idea +// ---- +// Partial Peeling tries to rotate the loop in such a way that it can later be turned into a counted loop. Counted loops +// require a signed loop exit test. When calling this method, we've only found a suitable unsigned test to partial peel +// with. Therefore, we try to split off a signed loop exit test from the unsigned test such that it can be used as new +// loop exit while keeping the unsigned test unchanged and preserving the same behavior as if we've used the unsigned +// test alone instead: // -// This is done to make sure that the original if and it's projections -// still dominate the same set of control nodes, that the ctrl() relation -// from data nodes to them is preserved, and that their loop nesting is -// preserved. +// Before Partial Peeling: +// Loop: +// <peeled section> +// Split off signed loop exit test +// <-- CUT HERE --> +// Unchanged unsigned loop exit test +// <rest of unpeeled section> +// goto Loop // -// before -// if(i <u limit) unsigned compare loop exit +// After Partial Peeling: +// <cloned peeled section> +// Cloned split off signed loop exit test +// Loop: +// Unchanged unsigned loop exit test +// <rest of unpeeled section> +// <peeled section> +// Split off signed loop exit test +// goto Loop +// +// Details +// ------- +// Before: +// if (i <u limit) Unsigned loop exit condition // / | // v v // exit-proj stay-in-loop-proj // -// after -// if(stay-in-loop-const) original if -// / | -// / v -// / if(i < limit) new signed test +// Split off a signed loop exit test (i.e. with CmpI) from an unsigned loop exit test (i.e. with CmpU) and insert it +// before the CmpU on the stay-in-loop path and keep both tests: +// +// if (i <u limit) Signed loop exit test +// / | +// / if (i <u limit) Unsigned loop exit test // / / | -// / / v -// / / if(i <u limit) new cloned unsigned test -// / / / | -// v v v | -// region | -// | | -// dum-if | -// / | | -// ether | | -// v v +// v v v +// exit-region stay-in-loop-proj +// +// Implementation +// -------------- +// We need to make sure that the new signed loop exit test is properly inserted into the graph such that the unsigned +// loop exit test still dominates the same set of control nodes, the ctrl() relation from data nodes to both loop +// exit tests is preserved, and their loop nesting is correct. +// +// To achieve that, we clone the unsigned loop exit test completely (leave it unchanged), insert the signed loop exit +// test above it and kill the original unsigned loop exit test by setting it's condition to a constant +// (i.e. stay-in-loop-const in graph below) such that IGVN can fold it later: +// +// if (stay-in-loop-const) Killed original unsigned loop exit test +// / | +// / v +// / if (i < limit) Split off signed loop exit test +// / / | +// / / v +// / / if (i <u limit) Cloned unsigned loop exit test +// / / / | +// v v v | +// exit-region | +// | | +// dummy-if | +// / | | +// dead | | +// v v // exit-proj stay-in-loop-proj // -IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *loop) { +// Note: The dummy-if is inserted to create a region to merge the loop exits between the original to be killed unsigned +// loop exit test and its exit projection while keeping the exit projection (also see insert_region_before_proj()). +// +// Requirements +// ------------ +// Note that we can only split off a signed loop exit test from the unsigned loop exit test when the behavior is exactly +// the same as before with only a single unsigned test. This is only possible if certain requirements are met. +// Otherwise, we need to bail out (see comments in the code below). +IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree* loop) { const bool Signed = true; const bool Unsigned = false; BoolNode* bol = if_cmpu->in(1)->as_Bool(); - if (bol->_test._test != BoolTest::lt) return nullptr; + if (bol->_test._test != BoolTest::lt) { + return nullptr; + } CmpNode* cmpu = bol->in(1)->as_Cmp(); - if (cmpu->Opcode() != Op_CmpU) return nullptr; + assert(cmpu->Opcode() == Op_CmpU, "must be unsigned comparison"); + int stride = stride_of_possible_iv(if_cmpu); - if (stride == 0) return nullptr; + if (stride == 0) { + return nullptr; + } Node* lp_proj = stay_in_loop(if_cmpu, loop); guarantee(lp_proj != nullptr, "null loop node"); @@ -3044,14 +3093,93 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo // We therefore can't add a single exit condition. return nullptr; } - // The loop exit condition is !(i <u limit) ==> (i < 0 || i >= limit). - // Split out the exit condition (i < 0) for stride < 0 or (i >= limit) for stride > 0. - Node* limit = nullptr; + // The unsigned loop exit condition is + // !(i <u limit) + // = i >=u limit + // + // First, we note that for any x for which + // 0 <= x <= INT_MAX + // we can convert x to an unsigned int and still get the same guarantee: + // 0 <= (uint) x <= INT_MAX = (uint) INT_MAX + // 0 <=u (uint) x <=u INT_MAX = (uint) INT_MAX (LEMMA) + // + // With that in mind, if + // limit >= 0 (COND) + // then the unsigned loop exit condition + // i >=u limit (ULE) + // is equivalent to + // i < 0 || i >= limit (SLE-full) + // because either i is negative and therefore always greater than MAX_INT when converting to unsigned + // (uint) i >=u MAX_INT >= limit >= 0 + // or otherwise + // i >= limit >= 0 + // holds due to (LEMMA). + // + // For completeness, a counterexample with limit < 0: + // Assume i = -3 and limit = -2: + // i < 0 + // -2 < 0 + // is true and thus also "i < 0 || i >= limit". But + // i >=u limit + // -3 >=u -2 + // is false. + Node* limit = cmpu->in(2); + const TypeInt* type_limit = _igvn.type(limit)->is_int(); + if (type_limit->_lo < 0) { + return nullptr; + } + + // We prove below that we can extract a single signed loop exit condition from (SLE-full), depending on the stride: + // stride < 0: + // i < 0 (SLE = SLE-negative) + // stride > 0: + // i >= limit (SLE = SLE-positive) + // such that we have the following graph before Partial Peeling with stride > 0 (similar for stride < 0): + // + // Loop: + // <peeled section> + // i >= limit (SLE-positive) + // <-- CUT HERE --> + // i >=u limit (ULE) + // <rest of unpeeled section> + // goto Loop + // + // We exit the loop if: + // (SLE) is true OR (ULE) is true + // However, if (SLE) is true then (ULE) also needs to be true to ensure the exact same behavior. Otherwise, we wrongly + // exit a loop that should not have been exited if we did not apply Partial Peeling. More formally, we need to ensure: + // (SLE) IMPLIES (ULE) + // This indeed holds when (COND) is given: + // - stride > 0: + // i >= limit // (SLE = SLE-positive) + // i >= limit >= 0 // (COND) + // i >=u limit >= 0 // (LEMMA) + // which is the unsigned loop exit condition (ULE). + // - stride < 0: + // i < 0 // (SLE = SLE-negative) + // (uint) i >u MAX_INT // (NEG) all negative values are greater than MAX_INT when converted to unsigned + // MAX_INT >= limit >= 0 // (COND) + // MAX_INT >=u limit >= 0 // (LEMMA) + // and thus from (NEG) and (LEMMA): + // i >=u limit + // which is the unsigned loop exit condition (ULE). + // + // + // After Partial Peeling, we have the following structure for stride > 0 (similar for stride < 0): + // <cloned peeled section> + // i >= limit (SLE-positive) + // Loop: + // i >=u limit (ULE) + // <rest of unpeeled section> + // <peeled section> + // i >= limit (SLE-positive) + // goto Loop + Node* rhs_cmpi; if (stride > 0) { - limit = cmpu->in(2); + rhs_cmpi = limit; // For i >= limit } else { - limit = _igvn.makecon(TypeInt::ZERO); - set_ctrl(limit, C->root()); + rhs_cmpi = _igvn.makecon(TypeInt::ZERO); // For i < 0 + set_ctrl(rhs_cmpi, C->root()); } // Create a new region on the exit path RegionNode* reg = insert_region_before_proj(lp_exit); @@ -3059,7 +3187,7 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo // Clone the if-cmpu-true-false using a signed compare BoolTest::mask rel_i = stride > 0 ? bol->_test._test : BoolTest::ge; - ProjNode* cmpi_exit = insert_if_before_proj(cmpu->in(1), Signed, rel_i, limit, lp_continue); + ProjNode* cmpi_exit = insert_if_before_proj(cmpu->in(1), Signed, rel_i, rhs_cmpi, lp_continue); reg->add_req(cmpi_exit); // Clone the if-cmpu-true-false diff --git a/test/hotspot/jtreg/compiler/loopopts/TestPartialPeelAtUnsignedTestsNegativeLimit.java b/test/hotspot/jtreg/compiler/loopopts/TestPartialPeelAtUnsignedTestsNegativeLimit.java new file mode 100644 index 0000000000000..7809f79ce9d9b --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/TestPartialPeelAtUnsignedTestsNegativeLimit.java @@ -0,0 +1,327 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test id=Xbatch + * @bug 8332920 + * @summary Tests partial peeling at unsigned tests with limit being negative in exit tests "i >u limit". + * @run main/othervm -Xbatch -XX:-TieredCompilation + * -XX:CompileOnly=*TestPartialPeel*::original*,*TestPartialPeel*::test* + * compiler.loopopts.TestPartialPeelAtUnsignedTestsNegativeLimit + */ + +/* + * @test id=Xcomp-run-inline + * @bug 8332920 + * @summary Tests partial peeling at unsigned tests with limit being negative in exit tests "i >u limit". + * @run main/othervm -Xcomp -XX:-TieredCompilation + * -XX:CompileOnly=*TestPartialPeel*::original*,*TestPartialPeel*::run*,*TestPartialPeel*::test* + * -XX:CompileCommand=inline,*TestPartialPeelAtUnsignedTestsNegativeLimit::test* + * -XX:CompileCommand=dontinline,*TestPartialPeelAtUnsignedTestsNegativeLimit::check + * compiler.loopopts.TestPartialPeelAtUnsignedTestsNegativeLimit + */ + +/* + * @test id=Xcomp-compile-test + * @bug 8332920 + * @summary Tests partial peeling at unsigned tests with limit being negative in exit tests "i >u limit". + * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:CompileOnly=*TestPartialPeel*::original*,*TestPartialPeel*::test* + * compiler.loopopts.TestPartialPeelAtUnsignedTestsNegativeLimit + */ + +/* + * @test id=vanilla + * @bug 8332920 + * @requires vm.flavor == "server" & (vm.opt.TieredStopAtLevel == null | vm.opt.TieredStopAtLevel == 4) + * @summary Tests partial peeling at unsigned tests with limit being negative in exit tests "i >u limit". + * Only run this test with C2 since it is time-consuming and only tests a C2 issue. + * @run main compiler.loopopts.TestPartialPeelAtUnsignedTestsNegativeLimit + */ + +package compiler.loopopts; + +import java.util.Random; + +import static java.lang.Integer.*; + +public class TestPartialPeelAtUnsignedTestsNegativeLimit { + static int iFld = 10000; + static int iterations = 0; + static int iFld2; + static boolean flag; + final static Random RANDOM = new Random(); + + public static void main(String[] args) { + compareUnsigned(3, 3); // Load Integer class for -Xcomp + for (int i = 0; i < 2; i++) { + if (!originalTest()) { + throw new RuntimeException("originalTest() failed"); + } + } + + for (int i = 0; i < 2000; i++) { + // For profiling + iFld = -1; + originalTestVariation1(); + + // Actual run + iFld = MAX_VALUE - 100_000; + if (!originalTestVariation1()) { + throw new RuntimeException("originalTestVariation1() failed"); + } + } + + for (int i = 0; i < 2000; ++i) { + // For profiling + iFld = MAX_VALUE; + originalTestVariation2(); + + // Actual run + iFld = MIN_VALUE + 100000; + if (!originalTestVariation2()) { + throw new RuntimeException("originalTestVariation2() failed"); + } + } + + runWhileLTIncr(); + runWhileLTDecr(); + } + + // Originally reported simplified regression test with 2 variations (see below). + public static boolean originalTest() { + for (int i = MAX_VALUE - 50_000; compareUnsigned(i, -1) < 0; i++) { + if (compareUnsigned(MIN_VALUE, i) < 0) { + return true; + } + } + return false; + } + + public static boolean originalTestVariation1() { + int a = 0; + for (int i = iFld; compareUnsigned(i, -1) < 0; ++i) { // i <u -1 + + if (i >= Integer.MIN_VALUE + 1 && i <= 100) { // Transformed to unsigned test. + return true; + } + a *= 23; + } + return false; + } + + public static boolean originalTestVariation2() { + int a = 0; + for (int i = iFld; compareUnsigned(i, -1000) < 0; i--) { // i <u -1 + if (compareUnsigned(MAX_VALUE - 20, i) > 0) { + return true; + } + a = i; + } + System.out.println(a); + return false; + } + + + public static void testWhileLTIncr(int init, int limit) { + int i = init; + while (true) { + // <Peeled Section> + + // Found as loop head in ciTypeFlow, but both paths inside loop -> head not cloned. + // As a result, this head has the safepoint as backedge instead of the loop exit test + // and we cannot create a counted loop (yet). We first need to partial peel. + if (flag) { + } + + iFld2++; + + // Loop exit test i >=u limit (i.e. "while (i <u limit)") to partial peel with. + // insert_cmpi_loop_exit() changes this exit condition into a signed and an unsigned test: + // i >= limit && i >=u limit + // where the signed condition can be used as proper loop exit condition for a counted loop + // (we cannot use an unsigned counted loop exit condition). + // + // After Partial Peeling, we have: + // if (i >= limit) goto Exit + // Loop: + // if (i >=u limit) goto Exit + // ... + // i++; + // if (i >= limit) goto Exit + // goto Loop + // Exit: + // ... + // + // If init = MAX_VALUE and limit = MIN_VALUE: + // i >= limit + // MAX_VALUE >= MIN_VALUE + // which is true where + // i >=u limit + // MAX_VALUE >=u MIN_VALUE + // MAX_VALUE >=u (uint)(MAX_INT + 1) + // is false and we wrongly never enter the loop even though we should have. + // This results in a wrong execution. + if (compareUnsigned(i, limit) >= 0) { + return; + } + // <-- Partial Peeling CUT --> + // Safepoint + // <Unpeeled Section> + iterations++; + i++; + } + } + + // Same as testWhileLTIncr() but with decrement instead. + public static void testWhileLTDecr(int init, int limit) { + int i = init; + while (true) { + if (flag) { + } + + // Loop exit test. + if (compareUnsigned(i, limit) >= 0) { // While (i <u limit) + return; + } + + iterations++; + i--; + } + } + + public static void runWhileLTIncr() { + // Currently works: + testWhileLTIncr(MAX_VALUE, -1); + check(MIN_VALUE); // MAX_VALUE + 1 iterations + testWhileLTIncr(-1, 1); + check(0); + testWhileLTIncr(0, 0); + check(0); + checkIncrWithRandom(0, 0); // Sanity check this method. + flag = !flag; // Change profiling + testWhileLTIncr(MAX_VALUE - 2000, MAX_VALUE); + check(2000); + testWhileLTIncr(MAX_VALUE - 1990, MAX_VALUE); + check(1990); + testWhileLTIncr(MAX_VALUE - 1, MAX_VALUE); + check(1); + testWhileLTIncr(MIN_VALUE, MIN_VALUE + 2000); + check(2000); + testWhileLTIncr(MIN_VALUE, MIN_VALUE + 1990); + check(1990); + testWhileLTIncr(MIN_VALUE, MIN_VALUE + 1); + check(1); + + flag = !flag; + // Overflow currently does not work with negative limit and is fixed with patch: + testWhileLTIncr(MAX_VALUE, MIN_VALUE); + check(1); + testWhileLTIncr(MAX_VALUE - 2000, MIN_VALUE); + check(2001); + testWhileLTIncr(MAX_VALUE, MIN_VALUE + 2000); + check(2001); + testWhileLTIncr(MAX_VALUE - 2000, MIN_VALUE + 2000); + check(4001); + + // Random values + int init = RANDOM.nextInt(0, MAX_VALUE); + int limit = RANDOM.nextInt(MIN_VALUE, 0); + testWhileLTIncr(init, limit); + checkIncrWithRandom(init, limit); + } + + public static void runWhileLTDecr() { + // Currently works: + testWhileLTDecr(1, -1); + check(2); + testWhileLTDecr(-1, 1); + check(0); + testWhileLTDecr(0, 0); + check(0); + checkDecrWithRandom(0, 0); // Sanity check this method. + flag = !flag; + testWhileLTDecr(MAX_VALUE, MIN_VALUE); + check(MIN_VALUE); // MAX_VALUE + 1 iterations + testWhileLTDecr(MAX_VALUE, -1); + check(MIN_VALUE); // MAX_VALUE + 1 iterations + testWhileLTDecr(MAX_VALUE, MIN_VALUE); + check(MIN_VALUE); // MAX_VALUE + 1 iterations + testWhileLTDecr(MIN_VALUE, 0); + check(0); + testWhileLTDecr(MIN_VALUE, 1); + check(0); + flag = !flag; + + // Underflow currently does not work with negative limit and is fixed with patch: + testWhileLTDecr(MIN_VALUE, -1); + check(MIN_VALUE + 1); // MAX_VALUE + 2 iterations + testWhileLTDecr(MIN_VALUE, -2000); + check(MIN_VALUE + 1); // MAX_VALUE + 2 iterations + testWhileLTDecr(MIN_VALUE, MIN_VALUE + 1); + check(MIN_VALUE + 1); // MAX_VALUE + 2 iterations + testWhileLTDecr(MIN_VALUE + 2000, -1); + check(MIN_VALUE + 2001); // MAX_VALUE + 2002 iterations + testWhileLTDecr(MIN_VALUE + 2000, -2000); + check(MIN_VALUE + 2001); // MAX_VALUE + 2002 iterations + testWhileLTDecr(MIN_VALUE + 2000, MIN_VALUE + 2001); + check(MIN_VALUE + 2001); // MAX_VALUE + 2002 iterations + + // Random values + int r1 = RANDOM.nextInt(MIN_VALUE, 0); + int r2 = RANDOM.nextInt(MIN_VALUE, 0); + int init = Math.min(r1, r2); + int limit = Math.max(r1, r2); + testWhileLTDecr(init, limit); + checkDecrWithRandom(init, limit); + } + + static void check(int expectedIterations) { + if (expectedIterations != iterations) { + throw new RuntimeException("Expected " + expectedIterations + " iterations but only got " + iterations); + } + iterations = 0; // Reset + } + + static void checkIncrWithRandom(long init, long limit) { + long expectedIterations = ((long)(MAX_VALUE) - init) + (limit - (long)MIN_VALUE) + 1; + if ((int)expectedIterations != iterations) { + String error = "Expected %d iterations but only got %d, init: %d, limit: %d" + .formatted(expectedIterations, iterations, init, limit); + throw new RuntimeException(error); + } + iterations = 0; // Reset + } + + static void checkDecrWithRandom(long init, long limit) { + long expectedIterations = init + MIN_VALUE + MAX_VALUE + 2; + if (init == limit) { + expectedIterations = 0; + } + if ((int)expectedIterations != iterations) { + String error = "Expected %d iterations but only got %d, init: %d, limit: %d" + .formatted(expectedIterations, iterations, init, limit); + throw new RuntimeException(error); + } + iterations = 0; // Reset + } +} From aaaa86b57172d45d1126c50efc270c6e49aba7a5 Mon Sep 17 00:00:00 2001 From: Renjith Kannath Pariyangad <rkannathpari@openjdk.org> Date: Tue, 11 Jun 2024 11:47:19 +0000 Subject: [PATCH 027/471] 8333360: PrintNullString.java doesn't use float arguments Reviewed-by: aivanov, abhiscxk, achung --- test/jdk/java/awt/print/PrinterJob/PrintNullString.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/java/awt/print/PrinterJob/PrintNullString.java b/test/jdk/java/awt/print/PrinterJob/PrintNullString.java index e4323b232a7d9..397dd2902d108 100644 --- a/test/jdk/java/awt/print/PrinterJob/PrintNullString.java +++ b/test/jdk/java/awt/print/PrinterJob/PrintNullString.java @@ -148,7 +148,7 @@ private void paint(Graphics2D g2d) { // API 3: null & empty drawString(Iterator, int, int); try { g2d.drawString(nullIterator, 20, 120); - g2d.drawString("FAILURE: No NPE for null iterator, float", 20, 120); + g2d.drawString("FAILURE: No NPE for null iterator, int", 20, 120); } catch (NullPointerException e) { g2d.drawString("caught expected NPE for null iterator, int", 20, 120); } @@ -169,7 +169,7 @@ private void paint(Graphics2D g2d) { } try { - g2d.drawString(emptyIterator, 20, 180); + g2d.drawString(emptyIterator, 20.0f, 180.0f); g2d.drawString("FAILURE: No IAE for empty iterator, float", 20, 180); } catch (IllegalArgumentException e) { g2d.drawString("caught expected IAE for empty iterator, float", 20, 180); From b77bd5fd6a6f7ddbed90300fba790da4fb683275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jeli=C5=84ski?= <djelinski@openjdk.org> Date: Tue, 11 Jun 2024 17:34:09 +0000 Subject: [PATCH 028/471] 8333742: ProcessImpl and ProcessHandleImpl may mishandle processes that exit with code 259 Reviewed-by: rriggs --- .../classes/java/lang/ProcessImpl.java | 16 ++++++---- .../native/libjava/ProcessHandleImpl_win.c | 30 +++++++------------ .../windows/native/libjava/ProcessImpl_md.c | 7 ++--- .../java/lang/ProcessHandle/OnExitTest.java | 12 ++++++-- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/java.base/windows/classes/java/lang/ProcessImpl.java b/src/java.base/windows/classes/java/lang/ProcessImpl.java index d6fb51c4494ed..fd0d5b03b0cdf 100644 --- a/src/java.base/windows/classes/java/lang/ProcessImpl.java +++ b/src/java.base/windows/classes/java/lang/ProcessImpl.java @@ -557,8 +557,14 @@ public InputStream getErrorStream() { public int exitValue() { int exitCode = getExitCodeProcess(handle); - if (exitCode == STILL_ACTIVE) - throw new IllegalThreadStateException("process has not exited"); + if (exitCode == STILL_ACTIVE) { + // STILL_ACTIVE (259) might be the real exit code + if (isProcessAlive(handle)) { + throw new IllegalThreadStateException("process has not exited"); + } + // call again, in case the process just exited + return getExitCodeProcess(handle); + } return exitCode; } private static native int getExitCodeProcess(long handle); @@ -582,7 +588,7 @@ public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException { long remainingNanos = unit.toNanos(timeout); // throw NPE before other conditions - if (getExitCodeProcess(handle) != STILL_ACTIVE) return true; + if (!isProcessAlive(handle)) return true; if (timeout <= 0) return false; long deadline = System.nanoTime() + remainingNanos; @@ -601,13 +607,13 @@ public boolean waitFor(long timeout, TimeUnit unit) } if (Thread.interrupted()) throw new InterruptedException(); - if (getExitCodeProcess(handle) != STILL_ACTIVE) { + if (!isProcessAlive(handle)) { return true; } remainingNanos = deadline - System.nanoTime(); } while (remainingNanos > 0); - return (getExitCodeProcess(handle) != STILL_ACTIVE); + return !isProcessAlive(handle); } private static native void waitForTimeoutInterruptibly( diff --git a/src/java.base/windows/native/libjava/ProcessHandleImpl_win.c b/src/java.base/windows/native/libjava/ProcessHandleImpl_win.c index 0bc036b723656..0064113729ac5 100644 --- a/src/java.base/windows/native/libjava/ProcessHandleImpl_win.c +++ b/src/java.base/windows/native/libjava/ProcessHandleImpl_win.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -109,27 +109,19 @@ Java_java_lang_ProcessHandleImpl_waitForProcessExit0(JNIEnv* env, if (handle == NULL) { return exitValue; // No process with that pid is alive } - do { - if (!GetExitCodeProcess(handle, &exitValue)) { + if (!GetExitCodeProcess(handle, &exitValue)) { + JNU_ThrowByNameWithLastError(env, + "java/lang/RuntimeException", "GetExitCodeProcess"); + } else if (exitValue == STILL_ACTIVE) { + if (WaitForSingleObject(handle, INFINITE) /* Wait forever */ + == WAIT_FAILED) { + JNU_ThrowByNameWithLastError(env, + "java/lang/RuntimeException", "WaitForSingleObjects"); + } else if (!GetExitCodeProcess(handle, &exitValue)) { JNU_ThrowByNameWithLastError(env, "java/lang/RuntimeException", "GetExitCodeProcess"); - break; - } - if (exitValue == STILL_ACTIVE) { - HANDLE events[2]; - events[0] = handle; - events[1] = JVM_GetThreadInterruptEvent(); - - if (WaitForMultipleObjects(sizeof(events)/sizeof(events[0]), events, - FALSE, /* Wait for ANY event */ - INFINITE) /* Wait forever */ - == WAIT_FAILED) { - JNU_ThrowByNameWithLastError(env, - "java/lang/RuntimeException", "WaitForMultipleObjects"); - break; - } } - } while (exitValue == STILL_ACTIVE); + } CloseHandle(handle); // Ignore return code return exitValue; } diff --git a/src/java.base/windows/native/libjava/ProcessImpl_md.c b/src/java.base/windows/native/libjava/ProcessImpl_md.c index a1890578888e9..127c27981ba39 100644 --- a/src/java.base/windows/native/libjava/ProcessImpl_md.c +++ b/src/java.base/windows/native/libjava/ProcessImpl_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -467,9 +467,8 @@ Java_java_lang_ProcessImpl_terminateProcess(JNIEnv *env, jclass ignored, jlong h JNIEXPORT jboolean JNICALL Java_java_lang_ProcessImpl_isProcessAlive(JNIEnv *env, jclass ignored, jlong handle) { - DWORD dwExitStatus; - GetExitCodeProcess((HANDLE) handle, &dwExitStatus); - return dwExitStatus == STILL_ACTIVE; + return WaitForSingleObject((HANDLE) handle, 0) /* don't wait */ + == WAIT_TIMEOUT; } JNIEXPORT jboolean JNICALL diff --git a/test/jdk/java/lang/ProcessHandle/OnExitTest.java b/test/jdk/java/lang/ProcessHandle/OnExitTest.java index b75775b51a2c3..79c696efdfc28 100644 --- a/test/jdk/java/lang/ProcessHandle/OnExitTest.java +++ b/test/jdk/java/lang/ProcessHandle/OnExitTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import jdk.test.lib.Platform; import jdk.test.lib.Utils; import org.testng.annotations.Test; @@ -40,6 +41,7 @@ /* * @test + * @bug 8333742 * @requires vm.flagless * @library /test/lib * @modules jdk.management @@ -65,8 +67,10 @@ public static void main(String[] args) { @Test public static void test1() { try { - int[] exitValues = {0, 1, 10}; + int[] exitValues = {0, 1, 10, 259}; for (int value : exitValues) { + // Linux & Mac don't support exit codes longer than 8 bits, skip + if (value == 259 && !Platform.isWindows()) continue; Process p = JavaChild.spawn("exit", Integer.toString(value)); CompletableFuture<Process> future = p.onExit(); future.thenAccept( (ph) -> { @@ -81,7 +85,9 @@ public static void test1() { Assert.assertEquals(h, p); Assert.assertEquals(p.exitValue(), value); Assert.assertFalse(p.isAlive(), "Process should not be alive"); - p.waitFor(); + Assert.assertEquals(p.waitFor(), value); + Assert.assertTrue(p.waitFor(1, TimeUnit.MILLISECONDS), + "waitFor should return true"); } } catch (IOException | InterruptedException | ExecutionException ex) { Assert.fail(ex.getMessage(), ex); From 7ed8a5c431e1cba34167896f8d331caf594852ef Mon Sep 17 00:00:00 2001 From: Leonid Mesnik <lmesnik@openjdk.org> Date: Tue, 11 Jun 2024 18:40:20 +0000 Subject: [PATCH 029/471] 8333841: Add more logging into setfldw001 tests Reviewed-by: cjplummer, amenkov, sspitsyn --- test/hotspot/jtreg/ProblemList-Xcomp.txt | 2 -- .../SetFieldAccessWatch/setfldw001/TestDescription.java | 9 ++++++++- .../jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp | 9 +++++++++ .../setfmodw001/TestDescription.java | 9 ++++++++- .../setfmodw001/setfmodw001.cpp | 8 ++++++++ 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList-Xcomp.txt b/test/hotspot/jtreg/ProblemList-Xcomp.txt index 2364d601cd746..9a52a731039fe 100644 --- a/test/hotspot/jtreg/ProblemList-Xcomp.txt +++ b/test/hotspot/jtreg/ProblemList-Xcomp.txt @@ -28,8 +28,6 @@ ############################################################################# vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TestDescription.java 8287324 generic-all -vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java 8205957 generic-all -vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java 8205957 linux-x64,windows-x64 vmTestbase/nsk/jvmti/scenarios/sampling/SP07/sp07t002/TestDescription.java 8245680 windows-x64 vmTestbase/vm/mlvm/mixed/stress/regression/b6969574/INDIFY_Test.java 8265295 linux-x64,windows-x64 diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java index b2af441294754..de99ad3686eff 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,3 +48,10 @@ * @run main/othervm/native -agentlib:setfldw001 nsk.jvmti.SetFieldAccessWatch.setfldw001 */ +/* + * @test id=logging + * + * @library /vmTestbase + * /test/lib + * @run main/othervm/native -agentlib:setfldw001 -XX:TraceJVMTI=ec+,+ioe,+s -Xlog:jvmti=trace:file=vm.%p.log nsk.jvmti.SetFieldAccessWatch.setfldw001 + */ diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp index 57286ce78a02b..67d92df6dd242 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp @@ -26,6 +26,7 @@ #include <ctype.h> #include "jvmti.h" #include "agent_common.hpp" +#include "jvmti_common.hpp" #include "JVMTITools.hpp" extern "C" { @@ -114,6 +115,14 @@ void JNICALL FieldAccess(jvmtiEnv *jvmti_env, JNIEnv *env, } fld_ind = (int)(fld_name[len - 1] - '0'); /* last digit is index in the array */ fields[fld_ind].thrown_fid = field; + + if (field == nullptr) { + fatal(env, "null field ID in FieldModification event."); + } + + LOG("Event: (Field %d) field ID expected: 0x%p, got: 0x%p\n", + fld_ind, fields[fld_ind].fid, field); + jvmti_env->Deallocate((unsigned char*) fld_name); } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java index 1decdae357da3..d0cbdc288b4b5 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,3 +48,10 @@ * @run main/othervm/native -agentlib:setfmodw001 nsk.jvmti.SetFieldModificationWatch.setfmodw001 */ +/* + * @test id=logging + * + * @library /vmTestbase + * /test/lib + * @run main/othervm/native -agentlib:setfmodw001 -XX:TraceJVMTI=ec+,+ioe,+s -Xlog:jvmti=trace:file=vm.%p.log nsk.jvmti.SetFieldModificationWatch.setfmodw001 + */ diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/setfmodw001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/setfmodw001.cpp index 28851bc683809..4e41aa285e3a0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/setfmodw001.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/setfmodw001.cpp @@ -26,6 +26,7 @@ #include <ctype.h> #include "jvmti.h" #include "agent_common.hpp" +#include "jvmti_common.hpp" #include "JVMTITools.hpp" extern "C" { @@ -108,6 +109,13 @@ void JNICALL FieldModification(jvmtiEnv *jvmti_env, JNIEnv *env, } fld_ind = (int)(fld_name[len - 1] - '0'); /* last digit is index in the array */ fields[fld_ind].thrown_fid = field; + + if (field == nullptr) { + fatal(env, "null field ID in FieldModification event."); + } + LOG("Event: (Field %d) field ID expected: 0x%p, got: 0x%p\n", + fld_ind, fields[fld_ind].fid, field); + jvmti_env->Deallocate((unsigned char*) fld_name); } From bbd3b1d812da997347fca4c06e22794285ab00d3 Mon Sep 17 00:00:00 2001 From: Alexandre Iline <shurailine@openjdk.org> Date: Tue, 11 Jun 2024 20:10:46 +0000 Subject: [PATCH 030/471] 8334036: Update JCov for class file version 68 Reviewed-by: alanb, erikj --- make/conf/jib-profiles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make/conf/jib-profiles.js b/make/conf/jib-profiles.js index 44b5c5d6f4fa4..b6f091398d5c9 100644 --- a/make/conf/jib-profiles.js +++ b/make/conf/jib-profiles.js @@ -1200,7 +1200,7 @@ var getJibProfilesDependencies = function (input, common) { jcov: { organization: common.organization, - revision: "3.0-16-jdk-asm+1.0", + revision: "3.0-17-jdk-asm+1.0", ext: "zip", environment_name: "JCOV_HOME", }, From 56e8e60792b23bc101f46b497dcc9d3c76855384 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik <lmesnik@openjdk.org> Date: Tue, 11 Jun 2024 21:03:20 +0000 Subject: [PATCH 031/471] 8330534: Update nsk/jdwp tests to use driver instead of othervm Reviewed-by: sspitsyn, cjplummer --- .../jdwp/ArrayReference/GetValues/getvalues001.java | 7 +++++-- .../GetValues/getvalues001/TestDescription.java | 4 ++-- .../jdwp/ArrayReference/GetValues/getvalues002.java | 7 +++++-- .../GetValues/getvalues002/TestDescription.java | 4 ++-- .../nsk/jdwp/ArrayReference/Length/length001.java | 7 +++++-- .../Length/length001/TestDescription.java | 4 ++-- .../jdwp/ArrayReference/SetValues/setvalues001.java | 7 +++++-- .../SetValues/setvalues001/TestDescription.java | 4 ++-- .../jdwp/ArrayType/NewInstance/newinstance001.java | 7 +++++-- .../NewInstance/newinstance001/TestDescription.java | 4 ++-- .../VisibleClasses/visibclasses001.java | 7 +++++-- .../visibclasses001/TestDescription.java | 4 ++-- .../ReflectedType/reflectype001.java | 7 +++++-- .../ReflectedType/reflectype001/TestDescription.java | 4 ++-- .../jdwp/ClassType/InvokeMethod/invokemeth001.java | 7 +++++-- .../InvokeMethod/invokemeth001/TestDescription.java | 4 ++-- .../nsk/jdwp/ClassType/NewInstance/newinst001.java | 9 ++++++--- .../NewInstance/newinst001/TestDescription.java | 4 ++-- .../nsk/jdwp/ClassType/SetValues/setvalues001.java | 7 +++++-- .../SetValues/setvalues001/TestDescription.java | 4 ++-- .../nsk/jdwp/ClassType/Superclass/superclass001.java | 7 +++++-- .../Superclass/superclass001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/BREAKPOINT/breakpoint001.java | 9 ++++++--- .../BREAKPOINT/breakpoint001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java | 9 ++++++--- .../CLASS_PREPARE/clsprepare001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java | 9 ++++++--- .../CLASS_UNLOAD/clsunload001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/Composite/composite001.java | 9 ++++++--- .../Event/Composite/composite001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/EXCEPTION/exception001.java | 9 ++++++--- .../Event/EXCEPTION/exception001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java | 9 ++++++--- .../FIELD_ACCESS/fldaccess001/TestDescription.java | 4 ++-- .../Event/FIELD_MODIFICATION/fldmodification001.java | 9 ++++++--- .../fldmodification001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/METHOD_ENTRY/methentry001.java | 9 ++++++--- .../METHOD_ENTRY/methentry001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/METHOD_EXIT/methexit001.java | 9 ++++++--- .../METHOD_EXIT/methexit001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/SINGLE_STEP/singlestep001.java | 9 ++++++--- .../SINGLE_STEP/singlestep001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/SINGLE_STEP/singlestep002.java | 9 ++++++--- .../SINGLE_STEP/singlestep002/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/SINGLE_STEP/singlestep003.java | 9 ++++++--- .../SINGLE_STEP/singlestep003/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java | 9 ++++++--- .../THREAD_DEATH/thrdeath001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/THREAD_START/thrstart001.java | 9 ++++++--- .../THREAD_START/thrstart001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/VM_DEATH/vmdeath001.java | 9 ++++++--- .../Event/VM_DEATH/vmdeath001/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/VM_DEATH/vmdeath002.java | 9 ++++++--- .../Event/VM_DEATH/vmdeath002/TestDescription.java | 4 ++-- .../nsk/jdwp/Event/VM_START/vmstart001.java | 9 ++++++--- .../Event/VM_START/vmstart001/TestDescription.java | 4 ++-- .../nsk/jdwp/EventRequest/Clear/clear001.java | 9 ++++++--- .../EventRequest/Clear/clear001/TestDescription.java | 4 ++-- .../ClearAllBreakpoints/clrallbreakp001.java | 9 ++++++--- .../clrallbreakp001/TestDescription.java | 4 ++-- .../ClearAllBreakpoints/clrallbreakp002.java | 9 ++++++--- .../clrallbreakp002/TestDescription.java | 4 ++-- .../ClearAllBreakpoints/clrallbreakp003.java | 9 ++++++--- .../clrallbreakp003/TestDescription.java | 4 ++-- .../vmTestbase/nsk/jdwp/EventRequest/Set/set001.java | 9 ++++++--- .../jdwp/EventRequest/Set/set001/TestDescription.java | 4 ++-- .../vmTestbase/nsk/jdwp/EventRequest/Set/set002.java | 9 ++++++--- .../jdwp/EventRequest/Set/set002/TestDescription.java | 4 ++-- .../nsk/jdwp/Method/Bytecodes/bytecodes001.java | 7 +++++-- .../Bytecodes/bytecodes001/TestDescription.java | 4 ++-- .../nsk/jdwp/Method/IsObsolete/isobsolete001.java | 7 +++++-- .../IsObsolete/isobsolete001/TestDescription.java | 4 ++-- .../nsk/jdwp/Method/IsObsolete/isobsolete002.java | 7 +++++-- .../IsObsolete/isobsolete002/TestDescription.java | 4 ++-- .../nsk/jdwp/Method/LineTable/linetable001.java | 7 +++++-- .../LineTable/linetable001/TestDescription.java | 4 ++-- .../nsk/jdwp/Method/VariableTable/vartable001.java | 7 +++++-- .../VariableTable/vartable001/TestDescription.java | 4 ++-- .../VariableTableWithGeneric/vartblwithgen001.java | 7 +++++-- .../vartblwithgen001/TestDescription.java | 4 ++-- .../DisableCollection/disablecol001.java | 7 +++++-- .../disablecol001/TestDescription.java | 4 ++-- .../EnableCollection/enablecol001.java | 7 +++++-- .../enablecol001/TestDescription.java | 4 ++-- .../jdwp/ObjectReference/GetValues/getvalues001.java | 7 +++++-- .../GetValues/getvalues001/TestDescription.java | 4 ++-- .../ObjectReference/InvokeMethod/invokemeth001.java | 7 +++++-- .../InvokeMethod/invokemeth001/TestDescription.java | 4 ++-- .../ObjectReference/IsCollected/iscollected001.java | 7 +++++-- .../IsCollected/iscollected001/TestDescription.java | 4 ++-- .../ObjectReference/MonitorInfo/monitorinfo001.java | 7 +++++-- .../MonitorInfo/monitorinfo001/TestDescription.java | 4 ++-- .../ReferenceType/referencetype001.java | 7 +++++-- .../referencetype001/TestDescription.java | 4 ++-- .../referringObjects001/referringObjects001.java | 9 ++++++--- .../referringObjects002/referringObjects002.java | 9 ++++++--- .../jdwp/ObjectReference/SetValues/setvalues001.java | 7 +++++-- .../SetValues/setvalues001/TestDescription.java | 4 ++-- .../ReferenceType/ClassLoader/classloader001.java | 7 +++++-- .../ClassLoader/classloader001/TestDescription.java | 4 ++-- .../jdwp/ReferenceType/ClassObject/classobj001.java | 7 +++++-- .../ClassObject/classobj001/TestDescription.java | 4 ++-- .../nsk/jdwp/ReferenceType/Fields/fields001.java | 7 +++++-- .../Fields/fields001/TestDescription.java | 4 ++-- .../FieldsWithGeneric/fldwithgeneric001.java | 9 ++++++--- .../fldwithgeneric001/TestDescription.java | 4 ++-- .../jdwp/ReferenceType/GetValues/getvalues001.java | 7 +++++-- .../GetValues/getvalues001/TestDescription.java | 4 ++-- .../Instances/instances001/instances001.java | 9 ++++++--- .../Instances/instances002/instances002.java | 11 +++++++---- .../jdwp/ReferenceType/Interfaces/interfaces001.java | 7 +++++-- .../Interfaces/interfaces001/TestDescription.java | 4 ++-- .../nsk/jdwp/ReferenceType/Methods/methods001.java | 7 +++++-- .../Methods/methods001/TestDescription.java | 4 ++-- .../MethodsWithGeneric/methwithgeneric001.java | 9 ++++++--- .../methwithgeneric001/TestDescription.java | 4 ++-- .../jdwp/ReferenceType/Modifiers/modifiers001.java | 7 +++++-- .../Modifiers/modifiers001/TestDescription.java | 4 ++-- .../ReferenceType/NestedTypes/nestedtypes001.java | 7 +++++-- .../NestedTypes/nestedtypes001/TestDescription.java | 4 ++-- .../jdwp/ReferenceType/Signature/signature001.java | 7 +++++-- .../Signature/signature001/TestDescription.java | 4 ++-- .../SignatureWithGeneric/sigwithgeneric001.java | 9 ++++++--- .../sigwithgeneric001/TestDescription.java | 4 ++-- .../SourceDebugExtension/srcdebugext001.java | 7 +++++-- .../srcdebugext001/TestDescription.java | 4 ++-- .../nsk/jdwp/ReferenceType/SourceFile/srcfile001.java | 7 +++++-- .../SourceFile/srcfile001/TestDescription.java | 4 ++-- .../nsk/jdwp/ReferenceType/Status/status001.java | 7 +++++-- .../Status/status001/TestDescription.java | 4 ++-- .../nsk/jdwp/StackFrame/GetValues/getvalues001.java | 7 +++++-- .../GetValues/getvalues001/TestDescription.java | 4 ++-- .../nsk/jdwp/StackFrame/PopFrames/popframes001.java | 7 +++++-- .../PopFrames/popframes001/TestDescription.java | 4 ++-- .../nsk/jdwp/StackFrame/SetValues/setvalues001.java | 7 +++++-- .../SetValues/setvalues001/TestDescription.java | 4 ++-- .../nsk/jdwp/StackFrame/ThisObject/thisobject001.java | 7 +++++-- .../ThisObject/thisobject001/TestDescription.java | 4 ++-- .../nsk/jdwp/StringReference/Value/value001.java | 7 +++++-- .../Value/value001/TestDescription.java | 4 ++-- .../ThreadGroupReference/Children/children001.java | 7 +++++-- .../Children/children001/TestDescription.java | 4 ++-- .../nsk/jdwp/ThreadGroupReference/Name/name001.java | 7 +++++-- .../Name/name001/TestDescription.java | 4 ++-- .../jdwp/ThreadGroupReference/Parent/parent001.java | 7 +++++-- .../Parent/parent001/TestDescription.java | 4 ++-- .../CurrentContendedMonitor/curcontmonitor001.java | 7 +++++-- .../curcontmonitor001/TestDescription.java | 4 ++-- .../forceEarlyReturn001/forceEarlyReturn001.java | 11 +++++++---- .../forceEarlyReturn002/forceEarlyReturn002.java | 9 ++++++--- .../jdwp/ThreadReference/FrameCount/framecnt001.java | 7 +++++-- .../FrameCount/framecnt001/TestDescription.java | 4 ++-- .../nsk/jdwp/ThreadReference/Frames/frames001.java | 7 +++++-- .../Frames/frames001/TestDescription.java | 4 ++-- .../jdwp/ThreadReference/Interrupt/interrupt001.java | 7 +++++-- .../Interrupt/interrupt001/TestDescription.java | 4 ++-- .../nsk/jdwp/ThreadReference/Name/name001.java | 7 +++++-- .../ThreadReference/Name/name001/TestDescription.java | 4 ++-- .../ThreadReference/OwnedMonitors/ownmonitors001.java | 7 +++++-- .../OwnedMonitors/ownmonitors001/TestDescription.java | 4 ++-- .../ownedMonitorsStackDepthInfo001.java | 9 ++++++--- .../ownedMonitorsStackDepthInfo002.java | 11 +++++++---- .../nsk/jdwp/ThreadReference/Resume/resume001.java | 7 +++++-- .../Resume/resume001/TestDescription.java | 4 ++-- .../nsk/jdwp/ThreadReference/Status/status001.java | 7 +++++-- .../Status/status001/TestDescription.java | 4 ++-- .../nsk/jdwp/ThreadReference/Stop/stop001.java | 7 +++++-- .../ThreadReference/Stop/stop001/TestDescription.java | 4 ++-- .../nsk/jdwp/ThreadReference/Suspend/suspend001.java | 7 +++++-- .../Suspend/suspend001/TestDescription.java | 4 ++-- .../ThreadReference/SuspendCount/suspendcnt001.java | 7 +++++-- .../SuspendCount/suspendcnt001/TestDescription.java | 4 ++-- .../ThreadReference/ThreadGroup/threadgroup001.java | 7 +++++-- .../ThreadGroup/threadgroup001/TestDescription.java | 4 ++-- .../jdwp/VirtualMachine/AllClasses/allclasses001.java | 7 +++++-- .../AllClasses/allclasses001/TestDescription.java | 4 ++-- .../AllClassesWithGeneric/allclswithgeneric001.java | 9 ++++++--- .../allclswithgeneric001/TestDescription.java | 4 ++-- .../jdwp/VirtualMachine/AllThreads/allthreads001.java | 7 +++++-- .../AllThreads/allthreads001/TestDescription.java | 4 ++-- .../VirtualMachine/Capabilities/capabilities001.java | 7 +++++-- .../Capabilities/capabilities001/TestDescription.java | 4 ++-- .../CapabilitiesNew/capabilitiesnew001.java | 7 +++++-- .../capabilitiesnew001/TestDescription.java | 4 ++-- .../jdwp/VirtualMachine/ClassPaths/classpaths001.java | 7 +++++-- .../ClassPaths/classpaths001/TestDescription.java | 4 ++-- .../ClassesBySignature/classbysig001.java | 7 +++++-- .../classbysig001/TestDescription.java | 4 ++-- .../VirtualMachine/CreateString/createstr001.java | 7 +++++-- .../CreateString/createstr001/TestDescription.java | 4 ++-- .../nsk/jdwp/VirtualMachine/Dispose/dispose001.java | 7 +++++-- .../Dispose/dispose001/TestDescription.java | 4 ++-- .../VirtualMachine/DisposeObjects/disposeobj001.java | 7 +++++-- .../DisposeObjects/disposeobj001/TestDescription.java | 4 ++-- .../nsk/jdwp/VirtualMachine/Exit/exit001.java | 7 +++++-- .../VirtualMachine/Exit/exit001/TestDescription.java | 4 ++-- .../jdwp/VirtualMachine/HoldEvents/holdevents001.java | 7 +++++-- .../HoldEvents/holdevents001/TestDescription.java | 4 ++-- .../jdwp/VirtualMachine/HoldEvents/holdevents002.java | 9 ++++++--- .../nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java | 7 +++++-- .../IDSizes/idsizes001/TestDescription.java | 4 ++-- .../instanceCounts001/instanceCounts001.java | 9 ++++++--- .../RedefineClasses/redefinecls001.java | 7 +++++-- .../redefinecls001/TestDescription.java | 4 ++-- .../ReleaseEvents/releaseevents001.java | 7 +++++-- .../releaseevents001/TestDescription.java | 4 ++-- .../ReleaseEvents/releaseevents002.java | 9 ++++++--- .../releaseevents002/TestDescription.java | 4 ++-- .../nsk/jdwp/VirtualMachine/Resume/resume001.java | 7 +++++-- .../Resume/resume001/TestDescription.java | 4 ++-- .../SetDefaultStratum/setdefstrat001.java | 7 +++++-- .../setdefstrat001/TestDescription.java | 4 ++-- .../TopLevelThreadGroups/threadgroups001.java | 7 +++++-- .../threadgroups001/TestDescription.java | 4 ++-- .../nsk/jdwp/VirtualMachine/Version/version001.java | 7 +++++-- .../Version/version001/TestDescription.java | 4 ++-- .../nsk/jdwp/VirtualMachine/Version/version002.java | 7 +++++-- .../Version/version002/TestDescription.java | 4 ++-- .../vmTestbase/nsk/share/jpda/DebugeeBinder.java | 8 ++++---- 219 files changed, 824 insertions(+), 482 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001.java index 60ae805703b18..5af71d569f162 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,7 +89,10 @@ public class getvalues001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001/TestDescription.java index 4fc9630df3c87..04ddee420613c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ArrayReference.GetValues.getvalues001a - * @run main/othervm + * @run driver * nsk.jdwp.ArrayReference.GetValues.getvalues001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002.java index 47f4097dae680..d5d44faef48a3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -116,7 +116,10 @@ public class getvalues002 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002/TestDescription.java index 92b567dccf276..5e1e30ae541ca 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ArrayReference.GetValues.getvalues002a - * @run main/othervm + * @run driver * nsk.jdwp.ArrayReference.GetValues.getvalues002 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001.java index 36324982533e8..45acc929bfa2a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,7 +85,10 @@ public class length001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001/TestDescription.java index 164d8c8ecab8d..2f96d7c3a0792 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ArrayReference.Length.length001a - * @run main/othervm + * @run driver * nsk.jdwp.ArrayReference.Length.length001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001.java index 117d66fe24c48..12c06d8735df6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -92,7 +92,10 @@ public class setvalues001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001/TestDescription.java index 380ba4549ef48..bf252a44d43ce 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ArrayReference.SetValues.setvalues001a - * @run main/othervm + * @run driver * nsk.jdwp.ArrayReference.SetValues.setvalues001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001.java index c56ccde4c2f60..b29a39fb4c5ef 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -84,7 +84,10 @@ public class newinstance001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001/TestDescription.java index 7376e32c3cc3b..66b15f2166586 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,7 +55,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ArrayType.NewInstance.newinstance001a - * @run main/othervm + * @run driver * nsk.jdwp.ArrayType.NewInstance.newinstance001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001.java index ba21914994d1e..1c02b225e0b36 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,7 +81,10 @@ public class visibclasses001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001/TestDescription.java index b298e05d72175..379091615fec6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ClassLoaderReference.VisibleClasses.visibclasses001a - * @run main/othervm + * @run driver * nsk.jdwp.ClassLoaderReference.VisibleClasses.visibclasses001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001.java index b894d10c1b098..a23144b50e6d6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,10 @@ public class reflectype001 { static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";"; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001/TestDescription.java index f476b8df0c807..ea86ce80bcbee 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ClassObjectReference.ReflectedType.reflectype001a - * @run main/othervm + * @run driver * nsk.jdwp.ClassObjectReference.ReflectedType.reflectype001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001.java index d9f5e31b65318..c5ab5ed56c837 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -97,7 +97,10 @@ public class invokemeth001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001/TestDescription.java index 9b97c95b32f1d..c393e091c56a5 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ClassType.InvokeMethod.invokemeth001a - * @run main/othervm + * @run driver * nsk.jdwp.ClassType.InvokeMethod.invokemeth001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001.java index ff23a6420e643..a2323daaf749c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -96,8 +96,11 @@ public class newinst001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001/TestDescription.java index 6132dbc6a4d32..2d9abe94b73b8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ClassType.NewInstance.newinst001a - * @run main/othervm + * @run driver * nsk.jdwp.ClassType.NewInstance.newinst001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001.java index 7931560a853e7..e40906c299ae9 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,7 +88,10 @@ public class setvalues001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001/TestDescription.java index 24b11421e0861..015e3377537bb 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ClassType.SetValues.setvalues001a - * @run main/othervm + * @run driver * nsk.jdwp.ClassType.SetValues.setvalues001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001.java index 1e46507079e91..4aed67d1f7e31 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,7 +85,10 @@ public class superclass001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001/TestDescription.java index 02082032398f5..6cd1cd9404297 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ClassType.Superclass.superclass001a - * @run main/othervm + * @run driver * nsk.jdwp.ClassType.Superclass.superclass001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.java index 60b926256adaf..6518ff5bb06dc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -90,8 +90,11 @@ public class breakpoint001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001/TestDescription.java index f4583fc101552..72c5a23c94f35 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.BREAKPOINT.breakpoint001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.BREAKPOINT.breakpoint001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java index 4bb0add7c6508..3edb73a609c9d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,8 +80,11 @@ public class clsprepare001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001/TestDescription.java index 8690a9d6125f4..563db72242479 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.CLASS_PREPARE.clsprepare001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.CLASS_PREPARE.clsprepare001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java index ba6905a68bded..ccfec8efeb9e7 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,8 +80,11 @@ public class clsunload001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001/TestDescription.java index 2d323c7193143..354b71a085ed0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,7 +62,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.CLASS_UNLOAD.clsunload001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.CLASS_UNLOAD.clsunload001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001.java index 0d6c11c40c81f..789402dd37a08 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,8 +75,11 @@ public class composite001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001/TestDescription.java index 5cf8976cb8806..ad91d73534c0b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.Composite.composite001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.Composite.composite001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.java index 2092256ef6c05..0fca4cb44f993 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -97,8 +97,11 @@ public class exception001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001/TestDescription.java index 9524d171c4bc2..7307c026cf51e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,7 +64,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.EXCEPTION.exception001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.EXCEPTION.exception001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java index c81d901115cd2..1c6b5f4a931a1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,8 +99,11 @@ public class fldaccess001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001/TestDescription.java index d0c835009d60c..ff74b0849ee20 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,7 +63,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.FIELD_ACCESS.fldaccess001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.FIELD_ACCESS.fldaccess001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001.java index 7bcf14c87c3a2..840b48428e51a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -100,8 +100,11 @@ public class fldmodification001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001/TestDescription.java index 5055936173d11..3901a6eaf8c77 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,7 +64,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.FIELD_MODIFICATION.fldmodification001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.FIELD_MODIFICATION.fldmodification001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001.java index 6d75896e2dfcd..b8834e94bcfde 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -92,8 +92,11 @@ public class methentry001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001/TestDescription.java index e41084de6281f..106002fdf9d67 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.METHOD_ENTRY.methentry001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.METHOD_ENTRY.methentry001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001.java index a113161ca3241..6da08d6b85815 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -92,8 +92,11 @@ public class methexit001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001/TestDescription.java index bd765e2ea8846..e6a74885a13b9 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.METHOD_EXIT.methexit001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.METHOD_EXIT.methexit001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001.java index 25003f018a0ab..fef8a0959082e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -93,8 +93,11 @@ public class singlestep001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001/TestDescription.java index 7d7afefd44603..661189bcf310f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,7 +63,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.SINGLE_STEP.singlestep001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.SINGLE_STEP.singlestep001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002.java index 50e55925d0d4f..66c9e65df56e0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -95,8 +95,11 @@ public class singlestep002 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002/TestDescription.java index ac11ead1f0925..4fe15d10884e0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,7 +63,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.SINGLE_STEP.singlestep002a - * @run main/othervm + * @run driver * nsk.jdwp.Event.SINGLE_STEP.singlestep002 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003.java index ae98242c0eeb9..47ef6474536ba 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -95,8 +95,11 @@ public class singlestep003 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003/TestDescription.java index 00cf70a223d8f..d3c38bcbeb8b3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,7 +63,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.SINGLE_STEP.singlestep003a - * @run main/othervm + * @run driver * nsk.jdwp.Event.SINGLE_STEP.singlestep003 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java index f5aae7067db5a..753e5b4948051 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,8 +88,11 @@ public class thrdeath001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001/TestDescription.java index 85dd77be7e9ca..8cd28cb2381db 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.THREAD_DEATH.thrdeath001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.THREAD_DEATH.thrdeath001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001.java index f525d7d550faf..7936fcbf5cb45 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,8 +88,11 @@ public class thrstart001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001/TestDescription.java index a43503248490b..7345debf5252c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.THREAD_START.thrstart001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.THREAD_START.thrstart001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001.java index 771e121d8cecb..8a8526bbeb2e6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,8 +74,11 @@ public class vmdeath001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001/TestDescription.java index e1f3b1053b489..f40ecc66655de 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,7 +53,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.VM_DEATH.vmdeath001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.VM_DEATH.vmdeath001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002.java index 20f96d064d1e0..6bfb79d2575a3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,8 +81,11 @@ public class vmdeath002 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002/TestDescription.java index f0dbd749a3271..cee21042bf57d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.VM_DEATH.vmdeath002a - * @run main/othervm + * @run driver * nsk.jdwp.Event.VM_DEATH.vmdeath002 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001.java index 58d77cd8901a5..eac5ee3efb660 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,8 +74,11 @@ public class vmstart001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001/TestDescription.java index 139db45bef5b5..b0d6abd6928f2 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Event.VM_START.vmstart001a - * @run main/othervm + * @run driver * nsk.jdwp.Event.VM_START.vmstart001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001.java index 4973cac34a7ae..dccddcf806650 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,8 +88,11 @@ public class clear001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001/TestDescription.java index acc4090eb10e6..cc544397bf2c3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.EventRequest.Clear.clear001a - * @run main/othervm + * @run driver * nsk.jdwp.EventRequest.Clear.clear001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001.java index b4cbd4f207228..166334be16a5a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,8 +88,11 @@ public class clrallbreakp001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001/TestDescription.java index 49c6d12afa525..bd251fe9c91aa 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp001a - * @run main/othervm + * @run driver * nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002.java index c106daa64ff2f..1a881b075f12d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -82,8 +82,11 @@ public class clrallbreakp002 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002/TestDescription.java index 981b8fccb5efc..53fa51809db39 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp002a - * @run main/othervm + * @run driver * nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp002 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003.java index 34a69758774ba..ce7c1f6609f95 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,8 +88,11 @@ public class clrallbreakp003 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003/TestDescription.java index 15acb91350c34..61c2355c1cb77 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,7 +53,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp003a - * @run main/othervm + * @run driver * nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp003 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001.java index 522c6096cdfb2..55b5d12ee13a1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -90,8 +90,11 @@ public class set001 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001/TestDescription.java index d04dc2f9328d8..d982e35850d68 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.EventRequest.Set.set001a - * @run main/othervm + * @run driver * nsk.jdwp.EventRequest.Set.set001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.java index ae25ddc2fe265..86256e706fc8b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -77,8 +77,11 @@ public class set002 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002/TestDescription.java index efd3b66692425..38df090783b55 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.EventRequest.Set.set002a - * @run main/othervm + * @run driver * nsk.jdwp.EventRequest.Set.set002 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001.java index 29a06be58fc46..7a5972860344d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -93,7 +93,10 @@ public class bytecodes001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001/TestDescription.java index b522bbedaa4bb..46efecf437e0e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Method.Bytecodes.bytecodes001a - * @run main/othervm + * @run driver * nsk.jdwp.Method.Bytecodes.bytecodes001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001.java index c9e558363a282..b01e814af1e0a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,7 +89,10 @@ public class isobsolete001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001/TestDescription.java index c3b3b3c049d11..270f5744bac06 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Method.IsObsolete.isobsolete001a - * @run main/othervm + * @run driver * nsk.jdwp.Method.IsObsolete.isobsolete001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002.java index c3266489f9289..c06e62be3164b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -96,7 +96,10 @@ public class isobsolete002 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002/TestDescription.java index ce9fc223daefe..e5b41793291c1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,7 +72,7 @@ * nsk.jdwp.Method.IsObsolete.isobsolete002b * @run driver nsk.share.ExtraClassesBuilder * newclass - * @run main/othervm + * @run driver * nsk.jdwp.Method.IsObsolete.isobsolete002 * . * -arch=${os.family}-${os.simpleArch} diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001.java index ebb3063893851..cf1bd6eb79a61 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,7 +89,10 @@ public class linetable001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001/TestDescription.java index d5dad5cc97926..7a53a1b3816eb 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,7 +68,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.Method.LineTable.linetable001a - * @run main/othervm + * @run driver * nsk.jdwp.Method.LineTable.linetable001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001.java index 9953dc9c94f55..d6a2dcee264b8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -119,7 +119,10 @@ public class vartable001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001/TestDescription.java index f5633b360f332..f08b09e5079f9 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @comment debuggee should be compiled w/ debug info * @clean nsk.jdwp.Method.VariableTable.vartable001a * @compile -g:lines,source,vars ../vartable001a.java - * @run main/othervm + * @run driver * nsk.jdwp.Method.VariableTable.vartable001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001.java index a2e18c4f75997..39890990b8dcf 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -136,7 +136,10 @@ public class vartblwithgen001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001/TestDescription.java index 7741b0226187b..0227cae87ea74 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @comment debuggee should be compiled w/ debug info * @clean nsk.jdwp.Method.VariableTableWithGeneric.vartblwithgen001a * @compile -g:lines,source,vars ../vartblwithgen001a.java - * @run main/othervm + * @run driver * nsk.jdwp.Method.VariableTableWithGeneric.vartblwithgen001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001.java index 419d944398af5..6f11394db53ea 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -86,7 +86,10 @@ public class disablecol001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001/TestDescription.java index 9e50200593e7e..fdcc258523e67 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ObjectReference.DisableCollection.disablecol001a - * @run main/othervm + * @run driver * nsk.jdwp.ObjectReference.DisableCollection.disablecol001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001.java index 2ab8c28e1c4c1..9172b4413d700 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -86,7 +86,10 @@ public class enablecol001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001/TestDescription.java index d2dd41472e9f7..71a849b0c2a5e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,7 +55,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ObjectReference.EnableCollection.enablecol001a - * @run main/othervm + * @run driver * nsk.jdwp.ObjectReference.EnableCollection.enablecol001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001.java index 08668e91afabd..9702cb7f9e621 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,7 +99,10 @@ public class getvalues001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001/TestDescription.java index 7ecb552e6c9d8..8bfbca6d44890 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ObjectReference.GetValues.getvalues001a - * @run main/othervm + * @run driver * nsk.jdwp.ObjectReference.GetValues.getvalues001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001.java index 761a5bf19a48a..ffc2cc151a99e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,7 +99,10 @@ public class invokemeth001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001/TestDescription.java index 71bfafa7718f6..3ad6bbf79db18 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ObjectReference.InvokeMethod.invokemeth001a - * @run main/othervm + * @run driver * nsk.jdwp.ObjectReference.InvokeMethod.invokemeth001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001.java index 284765bd25af4..a8d61451f9a97 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -86,7 +86,10 @@ public class iscollected001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001/TestDescription.java index fda668d8b3201..f6facbb76092a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ObjectReference.IsCollected.iscollected001a - * @run main/othervm + * @run driver * nsk.jdwp.ObjectReference.IsCollected.iscollected001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001.java index 8834b30e21b50..e50dc29b151b4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -101,7 +101,10 @@ public class monitorinfo001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001/TestDescription.java index cf58779b87dd3..40be209f16f5b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -69,7 +69,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ObjectReference.MonitorInfo.monitorinfo001a - * @run main/othervm + * @run driver * nsk.jdwp.ObjectReference.MonitorInfo.monitorinfo001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001.java index cc5530cf82a65..4066c90576893 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -86,7 +86,10 @@ public class referencetype001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001/TestDescription.java index 0e7e8b9bb6b2e..e5b1413f1479a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ObjectReference.ReferenceType.referencetype001a - * @run main/othervm + * @run driver * nsk.jdwp.ObjectReference.ReferenceType.referencetype001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects001/referringObjects001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects001/referringObjects001.java index c9ee73fa67c96..f578d3be7d436 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects001/referringObjects001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects001/referringObjects001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -95,8 +95,11 @@ protected String getDebugeeClassName() { return nsk.jdwp.ObjectReference.ReferringObjects.referringObjects001.referringObjects001a.class.getName(); } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects002/referringObjects002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects002/referringObjects002.java index 4ad6b6ae32881..4591bf093eaab 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects002/referringObjects002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects002/referringObjects002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -83,8 +83,11 @@ protected String getDebugeeClassName() { return nsk.jdwp.ObjectReference.ReferringObjects.referringObjects002.referringObjects002a.class.getName(); } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001.java index 3d20db7fa7ebe..d9a7622ea042d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -95,7 +95,10 @@ public class setvalues001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001/TestDescription.java index e3c08d68b0221..e35ea5632625b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,7 +68,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ObjectReference.SetValues.setvalues001a - * @run main/othervm + * @run driver * nsk.jdwp.ObjectReference.SetValues.setvalues001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001.java index 23b1c3de7eec1..0d7961924f9cf 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,10 @@ public class classloader001 { static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";"; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001/TestDescription.java index be36b5eccee5b..6b818c0a408e5 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.ClassLoader.classloader001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.ClassLoader.classloader001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001.java index b86d17d752fa6..5d74b011111da 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,10 @@ public class classobj001 { static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";"; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001/TestDescription.java index 12baa51bca2cc..ffa15c1a66d81 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.ClassObject.classobj001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.ClassObject.classobj001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001.java index b6f559a5ae031..a4cfd9d9eba35 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,10 @@ public class fields001 { static final int FIELD_MODIFIER_FLAGS = JDWP.ModifierFlag.PUBLIC; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001/TestDescription.java index a337e6b7fb5a6..7d6b41cc75014 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.Fields.fields001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.Fields.fields001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001.java index 24ac7321b9fdf..5feafc3c2b3c2 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -101,8 +101,11 @@ public class fldwithgeneric001 { static final int FLDS_NUM = fields.length; - public static void main(String argv[]) { - System.exit(run(argv,System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001/TestDescription.java index c410dabad0893..7e9679e10eb4e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.FieldsWithGeneric.fldwithgeneric001t - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.FieldsWithGeneric.fldwithgeneric001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001.java index cafe1ba1d1aef..72c0c679bb80c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,7 +99,10 @@ public class getvalues001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001/TestDescription.java index 6a0ceb754d8c6..e4c850e28a4ef 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.GetValues.getvalues001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.GetValues.getvalues001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances001/instances001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances001/instances001.java index 2312f571822d4..5a83ed4435b93 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances001/instances001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances001/instances001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,8 +89,11 @@ protected String getDebugeeClassName() { return nsk.jdwp.ReferenceType.Instances.instances001.instances001a.class.getName(); } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances002/instances002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances002/instances002.java index cd90392f3d939..378104a1b746d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances002/instances002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances002/instances002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ * * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.Instances.instances002.instances002 * -arch=${os.family}-${os.simpleArch} * -verbose @@ -82,8 +82,11 @@ protected String getDebugeeClassName() { return nsk.jdwp.ReferenceType.Instances.instances002.instances002a.class.getName(); } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001.java index e7e06473d7b12..d30d63b272bf3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,10 @@ public class interfaces001 { static final long interfaceIDs[] = new long[DECLARED_INTERFACES]; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001/TestDescription.java index b67ad06b1c333..bfa503d42b3e3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.Interfaces.interfaces001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.Interfaces.interfaces001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001.java index 22e656e1f4148..247ed13f6686d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,7 +63,10 @@ public class methods001 { static final int METHOD_MODIFIER_FLAGS = JDWP.ModifierFlag.PUBLIC; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001/TestDescription.java index f24bcd39b8453..28a7ad43a60e5 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.Methods.methods001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.Methods.methods001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001.java index e2e633222b3fc..d153603562529 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -110,8 +110,11 @@ public class methwithgeneric001 { static final int CLS_NUM = classes.length; - public static void main(String argv[]) { - System.exit(run(argv,System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001/TestDescription.java index 648349f887e56..475b7eedb0595 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.MethodsWithGeneric.methwithgeneric001t - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.MethodsWithGeneric.methwithgeneric001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001.java index 92e4f6f6b7cb0..7695861df3a2f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,7 +48,10 @@ public class modifiers001 { | JDWP.ModifierFlag.FINAL; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001/TestDescription.java index fa26934f1497a..907993049a4c3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.Modifiers.modifiers001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.Modifiers.modifiers001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001.java index 33e4727bfe8a1..6b4e82dd6b607 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -92,7 +92,10 @@ public class nestedtypes001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001/TestDescription.java index 4436bcccbb607..5da686e4a434b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.NestedTypes.nestedtypes001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.NestedTypes.nestedtypes001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001.java index 641079ba7fa3f..ddba04e292ab6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,10 @@ public class signature001 { static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";"; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001/TestDescription.java index 27628d13e610a..49ac330b51879 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.Signature.signature001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.Signature.signature001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001.java index c6bbcd437f8a6..8f819a050b9d1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,8 +81,11 @@ public class sigwithgeneric001 { static final int CLS_NUM = classes.length; - public static void main(String argv[]) { - System.exit(run(argv,System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001/TestDescription.java index 9dc7275de7d13..9928a55505ea8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.SignatureWithGeneric.sigwithgeneric001t - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.SignatureWithGeneric.sigwithgeneric001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001.java index af9d7a26021ad..0735246d2395b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,10 @@ public class srcdebugext001 { private Transport transport; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001/TestDescription.java index c614604e55d71..f3fbe8830c430 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.SourceDebugExtension.srcdebugext001t - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.SourceDebugExtension.srcdebugext001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001.java index fb9d8948ef5dc..6ca69c009b22f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,10 @@ public class srcfile001 { static final String TESTED_CLASS_SRCFILENAME = "srcfile001a.java"; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001/TestDescription.java index 09608b3757d74..ff56e5c99ccd1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.SourceFile.srcfile001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.SourceFile.srcfile001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001.java index f0e357b48403b..2aa64d3ed4b4a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,7 +48,10 @@ public class status001 { | JDWP.ClassStatus.INITIALIZED; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001/TestDescription.java index aefbb989bf98e..5efd81a389627 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ReferenceType.Status.status001a - * @run main/othervm + * @run driver * nsk.jdwp.ReferenceType.Status.status001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001.java index 656ba90a25039..b9f7a1f0ef32e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -102,7 +102,10 @@ public class getvalues001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001/TestDescription.java index 09ee0ba021a9b..5d862a12ec3cd 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,7 +64,7 @@ * @comment debuggee should be compiled w/ debug info * @clean nsk.jdwp.StackFrame.GetValues.getvalues001a * @compile -g:lines,source,vars ../getvalues001a.java - * @run main/othervm + * @run driver * nsk.jdwp.StackFrame.GetValues.getvalues001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001.java index a896d567eb524..b4ad931f04438 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -93,7 +93,10 @@ public class popframes001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001/TestDescription.java index 2fd126b9fbb2a..902cdda31dcec 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.StackFrame.PopFrames.popframes001a - * @run main/othervm + * @run driver * nsk.jdwp.StackFrame.PopFrames.popframes001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001.java index 58b9c26fae368..7e7d44ff9682d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -109,7 +109,10 @@ public class setvalues001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001/TestDescription.java index 96302cd95925f..fec909b409230 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,7 +75,7 @@ * @comment debuggee should be compiled w/ debug info * @clean nsk.jdwp.StackFrame.SetValues.setvalues001a * @compile -g:lines,source,vars ../setvalues001a.java - * @run main/othervm + * @run driver * nsk.jdwp.StackFrame.SetValues.setvalues001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001.java index 90ab9f6e06bf6..d8302f07c7d80 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,10 @@ public class thisobject001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001/TestDescription.java index 9216e598b04c6..7d00be7f30711 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.StackFrame.ThisObject.thisobject001a - * @run main/othervm + * @run driver * nsk.jdwp.StackFrame.ThisObject.thisobject001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001.java index 6a218281473a1..b07413fae93bc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class value001 { static final int JDWP_COMMAND_ID = JDWP.Command.StringReference.Value; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001/TestDescription.java index ff107802db07b..7380eed448ded 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.StringReference.Value.value001a - * @run main/othervm + * @run driver * nsk.jdwp.StringReference.Value.value001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001.java index 5bcf5132863c7..24e5d1a48d6a3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class children001 { static final int JDWP_COMMAND_ID = JDWP.Command.ThreadGroupReference.Children; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001/TestDescription.java index 679af7f78c7a5..b77233495fd17 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadGroupReference.Children.children001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadGroupReference.Children.children001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001.java index abb7ed4a59e94..c33780bfba0eb 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class name001 { static final int JDWP_COMMAND_ID = JDWP.Command.ThreadGroupReference.Name; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001/TestDescription.java index 14218e86942b3..00304ac2b1df7 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadGroupReference.Name.name001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadGroupReference.Name.name001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001.java index bdcdbc1dd2dbe..8ebb47b1aea95 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class parent001 { static final int JDWP_COMMAND_ID = JDWP.Command.ThreadGroupReference.Parent; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001/TestDescription.java index 4a2ff8684acbf..48aeb6e47d28a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadGroupReference.Parent.parent001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadGroupReference.Parent.parent001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001.java index 3b8219e63b76c..9d74ebcc0819e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -92,7 +92,10 @@ public class curcontmonitor001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001/TestDescription.java index 298363ade0190..126310353c2e2 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,7 +63,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.CurrentContendedMonitor.curcontmonitor001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.CurrentContendedMonitor.curcontmonitor001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java index 8453e54e2c105..e7dce1525a045 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,7 +74,7 @@ * * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.ForceEarlyReturn.forceEarlyReturn001.forceEarlyReturn001 * -arch=${os.family}-${os.simpleArch} * -verbose @@ -123,8 +123,11 @@ protected String getDebugeeClassName() { return "nsk.jdwp.ThreadReference.ForceEarlyReturn.forceEarlyReturn001.forceEarlyReturn001a"; } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn002/forceEarlyReturn002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn002/forceEarlyReturn002.java index e66da8076692a..2cb8de8cfa7e6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn002/forceEarlyReturn002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn002/forceEarlyReturn002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -95,8 +95,11 @@ protected String getDebugeeClassName() { return "nsk.jdwp.ThreadReference.ForceEarlyReturn.forceEarlyReturn002.forceEarlyReturn002a"; } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001.java index 0a6770fe338ef..5bab037024d76 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -90,7 +90,10 @@ public class framecnt001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001/TestDescription.java index 16adec92f82e4..77063a5ce2f2a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.FrameCount.framecnt001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.FrameCount.framecnt001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001.java index 42ab3aa776e3d..0a5028c4a65da 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -95,7 +95,10 @@ public class frames001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001/TestDescription.java index d742fb39d0ebb..b8dad9a09d7ed 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,7 +62,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.Frames.frames001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.Frames.frames001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001.java index 722543cf8e100..f0c2914dffcac 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -90,7 +90,10 @@ public class interrupt001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001/TestDescription.java index 236ff3140d583..b6284ec0a505c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.Interrupt.interrupt001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.Interrupt.interrupt001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001.java index 5793eb8dc67fa..4633c6f118539 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,10 @@ public class name001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001/TestDescription.java index afc50298c1c8d..ab49aa26e14e1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.Name.name001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.Name.name001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001.java index 75f1dc408e6b5..c9ba5bcc9554d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -98,7 +98,10 @@ public class ownmonitors001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001/TestDescription.java index 84c7f627e6d9f..a929ce527f586 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,7 +62,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.OwnedMonitors.ownmonitors001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.OwnedMonitors.ownmonitors001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo001/ownedMonitorsStackDepthInfo001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo001/ownedMonitorsStackDepthInfo001.java index f178c88ae1474..3b250989a43eb 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo001/ownedMonitorsStackDepthInfo001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo001/ownedMonitorsStackDepthInfo001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,8 +87,11 @@ protected String getDebugeeClassName() { return nsk.jdwp.ThreadReference.OwnedMonitorsStackDepthInfo.ownedMonitorsStackDepthInfo001.ownedMonitorsStackDepthInfo001a.class.getName(); } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo002/ownedMonitorsStackDepthInfo002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo002/ownedMonitorsStackDepthInfo002.java index cbc5fb63a235b..140b249de9cb1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo002/ownedMonitorsStackDepthInfo002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo002/ownedMonitorsStackDepthInfo002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,7 @@ * * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.OwnedMonitorsStackDepthInfo.ownedMonitorsStackDepthInfo002.ownedMonitorsStackDepthInfo002 * -arch=${os.family}-${os.simpleArch} * -verbose @@ -77,8 +77,11 @@ protected String getDebugeeClassName() { return AbstractJDWPDebuggee.class.getName(); } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001.java index 946974522006c..97e270b32ecc0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,10 @@ public class resume001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001/TestDescription.java index e5eb1c510f1a1..12af9f769393c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.Resume.resume001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.Resume.resume001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001.java index b7c708570f56f..f41e3e919a52d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,10 @@ public class status001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001/TestDescription.java index 14ff024714377..5ae025526ac87 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.Status.status001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.Status.status001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001.java index f89d64ae747aa..416b3254e0ecc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,7 +91,10 @@ public class stop001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001/TestDescription.java index 9229392142b77..a9bcab6ef3e2d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.Stop.stop001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.Stop.stop001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001.java index 9f6ed3db961b4..0418fe080d6aa 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,10 @@ public class suspend001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001/TestDescription.java index d1477e4774933..1c4bcf62e5223 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.Suspend.suspend001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.Suspend.suspend001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001.java index cbfe330774e61..cbdff74e9ccc8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -90,7 +90,10 @@ public class suspendcnt001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001/TestDescription.java index 39e5469173a30..188b5c01ec178 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.SuspendCount.suspendcnt001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.SuspendCount.suspendcnt001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001.java index c58491cb3d4d0..eb66314ebdaa1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class threadgroup001 { static final int JDWP_COMMAND_ID = JDWP.Command.ThreadReference.ThreadGroup; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001/TestDescription.java index f9b503a82fe1d..0aa449e923904 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.ThreadReference.ThreadGroup.threadgroup001a - * @run main/othervm + * @run driver * nsk.jdwp.ThreadReference.ThreadGroup.threadgroup001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001.java index 687a56e69fbb0..292b2d8eb53e8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,10 @@ public class allclasses001 { static final String TESTED_CLASS_NAME = DEBUGEE_CLASS_NAME; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001/TestDescription.java index 4f11e1d91bde0..85a45c798e631 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.AllClasses.allclasses001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.AllClasses.allclasses001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001.java index c5806ce7b5402..aee8b353368f7 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,8 +87,11 @@ public class allclswithgeneric001 { private Log log; - public static void main(String argv[]) { - System.exit(run(argv,System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001/TestDescription.java index 980bdb98c8939..8c251a0ca4b8b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.AllClassesWithGeneric.allclswithgeneric001t - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.AllClassesWithGeneric.allclswithgeneric001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001.java index e3e291fcdcdd3..5fa23569fc48c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,10 @@ public class allthreads001 { static final String TESTED_CLASS_NAME = DEBUGEE_CLASS_NAME; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001/TestDescription.java index 782045881ac51..6822e5e7b327c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,7 +47,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.AllThreads.allthreads001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.AllThreads.allthreads001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001.java index 5e05f6406f6f6..e5b11b3be969e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class capabilities001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Capabilities; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001/TestDescription.java index bba5b1c30153e..30ed332c53ec8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,7 +47,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.Capabilities.capabilities001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.Capabilities.capabilities001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001.java index 00ffc50503480..1fe5df86db8f0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class capabilitiesnew001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.CapabilitiesNew; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001/TestDescription.java index 4d4c69cde636d..aa0479c819bc3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.CapabilitiesNew.capabilitiesnew001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.CapabilitiesNew.capabilitiesnew001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001.java index da06f738f93e6..1882ce8141561 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class classpaths001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.ClassPaths; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001/TestDescription.java index 4f7d685117c9d..41e53912f2081 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.ClassPaths.classpaths001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.ClassPaths.classpaths001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001.java index 03fc0c49dca77..c319372fc90a5 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,10 @@ public class classbysig001 { // static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME + ";"; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001/TestDescription.java index 14f40d16e78f8..2127c0d3d876f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,7 +47,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.ClassesBySignature.classbysig001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.ClassesBySignature.classbysig001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001.java index 5e0a4b8427e0d..aaa964b4fa399 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class createstr001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.CreateString; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001/TestDescription.java index 54789071b5132..27bab252c0238 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.CreateString.createstr001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.CreateString.createstr001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001.java index e115fa9e6487e..89b0f608ff730 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class dispose001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Dispose; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001/TestDescription.java index 44b64f614f31e..2e3e7d2afcda0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.Dispose.dispose001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.Dispose.dispose001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001.java index 901b69de37ae3..9c2a0e5347858 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -93,7 +93,10 @@ public class disposeobj001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001/TestDescription.java index 3782fc59b3fbd..5fc151bf339a4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,7 +55,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.DisposeObjects.disposeobj001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.DisposeObjects.disposeobj001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001.java index b9313fc838f05..f7fd27b03d533 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class exit001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Exit; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001/TestDescription.java index c1fb69e22281a..772184d294ee6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,7 +53,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.Exit.exit001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.Exit.exit001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001.java index c0b28b905ccce..890b1be77bc0b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -78,7 +78,10 @@ public class holdevents001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001/TestDescription.java index c562dc2e2a66b..4f096ee2f4915 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.HoldEvents.holdevents001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.HoldEvents.holdevents001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents002.java index 2995beb7979b1..c6e0cc4b014bd 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,8 +87,11 @@ public class holdevents002 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java index 49dbbcd170546..863160e6a1fda 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class idsizes001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.IDSizes; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001/TestDescription.java index 0dcb07c803b40..bf0d6db0f880d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.IDSizes.idsizes001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.IDSizes.idsizes001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/InstanceCounts/instanceCounts001/instanceCounts001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/InstanceCounts/instanceCounts001/instanceCounts001.java index e25d2cc3189f8..dc21d1bc9d380 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/InstanceCounts/instanceCounts001/instanceCounts001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/InstanceCounts/instanceCounts001/instanceCounts001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,8 +91,11 @@ protected String getDebugeeClassName() { return "nsk.jdwp.VirtualMachine.InstanceCounts.instanceCounts001.instanceCounts001a"; } - public static void main(String[] argv) { - System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String[] argv, PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001.java index 37cc65ff94eb9..bc620c8b59c6f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -102,7 +102,10 @@ public class redefinecls001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001/TestDescription.java index 5ea557b5164f5..7707821bc7936 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,7 +74,7 @@ * nsk.jdwp.VirtualMachine.RedefineClasses.redefinecls001b * @run driver nsk.share.ExtraClassesBuilder * newclass - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.RedefineClasses.redefinecls001 * . * -arch=${os.family}-${os.simpleArch} diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001.java index 95bafeb1aff07..ddca99b03d314 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -78,7 +78,10 @@ public class releaseevents001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001/TestDescription.java index 589d061373d49..8cbb7a6e15fce 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.ReleaseEvents.releaseevents001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.ReleaseEvents.releaseevents001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.java index 64b6ce1547b57..ff278aabcf354 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,8 +87,11 @@ public class releaseevents002 { /** * Start test from command line. */ - public static void main(String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + public static void main (String argv[]) { + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002/TestDescription.java index cb6760f97876b..1c94d9d75876e 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.ReleaseEvents.releaseevents002a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.ReleaseEvents.releaseevents002 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001.java index ed427439edc72..cb602d17ba037 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class resume001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Resume; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001/TestDescription.java index 14fcd815f2897..90b6db41be0e4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.Resume.resume001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.Resume.resume001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001.java index 51e8a03487bc8..b90423e62190d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,7 +85,10 @@ public class setdefstrat001 { * Start test from command line. */ public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } /** diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001/TestDescription.java index 94828c43d800b..43f0a40379870 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.SetDefaultStratum.setdefstrat001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.SetDefaultStratum.setdefstrat001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001.java index e04cb45580c61..daaf39cc5fa2d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class threadgroups001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.TopLevelThreadGroups; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001/TestDescription.java index ecd37d43e848f..ac51bc95011ad 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.TopLevelThreadGroups.threadgroups001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.TopLevelThreadGroups.threadgroups001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001.java index b89aa3e0ec0b7..66575fee4f8e1 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class version001 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Version; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001/TestDescription.java index c26171f0dec23..cd1d7123a34af 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.Version.version001a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.Version.version001 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002.java index 5907a8159ffe5..8060922340ce5 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,10 @@ public class version002 { static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Version; public static void main (String argv[]) { - System.exit(run(argv,System.out) + JCK_STATUS_BASE); + int result = run(argv, System.out); + if (result != 0) { + throw new RuntimeException("Test failed"); + } } public static int run(String argv[], PrintStream out) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002/TestDescription.java index cfc6ed266c173..d09e4f5176d0c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ * @library /vmTestbase /test/hotspot/jtreg/vmTestbase * /test/lib * @build nsk.jdwp.VirtualMachine.Version.version002a - * @run main/othervm + * @run driver * nsk.jdwp.VirtualMachine.Version.version002 * -arch=${os.family}-${os.simpleArch} * -verbose diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java index 58732bd0aa4d5..e3071e5cef0e4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java @@ -320,11 +320,11 @@ public String[] makeCommandLineArgs(String classToExecute, String transportAddre } } -/* - String classPath = System.getProperty("java.class.path"); - args.add("-classpath") + + String classPath = System.getProperty("test.class.path"); + args.add("-classpath"); args.add(classPath); - */ + String server; if (argumentHandler.isAttachingConnector()) { From a7205cc6512796466fefe17d171082995e0966de Mon Sep 17 00:00:00 2001 From: William Kemper <wkemper@openjdk.org> Date: Tue, 11 Jun 2024 22:09:52 +0000 Subject: [PATCH 032/471] 8333926: Shenandoah: Lower default immediate garbage threshold Reviewed-by: kdnilsen, ysr --- src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp b/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp index e514d41369f69..b8baf6b3ebf43 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp @@ -114,7 +114,7 @@ "to learn application and GC performance.") \ range(0,100) \ \ - product(uintx, ShenandoahImmediateThreshold, 90, EXPERIMENTAL, \ + product(uintx, ShenandoahImmediateThreshold, 70, EXPERIMENTAL, \ "The cycle may shortcut when enough garbage can be reclaimed " \ "from the immediate garbage (completely garbage regions). " \ "In percents of total garbage found. Setting this threshold " \ From 1c80ddb8efdb883623652b20849413b602c10c36 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan <psadhukhan@openjdk.org> Date: Wed, 12 Jun 2024 05:32:06 +0000 Subject: [PATCH 033/471] 8333940: Ensure javax/swing/TestUngrab.java run on all platforms Reviewed-by: tr --- test/jdk/javax/swing/JMenu/TestUngrab.java | 1 - 1 file changed, 1 deletion(-) diff --git a/test/jdk/javax/swing/JMenu/TestUngrab.java b/test/jdk/javax/swing/JMenu/TestUngrab.java index 64326009c6c77..ca738dabcb035 100644 --- a/test/jdk/javax/swing/JMenu/TestUngrab.java +++ b/test/jdk/javax/swing/JMenu/TestUngrab.java @@ -27,7 +27,6 @@ * @test * @bug 8267374 * @key headful - * @requires (os.family == "mac") * @summary Verifies menu closes when main window is resized * @run main TestUngrab */ From bd046d9b9e79e4eea89c72af358961ef6e98e660 Mon Sep 17 00:00:00 2001 From: Jaikiran Pai <jpai@openjdk.org> Date: Wed, 12 Jun 2024 05:36:30 +0000 Subject: [PATCH 034/471] 8222884: ConcurrentClassDescLookup.java times out intermittently Reviewed-by: rriggs, mbaesken --- .../ConcurrentClassDescLookup.java | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/test/jdk/java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java b/test/jdk/java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java index 48cbd1b0ffe20..196a27b52baf8 100644 --- a/test/jdk/java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java +++ b/test/jdk/java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ */ import java.io.*; +import java.util.concurrent.CountDownLatch; class Good implements Serializable { private static final long serialVersionUID = 6319710844400051132L; @@ -51,19 +52,20 @@ class Bad implements Serializable { class SuccessfulLookup extends Thread { Class<?> cl; long suid; - Object barrier; + final CountDownLatch lookupLatch; boolean ok; - SuccessfulLookup(Class<?> cl, long suid, Object barrier) { + SuccessfulLookup(Class<?> cl, long suid, CountDownLatch lookupLatch) { this.cl = cl; this.suid = suid; - this.barrier = barrier; + this.lookupLatch = lookupLatch; } public void run() { - synchronized (barrier) { - try { barrier.wait(); } catch (InterruptedException ex) {} - } + lookupLatch.countDown(); // let others know we are ready + try { + lookupLatch.await(); // await for others + } catch (InterruptedException ex) {} for (int i = 0; i < 100; i++) { if (ObjectStreamClass.lookup(cl).getSerialVersionUID() != suid) { return; @@ -75,18 +77,19 @@ public void run() { class FailingLookup extends Thread { Class<?> cl; - final Object barrier; + final CountDownLatch lookupLatch; boolean ok; - FailingLookup(Class<?> cl, Object barrier) { + FailingLookup(Class<?> cl, CountDownLatch lookupLatch) { this.cl = cl; - this.barrier = barrier; + this.lookupLatch = lookupLatch; } public void run() { - synchronized (barrier) { - try { barrier.wait(); } catch (InterruptedException ex) {} - } + lookupLatch.countDown(); // let others know we are ready + try { + lookupLatch.await(); // await for others + } catch (InterruptedException ex) {} for (int i = 0; i < 100; i++) { try { ObjectStreamClass.lookup(cl); @@ -102,39 +105,36 @@ public class ConcurrentClassDescLookup { public static void main(String[] args) throws Exception { ClassLoader loader = ConcurrentClassDescLookup.class.getClassLoader(); Class<?> cl = Class.forName("Good", false, loader); - Object barrier = new Object(); - SuccessfulLookup[] slookups = new SuccessfulLookup[50]; + int numSuccessfulLookups = 50; + CountDownLatch sLookupLatch = new CountDownLatch(numSuccessfulLookups); + SuccessfulLookup[] slookups = new SuccessfulLookup[numSuccessfulLookups]; for (int i = 0; i < slookups.length; i++) { - slookups[i] = - new SuccessfulLookup(cl, 6319710844400051132L, barrier); + slookups[i] = new SuccessfulLookup(cl, 6319710844400051132L, sLookupLatch); slookups[i].start(); } - Thread.sleep(1000); - synchronized (barrier) { - barrier.notifyAll(); - } + System.out.println("awaiting completion of " + slookups.length + " SuccessfulLookup"); for (int i = 0; i < slookups.length; i++) { slookups[i].join(); if (!slookups[i].ok) { throw new Error(); } } - + System.out.println("all " + slookups.length + " SuccessfulLookup completed"); cl = Class.forName("Bad", false, loader); - FailingLookup[] flookups = new FailingLookup[50]; + int numFailingLookups = 50; + CountDownLatch fLookupLatch = new CountDownLatch(numFailingLookups); + FailingLookup[] flookups = new FailingLookup[numFailingLookups]; for (int i = 0; i < flookups.length; i++) { - flookups[i] = new FailingLookup(cl, barrier); + flookups[i] = new FailingLookup(cl, fLookupLatch); flookups[i].start(); } - Thread.sleep(1000); - synchronized (barrier) { - barrier.notifyAll(); - } - for (int i = 0; i < slookups.length; i++) { + System.out.println("awaiting completion of " + flookups.length + " FailingLookup"); + for (int i = 0; i < flookups.length; i++) { flookups[i].join(); if (!flookups[i].ok) { throw new Error(); } } + System.out.println("all " + flookups.length + " FailingLookup completed"); } } From abbf45b57edf2f5bf9a3f2fa408f35a43ebe9bb9 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Wed, 12 Jun 2024 06:18:31 +0000 Subject: [PATCH 035/471] 8332699: ubsan: jfrEventSetting.inline.hpp:31:43: runtime error: index 163 out of bounds for type 'jfrNativeEventSetting [162]' Reviewed-by: jbechberger, stuefe --- make/src/classes/build/tools/jfr/GenerateJfrFiles.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/make/src/classes/build/tools/jfr/GenerateJfrFiles.java b/make/src/classes/build/tools/jfr/GenerateJfrFiles.java index 3497d03292d81..34e933eb22d23 100644 --- a/make/src/classes/build/tools/jfr/GenerateJfrFiles.java +++ b/make/src/classes/build/tools/jfr/GenerateJfrFiles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -663,7 +663,7 @@ private static void printJfrEventControlHpp(Metadata metadata, File outputFile) out.write(""); out.write("union JfrNativeSettings {"); out.write(" // Array version."); - out.write(" jfrNativeEventSetting bits[NUMBER_OF_EVENTS];"); + out.write(" jfrNativeEventSetting bits[NUMBER_OF_EVENTS + NUMBER_OF_RESERVED_EVENTS];"); out.write(" // Then, to make it easy to debug,"); out.write(" // add named struct members also."); out.write(" struct {"); From a7e4ab9300730c32f6cf0dafd48f5e093f4ac0be Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Wed, 12 Jun 2024 07:06:29 +0000 Subject: [PATCH 036/471] 8333730: ubsan: FieldIndices/libFieldIndicesTest.cpp:276:11: runtime error: null pointer passed as argument 2, which is declared to never be null Reviewed-by: cjplummer, amenkov --- .../FollowReferences/FieldIndices/libFieldIndicesTest.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/serviceability/jvmti/FollowReferences/FieldIndices/libFieldIndicesTest.cpp b/test/hotspot/jtreg/serviceability/jvmti/FollowReferences/FieldIndices/libFieldIndicesTest.cpp index b8d83eb50853f..6bcbab3f9416b 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/FollowReferences/FieldIndices/libFieldIndicesTest.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/FollowReferences/FieldIndices/libFieldIndicesTest.cpp @@ -273,7 +273,9 @@ void Klass::explore_interfaces(JNIEnv* env) { if (super_klass != nullptr) { // Add all interfaces implemented by super_klass first. interface_count = super_klass->interface_count; - memcpy(interfaces, super_klass->interfaces, sizeof(Klass*) * super_klass->interface_count); + if (super_klass->interfaces != nullptr) { + memcpy(interfaces, super_klass->interfaces, sizeof(Klass*) * super_klass->interface_count); + } } // Interfaces implemented by the klass. From a0318bc873f019b6d11571cfd4113ca8cc183b9c Mon Sep 17 00:00:00 2001 From: Tobias Hartmann <thartmann@openjdk.org> Date: Wed, 12 Jun 2024 09:18:53 +0000 Subject: [PATCH 037/471] 8334077: Fix problem list entries for compiler tests Reviewed-by: chagedorn --- test/hotspot/jtreg/ProblemList.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 78e09c0627afa..5290a9bb6260e 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -67,8 +67,6 @@ compiler/floatingpoint/TestSubnormalDouble.java 8317810 generic-i586 compiler/startup/StartupOutput.java 8326615 generic-x64 -compiler/rangechecks/TestArrayAccessAboveRCAfterRCCastIIEliminated.java 8332369 generic-all - compiler/codecache/CodeCacheFullCountTest.java 8332954 generic-all ############################################################################# @@ -169,7 +167,7 @@ vmTestbase/vm/mlvm/meth/stress/jdi/breakpointInCompiledCode/Test.java 8257761 ge vmTestbase/vm/mlvm/indy/func/jvmti/mergeCP_indy2none_a/TestDescription.java 8013267 generic-all vmTestbase/vm/mlvm/indy/func/jvmti/mergeCP_indy2manyDiff_b/TestDescription.java 8013267 generic-all vmTestbase/vm/mlvm/indy/func/jvmti/mergeCP_indy2manySame_b/TestDescription.java 8013267 generic-all -vmTestbase/vm/mlvm/meth/stress/compiler/deoptimize/Test.java#id1 8325905 generic-all +vmTestbase/vm/mlvm/meth/stress/compiler/deoptimize/Test.java#id1 8324756 generic-all vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java 7199837 generic-all From c80e2eb35c4eb03f17a2a31e979e5c369453e203 Mon Sep 17 00:00:00 2001 From: Per Minborg <pminborg@openjdk.org> Date: Wed, 12 Jun 2024 09:35:48 +0000 Subject: [PATCH 038/471] 8333886: Explicitly specify that asSlice and reinterpret return a memory segment backed by the same region of memory. Reviewed-by: jvernee, mcimadamore --- .../java/lang/foreign/MemorySegment.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/java.base/share/classes/java/lang/foreign/MemorySegment.java b/src/java.base/share/classes/java/lang/foreign/MemorySegment.java index 6c75c0385fa78..1b378512316a6 100644 --- a/src/java.base/share/classes/java/lang/foreign/MemorySegment.java +++ b/src/java.base/share/classes/java/lang/foreign/MemorySegment.java @@ -630,6 +630,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * {@snippet lang=java : * asSlice(offset, newSize, 1); * } + * <p> + * The returned memory segment shares a region of backing memory with this segment. + * Hence, no memory will be allocated or freed by this method. * * @see #asSlice(long, long, long) * @@ -646,6 +649,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * Returns a slice of this memory segment, at the given offset, with the provided * alignment constraint. The returned segment's address is the address of this * segment plus the given offset; its size is specified by the given argument. + * <p> + * The returned memory segment shares a region of backing memory with this segment. + * Hence, no memory will be allocated or freed by this method. * * @param offset The new segment base offset (relative to the address of this segment), * specified in bytes @@ -670,6 +676,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * {@snippet lang=java : * asSlice(offset, layout.byteSize(), layout.byteAlignment()); * } + * <p> + * The returned memory segment shares a region of backing memory with this segment. + * Hence, no memory will be allocated or freed by this method. * * @see #asSlice(long, long, long) * @@ -693,6 +702,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * {@snippet lang=java : * asSlice(offset, byteSize() - offset); * } + * <p> + * The returned memory segment shares a region of backing memory with this segment. + * Hence, no memory will be allocated or freed by this method. * * @see #asSlice(long, long) * @@ -706,6 +718,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { /** * Returns a new memory segment that has the same address and scope as this segment, * but with the provided size. + * <p> + * The returned memory segment shares a region of backing memory with this segment. + * Hence, no memory will be allocated or freed by this method. * * @param newSize the size of the returned segment * @return a new memory segment that has the same address and scope as @@ -741,6 +756,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * That is, the cleanup action receives a segment that is associated with the global * scope, and is accessible from any thread. The size of the segment accepted by the * cleanup action is {@link #byteSize()}. + * <p> + * The returned memory segment shares a region of backing memory with this segment. + * Hence, no memory will be allocated or freed by this method. * * @apiNote The cleanup action (if present) should take care not to leak the received * segment to external clients that might access the segment after its @@ -786,6 +804,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * That is, the cleanup action receives a segment that is associated with the global * scope, and is accessible from any thread. The size of the segment accepted by the * cleanup action is {@code newSize}. + * <p> + * The returned memory segment shares a region of backing memory with this segment. + * Hence, no memory will be allocated or freed by this method. * * @apiNote The cleanup action (if present) should take care not to leak the received * segment to external clients that might access the segment after its From bd750b6b783101a3b992a25e7bc64777bb08de18 Mon Sep 17 00:00:00 2001 From: Doug Simon <dnsimon@openjdk.org> Date: Wed, 12 Jun 2024 10:03:39 +0000 Subject: [PATCH 039/471] 8319933: Disable tests for JDK-8280481 on Graal Reviewed-by: chagedorn --- .../jtreg/compiler/sharedstubs/SharedStubToInterpTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/compiler/sharedstubs/SharedStubToInterpTest.java b/test/hotspot/jtreg/compiler/sharedstubs/SharedStubToInterpTest.java index 5dd938442cc82..2bf8afae60926 100644 --- a/test/hotspot/jtreg/compiler/sharedstubs/SharedStubToInterpTest.java +++ b/test/hotspot/jtreg/compiler/sharedstubs/SharedStubToInterpTest.java @@ -36,6 +36,7 @@ * @requires vm.opt.TieredStopAtLevel == null & vm.opt.TieredCompilation == null * @requires vm.simpleArch == "x86" | vm.simpleArch == "x64" | vm.simpleArch == "aarch64" | vm.simpleArch == "riscv64" * @requires vm.debug + * @requires !vm.graal.enabled * @run driver compiler.sharedstubs.SharedStubToInterpTest -XX:-TieredCompilation * */ From 81ca0ece2e69477b3d22a40c51e044d56e13b6e4 Mon Sep 17 00:00:00 2001 From: Daniel Fuchs <dfuchs@openjdk.org> Date: Wed, 12 Jun 2024 10:53:08 +0000 Subject: [PATCH 040/471] 8334028: HttpClient: NPE thrown from assert statement Reviewed-by: jpai --- .../net/http/ResponseSubscribers.java | 3 ++- .../jdk/internal/net/http/common/Utils.java | 21 +++++++++++++++++-- .../net/httpclient/BodySubscribersTest.java | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/ResponseSubscribers.java b/src/java.net.http/share/classes/jdk/internal/net/http/ResponseSubscribers.java index ed95f815913ce..09ad87f9205eb 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/ResponseSubscribers.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/ResponseSubscribers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -356,6 +356,7 @@ public void onNext(List<ByteBuffer> items) { // incoming buffers are allocated by http client internally, // and won't be used anywhere except this place. // So it's free simply to store them for further processing. + Objects.requireNonNull(items); // ensure NPE is thrown before assert assert Utils.hasRemaining(items); received.addAll(items); } diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java b/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java index 9bd7f35028638..b2eb570db0c1e 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java @@ -746,6 +746,7 @@ public static String stringOf(Collection<?> source) { } public static long remaining(ByteBuffer[] bufs) { + if (bufs == null) return 0; long remain = 0; for (ByteBuffer buf : bufs) { remain += buf.remaining(); @@ -754,6 +755,7 @@ public static long remaining(ByteBuffer[] bufs) { } public static boolean hasRemaining(List<ByteBuffer> bufs) { + if (bufs == null) return false; for (ByteBuffer buf : bufs) { if (buf.hasRemaining()) return true; @@ -762,6 +764,7 @@ public static boolean hasRemaining(List<ByteBuffer> bufs) { } public static boolean hasRemaining(ByteBuffer[] bufs) { + if (bufs == null) return false; for (ByteBuffer buf : bufs) { if (buf.hasRemaining()) return true; @@ -770,6 +773,7 @@ public static boolean hasRemaining(ByteBuffer[] bufs) { } public static long remaining(List<ByteBuffer> bufs) { + if (bufs == null) return 0L; long remain = 0; for (ByteBuffer buf : bufs) { remain += buf.remaining(); @@ -778,12 +782,14 @@ public static long remaining(List<ByteBuffer> bufs) { } public static long synchronizedRemaining(List<ByteBuffer> bufs) { + if (bufs == null) return 0L; synchronized (bufs) { return remaining(bufs); } } - public static int remaining(List<ByteBuffer> bufs, int max) { + public static long remaining(List<ByteBuffer> bufs, long max) { + if (bufs == null) return 0; long remain = 0; for (ByteBuffer buf : bufs) { remain += buf.remaining(); @@ -794,7 +800,13 @@ public static int remaining(List<ByteBuffer> bufs, int max) { return (int) remain; } - public static int remaining(ByteBuffer[] refs, int max) { + public static int remaining(List<ByteBuffer> bufs, int max) { + // safe cast since max is an int + return (int) remaining(bufs, (long) max); + } + + public static long remaining(ByteBuffer[] refs, long max) { + if (refs == null) return 0; long remain = 0; for (ByteBuffer b : refs) { remain += b.remaining(); @@ -805,6 +817,11 @@ public static int remaining(ByteBuffer[] refs, int max) { return (int) remain; } + public static int remaining(ByteBuffer[] refs, int max) { + // safe cast since max is an int + return (int) remaining(refs, (long) max); + } + public static void close(Closeable... closeables) { for (Closeable c : closeables) { try { diff --git a/test/jdk/java/net/httpclient/BodySubscribersTest.java b/test/jdk/java/net/httpclient/BodySubscribersTest.java index 508cc95abb05e..5ee7ed4ef626e 100644 --- a/test/jdk/java/net/httpclient/BodySubscribersTest.java +++ b/test/jdk/java/net/httpclient/BodySubscribersTest.java @@ -24,7 +24,7 @@ /* * @test * @summary Basic test for the standard BodySubscribers default behavior - * @bug 8225583 + * @bug 8225583 8334028 * @run testng BodySubscribersTest */ From 81083a0e10d9c92f5247ae256e170709014b596b Mon Sep 17 00:00:00 2001 From: Daniel Fuchs <dfuchs@openjdk.org> Date: Wed, 12 Jun 2024 11:29:58 +0000 Subject: [PATCH 041/471] 8299487: Test java/net/httpclient/whitebox/SSLTubeTestDriver.java timed out Reviewed-by: jpai --- .../jdk/internal/net/http/SSLTubeTest.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java index ac251f9ba7d96..114110344a407 100644 --- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,16 +85,17 @@ private static class SSLLoopbackSubscriber implements FlowTube { ExecutorService exec, CountDownLatch allBytesReceived) throws IOException { SSLServerSocketFactory fac = ctx.getServerSocketFactory(); + InetAddress loopback = InetAddress.getLoopbackAddress(); SSLServerSocket serv = (SSLServerSocket) fac.createServerSocket(); serv.setReuseAddress(false); - serv.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + serv.bind(new InetSocketAddress(loopback, 0)); SSLParameters params = serv.getSSLParameters(); params.setApplicationProtocols(new String[]{"proto2"}); serv.setSSLParameters(params); int serverPort = serv.getLocalPort(); - clientSock = new Socket("localhost", serverPort); + clientSock = new Socket(loopback, serverPort); serverSock = (SSLSocket) serv.accept(); this.buffer = new LinkedBlockingQueue<>(); this.allBytesReceived = allBytesReceived; @@ -107,6 +108,7 @@ private static class SSLLoopbackSubscriber implements FlowTube { } public void start() { + System.out.println("Starting: server listening at: " + serverSock.getLocalSocketAddress()); thread1.start(); thread2.start(); thread3.start(); @@ -144,6 +146,7 @@ private void clientReader() { publisher.submit(List.of(bb)); } } catch (Throwable e) { + System.out.println("clientReader got exception: " + e); e.printStackTrace(); Utils.close(clientSock); } @@ -176,6 +179,7 @@ private void clientWriter() { clientSubscription.request(1); } } catch (Throwable e) { + System.out.println("clientWriter got exception: " + e); e.printStackTrace(); } } @@ -212,6 +216,7 @@ private void serverLoopback() { is.close(); os.close(); serverSock.close(); + System.out.println("serverLoopback exiting normally"); return; } os.write(bb, 0, n); @@ -219,7 +224,10 @@ private void serverLoopback() { loopCount.addAndGet(n); } } catch (Throwable e) { + System.out.println("serverLoopback got exception: " + e); e.printStackTrace(); + } finally { + System.out.println("serverLoopback exiting at count: " + loopCount.get()); } } From 5a8a9fdfa599e8939a5c6675883a92c869474979 Mon Sep 17 00:00:00 2001 From: Amit Kumar <amitkumar@openjdk.org> Date: Wed, 12 Jun 2024 13:24:58 +0000 Subject: [PATCH 042/471] 8333382: [s390x] Enhance popcnt Instruction to use Z15 facilities Reviewed-by: lucy, aph --- src/hotspot/cpu/s390/assembler_s390.hpp | 4 +- .../cpu/s390/assembler_s390.inline.hpp | 2 +- src/hotspot/cpu/s390/macroAssembler_s390.cpp | 84 +++++++++++++++++++ src/hotspot/cpu/s390/macroAssembler_s390.hpp | 18 +++- src/hotspot/cpu/s390/s390.ad | 71 ++++++++++------ .../openjdk/bench/vm/compiler/PopCount.java | 57 +++++++++++++ 6 files changed, 207 insertions(+), 29 deletions(-) create mode 100644 test/micro/org/openjdk/bench/vm/compiler/PopCount.java diff --git a/src/hotspot/cpu/s390/assembler_s390.hpp b/src/hotspot/cpu/s390/assembler_s390.hpp index f472af134a358..5820095828985 100644 --- a/src/hotspot/cpu/s390/assembler_s390.hpp +++ b/src/hotspot/cpu/s390/assembler_s390.hpp @@ -1610,6 +1610,9 @@ class Assembler : public AbstractAssembler { static int inv_simm32(long x) { return (inv_s_field(x, 31, 0)); } // 6-byte instructions only static int inv_uimm12(long x) { return (inv_u_field(x, 11, 0)); } // 4-byte instructions only + // NOTE: PLEASE DON'T USE IT NAKED UNTIL WE DROP SUPPORT FOR MACHINES OLDER THAN Z15!!!! + inline void z_popcnt(Register r1, Register r2, int64_t m3); // population count + private: // Encode u_field from long value. @@ -3106,7 +3109,6 @@ class Assembler : public AbstractAssembler { // Ppopulation count intrinsics. inline void z_flogr(Register r1, Register r2); // find leftmost one - inline void z_popcnt(Register r1, Register r2); // population count inline void z_ahhhr(Register r1, Register r2, Register r3); // ADD halfword high high inline void z_ahhlr(Register r1, Register r2, Register r3); // ADD halfword high low diff --git a/src/hotspot/cpu/s390/assembler_s390.inline.hpp b/src/hotspot/cpu/s390/assembler_s390.inline.hpp index 51b2cbe0a3e8a..2649d0f7a3496 100644 --- a/src/hotspot/cpu/s390/assembler_s390.inline.hpp +++ b/src/hotspot/cpu/s390/assembler_s390.inline.hpp @@ -748,7 +748,7 @@ inline void Assembler::z_brxhg(Register r1, Register r3, Label& L) {z_brxhg(r1, inline void Assembler::z_brxlg(Register r1, Register r3, Label& L) {z_brxlg(r1, r3, target(L)); } inline void Assembler::z_flogr( Register r1, Register r2) { emit_32( FLOGR_ZOPC | reg(r1, 24, 32) | reg(r2, 28, 32)); } -inline void Assembler::z_popcnt(Register r1, Register r2) { emit_32( POPCNT_ZOPC | reg(r1, 24, 32) | reg(r2, 28, 32)); } +inline void Assembler::z_popcnt(Register r1, Register r2, int64_t m3) { emit_32( POPCNT_ZOPC | reg(r1, 24, 32) | reg(r2, 28, 32) | uimm4(m3, 16, 32)); } inline void Assembler::z_ahhhr( Register r1, Register r2, Register r3) { emit_32( AHHHR_ZOPC | reg(r3, 16, 32) | reg(r1, 24, 32) | reg(r2, 28, 32)); } inline void Assembler::z_ahhlr( Register r1, Register r2, Register r3) { emit_32( AHHLR_ZOPC | reg(r3, 16, 32) | reg(r1, 24, 32) | reg(r2, 28, 32)); } diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.cpp b/src/hotspot/cpu/s390/macroAssembler_s390.cpp index ef5216a12ba13..275f4a8d832e3 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp @@ -5803,3 +5803,87 @@ void MacroAssembler::lightweight_unlock(Register obj, Register hdr, Register tmp z_alsi(in_bytes(JavaThread::lock_stack_top_offset()), Z_thread, -oopSize); // pop object z_cr(tmp, tmp); // set CC to EQ } + +void MacroAssembler::pop_count_int(Register r_dst, Register r_src, Register r_tmp) { + BLOCK_COMMENT("pop_count_int {"); + + assert(r_tmp != noreg, "temp register required for pop_count_int, as code may run on machine older than z15"); + assert_different_registers(r_dst, r_tmp); // if r_src is same as r_tmp, it should be fine + + if (VM_Version::has_MiscInstrExt3()) { + pop_count_int_with_ext3(r_dst, r_src); + } else { + pop_count_int_without_ext3(r_dst, r_src, r_tmp); + } + + BLOCK_COMMENT("} pop_count_int"); +} + +void MacroAssembler::pop_count_long(Register r_dst, Register r_src, Register r_tmp) { + BLOCK_COMMENT("pop_count_long {"); + + assert(r_tmp != noreg, "temp register required for pop_count_long, as code may run on machine older than z15"); + assert_different_registers(r_dst, r_tmp); // if r_src is same as r_tmp, it should be fine + + if (VM_Version::has_MiscInstrExt3()) { + pop_count_long_with_ext3(r_dst, r_src); + } else { + pop_count_long_without_ext3(r_dst, r_src, r_tmp); + } + + BLOCK_COMMENT("} pop_count_long"); +} + +void MacroAssembler::pop_count_int_without_ext3(Register r_dst, Register r_src, Register r_tmp) { + BLOCK_COMMENT("pop_count_int_without_ext3 {"); + + assert(r_tmp != noreg, "temp register required for popcnt, for machines < z15"); + assert_different_registers(r_dst, r_tmp); // if r_src is same as r_tmp, it should be fine + + z_popcnt(r_dst, r_src, 0); + z_srlg(r_tmp, r_dst, 16); + z_alr(r_dst, r_tmp); + z_srlg(r_tmp, r_dst, 8); + z_alr(r_dst, r_tmp); + z_llgcr(r_dst, r_dst); + + BLOCK_COMMENT("} pop_count_int_without_ext3"); +} + +void MacroAssembler::pop_count_long_without_ext3(Register r_dst, Register r_src, Register r_tmp) { + BLOCK_COMMENT("pop_count_long_without_ext3 {"); + + assert(r_tmp != noreg, "temp register required for popcnt, for machines < z15"); + assert_different_registers(r_dst, r_tmp); // if r_src is same as r_tmp, it should be fine + + z_popcnt(r_dst, r_src, 0); + z_ahhlr(r_dst, r_dst, r_dst); + z_sllg(r_tmp, r_dst, 16); + z_algr(r_dst, r_tmp); + z_sllg(r_tmp, r_dst, 8); + z_algr(r_dst, r_tmp); + z_srlg(r_dst, r_dst, 56); + + BLOCK_COMMENT("} pop_count_long_without_ext3"); +} + +void MacroAssembler::pop_count_long_with_ext3(Register r_dst, Register r_src) { + BLOCK_COMMENT("pop_count_long_with_ext3 {"); + + guarantee(VM_Version::has_MiscInstrExt3(), + "this hardware doesn't support miscellaneous-instruction-extensions facility 3, still pop_count_long_with_ext3 is used"); + z_popcnt(r_dst, r_src, 8); + + BLOCK_COMMENT("} pop_count_long_with_ext3"); +} + +void MacroAssembler::pop_count_int_with_ext3(Register r_dst, Register r_src) { + BLOCK_COMMENT("pop_count_int_with_ext3 {"); + + guarantee(VM_Version::has_MiscInstrExt3(), + "this hardware doesn't support miscellaneous-instruction-extensions facility 3, still pop_count_long_with_ext3 is used"); + z_llgfr(r_dst, r_src); + z_popcnt(r_dst, r_dst, 8); + + BLOCK_COMMENT("} pop_count_int_with_ext3"); +} diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.hpp b/src/hotspot/cpu/s390/macroAssembler_s390.hpp index 924583abdf563..9f45542dd65cf 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.hpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.hpp @@ -1,6 +1,7 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2016, 2023 SAP SE. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024 SAP SE. All rights reserved. + * Copyright (c) 2024 IBM Corporation. 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 @@ -1021,6 +1022,19 @@ class MacroAssembler: public Assembler { Register z, Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5); + + // These generate optimized code for all supported s390 implementations, and are preferred for most uses. + void pop_count_int(Register dst, Register src, Register tmp); + void pop_count_long(Register dst, Register src, Register tmp); + + // For legacy (pre-z15) use, but will work on all supported s390 implementations. + void pop_count_int_without_ext3(Register dst, Register src, Register tmp); + void pop_count_long_without_ext3(Register dst, Register src, Register tmp); + + // Only for use on z15 or later s390 implementations. + void pop_count_int_with_ext3(Register dst, Register src); + void pop_count_long_with_ext3(Register dst, Register src); + }; /** diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad index 28cac16864dee..56cf494d27e0a 100644 --- a/src/hotspot/cpu/s390/s390.ad +++ b/src/hotspot/cpu/s390/s390.ad @@ -10675,10 +10675,49 @@ instruct countTrailingZerosL(revenRegI dst, iRegL src, roddRegL tmp, flagsReg cr // bit count +instruct popCountI_Ext3(iRegI dst, iRegI src, flagsReg cr) %{ + match(Set dst (PopCountI src)); + effect(TEMP_DEF dst, KILL cr); + predicate(UsePopCountInstruction && + VM_Version::has_PopCount() && + VM_Version::has_MiscInstrExt3()); + ins_cost(DEFAULT_COST); + size(8); // popcnt + llgfr + format %{ "POPCNT $dst,$src\t # pop count int" %} + ins_encode %{ + Register Rdst = $dst$$Register; + Register Rsrc = $src$$Register; + + __ pop_count_int_with_ext3(Rdst, Rsrc); + + %} + ins_pipe(pipe_class_dummy); +%} + +instruct popCountL_Ext3(iRegI dst, iRegL src, flagsReg cr) %{ + match(Set dst (PopCountL src)); + effect(TEMP_DEF dst, KILL cr); + predicate(UsePopCountInstruction && + VM_Version::has_PopCount() && + VM_Version::has_MiscInstrExt3()); + ins_cost(DEFAULT_COST); + size(4); // popcnt + format %{ "POPCNT $dst,$src\t # pop count long" %} + ins_encode %{ + Register Rdst = $dst$$Register; + Register Rsrc = $src$$Register; + + __ pop_count_long_with_ext3(Rdst, Rsrc); + %} + ins_pipe(pipe_class_dummy); +%} + instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{ match(Set dst (PopCountI src)); effect(TEMP_DEF dst, TEMP tmp, KILL cr); - predicate(UsePopCountInstruction && VM_Version::has_PopCount()); + predicate(UsePopCountInstruction && + VM_Version::has_PopCount() && + (!VM_Version::has_MiscInstrExt3())); ins_cost(DEFAULT_COST); size(24); format %{ "POPCNT $dst,$src\t # pop count int" %} @@ -10687,17 +10726,8 @@ instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{ Register Rsrc = $src$$Register; Register Rtmp = $tmp$$Register; - // Prefer compile-time assertion over run-time SIGILL. - assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI"); - assert_different_registers(Rdst, Rtmp); + __ pop_count_int_without_ext3(Rdst, Rsrc, Rtmp); - // Version 2: shows 10%(z196) improvement over original. - __ z_popcnt(Rdst, Rsrc); - __ z_srlg(Rtmp, Rdst, 16); // calc byte4+byte6 and byte5+byte7 - __ z_alr(Rdst, Rtmp); // into byte6 and byte7 - __ z_srlg(Rtmp, Rdst, 8); // calc (byte4+byte6) + (byte5+byte7) - __ z_alr(Rdst, Rtmp); // into byte7 - __ z_llgcr(Rdst, Rdst); // zero-extend sum %} ins_pipe(pipe_class_dummy); %} @@ -10705,27 +10735,18 @@ instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{ instruct popCountL(iRegI dst, iRegL src, iRegL tmp, flagsReg cr) %{ match(Set dst (PopCountL src)); effect(TEMP_DEF dst, TEMP tmp, KILL cr); - predicate(UsePopCountInstruction && VM_Version::has_PopCount()); + predicate(UsePopCountInstruction && + VM_Version::has_PopCount() && + (!VM_Version::has_MiscInstrExt3())); ins_cost(DEFAULT_COST); - // TODO: s390 port size(FIXED_SIZE); + size(34); format %{ "POPCNT $dst,$src\t # pop count long" %} ins_encode %{ Register Rdst = $dst$$Register; Register Rsrc = $src$$Register; Register Rtmp = $tmp$$Register; - // Prefer compile-time assertion over run-time SIGILL. - assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI"); - assert_different_registers(Rdst, Rtmp); - - // Original version. Using LA instead of algr seems to be a really bad idea (-35%). - __ z_popcnt(Rdst, Rsrc); - __ z_ahhlr(Rdst, Rdst, Rdst); - __ z_sllg(Rtmp, Rdst, 16); - __ z_algr(Rdst, Rtmp); - __ z_sllg(Rtmp, Rdst, 8); - __ z_algr(Rdst, Rtmp); - __ z_srlg(Rdst, Rdst, 56); + __ pop_count_long_without_ext3(Rdst, Rsrc, Rtmp); %} ins_pipe(pipe_class_dummy); %} diff --git a/test/micro/org/openjdk/bench/vm/compiler/PopCount.java b/test/micro/org/openjdk/bench/vm/compiler/PopCount.java new file mode 100644 index 0000000000000..cbf44023c1e42 --- /dev/null +++ b/test/micro/org/openjdk/bench/vm/compiler/PopCount.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2024 IBM Corporation. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.openjdk.bench.vm.compiler; + +import org.openjdk.jmh.annotations.*; + +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Thread) +@Warmup(iterations = 10, time = 1) +@Measurement(iterations = 5, time = 1) +@Fork(value = 5) +public class PopCount { + int numTests = 100_000; + + @Benchmark + public long test() { + long l1 = 1, l2 = 2, l3 = 3, l4 = 4, l5 = 5, l6 = 6, l7 = 7, l8 = 9, l9 = 9, l10 = 10; + for (long i = 0; i < numTests; i++) { + l1 ^= Long.bitCount(l1) + i; + l2 ^= Long.bitCount(l2) + i; + l3 ^= Long.bitCount(l3) + i; + l4 ^= Long.bitCount(l4) + i; + l5 ^= Long.bitCount(l5) + i; + l6 ^= Long.bitCount(l6) + i; + l7 ^= Long.bitCount(l7) + i; + l8 ^= Long.bitCount(l8) + i; + l9 ^= Long.bitCount(l9) + i; + l10 ^= Long.bitCount(l10) + i; + } + return l1 + l2 + l3 + l4 + l5 + l6 + l7 + l8 + l9 + l10; + } + +} From 2c9185eb81c9dfcc30d160a6254089c474b56b0d Mon Sep 17 00:00:00 2001 From: Fei Gao <fgao@openjdk.org> Date: Wed, 12 Jun 2024 13:29:45 +0000 Subject: [PATCH 043/471] 8321308: AArch64: Fix matching predication for cbz/cbnz Reviewed-by: fyang, adinn, aph --- src/hotspot/cpu/aarch64/aarch64.ad | 34 ++++--- .../irTests/TestArrLenCheckOptimization.java | 92 +++++++++++++++++++ .../compiler/lib/ir_framework/IRNode.java | 20 ++++ 3 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/c2/irTests/TestArrLenCheckOptimization.java diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 190bfdd1f6767..2f2bee6e22f0f 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -5628,24 +5628,24 @@ operand cmpOpLtGe() // used for certain unsigned integral comparisons which can be // converted to cbxx or tbxx instructions -operand cmpOpUEqNeLtGe() +operand cmpOpUEqNeLeGt() %{ match(Bool); op_cost(0); - predicate(n->as_Bool()->_test._test == BoolTest::eq - || n->as_Bool()->_test._test == BoolTest::ne - || n->as_Bool()->_test._test == BoolTest::lt - || n->as_Bool()->_test._test == BoolTest::ge); + predicate(n->as_Bool()->_test._test == BoolTest::eq || + n->as_Bool()->_test._test == BoolTest::ne || + n->as_Bool()->_test._test == BoolTest::le || + n->as_Bool()->_test._test == BoolTest::gt); format %{ "" %} interface(COND_INTER) %{ equal(0x0, "eq"); not_equal(0x1, "ne"); - less(0xb, "lt"); - greater_equal(0xa, "ge"); - less_equal(0xd, "le"); - greater(0xc, "gt"); + less(0x3, "lo"); + greater_equal(0x2, "hs"); + less_equal(0x9, "ls"); + greater(0x8, "hi"); overflow(0x6, "vs"); no_overflow(0x7, "vc"); %} @@ -15687,7 +15687,7 @@ instruct cmpP_narrowOop_imm0_branch(cmpOpEqNe cmp, iRegN oop, immP0 zero, label ins_pipe(pipe_cmp_branch); %} -instruct cmpUI_imm0_branch(cmpOpUEqNeLtGe cmp, iRegIorL2I op1, immI0 op2, label labl, rFlagsRegU cr) %{ +instruct cmpUI_imm0_branch(cmpOpUEqNeLeGt cmp, iRegIorL2I op1, immI0 op2, label labl) %{ match(If cmp (CmpU op1 op2)); effect(USE labl); @@ -15696,15 +15696,17 @@ instruct cmpUI_imm0_branch(cmpOpUEqNeLtGe cmp, iRegIorL2I op1, immI0 op2, label ins_encode %{ Label* L = $labl$$label; Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode; - if (cond == Assembler::EQ || cond == Assembler::LS) + if (cond == Assembler::EQ || cond == Assembler::LS) { __ cbzw($op1$$Register, *L); - else + } else { + assert(cond == Assembler::NE || cond == Assembler::HI, "unexpected condition"); __ cbnzw($op1$$Register, *L); + } %} ins_pipe(pipe_cmp_branch); %} -instruct cmpUL_imm0_branch(cmpOpUEqNeLtGe cmp, iRegL op1, immL0 op2, label labl, rFlagsRegU cr) %{ +instruct cmpUL_imm0_branch(cmpOpUEqNeLeGt cmp, iRegL op1, immL0 op2, label labl) %{ match(If cmp (CmpUL op1 op2)); effect(USE labl); @@ -15713,10 +15715,12 @@ instruct cmpUL_imm0_branch(cmpOpUEqNeLtGe cmp, iRegL op1, immL0 op2, label labl, ins_encode %{ Label* L = $labl$$label; Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode; - if (cond == Assembler::EQ || cond == Assembler::LS) + if (cond == Assembler::EQ || cond == Assembler::LS) { __ cbz($op1$$Register, *L); - else + } else { + assert(cond == Assembler::NE || cond == Assembler::HI, "unexpected condition"); __ cbnz($op1$$Register, *L); + } %} ins_pipe(pipe_cmp_branch); %} diff --git a/test/hotspot/jtreg/compiler/c2/irTests/TestArrLenCheckOptimization.java b/test/hotspot/jtreg/compiler/c2/irTests/TestArrLenCheckOptimization.java new file mode 100644 index 0000000000000..cb955bf14e7c8 --- /dev/null +++ b/test/hotspot/jtreg/compiler/c2/irTests/TestArrLenCheckOptimization.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.c2.irTests; + +import compiler.lib.ir_framework.*; +import jdk.test.lib.Asserts; + +/* + * @test + * @bug 8321308 + * @summary AArch64: Fix matching predication for cbz/cbnz + * @requires os.arch=="aarch64" + * @library /test/lib / + * @run driver compiler.c2.irTests.TestArrLenCheckOptimization + */ + +public class TestArrLenCheckOptimization { + + int result = 0; + + @Test + @IR(counts = {IRNode.CBZW_LS, "1"}) + void test_le_int(int ia[]) { + result += ia[0]; + } + + @Test + @IR(counts = {IRNode.CBNZW_HI, "1"}) + void test_gt_int(int ia[]) { + if (ia.length > 0) { + result += 0x88; + } else { + result -= 1; + } + } + + @Test + @IR(counts = {IRNode.CBZ_LS, "1"}) + void test_le_long(int ia[]) { + if (Long.compareUnsigned(ia.length, 0) > 0) { + result += 0x80; + } else { + result -= 1; + } + } + + @Test + @IR(counts = {IRNode.CBZ_HI, "1"}) + void test_gt_long(int ia[]) { + if (Long.compareUnsigned(ia.length, 0) > 0) { + result += 0x82; + } else { + result -= 1; + } + } + + @Run(test = {"test_le_int", "test_gt_int", "test_le_long", "test_gt_long"}, + mode = RunMode.STANDALONE) + public void test_runner() { + for (int i = 0; i < 10_000; i++) { + test_le_int(new int[1]); + test_gt_int(new int[0]); + test_le_long(new int[1]); + test_gt_long(new int[0]); + } + } + + public static void main(String [] args) { + TestFramework.run(); + } + } diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java b/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java index 1fb68439afbb2..efa7ccadfda1b 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java @@ -378,6 +378,26 @@ public class IRNode { beforeMatchingNameRegex(CAST_LL, "CastLL"); } + public static final String CBNZW_HI = PREFIX + "CBNZW_HI" + POSTFIX; + static { + optoOnly(CBNZW_HI, "cbwhi"); + } + + public static final String CBZW_LS = PREFIX + "CBZW_LS" + POSTFIX; + static { + optoOnly(CBZW_LS, "cbwls"); + } + + public static final String CBZ_LS = PREFIX + "CBZ_LS" + POSTFIX; + static { + optoOnly(CBZ_LS, "cbls"); + } + + public static final String CBZ_HI = PREFIX + "CBZ_HI" + POSTFIX; + static { + optoOnly(CBZ_HI, "cbhi"); + } + public static final String CHECKCAST_ARRAY = PREFIX + "CHECKCAST_ARRAY" + POSTFIX; static { String regex = "(((?i:cmp|CLFI|CLR).*precise \\[.*:|.*(?i:mov|mv|or).*precise \\[.*:.*\\R.*(cmp|CMP|CLR))" + END; From ba67ad63ae7d7d399e41ab258576123fb6d9502c Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk <asemenyuk@openjdk.org> Date: Wed, 12 Jun 2024 13:37:03 +0000 Subject: [PATCH 044/471] 8319457: Update jpackage to support WiX v4 and v5 on Windows Reviewed-by: almatvee --- make/modules/jdk.jpackage/Java.gmk | 2 +- .../jdk/jpackage/internal/WinMsiBundler.java | 116 +++-- .../internal/WixAppImageFragmentBuilder.java | 150 +++++-- .../jpackage/internal/WixFragmentBuilder.java | 100 +++-- .../jdk/jpackage/internal/WixPipeline.java | 121 +++-- .../jpackage/internal/WixSourceConverter.java | 420 ++++++++++++++++++ .../jdk/jpackage/internal/WixTool.java | 248 ++++++++--- .../jdk/jpackage/internal/WixToolset.java | 82 ++++ .../internal/WixUiFragmentBuilder.java | 90 +++- .../resources/InstallDirNotEmptyDlg.wxs | 6 +- .../resources/MsiInstallerStrings_de.wxl | 4 +- .../resources/MsiInstallerStrings_en.wxl | 4 +- .../resources/MsiInstallerStrings_ja.wxl | 4 +- .../resources/MsiInstallerStrings_zh_CN.wxl | 4 +- .../resources/WinResources.properties | 5 +- .../resources/WinResources_de.properties | 5 +- .../resources/WinResources_ja.properties | 5 +- .../resources/WinResources_zh_CN.properties | 5 +- .../jpackage/internal/resources/overrides.wxi | 2 +- .../internal/resources/wix3-to-wix4-conv.xsl | 183 ++++++++ .../jdk/jpackage/test/WindowsHelper.java | 26 +- .../tools/jpackage/windows/WinL10nTest.java | 96 ++-- 22 files changed, 1391 insertions(+), 287 deletions(-) create mode 100644 src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java create mode 100644 src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixToolset.java create mode 100644 src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/wix3-to-wix4-conv.xsl diff --git a/make/modules/jdk.jpackage/Java.gmk b/make/modules/jdk.jpackage/Java.gmk index 9d31e5417e905..d60e9ac281488 100644 --- a/make/modules/jdk.jpackage/Java.gmk +++ b/make/modules/jdk.jpackage/Java.gmk @@ -27,6 +27,6 @@ DISABLED_WARNINGS_java += dangling-doc-comments COPY += .gif .png .txt .spec .script .prerm .preinst \ .postrm .postinst .list .sh .desktop .copyright .control .plist .template \ - .icns .scpt .wxs .wxl .wxi .ico .bmp .tiff .service + .icns .scpt .wxs .wxl .wxi .ico .bmp .tiff .service .xsl CLEAN += .properties diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java index 894d41d764204..c0ae65b3b0bcc 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,6 +67,7 @@ import static jdk.jpackage.internal.StandardBundlerParam.TEMP_ROOT; import static jdk.jpackage.internal.StandardBundlerParam.VENDOR; import static jdk.jpackage.internal.StandardBundlerParam.VERSION; +import jdk.jpackage.internal.WixToolset.WixToolsetType; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; @@ -253,7 +254,7 @@ public String getBundleType() { public boolean supported(boolean platformInstaller) { try { if (wixToolset == null) { - wixToolset = WixTool.toolset(); + wixToolset = WixTool.createToolset(); } return true; } catch (ConfigException ce) { @@ -300,7 +301,7 @@ public boolean validate(Map<String, ? super Object> params) appImageBundler.validate(params); if (wixToolset == null) { - wixToolset = WixTool.toolset(); + wixToolset = WixTool.createToolset(); } try { @@ -309,16 +310,17 @@ public boolean validate(Map<String, ? super Object> params) throw new ConfigException(ex); } - for (var toolInfo: wixToolset.values()) { + for (var tool : wixToolset.getType().getTools()) { Log.verbose(MessageFormat.format(I18N.getString( - "message.tool-version"), toolInfo.path.getFileName(), - toolInfo.version)); + "message.tool-version"), wixToolset.getToolPath(tool). + getFileName(), wixToolset.getVersion())); } - wixFragments.forEach(wixFragment -> wixFragment.setWixVersion( - wixToolset.get(WixTool.Light).version)); + wixFragments.forEach(wixFragment -> wixFragment.setWixVersion(wixToolset.getVersion(), + wixToolset.getType())); - wixFragments.get(0).logWixFeatures(); + wixFragments.stream().map(WixFragmentBuilder::getLoggableWixFeatures).flatMap( + List::stream).distinct().toList().forEach(Log::verbose); /********* validate bundle parameters *************/ @@ -512,22 +514,6 @@ private Map<String, String> prepareMainProjectFile( data.put("JpIsSystemWide", "yes"); } - // Copy standard l10n files. - for (String loc : Arrays.asList("de", "en", "ja", "zh_CN")) { - String fname = "MsiInstallerStrings_" + loc + ".wxl"; - createResource(fname, params) - .setCategory(I18N.getString("resource.wxl-file")) - .saveToFile(configDir.resolve(fname)); - } - - createResource("main.wxs", params) - .setCategory(I18N.getString("resource.main-wix-file")) - .saveToFile(configDir.resolve("main.wxs")); - - createResource("overrides.wxi", params) - .setCategory(I18N.getString("resource.overrides-wix-file")) - .saveToFile(configDir.resolve("overrides.wxi")); - return data; } @@ -542,13 +528,11 @@ private Path buildMSI(Map<String, ? super Object> params, .toString())); WixPipeline wixPipeline = new WixPipeline() - .setToolset(wixToolset.entrySet().stream().collect( - Collectors.toMap( - entry -> entry.getKey(), - entry -> entry.getValue().path))) - .setWixObjDir(TEMP_ROOT.fetchFrom(params).resolve("wixobj")) - .setWorkDir(WIN_APP_IMAGE.fetchFrom(params)) - .addSource(CONFIG_ROOT.fetchFrom(params).resolve("main.wxs"), wixVars); + .setToolset(wixToolset) + .setWixObjDir(TEMP_ROOT.fetchFrom(params).resolve("wixobj")) + .setWorkDir(WIN_APP_IMAGE.fetchFrom(params)) + .addSource(CONFIG_ROOT.fetchFrom(params).resolve("main.wxs"), + wixVars); for (var wixFragment : wixFragments) { wixFragment.configureWixPipeline(wixPipeline); @@ -557,16 +541,46 @@ private Path buildMSI(Map<String, ? super Object> params, Log.verbose(MessageFormat.format(I18N.getString( "message.generating-msi"), msiOut.toAbsolutePath().toString())); - wixPipeline.addLightOptions("-sice:ICE27"); + switch (wixToolset.getType()) { + case Wix3 -> { + wixPipeline.addLightOptions("-sice:ICE27"); + + if (!MSI_SYSTEM_WIDE.fetchFrom(params)) { + wixPipeline.addLightOptions("-sice:ICE91"); + } + } + case Wix4 -> { + } + default -> { + throw new IllegalArgumentException(); + } + } + + final Path configDir = CONFIG_ROOT.fetchFrom(params); + + var primaryWxlFiles = Stream.of("de", "en", "ja", "zh_CN").map(loc -> { + return configDir.resolve("MsiInstallerStrings_" + loc + ".wxl"); + }).toList(); + + var wixResources = new WixSourceConverter.ResourceGroup(wixToolset.getType()); - if (!MSI_SYSTEM_WIDE.fetchFrom(params)) { - wixPipeline.addLightOptions("-sice:ICE91"); + // Copy standard l10n files. + for (var path : primaryWxlFiles) { + var name = path.getFileName().toString(); + wixResources.addResource(createResource(name, params).setPublicName(name).setCategory( + I18N.getString("resource.wxl-file")), path); } + wixResources.addResource(createResource("main.wxs", params).setPublicName("main.wxs"). + setCategory(I18N.getString("resource.main-wix-file")), configDir.resolve("main.wxs")); + + wixResources.addResource(createResource("overrides.wxi", params).setPublicName( + "overrides.wxi").setCategory(I18N.getString("resource.overrides-wix-file")), + configDir.resolve("overrides.wxi")); + // Filter out custom l10n files that were already used to // override primary l10n files. Ignore case filename comparison, // both lists are expected to be short. - List<Path> primaryWxlFiles = getWxlFilesFromDir(params, CONFIG_ROOT); List<Path> customWxlFiles = getWxlFilesFromDir(params, RESOURCE_DIR).stream() .filter(custom -> primaryWxlFiles.stream().noneMatch(primary -> primary.getFileName().toString().equalsIgnoreCase( @@ -577,6 +591,17 @@ private Path buildMSI(Map<String, ? super Object> params, custom.getFileName().toString()))) .toList(); + // Copy custom l10n files. + for (var path : customWxlFiles) { + var name = path.getFileName().toString(); + wixResources.addResource(createResource(name, params).setPublicName(name). + setSourceOrder(OverridableResource.Source.ResourceDir).setCategory(I18N. + getString("resource.wxl-file")), configDir.resolve(name)); + } + + // Save all WiX resources into config dir. + wixResources.saveResources(); + // All l10n files are supplied to WiX with "-loc", but only // Cultures from custom files and a single primary Culture are // included into "-cultures" list @@ -586,6 +611,7 @@ private Path buildMSI(Map<String, ? super Object> params, List<String> cultures = new ArrayList<>(); for (var wxl : customWxlFiles) { + wxl = configDir.resolve(wxl.getFileName()); wixPipeline.addLightOptions("-loc", wxl.toAbsolutePath().normalize().toString()); cultures.add(getCultureFromWxlFile(wxl)); } @@ -598,8 +624,20 @@ private Path buildMSI(Map<String, ? super Object> params, // Build ordered list of unique cultures. Set<String> uniqueCultures = new LinkedHashSet<>(); uniqueCultures.addAll(cultures); - wixPipeline.addLightOptions(uniqueCultures.stream().collect( - Collectors.joining(";", "-cultures:", ""))); + switch (wixToolset.getType()) { + case Wix3 -> { + wixPipeline.addLightOptions(uniqueCultures.stream().collect(Collectors.joining(";", + "-cultures:", ""))); + } + case Wix4 -> { + uniqueCultures.forEach(culture -> { + wixPipeline.addLightOptions("-culture", culture); + }); + } + default -> { + throw new IllegalArgumentException(); + } + } wixPipeline.buildMsi(msiOut.toAbsolutePath()); @@ -751,7 +789,7 @@ private static OverridableResource initServiceInstallerResource( } private Path installerIcon; - private Map<WixTool, WixTool.ToolInfo> wixToolset; + private WixToolset wixToolset; private AppImageBundler appImageBundler; private final List<WixFragmentBuilder> wixFragments; } diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java index cf7338f7d0b48..5bc20c1413c86 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java @@ -64,6 +64,7 @@ import static jdk.jpackage.internal.WinMsiBundler.MSI_SYSTEM_WIDE; import static jdk.jpackage.internal.WinMsiBundler.SERVICE_INSTALLER; import static jdk.jpackage.internal.WinMsiBundler.WIN_APP_IMAGE; +import jdk.jpackage.internal.WixToolset.WixToolsetType; import org.w3c.dom.NodeList; /** @@ -152,6 +153,16 @@ void addFilesToConfigRoot() throws IOException { super.addFilesToConfigRoot(); } + @Override + List<String> getLoggableWixFeatures() { + if (isWithWix36Features()) { + return List.of(MessageFormat.format(I18N.getString("message.use-wix36-features"), + getWixVersion())); + } else { + return List.of(); + } + } + @Override protected Collection<XmlConsumer> getFragmentWriters() { return List.of( @@ -314,12 +325,25 @@ boolean isFile() { return cfg.isFile; } - static void startElement(XMLStreamWriter xml, String componentId, + static void startElement(WixToolsetType wixType, XMLStreamWriter xml, String componentId, String componentGuid) throws XMLStreamException, IOException { xml.writeStartElement("Component"); - xml.writeAttribute("Win64", is64Bit() ? "yes" : "no"); + switch (wixType) { + case Wix3 -> { + xml.writeAttribute("Win64", is64Bit() ? "yes" : "no"); + xml.writeAttribute("Guid", componentGuid); + } + case Wix4 -> { + xml.writeAttribute("Bitness", is64Bit() ? "always64" : "always32"); + if (!componentGuid.equals("*")) { + xml.writeAttribute("Guid", componentGuid); + } + } + default -> { + throw new IllegalArgumentException(); + } + } xml.writeAttribute("Id", componentId); - xml.writeAttribute("Guid", componentGuid); } private static final class Config { @@ -370,22 +394,31 @@ private String addComponent(XMLStreamWriter xml, Path path, directoryRefPath = path; } - xml.writeStartElement("DirectoryRef"); - xml.writeAttribute("Id", Id.Folder.of(directoryRefPath)); + startDirectoryElement(xml, "DirectoryRef", directoryRefPath); final String componentId = "c" + role.idOf(path); - Component.startElement(xml, componentId, String.format("{%s}", - role.guidOf(path))); + Component.startElement(getWixType(), xml, componentId, String.format( + "{%s}", role.guidOf(path))); if (role == Component.Shortcut) { - xml.writeStartElement("Condition"); String property = shortcutFolders.stream().filter(shortcutFolder -> { return path.startsWith(shortcutFolder.root); }).map(shortcutFolder -> { return shortcutFolder.property; }).findFirst().get(); - xml.writeCharacters(property); - xml.writeEndElement(); + switch (getWixType()) { + case Wix3 -> { + xml.writeStartElement("Condition"); + xml.writeCharacters(property); + xml.writeEndElement(); + } + case Wix4 -> { + xml.writeAttribute("Condition", property); + } + default -> { + throw new IllegalArgumentException(); + } + } } boolean isRegistryKeyPath = !systemWide || role.isRegistryKeyPath(); @@ -442,7 +475,7 @@ private void addFaComponentGroup(XMLStreamWriter xml) private void addShortcutComponentGroup(XMLStreamWriter xml) throws XMLStreamException, IOException { List<String> componentIds = new ArrayList<>(); - Set<ShortcutsFolder> defineShortcutFolders = new HashSet<>(); + Set<Path> defineShortcutFolders = new HashSet<>(); for (var launcher : launchers) { for (var folder : shortcutFolders) { Path launcherPath = addExeSuffixToPath(installedAppImage @@ -457,16 +490,27 @@ private void addShortcutComponentGroup(XMLStreamWriter xml) throws folder); if (componentId != null) { - defineShortcutFolders.add(folder); + Path folderPath = folder.getPath(this); + boolean defineFolder; + switch (getWixType()) { + case Wix3 -> + defineFolder = true; + case Wix4 -> + defineFolder = !SYSTEM_DIRS.contains(folderPath); + default -> + throw new IllegalArgumentException(); + } + if (defineFolder) { + defineShortcutFolders.add(folderPath); + } componentIds.add(componentId); } } } } - for (var folder : defineShortcutFolders) { - Path path = folder.getPath(this); - componentIds.addAll(addRootBranch(xml, path)); + for (var folderPath : defineShortcutFolders) { + componentIds.addAll(addRootBranch(xml, folderPath)); } addComponentGroup(xml, "Shortcuts", componentIds); @@ -546,13 +590,18 @@ private List<String> addRootBranch(XMLStreamWriter xml, Path path) throw throwInvalidPathException(path); } - Function<Path, String> createDirectoryName = dir -> null; - boolean sysDir = true; - int levels = 1; + int levels; var dirIt = path.iterator(); - xml.writeStartElement("DirectoryRef"); - xml.writeAttribute("Id", dirIt.next().toString()); + + if (getWixType() != WixToolsetType.Wix3 && TARGETDIR.equals(path.getName(0))) { + levels = 0; + dirIt.next(); + } else { + levels = 1; + xml.writeStartElement("DirectoryRef"); + xml.writeAttribute("Id", dirIt.next().toString()); + } path = path.getName(0); while (dirIt.hasNext()) { @@ -562,21 +611,11 @@ private List<String> addRootBranch(XMLStreamWriter xml, Path path) if (sysDir && !SYSTEM_DIRS.contains(path)) { sysDir = false; - createDirectoryName = dir -> dir.getFileName().toString(); } - final String directoryId; - if (!sysDir && path.equals(installDir)) { - directoryId = INSTALLDIR.toString(); - } else { - directoryId = Id.Folder.of(path); - } - xml.writeStartElement("Directory"); - xml.writeAttribute("Id", directoryId); - - String directoryName = createDirectoryName.apply(path); - if (directoryName != null) { - xml.writeAttribute("Name", directoryName); + startDirectoryElement(xml, "Directory", path); + if (!sysDir) { + xml.writeAttribute("Name", path.getFileName().toString()); } } @@ -584,9 +623,37 @@ private List<String> addRootBranch(XMLStreamWriter xml, Path path) xml.writeEndElement(); } - List<String> componentIds = new ArrayList<>(); + return List.of(); + } - return componentIds; + private void startDirectoryElement(XMLStreamWriter xml, String wix3ElementName, Path path) throws XMLStreamException { + final String elementName; + switch (getWixType()) { + case Wix3 -> { + elementName = wix3ElementName; + } + case Wix4 -> { + if (SYSTEM_DIRS.contains(path)) { + elementName = "StandardDirectory"; + } else { + elementName = wix3ElementName; + } + } + default -> { + throw new IllegalArgumentException(); + } + + } + + final String directoryId; + if (path.equals(installDir)) { + directoryId = INSTALLDIR.toString(); + } else { + directoryId = Id.Folder.of(path); + } + + xml.writeStartElement(elementName); + xml.writeAttribute("Id", directoryId); } private String addRemoveDirectoryComponent(XMLStreamWriter xml, Path path) @@ -785,7 +852,7 @@ private void addRegistryKeyPath(XMLStreamWriter xml, Path path, xml.writeStartElement("RegistryKey"); xml.writeAttribute("Root", regRoot); xml.writeAttribute("Key", registryKeyPath); - if (DottedVersion.compareComponents(getWixVersion(), DottedVersion.lazy("3.6")) < 0) { + if (!isWithWix36Features()) { xml.writeAttribute("Action", "createAndRemoveOnUninstall"); } xml.writeStartElement("RegistryValue"); @@ -799,7 +866,7 @@ private void addRegistryKeyPath(XMLStreamWriter xml, Path path, private String addDirectoryCleaner(XMLStreamWriter xml, Path path) throws XMLStreamException, IOException { - if (DottedVersion.compareComponents(getWixVersion(), DottedVersion.lazy("3.6")) < 0) { + if (!isWithWix36Features()) { return null; } @@ -821,14 +888,13 @@ private String addDirectoryCleaner(XMLStreamWriter xml, Path path) throws xml.writeStartElement("DirectoryRef"); xml.writeAttribute("Id", INSTALLDIR.toString()); - Component.startElement(xml, componentId, "*"); + Component.startElement(getWixType(), xml, componentId, "*"); addRegistryKeyPath(xml, INSTALLDIR, () -> propertyId, () -> { return toWixPath(path); }); - xml.writeStartElement( - "http://schemas.microsoft.com/wix/UtilExtension", + xml.writeStartElement(getWixNamespaces().get(WixNamespace.Util), "RemoveFolderEx"); xml.writeAttribute("On", "uninstall"); xml.writeAttribute("Property", propertyId); @@ -839,6 +905,10 @@ private String addDirectoryCleaner(XMLStreamWriter xml, Path path) throws return componentId; } + private boolean isWithWix36Features() { + return DottedVersion.compareComponents(getWixVersion(), DottedVersion.greedy("3.6")) >= 0; + } + // Does the following conversions: // INSTALLDIR -> [INSTALLDIR] // TARGETDIR/ProgramFiles64Folder/foo/bar -> [ProgramFiles64Folder]foo/bar diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixFragmentBuilder.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixFragmentBuilder.java index bc98899c65985..0276cc96e6521 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixFragmentBuilder.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixFragmentBuilder.java @@ -29,31 +29,35 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.nio.file.Path; -import java.text.MessageFormat; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.xml.stream.XMLStreamWriter; import jdk.jpackage.internal.IOUtils.XmlConsumer; import jdk.jpackage.internal.OverridableResource.Source; -import static jdk.jpackage.internal.OverridableResource.createResource; import static jdk.jpackage.internal.StandardBundlerParam.CONFIG_ROOT; import jdk.internal.util.Architecture; +import static jdk.jpackage.internal.OverridableResource.createResource; +import jdk.jpackage.internal.WixSourceConverter.ResourceGroup; +import jdk.jpackage.internal.WixToolset.WixToolsetType; /** * Creates WiX fragment. */ abstract class WixFragmentBuilder { - void setWixVersion(DottedVersion v) { - wixVersion = v; + final void setWixVersion(DottedVersion version, WixToolsetType type) { + Objects.requireNonNull(version); + Objects.requireNonNull(type); + wixVersion = version; + wixType = type; } - void setOutputFileName(String v) { + final void setOutputFileName(String v) { outputFileName = v; } @@ -65,11 +69,8 @@ void initFromParams(Map<String, ? super Object> params) { Source.ResourceDir); } - void logWixFeatures() { - if (DottedVersion.compareComponents(wixVersion, DottedVersion.lazy("3.6")) >= 0) { - Log.verbose(MessageFormat.format(I18N.getString( - "message.use-wix36-features"), wixVersion)); - } + List<String> getLoggableWixFeatures() { + return List.of(); } void configureWixPipeline(WixPipeline wixPipeline) { @@ -91,52 +92,84 @@ void addFilesToConfigRoot() throws IOException { } if (additionalResources != null) { - for (var resource : additionalResources) { - resource.resource.saveToFile(configRoot.resolve( - resource.saveAsName)); - } + additionalResources.saveResources(); } } - DottedVersion getWixVersion() { + final WixToolsetType getWixType() { + return wixType; + } + + final DottedVersion getWixVersion() { return wixVersion; } + protected static enum WixNamespace { + Default, + Util; + } + + final protected Map<WixNamespace, String> getWixNamespaces() { + switch (wixType) { + case Wix3 -> { + return Map.of(WixNamespace.Default, + "http://schemas.microsoft.com/wix/2006/wi", + WixNamespace.Util, + "http://schemas.microsoft.com/wix/UtilExtension"); + } + case Wix4 -> { + return Map.of(WixNamespace.Default, + "http://wixtoolset.org/schemas/v4/wxs", + WixNamespace.Util, + "http://wixtoolset.org/schemas/v4/wxs/util"); + } + default -> { + throw new IllegalArgumentException(); + } + + } + } + static boolean is64Bit() { return Architecture.is64bit(); } - protected Path getConfigRoot() { + final protected Path getConfigRoot() { return configRoot; } protected abstract Collection<XmlConsumer> getFragmentWriters(); - protected void defineWixVariable(String variableName) { + final protected void defineWixVariable(String variableName) { setWixVariable(variableName, "yes"); } - protected void setWixVariable(String variableName, String variableValue) { + final protected void setWixVariable(String variableName, String variableValue) { if (wixVariables == null) { wixVariables = new WixVariables(); } wixVariables.setWixVariable(variableName, variableValue); } - protected void addResource(OverridableResource resource, String saveAsName) { + final protected void addResource(OverridableResource resource, String saveAsName) { if (additionalResources == null) { - additionalResources = new ArrayList<>(); + additionalResources = new ResourceGroup(getWixType()); } - additionalResources.add(new ResourceWithName(resource, saveAsName)); + additionalResources.addResource(resource, configRoot.resolve(saveAsName)); } - static void createWixSource(Path file, XmlConsumer xmlConsumer) - throws IOException { + private void createWixSource(Path file, XmlConsumer xmlConsumer) throws IOException { IOUtils.createXml(file, xml -> { xml.writeStartElement("Wix"); - xml.writeDefaultNamespace("http://schemas.microsoft.com/wix/2006/wi"); - xml.writeNamespace("util", - "http://schemas.microsoft.com/wix/UtilExtension"); + for (var ns : getWixNamespaces().entrySet()) { + switch (ns.getKey()) { + case Default -> + xml.writeDefaultNamespace(ns.getValue()); + default -> + xml.writeNamespace(ns.getKey().name().toLowerCase(), ns. + getValue()); + } + } xmlConsumer.accept((XMLStreamWriter) Proxy.newProxyInstance( XMLStreamWriter.class.getClassLoader(), new Class<?>[]{ @@ -146,16 +179,6 @@ static void createWixSource(Path file, XmlConsumer xmlConsumer) }); } - private static class ResourceWithName { - - ResourceWithName(OverridableResource resource, String saveAsName) { - this.resource = resource; - this.saveAsName = saveAsName; - } - private final OverridableResource resource; - private final String saveAsName; - } - private static class WixPreprocessorEscaper implements InvocationHandler { WixPreprocessorEscaper(XMLStreamWriter target) { @@ -208,9 +231,10 @@ private String escape(CharSequence str) { private final XMLStreamWriter target; } + private WixToolsetType wixType; private DottedVersion wixVersion; private WixVariables wixVariables; - private List<ResourceWithName> additionalResources; + private ResourceGroup additionalResources; private OverridableResource fragmentResource; private String outputFileName; private Path configRoot; diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java index 58a07b6cbafd8..835247ed1debb 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,18 +22,19 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ - package jdk.jpackage.internal; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.UnaryOperator; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -45,7 +46,7 @@ public class WixPipeline { lightOptions = new ArrayList<>(); } - WixPipeline setToolset(Map<WixTool, Path> v) { + WixPipeline setToolset(WixToolset v) { toolset = v; return this; } @@ -79,13 +80,92 @@ WixPipeline addLightOptions(String ... v) { } void buildMsi(Path msi) throws IOException { + Objects.requireNonNull(workDir); + + switch (toolset.getType()) { + case Wix3 -> buildMsiWix3(msi); + case Wix4 -> buildMsiWix4(msi); + default -> throw new IllegalArgumentException(); + } + } + + private void addWixVariblesToCommandLine( + Map<String, String> otherWixVariables, List<String> cmdline) { + Stream.of(wixVariables, Optional.ofNullable(otherWixVariables). + orElseGet(Collections::emptyMap)).filter(Objects::nonNull). + reduce((a, b) -> { + a.putAll(b); + return a; + }).ifPresent(wixVars -> { + var entryStream = wixVars.entrySet().stream(); + + Stream<String> stream; + switch (toolset.getType()) { + case Wix3 -> { + stream = entryStream.map(wixVar -> { + return String.format("-d%s=%s", wixVar.getKey(), wixVar. + getValue()); + }); + } + case Wix4 -> { + stream = entryStream.map(wixVar -> { + return Stream.of("-d", String.format("%s=%s", wixVar. + getKey(), wixVar.getValue())); + }).flatMap(Function.identity()); + } + default -> { + throw new IllegalArgumentException(); + } + } + + stream.reduce(cmdline, (ctnr, wixVar) -> { + ctnr.add(wixVar); + return ctnr; + }, (x, y) -> { + x.addAll(y); + return x; + }); + }); + } + + private void buildMsiWix4(Path msi) throws IOException { + var mergedSrcWixVars = sources.stream().map(wixSource -> { + return Optional.ofNullable(wixSource.variables).orElseGet( + Collections::emptyMap).entrySet().stream(); + }).flatMap(Function.identity()).collect(Collectors.toMap( + Map.Entry::getKey, Map.Entry::getValue)); + + List<String> cmdline = new ArrayList<>(List.of( + toolset.getToolPath(WixTool.Wix4).toString(), + "build", + "-nologo", + "-pdbtype", "none", + "-intermediatefolder", wixObjDir.toAbsolutePath().toString(), + "-ext", "WixToolset.Util.wixext", + "-arch", WixFragmentBuilder.is64Bit() ? "x64" : "x86" + )); + + cmdline.addAll(lightOptions); + + addWixVariblesToCommandLine(mergedSrcWixVars, cmdline); + + cmdline.addAll(sources.stream().map(wixSource -> { + return wixSource.source.toAbsolutePath().toString(); + }).toList()); + + cmdline.addAll(List.of("-out", msi.toString())); + + execute(cmdline); + } + + private void buildMsiWix3(Path msi) throws IOException { List<Path> wixObjs = new ArrayList<>(); for (var source : sources) { - wixObjs.add(compile(source)); + wixObjs.add(compileWix3(source)); } List<String> lightCmdline = new ArrayList<>(List.of( - toolset.get(WixTool.Light).toString(), + toolset.getToolPath(WixTool.Light3).toString(), "-nologo", "-spdb", "-ext", "WixUtilExtension", @@ -99,31 +179,20 @@ void buildMsi(Path msi) throws IOException { execute(lightCmdline); } - private Path compile(WixSource wixSource) throws IOException { - UnaryOperator<Path> adjustPath = path -> { - return workDir != null ? path.toAbsolutePath() : path; - }; - - Path wixObj = adjustPath.apply(wixObjDir).resolve(IOUtils.replaceSuffix( + private Path compileWix3(WixSource wixSource) throws IOException { + Path wixObj = wixObjDir.toAbsolutePath().resolve(IOUtils.replaceSuffix( IOUtils.getFileName(wixSource.source), ".wixobj")); List<String> cmdline = new ArrayList<>(List.of( - toolset.get(WixTool.Candle).toString(), + toolset.getToolPath(WixTool.Candle3).toString(), "-nologo", - adjustPath.apply(wixSource.source).toString(), + wixSource.source.toAbsolutePath().toString(), "-ext", "WixUtilExtension", "-arch", WixFragmentBuilder.is64Bit() ? "x64" : "x86", "-out", wixObj.toAbsolutePath().toString() )); - Map<String, String> appliedVaribales = new HashMap<>(); - Stream.of(wixVariables, wixSource.variables) - .filter(Objects::nonNull) - .forEachOrdered(appliedVaribales::putAll); - - appliedVaribales.entrySet().stream().map(wixVar -> String.format("-d%s=%s", - wixVar.getKey(), wixVar.getValue())).forEachOrdered( - cmdline::add); + addWixVariblesToCommandLine(wixSource.variables, cmdline); execute(cmdline); @@ -131,8 +200,8 @@ private Path compile(WixSource wixSource) throws IOException { } private void execute(List<String> cmdline) throws IOException { - Executor.of(new ProcessBuilder(cmdline).directory( - workDir != null ? workDir.toFile() : null)).executeExpectSuccess(); + Executor.of(new ProcessBuilder(cmdline).directory(workDir.toFile())). + executeExpectSuccess(); } private static final class WixSource { @@ -140,7 +209,7 @@ private static final class WixSource { Map<String, String> variables; } - private Map<WixTool, Path> toolset; + private WixToolset toolset; private Map<String, String> wixVariables; private List<String> lightOptions; private Path wixObjDir; diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java new file mode 100644 index 0000000000000..7786d64a78693 --- /dev/null +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java @@ -0,0 +1,420 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.jpackage.internal; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.AbstractMap; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import javax.xml.XMLConstants; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stax.StAXResult; +import javax.xml.transform.stream.StreamSource; +import jdk.jpackage.internal.WixToolset.WixToolsetType; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +/** + * Converts WiX v3 source file into WiX v4 format. + */ +final class WixSourceConverter { + + enum Status { + SavedAsIs, + SavedAsIsMalfromedXml, + Transformed, + } + + WixSourceConverter(Path resourceDir) throws IOException { + var buf = new ByteArrayOutputStream(); + + new OverridableResource("wix3-to-wix4-conv.xsl") + .setPublicName("wix-conv.xsl") + .setResourceDir(resourceDir) + .setCategory(I18N.getString("resource.wix-src-conv")) + .saveToStream(buf); + + var xslt = new StreamSource(new ByteArrayInputStream(buf.toByteArray())); + + var tf = TransformerFactory.newInstance(); + try { + this.transformer = tf.newTransformer(xslt); + } catch (TransformerException ex) { + // Should never happen + throw new RuntimeException(ex); + } + + this.outputFactory = XMLOutputFactory.newInstance(); + } + + Status appyTo(OverridableResource resource, Path resourceSaveAsFile) throws IOException { + // Save the resource into DOM tree and read xml namespaces from it. + // If some namespaces are not recognized by this converter, save the resource as is. + // If all detected namespaces are recognized, run transformation of the DOM tree and save + // output into destination file. + + var buf = saveResourceInMemory(resource); + + Document inputXmlDom; + try { + inputXmlDom = IOUtils.initDocumentBuilder().parse(new ByteArrayInputStream(buf)); + } catch (SAXException ex) { + // Malformed XML, don't run converter, save as is. + resource.saveToFile(resourceSaveAsFile); + return Status.SavedAsIsMalfromedXml; + } + + try { + var nc = new NamespaceCollector(); + TransformerFactory.newInstance().newTransformer(). + transform(new DOMSource(inputXmlDom), new StAXResult((XMLStreamWriter) Proxy. + newProxyInstance(XMLStreamWriter.class.getClassLoader(), + new Class<?>[]{XMLStreamWriter.class}, nc))); + if (!nc.isOnlyKnownNamespacesUsed()) { + // Unsupported namespaces detected in input XML, don't run converter, save as is. + resource.saveToFile(resourceSaveAsFile); + return Status.SavedAsIs; + } + } catch (TransformerException ex) { + // Should never happen + throw new RuntimeException(ex); + } + + Supplier<Source> inputXml = () -> { + // Should be "new DOMSource(inputXmlDom)", but no transfromation is applied in this case! + return new StreamSource(new ByteArrayInputStream(buf)); + }; + + var nc = new NamespaceCollector(); + try { + // Run transfomation to collect namespaces from the output XML. + transformer.transform(inputXml.get(), new StAXResult((XMLStreamWriter) Proxy. + newProxyInstance(XMLStreamWriter.class.getClassLoader(), + new Class<?>[]{XMLStreamWriter.class}, nc))); + } catch (TransformerException ex) { + // Should never happen + throw new RuntimeException(ex); + } + + try (var outXml = new ByteArrayOutputStream()) { + transformer.transform(inputXml.get(), new StAXResult((XMLStreamWriter) Proxy. + newProxyInstance(XMLStreamWriter.class.getClassLoader(), + new Class<?>[]{XMLStreamWriter.class}, new NamespaceCleaner(nc. + getPrefixToUri(), outputFactory.createXMLStreamWriter(outXml))))); + Files.createDirectories(IOUtils.getParent(resourceSaveAsFile)); + Files.copy(new ByteArrayInputStream(outXml.toByteArray()), resourceSaveAsFile, + StandardCopyOption.REPLACE_EXISTING); + } catch (TransformerException | XMLStreamException ex) { + // Should never happen + throw new RuntimeException(ex); + } + + return Status.Transformed; + } + + private static byte[] saveResourceInMemory(OverridableResource resource) throws IOException { + var buf = new ByteArrayOutputStream(); + resource.saveToStream(buf); + return buf.toByteArray(); + } + + final static class ResourceGroup { + + ResourceGroup(WixToolsetType wixToolsetType) { + this.wixToolsetType = wixToolsetType; + } + + void addResource(OverridableResource resource, Path resourceSaveAsFile) { + resources.put(resourceSaveAsFile, resource); + } + + void saveResources() throws IOException { + switch (wixToolsetType) { + case Wix3 -> { + for (var e : resources.entrySet()) { + e.getValue().saveToFile(e.getKey()); + } + } + case Wix4 -> { + var resourceDir = resources.values().stream().filter(res -> { + return null != res.getResourceDir(); + }).findAny().map(OverridableResource::getResourceDir).orElse(null); + var conv = new WixSourceConverter(resourceDir); + for (var e : resources.entrySet()) { + conv.appyTo(e.getValue(), e.getKey()); + } + } + default -> { + throw new IllegalArgumentException(); + } + } + } + + private final Map<Path, OverridableResource> resources = new HashMap<>(); + private final WixToolsetType wixToolsetType; + } + + // + // Default JDK XSLT v1.0 processor is not handling well default namespace mappings. + // Running generic template: + // + // <xsl:template match="wix3loc:*"> + // <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxl"> + // <xsl:apply-templates select="@*|node()"/> + // </xsl:element> + // </xsl:template> + // + // produces: + // + // <ns0:WixLocalization xmlns:ns0="http://wixtoolset.org/schemas/v4/wxl" Culture="en-us" Codepage="1252"> + // <ns1:String xmlns:ns1="http://wixtoolset.org/schemas/v4/wxl" Value="The folder [INSTALLDIR] already exist. Would you like to install to that folder anyway?" Id="message.install.dir.exist"/> + // <ns2:String xmlns:ns2="http://wixtoolset.org/schemas/v4/wxl" Value="Main Feature" Id="MainFeatureTitle"/> + // ... + // <ns12:String xmlns:ns12="http://wixtoolset.org/schemas/v4/wxl" Value="Open with [ProductName]" Id="ContextMenuCommandLabel"/> + // </ns0:WixLocalization> + // + // which is conformant XML but WiX4 doesn't like it: + // + // wix.exe : error WIX0202: The {http://wixtoolset.org/schemas/v4/wxl}String element contains an unsupported extension attribute '{http://www.w3.org/2000/xmlns/}ns1'. The {http://wixtoolset.org/schemas/v4/wxl}String element does not currently support extension attributes. Is the {http://www.w3.org/2000/xmlns/}ns1 attribute using the correct XML namespace? + // wix.exe : error WIX0202: The {http://wixtoolset.org/schemas/v4/wxl}String element contains an unsupported extension attribute '{http://www.w3.org/2000/xmlns/}ns2'. The {http://wixtoolset.org/schemas/v4/wxl}String element does not currently support extension attributes. Is the {http://www.w3.org/2000/xmlns/}ns2 attribute using the correct XML namespace? + // wix.exe : error WIX0202: The {http://wixtoolset.org/schemas/v4/wxl}String element contains an unsupported extension attribute '{http://www.w3.org/2000/xmlns/}ns3'. The {http://wixtoolset.org/schemas/v4/wxl}String element does not currently support extension attributes. Is the {http://www.w3.org/2000/xmlns/}ns3 attribute using the correct XML namespace? + // + // Someone hit this issue long ago - https://stackoverflow.com/questions/26904623/replace-default-namespace-using-xsl and they suggested to use different XSLT processor. + // Two online XSLT processors used in testing produce clean XML with this template indeed: + // + // <WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Codepage="1252" Culture="en-us"> + // <String Value="The folder [INSTALLDIR] already exist. Would you like to install to that folder anyway?" Id="message.install.dir.exist"/> + // <String Value="Main Feature" Id="MainFeatureTitle"/> + // ... + // <String Value="Open with [ProductName]" Id="ContextMenuCommandLabel"/> + // </WixLocalization> + // + // To workaround default JDK's XSLT processor limitations we do additionl postprocessing of output XML with NamespaceCleaner class. + // + private static class NamespaceCleaner implements InvocationHandler { + + NamespaceCleaner(Map<String, String> prefixToUri, XMLStreamWriter target) { + this.uriToPrefix = prefixToUri.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getValue, e -> { + return new Prefix(e.getKey()); + }, (x, y) -> x)); + this.prefixToUri = prefixToUri; + this.target = target; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + switch (method.getName()) { + case "writeNamespace" -> { + final String uri = (String) args[1]; + var prefixObj = uriToPrefix.get(uri); + if (!prefixObj.written) { + prefixObj.written = true; + target.writeNamespace(prefixObj.name, uri); + } + return null; + } + case "writeStartElement", "writeEmptyElement" -> { + final String name; + switch (args.length) { + case 1 -> + name = (String) args[0]; + case 2, 3 -> + name = (String) args[1]; + default -> + throw new IllegalArgumentException(); + } + + final String prefix; + final String localName; + final String[] tokens = name.split(":", 2); + if (tokens.length == 2) { + prefix = tokens[0]; + localName = tokens[1]; + } else { + localName = name; + switch (args.length) { + case 3 -> + prefix = (String) args[0]; + case 2 -> + prefix = uriToPrefix.get((String) args[0]).name; + default -> + prefix = null; + } + } + + if (prefix != null && !XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) { + final String uri = prefixToUri.get(prefix); + var prefixObj = uriToPrefix.get(uri); + if (prefixObj.written) { + var writeName = String.join(":", prefixObj.name, localName); + if ("writeStartElement".equals(method.getName())) { + target.writeStartElement(writeName); + } else { + target.writeEmptyElement(writeName); + } + return null; + } else { + prefixObj.written = (args.length > 1); + args = Arrays.copyOf(args, args.length, Object[].class); + if (localName.equals(name)) { + // No prefix in the name + if (args.length == 3) { + args[0] = prefixObj.name; + } + } else { + var writeName = String.join(":", prefixObj.name, localName); + switch (args.length) { + case 1 -> + args[0] = writeName; + case 2 -> { + args[0] = uri; + args[1] = writeName; + } + case 3 -> { + args[0] = prefixObj.name; + args[1] = writeName; + args[2] = uri; + } + } + } + } + } + } + } + + return method.invoke(target, args); + } + + static class Prefix { + + Prefix(String name) { + this.name = name; + } + + private final String name; + private boolean written; + } + + private final Map<String, Prefix> uriToPrefix; + private final Map<String, String> prefixToUri; + private final XMLStreamWriter target; + } + + private static class NamespaceCollector implements InvocationHandler { + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + switch (method.getName()) { + case "setPrefix", "writeNamespace" -> { + var prefix = (String) args[0]; + var namespace = prefixToUri.computeIfAbsent(prefix, k -> createValue(args[1])); + if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) { + namespace.setValue(true); + } + } + case "writeStartElement", "writeEmptyElement" -> { + switch (args.length) { + case 3 -> + prefixToUri.computeIfAbsent((String) args[0], k -> createValue( + (String) args[2])).setValue(true); + case 2 -> + initFromElementName((String) args[1], (String) args[0]); + case 1 -> + initFromElementName((String) args[0], null); + } + } + } + return null; + } + + boolean isOnlyKnownNamespacesUsed() { + return prefixToUri.values().stream().filter(namespace -> { + return namespace.getValue(); + }).allMatch(namespace -> { + if (!namespace.getValue()) { + return true; + } else { + return KNOWN_NAMESPACES.contains(namespace.getKey()); + } + }); + } + + Map<String, String> getPrefixToUri() { + return prefixToUri.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, + e -> { + return e.getValue().getKey(); + })); + } + + private void initFromElementName(String name, String namespace) { + final String[] tokens = name.split(":", 2); + if (tokens.length == 2) { + if (namespace != null) { + prefixToUri.computeIfAbsent(tokens[0], k -> createValue(namespace)).setValue( + true); + } else { + prefixToUri.computeIfPresent(tokens[0], (k, v) -> { + v.setValue(true); + return v; + }); + } + } + } + + private Map.Entry<String, Boolean> createValue(Object prefix) { + return new AbstractMap.SimpleEntry<String, Boolean>((String) prefix, false); + } + + private final Map<String, Map.Entry<String, Boolean>> prefixToUri = new HashMap<>(); + } + + private final Transformer transformer; + private final XMLOutputFactory outputFactory; + + // The list of WiX v3 namespaces this converter can handle + private final static Set<String> KNOWN_NAMESPACES = Set.of( + "http://schemas.microsoft.com/wix/2006/localization", + "http://schemas.microsoft.com/wix/2006/wi"); +} diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java index 68104444b3c11..f16b28edf2448 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,6 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ - package jdk.jpackage.internal; import java.io.IOException; @@ -32,105 +31,198 @@ import java.nio.file.Path; import java.nio.file.PathMatcher; import java.text.MessageFormat; -import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; -import java.util.function.Supplier; +import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import jdk.jpackage.internal.WixToolset.WixToolsetType; /** * WiX tool. */ public enum WixTool { - Candle, Light; + Candle3("candle", DottedVersion.lazy("3.0")), + Light3("light", DottedVersion.lazy("3.0")), + Wix4("wix", DottedVersion.lazy("4.0.4")); + + WixTool(String commandName, DottedVersion minimalVersion) { + this.toolFileName = IOUtils.addSuffix(Path.of(commandName), ".exe"); + this.minimalVersion = minimalVersion; + } static final class ToolInfo { + ToolInfo(Path path, String version) { this.path = path; - this.version = new DottedVersion(version); + this.version = DottedVersion.lazy(version); } final Path path; final DottedVersion version; } - static Map<WixTool, ToolInfo> toolset() throws ConfigException { - Map<WixTool, ToolInfo> toolset = new HashMap<>(); - for (var tool : values()) { - toolset.put(tool, tool.find()); - } - return toolset; - } + static WixToolset createToolset() throws ConfigException { + Function<List<ToolLookupResult>, Map<WixTool, ToolInfo>> conv = lookupResults -> { + return lookupResults.stream().filter(ToolLookupResult::isValid).collect(Collectors. + groupingBy(lookupResult -> { + return lookupResult.getInfo().version.toString(); + })).values().stream().filter(sameVersionLookupResults -> { + Set<WixTool> sameVersionTools = sameVersionLookupResults.stream().map( + ToolLookupResult::getTool).collect(Collectors.toSet()); + if (sameVersionTools.equals(Set.of(Candle3)) || sameVersionTools.equals(Set.of( + Light3))) { + // There is only one tool from WiX v3 toolset of some version available. Discard it. + return false; + } else { + return true; + } + }).flatMap(List::stream).collect(Collectors.toMap(ToolLookupResult::getTool, + ToolLookupResult::getInfo, (ToolInfo x, ToolInfo y) -> { + return Stream.of(x, y).sorted(Comparator.comparing((ToolInfo toolInfo) -> { + return toolInfo.version.toComponentsString(); + }).reversed()).findFirst().get(); + })); + }; - ToolInfo find() throws ConfigException { - final Path toolFileName = IOUtils.addSuffix( - Path.of(name().toLowerCase()), ".exe"); + Function<List<ToolLookupResult>, Optional<WixToolset>> createToolset = lookupResults -> { + var tools = conv.apply(lookupResults); + // Try to build a toolset found in the PATH and in known locations. + return Stream.of(WixToolsetType.values()).map(toolsetType -> { + return WixToolset.create(toolsetType.getTools(), tools); + }).filter(Objects::nonNull).findFirst(); + }; - String[] version = new String[1]; - ConfigException reason = createToolValidator(toolFileName, version).get(); - if (version[0] != null) { - if (reason == null) { - // Found in PATH. - return new ToolInfo(toolFileName, version[0]); - } + var toolsInPath = Stream.of(values()).map(tool -> { + return new ToolLookupResult(tool, null); + }).toList(); - // Found in PATH, but something went wrong. - throw reason; + // Try to build a toolset from tools in the PATH first. + var toolset = createToolset.apply(toolsInPath); + if (toolset.isPresent()) { + return toolset.get(); } - for (var dir : findWixInstallDirs()) { - Path path = dir.resolve(toolFileName); - if (Files.exists(path)) { - reason = createToolValidator(path, version).get(); - if (reason != null) { - throw reason; + // Look up for WiX tools in known locations. + var toolsInKnownWiXDirs = findWixInstallDirs().stream().map(dir -> { + return Stream.of(values()).map(tool -> { + return new ToolLookupResult(tool, dir); + }); + }).flatMap(Function.identity()).toList(); + + // Build a toolset found in the PATH and in known locations. + var allFoundTools = Stream.of(toolsInPath, toolsInKnownWiXDirs).flatMap(List::stream).filter( + ToolLookupResult::isValid).toList(); + toolset = createToolset.apply(allFoundTools); + if (toolset.isPresent()) { + return toolset.get(); + } else if (allFoundTools.isEmpty()) { + throw new ConfigException(I18N.getString("error.no-wix-tools"), I18N.getString( + "error.no-wix-tools.advice")); + } else { + var toolOldVerErr = allFoundTools.stream().map(lookupResult -> { + if (lookupResult.versionTooOld) { + return new ConfigException(MessageFormat.format(I18N.getString( + "message.wrong-tool-version"), lookupResult.getInfo().path, + lookupResult.getInfo().version, lookupResult.getTool().minimalVersion), + I18N.getString("error.no-wix-tools.advice")); + } else { + return null; } - return new ToolInfo(path, version[0]); + }).filter(Objects::nonNull).findAny(); + if (toolOldVerErr.isPresent()) { + throw toolOldVerErr.get(); + } else { + throw new ConfigException(I18N.getString("error.no-wix-tools"), I18N.getString( + "error.no-wix-tools.advice")); } } - - throw reason; } - private static Supplier<ConfigException> createToolValidator(Path toolPath, - String[] versionCtnr) { - return new ToolValidator(toolPath) - .setCommandLine("/?") - .setMinimalVersion(MINIMAL_VERSION) - .setToolNotFoundErrorHandler( - (name, ex) -> new ConfigException( - I18N.getString("error.no-wix-tools"), - I18N.getString("error.no-wix-tools.advice"))) - .setToolOldVersionErrorHandler( - (name, version) -> new ConfigException( - MessageFormat.format(I18N.getString( - "message.wrong-tool-version"), name, - version, MINIMAL_VERSION), - I18N.getString("error.no-wix-tools.advice"))) - .setVersionParser(output -> { - versionCtnr[0] = ""; + private static class ToolLookupResult { + + ToolLookupResult(WixTool tool, Path lookupDir) { + + final Path toolPath = Optional.ofNullable(lookupDir).map(p -> p.resolve( + tool.toolFileName)).orElse(tool.toolFileName); + + final boolean[] tooOld = new boolean[1]; + final String[] parsedVersion = new String[1]; + + final var validator = new ToolValidator(toolPath).setMinimalVersion(tool.minimalVersion). + setToolNotFoundErrorHandler((name, ex) -> { + return new ConfigException("", ""); + }).setToolOldVersionErrorHandler((name, version) -> { + tooOld[0] = true; + return null; + }); + + final Function<Stream<String>, String> versionParser; + + if (Set.of(Candle3, Light3).contains(tool)) { + validator.setCommandLine("/?"); + versionParser = output -> { String firstLineOfOutput = output.findFirst().orElse(""); int separatorIdx = firstLineOfOutput.lastIndexOf(' '); if (separatorIdx == -1) { return null; } - versionCtnr[0] = firstLineOfOutput.substring(separatorIdx + 1); - return versionCtnr[0]; - })::validate; - } + return firstLineOfOutput.substring(separatorIdx + 1); + }; + } else { + validator.setCommandLine("--version"); + versionParser = output -> { + return output.findFirst().orElse(""); + }; + } - private static final DottedVersion MINIMAL_VERSION = DottedVersion.lazy("3.0"); + validator.setVersionParser(output -> { + parsedVersion[0] = versionParser.apply(output); + return parsedVersion[0]; + }); - static Path getSystemDir(String envVar, String knownDir) { + this.tool = tool; + if (validator.validate() == null) { + // Tool found + this.versionTooOld = tooOld[0]; + this.info = new ToolInfo(toolPath, parsedVersion[0]); + } else { + this.versionTooOld = false; + this.info = null; + } + } + + WixTool getTool() { + return tool; + } + + ToolInfo getInfo() { + return info; + } + + boolean isValid() { + return info != null && !versionTooOld; + } + + boolean isVersionTooOld() { + return versionTooOld; + } + + private final WixTool tool; + private final ToolInfo info; + private final boolean versionTooOld; + } + + private static Path getSystemDir(String envVar, String knownDir) { return Optional .ofNullable(getEnvVariableAsPath(envVar)) .orElseGet(() -> Optional - .ofNullable(getEnvVariableAsPath("SystemDrive")) - .orElseGet(() -> Path.of("C:")).resolve(knownDir)); + .ofNullable(getEnvVariableAsPath("SystemDrive")) + .orElseGet(() -> Path.of("C:")).resolve(knownDir)); } private static Path getEnvVariableAsPath(String envVar) { @@ -147,8 +239,22 @@ private static Path getEnvVariableAsPath(String envVar) { } private static List<Path> findWixInstallDirs() { - PathMatcher wixInstallDirMatcher = FileSystems.getDefault().getPathMatcher( - "glob:WiX Toolset v*"); + return Stream.of(findWixCurrentInstallDirs(), findWix3InstallDirs()). + flatMap(List::stream).toList(); + } + + private static List<Path> findWixCurrentInstallDirs() { + return Stream.of(getEnvVariableAsPath("USERPROFILE"), Optional.ofNullable(System. + getProperty("user.home")).map(Path::of).orElse(null)).filter(Objects::nonNull).map( + path -> { + return path.resolve(".dotnet/tools"); + }).filter(Files::isDirectory).distinct().toList(); + } + + private static List<Path> findWix3InstallDirs() { + PathMatcher wixInstallDirMatcher = FileSystems.getDefault(). + getPathMatcher( + "glob:WiX Toolset v*"); Path programFiles = getSystemDir("ProgramFiles", "\\Program Files"); Path programFilesX86 = getSystemDir("ProgramFiles(x86)", @@ -157,18 +263,20 @@ private static List<Path> findWixInstallDirs() { // Returns list of WiX install directories ordered by WiX version number. // Newer versions go first. return Stream.of(programFiles, programFilesX86).map(path -> { - List<Path> result; try (var paths = Files.walk(path, 1)) { - result = paths.toList(); + return paths.toList(); } catch (IOException ex) { Log.verbose(ex); - result = Collections.emptyList(); + List<Path> empty = List.of(); + return empty; } - return result; }).flatMap(List::stream) - .filter(path -> wixInstallDirMatcher.matches(path.getFileName())) - .sorted(Comparator.comparing(Path::getFileName).reversed()) - .map(path -> path.resolve("bin")) - .toList(); + .filter(path -> wixInstallDirMatcher.matches(path.getFileName())). + sorted(Comparator.comparing(Path::getFileName).reversed()) + .map(path -> path.resolve("bin")) + .toList(); } + + private final Path toolFileName; + private final DottedVersion minimalVersion; } diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixToolset.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixToolset.java new file mode 100644 index 0000000000000..ab433616f44a6 --- /dev/null +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixToolset.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.jpackage.internal; + +import java.nio.file.Path; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +final class WixToolset { + + static enum WixToolsetType { + // Wix v4+ + Wix4(WixTool.Wix4), + // Wix v3+ + Wix3(WixTool.Candle3, WixTool.Light3); + + WixToolsetType(WixTool... tools) { + this.tools = Set.of(tools); + } + + Set<WixTool> getTools() { + return tools; + } + + private final Set<WixTool> tools; + } + + private WixToolset(Map<WixTool, WixTool.ToolInfo> tools) { + this.tools = tools; + } + + WixToolsetType getType() { + return Stream.of(WixToolsetType.values()).filter(toolsetType -> { + return toolsetType.getTools().equals(tools.keySet()); + }).findAny().get(); + } + + Path getToolPath(WixTool tool) { + return tools.get(tool).path; + } + + DottedVersion getVersion() { + return tools.values().iterator().next().version; + } + + static WixToolset create(Set<WixTool> requiredTools, Map<WixTool, WixTool.ToolInfo> allTools) { + var filteredTools = allTools.entrySet().stream().filter(e -> { + return requiredTools.contains(e.getKey()); + }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + if (filteredTools.keySet().equals(requiredTools)) { + return new WixToolset(filteredTools); + } else { + return null; + } + } + + private final Map<WixTool, WixTool.ToolInfo> tools; +} diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixUiFragmentBuilder.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixUiFragmentBuilder.java index 8d20d6432bf3a..4f39a65e3b6ad 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixUiFragmentBuilder.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixUiFragmentBuilder.java @@ -43,6 +43,7 @@ import static jdk.jpackage.internal.OverridableResource.createResource; import static jdk.jpackage.internal.StandardBundlerParam.LICENSE_FILE; import jdk.jpackage.internal.WixAppImageFragmentBuilder.ShortcutsFolder; +import jdk.jpackage.internal.WixToolset.WixToolsetType; /** * Creates UI WiX fragment. @@ -100,7 +101,13 @@ void configureWixPipeline(WixPipeline wixPipeline) { super.configureWixPipeline(wixPipeline); if (withShortcutPromptDlg || withInstallDirChooserDlg || withLicenseDlg) { - wixPipeline.addLightOptions("-ext", "WixUIExtension"); + final String extName; + switch (getWixType()) { + case Wix3 -> extName = "WixUIExtension"; + case Wix4 -> extName = "WixToolset.UI.wixext"; + default -> throw new IllegalArgumentException(); + } + wixPipeline.addLightOptions("-ext", extName); } // Only needed if we using CA dll, so Wix can find it @@ -148,15 +155,14 @@ private void addUI(XMLStreamWriter xml) throws XMLStreamException, xml.writeEndElement(); // WixVariable } - xml.writeStartElement("UI"); - xml.writeAttribute("Id", "JpUI"); - var ui = getUI(); if (ui != null) { - ui.write(this, xml); + ui.write(getWixType(), this, xml); + } else { + xml.writeStartElement("UI"); + xml.writeAttribute("Id", "JpUI"); + xml.writeEndElement(); } - - xml.writeEndElement(); // UI } private UI getUI() { @@ -187,12 +193,43 @@ private enum UI { this.dialogPairsSupplier = dialogPairsSupplier; } - void write(WixUiFragmentBuilder outer, XMLStreamWriter xml) throws - XMLStreamException, IOException { - xml.writeStartElement("UIRef"); - xml.writeAttribute("Id", wixUIRef); - xml.writeEndElement(); // UIRef + void write(WixToolsetType wixType, WixUiFragmentBuilder outer, XMLStreamWriter xml) throws XMLStreamException, IOException { + switch (wixType) { + case Wix3 -> {} + case Wix4 -> { + // https://wixtoolset.org/docs/fourthree/faqs/#converting-custom-wixui-dialog-sets + xml.writeProcessingInstruction("foreach WIXUIARCH in X86;X64;A64"); + writeWix4UIRef(xml, wixUIRef, "JpUIInternal_$(WIXUIARCH)"); + xml.writeProcessingInstruction("endforeach"); + writeWix4UIRef(xml, "JpUIInternal", "JpUI"); + } + default -> { + throw new IllegalArgumentException(); + } + } + + xml.writeStartElement("UI"); + switch (wixType) { + case Wix3 -> { + xml.writeAttribute("Id", "JpUI"); + xml.writeStartElement("UIRef"); + xml.writeAttribute("Id", wixUIRef); + xml.writeEndElement(); // UIRef + } + case Wix4 -> { + xml.writeAttribute("Id", "JpUIInternal"); + } + default -> { + throw new IllegalArgumentException(); + } + } + writeContents(wixType, outer, xml); + xml.writeEndElement(); // UI + } + + private void writeContents(WixToolsetType wixType, WixUiFragmentBuilder outer, + XMLStreamWriter xml) throws XMLStreamException, IOException { if (dialogIdsSupplier != null) { List<Dialog> dialogIds = dialogIdsSupplier.apply(outer); Map<DialogPair, List<Publish>> dialogPairs = dialogPairsSupplier.get(); @@ -210,7 +247,7 @@ void write(WixUiFragmentBuilder outer, XMLStreamWriter xml) throws DialogPair pair = new DialogPair(firstId, secondId); for (var curPair : List.of(pair, pair.flip())) { for (var publish : dialogPairs.get(curPair)) { - writePublishDialogPair(xml, publish, curPair); + writePublishDialogPair(wixType, xml, publish, curPair); } } firstId = secondId; @@ -218,6 +255,17 @@ void write(WixUiFragmentBuilder outer, XMLStreamWriter xml) throws } } + private static void writeWix4UIRef(XMLStreamWriter xml, String uiRef, String id) throws XMLStreamException, IOException { + // https://wixtoolset.org/docs/fourthree/faqs/#referencing-the-standard-wixui-dialog-sets + xml.writeStartElement("UI"); + xml.writeAttribute("Id", id); + xml.writeStartElement("ui:WixUI"); + xml.writeAttribute("Id", uiRef); + xml.writeNamespace("ui", "http://wixtoolset.org/schemas/v4/wxs/ui"); + xml.writeEndElement(); // UIRef + xml.writeEndElement(); // UI + } + private final String wixUIRef; private final Function<WixUiFragmentBuilder, List<Dialog>> dialogIdsSupplier; private final Supplier<Map<DialogPair, List<Publish>>> dialogPairsSupplier; @@ -441,9 +489,8 @@ private static PublishBuilder buildPublish(Publish publish) { return new PublishBuilder(publish); } - private static void writePublishDialogPair(XMLStreamWriter xml, - Publish publish, DialogPair dialogPair) throws IOException, - XMLStreamException { + private static void writePublishDialogPair(WixToolsetType wixType, XMLStreamWriter xml, + Publish publish, DialogPair dialogPair) throws IOException, XMLStreamException { xml.writeStartElement("Publish"); xml.writeAttribute("Dialog", dialogPair.firstId); xml.writeAttribute("Control", publish.control); @@ -452,7 +499,11 @@ private static void writePublishDialogPair(XMLStreamWriter xml, if (publish.order != 0) { xml.writeAttribute("Order", String.valueOf(publish.order)); } - xml.writeCharacters(publish.condition); + switch (wixType) { + case Wix3 -> xml.writeCharacters(publish.condition); + case Wix4 -> xml.writeAttribute("Condition", publish.condition); + default -> throw new IllegalArgumentException(); + } xml.writeEndElement(); } @@ -463,9 +514,8 @@ private final class CustomDialog { this.wxsFileName = wxsFileName; this.wixVariables = new WixVariables(); - addResource( - createResource(wxsFileName, params).setCategory(category), - wxsFileName); + addResource(createResource(wxsFileName, params).setCategory(category).setPublicName( + wxsFileName), wxsFileName); } void addToWixPipeline(WixPipeline wixPipeline) { diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/InstallDirNotEmptyDlg.wxs b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/InstallDirNotEmptyDlg.wxs index 936984b1fff92..755b2a0aab9e2 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/InstallDirNotEmptyDlg.wxs +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/InstallDirNotEmptyDlg.wxs @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <!-- /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,9 +41,7 @@ <Control Id="No" Type="PushButton" X="150" Y="55" Width="50" Height="15" Default="yes" Cancel="yes" Text="!(loc.WixUINo)"> <Publish Event="NewDialog" Value="InstallDirDlg">1</Publish> </Control> - <Control Id="Text" Type="Text" X="25" Y="15" Width="250" Height="30" TabSkip="no"> - <Text>!(loc.message.install.dir.exist)</Text> - </Control> + <Control Id="Text" Type="Text" X="25" Y="15" Width="250" Height="30" TabSkip="no" Text="!(loc.InstallDirNotEmptyDlgInstallDirExistMessage)"/> </Dialog> <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="JpCheckInstallDir" Order="3">1</Publish> diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_de.wxl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_de.wxl index 94c2696a6ca43..31be69aa5d0ae 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_de.wxl +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_de.wxl @@ -1,6 +1,5 @@ <?xml version = '1.0' encoding = 'utf-8'?> <WixLocalization Culture="de-de" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="1252"> - <String Id="message.install.dir.exist">Der Ordner [INSTALLDIR] ist bereits vorhanden. Möchten Sie diesen Ordner trotzdem installieren?</String> <String Id="MainFeatureTitle">Hauptfeature</String> <String Id="DowngradeErrorMessage">Eine höhere Version von [ProductName] ist bereits installiert. Downgrades sind deaktiviert. Setup wird jetzt beendet.</String> <String Id="DisallowUpgradeErrorMessage">Eine niedrigere Version von [ProductName] ist bereits installiert. Upgrades sind deaktiviert. Setup wird jetzt beendet.</String> @@ -11,6 +10,9 @@ <String Id="ShortcutPromptDlgDescription">Wählen Sie die zu erstellenden Verknüpfungen aus.</String> <String Id="ShortcutPromptDlgDesktopShortcutControlLabel">Desktopverknüpfung(en) erstellen</String> <String Id="ShortcutPromptDlgStartMenuShortcutControlLabel">Startmenüverknüpfung(en) erstellen</String> + <String Id="InstallDirNotEmptyDlg_Title">[ProductName]-Setup</String> + <String Id="InstallDirNotEmptyDlgInstallDirExistMessage">Der Ordner [INSTALLDIR] ist bereits vorhanden. Möchten Sie diesen Ordner trotzdem installieren?</String> + <String Id="ContextMenuCommandLabel">Mit [ProductName] öffnen</String> </WixLocalization> diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_en.wxl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_en.wxl index bc081fefe5b37..070e46621fb25 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_en.wxl +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_en.wxl @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="1252"> - <String Id="message.install.dir.exist">The folder [INSTALLDIR] already exist. Would you like to install to that folder anyway?</String> <String Id="MainFeatureTitle">Main Feature</String> <String Id="DowngradeErrorMessage">A higher version of [ProductName] is already installed. Downgrades disabled. Setup will now exit.</String> <String Id="DisallowUpgradeErrorMessage">A lower version of [ProductName] is already installed. Upgrades disabled. Setup will now exit.</String> @@ -11,6 +10,9 @@ <String Id="ShortcutPromptDlgDescription">Select shortcuts to create.</String> <String Id="ShortcutPromptDlgDesktopShortcutControlLabel">Create desktop shortcut(s)</String> <String Id="ShortcutPromptDlgStartMenuShortcutControlLabel">Create start menu shortcut(s)</String> + <String Id="InstallDirNotEmptyDlg_Title">[ProductName] Setup</String> + <String Id="InstallDirNotEmptyDlgInstallDirExistMessage">The folder [INSTALLDIR] already exist. Would you like to install to that folder anyway?</String> + <String Id="ContextMenuCommandLabel">Open with [ProductName]</String> </WixLocalization> diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_ja.wxl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_ja.wxl index 20ee895ae1920..32a57433829be 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_ja.wxl +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_ja.wxl @@ -1,6 +1,5 @@ <?xml version = '1.0' encoding = 'utf-8'?> <WixLocalization Culture="ja-jp" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="932"> - <String Id="message.install.dir.exist">フォルダ[INSTALLDIR]はすでに存在します。そのフォルダにインストールしますか?</String> <String Id="MainFeatureTitle">主な機能</String> <String Id="DowngradeErrorMessage">[ProductName]のより上位のバージョンがすでにインストールされています。ダウングレードは無効です。セットアップを終了します。</String> <String Id="DisallowUpgradeErrorMessage">[ProductName]のより下位のバージョンがすでにインストールされています。アップグレードは無効です。セットアップを終了します。</String> @@ -11,6 +10,9 @@ <String Id="ShortcutPromptDlgDescription">作成するショートカットを選択します。</String> <String Id="ShortcutPromptDlgDesktopShortcutControlLabel">デスクトップ・ショートカットの作成</String> <String Id="ShortcutPromptDlgStartMenuShortcutControlLabel">スタート・メニューのショートカットの作成</String> + <String Id="InstallDirNotEmptyDlg_Title">[ProductName]セットアップ</String> + <String Id="InstallDirNotEmptyDlgInstallDirExistMessage">フォルダ[INSTALLDIR]はすでに存在します。そのフォルダにインストールしますか?</String> + <String Id="ContextMenuCommandLabel">[ProductName]で開く</String> </WixLocalization> diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_zh_CN.wxl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_zh_CN.wxl index 138aa8565105a..978f74a1546b1 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_zh_CN.wxl +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_zh_CN.wxl @@ -1,6 +1,5 @@ <?xml version = '1.0' encoding = 'utf-8'?> <WixLocalization Culture="zh-cn" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="936"> - <String Id="message.install.dir.exist">文件夹 [INSTALLDIR] 已存在。是否仍要安装到该文件夹?</String> <String Id="MainFeatureTitle">主要功能</String> <String Id="DowngradeErrorMessage">已安装更高版本的 [ProductName]。降级已禁用。现在将退出安装。</String> <String Id="DisallowUpgradeErrorMessage">已安装更低版本的 [ProductName]。升级已禁用。现在将退出安装。</String> @@ -11,6 +10,9 @@ <String Id="ShortcutPromptDlgDescription">选择要创建的快捷方式。</String> <String Id="ShortcutPromptDlgDesktopShortcutControlLabel">创建桌面快捷方式</String> <String Id="ShortcutPromptDlgStartMenuShortcutControlLabel">创建开始菜单快捷方式</String> + <String Id="InstallDirNotEmptyDlg_Title">[ProductName] 安装程序</String> + <String Id="InstallDirNotEmptyDlgInstallDirExistMessage">文件夹 [INSTALLDIR] 已存在。是否仍要安装到该文件夹?</String> + <String Id="ContextMenuCommandLabel">使用 [ProductName] 打开</String> </WixLocalization> diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties index cdbf04e746460..5843a750adea9 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -41,8 +41,9 @@ resource.overrides-wix-file=Overrides WiX project file resource.shortcutpromptdlg-wix-file=Shortcut prompt dialog WiX project file resource.installdirnotemptydlg-wix-file=Not empty install directory dialog WiX project file resource.launcher-as-service-wix-file=Service installer WiX project file +resource.wix-src-conv=XSLT stylesheet converting WiX sources from WiX v3 to WiX v4 format -error.no-wix-tools=Can not find WiX tools (light.exe, candle.exe) +error.no-wix-tools=Can not find WiX tools. Was looking for WiX v3 light.exe and candle.exe or WiX v4/v5 wix.exe and none was found error.no-wix-tools.advice=Download WiX 3.0 or later from https://wixtoolset.org and add it to the PATH. error.version-string-wrong-format.advice=Set value of --app-version parameter to a valid Windows Installer ProductVersion. error.msi-product-version-components=Version string [{0}] must have between 2 and 4 components. diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties index 6bdb9b06e09be..dce4a911fe144 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -41,8 +41,9 @@ resource.overrides-wix-file=Überschreibt WiX-Projektdatei resource.shortcutpromptdlg-wix-file=Dialogfeld für Verknüpfungs-Prompt der WiX-Projektdatei resource.installdirnotemptydlg-wix-file=Nicht leeres Installationsverzeichnis in Dialogfeld für WiX-Projektdatei resource.launcher-as-service-wix-file=WiX-Projektdatei für Serviceinstallationsprogramm +resource.wix-src-conv=XSLT stylesheet converting WiX sources from WiX v3 to WiX v4 format -error.no-wix-tools=WiX-Tools (light.exe, candle.exe) nicht gefunden +error.no-wix-tools=Can not find WiX tools. Was looking for WiX v3 light.exe and candle.exe or WiX v4/v5 wix.exe and none was found error.no-wix-tools.advice=Laden Sie WiX 3.0 oder höher von https://wixtoolset.org herunter, und fügen Sie es zu PATH hinzu. error.version-string-wrong-format.advice=Setzen Sie den Wert des --app-version-Parameters auf eine gültige ProductVersion des Windows-Installationsprogramms. error.msi-product-version-components=Versionszeichenfolge [{0}] muss zwischen 2 und 4 Komponenten aufweisen. diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties index 6a89e8cbf5ae5..e0bcd18c81103 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -41,8 +41,9 @@ resource.overrides-wix-file=WiXプロジェクト・ファイルのオーバー resource.shortcutpromptdlg-wix-file=ショートカット・プロンプト・ダイアログWiXプロジェクト・ファイル resource.installdirnotemptydlg-wix-file=インストール・ディレクトリ・ダイアログのWiXプロジェクト・ファイルが空ではありません resource.launcher-as-service-wix-file=サービス・インストーラWiXプロジェクト・ファイル +resource.wix-src-conv=XSLT stylesheet converting WiX sources from WiX v3 to WiX v4 format -error.no-wix-tools=WiXツール(light.exe、candle.exe)が見つかりません +error.no-wix-tools=Can not find WiX tools. Was looking for WiX v3 light.exe and candle.exe or WiX v4/v5 wix.exe and none was found error.no-wix-tools.advice=WiX 3.0以降をhttps://wixtoolset.orgからダウンロードし、PATHに追加します。 error.version-string-wrong-format.advice=--app-versionパラメータの値を有効なWindows Installer ProductVersionに設定します。 error.msi-product-version-components=バージョン文字列[{0}]には、2から4つのコンポーネントが含まれている必要があります。 diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties index f786b00155dbf..e2b8bd37135f4 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -41,8 +41,9 @@ resource.overrides-wix-file=覆盖 WiX 项目文件 resource.shortcutpromptdlg-wix-file=快捷方式提示对话框 WiX 项目文件 resource.installdirnotemptydlg-wix-file=安装目录对话框 WiX 项目文件非空 resource.launcher-as-service-wix-file=服务安装程序 WiX 项目文件 +resource.wix-src-conv=XSLT stylesheet converting WiX sources from WiX v3 to WiX v4 format -error.no-wix-tools=找不到 WiX 工具 (light.exe, candle.exe) +error.no-wix-tools=Can not find WiX tools. Was looking for WiX v3 light.exe and candle.exe or WiX v4/v5 wix.exe and none was found error.no-wix-tools.advice=从 https://wixtoolset.org 下载 WiX 3.0 或更高版本,然后将其添加到 PATH。 error.version-string-wrong-format.advice=将 --app-version 参数的值设置为有效的 Windows Installer ProductVersion。 error.msi-product-version-components=版本字符串 [{0}] 必须包含 2 到 4 个组成部分。 diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/overrides.wxi b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/overrides.wxi index d8c8f16438f14..c2faa850563c9 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/overrides.wxi +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/overrides.wxi @@ -28,4 +28,4 @@ to disable (the value doesn't matter). Should be defined to enable upgrades and undefined to disable upgrades. By default it is defined, use <?undef JpAllowUpgrades?> to disable. --> -<Include/> +<Include xmlns="http://schemas.microsoft.com/wix/2006/wi"/> diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/wix3-to-wix4-conv.xsl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/wix3-to-wix4-conv.xsl new file mode 100644 index 0000000000000..382ed731b5a6f --- /dev/null +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/wix3-to-wix4-conv.xsl @@ -0,0 +1,183 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ +--> + +<!-- + This stylesheet can be applied to Wix3 .wxl, .wxs, and .wsi source files. +--> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:wix3loc="http://schemas.microsoft.com/wix/2006/localization" + xmlns:wix3="http://schemas.microsoft.com/wix/2006/wi" +> + <!-- Wix4 complains about xml declaration in input files. Turn it off --> + <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> + + <!-- + Remap xmlns="http://schemas.microsoft.com/wix/2006/localization" + to xmlns="http://wixtoolset.org/schemas/v4/wxl" + --> + + <xsl:template match="wix3loc:*"> + <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxl"> + <xsl:apply-templates select="@*|node()"/> + </xsl:element> + </xsl:template> + + <!-- + Remap xmlns="http://schemas.microsoft.com/wix/2006/localization" + to xmlns="http://wixtoolset.org/schemas/v4/wxs" + --> + + <xsl:template match="wix3:*"> + <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxs"> + <xsl:apply-templates select="@*|node()"/> + </xsl:element> + </xsl:template> + + + <!-- + From <String Id="foo">Bar</String> to <String Id="foo" Value="Bar"/> + --> + <xsl:template match="wix3loc:WixLocalization/wix3loc:String"> + <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxl"> + <xsl:attribute name="Value"> + <xsl:value-of select="text()"/> + </xsl:attribute> + <xsl:apply-templates select="@*"/> + </xsl:element> + </xsl:template> + + + <!-- + Wix3 Product (https://wixtoolset.org/docs/v3/xsd/wix/product/): + Id + Codepage + Language + Manufacturer + Name + UpgradeCode + Version + + Wix3 Package (https://wixtoolset.org/docs/v3/xsd/wix/package/): + AdminImage + Comments + Compressed + Description + Id + InstallerVersion + InstallPrivileges + InstallScope + Keywords + Languages + Manufacturer + Platform + Platforms + ReadOnly + ShortNames + SummaryCodepage + + Wix4 Package (https://wixtoolset.org/docs/schema/wxs/package/): + Codepage <- Wix3:Product/@Codepage + Compressed <- Wix3:@Compressed + InstallerVersion <- Wix3:@InstallerVersion + Language <- Wix3:Product/@Language + Manufacturer <- Wix3:Product/@Manufacturer + Name <- Wix3:Product/@Name + ProductCode <- Wix3:Product/@Id + Scope <- Wix3:@InstallScope + ShortNames <- Wix3:@ShortNames + UpgradeCode <- Wix3:Product/@UpgradeCode + UpgradeStrategy <- + Version <- Wix3:Product/@Version + + Wix4 SummaryInformation (https://wixtoolset.org/docs/schema/wxs/summaryinformation/): + Codepage <- Wix3:Product/@Codepage + Comments <- Wix3:@Comments + Description <- Wix3:@Description + Keywords <- Wix3:@Keywords + Manufacturer <- Wix3:Product/@Manufacturer + --> + + <xsl:template match="wix3:Product"> + <xsl:element name="Package" namespace="http://wixtoolset.org/schemas/v4/wxs"> + <xsl:apply-templates select="@Codepage|wix3:Package/@Compressed|wix3:Package/@InstallerVersion|@Language|@Manufacturer|@Name|@Id|wix3:Package/@InstallScope|wix3:Package/@ShortNames|@UpgradeCode|@Version"/> + <xsl:if test="@Id"> + <xsl:attribute name="ProductCode"> + <xsl:value-of select="@Id"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="wix3:Package/@InstallScope"> + <xsl:attribute name="Scope"> + <xsl:value-of select="wix3:Package/@InstallScope"/> + </xsl:attribute> + </xsl:if> + <xsl:element name="SummaryInformation" namespace="http://wixtoolset.org/schemas/v4/wxs"> + <xsl:apply-templates select="@Codepage|wix3:Package/@Comments|wix3:Package/@Description|wix3:Package/@Keywords|@Manufacturer"/> + </xsl:element> + <xsl:apply-templates select="node()"/> + </xsl:element> + </xsl:template> + + <xsl:template match="wix3:Package|wix3:Product/@Id|wix3:Package/@InstallScope"/> + + + <xsl:template match="wix3:CustomAction/@BinaryKey"> + <xsl:attribute name="BinaryRef"> + <xsl:value-of select="."/> + </xsl:attribute> + </xsl:template> + + + <xsl:template match="wix3:Custom|wix3:Publish"> + <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxs"> + <xsl:apply-templates select="@*"/> + <xsl:if test="text()"> + <xsl:attribute name="Condition"> + <xsl:value-of select="text()"/> + </xsl:attribute> + </xsl:if> + <xsl:apply-templates select="node()"/> + </xsl:element> + </xsl:template> + + <xsl:template match="wix3:Custom/text()|wix3:Publish/text()"/> + + + <xsl:template match="wix3:Directory[@Id='TARGETDIR']"/> + + + <!-- + Identity transform + --> + <xsl:template match="@*|node()"> + <xsl:copy> + <xsl:apply-templates select="@*|node()"/> + </xsl:copy> + </xsl:template> + +</xsl:stylesheet> diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java index 3faabcd6f8d2c..1a4dbd22897bf 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -139,6 +139,30 @@ static PackageHandlers createMsiPackageHandlers() { String.format("TARGETDIR=\"%s\"", unpackDir.toAbsolutePath().normalize()))))); runMsiexecWithRetries(Executor.of("cmd", "/c", unpackBat.toString())); + + // + // WiX3 uses "." as the value of "DefaultDir" field for "ProgramFiles64Folder" folder in msi's Directory table + // WiX4 uses "PFiles64" as the value of "DefaultDir" field for "ProgramFiles64Folder" folder in msi's Directory table + // msiexec creates "Program Files/./<App Installation Directory>" from WiX3 msi which translates to "Program Files/<App Installation Directory>" + // msiexec creates "Program Files/PFiles64/<App Installation Directory>" from WiX4 msi + // So for WiX4 msi we need to transform "Program Files/PFiles64/<App Installation Directory>" into "Program Files/<App Installation Directory>" + // + // WiX4 does the same thing for %LocalAppData%. + // + for (var extraPathComponent : List.of("PFiles64", "LocalApp")) { + if (Files.isDirectory(unpackDir.resolve(extraPathComponent))) { + Path installationSubDirectory = getInstallationSubDirectory(cmd); + Path from = Path.of(extraPathComponent).resolve(installationSubDirectory); + Path to = installationSubDirectory; + TKit.trace(String.format("Convert [%s] into [%s] in [%s] directory", from, to, + unpackDir)); + ThrowingRunnable.toRunnable(() -> { + Files.createDirectories(unpackDir.resolve(to).getParent()); + Files.move(unpackDir.resolve(from), unpackDir.resolve(to)); + TKit.deleteDirectoryRecursive(unpackDir.resolve(extraPathComponent)); + }).run(); + } + } return destinationDir; }; return msi; diff --git a/test/jdk/tools/jpackage/windows/WinL10nTest.java b/test/jdk/tools/jpackage/windows/WinL10nTest.java index deb6b1a8705d1..a868fd5f051c4 100644 --- a/test/jdk/tools/jpackage/windows/WinL10nTest.java +++ b/test/jdk/tools/jpackage/windows/WinL10nTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,7 @@ import java.util.Arrays; import java.util.List; import java.util.function.Predicate; +import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.jpackage.test.Executor; @@ -55,11 +56,11 @@ public class WinL10nTest { public WinL10nTest(WixFileInitializer wxlFileInitializers[], - String expectedCulture, String expectedErrorMessage, + String[] expectedCultures, String expectedErrorMessage, String userLanguage, String userCountry, boolean enableWixUIExtension) { this.wxlFileInitializers = wxlFileInitializers; - this.expectedCulture = expectedCulture; + this.expectedCultures = expectedCultures; this.expectedErrorMessage = expectedErrorMessage; this.userLanguage = userLanguage; this.userCountry = userCountry; @@ -69,56 +70,65 @@ public WinL10nTest(WixFileInitializer wxlFileInitializers[], @Parameters public static List<Object[]> data() { return List.of(new Object[][]{ - {null, "en-us", null, null, null, false}, - {null, "en-us", null, "en", "US", false}, - {null, "en-us", null, "en", "US", true}, - {null, "de-de", null, "de", "DE", false}, - {null, "de-de", null, "de", "DE", true}, - {null, "ja-jp", null, "ja", "JP", false}, - {null, "ja-jp", null, "ja", "JP", true}, - {null, "zh-cn", null, "zh", "CN", false}, - {null, "zh-cn", null, "zh", "CN", true}, + {null, new String[] {"en-us"}, null, null, null, false}, + {null, new String[] {"en-us"}, null, "en", "US", false}, + {null, new String[] {"en-us"}, null, "en", "US", true}, + {null, new String[] {"de-de"}, null, "de", "DE", false}, + {null, new String[] {"de-de"}, null, "de", "DE", true}, + {null, new String[] {"ja-jp"}, null, "ja", "JP", false}, + {null, new String[] {"ja-jp"}, null, "ja", "JP", true}, + {null, new String[] {"zh-cn"}, null, "zh", "CN", false}, + {null, new String[] {"zh-cn"}, null, "zh", "CN", true}, {new WixFileInitializer[] { WixFileInitializer.create("a.wxl", "en-us") - }, "en-us", null, null, null, false}, + }, new String[] {"en-us"}, null, null, null, false}, {new WixFileInitializer[] { WixFileInitializer.create("a.wxl", "fr") - }, "fr;en-us", null, null, null, false}, + }, new String[] {"fr", "en-us"}, null, null, null, false}, {new WixFileInitializer[] { WixFileInitializer.create("a.wxl", "fr"), WixFileInitializer.create("b.wxl", "fr") - }, "fr;en-us", null, null, null, false}, + }, new String[] {"fr", "en-us"}, null, null, null, false}, {new WixFileInitializer[] { WixFileInitializer.create("a.wxl", "it"), WixFileInitializer.create("b.wxl", "fr") - }, "it;fr;en-us", null, null, null, false}, + }, new String[] {"it", "fr", "en-us"}, null, null, null, false}, {new WixFileInitializer[] { WixFileInitializer.create("c.wxl", "it"), WixFileInitializer.create("b.wxl", "fr") - }, "fr;it;en-us", null, null, null, false}, + }, new String[] {"fr", "it", "en-us"}, null, null, null, false}, {new WixFileInitializer[] { WixFileInitializer.create("a.wxl", "fr"), WixFileInitializer.create("b.wxl", "it"), WixFileInitializer.create("c.wxl", "fr"), WixFileInitializer.create("d.wxl", "it") - }, "fr;it;en-us", null, null, null, false}, + }, new String[] {"fr", "it", "en-us"}, null, null, null, false}, {new WixFileInitializer[] { WixFileInitializer.create("c.wxl", "it"), WixFileInitializer.createMalformed("b.wxl") }, null, null, null, null, false}, {new WixFileInitializer[] { WixFileInitializer.create("MsiInstallerStrings_de.wxl", "de") - }, "en-us", null, null, null, false} + }, new String[] {"en-us"}, null, null, null, false} }); } - private static Stream<String> getLightCommandLine( - Executor.Result result) { - return result.getOutput().stream().filter(s -> { + private static Stream<String> getBuildCommandLine(Executor.Result result) { + return result.getOutput().stream().filter(createToolCommandLinePredicate("light").or( + createToolCommandLinePredicate("wix"))); + } + + private static boolean isWix3(Executor.Result result) { + return result.getOutput().stream().anyMatch(createToolCommandLinePredicate("light")); + } + + private final static Predicate<String> createToolCommandLinePredicate(String wixToolName) { + var toolFileName = wixToolName + ".exe"; + return (s) -> { s = s.trim(); - return s.startsWith("light.exe") || ((s.contains("\\light.exe ") - && s.contains(" -out "))); - }); + return s.startsWith(toolFileName) || ((s.contains(String.format("\\%s ", toolFileName)) && s. + contains(" -out "))); + }; } private static List<TKit.TextStreamVerifier> createDefaultL10nFilesLocVerifiers(Path tempDir) { @@ -148,14 +158,23 @@ public void test() throws IOException { // 2. Instruct test to save jpackage output. cmd.setFakeRuntime().saveConsoleOutput(true); + boolean withJavaOptions = false; + // Set JVM default locale that is used to select primary l10n file. if (userLanguage != null) { + withJavaOptions = true; cmd.addArguments("-J-Duser.language=" + userLanguage); } if (userCountry != null) { + withJavaOptions = true; cmd.addArguments("-J-Duser.country=" + userCountry); } + if (withJavaOptions) { + // Use jpackage as a command to allow "-J" options come through + cmd.useToolProvider(false); + } + // Cultures handling is affected by the WiX extensions used. // By default only WixUtilExtension is used, this flag // additionally enables WixUIExtension. @@ -169,9 +188,16 @@ public void test() throws IOException { cmd.addArguments("--temp", tempDir.toString()); }) .addBundleVerifier((cmd, result) -> { - if (expectedCulture != null) { - TKit.assertTextStream("-cultures:" + expectedCulture).apply( - getLightCommandLine(result)); + if (expectedCultures != null) { + String expected; + if (isWix3(result)) { + expected = "-cultures:" + String.join(";", expectedCultures); + } else { + expected = Stream.of(expectedCultures).map(culture -> { + return String.join(" ", "-culture", culture); + }).collect(Collectors.joining(" ")); + } + TKit.assertTextStream(expected).apply(getBuildCommandLine(result)); } if (expectedErrorMessage != null) { @@ -180,24 +206,24 @@ public void test() throws IOException { } if (wxlFileInitializers != null) { + var wixSrcDir = Path.of(cmd.getArgumentValue("--temp")).resolve("config"); + if (allWxlFilesValid) { for (var v : wxlFileInitializers) { if (!v.name.startsWith("MsiInstallerStrings_")) { - v.createCmdOutputVerifier(resourceDir).apply( - getLightCommandLine(result)); + v.createCmdOutputVerifier(wixSrcDir).apply(getBuildCommandLine(result)); } } Path tempDir = getTempDirectory(cmd, tempRoot).toAbsolutePath(); for (var v : createDefaultL10nFilesLocVerifiers(tempDir)) { - v.apply(getLightCommandLine(result)); + v.apply(getBuildCommandLine(result)); } } else { Stream.of(wxlFileInitializers) .filter(Predicate.not(WixFileInitializer::isValid)) .forEach(v -> v.createCmdOutputVerifier( - resourceDir).apply(result.getOutput().stream())); - TKit.assertFalse( - getLightCommandLine(result).findAny().isPresent(), + wixSrcDir).apply(result.getOutput().stream())); + TKit.assertFalse(getBuildCommandLine(result).findAny().isPresent(), "Check light.exe was not invoked"); } } @@ -223,7 +249,7 @@ public void test() throws IOException { } final private WixFileInitializer[] wxlFileInitializers; - final private String expectedCulture; + final private String[] expectedCultures; final private String expectedErrorMessage; final private String userLanguage; final private String userCountry; From 2c1da6c6fa2e50856ea71c0e266961171bee1037 Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas <aboldtch@openjdk.org> Date: Wed, 12 Jun 2024 14:06:53 +0000 Subject: [PATCH 045/471] 8332139: SymbolTableHash::Node allocations allocates twice the required memory Reviewed-by: iwalulya, coleenp --- src/hotspot/share/classfile/symbolTable.cpp | 4 ++-- src/hotspot/share/oops/symbol.hpp | 4 +--- src/hotspot/share/utilities/concurrentHashTable.hpp | 8 ++++++++ .../share/utilities/concurrentHashTable.inline.hpp | 9 +++++++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/hotspot/share/classfile/symbolTable.cpp b/src/hotspot/share/classfile/symbolTable.cpp index 1fbc49947bf13..f680939682aaa 100644 --- a/src/hotspot/share/classfile/symbolTable.cpp +++ b/src/hotspot/share/classfile/symbolTable.cpp @@ -172,7 +172,7 @@ class SymbolTableConfig : public AllStatic { // Deleting permanent symbol should not occur very often (insert race condition), // so log it. log_trace_symboltable_helper(&value, "Freeing permanent symbol"); - size_t alloc_size = _local_table->get_node_size() + value.byte_size() + value.effective_length(); + size_t alloc_size = SymbolTableHash::get_dynamic_node_size(value.byte_size()); if (!SymbolTable::arena()->Afree(memory, alloc_size)) { log_trace_symboltable_helper(&value, "Leaked permanent symbol"); } @@ -182,7 +182,7 @@ class SymbolTableConfig : public AllStatic { private: static void* allocate_node_impl(size_t size, Value const& value) { - size_t alloc_size = size + value.byte_size() + value.effective_length(); + size_t alloc_size = SymbolTableHash::get_dynamic_node_size(value.byte_size()); #if INCLUDE_CDS if (CDSConfig::is_dumping_static_archive()) { MutexLocker ml(DumpRegion_lock, Mutex::_no_safepoint_check_flag); diff --git a/src/hotspot/share/oops/symbol.hpp b/src/hotspot/share/oops/symbol.hpp index 008b979492dd9..3b3f1366203b9 100644 --- a/src/hotspot/share/oops/symbol.hpp +++ b/src/hotspot/share/oops/symbol.hpp @@ -122,7 +122,7 @@ class Symbol : public MetaspaceObj { }; static int byte_size(int length) { - // minimum number of natural words needed to hold these bits (no non-heap version) + // minimum number of bytes needed to hold these bits (no non-heap version) return (int)(sizeof(Symbol) + (length > 2 ? length - 2 : 0)); } static int size(int length) { @@ -146,8 +146,6 @@ class Symbol : public MetaspaceObj { int size() const { return size(utf8_length()); } int byte_size() const { return byte_size(utf8_length()); }; - // length without the _body - size_t effective_length() const { return (size_t)byte_size() - sizeof(Symbol); } // Symbols should be stored in the read-only region of CDS archive. static bool is_read_only_by_default() { return true; } diff --git a/src/hotspot/share/utilities/concurrentHashTable.hpp b/src/hotspot/share/utilities/concurrentHashTable.hpp index c7d5832048c29..991ea9fe3c609 100644 --- a/src/hotspot/share/utilities/concurrentHashTable.hpp +++ b/src/hotspot/share/utilities/concurrentHashTable.hpp @@ -91,6 +91,13 @@ class ConcurrentHashTable : public CHeapObj<F> { void print_on(outputStream* st) const {}; void print_value_on(outputStream* st) const {}; + + static bool is_dynamic_sized_value_compatible() { + // To support dynamically sized Value types, where part of the payload is + // allocated beyond the end of the object, it must be that the _value + // field ends where the Node object ends. (No end padding). + return offset_of(Node, _value) + sizeof(_value) == sizeof(Node); + } }; // Only constructed with placement new from an array allocated with MEMFLAGS @@ -419,6 +426,7 @@ class ConcurrentHashTable : public CHeapObj<F> { size_t get_size_log2(Thread* thread); static size_t get_node_size() { return sizeof(Node); } + static size_t get_dynamic_node_size(size_t value_size); bool is_max_size_reached() { return _size_limit_reached; } // This means no paused bucket resize operation is going to resume diff --git a/src/hotspot/share/utilities/concurrentHashTable.inline.hpp b/src/hotspot/share/utilities/concurrentHashTable.inline.hpp index 2b30e664109d7..a83b6dd8a58d0 100644 --- a/src/hotspot/share/utilities/concurrentHashTable.inline.hpp +++ b/src/hotspot/share/utilities/concurrentHashTable.inline.hpp @@ -1055,6 +1055,15 @@ inline size_t ConcurrentHashTable<CONFIG, F>:: return _table->_log2_size; } +template <typename CONFIG, MEMFLAGS F> +inline size_t ConcurrentHashTable<CONFIG, F>:: + get_dynamic_node_size(size_t value_size) +{ + assert(Node::is_dynamic_sized_value_compatible(), "VALUE must be compatible"); + assert(value_size >= sizeof(VALUE), "must include the VALUE"); + return sizeof(Node) - sizeof(VALUE) + value_size; +} + template <typename CONFIG, MEMFLAGS F> inline bool ConcurrentHashTable<CONFIG, F>:: shrink(Thread* thread, size_t size_limit_log2) From b697b48a0133458983caea4acc6de8de3e56d356 Mon Sep 17 00:00:00 2001 From: Alisen Chung <achung@openjdk.org> Date: Wed, 12 Jun 2024 18:44:07 +0000 Subject: [PATCH 046/471] 8315655: [macos] Right click and dragging over a component with a popup menu will open the popup Reviewed-by: dnguyen, psadhukhan --- .../sun/lwawt/macosx/CPlatformResponder.java | 4 +- .../classes/sun/lwawt/macosx/CTrayIcon.java | 2 +- .../classes/sun/lwawt/macosx/NSEvent.java | 9 +- .../swing/JPopupMenu/MouseDragPopupTest.java | 129 ++++++++++++++++++ 4 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 test/jdk/javax/swing/JPopupMenu/MouseDragPopupTest.java diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java index f14c7b40cbab2..0501bbfab0320 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,7 @@ void handleMouseEvent(int eventType, int modifierFlags, int buttonNumber, jmodifiers |= MouseEvent.getMaskForButton(jbuttonNumber); } - boolean jpopupTrigger = NSEvent.isPopupTrigger(jmodifiers); + boolean jpopupTrigger = NSEvent.isPopupTrigger(jmodifiers, jeventType); eventNotifier.notifyMouseEvent(jeventType, System.currentTimeMillis(), jbuttonNumber, x, y, absX, absY, jmodifiers, jclickCount, diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java index d0b9288aeae1c..7d35f859a7a3d 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java @@ -253,7 +253,7 @@ private void handleMouseEvent(NSEvent nsEvent) { int jmodifiers = NSEvent.nsToJavaModifiers( nsEvent.getModifierFlags()); - boolean isPopupTrigger = NSEvent.isPopupTrigger(jmodifiers); + boolean isPopupTrigger = NSEvent.isPopupTrigger(jmodifiers, jeventType); int eventButtonMask = (jbuttonNumber > 0)? MouseEvent.getMaskForButton(jbuttonNumber) : 0; diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java index ca3d9ad5da7ea..f3fcfdfb43cfe 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -269,7 +269,12 @@ static int nsToJavaEventType(int nsEventType) { */ static native char nsToJavaChar(char nsChar, int modifierFlags, boolean spaceKeyTyped); - static boolean isPopupTrigger(int jmodifiers) { + static boolean isPopupTrigger(int jmodifiers, int jeventType) { + if (jeventType != MouseEvent.MOUSE_PRESSED + && jeventType != MouseEvent.MOUSE_RELEASED) { + return false; + } + final boolean isRightButtonDown = ((jmodifiers & InputEvent.BUTTON3_DOWN_MASK) != 0); final boolean isLeftButtonDown = ((jmodifiers & InputEvent.BUTTON1_DOWN_MASK) != 0); final boolean isControlDown = ((jmodifiers & InputEvent.CTRL_DOWN_MASK) != 0); diff --git a/test/jdk/javax/swing/JPopupMenu/MouseDragPopupTest.java b/test/jdk/javax/swing/JPopupMenu/MouseDragPopupTest.java new file mode 100644 index 0000000000000..e34b53d0360f2 --- /dev/null +++ b/test/jdk/javax/swing/JPopupMenu/MouseDragPopupTest.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.InputEvent; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; + +/* + * @test + * @bug 8315655 + * @summary Verifies Right click and dragging over a component with a popup menu will not open the popup + * @key headful + * @run main MouseDragPopupTest + */ +public class MouseDragPopupTest { + static JFrame frame; + static JPanel panel; + static Robot robot; + static volatile boolean failed; + static volatile Point srcPoint; + static volatile Dimension d; + + public static void main(String[] args) throws Exception { + try { + robot = new Robot(); + robot.setAutoWaitForIdle(true); + robot.setAutoDelay(100); + + SwingUtilities.invokeAndWait(() -> { + createAndShowGUI(); + }); + robot.delay(1000); + + SwingUtilities.invokeAndWait(() -> { + srcPoint = frame.getLocationOnScreen(); + d = frame.getSize(); + }); + srcPoint.translate(2 * d.width / 3, 3 * d.height / 4); + + final Point dstPoint = new Point(srcPoint); + dstPoint.translate(4 * d.width / 15, 0); + + robot.mouseMove(srcPoint.x, srcPoint.y); + + robot.mousePress(InputEvent.BUTTON3_DOWN_MASK); + + while (!srcPoint.equals(dstPoint)) { + srcPoint.translate(sign(dstPoint.x - srcPoint.x), 0); + robot.mouseMove(srcPoint.x, srcPoint.y); + } + + if (failed) { + throw new RuntimeException("Popup was shown, Test Failed."); + } + } finally { + robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK); + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + public static int sign(int n) { + return n < 0 ? -1 : n == 0 ? 0 : 1; + } + + static void createAndShowGUI() { + frame = new JFrame("MouseDragPopupTest"); + panel = new JPanel(); + JPanel innerPanel = new JPanel(); + JPopupMenu menu = new JPopupMenu(); + + menu.addPopupMenuListener(new PopupMenuListener() { + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + failed = true; + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {} + + @Override + public void popupMenuCanceled(PopupMenuEvent e) {} + }); + + menu.add("This should not appear"); + innerPanel.setComponentPopupMenu(menu); + + panel.add(new JLabel("Right click and drag from here")); + panel.add(innerPanel); + panel.add(new JLabel("to here")); + + frame.add(panel); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } +} From 74468bc1f3aff7f53b91e342711dc095d97fdfed Mon Sep 17 00:00:00 2001 From: Ben Perez <ben.perez@oracle.com> Date: Wed, 12 Jun 2024 18:59:26 +0000 Subject: [PATCH 047/471] 8209092: Remove outdated wording from RC5ParameterSpec Reviewed-by: mullan --- .../share/classes/javax/crypto/spec/RC5ParameterSpec.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/javax/crypto/spec/RC5ParameterSpec.java b/src/java.base/share/classes/javax/crypto/spec/RC5ParameterSpec.java index 7e4aab20e683d..67daf8bb19ab5 100644 --- a/src/java.base/share/classes/javax/crypto/spec/RC5ParameterSpec.java +++ b/src/java.base/share/classes/javax/crypto/spec/RC5ParameterSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,9 +37,7 @@ * size, and optionally an initialization vector (IV) (only in feedback mode). * * <p> This class can be used to initialize a {@code Cipher} object that - * implements the <i>RC5</i> algorithm as supplied by - * <a href="http://www.rsa.com">RSA Security LLC</a>, - * or any parties authorized by RSA Security. + * implements the <i>RC5</i> algorithm. * * @author Jan Luehe * From fcedde804277af5a26febdcfb7817858d72f01ab Mon Sep 17 00:00:00 2001 From: Inigo Mediavilla Saiz <imediava@gmail.com> Date: Wed, 12 Jun 2024 23:18:27 +0000 Subject: [PATCH 048/471] 8330846: Add stacks of mounted virtual threads to the HotSpot thread dump Reviewed-by: dholmes, alanb --- src/hotspot/share/runtime/threads.cpp | 9 ++ .../thread/PrintMountedVirtualThread.java | 88 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index eb83dda1ff5ff..e7c425b2b8cd6 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -1321,6 +1321,15 @@ void Threads::print_on(outputStream* st, bool print_stacks, p->trace_stack(); } else { p->print_stack_on(st); + const oop thread_oop = p->threadObj(); + if (thread_oop != nullptr) { + if (p->is_vthread_mounted()) { + const oop vt = p->vthread(); + assert(vt != nullptr, "vthread should not be null when vthread is mounted"); + st->print_cr(" Mounted virtual thread \"%s\" #" INT64_FORMAT, JavaThread::name_for(vt), (int64_t)java_lang_Thread::thread_id(vt)); + p->print_vthread_stack_on(st); + } + } } } st->cr(); diff --git a/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java b/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java new file mode 100644 index 0000000000000..bffe4c266a478 --- /dev/null +++ b/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import jdk.test.lib.dcmd.CommandExecutor; +import jdk.test.lib.dcmd.JMXExecutor; +import jdk.test.lib.process.OutputAnalyzer; +import org.junit.Test; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.regex.Pattern; + +/* + * @test + * @summary Test of diagnostic command Thread.print with virtual threads + * @requires vm.continuations + * @library /test/lib + * @run junit PrintMountedVirtualThread + */ +public class PrintMountedVirtualThread { + + public void run(CommandExecutor executor) throws InterruptedException { + var shouldFinish = new AtomicBoolean(false); + var started = new CountDownLatch(1); + final Runnable runnable = new DummyRunnable(shouldFinish, started); + try { + Thread vthread = Thread.ofVirtual().name("Dummy Vthread").start(runnable); + started.await(); + /* Execute */ + OutputAnalyzer output = executor.execute("Thread.print"); + output.shouldMatch(".*at " + Pattern.quote(DummyRunnable.class.getName()) + "\\.run.*"); + output.shouldMatch(".*at " + Pattern.quote(DummyRunnable.class.getName()) + "\\.compute.*"); + output.shouldMatch("Mounted virtual thread " + "\"Dummy Vthread\"" + " #" + vthread.threadId()); + + } finally { + shouldFinish.set(true); + } + } + + @Test + public void jmx() throws InterruptedException { + run(new JMXExecutor()); + } + + static class DummyRunnable implements Runnable { + + private final AtomicBoolean shouldFinish; + private final CountDownLatch started; + + public DummyRunnable(AtomicBoolean shouldFinish, CountDownLatch started) { + this.shouldFinish = shouldFinish; + this.started = started; + } + + public void run() { + compute(); + } + + void compute() { + started.countDown(); + while (!shouldFinish.get()) { + Thread.onSpinWait(); + } + } + } + + +} From 238162a3b8ce307659420661903a7f8ac1f06979 Mon Sep 17 00:00:00 2001 From: David Holmes <dholmes@openjdk.org> Date: Thu, 13 Jun 2024 02:53:48 +0000 Subject: [PATCH 049/471] 8322064: Remove expired flags in JDK 24 Reviewed-by: kvn, stuefe --- src/hotspot/share/runtime/arguments.cpp | 27 ------ src/java.base/share/man/java.1 | 110 +++++++++++------------- 2 files changed, 50 insertions(+), 87 deletions(-) diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index b80aa50534dca..6680851405f5f 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -501,7 +501,6 @@ static SpecialFlag const special_jvm_flags[] = { { "DynamicDumpSharedSpaces", JDK_Version::jdk(18), JDK_Version::jdk(19), JDK_Version::undefined() }, { "RequireSharedSpaces", JDK_Version::jdk(18), JDK_Version::jdk(19), JDK_Version::undefined() }, { "UseSharedSpaces", JDK_Version::jdk(18), JDK_Version::jdk(19), JDK_Version::undefined() }, - { "RegisterFinalizersAtInit", JDK_Version::jdk(22), JDK_Version::jdk(23), JDK_Version::jdk(24) }, { "DontYieldALot", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "OldSize", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "PreserveAllAnnotations", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, @@ -514,32 +513,6 @@ static SpecialFlag const special_jvm_flags[] = { { "MetaspaceReclaimPolicy", JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::undefined() }, - { "G1ConcRefinementGreenZone", JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) }, - { "G1ConcRefinementYellowZone", JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) }, - { "G1ConcRefinementRedZone", JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) }, - { "G1ConcRefinementThresholdStep", JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) }, - { "G1UseAdaptiveConcRefinement", JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) }, - { "G1ConcRefinementServiceIntervalMillis", JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) }, - - { "G1ConcRSLogCacheSize", JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::jdk(24) }, - { "G1ConcRSHotCardLimit", JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::jdk(24) }, - { "RefDiscoveryPolicy", JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::jdk(24) }, - - { "AdaptiveSizePolicyCollectionCostMargin", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "MaxGCMinorPauseMillis", JDK_Version::jdk(8), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "MaxRAMFraction", JDK_Version::jdk(10), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "MinRAMFraction", JDK_Version::jdk(10), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "InitialRAMFraction", JDK_Version::jdk(10), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "DefaultMaxRAMFraction", JDK_Version::jdk(8), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "TLABStats", JDK_Version::jdk(12), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "GCLockerEdenExpansionPercent", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "NUMAPageScanRate", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "ProcessDistributionStride", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - - { "ParallelOldDeadWoodLimiterMean", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "ParallelOldDeadWoodLimiterStdDev", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "UseNeon", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, - { "ScavengeBeforeFullGC", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) }, #if defined(X86) { "UseRTMLocking", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "UseRTMDeopt", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, diff --git a/src/java.base/share/man/java.1 b/src/java.base/share/man/java.1 index 4bd0306b2b804..839d46e122833 100644 --- a/src/java.base/share/man/java.1 +++ b/src/java.base/share/man/java.1 @@ -3737,45 +3737,6 @@ Example: Enables the use of Java Flight Recorder (JFR) during the runtime of the application. Since JDK 8u40 this option has not been required to use JFR. -.TP -\f[V]-XX:InitialRAMFraction=\f[R]\f[I]ratio\f[R] -Sets the initial amount of memory that the JVM may use for the Java heap -before applying ergonomics heuristics as a ratio of the maximum amount -determined as described in the \f[V]-XX:MaxRAM\f[R] option. -The default value is 64. -.RS -.PP -Use the option \f[V]-XX:InitialRAMPercentage\f[R] instead. -.RE -.TP -\f[V]-XX:MaxRAMFraction=\f[R]\f[I]ratio\f[R] -Sets the maximum amount of memory that the JVM may use for the Java heap -before applying ergonomics heuristics as a fraction of the maximum -amount determined as described in the \f[V]-XX:MaxRAM\f[R] option. -The default value is 4. -.RS -.PP -Specifying this option disables automatic use of compressed oops if the -combined result of this and other options influencing the maximum amount -of memory is larger than the range of memory addressable by compressed -oops. -See \f[V]-XX:UseCompressedOops\f[R] for further information about -compressed oops. -.PP -Use the option \f[V]-XX:MaxRAMPercentage\f[R] instead. -.RE -.TP -\f[V]-XX:MinRAMFraction=\f[R]\f[I]ratio\f[R] -Sets the maximum amount of memory that the JVM may use for the Java heap -before applying ergonomics heuristics as a fraction of the maximum -amount determined as described in the \f[V]-XX:MaxRAM\f[R] option for -small heaps. -A small heap is a heap of approximately 125 MB. -The default value is 2. -.RS -.PP -Use the option \f[V]-XX:MinRAMPercentage\f[R] instead. -.RE .SH OBSOLETE JAVA OPTIONS .PP These \f[V]java\f[R] options are still accepted but ignored, and a @@ -3789,16 +3750,6 @@ This option was deprecated in JDK 16 by \f[B]JEP 396\f[R] [https://openjdk.org/jeps/396] and made obsolete in JDK 17 by \f[B]JEP 403\f[R] [https://openjdk.org/jeps/403]. .TP -\f[V]-XX:+ScavengeBeforeFullGC\f[R] -Enables GC of the young generation before each full GC. -This option is enabled by default. -It is recommended that you \f[I]don\[aq]t\f[R] disable it, because -scavenging the young generation before a full GC can reduce the number -of objects reachable from the old generation space into the young -generation space. -To disable GC of the young generation before each full GC, specify the -option \f[V]-XX:-ScavengeBeforeFullGC\f[R]. -.TP \f[V]-XX:RTMAbortRatio=\f[R]\f[I]abort_ratio\f[R] Specifies the RTM abort ratio is specified as a percentage (%) of all executed RTM transactions. @@ -3884,22 +3835,61 @@ results in an error of: \f[V]Unrecognized VM option\f[R] \f[I]option-name\f[R] .RE .TP -\f[V]-XX:+UseHugeTLBFS\f[R] -\f[B]Linux only:\f[R] This option is the equivalent of specifying -\f[V]-XX:+UseLargePages\f[R]. -This option is disabled by default. -This option pre-allocates all large pages up-front, when memory is -reserved; consequently the JVM can\[aq]t dynamically grow or shrink -large pages memory areas; see \f[V]-XX:UseTransparentHugePages\f[R] if -you want this behavior. +\f[V]-XX:InitialRAMFraction=\f[R]\f[I]ratio\f[R] +Sets the initial amount of memory that the JVM may use for the Java heap +before applying ergonomics heuristics as a ratio of the maximum amount +determined as described in the \f[V]-XX:MaxRAM\f[R] option. +The default value is 64. +.RS +.PP +Use the option \f[V]-XX:InitialRAMPercentage\f[R] instead. +.RE .TP -\f[V]-XX:+UseSHM\f[R] -\f[B]Linux only:\f[R] Enables the JVM to use shared memory to set up -large pages. +\f[V]-XX:MaxRAMFraction=\f[R]\f[I]ratio\f[R] +Sets the maximum amount of memory that the JVM may use for the Java heap +before applying ergonomics heuristics as a fraction of the maximum +amount determined as described in the \f[V]-XX:MaxRAM\f[R] option. +The default value is 4. +.RS +.PP +Specifying this option disables automatic use of compressed oops if the +combined result of this and other options influencing the maximum amount +of memory is larger than the range of memory addressable by compressed +oops. +See \f[V]-XX:UseCompressedOops\f[R] for further information about +compressed oops. +.PP +Use the option \f[V]-XX:MaxRAMPercentage\f[R] instead. +.RE +.TP +\f[V]-XX:MinRAMFraction=\f[R]\f[I]ratio\f[R] +Sets the maximum amount of memory that the JVM may use for the Java heap +before applying ergonomics heuristics as a fraction of the maximum +amount determined as described in the \f[V]-XX:MaxRAM\f[R] option for +small heaps. +A small heap is a heap of approximately 125 MB. +The default value is 2. +.RS +.PP +Use the option \f[V]-XX:MinRAMPercentage\f[R] instead. +.RE +.TP +\f[V]-XX:+ScavengeBeforeFullGC\f[R] +Enables GC of the young generation before each full GC. +This option is enabled by default. +It is recommended that you \f[I]don\[aq]t\f[R] disable it, because +scavenging the young generation before a full GC can reduce the number +of objects reachable from the old generation space into the young +generation space. +To disable GC of the young generation before each full GC, specify the +option \f[V]-XX:-ScavengeBeforeFullGC\f[R]. .PP For the lists and descriptions of options removed in previous releases see the \f[I]Removed Java Options\f[R] section in: .IP \[bu] 2 +\f[B]The \f[VB]java\f[B] Command, Release 23\f[R] +[https://docs.oracle.com/en/java/javase/23/docs/specs/man/java.html] +.IP \[bu] 2 \f[B]The \f[VB]java\f[B] Command, Release 22\f[R] [https://docs.oracle.com/en/java/javase/22/docs/specs/man/java.html] .IP \[bu] 2 From 301bd7085654328f941c462bc786e995051d1a9c Mon Sep 17 00:00:00 2001 From: Abhishek Kumar <abhiscxk@openjdk.org> Date: Thu, 13 Jun 2024 04:49:58 +0000 Subject: [PATCH 050/471] 8311110: multichar warning in WinAccessBridge.cpp Reviewed-by: djelinski, jwaters, prr --- .../windows/native/libwindowsaccessbridge/WinAccessBridge.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp index 036d0c8b667eb..32fbcded07efa 100644 --- a/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp +++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2773,7 +2773,7 @@ WinAccessBridge::getAccessibleTextItems(long vmID, if (destABWindow != (HWND) 0) { if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) { memcpy(textItems, &(pkg->rTextItemsInfo), sizeof(AccessibleTextItemsInfo)); - if (pkg->rTextItemsInfo.letter != '/0') { + if (pkg->rTextItemsInfo.letter != '\0') { return TRUE; } } From 5d2a19def154b81c8ebada5594e080fe76c5ffee Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Thu, 13 Jun 2024 06:35:26 +0000 Subject: [PATCH 051/471] 8333684: C2 SuperWord: multiple smaller refactorings in preparation for JDK-8332163 Reviewed-by: chagedorn, kvn --- src/hotspot/share/opto/phasetype.hpp | 7 +- src/hotspot/share/opto/superword.cpp | 305 +++++++++++------------ src/hotspot/share/opto/superword.hpp | 23 +- src/hotspot/share/opto/vectorization.hpp | 11 + src/hotspot/share/opto/vectornode.cpp | 50 +++- src/hotspot/share/opto/vectornode.hpp | 5 +- 6 files changed, 220 insertions(+), 181 deletions(-) diff --git a/src/hotspot/share/opto/phasetype.hpp b/src/hotspot/share/opto/phasetype.hpp index 6448b8331cc64..7a83f8c7f27d9 100644 --- a/src/hotspot/share/opto/phasetype.hpp +++ b/src/hotspot/share/opto/phasetype.hpp @@ -68,9 +68,10 @@ flags(AFTER_RANGE_CHECK_ELIMINATION, "After Range Check Elimination") \ flags(BEFORE_PRE_MAIN_POST, "Before Pre/Main/Post Loops") \ flags(AFTER_PRE_MAIN_POST, "After Pre/Main/Post Loops") \ - flags(SUPERWORD1_BEFORE_SCHEDULE, "Superword 1, Before Schedule") \ - flags(SUPERWORD2_BEFORE_OUTPUT, "Superword 2, Before Output") \ - flags(SUPERWORD3_AFTER_OUTPUT, "Superword 3, After Output") \ + flags(AUTO_VECTORIZATION1_BEFORE_APPLY, "AutoVectorization 1, Before Apply") \ + flags(AUTO_VECTORIZATION2_AFTER_REORDER, "AutoVectorization 2, After Apply Memop Reordering") \ + flags(AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, "AutoVectorization 3, After Adjusting Pre-Loop Limit") \ + flags(AUTO_VECTORIZATION4_AFTER_APPLY, "AutoVectorization 4, After Apply") \ flags(BEFORE_CLOOPS, "Before CountedLoop") \ flags(AFTER_CLOOPS, "After CountedLoop") \ flags(PHASEIDEAL_BEFORE_EA, "PhaseIdealLoop before EA") \ diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp index d36e306a1e95a..e71a602620958 100644 --- a/src/hotspot/share/opto/superword.cpp +++ b/src/hotspot/share/opto/superword.cpp @@ -481,10 +481,9 @@ bool SuperWord::SLP_extract() { filter_packs_for_profitable(); DEBUG_ONLY(verify_packs();) + DEBUG_ONLY(verify_no_extract()); - schedule(); - - return output(); + return schedule_and_apply(); } // Find the "seed" memops pairs. These are pairs that we strongly suspect would lead to vectorization. @@ -1466,7 +1465,7 @@ const AlignmentSolution* SuperWord::pack_alignment_solution(const Node_List* pac // that the packs impose. Remove packs that do not have a compatible solution. void SuperWord::filter_packs_for_alignment() { // We do not need to filter if no alignment is required. - if (!vectors_should_be_aligned()) { + if (!VLoop::vectors_should_be_aligned()) { return; } @@ -1592,20 +1591,12 @@ bool SuperWord::implemented(const Node_List* pack, const uint size) const { } else if (p0->is_Cmp()) { // Cmp -> Bool -> Cmove retValue = UseVectorCmov; - } else if (requires_long_to_int_conversion(opc)) { - // Java API for Long.bitCount/numberOfLeadingZeros/numberOfTrailingZeros - // returns int type, but Vector API for them returns long type. To unify - // the implementation in backend, superword splits the vector implementation - // for Java API into an execution node with long type plus another node - // converting long to int. + } else if (VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(opc)) { + // Requires extra vector long -> int conversion. retValue = VectorNode::implemented(opc, size, T_LONG) && VectorCastNode::implemented(Op_ConvL2I, size, T_LONG, T_INT); } else { - // Vector unsigned right shift for signed subword types behaves differently - // from Java Spec. But when the shift amount is a constant not greater than - // the number of sign extended bits, the unsigned right shift can be - // vectorized to a signed right shift. - if (VectorNode::can_transform_shift_op(p0, velt_basic_type(p0))) { + if (VectorNode::can_use_RShiftI_instead_of_URShiftI(p0, velt_basic_type(p0))) { opc = Op_RShiftI; } retValue = VectorNode::implemented(opc, size, velt_basic_type(p0)); @@ -1630,36 +1621,87 @@ uint SuperWord::max_implemented_size(const Node_List* pack) { } } -// Java API for Long.bitCount/numberOfLeadingZeros/numberOfTrailingZeros -// returns int type, but Vector API for them returns long type. To unify -// the implementation in backend, superword splits the vector implementation -// for Java API into an execution node with long type plus another node -// converting long to int. -bool SuperWord::requires_long_to_int_conversion(int opc) { - switch(opc) { - case Op_PopCountL: - case Op_CountLeadingZerosL: - case Op_CountTrailingZerosL: - return true; - default: - return false; +// If the j-th input for all nodes in the pack is the same input: return it, else nullptr. +Node* PackSet::same_inputs_at_index_or_null(const Node_List* pack, const int index) const { + Node* p0_in = pack->at(0)->in(index); + for (uint i = 1; i < pack->size(); i++) { + if (pack->at(i)->in(index) != p0_in) { + return nullptr; // not same + } } + return p0_in; } -//------------------------------same_inputs-------------------------- -// For pack p, are all idx operands the same? -bool SuperWord::same_inputs(const Node_List* p, int idx) const { - Node* p0 = p->at(0); - uint vlen = p->size(); - Node* p0_def = p0->in(idx); - for (uint i = 1; i < vlen; i++) { - Node* pi = p->at(i); - Node* pi_def = pi->in(idx); - if (p0_def != pi_def) { - return false; +VTransformBoolTest PackSet::get_bool_test(const Node_List* bool_pack) const { + BoolNode* bol = bool_pack->at(0)->as_Bool(); + BoolTest::mask mask = bol->_test._test; + bool is_negated = false; + assert(mask == BoolTest::eq || + mask == BoolTest::ne || + mask == BoolTest::ge || + mask == BoolTest::gt || + mask == BoolTest::lt || + mask == BoolTest::le, + "Bool should be one of: eq, ne, ge, gt, lt, le"); + +#ifdef ASSERT + for (uint j = 0; j < bool_pack->size(); j++) { + Node* m = bool_pack->at(j); + assert(m->as_Bool()->_test._test == mask, + "all bool nodes must have same test"); + } +#endif + + CmpNode* cmp0 = bol->in(1)->as_Cmp(); + assert(get_pack(cmp0) != nullptr, "Bool must have matching Cmp pack"); + + if (cmp0->Opcode() == Op_CmpF || cmp0->Opcode() == Op_CmpD) { + // If we have a Float or Double comparison, we must be careful with + // handling NaN's correctly. CmpF and CmpD have a return code, as + // they are based on the java bytecodes fcmpl/dcmpl: + // -1: cmp_in1 < cmp_in2, or at least one of the two is a NaN + // 0: cmp_in1 == cmp_in2 (no NaN) + // 1: cmp_in1 > cmp_in2 (no NaN) + // + // The "mask" selects which of the [-1, 0, 1] cases lead to "true". + // + // Note: ordered (O) comparison returns "false" if either input is NaN. + // unordered (U) comparison returns "true" if either input is NaN. + // + // The VectorMaskCmpNode does a comparison directly on in1 and in2, in the java + // standard way (all comparisons are ordered, except NEQ is unordered). + // + // In the following, "mask" already matches the cmp code for VectorMaskCmpNode: + // BoolTest::eq: Case 0 -> EQ_O + // BoolTest::ne: Case -1, 1 -> NEQ_U + // BoolTest::ge: Case 0, 1 -> GE_O + // BoolTest::gt: Case 1 -> GT_O + // + // But the lt and le comparisons must be converted from unordered to ordered: + // BoolTest::lt: Case -1 -> LT_U -> VectorMaskCmp would interpret lt as LT_O + // BoolTest::le: Case -1, 0 -> LE_U -> VectorMaskCmp would interpret le as LE_O + // + if (mask == BoolTest::lt || mask == BoolTest::le) { + // Negating the mask gives us the negated result, since all non-NaN cases are + // negated, and the unordered (U) comparisons are turned into ordered (O) comparisons. + // VectorMaskCmp(LT_U, in1_cmp, in2_cmp) + // <==> NOT VectorMaskCmp(GE_O, in1_cmp, in2_cmp) + // VectorMaskCmp(LE_U, in1_cmp, in2_cmp) + // <==> NOT VectorMaskCmp(GT_O, in1_cmp, in2_cmp) + // + // When a VectorBlend uses the negated mask, it can simply swap its blend-inputs: + // VectorBlend( VectorMaskCmp(LT_U, in1_cmp, in2_cmp), in1_blend, in2_blend) + // <==> VectorBlend(NOT VectorMaskCmp(GE_O, in1_cmp, in2_cmp), in1_blend, in2_blend) + // <==> VectorBlend( VectorMaskCmp(GE_O, in1_cmp, in2_cmp), in2_blend, in1_blend) + // VectorBlend( VectorMaskCmp(LE_U, in1_cmp, in2_cmp), in1_blend, in2_blend) + // <==> VectorBlend(NOT VectorMaskCmp(GT_O, in1_cmp, in2_cmp), in1_blend, in2_blend) + // <==> VectorBlend( VectorMaskCmp(GT_O, in1_cmp, in2_cmp), in2_blend, in1_blend) + mask = bol->_test.negate(); + is_negated = true; } } - return true; + + return VTransformBoolTest(mask, is_negated); } //------------------------------profitable--------------------------- @@ -1696,10 +1738,9 @@ bool SuperWord::profitable(const Node_List* p) const { // case (different shift counts) because it is not supported yet. Node* cnt = p0->in(2); Node_List* cnt_pk = get_pack(cnt); - if (cnt_pk != nullptr) - return false; - if (!same_inputs(p, 2)) + if (cnt_pk != nullptr || _packset.same_inputs_at_index_or_null(p, 2) == nullptr) { return false; + } } if (!p0->is_Store()) { // For now, return false if not all uses are vector. @@ -2042,7 +2083,9 @@ class PacksetGraph { } }; -// The C2 graph (specifically the memory graph), needs to be re-ordered. +// We want to replace the packed scalars from the PackSet and replace them +// with vector operations. This requires scheduling and re-ordering the memory +// graph. We take these steps: // (1) Build the PacksetGraph. It combines the dependency graph with the // packset. The PacksetGraph gives us the dependencies that must be // respected after scheduling. @@ -2050,10 +2093,11 @@ class PacksetGraph { // a linear order of all memops in the body. The order respects the // dependencies of the PacksetGraph. // (3) If the PacksetGraph has cycles, we cannot schedule. Abort. -// (4) Use the memops_schedule to re-order the memops in all slices. -void SuperWord::schedule() { - if (_packset.length() == 0) { - return; // empty packset +// (4) Apply the vectorization, including re-ordering the memops and replacing +// packed scalars with vector operations. +bool SuperWord::schedule_and_apply() { + if (_packset.is_empty()) { + return false; } ResourceMark rm; @@ -2079,27 +2123,40 @@ void SuperWord::schedule() { } #endif _packset.clear(); - return; + return false; } -#ifndef PRODUCT - if (is_trace_superword_info()) { - tty->print_cr("SuperWord::schedule: memops_schedule:"); - memops_schedule.dump(); - } -#endif + // (4) Apply the vectorization, including re-ordering the memops. + return apply(memops_schedule); +} +bool SuperWord::apply(Node_List& memops_schedule) { + Compile* C = phase()->C; CountedLoopNode* cl = lpt()->_head->as_CountedLoop(); - phase()->C->print_method(PHASE_SUPERWORD1_BEFORE_SCHEDULE, 4, cl); + C->print_method(PHASE_AUTO_VECTORIZATION1_BEFORE_APPLY, 4, cl); - // (4) Use the memops_schedule to re-order the memops in all slices. - schedule_reorder_memops(memops_schedule); -} + apply_memops_reordering_with_schedule(memops_schedule); + C->print_method(PHASE_AUTO_VECTORIZATION2_AFTER_REORDER, 4, cl); + + adjust_pre_loop_limit_to_align_main_loop_vectors(); + C->print_method(PHASE_AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, 4, cl); + + bool is_success = apply_vectorization(); + C->print_method(PHASE_AUTO_VECTORIZATION4_AFTER_APPLY, 4, cl); + return is_success; +} // Reorder the memory graph for all slices in parallel. We walk over the schedule once, // and track the current memory state of each slice. -void SuperWord::schedule_reorder_memops(Node_List &memops_schedule) { +void SuperWord::apply_memops_reordering_with_schedule(Node_List& memops_schedule) { +#ifndef PRODUCT + if (is_trace_superword_info()) { + tty->print_cr("\nSuperWord::apply_memops_reordering_with_schedule:"); + memops_schedule.dump(); + } +#endif + int max_slices = phase()->C->num_alias_types(); // When iterating over the memops_schedule, we keep track of the current memory state, // which is the Phi or a store in the loop. @@ -2180,32 +2237,24 @@ void SuperWord::schedule_reorder_memops(Node_List &memops_schedule) { } } -//------------------------------output--------------------------- // Convert packs into vector node operations // At this point, all correctness and profitability checks have passed. // We start the irreversible process of editing the C2 graph. Should // there be an unexpected situation (assert fails), then we can only // bail out of the compilation, as the graph has already been partially // modified. We bail out, and retry without SuperWord. -bool SuperWord::output() { +bool SuperWord::apply_vectorization() { CountedLoopNode *cl = lpt()->_head->as_CountedLoop(); assert(cl->is_main_loop(), "SLP should only work on main loops"); Compile* C = phase()->C; - if (_packset.is_empty()) { - return false; - } + assert(!_packset.is_empty(), "vectorization requires non-empty packset"); #ifndef PRODUCT if (TraceLoopOpts) { - tty->print("SuperWord::output "); + tty->print("SuperWord::apply_vectorization "); lpt()->dump_head(); } #endif - phase()->C->print_method(PHASE_SUPERWORD2_BEFORE_OUTPUT, 4, cl); - - adjust_pre_loop_limit_to_align_main_loop_vectors(); - - DEBUG_ONLY(verify_no_extract()); uint max_vlen_in_bytes = 0; uint max_vlen = 0; @@ -2214,7 +2263,7 @@ bool SuperWord::output() { Node* n = body().at(i); Node_List* p = get_pack(n); if (p != nullptr && n == p->at(p->size()-1)) { - // After schedule_reorder_memops, we know that the memops have the same order in the pack + // After apply_memops_reordering_with_schedule, we know that the memops have the same order in the pack // as in the memory slice. Hence, "first" is the first memop in the slice from the pack, // and "n" is the last node in the slice from the pack. Node* first = p->at(0); @@ -2294,79 +2343,32 @@ bool SuperWord::output() { BoolNode* bol = n->in(1)->as_Bool(); assert(bol != nullptr, "must have Bool above CMove"); - BoolTest::mask bol_test = bol->_test._test; - assert(bol_test == BoolTest::eq || - bol_test == BoolTest::ne || - bol_test == BoolTest::ge || - bol_test == BoolTest::gt || - bol_test == BoolTest::lt || - bol_test == BoolTest::le, - "CMove bool should be one of: eq,ne,ge,ge,lt,le"); - Node_List* p_bol = get_pack(bol); - assert(p_bol != nullptr, "CMove must have matching Bool pack"); - -#ifdef ASSERT - for (uint j = 0; j < p_bol->size(); j++) { - Node* m = p_bol->at(j); - assert(m->as_Bool()->_test._test == bol_test, - "all bool nodes must have same test"); - } -#endif + Node_List* bool_pack = get_pack(bol); + assert(bool_pack != nullptr, "CMove must have matching Bool pack"); CmpNode* cmp = bol->in(1)->as_Cmp(); assert(cmp != nullptr, "must have cmp above CMove"); - Node_List* p_cmp = get_pack(cmp); - assert(p_cmp != nullptr, "Bool must have matching Cmp pack"); + Node_List* cmp_pack = get_pack(cmp); + assert(cmp_pack != nullptr, "Bool must have matching Cmp pack"); - Node* cmp_in1 = vector_opd(p_cmp, 1); - Node* cmp_in2 = vector_opd(p_cmp, 2); + Node* cmp_in1 = vector_opd(cmp_pack, 1); + Node* cmp_in2 = vector_opd(cmp_pack, 2); Node* blend_in1 = vector_opd(p, 2); Node* blend_in2 = vector_opd(p, 3); - if (cmp->Opcode() == Op_CmpF || cmp->Opcode() == Op_CmpD) { - // If we have a Float or Double comparison, we must be careful with - // handling NaN's correctly. CmpF and CmpD have a return code, as - // they are based on the java bytecodes fcmpl/dcmpl: - // -1: cmp_in1 < cmp_in2, or at least one of the two is a NaN - // 0: cmp_in1 == cmp_in2 (no NaN) - // 1: cmp_in1 > cmp_in2 (no NaN) - // - // The "bol_test" selects which of the [-1, 0, 1] cases lead to "true". - // - // Note: ordered (O) comparison returns "false" if either input is NaN. - // unordered (U) comparison returns "true" if either input is NaN. - // - // The VectorMaskCmpNode does a comparison directly on in1 and in2, in the java - // standard way (all comparisons are ordered, except NEQ is unordered). - // - // In the following, "bol_test" already matches the cmp code for VectorMaskCmpNode: - // BoolTest::eq: Case 0 -> EQ_O - // BoolTest::ne: Case -1, 1 -> NEQ_U - // BoolTest::ge: Case 0, 1 -> GE_O - // BoolTest::gt: Case 1 -> GT_O - // - // But the lt and le comparisons must be converted from unordered to ordered: - // BoolTest::lt: Case -1 -> LT_U -> VectorMaskCmp would interpret lt as LT_O - // BoolTest::le: Case -1, 0 -> LE_U -> VectorMaskCmp would interpret le as LE_O - // - if (bol_test == BoolTest::lt || bol_test == BoolTest::le) { - // Negating the bol_test and swapping the blend-inputs leaves all non-NaN cases equal, - // but converts the unordered (U) to an ordered (O) comparison. - // VectorBlend(VectorMaskCmp(LT_U, in1_cmp, in2_cmp), in1_blend, in2_blend) - // <==> VectorBlend(VectorMaskCmp(GE_O, in1_cmp, in2_cmp), in2_blend, in1_blend) - // VectorBlend(VectorMaskCmp(LE_U, in1_cmp, in2_cmp), in1_blend, in2_blend) - // <==> VectorBlend(VectorMaskCmp(GT_O, in1_cmp, in2_cmp), in2_blend, in1_blend) - bol_test = bol->_test.negate(); - swap(blend_in1, blend_in2); - } + VTransformBoolTest bool_test = _packset.get_bool_test(bool_pack); + BoolTest::mask test_mask = bool_test._mask; + if (bool_test._is_negated) { + // We can cancel out the negation by swapping the blend inputs. + swap(blend_in1, blend_in2); } // VectorMaskCmp - ConINode* bol_test_node = igvn().intcon((int)bol_test); + ConINode* test_mask_node = igvn().intcon((int)test_mask); BasicType bt = velt_basic_type(cmp); const TypeVect* vt = TypeVect::make(bt, vlen); - VectorNode* mask = new VectorMaskCmpNode(bol_test, cmp_in1, cmp_in2, bol_test_node, vt); + VectorNode* mask = new VectorMaskCmpNode(test_mask, cmp_in1, cmp_in2, test_mask_node, vt); phase()->register_new_node_with_ctrl_of(mask, p->at(0)); igvn()._worklist.push(mask); @@ -2408,40 +2410,23 @@ bool SuperWord::output() { vlen_in_bytes = in2->as_Vector()->length_in_bytes(); } } else { - // Vector unsigned right shift for signed subword types behaves differently - // from Java Spec. But when the shift amount is a constant not greater than - // the number of sign extended bits, the unsigned right shift can be - // vectorized to a signed right shift. - if (VectorNode::can_transform_shift_op(n, velt_basic_type(n))) { + if (VectorNode::can_use_RShiftI_instead_of_URShiftI(n, velt_basic_type(n))) { opc = Op_RShiftI; } vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n)); vlen_in_bytes = vn->as_Vector()->length_in_bytes(); } - } else if (opc == Op_SqrtF || opc == Op_SqrtD || - opc == Op_AbsF || opc == Op_AbsD || - opc == Op_AbsI || opc == Op_AbsL || - opc == Op_NegF || opc == Op_NegD || - opc == Op_RoundF || opc == Op_RoundD || - opc == Op_ReverseBytesI || opc == Op_ReverseBytesL || - opc == Op_ReverseBytesUS || opc == Op_ReverseBytesS || - opc == Op_ReverseI || opc == Op_ReverseL || - opc == Op_PopCountI || opc == Op_CountLeadingZerosI || - opc == Op_CountTrailingZerosI) { + } else if (VectorNode::is_scalar_unary_op_with_equal_input_and_output_types(opc)) { assert(n->req() == 2, "only one input expected"); Node* in = vector_opd(p, 1); vn = VectorNode::make(opc, in, nullptr, vlen, velt_basic_type(n)); vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else if (requires_long_to_int_conversion(opc)) { - // Java API for Long.bitCount/numberOfLeadingZeros/numberOfTrailingZeros - // returns int type, but Vector API for them returns long type. To unify - // the implementation in backend, superword splits the vector implementation - // for Java API into an execution node with long type plus another node - // converting long to int. + } else if (VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(opc)) { assert(n->req() == 2, "only one input expected"); Node* in = vector_opd(p, 1); Node* longval = VectorNode::make(opc, in, nullptr, vlen, T_LONG); phase()->register_new_node_with_ctrl_of(longval, first); + // Requires extra vector long -> int conversion. vn = VectorCastNode::make(Op_VectorCastL2X, longval, T_INT, vlen); vlen_in_bytes = vn->as_Vector()->length_in_bytes(); } else if (VectorNode::is_convert_opcode(opc)) { @@ -2525,8 +2510,6 @@ bool SuperWord::output() { } } - phase()->C->print_method(PHASE_SUPERWORD3_AFTER_OUTPUT, 4, cl); - return true; } @@ -2537,13 +2520,13 @@ Node* SuperWord::vector_opd(Node_List* p, int opd_idx) { uint vlen = p->size(); Node* opd = p0->in(opd_idx); CountedLoopNode *cl = lpt()->_head->as_CountedLoop(); - bool have_same_inputs = same_inputs(p, opd_idx); + Node* same_input = _packset.same_inputs_at_index_or_null(p, opd_idx); // Insert index population operation to create a vector of increasing // indices starting from the iv value. In some special unrolled loops // (see JDK-8286125), we need scalar replications of the iv value if // all inputs are the same iv, so we do a same inputs check here. - if (opd == iv() && !have_same_inputs) { + if (opd == iv() && same_input == nullptr) { BasicType p0_bt = velt_basic_type(p0); BasicType iv_bt = is_subword_type(p0_bt) ? p0_bt : T_INT; assert(VectorNode::is_populate_index_supported(iv_bt), "Should support"); @@ -2554,7 +2537,7 @@ Node* SuperWord::vector_opd(Node_List* p, int opd_idx) { return vn; } - if (have_same_inputs) { + if (same_input != nullptr) { if (opd->is_Vector() || opd->is_LoadVector()) { if (opd_idx == 2 && VectorNode::is_shift(p0)) { assert(false, "shift's count can't be vector"); @@ -2849,7 +2832,7 @@ bool SuperWord::is_velt_basic_type_compatible_use_def(Node* use, Node* def) cons assert(is_java_primitive(def_bt), "sanity %s", type2name(def_bt)); // Nodes like Long.bitCount: expect long input, and int output. - if (requires_long_to_int_conversion(use->Opcode())) { + if (VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(use->Opcode())) { return type2aelembytes(def_bt) == 8 && type2aelembytes(use_bt) == 4; } @@ -2996,7 +2979,7 @@ VStatus VLoopBody::construct() { BasicType SuperWord::longer_type_for_conversion(Node* n) const { if (!(VectorNode::is_convert_opcode(n->Opcode()) || - requires_long_to_int_conversion(n->Opcode())) || + VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(n->Opcode())) || !in_bb(n->in(1))) { return T_ILLEGAL; } @@ -3173,7 +3156,7 @@ LoadNode::ControlDependency SuperWord::control_dependency(Node_List* p) { // determined by SuperWord::filter_packs_for_alignment(). void SuperWord::determine_mem_ref_and_aw_for_main_loop_alignment() { if (_mem_ref_for_main_loop_alignment != nullptr) { - assert(vectors_should_be_aligned(), "mem_ref only set if filtered for alignment"); + assert(VLoop::vectors_should_be_aligned(), "mem_ref only set if filtered for alignment"); return; } diff --git a/src/hotspot/share/opto/superword.hpp b/src/hotspot/share/opto/superword.hpp index a07cfcd5b18cf..c118b4201171b 100644 --- a/src/hotspot/share/opto/superword.hpp +++ b/src/hotspot/share/opto/superword.hpp @@ -362,6 +362,10 @@ class PackSet : public StackObj { } } + Node* same_inputs_at_index_or_null(const Node_List* pack, const int index) const; + + VTransformBoolTest get_bool_test(const Node_List* bool_pack) const; + private: SplitStatus split_pack(const char* split_name, Node_List* pack, SplitTask task); public: @@ -545,12 +549,6 @@ class SuperWord : public ResourceObj { // Accessors Arena* arena() { return &_arena; } - // should we align vector memory references on this platform? - bool vectors_should_be_aligned() { return !Matcher::misaligned_vectors_ok() || AlignVector; } - - // For pack p, are all idx operands the same? - bool same_inputs(const Node_List* p, int idx) const; - // CloneMap utilities bool same_origin_idx(Node* a, Node* b) const; bool same_generation(Node* a, Node* b) const; @@ -600,13 +598,10 @@ class SuperWord : public ResourceObj { DEBUG_ONLY(void verify_packs() const;) - // Adjust the memory graph for the packed operations - void schedule(); - // Helper function for schedule, that reorders all memops, slice by slice, according to the schedule - void schedule_reorder_memops(Node_List &memops_schedule); - - // Convert packs into vector node operations - bool output(); + bool schedule_and_apply(); + bool apply(Node_List& memops_schedule); + void apply_memops_reordering_with_schedule(Node_List& memops_schedule); + bool apply_vectorization(); // Create a vector operand for the nodes in pack p for operand: in(opd_idx) Node* vector_opd(Node_List* p, int opd_idx); @@ -632,8 +627,6 @@ class SuperWord : public ResourceObj { // Return the longer type for vectorizable type-conversion node or illegal type for other nodes. BasicType longer_type_for_conversion(Node* n) const; - static bool requires_long_to_int_conversion(int opc); - bool is_velt_basic_type_compatible_use_def(Node* use, Node* def) const; static LoadNode::ControlDependency control_dependency(Node_List* p); diff --git a/src/hotspot/share/opto/vectorization.hpp b/src/hotspot/share/opto/vectorization.hpp index 0acc78ed1a109..c9f54594910ab 100644 --- a/src/hotspot/share/opto/vectorization.hpp +++ b/src/hotspot/share/opto/vectorization.hpp @@ -129,6 +129,9 @@ class VLoop : public StackObj { int estimated_body_length() const { return lpt()->_body.size(); }; int estimated_node_count() const { return (int)(1.10 * phase()->C->unique()); }; + // Should we align vector memory references on this platform? + static bool vectors_should_be_aligned() { return !Matcher::misaligned_vectors_ok() || AlignVector; } + #ifndef PRODUCT const VTrace& vtrace() const { return _vtrace; } @@ -1320,4 +1323,12 @@ class AlignmentSolver { #endif }; +struct VTransformBoolTest { + const BoolTest::mask _mask; + const bool _is_negated; + + VTransformBoolTest(const BoolTest::mask mask, bool is_negated) : + _mask(mask), _is_negated(is_negated) {} +}; + #endif // SHARE_OPTO_VECTORIZATION_HPP diff --git a/src/hotspot/share/opto/vectornode.cpp b/src/hotspot/share/opto/vectornode.cpp index d560f112039a3..72b49c043b6b6 100644 --- a/src/hotspot/share/opto/vectornode.cpp +++ b/src/hotspot/share/opto/vectornode.cpp @@ -507,7 +507,11 @@ bool VectorNode::is_shift_opcode(int opc) { } } -bool VectorNode::can_transform_shift_op(Node* n, BasicType bt) { +// Vector unsigned right shift for signed subword types behaves differently +// from Java Spec. But when the shift amount is a constant not greater than +// the number of sign extended bits, the unsigned right shift can be +// vectorized to a signed right shift. +bool VectorNode::can_use_RShiftI_instead_of_URShiftI(Node* n, BasicType bt) { if (n->Opcode() != Op_URShiftI) { return false; } @@ -920,6 +924,50 @@ bool VectorNode::is_vector_bitwise_not_pattern(Node* n) { return false; } +bool VectorNode::is_scalar_unary_op_with_equal_input_and_output_types(int opc) { + switch (opc) { + case Op_SqrtF: + case Op_SqrtD: + case Op_AbsF: + case Op_AbsD: + case Op_AbsI: + case Op_AbsL: + case Op_NegF: + case Op_NegD: + case Op_RoundF: + case Op_RoundD: + case Op_ReverseBytesI: + case Op_ReverseBytesL: + case Op_ReverseBytesUS: + case Op_ReverseBytesS: + case Op_ReverseI: + case Op_ReverseL: + case Op_PopCountI: + case Op_CountLeadingZerosI: + case Op_CountTrailingZerosI: + return true; + default: + return false; + } +} + +// Java API for Long.bitCount/numberOfLeadingZeros/numberOfTrailingZeros +// returns int type, but Vector API for them returns long type. To unify +// the implementation in backend, AutoVectorization splits the vector +// implementation for Java API into an execution node with long type plus +// another node converting long to int. +bool VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(int opc) { + switch (opc) { + case Op_PopCountL: + case Op_CountLeadingZerosL: + case Op_CountTrailingZerosL: + return true; + default: + return false; + } +} + + Node* VectorNode::try_to_gen_masked_vector(PhaseGVN* gvn, Node* node, const TypeVect* vt) { int vopc = node->Opcode(); uint vlen = vt->length(); diff --git a/src/hotspot/share/opto/vectornode.hpp b/src/hotspot/share/opto/vectornode.hpp index 6c5402eb511f5..23ddebaf33889 100644 --- a/src/hotspot/share/opto/vectornode.hpp +++ b/src/hotspot/share/opto/vectornode.hpp @@ -84,7 +84,7 @@ class VectorNode : public TypeNode { static VectorNode* make_mask_node(int vopc, Node* n1, Node* n2, uint vlen, BasicType bt); static bool is_shift_opcode(int opc); - static bool can_transform_shift_op(Node* n, BasicType bt); + static bool can_use_RShiftI_instead_of_URShiftI(Node* n, BasicType bt); static bool is_convert_opcode(int opc); static bool is_minmax_opcode(int opc); @@ -130,6 +130,9 @@ class VectorNode : public TypeNode { return is_vector_shift_count(n->Opcode()); } + static bool is_scalar_unary_op_with_equal_input_and_output_types(int opc); + static bool is_scalar_op_that_returns_int_but_vector_op_returns_long(int opc); + static void trace_new_vector(Node* n, const char* context) { #ifdef ASSERT if (TraceNewVectors) { From 5528ad74902fa4f4ec621d70e7e7d85f4ac1d780 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Thu, 13 Jun 2024 08:38:04 +0000 Subject: [PATCH 052/471] 8334179: VMATreeTest.TestConsistencyWithSimpleTracker_vm runs 50+ seconds Reviewed-by: jsjolen --- test/hotspot/gtest/nmt/test_vmatree.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/hotspot/gtest/nmt/test_vmatree.cpp b/test/hotspot/gtest/nmt/test_vmatree.cpp index a56bd08b0e06e..17eb61352cd0f 100644 --- a/test/hotspot/gtest/nmt/test_vmatree.cpp +++ b/test/hotspot/gtest/nmt/test_vmatree.cpp @@ -358,7 +358,7 @@ struct SimpleVMATracker : public CHeapObj<mtTest> { } }; // Page (4KiB) granular array - static constexpr const size_t num_pages = 1024 * 512; + static constexpr const size_t num_pages = 1024 * 4; Info pages[num_pages]; SimpleVMATracker() @@ -434,8 +434,6 @@ TEST_VM_F(VMATreeTest, TestConsistencyWithSimpleTracker) { const MEMFLAGS candidate_flags[candidates_len_flags] = { mtNMT, mtTest, - mtGC, - mtCompiler }; const int operation_count = 100000; // One hundred thousand From 57b6481449612529615484a313d8b85ccf23e287 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Thu, 13 Jun 2024 12:45:32 +0000 Subject: [PATCH 053/471] 8333277: ubsan: mlib_ImageScanPoly.c:292:43: runtime error: division by zero Reviewed-by: prr --- .../share/native/libmlib_image/mlib_ImageScanPoly.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c index a643b9c111c0a..a6f4cfdd36e4d 100644 --- a/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c +++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -289,13 +289,15 @@ mlib_status mlib_AffineEdges(mlib_affine_param *param, mlib_d64 dX1 = coords[(topIdx - i) & 0x3][0]; mlib_d64 dY2 = coords[(topIdx - i - 1) & 0x3][1]; mlib_d64 dX2 = coords[(topIdx - i - 1) & 0x3][0]; - mlib_d64 x = dX1, slope = (dX2 - dX1) / (dY2 - dY1); + mlib_d64 x = dX1, slope; mlib_s32 y1; mlib_s32 y2; if (dY1 == dY2) continue; + slope = (dX2 - dX1) / (dY2 - dY1); + if (!(IS_FINITE(slope))) { continue; } @@ -330,13 +332,15 @@ mlib_status mlib_AffineEdges(mlib_affine_param *param, mlib_d64 dX1 = coords[(topIdx + i) & 0x3][0]; mlib_d64 dY2 = coords[(topIdx + i + 1) & 0x3][1]; mlib_d64 dX2 = coords[(topIdx + i + 1) & 0x3][0]; - mlib_d64 x = dX1, slope = (dX2 - dX1) / (dY2 - dY1); + mlib_d64 x = dX1, slope; mlib_s32 y1; mlib_s32 y2; if (dY1 == dY2) continue; + slope = (dX2 - dX1) / (dY2 - dY1); + if (!(IS_FINITE(slope))) { continue; } From f8c657f6716c0de747be16814b55c3886bedf2d2 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Thu, 13 Jun 2024 13:13:19 +0000 Subject: [PATCH 054/471] 8334123: log the opening of Type 1 fonts Reviewed-by: prr --- src/java.desktop/share/classes/sun/font/Type1Font.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/java.desktop/share/classes/sun/font/Type1Font.java b/src/java.desktop/share/classes/sun/font/Type1Font.java index 1cd046eadd177..cc36c193de030 100644 --- a/src/java.desktop/share/classes/sun/font/Type1Font.java +++ b/src/java.desktop/share/classes/sun/font/Type1Font.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -187,7 +187,9 @@ public Type1Font(String platname, Object nativeNames, boolean createdCopy) private synchronized ByteBuffer getBuffer() throws FontFormatException { ByteBuffer bbuf = bufferRef.get(); if (bbuf == null) { - //System.out.println("open T1 " + platName); + if (FontUtilities.isLogging()) { + FontUtilities.logInfo("open Type 1 font: " + platName); + } try { @SuppressWarnings("removal") RandomAccessFile raf = (RandomAccessFile) @@ -229,6 +231,9 @@ protected void close() { void readFile(ByteBuffer buffer) { RandomAccessFile raf = null; FileChannel fc; + if (FontUtilities.isLogging()) { + FontUtilities.logInfo("open Type 1 font: " + platName); + } try { raf = (RandomAccessFile) java.security.AccessController.doPrivileged( From f5213671f7b636b32bb93c78e43696a61cd69bae Mon Sep 17 00:00:00 2001 From: Christoph Langer <clanger@openjdk.org> Date: Thu, 13 Jun 2024 13:14:54 +0000 Subject: [PATCH 055/471] 8211847: [aix] java/lang/ProcessHandle/InfoTest.java fails: "reported cputime less than expected" Reviewed-by: stuefe --- test/jdk/ProblemList.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index da674d6a0471d..bc460990c1e9a 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -486,7 +486,6 @@ java/beans/XMLEncoder/Test6570354.java 8015593 macosx-all # jdk_lang -java/lang/ProcessHandle/InfoTest.java 8211847 aix-ppc64 java/lang/invoke/LFCaching/LFMultiThreadCachingTest.java 8151492 generic-all java/lang/invoke/LFCaching/LFGarbageCollectedTest.java 8078602 generic-all java/lang/invoke/lambda/LambdaFileEncodingSerialization.java 8249079 linux-all From 9d8439c10780c3a0169c2675955a0506518f44fb Mon Sep 17 00:00:00 2001 From: Christoph Langer <clanger@openjdk.org> Date: Thu, 13 Jun 2024 13:16:38 +0000 Subject: [PATCH 056/471] 8211854: [aix] java/net/ServerSocket/AcceptInheritHandle.java fails: read times out Reviewed-by: dfuchs, jpai --- test/jdk/ProblemList.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index bc460990c1e9a..4ea08fa2bbc18 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -551,8 +551,6 @@ java/net/MulticastSocket/SetLoopbackMode.java 7122846,8308807 java/net/MulticastSocket/SetOutgoingIf.java 8308807 aix-ppc64 java/net/MulticastSocket/Test.java 7145658,8308807 macosx-all,aix-ppc64 -java/net/ServerSocket/AcceptInheritHandle.java 8211854 aix-ppc64 - java/net/Socket/asyncClose/Race.java 8317801 aix-ppc64 ############################################################################ From 0d3a3771c3777d3dd1fec8dc8faed5fd02b06830 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Thu, 13 Jun 2024 14:02:01 +0000 Subject: [PATCH 057/471] 8333887: ubsan: unsafe.cpp:247:13: runtime error: store to null pointer of type 'volatile int' Reviewed-by: lucy, mdoerr --- src/hotspot/share/prims/unsafe.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/hotspot/share/prims/unsafe.cpp b/src/hotspot/share/prims/unsafe.cpp index 880f1f6ab5d56..d290627c1972d 100644 --- a/src/hotspot/share/prims/unsafe.cpp +++ b/src/hotspot/share/prims/unsafe.cpp @@ -242,6 +242,11 @@ class MemoryAccess : StackObj { return normalize_for_read(*addr()); } + // we use this method at some places for writing to 0 e.g. to cause a crash; + // ubsan does not know that this is the desired behavior +#if defined(__clang__) || defined(__GNUC__) +__attribute__((no_sanitize("undefined"))) +#endif void put(T x) { GuardUnsafeAccess guard(_thread); *addr() = normalize_for_write(x); From 9ed8629e5d5e7b811c354cc1daf1ce5429eb184e Mon Sep 17 00:00:00 2001 From: Jayathirth D V <jdv@openjdk.org> Date: Thu, 13 Jun 2024 15:50:53 +0000 Subject: [PATCH 058/471] 8333801: Typos in @code references of BufferedImage and JTableHeader Reviewed-by: abhiscxk, prr --- .../share/classes/java/awt/image/BufferedImage.java | 8 ++++---- .../share/classes/javax/swing/table/JTableHeader.java | 4 ++-- test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java | 5 ++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/java.desktop/share/classes/java/awt/image/BufferedImage.java b/src/java.desktop/share/classes/java/awt/image/BufferedImage.java index 43f0959158db7..cfbebd68710a4 100644 --- a/src/java.desktop/share/classes/java/awt/image/BufferedImage.java +++ b/src/java.desktop/share/classes/java/awt/image/BufferedImage.java @@ -899,7 +899,7 @@ public WritableRaster getAlphaRaster() { * * <p> * - * An {@code ArrayOutOfBoundsException} may be thrown + * An {@code ArrayIndexOutOfBoundsException} may be thrown * if the coordinates are not in bounds. * However, explicit bounds checking is not guaranteed. * @@ -933,7 +933,7 @@ public int getRGB(int x, int y) { * * <p> * - * An {@code ArrayOutOfBoundsException} may be thrown + * An {@code ArrayIndexOutOfBoundsException} may be thrown * if the region is not in bounds. * However, explicit bounds checking is not guaranteed. * @@ -1003,7 +1003,7 @@ public int[] getRGB(int startX, int startY, int w, int h, * * <p> * - * An {@code ArrayOutOfBoundsException} may be thrown + * An {@code ArrayIndexOutOfBoundsException} may be thrown * if the coordinates are not in bounds. * However, explicit bounds checking is not guaranteed. * @@ -1033,7 +1033,7 @@ public void setRGB(int x, int y, int rgb) { * * <p> * - * An {@code ArrayOutOfBoundsException} may be thrown + * An {@code ArrayIndexOutOfBoundsException} may be thrown * if the region is not in bounds. * However, explicit bounds checking is not guaranteed. * diff --git a/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java b/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java index 6424846d3d069..6372d6bc4ab5d 100644 --- a/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java +++ b/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java @@ -951,7 +951,7 @@ public AccessibleContext getAccessibleContext() { private AccessibleContext getCurrentAccessibleContext() { TableColumnModel tcm = table.getColumnModel(); if (tcm != null) { - // Fixes 4772355 - ArrayOutOfBoundsException in + // Fixes 4772355 - ArrayIndexOutOfBoundsException in // JTableHeader if (column < 0 || column >= tcm.getColumnCount()) { return null; @@ -979,7 +979,7 @@ private AccessibleContext getCurrentAccessibleContext() { private Component getCurrentComponent() { TableColumnModel tcm = table.getColumnModel(); if (tcm != null) { - // Fixes 4772355 - ArrayOutOfBoundsException in + // Fixes 4772355 - ArrayIndexOutOfBoundsException in // JTableHeader if (column < 0 || column >= tcm.getColumnCount()) { return null; diff --git a/test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java b/test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java index 6cf6231bb8b30..4f338601dc690 100644 --- a/test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java +++ b/test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,8 +30,7 @@ * @test * @key headful * @bug 4361477 - * @summary JTabbedPane throws ArrayOutOfBoundsException - * @author Oleg Mokhovikov + * @summary JTabbedPane throws ArrayIndexOutOfBoundsException * @run main bug4361477 */ public class bug4361477 { From 814cf8793097ef03a15068589c22a59ac5966430 Mon Sep 17 00:00:00 2001 From: Larry Cable <larry.cable@oracle.com> Date: Thu, 13 Jun 2024 16:28:04 +0000 Subject: [PATCH 059/471] 8313562: hsperfdata should export module path and "launcher" metadata Reviewed-by: dholmes, kevinw --- src/hotspot/share/runtime/statSampler.cpp | 17 +++++++++++++++++ src/hotspot/share/runtime/statSampler.hpp | 1 + 2 files changed, 18 insertions(+) diff --git a/src/hotspot/share/runtime/statSampler.cpp b/src/hotspot/share/runtime/statSampler.cpp index 5d2e102ada4d2..5fd038bf845c1 100644 --- a/src/hotspot/share/runtime/statSampler.cpp +++ b/src/hotspot/share/runtime/statSampler.cpp @@ -228,6 +228,19 @@ void StatSampler::add_property_constant(CounterNS name_space, const char* name, add_property_constant(name_space, name, Arguments::get_property(name), CHECK); } +/* + * Adds a string constant of the given property. Retrieves the value via + * Arguments::get_property() and asserts the value for the does not differ from + * the value retrievable from System.getProperty() + */ +void StatSampler::add_optional_property_constant(CounterNS name_space, const char* name, TRAPS) { + const char* value = Arguments::get_property(name); + + if (value != nullptr) { + add_property_constant(name_space, name, value, CHECK); + } +} + /* * Method to create PerfStringConstants containing the values of various * system properties. Constants are created from information known to HotSpot, @@ -260,6 +273,10 @@ void StatSampler::create_system_property_instrumentation(TRAPS) { add_property_constant(JAVA_PROPERTY, "java.library.path", CHECK); add_property_constant(JAVA_PROPERTY, "java.class.path", CHECK); add_property_constant(JAVA_PROPERTY, "java.home", CHECK); + + add_optional_property_constant(JAVA_PROPERTY, "jdk.module.path", CHECK); + add_optional_property_constant(JAVA_PROPERTY, "jdk.module.upgrade.path", CHECK); + add_optional_property_constant(JAVA_PROPERTY, "jdk.module.main", CHECK); } /* diff --git a/src/hotspot/share/runtime/statSampler.hpp b/src/hotspot/share/runtime/statSampler.hpp index a26f9743e0c61..00daa5d95c0bc 100644 --- a/src/hotspot/share/runtime/statSampler.hpp +++ b/src/hotspot/share/runtime/statSampler.hpp @@ -53,6 +53,7 @@ class StatSampler : AllStatic { static void sample_data(PerfDataList* list); static void assert_system_property(const char* name, const char* value, TRAPS); static void add_property_constant(CounterNS name_space, const char* name, TRAPS); + static void add_optional_property_constant(CounterNS name_space, const char* name, TRAPS); static void add_property_constant(CounterNS name_space, const char* name, const char* value, TRAPS); static void create_system_property_instrumentation(TRAPS); From cff048c7354dd947a3946d262f4752a55b7e2a43 Mon Sep 17 00:00:00 2001 From: Viktor Klang <vklang@openjdk.org> Date: Thu, 13 Jun 2024 16:30:27 +0000 Subject: [PATCH 060/471] 8334162: Gatherer.defaultCombiner has an erronous @see-link Reviewed-by: jpai, alanb --- src/java.base/share/classes/java/util/stream/Gatherer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/stream/Gatherer.java b/src/java.base/share/classes/java/util/stream/Gatherer.java index ced746cd67356..40c3c682e73f1 100644 --- a/src/java.base/share/classes/java/util/stream/Gatherer.java +++ b/src/java.base/share/classes/java/util/stream/Gatherer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -293,7 +293,7 @@ static <A> Supplier<A> defaultInitializer() { * * @implSpec This method always returns the same instance. * - * @see Gatherer#finisher() + * @see Gatherer#combiner() * @return the instance of the default combiner * @param <A> the type of the state of the returned combiner */ From b09a45163ccc566b4f7653c2e9030e359396c90f Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Thu, 13 Jun 2024 18:11:36 +0000 Subject: [PATCH 061/471] 8333840: C2 SuperWord: wrong result for MulAddS2I when inputs permuted Reviewed-by: kvn, chagedorn --- src/hotspot/share/opto/superword.cpp | 59 +++++++++- src/hotspot/share/opto/superword.hpp | 3 +- .../loopopts/superword/TestMulAddS2I.java | 111 ++++++++++++++---- 3 files changed, 141 insertions(+), 32 deletions(-) diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp index e71a602620958..5cd4341c42d0d 100644 --- a/src/hotspot/share/opto/superword.cpp +++ b/src/hotspot/share/opto/superword.cpp @@ -2794,11 +2794,7 @@ bool SuperWord::is_vector_use(Node* use, int u_idx) const { } if (VectorNode::is_muladds2i(use)) { - // MulAddS2I takes shorts and produces ints. - if (u_pk->size() * 2 != d_pk->size()) { - return false; - } - return true; + return _packset.is_muladds2i_pack_with_pack_inputs(u_pk); } if (u_pk->size() != d_pk->size()) { @@ -2815,6 +2811,59 @@ bool SuperWord::is_vector_use(Node* use, int u_idx) const { return true; } +// MulAddS2I takes 4 shorts and produces an int. We can reinterpret +// the 4 shorts as two ints: a = (a0, a1) and b = (b0, b1). +// +// Inputs: 1 2 3 4 +// Offsets: 0 0 1 1 +// v = MulAddS2I(a, b) = a0 * b0 + a1 * b1 +// +// But permutations are possible, because add and mul are commutative. For +// simplicity, the first input is always either a0 or a1. These are all +// the possible permutations: +// +// v = MulAddS2I(a, b) = a0 * b0 + a1 * b1 (case 1) +// v = MulAddS2I(a, b) = a0 * b0 + b1 * a1 (case 2) +// v = MulAddS2I(a, b) = a1 * b1 + a0 * b0 (case 3) +// v = MulAddS2I(a, b) = a1 * b1 + b0 * a0 (case 4) +// +// To vectorize, we expect (a0, a1) to be consecutive in one input pack, +// and (b0, b1) in the other input pack. Thus, both a and b are strided, +// with stride = 2. Further, a0 and b0 have offset 0, whereas a1 and b1 +// have offset 1. +bool PackSet::is_muladds2i_pack_with_pack_inputs(const Node_List* pack) const { + assert(VectorNode::is_muladds2i(pack->at(0)), "must be MulAddS2I"); + + bool pack1_has_offset_0 = (strided_pack_input_at_index_or_null(pack, 1, 2, 0) != nullptr); + Node_List* pack1 = strided_pack_input_at_index_or_null(pack, 1, 2, pack1_has_offset_0 ? 0 : 1); + Node_List* pack2 = strided_pack_input_at_index_or_null(pack, 2, 2, pack1_has_offset_0 ? 0 : 1); + Node_List* pack3 = strided_pack_input_at_index_or_null(pack, 3, 2, pack1_has_offset_0 ? 1 : 0); + Node_List* pack4 = strided_pack_input_at_index_or_null(pack, 4, 2, pack1_has_offset_0 ? 1 : 0); + + return pack1 != nullptr && + pack2 != nullptr && + pack3 != nullptr && + pack4 != nullptr && + ((pack1 == pack3 && pack2 == pack4) || // case 1 or 3 + (pack1 == pack4 && pack2 == pack3)); // case 2 or 4 +} + +Node_List* PackSet::strided_pack_input_at_index_or_null(const Node_List* pack, const int index, const int stride, const int offset) const { + Node* def0 = pack->at(0)->in(index); + + Node_List* pack_in = get_pack(def0); + if (pack_in == nullptr || pack->size() * stride != pack_in->size()) { + return nullptr; // size mismatch + } + + for (uint i = 1; i < pack->size(); i++) { + if (pack->at(i)->in(index) != pack_in->at(i * stride + offset)) { + return nullptr; // use-def mismatch + } + } + return pack_in; +} + // Check if the output type of def is compatible with the input type of use, i.e. if the // types have the same size. bool SuperWord::is_velt_basic_type_compatible_use_def(Node* use, Node* def) const { diff --git a/src/hotspot/share/opto/superword.hpp b/src/hotspot/share/opto/superword.hpp index c118b4201171b..fb91d014faebb 100644 --- a/src/hotspot/share/opto/superword.hpp +++ b/src/hotspot/share/opto/superword.hpp @@ -362,8 +362,9 @@ class PackSet : public StackObj { } } + Node_List* strided_pack_input_at_index_or_null(const Node_List* pack, const int index, const int stride, const int offset) const; + bool is_muladds2i_pack_with_pack_inputs(const Node_List* pack) const; Node* same_inputs_at_index_or_null(const Node_List* pack, const int index) const; - VTransformBoolTest get_bool_test(const Node_List* bool_pack) const; private: diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java index 4521d43804b86..578d4ee8bdb4d 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java @@ -41,7 +41,6 @@ public class TestMulAddS2I { static short[] sArr1 = new short[RANGE]; static short[] sArr2 = new short[RANGE]; - static int[] ioutArr = new int[RANGE]; static final int[] GOLDEN_A; static final int[] GOLDEN_B; static final int[] GOLDEN_C; @@ -50,6 +49,10 @@ public class TestMulAddS2I { static final int[] GOLDEN_F; static final int[] GOLDEN_G; static final int[] GOLDEN_H; + static final int[] GOLDEN_I; + static final int[] GOLDEN_J; + static final int[] GOLDEN_K; + static final int[] GOLDEN_L; static { for (int i = 0; i < RANGE; i++) { @@ -58,12 +61,16 @@ public class TestMulAddS2I { } GOLDEN_A = testa(); GOLDEN_B = testb(); - GOLDEN_C = testc(); - GOLDEN_D = testd(); - GOLDEN_E = teste(); - GOLDEN_F = testf(); - GOLDEN_G = testg(); - GOLDEN_H = testh(); + GOLDEN_C = testc(new int[ITER]); + GOLDEN_D = testd(new int[ITER]); + GOLDEN_E = teste(new int[ITER]); + GOLDEN_F = testf(new int[ITER]); + GOLDEN_G = testg(new int[ITER]); + GOLDEN_H = testh(new int[ITER]); + GOLDEN_I = testi(new int[ITER]); + GOLDEN_J = testj(new int[ITER]); + GOLDEN_K = testk(new int[ITER]); + GOLDEN_L = testl(new int[ITER]); } @@ -72,17 +79,22 @@ public static void main(String[] args) { TestFramework.runWithFlags("-XX:-AlignVector"); } - @Run(test = {"testa", "testb", "testc", "testd", "teste", "testf", "testg", "testh"}) + @Run(test = {"testa", "testb", "testc", "testd", "teste", "testf", "testg", "testh", + "testi", "testj", "testk", "testl"}) @Warmup(0) public static void run() { compare(testa(), GOLDEN_A, "testa"); compare(testb(), GOLDEN_B, "testb"); - compare(testc(), GOLDEN_C, "testc"); - compare(testd(), GOLDEN_D, "testd"); - compare(teste(), GOLDEN_E, "teste"); - compare(testf(), GOLDEN_F, "testf"); - compare(testg(), GOLDEN_G, "testg"); - compare(testh(), GOLDEN_H, "testh"); + compare(testc(new int[ITER]), GOLDEN_C, "testc"); + compare(testd(new int[ITER]), GOLDEN_D, "testd"); + compare(teste(new int[ITER]), GOLDEN_E, "teste"); + compare(testf(new int[ITER]), GOLDEN_F, "testf"); + compare(testg(new int[ITER]), GOLDEN_G, "testg"); + compare(testh(new int[ITER]), GOLDEN_H, "testh"); + compare(testi(new int[ITER]), GOLDEN_I, "testi"); + compare(testj(new int[ITER]), GOLDEN_J, "testj"); + compare(testk(new int[ITER]), GOLDEN_K, "testk"); + compare(testl(new int[ITER]), GOLDEN_L, "testl"); } public static void compare(int[] out, int[] golden, String name) { @@ -138,8 +150,7 @@ public static int[] testb() { counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"}) @IR(applyIfCPUFeature = {"avx512_vnni", "true"}, counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"}) - public static int[] testc() { - int[] out = new int[ITER]; + public static int[] testc(int[] out) { for (int i = 0; i < ITER; i++) { out[i] += ((sArr1[2*i] * sArr2[2*i]) + (sArr1[2*i+1] * sArr2[2*i+1])); } @@ -155,8 +166,7 @@ public static int[] testc() { counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"}) @IR(applyIfCPUFeature = {"avx512_vnni", "true"}, counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"}) - public static int[] testd() { - int[] out = ioutArr; + public static int[] testd(int[] out) { for (int i = 0; i < ITER-2; i+=2) { // Unrolled, with the same structure. out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); @@ -174,8 +184,7 @@ public static int[] testd() { counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"}) @IR(applyIfCPUFeature = {"avx512_vnni", "true"}, counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"}) - public static int[] teste() { - int[] out = ioutArr; + public static int[] teste(int[] out) { for (int i = 0; i < ITER-2; i+=2) { // Unrolled, with some swaps. out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); @@ -193,8 +202,7 @@ public static int[] teste() { counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"}) @IR(applyIfCPUFeature = {"avx512_vnni", "true"}, counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"}) - public static int[] testf() { - int[] out = ioutArr; + public static int[] testf(int[] out) { for (int i = 0; i < ITER-2; i+=2) { // Unrolled, with some swaps. out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); @@ -212,8 +220,7 @@ public static int[] testf() { counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"}) @IR(applyIfCPUFeature = {"avx512_vnni", "true"}, counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"}) - public static int[] testg() { - int[] out = ioutArr; + public static int[] testg(int[] out) { for (int i = 0; i < ITER-2; i+=2) { // Unrolled, with some swaps. out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); @@ -231,8 +238,7 @@ public static int[] testg() { counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"}) @IR(applyIfCPUFeature = {"avx512_vnni", "true"}, counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"}) - public static int[] testh() { - int[] out = ioutArr; + public static int[] testh(int[] out) { for (int i = 0; i < ITER-2; i+=2) { // Unrolled, with some swaps. out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); @@ -240,4 +246,57 @@ public static int[] testh() { } return out; } + + @Test + @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"}, + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) + @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"}) + public static int[] testi(int[] out) { + for (int i = 0; i < ITER-2; i+=2) { + // Unrolled, with some swaps that prevent vectorization. + out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); // ok + out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+3]) + (sArr1[2*i+3] * sArr2[2*i+2])); // bad + } + return out; + } + + @Test + @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"}, + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) + @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"}) + public static int[] testj(int[] out) { + for (int i = 0; i < ITER-2; i+=2) { + // Unrolled, with some swaps that prevent vectorization. + out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+1]) + (sArr1[2*i+1] * sArr2[2*i+0])); // bad + out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+3]) + (sArr1[2*i+3] * sArr2[2*i+2])); // bad + } + return out; + } + + @Test + @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"}, + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) + @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"}) + public static int[] testk(int[] out) { + for (int i = 0; i < ITER-2; i+=2) { + // Unrolled, with some swaps that prevent vectorization. + out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+1]) + (sArr1[2*i+1] * sArr2[2*i+0])); // bad + out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+2]) + (sArr1[2*i+3] * sArr2[2*i+3])); // ok + } + return out; + } + + @Test + @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"}, + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) + @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"}) + public static int[] testl(int[] out) { + for (int i = 0; i < ITER-2; i+=2) { + // Unrolled, with some swaps that prevent vectorization. + out[i+0] += ((sArr1[2*i+1] * sArr2[2*i+1]) + (sArr1[2*i+0] * sArr2[2*i+0])); // ok + out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+3]) + (sArr1[2*i+3] * sArr2[2*i+2])); // bad + } + return out; + } + } From 6462b873366ddc4ca2601ab4b6852522060c1395 Mon Sep 17 00:00:00 2001 From: Sonia Zaldana Calles <szaldana@openjdk.org> Date: Thu, 13 Jun 2024 19:38:39 +0000 Subject: [PATCH 062/471] 8333685: Make update-copyright-year script more useful Reviewed-by: erikj, stuefe --- make/scripts/update_copyright_year.sh | 133 ++++++++++++++------------ 1 file changed, 74 insertions(+), 59 deletions(-) diff --git a/make/scripts/update_copyright_year.sh b/make/scripts/update_copyright_year.sh index a825486a94179..bb61d48c91cc9 100644 --- a/make/scripts/update_copyright_year.sh +++ b/make/scripts/update_copyright_year.sh @@ -1,7 +1,7 @@ #!/bin/bash -f # -# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -27,8 +27,10 @@ # (Originally from xdono, Thanks!) #------------------------------------------------------------ -copyright="Copyright (c)" +copyright="Copyright" +copyright_symbol="(c)" company="Oracle" +year=`date +%Y` #------------------------------------------------------------ awk="awk" @@ -49,66 +51,75 @@ rm -f -r ${tmp} mkdir -p ${tmp} total=0 -# Default or supplied company name -if [ "$3" != "" ] ; then - company="$3" -fi - -# This year or supplied year -if [ "$2" != "" ] ; then - year="$2" -else - year=`date +%Y` -fi - -# VCS select -vcs="$1" +usage="Usage: `basename "$0"` [-c company] [-y year] [-h|f]" +Help() +{ + # Display Help + echo "Updates the Copyright year range in Git sources." + echo + echo "By default, the tool limits the processed changesets " + echo "to those in the current branch and the current year." + echo + echo "Note, cancelling the script will skip cleanup in /tmp." + echo + echo $usage + echo "options:" + echo "-c Specifies the company. Set to Oracle by default." + echo "-y Specifies the copyright year. Set to current year by default." + echo "-f Updates the copyright for all change sets in a given year," + echo " as specified by -y." + echo "-h Print this help." + echo +} -if [ -z "$vcs" ] ; then - git_found=false - hg_found=false +full_year=false - [ -d "${this_script_dir}/../../.git" ] && git_found=true - [ -d "${this_script_dir}/../../.hg" ] && hg_found=true +# Process options +while getopts "c:fhy:" option; do + case $option in + c) # supplied company year + company=${OPTARG} + ;; + f) # update all change sets in a full year + full_year=true + ;; + h) # display help + Help + exit 0 + ;; + y) # supplied company year + year=${OPTARG} + ;; + \?) # illegal option + echo "$usage" + exit 1 + ;; + esac +done - if [ "$git_found" == "true" ] && [ "$hg_found" == "false" ] ; then - vcs="git" - elif [ "$hg_found" == "true" ] && [ "$git_found" == "false" ] ; then - vcs="hg" +# VCS check +git_found=false +[ -d "${this_script_dir}/../../.git" ] && git_found=true +if [ "$git_found" != "true" ]; then + echo "Error: Please execute script from within make/scripts." + exit 1 +else + echo "Using Git version control system" + vcs_status=(git ls-files -m) + if [ "$full_year" = "true" ]; then + vcs_list_changesets=(git log --no-merges --since="${year}-01-01T00:00:00Z" --until="${year}-12-31T23:59:59Z" --pretty=tformat:"%H") else - echo "Error: could not auto-detect version control system" - vcs="" + vcs_list_changesets=(git log --no-merges 'master..HEAD' --since="${year}-01-01T00:00:00Z" --until="${year}-12-31T23:59:59Z" --pretty=tformat:"%H") fi + vcs_changeset_message=(git log -1 --pretty=tformat:"%B") # followed by ${changeset} + vcs_changeset_files=(git diff-tree --no-commit-id --name-only -r) # followed by ${changeset} fi -case "$vcs" in - "git") - echo "Using Git version control system" - vcs_status=(git ls-files -m) - vcs_list_changesets=(git log --no-merges --since="${year}-01-01T00:00:00Z" --until="${year}-12-31T23:59:59Z" --pretty=tformat:"%H") - vcs_changeset_message=(git log -1 --pretty=tformat:"%B") # followed by ${changeset} - vcs_changeset_files=(git diff-tree --no-commit-id --name-only -r) # followed by ${changeset} - ;; - - "hg") - echo "Using Mercurial version control system" - vcs_status=(hg status) - vcs_list_changesets=(hg log --no-merges -v -d "${year}-01-01 to ${year}-12-31" --template '{node}\n') - vcs_changeset_message=(hg log -l1 --template '{desc}\n' --rev) # followed by ${changeset} - vcs_changeset_files=(hg log -l1 -v --template '{files}\n' --rev) # followed by ${changeset} - ;; - - *) - echo "Usage: `basename "$0"` <git|hg> [year [company]]" - exit 1 - ;; -esac - # Return true if it makes sense to edit this file saneFileToCheck() { if [ "$1" != "" -a -f $1 ] ; then - isText=`file "$1" | egrep -i '(text|source)' | cat` + isText=`file "$1" | grep -i -E '(text|source)' | cat` hasCopyright=`grep 'Copyright' "$1" | cat` lastLineCount=`tail -1 "$1" | wc -l` if [ "${isText}" != "" \ @@ -131,9 +142,13 @@ updateFile() # file rm -f $1.OLD mv $1 $1.OLD cat $1.OLD | \ - sed -e "s@\(${copyright} [12][0-9][0-9][0-9],\) [12][0-9][0-9][0-9], ${company}@\1 ${year}, ${company}@" | \ - sed -e "s@\(${copyright} [12][0-9][0-9][0-9],\) ${company}@\1 ${year}, ${company}@" | \ - sed -e "s@${copyright} ${year}, ${year}, ${company}@${copyright} ${year}, ${company}@" \ + sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) [12][0-9][0-9][0-9], ${company}@\1 ${year}, ${company}@" | \ + sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) [12][0-9][0-9][0-9] ${company}@\1 ${year} ${company}@" | \ + sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) ${company}@\1 ${year}, ${company}@" | \ + sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) ${company}@\1, ${year}, ${company}@" | \ + sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9]\) ${company}@\1, ${year} ${company}@" | \ + sed -e "s@${copyright} ${year}, ${year}, ${company}@${copyright} ${year}, ${company}@" | \ + sed -e "s@${copyright} ${copyright_symbol} ${year}, ${year}, ${company}@${copyright} ${copyright_symbol} ${year}, ${company}@" \ > $1 if ! diff -b -w $1.OLD $1 > /dev/null ; then \ changed="true" @@ -205,19 +220,19 @@ if [ -s ${all_changesets} ] ; then "${vcs_changeset_message[@]}" "${changeset}" > ${desc} printf "%d: %s\n%s\n" ${index} "${changeset}" "`cat ${desc}|head -1`" if [ "${year}" = "2010" ] ; then - if cat ${desc} | fgrep -i "Added tag" > /dev/null ; then + if cat ${desc} | grep -i -F "Added tag" > /dev/null ; then printf " EXCLUDED tag changeset.\n" - elif cat ${desc} | fgrep -i rebrand > /dev/null ; then + elif cat ${desc} | grep -i -F rebrand > /dev/null ; then printf " EXCLUDED rebrand changeset.\n" - elif cat ${desc} | fgrep -i copyright > /dev/null ; then + elif cat ${desc} | grep -i -F copyright > /dev/null ; then printf " EXCLUDED copyright changeset.\n" else updateChangesetFiles ${changeset} fi else - if cat ${desc} | fgrep -i "Added tag" > /dev/null ; then + if cat ${desc} | grep -i -F "Added tag" > /dev/null ; then printf " EXCLUDED tag changeset.\n" - elif cat ${desc} | fgrep -i "copyright year" > /dev/null ; then + elif cat ${desc} | grep -i -F "copyright year" > /dev/null ; then printf " EXCLUDED copyright year changeset.\n" else updateChangesetFiles ${changeset} From 0721dbe44234d0b3ec9733943230e83b2e479063 Mon Sep 17 00:00:00 2001 From: "Marc R. Hoffmann" <marchof@openjdk.org> Date: Thu, 13 Jun 2024 19:44:10 +0000 Subject: [PATCH 063/471] 8334032: javax.print: Missing @since tag in new class OutputBin Reviewed-by: prr --- .../share/classes/javax/print/attribute/standard/OutputBin.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java.desktop/share/classes/javax/print/attribute/standard/OutputBin.java b/src/java.desktop/share/classes/javax/print/attribute/standard/OutputBin.java index 3f817fe6c9be2..af6113ad63872 100644 --- a/src/java.desktop/share/classes/javax/print/attribute/standard/OutputBin.java +++ b/src/java.desktop/share/classes/javax/print/attribute/standard/OutputBin.java @@ -49,6 +49,8 @@ * IPP attribute name. The enumeration's integer value is the IPP enum value. * The {@code toString()} method returns the IPP string representation of the * attribute value. + * + * @since 23 */ public sealed class OutputBin extends EnumSyntax implements PrintRequestAttribute, PrintJobAttribute permits CustomOutputBin { From bb7ef03077fb91169b5505e3500093b848aece0f Mon Sep 17 00:00:00 2001 From: Raffaello Giulietti <rgiulietti@openjdk.org> Date: Thu, 13 Jun 2024 20:55:48 +0000 Subject: [PATCH 064/471] 8333599: Improve description of \b matcher in j.u.r.Pattern Reviewed-by: smarks, alanb --- src/java.base/share/classes/java/util/regex/Pattern.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/regex/Pattern.java b/src/java.base/share/classes/java/util/regex/Pattern.java index 62ef125fdee6e..0e87bebdcbfec 100644 --- a/src/java.base/share/classes/java/util/regex/Pattern.java +++ b/src/java.base/share/classes/java/util/regex/Pattern.java @@ -160,7 +160,7 @@ * <td headers="matches predef any">Any character (may or may not match <a href="#lt">line terminators</a>)</td></tr> * <tr><th style="vertical-align:top; font-weight:normal" id="digit">{@code \d}</th> * <td headers="matches predef digit">A digit: {@code [0-9]} if <a href="#UNICODE_CHARACTER_CLASS"> - * * UNICODE_CHARACTER_CLASS</a> is not set. See <a href="#unicodesupport">Unicode Support</a>.</td></tr> + * UNICODE_CHARACTER_CLASS</a> is not set. See <a href="#unicodesupport">Unicode Support</a>.</td></tr> * <tr><th style="vertical-align:top; font-weight:normal" id="non_digit">{@code \D}</th> * <td headers="matches predef non_digit">A non-digit: {@code [^0-9]}</td></tr> * <tr><th style="vertical-align:top; font-weight:normal" id="horiz_white">{@code \h}</th> @@ -251,8 +251,9 @@ * <tr><th style="vertical-align:top; font-weight:normal" id="end_line">{@code $}</th> * <td headers="matches bounds end_line">The end of a line</td></tr> * <tr><th style="vertical-align:top; font-weight:normal" id="word_boundary">{@code \b}</th> - * <td headers="matches bounds word_boundary">A word boundary: {@code (?:(?<=\w)(?=\W)|(?<=\W)(?=\w))} (the location - * where a non-word character abuts a word character)</td></tr> + * <td headers="matches bounds word_boundary">A word boundary: + * at the beginning or at the end of a line if a word character ({@code \w}) appears there; + * or between a word ({@code \w}) and a non-word character ({@code \W}), in either order.</td></tr> * <tr><th style="vertical-align:top; font-weight:normal" id="grapheme_cluster_boundary">{@code \b{g}}</th> * <td headers="matches bounds grapheme_cluster_boundary">A Unicode extended grapheme cluster boundary</td></tr> * <tr><th style="vertical-align:top; font-weight:normal" id="non_word_boundary">{@code \B}</th> From c4702ca8c026e2d265aca0126fd3fb7bc5bb392a Mon Sep 17 00:00:00 2001 From: Damon Nguyen <dnguyen@openjdk.org> Date: Thu, 13 Jun 2024 21:27:56 +0000 Subject: [PATCH 065/471] 8333827: JDK 23 RDP1 L10n resource files update Reviewed-by: achung, jlu, naoto, joehw, prappo, cjplummer, asemenyuk, prr --- .../launcher/resources/launcher_de.properties | 5 +- .../launcher/resources/launcher_ja.properties | 5 +- .../resources/launcher_zh_CN.properties | 5 +- .../resources/serviceui_zh_CN.properties | 4 +- .../impl/msg/XMLMessages_de.properties | 2 +- .../impl/msg/XMLMessages_ja.properties | 2 +- .../impl/msg/XMLMessages_zh_CN.properties | 2 +- .../impl/msg/XPointerMessages_de.properties | 2 +- .../javac/resources/compiler_de.properties | 51 ++++++++++-------- .../javac/resources/compiler_ja.properties | 51 ++++++++++-------- .../javac/resources/compiler_zh_CN.properties | 53 +++++++++++-------- .../tools/javac/resources/javac_de.properties | 5 +- .../tools/javac/resources/javac_ja.properties | 5 +- .../javac/resources/javac_zh_CN.properties | 5 +- .../javac/resources/launcher_de.properties | 4 +- .../javac/resources/launcher_ja.properties | 4 +- .../javac/resources/launcher_zh_CN.properties | 4 +- .../html/resources/standard_de.properties | 12 ++++- .../html/resources/standard_ja.properties | 12 ++++- .../html/resources/standard_zh_CN.properties | 12 ++++- .../toolkit/resources/doclets_de.properties | 1 + .../toolkit/resources/doclets_ja.properties | 1 + .../resources/doclets_zh_CN.properties | 1 + .../tool/resources/javadoc_de.properties | 2 + .../tool/resources/javadoc_ja.properties | 2 + .../tool/resources/javadoc_zh_CN.properties | 2 + .../jconsole/resources/messages_de.properties | 2 +- .../tools/javap/resources/javap_de.properties | 2 + .../tools/javap/resources/javap_ja.properties | 2 + .../javap/resources/javap_zh_CN.properties | 2 + .../example/debug/tty/TTYResources_de.java | 2 +- .../resources/MacResources_de.properties | 2 +- .../resources/MacResources_ja.properties | 2 +- .../resources/MacResources_zh_CN.properties | 2 +- .../resources/WinResources_de.properties | 2 +- .../jshell/tool/resources/l10n_de.properties | 3 +- .../jshell/tool/resources/l10n_ja.properties | 5 +- .../tool/resources/l10n_zh_CN.properties | 4 +- 38 files changed, 180 insertions(+), 104 deletions(-) diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher_de.properties b/src/java.base/share/classes/sun/launcher/resources/launcher_de.properties index 5da8b4bea5ced..12ab942f91f26 100644 --- a/src/java.base/share/classes/sun/launcher/resources/launcher_de.properties +++ b/src/java.base/share/classes/sun/launcher/resources/launcher_de.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ native Agent Library <libname>. Beispiel: -agentlib:jdwp\n sieh # Translators please note do not translate the options themselves java.launcher.X.usage=\n -Xbatch Deaktiviert die Hintergrundkompilierung\n -Xbootclasspath/a:<durch {0} getrennte Verzeichnisse und ZIP-/JAR-Dateien>\n An das Ende des Bootstrap Classpaths anhängen\n -Xcheck:jni Führt zusätzliche Prüfungen für JNI-Funktionen aus\n -Xcomp Erzwingt die Kompilierung von Methoden beim ersten Aufruf\n -Xdebug Führt keine Aktion aus. Ist veraltet und wird in einem zukünftigen Release entfernt.\n -Xdiag Zeigt zusätzliche Diagnosemeldungen an\n -Xfuture Aktiviert strengste Prüfungen, als möglicher zukünftiger Standardwert erwartet.\n Diese Option ist veraltet und kann in einem\n zukünftigen Release entfernt werden.\n -Xint Nur Ausführung im interpretierten Modus\n -Xinternalversion\n Zeigt detailliertere JVM-Versionsinformationen an als die\n Option -version\n -Xlog:<Optionen> Konfiguriert oder aktiviert Logging mit dem einheitlichen Java Virtual\n Machine-(JVM-)Logging-Framework. Verwenden Sie -Xlog:help\n für weitere Einzelheiten.\n -Xloggc:<Datei> Protokolliert den GC-Status in einer Datei mit Zeitstempeln.\n Diese Option ist veraltet und kann in einem\n zukünftigen Release entfernt werden. Wird durch -Xlog:gc:<Datei> ersetzt.\n -Xmixed Ausführung im gemischten Modus (Standard)\n -Xmn<Größe> Legt die anfängliche und maximale Größe (in Byte) des Heaps\n für die Young Generation (Nursery) fest\n -Xms<Größe> Legt die anfängliche Java-Heap-Größe fest\n -Xmx<Größe> Legt die maximale Java-Heap-Größe fest\n -Xnoclassgc Deaktiviert die Klassen-Garbage Collection\n -Xrs Reduziert die Verwendung von BS-Signalen durch Java/VM (siehe Dokumentation)\n -Xshare:auto Verwendet freigegebene Klassendaten, wenn möglich (Standard)\n -Xshare:off Versucht nicht, freigegebene Klassendaten zu verwenden\n -Xshare:on Erfordert die Verwendung freigegebener Klassendaten, verläuft sonst nicht erfolgreich.\n Diese Testoption kann zeitweise zu\n Fehlern führen. Sie darf nicht in Produktionsumgebungen verwendet werden.\n -XshowSettings Zeigt alle Einstellungen an und fährt fort\n -XshowSettings:all\n Zeigt alle Einstellungen als Verbose-Ausgabe an und fährt fort\n -XshowSettings:locale\n Zeigt alle gebietsschemabezogenen Einstellungen an und fährt fort\n -XshowSettings:properties\n Zeigt alle Eigenschaftseinstellungen an und fährt fort\n -XshowSettings:vm\n Zeigt alle VM-bezogenen Einstellungen an und fährt fort\n -XshowSettings:security\n Zeigt alle Sicherheitseinstellungen an und fährt fort\n -XshowSettings:security:all\n Zeigt alle Sicherheitseinstellungen an und fährt fort\n -XshowSettings:security:properties\n Zeigt Sicherheitseigenschaften an und fährt fort\n -XshowSettings:security:providers\n Zeigt statische Sicherheitsprovidereinstellungen an und fährt fort\n -XshowSettings:security:tls\n Zeigt TLS-bezogene Sicherheitseinstellungen an und fährt fort\n -XshowSettings:system\n (Nur Linux) Zeigt die Konfiguration des Hostsystems oder Containers an\n und fährt fort\n -Xss<Größe> Legt die Stackgröße des Java-Threads fest\n Die tatsächliche \ -Größe kann auf ein Vielfaches der\n Systemseitengröße aufgerundet werden, wenn für das Betriebssystem erforderlich.\n -Xverify Legt den Modus der Bytecodeverifizierung fest\n Beachten Sie, dass die Option -Xverify:none veraltet ist und\n in einem zukünftigen Release entfernt werden kann.\n --add-reads <Modul>=<Zielmodul>(,<Zielmodul>)*\n Aktualisiert <Modul>, damit <Zielmodul> gelesen wird, ungeachtet\n der Moduldeklaration. \n <Zielmodul> kann ALL-UNNAMED sein, um alle unbenannten\n Module zu lesen.\n --add-exports <Modul>/<Package>=<Zielmodul>(,<Zielmodul>)*\n Aktualisiert <Modul>, um <Package> in <Zielmodul> zu exportieren,\n ungeachtet der Moduldeklaration.\n <Zielmodul> kann ALL-UNNAMED sein, um in alle\n unbenannten Module zu exportieren.\n --add-opens <Modul>/<Package>=<Zielmodul>(,<Zielmodul>)*\n Aktualisiert <Modul>, um <Package> in\n <Zielmodul> zu öffnen, ungeachtet der Moduldeklaration.\n --limit-modules <Modulname>[,<Modulname>...]\n Grenzt die Gesamtmenge der beobachtbaren Module ein\n --patch-module <Modul>=<Datei>({0}<Datei>)*\n Überschreibt oder erweitert ein Modul mit Klassen und Ressourcen\n in JAR-Dateien oder Verzeichnissen.\n --source <Version>\n Legt die Version der Quelle im Quelldateimodus fest.\n --finalization=<Wert>\n Steuert, ob die JVM Objekte finalisiert.\n Dabei ist <Wert> entweder "enabled" oder "disabled".\n Die Finalisierung ist standardmäßig aktiviert.\n\nDiese zusätzlichen Optionen können jederzeit ohne vorherige Ankündigung geändert werden.\n +Größe kann auf ein Vielfaches der\n Systemseitengröße aufgerundet werden, wenn für das Betriebssystem erforderlich.\n -Xverify Legt den Modus der Bytecodeverifizierung fest\n Beachten Sie, dass die Option -Xverify:none veraltet ist und\n in einem zukünftigen Release entfernt werden kann.\n --add-reads <Modul>=<Zielmodul>(,<Zielmodul>)*\n Aktualisiert <Modul>, damit <Zielmodul> gelesen wird, ungeachtet\n der Moduldeklaration. \n <Zielmodul> kann ALL-UNNAMED sein, um alle unbenannten\n Module zu lesen.\n --add-exports <Modul>/<Package>=<Zielmodul>(,<Zielmodul>)*\n Aktualisiert <Modul>, um <Package> in <Zielmodul> zu exportieren,\n ungeachtet der Moduldeklaration.\n <Zielmodul> kann ALL-UNNAMED sein, um in alle\n unbenannten Module zu exportieren.\n --add-opens <Modul>/<Package>=<Zielmodul>(,<Zielmodul>)*\n Aktualisiert <Modul>, um <Package> in\n <Zielmodul> zu öffnen, ungeachtet der Moduldeklaration.\n --limit-modules <Modulname>[,<Modulname>...]\n Grenzt die Gesamtmenge der beobachtbaren Module ein\n --patch-module <Modul>=<Datei>({0}<Datei>)*\n Überschreibt oder erweitert ein Modul mit Klassen und Ressourcen\n in JAR-Dateien oder Verzeichnissen.\n --source <Version>\n Legt die Version der Quelle im Quelldateimodus fest.\n --finalization=<Wert>\n Steuert, ob die JVM Objekte finalisiert.\n Dabei ist <Wert> entweder "enabled" oder "disabled".\n Die Finalisierung ist standardmäßig aktiviert.\n --sun-misc-unsafe-memory-access=<value>\n Verwendung der nicht unterstützten API sun.misc.Unsafe zulassen oder verweigern\n <value> ist "allow", "warn", "debug" oder "deny".\n Der Standardwert ist "allow".\n\nDiese zusätzlichen Optionen können jederzeit ohne vorherige Ankündigung geändert werden.\n # Translators please note do not translate the options themselves java.launcher.X.macosx.usage=\nDie folgenden Optionen sind für macOS spezifisch:\n -XstartOnFirstThread\n Führt die main()-Methode für den ersten (AppKit-)Thread aus\n -Xdock:name=<Anwendungsname>\n Setzt den im Dock angezeigten Standardanwendungsnamen außer Kraft\n -Xdock:icon=<Pfad zu Symboldatei>\n Setzt das im Dock angezeigte Standardsymbol außer Kraft\n\n @@ -52,6 +52,7 @@ java.launcher.jar.error1=Fehler: Beim Versuch, Datei {0} zu öffnen, ist ein une java.launcher.jar.error2=Manifest in {0} nicht gefunden java.launcher.jar.error3=kein Hauptmanifestattribut, in {0} java.launcher.jar.error4=Fehler beim Laden des Java-Agents in {0} +java.launcher.jar.error5=Fehler: Beim Versuch, Datei {0} zu schließen, ist ein unerwarteter Fehler aufgetreten java.launcher.jar.error.illegal.ena.value=Fehler: Ungültiger Wert "{0}" für das Manifestattribut "Enable-Native-Access". Nur ''ALL-UNNAMED'' ist zulässig java.launcher.init.error=Initialisierungsfehler java.launcher.javafx.error1=Fehler: Die JavaFX-Methode launchApplication hat die falsche Signatur, sie\nmuss als statisch deklariert werden und einen Wert vom Typ VOID zurückgeben diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties b/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties index 4455b2f80200f..5d5223d49c624 100644 --- a/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties +++ b/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ java.launcher.opt.footer = \ -cp <ディレクトリおよびzip/jarファイ # Translators please note do not translate the options themselves java.launcher.X.usage=\n -Xbatch バックグラウンド・コンパイルを無効にします\n -Xbootclasspath/a:<directories and zip/jar files separated by {0}>\n ブートストラップ・クラス・パスの最後に追加します\n -Xcheck:jni JNI関数に対する追加のチェックを実行します\n -Xcomp 初回呼出し時にメソッドのコンパイルを強制します\n -Xdebug 何も実行されません。将来のリリースで削除されるため、非推奨になりました。\n -Xdiag 追加の診断メッセージを表示します\n -Xfuture 将来のデフォルトを見越して、最も厳密なチェックを有効にします\n このオプションは非推奨であり、将来のリリースで削除される\n 可能性があります。\n -Xint インタプリタ・モードの実行のみ\n -Xinternalversion\n -versionオプションより詳細なJVMバージョン情報を\n 表示します\n -Xlog:<opts> Java Virtual Machine (JVM)統合ロギング・フレームワークでの\n ロギングを構成または有効化します。詳細は、-Xlog:helpを\n 使用してください。\n -Xloggc:<file> タイムスタンプが付いたファイルにGCステータスのログを記録します\n このオプションは非推奨であり、将来のリリースで削除される\n 可能性があります。-Xlog:gc:<file>で置換されています。\n -Xmixed 混合モードの実行(デフォルト)\n -Xmn<size> 若い世代(ナーサリ)のヒープの初期サイズおよび最大サイズ\n (バイト単位)を設定します\n -Xms<size> Javaの初期ヒープ・サイズを設定します\n -Xmx<size> Javaの最大ヒープ・サイズを設定します\n -Xnoclassgc クラスのガベージ・コレクションを無効にします\n -Xrs Java/VMによるOSシグナルの使用を削減します(ドキュメントを参照)\n -Xshare:auto 可能であれば共有クラス・データを使用します(デフォルト)\n -Xshare:off \ 共有クラス・データの使用を試みません\n -Xshare:on 共有クラス・データの使用を必須にし、できなければ失敗します。\n これはテスト・オプションであり、断続的な失敗につながる\n 可能性があります。本番環境では使用しないでください。\n -XshowSettings すべての設定を表示して続行します\n -XshowSettings:all\n すべての設定を詳細に表示して続行します\n -XshowSettings:locale\n すべてのロケール関連の設定を表示して続行します\n -XshowSettings:properties\n すべてのプロパティ設定を表示して続行します\n -XshowSettings:vm\n すべてのVM関連の設定を表示して続行します\n -XshowSettings:security\n すべてのセキュリティ設定を表示して続行します\n -XshowSettings:security:all\n すべてのセキュリティ設定を表示して続行します\n -XshowSettings:security:properties\n セキュリティ・プロパティを表示して続行します\n -XshowSettings:security:providers\n 静的セキュリティ・プロバイダ設定を表示して続行します\n -XshowSettings:security:tls\n TLS関連のセキュリティ設定を表示して続行します\n -XshowSettings:system\n (Linuxのみ)ホスト・システムまたはコンテナを表示します\n 構成して続行します\n -Xss<size> javaスレッドのスタック・サイズを設定します\n 実際のサイズは、次の倍数に切り上げられる場合があります: \n オペレーティング・システムの要件に応じたシステム・ページ・サイズ。\n -Xverify バイトコード・ベリファイアのモードを設定します\n オプション-Xverify:noneは非推奨になり、\n 将来のリリースで削除される可能性があります。\n --add-reads <module>=<target-module>(,<target-module>)*\n モジュール宣言に関係なく、<module>を更新して<target-module>を\n \ -読み取ります。 \n <target-module>をALL-UNNAMEDに設定すると、すべての名前のないモジュールを\n 読み取ることができます。\n --add-exports <module>/<package>=<target-module>(,<target-module>)*\n モジュール宣言に関係なく、<module>を更新して<package>を<target-module>に\n エクスポートします。\n <target-module>をALL-UNNAMEDに設定すると、すべての名前のないモジュールに\n エクスポートできます。\n --add-opens <module>/<package>=<target-module>(,<target-module>)*\n モジュール宣言に関係なく、<module>を更新して<package>を\n <target-module>に開きます。\n --limit-modules <module name>[,<module name>...]\n 参照可能なモジュールの領域を制限します\n --patch-module <module>=<file>({0}<file>)*\n JARファイルまたはディレクトリのクラスおよびリソースで\n モジュールをオーバーライドまたは拡張します。\n --source <version>\n ソースファイル・モードでソースのバージョンを設定します。\n --finalization=<value>\n JVMがオブジェクトのファイナライズを実行するかどうかを制御します\n <value>は"enabled"または"disabled"のいずれかです。\n ファイナライズはデフォルトで有効になっています。\n\nこの追加オプションは予告なしに変更されることがあります。\n +読み取ります。 \n <target-module>をALL-UNNAMEDに設定すると、すべての名前のないモジュールを\n 読み取ることができます。\n --add-exports <module>/<package>=<target-module>(,<target-module>)*\n モジュール宣言に関係なく、<module>を更新して<package>を<target-module>に\n エクスポートします。\n <target-module>をALL-UNNAMEDに設定すると、すべての名前のないモジュールに\n エクスポートできます。\n --add-opens <module>/<package>=<target-module>(,<target-module>)*\n モジュール宣言に関係なく、<module>を更新して<package>を\n <target-module>に開きます。\n --limit-modules <module name>[,<module name>...]\n 参照可能なモジュールの領域を制限します\n --patch-module <module>=<file>({0}<file>)*\n JARファイルまたはディレクトリのクラスおよびリソースで\n モジュールをオーバーライドまたは拡張します。\n --source <version>\n ソースファイル・モードでソースのバージョンを設定します。\n --finalization=<value>\n JVMがオブジェクトのファイナライズを実行するかどうかを制御します\n <value>は"enabled"または"disabled"のいずれかです。\n ファイナライズはデフォルトで有効になっています。\n --sun-misc-unsafe-memory-access=<value>\n サポートされていないAPI sun.misc.Unsafeの使用を許可または拒否します\n <value>は"allow"、"warn"、"debug"または"deny"のいずれかです。\n デフォルト値は、"allow"です。\n\nこの追加オプションは予告なしに変更されることがあります。\n # Translators please note do not translate the options themselves java.launcher.X.macosx.usage=\n次のオプションはmacOS固有です:\n -XstartOnFirstThread\n main()メソッドを最初(AppKit)のスレッドで実行する\n -Xdock:name=<application name>\n Dockに表示されるデフォルト・アプリケーション名をオーバーライドする\n -Xdock:icon=<path to icon file>\n Dockに表示されるデフォルト・アイコンをオーバーライドする\n\n @@ -54,6 +54,7 @@ java.launcher.jar.error1=エラー: ファイル{0}を開こうとしている java.launcher.jar.error2={0}にマニフェストが見つかりません java.launcher.jar.error3={0}にメイン・マニフェスト属性がありません java.launcher.jar.error4={0}内のJavaエージェントのロード中にエラーが発生しました +java.launcher.jar.error5=エラー: ファイル{0}を閉じるときに、予期しないエラーが発生しました java.launcher.jar.error.illegal.ena.value=エラー: Enable-Native-Accessマニフェスト属性の値"{0}"が不正です。''ALL-UNNAMED''のみ許可されます java.launcher.init.error=初期化エラー java.launcher.javafx.error1=エラー: JavaFX launchApplicationメソッドに誤ったシグネチャがあり、\nstaticを宣言してvoid型の値を返す必要があります diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties b/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties index d497402042abb..c156e234cef0b 100644 --- a/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties +++ b/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ java.launcher.opt.footer = \ -cp <目录和 zip/jar 文件的类搜索路径> # Translators please note do not translate the options themselves java.launcher.X.usage=\n -Xbatch 禁用后台编译\n -Xbootclasspath/a:<以 {0} 分隔的目录和 zip/jar 文件>\n 附加在引导类路径末尾\n -Xcheck:jni 对 JNI 函数执行其他检查\n -Xcomp 强制在首次调用时编译方法\n -Xdebug 不执行任何操作;已过时,将在未来发行版中删除。\n -Xdiag 显示附加诊断消息\n -Xfuture 启用最严格的检查,预期将来的默认值。\n 此选项已过时,可能会在\n 未来发行版中删除。\n -Xint 仅解释模式执行\n -Xinternalversion\n 显示比 -version 选项更详细的\n JVM 版本信息\n -Xlog:<opts> 配置或启用采用 Java 虚拟\n 机 (Java Virtual Machine, JVM) 统一记录框架进行事件记录。使用 -Xlog:help\n 可了解详细信息。\n -Xloggc:<file> 将 GC 状态记录在文件中(带时间戳)。\n 此选项已过时,可能会在\n 将来的发行版中删除。它将替换为 -Xlog:gc:<file>。\n -Xmixed 混合模式执行(默认值)\n -Xmn<size> 为年轻代(新生代)设置初始和最大堆大小\n (以字节为单位)\n -Xms<size> 设置初始 Java 堆大小\n -Xmx<size> 设置最大 Java 堆大小\n -Xnoclassgc 禁用类垃圾收集\n -Xrs 减少 Java/VM 对操作系统信号的使用(请参见文档)\n -Xshare:auto 在可能的情况下使用共享类数据(默认值)\n -Xshare:off 不尝试使用共享类数据\n -Xshare:on 要求使用共享类数据,否则将失败。\n 这是一个测试选项,可能导致间歇性\n 故障。不应在生产环境中使用它。\n -XshowSettings 显示所有设置并继续\n -XshowSettings:all\n 详细显示所有设置并继续\n -XshowSettings:locale\n 显示所有与区域设置相关的设置并继续\n -XshowSettings:properties\n 显示所有属性设置并继续\n -XshowSettings:vm\n 显示所有与 vm 相关的设置并继续\n -XshowSettings:security\n 显示所有安全设置并继续\n -XshowSettings:security:all\n 显示所有安全设置并继续\n -XshowSettings:security:properties\n \ - 显示安全属性并继续\n -XshowSettings:security:providers\n 显示静态安全提供方设置并继续\n -XshowSettings:security:tls\n 显示与 TLS 相关的安全设置并继续\n -XshowSettings:system\n (仅 Linux)显示主机系统或容器\n 配置并继续\n -Xss<size> 设置 Java 线程堆栈大小\n 实际大小可以舍入到\n 操作系统要求的系统页面大小的倍数。\n -Xverify 设置字节码验证器的模式\n 请注意,选项 -Xverify:none 已过时,\n 可能会在未来发行版中删除。\n --add-reads <module>=<target-module>(,<target-module>)*\n 更新 <module> 以读取 <target-module>,而无论\n 模块如何声明。 \n <target-module> 可以是 ALL-UNNAMED,将读取所有未命名\n 模块。\n --add-exports <module>/<package>=<target-module>(,<target-module>)*\n 更新 <module> 以将 <package> 导出到 <target-module>,\n 而无论模块如何声明。\n <target-module> 可以是 ALL-UNNAMED,将导出到所有\n 未命名模块。\n --add-opens <module>/<package>=<target-module>(,<target-module>)*\n 更新 <module> 以在 <target-module> 中打开\n <package>,而无论模块如何声明。\n --limit-modules <module name>[,<module name>...]\n 限制可观察模块的领域\n --patch-module <module>=<file>({0}<file>)*\n 使用 JAR 文件或目录中的类和资源\n 覆盖或增强模块。\n --source <version>\n 设置源文件模式中源的版本。\n --finalization=<value>\n 控制 JVM 是否执行对象最终处理,\n 其中 <value> 为 "enabled" 或 "disabled" 之一。\n 默认情况下,最终处理处于启用状态。\n\n这些额外选项如有更改, 恕不另行通知。\n + 显示安全属性并继续\n -XshowSettings:security:providers\n 显示静态安全提供方设置并继续\n -XshowSettings:security:tls\n 显示与 TLS 相关的安全设置并继续\n -XshowSettings:system\n (仅 Linux)显示主机系统或容器\n 配置并继续\n -Xss<size> 设置 Java 线程堆栈大小\n 实际大小可以舍入到\n 操作系统要求的系统页面大小的倍数。\n -Xverify 设置字节码验证器的模式\n 请注意,选项 -Xverify:none 已过时,\n 可能会在未来发行版中删除。\n --add-reads <module>=<target-module>(,<target-module>)*\n 更新 <module> 以读取 <target-module>,而无论\n 模块如何声明。 \n <target-module> 可以是 ALL-UNNAMED,将读取所有未命名\n 模块。\n --add-exports <module>/<package>=<target-module>(,<target-module>)*\n 更新 <module> 以将 <package> 导出到 <target-module>,\n 而无论模块如何声明。\n <target-module> 可以是 ALL-UNNAMED,将导出到所有\n 未命名模块。\n --add-opens <module>/<package>=<target-module>(,<target-module>)*\n 更新 <module> 以在 <target-module> 中打开\n <package>,而无论模块如何声明。\n --limit-modules <module name>[,<module name>...]\n 限制可观察模块的领域\n --patch-module <module>=<file>({0}<file>)*\n 使用 JAR 文件或目录中的类和资源\n 覆盖或增强模块。\n --source <version>\n 设置源文件模式中源的版本。\n --finalization=<value>\n 控制 JVM 是否执行对象最终处理,\n 其中 <value> 为 "enabled" 或 "disabled" 之一。\n 默认情况下,最终处理处于启用状态。\n --sun-misc-unsafe-memory-access=<value>\n 允许或拒绝使用不受支持的 API sun.misc.Unsafe\n <value> 为 "allow"、"warn"、"debug" 或 "deny" 之一。\n 默认值为 "allow"。\n\n这些额外选项如有更改, 恕不另行通知。\n # Translators please note do not translate the options themselves java.launcher.X.macosx.usage=\n以下选项是特定于 macOS 的选项:\n -XstartOnFirstThread\n 在第一个 (AppKit) 线程上运行 main() 方法\n -Xdock:name=<application name>\n 覆盖停靠栏中显示的默认应用程序名称\n -Xdock:icon=<path to icon file>\n 覆盖停靠栏中显示的默认图标\n\n @@ -52,6 +52,7 @@ java.launcher.jar.error1=错误: 尝试打开文件{0}时出现意外错误 java.launcher.jar.error2=在{0}中找不到清单 java.launcher.jar.error3={0}中没有主清单属性 java.launcher.jar.error4=在 {0} 中加载 Java 代理时出错 +java.launcher.jar.error5=错误:尝试关闭文件 {0} 时出现意外错误 java.launcher.jar.error.illegal.ena.value=错误:Enable-Native-Access 清单属性的值 "{0}" 非法。仅允许使用 ''ALL-UNNAMED'' java.launcher.init.error=初始化错误 java.launcher.javafx.error1=错误: JavaFX launchApplication 方法具有错误的签名, 必须\n将方法声明为静态方法并返回空类型的值 diff --git a/src/java.desktop/share/classes/sun/print/resources/serviceui_zh_CN.properties b/src/java.desktop/share/classes/sun/print/resources/serviceui_zh_CN.properties index f4a1982f05638..cdc2bb5541fab 100644 --- a/src/java.desktop/share/classes/sun/print/resources/serviceui_zh_CN.properties +++ b/src/java.desktop/share/classes/sun/print/resources/serviceui_zh_CN.properties @@ -29,7 +29,7 @@ border.chromaticity=颜色外观 border.copies=份数 border.jobattributes=作业属性 border.media=介质 -border.output=出纸 +border.output=输出 border.orientation=方向 border.printrange=打印区域 border.printservice=打印服务 @@ -63,7 +63,7 @@ label.pstype=类型: label.rangeto=至 label.size=大小(&Z): label.source=来源(&C): -label.outputbins=出纸托盘(&P): +label.outputbins=输出托盘(&P): label.status=状态: label.username=用户名(&U): label.millimetres=(毫米) diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties index 9227a61a60852..9f24c42b110f3 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties @@ -275,7 +275,7 @@ RootElementTypeMustMatchDoctypedecl = Document Root-Element "{1}"muss mit DOCTYPE-Root "{0}" übereinstimmen. UndeclaredElementInContentSpec = Contentmodell des Elements "{0}" verweist auf das nicht deklarierte Element "{1}". UniqueNotationName = Deklaration für die Notation "{0}" ist nicht eindeutig. Ein jeweiliger Name darf nicht in mehreren Notationsdeklarationen deklariert werden. - ENTITYFailedInitializeGrammar = ENTITYDatatype-Validator: Nicht erfolgreich. Initialisierungsmethode muss mit einer gültigen Grammatikreferenz aufgerufen werden. \t + ENTITYFailedInitializeGrammar = ENTITYDatatype-Validator: Nicht erfolgreich. Initialisierungsmethode muss mit einer gültigen Grammatikreferenz aufgerufen werden. ENTITYNotUnparsed = ENTITY "{0}" ist geparst. ENTITYNotValid = ENTITY "{0}" ist nicht gültig. EmptyList = Werte der Typen ENTITIES, IDREFS und NMTOKENS dürfen keine leeren Listen sein. diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties index ef0edf1b18874..00bced117f61f 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties @@ -275,7 +275,7 @@ RootElementTypeMustMatchDoctypedecl = ドキュメント・ルート要素"{1}"はDOCTYPEルート"{0}"と一致する必要があります。 UndeclaredElementInContentSpec = 要素"{0}"のコンテンツ・モデルで未宣言の要素"{1}"が参照されています。 UniqueNotationName = 表記法"{0}"の宣言が一意ではありません。同じ名前を複数の表記法宣言で宣言しないでください。 - ENTITYFailedInitializeGrammar = ENTITYDatatypeバリデータ: 有効な構文参照による初期化メソッドの呼出しに失敗しました。 \t + ENTITYFailedInitializeGrammar = ENTITYDatatypeバリデータ: 有効な構文参照による初期化メソッドの呼出しに失敗しました。 ENTITYNotUnparsed = ENTITY "{0}"は未解析ではありません。 ENTITYNotValid = ENTITY "{0}"は有効ではありません。 EmptyList = タイプENTITIES、IDREFSおよびNMTOKENSの値は空のリストにできません。 diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties index 0b937ce7623d9..ffe36a06f35f5 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties @@ -275,7 +275,7 @@ RootElementTypeMustMatchDoctypedecl = 文档根元素 "{1}" 必须匹配 DOCTYPE 根 "{0}"。 UndeclaredElementInContentSpec = 元素 "{0}" 的内容模型引用未声明的元素 "{1}"。 UniqueNotationName = 记号 "{0}" 的声明不是唯一的。不能在多个记号声明中声明指定的名称。 - ENTITYFailedInitializeGrammar = ENTITYDatatype 验证程序: 未能使用有效的语法引用调用初始化方法。\t + ENTITYFailedInitializeGrammar = ENTITYDatatype 验证程序: 未能使用有效的语法引用调用初始化方法。 ENTITYNotUnparsed = ENTITY "{0}" 不是未解析的。 ENTITYNotValid = ENTITY "{0}" 无效。 EmptyList = 类型为 ENTITIES, IDREFS 和 NMTOKENS 的值不能是空列表。 diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties index fcd8b9e5a0ca0..e3f064694d8fc 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties @@ -27,7 +27,7 @@ FormatFailed = Beim Formatieren der folgenden Meldung ist ein interner Fehler au XPointerProcessingError = XPointerProcessingError: Beim Verarbeiten des XPointer-Ausdrucks ist ein Fehler aufgetreten. InvalidXPointerToken = InvalidXPointerToken: XPointer-Ausdruck enthält das ungültige Token "{0}" InvalidXPointerExpression = InvalidXPointerExpression: XPointer-Ausdruck "{0}" ist ungültig. -MultipleShortHandPointers = MultipleShortHandPointers: XPointer-Ausdruck "{0}" ist ungültig. Mehrere ShortHand-Zeiger vorhanden. +MultipleShortHandPointers = MultipleShortHandPointers: Der XPointer-Ausdruck "{0}" ist ungültig. Er enthält mehrere ShortHand-Zeiger. SchemeDataNotFollowedByCloseParenthesis = SchemeDataNotFollowedByCloseParenthesis: XPointer-Ausdruck "{0}" ist ungültig. Auf SchemeData folgte kein ")"-Zeichen. SchemeUnsupported = SchemeUnsupported: XPointer-Schema "{0}" wird nicht unterstützt. InvalidShortHandPointer = InvalidShortHandPointer: NCName von ShortHand-Zeiger "{0}" ist ungültig. diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_de.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_de.properties index 566eff4c0d580..dfbeb0fd0b715 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_de.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_de.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -294,6 +294,9 @@ compiler.err.cant.inherit.from.final=Erben aus finalem {0}-Element nicht möglic # 0: symbol or name compiler.err.cant.ref.before.ctor.called={0} kann nicht referenziert werden, bevor der Supertypkonstruktor aufgerufen wurde +# 0: symbol or name +compiler.err.cant.assign.initialized.before.ctor.called=Initialisiertes Feld "{0}" kann nicht zugewiesen werden, bevor der Supertypkonstruktor aufgerufen wurde + compiler.err.cant.select.static.class.from.param.type=Statische Klasse kann nicht aus einem parametrisierten Typ ausgewählt werden # 0: symbol, 1: string, 2: string @@ -403,6 +406,10 @@ compiler.err.duplicate.unconditional.pattern=Doppeltes nicht bedingtes Muster compiler.err.unconditional.pattern.and.default=Switch umfasst sowohl ein nicht bedingtes Muster als auch ein Standardlabel +compiler.err.unconditional.pattern.and.both.boolean.values=Switch umfasst sowohl boolesche Werte als auch ein nicht bedingtes Muster + +compiler.err.default.and.both.boolean.values=Switch umfasst sowohl boolesche Werte als auch ein Standardlabel + compiler.err.guard.not.allowed=Guards sind nur für CASE-Anweisungen mit einem Muster zulässig compiler.err.guard.has.constant.expression.false=Dieses CASE-Label hat einen Guard, der ein konstanter Ausdruck mit dem Wert ''false'' ist @@ -413,12 +420,9 @@ compiler.err.cannot.assign.not.declared.guard=Zuweisen zu {0} nicht möglich, da # 0: type, 1: type compiler.err.constant.label.not.compatible=Konstantes Label des Typs {0} ist nicht mit Switch-Selektortyp {1} kompatibel -# 0: type -compiler.err.selector.type.not.allowed=Selektortyp {0} ist nicht zulässig - -compiler.err.flows.through.to.pattern=Ungültiger Fallthrough zu einem Muster +compiler.err.flows.through.to.pattern=Unzulässiger Fallthrough auf ein Muster\n(im vorherigen CASE-Label fehlt ein Break) -compiler.err.flows.through.from.pattern=Ungültiger Fallthrough von einem Muster +compiler.err.flows.through.from.pattern=Unzulässiger Fallthrough von einem Muster\n(im aktuellen CASE-Label fehlt ein Break) compiler.err.invalid.case.label.combination=ungültige Case-Label-Kombination @@ -533,6 +537,10 @@ compiler.err.illegal.underscore=Unzulässiger Unterstrich compiler.err.illegal.dot="." unzulässig +compiler.err.illegal.digit.in.binary.literal=Unzulässige Ziffer in einem binären Literal + +compiler.err.illegal.digit.in.octal.literal=Unzulässige Ziffer in einem oktalen Literal + # 0: symbol compiler.err.illegal.qual.not.icls=Unzulässiger Qualifier. {0} ist keine innere Klasse @@ -961,15 +969,6 @@ compiler.err.unclosed.str.lit=Nicht geschlossenes Zeichenfolgenliteral compiler.err.unclosed.text.block=Nicht geschlossener Textblock -compiler.err.string.template.is.not.well.formed=Zeichenfolgenvorlage ist nicht wohlgeformt - -compiler.err.text.block.template.is.not.well.formed=Textblockvorlage ist nicht wohlgeformt - -compiler.err.processor.missing.from.string.template.expression=Prozessor fehlt in Zeichenfolgenvorlagen-Ausdruck - -# 0: symbol -compiler.err.not.a.processor.type=Kein Prozessortyp: {0} - # 0: string compiler.err.unsupported.encoding=Nicht unterstützte Codierung: {0} @@ -1339,6 +1338,8 @@ compiler.warn.lintOption=[{0}]\u0020 # 0: symbol compiler.warn.constant.SVUID=serialVersionUID muss Konstante in Klasse {0} sein +compiler.warn.dangling.doc.comment=Dokumentationskommentar ist an keine Deklaration angehängt + # 0: path compiler.warn.dir.path.element.not.found=Ungültiges Pfadelement "{0}": Verzeichnis nicht vorhanden @@ -1901,9 +1902,6 @@ compiler.warn.prob.found.req={0}\nErforderlich: {2}\nErmittelt: {1} # 0: type, 1: type compiler.misc.inconvertible.types={0} kann nicht in {1} konvertiert werden -# 0: type, 1: type -compiler.misc.not.applicable.types=Muster des Typs {1} ist bei {0} nicht anwendbar - # 0: type, 1: type compiler.misc.possible.loss.of.precision=Möglicher Verlust bei Konvertierung von {0} in {1} @@ -2270,6 +2268,8 @@ compiler.misc.feature.deconstruction.patterns=Dekonstruktionsmuster compiler.misc.feature.unnamed.variables=Unbenannte Variablen +compiler.misc.feature.primitive.patterns=Primitive Muster + compiler.misc.feature.records=Datensätze compiler.misc.feature.sealed.classes=Verschlüsselte Klassen @@ -2278,13 +2278,13 @@ compiler.misc.feature.case.null=Null in Switch Cases compiler.misc.feature.pattern.switch=Muster in Switch-Anweisungen -compiler.misc.feature.string.templates=Zeichenfolgenvorlagen - compiler.misc.feature.unconditional.patterns.in.instanceof=Nicht bedingte Muster in instanceof compiler.misc.feature.implicit.classes=Implizit deklarierte Klassen -compiler.misc.feature.super.init=Anweisungen vor super() +compiler.misc.feature.flexible.constructors=Flexible Konstruktoren + +compiler.misc.feature.module.imports=Modulimporte compiler.warn.underscore.as.identifier=Ab Release 9 ist "_" ein Schlüsselwort und kann nicht als ID verwendet werden @@ -2502,6 +2502,15 @@ compiler.err.module.not.found=Modul nicht gefunden: {0} # 0: symbol compiler.warn.module.not.found=Modul nicht gefunden: {0} +# 0: name +compiler.err.import.module.not.found=Importiertes Modul nicht gefunden: {0} + +# 0: symbol +compiler.err.import.module.does.not.read.unnamed=Unbenanntes Modul kann Folgendes nicht lesen: {0} + +# 0: symbol, 1: symbol +compiler.err.import.module.does.not.read=Modul {0} kann Folgendes nicht lesen: {1} + compiler.err.too.many.modules=Zu viele Moduldeklarationen gefunden compiler.err.module.not.found.on.module.source.path=Modul nicht in Modulquellpfad gefunden diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties index 01844578905e2..4d98e4cabccba 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -294,6 +294,9 @@ compiler.err.cant.inherit.from.final=final {0}からは継承できません # 0: symbol or name compiler.err.cant.ref.before.ctor.called=スーパータイプのコンストラクタの呼出し前は{0}を参照できません +# 0: symbol or name +compiler.err.cant.assign.initialized.before.ctor.called=スーパータイプのコンストラクタの呼出し前は、初期化されたフィールド''{0}''を割り当てられません + compiler.err.cant.select.static.class.from.param.type=パラメータにされた型からstaticクラスを選択することはできません # 0: symbol, 1: string, 2: string @@ -403,6 +406,10 @@ compiler.err.duplicate.unconditional.pattern=無条件パターンが重複し compiler.err.unconditional.pattern.and.default=switchに無条件パターンとdefaultラベルの両方があります +compiler.err.unconditional.pattern.and.both.boolean.values=switchに、ブール値と無条件パターンの両方があります + +compiler.err.default.and.both.boolean.values=switchに、ブール値とdefaultラベルの両方があります + compiler.err.guard.not.allowed=ガードはパターンのあるcaseでのみ許可されます compiler.err.guard.has.constant.expression.false=このcaseラベルには、値が''false''の定数式であるガードがあります @@ -413,12 +420,9 @@ compiler.err.cannot.assign.not.declared.guard=ガード内で宣言されてい # 0: type, 1: type compiler.err.constant.label.not.compatible=タイプ{0}の定数ラベルがswitchセレクタ・タイプ{1}と互換性がありません -# 0: type -compiler.err.selector.type.not.allowed=セレクタ・タイプ{0}は許可されません - -compiler.err.flows.through.to.pattern=パターンに対して不正なfall-through +compiler.err.flows.through.to.pattern=パターンに対して不正なfall-through\n(前のcaseラベルにbreakがありません) -compiler.err.flows.through.from.pattern=パターンからの不正なfall-through +compiler.err.flows.through.from.pattern=パターンに対して不正なfall-through\n(現在のcaseラベルにbreakがありません) compiler.err.invalid.case.label.combination=caseラベルの組合せが無効です @@ -533,6 +537,10 @@ compiler.err.illegal.underscore=不正なアンダースコアです compiler.err.illegal.dot=不正な''.''です +compiler.err.illegal.digit.in.binary.literal=2進数リテラルの数字が正しくありません + +compiler.err.illegal.digit.in.octal.literal=8進数リテラルの数字が正しくありません + # 0: symbol compiler.err.illegal.qual.not.icls=修飾子が不正です。{0}は内部クラスではありません @@ -961,15 +969,6 @@ compiler.err.unclosed.str.lit=文字列リテラルが閉じられていませ compiler.err.unclosed.text.block=閉じられていないテキスト・ブロック -compiler.err.string.template.is.not.well.formed=文字列テンプレートが整形式ではありません - -compiler.err.text.block.template.is.not.well.formed=テキスト・ブロック・テンプレートが整形式ではありません - -compiler.err.processor.missing.from.string.template.expression=プロセッサが文字列テンプレート式にありません - -# 0: symbol -compiler.err.not.a.processor.type=プロセッサ・タイプではありません: {0} - # 0: string compiler.err.unsupported.encoding=サポートされていないエンコーディングです: {0} @@ -1339,6 +1338,8 @@ compiler.warn.lintOption=[{0}]\u0020 # 0: symbol compiler.warn.constant.SVUID=serialVersionUIDはクラス{0}の定数である必要があります +compiler.warn.dangling.doc.comment=どの宣言にもドキュメンテーション・コメントが添付されていません + # 0: path compiler.warn.dir.path.element.not.found=不正なパス要素"{0}": そのディレクトリは存在しません @@ -1901,9 +1902,6 @@ compiler.warn.prob.found.req={0}\n期待値: {2}\n検出値: {1} # 0: type, 1: type compiler.misc.inconvertible.types={0}を{1}に変換できません: -# 0: type, 1: type -compiler.misc.not.applicable.types=型{1}のパターンは{0}では適用できません - # 0: type, 1: type compiler.misc.possible.loss.of.precision=精度が失われる可能性がある{0}から{1}への変換 @@ -2270,6 +2268,8 @@ compiler.misc.feature.deconstruction.patterns=デコンストラクション・ compiler.misc.feature.unnamed.variables=無名変数 +compiler.misc.feature.primitive.patterns=プリミティブ・パターン + compiler.misc.feature.records=レコード compiler.misc.feature.sealed.classes=シール・クラス @@ -2278,13 +2278,13 @@ compiler.misc.feature.case.null=switch caseのnull compiler.misc.feature.pattern.switch=switch文のパターン -compiler.misc.feature.string.templates=文字列テンプレート - compiler.misc.feature.unconditional.patterns.in.instanceof=instanceofでの無条件パターン compiler.misc.feature.implicit.classes=暗黙的に宣言されたクラス -compiler.misc.feature.super.init=super()の前の文 +compiler.misc.feature.flexible.constructors=柔軟なコンストラクタ + +compiler.misc.feature.module.imports=モジュール・インポート compiler.warn.underscore.as.identifier=リリース9から''_''はキーワードなので識別子として使用することはできません @@ -2502,6 +2502,15 @@ compiler.err.module.not.found=モジュールが見つかりません: {0} # 0: symbol compiler.warn.module.not.found=モジュールが見つかりません: {0} +# 0: name +compiler.err.import.module.not.found=インポートされたモジュールが見つかりません: {0} + +# 0: symbol +compiler.err.import.module.does.not.read.unnamed=名前のないモジュールでは読取りは行われません: {0} + +# 0: symbol, 1: symbol +compiler.err.import.module.does.not.read=モジュール{0}では読取りは行われません: {1} + compiler.err.too.many.modules=検出されたモジュール宣言が多すぎます compiler.err.module.not.found.on.module.source.path=モジュール・ソース・パスにモジュールが見つかりません diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties index 99c5df09fc133..81452f23a0d55 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -294,6 +294,9 @@ compiler.err.cant.inherit.from.final=无法从最终{0}进行继承 # 0: symbol or name compiler.err.cant.ref.before.ctor.called=无法在调用超类型构造器之前引用{0} +# 0: symbol or name +compiler.err.cant.assign.initialized.before.ctor.called=无法在调用超类型构造器之前分配初始化字段 ''{0}'' + compiler.err.cant.select.static.class.from.param.type=无法从参数化的类型中选择静态类 # 0: symbol, 1: string, 2: string @@ -403,6 +406,10 @@ compiler.err.duplicate.unconditional.pattern=无条件模式重复 compiler.err.unconditional.pattern.and.default=switch 有一个无条件模式和一个 default 标签 +compiler.err.unconditional.pattern.and.both.boolean.values=switch 有布尔值和一个无条件模式 + +compiler.err.default.and.both.boolean.values=switch 有布尔值和一个 default 标签 + compiler.err.guard.not.allowed=只有包含模式的 case 允许使用卫士 compiler.err.guard.has.constant.expression.false=此 case 标签有一个卫士,它是值为 ''false'' 的常量表达式 @@ -413,16 +420,13 @@ compiler.err.cannot.assign.not.declared.guard=无法分配给 {0},因为未在 # 0: type, 1: type compiler.err.constant.label.not.compatible={0} 类型的常量标签与 switch 选择器类型 {1} 不兼容 -# 0: type -compiler.err.selector.type.not.allowed=不允许使用选择器类型 {0} - -compiler.err.flows.through.to.pattern=贯穿 (fall-through) 到模式非法 +compiler.err.flows.through.to.pattern=贯穿 (fall-through) 到模式非法\n(上一个 case 标签缺少中断) -compiler.err.flows.through.from.pattern=从模式贯穿 (fall-through) 非法 +compiler.err.flows.through.from.pattern=从模式贯穿 (fall-through) 非法\n(当前 case 标签缺少中断) compiler.err.invalid.case.label.combination=case 标签组合无效 -compiler.err.default.label.not.allowed=此处不允许使用默认标签 +compiler.err.default.label.not.allowed=此处不允许使用 default 标签 compiler.err.pattern.type.cannot.infer=无法推断模式类型 @@ -533,6 +537,10 @@ compiler.err.illegal.underscore=非法下划线 compiler.err.illegal.dot=非法 ''.'' +compiler.err.illegal.digit.in.binary.literal=二进制文字中的数字非法 + +compiler.err.illegal.digit.in.octal.literal=八进制文字中的数字非法 + # 0: symbol compiler.err.illegal.qual.not.icls=非法限定符; {0}不是内部类 @@ -961,15 +969,6 @@ compiler.err.unclosed.str.lit=未结束的字符串文字 compiler.err.unclosed.text.block=文本块未闭合 -compiler.err.string.template.is.not.well.formed=字符串模板格式不正确 - -compiler.err.text.block.template.is.not.well.formed=文本块模板格式不正确 - -compiler.err.processor.missing.from.string.template.expression=字符串模板表达式缺少处理程序 - -# 0: symbol -compiler.err.not.a.processor.type=不是处理程序类型:{0} - # 0: string compiler.err.unsupported.encoding=不支持的编码: {0} @@ -1339,6 +1338,8 @@ compiler.warn.lintOption=[{0}]\u0020 # 0: symbol compiler.warn.constant.SVUID=serialVersionUID 在类{0}中必须是常量 +compiler.warn.dangling.doc.comment=文档注释未附加到任何声明 + # 0: path compiler.warn.dir.path.element.not.found=错误的路径元素 "{0}": 没有这种目录 @@ -1901,9 +1902,6 @@ compiler.warn.prob.found.req={0}\n需要: {2}\n找到: {1} # 0: type, 1: type compiler.misc.inconvertible.types={0}无法转换为{1} -# 0: type, 1: type -compiler.misc.not.applicable.types=类型为 {1} 的模式不适用于 {0} - # 0: type, 1: type compiler.misc.possible.loss.of.precision=从{0}转换到{1}可能会有损失 @@ -2270,6 +2268,8 @@ compiler.misc.feature.deconstruction.patterns=解构模式 compiler.misc.feature.unnamed.variables=未命名变量 +compiler.misc.feature.primitive.patterns=基元模式 + compiler.misc.feature.records=记录 compiler.misc.feature.sealed.classes=密封类 @@ -2278,13 +2278,13 @@ compiler.misc.feature.case.null=switch case 中的空值 compiler.misc.feature.pattern.switch=switch 语句中的模式 -compiler.misc.feature.string.templates=字符串模板 - compiler.misc.feature.unconditional.patterns.in.instanceof=instanceof 中的无条件模式 compiler.misc.feature.implicit.classes=隐式声明的类 -compiler.misc.feature.super.init=super() 之前的语句 +compiler.misc.feature.flexible.constructors=灵活构造器 + +compiler.misc.feature.module.imports=模块导入 compiler.warn.underscore.as.identifier=从发行版 9 开始, ''_'' 为关键字, 不能用作标识符 @@ -2502,6 +2502,15 @@ compiler.err.module.not.found=找不到模块: {0} # 0: symbol compiler.warn.module.not.found=找不到模块: {0} +# 0: name +compiler.err.import.module.not.found=找不到导入的模块:{0} + +# 0: symbol +compiler.err.import.module.does.not.read.unnamed=未命名模块未读取:{0} + +# 0: symbol, 1: symbol +compiler.err.import.module.does.not.read=模块 {0} 未读取:{1} + compiler.err.too.many.modules=找到太多的模块声明 compiler.err.module.not.found.on.module.source.path=在模块源路径中找不到模块 diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_de.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_de.properties index cc3bea6c763e7..00b64b1f0995c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_de.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_de.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -109,6 +109,8 @@ javac.opt.Xlint.desc.cast=Warnt vor unnötigen Umwandlungen mit Cast. javac.opt.Xlint.desc.classfile=Warnt vor Problemen im Zusammenhang mit Klassendateiinhalten. +javac.opt.Xlint.desc.dangling-doc-comments=Warnt vor Dokumentationskommentaren, die an keine Deklaration angehängt sind. + javac.opt.Xlint.desc.missing-explicit-ctor=Warnt vor fehlenden expliziten Konstruktoren in öffentlichen und geschützten Klassen in exportierten Packages. javac.opt.Xlint.desc.deprecation=Warnt vor der Verwendung veralteter Elemente. @@ -214,6 +216,7 @@ javac.opt.module.version=Gibt die Version der Module an, die kompiliert werden javac.opt.arg.module.version=<Version> javac.opt.inherit_runtime_environment=Vererbt Modulsystemkonfigurationsoptionen aus der Laufzeitumgebung. javac.opt.default.module.for.created.files=Fallback-Zielmodul für Dateien, die von Annotationsprozessoren erstellt werden,\nfalls keines angegeben ist oder abgeleitet werden kann. +javac.opt.lineDocComments=Unterstützung für Dokumentationskommentare mit Zeilen, die mit "///" beginnen, deaktivieren ## messages diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties index f33c2c54cea93..4eb259b23cc0a 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -109,6 +109,8 @@ javac.opt.Xlint.desc.cast=不要なキャストの使用について警告しま javac.opt.Xlint.desc.classfile=クラス・ファイルの内容に関連した問題について警告します。 +javac.opt.Xlint.desc.dangling-doc-comments=どの宣言にも添付されていないドキュメンテーション・コメントについて警告します。 + javac.opt.Xlint.desc.missing-explicit-ctor=エクスポートされたパッケージのpublicおよびprotectedのクラスに明示的なコンストラクタがないことを警告します。 javac.opt.Xlint.desc.deprecation=非推奨項目の使用について警告します。 @@ -214,6 +216,7 @@ javac.opt.module.version=コンパイルするモジュールのバージョン javac.opt.arg.module.version=<バージョン> javac.opt.inherit_runtime_environment=実行時環境からモジュール・システム構成オプションを継承します。 javac.opt.default.module.for.created.files=何も指定されていないか、推定型の場合、注釈プロセッサによって作成されるファイルのターゲット・モジュールをフォールバックします。 +javac.opt.lineDocComments='///'で行を開始すると、ドキュメンテーション・コメントのサポートが無効化されます ## messages diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties index 64e031ed38121..8cbddae86f65d 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -109,6 +109,8 @@ javac.opt.Xlint.desc.cast=有关使用了不必要转换的警告。 javac.opt.Xlint.desc.classfile=有关与类文件内容相关的问题的警告。 +javac.opt.Xlint.desc.dangling-doc-comments=有关未附加到任何声明的悬挂文档注释的警告。 + javac.opt.Xlint.desc.missing-explicit-ctor=有关导出的程序包中的公共和受保护类中缺少显式构造器的警告。 javac.opt.Xlint.desc.deprecation=有关使用了已过时项的警告。 @@ -214,6 +216,7 @@ javac.opt.module.version=指定正在编译的模块版本 javac.opt.arg.module.version=<版本> javac.opt.inherit_runtime_environment=从运行时环境继承模块系统配置选项。 javac.opt.default.module.for.created.files=由批注处理程序创建的文件的备用目标模块 (如果未指定或推断任何模块)。 +javac.opt.lineDocComments=禁用对带有以 '///' 开头的行的文档注释的支持 ## messages diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_de.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_de.properties index b59b227ddcb5f..efcc594ca6c52 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_de.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_de.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -122,8 +122,6 @@ launcher.err.no.value.for.option=kein Wert angegeben für Option: {0} # 0: string launcher.err.invalid.value.for.source=ungültiger Wert für Option --source: {0} -launcher.err.enable.preview.requires.source=--enable-preview muss mit --source verwendet werden - launcher.err.unnamed.pkg.not.allowed.named.modules=Unbenanntes Package ist in benannten Modulen nicht zulässig # 0: string, 1: path diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_ja.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_ja.properties index 8bb25907bcd56..72e2478bff39a 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_ja.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_ja.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -122,8 +122,6 @@ launcher.err.no.value.for.option=オプションに値が指定されていま # 0: string launcher.err.invalid.value.for.source=--sourceオプションの値が無効です: {0} -launcher.err.enable.preview.requires.source=--enable-previewは--sourceとともに使用する必要があります - launcher.err.unnamed.pkg.not.allowed.named.modules=名前のないパッケージは名前付きモジュールでは許可されません # 0: string, 1: path diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_zh_CN.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_zh_CN.properties index 81976d40b86f9..ee666cc02c11d 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_zh_CN.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_zh_CN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -122,8 +122,6 @@ launcher.err.no.value.for.option=没有为选项 {0} 指定值 # 0: string launcher.err.invalid.value.for.source=--source 选项的值无效:{0}\n -launcher.err.enable.preview.requires.source=--enable-preview 必须与 --source 一起使用 - launcher.err.unnamed.pkg.not.allowed.named.modules=命名模块中不允许未命名程序包 # 0: string, 1: path diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_de.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_de.properties index 1bdbb5d0614c4..c444f387a6595 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_de.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_de.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -116,17 +116,20 @@ doclet.tag.invalid_input=Ungültige Eingabe: "{0}" doclet.tag.invalid=ungültiges @{0} doclet.Deprecated_API=Veraltete API doclet.Deprecated_API_Checkbox_Label=Veraltete API anzeigen in: +doclet.Deprecated_API_Checkbox_All_Releases=Alle doclet.Deprecated_API_Checkbox_Other_Releases=Sonstige doclet.Deprecated_Elements=Veraltete {0} doclet.Deprecated_Elements_Release_Column_Header=Veraltet in doclet.Deprecated_In_Release=Veraltet in {0} doclet.New_API=Neue API doclet.New_API_Checkbox_Label=Hinzugefügte API anzeigen in: +doclet.New_API_Checkbox_All_Releases=Alle doclet.New_Elements=Neue {0} doclet.New_Elements_Release_Column_Header=Hinzugefügt in doclet.New_Label=Neu doclet.Preview_API=Vorschau-API doclet.Preview_API_Checkbox_Label=Vorschau-API anzeigen für: +doclet.Preview_API_Checkbox_Toggle_All=Alle umschalten doclet.Preview_JEP_URL=https://openjdk.org/jeps/{0} doclet.Preview_Label=Vorschau doclet.Preview_Mark=PREVIEW @@ -229,7 +232,7 @@ doclet.help.class_interface.property=Eigenschaften sind ein Feature von JavaFX. doclet.help.other_files.head=Weitere Dateien doclet.help.other_files.body=Packages und Module können Seiten mit weiteren Informationen zu den Deklarationen in der Nähe enthalten. doclet.help.use.head=Verwendung -doclet.help.use.body=Für jedes dokumentierte Package sowie jede Klasse und jede Schnittstelle ist eine eigene Verwendungsseite vorhanden. Auf dieser Seite wird beschrieben, welche Packages, Klassen, Methoden, Konstruktoren und Felder einen Teil der angegebenen Klasse oder des angegebenen Packages verwenden. Bei der Klasse oder Schnittstelle A enthält die Verwendungsseite die Unterklassen von A, als A deklarierte Felder, Methoden, die A zurückgeben, sowie Methoden und Konstruktoren mit Parametern des Typs A. Sie können diese Seite aufrufen, indem Sie zunächst das Package, die Klasse oder die Schnittstelle aufrufen und anschließend in der Navigationsleiste auf den Link "Verwendung" klicken. +doclet.help.use.body=Für jedes dokumentierte Package sowie jede Klasse oder Schnittstelle ist eine eigene Verwendungsseite vorhanden. Auf dieser Seite werden die Packages, Klassen, Schnittstellen, Methoden, Konstruktoren und Felder aufgelistet, die einen Teil der angegebenen Klasse oder Schnittstelle oder des angegebenen Packages verwenden. Bei der Klasse oder Schnittstelle A enthält die Verwendungsseite die Unterklassen oder Unterschnittstellen von A, als A deklarierte Felder, Methoden, die A zurückgeben, Methoden und Konstruktoren mit Parametern des Typs A und Unterklassen oder Unterschnittstellen mit Parametern des Typs A. Sie können auf diese Seite zugreifen, indem Sie zunächst das Package, die Klasse oder die Schnittstelle aufrufen und anschließend in der Navigationsleiste auf den Link "Verwendung" klicken. doclet.help.tree.head=Baum (Klassenhierarchie) # 0: link to main Class Hierarchy page; 1: java.lang.Object doclet.help.tree.intro=Es gibt eine Seite {0} für alle Packages, und für jedes Package gibt es eine Hierarchie. Jede Hierarchieseite enthält eine Klassen- und eine Schnittstellenliste. Die Klassen sind nach Vererbungsstruktur organisiert, beginnend mit {1}. Die Schnittstellen erben nicht von {1}. @@ -284,6 +287,9 @@ doclet.ClassUse_Classes.in.0.used.by.1=Von {1} verwendete Klassen in {0} doclet.ClassUse_PackageAnnotation=Packages mit Annotationen vom Typ {0} doclet.ClassUse_Annotation=Klassen in {1} mit Annotationen vom Typ {0} doclet.ClassUse_TypeParameter=Klassen in {1} mit Typparametern vom Typ {0} +doclet.ClassUse_SubclassTypeParameter=Unterklassen mit Typargumenten vom Typ {0} in {1} +doclet.ClassUse_SubinterfaceTypeParameter=Unterschnittstellen mit Typargumenten vom Typ {0} in {1} +doclet.ClassUse_ImplementsTypeParameter=Klassen in {1}, die Schnittstellen mit Typargumenten vom Typ {0} implementieren doclet.ClassUse_MethodTypeParameter=Methoden in {1} mit Typparametern vom Typ {0} doclet.ClassUse_FieldTypeParameter=Felder in {1} mit Typparametern vom Typ {0} doclet.ClassUse_FieldAnnotations=Felder in {1} mit Annotationen vom Typ {0} @@ -412,6 +418,8 @@ doclet.usage.nocomment.description=Beschreibung und Tags unterdrücken und nur D doclet.usage.nodeprecated.description=@deprecated-Informationen nicht aufnehmen +doclet.usage.no-fonts.description=Keine Standardwebschriftarten in generierte Dokumentation aufnehmen + doclet.usage.noqualifier.parameters=<name1>,<name2>,... doclet.usage.noqualifier.description=Liste der Qualifier aus der Ausgabe ausschließen.\n":" kann überall im Argument als Trennzeichen verwendet werden. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties index 1764587769b1e..ce56bc1632558 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -116,17 +116,20 @@ doclet.tag.invalid_input=入力が無効です: ''{0}'' doclet.tag.invalid=@{0}が無効です doclet.Deprecated_API=推奨されていないAPI doclet.Deprecated_API_Checkbox_Label=次で非推奨のAPIを表示: +doclet.Deprecated_API_Checkbox_All_Releases=すべて doclet.Deprecated_API_Checkbox_Other_Releases=その他 doclet.Deprecated_Elements=推奨されていない{0} doclet.Deprecated_Elements_Release_Column_Header=次で非推奨 doclet.Deprecated_In_Release={0}で非推奨 doclet.New_API=新規API doclet.New_API_Checkbox_Label=次で追加されたAPIを表示: +doclet.New_API_Checkbox_All_Releases=すべて doclet.New_Elements=新規{0} doclet.New_Elements_Release_Column_Header=次で追加 doclet.New_Label=新規 doclet.Preview_API=プレビューAPI doclet.Preview_API_Checkbox_Label=次のプレビューAPIを表示: +doclet.Preview_API_Checkbox_Toggle_All=すべて設定 doclet.Preview_JEP_URL=https://openjdk.org/jeps/{0} doclet.Preview_Label=プレビュー doclet.Preview_Mark=PREVIEW @@ -229,7 +232,7 @@ doclet.help.class_interface.property=プロパティはJavaFXの機能です。 doclet.help.other_files.head=その他のファイル doclet.help.other_files.body=パッケージおよびモジュールには、周辺の宣言に関連する追加情報が記載されているページが含まれている場合があります。 doclet.help.use.head=使用 -doclet.help.use.body=各ドキュメント化されたパッケージ、クラスおよびインタフェースにはそれぞれ「使用」ページがあります。このページには、どのようなパッケージ、クラス、メソッド、コンストラクタおよびフィールドが、特定のクラスまたはパッケージの一部を使用しているかが記述されています。たとえば、クラスAまたはインタフェースAの場合、その「使用」ページには、Aのサブクラス、Aとして宣言されるフィールド、Aを返すメソッドと、型Aのパラメータを持つメソッドおよびコンストラクタが含まれます。このページにアクセスするには、まずそのパッケージ、クラスまたはインタフェースに移動し、ナビゲーション・バーの「使用」リンクをクリックしてください。 +doclet.help.use.body=ドキュメント化された各パッケージ、クラスまたはインタフェースには、それぞれに「使用」ページがあります。このページにリストされているパッケージ、クラス、インタフェース、メソッド、コンストラクタおよびフィールドでは、ドキュメント化されたパッケージ、クラスまたはインタフェースの一部が使用されています。たとえば、クラスAまたはインタフェースAの場合、その「使用」ページには、Aのサブクラスまたはインタフェース、Aとして宣言されるフィールド、Aを返すメソッドと、型Aのパラメータが指定されたメソッドとコンストラクタ、および型Aのパラメータが指定されたサブクラスまたはサブインタフェースが含まれます。このページにアクセスするには、まずそのパッケージ、クラスまたはインタフェースに移動し、ナビゲーション・バーの「使用」リンクをクリックしてください。 doclet.help.tree.head=階層ツリー(クラス階層) # 0: link to main Class Hierarchy page; 1: java.lang.Object doclet.help.tree.intro=すべてのパッケージには{0}ページがあり、さらに各パッケージの階層があります。各階層ページは、クラスのリストとインタフェースのリストを含みます。クラスは{1}を開始点とする継承構造で編成されます。インタフェースは、{1}からは継承しません。 @@ -284,6 +287,9 @@ doclet.ClassUse_Classes.in.0.used.by.1={1}により使用される{0}のクラ doclet.ClassUse_PackageAnnotation={0}型の注釈を持つパッケージ doclet.ClassUse_Annotation={0}型の注釈を持つ{1}のメソッド doclet.ClassUse_TypeParameter={0}型の型パラメータを持つ{1}のクラス +doclet.ClassUse_SubclassTypeParameter={0}型の型引数を持つ{1}のサブクラス +doclet.ClassUse_SubinterfaceTypeParameter={0}型の型引数を持つ{1}のサブインタフェース +doclet.ClassUse_ImplementsTypeParameter={0}型の型引数を持つインタフェースを実装している{1}のクラス doclet.ClassUse_MethodTypeParameter={0}型の型パラメータを持つ{1}のメソッド doclet.ClassUse_FieldTypeParameter={0}型の型パラメータを持つ{1}のフィールド doclet.ClassUse_FieldAnnotations={0}型の注釈を持つ{1}のフィールド @@ -412,6 +418,8 @@ doclet.usage.nocomment.description=記述およびタグを抑制して宣言の doclet.usage.nodeprecated.description=@deprecated情報を除外します +doclet.usage.no-fonts.description=生成されるドキュメントに、標準にwebフォントを使用しないでください + doclet.usage.noqualifier.parameters=<name1>,<name2>,... doclet.usage.noqualifier.description=出力から修飾子のリストを除外します。\n':'も、セパレータとして引数の任意の場所に使用できます。 diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties index 5dcd3dce996d5..c109d4c4237bb 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -116,17 +116,20 @@ doclet.tag.invalid_input=无效输入:''{0}'' doclet.tag.invalid=@{0} 无效 doclet.Deprecated_API=已过时的 API doclet.Deprecated_API_Checkbox_Label=显示在以下发行版中已过时的 API: +doclet.Deprecated_API_Checkbox_All_Releases=全部 doclet.Deprecated_API_Checkbox_Other_Releases=其他 doclet.Deprecated_Elements=已过时的 {0} doclet.Deprecated_Elements_Release_Column_Header=在以下发行版中已过时 doclet.Deprecated_In_Release=在 {0} 中已过时 doclet.New_API=新建 API doclet.New_API_Checkbox_Label=显示在以下发行版中添加的 API: +doclet.New_API_Checkbox_All_Releases=全部 doclet.New_Elements=新建 {0} doclet.New_Elements_Release_Column_Header=在以下发行版中已添加 doclet.New_Label=新建 doclet.Preview_API=预览 API doclet.Preview_API_Checkbox_Label=显示预览 API: +doclet.Preview_API_Checkbox_Toggle_All=全部切换 doclet.Preview_JEP_URL=https://openjdk.org/jeps/{0} doclet.Preview_Label=预览 doclet.Preview_Mark=PREVIEW @@ -229,7 +232,7 @@ doclet.help.class_interface.property=属性是 JavaFX 的一个特性。 doclet.help.other_files.head=其他文件 doclet.help.other_files.body=程序包和模块所包含的页面中可能带有与附近声明相关的附加信息。 doclet.help.use.head=使用 -doclet.help.use.body=每个已文档化的程序包、类和接口都有各自的“使用”页面。此页面介绍了使用给定类或程序包的任何部分的程序包、类、方法、构造器和字段。对于给定的类或接口 A,其“使用”页面包含 A 的子类、声明为 A 的字段、返回 A 的方法,以及带有类型为 A 的参数的方法和构造器。访问此页面的方法是:首先转至程序包、类或接口,然后单击导航栏中的“使用”链接。 +doclet.help.use.body=每个已文档化的程序包、类或接口都有各自的“使用”页面,其中列出了使用该程序包、类或接口的任何部分的程序包、类、接口、方法、构造器和字段。对于给定的类或接口 A,其“使用”页面包含 A 的子类或子接口、声明为 A 的字段、返回 A 的方法、带有类型为 A 的参数的方法和构造器,以及带有类型为 A 的参数的子类或子接口。访问此页面的方法是:首先转至程序包、类或接口,然后单击导航栏中的“使用”链接。 doclet.help.tree.head=树 (类分层结构) # 0: link to main Class Hierarchy page; 1: java.lang.Object doclet.help.tree.intro=对于所有程序包,都有一个 {0} 页,以及每个程序包的分层结构。每个分层结构页都包含类的列表和接口的列表。从 {1} 开始,按继承结构对类进行排列。接口不从 {1} 继承。 @@ -284,6 +287,9 @@ doclet.ClassUse_Classes.in.0.used.by.1={1}使用的{0}中的类 doclet.ClassUse_PackageAnnotation=批注类型为{0}的程序包 doclet.ClassUse_Annotation=批注类型为{0}的{1}中的类 doclet.ClassUse_TypeParameter=类型参数类型为{0}的{1}中的类 +doclet.ClassUse_SubclassTypeParameter={1} 中类型参数类型为 {0} 的子类 +doclet.ClassUse_SubinterfaceTypeParameter={1} 中类型参数类型为 {0} 的子接口 +doclet.ClassUse_ImplementsTypeParameter={1} 中实现类型参数类型为 {0} 的接口的类 doclet.ClassUse_MethodTypeParameter=类型参数类型为{0}的{1}中的方法 doclet.ClassUse_FieldTypeParameter=类型参数类型为{0}的{1}中的字段 doclet.ClassUse_FieldAnnotations=批注类型为{0}的{1}中的字段 @@ -412,6 +418,8 @@ doclet.usage.nocomment.description=不生成说明和标记, 只生成声明 doclet.usage.nodeprecated.description=不包含 @deprecated 信息 +doclet.usage.no-fonts.description=不要在生成的文档中包含标准 Web 字体 + doclet.usage.noqualifier.parameters=<name1>,<name2>,... doclet.usage.noqualifier.description=在输出中排除一系列限定符。\n还可以将 ':' 作为分隔符用于参数中的任何位置。 diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_de.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_de.properties index 242be92fc8c16..4e84cdc52c77f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_de.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_de.properties @@ -249,6 +249,7 @@ doclet.linkMismatch_ModuleLinkedtoPackage=Der Code, der dokumentiert wird, verwe doclet.urlRedirected=URL {0} wurde umgeleitet an {1} - Aktualisieren Sie die Befehlszeilenoptionen, um diese Warnung zu unterdrücken. doclet.unexpectedRedirect=Unerwartete Umleitung für URL {0} zu {1} doclet.duplicate.comment.for.property=Doppelter Kommentar für Eigenschaft.\nEntfernen Sie den Kommentar auf dem Eigenschaftsfeld oder in dieser Methode, um diese Warnung zu unterdrücken. +doclet.contains.diagnostic.markers=Die generierte Dokumentation enthält Diagnosemarker für eine ungültige Eingabe. #Documentation for Enums doclet.enum_values_doc.fullbody=Gibt ein Array mit den Konstanten dieses Enum-Typs in\nder Reihenfolge ihrer Deklaration zurück. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_ja.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_ja.properties index 986d3affe1f23..515df706272d8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_ja.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_ja.properties @@ -249,6 +249,7 @@ doclet.linkMismatch_ModuleLinkedtoPackage=ドキュメント化しようとし doclet.urlRedirected=URL {0}は{1}にリダイレクトされました -- コマンドライン・オプションを更新してこの警告を表示しないようにしてください。 doclet.unexpectedRedirect=URL {0}から{1}への予期しないリダイレクト doclet.duplicate.comment.for.property=プロパティのコメントが重複して\nいます。プロパティ・フィールドまたはこのメソッドのコメントを削除してこの警告を出さないようにしてください。 +doclet.contains.diagnostic.markers=生成されたドキュメンテーションには、無効な入力の診断マーカーがあります。 #Documentation for Enums doclet.enum_values_doc.fullbody=この列挙型の定数を含む配列を宣言されている順序で\n返します。 diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_zh_CN.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_zh_CN.properties index 99a31b3eec5c5..d01d42faa56a4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_zh_CN.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_zh_CN.properties @@ -249,6 +249,7 @@ doclet.linkMismatch_ModuleLinkedtoPackage=进行文档化的代码使用了模 doclet.urlRedirected=URL {0} 已重定向到 {1} — 更新命令行选项以隐藏此警告。 doclet.unexpectedRedirect=URL {0} 意外重定向到 {1} doclet.duplicate.comment.for.property=属性注释重复。\n删除属性字段或此方法的注释以隐藏此警告。 +doclet.contains.diagnostic.markers=生成的文档包含无效输入的诊断标记。 #Documentation for Enums doclet.enum_values_doc.fullbody=返回包含该枚举类型的常量的数组,\n顺序与声明这些常量的顺序相同 diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_de.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_de.properties index f8c3c0863900b..2192bfb33951e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_de.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_de.properties @@ -159,6 +159,8 @@ main.opt.add.reads.desc=Gibt weitere Module an, die als von einem angegebenen Mo main.opt.patch.module.arg=<Modul>=<Datei>(:<Datei>)* main.opt.patch.module.desc=Setzt ein Modul außer Kraft oder erweitert es mit Klassen\nund Ressourcen in JAR-Dateien oder Verzeichnissen +main.opt.disable.line.doc.comments.desc=Unterstützung für Dokumentationskommentare mit Zeilen,\ndie mit "///" beginnen, deaktivieren + main.Xusage.foot=\nDies sind keine Standardoptionen, und sie können ohne Vorankündigung geändert werden. main.doclet.usage.header=\nBereitgestellt vom Doclet {0}: diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_ja.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_ja.properties index 725497fecabcc..1cafe4d6ad538 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_ja.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_ja.properties @@ -159,6 +159,8 @@ main.opt.add.reads.desc=指定のモジュールで必須とみなされるよ main.opt.patch.module.arg=<module>=<file>(:<file>)* main.opt.patch.module.desc=JARファイルまたはディレクトリのクラスおよびリソースでモジュールを\n オーバーライドまたは拡張します +main.opt.disable.line.doc.comments.desc='///'で行を開始すると、ドキュメンテーション・コメントのサポートが\n無効化されます + main.Xusage.foot=\nこれらは非標準オプションであり予告なしに変更されることがあります。 main.doclet.usage.header=\n{0} docletにより提供されるもの: diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_zh_CN.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_zh_CN.properties index 41d065f5b1c5f..4ad91361e068f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_zh_CN.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_zh_CN.properties @@ -159,6 +159,8 @@ main.opt.add.reads.desc=指定被视为给定模块需要的其他模块。\n< main.opt.patch.module.arg=<模块>=<文件>(:<文件>)* main.opt.patch.module.desc=使用\nJAR 文件或目录中的类和资源覆盖\n 或增强模块 +main.opt.disable.line.doc.comments.desc=禁用对带有以 '///' 开头的行的文档注释\n的支持 + main.Xusage.foot=\n这些选项都是非标准选项, 如有更改, 恕不另行通知。 main.doclet.usage.header=\n由 {0} doclet 提供: diff --git a/src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties b/src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties index b0efddf5ed399..e6859fd8d74a6 100644 --- a/src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties +++ b/src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties @@ -282,7 +282,7 @@ USERNAME_ACCESSIBLE_NAME=Benutzername USER_DATA=UserData VIRTUAL_MACHINE=Virtuelle Maschine VM_ARGUMENTS=VM-Argumente -VMINTERNAL_FRAME_ACCESSIBLE_DESCRIPTION=Innerer Frame für die Überwachung einer Java Virtual Machine +VMINTERNAL_FRAME_ACCESSIBLE_DESCRIPTION=Innerer Frame für das Monitoring einer Java Virtual Machine VALUE=Wert VENDOR=Hersteller VERBOSE_OUTPUT=Verbose-Ausgabe diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_de.properties b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_de.properties index 44265e8a6a589..1c98b4cac6a9d 100644 --- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_de.properties +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_de.properties @@ -100,6 +100,8 @@ main.opt.constants=\ -constants Zeigt die endgültigen Ko main.opt.sysinfo=\ -sysinfo Zeigt die Systeminformationen (Pfad, Größe, Datum, SHA-256-Hash)\n der Klasse, die verarbeitet wird +main.opt.verify=\ -verify Gibt zusätzliche Klassenverifizierungsinformationen aus + main.opt.module=\ --module <Modul> -m <Modul> Gibt das Modul an, das die zu disassemblierenden Klassen enthält main.opt.J=\ -J<vm-option> Gibt eine VM-Option an diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties index 01e587336c54c..4cc9e83070d91 100644 --- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties @@ -100,6 +100,8 @@ main.opt.constants=\ -constants final定数を表示す main.opt.sysinfo=\ -sysinfo 処理しているクラスのシステム情報(パス、サイズ、日付、SHA-256ハッシュ)\n を表示します +main.opt.verify=\ -verify クラスの検証情報が追加で出力されます + main.opt.module=\ --module <module> -m <module> 逆アセンブルされるクラスを含むモジュールを指定する main.opt.J=\ -J<vm-option> VMオプションを指定する diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties index 57e3e6ac2eb9d..77c2fdd6b6366 100644 --- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties @@ -100,6 +100,8 @@ main.opt.constants=\ -constants 显示最终常量 main.opt.sysinfo=\ -sysinfo 显示正在处理的类的\n 系统信息(路径、大小、日期、SHA-256 散列) +main.opt.verify=\ -verify 输出其他类验证信息 + main.opt.module=\ --module <module> -m <module> 指定包含要反汇编的类的模块 main.opt.J=\ -J<vm-option> 指定 VM 选项 diff --git a/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTYResources_de.java b/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTYResources_de.java index ee6449f760558..04ec27a624d5e 100644 --- a/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTYResources_de.java +++ b/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTYResources_de.java @@ -322,7 +322,7 @@ public Object[][] getContents() { {"Unable to set", "{0} kann nicht festgelegt werden: {1}"}, {"Unexpected event type", "Unerwarteter Ereignistyp: {0}"}, {"unknown", "unbekannt"}, - {"Unmonitoring", "\u00DCberwachung von {0} aufheben"}, + {"Unmonitoring", "Monitoring von {0} aufheben"}, {"Unrecognized command. Try help...", "Nicht erkannter Befehl: \"{0}\". Rufen Sie \"help\" auf..."}, {"Usage: catch exception", "Verwendung: catch [uncaught|caught|all] <Klassen-ID>|<Klassenmuster>"}, {"Usage: ignore exception", "Verwendung: ignore [uncaught|caught|all] <Klassen-ID>|<Klassenmuster>"}, diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_de.properties b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_de.properties index 3dc883b07289c..0d2cfb5b6c07b 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_de.properties +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_de.properties @@ -94,6 +94,6 @@ message.preparing-distribution-dist=distribution.dist wird vorbereitet: {0}. message.signing.pkg=Warnung: Zum Signieren von PKG müssen Sie möglicherweise mit dem Schlüsselbundverwaltungstool die Option "Immer vertrauen" für Ihr Zertifikat festlegen. message.setfile.dmg=Das Festlegen des benutzerdefinierten Symbols für die DMG-Datei wurde übersprungen, weil das Utility "SetFile" nicht gefunden wurde. Durch Installieren von Xcode mit Befehlszeilentools sollte dieses Problem behoben werden. message.install-dir-ignored=Warnung: "--install-dir" wird von DMG nicht unterstützt. Stattdessen wird standardmäßig /Applications verwendet. -message.codesign.failed.reason.app.content="codesign" failed and additional application content was supplied via the "--app-content" parameter. Probably the additional content broke the integrity of the application bundle and caused the failure. Ensure content supplied via the "--app-content" parameter does not break the integrity of the application bundle, or add it in the post-processing step. +message.codesign.failed.reason.app.content="codesign" war nicht erfolgreich, und zusätzlicher Anwendungsinhalt wurde über den Parameter "--app-content" angegeben. Wahrscheinlich hat der zusätzliche Inhalt die Integrität des Anwendungs-Bundles beeinträchtigt und den Fehler verursacht. Stellen Sie sicher, das der über den Parameter "--app-content" angegebene Inhalt nicht die Integrität des Anwendungs-Bundles beeinträchtigt, oder fügen Sie ihn im Nachverarbeitungsschritt hinzu. warning.unsigned.app.image=Warnung: Nicht signiertes app-image wird zum Erstellen von signiertem {0} verwendet. warning.per.user.app.image.signed=Warnung: Konfiguration der installierten Anwendung pro Benutzer wird nicht unterstützt, da "{0}" im vordefinierten signierten Anwendungsimage fehlt. diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties index f1359c0eaaa18..08e6dd2b4e8c3 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties @@ -94,6 +94,6 @@ message.preparing-distribution-dist=distribution.distを準備しています: { message.signing.pkg=警告: PKGへの署名の場合、「キーチェーン・アクセス」ツールを使用して証明書に「常に信頼する」を設定する必要があります。 message.setfile.dmg='SetFile'ユーティリティが見つからないため、DMGファイルでのカスタム・アイコンの設定がスキップされました。Xcodeとコマンド・ライン・ツールをインストールすると、この問題は解決されます。 message.install-dir-ignored=警告: "--install-dir"はDMGでサポートされていません。/Applicationsにデフォルト設定されます。 -message.codesign.failed.reason.app.content="codesign" failed and additional application content was supplied via the "--app-content" parameter. Probably the additional content broke the integrity of the application bundle and caused the failure. Ensure content supplied via the "--app-content" parameter does not break the integrity of the application bundle, or add it in the post-processing step. +message.codesign.failed.reason.app.content="codesign"が失敗したため、追加のアプリケーション・コンテンツが、"--app-content"パラメータを介して提供されました。追加のコンテンツにより、アプリケーション・バンドルの整合性が損われ、失敗の原因になった可能性があります。"--app-content"パラメータを介して提供されたコンテンツによって、アプリケーション・バンドルの整合性が損われていないことを確認するか、処理後のステップで追加してください。 warning.unsigned.app.image=警告: 署名されていないapp-imageを使用して署名された{0}を作成します。 warning.per.user.app.image.signed=警告: 事前定義済の署名付きアプリケーション・イメージに"{0}"がないため、インストール済アプリケーションのユーザーごとの構成はサポートされません。 diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties index eeb49d6e591cb..f4e75caa1ef8c 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties @@ -94,6 +94,6 @@ message.preparing-distribution-dist=正在准备 distribution.dist: {0}。 message.signing.pkg=警告:要对 PKG 进行签名,可能需要使用“密钥链访问”工具为证书设置“始终信任”。 message.setfile.dmg=由于未找到 'SetFile' 实用程序,跳过了针对 DMG 文件设置定制图标的操作。安装带命令行工具的 Xcode 应能解决此问题。 message.install-dir-ignored=警告:"--install-dir" 不受 DMG 支持,将默认为 /Applications。 -message.codesign.failed.reason.app.content="codesign" failed and additional application content was supplied via the "--app-content" parameter. Probably the additional content broke the integrity of the application bundle and caused the failure. Ensure content supplied via the "--app-content" parameter does not break the integrity of the application bundle, or add it in the post-processing step. +message.codesign.failed.reason.app.content="codesign" 失败,并通过 "--app-content" 参数提供了附加应用程序内容。可能是附加内容破坏了应用程序包的完整性,导致了故障。请确保通过 "--app-content" 参数提供的内容不会破坏应用程序包的完整性,或者在后处理步骤中添加该内容。 warning.unsigned.app.image=警告:使用未签名的 app-image 生成已签名的 {0}。 warning.per.user.app.image.signed=警告:由于预定义的已签名应用程序映像中缺少 "{0}",不支持对已安装应用程序的每用户配置提供支持。 diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties index dce4a911fe144..e0c15bfb8fba2 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties @@ -59,7 +59,7 @@ error.read-wix-l10n-file=Datei {0} konnte nicht geparst werden error.extract-culture-from-wix-l10n-file=Kulturwert konnte nicht aus Datei {0} gelesen werden message.icon-not-ico=Das angegebene Symbol "{0}" ist keine ICO-Datei und wird nicht verwendet. Stattdessen wird das Standardsymbol verwendet. -message.potential.windows.defender.issue=Warnung: Windows Defender verhindert eventuell die korrekte Ausführung von jpackage. Wenn ein Problem auftritt, deaktivieren Sie die Echtzeitüberwachung, oder fügen Sie einen Ausschluss für das Verzeichnis "{0}" hinzu. +message.potential.windows.defender.issue=Warnung: Windows Defender verhindert eventuell die korrekte Ausführung von jpackage. Wenn ein Problem auftritt, deaktivieren Sie das Echtzeitmonitoring, oder fügen Sie einen Ausschluss für das Verzeichnis "{0}" hinzu. message.outputting-to-location=EXE für Installationsprogramm wird generiert in: {0}. message.output-location=Installationsprogramm (.exe) gespeichert in: {0} message.tool-version=[{0}]-Version [{1}] erkannt. diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_de.properties b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_de.properties index 50c7515e9d857..21f308910081e 100644 --- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_de.properties +++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_de.properties @@ -168,6 +168,7 @@ jshell.console.completion.all.completions = <Erneut Tabulatortaste drücken, um jshell.console.no.javadoc = <Keine Dokumentation gefunden> jshell.console.do.nothing = Nichts machen jshell.console.choice = Auswahl:\u0020 + jshell.console.create.variable = Variable erstellen jshell.console.create.method = Methode erstellen jshell.console.resolvable = \nDie ID kann in diesem Kontext aufgelöst werden. @@ -179,7 +180,7 @@ jshell.console.empty = \nLeerer Eintrag. Ein einzelner gültiger Ausdruck oder e jshell.fix.wrong.shortcut =Unerwartetes Zeichen nach Umschalt+Tab.\nVerwenden Sie "I" für automatischen Import, "V" zur Variablenerstellung oder "M" zur Methodenerstellung.\nWeitere Informationen finden Sie unter:\n/help shortcuts -help.usage = Verwendung: jshell <Option>... <Ladedatei>...\nMögliche Optionen:\n --class-path <Pfad> Gibt an, wo die Benutzerklassendateien gespeichert sind\n --module-path <Pfad> Gibt an, wo die Anwendungsmodule gespeichert sind\n --add-modules <Modul>(,<Modul>)*\n Gibt aufzulösende Module oder alle Module im\n Modulpfad an, wenn <Modul> ALL-MODULE-PATHs lautet\n --enable-native-access\n Ermöglicht Ausführung eingeschränkter nativer Methoden durch Code\n --enable-preview Code kann Vorschaufeatures in diesem Release nutzen\n --startup <Datei> Ersetzung der Startdefinitionen mit einer Ausführung\n --no-startup Startdefinitionen werden nicht ausgeführt\n --feedback <Modus> Gibt den anfänglichen Feedbackmodus an. Der Modus kann\n vordefiniert (Silent, Concise, Normal oder Verbose) oder\n vorab benutzerdefiniert sein\n -q Stilles Feedback. Identisch mit: --feedback concise\n -s Äußerst stilles Feedback. Identisch mit: --feedback silent\n -v Verbose-Feedback. Identisch mit: --feedback verbose\n -J<Kennzeichen> Übergibt <Kennzeichen> direkt an das Laufzeitsystem.\n Verwenden Sie ein -J pro Laufzeitkennzeichen oder Kennzeichenargument\n -R<Kennzeichen> Übergibt <Kennzeichen> an das Remotelaufzeitsystem.\n Verwenden Sie ein -R pro Remotekennzeichen oder Kennzeichenargument\n -C<Kennzeichen> Übergibt <Kennzeichen> an den Compiler.\n Verwenden Sie ein -C pro Compiler-Kennzeichen oder Kennzeichenargument\n --version Gibt Versionsinformationen aus und beendet den Vorgang\n --show-version Gibt Versionsinformationen aus und setzt den Vorgang fort\n --help, -?, -h Gibt diese Zusammenfassung der Standardoptionen aus und beendet den Vorgang\n --help-extra, -X Gibt Hilfetext zu Nicht-Standardoptionen aus und beendet den Vorgang\n\nEin Dateiargument kann ein Dateiname oder einer der vordefinierten Dateinamen sein: DEFAULT,\nPRINTING, TOOLING oder JAVASE.\nEine Ladedatei kann auch "-" zur Angabe einer Standardeingabe ohne interaktiven I/O sein.\n\nWeitere Informationen zu den Auswertungskontextoptionen (--class-path,\n--module-path und --add-modules) finden Sie unter:\n\t/help context\n\nEin Pfad listet die zu durchsuchenden Verzeichnisse und Archive auf. Verwenden Sie unter Windows ein\nSemikolon (;), um Elemente im Pfad zu trennen. Verwenden Sie auf anderen Plattformen einen\nDoppelpunkt (:), um Elemente zu trennen.\n +help.usage = Verwendung: jshell <Option>... <Ladedatei>...\nMögliche Optionen:\n --class-path <Pfad> Gibt an, wo die Benutzerklassendateien gespeichert sind\n --module-path <Pfad> Gibt an, wo die Anwendungsmodule gespeichert sind\n --add-modules <Modul>(,<Modul>)*\n Gibt aufzulösende Module oder alle Module im\n Modulpfad an, wenn <Modul> ALL-MODULE-PATHs lautet\n --enable-native-access\n Ermöglicht Ausführung eingeschränkter nativer Methoden durch Code\n --enable-preview Code kann Vorschaufeatures in diesem Release nutzen\n --startup <Datei> Ersetzung der Startdefinitionen mit einer Ausführung\n --no-startup Startdefinitionen werden nicht ausgeführt\n --feedback <Modus> Gibt den anfänglichen Feedbackmodus an. Der Modus kann\n vordefiniert (Silent, Concise, Normal oder Verbose) oder\n vorab benutzerdefiniert sein\n -q Stilles Feedback. Identisch mit: --feedback concise\n -s Äußerst stilles Feedback. Identisch mit: --feedback silent\n -v Verbose-Feedback. Identisch mit: --feedback verbose\n -J<Kennzeichen> Übergibt <Kennzeichen> an das Laufzeitsystem, hat aber keine Auswirkungen\n auf die Ausführung von Code-Snippets. Um Kennzeichen anzugeben,\n die die Ausführung von Code-Snippets beeinflussen, verwenden Sie\n -R<Kennzeichen>. Verwenden Sie alternativ dazu -J<Kennzeichen> mit\n --execution local.\n -R<Kennzeichen> Übergibt <Kennzeichen> nur dann an das Laufzeitsystem, wenn\n Code-Snippets ausgeführt werden. Beispiel: -R-Dfoo=bar\n bedeutet, dass die Ausführung des Snippets\n System.getProperty("foo") "bar" zurückgibt.\n -C<flag> Übergibt <Kennzeichen> an den Java-Compiler in JShell.\n Beispiel: -C-Xlint aktiviert alle empfohlenen\n LINT-Warnungen, und -C--release=<N> kompiliert für\n Java SE N, wie wenn --release N angegeben wird.\n Verwenden Sie ein -C pro Compiler-Kennzeichen oder Kennzeichenargument\n --version Gibt Versionsinformationen aus und beendet den Vorgang\n --show-version Gibt Versionsinformationen aus und setzt den Vorgang fort\n --help, -?, -h Gibt diese Zusammenfassung der Standardoptionen aus und beendet den Vorgang\n --help-extra, -X Gibt Hilfetext zu Nicht-Standardoptionen aus und beendet den Vorgang\n\nEin Dateiargument kann ein Dateiname oder einer der vordefinierten Dateinamen sein: DEFAULT,\nPRINTING, TOOLING oder JAVASE.\nEine Ladedatei kann auch "-" zur Angabe einer Standardeingabe ohne interaktiven I/O sein.\n\nWeitere Informationen zu den Auswertungskontextoptionen (--class-path,\n--module-path und --add-modules) finden Sie unter:\n\t/help context\n\nEin Pfad listet die zu durchsuchenden Verzeichnisse und Archive auf. Verwenden Sie unter Windows ein\nSemikolon (;), um Elemente im Pfad zu trennen. Verwenden Sie auf anderen Plattformen einen\nDoppelpunkt (:), um Elemente zu trennen.\n help.usage.x = \ --add-exports <Modul>/<Package> Gibt ein Package an, das als\n Export aus seinem definierenden Modul gelten soll \n --execution <Spezifikation> Gibt eine alternative Ausführungs-Engine an.\n Dabei gilt: <Spezifikation> ist eine ExecutionControl-Spezifikation.\n In der Dokumentation zu dem Package\n jdk.jshell.spi finden Sie Informationen zur Syntax der Spezifikation\n \nDies sind keine Standardoptionen und können jederzeit ohne vorherige Ankündigung geändert werden.\n help.list.summary = Listet die eingegebene Quelle auf diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties index 8f2029d291f11..87533d2837103 100644 --- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties +++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties @@ -168,6 +168,7 @@ jshell.console.completion.all.completions = <使用可能な補完結果をす jshell.console.no.javadoc = <ドキュメントが見つかりません> jshell.console.do.nothing = 何もしない jshell.console.choice = 選択:\u0020 + jshell.console.create.variable = 変数の作成 jshell.console.create.method = メソッドの作成 jshell.console.resolvable = \n識別子はこのコンテキストで解決できます。 @@ -179,8 +180,8 @@ jshell.console.empty = \n空のエントリ。単一の有効な式または文 jshell.fix.wrong.shortcut =[Shift]+[Tab]の後の文字が予期しない文字です。\n自動インポートには"i"、変数の作成には"v"、メソッドの作成には"m"を使用してください。\n詳細は次を参照してください:\n/help shortcuts -help.usage = 使用方法: jshell <option>... <load-file>...\n使用可能なオプションには次のものがあります:\n --class-path <path> ユーザー・クラス・ファイルのある場所を指定します\n --module-path <path> アプリケーション・モジュールのある場所を指定します\n --add-modules <module>(,<module>)*\n 解決するモジュール、または<module>がALL-MODULE-PATH\n である場合はモジュール・パスのすべてのモジュールを指定します\n --enable-native-access\n コードで制限付きネイティブ・メソッド実行させることができます\n --enable-preview コードをこのリリースのプレビュー機能に依存させることができます\n --startup <file> 起動定義の代替として実行されます\n --no-startup 起動定義を実行しません\n --feedback <mode> 初期フィードバック・モードを指定します。モードは\n 事前に定義されている(silent、concise、normalまたはverbose)か、\n 事前にユーザーが定義できます\n -q 簡潔なフィードバック。--feedback conciseと同じ\n -s 非常に簡潔なフィードバック。--feedback silentと同じ\n -v 詳細なフィードバック。--feedback verboseと同じ\n -J<flag> <flag>を実行時システムに直接渡します。\n 実行時フラグまたはフラグ引数ごとに1つの-Jを使用します\n -R<flag> <flag>をリモート実行時システムに渡します。\n リモート・フラグまたはフラグ引数ごとに1つの-Rを使用します\n -C<flag> <flag>をコンパイラに渡します。\n コンパイラ・フラグまたはフラグ引数ごとに1つの-Cを使用します\n --version バージョン情報を出力し終了します\n --show-version バージョン情報を出力し続行します\n --help, -?, -h 標準オプションのこの概要を出力し終了します\n --help-extra, -X \ -非標準オプションのヘルプを出力し終了します\n\nファイル引数には、ファイル名か、または事前定義されたファイル名(DEFAULT、\nPRINTING、TOOLINGまたはJAVASE)の1つを指定できます。\nload-fileでも、対話型I/Oを使用せずに、"-"を指定して標準入力を示すことができます。\n\n評価コンテキスト・オプション(--class-path、--module-path、\n--add-modules)の詳細は、次を参照してください:\n\t/help context\n\nパスには、検索するディレクトリとアーカイブがリストされます。Windowsの場合は、\nセミコロン(;)を使用してパスの項目を区切ります。その他のプラットフォームでは、\nコロン(:)を使用して項目を区切ります。\n +help.usage = 使用方法: jshell <option>... <load-file>...\n使用可能なオプションには次のものがあります:\n --class-path <path> ユーザー・クラス・ファイルのある場所を指定します\n --module-path <path> アプリケーション・モジュールのある場所を指定します\n --add-modules <module>(,<module>)*\n 解決するモジュール、または<module>がALL-MODULE-PATH\n である場合はモジュール・パスのすべてのモジュールを指定します\n --enable-native-access\n コードで制限付きネイティブ・メソッドを実行することができます\n --enable-preview コードをこのリリースのプレビュー機能に依存させることができます\n --startup <file> 起動定義の代替として実行されます\n --no-startup 起動定義を実行しません\n --feedback <mode> 初期フィードバック・モードを指定します。モードは\n 事前に定義されている(silent、concise、normalまたはverbose)か、\n 事前にユーザーが定義できます\n -q 簡潔なフィードバック。--feedback conciseと同じ\n -s 非常に簡潔なフィードバック。--feedback silentと同じ\n -v 詳細なフィードバック。--feedback verboseと同じ\n -J<flag> 実行システムに<flag>を渡しますが、コード・スニペットの\n 実行に影響はありません。コード・スニペットの実行に\n 影響するフラグを指定するには、-R<flag>を使用します\n または、--executionローカルを指定して\n -J<flag>を使用します。\n -R<flag> コード・スニペットが実行されている場合にのみ、\n 実行システムに<flag>を渡します。たとえば、\n -R-Dfoo=barは、スニペットSystem.getProperty("foo")\n の実行により、barが返されることを意味します。\n -C<flag> JShell内のJavaコンパイラに<flag>を渡します。たとえば、\n \ +-C-Xlintとすると、推奨のlintの警告すべてが有効になり、\n -C--release=<N>とすると、--release Nを指定した場合と\n 同じように、Java SE N用にコンパイルされます。\n コンパイラ・フラグまたはフラグ引数ごとに1つの-Cを使用します\n --version バージョン情報を出力し終了します\n --show-version バージョン情報を出力し続行します\n --help, -?, -h 標準オプションのこの概要を出力し終了します\n --help-extra, -X 非標準オプションのヘルプを出力し終了します\n\nファイル引数には、ファイル名か、事前定義されたファイル名(DEFAULT、\nPRINTING、TOOLINGまたはJAVASE)の1つを指定できます。\nload-fileでも、対話型I/Oを使用せずに、"-"を指定して標準入力を示すことができます。\n\n評価コンテキスト・オプション(--class-path、--module-path、\n--add-modules)の詳細は、次を参照してください:\n\t/help context\n\nパスには、検索するディレクトリとアーカイブがリストされます。Windowsの場合は、\nセミコロン(;)を使用してパスの項目を区切ります。その他のプラットフォームでは、\nコロン(:)を使用して項目を区切ります。\n help.usage.x = \ --add-exports <module>/<package> 定義モジュールからエクスポートされると\n みなされるパッケージを指定します\n --execution <spec> 代替実行エンジンを指定します。\n ここで、<spec>はExecutionControl specです。\n specの構文については、パッケージjdk.jshell.spiの\n ドキュメントを参照してください\n \nこれらは非標準オプションであり予告なしに変更されることがあります。\n help.list.summary = 入力したソースをリストします diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_zh_CN.properties b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_zh_CN.properties index 1c7d184885529..d9fe0e492ea0e 100644 --- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_zh_CN.properties +++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_zh_CN.properties @@ -168,6 +168,7 @@ jshell.console.completion.all.completions = <再次按 Tab 可查看所有可能 jshell.console.no.javadoc = <找不到文档> jshell.console.do.nothing = 不执行任何操作 jshell.console.choice = 选项:\u0020 + jshell.console.create.variable = 创建变量 jshell.console.create.method = 创建方法 jshell.console.resolvable = \n标识符可在此上下文中解析。 @@ -179,7 +180,8 @@ jshell.console.empty = \n空条目。Shift+Tab m 前必须为单个有效的表 jshell.fix.wrong.shortcut =Shift+Tab 后出现意外的字符。\n使用 "i" 表示自动导入,使用 "v" 表示变量创建,使用 "i" 表示方法创建。\n有关详细信息,请参阅:\n/help 快捷方式 -help.usage = 用法: jshell <option>... <load-file>...\n其中,可能的选项包括:\n --class-path <path> 指定用户类文件的查找位置\n --module-path <path> 指定应用程序模块的查找位置\n --add-modules <module>(,<module>)*\n 指定要解析的模块;如果 <module> 为 \n ALL-MODULE-PATHs,则为模块路径中的所有模块\n --enable-native-access\n 允许代码运行受限的本机方法\n --enable-preview 允许代码依赖于此发行版的预览功能\n --startup <file> 对启动定义执行单次替换\n --no-startup 不运行启动定义\n --feedback <mode> 指定初始反馈模式。该模式可以是\n 预定义的(silent、concise、normal 或 verbose),\n 也可以是用户以前定义的\n -q 无提示反馈。等同于:--feedback concise\n -s 真正无提示反馈。等同于:--feedback silent\n -v 详细反馈。等同于:--feedback verbose\n -J<flag> 直接将 <flag> 传递到运行时系统。\n 为每个运行时标记或标记参数使用一个 -J\n -R<flag> 将 <flag> 传递到远程运行时系统。\n 为每个远程标记或标记参数使用一个 -R\n -C<flag> 将 <flag> 传递到编译器。\n 为每个编译器标记或标记参数使用一个 -C\n --version 输出版本信息并退出\n --show-version 输出版本信息并继续\n --help, -?, -h 输出标准选项的此提要并退出\n --help-extra, -X 输出非标准选项的帮助并退出\n\n文件参数可以是文件名,或者是预定义的文件名之一:DEFAULT、\nPRINTING、TOOLING 或 JAVASE。\n加载文件还可以是 "-",用于指明标准输入,没有交互式 I/O。\n\n有关评估上下文选项(--class-path、--module-path \n和 --add-modules)的详细信息,请参见:\n\t/help context\n\n路径列出要搜索的目录和档案。对于 Windows,请使用\n分号 (;) 来分隔路径中的项。在其他平台上,请使用\n冒号 (:) 来分隔各项。\n +help.usage = 用法: jshell <option>... <load-file>...\n其中,可能的选项包括:\n --class-path <path> 指定用户类文件的查找位置\n --module-path <path> 指定应用程序模块的查找位置\n --add-modules <module>(,<module>)*\n 指定要解析的模块;如果 <module> 为 \n ALL-MODULE-PATHs,则为模块路径中的所有模块\n --enable-native-access\n 允许代码运行受限的本机方法\n --enable-preview 允许代码依赖于此发行版的预览功能\n --startup <file> 对启动定义执行单次替换\n --no-startup 不运行启动定义\n --feedback <mode> 指定初始反馈模式。该模式可以是\n 预定义的(silent、concise、normal 或 verbose),\n 也可以是用户以前定义的\n -q 无提示反馈。等同于:--feedback concise\n -s 真正无提示反馈。等同于:--feedback silent\n -v 详细反馈。等同于:--feedback verbose\n -J<flag> 将 <flag> 传递给运行时系统,但对代码片段的\n 执行没有影响。要指定\n 影响代码片段执行的标记,请使用\n -R<flag>。或者,将 -J<flag> 与\n --execution local 一起使用。\n -R<flag> 仅当执行代码片段时才将 <flag>\n 传递给运行时系统。例如,-R-Dfoo=bar\n 表示执行片段\n System.getProperty("foo") 将返回 "bar"。\n -C<flag> 将 <flag> 传递给 JShell 内的 Java 编译器。\n 例如,-C-Xlint 启用所有建议的\n lint 警告,而 -C--release=<N> 针对\n Java SE N 进行编译,如同已指定 --release N。\n 为每个编译器标记或标记参数使用一个 -C\n --version 输出版本信息并退出\n --show-version 输出版本信息并继续\n --help, -?, -h 输出标准选项的此提要并退出\n --help-extra, -X 输出非标准选项的帮助并退出\n\n文件参数可以是文件名,或者是预定义的文件名之一:DEFAULT、\nPRINTING、TOOLING 或 JAVASE。\n加载文件还可以是 "-",用于指明标准输入,没有交互式 I/O。\n\n有关评估上下文选项(--class-path、--module-path \n和 \ +--add-modules)的更多信息,请参见:\n\t/help context\n\n路径列出要搜索的目录和档案。对于 Windows,请使用\n分号 (;) 来分隔路径中的项。在其他平台上,请使用\n冒号 (:) 来分隔各项。\n help.usage.x = \ --add-exports <模块>/<程序包> 指定要考虑从其定义模块导出\n 的程序包\n --execution <规范> 指定替代执行引擎。\n 其中 <规范> 是 ExecutionControl 规范。\n 有关规范的语法,请参阅程序包\n jdk.jshell.spi 的文档\n \n这些选项是非标准选项,如有更改,恕不另行通知。\n help.list.summary = 列出您键入的源 From eb2488fd1781af49d936348d5f75731de2006ce7 Mon Sep 17 00:00:00 2001 From: Calvin Cheung <ccheung@openjdk.org> Date: Fri, 14 Jun 2024 01:18:30 +0000 Subject: [PATCH 066/471] 8330198: Add some class loading related perf counters to measure VM startup Co-authored-by: Vladimir Ivanov <vlivanov@openjdk.org> Reviewed-by: iklam, dholmes --- src/hotspot/share/cds/dynamicArchive.cpp | 4 ++ src/hotspot/share/classfile/classLoader.cpp | 50 ++++++++++++++++++- src/hotspot/share/classfile/classLoader.hpp | 32 ++++++++++++ .../share/interpreter/linkResolver.cpp | 11 +++- src/hotspot/share/logging/logTag.hpp | 1 + src/hotspot/share/oops/constantPool.cpp | 16 ++++-- src/hotspot/share/oops/instanceKlass.cpp | 2 + src/hotspot/share/oops/method.cpp | 9 ++++ src/hotspot/share/runtime/arguments.cpp | 7 +++ src/hotspot/share/runtime/java.cpp | 4 +- src/hotspot/share/runtime/perfData.cpp | 7 +-- src/hotspot/share/runtime/perfData.hpp | 15 ++++-- src/hotspot/share/runtime/sharedRuntime.cpp | 6 +++ src/hotspot/share/runtime/threads.cpp | 6 +++ 14 files changed, 154 insertions(+), 16 deletions(-) diff --git a/src/hotspot/share/cds/dynamicArchive.cpp b/src/hotspot/share/cds/dynamicArchive.cpp index 5effa4e458c98..04c60b89580b3 100644 --- a/src/hotspot/share/cds/dynamicArchive.cpp +++ b/src/hotspot/share/cds/dynamicArchive.cpp @@ -31,6 +31,7 @@ #include "cds/classPrelinker.hpp" #include "cds/dynamicArchive.hpp" #include "cds/regeneratedClasses.hpp" +#include "classfile/classLoader.hpp" #include "classfile/classLoaderData.inline.hpp" #include "classfile/symbolTable.hpp" #include "classfile/systemDictionaryShared.hpp" @@ -118,6 +119,9 @@ class DynamicArchiveBuilder : public ArchiveBuilder { return; } + log_info(cds,dynamic)("CDS dynamic dump: clinit = " JLONG_FORMAT "ms)", + ClassLoader::class_init_time_ms()); + init_header(); gather_source_objs(); gather_array_klasses(); diff --git a/src/hotspot/share/classfile/classLoader.cpp b/src/hotspot/share/classfile/classLoader.cpp index b317aaa071cf8..910cbe48c5c19 100644 --- a/src/hotspot/share/classfile/classLoader.cpp +++ b/src/hotspot/share/classfile/classLoader.cpp @@ -78,6 +78,7 @@ #include "utilities/classpathStream.hpp" #include "utilities/events.hpp" #include "utilities/macros.hpp" +#include "utilities/ostream.hpp" #include "utilities/utf8.hpp" // Entry point in java.dll for path canonicalization @@ -118,9 +119,40 @@ PerfCounter* ClassLoader::_perf_define_appclass_time = nullptr; PerfCounter* ClassLoader::_perf_define_appclass_selftime = nullptr; PerfCounter* ClassLoader::_perf_app_classfile_bytes_read = nullptr; PerfCounter* ClassLoader::_perf_sys_classfile_bytes_read = nullptr; +PerfCounter* ClassLoader::_perf_ik_link_methods_time = nullptr; +PerfCounter* ClassLoader::_perf_method_adapters_time = nullptr; +PerfCounter* ClassLoader::_perf_ik_link_methods_count = nullptr; +PerfCounter* ClassLoader::_perf_method_adapters_count = nullptr; PerfCounter* ClassLoader::_unsafe_defineClassCallCounter = nullptr; PerfCounter* ClassLoader::_perf_secondary_hash_time = nullptr; +PerfCounter* ClassLoader::_perf_resolve_indy_time = nullptr; +PerfCounter* ClassLoader::_perf_resolve_invokehandle_time = nullptr; +PerfCounter* ClassLoader::_perf_resolve_mh_time = nullptr; +PerfCounter* ClassLoader::_perf_resolve_mt_time = nullptr; + +PerfCounter* ClassLoader::_perf_resolve_indy_count = nullptr; +PerfCounter* ClassLoader::_perf_resolve_invokehandle_count = nullptr; +PerfCounter* ClassLoader::_perf_resolve_mh_count = nullptr; +PerfCounter* ClassLoader::_perf_resolve_mt_count = nullptr; + +void ClassLoader::print_counters(outputStream *st) { + // The counters are only active if the logging is enabled, but + // we print to the passed in outputStream as requested. + if (log_is_enabled(Info, perf, class, link)) { + st->print_cr("ClassLoader:"); + st->print_cr(" clinit: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", ClassLoader::class_init_time_ms(), ClassLoader::class_init_count()); + st->print_cr(" link methods: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_ik_link_methods_time->get_value()) , _perf_ik_link_methods_count->get_value()); + st->print_cr(" method adapters: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_method_adapters_time->get_value()) , _perf_method_adapters_count->get_value()); + st->print_cr(" resolve..."); + st->print_cr(" invokedynamic: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_indy_time->get_value()) , _perf_resolve_indy_count->get_value()); + st->print_cr(" invokehandle: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_invokehandle_time->get_value()) , _perf_resolve_invokehandle_count->get_value()); + st->print_cr(" CP_MethodHandle: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_mh_time->get_value()) , _perf_resolve_mh_count->get_value()); + st->print_cr(" CP_MethodType: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_mt_time->get_value()) , _perf_resolve_mt_count->get_value()); + st->cr(); + } +} + GrowableArray<ModuleClassPathList*>* ClassLoader::_patch_mod_entries = nullptr; GrowableArray<ModuleClassPathList*>* ClassLoader::_exploded_entries = nullptr; ClassPathEntry* ClassLoader::_jrt_entry = nullptr; @@ -1336,9 +1368,25 @@ void ClassLoader::initialize(TRAPS) { NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self"); NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes"); NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes"); - NEWPERFEVENTCOUNTER(_unsafe_defineClassCallCounter, SUN_CLS, "unsafeDefineClassCalls"); NEWPERFTICKCOUNTER(_perf_secondary_hash_time, SUN_CLS, "secondarySuperHashTime"); + + if (log_is_enabled(Info, perf, class, link)) { + NEWPERFTICKCOUNTER(_perf_ik_link_methods_time, SUN_CLS, "linkMethodsTime"); + NEWPERFTICKCOUNTER(_perf_method_adapters_time, SUN_CLS, "makeAdaptersTime"); + NEWPERFEVENTCOUNTER(_perf_ik_link_methods_count, SUN_CLS, "linkMethodsCount"); + NEWPERFEVENTCOUNTER(_perf_method_adapters_count, SUN_CLS, "makeAdaptersCount"); + + NEWPERFTICKCOUNTER(_perf_resolve_indy_time, SUN_CLS, "resolve_invokedynamic_time"); + NEWPERFTICKCOUNTER(_perf_resolve_invokehandle_time, SUN_CLS, "resolve_invokehandle_time"); + NEWPERFTICKCOUNTER(_perf_resolve_mh_time, SUN_CLS, "resolve_MethodHandle_time"); + NEWPERFTICKCOUNTER(_perf_resolve_mt_time, SUN_CLS, "resolve_MethodType_time"); + + NEWPERFEVENTCOUNTER(_perf_resolve_indy_count, SUN_CLS, "resolve_invokedynamic_count"); + NEWPERFEVENTCOUNTER(_perf_resolve_invokehandle_count, SUN_CLS, "resolve_invokehandle_count"); + NEWPERFEVENTCOUNTER(_perf_resolve_mh_count, SUN_CLS, "resolve_MethodHandle_count"); + NEWPERFEVENTCOUNTER(_perf_resolve_mt_count, SUN_CLS, "resolve_MethodType_count"); + } } // lookup java library entry points diff --git a/src/hotspot/share/classfile/classLoader.hpp b/src/hotspot/share/classfile/classLoader.hpp index d3ca476ac950b..af625082ddabf 100644 --- a/src/hotspot/share/classfile/classLoader.hpp +++ b/src/hotspot/share/classfile/classLoader.hpp @@ -30,6 +30,7 @@ #include "runtime/perfDataTypes.hpp" #include "utilities/exceptions.hpp" #include "utilities/macros.hpp" +#include "utilities/ostream.hpp" #include "utilities/zipLibrary.hpp" // The VM class loader. @@ -166,6 +167,20 @@ class ClassLoader: AllStatic { static PerfCounter* _perf_define_appclass_selftime; static PerfCounter* _perf_app_classfile_bytes_read; static PerfCounter* _perf_sys_classfile_bytes_read; + static PerfCounter* _perf_ik_link_methods_time; + static PerfCounter* _perf_method_adapters_time; + static PerfCounter* _perf_ik_link_methods_count; + static PerfCounter* _perf_method_adapters_count; + + static PerfCounter* _perf_resolve_indy_time; + static PerfCounter* _perf_resolve_invokehandle_time; + static PerfCounter* _perf_resolve_mh_time; + static PerfCounter* _perf_resolve_mt_time; + + static PerfCounter* _perf_resolve_indy_count; + static PerfCounter* _perf_resolve_invokehandle_count; + static PerfCounter* _perf_resolve_mh_count; + static PerfCounter* _perf_resolve_mt_count; static PerfCounter* _unsafe_defineClassCallCounter; @@ -285,6 +300,23 @@ class ClassLoader: AllStatic { static PerfCounter* perf_app_classfile_bytes_read() { return _perf_app_classfile_bytes_read; } static PerfCounter* perf_sys_classfile_bytes_read() { return _perf_sys_classfile_bytes_read; } + static PerfCounter* perf_ik_link_methods_time() { return _perf_ik_link_methods_time; } + static PerfCounter* perf_method_adapters_time() { return _perf_method_adapters_time; } + static PerfCounter* perf_ik_link_methods_count() { return _perf_ik_link_methods_count; } + static PerfCounter* perf_method_adapters_count() { return _perf_method_adapters_count; } + + static PerfCounter* perf_resolve_invokedynamic_time() { return _perf_resolve_indy_time; } + static PerfCounter* perf_resolve_invokehandle_time() { return _perf_resolve_invokehandle_time; } + static PerfCounter* perf_resolve_method_handle_time() { return _perf_resolve_mh_time; } + static PerfCounter* perf_resolve_method_type_time() { return _perf_resolve_mt_time; } + + static PerfCounter* perf_resolve_invokedynamic_count() { return _perf_resolve_indy_count; } + static PerfCounter* perf_resolve_invokehandle_count() { return _perf_resolve_invokehandle_count; } + static PerfCounter* perf_resolve_method_handle_count() { return _perf_resolve_mh_count; } + static PerfCounter* perf_resolve_method_type_count() { return _perf_resolve_mt_count; } + + static void print_counters(outputStream *st); + // Record how many calls to Unsafe_DefineClass static PerfCounter* unsafe_defineClassCallCounter() { return _unsafe_defineClassCallCounter; diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp index 9b80550130fec..9247b8a1740fc 100644 --- a/src/hotspot/share/interpreter/linkResolver.cpp +++ b/src/hotspot/share/interpreter/linkResolver.cpp @@ -24,6 +24,7 @@ #include "precompiled.hpp" #include "cds/archiveUtils.hpp" +#include "classfile/classLoader.hpp" #include "classfile/defaultMethods.hpp" #include "classfile/javaClasses.hpp" #include "classfile/systemDictionary.hpp" @@ -55,7 +56,8 @@ #include "runtime/fieldDescriptor.inline.hpp" #include "runtime/frame.inline.hpp" #include "runtime/handles.inline.hpp" -#include "runtime/javaThread.hpp" +#include "runtime/javaThread.inline.hpp" +#include "runtime/perfData.hpp" #include "runtime/reflection.hpp" #include "runtime/safepointVerifiers.hpp" #include "runtime/sharedRuntime.hpp" @@ -1728,6 +1730,10 @@ bool LinkResolver::resolve_previously_linked_invokehandle(CallInfo& result, cons } void LinkResolver::resolve_invokehandle(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) { + + PerfTraceTimedEvent timer(ClassLoader::perf_resolve_invokehandle_time(), + ClassLoader::perf_resolve_invokehandle_count()); + LinkInfo link_info(pool, index, Bytecodes::_invokehandle, CHECK); if (log_is_enabled(Info, methodhandles)) { ResourceMark rm(THREAD); @@ -1779,6 +1785,9 @@ void LinkResolver::resolve_handle_call(CallInfo& result, } void LinkResolver::resolve_invokedynamic(CallInfo& result, const constantPoolHandle& pool, int indy_index, TRAPS) { + PerfTraceTimedEvent timer(ClassLoader::perf_resolve_invokedynamic_time(), + ClassLoader::perf_resolve_invokedynamic_count()); + int pool_index = pool->resolved_indy_entry_at(indy_index)->constant_pool_index(); // Resolve the bootstrap specifier (BSM + optional arguments). diff --git a/src/hotspot/share/logging/logTag.hpp b/src/hotspot/share/logging/logTag.hpp index bf60af68770e7..b64097311a440 100644 --- a/src/hotspot/share/logging/logTag.hpp +++ b/src/hotspot/share/logging/logTag.hpp @@ -110,6 +110,7 @@ class outputStream; LOG_TAG(jvmti) \ LOG_TAG(lambda) \ LOG_TAG(library) \ + LOG_TAG(link) \ LOG_TAG(liveness) \ LOG_TAG(load) /* Trace all classes loaded */ \ LOG_TAG(loader) \ diff --git a/src/hotspot/share/oops/constantPool.cpp b/src/hotspot/share/oops/constantPool.cpp index 85cc5a77f1ed8..329b8157cb73b 100644 --- a/src/hotspot/share/oops/constantPool.cpp +++ b/src/hotspot/share/oops/constantPool.cpp @@ -29,6 +29,7 @@ #include "cds/cdsConfig.hpp" #include "cds/classPrelinker.hpp" #include "cds/heapShared.hpp" +#include "classfile/classLoader.hpp" #include "classfile/classLoaderData.hpp" #include "classfile/javaClasses.inline.hpp" #include "classfile/metadataOnStackMark.hpp" @@ -62,7 +63,8 @@ #include "runtime/handles.inline.hpp" #include "runtime/init.hpp" #include "runtime/javaCalls.hpp" -#include "runtime/javaThread.hpp" +#include "runtime/javaThread.inline.hpp" +#include "runtime/perfData.hpp" #include "runtime/signature.hpp" #include "runtime/vframe.inline.hpp" #include "utilities/checkedCast.hpp" @@ -1014,7 +1016,9 @@ oop ConstantPool::resolve_constant_at_impl(const constantPoolHandle& this_cp, } case JVM_CONSTANT_Dynamic: - { + { PerfTraceTimedEvent timer(ClassLoader::perf_resolve_invokedynamic_time(), + ClassLoader::perf_resolve_invokedynamic_count()); + // Resolve the Dynamically-Computed constant to invoke the BSM in order to obtain the resulting oop. BootstrapInfo bootstrap_specifier(this_cp, cp_index); @@ -1072,7 +1076,9 @@ oop ConstantPool::resolve_constant_at_impl(const constantPoolHandle& this_cp, break; case JVM_CONSTANT_MethodHandle: - { + { PerfTraceTimedEvent timer(ClassLoader::perf_resolve_method_handle_time(), + ClassLoader::perf_resolve_method_handle_count()); + int ref_kind = this_cp->method_handle_ref_kind_at(cp_index); int callee_index = this_cp->method_handle_klass_index_at(cp_index); Symbol* name = this_cp->method_handle_name_ref_at(cp_index); @@ -1120,7 +1126,9 @@ oop ConstantPool::resolve_constant_at_impl(const constantPoolHandle& this_cp, } case JVM_CONSTANT_MethodType: - { + { PerfTraceTimedEvent timer(ClassLoader::perf_resolve_method_type_time(), + ClassLoader::perf_resolve_method_type_count()); + Symbol* signature = this_cp->method_type_signature_at(cp_index); { ResourceMark rm(THREAD); log_debug(class, resolve)("resolve JVM_CONSTANT_MethodType [%d/%d] %s", diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index d66ce5ce247ef..83dde12af3ddc 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -978,6 +978,8 @@ void InstanceKlass::rewrite_class(TRAPS) { // This is outside is_rewritten flag. In case of an exception, it can be // executed more than once. void InstanceKlass::link_methods(TRAPS) { + PerfTraceTime timer(ClassLoader::perf_ik_link_methods_time()); + int len = methods()->length(); for (int i = len-1; i >= 0; i--) { methodHandle m(THREAD, methods()->at(i)); diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp index a5b2267cf33ff..525ec284c086a 100644 --- a/src/hotspot/share/oops/method.cpp +++ b/src/hotspot/share/oops/method.cpp @@ -26,6 +26,7 @@ #include "cds/cdsConfig.hpp" #include "cds/cppVtables.hpp" #include "cds/metaspaceShared.hpp" +#include "classfile/classLoader.hpp" #include "classfile/classLoaderDataGraph.hpp" #include "classfile/metadataOnStackMark.hpp" #include "classfile/symbolTable.hpp" @@ -62,12 +63,14 @@ #include "prims/jvmtiExport.hpp" #include "prims/methodHandles.hpp" #include "runtime/atomic.hpp" +#include "runtime/arguments.hpp" #include "runtime/continuationEntry.hpp" #include "runtime/frame.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/init.hpp" #include "runtime/java.hpp" #include "runtime/orderAccess.hpp" +#include "runtime/perfData.hpp" #include "runtime/relocator.hpp" #include "runtime/safepointVerifiers.hpp" #include "runtime/sharedRuntime.hpp" @@ -1168,6 +1171,10 @@ void Method::remove_unshareable_flags() { // Called when the method_holder is getting linked. Setup entrypoints so the method // is ready to be called from interpreter, compiler, and vtables. void Method::link_method(const methodHandle& h_method, TRAPS) { + if (log_is_enabled(Info, perf, class, link)) { + ClassLoader::perf_ik_link_methods_count()->inc(); + } + // If the code cache is full, we may reenter this function for the // leftover methods that weren't linked. if (adapter() != nullptr) { @@ -1219,6 +1226,8 @@ void Method::link_method(const methodHandle& h_method, TRAPS) { } address Method::make_adapters(const methodHandle& mh, TRAPS) { + PerfTraceTime timer(ClassLoader::perf_method_adapters_time()); + // Adapters for compiled code are made eagerly here. They are fairly // small (generally < 100 bytes) and quick to make (and cached and shared) // so making them eagerly shouldn't be too expensive. diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 6680851405f5f..10a4c06d53c11 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -3729,6 +3729,13 @@ jint Arguments::apply_ergo() { } #endif // COMPILER2_OR_JVMCI + if (log_is_enabled(Info, perf, class, link)) { + if (!UsePerfData) { + warning("Disabling -Xlog:perf+class+link since UsePerfData is turned off."); + LogConfiguration::configure_stdout(LogLevel::Off, false, LOG_TAGS(perf, class, link)); + } + } + if (FLAG_IS_CMDLINE(DiagnoseSyncOnValueBasedClasses)) { if (DiagnoseSyncOnValueBasedClasses == ObjectSynchronizer::LOG_WARNING && !log_is_enabled(Info, valuebasedclasses)) { LogConfiguration::configure_stdout(LogLevel::Info, true, LOG_TAGS(valuebasedclasses)); diff --git a/src/hotspot/share/runtime/java.cpp b/src/hotspot/share/runtime/java.cpp index 5271bdcda0be6..f4d9152c8a5af 100644 --- a/src/hotspot/share/runtime/java.cpp +++ b/src/hotspot/share/runtime/java.cpp @@ -25,6 +25,7 @@ #include "precompiled.hpp" #include "cds/cds_globals.hpp" #include "cds/dynamicArchive.hpp" +#include "classfile/classLoader.hpp" #include "classfile/classLoaderDataGraph.hpp" #include "classfile/javaClasses.hpp" #include "classfile/stringTable.hpp" @@ -156,7 +157,6 @@ static void print_method_profiling_data() { } } - #ifndef PRODUCT // Statistics printing (method invocation histogram) @@ -356,6 +356,8 @@ void print_statistics() { } ThreadsSMRSupport::log_statistics(); + + ClassLoader::print_counters(tty); } // Note: before_exit() can be executed only once, if more than one threads diff --git a/src/hotspot/share/runtime/perfData.cpp b/src/hotspot/share/runtime/perfData.cpp index b195274dc016c..5e78baad3ab2a 100644 --- a/src/hotspot/share/runtime/perfData.cpp +++ b/src/hotspot/share/runtime/perfData.cpp @@ -296,7 +296,7 @@ void PerfDataManager::add_item(PerfData* p, bool sampled) { _has_PerfData = true; } - assert(!_all->contains(p->name()), "duplicate name added"); + assert(!_all->contains(p->name()), "duplicate name added: %s", p->name()); // add to the list of all perf data items _all->append(p); @@ -527,8 +527,3 @@ PerfDataList* PerfDataList::clone() { return copy; } -PerfTraceTime::~PerfTraceTime() { - if (!UsePerfData) return; - _t.stop(); - _timerp->inc(_t.ticks()); -} diff --git a/src/hotspot/share/runtime/perfData.hpp b/src/hotspot/share/runtime/perfData.hpp index 103e2698d9b9e..1f75560715ab9 100644 --- a/src/hotspot/share/runtime/perfData.hpp +++ b/src/hotspot/share/runtime/perfData.hpp @@ -831,11 +831,20 @@ class PerfTraceTime : public StackObj { public: inline PerfTraceTime(PerfLongCounter* timerp) : _timerp(timerp) { - if (!UsePerfData) return; + if (!UsePerfData || timerp == nullptr) { return; } _t.start(); } - ~PerfTraceTime(); + const char* name() const { + assert(_timerp != nullptr, "sanity"); + return _timerp->name(); + } + + ~PerfTraceTime() { + if (!UsePerfData || !_t.is_active()) { return; } + _t.stop(); + _timerp->inc(_t.ticks()); + } }; /* The PerfTraceTimedEvent class is responsible for counting the @@ -864,7 +873,7 @@ class PerfTraceTimedEvent : public PerfTraceTime { public: inline PerfTraceTimedEvent(PerfLongCounter* timerp, PerfLongCounter* eventp): PerfTraceTime(timerp), _eventp(eventp) { - if (!UsePerfData) return; + if (!UsePerfData || timerp == nullptr) { return; } _eventp->inc(); } diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp index 0a7f5c5467668..f794a15ac070b 100644 --- a/src/hotspot/share/runtime/sharedRuntime.cpp +++ b/src/hotspot/share/runtime/sharedRuntime.cpp @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/classLoader.hpp" #include "classfile/javaClasses.inline.hpp" #include "classfile/stringTable.hpp" #include "classfile/vmClasses.hpp" @@ -55,6 +56,7 @@ #include "prims/jvmtiThreadState.hpp" #include "prims/methodHandles.hpp" #include "prims/nativeLookup.hpp" +#include "runtime/arguments.hpp" #include "runtime/atomic.hpp" #include "runtime/frame.inline.hpp" #include "runtime/handles.inline.hpp" @@ -63,6 +65,7 @@ #include "runtime/java.hpp" #include "runtime/javaCalls.hpp" #include "runtime/jniHandles.inline.hpp" +#include "runtime/perfData.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/stackWatermarkSet.hpp" #include "runtime/stubRoutines.hpp" @@ -2570,6 +2573,9 @@ AdapterHandlerEntry* AdapterHandlerLibrary::create_adapter(AdapterBlob*& new_ada int total_args_passed, BasicType* sig_bt, bool allocate_code_blob) { + if (log_is_enabled(Info, perf, class, link)) { + ClassLoader::perf_method_adapters_count()->inc(); + } // StubRoutines::_final_stubs_code is initialized after this function can be called. As a result, // VerifyAdapterCalls and VerifyAdapterSharing can fail if we re-use code that generated prior diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index e7c425b2b8cd6..e65470ac52692 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -821,6 +821,12 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { MetaspaceShared::preload_and_dump(); } + if (log_is_enabled(Info, perf, class, link)) { + LogStreamHandle(Info, perf, class, link) log; + log.print_cr("At VM initialization completion:"); + ClassLoader::print_counters(&log); + } + return JNI_OK; } From b818679ebafff6adb2be4edbe21245882a751d2e Mon Sep 17 00:00:00 2001 From: Ioi Lam <iklam@openjdk.org> Date: Fri, 14 Jun 2024 06:06:24 +0000 Subject: [PATCH 067/471] 8293980: Resolve CONSTANT_FieldRef at CDS dump time Reviewed-by: erikj, matsaave, heidinga --- make/GenerateLinkOptData.gmk | 13 +- src/hotspot/share/cds/archiveBuilder.cpp | 18 ++ src/hotspot/share/cds/archiveBuilder.hpp | 5 + src/hotspot/share/cds/archiveUtils.cpp | 2 +- src/hotspot/share/cds/classListParser.cpp | 139 +++++++++- src/hotspot/share/cds/classListParser.hpp | 22 +- src/hotspot/share/cds/classListWriter.cpp | 96 ++++++- src/hotspot/share/cds/classListWriter.hpp | 6 +- src/hotspot/share/cds/classPrelinker.cpp | 246 +++++++++++++----- src/hotspot/share/cds/classPrelinker.hpp | 21 +- src/hotspot/share/cds/dumpAllocStats.cpp | 14 +- src/hotspot/share/cds/dumpAllocStats.hpp | 23 +- src/hotspot/share/cds/lambdaFormInvokers.hpp | 4 +- .../share/cds/lambdaFormInvokers.inline.hpp | 38 +++ .../share/interpreter/interpreterRuntime.cpp | 18 +- .../share/interpreter/interpreterRuntime.hpp | 9 +- .../share/interpreter/linkResolver.cpp | 9 +- .../share/interpreter/linkResolver.hpp | 11 +- src/hotspot/share/oops/constantPool.cpp | 168 ++++++++---- src/hotspot/share/oops/constantPool.hpp | 6 +- src/hotspot/share/oops/cpCache.cpp | 44 +++- src/hotspot/share/oops/cpCache.hpp | 6 +- src/hotspot/share/oops/instanceKlass.cpp | 4 +- src/hotspot/share/oops/resolvedFieldEntry.cpp | 11 +- src/hotspot/share/oops/resolvedFieldEntry.hpp | 26 +- src/hotspot/share/oops/resolvedIndyEntry.cpp | 10 +- src/hotspot/share/oops/resolvedIndyEntry.hpp | 5 +- .../share/oops/resolvedMethodEntry.cpp | 16 +- .../share/oops/resolvedMethodEntry.hpp | 5 +- src/hotspot/share/prims/jvm.cpp | 2 +- src/hotspot/share/runtime/java.cpp | 5 + test/hotspot/jtreg/TEST.groups | 1 + .../resolvedConstants/ResolvedConstants.java | 128 +++++++++ .../resolvedConstants/ResolvedPutField.java | 72 +++++ .../ResolvedPutFieldHelper.jasm | 89 +++++++ 35 files changed, 1119 insertions(+), 173 deletions(-) create mode 100644 src/hotspot/share/cds/lambdaFormInvokers.inline.hpp create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutField.java create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutFieldHelper.jasm diff --git a/make/GenerateLinkOptData.gmk b/make/GenerateLinkOptData.gmk index 576bc4190b960..5052e4c0358c8 100644 --- a/make/GenerateLinkOptData.gmk +++ b/make/GenerateLinkOptData.gmk @@ -62,6 +62,15 @@ ifeq ($(EXTERNAL_BUILDJDK), true) INTERIM_IMAGE_DIR := $(BUILD_JDK) endif +# These are needed for deterministic classlist: +# - The classlist can be influenced by locale. Always set it to en/US. +# - Run with -Xint, as the compiler can speculatively resolve constant pool entries. +# - ForkJoinPool parallelism can cause constant pool resolution to be non-deterministic. +CLASSLIST_FILE_VM_OPTS = \ + -Duser.language=en -Duser.country=US \ + -Xint \ + -Djava.util.concurrent.ForkJoinPool.common.parallelism=0 + # Save the stderr output of the command and print it along with stdout in case # something goes wrong. $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXECUTABLE_SUFFIX) $(CLASSLIST_JAR) @@ -69,7 +78,7 @@ $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXECUTABLE_SUFFIX) $(CLASSLIST $(call LogInfo, Generating $(patsubst $(OUTPUTDIR)/%, %, $@)) $(call LogInfo, Generating $(patsubst $(OUTPUTDIR)/%, %, $(JLI_TRACE_FILE))) $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.raw \ - -Duser.language=en -Duser.country=US \ + $(CLASSLIST_FILE_VM_OPTS) \ -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \ build.tools.classlist.HelloClasslist $(LOG_DEBUG) $(GREP) -v HelloClasslist $@.raw > $@.interim @@ -79,7 +88,7 @@ $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXECUTABLE_SUFFIX) $(CLASSLIST $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.raw.2 \ -XX:SharedClassListFile=$@.interim -XX:SharedArchiveFile=$@.jsa \ -Djava.lang.invoke.MethodHandle.TRACE_RESOLVE=true \ - -Duser.language=en -Duser.country=US \ + $(CLASSLIST_FILE_VM_OPTS) \ --module-path $(SUPPORT_OUTPUTDIR)/classlist.jar \ -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \ build.tools.classlist.HelloClasslist \ diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp index a98fd04ba6862..72e45a7998ce9 100644 --- a/src/hotspot/share/cds/archiveBuilder.cpp +++ b/src/hotspot/share/cds/archiveBuilder.cpp @@ -717,6 +717,14 @@ void ArchiveBuilder::write_pointer_in_buffer(address* ptr_location, address src_ } } +void ArchiveBuilder::mark_and_relocate_to_buffered_addr(address* ptr_location) { + assert(*ptr_location != nullptr, "sanity"); + if (!is_in_mapped_static_archive(*ptr_location)) { + *ptr_location = get_buffered_addr(*ptr_location); + } + ArchivePtrMarker::mark_pointer(ptr_location); +} + address ArchiveBuilder::get_buffered_addr(address src_addr) const { SourceObjInfo* p = _src_obj_table.get(src_addr); assert(p != nullptr, "src_addr " INTPTR_FORMAT " is used but has not been archived", @@ -755,6 +763,16 @@ void ArchiveBuilder::make_klasses_shareable() { int num_obj_array_klasses = 0; int num_type_array_klasses = 0; + for (int i = 0; i < klasses()->length(); i++) { + // Some of the code in ConstantPool::remove_unshareable_info() requires the classes + // to be in linked state, so it must be call here before the next loop, which returns + // all classes to unlinked state. + Klass* k = get_buffered_addr(klasses()->at(i)); + if (k->is_instance_klass()) { + InstanceKlass::cast(k)->constants()->remove_unshareable_info(); + } + } + for (int i = 0; i < klasses()->length(); i++) { const char* type; const char* unlinked = ""; diff --git a/src/hotspot/share/cds/archiveBuilder.hpp b/src/hotspot/share/cds/archiveBuilder.hpp index cbde5a7e02cbc..ad0302137f55e 100644 --- a/src/hotspot/share/cds/archiveBuilder.hpp +++ b/src/hotspot/share/cds/archiveBuilder.hpp @@ -408,6 +408,11 @@ class ArchiveBuilder : public StackObj { write_pointer_in_buffer((address*)ptr_location, (address)src_addr); } + void mark_and_relocate_to_buffered_addr(address* ptr_location); + template <typename T> void mark_and_relocate_to_buffered_addr(T ptr_location) { + mark_and_relocate_to_buffered_addr((address*)ptr_location); + } + address get_buffered_addr(address src_addr) const; template <typename T> T get_buffered_addr(T src_addr) const { return (T)get_buffered_addr((address)src_addr); diff --git a/src/hotspot/share/cds/archiveUtils.cpp b/src/hotspot/share/cds/archiveUtils.cpp index 8fd20e2026700..76cfa441fa7f8 100644 --- a/src/hotspot/share/cds/archiveUtils.cpp +++ b/src/hotspot/share/cds/archiveUtils.cpp @@ -357,7 +357,7 @@ void ArchiveUtils::log_to_classlist(BootstrapInfo* bootstrap_specifier, TRAPS) { ResourceMark rm(THREAD); int pool_index = bootstrap_specifier->bss_index(); ClassListWriter w; - w.stream()->print("%s %s", LAMBDA_PROXY_TAG, pool->pool_holder()->name()->as_C_string()); + w.stream()->print("%s %s", ClassListParser::lambda_proxy_tag(), pool->pool_holder()->name()->as_C_string()); CDSIndyInfo cii; ClassListParser::populate_cds_indy_info(pool, pool_index, &cii, CHECK); GrowableArray<const char*>* indy_items = cii.items(); diff --git a/src/hotspot/share/cds/classListParser.cpp b/src/hotspot/share/cds/classListParser.cpp index 4455dd7db1b02..9ee5f25aa8918 100644 --- a/src/hotspot/share/cds/classListParser.cpp +++ b/src/hotspot/share/cds/classListParser.cpp @@ -25,6 +25,7 @@ #include "precompiled.hpp" #include "cds/archiveUtils.hpp" #include "cds/classListParser.hpp" +#include "cds/classPrelinker.hpp" #include "cds/lambdaFormInvokers.hpp" #include "cds/metaspaceShared.hpp" #include "cds/unregisteredClasses.hpp" @@ -52,6 +53,10 @@ #include "utilities/macros.hpp" #include "utilities/utf8.hpp" +const char* ClassListParser::CONSTANT_POOL_TAG = "@cp"; +const char* ClassListParser::LAMBDA_FORM_TAG = "@lambda-form-invoker"; +const char* ClassListParser::LAMBDA_PROXY_TAG = "@lambda-proxy"; + volatile Thread* ClassListParser::_parsing_thread = nullptr; ClassListParser* ClassListParser::_instance = nullptr; @@ -299,6 +304,9 @@ void ClassListParser::parse_at_tags(TRAPS) { } } else if (strcmp(_token, LAMBDA_FORM_TAG) == 0) { LambdaFormInvokers::append(os::strdup((const char*)(_line + offset), mtInternal)); + } else if (strcmp(_token, CONSTANT_POOL_TAG) == 0) { + _token = _line + offset; + parse_constant_pool_tag(); } else { error("Invalid @ tag at the beginning of line \"%s\" line #%zu", _token, lineno()); } @@ -395,9 +403,14 @@ void ClassListParser::print_actual_interfaces(InstanceKlass* ik) { jio_fprintf(defaultStream::error_stream(), "}\n"); } -void ClassListParser::error(const char* msg, ...) { +void ClassListParser::print_diagnostic_info(outputStream* st, const char* msg, ...) { va_list ap; va_start(ap, msg); + print_diagnostic_info(st, msg, ap); + va_end(ap); +} + +void ClassListParser::print_diagnostic_info(outputStream* st, const char* msg, va_list ap) { int error_index = pointer_delta_as_int(_token, _line); if (error_index >= _line_len) { error_index = _line_len - 1; @@ -412,25 +425,34 @@ void ClassListParser::error(const char* msg, ...) { jio_vfprintf(defaultStream::error_stream(), msg, ap); if (_line_len <= 0) { - jio_fprintf(defaultStream::error_stream(), "\n"); + st->print("\n"); } else { - jio_fprintf(defaultStream::error_stream(), ":\n"); + st->print(":\n"); for (int i=0; i<_line_len; i++) { char c = _line[i]; if (c == '\0') { - jio_fprintf(defaultStream::error_stream(), "%s", " "); + st->print("%s", " "); } else { - jio_fprintf(defaultStream::error_stream(), "%c", c); + st->print("%c", c); } } - jio_fprintf(defaultStream::error_stream(), "\n"); + st->print("\n"); for (int i=0; i<error_index; i++) { - jio_fprintf(defaultStream::error_stream(), "%s", " "); + st->print("%s", " "); } - jio_fprintf(defaultStream::error_stream(), "^\n"); + st->print("^\n"); } - va_end(ap); +} +void ClassListParser::error(const char* msg, ...) { + va_list ap; + va_start(ap, msg); + fileStream fs(defaultStream::error_stream()); + //TODO: we should write to UL/error instead, but that requires fixing some tests cases. + //LogTarget(Error, cds) lt; + //LogStream ls(lt); + print_diagnostic_info(&fs, msg, ap); + va_end(ap); vm_exit_during_initialization("class list format error.", nullptr); } @@ -453,6 +475,16 @@ void ClassListParser::check_class_name(const char* class_name) { } } +void ClassListParser::constant_pool_resolution_warning(const char* msg, ...) { + va_list ap; + va_start(ap, msg); + LogTarget(Warning, cds, resolve) lt; + LogStream ls(lt); + print_diagnostic_info(&ls, msg, ap); + ls.print("Your classlist may be out of sync with the JDK or the application."); + va_end(ap); +} + // This function is used for loading classes for customized class loaders // during archive dumping. InstanceKlass* ClassListParser::load_class_from_source(Symbol* class_name, TRAPS) { @@ -727,3 +759,92 @@ InstanceKlass* ClassListParser::lookup_interface_for_current_class(Symbol* inter ShouldNotReachHere(); return nullptr; } + +InstanceKlass* ClassListParser::find_builtin_class_helper(JavaThread* current, Symbol* class_name_symbol, oop class_loader_oop) { + Handle class_loader(current, class_loader_oop); + Handle protection_domain; + return SystemDictionary::find_instance_klass(current, class_name_symbol, class_loader, protection_domain); +} + +InstanceKlass* ClassListParser::find_builtin_class(JavaThread* current, const char* class_name) { + TempNewSymbol class_name_symbol = SymbolTable::new_symbol(class_name); + InstanceKlass* ik; + + if ( (ik = find_builtin_class_helper(current, class_name_symbol, nullptr)) != nullptr + || (ik = find_builtin_class_helper(current, class_name_symbol, SystemDictionary::java_platform_loader())) != nullptr + || (ik = find_builtin_class_helper(current, class_name_symbol, SystemDictionary::java_system_loader())) != nullptr) { + return ik; + } else { + return nullptr; + } +} + +void ClassListParser::parse_constant_pool_tag() { + if (parse_lambda_forms_invokers_only()) { + return; + } + + JavaThread* THREAD = JavaThread::current(); + skip_whitespaces(); + char* class_name = _token; + skip_non_whitespaces(); + *_token = '\0'; + _token ++; + + InstanceKlass* ik = find_builtin_class(THREAD, class_name); + if (ik == nullptr) { + _token = class_name; + if (strstr(class_name, "/$Proxy") != nullptr || + strstr(class_name, "MethodHandle$Species_") != nullptr) { + // ignore -- TODO: we should filter these out in classListWriter.cpp + } else { + constant_pool_resolution_warning("class %s is not (yet) loaded by one of the built-in loaders", class_name); + } + return; + } + + ResourceMark rm(THREAD); + constantPoolHandle cp(THREAD, ik->constants()); + GrowableArray<bool> preresolve_list(cp->length(), cp->length(), false); + bool preresolve_class = false; + bool preresolve_fmi = false; + bool preresolve_indy = false; + + while (*_token) { + int cp_index; + skip_whitespaces(); + parse_uint(&cp_index); + if (cp_index < 1 || cp_index >= cp->length()) { + constant_pool_resolution_warning("Invalid constant pool index %d", cp_index); + return; + } else { + preresolve_list.at_put(cp_index, true); + } + constantTag cp_tag = cp->tag_at(cp_index); + switch (cp_tag.value()) { + case JVM_CONSTANT_UnresolvedClass: + preresolve_class = true; + break; + case JVM_CONSTANT_UnresolvedClassInError: + case JVM_CONSTANT_Class: + // ignore + break; + case JVM_CONSTANT_Fieldref: + preresolve_fmi = true; + break; + break; + default: + constant_pool_resolution_warning("Unsupported constant pool index %d: %s (type=%d)", + cp_index, cp_tag.internal_name(), cp_tag.value()); + return; + } + } + + if (preresolve_class) { + ClassPrelinker::preresolve_class_cp_entries(THREAD, ik, &preresolve_list); + } + if (preresolve_fmi) { + ClassPrelinker::preresolve_field_and_method_cp_entries(THREAD, ik, &preresolve_list); + } +} + diff --git a/src/hotspot/share/cds/classListParser.hpp b/src/hotspot/share/cds/classListParser.hpp index 50ede4f6dff47..540e61335d0ad 100644 --- a/src/hotspot/share/cds/classListParser.hpp +++ b/src/hotspot/share/cds/classListParser.hpp @@ -31,9 +31,6 @@ #include "utilities/istream.hpp" #include "utilities/resizeableResourceHash.hpp" -#define LAMBDA_PROXY_TAG "@lambda-proxy" -#define LAMBDA_FORM_TAG "@lambda-form-invoker" - class constantPoolHandle; class Thread; @@ -68,6 +65,10 @@ class CDSIndyInfo { }; class ClassListParser : public StackObj { + static const char* CONSTANT_POOL_TAG; + static const char* LAMBDA_FORM_TAG; + static const char* LAMBDA_PROXY_TAG; + public: enum ParseMode { _parse_all, @@ -117,17 +118,25 @@ class ClassListParser : public StackObj { void print_actual_interfaces(InstanceKlass *ik); bool is_matching_cp_entry(const constantPoolHandle &pool, int cp_index, TRAPS); + InstanceKlass* find_builtin_class_helper(JavaThread* current, Symbol* class_name_symbol, oop class_loader_oop); + InstanceKlass* find_builtin_class(JavaThread* current, const char* class_name); + void resolve_indy(JavaThread* current, Symbol* class_name_symbol); void resolve_indy_impl(Symbol* class_name_symbol, TRAPS); void clean_up_input_line(); void read_class_name_and_attributes(); void parse_class_name_and_attributes(TRAPS); Klass* load_current_class(Symbol* class_name_symbol, TRAPS); + void parse_constant_pool_tag(); size_t lineno() { return _input_stream.lineno(); } FILE* do_open(const char* file); ClassListParser(const char* file, ParseMode _parse_mode); ~ClassListParser(); + void print_diagnostic_info(outputStream* st, const char* msg, va_list ap) ATTRIBUTE_PRINTF(3, 0); + void print_diagnostic_info(outputStream* st, const char* msg, ...) ATTRIBUTE_PRINTF(3, 0); + void constant_pool_resolution_warning(const char* msg, ...) ATTRIBUTE_PRINTF(2, 0); + void error(const char* msg, ...) ATTRIBUTE_PRINTF(2, 0); public: static void parse_classlist(const char* classlist_path, ParseMode parse_mode, TRAPS) { @@ -141,13 +150,18 @@ class ClassListParser : public StackObj { assert(_instance != nullptr, "must be"); return _instance; } + static const char* lambda_proxy_tag() { + return LAMBDA_PROXY_TAG; + } + static const char* lambda_form_tag() { + return LAMBDA_FORM_TAG; + } void parse(TRAPS); void split_tokens_by_whitespace(int offset, GrowableArray<const char*>* items); int split_at_tag_from_line(); void parse_at_tags(TRAPS); char* _token; - void error(const char* msg, ...); void parse_int(int* value); void parse_uint(int* value); bool try_parse_uint(int* value); diff --git a/src/hotspot/share/cds/classListWriter.cpp b/src/hotspot/share/cds/classListWriter.cpp index 2a65ee51d6edd..97f0bc3476e55 100644 --- a/src/hotspot/share/cds/classListWriter.cpp +++ b/src/hotspot/share/cds/classListWriter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,15 @@ #include "precompiled.hpp" #include "cds/cds_globals.hpp" #include "cds/classListWriter.hpp" +#include "cds/lambdaFormInvokers.inline.hpp" #include "classfile/classFileStream.hpp" #include "classfile/classLoader.hpp" #include "classfile/classLoaderData.hpp" +#include "classfile/classLoaderDataGraph.hpp" #include "classfile/moduleEntry.hpp" #include "classfile/systemDictionaryShared.hpp" #include "memory/resourceArea.hpp" +#include "oops/constantPool.inline.hpp" #include "oops/instanceKlass.hpp" #include "runtime/mutexLocker.hpp" @@ -189,3 +192,94 @@ void ClassListWriter::delete_classlist() { delete _classlist_file; } } + +class ClassListWriter::WriteResolveConstantsCLDClosure : public CLDClosure { +public: + void do_cld(ClassLoaderData* cld) { + for (Klass* klass = cld->klasses(); klass != nullptr; klass = klass->next_link()) { + if (klass->is_instance_klass()) { + InstanceKlass* ik = InstanceKlass::cast(klass); + write_resolved_constants_for(ik); + } + } + } +}; + +void ClassListWriter::write_resolved_constants() { + if (!is_enabled()) { + return; + } + MutexLocker lock(ClassLoaderDataGraph_lock); + MutexLocker lock2(ClassListFile_lock, Mutex::_no_safepoint_check_flag); + + WriteResolveConstantsCLDClosure closure; + ClassLoaderDataGraph::loaded_cld_do(&closure); +} + +void ClassListWriter::write_resolved_constants_for(InstanceKlass* ik) { + if (!SystemDictionaryShared::is_builtin_loader(ik->class_loader_data()) || + ik->is_hidden()) { + return; + } + if (LambdaFormInvokers::may_be_regenerated_class(ik->name())) { + return; + } + if (ik->name()->equals("jdk/internal/module/SystemModules$all")) { + // This class is regenerated during JDK build process, so the classlist + // may not match the version that's in the real jdk image. + return; + } + + if (!has_id(ik)) { // do not resolve CP for classes loaded by custom loaders. + return; + } + + ResourceMark rm; + ConstantPool* cp = ik->constants(); + GrowableArray<bool> list(cp->length(), cp->length(), false); + bool print = false; + + for (int cp_index = 1; cp_index < cp->length(); cp_index++) { // Index 0 is unused + switch (cp->tag_at(cp_index).value()) { + case JVM_CONSTANT_Class: + { + Klass* k = cp->resolved_klass_at(cp_index); + if (k->is_instance_klass()) { + list.at_put(cp_index, true); + print = true; + } + } + break; + } + } + + if (cp->cache() != nullptr) { + Array<ResolvedFieldEntry>* field_entries = cp->cache()->resolved_field_entries(); + if (field_entries != nullptr) { + for (int i = 0; i < field_entries->length(); i++) { + ResolvedFieldEntry* rfe = field_entries->adr_at(i); + if (rfe->is_resolved(Bytecodes::_getstatic) || + rfe->is_resolved(Bytecodes::_putstatic) || + rfe->is_resolved(Bytecodes::_getfield) || + rfe->is_resolved(Bytecodes::_putfield)) { + list.at_put(rfe->constant_pool_index(), true); + print = true; + } + } + } + } + + if (print) { + outputStream* stream = _classlist_file; + stream->print("@cp %s", ik->name()->as_C_string()); + for (int i = 0; i < list.length(); i++) { + if (list.at(i)) { + constantTag cp_tag = cp->tag_at(i).value(); + assert(cp_tag.value() == JVM_CONSTANT_Class || + cp_tag.value() == JVM_CONSTANT_Fieldref, "sanity"); + stream->print(" %d", i); + } + } + stream->cr(); + } +} diff --git a/src/hotspot/share/cds/classListWriter.hpp b/src/hotspot/share/cds/classListWriter.hpp index a6c749fea7c5a..250e7ddf94b47 100644 --- a/src/hotspot/share/cds/classListWriter.hpp +++ b/src/hotspot/share/cds/classListWriter.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,8 @@ class ClassFileStream; class ClassListWriter { #if INCLUDE_CDS class IDTable; + class WriteResolveConstantsCLDClosure; + static fileStream* _classlist_file; static IDTable* _id_table; static int _total_ids; @@ -42,6 +44,7 @@ class ClassListWriter { static int get_id(const InstanceKlass* k); static bool has_id(const InstanceKlass* k); static void assert_locked() { assert_lock_strong(ClassListFile_lock); } + static void write_resolved_constants_for(InstanceKlass* klass); public: ClassListWriter() : _locker(Thread::current(), ClassListFile_lock, Mutex::_no_safepoint_check_flag) {} @@ -66,6 +69,7 @@ class ClassListWriter { static void init() NOT_CDS_RETURN; static void write(const InstanceKlass* k, const ClassFileStream* cfs) NOT_CDS_RETURN; static void write_to_stream(const InstanceKlass* k, outputStream* stream, const ClassFileStream* cfs = nullptr) NOT_CDS_RETURN; + static void write_resolved_constants() NOT_CDS_RETURN; static void delete_classlist() NOT_CDS_RETURN; }; diff --git a/src/hotspot/share/cds/classPrelinker.cpp b/src/hotspot/share/cds/classPrelinker.cpp index 21946ebe9c0a8..223d3937f9354 100644 --- a/src/hotspot/share/cds/classPrelinker.cpp +++ b/src/hotspot/share/cds/classPrelinker.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,12 @@ #include "cds/archiveBuilder.hpp" #include "cds/cdsConfig.hpp" #include "cds/classPrelinker.hpp" +#include "cds/regeneratedClasses.hpp" #include "classfile/systemDictionary.hpp" +#include "classfile/systemDictionaryShared.hpp" #include "classfile/vmClasses.hpp" +#include "interpreter/bytecodeStream.hpp" +#include "interpreter/interpreterRuntime.hpp" #include "memory/resourceArea.hpp" #include "oops/constantPool.inline.hpp" #include "oops/instanceKlass.hpp" @@ -73,33 +77,52 @@ void ClassPrelinker::dispose() { _processed_classes = nullptr; } -bool ClassPrelinker::can_archive_resolved_klass(ConstantPool* cp, int cp_index) { +// Returns true if we CAN PROVE that cp_index will always resolve to +// the same information at both dump time and run time. This is a +// necessary (but not sufficient) condition for pre-resolving cp_index +// during CDS archive assembly. +bool ClassPrelinker::is_resolution_deterministic(ConstantPool* cp, int cp_index) { assert(!is_in_archivebuilder_buffer(cp), "sanity"); - assert(cp->tag_at(cp_index).is_klass(), "must be resolved"); - Klass* resolved_klass = cp->resolved_klass_at(cp_index); - assert(resolved_klass != nullptr, "must be"); + if (cp->tag_at(cp_index).is_klass()) { + // We require cp_index to be already resolved. This is fine for now, are we + // currently archive only CP entries that are already resolved. + Klass* resolved_klass = cp->resolved_klass_at(cp_index); + return resolved_klass != nullptr && is_class_resolution_deterministic(cp->pool_holder(), resolved_klass); + } else if (cp->tag_at(cp_index).is_field()) { + int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); + if (!cp->tag_at(klass_cp_index).is_klass()) { + // Not yet resolved + return false; + } + Klass* k = cp->resolved_klass_at(klass_cp_index); + if (!is_class_resolution_deterministic(cp->pool_holder(), k)) { + return false; + } - return can_archive_resolved_klass(cp->pool_holder(), resolved_klass); + if (!k->is_instance_klass()) { + // TODO: support non instance klasses as well. + return false; + } + + // Here, We don't check if this entry can actually be resolved to a valid Field/Method. + // This method should be called by the ConstantPool to check Fields/Methods that + // have already been successfully resolved. + return true; + } else { + return false; + } } -bool ClassPrelinker::can_archive_resolved_klass(InstanceKlass* cp_holder, Klass* resolved_klass) { +bool ClassPrelinker::is_class_resolution_deterministic(InstanceKlass* cp_holder, Klass* resolved_class) { assert(!is_in_archivebuilder_buffer(cp_holder), "sanity"); - assert(!is_in_archivebuilder_buffer(resolved_klass), "sanity"); - - if (resolved_klass->is_instance_klass()) { - InstanceKlass* ik = InstanceKlass::cast(resolved_klass); - if (is_vm_class(ik)) { // These are safe to resolve. See is_vm_class declaration. - assert(ik->is_shared_boot_class(), "vmClasses must be loaded by boot loader"); - if (cp_holder->is_shared_boot_class()) { - // For now, do this for boot loader only. Other loaders - // must go through ConstantPool::klass_at_impl at runtime - // to put this class in their directory. - - // TODO: we can support the platform and app loaders as well, if we - // preload the vmClasses into these two loaders during VM bootstrap. - return true; - } + assert(!is_in_archivebuilder_buffer(resolved_class), "sanity"); + + if (resolved_class->is_instance_klass()) { + InstanceKlass* ik = InstanceKlass::cast(resolved_class); + + if (!ik->is_shared() && SystemDictionaryShared::is_excluded_class(ik)) { + return false; } if (cp_holder->is_subtype_of(ik)) { @@ -108,20 +131,34 @@ bool ClassPrelinker::can_archive_resolved_klass(InstanceKlass* cp_holder, Klass* return true; } - // TODO -- allow objArray classes, too + if (is_vm_class(ik)) { + if (ik->class_loader() != cp_holder->class_loader()) { + // At runtime, cp_holder() may not be able to resolve to the same + // ik. For example, a different version of ik may be defined in + // cp->pool_holder()'s loader using MethodHandles.Lookup.defineClass(). + return false; + } else { + return true; + } + } + } else if (resolved_class->is_objArray_klass()) { + Klass* elem = ObjArrayKlass::cast(resolved_class)->bottom_klass(); + if (elem->is_instance_klass()) { + return is_class_resolution_deterministic(cp_holder, InstanceKlass::cast(elem)); + } else if (elem->is_typeArray_klass()) { + return true; + } + } else if (resolved_class->is_typeArray_klass()) { + return true; } return false; } void ClassPrelinker::dumptime_resolve_constants(InstanceKlass* ik, TRAPS) { - constantPoolHandle cp(THREAD, ik->constants()); - if (cp->cache() == nullptr || cp->reference_map() == nullptr) { - // The cache may be null if the pool_holder klass fails verification - // at dump time due to missing dependencies. + if (!ik->is_linked()) { return; } - bool first_time; _processed_classes->put_if_absent(ik, &first_time); if (!first_time) { @@ -129,12 +166,9 @@ void ClassPrelinker::dumptime_resolve_constants(InstanceKlass* ik, TRAPS) { return; } + constantPoolHandle cp(THREAD, ik->constants()); for (int cp_index = 1; cp_index < cp->length(); cp_index++) { // Index 0 is unused switch (cp->tag_at(cp_index).value()) { - case JVM_CONSTANT_UnresolvedClass: - maybe_resolve_class(cp, cp_index, CHECK); - break; - case JVM_CONSTANT_String: resolve_string(cp, cp_index, CHECK); // may throw OOM when interning strings. break; @@ -142,43 +176,33 @@ void ClassPrelinker::dumptime_resolve_constants(InstanceKlass* ik, TRAPS) { } } -Klass* ClassPrelinker::find_loaded_class(JavaThread* THREAD, oop class_loader, Symbol* name) { - HandleMark hm(THREAD); - Handle h_loader(THREAD, class_loader); - Klass* k = SystemDictionary::find_instance_or_array_klass(THREAD, name, +// This works only for the boot/platform/app loaders +Klass* ClassPrelinker::find_loaded_class(Thread* current, oop class_loader, Symbol* name) { + HandleMark hm(current); + Handle h_loader(current, class_loader); + Klass* k = SystemDictionary::find_instance_or_array_klass(current, name, h_loader, Handle()); if (k != nullptr) { return k; } - if (class_loader == SystemDictionary::java_system_loader()) { - return find_loaded_class(THREAD, SystemDictionary::java_platform_loader(), name); - } else if (class_loader == SystemDictionary::java_platform_loader()) { - return find_loaded_class(THREAD, nullptr, name); + if (h_loader() == SystemDictionary::java_system_loader()) { + return find_loaded_class(current, SystemDictionary::java_platform_loader(), name); + } else if (h_loader() == SystemDictionary::java_platform_loader()) { + return find_loaded_class(current, nullptr, name); + } else { + assert(h_loader() == nullptr, "This function only works for boot/platform/app loaders %p %p %p", + cast_from_oop<address>(h_loader()), + cast_from_oop<address>(SystemDictionary::java_system_loader()), + cast_from_oop<address>(SystemDictionary::java_platform_loader())); } return nullptr; } -Klass* ClassPrelinker::maybe_resolve_class(constantPoolHandle cp, int cp_index, TRAPS) { - assert(!is_in_archivebuilder_buffer(cp()), "sanity"); - InstanceKlass* cp_holder = cp->pool_holder(); - if (!cp_holder->is_shared_boot_class() && - !cp_holder->is_shared_platform_class() && - !cp_holder->is_shared_app_class()) { - // Don't trust custom loaders, as they may not be well-behaved - // when resolving classes. - return nullptr; - } - - Symbol* name = cp->klass_name_at(cp_index); - Klass* resolved_klass = find_loaded_class(THREAD, cp_holder->class_loader(), name); - if (resolved_klass != nullptr && can_archive_resolved_klass(cp_holder, resolved_klass)) { - Klass* k = cp->klass_at(cp_index, CHECK_NULL); // Should fail only with OOM - assert(k == resolved_klass, "must be"); - } - - return resolved_klass; +Klass* ClassPrelinker::find_loaded_class(Thread* current, ConstantPool* cp, int class_cp_index) { + Symbol* name = cp->klass_name_at(class_cp_index); + return find_loaded_class(current, cp->pool_holder()->class_loader(), name); } #if INCLUDE_CDS_JAVA_HEAP @@ -190,6 +214,110 @@ void ClassPrelinker::resolve_string(constantPoolHandle cp, int cp_index, TRAPS) } #endif +void ClassPrelinker::preresolve_class_cp_entries(JavaThread* current, InstanceKlass* ik, GrowableArray<bool>* preresolve_list) { + if (!SystemDictionaryShared::is_builtin_loader(ik->class_loader_data())) { + return; + } + + JavaThread* THREAD = current; + constantPoolHandle cp(THREAD, ik->constants()); + for (int cp_index = 1; cp_index < cp->length(); cp_index++) { + if (cp->tag_at(cp_index).value() == JVM_CONSTANT_UnresolvedClass) { + if (preresolve_list != nullptr && preresolve_list->at(cp_index) == false) { + // This class was not resolved during trial run. Don't attempt to resolve it. Otherwise + // the compiler may generate less efficient code. + continue; + } + if (find_loaded_class(current, cp(), cp_index) == nullptr) { + // Do not resolve any class that has not been loaded yet + continue; + } + Klass* resolved_klass = cp->klass_at(cp_index, THREAD); + if (HAS_PENDING_EXCEPTION) { + CLEAR_PENDING_EXCEPTION; // just ignore + } else { + log_trace(cds, resolve)("Resolved class [%3d] %s -> %s", cp_index, ik->external_name(), + resolved_klass->external_name()); + } + } + } +} + +void ClassPrelinker::preresolve_field_and_method_cp_entries(JavaThread* current, InstanceKlass* ik, GrowableArray<bool>* preresolve_list) { + JavaThread* THREAD = current; + constantPoolHandle cp(THREAD, ik->constants()); + if (cp->cache() == nullptr) { + return; + } + for (int i = 0; i < ik->methods()->length(); i++) { + Method* m = ik->methods()->at(i); + BytecodeStream bcs(methodHandle(THREAD, m)); + while (!bcs.is_last_bytecode()) { + bcs.next(); + Bytecodes::Code raw_bc = bcs.raw_code(); + switch (raw_bc) { + case Bytecodes::_getfield: + case Bytecodes::_putfield: + maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD); + if (HAS_PENDING_EXCEPTION) { + CLEAR_PENDING_EXCEPTION; // just ignore + } + break; + default: + break; + } + } + } +} + +void ClassPrelinker::maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m, Bytecodes::Code bc, int raw_index, + GrowableArray<bool>* preresolve_list, TRAPS) { + methodHandle mh(THREAD, m); + constantPoolHandle cp(THREAD, ik->constants()); + HandleMark hm(THREAD); + int cp_index = cp->to_cp_index(raw_index, bc); + + if (cp->is_resolved(raw_index, bc)) { + return; + } + + if (preresolve_list != nullptr && preresolve_list->at(cp_index) == false) { + // This field wasn't resolved during the trial run. Don't attempt to resolve it. Otherwise + // the compiler may generate less efficient code. + return; + } + + int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); + if (find_loaded_class(THREAD, cp(), klass_cp_index) == nullptr) { + // Do not resolve any field/methods from a class that has not been loaded yet. + return; + } + + Klass* resolved_klass = cp->klass_ref_at(raw_index, bc, CHECK); + + switch (bc) { + case Bytecodes::_getfield: + case Bytecodes::_putfield: + InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, false /*initialize_holder*/, CHECK); + break; + + default: + ShouldNotReachHere(); + } + + if (log_is_enabled(Trace, cds, resolve)) { + ResourceMark rm(THREAD); + bool resolved = cp->is_resolved(raw_index, bc); + Symbol* name = cp->name_ref_at(raw_index, bc); + Symbol* signature = cp->signature_ref_at(raw_index, bc); + log_trace(cds, resolve)("%s %s [%3d] %s -> %s.%s:%s", + (resolved ? "Resolved" : "Failed to resolve"), + Bytecodes::name(bc), cp_index, ik->external_name(), + resolved_klass->external_name(), + name->as_C_string(), signature->as_C_string()); + } +} + #ifdef ASSERT bool ClassPrelinker::is_in_archivebuilder_buffer(address p) { if (!Thread::current()->is_VM_thread() || ArchiveBuilder::current() == nullptr) { diff --git a/src/hotspot/share/cds/classPrelinker.hpp b/src/hotspot/share/cds/classPrelinker.hpp index 7a4f36386ea1d..41588961d8beb 100644 --- a/src/hotspot/share/cds/classPrelinker.hpp +++ b/src/hotspot/share/cds/classPrelinker.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ #ifndef SHARE_CDS_CLASSPRELINKER_HPP #define SHARE_CDS_CLASSPRELINKER_HPP +#include "interpreter/bytecodes.hpp" #include "oops/oopsHierarchy.hpp" #include "memory/allStatic.hpp" #include "memory/allocation.hpp" @@ -64,14 +65,21 @@ class ClassPrelinker : AllStatic { return is_in_archivebuilder_buffer((address)(p)); } static void resolve_string(constantPoolHandle cp, int cp_index, TRAPS) NOT_CDS_JAVA_HEAP_RETURN; - static Klass* maybe_resolve_class(constantPoolHandle cp, int cp_index, TRAPS); - static bool can_archive_resolved_klass(InstanceKlass* cp_holder, Klass* resolved_klass); - static Klass* find_loaded_class(JavaThread* THREAD, oop class_loader, Symbol* name); + static bool is_class_resolution_deterministic(InstanceKlass* cp_holder, Klass* resolved_class); + static Klass* find_loaded_class(Thread* current, oop class_loader, Symbol* name); + static Klass* find_loaded_class(Thread* current, ConstantPool* cp, int class_cp_index); + + // fmi = FieldRef/MethodRef/InterfaceMethodRef + static void maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m, Bytecodes::Code bc, int raw_index, + GrowableArray<bool>* resolve_fmi_list, TRAPS); public: static void initialize(); static void dispose(); + static void preresolve_class_cp_entries(JavaThread* current, InstanceKlass* ik, GrowableArray<bool>* preresolve_list); + static void preresolve_field_and_method_cp_entries(JavaThread* current, InstanceKlass* ik, GrowableArray<bool>* preresolve_list); + // Is this class resolved as part of vmClasses::resolve_all()? If so, these // classes are guatanteed to be loaded at runtime (and cannot be replaced by JVMTI) // when CDS is enabled. Therefore, we can safely keep a direct reference to these @@ -82,10 +90,7 @@ class ClassPrelinker : AllStatic { // CDS archive. static void dumptime_resolve_constants(InstanceKlass* ik, TRAPS); - // Can we resolve the klass entry at cp_index in this constant pool, and store - // the result in the CDS archive? Returns true if cp_index is guaranteed to - // resolve to the same InstanceKlass* at both dump time and run time. - static bool can_archive_resolved_klass(ConstantPool* cp, int cp_index); + static bool is_resolution_deterministic(ConstantPool* cp, int cp_index); }; #endif // SHARE_CDS_CLASSPRELINKER_HPP diff --git a/src/hotspot/share/cds/dumpAllocStats.cpp b/src/hotspot/share/cds/dumpAllocStats.cpp index 21a40ca8f2829..30ef1597063b1 100644 --- a/src/hotspot/share/cds/dumpAllocStats.cpp +++ b/src/hotspot/share/cds/dumpAllocStats.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -102,8 +102,12 @@ void DumpAllocStats::print_stats(int ro_all, int rw_all) { #undef fmt_stats - msg.debug("Class CP entries = %d, archived = %d (%3.1f%%)", - _num_klass_cp_entries, _num_klass_cp_entries_archived, - percent_of(_num_klass_cp_entries_archived, _num_klass_cp_entries)); - + msg.info("Class CP entries = %6d, archived = %6d (%5.1f%%), reverted = %6d", + _num_klass_cp_entries, _num_klass_cp_entries_archived, + percent_of(_num_klass_cp_entries_archived, _num_klass_cp_entries), + _num_klass_cp_entries_reverted); + msg.info("Field CP entries = %6d, archived = %6d (%5.1f%%), reverted = %6d", + _num_field_cp_entries, _num_field_cp_entries_archived, + percent_of(_num_field_cp_entries_archived, _num_field_cp_entries), + _num_field_cp_entries_reverted); } diff --git a/src/hotspot/share/cds/dumpAllocStats.hpp b/src/hotspot/share/cds/dumpAllocStats.hpp index f6e170cdef286..424a98aa73838 100644 --- a/src/hotspot/share/cds/dumpAllocStats.hpp +++ b/src/hotspot/share/cds/dumpAllocStats.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,8 +65,12 @@ class DumpAllocStats : public StackObj { int _counts[2][_number_of_types]; int _bytes [2][_number_of_types]; + int _num_field_cp_entries; + int _num_field_cp_entries_archived; + int _num_field_cp_entries_reverted; int _num_klass_cp_entries; int _num_klass_cp_entries_archived; + int _num_klass_cp_entries_reverted; public: enum { RO = 0, RW = 1 }; @@ -74,8 +78,12 @@ class DumpAllocStats : public StackObj { DumpAllocStats() { memset(_counts, 0, sizeof(_counts)); memset(_bytes, 0, sizeof(_bytes)); - _num_klass_cp_entries = 0; - _num_klass_cp_entries_archived = 0; + _num_field_cp_entries = 0; + _num_field_cp_entries_archived = 0; + _num_field_cp_entries_reverted = 0; + _num_klass_cp_entries = 0; + _num_klass_cp_entries_archived = 0; + _num_klass_cp_entries_reverted = 0; }; CompactHashtableStats* symbol_stats() { return &_symbol_stats; } @@ -102,9 +110,16 @@ class DumpAllocStats : public StackObj { _bytes[RW][CppVTablesType] += byte_size; } - void record_klass_cp_entry(bool archived) { + void record_field_cp_entry(bool archived, bool reverted) { + _num_field_cp_entries ++; + _num_field_cp_entries_archived += archived ? 1 : 0; + _num_field_cp_entries_reverted += reverted ? 1 : 0; + } + + void record_klass_cp_entry(bool archived, bool reverted) { _num_klass_cp_entries ++; _num_klass_cp_entries_archived += archived ? 1 : 0; + _num_klass_cp_entries_reverted += reverted ? 1 : 0; } void print_stats(int ro_all, int rw_all); diff --git a/src/hotspot/share/cds/lambdaFormInvokers.hpp b/src/hotspot/share/cds/lambdaFormInvokers.hpp index 7bb5e5932c7b7..e78ddb1a1bc47 100644 --- a/src/hotspot/share/cds/lambdaFormInvokers.hpp +++ b/src/hotspot/share/cds/lambdaFormInvokers.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,7 @@ class ClassFileStream; template <class T> class Array; +class SerializeClosure; class LambdaFormInvokers : public AllStatic { private: @@ -46,5 +47,6 @@ class LambdaFormInvokers : public AllStatic { static void regenerate_holder_classes(TRAPS); static void serialize(SerializeClosure* soc); static void cleanup_regenerated_classes(); + inline static bool may_be_regenerated_class(Symbol* name); }; #endif // SHARE_CDS_LAMBDAFORMINVOKERS_HPP diff --git a/src/hotspot/share/cds/lambdaFormInvokers.inline.hpp b/src/hotspot/share/cds/lambdaFormInvokers.inline.hpp new file mode 100644 index 0000000000000..dddd0e36c474f --- /dev/null +++ b/src/hotspot/share/cds/lambdaFormInvokers.inline.hpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_CDS_LAMBDAFORMINVOKERS_INLINE_HPP +#define SHARE_CDS_LAMBDAFORMINVOKERS_INLINE_HPP + +#include "cds/lambdaFormInvokers.hpp" +#include "classfile/vmSymbols.hpp" + +inline bool LambdaFormInvokers::may_be_regenerated_class(Symbol* name) { + return name == vmSymbols::java_lang_invoke_Invokers_Holder() || + name == vmSymbols::java_lang_invoke_DirectMethodHandle_Holder() || + name == vmSymbols::java_lang_invoke_LambdaForm_Holder() || + name == vmSymbols::java_lang_invoke_DelegatingMethodHandle_Holder(); +} + +#endif // SHARE_CDS_LAMBDAFORMINVOKERS_INLINE_HPP diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp index dc5f2f5b6371f..fb779b039f49a 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.cpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp @@ -645,27 +645,31 @@ JRT_END // void InterpreterRuntime::resolve_get_put(JavaThread* current, Bytecodes::Code bytecode) { - // resolve field - fieldDescriptor info; LastFrameAccessor last_frame(current); constantPoolHandle pool(current, last_frame.method()->constants()); methodHandle m(current, last_frame.method()); + + resolve_get_put(bytecode, last_frame.get_index_u2(bytecode), m, pool, true /*initialize_holder*/, current); +} + +void InterpreterRuntime::resolve_get_put(Bytecodes::Code bytecode, int field_index, + methodHandle& m, + constantPoolHandle& pool, + bool initialize_holder, TRAPS) { + fieldDescriptor info; bool is_put = (bytecode == Bytecodes::_putfield || bytecode == Bytecodes::_nofast_putfield || bytecode == Bytecodes::_putstatic); bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic); - int field_index = last_frame.get_index_u2(bytecode); { - JvmtiHideSingleStepping jhss(current); - JavaThread* THREAD = current; // For exception macros. + JvmtiHideSingleStepping jhss(THREAD); LinkResolver::resolve_field_access(info, pool, field_index, - m, bytecode, CHECK); + m, bytecode, initialize_holder, CHECK); } // end JvmtiHideSingleStepping // check if link resolution caused cpCache to be updated if (pool->resolved_field_entry_at(field_index)->is_resolved(bytecode)) return; - // compute auxiliary field attributes TosState state = as_TosState(info.field_type()); diff --git a/src/hotspot/share/interpreter/interpreterRuntime.hpp b/src/hotspot/share/interpreter/interpreterRuntime.hpp index 297585d37e849..3a8db1363df5b 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.hpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,7 +91,12 @@ class InterpreterRuntime: AllStatic { static void throw_pending_exception(JavaThread* current); static void resolve_from_cache(JavaThread* current, Bytecodes::Code bytecode); - private: + + // Used by ClassListParser. + static void resolve_get_put(Bytecodes::Code bytecode, int field_index, + methodHandle& m, constantPoolHandle& pool, bool initialize_holder, TRAPS); + +private: // Statics & fields static void resolve_get_put(JavaThread* current, Bytecodes::Code bytecode); diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp index 9247b8a1740fc..1fe715f975712 100644 --- a/src/hotspot/share/interpreter/linkResolver.cpp +++ b/src/hotspot/share/interpreter/linkResolver.cpp @@ -974,9 +974,14 @@ void LinkResolver::check_field_accessability(Klass* ref_klass, } } -void LinkResolver::resolve_field_access(fieldDescriptor& fd, const constantPoolHandle& pool, int index, const methodHandle& method, Bytecodes::Code byte, TRAPS) { +void LinkResolver::resolve_field_access(fieldDescriptor& fd, + const constantPoolHandle& pool, + int index, + const methodHandle& method, + Bytecodes::Code byte, + bool initialize_class, TRAPS) { LinkInfo link_info(pool, index, method, byte, CHECK); - resolve_field(fd, link_info, byte, true, CHECK); + resolve_field(fd, link_info, byte, initialize_class, CHECK); } void LinkResolver::resolve_field(fieldDescriptor& fd, diff --git a/src/hotspot/share/interpreter/linkResolver.hpp b/src/hotspot/share/interpreter/linkResolver.hpp index e18749cd6a55a..80f5d23005241 100644 --- a/src/hotspot/share/interpreter/linkResolver.hpp +++ b/src/hotspot/share/interpreter/linkResolver.hpp @@ -293,7 +293,16 @@ class LinkResolver: AllStatic { const constantPoolHandle& pool, int index, const methodHandle& method, - Bytecodes::Code byte, TRAPS); + Bytecodes::Code byte, + bool initialize_class, TRAPS); + static void resolve_field_access(fieldDescriptor& result, + const constantPoolHandle& pool, + int index, + const methodHandle& method, + Bytecodes::Code byte, TRAPS) { + resolve_field_access(result, pool, index, method, byte, + /* initialize_class*/true, THREAD); + } static void resolve_field(fieldDescriptor& result, const LinkInfo& link_info, Bytecodes::Code access_kind, bool initialize_class, TRAPS); diff --git a/src/hotspot/share/oops/constantPool.cpp b/src/hotspot/share/oops/constantPool.cpp index 329b8157cb73b..35a1d95b6e647 100644 --- a/src/hotspot/share/oops/constantPool.cpp +++ b/src/hotspot/share/oops/constantPool.cpp @@ -300,20 +300,22 @@ objArrayOop ConstantPool::prepare_resolved_references_for_archiving() { objArrayOop rr = resolved_references(); if (rr != nullptr) { - ConstantPool* orig_pool = ArchiveBuilder::current()->get_source_addr(this); - objArrayOop scratch_rr = HeapShared::scratch_resolved_references(orig_pool); + int rr_len = rr->length(); + ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this); + objArrayOop scratch_rr = HeapShared::scratch_resolved_references(src_cp); Array<u2>* ref_map = reference_map(); int ref_map_len = ref_map == nullptr ? 0 : ref_map->length(); - int rr_len = rr->length(); for (int i = 0; i < rr_len; i++) { oop obj = rr->obj_at(i); scratch_rr->obj_at_put(i, nullptr); - if (obj != nullptr && i < ref_map_len) { - int index = object_to_cp_index(i); - if (tag_at(index).is_string()) { - assert(java_lang_String::is_instance(obj), "must be"); - if (!ArchiveHeapWriter::is_string_too_large_to_archive(obj)) { - scratch_rr->obj_at_put(i, obj); + if (obj != nullptr) { + if (i < ref_map_len) { + int index = object_to_cp_index(i); + if (tag_at(index).is_string()) { + assert(java_lang_String::is_instance(obj), "must be"); + if (!ArchiveHeapWriter::is_string_too_large_to_archive(obj)) { + scratch_rr->obj_at_put(i, obj); + } } } } @@ -386,23 +388,61 @@ void ConstantPool::remove_unshareable_info() { // we always set _on_stack to true to avoid having to change _flags during runtime. _flags |= (_on_stack | _is_shared); - if (!_pool_holder->is_linked() && !_pool_holder->verified_at_dump_time()) { - return; + // resolved_references(): remember its length. If it cannot be restored + // from the archived heap objects at run time, we need to dynamically allocate it. + if (cache() != nullptr) { + set_resolved_reference_length( + resolved_references() != nullptr ? resolved_references()->length() : 0); + set_resolved_references(OopHandle()); + } + remove_unshareable_entries(); +} + +static const char* get_type(Klass* k) { + const char* type; + Klass* src_k; + if (ArchiveBuilder::is_active() && ArchiveBuilder::current()->is_in_buffer_space(k)) { + src_k = ArchiveBuilder::current()->get_source_addr(k); + } else { + src_k = k; + } + + if (src_k->is_objArray_klass()) { + src_k = ObjArrayKlass::cast(src_k)->bottom_klass(); + assert(!src_k->is_objArray_klass(), "sanity"); } - // Resolved references are not in the shared archive. - // Save the length for restoration. It is not necessarily the same length - // as reference_map.length() if invokedynamic is saved. It is needed when - // re-creating the resolved reference array if archived heap data cannot be map - // at runtime. - set_resolved_reference_length( - resolved_references() != nullptr ? resolved_references()->length() : 0); - set_resolved_references(OopHandle()); - bool archived = false; + if (src_k->is_typeArray_klass()) { + type = "prim"; + } else { + InstanceKlass* src_ik = InstanceKlass::cast(src_k); + oop loader = src_ik->class_loader(); + if (loader == nullptr) { + type = "boot"; + } else if (loader == SystemDictionary::java_platform_loader()) { + type = "plat"; + } else if (loader == SystemDictionary::java_system_loader()) { + type = "app"; + } else { + type = "unreg"; + } + } + + return type; +} + +void ConstantPool::remove_unshareable_entries() { + ResourceMark rm; + log_info(cds, resolve)("Archiving CP entries for %s", pool_holder()->name()->as_C_string()); for (int cp_index = 1; cp_index < length(); cp_index++) { // cp_index 0 is unused - switch (tag_at(cp_index).value()) { + int cp_tag = tag_at(cp_index).value(); + switch (cp_tag) { + case JVM_CONSTANT_UnresolvedClass: + ArchiveBuilder::alloc_stats()->record_klass_cp_entry(false, false); + break; case JVM_CONSTANT_UnresolvedClassInError: tag_at_put(cp_index, JVM_CONSTANT_UnresolvedClass); + ArchiveBuilder::alloc_stats()->record_klass_cp_entry(false, true); break; case JVM_CONSTANT_MethodHandleInError: tag_at_put(cp_index, JVM_CONSTANT_MethodHandle); @@ -414,8 +454,9 @@ void ConstantPool::remove_unshareable_info() { tag_at_put(cp_index, JVM_CONSTANT_Dynamic); break; case JVM_CONSTANT_Class: - archived = maybe_archive_resolved_klass_at(cp_index); - ArchiveBuilder::alloc_stats()->record_klass_cp_entry(archived); + remove_resolved_klass_if_non_deterministic(cp_index); + break; + default: break; } } @@ -426,40 +467,46 @@ void ConstantPool::remove_unshareable_info() { } } -bool ConstantPool::maybe_archive_resolved_klass_at(int cp_index) { +void ConstantPool::remove_resolved_klass_if_non_deterministic(int cp_index) { assert(ArchiveBuilder::current()->is_in_buffer_space(this), "must be"); assert(tag_at(cp_index).is_klass(), "must be resolved"); - if (pool_holder()->is_hidden() && cp_index == pool_holder()->this_class_index()) { - // All references to a hidden class's own field/methods are through this - // index, which was resolved in ClassFileParser::fill_instance_klass. We - // must preserve it. - return true; + Klass* k = resolved_klass_at(cp_index); + bool can_archive; + + if (k == nullptr) { + // We'd come here if the referenced class has been excluded via + // SystemDictionaryShared::is_excluded_class(). As a result, ArchiveBuilder + // has cleared the resolved_klasses()->at(...) pointer to NULL. Thus, we + // need to revert the tag to JVM_CONSTANT_UnresolvedClass. + can_archive = false; + } else { + ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this); + can_archive = ClassPrelinker::is_resolution_deterministic(src_cp, cp_index); } - CPKlassSlot kslot = klass_slot_at(cp_index); - int resolved_klass_index = kslot.resolved_klass_index(); - Klass* k = resolved_klasses()->at(resolved_klass_index); - // k could be null if the referenced class has been excluded via - // SystemDictionaryShared::is_excluded_class(). + if (!can_archive) { + int resolved_klass_index = klass_slot_at(cp_index).resolved_klass_index(); + resolved_klasses()->at_put(resolved_klass_index, nullptr); + tag_at_put(cp_index, JVM_CONSTANT_UnresolvedClass); + } - if (k != nullptr) { - ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this); - if (ClassPrelinker::can_archive_resolved_klass(src_cp, cp_index)) { - if (log_is_enabled(Debug, cds, resolve)) { - ResourceMark rm; - log_debug(cds, resolve)("Resolved klass CP entry [%d]: %s => %s", cp_index, - pool_holder()->external_name(), k->external_name()); - } - return true; + LogStreamHandle(Trace, cds, resolve) log; + if (log.is_enabled()) { + ResourceMark rm; + log.print("%s klass CP entry [%3d]: %s %s", + (can_archive ? "archived" : "reverted"), + cp_index, pool_holder()->name()->as_C_string(), get_type(pool_holder())); + if (can_archive) { + log.print(" => %s %s%s", k->name()->as_C_string(), get_type(k), + (!k->is_instance_klass() || pool_holder()->is_subtype_of(k)) ? "" : " (not supertype)"); + } else { + Symbol* name = klass_name_at(cp_index); + log.print(" %s", name->as_C_string()); } } - // This referenced class cannot be archived. Revert the tag to UnresolvedClass, - // so that the proper class loading and initialization can happen at runtime. - resolved_klasses()->at_put(resolved_klass_index, nullptr); - tag_at_put(cp_index, JVM_CONSTANT_UnresolvedClass); - return false; + ArchiveBuilder::alloc_stats()->record_klass_cp_entry(can_archive, /*reverted=*/!can_archive); } #endif // INCLUDE_CDS @@ -707,6 +754,31 @@ int ConstantPool::to_cp_index(int index, Bytecodes::Code code) { } } +bool ConstantPool::is_resolved(int index, Bytecodes::Code code) { + assert(cache() != nullptr, "'index' is a rewritten index so this class must have been rewritten"); + switch(code) { + case Bytecodes::_invokedynamic: + return resolved_indy_entry_at(index)->is_resolved(); + + case Bytecodes::_getfield: + case Bytecodes::_getstatic: + case Bytecodes::_putfield: + case Bytecodes::_putstatic: + return resolved_field_entry_at(index)->is_resolved(code); + + case Bytecodes::_invokeinterface: + case Bytecodes::_invokehandle: + case Bytecodes::_invokespecial: + case Bytecodes::_invokestatic: + case Bytecodes::_invokevirtual: + case Bytecodes::_fast_invokevfinal: // Bytecode interpreter uses this + return resolved_method_entry_at(index)->is_resolved(code); + + default: + fatal("Unexpected bytecode: %s", Bytecodes::name(code)); + } +} + u2 ConstantPool::uncached_name_and_type_ref_index_at(int cp_index) { if (tag_at(cp_index).has_bootstrap()) { u2 pool_index = bootstrap_name_and_type_ref_index_at(cp_index); diff --git a/src/hotspot/share/oops/constantPool.hpp b/src/hotspot/share/oops/constantPool.hpp index e48229749f387..7a17c62ddaf99 100644 --- a/src/hotspot/share/oops/constantPool.hpp +++ b/src/hotspot/share/oops/constantPool.hpp @@ -661,6 +661,8 @@ class ConstantPool : public Metadata { int to_cp_index(int which, Bytecodes::Code code); + bool is_resolved(int which, Bytecodes::Code code); + // Lookup for entries consisting of (name_index, signature_index) u2 name_ref_index_at(int cp_index); // == low-order jshort of name_and_type_at(cp_index) u2 signature_ref_index_at(int cp_index); // == high-order jshort of name_and_type_at(cp_index) @@ -677,9 +679,11 @@ class ConstantPool : public Metadata { // CDS support objArrayOop prepare_resolved_references_for_archiving() NOT_CDS_JAVA_HEAP_RETURN_(nullptr); void add_dumped_interned_strings() NOT_CDS_JAVA_HEAP_RETURN; - bool maybe_archive_resolved_klass_at(int cp_index); void remove_unshareable_info(); void restore_unshareable_info(TRAPS); +private: + void remove_unshareable_entries(); + void remove_resolved_klass_if_non_deterministic(int cp_index); #endif private: diff --git a/src/hotspot/share/oops/cpCache.cpp b/src/hotspot/share/oops/cpCache.cpp index 03dbce19f2e7e..c16ba3b76f77a 100644 --- a/src/hotspot/share/oops/cpCache.cpp +++ b/src/hotspot/share/oops/cpCache.cpp @@ -25,6 +25,7 @@ #include "precompiled.hpp" #include "cds/archiveBuilder.hpp" #include "cds/cdsConfig.hpp" +#include "cds/classPrelinker.hpp" #include "cds/heapShared.hpp" #include "classfile/resolutionErrors.hpp" #include "classfile/systemDictionary.hpp" @@ -388,18 +389,14 @@ void ConstantPoolCache::record_gc_epoch() { #if INCLUDE_CDS void ConstantPoolCache::remove_unshareable_info() { assert(CDSConfig::is_dumping_archive(), "sanity"); - // <this> is the copy to be written into the archive. It's in the ArchiveBuilder's "buffer space". - // However, this->_initial_entries was not copied/relocated by the ArchiveBuilder, so it's - // still pointing to the array allocated inside save_for_archive(). + if (_resolved_indy_entries != nullptr) { for (int i = 0; i < _resolved_indy_entries->length(); i++) { resolved_indy_entry_at(i)->remove_unshareable_info(); } } if (_resolved_field_entries != nullptr) { - for (int i = 0; i < _resolved_field_entries->length(); i++) { - resolved_field_entry_at(i)->remove_unshareable_info(); - } + remove_resolved_field_entries_if_non_deterministic(); } if (_resolved_method_entries != nullptr) { for (int i = 0; i < _resolved_method_entries->length(); i++) { @@ -407,6 +404,41 @@ void ConstantPoolCache::remove_unshareable_info() { } } } + +void ConstantPoolCache::remove_resolved_field_entries_if_non_deterministic() { + ConstantPool* cp = constant_pool(); + ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(cp); + for (int i = 0; i < _resolved_field_entries->length(); i++) { + ResolvedFieldEntry* rfi = _resolved_field_entries->adr_at(i); + int cp_index = rfi->constant_pool_index(); + bool archived = false; + bool resolved = rfi->is_resolved(Bytecodes::_getfield) || + rfi->is_resolved(Bytecodes::_putfield); + if (resolved && ClassPrelinker::is_resolution_deterministic(src_cp, cp_index)) { + rfi->mark_and_relocate(); + archived = true; + } else { + rfi->remove_unshareable_info(); + } + if (resolved) { + LogStreamHandle(Trace, cds, resolve) log; + if (log.is_enabled()) { + ResourceMark rm; + int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); + Symbol* klass_name = cp->klass_name_at(klass_cp_index); + Symbol* name = cp->uncached_name_ref_at(cp_index); + Symbol* signature = cp->uncached_signature_ref_at(cp_index); + log.print("%s field CP entry [%3d]: %s %s %s.%s:%s", + (archived ? "archived" : "reverted"), + cp_index, + cp->pool_holder()->name()->as_C_string(), + (archived ? "=>" : " "), + klass_name->as_C_string(), name->as_C_string(), signature->as_C_string()); + } + } + ArchiveBuilder::alloc_stats()->record_field_cp_entry(archived, resolved && !archived); + } +} #endif // INCLUDE_CDS void ConstantPoolCache::deallocate_contents(ClassLoaderData* data) { diff --git a/src/hotspot/share/oops/cpCache.hpp b/src/hotspot/share/oops/cpCache.hpp index f92398351987f..1f91b194623eb 100644 --- a/src/hotspot/share/oops/cpCache.hpp +++ b/src/hotspot/share/oops/cpCache.hpp @@ -193,14 +193,12 @@ class ConstantPoolCache: public MetaspaceObj { #if INCLUDE_CDS void remove_unshareable_info(); - void save_for_archive(TRAPS); #endif public: static int size() { return align_metadata_size(sizeof(ConstantPoolCache) / wordSize); } private: - // Helpers ConstantPool** constant_pool_addr() { return &_constant_pool; } @@ -224,6 +222,10 @@ class ConstantPoolCache: public MetaspaceObj { void dump_cache(); #endif // INCLUDE_JVMTI +#if INCLUDE_CDS + void remove_resolved_field_entries_if_non_deterministic(); +#endif + // RedefineClasses support DEBUG_ONLY(bool on_stack() { return false; }) void deallocate_contents(ClassLoaderData* data); diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index 83dde12af3ddc..8a716c8f9f6a2 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -2557,7 +2557,9 @@ void InstanceKlass::remove_unshareable_info() { init_implementor(); } - constants()->remove_unshareable_info(); + // Call remove_unshareable_info() on other objects that belong to this class, except + // for constants()->remove_unshareable_info(), which is called in a separate pass in + // ArchiveBuilder::make_klasses_shareable(), for (int i = 0; i < methods()->length(); i++) { Method* m = methods()->at(i); diff --git a/src/hotspot/share/oops/resolvedFieldEntry.cpp b/src/hotspot/share/oops/resolvedFieldEntry.cpp index 779f7676293b4..8324325130696 100644 --- a/src/hotspot/share/oops/resolvedFieldEntry.cpp +++ b/src/hotspot/share/oops/resolvedFieldEntry.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,8 @@ */ #include "precompiled.hpp" -#include "resolvedFieldEntry.hpp" +#include "cds/archiveBuilder.hpp" +#include "oops/resolvedFieldEntry.hpp" void ResolvedFieldEntry::print_on(outputStream* st) const { st->print_cr("Field Entry:"); @@ -43,8 +44,14 @@ void ResolvedFieldEntry::print_on(outputStream* st) const { st->print_cr(" - Put Bytecode: %s", Bytecodes::name((Bytecodes::Code)put_code())); } +#if INCLUDE_CDS void ResolvedFieldEntry::remove_unshareable_info() { u2 saved_cpool_index = _cpool_index; memset(this, 0, sizeof(*this)); _cpool_index = saved_cpool_index; } + +void ResolvedFieldEntry::mark_and_relocate() { + ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_field_holder); +} +#endif diff --git a/src/hotspot/share/oops/resolvedFieldEntry.hpp b/src/hotspot/share/oops/resolvedFieldEntry.hpp index 7765240926d43..c98d5f54d1e97 100644 --- a/src/hotspot/share/oops/resolvedFieldEntry.hpp +++ b/src/hotspot/share/oops/resolvedFieldEntry.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,6 +55,17 @@ class ResolvedFieldEntry { u1 _flags; // Flags: [0000|00|is_final|is_volatile] u1 _get_code, _put_code; // Get and Put bytecodes of the field + void copy_from(const ResolvedFieldEntry& other) { + _field_holder = other._field_holder; + _field_offset = other._field_offset; + _field_index = other._field_index; + _cpool_index = other._cpool_index; + _tos_state = other._tos_state; + _flags = other._flags; + _get_code = other._get_code; + _put_code = other._put_code; + } + public: ResolvedFieldEntry(u2 cpi) : _field_holder(nullptr), @@ -65,9 +76,19 @@ class ResolvedFieldEntry { _flags(0), _get_code(0), _put_code(0) {} + ResolvedFieldEntry() : ResolvedFieldEntry(0) {} + ResolvedFieldEntry(const ResolvedFieldEntry& other) { + copy_from(other); + } + + ResolvedFieldEntry& operator=(const ResolvedFieldEntry& other) { + copy_from(other); + return *this; + } + // Bit shift to get flags // Note: Only two flags exists at the moment but more could be added enum { @@ -131,7 +152,10 @@ class ResolvedFieldEntry { } // CDS +#if INCLUDE_CDS void remove_unshareable_info(); + void mark_and_relocate(); +#endif // Offsets static ByteSize field_holder_offset() { return byte_offset_of(ResolvedFieldEntry, _field_holder); } diff --git a/src/hotspot/share/oops/resolvedIndyEntry.cpp b/src/hotspot/share/oops/resolvedIndyEntry.cpp index eff543a544834..93ba3d6916c3e 100644 --- a/src/hotspot/share/oops/resolvedIndyEntry.cpp +++ b/src/hotspot/share/oops/resolvedIndyEntry.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "cds/archiveBuilder.hpp" #include "code/compressedStream.hpp" #include "oops/method.hpp" #include "oops/resolvedIndyEntry.hpp" @@ -37,6 +38,7 @@ bool ResolvedIndyEntry::check_no_old_or_obsolete_entry() { } } +#if INCLUDE_CDS void ResolvedIndyEntry::remove_unshareable_info() { u2 saved_resolved_references_index = _resolved_references_index; u2 saved_cpool_index = _cpool_index; @@ -45,6 +47,12 @@ void ResolvedIndyEntry::remove_unshareable_info() { _cpool_index = saved_cpool_index; } +void ResolvedIndyEntry::mark_and_relocate() { + assert(is_resolved(), "must be"); + ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_method); +} +#endif + void ResolvedIndyEntry::print_on(outputStream* st) const { st->print_cr("Resolved InvokeDynamic Info:"); if (_method != nullptr) { diff --git a/src/hotspot/share/oops/resolvedIndyEntry.hpp b/src/hotspot/share/oops/resolvedIndyEntry.hpp index 25797d338c463..3d7d389331180 100644 --- a/src/hotspot/share/oops/resolvedIndyEntry.hpp +++ b/src/hotspot/share/oops/resolvedIndyEntry.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -129,7 +129,10 @@ class ResolvedIndyEntry { bool check_no_old_or_obsolete_entry(); // CDS +#if INCLUDE_CDS void remove_unshareable_info(); + void mark_and_relocate(); +#endif // Offsets static ByteSize method_offset() { return byte_offset_of(ResolvedIndyEntry, _method); } diff --git a/src/hotspot/share/oops/resolvedMethodEntry.cpp b/src/hotspot/share/oops/resolvedMethodEntry.cpp index 7702dddd9cc7f..9564dbbcdc4b5 100644 --- a/src/hotspot/share/oops/resolvedMethodEntry.cpp +++ b/src/hotspot/share/oops/resolvedMethodEntry.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "cds/archiveBuilder.hpp" #include "oops/method.hpp" #include "oops/resolvedMethodEntry.hpp" @@ -50,10 +51,23 @@ void ResolvedMethodEntry::reset_entry() { } } +#if INCLUDE_CDS void ResolvedMethodEntry::remove_unshareable_info() { reset_entry(); } +void ResolvedMethodEntry::mark_and_relocate(ConstantPool* src_cp) { + if (_method == nullptr) { + assert(bytecode2() == Bytecodes::_invokevirtual, ""); + } else { + ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_method); + } + if (bytecode1() == Bytecodes::_invokeinterface) { + ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_entry_specific._interface_klass); + } +} +#endif + void ResolvedMethodEntry::print_on(outputStream* st) const { st->print_cr("Method Entry:"); diff --git a/src/hotspot/share/oops/resolvedMethodEntry.hpp b/src/hotspot/share/oops/resolvedMethodEntry.hpp index f5f7b8fbab511..e84452236006a 100644 --- a/src/hotspot/share/oops/resolvedMethodEntry.hpp +++ b/src/hotspot/share/oops/resolvedMethodEntry.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -224,7 +224,10 @@ class ResolvedMethodEntry { void reset_entry(); // CDS +#if INCLUDE_CDS void remove_unshareable_info(); + void mark_and_relocate(ConstantPool* src_cp); +#endif // Offsets static ByteSize klass_offset() { return byte_offset_of(ResolvedMethodEntry, _entry_specific._interface_klass); } diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp index 500036febab72..9588f32e6b376 100644 --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -3729,7 +3729,7 @@ JVM_ENTRY(void, JVM_LogLambdaFormInvoker(JNIEnv *env, jstring line)) } if (ClassListWriter::is_enabled()) { ClassListWriter w; - w.stream()->print_cr("%s %s", LAMBDA_FORM_TAG, c_line); + w.stream()->print_cr("%s %s", ClassListParser::lambda_form_tag(), c_line); } } #endif // INCLUDE_CDS diff --git a/src/hotspot/share/runtime/java.cpp b/src/hotspot/share/runtime/java.cpp index f4d9152c8a5af..d3e76364a03e0 100644 --- a/src/hotspot/share/runtime/java.cpp +++ b/src/hotspot/share/runtime/java.cpp @@ -24,6 +24,7 @@ #include "precompiled.hpp" #include "cds/cds_globals.hpp" +#include "cds/classListWriter.hpp" #include "cds/dynamicArchive.hpp" #include "classfile/classLoader.hpp" #include "classfile/classLoaderDataGraph.hpp" @@ -433,6 +434,10 @@ void before_exit(JavaThread* thread, bool halt) { } #endif +#if INCLUDE_CDS + ClassListWriter::write_resolved_constants(); +#endif + // Hang forever on exit if we're reporting an error. if (ShowMessageBoxOnError && VMError::is_error_reported()) { os::infinite_sleep(); diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups index ecded09f4cc0c..101cbe76afdda 100644 --- a/test/hotspot/jtreg/TEST.groups +++ b/test/hotspot/jtreg/TEST.groups @@ -448,6 +448,7 @@ hotspot_appcds_dynamic = \ -runtime/cds/appcds/lambdaForm/DefaultClassListLFInvokers.java \ -runtime/cds/appcds/methodHandles \ -runtime/cds/appcds/sharedStrings \ + -runtime/cds/appcds/resolvedConstants \ -runtime/cds/appcds/ArchiveRelocationTest.java \ -runtime/cds/appcds/BadBSM.java \ -runtime/cds/appcds/DumpClassList.java \ diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java new file mode 100644 index 0000000000000..96744b546a8d4 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test + * @summary Dump time resolutiom of constant pool entries. + * @requires vm.cds + * @requires vm.compMode != "Xcomp" + * @library /test/lib + * @build ResolvedConstants + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar ResolvedConstantsApp ResolvedConstantsFoo ResolvedConstantsBar + * @run driver ResolvedConstants + */ + +import jdk.test.lib.cds.CDSOptions; +import jdk.test.lib.cds.CDSTestUtils; +import jdk.test.lib.helpers.ClassFileInstaller; + +public class ResolvedConstants { + static final String classList = "ResolvedConstants.classlist"; + static final String appJar = ClassFileInstaller.getJarPath("app.jar"); + static final String mainClass = ResolvedConstantsApp.class.getName(); + + public static void main(String[] args) throws Exception { + // dump class list + CDSTestUtils.dumpClassList(classList, "-cp", appJar, mainClass) + .assertNormalExit(output -> { + output.shouldContain("Hello ResolvedConstantsApp"); + }); + + CDSOptions opts = (new CDSOptions()) + .addPrefix("-XX:ExtraSharedClassListFile=" + classList, + "-cp", appJar, + "-Xlog:cds+resolve=trace"); + CDSTestUtils.createArchiveAndCheck(opts) + // Always resolve reference when a class references itself + .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsApp app => ResolvedConstantsApp app") + + // Always resolve reference when a class references a super class + .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsApp app => java/lang/Object boot") + .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsBar app => ResolvedConstantsFoo app") + + // Always resolve reference when a class references a super interface + .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsApp app => java/lang/Runnable boot") + + // java/lang/System is in the root loader but ResolvedConstantsApp is loaded by the app loader. + // Even though System is in the vmClasses list, when ResolvedConstantsApp looks up + // "java/lang/System" in its ConstantPool, the app loader may not have resolved the System + // class yet (i.e., there's no initiaited class entry for System in the app loader's dictionary) + .shouldMatch("cds,resolve.*reverted klass.* ResolvedConstantsApp .*java/lang/System") + + // Always resolve references to fields in the current class or super class(es) + .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsBar => ResolvedConstantsBar.b:I") + .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsBar => ResolvedConstantsBar.a:I") + .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsBar => ResolvedConstantsFoo.a:I") + + // Do not resolve field references to child classes + .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsFoo => ResolvedConstantsFoo.a:I") + .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsFoo ResolvedConstantsBar.a:I") + .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsFoo ResolvedConstantsBar.b:I") + + + // Do not resolve field references to unrelated classes + .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsApp ResolvedConstantsBar.a:I") + .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsApp ResolvedConstantsBar.b:I") + + ; + } +} + +class ResolvedConstantsApp implements Runnable { + public static void main(String args[]) { + System.out.println("Hello ResolvedConstantsApp"); + Object a = new ResolvedConstantsApp(); + ((Runnable)a).run(); + + ResolvedConstantsFoo foo = new ResolvedConstantsFoo(); + ResolvedConstantsBar bar = new ResolvedConstantsBar(); + bar.a ++; + bar.b ++; + bar.doit(); + } + public void run() {} +} + +class ResolvedConstantsFoo { + int a = 1; + void doit() { + } + + void doBar(ResolvedConstantsBar bar) { + bar.a ++; + bar.b ++; + } +} + +class ResolvedConstantsBar extends ResolvedConstantsFoo { + int b = 2; + void doit() { + System.out.println("Hello ResolvedConstantsBar and " + ResolvedConstantsFoo.class.getName()); + System.out.println("a = " + a); + System.out.println("a = " + ((ResolvedConstantsFoo)this).a); + System.out.println("b = " + b); + + doBar(this); + } +} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutField.java b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutField.java new file mode 100644 index 0000000000000..250ff7d7d6ffc --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutField.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test + * @summary Fieldref entry for putfield bytecodes for a final field cannot be preresolved if it's used by a + * method outside of <clinit> + * @requires vm.cds + * @requires vm.compMode != "Xcomp" + * @library /test/lib + * @build ResolvedPutFieldHelper + * @build ResolvedPutField + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar ResolvedPutFieldApp ResolvedPutFieldHelper + * @run driver ResolvedPutField + */ + +import jdk.test.lib.cds.CDSOptions; +import jdk.test.lib.cds.CDSTestUtils; +import jdk.test.lib.helpers.ClassFileInstaller; + +public class ResolvedPutField { + static final String classList = "ResolvedPutField.classlist"; + static final String appJar = ClassFileInstaller.getJarPath("app.jar"); + static final String mainClass = ResolvedPutFieldApp.class.getName(); + static final String error = "Update to non-static final field ResolvedPutFieldHelper.x attempted from a different method (set_x) than the initializer method <init>"; + public static void main(String[] args) throws Exception { + // dump class list + CDSTestUtils.dumpClassList(classList, "-cp", appJar, mainClass) + .assertNormalExit(error); + + CDSOptions opts = (new CDSOptions()) + .addPrefix("-XX:ExtraSharedClassListFile=" + classList, + "-cp", appJar, + "-Xlog:cds+resolve=trace"); + CDSTestUtils.createArchiveAndCheck(opts) + .shouldMatch("cds,resolve.*Failed to resolve putfield .*ResolvedPutFieldHelper -> ResolvedPutFieldHelper.x:I"); + } +} + +class ResolvedPutFieldApp { + public static void main(String args[]) { + try { + ResolvedPutFieldHelper.main(args); + } catch (IllegalAccessError e) { + System.out.println("IllegalAccessError expected:"); + System.out.println(e); + System.exit(0); + } + throw new RuntimeException("IllegalAccessError expected!"); + } +} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutFieldHelper.jasm b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutFieldHelper.jasm new file mode 100644 index 0000000000000..dc7bcfff050d4 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutFieldHelper.jasm @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + + +/* + +class ResolvedPutFieldHelper { + int x; // change it to 'final' + ResolvedPutFieldHelper() { x = 1; } + void set_x() { x = 2; } + + public static void main(String args[]) { + ResolvedPutFieldHelper s = new ResolvedPutFieldHelper(); + s.set_x(); + System.out.println(s.x); + } +} + +*/ + + + +super class ResolvedPutFieldHelper + version 66:0 +{ + //WAS Field x:I; + final Field x:I; + + Method "<init>":"()V" + stack 2 locals 1 + { + aload_0; + invokespecial Method java/lang/Object."<init>":"()V"; + aload_0; + iconst_1; + putfield Field x:"I"; + return; + } + + // set_x is not allowed to write to the final "x" field. If CDS pre-resolves its + // ResolvedFieldEntry for the putfield bytecode, then we cannot get + // the IllegalAccessError at runtime. See JDK-8157181 for the code that + // throws the IllegalAccessError. + + Method set_x:"()V" + stack 2 locals 1 + { + aload_0; + iconst_2; + putfield Field x:"I"; + return; + } + public static Method main:"([Ljava/lang/String;)V" + stack 2 locals 2 + { + new class ResolvedPutFieldHelper; + dup; + invokespecial Method "<init>":"()V"; + astore_1; + aload_1; + invokevirtual Method set_x:"()V"; + getstatic Field java/lang/System.out:"Ljava/io/PrintStream;"; + aload_1; + getfield Field x:"I"; + invokevirtual Method java/io/PrintStream.println:"(I)V"; + return; + } +} From 6861766b638c5135ba40f261d78d9731954ce5ab Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Fri, 14 Jun 2024 07:13:22 +0000 Subject: [PATCH 068/471] 8332818: ubsan: archiveHeapLoader.cpp:70:27: runtime error: applying non-zero offset 18446744073707454464 to null pointer Reviewed-by: stuefe, lucy --- src/hotspot/share/cds/archiveHeapLoader.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hotspot/share/cds/archiveHeapLoader.cpp b/src/hotspot/share/cds/archiveHeapLoader.cpp index 2ef502a3643d3..57a96a8c4e03e 100644 --- a/src/hotspot/share/cds/archiveHeapLoader.cpp +++ b/src/hotspot/share/cds/archiveHeapLoader.cpp @@ -61,6 +61,9 @@ ptrdiff_t ArchiveHeapLoader::_mapped_heap_delta = 0; // Every mapped region is offset by _mapped_heap_delta from its requested address. // See FileMapInfo::heap_region_requested_address(). +#if defined(__clang__) || defined(__GNUC__) +__attribute__((no_sanitize("undefined"))) +#endif void ArchiveHeapLoader::init_mapped_heap_info(address mapped_heap_bottom, ptrdiff_t delta, int dumptime_oop_shift) { assert(!_mapped_heap_relocation_initialized, "only once"); if (!UseCompressedOops) { From 9b0a5c5cd056262fab99525e9260762b617152a3 Mon Sep 17 00:00:00 2001 From: Gui Cao <gcao@openjdk.org> Date: Fri, 14 Jun 2024 09:19:04 +0000 Subject: [PATCH 069/471] 8333248: VectorGatherMaskFoldingTest.java failed when maximum vector bits is 64 Reviewed-by: dfenacci, fyang --- .../VectorGatherMaskFoldingTest.java | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/test/hotspot/jtreg/compiler/vectorapi/VectorGatherMaskFoldingTest.java b/test/hotspot/jtreg/compiler/vectorapi/VectorGatherMaskFoldingTest.java index 88d1bbde1d499..88175baf8e4a6 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/VectorGatherMaskFoldingTest.java +++ b/test/hotspot/jtreg/compiler/vectorapi/VectorGatherMaskFoldingTest.java @@ -100,7 +100,7 @@ public class VectorGatherMaskFoldingTest { for (int i = 0; i < L_SPECIES.length(); i++) { longArray[i] = i + 1; longArray2[i] = L_SPECIES.length() - i + 1; - longMask[i] = i % 2 == 0; + longMask[i] = L_SPECIES.length() > 1 && i % 2 == 0; longMask2[i] = i >= L_SPECIES.length() / 2; longIndices[i] = (i + L_SPECIES.length() / 2) % L_SPECIES.length(); longIndices2[i] = (L_SPECIES.length() - i) % L_SPECIES.length(); @@ -126,7 +126,7 @@ public class VectorGatherMaskFoldingTest { for (int i = 0; i < D_SPECIES.length(); i++) { doubleArray[i] = (double) i + 1.0; doubleArray2[i] = (double) (D_SPECIES.length() - i) + 1.0; - doubleMask[i] = i % 2 == 0; + doubleMask[i] = D_SPECIES.length() > 1 && i % 2 == 0; doubleMask2[i] = i >= D_SPECIES.length() / 2; doubleIndices[i] = (i + D_SPECIES.length() / 2) % D_SPECIES.length(); doubleIndices2[i] = (D_SPECIES.length() - i) % D_SPECIES.length(); @@ -168,7 +168,7 @@ public static void testTwoLongVectorLoadGatherNotEqualArray() { public static void testTwoLongVectorLoadGatherNotEqualIndices() { LongVector res = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices, 0); LongVector res2 = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices2, 0); - Asserts.assertNotEquals(res, res2); + Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(res2)); } @Test @@ -176,7 +176,7 @@ public static void testTwoLongVectorLoadGatherNotEqualIndices() { public static void testOneLongVectorLoadGather() { LongVector res = LongVector.fromArray(L_SPECIES, longArray, 0); LongVector res2 = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices, 0); - Asserts.assertNotEquals(res, res2); + Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(res2)); } @Test @@ -232,7 +232,7 @@ public static void testTwoLongVectorLoadGatherMaskedNotEqualMask() { public static void testTwoLongVectorLoadGatherMaskedNotEqualIndices() { LongVector res = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices, 0, longVectorMask); LongVector res2 = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices2, 0, longVectorMask); - Asserts.assertNotEquals(res, res2); + Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(res2)); } @@ -334,7 +334,7 @@ public static void testTwoDoubleVectorLoadGatherNotEqualArray() { public static void testTwoDoubleVectorLoadGatherNotEqualIndices() { DoubleVector res = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices, 0); DoubleVector res2 = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices2, 0); - Asserts.assertNotEquals(res, res2); + Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(res2)); } @Test @@ -342,7 +342,7 @@ public static void testTwoDoubleVectorLoadGatherNotEqualIndices() { public static void testOneDoubleVectorLoadGather() { DoubleVector res = DoubleVector.fromArray(D_SPECIES, doubleArray, 0); DoubleVector res2 = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices, 0); - Asserts.assertNotEquals(res, res2); + Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(res2)); } @Test @@ -398,7 +398,7 @@ public static void testTwoDoubleVectorLoadGatherMaskedNotEqualMask() { public static void testTwoDoubleVectorLoadGatherMaskedNotEqualIndices() { DoubleVector res = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices, 0, doubleVectorMask); DoubleVector res2 = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices2, 0, doubleVectorMask); - Asserts.assertNotEquals(res, res2); + Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(res2)); } @@ -506,7 +506,7 @@ public static void testTwoLongVectorStoreScatterNotEqualIndices() { long[] res2 = new long[L_SPECIES.length()]; longVector.intoArray(res, 0, longIndices, 0); longVector.intoArray(res2, 0, longIndices2, 0); - Asserts.assertFalse(Arrays.equals(res, res2)); + Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, res2)); } @Test @@ -516,7 +516,7 @@ public static void testOneLongVectorStoreScatter() { long[] res2 = new long[L_SPECIES.length()]; longVector.intoArray(res, 0); longVector.intoArray(res2, 0, longIndices, 0); - Asserts.assertFalse(Arrays.equals(res, res2)); + Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, res2)); } @Test @@ -586,7 +586,7 @@ public static void testTwoLongVectorStoreScatterMaskedNotEqualIndices() { long[] res2 = new long[L_SPECIES.length()]; longVector.intoArray(res, 0, longIndices, 0, longVectorMask); longVector.intoArray(res2, 0, longIndices2, 0, longVectorMask); - Asserts.assertFalse(Arrays.equals(res, res2)); + Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, res2)); } @@ -712,7 +712,7 @@ public static void testTwoDoubleVectorStoreScatterNotEqualIndices() { double[] res2 = new double[D_SPECIES.length()]; doubleVector.intoArray(res, 0, doubleIndices, 0); doubleVector.intoArray(res2, 0, doubleIndices2, 0); - Asserts.assertFalse(Arrays.equals(res, res2)); + Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, res2)); } @Test @@ -722,7 +722,7 @@ public static void testOneDoubleVectorStoreScatter() { double[] res2 = new double[D_SPECIES.length()]; doubleVector.intoArray(res, 0); doubleVector.intoArray(res2, 0, doubleIndices, 0); - Asserts.assertFalse(Arrays.equals(res, res2)); + Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, res2)); } @Test @@ -792,7 +792,7 @@ public static void testTwoDoubleVectorStoreScatterMaskedNotEqualIndices() { double[] res2 = new double[D_SPECIES.length()]; doubleVector.intoArray(res, 0, doubleIndices, 0, doubleVectorMask); doubleVector.intoArray(res2, 0, doubleIndices2, 0, doubleVectorMask); - Asserts.assertFalse(Arrays.equals(res, res2)); + Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, res2)); } @@ -909,7 +909,7 @@ public static void testOneLongVectorStoreLoadGather() { long[] array = new long[L_SPECIES.length()]; longVector.intoArray(array, 0); LongVector res = LongVector.fromArray(L_SPECIES, array, 0, longIndices, 0); - Asserts.assertNotEquals(res, longVector); + Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(longVector)); } @Test @@ -918,7 +918,7 @@ public static void testOneLongVectorStoreScatterLoad() { long[] array = new long[L_SPECIES.length()]; longVector.intoArray(array, 0, longIndices, 0); LongVector res = LongVector.fromArray(L_SPECIES, array, 0); - Asserts.assertNotEquals(res, longVector); + Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(longVector)); } @Test @@ -945,7 +945,7 @@ public static void testLongVectorLoadGatherStoreScatterDuplicateIndicesVector() long[] res = new long[L_SPECIES.length()]; longVector.intoArray(res, 0, duplicateLongIndices, 0); LongVector res2 = LongVector.fromArray(L_SPECIES, res, 0, duplicateLongIndices, 0); - Asserts.assertNotEquals(res2, longVector); + Asserts.assertFalse(L_SPECIES.length() != 1 && res2.equals(longVector)); } @Test @@ -963,7 +963,7 @@ public static void testStoreLoadLongVectorDifferentSpeciesVector() { long[] res = new long[L_SPECIES.length()]; longVector.intoArray(res, 0); LongVector res2 = LongVector.fromArray(LongVector.SPECIES_64, res, 0); - Asserts.assertNotEquals(res2, longVector); + Asserts.assertFalse(L_SPECIES.length() != 1 && res2.equals(longVector)); } @@ -1041,7 +1041,7 @@ public static void testOneDoubleVectorStoreLoadGather() { double[] array = new double[D_SPECIES.length()]; doubleVector.intoArray(array, 0); DoubleVector res = DoubleVector.fromArray(D_SPECIES, array, 0, doubleIndices, 0); - Asserts.assertNotEquals(res, doubleVector); + Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(doubleVector)); } @Test @@ -1050,7 +1050,7 @@ public static void testOneDoubleVectorStoreScatterLoad() { double[] array = new double[D_SPECIES.length()]; doubleVector.intoArray(array, 0, doubleIndices, 0); DoubleVector res = DoubleVector.fromArray(D_SPECIES, array, 0); - Asserts.assertNotEquals(res, doubleVector); + Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(doubleVector)); } @Test @@ -1077,7 +1077,7 @@ public static void testDoubleVectorLoadGatherStoreScatterDuplicateIndicesVector( double[] res = new double[D_SPECIES.length()]; doubleVector.intoArray(res, 0, duplicateDoubleIndices, 0); DoubleVector res2 = DoubleVector.fromArray(D_SPECIES, res, 0, duplicateDoubleIndices, 0); - Asserts.assertNotEquals(res2, doubleVector); + Asserts.assertFalse(D_SPECIES.length() != 1 && res2.equals(doubleVector)); } @Test @@ -1095,7 +1095,7 @@ public static void testStoreLoadDoubleVectorDifferentSpeciesVector() { double[] res = new double[D_SPECIES.length()]; doubleVector.intoArray(res, 0); DoubleVector res2 = DoubleVector.fromArray(DoubleVector.SPECIES_64, res, 0); - Asserts.assertNotEquals(res2, doubleVector); + Asserts.assertFalse(D_SPECIES.length() != 1 && res2.equals(doubleVector)); } @@ -1175,7 +1175,7 @@ public static void testOneLongVectorLoadGatherStore() { long[] res = new long[L_SPECIES.length()]; LongVector vector = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices, 0); vector.intoArray(res, 0); - Asserts.assertFalse(Arrays.equals(res, longArray)); + Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, longArray)); } @Test @@ -1184,7 +1184,7 @@ public static void testOneLongVectorLoadStoreScatter() { long[] res = new long[L_SPECIES.length()]; LongVector vector = LongVector.fromArray(L_SPECIES, longArray, 0); vector.intoArray(res, 0, longIndices, 0); - Asserts.assertFalse(Arrays.equals(res, longArray)); + Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, longArray)); } @Test @@ -1211,7 +1211,7 @@ public static void testLongVectorStoreScatterLoadGatherDuplicateIndicesVector() long[] res = new long[L_SPECIES.length()]; LongVector vector = LongVector.fromArray(L_SPECIES, longArray, 0, duplicateLongIndices, 0); vector.intoArray(res, 0, duplicateLongIndices, 0); - Asserts.assertFalse(Arrays.equals(res, longArray)); + Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, longArray)); } @Test @@ -1289,7 +1289,7 @@ public static void testOneDoubleVectorLoadGatherStore() { double[] res = new double[D_SPECIES.length()]; DoubleVector vector = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices, 0); vector.intoArray(res, 0); - Asserts.assertFalse(Arrays.equals(res, doubleArray)); + Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, doubleArray)); } @Test @@ -1298,7 +1298,7 @@ public static void testOneDoubleVectorLoadStoreScatter() { double[] res = new double[D_SPECIES.length()]; DoubleVector vector = DoubleVector.fromArray(D_SPECIES, doubleArray, 0); vector.intoArray(res, 0, doubleIndices, 0); - Asserts.assertFalse(Arrays.equals(res, doubleArray)); + Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, doubleArray)); } @Test @@ -1325,7 +1325,7 @@ public static void testDoubleVectorStoreScatterLoadGatherDuplicateIndicesVector( double[] res = new double[D_SPECIES.length()]; DoubleVector vector = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, duplicateDoubleIndices, 0); vector.intoArray(res, 0, duplicateDoubleIndices, 0); - Asserts.assertFalse(Arrays.equals(res, doubleArray)); + Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, doubleArray)); } @Test @@ -1398,7 +1398,7 @@ public static void testFloatVectorLoadMaskedStoreVector() { public static void main(String[] args) { TestFramework testFramework = new TestFramework(); testFramework.setDefaultWarmup(10000) - .addFlags("--add-modules=jdk.incubator.vector", "-XX:+IncrementalInlineForceCleanup") + .addFlags("--add-modules=jdk.incubator.vector", "-XX:+IgnoreUnrecognizedVMOptions", "-XX:+IncrementalInlineForceCleanup") .start(); } } From cc64aeac47917f20a6d70e9796f0de9aa165ce62 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga <rtoyonag@redhat.com> Date: Fri, 14 Jun 2024 09:32:52 +0000 Subject: [PATCH 070/471] 8332400: isspace argument should be a valid unsigned char Reviewed-by: dholmes, amitkumar, stuefe, jwaters --- src/hotspot/os/linux/cgroupSubsystem_linux.cpp | 2 +- src/hotspot/os/linux/os_linux.cpp | 4 ++-- src/hotspot/share/runtime/arguments.cpp | 10 +++++----- src/hotspot/share/services/diagnosticFramework.cpp | 4 ++-- src/java.base/share/native/libjli/args.c | 6 +++--- src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c | 2 +- src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c | 4 ++-- src/jdk.jpackage/share/native/common/ErrorHandling.cpp | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/hotspot/os/linux/cgroupSubsystem_linux.cpp b/src/hotspot/os/linux/cgroupSubsystem_linux.cpp index be9ff1440c02d..560589c3602c4 100644 --- a/src/hotspot/os/linux/cgroupSubsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupSubsystem_linux.cpp @@ -661,7 +661,7 @@ bool CgroupController::read_numerical_key_value(const char* filename, const char for (; line != nullptr; line = fgets(buf, buf_len, fp)) { char after_key = line[key_len]; if (strncmp(line, key, key_len) == 0 - && isspace(after_key) != 0 + && isspace((unsigned char) after_key) != 0 && after_key != '\n') { // Skip key, skip space const char* value_substr = line + key_len + 1; diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp index 00ee35193011c..b56d40823546a 100644 --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -1356,7 +1356,7 @@ void os::Linux::capture_initial_stack(size_t max_size) { i = 0; if (s) { // Skip blank chars - do { s++; } while (s && isspace(*s)); + do { s++; } while (s && isspace((unsigned char) *s)); #define _UFM UINTX_FORMAT #define _DFM INTX_FORMAT @@ -5222,7 +5222,7 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { if (s == nullptr) return -1; // Skip blank chars - do { s++; } while (s && isspace(*s)); + do { s++; } while (s && isspace((unsigned char) *s)); count = sscanf(s,"%c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu", &cdummy, &idummy, &idummy, &idummy, &idummy, &idummy, diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 10a4c06d53c11..5f89384ba661a 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -748,7 +748,7 @@ static bool set_bool_flag(JVMFlag* flag, bool value, JVMFlagOrigin origin) { static bool set_fp_numeric_flag(JVMFlag* flag, const char* value, JVMFlagOrigin origin) { // strtod allows leading whitespace, but our flag format does not. - if (*value == '\0' || isspace(*value)) { + if (*value == '\0' || isspace((unsigned char) *value)) { return false; } char* end; @@ -1178,13 +1178,13 @@ bool Arguments::process_settings_file(const char* file_name, bool should_exist, if (c == '\n') in_comment = false; } else { if (c == '#') in_comment = true; - else if (!isspace(c)) { + else if (!isspace((unsigned char) c)) { in_white_space = false; token[pos++] = checked_cast<char>(c); } } } else { - if (c == '\n' || (!in_quote && isspace(c))) { + if (c == '\n' || (!in_quote && isspace((unsigned char) c))) { // token ends at newline, or at unquoted whitespace // this allows a way to include spaces in string-valued options token[pos] = '\0'; @@ -3141,7 +3141,7 @@ jint Arguments::parse_options_buffer(const char* name, char* buffer, const size_ // parse all options while (rd < buffer_end) { // skip leading white space from the input string - while (rd < buffer_end && isspace(*rd)) { + while (rd < buffer_end && isspace((unsigned char) *rd)) { rd++; } @@ -3154,7 +3154,7 @@ jint Arguments::parse_options_buffer(const char* name, char* buffer, const size_ // Tokens are strings of non white space characters separated // by one or more white spaces. - while (rd < buffer_end && !isspace(*rd)) { + while (rd < buffer_end && !isspace((unsigned char) *rd)) { if (*rd == '\'' || *rd == '"') { // handle a quoted string int quote = *rd; // matching quote to look for rd++; // don't copy open quote diff --git a/src/hotspot/share/services/diagnosticFramework.cpp b/src/hotspot/share/services/diagnosticFramework.cpp index 006c08cb63ff8..984122f2777f5 100644 --- a/src/hotspot/share/services/diagnosticFramework.cpp +++ b/src/hotspot/share/services/diagnosticFramework.cpp @@ -45,7 +45,7 @@ CmdLine::CmdLine(const char* line, size_t len, bool no_command_name) line_end = &line[len]; // Skip whitespace in the beginning of the line. - while (_cmd < line_end && isspace((int) _cmd[0])) { + while (_cmd < line_end && isspace((unsigned char) _cmd[0])) { _cmd++; } cmd_end = _cmd; @@ -55,7 +55,7 @@ CmdLine::CmdLine(const char* line, size_t len, bool no_command_name) _cmd_len = 0; } else { // Look for end of the command name - while (cmd_end < line_end && !isspace((int) cmd_end[0])) { + while (cmd_end < line_end && !isspace((unsigned char) cmd_end[0])) { cmd_end++; } _cmd_len = cmd_end - _cmd; diff --git a/src/java.base/share/native/libjli/args.c b/src/java.base/share/native/libjli/args.c index 379291fe8ecca..1e9b48730a98e 100644 --- a/src/java.base/share/native/libjli/args.c +++ b/src/java.base/share/native/libjli/args.c @@ -501,7 +501,7 @@ static jboolean expand(JLI_List args, const char *str, const char *var_name) { // This is retained until the process terminates as it is saved as the args p = JLI_MemAlloc(JLI_StrLen(str) + 1); while (*str != '\0') { - while (*str != '\0' && isspace(*str)) { + while (*str != '\0' && isspace((unsigned char) *str)) { str++; } @@ -511,7 +511,7 @@ static jboolean expand(JLI_List args, const char *str, const char *var_name) { } arg = p; - while (*str != '\0' && !isspace(*str)) { + while (*str != '\0' && !isspace((unsigned char) *str)) { if (inEnvVar && (*str == '"' || *str == '\'')) { quote = *str++; while (*str != quote && *str != '\0') { @@ -577,7 +577,7 @@ static jboolean expand(JLI_List args, const char *str, const char *var_name) { exit(1); } - assert (*str == '\0' || isspace(*str)); + assert (*str == '\0' || isspace((unsigned char) *str)); } return JNI_TRUE; diff --git a/src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c b/src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c index 3068f4756262d..41207b5a9df6e 100644 --- a/src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c +++ b/src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c @@ -242,7 +242,7 @@ static bool process_doesnt_exist(pid_t pid) { found_state = true; state = buf + state_len; // Skip the spaces - while (isspace(*state)) { + while (isspace((unsigned char) *state)) { state++; } // A state value of 'X' indicates that the thread is dead. 'Z' diff --git a/src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c b/src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c index a694bba93c489..a0f2687a88c68 100644 --- a/src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c +++ b/src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c @@ -35,14 +35,14 @@ #include "error_messages.h" static char *skipWhitespace(char *p) { - while ((*p != '\0') && isspace(*p)) { + while ((*p != '\0') && isspace((unsigned char) *p)) { p++; } return p; } static char *skipNonWhitespace(char *p) { - while ((*p != '\0') && !isspace(*p)) { + while ((*p != '\0') && !isspace((unsigned char) *p)) { p++; } return p; diff --git a/src/jdk.jpackage/share/native/common/ErrorHandling.cpp b/src/jdk.jpackage/share/native/common/ErrorHandling.cpp index b3f7206bfc1ee..a3a4c2a9dfe12 100644 --- a/src/jdk.jpackage/share/native/common/ErrorHandling.cpp +++ b/src/jdk.jpackage/share/native/common/ErrorHandling.cpp @@ -72,7 +72,7 @@ std::string makeMessage(const std::runtime_error& e, const SourceCodePos& pos) { namespace { bool isNotSpace(int chr) { - return isspace(chr) == 0; + return isspace((unsigned char) chr) == 0; } From efab48c06554476eae7a7bd946dee033d16a9c38 Mon Sep 17 00:00:00 2001 From: Jaikiran Pai <jpai@openjdk.org> Date: Fri, 14 Jun 2024 12:48:43 +0000 Subject: [PATCH 071/471] 8333714: Cleanup the usages of CHECK_EXCEPTION_NULL_FAIL macro in java launcher Reviewed-by: alanb --- src/java.base/share/native/libjli/java.c | 90 ++++++++++++++++-------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/src/java.base/share/native/libjli/java.c b/src/java.base/share/native/libjli/java.c index 1d506c3a6df70..1b4ece834d6e5 100644 --- a/src/java.base/share/native/libjli/java.c +++ b/src/java.base/share/native/libjli/java.c @@ -387,73 +387,92 @@ JLI_Launch(int argc, char ** argv, /* main argc, argv */ } \ } while (JNI_FALSE) -#define CHECK_EXCEPTION_NULL_FAIL(obj) \ - do { \ - if ((*env)->ExceptionOccurred(env)) { \ - return 0; \ - } else if (obj == NULL) { \ - return 0; \ - } \ - } while (JNI_FALSE) - /* - * Invoke a static main with arguments. Returns 1 (true) if successful otherwise - * processes the pending exception from GetStaticMethodID and returns 0 (false). + * Invokes static main(String[]) method if found. + * Returns 0 with a pending exception if not found. Returns 1 if invoked, maybe + * a pending exception if the method threw. */ int invokeStaticMainWithArgs(JNIEnv *env, jclass mainClass, jobjectArray mainArgs) { jmethodID mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V"); - CHECK_EXCEPTION_NULL_FAIL(mainID); + if (mainID == NULL) { + // static main(String[]) not found + return 0; + } (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs); - return 1; + return 1; // method was invoked } /* - * Invoke an instance main with arguments. Returns 1 (true) if successful otherwise - * processes the pending exception from GetMethodID and returns 0 (false). + * Invokes instance main(String[]) method if found. + * Returns 0 with a pending exception if not found. Returns 1 if invoked, maybe + * a pending exception if the method threw. */ int invokeInstanceMainWithArgs(JNIEnv *env, jclass mainClass, jobjectArray mainArgs) { jmethodID constructor = (*env)->GetMethodID(env, mainClass, "<init>", "()V"); - CHECK_EXCEPTION_NULL_FAIL(constructor); + if (constructor == NULL) { + // main class' no-arg constructor not found + return 0; + } jobject mainObject = (*env)->NewObject(env, mainClass, constructor); - CHECK_EXCEPTION_NULL_FAIL(mainObject); + if (mainObject == NULL) { + // main class instance couldn't be constructed + return 0; + } jmethodID mainID = (*env)->GetMethodID(env, mainClass, "main", "([Ljava/lang/String;)V"); - CHECK_EXCEPTION_NULL_FAIL(mainID); + if (mainID == NULL) { + // instance method main(String[]) method not found + return 0; + } (*env)->CallVoidMethod(env, mainObject, mainID, mainArgs); - return 1; + return 1; // method was invoked } /* - * Invoke a static main without arguments. Returns 1 (true) if successful otherwise - * processes the pending exception from GetStaticMethodID and returns 0 (false). + * Invokes no-arg static main() method if found. + * Returns 0 with a pending exception if not found. Returns 1 if invoked, maybe + * a pending exception if the method threw. */ int invokeStaticMainWithoutArgs(JNIEnv *env, jclass mainClass) { jmethodID mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "()V"); - CHECK_EXCEPTION_NULL_FAIL(mainID); + if (mainID == NULL) { + // static main() method couldn't be located + return 0; + } (*env)->CallStaticVoidMethod(env, mainClass, mainID); - return 1; + return 1; // method was invoked } /* - * Invoke an instance main without arguments. Returns 1 (true) if successful otherwise - * processes the pending exception from GetMethodID and returns 0 (false). + * Invokes no-arg instance main() method if found. + * Returns 0 with a pending exception if not found. Returns 1 if invoked, maybe + * a pending exception if the method threw. */ int invokeInstanceMainWithoutArgs(JNIEnv *env, jclass mainClass) { jmethodID constructor = (*env)->GetMethodID(env, mainClass, "<init>", "()V"); - CHECK_EXCEPTION_NULL_FAIL(constructor); + if (constructor == NULL) { + // main class' no-arg constructor not found + return 0; + } jobject mainObject = (*env)->NewObject(env, mainClass, constructor); - CHECK_EXCEPTION_NULL_FAIL(mainObject); + if (mainObject == NULL) { + // couldn't create instance of main class + return 0; + } jmethodID mainID = (*env)->GetMethodID(env, mainClass, "main", "()V"); - CHECK_EXCEPTION_NULL_FAIL(mainID); + if (mainID == NULL) { + // instance method main() not found + return 0; + } (*env)->CallVoidMethod(env, mainObject, mainID); - return 1; + return 1; // method was invoked } int @@ -639,6 +658,8 @@ JavaMain(void* _args) } } if (!ret) { + // An appropriate main method couldn't be located, check and report + // any exception and LEAVE() CHECK_EXCEPTION_LEAVE(1); } @@ -646,8 +667,15 @@ JavaMain(void* _args) * The launcher's exit code (in the absence of calls to * System.exit) will be non-zero if main threw an exception. */ - ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1; - + if (ret && (*env)->ExceptionOccurred(env) == NULL) { + // main method was invoked and no exception was thrown from it, + // return success. + ret = 0; + } else { + // Either the main method couldn't be located or an exception occurred + // in the invoked main method, return failure. + ret = 1; + } LEAVE(); } From b5212d7bfe78b18c18e45c42c724a22365709328 Mon Sep 17 00:00:00 2001 From: Roland Westrelin <roland@openjdk.org> Date: Fri, 14 Jun 2024 13:50:21 +0000 Subject: [PATCH 072/471] 8328107: Shenandoah/C2: TestVerifyLoopOptimizations test failure Reviewed-by: shade --- .../gc/shenandoah/c2/shenandoahSupport.cpp | 8 ++ .../compiler/TestBarrierOnLoopBackedge.java | 84 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 test/hotspot/jtreg/gc/shenandoah/compiler/TestBarrierOnLoopBackedge.java diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp index dbb45995698a6..8cd76dd3d6bc4 100644 --- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp @@ -1333,6 +1333,14 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) { OuterStripMinedLoopNode* outer = head->as_OuterStripMinedLoop(); hide_strip_mined_loop(outer, outer->unique_ctrl_out()->as_CountedLoop(), phase); } + if (head->is_BaseCountedLoop() && ctrl->is_IfProj() && ctrl->in(0)->is_BaseCountedLoopEnd() && + head->as_BaseCountedLoop()->loopexit() == ctrl->in(0)) { + Node* entry = head->in(LoopNode::EntryControl); + Node* backedge = head->in(LoopNode::LoopBackControl); + Node* new_head = new LoopNode(entry, backedge); + phase->register_control(new_head, phase->get_loop(entry), entry); + phase->lazy_replace(head, new_head); + } } // Expand load-reference-barriers diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestBarrierOnLoopBackedge.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestBarrierOnLoopBackedge.java new file mode 100644 index 0000000000000..a72c7d69d7f65 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestBarrierOnLoopBackedge.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8328107 + * @summary Barrier expanded on backedge break loop verification code + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UseShenandoahGC -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestBarrierOnLoopBackedge::notInlined + * -XX:+IgnoreUnrecognizedVMOptions -XX:+VerifyLoopOptimizations TestBarrierOnLoopBackedge + * @run main/othervm -XX:+UseShenandoahGC -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestBarrierOnLoopBackedge::notInlined + * -XX:+IgnoreUnrecognizedVMOptions -XX:+VerifyLoopOptimizations -XX:-UseCountedLoopSafepoints TestBarrierOnLoopBackedge + */ + +public class TestBarrierOnLoopBackedge { + private static A field = new A(); + private static final A finalField = new A(); + private static float floatField; + + public static void main(String[] args) { + A[] array = new A[1]; + array[0] = finalField; + for (int i = 0; i < 20_000; i++) { + test1(); + test2(); + } + } + + private static void test1() { + floatField = field.f; + for (int i = 0; i < 1000; i++) { + notInlined(field); // load barrier split thru phi and ends up on back edge + if (i % 2 == 0) { + field = finalField; + } + } + } + + private static void test2() { + A[] array = new A[1]; + notInlined(array); + int i = 0; + A a = array[0]; + for (;;) { + synchronized (new Object()) { + } + notInlined(a); + i++; + if (i >= 1000) { + break; + } + a = array[0]; // load barrier pinned on backedge + } + } + + private static void notInlined(Object a) { + + } + + private static class A { + float f; + } +} From dae0bda9d0096c25d6378561ab2d09df05f381cf Mon Sep 17 00:00:00 2001 From: Archie Cobbs <acobbs@openjdk.org> Date: Fri, 14 Jun 2024 14:53:05 +0000 Subject: [PATCH 073/471] 8334252: Verifier error for lambda declared in early construction context Reviewed-by: mcimadamore --- .../sun/tools/javac/comp/LambdaToMethod.java | 24 +++++----- .../javac/SuperInit/LambdaOuterCapture.java | 46 +++++++++++++++++++ 2 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java index 5b70a376f2a90..7e5dcee0e8d67 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1239,7 +1239,7 @@ class LambdaAnalyzerPreprocessor extends TreeTranslator { private int lambdaCount = 0; /** - * List of types undergoing construction via explicit constructor chaining. + * List of types undergoing construction, i.e., in an early construction context. */ private List<ClassSymbol> typesUnderConstruction; @@ -1280,15 +1280,10 @@ private JCClassDecl analyzeAndPreprocessClass(JCClassDecl tree) { @Override public void visitApply(JCMethodInvocation tree) { - List<ClassSymbol> previousNascentTypes = typesUnderConstruction; - try { - Name methName = TreeInfo.name(tree.meth); - if (methName == names._this || methName == names._super) { - typesUnderConstruction = typesUnderConstruction.prepend(currentClass()); - } - super.visitApply(tree); - } finally { - typesUnderConstruction = previousNascentTypes; + super.visitApply(tree); + if (TreeInfo.isConstructorCall(tree)) { + Assert.check(typesUnderConstruction.head == currentClass()); + typesUnderConstruction = typesUnderConstruction.tail; // end of early construction context } } // where @@ -1439,13 +1434,16 @@ private LambdaTranslationContext analyzeLambda(JCLambda tree, String statKey) { @Override public void visitMethodDef(JCMethodDecl tree) { + List<ClassSymbol> prevTypesUnderConstruction = typesUnderConstruction; List<Frame> prevStack = frameStack; try { + if (TreeInfo.isConstructor(tree)) // start early construction context (Object() notwithstanding) + typesUnderConstruction = typesUnderConstruction.prepend(currentClass()); frameStack = frameStack.prepend(new Frame(tree)); super.visitMethodDef(tree); - } - finally { + } finally { frameStack = prevStack; + typesUnderConstruction = prevTypesUnderConstruction; } } diff --git a/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java b/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java new file mode 100644 index 0000000000000..092e2916c69d5 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8194743 + * @summary Test lambda declared in early construction context + * @enablePreview + */ + +public class LambdaOuterCapture { + + public class Inner { + + public Inner() { + Runnable r = () -> System.out.println(LambdaOuterCapture.this); + this(r); + } + + public Inner(Runnable r) { + } + } + + public static void main(String[] args) { + new LambdaOuterCapture().new Inner(); + } +} From 548e95a689d63e97ddbdfe7dd7df3a2e3377046c Mon Sep 17 00:00:00 2001 From: Leonid Mesnik <lmesnik@openjdk.org> Date: Fri, 14 Jun 2024 15:32:04 +0000 Subject: [PATCH 074/471] 8330702: Update failure handler to don't generate Error message if cores actions are empty Reviewed-by: sspitsyn --- .../jdk/test/failurehandler/action/ActionSet.java | 9 ++++++--- test/failure_handler/src/share/conf/windows.properties | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionSet.java b/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionSet.java index d67611697bf64..46f1c5bc6f14b 100644 --- a/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionSet.java +++ b/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -104,8 +104,11 @@ private List<PatternAction> getPatternActions(PrintWriter log, private String[] getTools(PrintWriter writer, Properties p, String key) { String value = p.getProperty(key); - if (value == null || value.isEmpty()) { - writer.printf("ERROR: '%s' property is empty%n", key); + if (value == null) { + writer.printf("ERROR: '%s' property is not set%n", key); + return new String[]{}; + } + if (value.isEmpty()) { return new String[]{}; } return value.split(" "); diff --git a/test/failure_handler/src/share/conf/windows.properties b/test/failure_handler/src/share/conf/windows.properties index e22c1a523d8a3..6d11553ebbf5d 100644 --- a/test/failure_handler/src/share/conf/windows.properties +++ b/test/failure_handler/src/share/conf/windows.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -59,6 +59,8 @@ native.stack.params.repeat=6 native.core.app=cdb native.core.args=-c ".dump /mA core.%p;qd" -p %p native.core.params.timeout=600000 + +cores= ################################################################################ # environment info to gather ################################################################################ From 8464ce6db5cbd5d50ac2a2bcba905b7255f510f5 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik <lmesnik@openjdk.org> Date: Fri, 14 Jun 2024 15:32:19 +0000 Subject: [PATCH 075/471] 8332113: Update nsk.share.Log to be always verbose Reviewed-by: sspitsyn, cjplummer --- test/hotspot/jtreg/vmTestbase/nsk/share/Log.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/Log.java b/test/hotspot/jtreg/vmTestbase/nsk/share/Log.java index 735f487f6c3c1..e575018249533 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/Log.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/Log.java @@ -74,15 +74,15 @@ public class Log { /** * Is log-mode verbose? - * Default value is <code>false</code>. + * Always enabled. */ - private boolean verbose = false; + private final boolean verbose = true; /** * Should log messages prefixed with timestamps? - * Default value is <code>false</code>. + * Always enabled. */ - private boolean timestamp = false; + private final boolean timestamp = true; /** * Names for trace levels @@ -193,7 +193,6 @@ public Log(PrintStream stream) { */ public Log(PrintStream stream, boolean verbose) { this(stream); - this.verbose = verbose; } /** @@ -204,7 +203,6 @@ public Log(PrintStream stream, boolean verbose) { public Log(PrintStream stream, ArgumentParser argsParser) { this(stream, argsParser.verbose()); traceLevel = argsParser.getTraceLevel(); - timestamp = argsParser.isTimestamp(); } ///////////////////////////////////////////////////////////////// @@ -220,10 +218,9 @@ public boolean verbose() { * Enable or disable verbose mode for printing messages. */ public void enableVerbose(boolean enable) { - if (!verbose) { - flushLogBuffer(); + if (!enable) { + throw new RuntimeException("The non-verbose logging is not supported."); } - verbose = enable; } public int getTraceLevel() { @@ -422,7 +419,6 @@ protected synchronized void logTo(PrintStream stream) { out.flush(); } out = stream; - verbose = true; } ///////////////////////////////////////////////////////////////// From 31e8debae63e008da79e403bcb870a7be631af2c Mon Sep 17 00:00:00 2001 From: Liming Liu <limingliu@os.amperecomputing.com> Date: Mon, 17 Jun 2024 06:16:26 +0000 Subject: [PATCH 076/471] 8324781: runtime/Thread/TestAlwaysPreTouchStacks.java failed with Expected a higher ratio between stack committed and reserved 8325218: gc/parallel/TestAlwaysPreTouchBehavior.java fails Reviewed-by: stefank, jsjolen, stuefe --- test/hotspot/jtreg/ProblemList.txt | 2 -- .../gc/parallel/TestAlwaysPreTouchBehavior.java | 3 +-- .../runtime/Thread/TestAlwaysPreTouchStacks.java | 14 +++++++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 5290a9bb6260e..4391357b70349 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -77,7 +77,6 @@ gc/epsilon/TestMemoryMXBeans.java 8206434 generic-all gc/g1/humongousObjects/objectGraphTest/TestObjectGraphAfterGC.java 8156755 generic-all gc/g1/logging/TestG1LoggingFailure.java 8169634 generic-all gc/g1/humongousObjects/TestHeapCounters.java 8178918 generic-all -gc/parallel/TestAlwaysPreTouchBehavior.java 8325218 linux-all gc/TestAllocHumongousFragment.java#adaptive 8298781 generic-all gc/TestAllocHumongousFragment.java#aggressive 8298781 generic-all gc/TestAllocHumongousFragment.java#iu-aggressive 8298781 generic-all @@ -102,7 +101,6 @@ runtime/StackGuardPages/TestStackGuardPagesNative.java 8303612 linux-all runtime/ErrorHandling/TestDwarf.java#checkDecoder 8305489 linux-all runtime/ErrorHandling/MachCodeFramesInErrorFile.java 8313315 linux-ppc64le runtime/cds/appcds/customLoader/HelloCustom_JFR.java 8241075 linux-all,windows-x64 -runtime/Thread/TestAlwaysPreTouchStacks.java 8324781 linux-all applications/jcstress/copy.java 8229852 linux-all diff --git a/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java b/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java index 12c03661e0e22..3a5b2b557cc92 100644 --- a/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java +++ b/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java @@ -31,7 +31,7 @@ * @requires os.family == "linux" * @requires os.maxMemory > 2G * @library /test/lib - * @run main/othervm -Xmx1g -Xms1g -XX:+UseParallelGC -XX:+AlwaysPreTouch gc.parallel.TestAlwaysPreTouchBehavior + * @run main/othervm -Xmx1g -Xms1g -XX:+UseParallelGC -XX:+AlwaysPreTouch -XX:+UnlockDiagnosticVMOptions -XX:-UseMadvPopulateWrite gc.parallel.TestAlwaysPreTouchBehavior */ import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; @@ -77,4 +77,3 @@ public static void main(String [] args) { Asserts.assertGreaterThanOrEqual(rss, committedMemory, "RSS of this process(" + rss + "kb) should be bigger than or equal to committed heap mem(" + committedMemory + "kb)"); } } - diff --git a/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java b/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java index a10f41932348f..b12eff0cf8454 100644 --- a/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java +++ b/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.concurrent.CyclicBarrier; @@ -89,14 +90,17 @@ public static void main(String[] args) throws Exception { // should show up with fully - or almost fully - committed thread stacks. } else { - - ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder( + ArrayList<String> vmArgs = new ArrayList<>(); + Collections.addAll(vmArgs, "-XX:+UnlockDiagnosticVMOptions", "-Xmx100M", "-XX:+AlwaysPreTouchStacks", - "-XX:NativeMemoryTracking=summary", "-XX:+PrintNMTStatistics", - "TestAlwaysPreTouchStacks", - "test"); + "-XX:NativeMemoryTracking=summary", "-XX:+PrintNMTStatistics"); + if (System.getProperty("os.name").contains("Linux")) { + vmArgs.add("-XX:-UseMadvPopulateWrite"); + } + Collections.addAll(vmArgs, "TestAlwaysPreTouchStacks", "test"); + ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder(vmArgs); OutputAnalyzer output = new OutputAnalyzer(pb.start()); output.reportDiagnosticSummary(); From 29b63928387a8b6ab387057cb3eac4771b1bfff1 Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Mon, 17 Jun 2024 06:58:55 +0000 Subject: [PATCH 077/471] 8334228: C2 SuperWord: fix JDK-24 regression in VPointer::cmp_for_sort after JDK-8325155 Reviewed-by: chagedorn, kvn --- src/hotspot/share/opto/vectorization.cpp | 29 +++++----- .../vectorization/TestOffsetSorting.java | 55 +++++++++++++++++++ 2 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/vectorization/TestOffsetSorting.java diff --git a/src/hotspot/share/opto/vectorization.cpp b/src/hotspot/share/opto/vectorization.cpp index ac575d7192c3c..01b235e8b27e8 100644 --- a/src/hotspot/share/opto/vectorization.cpp +++ b/src/hotspot/share/opto/vectorization.cpp @@ -807,24 +807,26 @@ void VPointer::maybe_add_to_invar(Node* new_invar, bool negate) { _invar = register_if_new(add); } +// We use two comparisons, because a subtraction could underflow. +#define RETURN_CMP_VALUE_IF_NOT_EQUAL(a, b) \ + if (a < b) { return -1; } \ + if (a > b) { return 1; } + // To be in the same group, two VPointers must be the same, // except for the offset. int VPointer::cmp_for_sort_by_group(const VPointer** p1, const VPointer** p2) { const VPointer* a = *p1; const VPointer* b = *p2; - int cmp_base = a->base()->_idx - b->base()->_idx; - if (cmp_base != 0) { return cmp_base; } - - int cmp_opcode = a->mem()->Opcode() - b->mem()->Opcode(); - if (cmp_opcode != 0) { return cmp_opcode; } + RETURN_CMP_VALUE_IF_NOT_EQUAL(a->base()->_idx, b->base()->_idx); + RETURN_CMP_VALUE_IF_NOT_EQUAL(a->mem()->Opcode(), b->mem()->Opcode()); + RETURN_CMP_VALUE_IF_NOT_EQUAL(a->scale_in_bytes(), b->scale_in_bytes()); - int cmp_scale = a->scale_in_bytes() - b->scale_in_bytes(); - if (cmp_scale != 0) { return cmp_scale; } + int a_inva_idx = a->invar() == nullptr ? 0 : a->invar()->_idx; + int b_inva_idx = b->invar() == nullptr ? 0 : b->invar()->_idx; + RETURN_CMP_VALUE_IF_NOT_EQUAL(a_inva_idx, b_inva_idx); - int cmp_invar = (a->invar() == nullptr ? 0 : a->invar()->_idx) - - (b->invar() == nullptr ? 0 : b->invar()->_idx); - return cmp_invar; + return 0; // equal } // We compare by group, then by offset, and finally by node idx. @@ -835,10 +837,9 @@ int VPointer::cmp_for_sort(const VPointer** p1, const VPointer** p2) { const VPointer* a = *p1; const VPointer* b = *p2; - int cmp_offset = a->offset_in_bytes() - b->offset_in_bytes(); - if (cmp_offset != 0) { return cmp_offset; } - - return a->mem()->_idx - b->mem()->_idx; + RETURN_CMP_VALUE_IF_NOT_EQUAL(a->offset_in_bytes(), b->offset_in_bytes()); + RETURN_CMP_VALUE_IF_NOT_EQUAL(a->mem()->_idx, b->mem()->_idx); + return 0; // equal } #ifndef PRODUCT diff --git a/test/hotspot/jtreg/compiler/vectorization/TestOffsetSorting.java b/test/hotspot/jtreg/compiler/vectorization/TestOffsetSorting.java new file mode 100644 index 0000000000000..a1b86293a1886 --- /dev/null +++ b/test/hotspot/jtreg/compiler/vectorization/TestOffsetSorting.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8334228 + * @summary Test sorting of VPointer by offset, when subtraction of two offsets can overflow. + * @run main/othervm -XX:CompileCommand=compileonly,compiler.vectorization.TestOffsetSorting::test -Xcomp compiler.vectorization.TestOffsetSorting + * @run main compiler.vectorization.TestOffsetSorting + */ + +package compiler.vectorization; + +public class TestOffsetSorting { + static int RANGE = 10_000; + + public static void main(String[] args) { + int[] a = new int[RANGE]; + for (int i = 0; i < 10_000; i++) { + try { + test(a, 0); + throw new RuntimeException("test should go out-of-bounds"); + } catch (ArrayIndexOutOfBoundsException e) { + } + } + } + + static void test(int[] a, int invar) { + int large = (1 << 28) + (1 << 20); + for (int i = 0; i < 1_000; i++) { + a[i + invar - large] = 42; + a[i + invar + large] = 42; + } + } +} From 7b38bfea331437ad99277032de7fce939303abc8 Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Mon, 17 Jun 2024 07:00:03 +0000 Subject: [PATCH 078/471] 8333729: C2 SuperWord: remove some @requires usages in test/hotspot/jtreg/compiler/loopopts/superword Reviewed-by: chagedorn, kvn --- .../superword/CoLocatePackMemoryState.java | 3 +- .../loopopts/superword/RedTest_long.java | 6 +++- .../loopopts/superword/ReductionPerf.java | 5 ++- .../loopopts/superword/TestAlignVector.java | 5 +-- .../superword/TestAlignVectorFuzzer.java | 5 --- .../superword/TestCyclicDependency.java | 1 - .../superword/TestDependencyOffsets.java | 6 ++-- .../superword/TestGeneralizedReductions.java | 20 +++++++---- ...tIndependentPacksWithCyclicDependency.java | 9 +++-- ...IndependentPacksWithCyclicDependency2.java | 5 ++- .../superword/TestLargeCompilation.java | 4 +-- .../superword/TestLargeScaleAndStride.java | 3 +- .../superword/TestMovingLoadBeforeStore.java | 6 ++-- .../loopopts/superword/TestMulAddS2I.java | 4 +-- .../superword/TestPeeledReductionNode.java | 5 +-- .../superword/TestPickFirstMemoryState.java | 1 - .../superword/TestPickLastMemoryState.java | 1 - .../TestScheduleReordersScalarMemops.java | 5 ++- .../loopopts/superword/TestSplitPacks.java | 3 +- .../superword/TestUnorderedReduction.java | 12 +++---- ...norderedReductionPartialVectorization.java | 2 +- .../loopopts/superword/Vec_MulAddS2I.java | 33 ++++++++++++++----- 22 files changed, 76 insertions(+), 68 deletions(-) diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java b/test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java index 9dc1cf1f031ba..c60144da0cdae 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java @@ -24,12 +24,11 @@ /** * @test - * @requires vm.compiler2.enabled * @bug 8238438 * @summary Tests to select the memory state of the last load in a load pack in SuperWord::co_locate_pack. * * @run main/othervm -Xbatch -XX:CompileCommand=compileonly,compiler.loopopts.superword.CoLocatePackMemoryState::test - * -XX:LoopMaxUnroll=16 compiler.loopopts.superword.CoLocatePackMemoryState + * -XX:+IgnoreUnrecognizedVMOptions -XX:LoopMaxUnroll=16 compiler.loopopts.superword.CoLocatePackMemoryState */ package compiler.loopopts.superword; diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java b/test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java index 27bfa8cec0ebb..ee691a91bdadd 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java @@ -25,7 +25,6 @@ * @test * @bug 8240248 * @summary Add C2 x86 Superword support for scalar logical reduction optimizations : long test - * @requires vm.bits == "64" * @library /test/lib / * @run driver compiler.loopopts.superword.RedTest_long */ @@ -137,6 +136,7 @@ public static void reductionInit2( failOn = {IRNode.ADD_REDUCTION_VL}) @IR(applyIfCPUFeature = {"avx2", "true"}, applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.ADD_REDUCTION_VL, ">= 1", IRNode.ADD_REDUCTION_VL, "<= 2"}) // one for main-loop, one for vector-post-loop public static long sumReductionImplement( long[] a, @@ -154,6 +154,7 @@ public static long sumReductionImplement( failOn = {IRNode.OR_REDUCTION_V}) @IR(applyIfCPUFeature = {"avx2", "true"}, applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.OR_REDUCTION_V, ">= 1", IRNode.OR_REDUCTION_V, "<= 2"}) // one for main-loop, one for vector-post-loop public static long orReductionImplement( long[] a, @@ -171,6 +172,7 @@ public static long orReductionImplement( failOn = {IRNode.AND_REDUCTION_V}) @IR(applyIfCPUFeature = {"avx2", "true"}, applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.AND_REDUCTION_V, ">= 1", IRNode.AND_REDUCTION_V, "<= 2"}) // one for main-loop, one for vector-post-loop public static long andReductionImplement( long[] a, @@ -188,6 +190,7 @@ public static long andReductionImplement( failOn = {IRNode.XOR_REDUCTION_V}) @IR(applyIfCPUFeature = {"avx2", "true"}, applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.XOR_REDUCTION_V, ">= 1", IRNode.XOR_REDUCTION_V, "<= 2"}) // one for main-loop, one for vector-post-loop public static long xorReductionImplement( long[] a, @@ -205,6 +208,7 @@ public static long xorReductionImplement( failOn = {IRNode.MUL_REDUCTION_VL}) @IR(applyIfCPUFeature = {"avx512dq", "true"}, applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.MUL_REDUCTION_VL, ">= 1", IRNode.MUL_REDUCTION_VL, "<= 2"}) // one for main-loop, one for vector-post-loop public static long mulReductionImplement( long[] a, diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java b/test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java index b1495d00548f8..591765bb5823f 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java @@ -25,11 +25,10 @@ * @test * @bug 8074981 8302652 * @summary Test SuperWord Reduction Perf. - * @requires vm.compiler2.enabled - * @requires vm.simpleArch == "x86" | vm.simpleArch == "x64" | vm.simpleArch == "aarch64" | vm.simpleArch == "riscv64" * @library /test/lib / - * @run main/othervm -Xbatch -XX:LoopUnrollLimit=250 + * @run main/othervm -Xbatch * -XX:CompileCommand=exclude,compiler.loopopts.superword.ReductionPerf::main + * -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=250 * compiler.loopopts.superword.ReductionPerf */ diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVector.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVector.java index fe873770ab44d..fd5c2969074f9 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVector.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVector.java @@ -39,7 +39,6 @@ * @summary Test AlignVector with various loop init, stride, scale, invar, etc. * @modules java.base/jdk.internal.misc * @library /test/lib / - * @requires vm.compiler2.enabled * @run driver compiler.loopopts.superword.TestAlignVector NoAlignVector */ @@ -49,7 +48,6 @@ * @summary Test AlignVector with various loop init, stride, scale, invar, etc. * @modules java.base/jdk.internal.misc * @library /test/lib / - * @requires vm.compiler2.enabled * @run driver compiler.loopopts.superword.TestAlignVector AlignVector */ @@ -59,7 +57,6 @@ * @summary Test AlignVector with various loop init, stride, scale, invar, etc. * @modules java.base/jdk.internal.misc * @library /test/lib / - * @requires vm.compiler2.enabled * @run driver compiler.loopopts.superword.TestAlignVector VerifyAlignVector */ @@ -96,7 +93,7 @@ interface TestFunction { public static void main(String[] args) { TestFramework framework = new TestFramework(TestAlignVector.class); framework.addFlags("--add-modules", "java.base", "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", - "-XX:LoopUnrollLimit=250"); + "-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=250"); switch (args[0]) { case "NoAlignVector" -> { framework.addFlags("-XX:-AlignVector"); } diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVectorFuzzer.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVectorFuzzer.java index e27feb36e868c..7b95781905ead 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVectorFuzzer.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVectorFuzzer.java @@ -27,7 +27,6 @@ * @summary Fuzzing loops with different (random) init, limit, stride, scale etc. Do not force alignment. * @modules java.base/jdk.internal.misc * @library /test/lib - * @requires vm.compiler2.enabled * @key randomness * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions * -XX:LoopUnrollLimit=250 @@ -41,7 +40,6 @@ * @summary Fuzzing loops with different (random) init, limit, stride, scale etc. Verify AlignVector. * @modules java.base/jdk.internal.misc * @library /test/lib - * @requires vm.compiler2.enabled * @key randomness * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions * -XX:+AlignVector -XX:+VerifyAlignVector @@ -56,8 +54,6 @@ * @summary Fuzzing loops with different (random) init, limit, stride, scale etc. Verify AlignVector. * @modules java.base/jdk.internal.misc * @library /test/lib - * @requires vm.compiler2.enabled - * @requires vm.bits == 64 * @key randomness * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions * -XX:+AlignVector -XX:+VerifyAlignVector @@ -73,7 +69,6 @@ * @summary Fuzzing loops with different (random) init, limit, stride, scale etc. Verify AlignVector. * @modules java.base/jdk.internal.misc * @library /test/lib - * @requires vm.compiler2.enabled * @key randomness * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions * -XX:+AlignVector -XX:+VerifyAlignVector diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java index 94e47f3f7479a..3849f1b05cf27 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java @@ -27,7 +27,6 @@ * @bug 8298935 * @summary Writing forward on array creates cyclic dependency * which leads to wrong result, when ignored. - * @requires vm.compiler2.enabled * @library /test/lib / * @run driver TestCyclicDependency */ diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java index 1e48ae071069f..2f0a5809d0849 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java @@ -27,7 +27,7 @@ * and various MaxVectorSize values, and +- AlignVector. * * Note: this test is auto-generated. Please modify / generate with script: - * https://bugs.openjdk.org/browse/JDK-8310190 + * https://bugs.openjdk.org/browse/JDK-8333729 * * Types: int, long, short, char, byte, float, double * Offsets: 0, -1, 1, -2, 2, -3, 3, -4, 4, -7, 7, -8, 8, -14, 14, -16, 16, -18, 18, -20, 20, -31, 31, -32, 32, -63, 63, -64, 64, -65, 65, -128, 128, -129, 129, -192, 192 @@ -113,7 +113,6 @@ * @test id=vanilla-A * @bug 8298935 8308606 8310308 8312570 8310190 * @summary Test SuperWord: vector size, offsets, dependencies, alignment. - * @requires vm.compiler2.enabled * @library /test/lib / * @run driver compiler.loopopts.superword.TestDependencyOffsets vanilla-A */ @@ -122,7 +121,6 @@ * @test id=vanilla-U * @bug 8298935 8308606 8310308 8312570 8310190 * @summary Test SuperWord: vector size, offsets, dependencies, alignment. - * @requires vm.compiler2.enabled * @library /test/lib / * @run driver compiler.loopopts.superword.TestDependencyOffsets vanilla-U */ @@ -1285,7 +1283,7 @@ public static void main(String args[]) { "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestDependencyOffsets::init", "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestDependencyOffsets::test*", "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestDependencyOffsets::verify", - "-XX:LoopUnrollLimit=250"); + "-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=250"); if (args.length != 1) { throw new RuntimeException("Test requires exactly one argument!"); diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java index 2a27aad8d5aa1..a0e4b58f5092e 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java @@ -27,7 +27,6 @@ * @summary Test reduction vectorizations that are enabled by performing SLP * reduction analysis on unrolled loops. * @library /test/lib / - * @requires vm.bits == 64 * @run driver compiler.loopopts.superword.TestGeneralizedReductions */ @@ -42,7 +41,7 @@ public class TestGeneralizedReductions { public static void main(String[] args) throws Exception { // Fix maximum number of unrolls for test stability. - TestFramework.runWithFlags("-XX:LoopMaxUnroll=16"); + TestFramework.runWithFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopMaxUnroll=16"); } @Run(test = {"testReductionOnGlobalAccumulator", @@ -82,7 +81,9 @@ private static void initArray(long[] array) { } @Test - @IR(applyIfCPUFeature = {"avx2", "true"}, applyIf = {"SuperWordReductions", "true"}, + @IR(applyIfCPUFeature = {"avx2", "true"}, + applyIf = {"SuperWordReductions", "true"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.ADD_REDUCTION_VI, ">= 1"}) private static long testReductionOnGlobalAccumulator(long[] array) { acc = 0; @@ -93,7 +94,9 @@ private static long testReductionOnGlobalAccumulator(long[] array) { } @Test - @IR(applyIfCPUFeature = {"avx2", "true"}, applyIf = {"SuperWordReductions", "true"}, + @IR(applyIfCPUFeature = {"avx2", "true"}, + applyIf = {"SuperWordReductions", "true"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.ADD_REDUCTION_VI, ">= 1"}) private static long testReductionOnPartiallyUnrolledLoop(long[] array) { int sum = 0; @@ -105,7 +108,9 @@ private static long testReductionOnPartiallyUnrolledLoop(long[] array) { } @Test - @IR(applyIfCPUFeature = {"avx2", "true"}, applyIf = {"SuperWordReductions", "true"}, + @IR(applyIfCPUFeature = {"avx2", "true"}, + applyIf = {"SuperWordReductions", "true"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.ADD_REDUCTION_VI, ">= 1"}) private static long testReductionOnLargePartiallyUnrolledLoop(long[] array) { int sum = 0; @@ -128,7 +133,9 @@ private static long testReductionOnLargePartiallyUnrolledLoop(long[] array) { // If this limitation is overcome in the future, the test case should be // turned into a positive one. @Test - @IR(applyIfCPUFeature = {"avx2", "true"}, applyIf = {"SuperWordReductions", "true"}, + @IR(applyIfCPUFeature = {"avx2", "true"}, + applyIf = {"SuperWordReductions", "true"}, + applyIfPlatform = {"64-bit", "true"}, failOn = {IRNode.ADD_REDUCTION_VI}) private static long testReductionOnPartiallyUnrolledLoopWithSwappedInputs(long[] array) { int sum = 0; @@ -142,6 +149,7 @@ private static long testReductionOnPartiallyUnrolledLoopWithSwappedInputs(long[] @Test @IR(applyIfCPUFeature = {"avx2", "true"}, applyIfAnd = {"SuperWordReductions", "true","UsePopCountInstruction", "true"}, + applyIfPlatform = {"64-bit", "true"}, counts = {IRNode.ADD_REDUCTION_VI, ">= 1", IRNode.POPCOUNT_VL, ">= 1"}) @IR(applyIfPlatform = {"riscv64", "true"}, diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java index b27483480361e..65398e8adfd39 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java @@ -27,8 +27,6 @@ * @bug 8304042 * @summary Test some examples with independent packs with cyclic dependency * between the packs. - * @requires vm.bits == 64 - * @requires vm.compiler2.enabled * @modules java.base/jdk.internal.misc * @library /test/lib / * @run driver compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency @@ -78,7 +76,7 @@ public static void main(String args[]) { "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency::test*", "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency::verify", "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency::init", - "-XX:LoopUnrollLimit=1000"); + "-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=1000"); } TestIndependentPacksWithCyclicDependency() { @@ -120,6 +118,7 @@ public void runTest0() { @Test @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VF, "> 0"}, + applyIfPlatform = {"64-bit", "true"}, applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}) static void test0(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb) { for (int i = 0; i < RANGE; i+=2) { @@ -144,6 +143,7 @@ public void runTest1() { @Test @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VF, "> 0", IRNode.VECTOR_CAST_F2I, "> 0", IRNode.VECTOR_CAST_I2F, "> 0"}, + applyIfPlatform = {"64-bit", "true"}, applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) static void test1(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb) { for (int i = 0; i < RANGE; i+=2) { @@ -167,6 +167,7 @@ public void runTest2() { @Test @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VI, "> 0"}, + applyIfPlatform = {"64-bit", "true"}, applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}) static void test2(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb) { for (int i = 0; i < RANGE; i+=2) { @@ -191,6 +192,7 @@ public void runTest3() { @Test @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VF, "> 0"}, + applyIfPlatform = {"64-bit", "true"}, applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}) static void test3(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb) { for (int i = 0; i < RANGE; i+=2) { @@ -267,6 +269,7 @@ public void runTest6() { @Test @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VI, "> 0", IRNode.ADD_VF, "> 0"}, + applyIfPlatform = {"64-bit", "true"}, applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}) static void test6(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb, long[] dataLa, long[] dataLb) { diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java index 31a2ba3a0cb64..32d69689a4269 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java @@ -28,11 +28,10 @@ * @summary Test some examples with independent packs with cyclic dependency * between the packs. * Before fix, this hit: "assert(!is_visited) failed: visit only once" - * @requires vm.compiler2.enabled * @modules java.base/jdk.internal.misc * @library /test/lib / - * @run main/othervm -XX:LoopUnrollLimit=250 - * -XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency2::test + * @run main/othervm -XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency2::test + * -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=250 * compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency2 */ diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeCompilation.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeCompilation.java index afe19fa1cd88a..cdd80d3baaa66 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeCompilation.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeCompilation.java @@ -27,9 +27,9 @@ * @test * @bug 8327978 * @summary Test compile time for large compilation, where SuperWord takes especially much time. - * @requires vm.compiler2.enabled - * @run main/othervm/timeout=30 -XX:LoopUnrollLimit=1000 -Xbatch + * @run main/othervm/timeout=30 -Xbatch * -XX:CompileCommand=compileonly,compiler.loopopts.superword.TestLargeCompilation::test* + * -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=1000 * compiler.loopopts.superword.TestLargeCompilation */ diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java index cfb2931d928db..b3453c24d7783 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java @@ -35,8 +35,7 @@ * @bug 8328938 * @modules java.base/jdk.internal.misc * @library /test/lib / - * @requires vm.compiler2.enabled - * @run main/othervm -XX:+AlignVector compiler.loopopts.superword.TestLargeScaleAndStride + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlignVector compiler.loopopts.superword.TestLargeScaleAndStride */ package compiler.loopopts.superword; diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java index 752c8010468a3..45e3af0774193 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java @@ -24,16 +24,16 @@ /** * @test - * @requires vm.compiler2.enabled * @bug 8316679 8316594 * @summary In SuperWord::output, LoadVector can be moved before StoreVector, but only if it is proven to be safe. * @key randomness * @modules java.base/jdk.internal.misc * @library /test/lib * @run main/othervm -XX:CompileCommand=compileonly,compiler.loopopts.superword.TestMovingLoadBeforeStore::test* - * -Xbatch -XX:LoopUnrollLimit=100 - * -XX:+UnlockDiagnosticVMOptions -XX:+StressLCM * --add-modules java.base --add-exports java.base/jdk.internal.misc=ALL-UNNAMED + * -Xbatch + * -XX:+UnlockDiagnosticVMOptions -XX:+StressLCM + * -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=100 * compiler.loopopts.superword.TestMovingLoadBeforeStore */ diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java index 578d4ee8bdb4d..e0f073c7f8f7d 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java @@ -75,8 +75,8 @@ public class TestMulAddS2I { public static void main(String[] args) { - TestFramework.runWithFlags("-XX:+AlignVector"); - TestFramework.runWithFlags("-XX:-AlignVector"); + TestFramework.runWithFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AlignVector"); + TestFramework.runWithFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:-AlignVector"); } @Run(test = {"testa", "testb", "testc", "testd", "teste", "testf", "testg", "testh", diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java index 99e1e2465f8b5..b69bff04088b2 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java @@ -29,8 +29,9 @@ * @library /test/lib * @comment The test is run with -XX:LoopUnrollLimit=32 to prevent unrolling * from fully replacing vectorization. - * @run main/othervm -Xbatch -XX:LoopUnrollLimit=32 - * compiler.loopopts.superword.TestPeeledReductionNode + * @run main/othervm -Xbatch + * -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=32 + * compiler.loopopts.superword.TestPeeledReductionNode */ package compiler.loopopts.superword; diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java index 488e32c416a89..5d419766aebfc 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java @@ -24,7 +24,6 @@ /** * @test - * @requires vm.compiler2.enabled * @bug 8240281 * @summary Test which needs to select the memory state of the first load in a load pack in SuperWord::co_locate_pack. * diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java index 4f1972dfdfe02..bbdf4d3ad7ae0 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java @@ -25,7 +25,6 @@ /** * @test - * @requires vm.compiler2.enabled * @bug 8290910 8293216 * @summary Test which needs to select the memory state of the last load in a load pack in SuperWord::co_locate_pack. * diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java index f74c19d1b8b62..f2ed8b6aec2b3 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java @@ -28,7 +28,6 @@ * @bug 8304720 * @summary Test some examples where non-vectorized memops also need to * be reordered during SuperWord::schedule. - * @requires vm.compiler2.enabled * @modules java.base/jdk.internal.misc * @library /test/lib / * @run driver compiler.loopopts.superword.TestScheduleReordersScalarMemops @@ -55,8 +54,8 @@ public static void main(String args[]) { "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestScheduleReordersScalarMemops::test*", "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestScheduleReordersScalarMemops::verify", "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestScheduleReordersScalarMemops::init", - "-XX:LoopUnrollLimit=1000", - "-XX:-TieredCompilation", "-Xbatch"); + "-XX:-TieredCompilation", "-Xbatch", + "-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=1000"); } TestScheduleReordersScalarMemops() { diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestSplitPacks.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestSplitPacks.java index a872dbc616bd4..1824f18c8ff83 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestSplitPacks.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestSplitPacks.java @@ -37,7 +37,6 @@ * @bug 8326139 * @summary Test splitting packs in SuperWord * @library /test/lib / - * @requires vm.compiler2.enabled * @run driver compiler.loopopts.superword.TestSplitPacks */ @@ -71,7 +70,7 @@ interface TestFunction { } public static void main(String[] args) { - TestFramework.runWithFlags("-XX:LoopUnrollLimit=1000"); + TestFramework.runWithFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=1000"); } public TestSplitPacks() { diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java index 30cdc05bfe5ce..eed03b3a4a1dc 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java @@ -25,7 +25,6 @@ * @test id=Vanilla-Unaligned * @bug 8302652 8314612 * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop - * @requires vm.compiler2.enabled * @library /test/lib / * @run driver compiler.loopopts.superword.TestUnorderedReduction Vanilla-Unaligned */ @@ -34,7 +33,6 @@ * @test id=Vanilla-Aligned * @bug 8302652 8314612 * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop - * @requires vm.compiler2.enabled * @library /test/lib / * @run driver compiler.loopopts.superword.TestUnorderedReduction Vanilla-Aligned */ @@ -43,7 +41,6 @@ * @test id=MaxVectorSize16-Unaligned * @bug 8302652 8314612 * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop - * @requires vm.compiler2.enabled * @library /test/lib / * @run driver compiler.loopopts.superword.TestUnorderedReduction MaxVectorSize16-Unaligned */ @@ -52,7 +49,6 @@ * @test id=MaxVectorSize32-Aligned * @bug 8302652 8314612 * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop - * @requires vm.compiler2.enabled * @library /test/lib / * @run driver compiler.loopopts.superword.TestUnorderedReduction MaxVectorSize32-Aligned */ @@ -75,10 +71,10 @@ public static void main(String[] args) { } switch (args[0]) { - case "Vanilla-Unaligned" -> { framework.addFlags("-XX:-AlignVector"); } - case "Vanilla-Aligned" -> { framework.addFlags("-XX:+AlignVector"); } - case "MaxVectorSize16-Unaligned" -> { framework.addFlags("-XX:-AlignVector", "-XX:MaxVectorSize=16"); } - case "MaxVectorSize32-Aligned" -> { framework.addFlags("-XX:+AlignVector", "-XX:MaxVectorSize=32"); } + case "Vanilla-Unaligned" -> { framework.addFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:-AlignVector"); } + case "Vanilla-Aligned" -> { framework.addFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AlignVector"); } + case "MaxVectorSize16-Unaligned" -> { framework.addFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:-AlignVector", "-XX:MaxVectorSize=16"); } + case "MaxVectorSize32-Aligned" -> { framework.addFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AlignVector", "-XX:MaxVectorSize=32"); } default -> { throw new RuntimeException("Test argument not recognized: " + args[0]); } } framework.start(); diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java index 666ddaac4416c..0d4a4e7b5d8ae 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java @@ -26,7 +26,6 @@ * @bug JDK-8310130 * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop * Here a case with partial vectorization of the reduction. - * @requires vm.bits == "64" * @library /test/lib / * @run driver compiler.loopopts.superword.TestUnorderedReductionPartialVectorization */ @@ -62,6 +61,7 @@ public void runTests() throws Exception { @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0", IRNode.VECTOR_CAST_I2L, IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0", IRNode.OR_REDUCTION_V, "> 0",}, + applyIfPlatform = {"64-bit", "true"}, applyIfCPUFeatureOr = {"avx2", "true"}) static long test1(int[] data, long sum) { for (int i = 0; i < data.length; i+=2) { diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java b/test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java index f63692871adb2..d595e914ff409 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java @@ -27,47 +27,62 @@ * @bug 8214751 * @summary Test operations in C2 MulAddS2I and MulAddVS2VI nodes. * @library /test/lib - * @requires vm.compiler2.enabled * - * @run main/othervm -XX:LoopUnrollLimit=250 + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:LoopUnrollLimit=250 * -XX:CompileThresholdScaling=0.1 * -XX:+UseSuperWord * -XX:LoopMaxUnroll=2 * compiler.loopopts.superword.Vec_MulAddS2I - * @run main/othervm -XX:LoopUnrollLimit=250 + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:LoopUnrollLimit=250 * -XX:CompileThresholdScaling=0.1 * -XX:-UseSuperWord * -XX:LoopMaxUnroll=2 * compiler.loopopts.superword.Vec_MulAddS2I * - * @run main/othervm -XX:LoopUnrollLimit=250 + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:LoopUnrollLimit=250 * -XX:CompileThresholdScaling=0.1 * -XX:+UseSuperWord * -XX:LoopMaxUnroll=4 * compiler.loopopts.superword.Vec_MulAddS2I - * @run main/othervm -XX:LoopUnrollLimit=250 + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:LoopUnrollLimit=250 * -XX:CompileThresholdScaling=0.1 * -XX:-UseSuperWord * -XX:LoopMaxUnroll=4 * compiler.loopopts.superword.Vec_MulAddS2I * - * @run main/othervm -XX:LoopUnrollLimit=250 + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:LoopUnrollLimit=250 * -XX:CompileThresholdScaling=0.1 * -XX:+UseSuperWord * -XX:LoopMaxUnroll=8 * compiler.loopopts.superword.Vec_MulAddS2I - * @run main/othervm -XX:LoopUnrollLimit=250 + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:LoopUnrollLimit=250 * -XX:CompileThresholdScaling=0.1 * -XX:-UseSuperWord * -XX:LoopMaxUnroll=8 * compiler.loopopts.superword.Vec_MulAddS2I * - * @run main/othervm -XX:LoopUnrollLimit=250 + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:LoopUnrollLimit=250 * -XX:CompileThresholdScaling=0.1 * -XX:+UseSuperWord * -XX:LoopMaxUnroll=16 * compiler.loopopts.superword.Vec_MulAddS2I - * @run main/othervm -XX:LoopUnrollLimit=250 + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:LoopUnrollLimit=250 * -XX:CompileThresholdScaling=0.1 * -XX:-UseSuperWord * -XX:LoopMaxUnroll=16 From 5e09397bf6244c98204180f53a2891604d2843d1 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Mon, 17 Jun 2024 08:06:20 +0000 Subject: [PATCH 079/471] 8334222: exclude containers/cgroup/PlainRead.java Reviewed-by: lucy --- test/hotspot/jtreg/ProblemList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 4391357b70349..a4ff429bd00c3 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -104,6 +104,7 @@ runtime/cds/appcds/customLoader/HelloCustom_JFR.java 8241075 linux-all,windows-x applications/jcstress/copy.java 8229852 linux-all +containers/cgroup/PlainRead.java 8333967,8261242 linux-all containers/docker/TestJcmd.java 8278102 linux-all containers/docker/TestMemoryAwareness.java 8303470 linux-all containers/docker/TestJFREvents.java 8327723 linux-x64 From d751441b76ef41880c77b48372c491f9558f1c68 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev <shade@openjdk.org> Date: Mon, 17 Jun 2024 08:23:39 +0000 Subject: [PATCH 080/471] 8330586: GHA: Drop additional gcc/glibc packages installation for x86_32 Reviewed-by: ihse --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index df53a2cd310e9..067548b9768e3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -146,7 +146,7 @@ jobs: apt-architecture: 'i386' # Some multilib libraries do not have proper inter-dependencies, so we have to # install their dependencies manually. - apt-extra-packages: 'libfreetype-dev:i386 libtiff-dev:i386 libcupsimage2-dev:i386 libc6-i386 libgcc-s1:i386 libstdc++6:i386 libffi-dev:i386' + apt-extra-packages: 'libfreetype-dev:i386 libtiff-dev:i386 libcupsimage2-dev:i386 libffi-dev:i386' extra-conf-options: '--with-target-bits=32 --enable-fallback-linker --enable-libffi-bundling' configure-arguments: ${{ github.event.inputs.configure-arguments }} make-arguments: ${{ github.event.inputs.make-arguments }} From 113a2c028dc3b9abb6229d5f0b812b54a9b61011 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Mon, 17 Jun 2024 08:57:57 +0000 Subject: [PATCH 081/471] 8332903: ubsan: opto/output.cpp:1002:18: runtime error: load of value 171, which is not a valid value for type 'bool' Reviewed-by: kvn, mdoerr --- src/hotspot/cpu/ppc/ppc.ad | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index cbe28deb51676..fcc24060a3afe 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -3430,6 +3430,7 @@ encode %{ call->_in_rms = _in_rms; call->_nesting = _nesting; call->_override_symbolic_info = _override_symbolic_info; + call->_arg_escape = _arg_escape; // New call needs all inputs of old call. // Req... From 0d1080d194c596dc74dd8b173b18b14cc71e1b52 Mon Sep 17 00:00:00 2001 From: Martin Doerr <mdoerr@openjdk.org> Date: Mon, 17 Jun 2024 09:30:48 +0000 Subject: [PATCH 082/471] 8331117: [PPC64] secondary_super_cache does not scale well Reviewed-by: rrich, amitkumar --- src/hotspot/cpu/ppc/macroAssembler_ppc.cpp | 289 +++++++++++++++++++++ src/hotspot/cpu/ppc/macroAssembler_ppc.hpp | 27 ++ src/hotspot/cpu/ppc/ppc.ad | 47 ++++ src/hotspot/cpu/ppc/stubGenerator_ppc.cpp | 50 ++++ src/hotspot/cpu/ppc/vm_version_ppc.cpp | 7 + src/hotspot/cpu/ppc/vm_version_ppc.hpp | 1 + 6 files changed, 421 insertions(+) diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp index 6aaa7f3c057ac..0527cb306b274 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp @@ -2130,6 +2130,295 @@ void MacroAssembler::check_klass_subtype(Register sub_klass, bind(L_failure); // Fallthru if not successful. } +// scans count pointer sized words at [addr] for occurrence of value, +// generic (count must be >0) +// iff found: CR0 eq, scratch == 0 +void MacroAssembler::repne_scan(Register addr, Register value, Register count, Register scratch) { + Label Lloop, Lexit; + +#ifdef ASSERT + { + Label ok; + cmpdi(CCR0, count, 0); + bgt(CCR0, ok); + stop("count must be positive"); + bind(ok); + } +#endif + + mtctr(count); + + bind(Lloop); + ld(scratch, 0 , addr); + xor_(scratch, scratch, value); + beq(CCR0, Lexit); + addi(addr, addr, wordSize); + bdnz(Lloop); + + bind(Lexit); +} + +// Ensure that the inline code and the stub are using the same registers. +#define LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS \ +do { \ + assert(r_super_klass == R4_ARG2 && \ + r_array_base == R3_ARG1 && \ + r_array_length == R7_ARG5 && \ + (r_array_index == R6_ARG4 || r_array_index == noreg) && \ + (r_sub_klass == R5_ARG3 || r_sub_klass == noreg) && \ + (r_bitmap == R11_scratch1 || r_bitmap == noreg) && \ + (result == R8_ARG6 || result == noreg), "registers must match ppc64.ad"); \ +} while(0) + +// Return true: we succeeded in generating this code +void MacroAssembler::lookup_secondary_supers_table(Register r_sub_klass, + Register r_super_klass, + Register temp1, + Register temp2, + Register temp3, + Register temp4, + Register result, + u1 super_klass_slot) { + assert_different_registers(r_sub_klass, r_super_klass, temp1, temp2, temp3, temp4, result); + + Label L_done; + + BLOCK_COMMENT("lookup_secondary_supers_table {"); + + const Register + r_array_base = temp1, + r_array_length = temp2, + r_array_index = temp3, + r_bitmap = temp4; + + LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS; + + ld(r_bitmap, in_bytes(Klass::bitmap_offset()), r_sub_klass); + + // First check the bitmap to see if super_klass might be present. If + // the bit is zero, we are certain that super_klass is not one of + // the secondary supers. + u1 bit = super_klass_slot; + int shift_count = Klass::SECONDARY_SUPERS_TABLE_MASK - bit; + + // if (shift_count == 0) this is used for comparing with 0: + sldi_(r_array_index, r_bitmap, shift_count); + + li(result, 1); // failure + // We test the MSB of r_array_index, i.e. its sign bit + bge(CCR0, L_done); + + // We will consult the secondary-super array. + ld(r_array_base, in_bytes(Klass::secondary_supers_offset()), r_sub_klass); + + // The value i in r_array_index is >= 1, so even though r_array_base + // points to the length, we don't need to adjust it to point to the + // data. + assert(Array<Klass*>::base_offset_in_bytes() == wordSize, "Adjust this code"); + + // Get the first array index that can contain super_klass. + if (bit != 0) { + popcntd(r_array_index, r_array_index); + // NB! r_array_index is off by 1. It is compensated by keeping r_array_base off by 1 word. + sldi(r_array_index, r_array_index, LogBytesPerWord); // scale + ldx(result, r_array_base, r_array_index); + } else { + // Actually use index 0, but r_array_base and r_array_index are off by 1 word + // such that the sum is precise. + ld(result, BytesPerWord, r_array_base); + li(r_array_index, BytesPerWord); // for slow path (scaled) + } + + xor_(result, result, r_super_klass); + beq(CCR0, L_done); // Found a match (result == 0) + + // Is there another entry to check? Consult the bitmap. + testbitdi(CCR0, /* temp */ r_array_length, r_bitmap, (bit + 1) & Klass::SECONDARY_SUPERS_TABLE_MASK); + beq(CCR0, L_done); // (result != 0) + + // Linear probe. Rotate the bitmap so that the next bit to test is + // in Bit 2 for the look-ahead check in the slow path. + if (bit != 0) { + rldicl(r_bitmap, r_bitmap, 64 - bit, 0); + } + + // Calls into the stub generated by lookup_secondary_supers_table_slow_path. + // Arguments: r_super_klass, r_array_base, r_array_index, r_bitmap. + // Kills: r_array_length. + // Returns: result. + address stub = StubRoutines::lookup_secondary_supers_table_slow_path_stub(); + Register r_stub_addr = r_array_length; + add_const_optimized(r_stub_addr, R29_TOC, MacroAssembler::offset_to_global_toc(stub), R0); + mtctr(r_stub_addr); + bctrl(); + + bind(L_done); + BLOCK_COMMENT("} lookup_secondary_supers_table"); + + if (VerifySecondarySupers) { + verify_secondary_supers_table(r_sub_klass, r_super_klass, result, + temp1, temp2, temp3); + } +} + +// Called by code generated by check_klass_subtype_slow_path +// above. This is called when there is a collision in the hashed +// lookup in the secondary supers array. +void MacroAssembler::lookup_secondary_supers_table_slow_path(Register r_super_klass, + Register r_array_base, + Register r_array_index, + Register r_bitmap, + Register result, + Register temp1) { + assert_different_registers(r_super_klass, r_array_base, r_array_index, r_bitmap, result, temp1); + + const Register + r_array_length = temp1, + r_sub_klass = noreg; + + LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS; + + Label L_done; + + // Load the array length. + lwa(r_array_length, Array<Klass*>::length_offset_in_bytes(), r_array_base); + // And adjust the array base to point to the data. + // NB! Effectively increments current slot index by 1. + assert(Array<Klass*>::base_offset_in_bytes() == wordSize, ""); + addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes()); + + // Linear probe + Label L_huge; + + // The bitmap is full to bursting. + // Implicit invariant: BITMAP_FULL implies (length > 0) + assert(Klass::SECONDARY_SUPERS_BITMAP_FULL == ~uintx(0), ""); + cmpdi(CCR0, r_bitmap, -1); + beq(CCR0, L_huge); + + // NB! Our caller has checked bits 0 and 1 in the bitmap. The + // current slot (at secondary_supers[r_array_index]) has not yet + // been inspected, and r_array_index may be out of bounds if we + // wrapped around the end of the array. + + { // This is conventional linear probing, but instead of terminating + // when a null entry is found in the table, we maintain a bitmap + // in which a 0 indicates missing entries. + // The check above guarantees there are 0s in the bitmap, so the loop + // eventually terminates. + +#ifdef ASSERT + { + // We should only reach here after having found a bit in the bitmap. + // Invariant: array_length == popcount(bitmap) + Label ok; + cmpdi(CCR0, r_array_length, 0); + bgt(CCR0, ok); + stop("array_length must be positive"); + bind(ok); + } +#endif + + // Compute limit in r_array_length + addi(r_array_length, r_array_length, -1); + sldi(r_array_length, r_array_length, LogBytesPerWord); + + Label L_loop; + bind(L_loop); + + // Check for wraparound. + cmpd(CCR0, r_array_index, r_array_length); + isel_0(r_array_index, CCR0, Assembler::greater); + + ldx(result, r_array_base, r_array_index); + xor_(result, result, r_super_klass); + beq(CCR0, L_done); // success (result == 0) + + // look-ahead check (Bit 2); result is non-zero + testbitdi(CCR0, R0, r_bitmap, 2); + beq(CCR0, L_done); // fail (result != 0) + + rldicl(r_bitmap, r_bitmap, 64 - 1, 0); + addi(r_array_index, r_array_index, BytesPerWord); + b(L_loop); + } + + { // Degenerate case: more than 64 secondary supers. + // FIXME: We could do something smarter here, maybe a vectorized + // comparison or a binary search, but is that worth any added + // complexity? + bind(L_huge); + repne_scan(r_array_base, r_super_klass, r_array_length, result); + } + + bind(L_done); +} + +// Make sure that the hashed lookup and a linear scan agree. +void MacroAssembler::verify_secondary_supers_table(Register r_sub_klass, + Register r_super_klass, + Register result, + Register temp1, + Register temp2, + Register temp3) { + assert_different_registers(r_sub_klass, r_super_klass, result, temp1, temp2, temp3); + + const Register + r_array_base = temp1, + r_array_length = temp2, + r_array_index = temp3, + r_bitmap = noreg; // unused + + LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS; + + BLOCK_COMMENT("verify_secondary_supers_table {"); + + Label passed, failure; + + // We will consult the secondary-super array. + ld(r_array_base, in_bytes(Klass::secondary_supers_offset()), r_sub_klass); + // Load the array length. + lwa(r_array_length, Array<Klass*>::length_offset_in_bytes(), r_array_base); + // And adjust the array base to point to the data. + addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes()); + + // convert !=0 to 1 + neg(R0, result); + orr(result, result, R0); + srdi(result, result, 63); + + const Register linear_result = r_array_index; // reuse + li(linear_result, 1); + cmpdi(CCR0, r_array_length, 0); + ble(CCR0, failure); + repne_scan(r_array_base, r_super_klass, r_array_length, linear_result); + bind(failure); + + // convert !=0 to 1 + neg(R0, linear_result); + orr(linear_result, linear_result, R0); + srdi(linear_result, linear_result, 63); + + cmpd(CCR0, result, linear_result); + beq(CCR0, passed); + + assert_different_registers(R3_ARG1, r_sub_klass, linear_result, result); + mr_if_needed(R3_ARG1, r_super_klass); + assert_different_registers(R4_ARG2, linear_result, result); + mr_if_needed(R4_ARG2, r_sub_klass); + assert_different_registers(R5_ARG3, result); + neg(R5_ARG3, linear_result); + neg(R6_ARG4, result); + const char* msg = "mismatch"; + load_const_optimized(R7_ARG5, (intptr_t)msg, R0); + call_VM_leaf(CAST_FROM_FN_PTR(address, Klass::on_secondary_supers_verification_failure)); + should_not_reach_here(); + + bind(passed); + + BLOCK_COMMENT("} verify_secondary_supers_table"); +} + void MacroAssembler::clinit_barrier(Register klass, Register thread, Label* L_fast_path, Label* L_slow_path) { assert(L_fast_path != nullptr || L_slow_path != nullptr, "at least one is required"); diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp index 4444690e3a317..4f2ff708a46a3 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp @@ -604,6 +604,33 @@ class MacroAssembler: public Assembler { Register temp2_reg, Label& L_success); + void repne_scan(Register addr, Register value, Register count, Register scratch); + + // As above, but with a constant super_klass. + // The result is in Register result, not the condition codes. + void lookup_secondary_supers_table(Register r_sub_klass, + Register r_super_klass, + Register temp1, + Register temp2, + Register temp3, + Register temp4, + Register result, + u1 super_klass_slot); + + void verify_secondary_supers_table(Register r_sub_klass, + Register r_super_klass, + Register result, + Register temp1, + Register temp2, + Register temp3); + + void lookup_secondary_supers_table_slow_path(Register r_super_klass, + Register r_array_base, + Register r_array_index, + Register r_bitmap, + Register result, + Register temp1); + void clinit_barrier(Register klass, Register thread, Label* L_fast_path = nullptr, diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index fcc24060a3afe..8917b344e54cb 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -641,6 +641,8 @@ reg_class rarg1_bits64_reg(R3_H, R3); reg_class rarg2_bits64_reg(R4_H, R4); reg_class rarg3_bits64_reg(R5_H, R5); reg_class rarg4_bits64_reg(R6_H, R6); +reg_class rarg5_bits64_reg(R7_H, R7); +reg_class rarg6_bits64_reg(R8_H, R8); // Thread register, 'written' by tlsLoadP, see there. reg_class thread_bits64_reg(R16_H, R16); @@ -4354,6 +4356,8 @@ operand iRegPsrc() %{ match(rarg2RegP); match(rarg3RegP); match(rarg4RegP); + match(rarg5RegP); + match(rarg6RegP); match(threadRegP); format %{ %} interface(REG_INTER); @@ -4409,6 +4413,20 @@ operand rarg4RegP() %{ interface(REG_INTER); %} +operand rarg5RegP() %{ + constraint(ALLOC_IN_RC(rarg5_bits64_reg)); + match(iRegPdst); + format %{ %} + interface(REG_INTER); +%} + +operand rarg6RegP() %{ + constraint(ALLOC_IN_RC(rarg6_bits64_reg)); + match(iRegPdst); + format %{ %} + interface(REG_INTER); +%} + operand iRegNsrc() %{ constraint(ALLOC_IN_RC(bits32_reg_ro)); match(RegN); @@ -12024,6 +12042,35 @@ instruct partialSubtypeCheck(iRegPdst result, iRegP_N2P subklass, iRegP_N2P supe ins_pipe(pipe_class_default); %} +instruct partialSubtypeCheckConstSuper(rarg3RegP sub, rarg2RegP super_reg, immP super_con, rarg6RegP result, + rarg1RegP tempR1, rarg5RegP tempR2, rarg4RegP tempR3, rscratch1RegP tempR4, + flagsRegCR0 cr0, regCTR ctr) +%{ + match(Set result (PartialSubtypeCheck sub (Binary super_reg super_con))); + predicate(UseSecondarySupersTable); + effect(KILL cr0, KILL ctr, TEMP tempR1, TEMP tempR2, TEMP tempR3, TEMP tempR4); + + ins_cost(DEFAULT_COST*8); // smaller than the other version + format %{ "partialSubtypeCheck $result, $sub, $super_reg" %} + + ins_encode %{ + u1 super_klass_slot = ((Klass*)$super_con$$constant)->hash_slot(); + if (InlineSecondarySupersTest) { + __ lookup_secondary_supers_table($sub$$Register, $super_reg$$Register, + $tempR1$$Register, $tempR2$$Register, $tempR3$$Register, $tempR4$$Register, + $result$$Register, super_klass_slot); + } else { + address stub = StubRoutines::lookup_secondary_supers_table_stub(super_klass_slot); + Register r_stub_addr = $tempR1$$Register; + __ add_const_optimized(r_stub_addr, R29_TOC, MacroAssembler::offset_to_global_toc(stub), R0); + __ mtctr(r_stub_addr); + __ bctrl(); + } + %} + + ins_pipe(pipe_class_memory); +%} + // inlined locking and unlocking instruct cmpFastLock(flagsRegCR0 crx, iRegPdst oop, iRegPdst box, iRegPdst tmp1, iRegPdst tmp2) %{ diff --git a/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp b/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp index ee7aa27a6303b..8da7cf7e79157 100644 --- a/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp +++ b/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp @@ -4531,6 +4531,46 @@ class StubGenerator: public StubCodeGenerator { #endif // VM_LITTLE_ENDIAN +address generate_lookup_secondary_supers_table_stub(u1 super_klass_index) { + StubCodeMark mark(this, "StubRoutines", "lookup_secondary_supers_table"); + + address start = __ pc(); + const Register + r_super_klass = R4_ARG2, + r_array_base = R3_ARG1, + r_array_length = R7_ARG5, + r_array_index = R6_ARG4, + r_sub_klass = R5_ARG3, + r_bitmap = R11_scratch1, + result = R8_ARG6; + + __ lookup_secondary_supers_table(r_sub_klass, r_super_klass, + r_array_base, r_array_length, r_array_index, + r_bitmap, result, super_klass_index); + __ blr(); + + return start; + } + + // Slow path implementation for UseSecondarySupersTable. + address generate_lookup_secondary_supers_table_slow_path_stub() { + StubCodeMark mark(this, "StubRoutines", "lookup_secondary_supers_table_slow_path"); + + address start = __ pc(); + const Register + r_super_klass = R4_ARG2, + r_array_base = R3_ARG1, + temp1 = R7_ARG5, + r_array_index = R6_ARG4, + r_bitmap = R11_scratch1, + result = R8_ARG6; + + __ lookup_secondary_supers_table_slow_path(r_super_klass, r_array_base, r_array_index, r_bitmap, result, temp1); + __ blr(); + + return start; + } + address generate_cont_thaw(const char* label, Continuation::thaw_kind kind) { if (!Continuations::enabled()) return nullptr; @@ -4807,6 +4847,16 @@ class StubGenerator: public StubCodeGenerator { // arraycopy stubs used by compilers generate_arraycopy_stubs(); + if (UseSecondarySupersTable) { + StubRoutines::_lookup_secondary_supers_table_slow_path_stub = generate_lookup_secondary_supers_table_slow_path_stub(); + if (!InlineSecondarySupersTest) { + for (int slot = 0; slot < Klass::SECONDARY_SUPERS_TABLE_SIZE; slot++) { + StubRoutines::_lookup_secondary_supers_table_stubs[slot] + = generate_lookup_secondary_supers_table_stub(slot); + } + } + } + StubRoutines::_upcall_stub_exception_handler = generate_upcall_stub_exception_handler(); } diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.cpp b/src/hotspot/cpu/ppc/vm_version_ppc.cpp index 5a9d035be6034..20578ed3b8baa 100644 --- a/src/hotspot/cpu/ppc/vm_version_ppc.cpp +++ b/src/hotspot/cpu/ppc/vm_version_ppc.cpp @@ -340,6 +340,13 @@ void VM_Version::initialize() { FLAG_SET_DEFAULT(UseSHA, false); } + if (UseSecondarySupersTable && PowerArchitecturePPC64 < 7) { + if (!FLAG_IS_DEFAULT(UseSecondarySupersTable)) { + warning("UseSecondarySupersTable requires Power7 or later."); + } + FLAG_SET_DEFAULT(UseSecondarySupersTable, false); + } + #ifdef COMPILER2 if (FLAG_IS_DEFAULT(UseSquareToLenIntrinsic)) { UseSquareToLenIntrinsic = true; diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.hpp b/src/hotspot/cpu/ppc/vm_version_ppc.hpp index 0efde131277b2..9d8e4b88ee2e5 100644 --- a/src/hotspot/cpu/ppc/vm_version_ppc.hpp +++ b/src/hotspot/cpu/ppc/vm_version_ppc.hpp @@ -95,6 +95,7 @@ class VM_Version: public Abstract_VM_Version { static bool supports_fast_class_init_checks() { return true; } constexpr static bool supports_stack_watermark_barrier() { return true; } constexpr static bool supports_recursive_lightweight_locking() { return true; } + constexpr static bool supports_secondary_supers_table() { return true; } static bool is_determine_features_test_running() { return _is_determine_features_test_running; } // CPU instruction support From ef7923e1277ce86c6e5331871f1031c28bf82e31 Mon Sep 17 00:00:00 2001 From: Gui Cao <gcao@openjdk.org> Date: Mon, 17 Jun 2024 11:35:41 +0000 Subject: [PATCH 083/471] 8334078: RISC-V: TestIntVect.java fails after JDK-8332153 when running without RVV Reviewed-by: fyang, mli --- .../linux_riscv/vm_version_linux_riscv.cpp | 5 +- .../compiler/c2/cr7200264/TestIntVect.java | 117 +++--------------- .../irTests/TestVectorizeURShiftSubword.java | 2 +- .../intrinsics/TestBitShuffleOpers.java | 2 +- .../intrinsics/chacha/TestChaCha20.java | 20 ++- .../ir_framework/test/IREncodingPrinter.java | 2 +- .../vectorapi/reshape/TestVectorCastRVV.java | 2 +- .../vectorization/TestSignumVector.java | 2 +- .../runner/ArrayShiftOpTest.java | 35 ++---- .../vectorization/runner/BasicByteOpTest.java | 15 +-- .../vectorization/runner/BasicCharOpTest.java | 15 +-- .../vectorization/runner/BasicIntOpTest.java | 15 +-- .../vectorization/runner/BasicLongOpTest.java | 15 +-- .../runner/BasicShortOpTest.java | 15 +-- 14 files changed, 58 insertions(+), 204 deletions(-) diff --git a/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp b/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp index f74ed8c8f81f0..3f9f26b525ba5 100644 --- a/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp +++ b/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp @@ -131,7 +131,10 @@ void VM_Version::setup_cpu_available_features() { if (_feature_list[i]->feature_string()) { const char* tmp = _feature_list[i]->pretty(); if (strlen(tmp) == 1) { - strcat(buf, " "); + // Feature string is expected to be in multi-character form + // like rvc, rvv, etc so that it will be easier to specify + // target feature string in tests. + strcat(buf, " rv"); strcat(buf, tmp); } else { // Feature string is expected to be lower case. diff --git a/test/hotspot/jtreg/compiler/c2/cr7200264/TestIntVect.java b/test/hotspot/jtreg/compiler/c2/cr7200264/TestIntVect.java index 17556896f2606..457e33667b2d1 100644 --- a/test/hotspot/jtreg/compiler/c2/cr7200264/TestIntVect.java +++ b/test/hotspot/jtreg/compiler/c2/cr7200264/TestIntVect.java @@ -480,10 +480,7 @@ void test_suba(int[] a0, int[] a1, int[] a2) { @Test @IR(counts = { IRNode.SUB_VI, "> 0", IRNode.LSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.SUB_VI, "> 0", IRNode.LSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_mulc(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]*VALUE); @@ -492,10 +489,7 @@ void test_mulc(int[] a0, int[] a1) { @Test @IR(counts = { IRNode.SUB_VI, "> 0", IRNode.LSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.SUB_VI, "> 0", IRNode.LSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_mulc_n(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]*(-VALUE)); @@ -527,15 +521,7 @@ void test_mula(int[] a0, int[] a1, int[] a2) { IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0", IRNode.SUB_VI, IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0" }, - applyIfCPUFeatureOr = {"avx2", "true", "sve", "true"}) - @IR(counts = { IRNode.ADD_VI, - IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0", - IRNode.RSHIFT_VI, - IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0", - IRNode.SUB_VI, - IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"avx2", "true", "sve", "true", "rvv", "true"}) // Not vectorized: On aarch64, vectorization for this example results in // MulVL nodes, which asimd does not support. @IR(counts = { IRNode.LOAD_VECTOR_I, "= 0", @@ -555,15 +541,7 @@ void test_divc(int[] a0, int[] a1) { IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0", IRNode.SUB_VI, IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0" }, - applyIfCPUFeatureOr = {"avx2", "true", "sve", "true"}) - @IR(counts = { IRNode.ADD_VI, - IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0", - IRNode.RSHIFT_VI, - IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0", - IRNode.SUB_VI, - IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"avx2", "true", "sve", "true", "rvv", "true"}) // Not vectorized: On aarch64, vectorization for this example results in // MulVL nodes, which asimd does not support. @IR(counts = { IRNode.LOAD_VECTOR_I, "= 0", @@ -683,10 +661,7 @@ void test_xora(int[] a0, int[] a1, int[] a2) { @Test @IR(counts = { IRNode.LSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.LSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_sllc(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]<<VALUE); @@ -695,10 +670,7 @@ void test_sllc(int[] a0, int[] a1) { @Test @IR(counts = { IRNode.LSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.LSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_sllc_n(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]<<(-VALUE)); @@ -710,12 +682,7 @@ void test_sllc_n(int[] a0, int[] a1) { @IR(counts = { IRNode.LSHIFT_VI, "= 0", IRNode.LOAD_VECTOR_I, "> 0", IRNode.STORE_VECTOR, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.LSHIFT_VI, "= 0", - IRNode.LOAD_VECTOR_I, "> 0", - IRNode.STORE_VECTOR, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_sllc_o(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]<<SHIFT); @@ -727,12 +694,7 @@ void test_sllc_o(int[] a0, int[] a1) { @IR(counts = { IRNode.LSHIFT_VI, "= 0", IRNode.LOAD_VECTOR_I, "> 0", IRNode.STORE_VECTOR, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.LSHIFT_VI, "= 0", - IRNode.LOAD_VECTOR_I, "> 0", - IRNode.STORE_VECTOR, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_sllc_on(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]<<(-SHIFT)); @@ -741,10 +703,7 @@ void test_sllc_on(int[] a0, int[] a1) { @Test @IR(counts = { IRNode.LSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.LSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_sllv(int[] a0, int[] a1, int b) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]<<b); @@ -753,10 +712,7 @@ void test_sllv(int[] a0, int[] a1, int b) { @Test @IR(counts = { IRNode.URSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.URSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srlc(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>>VALUE); @@ -765,10 +721,7 @@ void test_srlc(int[] a0, int[] a1) { @Test @IR(counts = { IRNode.URSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.URSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srlc_n(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>>(-VALUE)); @@ -780,12 +733,7 @@ void test_srlc_n(int[] a0, int[] a1) { @IR(counts = { IRNode.URSHIFT_VI, "= 0", IRNode.LOAD_VECTOR_I, "> 0", IRNode.STORE_VECTOR, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.URSHIFT_VI, "= 0", - IRNode.LOAD_VECTOR_I, "> 0", - IRNode.STORE_VECTOR, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srlc_o(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>>SHIFT); @@ -797,12 +745,7 @@ void test_srlc_o(int[] a0, int[] a1) { @IR(counts = { IRNode.URSHIFT_VI, "= 0", IRNode.LOAD_VECTOR_I, "> 0", IRNode.STORE_VECTOR, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.URSHIFT_VI, "= 0", - IRNode.LOAD_VECTOR_I, "> 0", - IRNode.STORE_VECTOR, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srlc_on(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>>(-SHIFT)); @@ -811,10 +754,7 @@ void test_srlc_on(int[] a0, int[] a1) { @Test @IR(counts = { IRNode.URSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.URSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srlv(int[] a0, int[] a1, int b) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>>b); @@ -823,10 +763,7 @@ void test_srlv(int[] a0, int[] a1, int b) { @Test @IR(counts = { IRNode.RSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.RSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srac(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>VALUE); @@ -835,10 +772,7 @@ void test_srac(int[] a0, int[] a1) { @Test @IR(counts = { IRNode.RSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.RSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srac_n(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>(-VALUE)); @@ -850,12 +784,7 @@ void test_srac_n(int[] a0, int[] a1) { @IR(counts = { IRNode.RSHIFT_VI, "= 0", IRNode.LOAD_VECTOR_I, "> 0", IRNode.STORE_VECTOR, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.RSHIFT_VI, "= 0", - IRNode.LOAD_VECTOR_I, "> 0", - IRNode.STORE_VECTOR, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srac_o(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>SHIFT); @@ -867,12 +796,7 @@ void test_srac_o(int[] a0, int[] a1) { @IR(counts = { IRNode.RSHIFT_VI, "= 0", IRNode.LOAD_VECTOR_I, "> 0", IRNode.STORE_VECTOR, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.RSHIFT_VI, "= 0", - IRNode.LOAD_VECTOR_I, "> 0", - IRNode.STORE_VECTOR, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srac_on(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>(-SHIFT)); @@ -881,10 +805,7 @@ void test_srac_on(int[] a0, int[] a1) { @Test @IR(counts = { IRNode.RSHIFT_VI, "> 0" }, - applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"}) - @IR(counts = { IRNode.RSHIFT_VI, "> 0" }, - applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}) + applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"}) void test_srav(int[] a0, int[] a1, int b) { for (int i = 0; i < a0.length; i+=1) { a0[i] = (int)(a1[i]>>b); diff --git a/test/hotspot/jtreg/compiler/c2/irTests/TestVectorizeURShiftSubword.java b/test/hotspot/jtreg/compiler/c2/irTests/TestVectorizeURShiftSubword.java index f477a08f7174a..9896a8b906e96 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/TestVectorizeURShiftSubword.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/TestVectorizeURShiftSubword.java @@ -35,7 +35,7 @@ * @key randomness * @summary Auto-vectorization enhancement for unsigned shift right on signed subword types * @requires ((os.arch=="amd64" | os.arch=="x86_64") & (vm.opt.UseSSE == "null" | vm.opt.UseSSE > 3)) | os.arch=="aarch64" | - * (os.arch == "riscv64" & vm.cpu.features ~= ".*v,.*") + * (os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*") * @library /test/lib / * @run driver compiler.c2.irTests.TestVectorizeURShiftSubword */ diff --git a/test/hotspot/jtreg/compiler/intrinsics/TestBitShuffleOpers.java b/test/hotspot/jtreg/compiler/intrinsics/TestBitShuffleOpers.java index 9a7e0c6b9f2b2..064ffeb41fb34 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/TestBitShuffleOpers.java +++ b/test/hotspot/jtreg/compiler/intrinsics/TestBitShuffleOpers.java @@ -31,7 +31,7 @@ * (vm.cpu.features ~= ".*bmi2.*" & vm.cpu.features ~= ".*bmi1.*" & * vm.cpu.features ~= ".*sse2.*")) | * (os.arch=="aarch64" & vm.cpu.features ~= ".*svebitperm.*") | - * (os.arch=="riscv64" & vm.cpu.features ~= ".*v,.*")) + * (os.arch=="riscv64" & vm.cpu.features ~= ".*rvv.*")) * @library /test/lib / * @run driver compiler.intrinsics.TestBitShuffleOpers */ diff --git a/test/hotspot/jtreg/compiler/intrinsics/chacha/TestChaCha20.java b/test/hotspot/jtreg/compiler/intrinsics/chacha/TestChaCha20.java index 55f8375332d5b..448d594b6aabe 100644 --- a/test/hotspot/jtreg/compiler/intrinsics/chacha/TestChaCha20.java +++ b/test/hotspot/jtreg/compiler/intrinsics/chacha/TestChaCha20.java @@ -38,7 +38,7 @@ * @library /test/lib * @requires (vm.cpu.features ~= ".*avx512.*" | vm.cpu.features ~= ".*avx2.*" | vm.cpu.features ~= ".*avx.*") | * (os.arch=="aarch64" & vm.cpu.features ~= ".*simd.*") | - * (os.arch == "riscv64" & vm.cpu.features ~= ".*v,.*") + * (os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*") * @build compiler.intrinsics.chacha.ExerciseChaCha20 * jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox @@ -60,13 +60,9 @@ private static List<String> mix(List<String> o, String... mix) { return n; } - private static boolean containsFuzzy(List<String> list, String sub, Boolean matchExactly) { + private static boolean containsFuzzy(List<String> list, String sub) { for (String s : list) { - if (matchExactly) { - if (s.equals(sub)) return true; - } else { - if (s.contains(sub)) return true; - } + if (s.contains(sub)) return true; } return false; } @@ -86,27 +82,27 @@ public static void main(String... args) throws Exception { } // Otherwise, select the tests that make sense on current platform. - if (containsFuzzy(cpuFeatures, "avx512", false)) { + if (containsFuzzy(cpuFeatures, "avx512")) { System.out.println("Setting up AVX512 worker"); configs.add(List.of("-XX:UseAVX=3")); } - if (containsFuzzy(cpuFeatures, "avx2", false)) { + if (containsFuzzy(cpuFeatures, "avx2")) { System.out.println("Setting up AVX2 worker"); configs.add(List.of("-XX:UseAVX=2")); } - if (containsFuzzy(cpuFeatures, "avx", false)) { + if (containsFuzzy(cpuFeatures, "avx")) { System.out.println("Setting up AVX worker"); configs.add(List.of("-XX:UseAVX=1")); } } else if (Platform.isAArch64()) { // AArch64 intrinsics require the advanced simd instructions - if (containsFuzzy(cpuFeatures, "simd", false)) { + if (containsFuzzy(cpuFeatures, "simd")) { System.out.println("Setting up ASIMD worker"); configs.add(new ArrayList()); } } else if (Platform.isRISCV64()) { // Riscv64 intrinsics require the vector instructions - if (containsFuzzy(cpuFeatures, "v", true)) { + if (containsFuzzy(cpuFeatures, "rvv")) { System.out.println("Setting up vector worker"); configs.add(List.of("-XX:+UseRVV")); } diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java b/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java index fc46712bb43f1..73943db3f5374 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java @@ -108,7 +108,7 @@ public class IREncodingPrinter { "asimd", "sve", // Riscv64 - "v", + "rvv", "zvbb" )); diff --git a/test/hotspot/jtreg/compiler/vectorapi/reshape/TestVectorCastRVV.java b/test/hotspot/jtreg/compiler/vectorapi/reshape/TestVectorCastRVV.java index ebcd4a727f0e2..b8bcf73b403e5 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/reshape/TestVectorCastRVV.java +++ b/test/hotspot/jtreg/compiler/vectorapi/reshape/TestVectorCastRVV.java @@ -34,7 +34,7 @@ * @modules jdk.incubator.vector * @modules java.base/jdk.internal.misc * @summary Test that vector cast intrinsics work as intended on riscv (rvv). - * @requires os.arch == "riscv64" & vm.cpu.features ~= ".*v,.*" + * @requires os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*" * @library /test/lib / * @run main/timeout=300 compiler.vectorapi.reshape.TestVectorCastRVV */ diff --git a/test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java b/test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java index 66943d68a678d..ee4e613dbbb7c 100644 --- a/test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java +++ b/test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java @@ -28,7 +28,7 @@ * and riscv64 (vector) * @requires vm.compiler2.enabled * @requires (os.simpleArch == "x64" & vm.cpu.features ~= ".*avx.*") | os.arch == "aarch64" | - * (os.arch == "riscv64" & vm.cpu.features ~= ".*v,.*") + * (os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*") * @library /test/lib / * @run driver compiler.vectorization.TestSignumVector */ diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/ArrayShiftOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/ArrayShiftOpTest.java index c4f601f42c89f..ec1e3f998ca12 100644 --- a/test/hotspot/jtreg/compiler/vectorization/runner/ArrayShiftOpTest.java +++ b/test/hotspot/jtreg/compiler/vectorization/runner/ArrayShiftOpTest.java @@ -153,10 +153,7 @@ public long[] longExplicitRotateWithPopulateIndex2() { @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VI, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VI, ">0"}) public int[] intShiftLargeDistConstant() { int[] res = new int[SIZE]; @@ -167,10 +164,7 @@ public int[] intShiftLargeDistConstant() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VI, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VI, ">0"}) public int[] intShiftLargeDistInvariant() { int[] res = new int[SIZE]; @@ -181,10 +175,7 @@ public int[] intShiftLargeDistInvariant() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VS, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VS, ">0"}) public short[] shortShiftLargeDistConstant() { short[] res = new short[SIZE]; @@ -195,10 +186,7 @@ public short[] shortShiftLargeDistConstant() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VS, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VS, ">0"}) public short[] shortShiftLargeDistInvariant() { short[] res = new short[SIZE]; @@ -209,10 +197,7 @@ public short[] shortShiftLargeDistInvariant() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.LSHIFT_VL, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.LSHIFT_VL, ">0"}) public long[] longShiftLargeDistConstant() { long[] res = new long[SIZE]; @@ -223,10 +208,7 @@ public long[] longShiftLargeDistConstant() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.URSHIFT_VL, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.URSHIFT_VL, ">0"}) public long[] longShiftLargeDistInvariant() { long[] res = new long[SIZE]; @@ -259,10 +241,7 @@ public short[] loopIndexShiftDistance() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VS, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VS, ">0"}) public short[] vectorUnsignedShiftRight() { short[] res = new short[SIZE]; diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicByteOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicByteOpTest.java index f080e29d1c358..60a6d78a7d467 100644 --- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicByteOpTest.java +++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicByteOpTest.java @@ -189,10 +189,7 @@ public byte[] vectorXor() { // ---------------- Shift ---------------- @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true"}, - counts = {IRNode.LSHIFT_VB, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true", "rvv", "true"}, counts = {IRNode.LSHIFT_VB, ">0"}) public byte[] vectorShiftLeft() { byte[] res = new byte[SIZE]; @@ -203,10 +200,7 @@ public byte[] vectorShiftLeft() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true"}, - counts = {IRNode.RSHIFT_VB, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VB, ">0"}) public byte[] vectorSignedShiftRight() { byte[] res = new byte[SIZE]; @@ -217,10 +211,7 @@ public byte[] vectorSignedShiftRight() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true"}, - counts = {IRNode.RSHIFT_VB, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VB, ">0"}) public byte[] vectorUnsignedShiftRight() { byte[] res = new byte[SIZE]; diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicCharOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicCharOpTest.java index 9fa53609ea27e..8c20b879d59d8 100644 --- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicCharOpTest.java +++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicCharOpTest.java @@ -191,10 +191,7 @@ public char[] vectorXor() { // ---------------- Shift ---------------- @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.LSHIFT_VC, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.LSHIFT_VC, ">0"}) public char[] vectorShiftLeft() { char[] res = new char[SIZE]; @@ -205,10 +202,7 @@ public char[] vectorShiftLeft() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.URSHIFT_VC, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.URSHIFT_VC, ">0"}) public char[] vectorSignedShiftRight() { char[] res = new char[SIZE]; @@ -219,10 +213,7 @@ public char[] vectorSignedShiftRight() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.URSHIFT_VC, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.URSHIFT_VC, ">0"}) public char[] vectorUnsignedShiftRight() { char[] res = new char[SIZE]; diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicIntOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicIntOpTest.java index 5774e3b63b2f0..b3d7c21586776 100644 --- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicIntOpTest.java +++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicIntOpTest.java @@ -198,10 +198,7 @@ public int[] vectorXor() { // ---------------- Shift ---------------- @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.LSHIFT_VI, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.LSHIFT_VI, ">0"}) public int[] vectorShiftLeft() { int[] res = new int[SIZE]; @@ -212,10 +209,7 @@ public int[] vectorShiftLeft() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VI, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VI, ">0"}) public int[] vectorSignedShiftRight() { int[] res = new int[SIZE]; @@ -226,10 +220,7 @@ public int[] vectorSignedShiftRight() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.URSHIFT_VI, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.URSHIFT_VI, ">0"}) public int[] vectorUnsignedShiftRight() { int[] res = new int[SIZE]; diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicLongOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicLongOpTest.java index c6ecac096f93a..2f1bfcdf1df84 100644 --- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicLongOpTest.java +++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicLongOpTest.java @@ -190,10 +190,7 @@ public long[] vectorXor() { // ---------------- Shift ---------------- @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.LSHIFT_VL, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.LSHIFT_VL, ">0"}) public long[] vectorShiftLeft() { long[] res = new long[SIZE]; @@ -204,10 +201,7 @@ public long[] vectorShiftLeft() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VL, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VL, ">0"}) public long[] vectorSignedShiftRight() { long[] res = new long[SIZE]; @@ -218,10 +212,7 @@ public long[] vectorSignedShiftRight() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.URSHIFT_VL, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.URSHIFT_VL, ">0"}) public long[] vectorUnsignedShiftRight() { long[] res = new long[SIZE]; diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicShortOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicShortOpTest.java index bf5516ddaf8a0..50b68cd2e4873 100644 --- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicShortOpTest.java +++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicShortOpTest.java @@ -189,10 +189,7 @@ public short[] vectorXor() { // ---------------- Shift ---------------- @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.LSHIFT_VS, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.LSHIFT_VS, ">0"}) public short[] vectorShiftLeft() { short[] res = new short[SIZE]; @@ -203,10 +200,7 @@ public short[] vectorShiftLeft() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VS, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VS, ">0"}) public short[] vectorSignedShiftRight() { short[] res = new short[SIZE]; @@ -242,10 +236,7 @@ public short[] vectorMax() { } @Test - @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, - counts = {IRNode.RSHIFT_VS, ">0"}) - @IR(applyIfPlatform = {"riscv64", "true"}, - applyIfCPUFeature = {"v", "true"}, + @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, counts = {IRNode.RSHIFT_VS, ">0"}) public short[] vectorUnsignedShiftRight() { short[] res = new short[SIZE]; From cdf22b13204456b589349500bef0e9d48af44e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Gr=C3=B6nlund?= <mgronlun@openjdk.org> Date: Mon, 17 Jun 2024 12:57:09 +0000 Subject: [PATCH 084/471] 8326715: ZGC: RunThese24H fails with ExitCode 139 during shutdown Reviewed-by: egahlin --- .../checkpoint/objectSampleCheckpoint.cpp | 113 ++++++---------- .../checkpoint/objectSampleCheckpoint.hpp | 5 +- .../leakprofiler/sampling/objectSample.hpp | 4 +- .../checkpoint/jfrCheckpointManager.cpp | 28 ++-- .../checkpoint/jfrCheckpointWriter.hpp | 1 + .../storage/jfrReferenceCountedStorage.cpp | 79 ++++++++++++ .../storage/jfrReferenceCountedStorage.hpp | 68 ++++++++++ .../jfr/support/jfrDeprecationEventWriter.cpp | 29 ++++- .../jfr/support/jfrDeprecationEventWriter.hpp | 13 +- .../jfr/support/jfrDeprecationManager.cpp | 122 ++++++++++-------- .../jfr/support/jfrDeprecationManager.hpp | 13 +- 11 files changed, 312 insertions(+), 163 deletions(-) create mode 100644 src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.cpp create mode 100644 src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.hpp diff --git a/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.cpp b/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.cpp index 2412454f6aa83..b7f9b733c0fd0 100644 --- a/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.cpp +++ b/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.cpp @@ -36,6 +36,7 @@ #include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp" #include "jfr/recorder/service/jfrOptionSet.hpp" #include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp" +#include "jfr/recorder/storage/jfrReferenceCountedStorage.hpp" #include "jfr/support/jfrKlassUnloading.hpp" #include "jfr/support/jfrMethodLookup.hpp" #include "jfr/utilities/jfrHashtable.hpp" @@ -272,11 +273,30 @@ static void install_stack_traces(const ObjectSampler* sampler) { iterate_samples(installer); } +// Resets the blob write states from the previous epoch. +static void reset_blob_write_state(const ObjectSampler* sampler, JavaThread* jt) { + assert(sampler != nullptr, "invariant"); + const ObjectSample* sample = sampler->last_resolved(); + while (sample != nullptr) { + if (sample->has_stacktrace()) { + sample->stacktrace()->reset_write_state(); + } + if (sample->has_thread()) { + sample->thread()->reset_write_state(); + } + if (sample->has_type_set()) { + sample->type_set()->reset_write_state(); + } + sample = sample->next(); + } +} + void ObjectSampleCheckpoint::on_rotation(const ObjectSampler* sampler) { assert(sampler != nullptr, "invariant"); assert(LeakProfiler::is_running(), "invariant"); JavaThread* const thread = JavaThread::current(); DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_native(thread);) + reset_blob_write_state(sampler, thread); if (!ObjectSampler::has_unresolved_entry()) { return; } @@ -326,38 +346,34 @@ void ObjectSampleCheckpoint::write_stacktrace(const JfrStackTrace* trace, JfrChe } } -static void write_blob(const JfrBlobHandle& blob, JfrCheckpointWriter& writer, bool reset) { - if (reset) { - blob->reset_write_state(); - return; - } +static void write_blob(const JfrBlobHandle& blob, JfrCheckpointWriter& writer) { blob->exclusive_write(writer); } -static void write_type_set_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) { +static void write_type_set_blob(const ObjectSample* sample, JfrCheckpointWriter& writer) { if (sample->has_type_set()) { - write_blob(sample->type_set(), writer, reset); + write_blob(sample->type_set(), writer); } } -static void write_thread_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) { +static void write_thread_blob(const ObjectSample* sample, JfrCheckpointWriter& writer) { assert(sample->has_thread(), "invariant"); if (sample->is_virtual_thread() || has_thread_exited(sample->thread_id())) { - write_blob(sample->thread(), writer, reset); + write_blob(sample->thread(), writer); } } -static void write_stacktrace_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) { +static void write_stacktrace_blob(const ObjectSample* sample, JfrCheckpointWriter& writer) { if (sample->has_stacktrace()) { - write_blob(sample->stacktrace(), writer, reset); + write_blob(sample->stacktrace(), writer); } } -static void write_blobs(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) { +static void write_blobs(const ObjectSample* sample, JfrCheckpointWriter& writer) { assert(sample != nullptr, "invariant"); - write_stacktrace_blob(sample, writer, reset); - write_thread_blob(sample, writer, reset); - write_type_set_blob(sample, writer, reset); + write_stacktrace_blob(sample, writer); + write_thread_blob(sample, writer); + write_type_set_blob(sample, writer); } class BlobWriter { @@ -365,18 +381,14 @@ class BlobWriter { const ObjectSampler* _sampler; JfrCheckpointWriter& _writer; const jlong _last_sweep; - bool _reset; public: BlobWriter(const ObjectSampler* sampler, JfrCheckpointWriter& writer, jlong last_sweep) : - _sampler(sampler), _writer(writer), _last_sweep(last_sweep), _reset(false) {} + _sampler(sampler), _writer(writer), _last_sweep(last_sweep) {} void sample_do(ObjectSample* sample) { if (sample->is_alive_and_older_than(_last_sweep)) { - write_blobs(sample, _writer, _reset); + write_blobs(sample, _writer); } } - void set_reset() { - _reset = true; - } }; static void write_sample_blobs(const ObjectSampler* sampler, bool emit_all, Thread* thread) { @@ -385,9 +397,6 @@ static void write_sample_blobs(const ObjectSampler* sampler, bool emit_all, Thre JfrCheckpointWriter writer(thread, false); BlobWriter cbw(sampler, writer, last_sweep); iterate_samples(cbw, true); - // reset blob write states - cbw.set_reset(); - iterate_samples(cbw, true); } void ObjectSampleCheckpoint::write(const ObjectSampler* sampler, EdgeStore* edge_store, bool emit_all, Thread* thread) { @@ -403,67 +412,17 @@ void ObjectSampleCheckpoint::write(const ObjectSampler* sampler, EdgeStore* edge } } -// A linked list of saved type set blobs for the epoch. -// The link consist of a reference counted handle. -static JfrBlobHandle saved_type_set_blobs; - -static void release_state_for_previous_epoch() { - // decrements the reference count and the list is reinitialized - saved_type_set_blobs = JfrBlobHandle(); -} - -class BlobInstaller { - public: - ~BlobInstaller() { - release_state_for_previous_epoch(); - } - void sample_do(ObjectSample* sample) { - if (!sample->is_dead()) { - sample->set_type_set(saved_type_set_blobs); - } - } -}; - -static void install_type_set_blobs() { - if (saved_type_set_blobs.valid()) { - BlobInstaller installer; - iterate_samples(installer); - } -} - -static void save_type_set_blob(JfrCheckpointWriter& writer) { - assert(writer.has_data(), "invariant"); - const JfrBlobHandle blob = writer.copy(); - if (saved_type_set_blobs.valid()) { - saved_type_set_blobs->set_next(blob); - } else { - saved_type_set_blobs = blob; - } -} - // This routine has exclusive access to the sampler instance on entry. -void ObjectSampleCheckpoint::on_type_set(JfrCheckpointWriter& writer) { +void ObjectSampleCheckpoint::on_type_set(JavaThread* jt) { assert(LeakProfiler::is_running(), "invariant"); DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(JavaThread::current());) assert(ClassLoaderDataGraph_lock->owned_by_self(), "invariant"); if (!ObjectSampler::has_unresolved_entry()) { return; } - const ObjectSample* const last = ObjectSampler::sampler()->last(); + ObjectSample* const last = ObjectSampler::sampler()->last(); assert(last != nullptr, "invariant"); assert(last != ObjectSampler::sampler()->last_resolved(), "invariant"); - if (writer.has_data()) { - save_type_set_blob(writer); - } - install_type_set_blobs(); + JfrReferenceCountedStorage::install(last, ObjectSampler::sampler()->last_resolved()); ObjectSampler::sampler()->set_last_resolved(last); } - -// This routine does NOT have exclusive access to the sampler instance on entry. -void ObjectSampleCheckpoint::on_type_set_unload(JfrCheckpointWriter& writer) { - assert(LeakProfiler::is_running(), "invariant"); - assert_locked_or_safepoint(ClassLoaderDataGraph_lock); - if (writer.has_data() && ObjectSampler::has_unresolved_entry()) { - save_type_set_blob(writer); - } -} diff --git a/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp b/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp index eb887f2db9a4a..bf1965b13b508 100644 --- a/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp +++ b/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,8 +50,7 @@ class ObjectSampleCheckpoint : AllStatic { static void write(const ObjectSampler* sampler, EdgeStore* edge_store, bool emit_all, Thread* thread); static void clear(); public: - static void on_type_set(JfrCheckpointWriter& writer); - static void on_type_set_unload(JfrCheckpointWriter& writer); + static void on_type_set(JavaThread* jt); static void on_thread_exit(traceid tid); static void on_rotation(const ObjectSampler* sampler); }; diff --git a/src/hotspot/share/jfr/leakprofiler/sampling/objectSample.hpp b/src/hotspot/share/jfr/leakprofiler/sampling/objectSample.hpp index c202ba8d8aa1c..214de827d03bc 100644 --- a/src/hotspot/share/jfr/leakprofiler/sampling/objectSample.hpp +++ b/src/hotspot/share/jfr/leakprofiler/sampling/objectSample.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -233,7 +233,7 @@ class ObjectSample : public JfrCHeapObj { return _type_set.valid(); } - void set_type_set(const JfrBlobHandle& ref) { + void install_type_set(const JfrBlobHandle& ref) { if (_type_set != ref) { if (_type_set.valid()) { _type_set->set_next(ref); diff --git a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp index 0aed916702e79..a2e887e71a32a 100644 --- a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp +++ b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,6 +37,7 @@ #include "jfr/recorder/service/jfrOptionSet.hpp" #include "jfr/recorder/storage/jfrEpochStorage.inline.hpp" #include "jfr/recorder/storage/jfrMemorySpace.inline.hpp" +#include "jfr/recorder/storage/jfrReferenceCountedStorage.hpp" #include "jfr/recorder/storage/jfrStorageUtils.inline.hpp" #include "jfr/recorder/stringpool/jfrStringPool.hpp" #include "jfr/support/jfrDeprecationManager.hpp" @@ -589,12 +590,14 @@ void JfrCheckpointManager::clear_type_set() { MutexLocker module_lock(Module_lock); JfrTypeSet::clear(&writer, &leakp_writer); } - JfrDeprecationManager::on_type_set(leakp_writer, nullptr, thread); - // We placed a blob in the Deprecated subsystem by moving the information - // from the leakp writer. For the real writer, the data will not be - // committed, because the JFR system is yet to be started. - // Therefore, the writer is cancelled before its destructor is run, - // to avoid writing unnecessary information into the checkpoint system. + JfrAddRefCountedBlob add_blob(leakp_writer); + JfrDeprecationManager::on_type_set(nullptr, thread); + // We installed a blob in the JfrReferenceCountedStorage subsystem + // by moving the information from the leakp writer. + // For the real writer, the data will not be committed, + // because the JFR system is yet to be started. + // Therefore, we cancel the writer before its destructor is run + // to avoid writing invalid information into the checkpoint system. writer.cancel(); } @@ -613,11 +616,11 @@ void JfrCheckpointManager::write_type_set() { MutexLocker module_lock(thread, Module_lock); JfrTypeSet::serialize(&writer, &leakp_writer, false, false); } + JfrAddRefCountedBlob add_blob(leakp_writer); if (LeakProfiler::is_running()) { - ObjectSampleCheckpoint::on_type_set(leakp_writer); + ObjectSampleCheckpoint::on_type_set(thread); } - // Place this call after ObjectSampleCheckpoint::on_type_set. - JfrDeprecationManager::on_type_set(leakp_writer, _chunkwriter, thread); + JfrDeprecationManager::on_type_set(_chunkwriter, thread); } write(); } @@ -626,10 +629,7 @@ void JfrCheckpointManager::on_unloading_classes() { assert_locked_or_safepoint(ClassLoaderDataGraph_lock); JfrCheckpointWriter writer(Thread::current()); JfrTypeSet::on_unloading_classes(&writer); - if (LeakProfiler::is_running()) { - ObjectSampleCheckpoint::on_type_set_unload(writer); - } - JfrDeprecationManager::on_type_set_unload(writer); + JfrAddRefCountedBlob add_blob(writer, false /* move */, false /* reset */); } static size_t flush_type_set(Thread* thread) { diff --git a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp index a8ec2fd70f538..aaebc8f3e7e27 100644 --- a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp +++ b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp @@ -54,6 +54,7 @@ struct JfrCheckpointContext { }; class JfrCheckpointWriter : public JfrCheckpointWriterBase { + friend class JfrAddRefCountedBlob; friend class JfrCheckpointManager; friend class JfrDeprecationManager; friend class JfrSerializerRegistration; diff --git a/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.cpp b/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.cpp new file mode 100644 index 0000000000000..ac652905c5b83 --- /dev/null +++ b/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "jfr/leakprofiler/sampling/objectSampler.hpp" +#include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp" +#include "jfr/recorder/storage/jfrReferenceCountedStorage.hpp" +#include "jfr/support/jfrDeprecationManager.hpp" + +// Currently only two subsystems use type set blobs. Save a blob only if either has an unresolved entry. +static inline bool save_blob_predicate() { + return JfrDeprecationManager::has_unresolved_entry() || ObjectSampler::has_unresolved_entry(); +} + +JfrAddRefCountedBlob::JfrAddRefCountedBlob(JfrCheckpointWriter& writer, bool move /* true */, bool reset /* true */) : _reset(reset) { + if (writer.has_data()) { + if (save_blob_predicate()) { + JfrReferenceCountedStorage::save_blob(writer, move); + } else if (move) { + writer.cancel(); + } + } + DEBUG_ONLY(if (reset) JfrReferenceCountedStorage::set_scope();) +} + +JfrAddRefCountedBlob::~JfrAddRefCountedBlob() { + if (_reset) { + JfrReferenceCountedStorage::reset(); + } +} + +JfrBlobHandle JfrReferenceCountedStorage::_type_sets = JfrBlobHandle(); +DEBUG_ONLY(bool JfrReferenceCountedStorage::_scope = false;) + +void JfrReferenceCountedStorage::save_blob(JfrCheckpointWriter& writer, bool move /* false */) { + assert(writer.has_data(), "invariant"); + const JfrBlobHandle blob = move ? writer.move() : writer.copy(); + if (_type_sets.valid()) { + _type_sets->set_next(blob); + return; + } + _type_sets = blob; +} + +void JfrReferenceCountedStorage::reset() { + assert(_scope, "invariant"); + if (_type_sets.valid()) { + _type_sets = JfrBlobHandle(); + } + DEBUG_ONLY(_scope = false;) +} + +#ifdef ASSERT +void JfrReferenceCountedStorage::set_scope() { + assert(!_scope, "invariant"); + _scope = true; +} +#endif diff --git a/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.hpp b/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.hpp new file mode 100644 index 0000000000000..6d32e1b0eadb0 --- /dev/null +++ b/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.hpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_JFR_RECORDER_STORAGE_JFRREFERENCECOUNTEDSTORAGE_HPP +#define SHARE_JFR_RECORDER_STORAGE_JFRREFERENCECOUNTEDSTORAGE_HPP + +#include "jfr/utilities/jfrBlob.hpp" +#include "memory/allocation.hpp" +#include "utilities/macros.hpp" + +class JfrCheckpointWriter; + +// RAII helper class for adding blobs to the storage. +class JfrAddRefCountedBlob : public StackObj { + private: + bool _reset; + public: + JfrAddRefCountedBlob(JfrCheckpointWriter& writer, bool move = true, bool reset = true); + ~JfrAddRefCountedBlob(); +}; + +// The debug aid 'scope' implies the proper RAII save construct is placed on stack. +// This is a necessary condition for installing reference counted storage to nodes. +class JfrReferenceCountedStorage : AllStatic { + friend class JfrAddRefCountedBlob; + private: + static JfrBlobHandle _type_sets; // linked-list of blob handles saved during epoch. + DEBUG_ONLY(static bool _scope;) + + static void save_blob(JfrCheckpointWriter& writer, bool move = false); + static void reset(); + DEBUG_ONLY(static void set_scope();) + + public: + template <typename T> + static void install(T* node, const T* end) { + assert(_scope, "invariant"); + if (_type_sets.valid()) { + while (node != end) { + node->install_type_set(_type_sets); + node = node->next(); + } + } + } +}; + +#endif // SHARE_JFR_RECORDER_STORAGE_JFRREFERENCECOUNTEDSTORAGE_HPP diff --git a/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.cpp b/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.cpp index 24cdbdc161126..4aa61bdddff7f 100644 --- a/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.cpp +++ b/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -116,8 +116,8 @@ bool JfrDeprecatedStackTraceWriter::process(const JfrDeprecatedEdge* edge) { return true; } -JfrDeprecatedEventWriter::JfrDeprecatedEventWriter(JfrChunkWriter& cw, bool stacktrace) : - _now(JfrTicks::now()),_cw(cw), _for_removal(only_for_removal()), _stacktrace(stacktrace), _did_write(false) {} +JfrDeprecatedEventWriter::JfrDeprecatedEventWriter(JfrChunkWriter& cw, JfrCheckpointWriter& tsw, bool stacktrace) : + _now(JfrTicks::now()),_cw(cw), _tsw(tsw), _for_removal(only_for_removal()), _stacktrace(stacktrace) {} static size_t calculate_event_size(const JfrDeprecatedEdge* edge, JfrChunkWriter& cw, const JfrTicks& now, bool stacktrace) { assert(edge != nullptr, "invariant"); @@ -141,14 +141,31 @@ static void write_event(const JfrDeprecatedEdge* edge, JfrChunkWriter& cw, const cw.write(edge->for_removal()); } +static void write_type_set(const JfrDeprecatedEdge* edge, JfrCheckpointWriter& tsw) { + if (!edge->has_type_set()) { + return; + } + edge->type_set()->exclusive_write(tsw); +} + bool JfrDeprecatedEventWriter::process(const JfrDeprecatedEdge* edge) { assert(edge != nullptr, "invariant"); if (_for_removal && !edge->for_removal()) { return true; } - write_event(edge, _cw,_now, _stacktrace); - if (!_did_write) { - _did_write = true; + write_event(edge, _cw, _now, _stacktrace); + write_type_set(edge, _tsw); + return true; +} + +JfrDeprecatedEventClear::JfrDeprecatedEventClear() {} + +bool JfrDeprecatedEventClear::process(const JfrDeprecatedEdge* edge) { + assert(edge != nullptr, "invariant"); + if (!edge->has_type_set()) { + return true; } + edge->type_set()->reset_write_state(); return true; } + diff --git a/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.hpp b/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.hpp index 77699c94979ef..1d73d4dc3a39e 100644 --- a/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.hpp +++ b/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.hpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,12 +56,17 @@ class JfrDeprecatedEventWriter : public StackObj { private: JfrTicks _now; JfrChunkWriter& _cw; + JfrCheckpointWriter& _tsw; bool _for_removal; bool _stacktrace; - bool _did_write; public: - JfrDeprecatedEventWriter(JfrChunkWriter& cw, bool stacktrace); - bool did_write() const { return _did_write; } + JfrDeprecatedEventWriter(JfrChunkWriter& cw, JfrCheckpointWriter& tsw, bool stacktrace); + bool process(const JfrDeprecatedEdge* edge); +}; + +class JfrDeprecatedEventClear : public StackObj { + public: + JfrDeprecatedEventClear(); bool process(const JfrDeprecatedEdge* edge); }; diff --git a/src/hotspot/share/jfr/support/jfrDeprecationManager.cpp b/src/hotspot/share/jfr/support/jfrDeprecationManager.cpp index 5f5c87d239c7f..8969b787a1cdc 100644 --- a/src/hotspot/share/jfr/support/jfrDeprecationManager.cpp +++ b/src/hotspot/share/jfr/support/jfrDeprecationManager.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,7 @@ #include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp" #include "jfr/recorder/repository/jfrChunkWriter.hpp" #include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp" +#include "jfr/recorder/storage/jfrReferenceCountedStorage.hpp" #include "jfr/support/jfrDeprecationEventWriter.hpp" #include "jfr/support/jfrDeprecationManager.hpp" #include "jfr/support/jfrKlassUnloading.hpp" @@ -66,6 +67,7 @@ static inline traceid load_traceid(const Method* method) { JfrDeprecatedEdge::JfrDeprecatedEdge(const Method* method, Method* sender, int bci, u1 frame_type, JavaThread* jt) : _invocation_time(JfrTicks::now()), _stacktrace(), + _type_set(), _next(nullptr), _deprecated_ik(method->method_holder()), _deprecated_methodid(load_traceid(method)), @@ -94,11 +96,25 @@ const JfrBlobHandle& JfrDeprecatedEdge::stacktrace() const { return _stacktrace; } +bool JfrDeprecatedEdge::has_type_set() const { + return _type_set.valid(); +} + +const JfrBlobHandle& JfrDeprecatedEdge::type_set() const { + assert(has_type_set(), "invariant"); + return _type_set; +} + +void JfrDeprecatedEdge::install_type_set(const JfrBlobHandle& type_set) { + assert(!has_type_set(), "invariant"); + _type_set = type_set; +} + typedef JfrLinkedList<JfrDeprecatedEdge> DeprecatedEdgeList; static DeprecatedEdgeList _list; // Newly constructed edges are concurrently added to this list. static DeprecatedEdgeList _pending_list; // During epoch rotation (safepoint) entries in _list are moved onto _pending_list -static DeprecatedEdgeList _resolved_list; // Fully resolved edges (event and stacktrace blobs). +static DeprecatedEdgeList _resolved_list; // Fully resolved edges (event, stacktrace and typeset blobs). static JfrDeprecatedEdge* allocate_edge(const Method* method, Method* sender, int bci, u1 frame_type, JavaThread* jt) { DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(jt);) @@ -225,10 +241,6 @@ static void transfer_list() { } } -void JfrDeprecationManager::on_level_setting_update(int64_t new_level) { - JfrDeprecatedEventWriterState::on_level_setting_update(new_level); -} - void JfrDeprecationManager::on_safepoint_clear() { assert(!_enqueue_klasses, "invariant"); // We are now starting JFR, so begin enqueuing tagged klasses. @@ -270,6 +282,23 @@ static void add_to_leakp_set(const JfrDeprecatedEdge* edge) { static DeprecatedEdgeList::NodePtr _pending_head = nullptr; static DeprecatedEdgeList::NodePtr _pending_tail = nullptr; +inline DeprecatedEdgeList::NodePtr pending_head() { + return Atomic::load(&_pending_head); +} + +// The test for a pending head can be read concurrently from a thread doing class unloading. +inline static bool has_pending_head() { + return pending_head() != nullptr; +} + +inline static bool no_pending_head() { + return !has_pending_head(); +} + +inline static void set_pending_head(DeprecatedEdgeList::NodePtr head) { + Atomic::store(&_pending_head, head); +} + class PendingListProcessor { private: JfrCheckpointWriter& _writer; @@ -281,66 +310,57 @@ class PendingListProcessor { JfrDeprecatedStackTraceWriter::install_stacktrace_blob(edge, _writer, _jt); assert(edge->has_stacktrace(), "invariant"); add_to_leakp_set(edge); - if (_pending_head == nullptr) { - _pending_head = edge; + if (no_pending_head()) { + set_pending_head(edge); } _pending_tail = edge; return true; } }; -void JfrDeprecationManager::prepare_type_set(JavaThread* jt) { - _pending_head = nullptr; +// Resets the pending head and tail. +// Resets blob write states for nodes on the resolved list, dirtied in the previous epoch. +static void reset_type_set_blobs() { + set_pending_head(nullptr); _pending_tail = nullptr; + if (_resolved_list.is_nonempty()) { + JfrDeprecatedEventClear clear; + _resolved_list.iterate(clear); + } +} + +void JfrDeprecationManager::prepare_type_set(JavaThread* jt) { + reset_type_set_blobs(); if (_pending_list.is_nonempty()) { JfrKlassUnloading::sort(true); JfrCheckpointWriter writer(true /* prev epoch */, jt, false /* header */); PendingListProcessor plp(writer, jt); _pending_list.iterate(plp); - assert(_pending_head != nullptr, "invariant"); + assert(has_pending_head(), "invariant"); assert(_pending_tail != nullptr, "invariant"); assert(_pending_tail->next() == nullptr, "invariant"); // Excise already resolved edges to link them. _pending_tail->set_next(_resolved_list.cut()); // Re-insertion. - _resolved_list.add_list(_pending_head); + _resolved_list.add_list(pending_head()); _pending_list.clear(); } assert(_pending_list.is_empty(), "invariant"); } -// A linked-list of blob handles. -static JfrBlobHandle type_set_blobs; - -static inline void write_type_set_blobs(JfrCheckpointWriter& writer) { - type_set_blobs->write(writer); -} - -static void save_type_set_blob(JfrCheckpointWriter& writer, bool copy = false) { - assert(writer.has_data(), "invariant"); - const JfrBlobHandle blob = copy ? writer.copy() : writer.move(); - if (type_set_blobs.valid()) { - type_set_blobs->set_next(blob); - } else { - type_set_blobs = blob; - } -} - -void JfrDeprecationManager::on_type_set_unload(JfrCheckpointWriter& writer) { - if (writer.has_data()) { - save_type_set_blob(writer, true); - } +bool JfrDeprecationManager::has_unresolved_entry() { + return _list.is_nonempty() || has_pending_head() || _pending_list.is_nonempty(); } static inline bool has_stacktrace() { return JfrEventSetting::has_stacktrace(JfrDeprecatedInvocationEvent); } -static inline bool write_events(JfrChunkWriter& cw) { +static inline void write_events(JfrChunkWriter& cw, Thread* thread, bool on_error) { assert(_resolved_list.is_nonempty(), "invariant"); - JfrDeprecatedEventWriter ebw(cw, has_stacktrace()); + JfrCheckpointWriter type_set_writer(!on_error, thread, false); + JfrDeprecatedEventWriter ebw(cw, type_set_writer, has_stacktrace()); _resolved_list.iterate(ebw); - return ebw.did_write(); } static inline void write_stacktraces(JfrChunkWriter& cw) { @@ -349,34 +369,30 @@ static inline void write_stacktraces(JfrChunkWriter& cw) { _resolved_list.iterate(scw); } -static inline void write_type_sets(Thread* thread, bool on_error) { - JfrCheckpointWriter writer(!on_error, thread, false); - write_type_set_blobs(writer); -} - -// First, we consolidate all stacktrace blobs into a single TYPE_STACKTRACE checkpoint and serialize it to the chunk. -// Secondly, we serialize all events to the chunk. -// Thirdly, the type set blobs are written into the JfrCheckpoint system, to be serialized to the chunk -// just after we return from here. +// First, we consolidate all stack trace blobs into a single TYPE_STACKTRACE checkpoint +// and serialize it to the chunk. Then, all events are serialized, and unique type set blobs +// written into the JfrCheckpoint system to be serialized to the chunk upon return. void JfrDeprecationManager::write_edges(JfrChunkWriter& cw, Thread* thread, bool on_error /* false */) { if (_resolved_list.is_nonempty() && JfrEventSetting::is_enabled(JfrDeprecatedInvocationEvent)) { if (has_stacktrace()) { write_stacktraces(cw); } - if (write_events(cw)) { - write_type_sets(thread, on_error); - } + write_events(cw, thread, on_error); } } -void JfrDeprecationManager::on_type_set(JfrCheckpointWriter& writer, JfrChunkWriter* cw, Thread* thread) { +void JfrDeprecationManager::on_type_set(JfrChunkWriter* cw, Thread* thread) { assert(_pending_list.is_empty(), "invariant"); - if (_pending_head != nullptr) { - save_type_set_blob(writer); - } else { - writer.cancel(); + if (has_pending_head()) { + assert(_pending_tail != nullptr, "invariant"); + // Install type set blobs for the pending, i.e. unresolved nodes. + JfrReferenceCountedStorage::install(pending_head(), _pending_tail->next()); } if (cw != nullptr) { write_edges(*cw, thread); } } + +void JfrDeprecationManager::on_level_setting_update(int64_t new_level) { + JfrDeprecatedEventWriterState::on_level_setting_update(new_level); +} diff --git a/src/hotspot/share/jfr/support/jfrDeprecationManager.hpp b/src/hotspot/share/jfr/support/jfrDeprecationManager.hpp index a19483574916a..d156679521a43 100644 --- a/src/hotspot/share/jfr/support/jfrDeprecationManager.hpp +++ b/src/hotspot/share/jfr/support/jfrDeprecationManager.hpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,6 +42,7 @@ class JfrDeprecatedEdge : public CHeapObj<mtTracing> { private: JfrTicks _invocation_time; JfrBlobHandle _stacktrace; + JfrBlobHandle _type_set; JfrDeprecatedEdge* _next; InstanceKlass* _deprecated_ik; traceid _deprecated_methodid; @@ -58,7 +59,7 @@ class JfrDeprecatedEdge : public CHeapObj<mtTracing> { public: JfrDeprecatedEdge(const Method* method, Method* sender, int bci, u1 frame_type, JavaThread* jt); - const JfrDeprecatedEdge* next() const { return _next; } + JfrDeprecatedEdge* next() const { return _next; } void set_next(JfrDeprecatedEdge* edge) { _next = edge; } bool has_event() const; @@ -68,6 +69,10 @@ class JfrDeprecatedEdge : public CHeapObj<mtTracing> { const JfrBlobHandle& stacktrace() const; void install_stacktrace_blob(JavaThread* jt); + bool has_type_set() const; + const JfrBlobHandle& type_set() const; + void install_type_set(const JfrBlobHandle& type_set); + const InstanceKlass* deprecated_ik() const { return _deprecated_ik; } traceid deprecated_methodid() const { return _deprecated_methodid; } @@ -89,11 +94,11 @@ class JfrDeprecationManager : AllStatic { static void on_safepoint_write(); static void on_recorder_stop(); static void prepare_type_set(JavaThread* jt); - static void on_type_set(JfrCheckpointWriter& writer, JfrChunkWriter* cw, Thread* thread); - static void on_type_set_unload(JfrCheckpointWriter& writer); + static void on_type_set(JfrChunkWriter* cw, Thread* thread); static void write_edges(JfrChunkWriter& cw, Thread* thread, bool on_error = false); static void on_link(const Method* method, Method* sender, int bci, u1 frame_type, JavaThread* thread); static void on_level_setting_update(int64_t new_level); + static bool has_unresolved_entry(); }; #endif // SHARE_JFR_SUPPORT_JFRDEPRECATIONMANAGER_HPP From c94af6f943c179553d1827550847b93491d47506 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Mon, 17 Jun 2024 15:50:55 +0000 Subject: [PATCH 085/471] 8333962: Obsolete OldSize Reviewed-by: dholmes, zgu --- .../share/gc/serial/tenuredGeneration.cpp | 1 + src/hotspot/share/gc/shared/gc_globals.hpp | 4 - src/hotspot/share/gc/shared/genArguments.cpp | 74 ++--------------- src/hotspot/share/gc/shared/genArguments.hpp | 2 + src/hotspot/share/runtime/arguments.cpp | 3 +- .../sun/jvm/hotspot/tools/HeapSummary.java | 1 - .../gtest/gc/shared/test_collectorPolicy.cpp | 79 ------------------- .../gc/arguments/TestMaxHeapSizeTools.java | 16 ++-- .../jtreg/gc/arguments/TestMaxNewSize.java | 7 +- .../jtreg/gc/g1/TestInvalidateArrayCopy.java | 2 +- .../jtreg/gc/g1/plab/lib/PLABUtils.java | 1 - .../TestOptionsWithRanges.java | 1 - .../largeheap/MemOptions/MemOptionsTest.java | 4 - .../jdk/jfr/event/runtime/TestSizeTFlags.java | 13 +-- .../jhsdb/heapconfig/JMapHeapConfigTest.java | 1 - 15 files changed, 24 insertions(+), 185 deletions(-) diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.cpp b/src/hotspot/share/gc/serial/tenuredGeneration.cpp index fedded6de082e..1cddce2dc514e 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.cpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.cpp @@ -32,6 +32,7 @@ #include "gc/shared/gcLocker.hpp" #include "gc/shared/gcTimer.hpp" #include "gc/shared/gcTrace.hpp" +#include "gc/shared/genArguments.hpp" #include "gc/shared/space.hpp" #include "gc/shared/spaceDecorator.hpp" #include "logging/log.hpp" diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp index 1440f788e18b3..66496544b9627 100644 --- a/src/hotspot/share/gc/shared/gc_globals.hpp +++ b/src/hotspot/share/gc/shared/gc_globals.hpp @@ -540,10 +540,6 @@ "Soft limit for maximum heap size (in bytes)") \ constraint(SoftMaxHeapSizeConstraintFunc,AfterMemoryInit) \ \ - product(size_t, OldSize, ScaleForWordSize(4*M), \ - "(Deprecated) Initial tenured generation size (in bytes)") \ - range(0, max_uintx) \ - \ product(size_t, NewSize, ScaleForWordSize(1*M), \ "Initial new generation size (in bytes)") \ constraint(NewSizeConstraintFunc,AfterErgo) \ diff --git a/src/hotspot/share/gc/shared/genArguments.cpp b/src/hotspot/share/gc/shared/genArguments.cpp index 3eac2e39f3830..76f9f6d40523b 100644 --- a/src/hotspot/share/gc/shared/genArguments.cpp +++ b/src/hotspot/share/gc/shared/genArguments.cpp @@ -37,6 +37,8 @@ size_t MinNewSize = 0; size_t MinOldSize = 0; size_t MaxOldSize = 0; +size_t OldSize = 0; + size_t GenAlignment = 0; size_t GenArguments::conservative_max_heap_alignment() { return (size_t)Generation::GenGrain; } @@ -152,24 +154,7 @@ void GenArguments::initialize_heap_flags_and_sizes() { vm_exit_during_initialization("Invalid young gen ratio specified"); } - if (OldSize < old_gen_size_lower_bound()) { - FLAG_SET_ERGO(OldSize, old_gen_size_lower_bound()); - } - if (!is_aligned(OldSize, GenAlignment)) { - FLAG_SET_ERGO(OldSize, align_down(OldSize, GenAlignment)); - } - - if (FLAG_IS_CMDLINE(OldSize) && FLAG_IS_DEFAULT(MaxHeapSize)) { - // NewRatio will be used later to set the young generation size so we use - // it to calculate how big the heap should be based on the requested OldSize - // and NewRatio. - assert(NewRatio > 0, "NewRatio should have been set up earlier"); - size_t calculated_heapsize = (OldSize / NewRatio) * (NewRatio + 1); - - calculated_heapsize = align_up(calculated_heapsize, HeapAlignment); - FLAG_SET_ERGO(MaxHeapSize, calculated_heapsize); - FLAG_SET_ERGO(InitialHeapSize, calculated_heapsize); - } + OldSize = old_gen_size_lower_bound(); // Adjust NewSize and OldSize or MaxHeapSize to match each other if (NewSize + OldSize > MaxHeapSize) { @@ -185,23 +170,12 @@ void GenArguments::initialize_heap_flags_and_sizes() { // HeapAlignment, and we just made sure that NewSize is aligned to // GenAlignment. In initialize_flags() we verified that HeapAlignment // is a multiple of GenAlignment. - FLAG_SET_ERGO(OldSize, MaxHeapSize - NewSize); + OldSize = MaxHeapSize - NewSize; } else { FLAG_SET_ERGO(MaxHeapSize, align_up(NewSize + OldSize, HeapAlignment)); } } - // Update NewSize, if possible, to avoid sizing the young gen too small when only - // OldSize is set on the command line. - if (FLAG_IS_CMDLINE(OldSize) && !FLAG_IS_CMDLINE(NewSize)) { - if (OldSize < InitialHeapSize) { - size_t new_size = InitialHeapSize - OldSize; - if (new_size >= MinNewSize && new_size <= MaxNewSize) { - FLAG_SET_ERGO(NewSize, new_size); - } - } - } - DEBUG_ONLY(assert_flags();) } @@ -215,12 +189,6 @@ void GenArguments::initialize_heap_flags_and_sizes() { // In the absence of explicitly set command line flags, policies // such as the use of NewRatio are used to size the generation. -// Minimum sizes of the generations may be different than -// the initial sizes. An inconsistency is permitted here -// in the total size that can be specified explicitly by -// command line specification of OldSize and NewSize and -// also a command line specification of -Xms. Issue a warning -// but allow the values to pass. void GenArguments::initialize_size_info() { GCArguments::initialize_size_info(); @@ -286,37 +254,7 @@ void GenArguments::initialize_size_info() { InitialHeapSize - initial_young_size, MinHeapSize - MinNewSize); - size_t initial_old_size = OldSize; - - // If no explicit command line flag has been set for the - // old generation size, use what is left. - if (!FLAG_IS_CMDLINE(OldSize)) { - // The user has not specified any value but the ergonomics - // may have chosen a value (which may or may not be consistent - // with the overall heap size). In either case make - // the minimum, maximum and initial sizes consistent - // with the young sizes and the overall heap sizes. - initial_old_size = clamp(InitialHeapSize - initial_young_size, MinOldSize, MaxOldSize); - // MaxOldSize and MinOldSize have already been made consistent above. - } else { - // OldSize has been explicitly set on the command line. Use it - // for the initial size but make sure the minimum allow a young - // generation to fit as well. - // If the user has explicitly set an OldSize that is inconsistent - // with other command line flags, issue a warning. - // The generation minimums and the overall heap minimum should - // be within one generation alignment. - if (initial_old_size > MaxOldSize) { - log_warning(gc, ergo)("Inconsistency between maximum heap size and maximum " - "generation sizes: using maximum heap = " SIZE_FORMAT - ", -XX:OldSize flag is being ignored", - MaxHeapSize); - initial_old_size = MaxOldSize; - } else if (initial_old_size < MinOldSize) { - log_warning(gc, ergo)("Inconsistency between initial old size and minimum old size"); - MinOldSize = initial_old_size; - } - } + size_t initial_old_size = clamp(InitialHeapSize - initial_young_size, MinOldSize, MaxOldSize);; // The initial generation sizes should match the initial heap size, // if not issue a warning and resize the generations. This behavior @@ -359,7 +297,7 @@ void GenArguments::initialize_size_info() { } if (OldSize != initial_old_size) { - FLAG_SET_ERGO(OldSize, initial_old_size); + OldSize = initial_old_size; } log_trace(gc, heap)("Minimum old " SIZE_FORMAT " Initial old " SIZE_FORMAT " Maximum old " SIZE_FORMAT, diff --git a/src/hotspot/share/gc/shared/genArguments.hpp b/src/hotspot/share/gc/shared/genArguments.hpp index a4c62ff5afe36..dfc392cac6ba6 100644 --- a/src/hotspot/share/gc/shared/genArguments.hpp +++ b/src/hotspot/share/gc/shared/genArguments.hpp @@ -33,6 +33,8 @@ extern size_t MinNewSize; extern size_t MinOldSize; extern size_t MaxOldSize; +extern size_t OldSize; + extern size_t GenAlignment; class GenArguments : public GCArguments { diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 5f89384ba661a..38f63354735f6 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -34,6 +34,7 @@ #include "compiler/compilerDefinitions.hpp" #include "gc/shared/gcArguments.hpp" #include "gc/shared/gcConfig.hpp" +#include "gc/shared/genArguments.hpp" #include "gc/shared/stringdedup/stringDedup.hpp" #include "gc/shared/tlab_globals.hpp" #include "jvm.h" @@ -502,7 +503,6 @@ static SpecialFlag const special_jvm_flags[] = { { "RequireSharedSpaces", JDK_Version::jdk(18), JDK_Version::jdk(19), JDK_Version::undefined() }, { "UseSharedSpaces", JDK_Version::jdk(18), JDK_Version::jdk(19), JDK_Version::undefined() }, { "DontYieldALot", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, - { "OldSize", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "PreserveAllAnnotations", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "UseNotificationThread", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "UseEmptySlotsInSupers", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, @@ -513,6 +513,7 @@ static SpecialFlag const special_jvm_flags[] = { { "MetaspaceReclaimPolicy", JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::undefined() }, + { "OldSize", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, #if defined(X86) { "UseRTMLocking", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "UseRTMDeopt", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java index 41788757e0c78..22eb627d39ff5 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java @@ -80,7 +80,6 @@ public void run() { printValMB("MaxHeapSize = ", getFlagValue("MaxHeapSize", flagMap)); printValMB("NewSize = ", getFlagValue("NewSize", flagMap)); printValMB("MaxNewSize = ", getFlagValue("MaxNewSize", flagMap)); - printValMB("OldSize = ", getFlagValue("OldSize", flagMap)); printValue("NewRatio = ", getFlagValue("NewRatio", flagMap)); printValue("SurvivorRatio = ", getFlagValue("SurvivorRatio", flagMap)); printValMB("MetaspaceSize = ", getFlagValue("MetaspaceSize", flagMap)); diff --git a/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp b/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp index 102ede42de63f..b38586a89753b 100644 --- a/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp +++ b/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp @@ -63,11 +63,9 @@ class TestGenCollectorPolicy { AutoSaveRestore<size_t> FLAG_GUARD(MaxNewSize); AutoSaveRestore<size_t> FLAG_GUARD(MinHeapDeltaBytes); AutoSaveRestore<size_t> FLAG_GUARD(NewSize); - AutoSaveRestore<size_t> FLAG_GUARD(OldSize); MinHeapSize = 40 * M; FLAG_SET_ERGO(InitialHeapSize, 100 * M); - FLAG_SET_ERGO(OldSize, 4 * M); FLAG_SET_ERGO(NewSize, 1 * M); FLAG_SET_ERGO(MaxNewSize, 80 * M); @@ -144,14 +142,6 @@ class TestGenCollectorPolicy { } }; - class SetOldSizeCmd : public UnaryExecutor { - public: - SetOldSizeCmd(size_t param) : UnaryExecutor(param) { } - void execute() { - FLAG_SET_CMDLINE(OldSize, param); - } - }; - class SetMaxNewSizeCmd : public BinaryExecutor { public: SetMaxNewSizeCmd(size_t param1, size_t param2) : BinaryExecutor(param1, param2) { } @@ -162,49 +152,6 @@ class TestGenCollectorPolicy { FLAG_SET_CMDLINE(MaxNewSize, new_size_value); } }; - - class CheckOldMin : public UnaryExecutor { - public: - CheckOldMin(size_t param) : UnaryExecutor(param) { } - void execute() { - SerialArguments sa; - sa.initialize_heap_sizes(); - ASSERT_LE(MinOldSize, param); - } - }; - - class CheckOldInitial : public Executor { - public: - void execute() { - size_t heap_alignment = GCArguments::compute_heap_alignment(); - - SerialArguments sa; - sa.initialize_heap_sizes(); - - size_t expected_old_initial = align_up(InitialHeapSize, heap_alignment) - - MaxNewSize; - - ASSERT_EQ(expected_old_initial, OldSize); - } - }; - - class CheckOldInitialMaxNewSize : public BinaryExecutor { - public: - CheckOldInitialMaxNewSize(size_t param1, size_t param2) : BinaryExecutor(param1, param2) { } - void execute() { - size_t heap_alignment = GCArguments::compute_heap_alignment(); - size_t new_size_value = align_up(MaxHeapSize, heap_alignment) - - param1 + param2; - - SerialArguments sa; - sa.initialize_heap_sizes(); - - size_t expected_old_initial = align_up(MaxHeapSize, heap_alignment) - - new_size_value; - - ASSERT_EQ(expected_old_initial, OldSize); - } - }; }; @@ -244,29 +191,3 @@ TEST_OTHER_VM(CollectorPolicy, young_cmd) { TestGenCollectorPolicy::CheckYoungInitial checker_large(80 * M); TestGenCollectorPolicy::TestWrapper::test(&setter_large, &checker_large); } - -// Since a flag has been set with FLAG_SET_CMDLINE it -// will be treated as it have been set on the command line for -// the rest of the VM lifetime. This is an irreversible change and -// could impact other tests so we use TEST_OTHER_VM -TEST_OTHER_VM(CollectorPolicy, old_cmd) { - // If OldSize is set on the command line, it should be used - // for both min and initial old size if less than min heap. - TestGenCollectorPolicy::SetOldSizeCmd setter(20 * M); - - TestGenCollectorPolicy::CheckOldMin checker_min(20 * M); - TestGenCollectorPolicy::TestWrapper::test(&setter, &checker_min); - - TestGenCollectorPolicy::CheckOldInitial checker_initial; - TestGenCollectorPolicy::TestWrapper::test(&setter, &checker_initial); - - // If MaxNewSize is large, the maximum OldSize will be less than - // what's requested on the command line and it should be reset - // ergonomically. - // We intentionally set MaxNewSize + OldSize > MaxHeapSize - TestGenCollectorPolicy::SetOldSizeCmd setter_old_size(30 * M); - TestGenCollectorPolicy::SetMaxNewSizeCmd setter_max_new_size(30 * M, 20 * M); - TestGenCollectorPolicy::CheckOldInitialMaxNewSize checker_large(30 * M, 20 * M); - - TestGenCollectorPolicy::TestWrapper::test(&setter_old_size, &setter_max_new_size, &checker_large); -} diff --git a/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java b/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java index fd78486166327..7194e97c76819 100644 --- a/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java +++ b/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java @@ -59,15 +59,10 @@ public static void checkMinInitialMaxHeapFlags(String gcflag) throws Exception { } public static void checkMinInitialErgonomics(String gcflag) throws Exception { - // heap sizing ergonomics use the value NewSize + OldSize as default values - // for ergonomics calculation. Retrieve these values. - long[] values = new long[2]; - getNewOldSize(gcflag, values); - // we check cases with values smaller and larger than this default value. - long newPlusOldSize = values[0] + values[1]; - long smallValue = newPlusOldSize / 2; - long largeValue = newPlusOldSize * 2; + long initialHeapSize = getInitialHeapSize(gcflag); + long smallValue = initialHeapSize / 2; + long largeValue = initialHeapSize * 2; long maxHeapSize = largeValue + (2 * 1024 * 1024); // -Xms is not set @@ -114,14 +109,13 @@ private static long align_up(long value, long alignment) { return (value + alignmentMinusOne) & ~alignmentMinusOne; } - private static void getNewOldSize(String gcflag, long[] values) throws Exception { + private static long getInitialHeapSize(String gcflag) throws Exception { OutputAnalyzer output = GCArguments.executeTestJava(gcflag, "-XX:+PrintFlagsFinal", "-version"); output.shouldHaveExitValue(0); String stdout = output.getStdout(); - values[0] = getFlagValue(" NewSize", stdout); - values[1] = getFlagValue(" OldSize", stdout); + return getFlagValue(" InitialHeapSize", stdout); } public static void checkGenMaxHeapErgo(String gcflag) throws Exception { diff --git a/test/hotspot/jtreg/gc/arguments/TestMaxNewSize.java b/test/hotspot/jtreg/gc/arguments/TestMaxNewSize.java index 3f741ab144035..d967a4f609fbb 100644 --- a/test/hotspot/jtreg/gc/arguments/TestMaxNewSize.java +++ b/test/hotspot/jtreg/gc/arguments/TestMaxNewSize.java @@ -29,7 +29,7 @@ * @summary Make sure that MaxNewSize always has a useful value after argument * processing. * @key flag-sensitive - * @requires vm.gc.Serial & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null & vm.opt.OldSize == null + * @requires vm.gc.Serial & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null * @library /test/lib * @library / * @modules java.base/jdk.internal.misc @@ -44,7 +44,7 @@ * @summary Make sure that MaxNewSize always has a useful value after argument * processing. * @key flag-sensitive - * @requires vm.gc.Parallel & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null & vm.opt.OldSize == null + * @requires vm.gc.Parallel & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null * @library /test/lib * @library / * @modules java.base/jdk.internal.misc @@ -59,7 +59,7 @@ * @summary Make sure that MaxNewSize always has a useful value after argument * processing. * @key flag-sensitive - * @requires vm.gc.G1 & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null & vm.opt.OldSize == null + * @requires vm.gc.G1 & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null * @library /test/lib * @library / * @modules java.base/jdk.internal.misc @@ -116,7 +116,6 @@ public static void main(String args[]) throws Exception { checkMaxNewSize(new String[] { gcName, "-Xmx128M" }, 128 * M); checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:NewRatio=5" }, 128 * M); checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:NewSize=32M" }, 128 * M); - checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:OldSize=96M" }, 128 * M); checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:MaxNewSize=32M" }, 32 * M); checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:NewSize=32M", "-XX:MaxNewSize=32M" }, 32 * M); checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:NewRatio=6", "-XX:MaxNewSize=32M" }, 32 * M); diff --git a/test/hotspot/jtreg/gc/g1/TestInvalidateArrayCopy.java b/test/hotspot/jtreg/gc/g1/TestInvalidateArrayCopy.java index 2e5b3c0a3636f..84140ae1679de 100644 --- a/test/hotspot/jtreg/gc/g1/TestInvalidateArrayCopy.java +++ b/test/hotspot/jtreg/gc/g1/TestInvalidateArrayCopy.java @@ -29,7 +29,7 @@ * @summary Check that benign (0-sized) out of heap bounds card table invalidations do not assert. * @requires vm.gc.G1 * @requires vm.debug - * @run main/othervm -XX:NewSize=1M -Xlog:gc -XX:MaxNewSize=1m -XX:-UseTLAB -XX:OldSize=63M -XX:MaxHeapSize=64M gc.g1.TestInvalidateArrayCopy + * @run main/othervm -XX:NewSize=1M -Xlog:gc -XX:MaxNewSize=1m -XX:-UseTLAB -XX:MaxHeapSize=64M gc.g1.TestInvalidateArrayCopy */ // The test allocates zero-sized arrays of j.l.O and tries to arraycopy random data into it so diff --git a/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java b/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java index 0ae28ab9d5592..b9192c45fbfd6 100644 --- a/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java +++ b/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java @@ -40,7 +40,6 @@ public class PLABUtils { private final static String[] GC_TUNE_OPTIONS = { "-XX:+UseG1GC", "-XX:G1HeapRegionSize=1m", - "-XX:OldSize=64m", "-XX:-UseAdaptiveSizePolicy", "-XX:MaxTenuringThreshold=1", "-XX:-UseTLAB", diff --git a/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java index 12bced849d916..033b74f7eb133 100644 --- a/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java +++ b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java @@ -240,7 +240,6 @@ public static void main(String[] args) throws Exception { excludeTestMaxRange("MaxHeapSize"); excludeTestMaxRange("MaxRAM"); excludeTestMaxRange("NewSize"); - excludeTestMaxRange("OldSize"); excludeTestMaxRange("ParallelGCThreads"); excludeTestMaxRange("TLABSize"); diff --git a/test/hotspot/jtreg/vmTestbase/gc/huge/quicklook/largeheap/MemOptions/MemOptionsTest.java b/test/hotspot/jtreg/vmTestbase/gc/huge/quicklook/largeheap/MemOptions/MemOptionsTest.java index 67e629fddcdcf..4547bcdbc304d 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/huge/quicklook/largeheap/MemOptions/MemOptionsTest.java +++ b/test/hotspot/jtreg/vmTestbase/gc/huge/quicklook/largeheap/MemOptions/MemOptionsTest.java @@ -79,10 +79,6 @@ public void test() throws IOException { // positive("Initial young generation size at 32-bit range", "-Xmx5G", "-XX:NewSize=4G"); // positive("Initial young generation size outside 32-bit range", "-Xmx5G", "-XX:NewSize=4G"); - // positive("Initial old generation size within 32-bit range", "-Xmx3G", "-XX:OldSize=2G"); - // positive("Initial old generation size at 32-bit range", "-Xmx5G", "-XX:OldSize=4G"); - // positive("Initial old generation size outside 32-bit range", "-Xmx5G", "-XX:OldSize=4G"); - if (!failed.isEmpty()) { throw new AssertionError(String.format("%d cases failed : %s", failed.size(), failed)); } diff --git a/test/jdk/jdk/jfr/event/runtime/TestSizeTFlags.java b/test/jdk/jdk/jfr/event/runtime/TestSizeTFlags.java index c2ad220d78d60..ae21537840f43 100644 --- a/test/jdk/jdk/jfr/event/runtime/TestSizeTFlags.java +++ b/test/jdk/jdk/jfr/event/runtime/TestSizeTFlags.java @@ -40,13 +40,12 @@ * @key jfr * @summary Test checks that flags of type size_t are being sent to the jfr * @library /test/lib - * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:-UseFastUnorderedTimeStamps -XX:+UseG1GC -XX:+UseTLAB -XX:MinTLABSize=3k -XX:OldSize=30m -XX:YoungPLABSize=3k -XX:MaxDirectMemorySize=5M jdk.jfr.event.runtime.TestSizeTFlags + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:-UseFastUnorderedTimeStamps -XX:+UseG1GC -XX:+UseTLAB -XX:MinTLABSize=3k -XX:YoungPLABSize=3k -XX:MaxDirectMemorySize=5M jdk.jfr.event.runtime.TestSizeTFlags */ public class TestSizeTFlags { private static final String EVENT_NAME = EventNames.UnsignedLongFlag; - private static final int NUMBER_OF_FLAGS_TO_CHECK = 4; + private static final int NUMBER_OF_FLAGS_TO_CHECK = 3; private static final long MIN_TLAB_SIZE_FLAG_VALUE = 3*1024L; - private static final long OLD_SIZE_FLAG_VALUE = 30*1024*1024L; private static final long YOUNG_PLAB_SIZE_FLAG_VALUE = 3*1024L; private static final long MAX_DIRECT_MEMORY_SIZE_FLAG_VALUE = 5*1024*1024L; @@ -71,16 +70,12 @@ public static void main(String[] args) throws Exception { flagsFoundWithExpectedValue[0] = MIN_TLAB_SIZE_FLAG_VALUE == value; continue; } - case "OldSize": { - flagsFoundWithExpectedValue[1] = OLD_SIZE_FLAG_VALUE == value; - continue; - } case "YoungPLABSize": { - flagsFoundWithExpectedValue[2] = YOUNG_PLAB_SIZE_FLAG_VALUE == value; + flagsFoundWithExpectedValue[1] = YOUNG_PLAB_SIZE_FLAG_VALUE == value; continue; } case "MaxDirectMemorySize": { - flagsFoundWithExpectedValue[3] = MAX_DIRECT_MEMORY_SIZE_FLAG_VALUE == value; + flagsFoundWithExpectedValue[2] = MAX_DIRECT_MEMORY_SIZE_FLAG_VALUE == value; continue; } default: { diff --git a/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java b/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java index 53330c0861808..89a5801cff772 100644 --- a/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java +++ b/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java @@ -54,7 +54,6 @@ public class JMapHeapConfigTest { "MaxHeapSize", "NewSize", "MaxNewSize", - "OldSize", "NewRatio", "SurvivorRatio", "MetaspaceSize", From 801bf15f02ca47c3547eb677079d7d2f3af1de8c Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Mon, 17 Jun 2024 17:27:01 +0000 Subject: [PATCH 086/471] 8332105: Exploded JDK does not include CDS Reviewed-by: dholmes, iklam --- src/hotspot/share/prims/whitebox.cpp | 6 +++++- .../CompressedCPUSpecificClassSpaceReservation.java | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index a45be186aa486..821444ea38985 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -29,6 +29,7 @@ #include "cds/filemap.hpp" #include "cds/heapShared.hpp" #include "cds/metaspaceShared.hpp" +#include "classfile/classLoader.hpp" #include "classfile/classLoaderDataGraph.hpp" #include "classfile/classLoaderStats.hpp" #include "classfile/classPrinter.hpp" @@ -2115,7 +2116,10 @@ WB_END WB_ENTRY(jboolean, WB_IsCDSIncluded(JNIEnv* env)) #if INCLUDE_CDS - return true; + // An exploded build inhibits use of CDS. Therefore, for the + // purpose of testing, the JVM can be treated as not having CDS + // built in at all. + return ClassLoader::has_jrt_entry(); #else return false; #endif // INCLUDE_CDS diff --git a/test/hotspot/jtreg/runtime/CompressedOops/CompressedCPUSpecificClassSpaceReservation.java b/test/hotspot/jtreg/runtime/CompressedOops/CompressedCPUSpecificClassSpaceReservation.java index 8a25b1eff88a5..f1b4c7143b432 100644 --- a/test/hotspot/jtreg/runtime/CompressedOops/CompressedCPUSpecificClassSpaceReservation.java +++ b/test/hotspot/jtreg/runtime/CompressedOops/CompressedCPUSpecificClassSpaceReservation.java @@ -26,6 +26,7 @@ * @summary Test the various CPU-specific reservation schemes * @requires vm.bits == 64 & !vm.graal.enabled & vm.debug == true * @requires vm.flagless + * @requires vm.cds * @requires (os.family != "windows") & (os.family != "aix") * @library /test/lib * @modules java.base/jdk.internal.misc From ba5a4670b8ad86fefb41a939752754bf36aac9dc Mon Sep 17 00:00:00 2001 From: Phil Race <prr@openjdk.org> Date: Mon, 17 Jun 2024 19:37:32 +0000 Subject: [PATCH 087/471] 8332854: Unable to build openjdk with --with-harfbuzz=system Reviewed-by: jwaters, erikj, jdv, ihse --- make/modules/java.desktop/lib/ClientLibraries.gmk | 1 + 1 file changed, 1 insertion(+) diff --git a/make/modules/java.desktop/lib/ClientLibraries.gmk b/make/modules/java.desktop/lib/ClientLibraries.gmk index 6f3616608ccea..f023969536987 100644 --- a/make/modules/java.desktop/lib/ClientLibraries.gmk +++ b/make/modules/java.desktop/lib/ClientLibraries.gmk @@ -281,6 +281,7 @@ endif ifeq ($(USE_EXTERNAL_HARFBUZZ), true) LIBFONTMANAGER_EXTRA_SRC = LIBFONTMANAGER_LIBS += $(HARFBUZZ_LIBS) + LIBFONTMANAGER_CFLAGS += $(HARFBUZZ_CFLAGS) else LIBFONTMANAGER_EXTRA_SRC = libharfbuzz From e95f092862307c248bbd93e7026cbd92053fb4c9 Mon Sep 17 00:00:00 2001 From: Gui Cao <gcao@openjdk.org> Date: Tue, 18 Jun 2024 05:24:33 +0000 Subject: [PATCH 088/471] 8333964: RISC-V: C2: Check "requires_strict_order" flag for floating-point add reduction Reviewed-by: fyang --- src/hotspot/cpu/riscv/riscv_v.ad | 50 +++++++++++++++++-- .../superword/TestVectorFPReduction.java | 4 +- .../vectorapi/TestVectorAddMulReduction.java | 14 +++--- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/src/hotspot/cpu/riscv/riscv_v.ad b/src/hotspot/cpu/riscv/riscv_v.ad index 4a71da9f20c65..841e8cb260cb8 100644 --- a/src/hotspot/cpu/riscv/riscv_v.ad +++ b/src/hotspot/cpu/riscv/riscv_v.ad @@ -2007,11 +2007,20 @@ instruct reduce_addL(iRegLNoSp dst, iRegL src1, vReg src2, vReg tmp) %{ ins_pipe(pipe_slow); %} -instruct reduce_addF(fRegF dst, fRegF src1, vReg src2, vReg tmp) %{ +// Distinguish two cases based on requires_strict_order +// 1. Non strictly-ordered AddReductionVF/D. For example, AddReductionVF/D +// generated by Vector API. It is more beneficial performance-wise to do +// an unordered FP reduction sum (vfredusum.vs). +// 2. Strictly-ordered AddReductionVF/D. For example, AddReductionVF/D +// generated by auto-vectorization. Must do an ordered FP reduction sum +// (vfredosum.vs). + +instruct reduce_addF_ordered(fRegF dst, fRegF src1, vReg src2, vReg tmp) %{ + predicate(n->as_Reduction()->requires_strict_order()); match(Set dst (AddReductionVF src1 src2)); effect(TEMP tmp); ins_cost(VEC_COST); - format %{ "reduce_addF $dst, $src1, $src2\t# KILL $tmp" %} + format %{ "reduce_addF_ordered $dst, $src1, $src2\t# KILL $tmp" %} ins_encode %{ __ vsetvli_helper(T_FLOAT, Matcher::vector_length(this, $src2)); __ vfmv_s_f(as_VectorRegister($tmp$$reg), $src1$$FloatRegister); @@ -2022,11 +2031,28 @@ instruct reduce_addF(fRegF dst, fRegF src1, vReg src2, vReg tmp) %{ ins_pipe(pipe_slow); %} -instruct reduce_addD(fRegD dst, fRegD src1, vReg src2, vReg tmp) %{ +instruct reduce_addF_unordered(fRegF dst, fRegF src1, vReg src2, vReg tmp) %{ + predicate(!n->as_Reduction()->requires_strict_order()); + match(Set dst (AddReductionVF src1 src2)); + effect(TEMP tmp); + ins_cost(VEC_COST); + format %{ "reduce_addF_unordered $dst, $src1, $src2\t# KILL $tmp" %} + ins_encode %{ + __ vsetvli_helper(T_FLOAT, Matcher::vector_length(this, $src2)); + __ vfmv_s_f(as_VectorRegister($tmp$$reg), $src1$$FloatRegister); + __ vfredusum_vs(as_VectorRegister($tmp$$reg), as_VectorRegister($src2$$reg), + as_VectorRegister($tmp$$reg)); + __ vfmv_f_s($dst$$FloatRegister, as_VectorRegister($tmp$$reg)); + %} + ins_pipe(pipe_slow); +%} + +instruct reduce_addD_ordered(fRegD dst, fRegD src1, vReg src2, vReg tmp) %{ + predicate(n->as_Reduction()->requires_strict_order()); match(Set dst (AddReductionVD src1 src2)); effect(TEMP tmp); ins_cost(VEC_COST); - format %{ "reduce_addD $dst, $src1, $src2\t# KILL $tmp" %} + format %{ "reduce_addD_ordered $dst, $src1, $src2\t# KILL $tmp" %} ins_encode %{ __ vsetvli_helper(T_DOUBLE, Matcher::vector_length(this, $src2)); __ vfmv_s_f(as_VectorRegister($tmp$$reg), $src1$$FloatRegister); @@ -2037,6 +2063,22 @@ instruct reduce_addD(fRegD dst, fRegD src1, vReg src2, vReg tmp) %{ ins_pipe(pipe_slow); %} +instruct reduce_addD_unordered(fRegD dst, fRegD src1, vReg src2, vReg tmp) %{ + predicate(!n->as_Reduction()->requires_strict_order()); + match(Set dst (AddReductionVD src1 src2)); + effect(TEMP tmp); + ins_cost(VEC_COST); + format %{ "reduce_addD_unordered $dst, $src1, $src2\t# KILL $tmp" %} + ins_encode %{ + __ vsetvli_helper(T_DOUBLE, Matcher::vector_length(this, $src2)); + __ vfmv_s_f(as_VectorRegister($tmp$$reg), $src1$$FloatRegister); + __ vfredusum_vs(as_VectorRegister($tmp$$reg), as_VectorRegister($src2$$reg), + as_VectorRegister($tmp$$reg)); + __ vfmv_f_s($dst$$FloatRegister, as_VectorRegister($tmp$$reg)); + %} + ins_pipe(pipe_slow); +%} + // vector add reduction - predicated instruct reduce_addI_masked(iRegINoSp dst, iRegIorL2I src1, vReg src2, vRegMask_V0 v0, vReg tmp) %{ diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java index 327e6e5e12de0..b328d4135ecfe 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java @@ -54,7 +54,7 @@ public static void main(String[] args) { applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"}) @IR(counts = {"requires_strict_order", ">=1", IRNode.ADD_REDUCTION_VF, ">=1"}, failOn = {"no_strict_order"}, - applyIfCPUFeatureOr = {"sve", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"sve", "true", "sse2", "true", "rvv", "true"}, phase = CompilePhase.PRINT_IDEAL) private static void testAddReductionVF() { float result = 1; @@ -69,7 +69,7 @@ private static void testAddReductionVF() { applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"}) @IR(counts = {"requires_strict_order", ">=1", IRNode.ADD_REDUCTION_VD, ">=1"}, failOn = {"no_strict_order"}, - applyIfCPUFeatureOr = {"sve", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"sve", "true", "sse2", "true", "rvv", "true"}, phase = CompilePhase.PRINT_IDEAL) private static void testAddReductionVD() { double result = 1; diff --git a/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java b/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java index 549d9aa5d4946..38a2753a7eda4 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java +++ b/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java @@ -78,7 +78,7 @@ public static void testFloatAddKernel(VectorSpecies SPECIES, float[] f) { @Test @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, failOn = {"requires_strict_order"}, - applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, applyIf = {"MaxVectorSize", ">=8"}, phase = CompilePhase.PRINT_IDEAL) public static void testFloatAdd_64() { @@ -88,7 +88,7 @@ public static void testFloatAdd_64() { @Test @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, failOn = {"requires_strict_order"}, - applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, applyIf = {"MaxVectorSize", ">=16"}, phase = CompilePhase.PRINT_IDEAL) public static void testFloatAdd_128() { @@ -98,7 +98,7 @@ public static void testFloatAdd_128() { @Test @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, failOn = {"requires_strict_order"}, - applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, applyIf = {"MaxVectorSize", ">=32"}, phase = CompilePhase.PRINT_IDEAL) public static void testFloatAdd_256() { @@ -108,7 +108,7 @@ public static void testFloatAdd_256() { @Test @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"}, failOn = {"requires_strict_order"}, - applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, applyIf = {"MaxVectorSize", ">=64"}, phase = CompilePhase.PRINT_IDEAL) public static void testFloatAdd_512() { @@ -127,7 +127,7 @@ public static void testDoubleAddKernel(VectorSpecies SPECIES, double[] d) { @Test @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"}, failOn = {"requires_strict_order"}, - applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, applyIf = {"MaxVectorSize", ">=16"}, phase = CompilePhase.PRINT_IDEAL) public static void testDoubleAdd_128() { @@ -137,7 +137,7 @@ public static void testDoubleAdd_128() { @Test @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"}, failOn = {"requires_strict_order"}, - applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, applyIf = {"MaxVectorSize", ">=32"}, phase = CompilePhase.PRINT_IDEAL) public static void testDoubleAdd_256() { @@ -147,7 +147,7 @@ public static void testDoubleAdd_256() { @Test @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"}, failOn = {"requires_strict_order"}, - applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"}, + applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"}, applyIf = {"MaxVectorSize", ">=64"}, phase = CompilePhase.PRINT_IDEAL) public static void testDoubleAdd_512() { From 0199fee431e0dccdd570b38595ea29c760dbed44 Mon Sep 17 00:00:00 2001 From: Martin Doerr <mdoerr@openjdk.org> Date: Tue, 18 Jun 2024 06:48:26 +0000 Subject: [PATCH 089/471] 8333639: ubsan: cppVtables.cpp:81:55: runtime error: index 14 out of bounds for type 'long int [1]' Reviewed-by: aboldtch, mbaesken, kbarrett --- src/hotspot/share/cds/cppVtables.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/hotspot/share/cds/cppVtables.cpp b/src/hotspot/share/cds/cppVtables.cpp index f17d94a82fdb5..6dd5e65ae4343 100644 --- a/src/hotspot/share/cds/cppVtables.cpp +++ b/src/hotspot/share/cds/cppVtables.cpp @@ -66,19 +66,17 @@ class CppVtableInfo { intptr_t _vtable_size; - intptr_t _cloned_vtable[1]; + intptr_t _cloned_vtable[1]; // Pseudo flexible array member. + static size_t cloned_vtable_offset() { return offset_of(CppVtableInfo, _cloned_vtable); } public: - static int num_slots(int vtable_size) { - return 1 + vtable_size; // Need to add the space occupied by _vtable_size; - } int vtable_size() { return int(uintx(_vtable_size)); } void set_vtable_size(int n) { _vtable_size = intptr_t(n); } - intptr_t* cloned_vtable() { return &_cloned_vtable[0]; } - void zero() { memset(_cloned_vtable, 0, sizeof(intptr_t) * vtable_size()); } + // Using _cloned_vtable[i] for i > 0 causes undefined behavior. We use address calculation instead. + intptr_t* cloned_vtable() { return (intptr_t*)((char*)this + cloned_vtable_offset()); } + void zero() { memset(cloned_vtable(), 0, sizeof(intptr_t) * vtable_size()); } // Returns the address of the next CppVtableInfo that can be placed immediately after this CppVtableInfo static size_t byte_size(int vtable_size) { - CppVtableInfo i; - return pointer_delta(&i._cloned_vtable[vtable_size], &i, sizeof(u1)); + return cloned_vtable_offset() + (sizeof(intptr_t) * vtable_size); } }; From 99fefec092f49cd759f93aa75e008cfa06d2a183 Mon Sep 17 00:00:00 2001 From: Christian Stein <cstein@openjdk.org> Date: Tue, 18 Jun 2024 07:25:17 +0000 Subject: [PATCH 090/471] 8331431: Update to use jtreg 7.4 Reviewed-by: ihse, erikj, jpai --- make/autoconf/lib-tests.m4 | 4 ++-- make/conf/github-actions.conf | 2 +- make/conf/jib-profiles.js | 4 ++-- test/hotspot/jtreg/TEST.ROOT | 4 ++-- test/jaxp/TEST.ROOT | 2 +- test/jdk/TEST.ROOT | 2 +- test/langtools/TEST.ROOT | 2 +- test/lib-test/TEST.ROOT | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/make/autoconf/lib-tests.m4 b/make/autoconf/lib-tests.m4 index be099e50a0471..955b8c9ba830a 100644 --- a/make/autoconf/lib-tests.m4 +++ b/make/autoconf/lib-tests.m4 @@ -1,5 +1,5 @@ # -# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ ################################################################################ # Minimum supported versions -JTREG_MINIMUM_VERSION=7.3.1 +JTREG_MINIMUM_VERSION=7.4 GTEST_MINIMUM_VERSION=1.14.0 ############################################################################### diff --git a/make/conf/github-actions.conf b/make/conf/github-actions.conf index f6b00bd2a13ba..deb5e36f60572 100644 --- a/make/conf/github-actions.conf +++ b/make/conf/github-actions.conf @@ -26,7 +26,7 @@ # Versions and download locations for dependencies used by GitHub Actions (GHA) GTEST_VERSION=1.14.0 -JTREG_VERSION=7.3.1+1 +JTREG_VERSION=7.4+1 LINUX_X64_BOOT_JDK_EXT=tar.gz LINUX_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk22/830ec9fcccef480bb3e73fb7ecafe059/36/GPL/openjdk-22_linux-x64_bin.tar.gz diff --git a/make/conf/jib-profiles.js b/make/conf/jib-profiles.js index b6f091398d5c9..30c45d4cde161 100644 --- a/make/conf/jib-profiles.js +++ b/make/conf/jib-profiles.js @@ -1184,9 +1184,9 @@ var getJibProfilesDependencies = function (input, common) { jtreg: { server: "jpg", product: "jtreg", - version: "7.3.1", + version: "7.4", build_number: "1", - file: "bundles/jtreg-7.3.1+1.zip", + file: "bundles/jtreg-7.4+1.zip", environment_name: "JT_HOME", environment_path: input.get("jtreg", "home_path") + "/bin", configure_args: "--with-jtreg=" + input.get("jtreg", "home_path"), diff --git a/test/hotspot/jtreg/TEST.ROOT b/test/hotspot/jtreg/TEST.ROOT index 4c9a28a3076bf..5f4c52186a7ef 100644 --- a/test/hotspot/jtreg/TEST.ROOT +++ b/test/hotspot/jtreg/TEST.ROOT @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -90,7 +90,7 @@ requires.properties= \ jdk.containerized # Minimum jtreg version -requiredVersion=7.3.1+1 +requiredVersion=7.4+1 # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../../ notation to reach them diff --git a/test/jaxp/TEST.ROOT b/test/jaxp/TEST.ROOT index a44ad3a7c0151..8098695b80eca 100644 --- a/test/jaxp/TEST.ROOT +++ b/test/jaxp/TEST.ROOT @@ -23,7 +23,7 @@ modules=java.xml groups=TEST.groups # Minimum jtreg version -requiredVersion=7.3.1+1 +requiredVersion=7.4+1 # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../ notation to reach them diff --git a/test/jdk/TEST.ROOT b/test/jdk/TEST.ROOT index bfa99c72b6646..67eceaa5a3ef5 100644 --- a/test/jdk/TEST.ROOT +++ b/test/jdk/TEST.ROOT @@ -106,7 +106,7 @@ requires.properties= \ jdk.foreign.linker # Minimum jtreg version -requiredVersion=7.3.1+1 +requiredVersion=7.4+1 # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../ notation to reach them diff --git a/test/langtools/TEST.ROOT b/test/langtools/TEST.ROOT index da884dee17064..11daad5244f31 100644 --- a/test/langtools/TEST.ROOT +++ b/test/langtools/TEST.ROOT @@ -15,7 +15,7 @@ keys=intermittent randomness needs-src needs-src-jdk_javadoc groups=TEST.groups # Minimum jtreg version -requiredVersion=7.3.1+1 +requiredVersion=7.4+1 # Use new module options useNewOptions=true diff --git a/test/lib-test/TEST.ROOT b/test/lib-test/TEST.ROOT index 9b91a0dfcc155..27576a2d04019 100644 --- a/test/lib-test/TEST.ROOT +++ b/test/lib-test/TEST.ROOT @@ -1,5 +1,5 @@ # -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ keys=randomness # Minimum jtreg version -requiredVersion=7.3.1+1 +requiredVersion=7.4+1 # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../ notation to reach them From 0665195e59889c3f8dc5ade6521d6ca2eb4ca8b4 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Tue, 18 Jun 2024 08:27:26 +0000 Subject: [PATCH 091/471] 8334293: G1: Refactor G1ConcurrentMark::update_top_at_rebuild_start Reviewed-by: tschatzl, iwalulya --- src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp | 9 +++------ src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp | 8 -------- src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp | 3 --- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp index 9f165cf1d22a0..7b9be48d9b5fb 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp @@ -214,17 +214,14 @@ inline HeapWord* G1ConcurrentMark::top_at_rebuild_start(G1HeapRegion* r) const { } inline void G1ConcurrentMark::update_top_at_rebuild_start(G1HeapRegion* r) { + assert(r->is_old() || r->is_humongous(), "precondition"); + uint const region = r->hrm_index(); assert(region < _g1h->max_reserved_regions(), "Tried to access TARS for region %u out of bounds", region); assert(_top_at_rebuild_starts[region] == nullptr, "TARS for region %u has already been set to " PTR_FORMAT " should be null", region, p2i(_top_at_rebuild_starts[region])); - G1RemSetTrackingPolicy* tracker = _g1h->policy()->remset_tracker(); - if (tracker->needs_scan_for_rebuild(r)) { - _top_at_rebuild_starts[region] = r->top(); - } else { - // Leave TARS at null. - } + _top_at_rebuild_starts[region] = r->top(); } inline void G1CMTask::update_liveness(oop const obj, const size_t obj_size) { diff --git a/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp b/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp index 6a97deacfab54..21b188c00c245 100644 --- a/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp +++ b/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp @@ -30,14 +30,6 @@ #include "gc/g1/g1RemSetTrackingPolicy.hpp" #include "runtime/safepoint.hpp" -bool G1RemSetTrackingPolicy::needs_scan_for_rebuild(G1HeapRegion* r) const { - // All non-free and non-young regions need to be scanned for references; - // At every gc we gather references to other regions in young. - // Free regions trivially do not need scanning because they do not contain live - // objects. - return !(r->is_young() || r->is_free()); -} - void G1RemSetTrackingPolicy::update_at_allocate(G1HeapRegion* r) { assert(r->is_young() || r->is_humongous() || r->is_old(), "Region %u with unexpected heap region type %s", r->hrm_index(), r->get_type_str()); diff --git a/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp b/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp index 7560b7260801a..a89c24e6f4e96 100644 --- a/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp +++ b/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp @@ -34,9 +34,6 @@ // set is complete. class G1RemSetTrackingPolicy : public CHeapObj<mtGC> { public: - // Do we need to scan the given region to get all outgoing references for remembered - // set rebuild? - bool needs_scan_for_rebuild(G1HeapRegion* r) const; // Update remembered set tracking state at allocation of the region. May be // called at any time. The caller makes sure that the changes to the remembered // set state are visible to other threads. From b42fe86e817ec6975c869f46922797f546734ee0 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Tue, 18 Jun 2024 08:33:02 +0000 Subject: [PATCH 092/471] 8334097: Parallel: Obsolete HeapFirstMaximumCompactionCount Reviewed-by: tschatzl, dholmes --- src/hotspot/share/gc/parallel/parallel_globals.hpp | 4 ---- src/hotspot/share/gc/parallel/psParallelCompact.cpp | 3 +-- src/hotspot/share/runtime/arguments.cpp | 2 ++ 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/hotspot/share/gc/parallel/parallel_globals.hpp b/src/hotspot/share/gc/parallel/parallel_globals.hpp index 291dd5d73c65b..e3b9660b06911 100644 --- a/src/hotspot/share/gc/parallel/parallel_globals.hpp +++ b/src/hotspot/share/gc/parallel/parallel_globals.hpp @@ -36,10 +36,6 @@ "any dead space)") \ range(0, max_uintx) \ \ - product(uintx, HeapFirstMaximumCompactionCount, 3, \ - "The collection count for the first maximum compaction") \ - range(0, max_uintx) \ - \ product(bool, UseMaximumCompactionOnSystemGC, true, \ "Use maximum compaction in the Parallel Old garbage collector " \ "for a system GC") \ diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index e0d174dcc6ace..6c08503438423 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -837,8 +837,7 @@ bool PSParallelCompact::reassess_maximum_compaction(bool maximum_compaction, const uint total_invocations = ParallelScavengeHeap::heap()->total_full_collections(); assert(total_invocations >= _maximum_compaction_gc_num, "sanity"); const size_t gcs_since_max = total_invocations - _maximum_compaction_gc_num; - const bool is_interval_ended = gcs_since_max > HeapMaximumCompactionInterval - || total_invocations == HeapFirstMaximumCompactionCount; + const bool is_interval_ended = gcs_since_max > HeapMaximumCompactionInterval; // If all regions in old-gen are full const bool is_region_full = diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 38f63354735f6..a56e1fcb9988a 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -519,6 +519,8 @@ static SpecialFlag const special_jvm_flags[] = { { "UseRTMDeopt", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "RTMRetryCount", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, #endif // X86 + + { "HeapFirstMaximumCompactionCount", JDK_Version::undefined(), JDK_Version::jdk(24), JDK_Version::jdk(25) }, #ifdef ASSERT { "DummyObsoleteTestFlag", JDK_Version::undefined(), JDK_Version::jdk(18), JDK_Version::undefined() }, #endif From d4c13737171b7ab7a8a29a69fa9965f8363c5aee Mon Sep 17 00:00:00 2001 From: Archie Cobbs <acobbs@openjdk.org> Date: Tue, 18 Jun 2024 08:42:44 +0000 Subject: [PATCH 093/471] 8334043: VerifyError when inner class is accessed in prologue Reviewed-by: mcimadamore --- .../classes/com/sun/tools/javac/comp/Resolve.java | 15 ++++++++++++++- .../tools/javac/SuperInit/EarlyAssignments.java | 11 +++++++++++ .../tools/javac/SuperInit/EarlyAssignments.out | 3 ++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index ac8374a9a5553..3dcac0b26461f 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -3861,7 +3861,20 @@ private boolean isAllowedEarlyReference(Env<AttrContext> env, VarSymbol v) { // Get the symbol's qualifier, if any JCExpression lhs = TreeInfo.skipParens(assign.lhs); - JCExpression base = lhs instanceof JCFieldAccess select ? select.selected : null; + JCExpression base; + switch (lhs.getTag()) { + case IDENT: + base = null; + break; + case SELECT: + JCFieldAccess select = (JCFieldAccess)lhs; + base = select.selected; + if (!TreeInfo.isExplicitThisReference(types, (ClassType)env.enclClass.type, base)) + return false; + break; + default: + return false; + } // If an early reference, the field must not be declared in a superclass if (isEarlyReference(env, base, v) && v.owner != env.enclClass.sym) diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignments.java b/test/langtools/tools/javac/SuperInit/EarlyAssignments.java index 89a13ccf0ffb5..c3cad5d7016ca 100644 --- a/test/langtools/tools/javac/SuperInit/EarlyAssignments.java +++ b/test/langtools/tools/javac/SuperInit/EarlyAssignments.java @@ -158,4 +158,15 @@ public Inner7() { super(); } } + + public static class Inner8 { + class Inner8a { + int x; + } + + public Inner8() { + this.new Inner8a().x = 1; // FAIL - illegal early access + super(); + } + } } diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignments.out b/test/langtools/tools/javac/SuperInit/EarlyAssignments.out index 81b4f20b50575..38182c2d3126a 100644 --- a/test/langtools/tools/javac/SuperInit/EarlyAssignments.out +++ b/test/langtools/tools/javac/SuperInit/EarlyAssignments.out @@ -23,6 +23,7 @@ EarlyAssignments.java:134:17: compiler.err.cant.ref.before.ctor.called: super EarlyAssignments.java:139:23: compiler.err.cant.ref.before.ctor.called: this EarlyAssignments.java:148:13: compiler.err.cant.assign.initialized.before.ctor.called: x EarlyAssignments.java:157:13: compiler.err.cant.assign.val.to.var: final, x +EarlyAssignments.java:168:13: compiler.err.cant.ref.before.ctor.called: this - compiler.note.preview.filename: EarlyAssignments.java, DEFAULT - compiler.note.preview.recompile -25 errors +26 errors From 614b99a8f8360dc0a6a018f06fb336c6883f0f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Casta=C3=B1eda=20Lozano?= <rcastanedalo@openjdk.org> Date: Tue, 18 Jun 2024 09:48:31 +0000 Subject: [PATCH 094/471] 8334442: Temporarily disable return type assertion to reduce noise in testing Reviewed-by: thartmann, chagedorn --- src/hotspot/share/opto/parse1.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/hotspot/share/opto/parse1.cpp b/src/hotspot/share/opto/parse1.cpp index 4dc3ac3704231..3989020451eb5 100644 --- a/src/hotspot/share/opto/parse1.cpp +++ b/src/hotspot/share/opto/parse1.cpp @@ -1057,16 +1057,6 @@ void Parse::do_exits() { // loading. It could also be due to an error, so mark this method as not compilable because // otherwise this could lead to an infinite compile loop. // In any case, this code path is rarely (and never in my testing) reached. -#ifdef ASSERT - tty->print_cr("# Can't determine return type."); - tty->print_cr("# exit control"); - _exits.control()->dump(2); - tty->print_cr("# ret phi type"); - _gvn.type(ret_phi)->dump(); - tty->print_cr("# ret phi"); - ret_phi->dump(2); -#endif // ASSERT - assert(false, "Can't determine return type."); C->record_method_not_compilable("Can't determine return type."); return; } From 472b935b442f7f925b665c7de91eda77f3dcbe8b Mon Sep 17 00:00:00 2001 From: SendaoYan <syan@openjdk.org> Date: Tue, 18 Jun 2024 10:24:43 +0000 Subject: [PATCH 095/471] 8334332: TestIOException.java fails if run by root Reviewed-by: prappo --- .../testIOException/TestIOException.java | 60 ++++++------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/test/langtools/jdk/javadoc/doclet/testIOException/TestIOException.java b/test/langtools/jdk/javadoc/doclet/testIOException/TestIOException.java index 9127cdf86bbf4..5dd81b62d336f 100644 --- a/test/langtools/jdk/javadoc/doclet/testIOException/TestIOException.java +++ b/test/langtools/jdk/javadoc/doclet/testIOException/TestIOException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,9 +23,9 @@ /* * @test - * @bug 8164130 + * @bug 8164130 8334332 * @summary test IOException handling - * @library ../../lib + * @library ../../lib /test/lib * @modules jdk.javadoc/jdk.javadoc.internal.tool * @build javadoc.tester.* * @run main TestIOException @@ -39,6 +39,7 @@ import java.util.Map; import javadoc.tester.JavadocTester; +import jtreg.SkippedException; /** * Tests IO Exception handling. @@ -61,16 +62,13 @@ public static void main(String... args) throws Exception { public void testReadOnlyDirectory() { File outDir = new File("out1"); if (!outDir.mkdir()) { - throw error(outDir, "Cannot create directory"); + throw skip(outDir, "Cannot create directory"); } if (!outDir.setReadOnly()) { - if (skip(outDir)) { - return; - } - throw error(outDir, "could not set directory read-only"); + throw skip(outDir, "could not set directory read-only"); } if (outDir.canWrite()) { - throw error(outDir, "directory is writable"); + throw skip(outDir, "directory is writable"); } try { @@ -93,15 +91,15 @@ public void testReadOnlyDirectory() { public void testReadOnlyFile() throws Exception { File outDir = new File("out2"); if (!outDir.mkdir()) { - throw error(outDir, "Cannot create directory"); + throw skip(outDir, "Cannot create directory"); } File index = new File(outDir, "index.html"); try (FileWriter fw = new FileWriter(index)) { } if (!index.setReadOnly()) { - throw error(index, "could not set index read-only"); + throw skip(index, "could not set index read-only"); } if (index.canWrite()) { - throw error(index, "index is writable"); + throw skip(index, "index is writable"); } try { @@ -139,16 +137,13 @@ public void testReadOnlySubdirectory() throws Exception { File outDir = new File("out3"); File pkgOutDir = new File(outDir, "p"); if (!pkgOutDir.mkdirs()) { - throw error(pkgOutDir, "Cannot create directory"); + throw skip(pkgOutDir, "Cannot create directory"); } if (!pkgOutDir.setReadOnly()) { - if (skip(pkgOutDir)) { - return; - } - throw error(pkgOutDir, "could not set directory read-only"); + throw skip(pkgOutDir, "could not set directory read-only"); } if (pkgOutDir.canWrite()) { - throw error(pkgOutDir, "directory is writable"); + throw skip(pkgOutDir, "directory is writable"); } // run javadoc and check results @@ -192,16 +187,13 @@ public void testReadOnlyDocFilesDir() throws Exception { File pkgOutDir = new File(outDir, "p"); File docFilesOutDir = new File(pkgOutDir, "doc-files"); if (!docFilesOutDir.mkdirs()) { - throw error(docFilesOutDir, "Cannot create directory"); + throw skip(docFilesOutDir, "Cannot create directory"); } if (!docFilesOutDir.setReadOnly()) { - if (skip(docFilesOutDir)) { - return; - } - throw error(docFilesOutDir, "could not set directory read-only"); + throw skip(docFilesOutDir, "could not set directory read-only"); } if (docFilesOutDir.canWrite()) { - throw error(docFilesOutDir, "directory is writable"); + throw skip(docFilesOutDir, "directory is writable"); } try { @@ -219,10 +211,11 @@ public void testReadOnlyDocFilesDir() throws Exception { } } - private Error error(File f, String message) { + private Error skip(File f, String message) { + out.print(System.getProperty("user.name")); out.println(f + ": " + message); showAllAttributes(f.toPath()); - throw new Error(f + ": " + message); + throw new SkippedException(f + ": " + message); } private void showAllAttributes(Path p) { @@ -242,20 +235,5 @@ private void showAttributes(Path p, String attributes) { out.println("Error accessing attributes " + attributes + ": " + t); } } - - private boolean skip(File dir) { - if (isWindows()) { - showAllAttributes(dir.toPath()); - out.println("Windows: cannot set directory read only:" + dir); - out.println("TEST CASE SKIPPED"); - return true; - } else { - return false; - } - } - - private boolean isWindows() { - return System.getProperty("os.name").toLowerCase(Locale.US).startsWith("windows"); - } } From fa401f37dffe7bde27e562065dfd24381d5237cc Mon Sep 17 00:00:00 2001 From: Roland Westrelin <roland@openjdk.org> Date: Tue, 18 Jun 2024 12:08:57 +0000 Subject: [PATCH 096/471] 8333805: Replaying compilation with null static final fields results in a crash Reviewed-by: thartmann, dlong --- src/hotspot/share/ci/ciInstanceKlass.cpp | 10 ++- src/hotspot/share/ci/ciReplay.cpp | 87 ++++++++++--------- .../ciReplay/TestNullStaticField.java | 82 +++++++++++++++++ 3 files changed, 135 insertions(+), 44 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/ciReplay/TestNullStaticField.java diff --git a/src/hotspot/share/ci/ciInstanceKlass.cpp b/src/hotspot/share/ci/ciInstanceKlass.cpp index fa084e2287fbe..240bb25ae3aa8 100644 --- a/src/hotspot/share/ci/ciInstanceKlass.cpp +++ b/src/hotspot/share/ci/ciInstanceKlass.cpp @@ -661,7 +661,8 @@ class StaticFinalFieldPrinter : public FieldClosure { ResourceMark rm; oop mirror = fd->field_holder()->java_mirror(); _out->print("staticfield %s %s %s ", _holder, fd->name()->as_quoted_ascii(), fd->signature()->as_quoted_ascii()); - switch (fd->field_type()) { + BasicType field_type = fd->field_type(); + switch (field_type) { case T_BYTE: _out->print_cr("%d", mirror->byte_field(fd->offset())); break; case T_BOOLEAN: _out->print_cr("%d", mirror->bool_field(fd->offset())); break; case T_SHORT: _out->print_cr("%d", mirror->short_field(fd->offset())); break; @@ -682,9 +683,12 @@ class StaticFinalFieldPrinter : public FieldClosure { case T_OBJECT: { oop value = mirror->obj_field_acquire(fd->offset()); if (value == nullptr) { - _out->print_cr("null"); + if (field_type == T_ARRAY) { + _out->print("%d", -1); + } + _out->cr(); } else if (value->is_instance()) { - assert(fd->field_type() == T_OBJECT, ""); + assert(field_type == T_OBJECT, ""); if (value->is_a(vmClasses::String_klass())) { const char* ascii_value = java_lang_String::as_quoted_ascii(value); _out->print_cr("\"%s\"", (ascii_value != nullptr) ? ascii_value : ""); diff --git a/src/hotspot/share/ci/ciReplay.cpp b/src/hotspot/share/ci/ciReplay.cpp index 5fa30f864114f..3ed71806b078b 100644 --- a/src/hotspot/share/ci/ciReplay.cpp +++ b/src/hotspot/share/ci/ciReplay.cpp @@ -1056,46 +1056,48 @@ class CompileReplay : public StackObj { int length = parse_int("array length"); oop value = nullptr; - if (field_signature[1] == JVM_SIGNATURE_ARRAY) { - // multi dimensional array - ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK); - if (kelem == nullptr) { - return; - } - int rank = 0; - while (field_signature[rank] == JVM_SIGNATURE_ARRAY) { - rank++; - } - jint* dims = NEW_RESOURCE_ARRAY(jint, rank); - dims[0] = length; - for (int i = 1; i < rank; i++) { - dims[i] = 1; // These aren't relevant to the compiler - } - value = kelem->multi_allocate(rank, dims, CHECK); - } else { - if (strcmp(field_signature, "[B") == 0) { - value = oopFactory::new_byteArray(length, CHECK); - } else if (strcmp(field_signature, "[Z") == 0) { - value = oopFactory::new_boolArray(length, CHECK); - } else if (strcmp(field_signature, "[C") == 0) { - value = oopFactory::new_charArray(length, CHECK); - } else if (strcmp(field_signature, "[S") == 0) { - value = oopFactory::new_shortArray(length, CHECK); - } else if (strcmp(field_signature, "[F") == 0) { - value = oopFactory::new_floatArray(length, CHECK); - } else if (strcmp(field_signature, "[D") == 0) { - value = oopFactory::new_doubleArray(length, CHECK); - } else if (strcmp(field_signature, "[I") == 0) { - value = oopFactory::new_intArray(length, CHECK); - } else if (strcmp(field_signature, "[J") == 0) { - value = oopFactory::new_longArray(length, CHECK); - } else if (field_signature[0] == JVM_SIGNATURE_ARRAY && - field_signature[1] == JVM_SIGNATURE_CLASS) { - parse_klass(CHECK); // eat up the array class name - Klass* kelem = resolve_klass(field_signature + 1, CHECK); - value = oopFactory::new_objArray(kelem, length, CHECK); + if (length != -1) { + if (field_signature[1] == JVM_SIGNATURE_ARRAY) { + // multi dimensional array + ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK); + if (kelem == nullptr) { + return; + } + int rank = 0; + while (field_signature[rank] == JVM_SIGNATURE_ARRAY) { + rank++; + } + jint* dims = NEW_RESOURCE_ARRAY(jint, rank); + dims[0] = length; + for (int i = 1; i < rank; i++) { + dims[i] = 1; // These aren't relevant to the compiler + } + value = kelem->multi_allocate(rank, dims, CHECK); } else { - report_error("unhandled array staticfield"); + if (strcmp(field_signature, "[B") == 0) { + value = oopFactory::new_byteArray(length, CHECK); + } else if (strcmp(field_signature, "[Z") == 0) { + value = oopFactory::new_boolArray(length, CHECK); + } else if (strcmp(field_signature, "[C") == 0) { + value = oopFactory::new_charArray(length, CHECK); + } else if (strcmp(field_signature, "[S") == 0) { + value = oopFactory::new_shortArray(length, CHECK); + } else if (strcmp(field_signature, "[F") == 0) { + value = oopFactory::new_floatArray(length, CHECK); + } else if (strcmp(field_signature, "[D") == 0) { + value = oopFactory::new_doubleArray(length, CHECK); + } else if (strcmp(field_signature, "[I") == 0) { + value = oopFactory::new_intArray(length, CHECK); + } else if (strcmp(field_signature, "[J") == 0) { + value = oopFactory::new_longArray(length, CHECK); + } else if (field_signature[0] == JVM_SIGNATURE_ARRAY && + field_signature[1] == JVM_SIGNATURE_CLASS) { + Klass* actual_array_klass = parse_klass(CHECK); + Klass* kelem = ObjArrayKlass::cast(actual_array_klass)->element_klass(); + value = oopFactory::new_objArray(kelem, length, CHECK); + } else { + report_error("unhandled array staticfield"); + } } } java_mirror->obj_field_put(fd.offset(), value); @@ -1133,8 +1135,11 @@ class CompileReplay : public StackObj { Handle value = java_lang_String::create_from_str(string_value, CHECK); java_mirror->obj_field_put(fd.offset(), value()); } else if (field_signature[0] == JVM_SIGNATURE_CLASS) { - Klass* k = resolve_klass(string_value, CHECK); - oop value = InstanceKlass::cast(k)->allocate_instance(CHECK); + oop value = nullptr; + if (string_value != nullptr) { + Klass* k = resolve_klass(string_value, CHECK); + value = InstanceKlass::cast(k)->allocate_instance(CHECK); + } java_mirror->obj_field_put(fd.offset(), value); } else { report_error("unhandled staticfield"); diff --git a/test/hotspot/jtreg/compiler/ciReplay/TestNullStaticField.java b/test/hotspot/jtreg/compiler/ciReplay/TestNullStaticField.java new file mode 100644 index 0000000000000..47a78ad5e446e --- /dev/null +++ b/test/hotspot/jtreg/compiler/ciReplay/TestNullStaticField.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8333805 + * @library / /test/lib + * @summary Replaying compilation with null static final fields results in a crash + * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.compMode != "Xcomp" & vm.debug == true & vm.compiler2.enabled + * @modules java.base/jdk.internal.misc + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * compiler.ciReplay.TestNullStaticField + */ + +package compiler.ciReplay; + +public class TestNullStaticField extends DumpReplayBase { + + public static void main(String[] args) { + new TestNullStaticField().runTest(TIERED_DISABLED_VM_OPTION); + } + + @Override + public void testAction() { + positiveTest(TIERED_DISABLED_VM_OPTION, "-XX:+ReplayIgnoreInitErrors"); + } + + @Override + public String getTestClass() { + return TestClassNullStaticField.class.getName(); + } + +} + +class TestClassNullStaticField { + + static final Object[] staticNullArrayField = null; + static final Object[][] staticNullMultiArrayField = null; + static final Object staticNullObjectField = null; + static final String staticNullStringField = null; + static final int[] staticNullIntArrayField = null; + static final Object[] staticNotNullArrayField = new A[10]; + static final Object[][] staticNotNullMultiArrayField = new A[10][10]; + static final Object staticNotNullObjectField = new A(); + static final String staticNotNullStringField = "Not null"; + static final int[] staticNotNullIntArrayField = new int[10]; + + public static void main(String[] args) { + for (int i = 0; i < 20_000; i++) { + test(); + } + } + public static void test() { + + } + + private static class A { + } +} + From e681b4e9b3ae24f45d8c6adab4105df39e6b8a92 Mon Sep 17 00:00:00 2001 From: nibjen <jena.nibedita@oracle.com> Date: Tue, 18 Jun 2024 13:28:37 +0000 Subject: [PATCH 097/471] 8332524: Instead of printing "TLSv1.3," it is showing "TLS13" Reviewed-by: mullan --- .../share/classes/sun/security/ssl/ClientHello.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/sun/security/ssl/ClientHello.java b/src/java.base/share/classes/sun/security/ssl/ClientHello.java index 091bfa8986ea4..babf2bb452da4 100644 --- a/src/java.base/share/classes/sun/security/ssl/ClientHello.java +++ b/src/java.base/share/classes/sun/security/ssl/ClientHello.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -903,8 +903,8 @@ private ProtocolVersion negotiateProtocol( throw context.conContext.fatal(Alert.PROTOCOL_VERSION, "The client supported protocol versions " + Arrays.toString( ProtocolVersion.toStringArray(clientSupportedVersions)) + - " are not accepted by server preferences " + - context.activeProtocols); + " are not accepted by server preferences " + Arrays.toString( + ProtocolVersion.toStringArray(context.activeProtocols))); } } From 91bd85d65dff9cea91b88da7ef241be5c7b85f94 Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Tue, 18 Jun 2024 13:51:50 +0000 Subject: [PATCH 098/471] 8333854: IllegalAccessError with proxies after JDK-8332457 Reviewed-by: redestad, asotona --- .../java/lang/reflect/ProxyGenerator.java | 248 ++++++++++++------ .../Proxy/NonPublicMethodTypeTest.java | 59 +++++ 2 files changed, 230 insertions(+), 77 deletions(-) create mode 100644 test/jdk/java/lang/reflect/Proxy/NonPublicMethodTypeTest.java diff --git a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java index a484c19120662..6c82a6ecb6f61 100644 --- a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java +++ b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java @@ -47,13 +47,10 @@ import static java.lang.classfile.ClassFile.*; import java.lang.classfile.attribute.StackMapFrameInfo; import java.lang.classfile.attribute.StackMapTableAttribute; -import java.lang.constant.ConstantDescs; + import static java.lang.constant.ConstantDescs.*; import static jdk.internal.constant.ConstantUtils.*; -import java.lang.constant.DirectMethodHandleDesc; -import java.lang.constant.DynamicConstantDesc; - /** * ProxyGenerator contains the code to generate a dynamic proxy class * for the java.lang.reflect.Proxy API. @@ -67,7 +64,10 @@ final class ProxyGenerator { ClassFile.of(ClassFile.StackMapsOption.DROP_STACK_MAPS); private static final ClassDesc + CD_ClassLoader = ReferenceClassDescImpl.ofValidated("Ljava/lang/ClassLoader;"), CD_Class_array = ReferenceClassDescImpl.ofValidated("[Ljava/lang/Class;"), + CD_ClassNotFoundException = ReferenceClassDescImpl.ofValidated("Ljava/lang/ClassNotFoundException;"), + CD_NoClassDefFoundError = ReferenceClassDescImpl.ofValidated("Ljava/lang/NoClassDefFoundError;"), CD_IllegalAccessException = ReferenceClassDescImpl.ofValidated("Ljava/lang/IllegalAccessException;"), CD_InvocationHandler = ReferenceClassDescImpl.ofValidated("Ljava/lang/reflect/InvocationHandler;"), CD_Method = ReferenceClassDescImpl.ofValidated("Ljava/lang/reflect/Method;"), @@ -83,8 +83,9 @@ final class ProxyGenerator { MTD_void_String = MethodTypeDescImpl.ofValidated(CD_void, CD_String), MTD_void_Throwable = MethodTypeDescImpl.ofValidated(CD_void, CD_Throwable), MTD_Class = MethodTypeDescImpl.ofValidated(CD_Class), - MTD_Class_array = MethodTypeDescImpl.ofValidated(CD_Class_array), - MTD_Method_String_Class_array = MethodTypeDescImpl.ofValidated(CD_Method, ConstantDescs.CD_String, CD_Class_array), + MTD_Class_String_boolean_ClassLoader = MethodTypeDescImpl.ofValidated(CD_Class, CD_String, CD_boolean, CD_ClassLoader), + MTD_ClassLoader = MethodTypeDescImpl.ofValidated(CD_ClassLoader), + MTD_Method_String_Class_array = MethodTypeDescImpl.ofValidated(CD_Method, CD_String, CD_Class_array), MTD_MethodHandles$Lookup = MethodTypeDescImpl.ofValidated(CD_MethodHandles_Lookup), MTD_MethodHandles$Lookup_MethodHandles$Lookup = MethodTypeDescImpl.ofValidated(CD_MethodHandles_Lookup, CD_MethodHandles_Lookup), MTD_Object_Object_Method_ObjectArray = MethodTypeDescImpl.ofValidated(CD_Object, CD_Object, CD_Method, CD_Object_array), @@ -109,34 +110,33 @@ final class ProxyGenerator { "jdk.proxy.ProxyGenerator.saveGeneratedFiles")); /* Preloaded ProxyMethod objects for methods in java.lang.Object */ - private static final ProxyMethod HASH_CODE_METHOD; - private static final ProxyMethod EQUALS_METHOD; - private static final ProxyMethod TO_STRING_METHOD; + private static final Method OBJECT_HASH_CODE_METHOD; + private static final Method OBJECT_EQUALS_METHOD; + private static final Method OBJECT_TO_STRING_METHOD; static { try { - HASH_CODE_METHOD = new ProxyMethod(Object.class.getMethod("hashCode")); - EQUALS_METHOD = new ProxyMethod(Object.class.getMethod("equals", Object.class)); - TO_STRING_METHOD = new ProxyMethod(Object.class.getMethod("toString")); + OBJECT_HASH_CODE_METHOD = Object.class.getMethod("hashCode"); + OBJECT_EQUALS_METHOD = Object.class.getMethod("equals", Object.class); + OBJECT_TO_STRING_METHOD = Object.class.getMethod("toString"); } catch (NoSuchMethodException e) { throw new NoSuchMethodError(e.getMessage()); } } private final ConstantPoolBuilder cp; - private final List<StackMapFrameInfo.VerificationTypeInfo> throwableStack; + private final List<StackMapFrameInfo.VerificationTypeInfo> classLoaderLocal, throwableStack; private final NameAndTypeEntry exInit; - private final ClassEntry object, proxy, ute; + private final ClassEntry objectCE, proxyCE, uteCE, classCE; private final FieldRefEntry handlerField; - private final InterfaceMethodRefEntry invoke; - private final MethodRefEntry uteInit; - private final DirectMethodHandleDesc bsm; + private final InterfaceMethodRefEntry invocationHandlerInvoke; + private final MethodRefEntry uteInit, classGetMethod, classForName, throwableGetMessage; /** - * Name of proxy class + * ClassEntry for this proxy class */ - private final ClassEntry classEntry; + private final ClassEntry thisClassCE; /** * Proxy interfaces @@ -155,6 +155,12 @@ final class ProxyGenerator { */ private final Map<String, List<ProxyMethod>> proxyMethods = new LinkedHashMap<>(); + /** + * Ordinal of next ProxyMethod object added to proxyMethods. + * Indexes are reserved for hashcode(0), equals(1), toString(2). + */ + private int proxyMethodCount = 3; + /** * Construct a ProxyGenerator to generate a proxy class with the * specified name and for the given interfaces. @@ -165,18 +171,23 @@ final class ProxyGenerator { private ProxyGenerator(String className, List<Class<?>> interfaces, int accessFlags) { this.cp = ConstantPoolBuilder.of(); - this.classEntry = cp.classEntry(ConstantUtils.binaryNameToDesc(className)); + this.thisClassCE = cp.classEntry(ConstantUtils.binaryNameToDesc(className)); this.interfaces = interfaces; this.accessFlags = accessFlags; - this.throwableStack = List.of(StackMapFrameInfo.ObjectVerificationTypeInfo.of(cp.classEntry(CD_Throwable))); + var throwable = cp.classEntry(CD_Throwable); + this.classLoaderLocal = List.of(StackMapFrameInfo.ObjectVerificationTypeInfo.of(cp.classEntry(CD_ClassLoader))); + this.throwableStack = List.of(StackMapFrameInfo.ObjectVerificationTypeInfo.of(throwable)); this.exInit = cp.nameAndTypeEntry(INIT_NAME, MTD_void_String); - this.object = cp.classEntry(CD_Object); - this.proxy = cp.classEntry(CD_Proxy); - this.handlerField = cp.fieldRefEntry(proxy, cp.nameAndTypeEntry(NAME_HANDLER_FIELD, CD_InvocationHandler)); - this.invoke = cp.interfaceMethodRefEntry(CD_InvocationHandler, "invoke", MTD_Object_Object_Method_ObjectArray); - this.ute = cp.classEntry(CD_UndeclaredThrowableException); - this.uteInit = cp.methodRefEntry(ute, cp.nameAndTypeEntry(INIT_NAME, MTD_void_Throwable)); - this.bsm = ConstantDescs.ofConstantBootstrap(classEntry.asSymbol(), "$getMethod", CD_Method, CD_Class, CD_String, CD_MethodType); + this.objectCE = cp.classEntry(CD_Object); + this.proxyCE = cp.classEntry(CD_Proxy); + this.classCE = cp.classEntry(CD_Class); + this.handlerField = cp.fieldRefEntry(proxyCE, cp.nameAndTypeEntry(NAME_HANDLER_FIELD, CD_InvocationHandler)); + this.invocationHandlerInvoke = cp.interfaceMethodRefEntry(CD_InvocationHandler, "invoke", MTD_Object_Object_Method_ObjectArray); + this.uteCE = cp.classEntry(CD_UndeclaredThrowableException); + this.uteInit = cp.methodRefEntry(uteCE, cp.nameAndTypeEntry(INIT_NAME, MTD_void_Throwable)); + this.classGetMethod = cp.methodRefEntry(classCE, cp.nameAndTypeEntry("getMethod", MTD_Method_String_Class_array)); + this.classForName = cp.methodRefEntry(classCE, cp.nameAndTypeEntry("forName", MTD_Class_String_boolean_ClassLoader)); + this.throwableGetMessage = cp.methodRefEntry(throwable, cp.nameAndTypeEntry("getMessage", MTD_String)); } /** @@ -435,9 +446,9 @@ private byte[] generateClassFile() { * java.lang.Object take precedence over duplicate methods in the * proxy interfaces. */ - addProxyMethod(HASH_CODE_METHOD); - addProxyMethod(EQUALS_METHOD); - addProxyMethod(TO_STRING_METHOD); + addProxyMethod(new ProxyMethod(OBJECT_HASH_CODE_METHOD, "m0")); + addProxyMethod(new ProxyMethod(OBJECT_EQUALS_METHOD, "m1")); + addProxyMethod(new ProxyMethod(OBJECT_TO_STRING_METHOD, "m2")); /* * Accumulate all of the methods from the proxy interfaces. @@ -458,20 +469,23 @@ private byte[] generateClassFile() { checkReturnTypes(sigmethods); } - return CF_CONTEXT.build(classEntry, cp, clb -> { - clb.withSuperclass(proxy); + return CF_CONTEXT.build(thisClassCE, cp, clb -> { + clb.withSuperclass(proxyCE); clb.withFlags(accessFlags); clb.withInterfaces(toClassEntries(cp, interfaces)); generateConstructor(clb); for (List<ProxyMethod> sigmethods : proxyMethods.values()) { for (ProxyMethod pm : sigmethods) { + // add static field for the Method object + clb.withField(pm.methodFieldName, CD_Method, ACC_PRIVATE | ACC_STATIC | ACC_FINAL); + // Generate code for proxy method - pm.generateMethod(this, clb); + pm.generateMethod(clb); } } - generateBootstrapMethod(clb); + generateStaticInitializer(clb); generateLookupAccessor(clb); }); } @@ -514,7 +528,7 @@ private void addProxyMethod(Method m, Class<?> fromClass) { } } sigmethods.add(new ProxyMethod(m, sig, m.getSharedParameterTypes(), returnType, - exceptionTypes, fromClass)); + exceptionTypes, fromClass, "m" + proxyMethodCount++)); } /** @@ -536,32 +550,56 @@ private void generateConstructor(ClassBuilder clb) { clb.withMethodBody(INIT_NAME, MTD_void_InvocationHandler, ACC_PUBLIC, cob -> cob .aload(0) .aload(1) - .invokespecial(cp.methodRefEntry(proxy, cp.nameAndTypeEntry(INIT_NAME, MTD_void_InvocationHandler))) + .invokespecial(cp.methodRefEntry(proxyCE, + cp.nameAndTypeEntry(INIT_NAME, MTD_void_InvocationHandler))) .return_()); } /** - * Generate CONDY bootstrap method for the proxy class to retrieve {@link Method} instances. + * Generate the class initializer. + * Discussion: Currently, for Proxy to work with SecurityManager, + * we rely on the parameter classes of the methods to be computed + * from Proxy instead of via user code paths like bootstrap method + * lazy evaluation. That might change if we can pass in the live + * Method objects directly.. */ - private void generateBootstrapMethod(ClassBuilder clb) { - clb.withMethodBody(bsm.methodName(), bsm.invocationType(), ClassFile.ACC_PRIVATE | ClassFile.ACC_STATIC, cob -> { - cob.aload(3) //interface Class - .aload(4) //interface method name String - .aload(5) //interface MethodType - .invokevirtual(CD_MethodType, "parameterArray", MTD_Class_array) - .invokevirtual(ConstantDescs.CD_Class, "getMethod", MTD_Method_String_Class_array) - .areturn(); - Label failLabel = cob.newBoundLabel(); - ClassEntry nsme = cp.classEntry(CD_NoSuchMethodError); - cob.exceptionCatch(cob.startLabel(), failLabel, failLabel, CD_NoSuchMethodException) - .new_(nsme) + private void generateStaticInitializer(ClassBuilder clb) { + clb.withMethodBody(CLASS_INIT_NAME, MTD_void, ACC_STATIC, cob -> { + // Put ClassLoader at local variable index 0, used by + // Class.forName(String, boolean, ClassLoader) calls + cob.ldc(thisClassCE) + .invokevirtual(cp.methodRefEntry(classCE, + cp.nameAndTypeEntry("getClassLoader", MTD_ClassLoader))) + .astore(0); + var ts = cob.newBoundLabel(); + for (List<ProxyMethod> sigmethods : proxyMethods.values()) { + for (ProxyMethod pm : sigmethods) { + pm.codeFieldInitialization(cob); + } + } + cob.return_(); + var c1 = cob.newBoundLabel(); + var nsmError = cp.classEntry(CD_NoSuchMethodError); + cob.exceptionCatch(ts, c1, c1, CD_NoSuchMethodException) + .new_(nsmError) + .dup_x1() + .swap() + .invokevirtual(throwableGetMessage) + .invokespecial(cp.methodRefEntry(nsmError, exInit)) + .athrow(); + var c2 = cob.newBoundLabel(); + var ncdfError = cp.classEntry(CD_NoClassDefFoundError); + cob.exceptionCatch(ts, c1, c2, CD_ClassNotFoundException) + .new_(ncdfError) .dup_x1() .swap() - .invokevirtual(cp.methodRefEntry(CD_Throwable, "getMessage", MTD_String)) - .invokespecial(cp.methodRefEntry(nsme, exInit)) - .athrow() - .with(StackMapTableAttribute.of(List.of( - StackMapFrameInfo.of(failLabel, List.of(), throwableStack)))); + .invokevirtual(throwableGetMessage) + .invokespecial(cp.methodRefEntry(ncdfError, exInit)) + .athrow(); + cob.with(StackMapTableAttribute.of(List.of( + StackMapFrameInfo.of(c1, classLoaderLocal, throwableStack), + StackMapFrameInfo.of(c2, classLoaderLocal, throwableStack)))); + }); } @@ -581,7 +619,7 @@ private void generateLookupAccessor(ClassBuilder clb) { ClassEntry iae = cp.classEntry(CD_IllegalAccessException); cob.aload(cob.parameterSlot(0)) .invokevirtual(cp.methodRefEntry(mhl, cp.nameAndTypeEntry("lookupClass", MTD_Class))) - .ldc(proxy) + .ldc(proxyCE) .if_acmpne(failLabel) .aload(cob.parameterSlot(0)) .invokevirtual(cp.methodRefEntry(mhl, cp.nameAndTypeEntry("hasFullPrivilegeAccess", MTD_boolean))) @@ -607,24 +645,29 @@ private void generateLookupAccessor(ClassBuilder clb) { * being generated: a method whose implementation will encode and * dispatch invocations to the proxy instance's invocation handler. */ - private static class ProxyMethod { + private class ProxyMethod { private final Method method; private final String shortSignature; private final Class<?> fromClass; private final Class<?>[] parameterTypes; private final Class<?> returnType; + private final String methodFieldName; private Class<?>[] exceptionTypes; + private final FieldRefEntry methodField; private ProxyMethod(Method method, String sig, Class<?>[] parameterTypes, Class<?> returnType, Class<?>[] exceptionTypes, - Class<?> fromClass) { + Class<?> fromClass, String methodFieldName) { this.method = method; this.shortSignature = sig; this.parameterTypes = parameterTypes; this.returnType = returnType; this.exceptionTypes = exceptionTypes; this.fromClass = fromClass; + this.methodFieldName = methodFieldName; + this.methodField = cp.fieldRefEntry(thisClassCE, + cp.nameAndTypeEntry(methodFieldName, CD_Method)); } /** @@ -632,17 +675,16 @@ private ProxyMethod(Method method, String sig, Class<?>[] parameterTypes, * * @param method The method for which to create a proxy */ - private ProxyMethod(Method method) { + private ProxyMethod(Method method, String methodFieldName) { this(method, method.toShortSignature(), method.getSharedParameterTypes(), method.getReturnType(), - method.getSharedExceptionTypes(), method.getDeclaringClass()); + method.getSharedExceptionTypes(), method.getDeclaringClass(), methodFieldName); } /** * Generate this method, including the code and exception table entry. */ - private void generateMethod(ProxyGenerator pg, ClassBuilder clb) { - var cp = pg.cp; + private void generateMethod(ClassBuilder clb) { var desc = methodTypeDesc(returnType, parameterTypes); int accessFlags = (method.isVarArgs()) ? ACC_VARARGS | ACC_PUBLIC | ACC_FINAL : ACC_PUBLIC | ACC_FINAL; @@ -650,17 +692,14 @@ private void generateMethod(ProxyGenerator pg, ClassBuilder clb) { clb.withMethod(method.getName(), desc, accessFlags, mb -> mb.with(ExceptionsAttribute.of(toClassEntries(cp, List.of(exceptionTypes)))) .withCode(cob -> { - cob.aload(0) - .getfield(pg.handlerField) - .aload(0) - .ldc(DynamicConstantDesc.of(pg.bsm, - referenceClassDesc(fromClass), - method.getName(), - desc)); + cob.aload(cob.receiverSlot()) + .getfield(handlerField) + .aload(cob.receiverSlot()) + .getstatic(methodField); if (parameterTypes.length > 0) { // Create an array and fill with the parameters converting primitives to wrappers cob.loadConstant(parameterTypes.length) - .anewarray(pg.object); + .anewarray(objectCE); for (int i = 0; i < parameterTypes.length; i++) { cob.dup() .loadConstant(i); @@ -671,7 +710,7 @@ private void generateMethod(ProxyGenerator pg, ClassBuilder clb) { cob.aconst_null(); } - cob.invokeinterface(pg.invoke); + cob.invokeinterface(invocationHandlerInvoke); if (returnType == void.class) { cob.pop() @@ -687,14 +726,14 @@ private void generateMethod(ProxyGenerator pg, ClassBuilder clb) { cob.athrow(); // just rethrow the exception var c2 = cob.newBoundLabel(); cob.exceptionCatchAll(cob.startLabel(), c1, c2) - .new_(pg.ute) + .new_(uteCE) .dup_x1() .swap() - .invokespecial(pg.uteInit) + .invokespecial(uteInit) .athrow() .with(StackMapTableAttribute.of(List.of( - StackMapFrameInfo.of(c1, List.of(), pg.throwableStack), - StackMapFrameInfo.of(c2, List.of(), pg.throwableStack)))); + StackMapFrameInfo.of(c1, List.of(), throwableStack), + StackMapFrameInfo.of(c2, List.of(), throwableStack)))); } })); } @@ -709,7 +748,7 @@ private void codeWrapArgument(CodeBuilder cob, Class<?> type, int slot) { if (type.isPrimitive()) { cob.loadLocal(TypeKind.from(type).asLoadable(), slot); PrimitiveTypeInfo prim = PrimitiveTypeInfo.get(type); - cob.invokestatic(prim.wrapperMethodRef(cob.constantPool())); + cob.invokestatic(prim.wrapperMethodRef(cp)); } else { cob.aload(slot); } @@ -725,7 +764,7 @@ private void codeUnwrapReturnValue(CodeBuilder cob, Class<?> type) { PrimitiveTypeInfo prim = PrimitiveTypeInfo.get(type); cob.checkcast(prim.wrapperClass) - .invokevirtual(prim.unwrapMethodRef(cob.constantPool())) + .invokevirtual(prim.unwrapMethodRef(cp)) .return_(TypeKind.from(type).asLoadable()); } else { cob.checkcast(referenceClassDesc(type)) @@ -733,6 +772,57 @@ private void codeUnwrapReturnValue(CodeBuilder cob, Class<?> type) { } } + /** + * Generate code for initializing the static field that stores + * the Method object for this proxy method. A class loader is + * anticipated at local variable index 0. + * The generated code must be run in an AccessController.doPrivileged + * block if a SecurityManager is present, as otherwise the code + * cannot pass {@code null} ClassLoader to forName. + */ + private void codeFieldInitialization(CodeBuilder cob) { + var cp = cob.constantPool(); + codeClassForName(cob, fromClass); + + cob.ldc(method.getName()) + .loadConstant(parameterTypes.length) + .anewarray(classCE); + + // Construct an array with the parameter types mapping primitives to Wrapper types + for (int i = 0; i < parameterTypes.length; i++) { + cob.dup() + .loadConstant(i); + if (parameterTypes[i].isPrimitive()) { + PrimitiveTypeInfo prim = PrimitiveTypeInfo.get(parameterTypes[i]); + cob.getstatic(prim.typeFieldRef(cp)); + } else { + codeClassForName(cob, parameterTypes[i]); + } + cob.aastore(); + } + // lookup the method + cob.invokevirtual(classGetMethod) + .putstatic(methodField); + } + + /* + * =============== Code Generation Utility Methods =============== + */ + + /** + * Generate code to invoke the Class.forName with the name of the given + * class to get its Class object at runtime. The code is written to + * the supplied stream. Note that the code generated by this method + * may cause the checked ClassNotFoundException to be thrown. A class + * loader is anticipated at local variable index 0. + */ + private void codeClassForName(CodeBuilder cob, Class<?> cl) { + cob.ldc(cl.getName()) + .iconst_0() // false + .aload(0)// classLoader + .invokestatic(classForName); + } + @Override public String toString() { return method.toShortString(); @@ -799,5 +889,9 @@ public MethodRefEntry wrapperMethodRef(ConstantPoolBuilder cp) { public MethodRefEntry unwrapMethodRef(ConstantPoolBuilder cp) { return cp.methodRefEntry(wrapperClass, unwrapMethodName, unwrapMethodType); } + + public FieldRefEntry typeFieldRef(ConstantPoolBuilder cp) { + return cp.fieldRefEntry(wrapperClass, "TYPE", CD_Class); + } } } diff --git a/test/jdk/java/lang/reflect/Proxy/NonPublicMethodTypeTest.java b/test/jdk/java/lang/reflect/Proxy/NonPublicMethodTypeTest.java new file mode 100644 index 0000000000000..8919dc2f0b2e2 --- /dev/null +++ b/test/jdk/java/lang/reflect/Proxy/NonPublicMethodTypeTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8333854 + * @summary Test invoking a method in a proxy interface with package-private + * classes or interfaces in its method type + * @run junit NonPublicMethodTypeTest + */ + +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Proxy; + +import static org.junit.jupiter.api.Assertions.assertNotSame; + +public final class NonPublicMethodTypeTest { + interface NonPublicWorker { + void work(); + } + + public interface PublicWorkable { + void accept(NonPublicWorker worker); + } + + @Test + public void test() { + PublicWorkable proxy = (PublicWorkable) Proxy.newProxyInstance( + NonPublicMethodTypeTest.class.getClassLoader(), + new Class[] {PublicWorkable.class}, + (_, _, _) -> null); + assertNotSame(NonPublicWorker.class.getPackage(), + proxy.getClass().getPackage(), + "Proxy class should not be able to access method parameter " + + "NonPublic type's package"); + proxy.accept(() -> {}); // Call should not fail + } +} From 8bc2fbe57893b110fdb5fd567df4615e7833e5ae Mon Sep 17 00:00:00 2001 From: Sonia Zaldana Calles <szaldana@openjdk.org> Date: Tue, 18 Jun 2024 14:05:11 +0000 Subject: [PATCH 099/471] 8333769: Pretouching tests dont test pretouching Reviewed-by: stuefe, asmehra --- src/hotspot/os/aix/os_aix.cpp | 2 + src/hotspot/os/bsd/os_bsd.cpp | 16 +++ src/hotspot/os/linux/os_linux.cpp | 9 ++ src/hotspot/os/windows/os_windows.cpp | 13 ++ src/hotspot/share/prims/whitebox.cpp | 6 + src/hotspot/share/runtime/os.hpp | 1 + .../jtreg/gc/TestAlwaysPreTouchBehavior.java | 130 ++++++++++++++++++ .../parallel/TestAlwaysPreTouchBehavior.java | 79 ----------- test/lib/jdk/test/whitebox/WhiteBox.java | 1 + 9 files changed, 178 insertions(+), 79 deletions(-) create mode 100644 test/hotspot/jtreg/gc/TestAlwaysPreTouchBehavior.java delete mode 100644 test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp index f0a984d3d1fe0..39f3e420662f0 100644 --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -287,6 +287,8 @@ julong os::physical_memory() { return Aix::physical_memory(); } +size_t os::rss() { return (size_t)0; } + // Cpu architecture string #if defined(PPC32) static char cpu_arch[] = "ppc"; diff --git a/src/hotspot/os/bsd/os_bsd.cpp b/src/hotspot/os/bsd/os_bsd.cpp index e5b6c74ce2f1b..fe1e7098fd541 100644 --- a/src/hotspot/os/bsd/os_bsd.cpp +++ b/src/hotspot/os/bsd/os_bsd.cpp @@ -210,6 +210,22 @@ julong os::physical_memory() { return Bsd::physical_memory(); } +size_t os::rss() { + size_t rss = 0; +#ifdef __APPLE__ + mach_task_basic_info info; + mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; + + kern_return_t ret = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, + (task_info_t)&info, &count); + if (ret == KERN_SUCCESS) { + rss = info.resident_size; + } +#endif // __APPLE__ + + return rss; +} + // Cpu architecture string #if defined(ZERO) static char cpu_arch[] = ZERO_LIBARCH; diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp index b56d40823546a..52866a44b26c6 100644 --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -359,6 +359,15 @@ julong os::physical_memory() { return phys_mem; } +size_t os::rss() { + size_t size = 0; + os::Linux::meminfo_t info; + if (os::Linux::query_process_memory_info(&info)) { + size = info.vmrss * K; + } + return size; +} + static uint64_t initial_total_ticks = 0; static uint64_t initial_steal_ticks = 0; static bool has_initial_tick_info = false; diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index 773bda647e15f..49f05fe94b3f5 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -858,6 +858,19 @@ julong os::physical_memory() { return win32::physical_memory(); } +size_t os::rss() { + size_t rss = 0; + PROCESS_MEMORY_COUNTERS_EX pmex; + ZeroMemory(&pmex, sizeof(PROCESS_MEMORY_COUNTERS_EX)); + pmex.cb = sizeof(pmex); + BOOL ret = GetProcessMemoryInfo( + GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS *)&pmex, sizeof(pmex)); + if (ret) { + rss = pmex.WorkingSetSize; + } + return rss; +} + bool os::has_allocatable_memory_limit(size_t* limit) { MEMORYSTATUSEX ms; ms.dwLength = sizeof(ms); diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index 821444ea38985..5ed593b0d2f8e 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -2657,6 +2657,11 @@ WB_ENTRY(void, WB_CleanMetaspaces(JNIEnv* env, jobject target)) ClassLoaderDataGraph::safepoint_and_clean_metaspaces(); WB_END +// Reports resident set size (RSS) in bytes +WB_ENTRY(jlong, WB_Rss(JNIEnv* env, jobject o)) + return os::rss(); +WB_END + #define CC (char*) static JNINativeMethod methods[] = { @@ -2944,6 +2949,7 @@ static JNINativeMethod methods[] = { {CC"setVirtualThreadsNotifyJvmtiMode", CC"(Z)Z", (void*)&WB_SetVirtualThreadsNotifyJvmtiMode}, {CC"preTouchMemory", CC"(JJ)V", (void*)&WB_PreTouchMemory}, {CC"cleanMetaspaces", CC"()V", (void*)&WB_CleanMetaspaces}, + {CC"rss", CC"()J", (void*)&WB_Rss}, }; diff --git a/src/hotspot/share/runtime/os.hpp b/src/hotspot/share/runtime/os.hpp index a6626c1389fce..ce7a07d4c43a0 100644 --- a/src/hotspot/share/runtime/os.hpp +++ b/src/hotspot/share/runtime/os.hpp @@ -344,6 +344,7 @@ class os: AllStatic { static julong physical_memory(); static bool has_allocatable_memory_limit(size_t* limit); static bool is_server_class_machine(); + static size_t rss(); // Returns the id of the processor on which the calling thread is currently executing. // The returned value is guaranteed to be between 0 and (os::processor_count() - 1). diff --git a/test/hotspot/jtreg/gc/TestAlwaysPreTouchBehavior.java b/test/hotspot/jtreg/gc/TestAlwaysPreTouchBehavior.java new file mode 100644 index 0000000000000..c282c2876eaee --- /dev/null +++ b/test/hotspot/jtreg/gc/TestAlwaysPreTouchBehavior.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2014, 2024, Alibaba Group Holding Limited. All rights reserved. + * Copyright (c) 2024, Red Hat Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package gc; + +/** + * @test id=ParallelCollector + * @summary tests AlwaysPreTouch + * @requires vm.gc.Parallel + * @requires os.maxMemory > 2G + * @requires os.family != "aix" + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx512m -Xms512m -XX:+UseParallelGC -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior + */ + + /** + * @test id=SerialCollector + * @summary tests AlwaysPreTouch + * @requires vm.gc.Serial + * @requires os.maxMemory > 2G + * @requires os.family != "aix" + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx512m -Xms512m -XX:+UseSerialGC -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior + */ + +/** + * @test id=Shenandoah + * @summary tests AlwaysPreTouch + * @requires vm.gc.Shenandoah + * @requires os.maxMemory > 2G + * @requires os.family != "aix" + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx512m -Xms512m -XX:+UseShenandoahGC -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior + */ + +/** + * @test id=G1 + * @summary tests AlwaysPreTouch + * @requires vm.gc.G1 + * @requires os.maxMemory > 2G + * @requires os.family != "aix" + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx512m -Xms512m -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior + */ + +/** + * @test id=ZGenerational + * @summary tests AlwaysPreTouch + * @requires vm.gc.ZGenerational + * @requires os.maxMemory > 2G + * @requires os.family != "aix" + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+UseZGC -XX:+ZGenerational -Xmx512m -Xms512m -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior + */ + +/** + * @test id=ZSinglegen + * @summary tests AlwaysPreTouch + * @requires vm.gc.ZSinglegen + * @requires os.maxMemory > 2G + * @requires os.family != "aix" + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+UseZGC -XX:-ZGenerational -Xmx512m -Xms512m -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior + */ + +/** + * @test id=Epsilon + * @summary tests AlwaysPreTouch + * @requires vm.gc.Epsilon + * @requires os.maxMemory > 2G + * @requires os.family != "aix" + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xmx512m -Xms512m -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior + */ + + +import jdk.test.lib.Asserts; + +import jdk.test.whitebox.WhiteBox; + +public class TestAlwaysPreTouchBehavior { + + public static void main(String [] args) { + long rss = WhiteBox.getWhiteBox().rss(); + System.out.println("RSS: " + rss); + if (rss == 0) { + System.out.println("cannot get RSS, just skip"); + return; // Did not get available RSS, just ignore this test. + } + Runtime runtime = Runtime.getRuntime(); + long committedMemory = runtime.totalMemory(); + Asserts.assertGreaterThan(rss, committedMemory, "RSS of this process(" + rss + "b) should be bigger than or equal to committed heap mem(" + committedMemory + "b)"); + } +} + diff --git a/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java b/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java deleted file mode 100644 index 3a5b2b557cc92..0000000000000 --- a/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2014, 2024, Alibaba Group Holding Limited. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package gc.parallel; - -/** - * @test TestAlwaysPreTouchBehavior - * @summary Tests AlwaysPreTouch Bahavior, pages of java heap should be pretouched with AlwaysPreTouch enabled. This test reads RSS of test process, which should be bigger than heap size(1g) with AlwaysPreTouch enabled. - * @requires vm.gc.Parallel - * @requires vm.debug != true - * @requires os.family == "linux" - * @requires os.maxMemory > 2G - * @library /test/lib - * @run main/othervm -Xmx1g -Xms1g -XX:+UseParallelGC -XX:+AlwaysPreTouch -XX:+UnlockDiagnosticVMOptions -XX:-UseMadvPopulateWrite gc.parallel.TestAlwaysPreTouchBehavior - */ -import java.lang.management.ManagementFactory; -import java.lang.management.ThreadInfo; -import java.lang.management.ThreadMXBean; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.io.IOException; -import java.util.*; -import javax.management.*; -import java.lang.management.*; -import jdk.test.lib.Utils; -import jdk.test.lib.Asserts; -import java.lang.management.*; -import java.util.stream.*; -import java.io.*; - -public class TestAlwaysPreTouchBehavior { - public static long getProcessRssInKb() throws IOException { - String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; - // Read RSS from /proc/$pid/status. Only available on Linux. - String processStatusFile = "/proc/" + pid + "/status"; - BufferedReader reader = new BufferedReader(new FileReader(processStatusFile)); - String line = null; - while ((line = reader.readLine()) != null) { - if (line.startsWith("VmRSS:")) { - break; - } - } - reader.close(); - return Long.valueOf(line.split("\\s+")[1].trim()); - } - public static void main(String [] args) { - long rss = 0; - Runtime runtime = Runtime.getRuntime(); - long committedMemory = runtime.totalMemory() / 1024; // in kb - try { - rss = getProcessRssInKb(); - } catch (Exception e) { - System.out.println("cannot get RSS, just skip"); - return; // Did not get avaiable RSS, just ignore this test - } - Asserts.assertGreaterThanOrEqual(rss, committedMemory, "RSS of this process(" + rss + "kb) should be bigger than or equal to committed heap mem(" + committedMemory + "kb)"); - } -} diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java index 2402e39974e3d..3b930aec16f29 100644 --- a/test/lib/jdk/test/whitebox/WhiteBox.java +++ b/test/lib/jdk/test/whitebox/WhiteBox.java @@ -798,4 +798,5 @@ public native int validateCgroup(String procCgroups, public native boolean setVirtualThreadsNotifyJvmtiMode(boolean enabled); public native void preTouchMemory(long addr, long size); + public native long rss(); } From 6f860f8f6f69369130ed79e71255005b5beed45a Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov <kvn@openjdk.org> Date: Tue, 18 Jun 2024 14:48:46 +0000 Subject: [PATCH 100/471] 8334430: Clean up nativeInst_x86.* Reviewed-by: jwaters, jiefu --- src/hotspot/cpu/x86/nativeInst_x86.cpp | 161 +---------------------- src/hotspot/cpu/x86/nativeInst_x86.hpp | 172 +------------------------ 2 files changed, 2 insertions(+), 331 deletions(-) diff --git a/src/hotspot/cpu/x86/nativeInst_x86.cpp b/src/hotspot/cpu/x86/nativeInst_x86.cpp index b59f424625636..0426c0f51741d 100644 --- a/src/hotspot/cpu/x86/nativeInst_x86.cpp +++ b/src/hotspot/cpu/x86/nativeInst_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,143 +41,6 @@ void NativeInstruction::wrote(int offset) { ICache::invalidate_word(addr_at(offset)); } -#ifdef ASSERT -void NativeLoadGot::report_and_fail() const { - tty->print_cr("Addr: " INTPTR_FORMAT " Code: %x %x %x", p2i(instruction_address()), - (has_rex ? ubyte_at(0) : 0), ubyte_at(rex_size), ubyte_at(rex_size + 1)); - fatal("not a indirect rip mov to rbx"); -} - -void NativeLoadGot::verify() const { - if (has_rex) { - int rex = ubyte_at(0); - if (rex != rex_prefix && rex != rex_b_prefix) { - report_and_fail(); - } - } - - int inst = ubyte_at(rex_size); - if (inst != instruction_code) { - report_and_fail(); - } - int modrm = ubyte_at(rex_size + 1); - if (modrm != modrm_rbx_code && modrm != modrm_rax_code) { - report_and_fail(); - } -} -#endif - -intptr_t NativeLoadGot::data() const { - return *(intptr_t *) got_address(); -} - -address NativePltCall::destination() const { - NativeGotJump* jump = nativeGotJump_at(plt_jump()); - return jump->destination(); -} - -address NativePltCall::plt_entry() const { - return return_address() + displacement(); -} - -address NativePltCall::plt_jump() const { - address entry = plt_entry(); - // Virtual PLT code has move instruction first - if (((NativeGotJump*)entry)->is_GotJump()) { - return entry; - } else { - return nativeLoadGot_at(entry)->next_instruction_address(); - } -} - -address NativePltCall::plt_load_got() const { - address entry = plt_entry(); - if (!((NativeGotJump*)entry)->is_GotJump()) { - // Virtual PLT code has move instruction first - return entry; - } else { - // Static PLT code has move instruction second (from c2i stub) - return nativeGotJump_at(entry)->next_instruction_address(); - } -} - -address NativePltCall::plt_c2i_stub() const { - address entry = plt_load_got(); - // This method should be called only for static calls which has C2I stub. - NativeLoadGot* load = nativeLoadGot_at(entry); - return entry; -} - -address NativePltCall::plt_resolve_call() const { - NativeGotJump* jump = nativeGotJump_at(plt_jump()); - address entry = jump->next_instruction_address(); - if (((NativeGotJump*)entry)->is_GotJump()) { - return entry; - } else { - // c2i stub 2 instructions - entry = nativeLoadGot_at(entry)->next_instruction_address(); - return nativeGotJump_at(entry)->next_instruction_address(); - } -} - -void NativePltCall::reset_to_plt_resolve_call() { - set_destination_mt_safe(plt_resolve_call()); -} - -void NativePltCall::set_destination_mt_safe(address dest) { - // rewriting the value in the GOT, it should always be aligned - NativeGotJump* jump = nativeGotJump_at(plt_jump()); - address* got = (address *) jump->got_address(); - *got = dest; -} - -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); -} - -void NativePltCall::verify() const { - // Make sure code pattern is actually a call rip+off32 instruction. - int inst = ubyte_at(0); - if (inst != instruction_code) { - tty->print_cr("Addr: " INTPTR_FORMAT " Code: 0x%x", p2i(instruction_address()), - inst); - fatal("not a call rip+off32"); - } -} - -address NativeGotJump::destination() const { - address *got_entry = (address *) got_address(); - return *got_entry; -} - -#ifdef ASSERT -void NativeGotJump::report_and_fail() const { - tty->print_cr("Addr: " INTPTR_FORMAT " Code: %x %x %x", p2i(instruction_address()), - (has_rex() ? ubyte_at(0) : 0), ubyte_at(rex_size()), ubyte_at(rex_size() + 1)); - fatal("not a indirect rip jump"); -} - -void NativeGotJump::verify() const { - if (has_rex()) { - int rex = ubyte_at(0); - if (rex != rex_prefix) { - report_and_fail(); - } - } - int inst = ubyte_at(rex_size()); - if (inst != instruction_code) { - report_and_fail(); - } - int modrm = ubyte_at(rex_size() + 1); - if (modrm != modrm_code) { - report_and_fail(); - } -} -#endif - void NativeCall::verify() { // Make sure code pattern is actually a call imm32 instruction. int inst = ubyte_at(0); @@ -565,28 +428,6 @@ void NativeJump::patch_verified_entry(address entry, address verified_entry, add } -address NativeFarJump::jump_destination() const { - NativeMovConstReg* mov = nativeMovConstReg_at(addr_at(0)); - return (address)mov->data(); -} - -void NativeFarJump::verify() { - if (is_far_jump()) { - NativeMovConstReg* mov = nativeMovConstReg_at(addr_at(0)); - NativeInstruction* jmp = nativeInstruction_at(mov->next_instruction_address()); - if (jmp->is_jump_reg()) return; - } - fatal("not a jump instruction"); -} - -void NativePopReg::insert(address code_pos, Register reg) { - assert(reg->encoding() < 8, "no space for REX"); - assert(NativePopReg::instruction_size == sizeof(char), "right address unit for update"); - *code_pos = (u_char)(instruction_code | reg->encoding()); - ICache::invalidate_range(code_pos, instruction_size); -} - - void NativeIllegalInstruction::insert(address code_pos) { assert(NativeIllegalInstruction::instruction_size == sizeof(short), "right address unit for update"); *(short *)code_pos = instruction_code; diff --git a/src/hotspot/cpu/x86/nativeInst_x86.hpp b/src/hotspot/cpu/x86/nativeInst_x86.hpp index 70cb61793661e..3a30047294429 100644 --- a/src/hotspot/cpu/x86/nativeInst_x86.hpp +++ b/src/hotspot/cpu/x86/nativeInst_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,6 @@ // - - NativeMovRegMem // - - NativeMovRegMemPatching // - - NativeJump -// - - NativeFarJump // - - NativeIllegalOpCode // - - NativeGeneralJump // - - NativeReturn @@ -64,7 +63,6 @@ class NativeInstruction { inline bool is_return(); inline bool is_jump(); inline bool is_jump_reg(); - inline bool is_far_jump(); inline bool is_cond_jump(); inline bool is_safepoint_poll(); inline bool is_mov_literal64(); @@ -104,47 +102,6 @@ inline NativeInstruction* nativeInstruction_at(address address) { return inst; } -class NativePltCall: public NativeInstruction { -public: - enum Intel_specific_constants { - instruction_code = 0xE8, - instruction_size = 5, - instruction_offset = 0, - displacement_offset = 1, - return_address_offset = 5 - }; - address instruction_address() const { return addr_at(instruction_offset); } - address next_instruction_address() const { return addr_at(return_address_offset); } - address displacement_address() const { return addr_at(displacement_offset); } - int displacement() const { return (jint) int_at(displacement_offset); } - address return_address() const { return addr_at(return_address_offset); } - address destination() const; - address plt_entry() const; - address plt_jump() const; - address plt_load_got() const; - address plt_resolve_call() const; - address plt_c2i_stub() const; - void set_stub_to_clean(); - - void reset_to_plt_resolve_call(); - void set_destination_mt_safe(address dest); - - void verify() const; -}; - -inline NativePltCall* nativePltCall_at(address address) { - NativePltCall* call = (NativePltCall*) address; -#ifdef ASSERT - call->verify(); -#endif - return call; -} - -inline NativePltCall* nativePltCall_before(address addr) { - address at = addr - NativePltCall::instruction_size; - return nativePltCall_at(at); -} - class NativeCall; inline NativeCall* nativeCall_at(address address); // The NativeCall is an abstraction for accessing/manipulating native call imm32/rel32off @@ -426,57 +383,6 @@ class NativeLoadAddress: public NativeMovRegMem { } }; -// destination is rbx or rax -// mov rbx, [rip + offset] -class NativeLoadGot: public NativeInstruction { -#ifdef AMD64 - static const bool has_rex = true; - static const int rex_size = 1; -#else - static const bool has_rex = false; - static const int rex_size = 0; -#endif - - enum Intel_specific_constants { - rex_prefix = 0x48, - rex_b_prefix = 0x49, - instruction_code = 0x8b, - modrm_rbx_code = 0x1d, - modrm_rax_code = 0x05, - instruction_length = 6 + rex_size, - offset_offset = 2 + rex_size - }; - - int rip_offset() const { return int_at(offset_offset); } - address return_address() const { return addr_at(instruction_length); } - address got_address() const { return return_address() + rip_offset(); } - -#ifdef ASSERT - void report_and_fail() const; - address instruction_address() const { return addr_at(0); } -#endif - -public: - address next_instruction_address() const { return return_address(); } - intptr_t data() const; - void set_data(intptr_t data) { - intptr_t *addr = (intptr_t *) got_address(); - *addr = data; - } - - DEBUG_ONLY( void verify() const ); -}; - -inline NativeLoadGot* nativeLoadGot_at(address addr) { - NativeLoadGot* load = (NativeLoadGot*) addr; -#ifdef ASSERT - load->verify(); -#endif - return load; -} - -// jump rel32off - class NativeJump: public NativeInstruction { public: enum Intel_specific_constants { @@ -532,26 +438,6 @@ inline NativeJump* nativeJump_at(address address) { return jump; } -// far jump reg -class NativeFarJump: public NativeInstruction { - public: - address jump_destination() const; - - // Creation - inline friend NativeFarJump* nativeFarJump_at(address address); - - void verify(); - -}; - -inline NativeFarJump* nativeFarJump_at(address address) { - NativeFarJump* jump = (NativeFarJump*)(address); -#ifdef ASSERT - jump->verify(); -#endif - return jump; -} - // Handles all kinds of jump on Intel. Long/far, conditional/unconditional class NativeGeneralJump: public NativeInstruction { public: @@ -585,61 +471,6 @@ inline NativeGeneralJump* nativeGeneralJump_at(address address) { return jump; } -class NativeGotJump: public NativeInstruction { - enum Intel_specific_constants { - rex_prefix = 0x41, - instruction_code = 0xff, - modrm_code = 0x25, - instruction_size = 6, - rip_offset = 2 - }; - - bool has_rex() const { return ubyte_at(0) == rex_prefix; } - int rex_size() const { return has_rex() ? 1 : 0; } - - address return_address() const { return addr_at(instruction_size + rex_size()); } - int got_offset() const { return (jint) int_at(rip_offset + rex_size()); } - -#ifdef ASSERT - void report_and_fail() const; - address instruction_address() const { return addr_at(0); } -#endif - -public: - address got_address() const { return return_address() + got_offset(); } - address next_instruction_address() const { return return_address(); } - bool is_GotJump() const { return ubyte_at(rex_size()) == instruction_code; } - - address destination() const; - void set_jump_destination(address dest) { - address *got_entry = (address *) got_address(); - *got_entry = dest; - } - - DEBUG_ONLY( void verify() const; ) -}; - -inline NativeGotJump* nativeGotJump_at(address addr) { - NativeGotJump* jump = (NativeGotJump*)(addr); - debug_only(jump->verify()); - return jump; -} - -class NativePopReg : public NativeInstruction { - public: - enum Intel_specific_constants { - instruction_code = 0x58, - instruction_size = 1, - instruction_offset = 0, - data_offset = 1, - next_instruction_offset = 1 - }; - - // Insert a pop instruction - static void insert(address code_pos, Register reg); -}; - - class NativeIllegalInstruction: public NativeInstruction { public: enum Intel_specific_constants { @@ -702,7 +533,6 @@ inline bool NativeInstruction::is_jump_reg() { if (ubyte_at(0) == Assembler::REX_B) pos = 1; return ubyte_at(pos) == 0xFF && (ubyte_at(pos + 1) & 0xF0) == 0xE0; } -inline bool NativeInstruction::is_far_jump() { return is_mov_literal64(); } inline bool NativeInstruction::is_cond_jump() { return (int_at(0) & 0xF0FF) == 0x800F /* long jump */ || (ubyte_at(0) & 0xF0) == 0x70; /* short jump */ } inline bool NativeInstruction::is_safepoint_poll() { From e965d70a7425bec78620a2ca8bfaca3c392edf6a Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Tue, 18 Jun 2024 16:15:09 +0000 Subject: [PATCH 101/471] 8333876: C2 SuperWord: regression after JDK-8325155: failed: internal connection Reviewed-by: kvn, roland --- src/hotspot/share/opto/superword.cpp | 8 +-- .../superword/TestParallelReduction.java | 60 +++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp index 5cd4341c42d0d..f78a9b63926fd 100644 --- a/src/hotspot/share/opto/superword.cpp +++ b/src/hotspot/share/opto/superword.cpp @@ -2755,11 +2755,11 @@ bool SuperWord::is_vector_use(Node* use, int u_idx) const { // Reduction: first input is internal connection. if (is_marked_reduction(use) && u_idx == 1) { -#ifdef ASSERT - for (uint i = 1; i < u_pk->size(); i++) { - assert(u_pk->at(i - 1) == u_pk->at(i)->in(1), "internal connection"); + for (uint i = 1; i < u_pk->size(); i++) { + if (u_pk->at(i - 1) != u_pk->at(i)->in(1)) { + return false; // not internally connected } -#endif + } return true; } diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java new file mode 100644 index 0000000000000..2062469edb025 --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.loopopts.superword; + +/* + * @test + * @bug 8333876 + * @summary Test parallel reductions. + * @run main compiler.loopopts.superword.TestParallelReduction + */ + +public class TestParallelReduction { + static int RANGE = 10_000; + + public static void main(String[] args) { + float[] a = new float[RANGE]; + for (int i = 0; i < a.length; i++) { + a[i] = i; + } + + float gold = test(a); + + for (int i = 0; i < 10_000; i++) { + if (test(a) != gold) { + throw new RuntimeException("wrong value"); + } + } + } + + static float test(float[] a) { + float x = 0; + float y = 0; + for (int i = 0; i < a.length; i+=2) { + x += a[i+0]; + y += a[i+1]; + } + return x+y; + } +} From 2ce85d96352cef4910cb6a5c2d9b174ca9d8a4e4 Mon Sep 17 00:00:00 2001 From: Alisen Chung <achung@openjdk.org> Date: Tue, 18 Jun 2024 21:31:16 +0000 Subject: [PATCH 102/471] 8291472: [macos] jawt 1.4 lock/unlock not supported Reviewed-by: serb --- src/java.desktop/macosx/native/libjawt/jawt.m | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/java.desktop/macosx/native/libjawt/jawt.m b/src/java.desktop/macosx/native/libjawt/jawt.m index f5dc048a482f6..36d4e897f608d 100644 --- a/src/java.desktop/macosx/native/libjawt/jawt.m +++ b/src/java.desktop/macosx/native/libjawt/jawt.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,15 +55,14 @@ awt->GetDrawingSurface = awt_GetDrawingSurface; awt->FreeDrawingSurface = awt_FreeDrawingSurface; - if (awt->version >= JAWT_VERSION_1_4) { - awt->Lock = awt_Lock; - awt->Unlock = awt_Unlock; - awt->GetComponent = awt_GetComponent; - if (awt->version >= JAWT_VERSION_9) { - awt->CreateEmbeddedFrame = awt_CreateEmbeddedFrame; - awt->SetBounds = awt_SetBounds; - awt->SynthesizeWindowActivation = awt_SynthesizeWindowActivation; - } + + awt->Lock = awt_Lock; + awt->Unlock = awt_Unlock; + awt->GetComponent = awt_GetComponent; + if (awt->version >= JAWT_VERSION_9) { + awt->CreateEmbeddedFrame = awt_CreateEmbeddedFrame; + awt->SetBounds = awt_SetBounds; + awt->SynthesizeWindowActivation = awt_SynthesizeWindowActivation; } return JNI_TRUE; From e227c7e37d4de0656f013f3a936b1acfa56cc2e0 Mon Sep 17 00:00:00 2001 From: Archie Cobbs <acobbs@openjdk.org> Date: Tue, 18 Jun 2024 23:23:39 +0000 Subject: [PATCH 103/471] 8334258: Compiler erronousely allows access to instance variable in argument expression of a constructor invocation Reviewed-by: mcimadamore --- .../com/sun/tools/javac/comp/Resolve.java | 23 +++++++++++-------- .../SuperInit/EarlyAssignmentNoPreview1.java | 21 +++++++++++++++++ .../SuperInit/EarlyAssignmentNoPreview1.out | 2 ++ .../SuperInit/EarlyAssignmentNoPreview2.java | 21 +++++++++++++++++ .../SuperInit/EarlyAssignmentNoPreview2.out | 2 ++ .../SuperInit/EarlyAssignmentNoPreview3.java | 21 +++++++++++++++++ .../SuperInit/EarlyAssignmentNoPreview3.out | 2 ++ 7 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.out create mode 100644 test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.out create mode 100644 test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index 3dcac0b26461f..079a0bc5c6a46 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -100,6 +100,7 @@ public class Resolve { DeferredAttr deferredAttr; Check chk; Infer infer; + Preview preview; ClassFinder finder; ModuleFinder moduleFinder; Types types; @@ -135,7 +136,7 @@ protected Resolve(Context context) { moduleFinder = ModuleFinder.instance(context); types = Types.instance(context); diags = JCDiagnostic.Factory.instance(context); - Preview preview = Preview.instance(context); + preview = Preview.instance(context); Source source = Source.instance(context); Options options = Options.instance(context); compactMethodDiags = options.isSet(Option.XDIAGS, "compact") || @@ -1480,10 +1481,11 @@ else throw new FatalError( /** Find unqualified variable or field with given name. * Synthetic fields always skipped. + * @param pos The position to use for error reporting. * @param env The current environment. * @param name The name of the variable or field. */ - Symbol findVar(Env<AttrContext> env, Name name) { + Symbol findVar(DiagnosticPosition pos, Env<AttrContext> env, Name name) { Symbol bestSoFar = varNotFound; Env<AttrContext> env1 = env; boolean staticOnly = false; @@ -1508,7 +1510,7 @@ Symbol findVar(Env<AttrContext> env, Name name) { (sym.flags() & STATIC) == 0) { if (staticOnly) return new StaticError(sym); - if (env1.info.ctorPrologue && !isAllowedEarlyReference(env1, (VarSymbol)sym)) + if (env1.info.ctorPrologue && !isAllowedEarlyReference(pos, env1, (VarSymbol)sym)) return new RefBeforeCtorCalledError(sym); } return sym; @@ -2421,15 +2423,15 @@ Symbol findType(Env<AttrContext> env, Name name) { * (a subset of VAL, TYP, PCK). */ Symbol findIdent(DiagnosticPosition pos, Env<AttrContext> env, Name name, KindSelector kind) { - return checkNonExistentType(checkRestrictedType(pos, findIdentInternal(env, name, kind), name)); + return checkNonExistentType(checkRestrictedType(pos, findIdentInternal(pos, env, name, kind), name)); } - Symbol findIdentInternal(Env<AttrContext> env, Name name, KindSelector kind) { + Symbol findIdentInternal(DiagnosticPosition pos, Env<AttrContext> env, Name name, KindSelector kind) { Symbol bestSoFar = typeNotFound; Symbol sym; if (kind.contains(KindSelector.VAL)) { - sym = findVar(env, name); + sym = findVar(pos, env, name); if (sym.exists()) return sym; else bestSoFar = bestOf(bestSoFar, sym); } @@ -3776,7 +3778,7 @@ Symbol resolveSelf(DiagnosticPosition pos, if (sym != null) { if (staticOnly) sym = new StaticError(sym); - else if (env1.info.ctorPrologue && !isAllowedEarlyReference(env1, (VarSymbol)sym)) + else if (env1.info.ctorPrologue && !isAllowedEarlyReference(pos, env1, (VarSymbol)sym)) sym = new RefBeforeCtorCalledError(sym); return accessBase(sym, pos, env.enclClass.sym.type, name, true); @@ -3845,7 +3847,7 @@ private List<Type> pruneInterfaces(Type t) { * We also don't verify that the field has no initializer, which is required. * To catch those cases, we rely on similar logic in Attr.checkAssignable(). */ - private boolean isAllowedEarlyReference(Env<AttrContext> env, VarSymbol v) { + private boolean isAllowedEarlyReference(DiagnosticPosition pos, Env<AttrContext> env, VarSymbol v) { // Check assumptions Assert.check(env.info.ctorPrologue); @@ -3880,6 +3882,9 @@ private boolean isAllowedEarlyReference(Env<AttrContext> env, VarSymbol v) { if (isEarlyReference(env, base, v) && v.owner != env.enclClass.sym) return false; + // The flexible constructors feature must be enabled + preview.checkSourceLevel(pos, Feature.FLEXIBLE_CONSTRUCTORS); + // OK return true; } diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.java b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.java new file mode 100644 index 0000000000000..abb6bacbc8fc9 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.java @@ -0,0 +1,21 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8334258 + * @summary Disallow early assignment if FLEXIBLE_CONSTRUCTORS preview feature is not enabled + * @compile/fail/ref=EarlyAssignmentNoPreview1.out -XDrawDiagnostics EarlyAssignmentNoPreview1.java + */ +public class EarlyAssignmentNoPreview1 { + + Runnable r; + + public EarlyAssignmentNoPreview1() { + this(r = () -> System.out.println("hello")); + } + + public EarlyAssignmentNoPreview1(Runnable r) { + } + + public static void main(String[] args) { + new EarlyAssignmentNoPreview1(); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.out b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.out new file mode 100644 index 0000000000000..6c5afbbd12bb4 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.out @@ -0,0 +1,2 @@ +EarlyAssignmentNoPreview1.java:12:14: compiler.err.preview.feature.disabled: (compiler.misc.feature.flexible.constructors) +1 error diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.java b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.java new file mode 100644 index 0000000000000..3c33734f42a55 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.java @@ -0,0 +1,21 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8334258 + * @summary Disallow early assignment if FLEXIBLE_CONSTRUCTORS preview feature is not enabled + * @compile/fail/ref=EarlyAssignmentNoPreview2.out -XDrawDiagnostics EarlyAssignmentNoPreview2.java + */ +public class EarlyAssignmentNoPreview2 { + + Runnable r; + + public EarlyAssignmentNoPreview2() { + this(this.r = () -> System.out.println("hello")); + } + + public EarlyAssignmentNoPreview2(Runnable r) { + } + + public static void main(String[] args) { + new EarlyAssignmentNoPreview2(); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.out b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.out new file mode 100644 index 0000000000000..38fb885684e1d --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.out @@ -0,0 +1,2 @@ +EarlyAssignmentNoPreview2.java:12:14: compiler.err.preview.feature.disabled: (compiler.misc.feature.flexible.constructors) +1 error diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.java b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.java new file mode 100644 index 0000000000000..f6269f2cb1fdc --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.java @@ -0,0 +1,21 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8334258 + * @summary Disallow early assignment if FLEXIBLE_CONSTRUCTORS preview feature is not enabled + * @compile/fail/ref=EarlyAssignmentNoPreview3.out -XDrawDiagnostics EarlyAssignmentNoPreview3.java + */ +public class EarlyAssignmentNoPreview3 { + + Runnable r; + + public EarlyAssignmentNoPreview3() { + this(EarlyAssignmentNoPreview3.this.r = () -> System.out.println("hello")); + } + + public EarlyAssignmentNoPreview3(Runnable r) { + } + + public static void main(String[] args) { + new EarlyAssignmentNoPreview3(); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.out b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.out new file mode 100644 index 0000000000000..def9f4f3722f1 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.out @@ -0,0 +1,2 @@ +EarlyAssignmentNoPreview3.java:12:39: compiler.err.preview.feature.disabled: (compiler.misc.feature.flexible.constructors) +1 error From 48621ae193ef70b2fae4dcb7ddc524f349beb131 Mon Sep 17 00:00:00 2001 From: Christian Hagedorn <chagedorn@openjdk.org> Date: Wed, 19 Jun 2024 06:45:04 +0000 Subject: [PATCH 104/471] 8331168: Introduce PredicateEntryIterator to iterate through predicate entries Reviewed-by: roland, kvn --- src/hotspot/share/opto/loopnode.cpp | 54 +++++++++++------------- src/hotspot/share/opto/loopnode.hpp | 6 ++- src/hotspot/share/opto/loopopts.cpp | 2 +- src/hotspot/share/opto/predicates.cpp | 59 ++++++++++++++++++++++----- src/hotspot/share/opto/predicates.hpp | 48 ++++++++++++++++++---- 5 files changed, 118 insertions(+), 51 deletions(-) diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index d58be5105169a..6c16d7cc6a4e6 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -169,10 +169,10 @@ Node *PhaseIdealLoop::get_early_ctrl_for_expensive(Node *n, Node* earliest) { return earliest; } - while (1) { - Node *next = ctl; - // Moving the node out of a loop on the projection of a If - // confuses loop predication. So once we hit a Loop in a If branch + while (true) { + Node* next = ctl; + // Moving the node out of a loop on the projection of an If + // confuses Loop Predication. So, once we hit a loop in an If branch // that doesn't branch to an UNC, we stop. The code that process // expensive nodes will notice the loop and skip over it to try to // move the node further up. @@ -6081,20 +6081,27 @@ Node* PhaseIdealLoop::get_late_ctrl_with_anti_dep(LoadNode* n, Node* early, Node return LCA; } -// true if CFG node d dominates CFG node n -bool PhaseIdealLoop::is_dominator(Node *d, Node *n) { - if (d == n) +// Is CFG node 'dominator' dominating node 'n'? +bool PhaseIdealLoop::is_dominator(Node* dominator, Node* n) { + if (dominator == n) { return true; - assert(d->is_CFG() && n->is_CFG(), "must have CFG nodes"); - uint dd = dom_depth(d); + } + assert(dominator->is_CFG() && n->is_CFG(), "must have CFG nodes"); + uint dd = dom_depth(dominator); while (dom_depth(n) >= dd) { - if (n == d) + if (n == dominator) { return true; + } n = idom(n); } return false; } +// Is CFG node 'dominator' strictly dominating node 'n'? +bool PhaseIdealLoop::is_strict_dominator(Node* dominator, Node* n) { + return dominator != n && is_dominator(dominator, n); +} + //------------------------------dom_lca_for_get_late_ctrl_internal------------- // Pair-wise LCA with tags. // Tag each index with the node 'tag' currently being processed @@ -6377,31 +6384,16 @@ void PhaseIdealLoop::build_loop_late_post_work(Node *n, bool pinned) { if (least != early) { // Move the node above predicates as far up as possible so a - // following pass of loop predication doesn't hoist a predicate + // following pass of Loop Predication doesn't hoist a predicate // that depends on it above that node. - Node* new_ctrl = least; - for (;;) { - if (!new_ctrl->is_Proj()) { - break; - } - CallStaticJavaNode* call = new_ctrl->as_Proj()->is_uncommon_trap_if_pattern(); - if (call == nullptr) { - break; - } - int req = call->uncommon_trap_request(); - Deoptimization::DeoptReason trap_reason = Deoptimization::trap_request_reason(req); - if (trap_reason != Deoptimization::Reason_loop_limit_check && - trap_reason != Deoptimization::Reason_predicate && - trap_reason != Deoptimization::Reason_profile_predicate) { - break; - } - Node* c = new_ctrl->in(0)->in(0); - if (is_dominator(c, early) && c != early) { + PredicateEntryIterator predicate_iterator(least); + while (predicate_iterator.has_next()) { + Node* next_predicate_entry = predicate_iterator.next_entry(); + if (is_strict_dominator(next_predicate_entry, early)) { break; } - new_ctrl = c; + least = next_predicate_entry; } - least = new_ctrl; } // Try not to place code on a loop entry projection // which can inhibit range check elimination. diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp index 90ef4da4f1e0e..8d9d4b3e0e543 100644 --- a/src/hotspot/share/opto/loopnode.hpp +++ b/src/hotspot/share/opto/loopnode.hpp @@ -1011,8 +1011,10 @@ class PhaseIdealLoop : public PhaseTransform { assert(n == find_non_split_ctrl(n), "must return legal ctrl" ); return n; } - // true if CFG node d dominates CFG node n - bool is_dominator(Node *d, Node *n); + + bool is_dominator(Node* dominator, Node* n); + bool is_strict_dominator(Node* dominator, Node* n); + // return get_ctrl for a data node and self(n) for a CFG node Node* ctrl_or_self(Node* n) { if (has_ctrl(n)) diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp index b19c71fdd8689..23b2edce6549a 100644 --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -4294,7 +4294,7 @@ bool PhaseIdealLoop::duplicate_loop_backedge(IdealLoopTree *loop, Node_List &old } else { wq.push(c->in(0)); } - assert(!is_dominator(c, region) || c == region, "shouldn't go above region"); + assert(!is_strict_dominator(c, region), "shouldn't go above region"); } Node* region_dom = idom(region); diff --git a/src/hotspot/share/opto/predicates.cpp b/src/hotspot/share/opto/predicates.cpp index 9f782f34bdbb8..5b0de2e02d5f0 100644 --- a/src/hotspot/share/opto/predicates.cpp +++ b/src/hotspot/share/opto/predicates.cpp @@ -32,29 +32,29 @@ // (i.e. not belonging to an Initialized Assertion Predicate anymore) Node* AssertionPredicatesWithHalt::find_entry(Node* start_proj) { Node* entry = start_proj; - while (is_assertion_predicate_success_proj(entry)) { + while (AssertionPredicateWithHalt::is_predicate(entry)) { entry = entry->in(0)->in(0); } return entry; } -bool AssertionPredicatesWithHalt::is_assertion_predicate_success_proj(const Node* predicate_proj) { - if (predicate_proj == nullptr || !predicate_proj->is_IfProj() || !predicate_proj->in(0)->is_If()) { +bool AssertionPredicateWithHalt::is_predicate(const Node* maybe_success_proj) { + if (maybe_success_proj == nullptr || !maybe_success_proj->is_IfProj() || !maybe_success_proj->in(0)->is_If()) { return false; } - return has_assertion_predicate_opaque(predicate_proj) && has_halt(predicate_proj); + return has_assertion_predicate_opaque(maybe_success_proj) && has_halt(maybe_success_proj); } // Check if the If node of `predicate_proj` has an Opaque4 (Template Assertion Predicate) or an // OpaqueInitializedAssertionPredicate (Initialized Assertion Predicate) node as input. -bool AssertionPredicatesWithHalt::has_assertion_predicate_opaque(const Node* predicate_proj) { +bool AssertionPredicateWithHalt::has_assertion_predicate_opaque(const Node* predicate_proj) { IfNode* iff = predicate_proj->in(0)->as_If(); Node* bol = iff->in(1); return bol->is_Opaque4() || bol->is_OpaqueInitializedAssertionPredicate(); } // Check if the other projection (UCT projection) of `success_proj` has a Halt node as output. -bool AssertionPredicatesWithHalt::has_halt(const Node* success_proj) { +bool AssertionPredicateWithHalt::has_halt(const Node* success_proj) { ProjNode* other_proj = success_proj->as_IfProj()->other_if_proj(); return other_proj->outcnt() == 1 && other_proj->unique_out()->Opcode() == Op_Halt; } @@ -72,7 +72,15 @@ ParsePredicateNode* ParsePredicate::init_parse_predicate(Node* parse_predicate_p return nullptr; } -Deoptimization::DeoptReason RuntimePredicate::uncommon_trap_reason(IfProjNode* if_proj) { +bool ParsePredicate::is_predicate(Node* maybe_success_proj) { + if (!maybe_success_proj->is_IfProj()) { + return false; + } + IfNode* if_node = maybe_success_proj->in(0)->as_If(); + return if_node->is_ParsePredicate(); +} + +Deoptimization::DeoptReason RegularPredicateWithUCT::uncommon_trap_reason(IfProjNode* if_proj) { CallStaticJavaNode* uct_call = if_proj->is_uncommon_trap_if_pattern(); if (uct_call == nullptr) { return Deoptimization::Reason_none; @@ -80,8 +88,20 @@ Deoptimization::DeoptReason RuntimePredicate::uncommon_trap_reason(IfProjNode* i return Deoptimization::trap_request_reason(uct_call->uncommon_trap_request()); } -bool RuntimePredicate::is_success_proj(Node* node, Deoptimization::DeoptReason deopt_reason) { - if (may_be_runtime_predicate_if(node)) { +bool RegularPredicateWithUCT::is_predicate(Node* maybe_success_proj) { + if (may_be_predicate_if(maybe_success_proj)) { + IfProjNode* success_proj = maybe_success_proj->as_IfProj(); + const Deoptimization::DeoptReason deopt_reason = uncommon_trap_reason(success_proj); + return (deopt_reason == Deoptimization::Reason_loop_limit_check || + deopt_reason == Deoptimization::Reason_predicate || + deopt_reason == Deoptimization::Reason_profile_predicate); + } else { + return false; + } +} + +bool RegularPredicateWithUCT::is_predicate(Node* node, Deoptimization::DeoptReason deopt_reason) { + if (may_be_predicate_if(node)) { return deopt_reason == uncommon_trap_reason(node->as_IfProj()); } else { return false; @@ -89,7 +109,7 @@ bool RuntimePredicate::is_success_proj(Node* node, Deoptimization::DeoptReason d } // A Runtime Predicate must have an If or a RangeCheck node, while the If should not be a zero trip guard check. -bool RuntimePredicate::may_be_runtime_predicate_if(Node* node) { +bool RegularPredicateWithUCT::may_be_predicate_if(Node* node) { if (node->is_IfProj()) { const IfNode* if_node = node->in(0)->as_If(); const int opcode_if = if_node->Opcode(); @@ -101,6 +121,10 @@ bool RuntimePredicate::may_be_runtime_predicate_if(Node* node) { return false; } +bool RuntimePredicate::is_success_proj(Node* node, Deoptimization::DeoptReason deopt_reason) { + return RegularPredicateWithUCT::is_predicate(node, deopt_reason); +} + ParsePredicateIterator::ParsePredicateIterator(const Predicates& predicates) : _current_index(0) { const PredicateBlock* loop_limit_check_predicate_block = predicates.loop_limit_check_predicate_block(); if (loop_limit_check_predicate_block->has_parse_predicate()) { @@ -356,3 +380,18 @@ bool TemplateAssertionPredicateExpressionNode::is_in_expression(Node* node) { bool TemplateAssertionPredicateExpressionNode::is_template_assertion_predicate(Node* node) { return node->is_If() && node->in(1)->is_Opaque4(); } + +// Is current node pointed to by iterator a predicate? +bool PredicateEntryIterator::has_next() const { + return ParsePredicate::is_predicate(_current) || + RegularPredicateWithUCT::is_predicate(_current) || + AssertionPredicateWithHalt::is_predicate(_current); +} + +// Skip the current predicate pointed to by iterator by returning the input into the predicate. This could possibly be +// a non-predicate node. +Node* PredicateEntryIterator::next_entry() { + assert(has_next(), "current must be predicate"); + _current = _current->in(0)->in(0); + return _current; +} diff --git a/src/hotspot/share/opto/predicates.hpp b/src/hotspot/share/opto/predicates.hpp index bf12aeb6a5163..9cac98eb9936f 100644 --- a/src/hotspot/share/opto/predicates.hpp +++ b/src/hotspot/share/opto/predicates.hpp @@ -26,6 +26,7 @@ #define SHARE_OPTO_PREDICATES_HPP #include "opto/cfgnode.hpp" +#include "opto/connode.hpp" #include "opto/opaquenode.hpp" /* @@ -199,9 +200,6 @@ class AssertionPredicatesWithHalt : public StackObj { Node* _entry; static Node* find_entry(Node* start_proj); - static bool has_assertion_predicate_opaque(const Node* predicate_proj); - static bool has_halt(const Node* success_proj); - static bool is_assertion_predicate_success_proj(const Node* predicate_proj); public: AssertionPredicatesWithHalt(Node* assertion_predicate_proj) : _entry(find_entry(assertion_predicate_proj)) {} @@ -213,13 +211,37 @@ class AssertionPredicatesWithHalt : public StackObj { } }; +// Class to represent a single Assertion Predicate with a HaltNode. This could either be: +// - A Template Assertion Predicate. +// - An Initialized Assertion Predicate. +// Note that all other Regular Predicates have an UCT node. +class AssertionPredicateWithHalt : public StackObj { + static bool has_assertion_predicate_opaque(const Node* predicate_proj); + static bool has_halt(const Node* success_proj); + public: + static bool is_predicate(const Node* maybe_success_proj); +}; + +// Class to represent a single Regular Predicate with an UCT. This could either be: +// - A Runtime Predicate +// - A Template Assertion Predicate +// Note that all other Regular Predicates have a Halt node. +class RegularPredicateWithUCT : public StackObj { + static Deoptimization::DeoptReason uncommon_trap_reason(IfProjNode* if_proj); + static bool may_be_predicate_if(Node* node); + + public: + static bool is_predicate(Node* maybe_success_proj); + static bool is_predicate(Node* node, Deoptimization::DeoptReason deopt_reason); +}; + // Class to represent a Parse Predicate. class ParsePredicate : public StackObj { ParsePredicateSuccessProj* _success_proj; ParsePredicateNode* _parse_predicate_node; Node* _entry; - IfTrueNode* init_success_proj(const Node* parse_predicate_proj) const { + static IfTrueNode* init_success_proj(const Node* parse_predicate_proj) { assert(parse_predicate_proj != nullptr, "must not be null"); return parse_predicate_proj->isa_IfTrue(); } @@ -253,13 +275,12 @@ class ParsePredicate : public StackObj { assert(is_valid(), "must be valid"); return _success_proj; } + + static bool is_predicate(Node* maybe_success_proj); }; // Utility class for queries on Runtime Predicates. class RuntimePredicate : public StackObj { - static Deoptimization::DeoptReason uncommon_trap_reason(IfProjNode* if_proj); - static bool may_be_runtime_predicate_if(Node* node); - public: static bool is_success_proj(Node* node, Deoptimization::DeoptReason deopt_reason); }; @@ -473,4 +494,17 @@ class ParsePredicateIterator : public StackObj { ParsePredicateNode* next(); }; + +// Special predicate iterator that can be used to walk through predicate entries, regardless of whether the predicate +// belongs to the same loop or not (i.e. leftovers from already folded nodes). The iterator returns the next entry +// to a predicate. +class PredicateEntryIterator : public StackObj { + Node* _current; + + public: + explicit PredicateEntryIterator(Node* start) : _current(start) {}; + + bool has_next() const; + Node* next_entry(); +}; #endif // SHARE_OPTO_PREDICATES_HPP From 2165a053e8bf56220af8ef1ef50708364f555931 Mon Sep 17 00:00:00 2001 From: Yudi Zheng <yzheng@openjdk.org> Date: Wed, 19 Jun 2024 09:04:12 +0000 Subject: [PATCH 105/471] 8334399: [JVMCI] Implement JVMCICompiler::is_intrinsic_supported Reviewed-by: dnsimon --- src/hotspot/share/jvmci/jvmciCompiler.cpp | 11 +++++++- src/hotspot/share/jvmci/jvmciCompiler.hpp | 4 ++- src/hotspot/share/jvmci/jvmciEnv.cpp | 27 ++++++++++++++++++- src/hotspot/share/jvmci/jvmciEnv.hpp | 4 ++- src/hotspot/share/jvmci/jvmciJavaClasses.hpp | 3 ++- src/hotspot/share/jvmci/jvmciRuntime.cpp | 10 +++++++ src/hotspot/share/jvmci/jvmciRuntime.hpp | 3 +++ src/hotspot/share/jvmci/vmSymbols_jvmci.hpp | 3 ++- .../vm/ci/hotspot/HotSpotJVMCIRuntime.java | 8 +++++- .../vm/ci/hotspot/HotSpotVMConfigStore.java | 23 +++++++++++++++- .../jdk/vm/ci/runtime/JVMCICompiler.java | 13 ++++++++- 11 files changed, 100 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/jvmci/jvmciCompiler.cpp b/src/hotspot/share/jvmci/jvmciCompiler.cpp index 5be065aadadcc..2b8684f7ab85b 100644 --- a/src/hotspot/share/jvmci/jvmciCompiler.cpp +++ b/src/hotspot/share/jvmci/jvmciCompiler.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -200,6 +200,15 @@ void JVMCICompiler::print_timers() { _hosted_code_installs.print_on(tty, " Install Code: "); } +bool JVMCICompiler::is_intrinsic_supported(const methodHandle& method) { + vmIntrinsics::ID id = method->intrinsic_id(); + assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); + JavaThread* thread = JavaThread::current(); + JVMCIEnv jvmciEnv(thread, __FILE__, __LINE__); + JVMCIRuntime* runtime = JVMCI::compiler_runtime(thread, false); + return runtime->is_intrinsic_supported(&jvmciEnv, (jint) id); +} + void JVMCICompiler::CodeInstallStats::print_on(outputStream* st, const char* prefix) const { double time = _timer.seconds(); st->print_cr("%s%7.3f s (installs: %d, CodeBlob total size: %d, CodeBlob code size: %d)", diff --git a/src/hotspot/share/jvmci/jvmciCompiler.hpp b/src/hotspot/share/jvmci/jvmciCompiler.hpp index bdb50cfc26a89..0d03bd08bf65b 100644 --- a/src/hotspot/share/jvmci/jvmciCompiler.hpp +++ b/src/hotspot/share/jvmci/jvmciCompiler.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -136,6 +136,8 @@ class JVMCICompiler : public AbstractCompiler { // Print compilation timers and statistics virtual void print_timers(); + virtual bool is_intrinsic_supported(const methodHandle& method); + // Gets the number of methods that have been successfully compiled by // a call to JVMCICompiler::compile_method(). int methods_compiled() { return _methods_compiled; } diff --git a/src/hotspot/share/jvmci/jvmciEnv.cpp b/src/hotspot/share/jvmci/jvmciEnv.cpp index 624b25b9e2c7b..01b78b45b2a8e 100644 --- a/src/hotspot/share/jvmci/jvmciEnv.cpp +++ b/src/hotspot/share/jvmci/jvmciEnv.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -967,6 +967,31 @@ jboolean JVMCIEnv::call_HotSpotJVMCIRuntime_isGCSupported (JVMCIObject runtime, } } +jboolean JVMCIEnv::call_HotSpotJVMCIRuntime_isIntrinsicSupported (JVMCIObject runtime, jint intrinsicIdentifier) { + JavaThread* THREAD = JavaThread::current(); // For exception macros. + if (is_hotspot()) { + JavaCallArguments jargs; + jargs.push_oop(Handle(THREAD, HotSpotJVMCI::resolve(runtime))); + jargs.push_int(intrinsicIdentifier); + JavaValue result(T_BOOLEAN); + JavaCalls::call_special(&result, + HotSpotJVMCI::HotSpotJVMCIRuntime::klass(), + vmSymbols::isIntrinsicSupported_name(), + vmSymbols::int_bool_signature(), &jargs, CHECK_0); + return result.get_jboolean(); + } else { + JNIAccessMark jni(this, THREAD); + jboolean result = jni()->CallNonvirtualBooleanMethod(runtime.as_jobject(), + JNIJVMCI::HotSpotJVMCIRuntime::clazz(), + JNIJVMCI::HotSpotJVMCIRuntime::isIntrinsicSupported_method(), + intrinsicIdentifier); + if (jni()->ExceptionCheck()) { + return false; + } + return result; + } +} + JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_compileMethod (JVMCIObject runtime, JVMCIObject method, int entry_bci, jlong compile_state, int id) { JavaThread* THREAD = JVMCI::compilation_tick(JavaThread::current()); // For exception macros. diff --git a/src/hotspot/share/jvmci/jvmciEnv.hpp b/src/hotspot/share/jvmci/jvmciEnv.hpp index b3aa487f34c64..69f6647b0d618 100644 --- a/src/hotspot/share/jvmci/jvmciEnv.hpp +++ b/src/hotspot/share/jvmci/jvmciEnv.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -359,6 +359,8 @@ class JVMCIEnv : public ResourceObj { jboolean call_HotSpotJVMCIRuntime_isGCSupported(JVMCIObject runtime, jint gcIdentifier); + jboolean call_HotSpotJVMCIRuntime_isIntrinsicSupported(JVMCIObject runtime, jint intrinsicIdentifier); + void call_HotSpotJVMCIRuntime_postTranslation(JVMCIObject object, JVMCI_TRAPS); // Converts the JavaKind.typeChar value in `ch` to a BasicType diff --git a/src/hotspot/share/jvmci/jvmciJavaClasses.hpp b/src/hotspot/share/jvmci/jvmciJavaClasses.hpp index 3561093caaa25..d5fcd2aaaba30 100644 --- a/src/hotspot/share/jvmci/jvmciJavaClasses.hpp +++ b/src/hotspot/share/jvmci/jvmciJavaClasses.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -202,6 +202,7 @@ objectarray_field(HotSpotJVMCIRuntime, excludeFromJVMCICompilation, "[Ljava/lang/Module;") \ jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, compileMethod, compileMethod_signature) \ jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, isGCSupported, int_bool_signature) \ + jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, isIntrinsicSupported, int_bool_signature) \ jvmci_method(CallNonvirtualVoidMethod, GetMethodID, call_special, void, HotSpotJVMCIRuntime, bootstrapFinished, void_method_signature) \ jvmci_method(CallNonvirtualVoidMethod, GetMethodID, call_special, void, HotSpotJVMCIRuntime, shutdown, void_method_signature) \ jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, HotSpotJVMCIRuntime, runtime, runtime_signature) \ diff --git a/src/hotspot/share/jvmci/jvmciRuntime.cpp b/src/hotspot/share/jvmci/jvmciRuntime.cpp index 9dc0e381df937..504fbfcb1b078 100644 --- a/src/hotspot/share/jvmci/jvmciRuntime.cpp +++ b/src/hotspot/share/jvmci/jvmciRuntime.cpp @@ -2050,6 +2050,16 @@ bool JVMCIRuntime::is_gc_supported(JVMCIEnv* JVMCIENV, CollectedHeap::Name name) return JVMCIENV->call_HotSpotJVMCIRuntime_isGCSupported(receiver, (int) name); } +bool JVMCIRuntime::is_intrinsic_supported(JVMCIEnv* JVMCIENV, jint id) { + JVMCI_EXCEPTION_CONTEXT + + JVMCIObject receiver = get_HotSpotJVMCIRuntime(JVMCIENV); + if (JVMCIENV->has_pending_exception()) { + fatal_exception(JVMCIENV, "Exception during HotSpotJVMCIRuntime initialization"); + } + return JVMCIENV->call_HotSpotJVMCIRuntime_isIntrinsicSupported(receiver, id); +} + // ------------------------------------------------------------------ JVMCI::CodeInstallResult JVMCIRuntime::register_method(JVMCIEnv* JVMCIENV, const methodHandle& method, diff --git a/src/hotspot/share/jvmci/jvmciRuntime.hpp b/src/hotspot/share/jvmci/jvmciRuntime.hpp index 123cfde15ac63..bc5bee4edebee 100644 --- a/src/hotspot/share/jvmci/jvmciRuntime.hpp +++ b/src/hotspot/share/jvmci/jvmciRuntime.hpp @@ -431,6 +431,9 @@ class JVMCIRuntime: public CHeapObj<mtJVMCI> { // Determines if the GC identified by `name` is supported by the JVMCI compiler. bool is_gc_supported(JVMCIEnv* JVMCIENV, CollectedHeap::Name name); + // Determines if the intrinsic identified by `id` is supported by the JVMCI compiler. + bool is_intrinsic_supported(JVMCIEnv* JVMCIENV, jint id); + // Register the result of a compilation. JVMCI::CodeInstallResult register_method(JVMCIEnv* JVMCIENV, const methodHandle& target, diff --git a/src/hotspot/share/jvmci/vmSymbols_jvmci.hpp b/src/hotspot/share/jvmci/vmSymbols_jvmci.hpp index 13d81d9f2864f..c0a7afe2b63cf 100644 --- a/src/hotspot/share/jvmci/vmSymbols_jvmci.hpp +++ b/src/hotspot/share/jvmci/vmSymbols_jvmci.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,6 +81,7 @@ template(compileMethod_name, "compileMethod") \ template(compileMethod_signature, "(Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;IJI)Ljdk/vm/ci/hotspot/HotSpotCompilationRequestResult;") \ template(isGCSupported_name, "isGCSupported") \ + template(isIntrinsicSupported_name, "isIntrinsicSupported") \ template(fromMetaspace_name, "fromMetaspace") \ template(method_fromMetaspace_signature, "(JLjdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;)Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \ template(constantPool_fromMetaspace_signature, "(J)Ljdk/vm/ci/hotspot/HotSpotConstantPool;") \ diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java index 87cd10b400f10..3dcf855ff230f 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -987,6 +987,12 @@ private boolean isGCSupported(int gcIdentifier) { return getCompiler().isGCSupported(gcIdentifier); } + @SuppressWarnings("try") + @VMEntryPoint + private boolean isIntrinsicSupported(int intrinsicIdentifier) { + return getCompiler().isIntrinsicSupported(intrinsicIdentifier); + } + /** * Guard to ensure shut down actions are performed by at most one thread. */ diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java index 0ee69f135c942..c6735cef5f64c 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -82,6 +82,27 @@ public List<VMIntrinsicMethod> getIntrinsics() { return Collections.unmodifiableList(vmIntrinsics); } + /** + * Gets the VM intrinsic description by its ID. + */ + public VMIntrinsicMethod getIntrinsic(int intrinsicID) { + if (intrinsicID >= 1 && intrinsicID <= vmIntrinsics.size()) { + // valid intrinsicID starts from 1 + VMIntrinsicMethod intrinsic = vmIntrinsics.get(intrinsicID - 1); + // We speculate that vmIntrinsics are sorted by ID + if (intrinsic.id == intrinsicID) { + return intrinsic; + } + } + // Assumption failed, fall back to iteration + for (VMIntrinsicMethod intrinsic : vmIntrinsics) { + if (intrinsic.id == intrinsicID) { + return intrinsic; + } + } + return null; + } + final HashMap<String, VMField> vmFields; final HashMap<String, Long> vmConstants; final HashMap<String, Long> vmAddresses; diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/runtime/JVMCICompiler.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/runtime/JVMCICompiler.java index bbb9c79e9f56a..accd9e0149028 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/runtime/JVMCICompiler.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/runtime/JVMCICompiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,4 +44,15 @@ public interface JVMCICompiler { default boolean isGCSupported(int gcIdentifier) { return true; } + + /** + * Determines if this compiler supports the {@code intrinsicIdentifier} intrinsic. The default + * implementation of this method returns false as that is the effective answer given by a + * {@link JVMCICompiler} before this method was added. + * + * @param intrinsicIdentifier intrinsic identifier defined in vmIntrinsics.hpp. + */ + default boolean isIntrinsicSupported(int intrinsicIdentifier) { + return false; + } } From 07ebda54f290cc17c6682abd26ceca2868488a63 Mon Sep 17 00:00:00 2001 From: Inigo Mediavilla Saiz <imediava@gmail.com> Date: Wed, 19 Jun 2024 10:35:32 +0000 Subject: [PATCH 106/471] 8334215: serviceability/dcmd/thread/PrintMountedVirtualThread.java failing with JTREG_TEST_THREAD_FACTORY=Virtual Reviewed-by: dholmes --- src/hotspot/share/runtime/threads.cpp | 7 +++++-- .../dcmd/thread/PrintMountedVirtualThread.java | 17 ++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index e65470ac52692..9800f85dfe44a 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -1332,8 +1332,11 @@ void Threads::print_on(outputStream* st, bool print_stacks, if (p->is_vthread_mounted()) { const oop vt = p->vthread(); assert(vt != nullptr, "vthread should not be null when vthread is mounted"); - st->print_cr(" Mounted virtual thread \"%s\" #" INT64_FORMAT, JavaThread::name_for(vt), (int64_t)java_lang_Thread::thread_id(vt)); - p->print_vthread_stack_on(st); + // JavaThread._vthread can refer to the carrier thread. Print only if _vthread refers to a virtual thread. + if (vt != thread_oop) { + st->print_cr(" Mounted virtual thread #" INT64_FORMAT, (int64_t)java_lang_Thread::thread_id(vt)); + p->print_vthread_stack_on(st); + } } } } diff --git a/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java b/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java index bffe4c266a478..04163d7536a1c 100644 --- a/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java +++ b/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java @@ -26,7 +26,6 @@ import jdk.test.lib.process.OutputAnalyzer; import org.junit.Test; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; @@ -41,16 +40,18 @@ public class PrintMountedVirtualThread { public void run(CommandExecutor executor) throws InterruptedException { var shouldFinish = new AtomicBoolean(false); - var started = new CountDownLatch(1); + var started = new AtomicBoolean(); final Runnable runnable = new DummyRunnable(shouldFinish, started); try { Thread vthread = Thread.ofVirtual().name("Dummy Vthread").start(runnable); - started.await(); + while (!started.get()) { + Thread.sleep(10); + } /* Execute */ OutputAnalyzer output = executor.execute("Thread.print"); output.shouldMatch(".*at " + Pattern.quote(DummyRunnable.class.getName()) + "\\.run.*"); output.shouldMatch(".*at " + Pattern.quote(DummyRunnable.class.getName()) + "\\.compute.*"); - output.shouldMatch("Mounted virtual thread " + "\"Dummy Vthread\"" + " #" + vthread.threadId()); + output.shouldMatch("Mounted virtual thread " + "#" + vthread.threadId()); } finally { shouldFinish.set(true); @@ -63,11 +64,10 @@ public void jmx() throws InterruptedException { } static class DummyRunnable implements Runnable { - private final AtomicBoolean shouldFinish; - private final CountDownLatch started; + private final AtomicBoolean started; - public DummyRunnable(AtomicBoolean shouldFinish, CountDownLatch started) { + public DummyRunnable(AtomicBoolean shouldFinish, AtomicBoolean started) { this.shouldFinish = shouldFinish; this.started = started; } @@ -77,12 +77,11 @@ public void run() { } void compute() { - started.countDown(); + started.set(true); while (!shouldFinish.get()) { Thread.onSpinWait(); } } } - } From 7b3a96d57023e8a7cf495e2d7c551976f0e5656b Mon Sep 17 00:00:00 2001 From: Archie Cobbs <acobbs@openjdk.org> Date: Wed, 19 Jun 2024 10:45:34 +0000 Subject: [PATCH 107/471] 8334488: Improve error for illegal early access from nested class Reviewed-by: mcimadamore --- .../classes/com/sun/tools/javac/comp/Attr.java | 3 +-- .../classes/com/sun/tools/javac/comp/Enter.java | 1 + .../AnonymousInSuperCallNegTest.out | 2 +- .../tools/javac/LocalClassCtorPrologue.out | 2 +- .../EarlyInnerAccessErrorMessageTest.java | 16 ++++++++++++++++ .../EarlyInnerAccessErrorMessageTest.out | 4 ++++ .../tools/javac/SuperInit/EarlyLocalClass.out | 2 +- 7 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index 533541bd108ee..08c37fc5aa4ba 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -950,7 +950,6 @@ public void visitClassDef(JCClassDecl tree) { Optional.ofNullable(env.info.attributionMode.isSpeculative ? argumentAttr.withLocalCacheContext() : null); boolean ctorProloguePrev = env.info.ctorPrologue; - env.info.ctorPrologue = false; try { // Local and anonymous classes have not been entered yet, so we need to // do it now. @@ -995,7 +994,7 @@ public void visitMethodDef(JCMethodDecl tree) { Lint lint = env.info.lint.augment(m); Lint prevLint = chk.setLint(lint); boolean ctorProloguePrev = env.info.ctorPrologue; - env.info.ctorPrologue = false; + Assert.check(!env.info.ctorPrologue); MethodSymbol prevMethod = chk.setMethod(m); try { deferredLintHandler.flush(tree.pos(), lint); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java index 7478ef1c907c8..926be3b6e267d 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java @@ -209,6 +209,7 @@ public Env<AttrContext> classEnv(JCClassDecl tree, Env<AttrContext> env) { localEnv.info.lint = null; // leave this to be filled in by Attr, // when annotations have been processed localEnv.info.isAnonymousDiamond = TreeInfo.isDiamond(env.tree); + localEnv.info.ctorPrologue = false; return localEnv; } diff --git a/test/langtools/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out b/test/langtools/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out index 140521689a095..c04b45bce1e7d 100644 --- a/test/langtools/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out +++ b/test/langtools/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out @@ -1,2 +1,2 @@ -AnonymousInSuperCallNegTest.java:23:49: compiler.err.no.encl.instance.of.type.in.scope: AnonymousInSuperCallNegTest.JavacBug +AnonymousInSuperCallNegTest.java:23:49: compiler.err.cant.ref.before.ctor.called: x 1 error diff --git a/test/langtools/tools/javac/LocalClassCtorPrologue.out b/test/langtools/tools/javac/LocalClassCtorPrologue.out index f1a999af491a7..65f3418825d89 100644 --- a/test/langtools/tools/javac/LocalClassCtorPrologue.out +++ b/test/langtools/tools/javac/LocalClassCtorPrologue.out @@ -1,4 +1,4 @@ -LocalClassCtorPrologue.java:16:17: compiler.err.no.encl.instance.of.type.in.scope: LocalClassCtorPrologue +LocalClassCtorPrologue.java:16:17: compiler.err.cant.ref.before.ctor.called: x - compiler.note.preview.filename: LocalClassCtorPrologue.java, DEFAULT - compiler.note.preview.recompile 1 error diff --git a/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.java b/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.java new file mode 100644 index 0000000000000..a8ee3a2aea5c2 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.java @@ -0,0 +1,16 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8334488 + * @summary Verify the error message generated for early access from inner class + * @compile/fail/ref=EarlyInnerAccessErrorMessageTest.out -XDrawDiagnostics EarlyInnerAccessErrorMessageTest.java + * @enablePreview + */ +public class EarlyInnerAccessErrorMessageTest { + int x; + EarlyInnerAccessErrorMessageTest() { + class Inner { + { System.out.println(x); } + } + super(); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.out b/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.out new file mode 100644 index 0000000000000..a8d690a4c2361 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.out @@ -0,0 +1,4 @@ +EarlyInnerAccessErrorMessageTest.java:12:34: compiler.err.cant.ref.before.ctor.called: x +- compiler.note.preview.filename: EarlyInnerAccessErrorMessageTest.java, DEFAULT +- compiler.note.preview.recompile +1 error diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalClass.out b/test/langtools/tools/javac/SuperInit/EarlyLocalClass.out index 390b68ea2c9af..ee01f9c403d5b 100644 --- a/test/langtools/tools/javac/SuperInit/EarlyLocalClass.out +++ b/test/langtools/tools/javac/SuperInit/EarlyLocalClass.out @@ -1,4 +1,4 @@ -EarlyLocalClass.java:12:32: compiler.err.no.encl.instance.of.type.in.scope: EarlyLocalClass +EarlyLocalClass.java:12:32: compiler.err.cant.ref.before.ctor.called: this - compiler.note.preview.filename: EarlyLocalClass.java, DEFAULT - compiler.note.preview.recompile 1 error From 50bed6c67b1edd7736bdf79308d135a4e1047ff0 Mon Sep 17 00:00:00 2001 From: Daniel Fuchs <dfuchs@openjdk.org> Date: Wed, 19 Jun 2024 10:54:13 +0000 Subject: [PATCH 108/471] 8334297: (so) java/nio/channels/SocketChannel/OpenLeak.java should not depend on SecurityManager Reviewed-by: alanb --- .../nio/channels/SocketChannel/OpenLeak.java | 104 ++++++++++++++++-- 1 file changed, 93 insertions(+), 11 deletions(-) diff --git a/test/jdk/java/nio/channels/SocketChannel/OpenLeak.java b/test/jdk/java/nio/channels/SocketChannel/OpenLeak.java index 8d8673355efb5..c7eed1f27a052 100644 --- a/test/jdk/java/nio/channels/SocketChannel/OpenLeak.java +++ b/test/jdk/java/nio/channels/SocketChannel/OpenLeak.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,28 +25,110 @@ * @bug 6548464 * @summary SocketChannel.open(SocketAddress) leaks file descriptor if * connection cannot be established + * @requires vm.flagless * @build OpenLeak - * @run main/othervm -Djava.security.manager=allow OpenLeak + * @run junit/othervm OpenLeak */ +import java.io.IOException; +import java.net.ConnectException; import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.nio.channels.SocketChannel; +import java.nio.channels.UnresolvedAddressException; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.junit.jupiter.api.Assertions.assertThrows; + public class OpenLeak { - public static void main(String[] args) throws Exception { - InetAddress lh = InetAddress.getLocalHost(); - InetSocketAddress isa = new InetSocketAddress(lh, 12345); + static final String OS_NAME = System.getProperty("os.name").toLowerCase(Locale.ROOT); + static final boolean IS_WINDOWS_2016 = OS_NAME.contains("windows") && OS_NAME.contains("2016"); + + // On Windows Server 2016 trying to connect to port 47 consumes the + // whole connect timeout - which makes the test fail in timeout. + // We skip this part of the test on Windows Server 2016 + static final boolean TEST_WITH_RESERVED_PORT = !IS_WINDOWS_2016; + + private static final int MAX_LOOP = 250000; - System.setSecurityManager( new SecurityManager() ); - for (int i=0; i<100000; i++) { - try { - SocketChannel.open(isa); - throw new RuntimeException("This should not happen"); - } catch (SecurityException x) { } + + // Try to find a suitable port to provoke a "Connection Refused" + // error. + private static InetSocketAddress findSuitableRefusedAddress(InetSocketAddress isa) + throws IOException { + if (!TEST_WITH_RESERVED_PORT) return null; + var addr = isa.getAddress(); + try (SocketChannel sc1 = SocketChannel.open(isa)) { + // If we manage to connect, let's try to use some other + // port. + // port 51 is reserved too - there should be nothing there... + isa = new InetSocketAddress(addr, 51); + try (SocketChannel sc2 = SocketChannel.open(isa)) { + } + // OK, last attempt... + // port 61 is reserved too - there should be nothing there... + isa = new InetSocketAddress(addr, 61); + try (SocketChannel sc3 = SocketChannel.open(isa)) { + } + System.err.println("Could not find a suitable port"); + return null; + } catch (ConnectException x) { } + return isa; + } + + private static InetSocketAddress createUnresolved(InetSocketAddress isa, InetSocketAddress def) { + var sa = isa == null ? def : isa; + return InetSocketAddress.createUnresolved(sa.getHostString(), sa.getPort()); + } + + // Builds a list of test cases + static List<Object[]> testCases() throws Exception { + InetAddress lo = InetAddress.getLoopbackAddress(); + + // Try to find a suitable port that will cause a + // Connection Refused exception + // port 47 is reserved - there should be nothing there... + InetSocketAddress def = new InetSocketAddress(lo, 47); + InetSocketAddress isa = findSuitableRefusedAddress(def); + InetSocketAddress sa = createUnresolved(isa, def); + + final List<Object[]> cases = new ArrayList<>(); + cases.add(new Object[]{sa, UnresolvedAddressException.class}); + if (isa != null) { + cases.add(new Object[]{isa, ConnectException.class}); + } + return cases; + } + + @ParameterizedTest + @MethodSource("testCases") + public void test(SocketAddress sa, Class<? extends Throwable> expectedException) throws Exception { + System.err.printf("%nExpecting %s for %s%n", expectedException, sa); + + int i = 0; + try { + for (i = 0; i < MAX_LOOP; i++) { + Throwable x = + assertThrows(expectedException, () -> SocketChannel.open(sa)); + if (i < 5 || i >= MAX_LOOP - 5) { + // print a message for the first five and last 5 exceptions + System.err.println(x); + } + } + } catch (Throwable t) { + System.err.println("Failed at " + i + " with " + t); + throw t; + } } } From 01ee4241b76e78ca67803c4b083fcedecef1c96c Mon Sep 17 00:00:00 2001 From: Adam Sotona <asotona@openjdk.org> Date: Wed, 19 Jun 2024 15:15:30 +0000 Subject: [PATCH 109/471] 8294960: Convert java.base/java.lang.invoke package to use the Classfile API to generate lambdas and method handles Co-authored-by: Claes Redestad <redestad@openjdk.org> Reviewed-by: redestad, liach --- .../java/lang/invoke/ClassSpecializer.java | 502 +++--- .../lang/invoke/GenerateJLIClassesHelper.java | 30 +- .../invoke/InnerClassLambdaMetafactory.java | 552 +++---- .../lang/invoke/InvokerBytecodeGenerator.java | 1454 +++++++---------- .../classes/java/lang/invoke/LambdaForm.java | 20 +- .../java/lang/invoke/MethodHandleImpl.java | 68 +- .../java/lang/invoke/MethodHandles.java | 28 +- .../classes/java/lang/invoke/MethodType.java | 20 +- .../invoke/TypeConvertingMethodAdapter.java | 296 ++-- .../classfile/impl/StackMapGenerator.java | 43 +- test/hotspot/jtreg/ProblemList.txt | 1 + 11 files changed, 1298 insertions(+), 1716 deletions(-) diff --git a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java index a5eb681fb8823..cca05a906ff08 100644 --- a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java +++ b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java @@ -25,13 +25,12 @@ package java.lang.invoke; -import jdk.internal.loader.BootLoader; -import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.internal.org.objectweb.asm.FieldVisitor; -import jdk.internal.org.objectweb.asm.MethodVisitor; -import jdk.internal.vm.annotation.Stable; -import sun.invoke.util.BytecodeName; - +import java.lang.classfile.*; +import java.lang.classfile.attribute.ExceptionsAttribute; +import java.lang.classfile.attribute.SourceFileAttribute; +import java.lang.constant.ClassDesc; +import java.lang.constant.MethodTypeDesc; +import java.lang.invoke.LambdaForm.BasicType; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -42,12 +41,19 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; -import static java.lang.invoke.LambdaForm.*; +import jdk.internal.constant.MethodTypeDescImpl; +import jdk.internal.constant.ReferenceClassDescImpl; +import jdk.internal.loader.BootLoader; +import jdk.internal.vm.annotation.Stable; +import sun.invoke.util.BytecodeName; +import sun.invoke.util.Wrapper; + +import static java.lang.classfile.ClassFile.*; +import static java.lang.constant.ConstantDescs.*; import static java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic; import static java.lang.invoke.MethodHandleNatives.Constants.REF_putStatic; import static java.lang.invoke.MethodHandleStatics.*; import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; -import static jdk.internal.org.objectweb.asm.Opcodes.*; /** * Class specialization code. @@ -57,6 +63,10 @@ */ /*non-public*/ abstract class ClassSpecializer<T,K,S extends ClassSpecializer<T,K,S>.SpeciesData> { + + private static final ClassDesc CD_LambdaForm = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm;"); + private static final ClassDesc CD_BoundMethodHandle = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/BoundMethodHandle;"); + private final Class<T> topClass; private final Class<K> keyType; private final Class<S> metaType; @@ -404,7 +414,7 @@ protected String deriveTypeString() { buf.append(basicType.basicTypeChar()); } else { buf.append('V'); - end.append(classSig(type)); + end.append(type.descriptorString()); } } String typeString; @@ -572,8 +582,9 @@ Class<? extends T> generateConcreteSpeciesCode(String className, ClassSpecialize } // These are named like constants because there is only one per specialization scheme: - private final String SPECIES_DATA = classBCName(metaType); - private final String SPECIES_DATA_SIG = classSig(SPECIES_DATA); + + private final ClassDesc CD_SPECIES_DATA = classDesc(metaType); + private final MethodTypeDesc MTD_SPECIES_DATA = MethodTypeDescImpl.ofValidated(CD_SPECIES_DATA); private final String SPECIES_DATA_NAME = sdAccessor.getName(); private final int SPECIES_DATA_MODS = sdAccessor.getModifiers(); private final List<String> TRANSFORM_NAMES; // derived from transformMethods @@ -595,268 +606,207 @@ Class<? extends T> generateConcreteSpeciesCode(String className, ClassSpecialize TRANSFORM_TYPES = List.of(tts.toArray(new MethodType[0])); TRANSFORM_MODS = List.of(tms.toArray(new Integer[0])); } + private static final MethodTypeDesc MTD_TRANFORM_HELPER = MethodTypeDescImpl.ofValidated(CD_MethodHandle, CD_int); private static final int ACC_PPP = ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED; /*non-public*/ byte[] generateConcreteSpeciesCodeFile(String className0, ClassSpecializer<T,K,S>.SpeciesData speciesData) { - final String className = classBCName(className0); - final String superClassName = classBCName(speciesData.deriveSuperClass()); - - final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); - final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC - cw.visit(CLASSFILE_VERSION, NOT_ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, superClassName, null); - - final String sourceFile = className.substring(className.lastIndexOf('.')+1); - cw.visitSource(sourceFile, null); - - // emit static types and BMH_SPECIES fields - FieldVisitor fw = cw.visitField(NOT_ACC_PUBLIC + ACC_STATIC, sdFieldName, SPECIES_DATA_SIG, null, null); - fw.visitAnnotation(STABLE_SIG, true); - fw.visitEnd(); - - // handy holder for dealing with groups of typed values (ctor arguments and fields) - class Var { - final int index; - final String name; - final Class<?> type; - final String desc; - final BasicType basicType; - final int slotIndex; - Var(int index, int slotIndex) { - this.index = index; - this.slotIndex = slotIndex; - name = null; type = null; desc = null; - basicType = BasicType.V_TYPE; - } - Var(String name, Class<?> type, Var prev) { - int slotIndex = prev.nextSlotIndex(); - int index = prev.nextIndex(); - if (name == null) name = "x"; - if (name.endsWith("#")) - name = name.substring(0, name.length()-1) + index; - assert(!type.equals(void.class)); - String desc = classSig(type); - BasicType basicType = BasicType.basicType(type); - this.index = index; - this.name = name; - this.type = type; - this.desc = desc; - this.basicType = basicType; - this.slotIndex = slotIndex; - } - Var lastOf(List<Var> vars) { - int n = vars.size(); - return (n == 0 ? this : vars.get(n-1)); - } - <X> List<Var> fromTypes(List<X> types) { - Var prev = this; - ArrayList<Var> result = new ArrayList<>(types.size()); - int i = 0; - for (X x : types) { - String vn = name; - Class<?> vt; - if (x instanceof Class<?> cl) { - vt = cl; - // make the names friendlier if debugging - assert((vn = vn + "_" + (i++)) != null); - } else { - @SuppressWarnings("unchecked") - Var v = (Var) x; - vn = v.name; - vt = v.type; + final ClassDesc classDesc = ClassDesc.of(className0); + final ClassDesc superClassDesc = classDesc(speciesData.deriveSuperClass()); + return ClassFile.of().build(classDesc, clb -> { + clb.withFlags(ACC_FINAL | ACC_SUPER) + .withSuperclass(superClassDesc) + .with(SourceFileAttribute.of(classDesc.displayName())) + + // emit static types and BMH_SPECIES fields + .withField(sdFieldName, CD_SPECIES_DATA, ACC_STATIC); + + // handy holder for dealing with groups of typed values (ctor arguments and fields) + class Var { + final int index; + final String name; + final Class<?> type; + final ClassDesc desc; + final BasicType basicType; + final int slotIndex; + Var(int index, int slotIndex) { + this.index = index; + this.slotIndex = slotIndex; + name = null; type = null; desc = null; + basicType = BasicType.V_TYPE; + } + Var(String name, Class<?> type, Var prev) { + int slotIndex = prev.nextSlotIndex(); + int index = prev.nextIndex(); + if (name == null) name = "x"; + if (name.endsWith("#")) + name = name.substring(0, name.length()-1) + index; + assert(!type.equals(void.class)); + this.index = index; + this.name = name; + this.type = type; + this.desc = classDesc(type); + this.basicType = BasicType.basicType(type); + this.slotIndex = slotIndex; + } + Var lastOf(List<Var> vars) { + int n = vars.size(); + return (n == 0 ? this : vars.get(n-1)); + } + <X> List<Var> fromTypes(List<X> types) { + Var prev = this; + ArrayList<Var> result = new ArrayList<>(types.size()); + int i = 0; + for (X x : types) { + String vn = name; + Class<?> vt; + if (x instanceof Class<?> cl) { + vt = cl; + // make the names friendlier if debugging + assert((vn = vn + "_" + (i++)) != null); + } else { + @SuppressWarnings("unchecked") + Var v = (Var) x; + vn = v.name; + vt = v.type; + } + prev = new Var(vn, vt, prev); + result.add(prev); } - prev = new Var(vn, vt, prev); - result.add(prev); + return result; } - return result; - } - int slotSize() { return basicType.basicTypeSlots(); } - int nextIndex() { return index + (slotSize() == 0 ? 0 : 1); } - int nextSlotIndex() { return slotIndex >= 0 ? slotIndex + slotSize() : slotIndex; } - boolean isInHeap() { return slotIndex < 0; } - void emitVarInstruction(int asmop, MethodVisitor mv) { - if (asmop == ALOAD) - asmop = typeLoadOp(basicType.basicTypeChar()); - else - throw new AssertionError("bad op="+asmop+" for desc="+desc); - mv.visitVarInsn(asmop, slotIndex); - } - public void emitFieldInsn(int asmop, MethodVisitor mv) { - mv.visitFieldInsn(asmop, className, name, desc); - } - } - - final Var NO_THIS = new Var(0, 0), - AFTER_THIS = new Var(0, 1), - IN_HEAP = new Var(0, -1); - - // figure out the field types - final List<Class<?>> fieldTypes = speciesData.fieldTypes(); - final List<Var> fields = new ArrayList<>(fieldTypes.size()); - { - Var nextF = IN_HEAP; - for (Class<?> ft : fieldTypes) { - String fn = chooseFieldName(ft, nextF.nextIndex()); - nextF = new Var(fn, ft, nextF); - fields.add(nextF); + int slotSize() { return basicType.basicTypeSlots(); } + int nextIndex() { return index + (slotSize() == 0 ? 0 : 1); } + int nextSlotIndex() { return slotIndex >= 0 ? slotIndex + slotSize() : slotIndex; } + boolean isInHeap() { return slotIndex < 0; } + void emitLoadInstruction(CodeBuilder cob) { + cob.loadLocal(basicType.btKind, slotIndex); + } } - } - // emit bound argument fields - for (Var field : fields) { - cw.visitField(ACC_FINAL, field.name, field.desc, null, null).visitEnd(); - } - - MethodVisitor mv; - - // emit implementation of speciesData() - mv = cw.visitMethod((SPECIES_DATA_MODS & ACC_PPP) + ACC_FINAL, - SPECIES_DATA_NAME, "()" + SPECIES_DATA_SIG, null, null); - mv.visitCode(); - mv.visitFieldInsn(GETSTATIC, className, sdFieldName, SPECIES_DATA_SIG); - mv.visitInsn(ARETURN); - mv.visitMaxs(0, 0); - mv.visitEnd(); - - // figure out the constructor arguments - MethodType superCtorType = ClassSpecializer.this.baseConstructorType(); - MethodType thisCtorType = superCtorType.appendParameterTypes(fieldTypes); - - // emit constructor - { - mv = cw.visitMethod(ACC_PRIVATE, - "<init>", methodSig(thisCtorType), null, null); - mv.visitCode(); - mv.visitVarInsn(ALOAD, 0); // this - - final List<Var> ctorArgs = AFTER_THIS.fromTypes(superCtorType.parameterList()); - for (Var ca : ctorArgs) { - ca.emitVarInstruction(ALOAD, mv); + final Var NO_THIS = new Var(0, 0), + AFTER_THIS = new Var(0, 1), + IN_HEAP = new Var(0, -1); + + // figure out the field types + final List<Class<?>> fieldTypes = speciesData.fieldTypes(); + final List<Var> fields = new ArrayList<>(fieldTypes.size()); + { + Var nextF = IN_HEAP; + for (Class<?> ft : fieldTypes) { + String fn = chooseFieldName(ft, nextF.nextIndex()); + nextF = new Var(fn, ft, nextF); + fields.add(nextF); + } } - // super(ca...) - mv.visitMethodInsn(INVOKESPECIAL, superClassName, - "<init>", methodSig(superCtorType), false); - - // store down fields - Var lastFV = AFTER_THIS.lastOf(ctorArgs); - for (Var f : fields) { - // this.argL1 = argL1 - mv.visitVarInsn(ALOAD, 0); // this - lastFV = new Var(f.name, f.type, lastFV); - lastFV.emitVarInstruction(ALOAD, mv); - f.emitFieldInsn(PUTFIELD, mv); + // emit bound argument fields + for (Var field : fields) { + clb.withField(field.name, field.desc, ACC_FINAL); } - mv.visitInsn(RETURN); - mv.visitMaxs(0, 0); - mv.visitEnd(); - } + // emit implementation of speciesData() + clb.withMethodBody(SPECIES_DATA_NAME, MTD_SPECIES_DATA, (SPECIES_DATA_MODS & ACC_PPP) | ACC_FINAL, + cob -> cob.getstatic(classDesc, sdFieldName, CD_SPECIES_DATA) + .areturn()); - // emit make() ...factory method wrapping constructor - { - MethodType ftryType = thisCtorType.changeReturnType(topClass()); - mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_STATIC, - "make", methodSig(ftryType), null, null); - mv.visitCode(); - // make instance - mv.visitTypeInsn(NEW, className); - mv.visitInsn(DUP); - // load factory method arguments: ctarg... and arg... - for (Var v : NO_THIS.fromTypes(ftryType.parameterList())) { - v.emitVarInstruction(ALOAD, mv); - } + // figure out the constructor arguments + MethodType superCtorType = ClassSpecializer.this.baseConstructorType(); + MethodType thisCtorType = superCtorType.appendParameterTypes(fieldTypes); - // finally, invoke the constructor and return - mv.visitMethodInsn(INVOKESPECIAL, className, - "<init>", methodSig(thisCtorType), false); - mv.visitInsn(ARETURN); - mv.visitMaxs(0, 0); - mv.visitEnd(); - } + // emit constructor + clb.withMethodBody(INIT_NAME, methodDesc(thisCtorType), ACC_PRIVATE, cob -> { + cob.aload(0); // this - // For each transform, emit the customized override of the transform method. - // This method mixes together some incoming arguments (from the transform's - // static type signature) with the field types themselves, and passes - // the resulting mish-mosh of values to a method handle produced by - // the species itself. (Typically this method handle is the factory - // method of this species or a related one.) - for (int whichtm = 0; whichtm < TRANSFORM_NAMES.size(); whichtm++) { - final String TNAME = TRANSFORM_NAMES.get(whichtm); - final MethodType TTYPE = TRANSFORM_TYPES.get(whichtm); - final int TMODS = TRANSFORM_MODS.get(whichtm); - mv = cw.visitMethod((TMODS & ACC_PPP) | ACC_FINAL, - TNAME, TTYPE.toMethodDescriptorString(), null, E_THROWABLE); - mv.visitCode(); - // return a call to the corresponding "transform helper", something like this: - // MY_SPECIES.transformHelper(whichtm).invokeBasic(ctarg, ..., argL0, ..., xarg) - mv.visitFieldInsn(GETSTATIC, className, - sdFieldName, SPECIES_DATA_SIG); - emitIntConstant(whichtm, mv); - mv.visitMethodInsn(INVOKEVIRTUAL, SPECIES_DATA, - "transformHelper", "(I)" + MH_SIG, false); - - List<Var> targs = AFTER_THIS.fromTypes(TTYPE.parameterList()); - List<Var> tfields = new ArrayList<>(fields); - // mix them up and load them for the transform helper: - List<Var> helperArgs = speciesData.deriveTransformHelperArguments(transformMethods.get(whichtm), whichtm, targs, tfields); - List<Class<?>> helperTypes = new ArrayList<>(helperArgs.size()); - for (Var ha : helperArgs) { - helperTypes.add(ha.basicType.basicTypeClass()); - if (ha.isInHeap()) { - assert(tfields.contains(ha)); - mv.visitVarInsn(ALOAD, 0); - ha.emitFieldInsn(GETFIELD, mv); - } else { - assert(targs.contains(ha)); - ha.emitVarInstruction(ALOAD, mv); + final List<Var> ctorArgs = AFTER_THIS.fromTypes(superCtorType.parameterList()); + for (Var ca : ctorArgs) { + ca.emitLoadInstruction(cob); } - } - - // jump into the helper (which is probably a factory method) - final Class<?> rtype = TTYPE.returnType(); - final BasicType rbt = BasicType.basicType(rtype); - MethodType invokeBasicType = MethodType.methodType(rbt.basicTypeClass(), helperTypes); - mv.visitMethodInsn(INVOKEVIRTUAL, MH, - "invokeBasic", methodSig(invokeBasicType), false); - if (rbt == BasicType.L_TYPE) { - mv.visitTypeInsn(CHECKCAST, classBCName(rtype)); - mv.visitInsn(ARETURN); - } else { - throw newInternalError("NYI: transform of type "+rtype); - } - mv.visitMaxs(0, 0); - mv.visitEnd(); - } - cw.visitEnd(); - - return cw.toByteArray(); - } + // super(ca...) + cob.invokespecial(superClassDesc, INIT_NAME, methodDesc(superCtorType)); + + // store down fields + Var lastFV = AFTER_THIS.lastOf(ctorArgs); + for (Var f : fields) { + // this.argL1 = argL1 + cob.aload(0); // this + lastFV = new Var(f.name, f.type, lastFV); + lastFV.emitLoadInstruction(cob); + cob.putfield(classDesc, f.name, f.desc); + } - private int typeLoadOp(char t) { - return switch (t) { - case 'L' -> ALOAD; - case 'I' -> ILOAD; - case 'J' -> LLOAD; - case 'F' -> FLOAD; - case 'D' -> DLOAD; - default -> throw newInternalError("unrecognized type " + t); - }; - } + cob.return_(); + }); - private void emitIntConstant(int con, MethodVisitor mv) { - if (ICONST_M1 - ICONST_0 <= con && con <= ICONST_5 - ICONST_0) - mv.visitInsn(ICONST_0 + con); - else if (con == (byte) con) - mv.visitIntInsn(BIPUSH, con); - else if (con == (short) con) - mv.visitIntInsn(SIPUSH, con); - else { - mv.visitLdcInsn(con); - } + // emit make() ...factory method wrapping constructor + MethodType ftryType = thisCtorType.changeReturnType(topClass()); + clb.withMethodBody("make", methodDesc(ftryType), ACC_STATIC, cob -> { + // make instance + cob.new_(classDesc) + .dup(); + // load factory method arguments: ctarg... and arg... + for (Var v : NO_THIS.fromTypes(ftryType.parameterList())) { + v.emitLoadInstruction(cob); + } + // finally, invoke the constructor and return + cob.invokespecial(classDesc, INIT_NAME, methodDesc(thisCtorType)) + .areturn(); + }); + + // For each transform, emit the customized override of the transform method. + // This method mixes together some incoming arguments (from the transform's + // static type signature) with the field types themselves, and passes + // the resulting mish-mosh of values to a method handle produced by + // the species itself. (Typically this method handle is the factory + // method of this species or a related one.) + for (int i = 0; i < TRANSFORM_NAMES.size(); i++) { + final int whichtm = i; + final String TNAME = TRANSFORM_NAMES.get(whichtm); + final MethodType TTYPE = TRANSFORM_TYPES.get(whichtm); + final int TMODS = TRANSFORM_MODS.get(whichtm); + clb.withMethod(TNAME, methodDesc(TTYPE), (TMODS & ACC_PPP) | ACC_FINAL, mb -> { + mb.with(ExceptionsAttribute.ofSymbols(CD_Throwable)) + .withCode(cob -> { + // return a call to the corresponding "transform helper", something like this: + // MY_SPECIES.transformHelper(whichtm).invokeBasic(ctarg, ..., argL0, ..., xarg) + cob.getstatic(classDesc, sdFieldName, CD_SPECIES_DATA) + .loadConstant(whichtm) + .invokevirtual(CD_SPECIES_DATA, "transformHelper", MTD_TRANFORM_HELPER); + + List<Var> targs = AFTER_THIS.fromTypes(TTYPE.parameterList()); + List<Var> tfields = new ArrayList<>(fields); + // mix them up and load them for the transform helper: + List<Var> helperArgs = speciesData.deriveTransformHelperArguments(transformMethods.get(whichtm), whichtm, targs, tfields); + ClassDesc[] helperTypes = new ClassDesc[helperArgs.size()]; + for (int hi = 0; hi < helperTypes.length; hi++) { + Var ha = helperArgs.get(hi); + helperTypes[hi] = ha.basicType.basicTypeWrapper().basicClassDescriptor(); + if (ha.isInHeap()) { + assert(tfields.contains(ha)); + cob.aload(0); + cob.getfield(classDesc, ha.name, ha.desc); + } else { + assert(targs.contains(ha)); + ha.emitLoadInstruction(cob); + } + } + + // jump into the helper (which is probably a factory method) + final Class<?> rtype = TTYPE.returnType(); + if (!rtype.isPrimitive()) { + cob.invokevirtual(CD_MethodHandle, "invokeBasic", MethodTypeDescImpl.ofValidated(CD_Object, helperTypes)) + .checkcast(classDesc(rtype)) + .areturn(); + } else { + throw newInternalError("NYI: transform of type "+rtype); + } + }); + }); + } + }); } // @@ -990,39 +940,25 @@ protected Factory makeFactory() { // Other misc helpers: - private static final String MH = "java/lang/invoke/MethodHandle"; - private static final String MH_SIG = "L" + MH + ";"; - private static final String STABLE = "jdk/internal/vm/annotation/Stable"; - private static final String STABLE_SIG = "L" + STABLE + ";"; - private static final String[] E_THROWABLE = new String[] { "java/lang/Throwable" }; - static { - assert(MH_SIG.equals(classSig(MethodHandle.class))); - assert(MH.equals(classBCName(MethodHandle.class))); - } - - static String methodSig(MethodType mt) { - return mt.toMethodDescriptorString(); - } - static String classSig(Class<?> cls) { - if (cls.isPrimitive() || cls.isArray()) - return MethodType.methodType(cls).toMethodDescriptorString().substring(2); - return classSig(classBCName(cls)); - } - static String classSig(String bcName) { - assert(bcName.indexOf('.') < 0); - assert(!bcName.endsWith(";")); - assert(!bcName.startsWith("[")); - return "L" + bcName + ";"; - } - static String classBCName(Class<?> cls) { - return classBCName(className(cls)); - } static String classBCName(String str) { assert(str.indexOf('/') < 0) : str; return str.replace('.', '/'); } - static String className(Class<?> cls) { - assert(!cls.isArray() && !cls.isPrimitive()); - return cls.getName(); + + static ClassDesc classDesc(Class<?> cls) { + return cls.isPrimitive() ? Wrapper.forPrimitiveType(cls).basicClassDescriptor() + : cls == Object.class ? CD_Object + : cls == MethodType.class ? CD_MethodType + : cls == LambdaForm.class ? CD_LambdaForm + : cls == BoundMethodHandle.class ? CD_BoundMethodHandle + : ReferenceClassDescImpl.ofValidated(cls.descriptorString()); + } + + static MethodTypeDesc methodDesc(MethodType mt) { + var params = new ClassDesc[mt.parameterCount()]; + for (int i = 0; i < params.length; i++) { + params[i] = classDesc(mt.parameterType(i)); + } + return MethodTypeDescImpl.ofValidated(classDesc(mt.returnType()), params); } } diff --git a/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java b/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java index 46eeb67de54c5..1e3f465f97dbd 100644 --- a/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java +++ b/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java @@ -25,10 +25,11 @@ package java.lang.invoke; -import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.internal.org.objectweb.asm.Opcodes; import sun.invoke.util.Wrapper; +import java.lang.classfile.ClassFile; +import java.lang.classfile.attribute.SourceFileAttribute; +import java.lang.constant.ClassDesc; import java.util.ArrayList; import java.util.HashSet; import java.util.Map; @@ -38,10 +39,10 @@ import java.util.TreeSet; import java.util.stream.Stream; +import static java.lang.classfile.ClassFile.*; import static java.lang.invoke.LambdaForm.BasicType.*; -import static java.lang.invoke.MethodHandleStatics.CLASSFILE_VERSION; -import static java.lang.invoke.MethodTypeForm.*; import static java.lang.invoke.LambdaForm.Kind.*; +import static java.lang.invoke.MethodTypeForm.*; /** * Helper class to assist the GenerateJLIClassesPlugin to get access to @@ -557,19 +558,14 @@ static byte[] generateInvokersHolderClassBytes(String className, * a class with a specified name. */ private static byte[] generateCodeBytesForLFs(String className, String[] names, LambdaForm[] forms) { - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); - cw.visit(CLASSFILE_VERSION, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, - className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null); - cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null); - - for (int i = 0; i < forms.length; i++) { - InvokerBytecodeGenerator g - = new InvokerBytecodeGenerator(className, names[i], forms[i], forms[i].methodType()); - g.setClassWriter(cw); - g.addMethod(); - } - - return cw.toByteArray(); + return ClassFile.of().build(ClassDesc.ofInternalName(className), clb -> { + clb.withFlags(ACC_PRIVATE | ACC_FINAL | ACC_SUPER) + .withSuperclass(InvokerBytecodeGenerator.INVOKER_SUPER_DESC) + .with(SourceFileAttribute.of(className.substring(className.lastIndexOf('/') + 1))); + for (int i = 0; i < forms.length; i++) { + new InvokerBytecodeGenerator(className, names[i], forms[i], forms[i].methodType()).addMethod(clb); + } + }); } private static LambdaForm makeReinvokerFor(MethodType type) { diff --git a/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java b/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java index b4afbc098c96e..ce2547710a5cb 100644 --- a/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java +++ b/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java @@ -26,23 +26,40 @@ package java.lang.invoke; import jdk.internal.misc.CDS; -import jdk.internal.org.objectweb.asm.*; import jdk.internal.util.ClassFileDumper; -import sun.invoke.util.BytecodeDescriptor; import sun.invoke.util.VerifyAccess; import sun.security.action.GetBooleanAction; import java.io.Serializable; -import java.lang.constant.ConstantDescs; +import java.lang.classfile.ClassBuilder; +import java.lang.classfile.ClassFile; +import java.lang.classfile.CodeBuilder; +import java.lang.classfile.FieldBuilder; +import java.lang.classfile.MethodBuilder; +import java.lang.classfile.Opcode; +import java.lang.classfile.TypeKind; +import java.lang.constant.ClassDesc; +import java.lang.constant.DynamicConstantDesc; +import java.lang.constant.MethodTypeDesc; import java.lang.reflect.Modifier; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; - -import static java.lang.invoke.MethodHandleStatics.CLASSFILE_VERSION; +import java.util.function.Consumer; + +import static java.lang.classfile.ClassFile.*; +import java.lang.classfile.attribute.ExceptionsAttribute; +import java.lang.classfile.constantpool.ClassEntry; +import java.lang.classfile.constantpool.ConstantPoolBuilder; +import java.lang.classfile.constantpool.MethodRefEntry; +import static java.lang.constant.ConstantDescs.*; import static java.lang.invoke.MethodHandles.Lookup.ClassOption.NESTMATE; import static java.lang.invoke.MethodHandles.Lookup.ClassOption.STRONG; import static java.lang.invoke.MethodType.methodType; -import static jdk.internal.org.objectweb.asm.Opcodes.*; +import jdk.internal.constant.ConstantUtils; +import jdk.internal.constant.MethodTypeDescImpl; +import jdk.internal.constant.ReferenceClassDescImpl; +import sun.invoke.util.Wrapper; /** * Lambda metafactory implementation which dynamically creates an @@ -51,42 +68,29 @@ * @see LambdaMetafactory */ /* package */ final class InnerClassLambdaMetafactory extends AbstractValidatingLambdaMetafactory { - private static final String METHOD_DESCRIPTOR_VOID = Type.getMethodDescriptor(Type.VOID_TYPE); - private static final String JAVA_LANG_OBJECT = "java/lang/Object"; - private static final String NAME_CTOR = "<init>"; private static final String LAMBDA_INSTANCE_FIELD = "LAMBDA_INSTANCE$"; - - //Serialization support - private static final String NAME_SERIALIZED_LAMBDA = "java/lang/invoke/SerializedLambda"; - private static final String NAME_NOT_SERIALIZABLE_EXCEPTION = "java/io/NotSerializableException"; - private static final String DESCR_METHOD_WRITE_REPLACE = "()Ljava/lang/Object;"; - private static final String DESCR_METHOD_WRITE_OBJECT = "(Ljava/io/ObjectOutputStream;)V"; - private static final String DESCR_METHOD_READ_OBJECT = "(Ljava/io/ObjectInputStream;)V"; - - private static final String NAME_METHOD_WRITE_REPLACE = "writeReplace"; - private static final String NAME_METHOD_READ_OBJECT = "readObject"; - private static final String NAME_METHOD_WRITE_OBJECT = "writeObject"; - - private static final String DESCR_CLASS = "Ljava/lang/Class;"; - private static final String DESCR_STRING = "Ljava/lang/String;"; - private static final String DESCR_OBJECT = "Ljava/lang/Object;"; - private static final String DESCR_CTOR_SERIALIZED_LAMBDA - = "(" + DESCR_CLASS + DESCR_STRING + DESCR_STRING + DESCR_STRING + "I" - + DESCR_STRING + DESCR_STRING + DESCR_STRING + DESCR_STRING + "[" + DESCR_OBJECT + ")V"; - - private static final String DESCR_CTOR_NOT_SERIALIZABLE_EXCEPTION = "(Ljava/lang/String;)V"; - private static final String[] SER_HOSTILE_EXCEPTIONS = new String[] {NAME_NOT_SERIALIZABLE_EXCEPTION}; - private static final String[] EMPTY_STRING_ARRAY = new String[0]; + private static final ClassDesc[] EMPTY_CLASSDESC_ARRAY = ConstantUtils.EMPTY_CLASSDESC; + + // Static builders to avoid lambdas + record FieldFlags(int flags) implements Consumer<FieldBuilder> { + @Override + public void accept(FieldBuilder fb) { + fb.withFlags(flags); + } + }; + record MethodBody(Consumer<CodeBuilder> code) implements Consumer<MethodBuilder> { + @Override + public void accept(MethodBuilder mb) { + mb.withCode(code); + } + }; // For dumping generated classes to disk, for debugging purposes private static final ClassFileDumper lambdaProxyClassFileDumper; private static final boolean disableEagerInitialization; - // condy to load implMethod from class data - private static final ConstantDynamic implMethodCondy; - static { // To dump the lambda proxy classes, set this system property: // -Djdk.invoke.LambdaMetafactory.dumpProxyClassFiles @@ -96,23 +100,18 @@ final String disableEagerInitializationKey = "jdk.internal.lambda.disableEagerInitialization"; disableEagerInitialization = GetBooleanAction.privilegedGetProperty(disableEagerInitializationKey); - - // condy to load implMethod from class data - MethodType classDataMType = methodType(Object.class, MethodHandles.Lookup.class, String.class, Class.class); - Handle classDataBsm = new Handle(H_INVOKESTATIC, Type.getInternalName(MethodHandles.class), "classData", - classDataMType.descriptorString(), false); - implMethodCondy = new ConstantDynamic(ConstantDescs.DEFAULT_NAME, MethodHandle.class.descriptorString(), classDataBsm); } // See context values in AbstractValidatingLambdaMetafactory - private final String implMethodClassName; // Name of type containing implementation "CC" + private final ClassDesc implMethodClassDesc; // Name of type containing implementation "CC" private final String implMethodName; // Name of implementation method "impl" - private final String implMethodDesc; // Type descriptor for implementation methods "(I)Ljava/lang/String;" + private final MethodTypeDesc implMethodDesc; // Type descriptor for implementation methods "(I)Ljava/lang/String;" private final MethodType constructorType; // Generated class constructor type "(CC)void" - private final ClassWriter cw; // ASM class writer + private final MethodTypeDesc constructorTypeDesc;// Type descriptor for the generated class constructor type "(CC)void" private final String[] argNames; // Generated names for the constructor arguments - private final String[] argDescs; // Type descriptors for the constructor arguments - private final String lambdaClassName; // Generated name for the generated class "X$$Lambda" + private final ClassDesc[] argDescs; // Type descriptors for the constructor arguments + private final String lambdaClassName; // Generated name for the generated class "X$$Lambda$1" + private final ClassDesc lambdaClassDesc; // Type descriptor for the generated class "X$$Lambda$1" private final boolean useImplMethodHandle; // use MethodHandle invocation instead of symbolic bytecode invocation /** @@ -168,11 +167,13 @@ public InnerClassLambdaMetafactory(MethodHandles.Lookup caller, super(caller, factoryType, interfaceMethodName, interfaceMethodType, implementation, dynamicMethodType, isSerializable, altInterfaces, altMethods); - implMethodClassName = implClass.getName().replace('.', '/'); + implMethodClassDesc = implClassDesc(implClass); implMethodName = implInfo.getName(); - implMethodDesc = implInfo.getMethodType().toMethodDescriptorString(); + implMethodDesc = methodDesc(implInfo.getMethodType()); constructorType = factoryType.changeReturnType(Void.TYPE); + constructorTypeDesc = methodDesc(constructorType); lambdaClassName = lambdaClassName(targetClass); + lambdaClassDesc = ClassDesc.ofInternalName(lambdaClassName); // If the target class invokes a protected method inherited from a // superclass in a different package, or does 'invokespecial', the // lambda class has no access to the resolved method, or does @@ -182,19 +183,19 @@ public InnerClassLambdaMetafactory(MethodHandles.Lookup caller, // situation by generating bridges in the target class) useImplMethodHandle = (Modifier.isProtected(implInfo.getModifiers()) && !VerifyAccess.isSamePackage(targetClass, implInfo.getDeclaringClass())) || - implKind == H_INVOKESPECIAL || - implKind == H_INVOKESTATIC && implClass.isHidden(); - cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); + implKind == MethodHandleInfo.REF_invokeSpecial || + implKind == MethodHandleInfo.REF_invokeStatic && implClass.isHidden(); int parameterCount = factoryType.parameterCount(); if (parameterCount > 0) { argNames = new String[parameterCount]; - argDescs = new String[parameterCount]; + argDescs = new ClassDesc[parameterCount]; for (int i = 0; i < parameterCount; i++) { argNames[i] = "arg$" + (i + 1); - argDescs[i] = BytecodeDescriptor.unparse(factoryType.parameterType(i)); + argDescs[i] = classDesc(factoryType.parameterType(i)); } } else { - argNames = argDescs = EMPTY_STRING_ARRAY; + argNames = EMPTY_STRING_ARRAY; + argDescs = EMPTY_CLASSDESC_ARRAY; } } @@ -300,65 +301,63 @@ private Class<?> spinInnerClass() throws LambdaConversionException { * is not found */ private Class<?> generateInnerClass() throws LambdaConversionException { - String[] interfaceNames; - String interfaceName = interfaceClass.getName().replace('.', '/'); + List<ClassDesc> interfaces; + ClassDesc interfaceDesc = classDesc(interfaceClass); boolean accidentallySerializable = !isSerializable && Serializable.class.isAssignableFrom(interfaceClass); if (altInterfaces.length == 0) { - interfaceNames = new String[]{interfaceName}; + interfaces = List.of(interfaceDesc); } else { // Assure no duplicate interfaces (ClassFormatError) - Set<String> itfs = LinkedHashSet.newLinkedHashSet(altInterfaces.length + 1); - itfs.add(interfaceName); + Set<ClassDesc> itfs = LinkedHashSet.newLinkedHashSet(altInterfaces.length + 1); + itfs.add(interfaceDesc); for (Class<?> i : altInterfaces) { - itfs.add(i.getName().replace('.', '/')); + itfs.add(classDesc(i)); accidentallySerializable |= !isSerializable && Serializable.class.isAssignableFrom(i); } - interfaceNames = itfs.toArray(new String[itfs.size()]); + interfaces = List.copyOf(itfs); } + final boolean finalAccidentallySerializable = accidentallySerializable; + final byte[] classBytes = ClassFile.of().build(lambdaClassDesc, new Consumer<ClassBuilder>() { + @Override + public void accept(ClassBuilder clb) { + clb.withFlags(ACC_SUPER | ACC_FINAL | ACC_SYNTHETIC) + .withInterfaceSymbols(interfaces); + // Generate final fields to be filled in by constructor + for (int i = 0; i < argDescs.length; i++) { + clb.withField(argNames[i], argDescs[i], new FieldFlags(ACC_PRIVATE | ACC_FINAL)); + } - cw.visit(CLASSFILE_VERSION, ACC_SUPER + ACC_FINAL + ACC_SYNTHETIC, - lambdaClassName, null, - JAVA_LANG_OBJECT, interfaceNames); - - // Generate final fields to be filled in by constructor - for (int i = 0; i < argDescs.length; i++) { - FieldVisitor fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, - argNames[i], - argDescs[i], - null, null); - fv.visitEnd(); - } + generateConstructor(clb); - generateConstructor(); + if (factoryType.parameterCount() == 0 && disableEagerInitialization) { + generateClassInitializer(clb); + } - if (factoryType.parameterCount() == 0 && disableEagerInitialization) { - generateClassInitializer(); - } + // Forward the SAM method + clb.withMethod(interfaceMethodName, + methodDesc(interfaceMethodType), + ACC_PUBLIC, + forwardingMethod(interfaceMethodType)); + + // Forward the bridges + if (altMethods != null) { + for (MethodType mt : altMethods) { + clb.withMethod(interfaceMethodName, + methodDesc(mt), + ACC_PUBLIC | ACC_BRIDGE, + forwardingMethod(mt)); + } + } - // Forward the SAM method - MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, interfaceMethodName, - interfaceMethodType.toMethodDescriptorString(), null, null); - new ForwardingMethodGenerator(mv).generate(interfaceMethodType); - - // Forward the altMethods - if (altMethods != null) { - for (MethodType mt : altMethods) { - mv = cw.visitMethod(ACC_PUBLIC, interfaceMethodName, - mt.toMethodDescriptorString(), null, null); - new ForwardingMethodGenerator(mv).generate(mt); + if (isSerializable) + generateSerializationFriendlyMethods(clb); + else if (finalAccidentallySerializable) + generateSerializationHostileMethods(clb); } - } - - if (isSerializable) - generateSerializationFriendlyMethods(); - else if (accidentallySerializable) - generateSerializationHostileMethods(); - - cw.visitEnd(); + }); // Define the generated class in this VM. - final byte[] classBytes = cw.toByteArray(); try { // this class is linked at the indy callsite; so define a hidden nestmate var classdata = useImplMethodHandle? implementation : null; @@ -373,237 +372,214 @@ else if (accidentallySerializable) /** * Generate a static field and a static initializer that sets this field to an instance of the lambda */ - private void generateClassInitializer() { - String lambdaTypeDescriptor = factoryType.returnType().descriptorString(); + private void generateClassInitializer(ClassBuilder clb) { + ClassDesc lambdaTypeDescriptor = classDesc(factoryType.returnType()); // Generate the static final field that holds the lambda singleton - FieldVisitor fv = cw.visitField(ACC_PRIVATE | ACC_STATIC | ACC_FINAL, - LAMBDA_INSTANCE_FIELD, lambdaTypeDescriptor, null, null); - fv.visitEnd(); + clb.withField(LAMBDA_INSTANCE_FIELD, lambdaTypeDescriptor, new FieldFlags(ACC_PRIVATE | ACC_STATIC | ACC_FINAL)); // Instantiate the lambda and store it to the static final field - MethodVisitor clinit = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null); - clinit.visitCode(); - - clinit.visitTypeInsn(NEW, lambdaClassName); - clinit.visitInsn(Opcodes.DUP); - assert factoryType.parameterCount() == 0; - clinit.visitMethodInsn(INVOKESPECIAL, lambdaClassName, NAME_CTOR, constructorType.toMethodDescriptorString(), false); - clinit.visitFieldInsn(PUTSTATIC, lambdaClassName, LAMBDA_INSTANCE_FIELD, lambdaTypeDescriptor); - - clinit.visitInsn(RETURN); - clinit.visitMaxs(-1, -1); - clinit.visitEnd(); + clb.withMethod(CLASS_INIT_NAME, MTD_void, ACC_STATIC, new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + assert factoryType.parameterCount() == 0; + cob.new_(lambdaClassDesc) + .dup() + .invokespecial(lambdaClassDesc, INIT_NAME, constructorTypeDesc) + .putstatic(lambdaClassDesc, LAMBDA_INSTANCE_FIELD, lambdaTypeDescriptor) + .return_(); + } + })); } /** * Generate the constructor for the class */ - private void generateConstructor() { + private void generateConstructor(ClassBuilder clb) { // Generate constructor - MethodVisitor ctor = cw.visitMethod(ACC_PRIVATE, NAME_CTOR, - constructorType.toMethodDescriptorString(), null, null); - ctor.visitCode(); - ctor.visitVarInsn(ALOAD, 0); - ctor.visitMethodInsn(INVOKESPECIAL, JAVA_LANG_OBJECT, NAME_CTOR, - METHOD_DESCRIPTOR_VOID, false); - int parameterCount = factoryType.parameterCount(); - for (int i = 0, lvIndex = 0; i < parameterCount; i++) { - ctor.visitVarInsn(ALOAD, 0); - Class<?> argType = factoryType.parameterType(i); - ctor.visitVarInsn(getLoadOpcode(argType), lvIndex + 1); - lvIndex += getParameterSize(argType); - ctor.visitFieldInsn(PUTFIELD, lambdaClassName, argNames[i], argDescs[i]); - } - ctor.visitInsn(RETURN); - // Maxs computed by ClassWriter.COMPUTE_MAXS, these arguments ignored - ctor.visitMaxs(-1, -1); - ctor.visitEnd(); + clb.withMethod(INIT_NAME, constructorTypeDesc, ACC_PRIVATE, + new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + cob.aload(0) + .invokespecial(CD_Object, INIT_NAME, MTD_void); + int parameterCount = factoryType.parameterCount(); + for (int i = 0; i < parameterCount; i++) { + cob.aload(0); + Class<?> argType = factoryType.parameterType(i); + cob.loadLocal(TypeKind.from(argType), cob.parameterSlot(i)); + cob.putfield(lambdaClassDesc, argNames[i], argDescs[i]); + } + cob.return_(); + } + })); + } + + private static class SerializationSupport { + // Serialization support + private static final ClassDesc CD_SerializedLambda = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/SerializedLambda;"); + private static final ClassDesc CD_ObjectOutputStream = ReferenceClassDescImpl.ofValidated("Ljava/io/ObjectOutputStream;"); + private static final ClassDesc CD_ObjectInputStream = ReferenceClassDescImpl.ofValidated("Ljava/io/ObjectInputStream;"); + private static final MethodTypeDesc MTD_Object = MethodTypeDescImpl.ofValidated(CD_Object); + private static final MethodTypeDesc MTD_void_ObjectOutputStream = MethodTypeDescImpl.ofValidated(CD_void, CD_ObjectOutputStream); + private static final MethodTypeDesc MTD_void_ObjectInputStream = MethodTypeDescImpl.ofValidated(CD_void, CD_ObjectInputStream); + + private static final String NAME_METHOD_WRITE_REPLACE = "writeReplace"; + private static final String NAME_METHOD_READ_OBJECT = "readObject"; + private static final String NAME_METHOD_WRITE_OBJECT = "writeObject"; + + static final ClassDesc CD_NotSerializableException = ReferenceClassDescImpl.ofValidated("Ljava/io/NotSerializableException;"); + static final MethodTypeDesc MTD_CTOR_NOT_SERIALIZABLE_EXCEPTION = MethodTypeDescImpl.ofValidated(CD_void, CD_String); + static final MethodTypeDesc MTD_CTOR_SERIALIZED_LAMBDA = MethodTypeDescImpl.ofValidated(CD_void, + CD_Class, CD_String, CD_String, CD_String, CD_int, CD_String, CD_String, CD_String, CD_String, ReferenceClassDescImpl.ofValidated("[Ljava/lang/Object;")); + } /** * Generate a writeReplace method that supports serialization */ - private void generateSerializationFriendlyMethods() { - TypeConvertingMethodAdapter mv - = new TypeConvertingMethodAdapter( - cw.visitMethod(ACC_PRIVATE + ACC_FINAL, - NAME_METHOD_WRITE_REPLACE, DESCR_METHOD_WRITE_REPLACE, - null, null)); - - mv.visitCode(); - mv.visitTypeInsn(NEW, NAME_SERIALIZED_LAMBDA); - mv.visitInsn(DUP); - mv.visitLdcInsn(Type.getType(targetClass)); - mv.visitLdcInsn(factoryType.returnType().getName().replace('.', '/')); - mv.visitLdcInsn(interfaceMethodName); - mv.visitLdcInsn(interfaceMethodType.toMethodDescriptorString()); - mv.visitLdcInsn(implInfo.getReferenceKind()); - mv.visitLdcInsn(implInfo.getDeclaringClass().getName().replace('.', '/')); - mv.visitLdcInsn(implInfo.getName()); - mv.visitLdcInsn(implInfo.getMethodType().toMethodDescriptorString()); - mv.visitLdcInsn(dynamicMethodType.toMethodDescriptorString()); - mv.iconst(argDescs.length); - mv.visitTypeInsn(ANEWARRAY, JAVA_LANG_OBJECT); - for (int i = 0; i < argDescs.length; i++) { - mv.visitInsn(DUP); - mv.iconst(i); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, lambdaClassName, argNames[i], argDescs[i]); - mv.boxIfTypePrimitive(Type.getType(argDescs[i])); - mv.visitInsn(AASTORE); - } - mv.visitMethodInsn(INVOKESPECIAL, NAME_SERIALIZED_LAMBDA, NAME_CTOR, - DESCR_CTOR_SERIALIZED_LAMBDA, false); - mv.visitInsn(ARETURN); - // Maxs computed by ClassWriter.COMPUTE_MAXS, these arguments ignored - mv.visitMaxs(-1, -1); - mv.visitEnd(); + private void generateSerializationFriendlyMethods(ClassBuilder clb) { + clb.withMethod(SerializationSupport.NAME_METHOD_WRITE_REPLACE, SerializationSupport.MTD_Object, ACC_PRIVATE | ACC_FINAL, + new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + cob.new_(SerializationSupport.CD_SerializedLambda) + .dup() + .ldc(classDesc(targetClass)) + .ldc(factoryType.returnType().getName().replace('.', '/')) + .ldc(interfaceMethodName) + .ldc(interfaceMethodType.toMethodDescriptorString()) + .ldc(implInfo.getReferenceKind()) + .ldc(implInfo.getDeclaringClass().getName().replace('.', '/')) + .ldc(implInfo.getName()) + .ldc(implInfo.getMethodType().toMethodDescriptorString()) + .ldc(dynamicMethodType.toMethodDescriptorString()) + .loadConstant(argDescs.length) + .anewarray(CD_Object); + for (int i = 0; i < argDescs.length; i++) { + cob.dup() + .loadConstant(i) + .aload(0) + .getfield(lambdaClassDesc, argNames[i], argDescs[i]); + TypeConvertingMethodAdapter.boxIfTypePrimitive(cob, TypeKind.from(argDescs[i])); + cob.aastore(); + } + cob.invokespecial(SerializationSupport.CD_SerializedLambda, INIT_NAME, + SerializationSupport.MTD_CTOR_SERIALIZED_LAMBDA) + .areturn(); + } + })); } /** * Generate a readObject/writeObject method that is hostile to serialization */ - private void generateSerializationHostileMethods() { - MethodVisitor mv = cw.visitMethod(ACC_PRIVATE + ACC_FINAL, - NAME_METHOD_WRITE_OBJECT, DESCR_METHOD_WRITE_OBJECT, - null, SER_HOSTILE_EXCEPTIONS); - mv.visitCode(); - mv.visitTypeInsn(NEW, NAME_NOT_SERIALIZABLE_EXCEPTION); - mv.visitInsn(DUP); - mv.visitLdcInsn("Non-serializable lambda"); - mv.visitMethodInsn(INVOKESPECIAL, NAME_NOT_SERIALIZABLE_EXCEPTION, NAME_CTOR, - DESCR_CTOR_NOT_SERIALIZABLE_EXCEPTION, false); - mv.visitInsn(ATHROW); - mv.visitMaxs(-1, -1); - mv.visitEnd(); - - mv = cw.visitMethod(ACC_PRIVATE + ACC_FINAL, - NAME_METHOD_READ_OBJECT, DESCR_METHOD_READ_OBJECT, - null, SER_HOSTILE_EXCEPTIONS); - mv.visitCode(); - mv.visitTypeInsn(NEW, NAME_NOT_SERIALIZABLE_EXCEPTION); - mv.visitInsn(DUP); - mv.visitLdcInsn("Non-serializable lambda"); - mv.visitMethodInsn(INVOKESPECIAL, NAME_NOT_SERIALIZABLE_EXCEPTION, NAME_CTOR, - DESCR_CTOR_NOT_SERIALIZABLE_EXCEPTION, false); - mv.visitInsn(ATHROW); - mv.visitMaxs(-1, -1); - mv.visitEnd(); + private void generateSerializationHostileMethods(ClassBuilder clb) { + var hostileMethod = new Consumer<MethodBuilder>() { + @Override + public void accept(MethodBuilder mb) { + ConstantPoolBuilder cp = mb.constantPool(); + ClassEntry nseCE = cp.classEntry(SerializationSupport.CD_NotSerializableException); + mb.with(ExceptionsAttribute.of(nseCE)) + .withCode(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + cob.new_(nseCE) + .dup() + .ldc("Non-serializable lambda") + .invokespecial(cp.methodRefEntry(nseCE, cp.nameAndTypeEntry(INIT_NAME, + SerializationSupport.MTD_CTOR_NOT_SERIALIZABLE_EXCEPTION))) + .athrow(); + } + }); + } + }; + clb.withMethod(SerializationSupport.NAME_METHOD_WRITE_OBJECT, SerializationSupport.MTD_void_ObjectOutputStream, + ACC_PRIVATE + ACC_FINAL, hostileMethod); + clb.withMethod(SerializationSupport.NAME_METHOD_READ_OBJECT, SerializationSupport.MTD_void_ObjectInputStream, + ACC_PRIVATE + ACC_FINAL, hostileMethod); } /** - * This class generates a method body which calls the lambda implementation + * This method generates a method body which calls the lambda implementation * method, converting arguments, as needed. */ - private class ForwardingMethodGenerator extends TypeConvertingMethodAdapter { - - ForwardingMethodGenerator(MethodVisitor mv) { - super(mv); - } - - void generate(MethodType methodType) { - visitCode(); - - if (implKind == MethodHandleInfo.REF_newInvokeSpecial) { - visitTypeInsn(NEW, implMethodClassName); - visitInsn(DUP); - } - if (useImplMethodHandle) { - visitLdcInsn(implMethodCondy); - } - for (int i = 0; i < argNames.length; i++) { - visitVarInsn(ALOAD, 0); - visitFieldInsn(GETFIELD, lambdaClassName, argNames[i], argDescs[i]); - } + Consumer<MethodBuilder> forwardingMethod(MethodType methodType) { + return new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + if (implKind == MethodHandleInfo.REF_newInvokeSpecial) { + cob.new_(implMethodClassDesc) + .dup(); + } + if (useImplMethodHandle) { + ConstantPoolBuilder cp = cob.constantPool(); + cob.ldc(cp.constantDynamicEntry(cp.bsmEntry(cp.methodHandleEntry(BSM_CLASS_DATA), List.of()), + cp.nameAndTypeEntry(DEFAULT_NAME, CD_MethodHandle))); + } + for (int i = 0; i < argNames.length; i++) { + cob.aload(0) + .getfield(lambdaClassDesc, argNames[i], argDescs[i]); + } - convertArgumentTypes(methodType); + convertArgumentTypes(cob, methodType); - if (useImplMethodHandle) { - MethodType mtype = implInfo.getMethodType(); - if (implKind != MethodHandleInfo.REF_invokeStatic) { - mtype = mtype.insertParameterTypes(0, implClass); + if (useImplMethodHandle) { + MethodType mtype = implInfo.getMethodType(); + if (implKind != MethodHandleInfo.REF_invokeStatic) { + mtype = mtype.insertParameterTypes(0, implClass); + } + cob.invokevirtual(CD_MethodHandle, "invokeExact", methodDesc(mtype)); + } else { + // Invoke the method we want to forward to + cob.invoke(invocationOpcode(), implMethodClassDesc, implMethodName, implMethodDesc, implClass.isInterface()); } - visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", - "invokeExact", mtype.descriptorString(), false); - } else { - // Invoke the method we want to forward to - visitMethodInsn(invocationOpcode(), implMethodClassName, - implMethodName, implMethodDesc, - implClass.isInterface()); + // Convert the return value (if any) and return it + // Note: if adapting from non-void to void, the 'return' + // instruction will pop the unneeded result + Class<?> implReturnClass = implMethodType.returnType(); + Class<?> samReturnClass = methodType.returnType(); + TypeConvertingMethodAdapter.convertType(cob, implReturnClass, samReturnClass, samReturnClass); + cob.return_(TypeKind.from(samReturnClass)); } - // Convert the return value (if any) and return it - // Note: if adapting from non-void to void, the 'return' - // instruction will pop the unneeded result - Class<?> implReturnClass = implMethodType.returnType(); - Class<?> samReturnClass = methodType.returnType(); - convertType(implReturnClass, samReturnClass, samReturnClass); - visitInsn(getReturnOpcode(samReturnClass)); - // Maxs computed by ClassWriter.COMPUTE_MAXS,these arguments ignored - visitMaxs(-1, -1); - visitEnd(); - } - - private void convertArgumentTypes(MethodType samType) { - int lvIndex = 0; - int samParametersLength = samType.parameterCount(); - int captureArity = factoryType.parameterCount(); - for (int i = 0; i < samParametersLength; i++) { - Class<?> argType = samType.parameterType(i); - visitVarInsn(getLoadOpcode(argType), lvIndex + 1); - lvIndex += getParameterSize(argType); - convertType(argType, implMethodType.parameterType(captureArity + i), dynamicMethodType.parameterType(i)); - } - } + }); + } - private int invocationOpcode() throws InternalError { - return switch (implKind) { - case MethodHandleInfo.REF_invokeStatic -> INVOKESTATIC; - case MethodHandleInfo.REF_newInvokeSpecial -> INVOKESPECIAL; - case MethodHandleInfo.REF_invokeVirtual -> INVOKEVIRTUAL; - case MethodHandleInfo.REF_invokeInterface -> INVOKEINTERFACE; - case MethodHandleInfo.REF_invokeSpecial -> INVOKESPECIAL; - default -> throw new InternalError("Unexpected invocation kind: " + implKind); - }; + private void convertArgumentTypes(CodeBuilder cob, MethodType samType) { + int samParametersLength = samType.parameterCount(); + int captureArity = factoryType.parameterCount(); + for (int i = 0; i < samParametersLength; i++) { + Class<?> argType = samType.parameterType(i); + cob.loadLocal(TypeKind.from(argType), cob.parameterSlot(i)); + TypeConvertingMethodAdapter.convertType(cob, argType, implMethodType.parameterType(captureArity + i), dynamicMethodType.parameterType(i)); } } - static int getParameterSize(Class<?> c) { - if (c == Void.TYPE) { - return 0; - } else if (c == Long.TYPE || c == Double.TYPE) { - return 2; - } - return 1; + private Opcode invocationOpcode() throws InternalError { + return switch (implKind) { + case MethodHandleInfo.REF_invokeStatic -> Opcode.INVOKESTATIC; + case MethodHandleInfo.REF_newInvokeSpecial -> Opcode.INVOKESPECIAL; + case MethodHandleInfo.REF_invokeVirtual -> Opcode.INVOKEVIRTUAL; + case MethodHandleInfo.REF_invokeInterface -> Opcode.INVOKEINTERFACE; + case MethodHandleInfo.REF_invokeSpecial -> Opcode.INVOKESPECIAL; + default -> throw new InternalError("Unexpected invocation kind: " + implKind); + }; } - static int getLoadOpcode(Class<?> c) { - if(c == Void.TYPE) { - throw new InternalError("Unexpected void type of load opcode"); - } - return ILOAD + getOpcodeOffset(c); + static ClassDesc implClassDesc(Class<?> cls) { + return cls.isHidden() ? null : ReferenceClassDescImpl.ofValidated(cls.descriptorString()); } - static int getReturnOpcode(Class<?> c) { - if(c == Void.TYPE) { - return RETURN; - } - return IRETURN + getOpcodeOffset(c); + static ClassDesc classDesc(Class<?> cls) { + return cls.isPrimitive() ? Wrapper.forPrimitiveType(cls).basicClassDescriptor() + : ReferenceClassDescImpl.ofValidated(cls.descriptorString()); } - private static int getOpcodeOffset(Class<?> c) { - if (c.isPrimitive()) { - if (c == Long.TYPE) { - return 1; - } else if (c == Float.TYPE) { - return 2; - } else if (c == Double.TYPE) { - return 3; - } - return 0; - } else { - return 4; + static MethodTypeDesc methodDesc(MethodType mt) { + var params = new ClassDesc[mt.parameterCount()]; + for (int i = 0; i < params.length; i++) { + params[i] = classDesc(mt.parameterType(i)); } + return MethodTypeDescImpl.ofValidated(classDesc(mt.returnType()), params); } - } diff --git a/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index 4e3ebb3834d91..6d71296c13426 100644 --- a/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -25,30 +25,38 @@ package java.lang.invoke; -import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.internal.org.objectweb.asm.FieldVisitor; -import jdk.internal.org.objectweb.asm.Label; -import jdk.internal.org.objectweb.asm.MethodVisitor; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.Type; import sun.invoke.util.VerifyAccess; import sun.invoke.util.VerifyType; import sun.invoke.util.Wrapper; +import java.lang.classfile.*; +import java.lang.classfile.attribute.RuntimeVisibleAnnotationsAttribute; +import java.lang.classfile.attribute.SourceFileAttribute; +import java.lang.classfile.instruction.SwitchCase; +import java.lang.constant.ClassDesc; +import java.lang.constant.ConstantDesc; +import java.lang.constant.MethodTypeDesc; +import java.lang.invoke.LambdaForm.BasicType; +import java.lang.invoke.LambdaForm.Name; +import java.lang.invoke.LambdaForm.NamedFunction; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Set; +import java.util.function.Consumer; import java.util.stream.Stream; +import jdk.internal.constant.MethodTypeDescImpl; +import jdk.internal.constant.ReferenceClassDescImpl; -import static java.lang.invoke.LambdaForm.BasicType; -import static java.lang.invoke.LambdaForm.BasicType.*; +import static java.lang.classfile.ClassFile.*; +import static java.lang.constant.ConstantDescs.*; import static java.lang.invoke.LambdaForm.*; +import static java.lang.invoke.LambdaForm.BasicType.*; import static java.lang.invoke.MethodHandleNatives.Constants.*; import static java.lang.invoke.MethodHandleStatics.*; -import static java.lang.invoke.MethodHandles.Lookup.*; +import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; /** * Code generation backend for LambdaForm. @@ -57,32 +65,46 @@ */ class InvokerBytecodeGenerator { /** Define class names for convenience. */ - private static final String MH = "java/lang/invoke/MethodHandle"; - private static final String MHI = "java/lang/invoke/MethodHandleImpl"; - private static final String LF = "java/lang/invoke/LambdaForm"; - private static final String LFN = "java/lang/invoke/LambdaForm$Name"; - private static final String CLS = "java/lang/Class"; - private static final String OBJ = "java/lang/Object"; - private static final String OBJARY = "[Ljava/lang/Object;"; - - private static final String LOOP_CLAUSES = MHI + "$LoopClauses"; - private static final String MHARY2 = "[[L" + MH + ";"; - private static final String MH_SIG = "L" + MH + ";"; - - - private static final String LF_SIG = "L" + LF + ";"; - private static final String LFN_SIG = "L" + LFN + ";"; - private static final String LL_SIG = "(L" + OBJ + ";)L" + OBJ + ";"; - private static final String LLV_SIG = "(L" + OBJ + ";L" + OBJ + ";)V"; - private static final String CLASS_PREFIX = LF + "$"; + private static final ClassDesc CD_CasesHolder = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/MethodHandleImpl$CasesHolder;"); + private static final ClassDesc CD_DirectMethodHandle = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/DirectMethodHandle;"); + private static final ClassDesc CD_MethodHandleImpl = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/MethodHandleImpl;"); + private static final ClassDesc CD_LambdaForm = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm;"); + private static final ClassDesc CD_LambdaForm_Name = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm$Name;"); + private static final ClassDesc CD_LoopClauses = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/MethodHandleImpl$LoopClauses;"); + private static final ClassDesc CD_Object_array = ReferenceClassDescImpl.ofValidated("[Ljava/lang/Object;"); + private static final ClassDesc CD_MethodHandle_array = ReferenceClassDescImpl.ofValidated("[Ljava/lang/invoke/MethodHandle;"); + private static final ClassDesc CD_MethodHandle_array2 = ReferenceClassDescImpl.ofValidated("[[Ljava/lang/invoke/MethodHandle;"); + + private static final MethodTypeDesc MTD_boolean_Object = MethodTypeDescImpl.ofValidated(CD_boolean, CD_Object); + private static final MethodTypeDesc MTD_Object_int = MethodTypeDescImpl.ofValidated(CD_Object, CD_int); + private static final MethodTypeDesc MTD_Object_Class = MethodTypeDescImpl.ofValidated(CD_Object, CD_Class); + private static final MethodTypeDesc MTD_Object_Object = MethodTypeDescImpl.ofValidated(CD_Object, CD_Object); + + private static final String CLASS_PREFIX = "java/lang/invoke/LambdaForm$"; private static final String SOURCE_PREFIX = "LambdaForm$"; + // Static builders to avoid lambdas + private static final Consumer<FieldBuilder> STATIC_FINAL_FIELD = new Consumer<FieldBuilder>() { + @Override + public void accept(FieldBuilder fb) { + fb.withFlags(ACC_STATIC | ACC_FINAL); + } + }; + + record MethodBody(Consumer<CodeBuilder> code) implements Consumer<MethodBuilder> { + @Override + public void accept(MethodBuilder mb) { + mb.withCode(code); + } + }; + /** Name of its super class*/ - static final String INVOKER_SUPER_NAME = OBJ; + static final ClassDesc INVOKER_SUPER_DESC = CD_Object; /** Name of new class */ private final String name; private final String className; + private final ClassDesc classDesc; private final LambdaForm lambdaForm; private final String invokerName; @@ -92,15 +114,8 @@ class InvokerBytecodeGenerator { private int[] localsMap; // index private Class<?>[] localClasses; // type - /** ASM bytecode generation. */ - private ClassWriter cw; - private MethodVisitor mv; private final List<ClassData> classData = new ArrayList<>(); - /** Single element internal class name lookup cache. */ - private Class<?> lastClass; - private String lastInternalName; - private static final MemberName.Factory MEMBERNAME_FACTORY = MemberName.getFactory(); private static final Class<?> HOST_CLASS = LambdaForm.class; private static final MethodHandles.Lookup LOOKUP = lookup(); @@ -126,6 +141,7 @@ private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize, } this.name = name; this.className = CLASS_PREFIX + name; + this.classDesc = ClassDesc.ofInternalName(className); this.lambdaForm = lambdaForm; this.invokerName = invokerName; this.invokerType = invokerType; @@ -188,10 +204,10 @@ private static String makeDumpableClassName(String className) { static class ClassData { final String name; - final String desc; + final ClassDesc desc; final Object value; - ClassData(String name, String desc, Object value) { + ClassData(String name, ClassDesc desc, Object value) { this.name = name; this.desc = desc; this.value = value; @@ -204,15 +220,15 @@ public String toString() { } String classData(Object arg) { - String desc; + ClassDesc desc; if (arg instanceof Class) { - desc = "Ljava/lang/Class;"; + desc = CD_Class; } else if (arg instanceof MethodHandle) { - desc = MH_SIG; + desc = CD_MethodHandle; } else if (arg instanceof LambdaForm) { - desc = LF_SIG; + desc = CD_LambdaForm; } else { - desc = "Ljava/lang/Object;"; + desc = CD_Object; } // unique static variable name @@ -231,16 +247,6 @@ String classData(Object arg) { return name; } - private static String debugString(Object arg) { - if (arg instanceof MethodHandle mh) { - MemberName member = mh.internalMemberName(); - if (member != null) - return member.toString(); - return mh.debugString(); - } - return arg.toString(); - } - /** * Extract the MemberName of a newly-defined method. */ @@ -265,27 +271,25 @@ private static MemberName resolveInvokerMember(Class<?> invokerClass, String nam /** * Set up class file generation. */ - private ClassWriter classFilePrologue() { - final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); - setClassWriter(cw); - cw.visit(CLASSFILE_VERSION, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, - className, null, INVOKER_SUPER_NAME, null); - cw.visitSource(SOURCE_PREFIX + name, null); - return cw; - } - - private void methodPrologue() { - String invokerDesc = invokerType.toMethodDescriptorString(); - mv = cw.visitMethod(Opcodes.ACC_STATIC, invokerName, invokerDesc, null, null); + private byte[] classFileSetup(Consumer<? super ClassBuilder> config) { + try { + return ClassFile.of().build(classDesc, new Consumer<>() { + @Override + public void accept(ClassBuilder clb) { + clb.withFlags(ACC_FINAL | ACC_SUPER) + .withSuperclass(INVOKER_SUPER_DESC) + .with(SourceFileAttribute.of(clb.constantPool().utf8Entry(SOURCE_PREFIX + name))); + config.accept(clb); + } + }); + } catch (RuntimeException e) { + throw new BytecodeGenerationException(e); + } } - /** - * Tear down class file generation. - */ - private void methodEpilogue() { - mv.visitMaxs(0, 0); - mv.visitEnd(); + private void methodSetup(ClassBuilder clb, Consumer<? super MethodBuilder> config) { + var invokerDesc = methodDesc(invokerType); + clb.withMethod(invokerName, invokerDesc, ACC_STATIC, config); } /** @@ -318,202 +322,49 @@ private Object classDataValues() { * <clinit> to initialize the static final fields with the live class data * LambdaForms can't use condy due to bootstrapping issue. */ - static void clinit(ClassWriter cw, String className, List<ClassData> classData) { + static void clinit(ClassBuilder clb, ClassDesc classDesc, List<ClassData> classData) { if (classData.isEmpty()) return; for (ClassData p : classData) { // add the static field - FieldVisitor fv = cw.visitField(Opcodes.ACC_STATIC|Opcodes.ACC_FINAL, p.name, p.desc, null, null); - fv.visitEnd(); - } - - MethodVisitor mv = cw.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null); - mv.visitCode(); - mv.visitLdcInsn(Type.getType("L" + className + ";")); - mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/invoke/MethodHandles", - "classData", "(Ljava/lang/Class;)Ljava/lang/Object;", false); - if (classData.size() == 1) { - ClassData p = classData.get(0); - mv.visitTypeInsn(Opcodes.CHECKCAST, p.desc.substring(1, p.desc.length()-1)); - mv.visitFieldInsn(Opcodes.PUTSTATIC, className, p.name, p.desc); - } else { - mv.visitTypeInsn(Opcodes.CHECKCAST, "java/util/List"); - mv.visitVarInsn(Opcodes.ASTORE, 0); - int index = 0; - for (ClassData p : classData) { - // initialize the static field - mv.visitVarInsn(Opcodes.ALOAD, 0); - emitIconstInsn(mv, index++); - mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", - "get", "(I)Ljava/lang/Object;", true); - mv.visitTypeInsn(Opcodes.CHECKCAST, p.desc.substring(1, p.desc.length()-1)); - mv.visitFieldInsn(Opcodes.PUTSTATIC, className, p.name, p.desc); - } - } - mv.visitInsn(Opcodes.RETURN); - mv.visitMaxs(2, 1); - mv.visitEnd(); - } - - /* - * Low-level emit helpers. - */ - private void emitConst(Object con) { - if (con == null) { - mv.visitInsn(Opcodes.ACONST_NULL); - return; - } - if (con instanceof Integer) { - emitIconstInsn((int) con); - return; - } - if (con instanceof Byte) { - emitIconstInsn((byte)con); - return; - } - if (con instanceof Short) { - emitIconstInsn((short)con); - return; - } - if (con instanceof Character) { - emitIconstInsn((char)con); - return; - } - if (con instanceof Long) { - long x = (long) con; - short sx = (short)x; - if (x == sx) { - if (sx >= 0 && sx <= 1) { - mv.visitInsn(Opcodes.LCONST_0 + (int) sx); - } else { - emitIconstInsn((int) x); - mv.visitInsn(Opcodes.I2L); - } - return; - } - } - if (con instanceof Float) { - float x = (float) con; - short sx = (short)x; - if (x == sx) { - if (sx >= 0 && sx <= 2) { - mv.visitInsn(Opcodes.FCONST_0 + (int) sx); + clb.withField(p.name, p.desc, STATIC_FINAL_FIELD); + } + + clb.withMethod(CLASS_INIT_NAME, MTD_void, ACC_STATIC, new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + cob.loadConstant(classDesc) + .invokestatic(CD_MethodHandles, "classData", MTD_Object_Class); + if (classData.size() == 1) { + ClassData p = classData.get(0); + cob.checkcast(p.desc) + .putstatic(classDesc, p.name, p.desc); } else { - emitIconstInsn((int) x); - mv.visitInsn(Opcodes.I2F); - } - return; - } - } - if (con instanceof Double) { - double x = (double) con; - short sx = (short)x; - if (x == sx) { - if (sx >= 0 && sx <= 1) { - mv.visitInsn(Opcodes.DCONST_0 + (int) sx); - } else { - emitIconstInsn((int) x); - mv.visitInsn(Opcodes.I2D); + cob.checkcast(CD_List) + .astore(0); + int index = 0; + var listGet = cob.constantPool().interfaceMethodRefEntry(CD_List, "get", MTD_Object_int); + for (ClassData p : classData) { + // initialize the static field + cob.aload(0) + .loadConstant(index++) + .invokeinterface(listGet) + .checkcast(p.desc) + .putstatic(classDesc, p.name, p.desc); + } } - return; + cob.return_(); } - } - if (con instanceof Boolean) { - emitIconstInsn((boolean) con ? 1 : 0); - return; - } - // fall through: - mv.visitLdcInsn(con); - } - - private void emitIconstInsn(final int cst) { - emitIconstInsn(mv, cst); - } - - private static void emitIconstInsn(MethodVisitor mv, int cst) { - if (cst >= -1 && cst <= 5) { - mv.visitInsn(Opcodes.ICONST_0 + cst); - } else if (cst >= Byte.MIN_VALUE && cst <= Byte.MAX_VALUE) { - mv.visitIntInsn(Opcodes.BIPUSH, cst); - } else if (cst >= Short.MIN_VALUE && cst <= Short.MAX_VALUE) { - mv.visitIntInsn(Opcodes.SIPUSH, cst); - } else { - mv.visitLdcInsn(cst); - } - } - - /* - * NOTE: These load/store methods use the localsMap to find the correct index! - */ - private void emitLoadInsn(BasicType type, int index) { - int opcode = loadInsnOpcode(type); - mv.visitVarInsn(opcode, localsMap[index]); + })); } - private int loadInsnOpcode(BasicType type) throws InternalError { - return switch (type) { - case I_TYPE -> Opcodes.ILOAD; - case J_TYPE -> Opcodes.LLOAD; - case F_TYPE -> Opcodes.FLOAD; - case D_TYPE -> Opcodes.DLOAD; - case L_TYPE -> Opcodes.ALOAD; - default -> throw new InternalError("unknown type: " + type); - }; - } - private void emitAloadInsn(int index) { - emitLoadInsn(L_TYPE, index); + private void emitLoadInsn(CodeBuilder cob, TypeKind type, int index) { + cob.loadLocal(type, localsMap[index]); } - private void emitStoreInsn(BasicType type, int index) { - int opcode = storeInsnOpcode(type); - mv.visitVarInsn(opcode, localsMap[index]); - } - - private int storeInsnOpcode(BasicType type) throws InternalError { - return switch (type) { - case I_TYPE -> Opcodes.ISTORE; - case J_TYPE -> Opcodes.LSTORE; - case F_TYPE -> Opcodes.FSTORE; - case D_TYPE -> Opcodes.DSTORE; - case L_TYPE -> Opcodes.ASTORE; - default -> throw new InternalError("unknown type: " + type); - }; - } - private void emitAstoreInsn(int index) { - emitStoreInsn(L_TYPE, index); - } - - private byte arrayTypeCode(Wrapper elementType) { - return (byte) switch (elementType) { - case BOOLEAN -> Opcodes.T_BOOLEAN; - case BYTE -> Opcodes.T_BYTE; - case CHAR -> Opcodes.T_CHAR; - case SHORT -> Opcodes.T_SHORT; - case INT -> Opcodes.T_INT; - case LONG -> Opcodes.T_LONG; - case FLOAT -> Opcodes.T_FLOAT; - case DOUBLE -> Opcodes.T_DOUBLE; - case OBJECT -> 0; // in place of Opcodes.T_OBJECT - default -> throw new InternalError(); - }; - } - - private int arrayInsnOpcode(byte tcode, int aaop) throws InternalError { - assert(aaop == Opcodes.AASTORE || aaop == Opcodes.AALOAD); - int xas = switch (tcode) { - case Opcodes.T_BOOLEAN -> Opcodes.BASTORE; - case Opcodes.T_BYTE -> Opcodes.BASTORE; - case Opcodes.T_CHAR -> Opcodes.CASTORE; - case Opcodes.T_SHORT -> Opcodes.SASTORE; - case Opcodes.T_INT -> Opcodes.IASTORE; - case Opcodes.T_LONG -> Opcodes.LASTORE; - case Opcodes.T_FLOAT -> Opcodes.FASTORE; - case Opcodes.T_DOUBLE -> Opcodes.DASTORE; - case 0 -> Opcodes.AASTORE; - default -> throw new InternalError(); - }; - return xas - Opcodes.AASTORE + aaop; + private void emitStoreInsn(CodeBuilder cob, TypeKind type, int index) { + cob.storeLocal(type, localsMap[index]); } /** @@ -521,11 +372,8 @@ private int arrayInsnOpcode(byte tcode, int aaop) throws InternalError { * * @param wrapper primitive type class to box. */ - private void emitBoxing(Wrapper wrapper) { - String owner = "java/lang/" + wrapper.wrapperType().getSimpleName(); - String name = "valueOf"; - String desc = "(" + wrapper.basicTypeChar() + ")L" + owner + ";"; - mv.visitMethodInsn(Opcodes.INVOKESTATIC, owner, name, desc, false); + private void emitBoxing(CodeBuilder cob, TypeKind tk) { + TypeConvertingMethodAdapter.box(cob, tk); } /** @@ -533,12 +381,15 @@ private void emitBoxing(Wrapper wrapper) { * * @param wrapper wrapper type class to unbox. */ - private void emitUnboxing(Wrapper wrapper) { - String owner = "java/lang/" + wrapper.wrapperType().getSimpleName(); - String name = wrapper.primitiveSimpleName() + "Value"; - String desc = "()" + wrapper.basicTypeChar(); - emitReferenceCast(wrapper.wrapperType(), null); - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, owner, name, desc, false); + private void emitUnboxing(CodeBuilder cob, TypeKind target) { + switch (target) { + case BooleanType -> emitReferenceCast(cob, Boolean.class, null); + case CharType -> emitReferenceCast(cob, Character.class, null); + case ByteType, DoubleType, FloatType, IntType, LongType, ShortType -> + emitReferenceCast(cob, Number.class, null); + default -> {} + } + TypeConvertingMethodAdapter.unbox(cob, target); } /** @@ -549,7 +400,7 @@ private void emitUnboxing(Wrapper wrapper) { * @param pclass type of value required on stack * @param arg compile-time representation of value on stack (Node, constant) or null if none */ - private void emitImplicitConversion(BasicType ptype, Class<?> pclass, Object arg) { + private void emitImplicitConversion(CodeBuilder cob, BasicType ptype, Class<?> pclass, Object arg) { assert(basicType(pclass) == ptype); // boxing/unboxing handled by caller if (pclass == ptype.basicTypeClass() && ptype != L_TYPE) return; // nothing to do @@ -557,14 +408,14 @@ private void emitImplicitConversion(BasicType ptype, Class<?> pclass, Object arg case L_TYPE: if (VerifyType.isNullConversion(Object.class, pclass, false)) { if (PROFILE_LEVEL > 0) - emitReferenceCast(Object.class, arg); + emitReferenceCast(cob, Object.class, arg); return; } - emitReferenceCast(pclass, arg); + emitReferenceCast(cob, pclass, arg); return; case I_TYPE: if (!VerifyType.isNullConversion(int.class, pclass, false)) - emitPrimCast(ptype.basicTypeWrapper(), Wrapper.forPrimitiveType(pclass)); + emitPrimCast(cob, ptype.basicTypeKind(), TypeKind.from(pclass)); return; } throw newInternalError("bad implicit conversion: tc="+ptype+": "+pclass); @@ -582,7 +433,7 @@ private boolean assertStaticType(Class<?> cls, Name n) { return false; } - private void emitReferenceCast(Class<?> cls, Object arg) { + private void emitReferenceCast(CodeBuilder cob, Class<?> cls, Object arg) { Name writeBack = null; // local to write back result if (arg instanceof Name n) { if (lambdaForm.useCount(n) > 1) { @@ -594,53 +445,23 @@ private void emitReferenceCast(Class<?> cls, Object arg) { } } if (isStaticallyNameable(cls)) { - String sig = getInternalName(cls); - mv.visitTypeInsn(Opcodes.CHECKCAST, sig); + ClassDesc sig = classDesc(cls); + cob.checkcast(sig); } else { - mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(cls), "Ljava/lang/Class;"); - mv.visitInsn(Opcodes.SWAP); - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, CLS, "cast", LL_SIG, false); + cob.getstatic(classDesc, classData(cls), CD_Class) + .swap() + .invokevirtual(CD_Class, "cast", MTD_Object_Object); if (Object[].class.isAssignableFrom(cls)) - mv.visitTypeInsn(Opcodes.CHECKCAST, OBJARY); + cob.checkcast(CD_Object_array); else if (PROFILE_LEVEL > 0) - mv.visitTypeInsn(Opcodes.CHECKCAST, OBJ); + cob.checkcast(CD_Object); } if (writeBack != null) { - mv.visitInsn(Opcodes.DUP); - emitAstoreInsn(writeBack.index()); + cob.dup(); + emitStoreInsn(cob, TypeKind.ReferenceType, writeBack.index()); } } - /** - * Emits an actual return instruction conforming to the given return type. - */ - private void emitReturnInsn(BasicType type) { - int opcode = switch (type) { - case I_TYPE -> Opcodes.IRETURN; - case J_TYPE -> Opcodes.LRETURN; - case F_TYPE -> Opcodes.FRETURN; - case D_TYPE -> Opcodes.DRETURN; - case L_TYPE -> Opcodes.ARETURN; - case V_TYPE -> Opcodes.RETURN; - default -> throw new InternalError("unknown return type: " + type); - }; - mv.visitInsn(opcode); - } - - private String getInternalName(Class<?> c) { - if (c == Object.class) return OBJ; - else if (c == Object[].class) return OBJARY; - else if (c == Class.class) return CLS; - else if (c == MethodHandle.class) return MH; - assert(VerifyAccess.ensureTypeVisible(c, Object.class)) : c.getName(); - - if (c == lastClass) { - return lastInternalName; - } - lastClass = c; - return lastInternalName = c.getName().replace('.', '/'); - } - private static MemberName resolveFrom(String name, MethodType type, Class<?> holder) { assert(!UNSAFE.shouldBeInitialized(holder)) : holder + "not initialized"; MemberName member = new MemberName(holder, name, type, REF_invokeStatic); @@ -713,173 +534,151 @@ static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType } /** Generates code to check that actual receiver and LambdaForm matches */ - private boolean checkActualReceiver() { + private boolean checkActualReceiver(CodeBuilder cob) { // Expects MethodHandle on the stack and actual receiver MethodHandle in slot #0 - mv.visitInsn(Opcodes.DUP); - mv.visitVarInsn(Opcodes.ALOAD, localsMap[0]); - mv.visitMethodInsn(Opcodes.INVOKESTATIC, MHI, "assertSame", LLV_SIG, false); + cob.dup() + .aload(0) + .invokestatic(CD_MethodHandleImpl, "assertSame", MethodTypeDescImpl.ofValidated(CD_void, CD_Object, CD_Object)); return true; } - static String className(String cn) { - assert checkClassName(cn): "Class not found: " + cn; - return cn; - } - - static boolean checkClassName(String cn) { - Type tp = Type.getType(cn); - // additional sanity so only valid "L;" descriptors work - if (tp.getSort() != Type.OBJECT) { - return false; - } - try { - Class<?> c = Class.forName(tp.getClassName(), false, null); - return true; - } catch (ClassNotFoundException e) { - return false; - } - } - - static final String DONTINLINE_SIG = className("Ljdk/internal/vm/annotation/DontInline;"); - static final String FORCEINLINE_SIG = className("Ljdk/internal/vm/annotation/ForceInline;"); - static final String HIDDEN_SIG = className("Ljdk/internal/vm/annotation/Hidden;"); - static final String INJECTEDPROFILE_SIG = className("Ljava/lang/invoke/InjectedProfile;"); - static final String LF_COMPILED_SIG = className("Ljava/lang/invoke/LambdaForm$Compiled;"); + static final Annotation DONTINLINE = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljdk/internal/vm/annotation/DontInline;")); + static final Annotation FORCEINLINE = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljdk/internal/vm/annotation/ForceInline;")); + static final Annotation HIDDEN = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljdk/internal/vm/annotation/Hidden;")); + static final Annotation INJECTEDPROFILE = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/InjectedProfile;")); + static final Annotation LF_COMPILED = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm$Compiled;")); /** * Generate an invoker method for the passed {@link LambdaForm}. */ private byte[] generateCustomizedCodeBytes() { - classFilePrologue(); - addMethod(); - clinit(cw, className, classData); - bogusMethod(lambdaForm); - - return toByteArray(); + final byte[] classFile = classFileSetup(new Consumer<ClassBuilder>() { + @Override + public void accept(ClassBuilder clb) { + addMethod(clb); + clinit(clb, classDesc, classData); + bogusMethod(clb, lambdaForm); + } + }); + return classFile; } - void setClassWriter(ClassWriter cw) { - this.cw = cw; - } + void addMethod(ClassBuilder clb) { + methodSetup(clb, new Consumer<MethodBuilder>() { + @Override + public void accept(MethodBuilder mb) { - void addMethod() { - methodPrologue(); + List<Annotation> annotations = new ArrayList<>(3); - // Suppress this method in backtraces displayed to the user. - mv.visitAnnotation(HIDDEN_SIG, true); + // Suppress this method in backtraces displayed to the user. + annotations.add(HIDDEN); - // Mark this method as a compiled LambdaForm - mv.visitAnnotation(LF_COMPILED_SIG, true); + // Mark this method as a compiled LambdaForm + annotations.add(LF_COMPILED); - if (lambdaForm.forceInline) { - // Force inlining of this invoker method. - mv.visitAnnotation(FORCEINLINE_SIG, true); - } else { - mv.visitAnnotation(DONTINLINE_SIG, true); - } + if (lambdaForm.forceInline) { + // Force inlining of this invoker method. + annotations.add(FORCEINLINE); + } else { + annotations.add(DONTINLINE); + } + mb.accept(RuntimeVisibleAnnotationsAttribute.of(annotations)); + + classData(lambdaForm); // keep LambdaForm instance & its compiled form lifetime tightly coupled. + + mb.withCode(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + if (lambdaForm.customized != null) { + // Since LambdaForm is customized for a particular MethodHandle, it's safe to substitute + // receiver MethodHandle (at slot #0) with an embedded constant and use it instead. + // It enables more efficient code generation in some situations, since embedded constants + // are compile-time constants for JIT compiler. + cob.getstatic(classDesc, classData(lambdaForm.customized), CD_MethodHandle) + .checkcast(CD_MethodHandle); + assert(checkActualReceiver(cob)); // expects MethodHandle on top of the stack + cob.astore(0); + } - classData(lambdaForm); // keep LambdaForm instance & its compiled form lifetime tightly coupled. - - if (lambdaForm.customized != null) { - // Since LambdaForm is customized for a particular MethodHandle, it's safe to substitute - // receiver MethodHandle (at slot #0) with an embedded constant and use it instead. - // It enables more efficient code generation in some situations, since embedded constants - // are compile-time constants for JIT compiler. - mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(lambdaForm.customized), MH_SIG); - mv.visitTypeInsn(Opcodes.CHECKCAST, MH); - assert(checkActualReceiver()); // expects MethodHandle on top of the stack - mv.visitVarInsn(Opcodes.ASTORE, localsMap[0]); - } + // iterate over the form's names, generating bytecode instructions for each + // start iterating at the first name following the arguments + Name onStack = null; + for (int i = lambdaForm.arity; i < lambdaForm.names.length; i++) { + Name name = lambdaForm.names[i]; + + emitStoreResult(cob, onStack); + onStack = name; // unless otherwise modified below + MethodHandleImpl.Intrinsic intr = name.function.intrinsicName(); + switch (intr) { + case SELECT_ALTERNATIVE: + assert lambdaForm.isSelectAlternative(i); + if (PROFILE_GWT) { + assert(name.arguments[0] instanceof Name n && + n.refersTo(MethodHandleImpl.class, "profileBoolean")); + mb.with(RuntimeVisibleAnnotationsAttribute.of(List.of(INJECTEDPROFILE))); + } + onStack = emitSelectAlternative(cob, name, lambdaForm.names[i+1]); + i++; // skip MH.invokeBasic of the selectAlternative result + continue; + case GUARD_WITH_CATCH: + assert lambdaForm.isGuardWithCatch(i); + onStack = emitGuardWithCatch(cob, i); + i += 2; // jump to the end of GWC idiom + continue; + case TRY_FINALLY: + assert lambdaForm.isTryFinally(i); + onStack = emitTryFinally(cob, i); + i += 2; // jump to the end of the TF idiom + continue; + case TABLE_SWITCH: + assert lambdaForm.isTableSwitch(i); + int numCases = (Integer) name.function.intrinsicData(); + onStack = emitTableSwitch(cob, i, numCases); + i += 2; // jump to the end of the TS idiom + continue; + case LOOP: + assert lambdaForm.isLoop(i); + onStack = emitLoop(cob, i); + i += 2; // jump to the end of the LOOP idiom + continue; + case ARRAY_LOAD: + emitArrayLoad(cob, name); + continue; + case ARRAY_STORE: + emitArrayStore(cob, name); + continue; + case ARRAY_LENGTH: + emitArrayLength(cob, name); + continue; + case IDENTITY: + assert(name.arguments.length == 1); + emitPushArguments(cob, name, 0); + continue; + case ZERO: + assert(name.arguments.length == 0); + cob.loadConstant((ConstantDesc)name.type.basicTypeWrapper().zero()); + continue; + case NONE: + // no intrinsic associated + break; + default: + throw newInternalError("Unknown intrinsic: "+intr); + } + + MemberName member = name.function.member(); + if (isStaticallyInvocable(member)) { + emitStaticInvoke(cob, member, name); + } else { + emitInvoke(cob, name); + } + } - // iterate over the form's names, generating bytecode instructions for each - // start iterating at the first name following the arguments - Name onStack = null; - for (int i = lambdaForm.arity; i < lambdaForm.names.length; i++) { - Name name = lambdaForm.names[i]; - - emitStoreResult(onStack); - onStack = name; // unless otherwise modified below - MethodHandleImpl.Intrinsic intr = name.function.intrinsicName(); - switch (intr) { - case SELECT_ALTERNATIVE: - assert lambdaForm.isSelectAlternative(i); - if (PROFILE_GWT) { - assert(name.arguments[0] instanceof Name n && - n.refersTo(MethodHandleImpl.class, "profileBoolean")); - mv.visitAnnotation(INJECTEDPROFILE_SIG, true); + // return statement + emitReturn(cob, onStack); } - onStack = emitSelectAlternative(name, lambdaForm.names[i+1]); - i++; // skip MH.invokeBasic of the selectAlternative result - continue; - case GUARD_WITH_CATCH: - assert lambdaForm.isGuardWithCatch(i); - onStack = emitGuardWithCatch(i); - i += 2; // jump to the end of GWC idiom - continue; - case TRY_FINALLY: - assert lambdaForm.isTryFinally(i); - onStack = emitTryFinally(i); - i += 2; // jump to the end of the TF idiom - continue; - case TABLE_SWITCH: - assert lambdaForm.isTableSwitch(i); - int numCases = (Integer) name.function.intrinsicData(); - onStack = emitTableSwitch(i, numCases); - i += 2; // jump to the end of the TS idiom - continue; - case LOOP: - assert lambdaForm.isLoop(i); - onStack = emitLoop(i); - i += 2; // jump to the end of the LOOP idiom - continue; - case ARRAY_LOAD: - emitArrayLoad(name); - continue; - case ARRAY_STORE: - emitArrayStore(name); - continue; - case ARRAY_LENGTH: - emitArrayLength(name); - continue; - case IDENTITY: - assert(name.arguments.length == 1); - emitPushArguments(name, 0); - continue; - case ZERO: - assert(name.arguments.length == 0); - emitConst(name.type.basicTypeWrapper().zero()); - continue; - case NONE: - // no intrinsic associated - break; - default: - throw newInternalError("Unknown intrinsic: "+intr); - } - - MemberName member = name.function.member(); - if (isStaticallyInvocable(member)) { - emitStaticInvoke(member, name); - } else { - emitInvoke(name); + }); } - } - - // return statement - emitReturn(onStack); - - methodEpilogue(); - } - - /* - * @throws BytecodeGenerationException if something goes wrong when - * generating the byte code - */ - private byte[] toByteArray() { - try { - return cw.toByteArray(); - } catch (RuntimeException e) { - throw new BytecodeGenerationException(e); - } + }); } /** @@ -892,48 +691,60 @@ static final class BytecodeGenerationException extends RuntimeException { } } - void emitArrayLoad(Name name) { emitArrayOp(name, Opcodes.AALOAD); } - void emitArrayStore(Name name) { emitArrayOp(name, Opcodes.AASTORE); } - void emitArrayLength(Name name) { emitArrayOp(name, Opcodes.ARRAYLENGTH); } + void emitArrayLoad(CodeBuilder cob, Name name) { + Class<?> elementType = name.function.methodType().parameterType(0).getComponentType(); + assert elementType != null; + emitPushArguments(cob, name, 0); + if (elementType.isPrimitive()) { + cob.arrayLoad(TypeKind.from(elementType)); + } else { + cob.aaload(); + } + } - void emitArrayOp(Name name, int arrayOpcode) { - assert arrayOpcode == Opcodes.AALOAD || arrayOpcode == Opcodes.AASTORE || arrayOpcode == Opcodes.ARRAYLENGTH; + void emitArrayStore(CodeBuilder cob, Name name) { Class<?> elementType = name.function.methodType().parameterType(0).getComponentType(); assert elementType != null; - emitPushArguments(name, 0); - if (arrayOpcode != Opcodes.ARRAYLENGTH && elementType.isPrimitive()) { - Wrapper w = Wrapper.forPrimitiveType(elementType); - arrayOpcode = arrayInsnOpcode(arrayTypeCode(w), arrayOpcode); + emitPushArguments(cob, name, 0); + if (elementType.isPrimitive()) { + cob.arrayStore(TypeKind.from(elementType)); + } else { + cob.aastore(); } - mv.visitInsn(arrayOpcode); + } + + void emitArrayLength(CodeBuilder cob, Name name) { + assert name.function.methodType().parameterType(0).isArray(); + emitPushArguments(cob, name, 0); + cob.arraylength(); } /** * Emit an invoke for the given name. */ - void emitInvoke(Name name) { + void emitInvoke(CodeBuilder cob, Name name) { assert(!name.isLinkerMethodInvoke()); // should use the static path for these if (true) { // push receiver MethodHandle target = name.function.resolvedHandle(); assert(target != null) : name.exprString(); - mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(target), MH_SIG); - emitReferenceCast(MethodHandle.class, target); + cob.getstatic(classDesc, classData(target), CD_MethodHandle); + emitReferenceCast(cob, MethodHandle.class, target); } else { // load receiver - emitAloadInsn(0); - emitReferenceCast(MethodHandle.class, null); - mv.visitFieldInsn(Opcodes.GETFIELD, MH, "form", LF_SIG); - mv.visitFieldInsn(Opcodes.GETFIELD, LF, "names", LFN_SIG); + cob.aload(0); + emitReferenceCast(cob, MethodHandle.class, null); + cob.getfield(CD_MethodHandle, "form", CD_LambdaForm) + .getfield(CD_LambdaForm, "names", CD_LambdaForm_Name); // TODO more to come } // push arguments - emitPushArguments(name, 0); + emitPushArguments(cob, name, 0); // invocation MethodType type = name.function.methodType(); - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false); + cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(type.basicType())); } private static final Class<?>[] STATICALLY_INVOCABLE_PACKAGES = { @@ -1020,19 +831,18 @@ static boolean isStaticallyNameable(Class<?> cls) { return false; } - void emitStaticInvoke(Name name) { - emitStaticInvoke(name.function.member(), name); + void emitStaticInvoke(CodeBuilder cob, Name name) { + emitStaticInvoke(cob, name.function.member(), name); } /** * Emit an invoke for the given name, using the MemberName directly. */ - void emitStaticInvoke(MemberName member, Name name) { + void emitStaticInvoke(CodeBuilder cob, MemberName member, Name name) { assert(member.equals(name.function.member())); Class<?> defc = member.getDeclaringClass(); - String cname = getInternalName(defc); + ClassDesc cdesc = classDesc(defc); String mname = member.getName(); - String mtype; byte refKind = member.getReferenceKind(); if (refKind == REF_invokeSpecial) { // in order to pass the verifier, we need to convert this to invokevirtual in all cases @@ -1043,16 +853,16 @@ void emitStaticInvoke(MemberName member, Name name) { assert(!(member.getDeclaringClass().isInterface() && refKind == REF_invokeVirtual)); // push arguments - emitPushArguments(name, 0); + emitPushArguments(cob, name, 0); // invocation if (member.isMethod()) { - mtype = member.getMethodType().toMethodDescriptorString(); - mv.visitMethodInsn(refKindOpcode(refKind), cname, mname, mtype, - member.getDeclaringClass().isInterface()); + var methodTypeDesc = methodDesc(member.getMethodType()); + cob.invoke(refKindOpcode(refKind), cdesc, mname, methodTypeDesc, + member.getDeclaringClass().isInterface()); } else { - mtype = MethodType.toFieldDescriptorString(member.getFieldType()); - mv.visitFieldInsn(refKindOpcode(refKind), cname, mname, mtype); + var fieldTypeDesc = classDesc(member.getFieldType()); + cob.fieldAccess(refKindOpcode(refKind), cdesc, mname, fieldTypeDesc); } // Issue a type assertion for the result, so we can avoid casts later. if (name.type == L_TYPE) { @@ -1064,16 +874,16 @@ void emitStaticInvoke(MemberName member, Name name) { } } - int refKindOpcode(byte refKind) { + Opcode refKindOpcode(byte refKind) { switch (refKind) { - case REF_invokeVirtual: return Opcodes.INVOKEVIRTUAL; - case REF_invokeStatic: return Opcodes.INVOKESTATIC; - case REF_invokeSpecial: return Opcodes.INVOKESPECIAL; - case REF_invokeInterface: return Opcodes.INVOKEINTERFACE; - case REF_getField: return Opcodes.GETFIELD; - case REF_putField: return Opcodes.PUTFIELD; - case REF_getStatic: return Opcodes.GETSTATIC; - case REF_putStatic: return Opcodes.PUTSTATIC; + case REF_invokeVirtual: return Opcode.INVOKEVIRTUAL; + case REF_invokeStatic: return Opcode.INVOKESTATIC; + case REF_invokeSpecial: return Opcode.INVOKESPECIAL; + case REF_invokeInterface: return Opcode.INVOKEINTERFACE; + case REF_getField: return Opcode.GETFIELD; + case REF_putField: return Opcode.PUTFIELD; + case REF_getStatic: return Opcode.GETSTATIC; + case REF_putStatic: return Opcode.PUTSTATIC; } throw new InternalError("refKind="+refKind); } @@ -1089,40 +899,40 @@ int refKindOpcode(byte refKind) { * t4:I=MethodHandle.invokeBasic(t3:L,a1:I);t4:I} * }</pre></blockquote> */ - private Name emitSelectAlternative(Name selectAlternativeName, Name invokeBasicName) { + private Name emitSelectAlternative(CodeBuilder cob, Name selectAlternativeName, Name invokeBasicName) { assert isStaticallyInvocable(invokeBasicName); Name receiver = (Name) invokeBasicName.arguments[0]; - Label L_fallback = new Label(); - Label L_done = new Label(); + Label L_fallback = cob.newLabel(); + Label L_done = cob.newLabel(); // load test result - emitPushArgument(selectAlternativeName, 0); + emitPushArgument(cob, selectAlternativeName, 0); // if_icmpne L_fallback - mv.visitJumpInsn(Opcodes.IFEQ, L_fallback); + cob.ifeq(L_fallback); // invoke selectAlternativeName.arguments[1] Class<?>[] preForkClasses = localClasses.clone(); - emitPushArgument(selectAlternativeName, 1); // get 2nd argument of selectAlternative - emitAstoreInsn(receiver.index()); // store the MH in the receiver slot - emitStaticInvoke(invokeBasicName); + emitPushArgument(cob, selectAlternativeName, 1); // get 2nd argument of selectAlternative + emitStoreInsn(cob, TypeKind.ReferenceType, receiver.index()); // store the MH in the receiver slot + emitStaticInvoke(cob, invokeBasicName); // goto L_done - mv.visitJumpInsn(Opcodes.GOTO, L_done); + cob.goto_w(L_done); // L_fallback: - mv.visitLabel(L_fallback); + cob.labelBinding(L_fallback); // invoke selectAlternativeName.arguments[2] System.arraycopy(preForkClasses, 0, localClasses, 0, preForkClasses.length); - emitPushArgument(selectAlternativeName, 2); // get 3rd argument of selectAlternative - emitAstoreInsn(receiver.index()); // store the MH in the receiver slot - emitStaticInvoke(invokeBasicName); + emitPushArgument(cob, selectAlternativeName, 2); // get 3rd argument of selectAlternative + emitStoreInsn(cob, TypeKind.ReferenceType, receiver.index()); // store the MH in the receiver slot + emitStaticInvoke(cob, invokeBasicName); // L_done: - mv.visitLabel(L_done); + cob.labelBinding(L_done); // for now do not bother to merge typestate; just reset to the dominator state System.arraycopy(preForkClasses, 0, localClasses, 0, preForkClasses.length); @@ -1149,57 +959,57 @@ private Name emitSelectAlternative(Name selectAlternativeName, Name invokeBasicN * return a3.invokeBasic(ex, a6, a7); * }}</pre></blockquote> */ - private Name emitGuardWithCatch(int pos) { + private Name emitGuardWithCatch(CodeBuilder cob, int pos) { Name args = lambdaForm.names[pos]; Name invoker = lambdaForm.names[pos+1]; Name result = lambdaForm.names[pos+2]; - Label L_startBlock = new Label(); - Label L_endBlock = new Label(); - Label L_handler = new Label(); - Label L_done = new Label(); + Label L_startBlock = cob.newLabel(); + Label L_endBlock = cob.newLabel(); + Label L_handler = cob.newLabel(); + Label L_done = cob.newLabel(); Class<?> returnType = result.function.resolvedHandle().type().returnType(); MethodType type = args.function.resolvedHandle().type() .dropParameterTypes(0,1) .changeReturnType(returnType); - mv.visitTryCatchBlock(L_startBlock, L_endBlock, L_handler, "java/lang/Throwable"); + cob.exceptionCatch(L_startBlock, L_endBlock, L_handler, CD_Throwable); // Normal case - mv.visitLabel(L_startBlock); + cob.labelBinding(L_startBlock); // load target - emitPushArgument(invoker, 0); - emitPushArguments(args, 1); // skip 1st argument: method handle - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false); - mv.visitLabel(L_endBlock); - mv.visitJumpInsn(Opcodes.GOTO, L_done); + emitPushArgument(cob, invoker, 0); + emitPushArguments(cob, args, 1); // skip 1st argument: method handle + cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(type.basicType())); + cob.labelBinding(L_endBlock); + cob.goto_w(L_done); // Exceptional case - mv.visitLabel(L_handler); + cob.labelBinding(L_handler); // Check exception's type - mv.visitInsn(Opcodes.DUP); + cob.dup(); // load exception class - emitPushArgument(invoker, 1); - mv.visitInsn(Opcodes.SWAP); - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "isInstance", "(Ljava/lang/Object;)Z", false); - Label L_rethrow = new Label(); - mv.visitJumpInsn(Opcodes.IFEQ, L_rethrow); + emitPushArgument(cob, invoker, 1); + cob.swap(); + cob.invokevirtual(CD_Class, "isInstance", MTD_boolean_Object); + Label L_rethrow = cob.newLabel(); + cob.ifeq(L_rethrow); // Invoke catcher // load catcher - emitPushArgument(invoker, 2); - mv.visitInsn(Opcodes.SWAP); - emitPushArguments(args, 1); // skip 1st argument: method handle + emitPushArgument(cob, invoker, 2); + cob.swap(); + emitPushArguments(cob, args, 1); // skip 1st argument: method handle MethodType catcherType = type.insertParameterTypes(0, Throwable.class); - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", catcherType.basicType().toMethodDescriptorString(), false); - mv.visitJumpInsn(Opcodes.GOTO, L_done); + cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(catcherType.basicType())); + cob.goto_w(L_done); - mv.visitLabel(L_rethrow); - mv.visitInsn(Opcodes.ATHROW); + cob.labelBinding(L_rethrow); + cob.athrow(); - mv.visitLabel(L_done); + cob.labelBinding(L_done); return result; } @@ -1264,15 +1074,15 @@ private Name emitGuardWithCatch(int pos) { * }</pre></blockquote> * * = depends on whether the return type takes up 2 stack slots. */ - private Name emitTryFinally(int pos) { + private Name emitTryFinally(CodeBuilder cob, int pos) { Name args = lambdaForm.names[pos]; Name invoker = lambdaForm.names[pos+1]; Name result = lambdaForm.names[pos+2]; - Label lFrom = new Label(); - Label lTo = new Label(); - Label lCatch = new Label(); - Label lDone = new Label(); + Label lFrom = cob.newLabel(); + Label lTo = cob.newLabel(); + Label lCatch = cob.newLabel(); + Label lDone = cob.newLabel(); Class<?> returnType = result.function.resolvedHandle().type().returnType(); BasicType basicReturnType = BasicType.basicType(returnType); @@ -1285,68 +1095,64 @@ private Name emitTryFinally(int pos) { if (isNonVoid) { cleanupType = cleanupType.insertParameterTypes(1, returnType); } - String cleanupDesc = cleanupType.basicType().toMethodDescriptorString(); + MethodTypeDesc cleanupDesc = methodDesc(cleanupType.basicType()); // exception handler table - mv.visitTryCatchBlock(lFrom, lTo, lCatch, "java/lang/Throwable"); + cob.exceptionCatch(lFrom, lTo, lCatch, CD_Throwable); // TRY: - mv.visitLabel(lFrom); - emitPushArgument(invoker, 0); // load target - emitPushArguments(args, 1); // load args (skip 0: method handle) - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false); - mv.visitLabel(lTo); + cob.labelBinding(lFrom); + emitPushArgument(cob, invoker, 0); // load target + emitPushArguments(cob, args, 1); // load args (skip 0: method handle) + cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(type.basicType())); + cob.labelBinding(lTo); // FINALLY_NORMAL: int index = extendLocalsMap(new Class<?>[]{ returnType }); if (isNonVoid) { - emitStoreInsn(basicReturnType, index); + emitStoreInsn(cob, basicReturnType.basicTypeKind(), index); } - emitPushArgument(invoker, 1); // load cleanup - mv.visitInsn(Opcodes.ACONST_NULL); + emitPushArgument(cob, invoker, 1); // load cleanup + cob.loadConstant(null); if (isNonVoid) { - emitLoadInsn(basicReturnType, index); + emitLoadInsn(cob, basicReturnType.basicTypeKind(), index); } - emitPushArguments(args, 1); // load args (skip 0: method handle) - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", cleanupDesc, false); - mv.visitJumpInsn(Opcodes.GOTO, lDone); + emitPushArguments(cob, args, 1); // load args (skip 0: method handle) + cob.invokevirtual(CD_MethodHandle, "invokeBasic", cleanupDesc); + cob.goto_w(lDone); // CATCH: - mv.visitLabel(lCatch); - mv.visitInsn(Opcodes.DUP); + cob.labelBinding(lCatch); + cob.dup(); // FINALLY_EXCEPTIONAL: - emitPushArgument(invoker, 1); // load cleanup - mv.visitInsn(Opcodes.SWAP); + emitPushArgument(cob, invoker, 1); // load cleanup + cob.swap(); if (isNonVoid) { - emitZero(BasicType.basicType(returnType)); // load default for result + emitZero(cob, BasicType.basicType(returnType)); // load default for result } - emitPushArguments(args, 1); // load args (skip 0: method handle) - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", cleanupDesc, false); + emitPushArguments(cob, args, 1); // load args (skip 0: method handle) + cob.invokevirtual(CD_MethodHandle, "invokeBasic", cleanupDesc); if (isNonVoid) { - emitPopInsn(basicReturnType); + emitPopInsn(cob, basicReturnType); } - mv.visitInsn(Opcodes.ATHROW); + cob.athrow(); // DONE: - mv.visitLabel(lDone); + cob.labelBinding(lDone); return result; } - private void emitPopInsn(BasicType type) { - mv.visitInsn(popInsnOpcode(type)); - } - - private static int popInsnOpcode(BasicType type) { - return switch (type) { - case I_TYPE, F_TYPE, L_TYPE -> Opcodes.POP; - case J_TYPE, D_TYPE -> Opcodes.POP2; + private void emitPopInsn(CodeBuilder cob, BasicType type) { + switch (type) { + case I_TYPE, F_TYPE, L_TYPE -> cob.pop(); + case J_TYPE, D_TYPE -> cob.pop2(); default -> throw new InternalError("unknown type: " + type); - }; + } } - private Name emitTableSwitch(int pos, int numCases) { + private Name emitTableSwitch(CodeBuilder cob, int pos, int numCases) { Name args = lambdaForm.names[pos]; Name invoker = lambdaForm.names[pos + 1]; Name result = lambdaForm.names[pos + 2]; @@ -1355,45 +1161,44 @@ private Name emitTableSwitch(int pos, int numCases) { MethodType caseType = args.function.resolvedHandle().type() .dropParameterTypes(0, 1) // drop collector .changeReturnType(returnType); - String caseDescriptor = caseType.basicType().toMethodDescriptorString(); + MethodTypeDesc caseDescriptor = methodDesc(caseType.basicType()); - emitPushArgument(invoker, 2); // push cases - mv.visitFieldInsn(Opcodes.GETFIELD, "java/lang/invoke/MethodHandleImpl$CasesHolder", "cases", - "[Ljava/lang/invoke/MethodHandle;"); + emitPushArgument(cob, invoker, 2); // push cases + cob.getfield(CD_CasesHolder, "cases", CD_MethodHandle_array); int casesLocal = extendLocalsMap(new Class<?>[] { MethodHandle[].class }); - emitStoreInsn(L_TYPE, casesLocal); + emitStoreInsn(cob, TypeKind.ReferenceType, casesLocal); - Label endLabel = new Label(); - Label defaultLabel = new Label(); - Label[] caseLabels = new Label[numCases]; - for (int i = 0; i < caseLabels.length; i++) { - caseLabels[i] = new Label(); + Label endLabel = cob.newLabel(); + Label defaultLabel = cob.newLabel(); + List<SwitchCase> cases = new ArrayList<>(numCases); + for (int i = 0; i < numCases; i++) { + cases.add(SwitchCase.of(i, cob.newLabel())); } - emitPushArgument(invoker, 0); // push switch input - mv.visitTableSwitchInsn(0, numCases - 1, defaultLabel, caseLabels); + emitPushArgument(cob, invoker, 0); // push switch input + cob.tableswitch(0, numCases - 1, defaultLabel, cases); - mv.visitLabel(defaultLabel); - emitPushArgument(invoker, 1); // push default handle - emitPushArguments(args, 1); // again, skip collector - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", caseDescriptor, false); - mv.visitJumpInsn(Opcodes.GOTO, endLabel); + cob.labelBinding(defaultLabel); + emitPushArgument(cob, invoker, 1); // push default handle + emitPushArguments(cob, args, 1); // again, skip collector + cob.invokevirtual(CD_MethodHandle, "invokeBasic", caseDescriptor); + cob.goto_(endLabel); for (int i = 0; i < numCases; i++) { - mv.visitLabel(caseLabels[i]); + cob.labelBinding(cases.get(i).target()); // Load the particular case: - emitLoadInsn(L_TYPE, casesLocal); - emitIconstInsn(i); - mv.visitInsn(Opcodes.AALOAD); + emitLoadInsn(cob, TypeKind.ReferenceType, casesLocal); + cob.loadConstant(i); + cob.aaload(); // invoke it: - emitPushArguments(args, 1); // again, skip collector - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", caseDescriptor, false); + emitPushArguments(cob, args, 1); // again, skip collector + cob.invokevirtual(CD_MethodHandle, "invokeBasic", caseDescriptor); - mv.visitJumpInsn(Opcodes.GOTO, endLabel); + cob.goto_(endLabel); } - mv.visitLabel(endLabel); + cob.labelBinding(endLabel); return result; } @@ -1480,7 +1285,7 @@ private Name emitTableSwitch(int pos, int numCases) { * GOTO DONE // jump beyond end of clauses to return from loop * }</pre></blockquote> */ - private Name emitLoop(int pos) { + private Name emitLoop(CodeBuilder cob, int pos) { Name args = lambdaForm.names[pos]; Name invoker = lambdaForm.names[pos+1]; Name result = lambdaForm.names[pos+2]; @@ -1488,8 +1293,9 @@ private Name emitLoop(int pos) { // extract clause and loop-local state types // find the type info in the loop invocation BasicType[] loopClauseTypes = (BasicType[]) invoker.arguments[0]; - Class<?>[] loopLocalStateTypes = Stream.of(loopClauseTypes). - filter(bt -> bt != BasicType.V_TYPE).map(BasicType::basicTypeClass).toArray(Class<?>[]::new); + Class<?>[] loopLocalStateTypes = Stream.of(loopClauseTypes) + .filter(bt -> bt != BasicType.V_TYPE) + .map(BasicType::basicTypeClass).toArray(Class<?>[]::new); Class<?>[] localTypes = new Class<?>[loopLocalStateTypes.length + 1]; localTypes[0] = MethodHandleImpl.LoopClauses.class; System.arraycopy(loopLocalStateTypes, 0, localTypes, 1, loopLocalStateTypes.length); @@ -1513,61 +1319,61 @@ private Name emitLoop(int pos) { final int preds = 3; final int finis = 4; - Label lLoop = new Label(); - Label lDone = new Label(); + Label lLoop = cob.newLabel(); + Label lDone = cob.newLabel(); Label lNext; // PREINIT: - emitPushArgument(MethodHandleImpl.LoopClauses.class, invoker.arguments[1]); - mv.visitFieldInsn(Opcodes.GETFIELD, LOOP_CLAUSES, "clauses", MHARY2); - emitAstoreInsn(clauseDataIndex); + emitPushArgument(cob, MethodHandleImpl.LoopClauses.class, invoker.arguments[1]); + cob.getfield(CD_LoopClauses, "clauses", CD_MethodHandle_array2); + emitStoreInsn(cob, TypeKind.ReferenceType, clauseDataIndex); // INIT: for (int c = 0, state = 0; c < nClauses; ++c) { MethodType cInitType = loopType.changeReturnType(loopClauseTypes[c].basicTypeClass()); - emitLoopHandleInvoke(invoker, inits, c, args, false, cInitType, loopLocalStateTypes, clauseDataIndex, + emitLoopHandleInvoke(cob, invoker, inits, c, args, false, cInitType, loopLocalStateTypes, clauseDataIndex, firstLoopStateIndex); if (cInitType.returnType() != void.class) { - emitStoreInsn(BasicType.basicType(cInitType.returnType()), firstLoopStateIndex + state); + emitStoreInsn(cob, BasicType.basicType(cInitType.returnType()).basicTypeKind(), firstLoopStateIndex + state); ++state; } } // LOOP: - mv.visitLabel(lLoop); + cob.labelBinding(lLoop); for (int c = 0, state = 0; c < nClauses; ++c) { - lNext = new Label(); + lNext = cob.newLabel(); MethodType stepType = loopHandleType.changeReturnType(loopClauseTypes[c].basicTypeClass()); boolean isVoid = stepType.returnType() == void.class; // invoke loop step - emitLoopHandleInvoke(invoker, steps, c, args, true, stepType, loopLocalStateTypes, clauseDataIndex, + emitLoopHandleInvoke(cob, invoker, steps, c, args, true, stepType, loopLocalStateTypes, clauseDataIndex, firstLoopStateIndex); if (!isVoid) { - emitStoreInsn(BasicType.basicType(stepType.returnType()), firstLoopStateIndex + state); + emitStoreInsn(cob, BasicType.basicType(stepType.returnType()).basicTypeKind(), firstLoopStateIndex + state); ++state; } // invoke loop predicate - emitLoopHandleInvoke(invoker, preds, c, args, true, predType, loopLocalStateTypes, clauseDataIndex, + emitLoopHandleInvoke(cob, invoker, preds, c, args, true, predType, loopLocalStateTypes, clauseDataIndex, firstLoopStateIndex); - mv.visitJumpInsn(Opcodes.IFNE, lNext); + cob.ifne(lNext); // invoke fini - emitLoopHandleInvoke(invoker, finis, c, args, true, finiType, loopLocalStateTypes, clauseDataIndex, + emitLoopHandleInvoke(cob, invoker, finis, c, args, true, finiType, loopLocalStateTypes, clauseDataIndex, firstLoopStateIndex); - mv.visitJumpInsn(Opcodes.GOTO, lDone); + cob.goto_w(lDone); // this is the beginning of the next loop clause - mv.visitLabel(lNext); + cob.labelBinding(lNext); } - mv.visitJumpInsn(Opcodes.GOTO, lLoop); + cob.goto_w(lLoop); // DONE: - mv.visitLabel(lDone); + cob.labelBinding(lDone); return result; } @@ -1588,69 +1394,67 @@ private int extendLocalsMap(Class<?>[] types) { return firstSlot; } - private void emitLoopHandleInvoke(Name holder, int handles, int clause, Name args, boolean pushLocalState, + private void emitLoopHandleInvoke(CodeBuilder cob, Name holder, int handles, int clause, Name args, boolean pushLocalState, MethodType type, Class<?>[] loopLocalStateTypes, int clauseDataSlot, int firstLoopStateSlot) { // load handle for clause - emitPushClauseArray(clauseDataSlot, handles); - emitIconstInsn(clause); - mv.visitInsn(Opcodes.AALOAD); + emitPushClauseArray(cob, clauseDataSlot, handles); + cob.loadConstant(clause); + cob.aaload(); // load loop state (preceding the other arguments) if (pushLocalState) { for (int s = 0; s < loopLocalStateTypes.length; ++s) { - emitLoadInsn(BasicType.basicType(loopLocalStateTypes[s]), firstLoopStateSlot + s); + emitLoadInsn(cob, BasicType.basicType(loopLocalStateTypes[s]).basicTypeKind(), firstLoopStateSlot + s); } } // load loop args (skip 0: method handle) - emitPushArguments(args, 1); - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.toMethodDescriptorString(), false); + emitPushArguments(cob, args, 1); + cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(type)); } - private void emitPushClauseArray(int clauseDataSlot, int which) { - emitAloadInsn(clauseDataSlot); - emitIconstInsn(which - 1); - mv.visitInsn(Opcodes.AALOAD); + private void emitPushClauseArray(CodeBuilder cob, int clauseDataSlot, int which) { + emitLoadInsn(cob, TypeKind.ReferenceType, clauseDataSlot); + cob.loadConstant(which - 1); + cob.aaload(); } - private void emitZero(BasicType type) { - mv.visitInsn(switch (type) { - case I_TYPE -> Opcodes.ICONST_0; - case J_TYPE -> Opcodes.LCONST_0; - case F_TYPE -> Opcodes.FCONST_0; - case D_TYPE -> Opcodes.DCONST_0; - case L_TYPE -> Opcodes.ACONST_NULL; + private void emitZero(CodeBuilder cob, BasicType type) { + switch (type) { + case I_TYPE -> cob.iconst_0(); + case J_TYPE -> cob.lconst_0(); + case F_TYPE -> cob.fconst_0(); + case D_TYPE -> cob.dconst_0(); + case L_TYPE -> cob.aconst_null(); default -> throw new InternalError("unknown type: " + type); - }); + }; } - private void emitPushArguments(Name args, int start) { + private void emitPushArguments(CodeBuilder cob, Name args, int start) { MethodType type = args.function.methodType(); for (int i = start; i < args.arguments.length; i++) { - emitPushArgument(type.parameterType(i), args.arguments[i]); + emitPushArgument(cob, type.parameterType(i), args.arguments[i]); } } - private void emitPushArgument(Name name, int paramIndex) { + private void emitPushArgument(CodeBuilder cob, Name name, int paramIndex) { Object arg = name.arguments[paramIndex]; Class<?> ptype = name.function.methodType().parameterType(paramIndex); - emitPushArgument(ptype, arg); + emitPushArgument(cob, ptype, arg); } - private void emitPushArgument(Class<?> ptype, Object arg) { + private void emitPushArgument(CodeBuilder cob, Class<?> ptype, Object arg) { BasicType bptype = basicType(ptype); if (arg instanceof Name n) { - emitLoadInsn(n.type, n.index()); - emitImplicitConversion(n.type, ptype, n); - } else if (arg == null && bptype == L_TYPE) { - mv.visitInsn(Opcodes.ACONST_NULL); - } else if (arg instanceof String && bptype == L_TYPE) { - mv.visitLdcInsn(arg); + emitLoadInsn(cob, n.type.basicTypeKind(), n.index()); + emitImplicitConversion(cob, n.type, ptype, n); + } else if ((arg == null || arg instanceof String) && bptype == L_TYPE) { + cob.loadConstant((ConstantDesc)arg); } else { if (Wrapper.isWrapperType(arg.getClass()) && bptype != L_TYPE) { - emitConst(arg); + cob.loadConstant((ConstantDesc)arg); } else { - mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(arg), "Ljava/lang/Object;"); - emitImplicitConversion(L_TYPE, ptype, arg); + cob.getstatic(classDesc, classData(arg), CD_Object); + emitImplicitConversion(cob, L_TYPE, ptype, arg); } } } @@ -1658,44 +1462,44 @@ private void emitPushArgument(Class<?> ptype, Object arg) { /** * Store the name to its local, if necessary. */ - private void emitStoreResult(Name name) { + private void emitStoreResult(CodeBuilder cob, Name name) { if (name != null && name.type != V_TYPE) { // non-void: actually assign - emitStoreInsn(name.type, name.index()); + emitStoreInsn(cob, name.type.basicTypeKind(), name.index()); } } /** * Emits a return statement from a LF invoker. If required, the result type is cast to the correct return type. */ - private void emitReturn(Name onStack) { + private void emitReturn(CodeBuilder cob, Name onStack) { // return statement Class<?> rclass = invokerType.returnType(); BasicType rtype = lambdaForm.returnType(); assert(rtype == basicType(rclass)); // must agree if (rtype == V_TYPE) { // void - mv.visitInsn(Opcodes.RETURN); + cob.return_(); // it doesn't matter what rclass is; the JVM will discard any value } else { LambdaForm.Name rn = lambdaForm.names[lambdaForm.result]; // put return value on the stack if it is not already there if (rn != onStack) { - emitLoadInsn(rtype, lambdaForm.result); + emitLoadInsn(cob, rtype.basicTypeKind(), lambdaForm.result); } - emitImplicitConversion(rtype, rclass, rn); + emitImplicitConversion(cob, rtype, rclass, rn); // generate actual return statement - emitReturnInsn(rtype); + cob.return_(rtype.basicTypeKind()); } } /** * Emit a type conversion bytecode casting from "from" to "to". */ - private void emitPrimCast(Wrapper from, Wrapper to) { + private void emitPrimCast(CodeBuilder cob, TypeKind from, TypeKind to) { // Here's how. // - indicates forbidden // <-> indicates implicit @@ -1708,80 +1512,10 @@ private void emitPrimCast(Wrapper from, Wrapper to) { // long - l2i,i2b l2i,i2s l2i,i2c l2i <-> l2f l2d // float - f2i,i2b f2i,i2s f2i,i2c f2i f2l <-> f2d // double - d2i,i2b d2i,i2s d2i,i2c d2i d2l d2f <-> - if (from == to) { - // no cast required, should be dead code anyway - return; - } - if (from.isSubwordOrInt()) { - // cast from {byte,short,char,int} to anything - emitI2X(to); - } else { - // cast from {long,float,double} to anything - if (to.isSubwordOrInt()) { - // cast to {byte,short,char,int} - emitX2I(from); - if (to.bitWidth() < 32) { - // targets other than int require another conversion - emitI2X(to); - } - } else { - // cast to {long,float,double} - this is verbose - boolean error = false; - switch (from) { - case LONG -> { - switch (to) { - case FLOAT -> mv.visitInsn(Opcodes.L2F); - case DOUBLE -> mv.visitInsn(Opcodes.L2D); - default -> error = true; - } - } - case FLOAT -> { - switch (to) { - case LONG -> mv.visitInsn(Opcodes.F2L); - case DOUBLE -> mv.visitInsn(Opcodes.F2D); - default -> error = true; - } - } - case DOUBLE -> { - switch (to) { - case LONG -> mv.visitInsn(Opcodes.D2L); - case FLOAT -> mv.visitInsn(Opcodes.D2F); - default -> error = true; - } - } - default -> error = true; - } - if (error) { - throw new IllegalStateException("unhandled prim cast: " + from + "2" + to); - } - } - } - } - - private void emitI2X(Wrapper type) { - switch (type) { - case BYTE: mv.visitInsn(Opcodes.I2B); break; - case SHORT: mv.visitInsn(Opcodes.I2S); break; - case CHAR: mv.visitInsn(Opcodes.I2C); break; - case INT: /* naught */ break; - case LONG: mv.visitInsn(Opcodes.I2L); break; - case FLOAT: mv.visitInsn(Opcodes.I2F); break; - case DOUBLE: mv.visitInsn(Opcodes.I2D); break; - case BOOLEAN: - // For compatibility with ValueConversions and explicitCastArguments: - mv.visitInsn(Opcodes.ICONST_1); - mv.visitInsn(Opcodes.IAND); - break; - default: throw new InternalError("unknown type: " + type); - } - } - - private void emitX2I(Wrapper type) { - switch (type) { - case LONG -> mv.visitInsn(Opcodes.L2I); - case FLOAT -> mv.visitInsn(Opcodes.F2I); - case DOUBLE -> mv.visitInsn(Opcodes.D2I); - default -> throw new InternalError("unknown type: " + type); + if (from != to && from != TypeKind.BooleanType) try { + cob.conversion(from, to); + } catch (IllegalArgumentException e) { + throw new IllegalStateException("unhandled prim cast: " + from + "2" + to); } } @@ -1798,51 +1532,61 @@ static MemberName generateLambdaFormInterpreterEntryPoint(MethodType mt) { } private byte[] generateLambdaFormInterpreterEntryPointBytes() { - classFilePrologue(); - methodPrologue(); - - // Suppress this method in backtraces displayed to the user. - mv.visitAnnotation(HIDDEN_SIG, true); - - // Don't inline the interpreter entry. - mv.visitAnnotation(DONTINLINE_SIG, true); - - // create parameter array - emitIconstInsn(invokerType.parameterCount()); - mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object"); - - // fill parameter array - for (int i = 0; i < invokerType.parameterCount(); i++) { - Class<?> ptype = invokerType.parameterType(i); - mv.visitInsn(Opcodes.DUP); - emitIconstInsn(i); - emitLoadInsn(basicType(ptype), i); - // box if primitive type - if (ptype.isPrimitive()) { - emitBoxing(Wrapper.forPrimitiveType(ptype)); + final byte[] classFile = classFileSetup(new Consumer<ClassBuilder>() { + @Override + public void accept(ClassBuilder clb) { + methodSetup(clb, new Consumer<MethodBuilder>() { + @Override + public void accept(MethodBuilder mb) { + + mb.with(RuntimeVisibleAnnotationsAttribute.of(List.of( + HIDDEN, // Suppress this method in backtraces displayed to the user. + DONTINLINE // Don't inline the interpreter entry. + ))); + + mb.withCode(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + // create parameter array + cob.loadConstant(invokerType.parameterCount()); + cob.anewarray(CD_Object); + + // fill parameter array + for (int i = 0; i < invokerType.parameterCount(); i++) { + Class<?> ptype = invokerType.parameterType(i); + cob.dup(); + cob.loadConstant(i); + emitLoadInsn(cob, basicType(ptype).basicTypeKind(), i); + // box if primitive type + if (ptype.isPrimitive()) { + emitBoxing(cob, TypeKind.from(ptype)); + } + cob.aastore(); + } + // invoke + cob.aload(0); + cob.getfield(CD_MethodHandle, "form", CD_LambdaForm); + cob.swap(); // swap form and array; avoid local variable + cob.invokevirtual(CD_LambdaForm, "interpretWithArguments", MethodTypeDescImpl.ofValidated(CD_Object, CD_Object_array)); + + // maybe unbox + Class<?> rtype = invokerType.returnType(); + TypeKind rtypeK = TypeKind.from(rtype); + if (rtype.isPrimitive() && rtype != void.class) { + emitUnboxing(cob, rtypeK); + } + + // return statement + cob.return_(rtypeK); + } + }); + } + }); + clinit(clb, classDesc, classData); + bogusMethod(clb, invokerType); } - mv.visitInsn(Opcodes.AASTORE); - } - // invoke - emitAloadInsn(0); - mv.visitFieldInsn(Opcodes.GETFIELD, MH, "form", "Ljava/lang/invoke/LambdaForm;"); - mv.visitInsn(Opcodes.SWAP); // swap form and array; avoid local variable - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, LF, "interpretWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false); - - // maybe unbox - Class<?> rtype = invokerType.returnType(); - if (rtype.isPrimitive() && rtype != void.class) { - emitUnboxing(Wrapper.forPrimitiveType(rtype)); - } - - // return statement - emitReturnInsn(basicType(rtype)); - - methodEpilogue(); - clinit(cw, className, classData); - bogusMethod(invokerType); - - return cw.toByteArray(); + }); + return classFile; } /** @@ -1857,73 +1601,101 @@ static MemberName generateNamedFunctionInvoker(MethodTypeForm typeForm) { private byte[] generateNamedFunctionInvokerImpl(MethodTypeForm typeForm) { MethodType dstType = typeForm.erasedType(); - classFilePrologue(); - methodPrologue(); - - // Suppress this method in backtraces displayed to the user. - mv.visitAnnotation(HIDDEN_SIG, true); - - // Force inlining of this invoker method. - mv.visitAnnotation(FORCEINLINE_SIG, true); - - // Load receiver - emitAloadInsn(0); - - // Load arguments from array - for (int i = 0; i < dstType.parameterCount(); i++) { - emitAloadInsn(1); - emitIconstInsn(i); - mv.visitInsn(Opcodes.AALOAD); - - // Maybe unbox - Class<?> dptype = dstType.parameterType(i); - if (dptype.isPrimitive()) { - Wrapper dstWrapper = Wrapper.forBasicType(dptype); - Wrapper srcWrapper = dstWrapper.isSubwordOrInt() ? Wrapper.INT : dstWrapper; // narrow subword from int - emitUnboxing(srcWrapper); - emitPrimCast(srcWrapper, dstWrapper); + final byte[] classFile = classFileSetup(new Consumer<ClassBuilder>() { + @Override + public void accept(ClassBuilder clb) { + methodSetup(clb, new Consumer<MethodBuilder>() { + @Override + public void accept(MethodBuilder mb) { + + mb.with(RuntimeVisibleAnnotationsAttribute.of(List.of( + HIDDEN, // Suppress this method in backtraces displayed to the user. + FORCEINLINE // Force inlining of this invoker method. + ))); + + mb.withCode(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + // Load receiver + cob.aload(0); + + // Load arguments from array + for (int i = 0; i < dstType.parameterCount(); i++) { + cob.aload(1); + cob.loadConstant(i); + cob.aaload(); + + // Maybe unbox + Class<?> dptype = dstType.parameterType(i); + if (dptype.isPrimitive()) { + TypeKind dstTK = TypeKind.from(dptype); + TypeKind srcTK = dstTK.asLoadable(); + emitUnboxing(cob, srcTK); + emitPrimCast(cob, srcTK, dstTK); + } + } + + // Invoke + MethodTypeDesc targetDesc = methodDesc(dstType.basicType()); + cob.invokevirtual(CD_MethodHandle, "invokeBasic", targetDesc); + + // Box primitive types + Class<?> rtype = dstType.returnType(); + if (rtype != void.class && rtype.isPrimitive()) { + TypeKind srcTK = TypeKind.from(rtype); + TypeKind dstTK = srcTK.asLoadable(); + // boolean casts not allowed + emitPrimCast(cob, srcTK, dstTK); + emitBoxing(cob, dstTK); + } + + // If the return type is void we return a null reference. + if (rtype == void.class) { + cob.aconst_null(); + } + cob.areturn(); // NOTE: NamedFunction invokers always return a reference value. + } + }); + } + }); + clinit(clb, classDesc, classData); + bogusMethod(clb, dstType); } - } - - // Invoke - String targetDesc = dstType.basicType().toMethodDescriptorString(); - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", targetDesc, false); - - // Box primitive types - Class<?> rtype = dstType.returnType(); - if (rtype != void.class && rtype.isPrimitive()) { - Wrapper srcWrapper = Wrapper.forBasicType(rtype); - Wrapper dstWrapper = srcWrapper.isSubwordOrInt() ? Wrapper.INT : srcWrapper; // widen subword to int - // boolean casts not allowed - emitPrimCast(srcWrapper, dstWrapper); - emitBoxing(dstWrapper); - } - - // If the return type is void we return a null reference. - if (rtype == void.class) { - mv.visitInsn(Opcodes.ACONST_NULL); - } - emitReturnInsn(L_TYPE); // NOTE: NamedFunction invokers always return a reference value. - - methodEpilogue(); - clinit(cw, className, classData); - bogusMethod(dstType); - - return cw.toByteArray(); + }); + return classFile; } /** * Emit a bogus method that just loads some string constants. This is to get the constants into the constant pool * for debugging purposes. */ - private void bogusMethod(Object os) { + private void bogusMethod(ClassBuilder clb, Object os) { if (dumper().isEnabled()) { - mv = cw.visitMethod(Opcodes.ACC_STATIC, "dummy", "()V", null, null); - mv.visitLdcInsn(os.toString()); - mv.visitInsn(Opcodes.POP); - mv.visitInsn(Opcodes.RETURN); - mv.visitMaxs(0, 0); - mv.visitEnd(); + clb.withMethod("dummy", MTD_void, ACC_STATIC, new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + cob.loadConstant(os.toString()); + cob.pop(); + cob.return_(); + } + })); + } + } + + static ClassDesc classDesc(Class<?> cls) { +// assert(VerifyAccess.isTypeVisible(cls, Object.class)) : cls.getName(); + return cls.isPrimitive() ? Wrapper.forPrimitiveType(cls).basicClassDescriptor() + : cls == MethodHandle.class ? CD_MethodHandle + : cls == DirectMethodHandle.class ? CD_DirectMethodHandle + : cls == Object.class ? CD_Object + : ReferenceClassDescImpl.ofValidated(cls.descriptorString()); + } + + static MethodTypeDesc methodDesc(MethodType mt) { + var params = new ClassDesc[mt.parameterCount()]; + for (int i = 0; i < params.length; i++) { + params[i] = classDesc(mt.parameterType(i)); } + return MethodTypeDescImpl.ofValidated(classDesc(mt.returnType()), params); } } diff --git a/src/java.base/share/classes/java/lang/invoke/LambdaForm.java b/src/java.base/share/classes/java/lang/invoke/LambdaForm.java index 823f527b6c43a..09ea5df4a235f 100644 --- a/src/java.base/share/classes/java/lang/invoke/LambdaForm.java +++ b/src/java.base/share/classes/java/lang/invoke/LambdaForm.java @@ -25,6 +25,7 @@ package java.lang.invoke; +import java.lang.classfile.TypeKind; import jdk.internal.perf.PerfCounter; import jdk.internal.vm.annotation.DontInline; import jdk.internal.vm.annotation.Hidden; @@ -137,12 +138,12 @@ class LambdaForm { public static final int VOID_RESULT = -1, LAST_RESULT = -2; enum BasicType { - L_TYPE('L', Object.class, Wrapper.OBJECT), // all reference types - I_TYPE('I', int.class, Wrapper.INT), - J_TYPE('J', long.class, Wrapper.LONG), - F_TYPE('F', float.class, Wrapper.FLOAT), - D_TYPE('D', double.class, Wrapper.DOUBLE), // all primitive types - V_TYPE('V', void.class, Wrapper.VOID); // not valid in all contexts + L_TYPE('L', Object.class, Wrapper.OBJECT, TypeKind.ReferenceType), // all reference types + I_TYPE('I', int.class, Wrapper.INT, TypeKind.IntType), + J_TYPE('J', long.class, Wrapper.LONG, TypeKind.LongType), + F_TYPE('F', float.class, Wrapper.FLOAT, TypeKind.FloatType), + D_TYPE('D', double.class, Wrapper.DOUBLE, TypeKind.DoubleType), // all primitive types + V_TYPE('V', void.class, Wrapper.VOID, TypeKind.VoidType); // not valid in all contexts static final @Stable BasicType[] ALL_TYPES = BasicType.values(); static final @Stable BasicType[] ARG_TYPES = Arrays.copyOf(ALL_TYPES, ALL_TYPES.length-1); @@ -153,11 +154,13 @@ enum BasicType { final char btChar; final Class<?> btClass; final Wrapper btWrapper; + final TypeKind btKind; - private BasicType(char btChar, Class<?> btClass, Wrapper wrapper) { + private BasicType(char btChar, Class<?> btClass, Wrapper wrapper, TypeKind typeKind) { this.btChar = btChar; this.btClass = btClass; this.btWrapper = wrapper; + this.btKind = typeKind; } char basicTypeChar() { @@ -169,6 +172,9 @@ Class<?> basicTypeClass() { Wrapper basicTypeWrapper() { return btWrapper; } + TypeKind basicTypeKind() { + return btKind; + } int basicTypeSlots() { return btWrapper.stackSlots(); } diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index e79c8463d30b2..57446c9b2fdf0 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -27,8 +27,9 @@ import jdk.internal.access.JavaLangInvokeAccess; import jdk.internal.access.SharedSecrets; +import jdk.internal.constant.MethodTypeDescImpl; +import jdk.internal.constant.ReferenceClassDescImpl; import jdk.internal.foreign.abi.NativeEntryPoint; -import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; import jdk.internal.vm.annotation.ForceInline; @@ -39,6 +40,8 @@ import sun.invoke.util.VerifyType; import sun.invoke.util.Wrapper; +import java.lang.classfile.ClassFile; +import java.lang.constant.ClassDesc; import java.lang.invoke.MethodHandles.Lookup; import java.lang.reflect.Array; import java.lang.reflect.Constructor; @@ -56,13 +59,14 @@ import java.util.function.Function; import java.util.stream.Stream; +import static java.lang.classfile.ClassFile.*; +import static java.lang.constant.ConstantDescs.*; import static java.lang.invoke.LambdaForm.*; import static java.lang.invoke.MethodHandleNatives.Constants.MN_CALLER_SENSITIVE; import static java.lang.invoke.MethodHandleNatives.Constants.MN_HIDDEN_MEMBER; import static java.lang.invoke.MethodHandleStatics.*; import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; import static java.lang.invoke.MethodHandles.Lookup.ClassOption.NESTMATE; -import static jdk.internal.org.objectweb.asm.Opcodes.*; /** * Trusted implementation code for MethodHandle. @@ -1035,8 +1039,10 @@ static MethodHandle bindCaller(MethodHandle mh, Class<?> hostClass) { // Put the whole mess into its own nested class. // That way we can lazily load the code and set up the constants. private static class BindCaller { - private static MethodType INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object[].class); - private static MethodType REFLECT_INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object.class, Object[].class); + + private static final ClassDesc CD_Object_array = ReferenceClassDescImpl.ofValidated("[Ljava/lang/Object;"); + private static final MethodType INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object[].class); + private static final MethodType REFLECT_INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object.class, Object[].class); static MethodHandle bindCaller(MethodHandle mh, Class<?> hostClass) { // Code in the boot layer should now be careful while creating method handles or @@ -1250,8 +1256,6 @@ private static boolean checkCallerClass(Class<?> expected) { /** Produces byte code for a class that is used as an injected invoker. */ private static byte[] generateInvokerTemplate() { - ClassWriter cw = new ClassWriter(0); - // private static class InjectedInvoker { // /* this is used to wrap DMH(s) of caller-sensitive methods */ // @Hidden @@ -1265,39 +1269,25 @@ private static byte[] generateInvokerTemplate() { // } // } // } - cw.visit(CLASSFILE_VERSION, ACC_PRIVATE | ACC_SUPER, "InjectedInvoker", null, "java/lang/Object", null); - { - var mv = cw.visitMethod(ACC_STATIC, "invoke_V", - "(Ljava/lang/invoke/MethodHandle;[Ljava/lang/Object;)Ljava/lang/Object;", - null, null); - - mv.visitCode(); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeExact", - "([Ljava/lang/Object;)Ljava/lang/Object;", false); - mv.visitInsn(ARETURN); - mv.visitMaxs(2, 2); - mv.visitEnd(); - - cw.visitEnd(); - } - - { - var mv = cw.visitMethod(ACC_STATIC, "reflect_invoke_V", - "(Ljava/lang/invoke/MethodHandle;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", - null, null); - mv.visitCode(); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeExact", - "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", false); - mv.visitInsn(ARETURN); - mv.visitMaxs(3, 3); - mv.visitEnd(); - } - return cw.toByteArray(); + return ClassFile.of().build(ReferenceClassDescImpl.ofValidated("LInjectedInvoker;"), clb -> clb + .withFlags(ACC_PRIVATE | ACC_SUPER) + .withMethodBody( + "invoke_V", + MethodTypeDescImpl.ofValidated(CD_Object, CD_MethodHandle, CD_Object_array), + ACC_STATIC, + cob -> cob.aload(0) + .aload(1) + .invokevirtual(CD_MethodHandle, "invokeExact", MethodTypeDescImpl.ofValidated(CD_Object, CD_Object_array)) + .areturn()) + .withMethodBody( + "reflect_invoke_V", + MethodTypeDescImpl.ofValidated(CD_Object, CD_MethodHandle, CD_Object, CD_Object_array), + ACC_STATIC, + cob -> cob.aload(0) + .aload(1) + .aload(2) + .invokevirtual(CD_MethodHandle, "invokeExact", MethodTypeDescImpl.ofValidated(CD_Object, CD_Object, CD_Object_array)) + .areturn())); } } diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index 9ac8e42a2f0c2..0cb77f632b334 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -28,9 +28,6 @@ import jdk.internal.access.SharedSecrets; import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; -import jdk.internal.org.objectweb.asm.ClassReader; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.Type; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.CallerSensitiveAdapter; import jdk.internal.reflect.Reflection; @@ -42,8 +39,10 @@ import sun.reflect.misc.ReflectUtil; import sun.security.util.SecurityConstants; +import java.lang.classfile.ClassModel; import java.lang.constant.ConstantDescs; import java.lang.invoke.LambdaForm.BasicType; +import java.lang.invoke.MethodHandleImpl.Intrinsic; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Member; @@ -62,8 +61,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; +import static java.lang.classfile.ClassFile.*; import static java.lang.invoke.LambdaForm.BasicType.V_TYPE; -import static java.lang.invoke.MethodHandleImpl.Intrinsic; import static java.lang.invoke.MethodHandleNatives.Constants.*; import static java.lang.invoke.MethodHandleStatics.UNSAFE; import static java.lang.invoke.MethodHandleStatics.newIllegalArgumentException; @@ -2288,27 +2287,16 @@ private static ClassFile readClassFile(byte[] bytes) { String name; int accessFlags; try { - ClassReader reader = new ClassReader(bytes); - // ClassReader does not check if `this_class` is CONSTANT_Class_info - // workaround to read `this_class` using readConst and validate the value - int thisClass = reader.readUnsignedShort(reader.header + 2); - Object constant = reader.readConst(thisClass, new char[reader.getMaxStringLength()]); - if (!(constant instanceof Type type)) { - throw new ClassFormatError("this_class item: #" + thisClass + " not a CONSTANT_Class_info"); - } - if (!type.getDescriptor().startsWith("L")) { - throw new ClassFormatError("this_class item: #" + thisClass + " not a CONSTANT_Class_info"); - } - name = type.getInternalName(); - accessFlags = reader.readUnsignedShort(reader.header); - } catch (RuntimeException e) { - // ASM exceptions are poorly specified + ClassModel cm = java.lang.classfile.ClassFile.of().parse(bytes); + name = cm.thisClass().asInternalName(); + accessFlags = cm.flags().flagsMask(); + } catch (IllegalArgumentException e) { ClassFormatError cfe = new ClassFormatError(); cfe.initCause(e); throw cfe; } // must be a class or interface - if ((accessFlags & Opcodes.ACC_MODULE) != 0) { + if ((accessFlags & ACC_MODULE) != 0) { throw newIllegalArgumentException("Not a class or interface: ACC_MODULE flag is set"); } return new ClassFile(name, accessFlags, bytes); diff --git a/src/java.base/share/classes/java/lang/invoke/MethodType.java b/src/java.base/share/classes/java/lang/invoke/MethodType.java index 29a338261e905..faf8302206ede 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodType.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodType.java @@ -1291,15 +1291,21 @@ static String toFieldDescriptorString(Class<?> cls) { */ @Override public Optional<MethodTypeDesc> describeConstable() { - try { - return Optional.of(MethodTypeDesc.of(returnType().describeConstable().orElseThrow(), - Stream.of(parameterArray()) - .map(p -> p.describeConstable().orElseThrow()) - .toArray(ClassDesc[]::new))); - } - catch (NoSuchElementException e) { + var retDesc = returnType().describeConstable(); + if (retDesc.isEmpty()) return Optional.empty(); + + if (parameterCount() == 0) + return Optional.of(MethodTypeDesc.of(retDesc.get())); + + var params = new ClassDesc[parameterCount()]; + for (int i = 0; i < params.length; i++) { + var paramDesc = parameterType(i).describeConstable(); + if (paramDesc.isEmpty()) + return Optional.empty(); + params[i] = paramDesc.get(); } + return Optional.of(MethodTypeDesc.of(retDesc.get(), params)); } //--- Serialization. diff --git a/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java b/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java index e49094073c3ca..e35271dc8b42c 100644 --- a/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java +++ b/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java @@ -25,176 +25,103 @@ package java.lang.invoke; -import jdk.internal.org.objectweb.asm.MethodVisitor; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.Type; -import sun.invoke.util.BytecodeDescriptor; +import java.lang.constant.ClassDesc; +import java.lang.classfile.CodeBuilder; +import java.lang.classfile.TypeKind; +import java.lang.classfile.constantpool.ConstantPoolBuilder; +import java.lang.classfile.constantpool.MethodRefEntry; +import jdk.internal.constant.MethodTypeDescImpl; +import jdk.internal.constant.ReferenceClassDescImpl; import sun.invoke.util.Wrapper; -import static sun.invoke.util.Wrapper.*; -class TypeConvertingMethodAdapter extends MethodVisitor { +import static java.lang.constant.ConstantDescs.*; - TypeConvertingMethodAdapter(MethodVisitor mv) { - super(Opcodes.ASM7, mv); - } - - private static final int NUM_WRAPPERS = Wrapper.COUNT; - - private static final String NAME_OBJECT = "java/lang/Object"; - private static final String WRAPPER_PREFIX = "Ljava/lang/"; - - // Same for all primitives; name of the boxing method - private static final String NAME_BOX_METHOD = "valueOf"; - - // Table of opcodes for widening primitive conversions; NOP = no conversion - private static final int[][] wideningOpcodes = new int[NUM_WRAPPERS][NUM_WRAPPERS]; - - private static final Wrapper[] FROM_WRAPPER_NAME = new Wrapper[16]; - - // Table of wrappers for primitives, indexed by ASM type sorts - private static final Wrapper[] FROM_TYPE_SORT = new Wrapper[12]; - - static { - for (Wrapper w : Wrapper.values()) { - if (w.basicTypeChar() != 'L') { - int wi = hashWrapperName(w.wrapperSimpleName()); - assert (FROM_WRAPPER_NAME[wi] == null); - FROM_WRAPPER_NAME[wi] = w; - } - } - - // wideningOpcodes[][] will be NOP-initialized by default - assert(Opcodes.NOP == 0); +class TypeConvertingMethodAdapter { - initWidening(LONG, Opcodes.I2L, BYTE, SHORT, INT, CHAR); - initWidening(LONG, Opcodes.F2L, FLOAT); - initWidening(FLOAT, Opcodes.I2F, BYTE, SHORT, INT, CHAR); - initWidening(FLOAT, Opcodes.L2F, LONG); - initWidening(DOUBLE, Opcodes.I2D, BYTE, SHORT, INT, CHAR); - initWidening(DOUBLE, Opcodes.F2D, FLOAT); - initWidening(DOUBLE, Opcodes.L2D, LONG); + private static class BoxHolder { + private static final ConstantPoolBuilder CP = ConstantPoolBuilder.of(); - FROM_TYPE_SORT[Type.BYTE] = Wrapper.BYTE; - FROM_TYPE_SORT[Type.SHORT] = Wrapper.SHORT; - FROM_TYPE_SORT[Type.INT] = Wrapper.INT; - FROM_TYPE_SORT[Type.LONG] = Wrapper.LONG; - FROM_TYPE_SORT[Type.CHAR] = Wrapper.CHAR; - FROM_TYPE_SORT[Type.FLOAT] = Wrapper.FLOAT; - FROM_TYPE_SORT[Type.DOUBLE] = Wrapper.DOUBLE; - FROM_TYPE_SORT[Type.BOOLEAN] = Wrapper.BOOLEAN; - } - - private static void initWidening(Wrapper to, int opcode, Wrapper... from) { - for (Wrapper f : from) { - wideningOpcodes[f.ordinal()][to.ordinal()] = opcode; + private static MethodRefEntry box(ClassDesc primitive, ClassDesc target) { + return CP.methodRefEntry(target, "valueOf", MethodTypeDescImpl.ofValidated(target, primitive)); } - } - /** - * Class name to Wrapper hash, derived from Wrapper.hashWrap() - * @param xn - * @return The hash code 0-15 - */ - private static int hashWrapperName(String xn) { - if (xn.length() < 3) { - return 0; + private static final MethodRefEntry BOX_BOOLEAN = box(CD_boolean, CD_Boolean), + BOX_BYTE = box(CD_byte, CD_Byte), + BOX_SHORT = box(CD_short, CD_Short), + BOX_CHAR = box(CD_char, CD_Character), + BOX_INT = box(CD_int, CD_Integer), + BOX_LONG = box(CD_long, CD_Long), + BOX_FLOAT = box(CD_float, CD_Float), + BOX_DOUBLE = box(CD_double, CD_Double); + + private static MethodRefEntry unbox(ClassDesc owner, String methodName, ClassDesc primitiveTarget) { + return CP.methodRefEntry(owner, methodName, MethodTypeDescImpl.ofValidated(primitiveTarget)); } - return (3 * xn.charAt(1) + xn.charAt(2)) % 16; - } - - private Wrapper wrapperOrNullFromDescriptor(String desc) { - if (!desc.startsWith(WRAPPER_PREFIX)) { - // Not a class type (array or method), so not a boxed type - // or not in the right package - return null; - } - // Pare it down to the simple class name - String cname = desc.substring(WRAPPER_PREFIX.length(), desc.length() - 1); - // Hash to a Wrapper - Wrapper w = FROM_WRAPPER_NAME[hashWrapperName(cname)]; - if (w == null || w.wrapperSimpleName().equals(cname)) { - return w; - } else { - return null; - } - } - private static String wrapperName(Wrapper w) { - return "java/lang/" + w.wrapperSimpleName(); + private static final MethodRefEntry UNBOX_BOOLEAN = unbox(CD_Boolean, "booleanValue", CD_boolean), + UNBOX_BYTE = unbox(CD_Number, "byteValue", CD_byte), + UNBOX_SHORT = unbox(CD_Number, "shortValue", CD_short), + UNBOX_CHAR = unbox(CD_Character, "charValue", CD_char), + UNBOX_INT = unbox(CD_Number, "intValue", CD_int), + UNBOX_LONG = unbox(CD_Number, "longValue", CD_long), + UNBOX_FLOAT = unbox(CD_Number, "floatValue", CD_float), + UNBOX_DOUBLE = unbox(CD_Number, "doubleValue", CD_double); } - private static String unboxMethod(Wrapper w) { - return w.primitiveSimpleName() + "Value"; + private static TypeKind primitiveTypeKindFromClass(Class<?> type) { + if (type == int.class) return TypeKind.IntType; + if (type == long.class) return TypeKind.LongType; + if (type == boolean.class) return TypeKind.BooleanType; + if (type == short.class) return TypeKind.ShortType; + if (type == byte.class) return TypeKind.ByteType; + if (type == char.class) return TypeKind.CharType; + if (type == float.class) return TypeKind.FloatType; + if (type == double.class) return TypeKind.DoubleType; + return null; } - private static String boxingDescriptor(Wrapper w) { - return "(" + w.basicTypeChar() + ")L" + wrapperName(w) + ";"; + static void boxIfTypePrimitive(CodeBuilder cob, TypeKind tk) { + box(cob, tk); } - private static String unboxingDescriptor(Wrapper w) { - return "()" + w.basicTypeChar(); - } - - void boxIfTypePrimitive(Type t) { - Wrapper w = FROM_TYPE_SORT[t.getSort()]; - if (w != null) { - box(w); - } - } - - void widen(Wrapper ws, Wrapper wt) { + static void widen(CodeBuilder cob, TypeKind ws, TypeKind wt) { + ws = ws.asLoadable(); + wt = wt.asLoadable(); if (ws != wt) { - int opcode = wideningOpcodes[ws.ordinal()][wt.ordinal()]; - if (opcode != Opcodes.NOP) { - visitInsn(opcode); - } + cob.conversion(ws, wt); } } - void box(Wrapper w) { - visitMethodInsn(Opcodes.INVOKESTATIC, - wrapperName(w), - NAME_BOX_METHOD, - boxingDescriptor(w), false); - } - - /** - * Convert types by unboxing. The source type is known to be a primitive wrapper. - * @param sname A primitive wrapper corresponding to wrapped reference source type - * @param wt A primitive wrapper being converted to - */ - void unbox(String sname, Wrapper wt) { - visitMethodInsn(Opcodes.INVOKEVIRTUAL, - sname, - unboxMethod(wt), - unboxingDescriptor(wt), false); - } - - private String descriptorToName(String desc) { - int last = desc.length() - 1; - if (desc.charAt(0) == 'L' && desc.charAt(last) == ';') { - // In descriptor form - return desc.substring(1, last); - } else { - // Already in internal name form - return desc; + static void box(CodeBuilder cob, TypeKind tk) { + switch (tk) { + case BooleanType -> cob.invokestatic(BoxHolder.BOX_BOOLEAN); + case ByteType -> cob.invokestatic(BoxHolder.BOX_BYTE); + case CharType -> cob.invokestatic(BoxHolder.BOX_CHAR); + case DoubleType -> cob.invokestatic(BoxHolder.BOX_DOUBLE); + case FloatType -> cob.invokestatic(BoxHolder.BOX_FLOAT); + case IntType -> cob.invokestatic(BoxHolder.BOX_INT); + case LongType -> cob.invokestatic(BoxHolder.BOX_LONG); + case ShortType -> cob.invokestatic(BoxHolder.BOX_SHORT); } } - void cast(String ds, String dt) { - String ns = descriptorToName(ds); - String nt = descriptorToName(dt); - if (!nt.equals(ns) && !nt.equals(NAME_OBJECT)) { - visitTypeInsn(Opcodes.CHECKCAST, nt); + static void unbox(CodeBuilder cob, TypeKind to) { + switch (to) { + case BooleanType -> cob.invokevirtual(BoxHolder.UNBOX_BOOLEAN); + case ByteType -> cob.invokevirtual(BoxHolder.UNBOX_BYTE); + case CharType -> cob.invokevirtual(BoxHolder.UNBOX_CHAR); + case DoubleType -> cob.invokevirtual(BoxHolder.UNBOX_DOUBLE); + case FloatType -> cob.invokevirtual(BoxHolder.UNBOX_FLOAT); + case IntType -> cob.invokevirtual(BoxHolder.UNBOX_INT); + case LongType -> cob.invokevirtual(BoxHolder.UNBOX_LONG); + case ShortType -> cob.invokevirtual(BoxHolder.UNBOX_SHORT); } } - private Wrapper toWrapper(String desc) { - char first = desc.charAt(0); - if (first == '[' || first == '(') { - first = 'L'; + static void cast(CodeBuilder cob, ClassDesc dt) { + if (!dt.equals(CD_Object)) { + cob.checkcast(dt); } - return Wrapper.forBasicType(first); } /** @@ -204,7 +131,7 @@ private Wrapper toWrapper(String desc) { * @param target * @param functional */ - void convertType(Class<?> arg, Class<?> target, Class<?> functional) { + static void convertType(CodeBuilder cob, Class<?> arg, Class<?> target, Class<?> functional) { if (arg.equals(target) && arg.equals(functional)) { return; } @@ -212,84 +139,69 @@ void convertType(Class<?> arg, Class<?> target, Class<?> functional) { return; } if (arg.isPrimitive()) { - Wrapper wArg = Wrapper.forPrimitiveType(arg); if (target.isPrimitive()) { // Both primitives: widening - widen(wArg, Wrapper.forPrimitiveType(target)); + widen(cob, TypeKind.from(arg), TypeKind.from(target)); } else { // Primitive argument to reference target - String dTarget = BytecodeDescriptor.unparse(target); - Wrapper wPrimTarget = wrapperOrNullFromDescriptor(dTarget); - if (wPrimTarget != null) { + TypeKind wPrimTk = primitiveTypeKindFromClass(target); + if (wPrimTk != null) { // The target is a boxed primitive type, widen to get there before boxing - widen(wArg, wPrimTarget); - box(wPrimTarget); + widen(cob, TypeKind.from(arg), wPrimTk); + box(cob, wPrimTk); } else { // Otherwise, box and cast - box(wArg); - cast(wrapperName(wArg), dTarget); + box(cob, TypeKind.from(arg)); + cast(cob, classDesc(target)); } } } else { - String dArg = BytecodeDescriptor.unparse(arg); - String dSrc; - if (functional.isPrimitive()) { - dSrc = dArg; + Class<?> src; + if (arg == functional || functional.isPrimitive()) { + src = arg; } else { // Cast to convert to possibly more specific type, and generate CCE for invalid arg - dSrc = BytecodeDescriptor.unparse(functional); - cast(dArg, dSrc); + src = functional; + cast(cob, classDesc(functional)); } - String dTarget = BytecodeDescriptor.unparse(target); if (target.isPrimitive()) { - Wrapper wTarget = toWrapper(dTarget); // Reference argument to primitive target - Wrapper wps = wrapperOrNullFromDescriptor(dSrc); + TypeKind wps = primitiveTypeKindFromClass(src); if (wps != null) { - if (wps.isSigned() || wps.isFloating()) { + if (src != Character.class && src != Boolean.class) { // Boxed number to primitive - unbox(wrapperName(wps), wTarget); + unbox(cob, TypeKind.from(target)); } else { // Character or Boolean - unbox(wrapperName(wps), wps); - widen(wps, wTarget); + unbox(cob, wps); + widen(cob, wps, TypeKind.from(target)); } } else { // Source type is reference type, but not boxed type, // assume it is super type of target type - String intermediate; - if (wTarget.isSigned() || wTarget.isFloating()) { - // Boxed number to primitive - intermediate = "java/lang/Number"; + if (target == char.class) { + cast(cob, CD_Character); + } else if (target == boolean.class) { + cast(cob, CD_Boolean); } else { - // Character or Boolean - intermediate = wrapperName(wTarget); + // Boxed number to primitive + cast(cob, CD_Number); } - cast(dSrc, intermediate); - unbox(intermediate, wTarget); + unbox(cob, TypeKind.from(target)); } } else { // Both reference types: just case to target type - cast(dSrc, dTarget); + if (src != target) { + cast(cob, classDesc(target)); + } } } } - /** - * The following method is copied from - * org.objectweb.asm.commons.InstructionAdapter. Part of ASM: a very small - * and fast Java bytecode manipulation framework. - * Copyright (c) 2000-2005 INRIA, France Telecom All rights reserved. - */ - void iconst(final int cst) { - if (cst >= -1 && cst <= 5) { - mv.visitInsn(Opcodes.ICONST_0 + cst); - } else if (cst >= Byte.MIN_VALUE && cst <= Byte.MAX_VALUE) { - mv.visitIntInsn(Opcodes.BIPUSH, cst); - } else if (cst >= Short.MIN_VALUE && cst <= Short.MAX_VALUE) { - mv.visitIntInsn(Opcodes.SIPUSH, cst); - } else { - mv.visitLdcInsn(cst); - } + static ClassDesc classDesc(Class<?> cls) { + return cls.isPrimitive() ? Wrapper.forPrimitiveType(cls).basicClassDescriptor() + : cls == Object.class ? CD_Object + : cls == String.class ? CD_String + : ReferenceClassDescImpl.ofValidated(cls.descriptorString()); } } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java b/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java index ddb14b2d26a5a..0f1f6fb69de26 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java @@ -25,15 +25,19 @@ */ package jdk.internal.classfile.impl; -import java.lang.classfile.constantpool.InvokeDynamicEntry; -import java.lang.constant.ClassDesc; -import static java.lang.constant.ConstantDescs.*; -import java.lang.constant.MethodTypeDesc; +import java.lang.classfile.Attribute; +import java.lang.classfile.Attributes; +import java.lang.classfile.BufWriter; import java.lang.classfile.ClassFile; +import java.lang.classfile.Label; +import java.lang.classfile.attribute.StackMapTableAttribute; import java.lang.classfile.constantpool.ClassEntry; import java.lang.classfile.constantpool.ConstantDynamicEntry; -import java.lang.classfile.constantpool.MemberRefEntry; import java.lang.classfile.constantpool.ConstantPoolBuilder; +import java.lang.classfile.constantpool.InvokeDynamicEntry; +import java.lang.classfile.constantpool.MemberRefEntry; +import java.lang.constant.ClassDesc; +import java.lang.constant.MethodTypeDesc; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; @@ -41,15 +45,10 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import java.lang.classfile.Attribute; +import jdk.internal.constant.ReferenceClassDescImpl; import static java.lang.classfile.ClassFile.*; -import static jdk.internal.constant.ConstantUtils.binaryNameToDesc; - -import java.lang.classfile.BufWriter; -import java.lang.classfile.Label; -import java.lang.classfile.attribute.StackMapTableAttribute; -import java.lang.classfile.Attributes; +import static java.lang.constant.ConstantDescs.*; /** * StackMapGenerator is responsible for stack map frames generation. @@ -1249,14 +1248,14 @@ private static record Type(int tag, ClassDesc sym, int bci) { //frequently used types to reduce footprint static final Type OBJECT_TYPE = referenceType(CD_Object), THROWABLE_TYPE = referenceType(CD_Throwable), - INT_ARRAY_TYPE = referenceType(CD_int.arrayType()), - BOOLEAN_ARRAY_TYPE = referenceType(CD_boolean.arrayType()), - BYTE_ARRAY_TYPE = referenceType(CD_byte.arrayType()), - CHAR_ARRAY_TYPE = referenceType(CD_char.arrayType()), - SHORT_ARRAY_TYPE = referenceType(CD_short.arrayType()), - LONG_ARRAY_TYPE = referenceType(CD_long.arrayType()), - DOUBLE_ARRAY_TYPE = referenceType(CD_double.arrayType()), - FLOAT_ARRAY_TYPE = referenceType(CD_float.arrayType()), + INT_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[I")), + BOOLEAN_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[Z")), + BYTE_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[B")), + CHAR_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[C")), + SHORT_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[S")), + LONG_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[J")), + DOUBLE_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[D")), + FLOAT_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[F")), STRING_TYPE = referenceType(CD_String), CLASS_TYPE = referenceType(CD_Class), METHOD_HANDLE_TYPE = referenceType(CD_MethodHandle), @@ -1321,8 +1320,8 @@ Type mergeComponentFrom(Type from, ClassHierarchyImpl context) { } } - private static final ClassDesc CD_Cloneable = binaryNameToDesc("java.lang.Cloneable"); - private static final ClassDesc CD_Serializable = binaryNameToDesc("java.io.Serializable"); + private static final ClassDesc CD_Cloneable = ReferenceClassDescImpl.ofValidated("Ljava/lang/Cloneable;"); + private static final ClassDesc CD_Serializable = ReferenceClassDescImpl.ofValidated("Ljava/io/Serializable;"); private Type mergeReferenceFrom(Type from, ClassHierarchyImpl context) { if (from == NULL_TYPE) { diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index a4ff429bd00c3..c7c76c8fa3a2e 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -101,6 +101,7 @@ runtime/StackGuardPages/TestStackGuardPagesNative.java 8303612 linux-all runtime/ErrorHandling/TestDwarf.java#checkDecoder 8305489 linux-all runtime/ErrorHandling/MachCodeFramesInErrorFile.java 8313315 linux-ppc64le runtime/cds/appcds/customLoader/HelloCustom_JFR.java 8241075 linux-all,windows-x64 +runtime/ClassInitErrors/TestStackOverflowDuringInit.java 8334545 generic-all applications/jcstress/copy.java 8229852 linux-all From 856931d01f14b1c665c04e05d5637b8237c56988 Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Wed, 19 Jun 2024 16:23:22 +0000 Subject: [PATCH 110/471] 8304732: jdk/jfr/api/consumer/recordingstream/TestStop.java failed again with "Expected outer stream to have 3 events" Reviewed-by: mgronlun --- src/hotspot/share/jfr/jni/jfrJniMethod.cpp | 5 ++ src/hotspot/share/jfr/jni/jfrJniMethod.hpp | 2 + .../jfr/jni/jfrJniMethodRegistration.cpp | 3 +- .../jfr/recorder/repository/jfrChunk.cpp | 6 +-- .../jfr/recorder/repository/jfrChunk.hpp | 4 +- .../share/jfr/support/jfrIntrinsics.hpp | 4 +- src/hotspot/share/runtime/objectMonitor.cpp | 2 +- .../classes/jdk/jfr/internal/HiddenWait.java | 32 +++++++++++++ .../share/classes/jdk/jfr/internal/JVM.java | 13 ++--- .../classes/jdk/jfr/internal/JVMSupport.java | 8 +--- .../jdk/jfr/internal/MetadataRepository.java | 23 +++++++-- .../consumer/AbstractEventStream.java | 6 +-- .../consumer/EventDirectoryStream.java | 44 ++++++++++------- .../internal/consumer/EventFileStream.java | 4 +- .../internal/management/StreamBarrier.java | 15 ++++-- .../classes/jdk/jfr/internal/util/Utils.java | 6 ++- .../consumer/recordingstream/TestStop.java | 47 +++++++++++-------- 17 files changed, 154 insertions(+), 70 deletions(-) create mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/HiddenWait.java diff --git a/src/hotspot/share/jfr/jni/jfrJniMethod.cpp b/src/hotspot/share/jfr/jni/jfrJniMethod.cpp index 8953976cd0c7a..d60baa3c1cc9a 100644 --- a/src/hotspot/share/jfr/jni/jfrJniMethod.cpp +++ b/src/hotspot/share/jfr/jni/jfrJniMethod.cpp @@ -30,6 +30,7 @@ #include "jfr/recorder/jfrRecorder.hpp" #include "jfr/recorder/checkpoint/jfrMetadataEvent.hpp" #include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp" +#include "jfr/recorder/repository/jfrChunk.hpp" #include "jfr/recorder/repository/jfrRepository.hpp" #include "jfr/recorder/repository/jfrChunkRotation.hpp" #include "jfr/recorder/repository/jfrChunkWriter.hpp" @@ -425,3 +426,7 @@ JVM_END JVM_ENTRY_NO_ENV(void, jfr_unregister_stack_filter(JNIEnv* env, jclass jvm, jlong id)) JfrStackFilterRegistry::remove(id); JVM_END + +NO_TRANSITION(jlong, jfr_nanos_now(JNIEnv* env, jclass jvm)) + return JfrChunk::nanos_now(); +NO_TRANSITION_END diff --git a/src/hotspot/share/jfr/jni/jfrJniMethod.hpp b/src/hotspot/share/jfr/jni/jfrJniMethod.hpp index 6a2d622d7e9a7..ca119c1f8c35a 100644 --- a/src/hotspot/share/jfr/jni/jfrJniMethod.hpp +++ b/src/hotspot/share/jfr/jni/jfrJniMethod.hpp @@ -165,6 +165,8 @@ jlong JNICALL jfr_register_stack_filter(JNIEnv* env, jclass jvm, jobjectArray cl jlong JNICALL jfr_unregister_stack_filter(JNIEnv* env, jclass jvm, jlong id); +jlong JNICALL jfr_nanos_now(JNIEnv* env, jclass jvm); + #ifdef __cplusplus } #endif diff --git a/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp b/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp index 7ef831f6282f0..415c7468a6290 100644 --- a/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp +++ b/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp @@ -100,7 +100,8 @@ JfrJniMethodRegistration::JfrJniMethodRegistration(JNIEnv* env) { (char*)"hostTotalSwapMemory", (char*)"()J", (void*) jfr_host_total_swap_memory, (char*)"emitDataLoss", (char*)"(J)V", (void*)jfr_emit_data_loss, (char*)"registerStackFilter", (char*)"([Ljava/lang/String;[Ljava/lang/String;)J", (void*)jfr_register_stack_filter, - (char*)"unregisterStackFilter", (char*)"(J)V", (void*)jfr_unregister_stack_filter + (char*)"unregisterStackFilter", (char*)"(J)V", (void*)jfr_unregister_stack_filter, + (char*)"nanosNow", (char*)"()J", (void*)jfr_nanos_now }; const size_t method_array_length = sizeof(method) / sizeof(JNINativeMethod); diff --git a/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp b/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp index 6d0ec7773b931..b88ba06bdf799 100644 --- a/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ static const u2 JFR_VERSION_MAJOR = 2; static const u2 JFR_VERSION_MINOR = 1; // strictly monotone -static jlong nanos_now() { +jlong JfrChunk::nanos_now() { static jlong last = 0; jlong seconds; @@ -147,7 +147,7 @@ void JfrChunk::update_start_ticks() { } void JfrChunk::update_start_nanos() { - const jlong now = nanos_now(); + const jlong now = JfrChunk::nanos_now(); assert(now >= _start_nanos, "invariant"); assert(now >= _last_update_nanos, "invariant"); _start_nanos = _last_update_nanos = now; diff --git a/src/hotspot/share/jfr/recorder/repository/jfrChunk.hpp b/src/hotspot/share/jfr/recorder/repository/jfrChunk.hpp index d7bd3411160d7..91b42948181ac 100644 --- a/src/hotspot/share/jfr/recorder/repository/jfrChunk.hpp +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunk.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,8 @@ const u1 PAD = 0; class JfrChunk : public JfrCHeapObj { friend class JfrChunkWriter; friend class JfrChunkHeadWriter; + public: + static jlong nanos_now(); private: char* _path; int64_t _start_ticks; diff --git a/src/hotspot/share/jfr/support/jfrIntrinsics.hpp b/src/hotspot/share/jfr/support/jfrIntrinsics.hpp index 65a94164a9756..6520f3cb00ca0 100644 --- a/src/hotspot/share/jfr/support/jfrIntrinsics.hpp +++ b/src/hotspot/share/jfr/support/jfrIntrinsics.hpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. +* Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,13 +47,13 @@ class JfrIntrinsicSupport : AllStatic { #define JFR_HAVE_INTRINSICS #define JFR_TEMPLATES(template) \ + template(jdk_jfr_internal_HiddenWait, "jdk/jfr/internal/HiddenWait") \ template(jdk_jfr_internal_JVM, "jdk/jfr/internal/JVM") \ template(jdk_jfr_internal_event_EventWriterFactory, "jdk/jfr/internal/event/EventWriterFactory") \ template(jdk_jfr_internal_event_EventConfiguration_signature, "Ljdk/jfr/internal/event/EventConfiguration;") \ template(getEventWriter_signature, "()Ljdk/jfr/internal/event/EventWriter;") \ template(eventConfiguration_name, "eventConfiguration") \ template(commit_name, "commit") \ - template(jfr_chunk_rotation_monitor, "jdk/jfr/internal/JVM$ChunkRotationMonitor") \ #define JFR_INTRINSICS(do_intrinsic, do_class, do_name, do_signature, do_alias) \ do_intrinsic(_counterTime, jdk_jfr_internal_JVM, counterTime_name, void_long_signature, F_SN) \ diff --git a/src/hotspot/share/runtime/objectMonitor.cpp b/src/hotspot/share/runtime/objectMonitor.cpp index 178f3e97d7108..ba463231592c5 100644 --- a/src/hotspot/share/runtime/objectMonitor.cpp +++ b/src/hotspot/share/runtime/objectMonitor.cpp @@ -1442,7 +1442,7 @@ bool ObjectMonitor::check_owner(TRAPS) { static inline bool is_excluded(const Klass* monitor_klass) { assert(monitor_klass != nullptr, "invariant"); NOT_JFR_RETURN_(false); - JFR_ONLY(return vmSymbols::jfr_chunk_rotation_monitor() == monitor_klass->name();) + JFR_ONLY(return vmSymbols::jdk_jfr_internal_HiddenWait() == monitor_klass->name();) } static void post_monitor_wait_event(EventJavaMonitorWait* event, diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/HiddenWait.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/HiddenWait.java new file mode 100644 index 0000000000000..26505990332c9 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/HiddenWait.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.jfr.internal; + +/** + * The HiddenWait class is used to exclude jdk.JavaMonitorWait events + * from being generated when Object.wait() is called on an object of this type. + */ +public final class HiddenWait { +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java index 02edfd1e5abbd..2e600c8c02974 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,14 +41,10 @@ public final class JVM { static final long RESERVED_CLASS_ID_LIMIT = 500; - private static class ChunkRotationMonitor {} - /* * The JVM uses the chunk rotation monitor to notify Java that a rotation is warranted. - * The monitor type is used to exclude jdk.JavaMonitorWait events from being generated - * when Object.wait() is called on this monitor. */ - public static final Object CHUNK_ROTATION_MONITOR = new ChunkRotationMonitor(); + public static final Object CHUNK_ROTATION_MONITOR = new HiddenWait(); private static volatile boolean nativeOK; @@ -174,6 +170,11 @@ private static class ChunkRotationMonitor {} */ public static native long getTicksFrequency(); + /** + * Returns the same clock that sets the start time of a chunk (in nanos). + */ + public static native long nanosNow(); + /** * Write message to log. Should swallow null or empty message, and be able * to handle any Java character and not crash with very large message diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java index 036d49e6e0eb5..345d2fdcc8dfb 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -119,11 +119,7 @@ private static void awaitUniqueTimestamp() { lastTimestamp = time; return; } - try { - Thread.sleep(0, 100); - } catch (InterruptedException iex) { - // ignore - } + Utils.takeNap(1); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java index 7031718cb284e..75be70a0d1dae 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java @@ -64,6 +64,8 @@ public final class MetadataRepository { private boolean unregistered; private long lastUnloaded = -1; + private long lastMillis; + public MetadataRepository() { initializeJVMEventTypes(); } @@ -313,11 +315,12 @@ synchronized Instant setOutput(String filename) { if (staleMetadata) { storeDescriptorInJVM(); } + // Each chunk needs a unique timestamp. If two chunks get the same + // timestamp, the parser may stop prematurely at an earlier chunk. + // The resolution needs to be measured in milliseconds as this + // is what RecordingInfo:getStopTime() returns. + awaitEpochMilliShift(); JVM.setOutput(filename); - // Each chunk needs a unique start timestamp and - // if the clock resolution is low, two chunks may - // get the same timestamp. Utils.getChunkStartNanos() - // ensures the timestamp is unique for the next chunk long chunkStart = JVMSupport.getChunkStartNanos(); if (filename != null) { RepositoryFiles.notifyNewFile(); @@ -332,6 +335,18 @@ synchronized Instant setOutput(String filename) { return Utils.epochNanosToInstant(chunkStart); } + private void awaitEpochMilliShift() { + while (true) { + long nanos = JVM.nanosNow(); + long millis = Utils.epochNanosToInstant(nanos).toEpochMilli(); + if (millis != lastMillis) { + lastMillis = millis; + return; + } + Utils.takeNap(1); + } + } + private void unregisterUnloaded() { long unloaded = JVM.getUnloadedEventClassCount(); if (this.lastUnloaded != unloaded) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/AbstractEventStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/AbstractEventStream.java index e3b43635e3398..cdfc8f017a657 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/AbstractEventStream.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/AbstractEventStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -205,7 +205,7 @@ public final void awaitTermination(Duration timeout) throws InterruptedException protected abstract void process() throws IOException; - protected abstract boolean isRecording(); + protected abstract boolean isRecordingStream(); protected final void closeParser() { parserState.close(); @@ -249,7 +249,7 @@ private void startInternal(long startNanos) { if (streamConfiguration.started) { throw new IllegalStateException("Event stream can only be started once"); } - if (isRecording() && streamConfiguration.startTime == null) { + if (isRecordingStream() && streamConfiguration.startTime == null) { streamConfiguration.setStartNanos(startNanos); } streamConfiguration.setStarted(true); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java index 3ed1c4c8d355b..bc9aa7987c3b5 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,9 +33,11 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; import jdk.jfr.Configuration; +import jdk.jfr.RecordingState; import jdk.jfr.consumer.RecordedEvent; import jdk.jfr.internal.JVM; import jdk.jfr.internal.LogLevel; @@ -59,6 +61,7 @@ public final class EventDirectoryStream extends AbstractEventStream { private final FileAccess fileAccess; private final PlatformRecording recording; private final StreamBarrier barrier = new StreamBarrier(); + private final AtomicLong streamId = new AtomicLong(); private ChunkParser currentParser; private long currentChunkStartNanos; private RecordedEvent[] sortedCache; @@ -80,6 +83,8 @@ public EventDirectoryStream( } this.fileAccess = Objects.requireNonNull(fileAccess); this.repositoryFiles = new RepositoryFiles(fileAccess, p, allowSubDirectories); + this.streamId.incrementAndGet(); + Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Stream " + streamId + " started."); } @Override @@ -137,13 +142,14 @@ protected void processRecursionSafe() throws IOException { Dispatcher lastDisp = null; Dispatcher disp = dispatcher(); Path path; - boolean validStartTime = isRecording() || disp.startTime != null; + boolean validStartTime = isRecordingStream() || disp.startTime != null; if (validStartTime) { path = repositoryFiles.firstPath(disp.startNanos, true); } else { path = repositoryFiles.lastPath(true); } if (path == null) { // closed + logStreamEnd("no first chunk file found."); return; } currentChunkStartNanos = repositoryFiles.getTimestamp(path); @@ -168,7 +174,10 @@ protected void processRecursionSafe() throws IOException { processUnordered(disp); } currentParser.resetCache(); - if (currentParser.getLastFlush() > filterEnd) { + long lastFlush = currentParser.getLastFlush(); + if (lastFlush > filterEnd) { + logStreamEnd("end time at " + filterEnd + + "ns (epoch), parser at " + lastFlush + "ns (epoch)."); return; } } @@ -177,20 +186,25 @@ protected void processRecursionSafe() throws IOException { barrier.check(); // block if recording is being stopped if (barrier.getStreamEnd() <= endMillis) { + String msg = "stopped at " + barrier.getStreamEnd() + "ms (epoch), "; + msg += "parser at " + endMillis + "ms (epoch), " + endNanos + "ns (epoch)"; + logStreamEnd(msg); return; } - if (!barrier.hasStreamEnd() && isLastChunk()) { - // Recording was stopped/closed externally, and no more data to process. - return; + if (isRecordingStream()) { + if (recording.getState() == RecordingState.STOPPED && !barrier.used()) { + logStreamEnd("recording stopped externally."); + return; + } } if (repositoryFiles.hasFixedPath() && currentParser.isFinalChunk()) { - // JVM process exited/crashed, or repository migrated to an unknown location + logStreamEnd("JVM process exited/crashed, or repository migrated to an unknown location."); return; } if (isClosed()) { - // Stream was closed + logStreamEnd("stream closed."); return; } long durationNanos = currentParser.getChunkDuration(); @@ -205,7 +219,8 @@ protected void processRecursionSafe() throws IOException { } path = repositoryFiles.nextPath(currentChunkStartNanos + durationNanos, true); if (path == null) { - return; // stream closed + logStreamEnd("no more chunk files found."); + return; } currentChunkStartNanos = repositoryFiles.getTimestamp(path); input.setFile(path); @@ -217,15 +232,12 @@ protected void processRecursionSafe() throws IOException { } } - - private boolean isLastChunk() { - if (!isRecording()) { - return false; - } - return recording.getFinalChunkStartNanos() >= currentParser.getStartNanos(); + private void logStreamEnd(String text) { + String msg = "Stream " + streamId + " ended, " + text; + Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, msg); } - protected boolean isRecording() { + protected boolean isRecordingStream() { return recording != null; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java index 9ecaf2a6075e5..f03e8d8acb48e 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,7 +73,7 @@ public void close() { } @Override - protected boolean isRecording() { + protected boolean isRecordingStream() { return false; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java index ed94a908d47a4..0b3132da2178b 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,7 @@ public final class StreamBarrier implements Closeable { private boolean activated = false; + private boolean used = false; private long end = Long.MAX_VALUE; // Blocks thread until barrier is deactivated @@ -62,12 +63,9 @@ public synchronized long getStreamEnd() { return end; } - public synchronized boolean hasStreamEnd() { - return end != Long.MAX_VALUE; - } - public synchronized void activate() { activated = true; + used = true; } @Override @@ -75,4 +73,11 @@ public synchronized void close() throws IOException { activated = false; this.notifyAll(); } + + /** + * Returns {@code true) if barrier is, or has been, in active state, {@code false) otherwise. + */ + public synchronized boolean used() { + return used; + } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java index 0049662e9a1f6..5e04a25fe7ddf 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java @@ -48,6 +48,7 @@ import jdk.jfr.Event; import jdk.jfr.EventType; import jdk.jfr.RecordingState; +import jdk.jfr.internal.HiddenWait; import jdk.jfr.internal.LogLevel; import jdk.jfr.internal.LogTag; import jdk.jfr.internal.Logger; @@ -351,8 +352,11 @@ private static boolean isSupportedType(Class<?> type) { } public static void takeNap(long millis) { + HiddenWait hiddenWait = new HiddenWait(); try { - Thread.sleep(millis); + synchronized(hiddenWait) { + hiddenWait.wait(millis); + } } catch (InterruptedException e) { // ok } diff --git a/test/jdk/jdk/jfr/api/consumer/recordingstream/TestStop.java b/test/jdk/jdk/jfr/api/consumer/recordingstream/TestStop.java index 58dcbbcbe2079..36bbaa3c557db 100644 --- a/test/jdk/jdk/jfr/api/consumer/recordingstream/TestStop.java +++ b/test/jdk/jdk/jfr/api/consumer/recordingstream/TestStop.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ * @requires vm.hasJFR * @library /test/lib /test/jdk * @build jdk.jfr.api.consumer.recordingstream.EventProducer - * @run main/othervm jdk.jfr.api.consumer.recordingstream.TestStop + * @run main/othervm -Xlog:system+parser+jfr=info jdk.jfr.api.consumer.recordingstream.TestStop */ public class TestStop { static class StopEvent extends Event { @@ -139,41 +139,50 @@ private static void testNestedStop() throws Exception { Path fileInner = Path.of("inner.jfr"); inner.dump(fileInner); outer.dump(fileOuter); - System.out.println("Outer dump:"); var dumpOuter = RecordingFile.readAllEvents(fileOuter); - for (RecordedEvent e : dumpOuter) { - System.out.println(eventToText(e)); - } - System.out.println("Inner dump:"); var dumpInner = RecordingFile.readAllEvents(fileInner); - for (RecordedEvent e : dumpInner) { - System.out.println(eventToText(e)); - } - System.out.println(); - System.out.println("Outer stream:"); - for (String s : outerStream) { - System.out.println(s); - } - System.out.println("Inner stream:"); - for (String s : innerStream) { - System.out.println(s); - } + if (dumpOuter.size() != 3) { + log(outerStream, innerStream, dumpOuter, dumpInner); throw new AssertionError("Expected outer dump to have 3 events"); } if (outerStream.size() != 3) { + log(outerStream, innerStream, dumpOuter, dumpInner); throw new AssertionError("Expected outer stream to have 3 events"); } if (dumpInner.size() != 1) { + log(outerStream, innerStream, dumpOuter, dumpInner); throw new AssertionError("Expected inner dump to have 1 event"); } if (innerStream.size() != 1) { + log(outerStream, innerStream, dumpOuter, dumpInner); throw new AssertionError("Expected inner stream to have 1 event"); } } } } + private static void log(List<String> outerStream, List<String> innerStream, List<RecordedEvent> dumpOuter, + List<RecordedEvent> dumpInner) { + System.out.println("Outer dump:"); + for (RecordedEvent e : dumpOuter) { + System.out.println(eventToText(e)); + } + System.out.println("Inner dump:"); + for (RecordedEvent e : dumpInner) { + System.out.println(eventToText(e)); + } + System.out.println(); + System.out.println("Outer stream:"); + for (String s : outerStream) { + System.out.println(s); + } + System.out.println("Inner stream:"); + for (String s : innerStream) { + System.out.println(s); + } + } + private static String eventToText(RecordedEvent event) { Instant timestamp = event.getEndTime(); long s = timestamp.getEpochSecond(); From bcf4bb4882e06d8c52f6eb4e9c4e027ba0622c5f Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Wed, 19 Jun 2024 16:35:20 +0000 Subject: [PATCH 111/471] 8333344: JMX attaching of Subject does not work when security manager not allowed Reviewed-by: weijun, dfuchs --- src/java.base/share/classes/module-info.java | 1 + .../remote/rmi/RMIConnectionImpl.java | 91 ++++++++++++++----- .../remote/internal/ServerNotifForwarder.java | 5 +- .../MBeanServerFileAccessController.java | 22 +++-- .../javax/management/monitor/Monitor.java | 36 ++++++-- .../management/monitor/StartStopTest.java | 10 +- .../management/monitor/ThreadPoolAccTest.java | 14 ++- test/jdk/javax/management/monitor/all.policy | 3 + .../NotificationAccessControllerTest.java | 2 + .../notif/NotificationEmissionTest.java | 4 +- .../NonJMXPrincipalsTest.java | 1 + .../PasswordAccessFileTest.java | 2 + .../passwordAuthenticator/RMIAltAuthTest.java | 3 + .../RMIPasswdAuthTest.java | 3 + .../passwordAuthenticator/SimpleStandard.java | 6 +- .../security/AuthorizationTest.java | 6 ++ .../jmxremote/bootstrap/RmiBootstrapTest.java | 2 + 17 files changed, 162 insertions(+), 49 deletions(-) create mode 100644 test/jdk/javax/management/monitor/all.policy diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index a8b0a0c992c41..52c1029dd3d52 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -165,6 +165,7 @@ java.desktop, java.logging, java.management, + java.management.rmi, java.naming, java.rmi, jdk.charsets, diff --git a/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java b/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java index 289bc8f382241..047863d34eff5 100644 --- a/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java +++ b/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java @@ -46,6 +46,7 @@ import javax.management.remote.JMXServerErrorException; import javax.management.remote.NotificationResult; import javax.security.auth.Subject; +import jdk.internal.access.SharedSecrets; import sun.reflect.misc.ReflectUtil; import static javax.management.remote.rmi.RMIConnector.Util.cast; @@ -108,14 +109,19 @@ public RMIConnectionImpl(RMIServerImpl rmiServer, this.rmiServer = rmiServer; this.connectionId = connectionId; this.defaultClassLoader = defaultClassLoader; - this.subject = subject; + if (subject == null) { this.acc = null; } else { // An authenticated Subject was provided. // Subject Delegation has been removed. - this.acc = JMXSubjectDomainCombiner.getContext(subject); + if (SharedSecrets.getJavaLangAccess().allowSecurityManager()) { + // SM is allowed. Will use ACC created with Subject: + this.acc = JMXSubjectDomainCombiner.getContext(subject); + } else { + this.acc = null; + } } this.mbeanServer = rmiServer.getMBeanServer(); @@ -1292,10 +1298,21 @@ public NotificationResult run() { return getServerNotifFwd().fetchNotifs(csn, t, mn); } }; - if (acc == null) - return action.run(); - else - return AccessController.doPrivileged(action, acc); + if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) { + // Modern case + if (subject == null) { + return action.run(); + } else { + return Subject.doAs(subject, action); + } + } else { + // SM permitted + if (acc == null) { + return action.run(); // No Subject or ACC + } else { + return AccessController.doPrivileged(action, acc); + } + } } finally { serverCommunicatorAdmin.rspOutgoing(); } @@ -1411,16 +1428,36 @@ private Object doPrivilegedOperation(final int operation, serverCommunicatorAdmin.reqIncoming(); try { PrivilegedOperation op = new PrivilegedOperation(operation, params); - if (acc == null) { - try { - return op.run(); - } catch (Exception e) { - if (e instanceof RuntimeException) - throw (RuntimeException) e; - throw new PrivilegedActionException(e); + if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) { + // Modern case + if (subject == null) { + try { + return op.run(); + } catch (Exception e) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } else { + throw new PrivilegedActionException(e); + } + } + } else { + return Subject.doAs(subject, op); } } else { - return AccessController.doPrivileged(op, acc); + // SM permitted + if (acc == null) { + try { + return op.run(); + } catch (Exception e) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } else { + throw new PrivilegedActionException(e); + } + } + } else { + return AccessController.doPrivileged(op, acc); + } } } catch (Error e) { throw new JMXServerErrorException(e.toString(),e); @@ -1585,15 +1622,25 @@ private <T> T unwrap(final MarshalledObject<?> mo, } try { final ClassLoader old = AccessController.doPrivileged(new SetCcl(cl)); - try{ - if (acc != null) { - return AccessController.doPrivileged( - (PrivilegedExceptionAction<T>) () -> - wrappedClass.cast(mo.get()), acc); - }else{ - return wrappedClass.cast(mo.get()); + try { + if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) { + // Modern case + if (subject != null) { + return Subject.doAs(subject, (PrivilegedExceptionAction<T>) () -> wrappedClass.cast(mo.get())); + } else { + return wrappedClass.cast(mo.get()); + } + } else { + // SM permitted + if (acc != null) { + return AccessController.doPrivileged( + (PrivilegedExceptionAction<T>) () -> + wrappedClass.cast(mo.get()), acc); + } else { + return wrappedClass.cast(mo.get()); + } } - }finally{ + } finally { AccessController.doPrivileged(new SetCcl(old)); } } catch (PrivilegedActionException pe) { diff --git a/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java b/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java index e04a375c998b0..7ea1e48586915 100644 --- a/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java +++ b/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -343,10 +343,9 @@ public void terminate() { //---------------- // PRIVATE METHODS //---------------- - @SuppressWarnings("removal") private Subject getSubject() { - return Subject.getSubject(AccessController.getContext()); + return Subject.current(); } private void checkState() throws IOException { diff --git a/src/java.management/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java b/src/java.management/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java index d694d9cce31dd..bc14b6ad3f21c 100644 --- a/src/java.management/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java +++ b/src/java.management/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,6 +42,7 @@ import javax.management.MBeanServer; import javax.management.ObjectName; import javax.security.auth.Subject; +import jdk.internal.access.SharedSecrets; /** * <p>An object of this class implements the MBeanServerAccessController @@ -300,16 +301,19 @@ private static Properties propertiesFromFile(String fname) } } + @SuppressWarnings("removal") private synchronized void checkAccess(AccessType requiredAccess, String arg) { - @SuppressWarnings("removal") - final AccessControlContext acc = AccessController.getContext(); - @SuppressWarnings("removal") - final Subject s = - AccessController.doPrivileged(new PrivilegedAction<>() { - public Subject run() { - return Subject.getSubject(acc); - } + Subject s = null; + if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) { + s = Subject.current(); + } else { + final AccessControlContext acc = AccessController.getContext(); + s = AccessController.doPrivileged(new PrivilegedAction<>() { + public Subject run() { + return Subject.getSubject(acc); + } }); + } if (s == null) return; /* security has not been enabled */ final Set<Principal> principals = s.getPrincipals(); String newPropertyValue = null; diff --git a/src/java.management/share/classes/javax/management/monitor/Monitor.java b/src/java.management/share/classes/javax/management/monitor/Monitor.java index aa6ec14ab6340..2ccb96b8db68f 100644 --- a/src/java.management/share/classes/javax/management/monitor/Monitor.java +++ b/src/java.management/share/classes/javax/management/monitor/Monitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,6 +60,8 @@ import javax.management.NotificationBroadcasterSupport; import javax.management.ObjectName; import javax.management.ReflectionException; +import javax.security.auth.Subject; +import jdk.internal.access.SharedSecrets; import static javax.management.monitor.MonitorNotification.*; /** @@ -169,8 +171,9 @@ public final synchronized void setDerivedGaugeTimeStamp( new CopyOnWriteArrayList<>(); /** - * AccessControlContext of the Monitor.start() caller. + * Subject and possibly AccessControlContext of the Monitor.start() caller. */ + private volatile Subject subject; @SuppressWarnings("removal") private static final AccessControlContext noPermissionsACC = new AccessControlContext( @@ -713,10 +716,14 @@ void doStart() { // cleanupIsComplexTypeAttribute(); - // Cache the AccessControlContext of the Monitor.start() caller. + // Cache the Subject or AccessControlContext of the Monitor.start() caller. // The monitor tasks will be executed within this context. // - acc = AccessController.getContext(); + if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) { + subject = Subject.current(); + } else { + acc = AccessController.getContext(); + } // Start the scheduler. // @@ -747,8 +754,9 @@ void doStop() { // cleanupFutures(); - // Reset the AccessControlContext. + // Reset the Subject and AccessControlContext. // + subject = null; acc = noPermissionsACC; // Reset the complex type attribute information @@ -1512,9 +1520,11 @@ public Future<?> submit() { @SuppressWarnings("removal") public void run() { final ScheduledFuture<?> sf; + final Subject s; final AccessControlContext ac; synchronized (Monitor.this) { sf = Monitor.this.schedulerFuture; + s = Monitor.this.subject; ac = Monitor.this.acc; } PrivilegedAction<Void> action = new PrivilegedAction<>() { @@ -1531,10 +1541,20 @@ public Void run() { return null; } }; - if (ac == null) { - throw new SecurityException("AccessControlContext cannot be null"); + if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) { + // No SecurityManager permitted: + if (s == null) { + action.run(); + } else { + Subject.doAs(s, action); + } + } else { + if (ac == null) { + throw new SecurityException("AccessControlContext cannot be null"); + } + // ACC means SM is permitted. + AccessController.doPrivileged(action, ac); } - AccessController.doPrivileged(action, ac); synchronized (Monitor.this) { if (Monitor.this.isActive() && Monitor.this.schedulerFuture == sf) { diff --git a/test/jdk/javax/management/monitor/StartStopTest.java b/test/jdk/javax/management/monitor/StartStopTest.java index 8e5490aeaae0d..4779f40cdc765 100644 --- a/test/jdk/javax/management/monitor/StartStopTest.java +++ b/test/jdk/javax/management/monitor/StartStopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,17 @@ * * @run clean StartStopTest * @run build StartStopTest + * * @run main/othervm/timeout=300 StartStopTest 1 * @run main/othervm/timeout=300 StartStopTest 2 * @run main/othervm/timeout=300 StartStopTest 3 + * @run main/othervm/timeout=300 -Djava.security.manager=allow StartStopTest 1 + * @run main/othervm/timeout=300 -Djava.security.manager=allow StartStopTest 2 + * @run main/othervm/timeout=300 -Djava.security.manager=allow StartStopTest 3 + * @run main/othervm/timeout=300/policy=all.policy StartStopTest 1 + * @run main/othervm/timeout=300/policy=all.policy StartStopTest 2 + * @run main/othervm/timeout=300/policy=all.policy StartStopTest 3 + * * @run main/othervm/timeout=300 -Djmx.x.monitor.maximum.pool.size=5 StartStopTest 1 * @run main/othervm/timeout=300 -Djmx.x.monitor.maximum.pool.size=5 StartStopTest 2 * @run main/othervm/timeout=300 -Djmx.x.monitor.maximum.pool.size=5 StartStopTest 3 diff --git a/test/jdk/javax/management/monitor/ThreadPoolAccTest.java b/test/jdk/javax/management/monitor/ThreadPoolAccTest.java index 542fa9c657ccc..508cefddf94d9 100644 --- a/test/jdk/javax/management/monitor/ThreadPoolAccTest.java +++ b/test/jdk/javax/management/monitor/ThreadPoolAccTest.java @@ -30,13 +30,19 @@ * * @run clean ThreadPoolAccTest * @run build ThreadPoolAccTest + * + * @run main/othervm ThreadPoolAccTest * @run main/othervm -Djava.security.manager=allow ThreadPoolAccTest + * @run main/othervm -Djava.security.manager=allow -DThreadPoolAccTest.useGetSubjectACC=true ThreadPoolAccTest + * @run main/othervm/policy=all.policy ThreadPoolAccTest + * @run main/othervm/policy=all.policy -DThreadPoolAccTest.useGetSubjectACC=true ThreadPoolAccTest */ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Date; import java.util.Set; +import java.util.concurrent.Callable; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.ObjectName; @@ -67,7 +73,9 @@ public String getString() { return ""; } private void setPrincipal() { - Subject subject = Subject.getSubject(AccessController.getContext()); + // Use Subject.current() unless test Property is set. + Subject subject = Boolean.getBoolean("ThreadPoolAccTest.useGetSubjectACC") ? + Subject.getSubject(AccessController.getContext()) : Subject.current(); Set<JMXPrincipal> principals = subject.getPrincipals(JMXPrincipal.class); principal = principals.iterator().next().getName(); } @@ -136,7 +144,9 @@ public Void run() { return null; } }; - Subject.doAs(subject, action); + // Subject.doAs(subject, action); + Callable<Void> c = (Callable<Void>) () -> action.run(); + Subject.callAs(subject, c); } sleep(500); // wait for getX method to be called, which calls setPrincipal diff --git a/test/jdk/javax/management/monitor/all.policy b/test/jdk/javax/management/monitor/all.policy new file mode 100644 index 0000000000000..cb9dbed32cc9d --- /dev/null +++ b/test/jdk/javax/management/monitor/all.policy @@ -0,0 +1,3 @@ +grant { + permission java.security.AllPermission; +}; diff --git a/test/jdk/javax/management/remote/mandatory/notif/NotificationAccessControllerTest.java b/test/jdk/javax/management/remote/mandatory/notif/NotificationAccessControllerTest.java index 352faea27d1b2..57db8588ed3e7 100644 --- a/test/jdk/javax/management/remote/mandatory/notif/NotificationAccessControllerTest.java +++ b/test/jdk/javax/management/remote/mandatory/notif/NotificationAccessControllerTest.java @@ -30,6 +30,8 @@ * java.management/com.sun.jmx.remote.security * @run clean NotificationAccessControllerTest * @run build NotificationAccessControllerTest + * + * @run main/othervm NotificationAccessControllerTest * @run main/othervm -Djava.security.manager=allow NotificationAccessControllerTest */ diff --git a/test/jdk/javax/management/remote/mandatory/notif/NotificationEmissionTest.java b/test/jdk/javax/management/remote/mandatory/notif/NotificationEmissionTest.java index a4c5700585339..e57636c87f6f2 100644 --- a/test/jdk/javax/management/remote/mandatory/notif/NotificationEmissionTest.java +++ b/test/jdk/javax/management/remote/mandatory/notif/NotificationEmissionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,9 @@ * * @run clean NotificationEmissionTest * @run build NotificationEmissionTest + * * @run main NotificationEmissionTest 1 + * @run main/othervm -Djava.security.manager=allow NotificationEmissionTest 1 * @run main/othervm -Djava.security.manager=allow NotificationEmissionTest 2 * @run main/othervm -Djava.security.manager=allow NotificationEmissionTest 3 * @run main/othervm -Djava.security.manager=allow NotificationEmissionTest 4 diff --git a/test/jdk/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java b/test/jdk/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java index f9e04a373f65b..796507eeff39d 100644 --- a/test/jdk/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java +++ b/test/jdk/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java @@ -30,6 +30,7 @@ * * @run clean NonJMXPrincipalsTest SimpleStandard SimpleStandardMBean * @run build NonJMXPrincipalsTest SimpleStandard SimpleStandardMBean + * @run main/othervm NonJMXPrincipalsTest * @run main/othervm -Djava.security.manager=allow NonJMXPrincipalsTest */ diff --git a/test/jdk/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java b/test/jdk/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java index d073553d3f55f..ae3ec697b3926 100644 --- a/test/jdk/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java +++ b/test/jdk/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java @@ -30,6 +30,8 @@ * * @run clean PasswordAccessFileTest SimpleStandard SimpleStandardMBean * @run build PasswordAccessFileTest SimpleStandard SimpleStandardMBean + * + * @run main/othervm PasswordAccessFileTest * @run main/othervm -Djava.security.manager=allow PasswordAccessFileTest */ diff --git a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIAltAuthTest.java b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIAltAuthTest.java index e86f9cc8f1a5e..13d94a879206a 100644 --- a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIAltAuthTest.java +++ b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIAltAuthTest.java @@ -30,7 +30,10 @@ * java.management/com.sun.jmx.remote.security * @run clean RMIAltAuthTest * @run build RMIAltAuthTest SimpleStandard SimpleStandardMBean + * + * @run main/othervm RMIAltAuthTest * @run main/othervm -Djava.security.manager=allow RMIAltAuthTest + * @run main/othervm -Djava.security.manager=allow -DSimpleStandard.useGetSubjectACC=true RMIAltAuthTest */ import java.io.File; diff --git a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIPasswdAuthTest.java b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIPasswdAuthTest.java index 87384e070cd4c..8897d34c4e8d1 100644 --- a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIPasswdAuthTest.java +++ b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIPasswdAuthTest.java @@ -30,7 +30,10 @@ * java.management/com.sun.jmx.remote.security * @run clean RMIPasswdAuthTest * @run build RMIPasswdAuthTest SimpleStandard SimpleStandardMBean + * + * @run main/othervm RMIPasswdAuthTest * @run main/othervm -Djava.security.manager=allow RMIPasswdAuthTest + * @run main/othervm -Djava.security.manager=allow -DSimpleStandard.useGetSubjectACC=true RMIPasswdAuthTest */ import java.io.File; diff --git a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/SimpleStandard.java b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/SimpleStandard.java index bc503b3e29169..b5657498365f9 100644 --- a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/SimpleStandard.java +++ b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/SimpleStandard.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -152,8 +152,8 @@ public int getNbResets() { * type JMXPrincipal and refers to the "monitorRole" identity. */ private void checkSubject() { - AccessControlContext acc = AccessController.getContext(); - Subject subject = Subject.getSubject(acc); + Subject subject = Boolean.getBoolean("SimpleStandard.useGetSubjectACC") ? + Subject.getSubject(AccessController.getContext()) : Subject.current(); Set principals = subject.getPrincipals(); Principal principal = (Principal) principals.iterator().next(); if (!(principal instanceof JMXPrincipal)) diff --git a/test/jdk/javax/management/security/AuthorizationTest.java b/test/jdk/javax/management/security/AuthorizationTest.java index 2c48dbffb5635..cdb412e139b46 100644 --- a/test/jdk/javax/management/security/AuthorizationTest.java +++ b/test/jdk/javax/management/security/AuthorizationTest.java @@ -29,9 +29,15 @@ * @modules java.management.rmi * @library /test/lib * @compile Simple.java + * + * @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials + * @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username2 -Dpassword=password2 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedSetException -expectedInvokeException + * @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username6 -Dpassword=password6 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException + * * @run main/othervm/timeout=300 -Djava.security.manager=allow -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials * @run main/othervm/timeout=300 -Djava.security.manager=allow -DDEBUG_STANDARD -Dusername=username2 -Dpassword=password2 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedSetException -expectedInvokeException * @run main/othervm/timeout=300 -Djava.security.manager=allow -DDEBUG_STANDARD -Dusername=username6 -Dpassword=password6 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException + * * @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials * @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username3 -Dpassword=password3 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials -expectedGetException * @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username5 -Dpassword=password5 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException diff --git a/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java b/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java index 770b642088ad3..09e32174c74f5 100644 --- a/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java +++ b/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java @@ -61,6 +61,7 @@ * * @library /test/lib * + * @run main/othervm/timeout=300 RmiBootstrapTest .*_test.*.in * @run main/othervm/timeout=300 -Djava.security.manager=allow RmiBootstrapTest .*_test.*.in * */ @@ -72,6 +73,7 @@ * * @library /test/lib * + * @run main/othervm/timeout=300 RmiBootstrapTest .*_ssltest.*.in * @run main/othervm/timeout=300 -Djava.security.manager=allow RmiBootstrapTest .*_ssltest.*.in * */ From 78682fe78e18268b1857855c3595b4d118808c66 Mon Sep 17 00:00:00 2001 From: Magnus Ihse Bursie <ihse@openjdk.org> Date: Wed, 19 Jun 2024 19:12:31 +0000 Subject: [PATCH 112/471] 8329288: Update Visual Studio visibility support for POSIX functions Reviewed-by: kbarrett --- make/autoconf/flags-cflags.m4 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/make/autoconf/flags-cflags.m4 b/make/autoconf/flags-cflags.m4 index 09395202f221c..da63a6dba0633 100644 --- a/make/autoconf/flags-cflags.m4 +++ b/make/autoconf/flags-cflags.m4 @@ -502,12 +502,12 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER], elif test "x$TOOLCHAIN_TYPE" = xclang; then ALWAYS_DEFINES_JVM="-D_GNU_SOURCE" elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then - # Access APIs for Windows 8 and above - # see https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170 - ALWAYS_DEFINES_JDK="-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602 \ - -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -DWIN32 -DIAL" - ALWAYS_DEFINES_JVM="-DNOMINMAX -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602 \ - -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE" + # _WIN32_WINNT=0x0602 means access APIs for Windows 8 and above. See + # https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170 + ALWAYS_DEFINES="-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602 \ + -D_CRT_DECLARE_NONSTDC_NAMES -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS" + ALWAYS_DEFINES_JDK="$ALWAYS_DEFINES -DWIN32 -DIAL" + ALWAYS_DEFINES_JVM="$ALWAYS_DEFINES -DNOMINMAX" fi ############################################################################### From 4e58d8c897d845cfa73780264481da174d46acb4 Mon Sep 17 00:00:00 2001 From: Joe Darcy <darcy@openjdk.org> Date: Wed, 19 Jun 2024 23:23:52 +0000 Subject: [PATCH 113/471] 8309821: Link to hidden classes section in Class specification for Class::isHidden Reviewed-by: iris, rriggs --- src/java.base/share/classes/java/lang/Class.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java index 4bc7ccab8345d..5b378077d563f 100644 --- a/src/java.base/share/classes/java/lang/Class.java +++ b/src/java.base/share/classes/java/lang/Class.java @@ -4720,6 +4720,7 @@ public Optional<ClassDesc> describeConstable() { * * @since 15 * @see MethodHandles.Lookup#defineHiddenClass + * @see Class##hiddenClasses Hidden Classes */ @IntrinsicCandidate public native boolean isHidden(); From b211929e05c0acdf7343c3edd025749d573c67b3 Mon Sep 17 00:00:00 2001 From: Sonia Zaldana Calles <szaldana@openjdk.org> Date: Thu, 20 Jun 2024 01:36:05 +0000 Subject: [PATCH 114/471] 8334570: Problem list gc/TestAlwaysPreTouchBehavior.java Reviewed-by: ayang, tschatzl --- test/hotspot/jtreg/ProblemList.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index c7c76c8fa3a2e..469a410e31d8e 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -82,6 +82,13 @@ gc/TestAllocHumongousFragment.java#aggressive 8298781 generic-all gc/TestAllocHumongousFragment.java#iu-aggressive 8298781 generic-all gc/TestAllocHumongousFragment.java#g1 8298781 generic-all gc/TestAllocHumongousFragment.java#static 8298781 generic-all +gc/TestAlwaysPreTouchBehavior.java#ParallelCollector 8334513 generic-all +gc/TestAlwaysPreTouchBehavior.java#SerialCollector 8334513 generic-all +gc/TestAlwaysPreTouchBehavior.java#Shenandoah 8334513 generic-all +gc/TestAlwaysPreTouchBehavior.java#G1 8334513 generic-all +gc/TestAlwaysPreTouchBehavior.java#ZGenerational 8334513 generic-all +gc/TestAlwaysPreTouchBehavior.java#ZSinglegen 8334513 generic-all +gc/TestAlwaysPreTouchBehavior.java#Epsilon 8334513 generic-all gc/stress/gclocker/TestExcessGCLockerCollections.java 8229120 generic-all ############################################################################# From fad6644eabbad6b6d3472206d9db946408aca612 Mon Sep 17 00:00:00 2001 From: Sibabrata Sahoo <ssahoo@openjdk.org> Date: Thu, 20 Jun 2024 04:18:39 +0000 Subject: [PATCH 115/471] 8333754: Add a Test against ECDSA and ECDH NIST Test vector Reviewed-by: ascarpino --- test/jdk/sun/security/ec/ECDHPrimitive.java | 144 + test/jdk/sun/security/ec/ECDSAPrimitive.java | 429 ++ .../security/ec/KAS_ECC_CDH_PrimitiveTest.txt | 3049 +++++++++ test/jdk/sun/security/ec/SigGen-1.txt | 5879 +++++++++++++++++ 4 files changed, 9501 insertions(+) create mode 100644 test/jdk/sun/security/ec/ECDHPrimitive.java create mode 100644 test/jdk/sun/security/ec/ECDSAPrimitive.java create mode 100644 test/jdk/sun/security/ec/KAS_ECC_CDH_PrimitiveTest.txt create mode 100644 test/jdk/sun/security/ec/SigGen-1.txt diff --git a/test/jdk/sun/security/ec/ECDHPrimitive.java b/test/jdk/sun/security/ec/ECDHPrimitive.java new file mode 100644 index 0000000000000..b41b93bc5ff7f --- /dev/null +++ b/test/jdk/sun/security/ec/ECDHPrimitive.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.*; +import java.math.BigInteger; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.*; +import java.security.spec.*; +import java.util.*; +import javax.crypto.*; + +import jdk.test.lib.Asserts; + +/* + * @test + * @bug 8189189 + * @summary Test ECDH primitive operations + * @library /test/lib + * @run main ECDHPrimitive + */ +public class ECDHPrimitive { + + + private static final Map<String, String> NAME_MAP = Map.of( + "P-256", "secp256r1", + "P-384", "secp384r1", + "P-521", "secp521r1" + ); + + public static void main(String[] args) throws Exception { + Path testFile = Path.of(System.getProperty("test.src"), "KAS_ECC_CDH_PrimitiveTest.txt"); + + ECParameterSpec ecParams = null; + + try (BufferedReader in = Files.newBufferedReader(testFile)) { + Map<String, byte[]> values = new HashMap<>(); + String line = in.readLine(); + while (line != null) { + line = line.trim(); + if (line.startsWith("#") || line.length() == 0) { + // ignore + } else if (line.startsWith("[")) { + // change curve name + StringTokenizer tok = new StringTokenizer(line, "[]"); + String name = tok.nextToken(); + String curveName = lookupName(name); + + if (curveName == null) { + System.out.println("Unknown curve: " + name + + ". Skipping test"); + ecParams = null; + } else { + AlgorithmParameters params + = AlgorithmParameters.getInstance("EC"); + + params.init(new ECGenParameterSpec(curveName)); + ecParams = params.getParameterSpec( + ECParameterSpec.class); + System.out.println("Testing curve: " + curveName); + } + + } else if (line.startsWith("ZIUT")) { + addKeyValue(line, values); + if (ecParams != null) { + runTest(ecParams, values); + } + } else { + addKeyValue(line, values); + } + + line = in.readLine(); + } + } + } + + private static void runTest(ECParameterSpec ecParams, + Map<String, byte[]> values) throws Exception { + + byte[] xArr = values.get("QCAVSx"); + BigInteger x = new BigInteger(1, xArr); + byte[] yArr = values.get("QCAVSy"); + BigInteger y = new BigInteger(1, yArr); + ECPoint w = new ECPoint(x, y); + ECPublicKeySpec pubSpec = new ECPublicKeySpec(w, ecParams); + + byte[] dArr = values.get("dIUT"); + BigInteger d = new BigInteger(1, dArr); + ECPrivateKeySpec priSpec = new ECPrivateKeySpec(d, ecParams); + + KeyFactory kf = KeyFactory.getInstance("EC"); + PublicKey pub = kf.generatePublic(pubSpec); + PrivateKey pri = kf.generatePrivate(priSpec); + + KeyAgreement ka = KeyAgreement.getInstance("ECDH"); + ka.init(pri); + ka.doPhase(pub, true); + byte[] secret = ka.generateSecret(); + + byte[] expectedSecret = values.get("ZIUT"); + Asserts.assertEqualsByteArray(secret, expectedSecret, "Incorrect secret value"); + int testIndex = values.get("COUNT")[0]; + System.out.println("Test " + testIndex + " passed."); + } + + private static void addKeyValue(String line, Map<String, byte[]> values) { + StringTokenizer tok = new StringTokenizer(line, " ="); + String key = tok.nextToken(); + String value = tok.nextToken(); + byte[] valueArr; + if (value.length() <= 2) { + valueArr = new byte[1]; + valueArr[0] = Byte.parseByte(value, 10); + } else { + valueArr = HexFormat.of().parseHex(value); + } + + values.put(key, valueArr); + } + + private static String lookupName(String name) { + return NAME_MAP.get(name); + } +} \ No newline at end of file diff --git a/test/jdk/sun/security/ec/ECDSAPrimitive.java b/test/jdk/sun/security/ec/ECDSAPrimitive.java new file mode 100644 index 0000000000000..ba9ed0dec80d3 --- /dev/null +++ b/test/jdk/sun/security/ec/ECDSAPrimitive.java @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.*; +import java.math.BigInteger; +import java.nio.file.Path; +import java.security.*; +import java.security.spec.*; +import java.util.*; + +import sun.security.ec.*; +import sun.security.ec.point.*; +import sun.security.util.ArrayUtil; +import sun.security.util.math.*; +import jdk.test.lib.Asserts; + +/* + * @test + * @bug 8189189 8147502 8295010 + * @summary Test ECDSA primitive operations + * @library /test/lib + * @modules java.base/sun.security.ec java.base/sun.security.ec.point + * java.base/sun.security.util java.base/sun.security.util.math + * @run main ECDSAPrimitive + */ +public class ECDSAPrimitive { + + private static final Map<String, String> CURVE_NAME_MAP = Map.ofEntries( + Map.entry("P-256", "secp256r1"), + Map.entry("P-384", "secp384r1"), + Map.entry("P-521", "secp521r1") + ); + private static final Set<String> DIGEST_NAME_SET = Set.of( + "SHA-224", + "SHA-256", + "SHA-384", + "SHA-512" + ); + + public static void main(String[] args) throws Exception { + Path siggenFile = Path.of(System.getProperty("test.src"), "SigGen-1.txt"); + + ECParameterSpec ecParams = null; + String digestAlg = null; + + try (BufferedReader in = new BufferedReader(new FileReader( + siggenFile.toFile()))) { + Map<String, byte[]> values = new HashMap<>(); + String line = in.readLine(); + while (line != null) { + line = line.trim(); + if (line.startsWith("#") || line.length() == 0) { + // ignore + } else if (line.startsWith("[")) { + // change curve and hash + StringTokenizer tok = new StringTokenizer(line, "[,]"); + String name = tok.nextToken(); + String curveName = lookUpCurveName(name); + + String digestName = tok.nextToken(); + digestAlg = lookUpDigestName(digestName); + + if (curveName == null) { + System.out.println("Unknown curve: " + name + + ". Skipping test"); + ecParams = null; + digestAlg = null; + } + if (digestAlg == null) { + System.out.println("Unknown digest: " + digestName + + ". Skipping test"); + ecParams = null; + digestAlg = null; + } else { + AlgorithmParameters params = + AlgorithmParameters.getInstance("EC", "SunEC"); + params.init(new ECGenParameterSpec(curveName)); + ecParams = params.getParameterSpec( + ECParameterSpec.class); + System.out.println("Testing curve/digest: " + + curveName + "/" + digestAlg); + } + + } else if (line.startsWith("S")) { + addKeyValue(line, values); + if (ecParams != null) { + runTest(ecParams, digestAlg, values); + } + } else { + addKeyValue(line, values); + } + + line = in.readLine(); + } + } + } + + private static void runTest(ECParameterSpec ecParams, String digestAlg, + Map<String, byte[]> values) throws Exception { + + Optional<ECDSAOperations> opsOpt = + ECDSAOperations.forParameters(ecParams); + Optional<Signer> signerOpt = opsOpt.map(OpsSigner::new); + Signer signer = signerOpt.orElseGet(() -> new JCASigner(ecParams)); + + byte[] msg = values.get("Msg"); + MessageDigest md = MessageDigest.getInstance(digestAlg); + byte[] digest = md.digest(msg); + + // all operations accept little endian private key and nonce + byte[] privateKey = values.get("d"); + byte[] k = values.get("k"); + + byte[] computedSig = signer.sign(privateKey, digest, k); + + int valueLength = computedSig.length / 2; + byte[] computedR = Arrays.copyOf(computedSig, valueLength); + byte[] expectedR = values.get("R"); + Asserts.assertEquals(new BigInteger(1, expectedR), new BigInteger(1, computedR), "R"); + + byte[] computedS = Arrays.copyOfRange(computedSig, valueLength, + 2 * valueLength); + byte[] expectedS = values.get("S"); + Asserts.assertEquals(new BigInteger(1, expectedS), new BigInteger(1, computedS), "S"); + + // ensure public key is correct + byte[] expectedQx = values.get("Qx"); + byte[] expectedQy = values.get("Qy"); + ECPoint ecPublicKey = + signer.checkPublicKey(privateKey, expectedQx, expectedQy); + + // ensure the verification works + if (!signer.verify(ecPublicKey, digest, computedSig)) { + throw new RuntimeException("Signature did not verify"); + } + + // ensure incorrect signature does not verify + int length = k.length; + computedSig[length / 2] ^= (byte) 1; + if (signer.verify(ecPublicKey, digest, computedSig)) { + throw new RuntimeException("Incorrect signature verified"); + } + computedSig[length / 2] ^= (byte) 1; + computedSig[length + length / 2] ^= (byte) 1; + if (signer.verify(ecPublicKey, digest, computedSig)) { + throw new RuntimeException("Incorrect signature verified"); + } + + System.out.println("Test case passed"); + } + + private static void addKeyValue(String line, Map<String, byte[]> values) { + StringTokenizer tok = new StringTokenizer(line, " ="); + String key = tok.nextToken(); + String value = tok.nextToken(); + byte[] valueArr; + if (value.length() <= 2) { + valueArr = new byte[1]; + valueArr[0] = Byte.parseByte(value, 10); + } else { + // some values are odd-length big-endian integers + if (value.length() % 2 == 1) { + if (key.equals("Msg")) { + throw new RuntimeException("message length may not be odd"); + } + value = "0" + value; + } + valueArr = HexFormat.of().parseHex(value); + } + + values.put(key, valueArr); + } + + private static String lookUpCurveName(String name) { + return CURVE_NAME_MAP.get(name); + } + + private static String lookUpDigestName(String name) { + return DIGEST_NAME_SET.contains(name) ? name : null; + } + + public static boolean verifySignedDigest(ECDSAOperations ops, ECPoint publicKey, + byte[] digest, byte[] signature) { + + try { + return verifySignedDigestImpl(ops, publicKey, digest, signature); + } catch (ImproperSignatureException ex) { + return false; + } + } + + private static boolean verifySignedDigestImpl(ECDSAOperations ops, ECPoint publicKey, + byte[] digest, byte[] signature) + throws ImproperSignatureException { + + ECOperations ecOps = ops.getEcOperations(); + IntegerFieldModuloP orderField = ecOps.getOrderField(); + int orderBits = orderField.getSize().bitLength(); + if (orderBits % 8 != 0 && orderBits < digest.length * 8) { + // This implementation does not support truncating digests to + // a length that is not a multiple of 8. + throw new ProviderException("Invalid digest length"); + } + // decode signature as (r, s) + byte[] rBytes = Arrays.copyOf(signature, signature.length / 2); + ArrayUtil.reverse(rBytes); + byte[] sBytes = Arrays.copyOfRange(signature, signature.length / 2, + signature.length); + ArrayUtil.reverse(sBytes); + + // convert r and s to field elements + // TODO: reject non-canonical values + IntegerModuloP s = orderField.getElement(sBytes); + IntegerModuloP r = orderField.getElement(rBytes); + + // truncate the digest and interpret as a field element + int length = (orderBits + 7) / 8; + int lengthE = Math.min(length, digest.length); + byte[] E = new byte[lengthE]; + System.arraycopy(digest, 0, E, 0, lengthE); + ArrayUtil.reverse(E); + IntegerModuloP e = orderField.getElement(E); + + // perform the calculation + IntegerModuloP sInverse = s.multiplicativeInverse(); + IntegerModuloP u1 = e.multiply(sInverse); + IntegerModuloP u2 = r.multiply(sInverse); + + byte[] u1Bytes = u1.asByteArray(length); + byte[] u2Bytes = u2.asByteArray(length); + AffinePoint publicKeyPoint = ECDSAOperations.toAffinePoint(publicKey, + ecOps.getField()); + MutablePoint R = ecOps.multiply(publicKeyPoint, u2Bytes); + AffinePoint a1 = ops.basePointMultiply(u1Bytes); + MutablePoint p2 = new ProjectivePoint.Mutable( + a1.getX(false).mutable(), + a1.getY(false).mutable(), + ecOps.getField().get1().mutable()); + ecOps.setSum(R, p2); + + // can't continue if R is neutral + if (ecOps.isNeutral(R)) { + throw new ImproperSignatureException(); + } + + IntegerModuloP xr = R.asAffine().getX(); + byte[] temp = new byte[length]; + xr.asByteArray(temp); + IntegerModuloP v = orderField.getElement(temp); + + // Check that v==r by subtracting and comparing result to 0 + v.subtract(r).mutable().asByteArray(temp); + return ECOperations.allZero(temp); + } + + private interface Signer { + byte[] sign(byte[] privateKey, byte[] digest, byte[] k); + + ECPoint checkPublicKey(byte[] privateKey, byte[] expectedQx, + byte[] expectedQy); + + boolean verify(ECPoint ecPublicKey, byte[] digest, byte[] sig); + } + + private static class FixedRandom extends SecureRandom { + + private final byte[] val; + + public FixedRandom(byte[] val) { + BigInteger biVal = new BigInteger(1, val); + biVal = biVal.subtract(BigInteger.ONE); + byte[] temp = biVal.toByteArray(); + this.val = new byte[val.length]; + int inStartPos = Math.max(0, temp.length - val.length); + int outStartPos = Math.max(0, val.length - temp.length); + System.arraycopy(temp, inStartPos, this.val, outStartPos, + temp.length - inStartPos); + } + + @Override + public void nextBytes(byte[] bytes) { + Arrays.fill(bytes, (byte) 0); + int copyLength = Math.min(val.length, bytes.length - 2); + System.arraycopy(val, 0, bytes, bytes.length - copyLength - 2, + copyLength); + } + } + + // The signature verification function lives here. It is not used in the + // JDK, but it is working, and the performance is roughly as good as the + // native implementation in the JDK. + + private static class JCASigner implements Signer { + + private static final String SIG_ALG = "NONEwithECDSAinP1363Format"; + private final ECParameterSpec ecParams; + + private JCASigner(ECParameterSpec ecParams) { + this.ecParams = ecParams; + } + + @Override + public byte[] sign(byte[] privateKey, byte[] digest, byte[] k) { + + try { + + KeyFactory kf = KeyFactory.getInstance("EC", "SunEC"); + BigInteger s = new BigInteger(1, privateKey); + ECPrivateKeySpec privKeySpec = + new ECPrivateKeySpec(s, ecParams); + PrivateKey privKey = kf.generatePrivate(privKeySpec); + + Signature sig = Signature.getInstance(SIG_ALG, "SunEC"); + sig.initSign(privKey, new FixedRandom(k)); + sig.update(digest); + return sig.sign(); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Override + public ECPoint checkPublicKey(byte[] privateKey, byte[] expectedQx, + byte[] expectedQy) { + // no way to compute the public key using the API + BigInteger x = new BigInteger(1, expectedQx); + BigInteger y = new BigInteger(1, expectedQy); + return new ECPoint(x, y); + } + + @Override + public boolean verify(ECPoint ecPublicKey, byte[] digest, + byte[] providedSig) { + + try { + KeyFactory kf = KeyFactory.getInstance("EC", "SunEC"); + ECPublicKeySpec pubKeySpec = + new ECPublicKeySpec(ecPublicKey, ecParams); + PublicKey pubKey = kf.generatePublic(pubKeySpec); + + Signature sig = Signature.getInstance(SIG_ALG, "SunEC"); + sig.initVerify(pubKey); + sig.update(digest); + return sig.verify(providedSig); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + } + + private static class OpsSigner implements Signer { + + private final ECDSAOperations ops; + + public OpsSigner(ECDSAOperations ops) { + this.ops = ops; + } + + @Override + public byte[] sign(byte[] privateKey, byte[] digest, byte[] k) { + + privateKey = privateKey.clone(); + ArrayUtil.reverse(privateKey); + k = k.clone(); + ArrayUtil.reverse(k); + ECDSAOperations.Nonce nonce = new ECDSAOperations.Nonce(k); + try { + return ops.signDigest(privateKey, digest, nonce); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Override + public ECPoint checkPublicKey(byte[] privateKey, byte[] expectedQx, + byte[] expectedQy) { + + privateKey = privateKey.clone(); + ArrayUtil.reverse(privateKey); + AffinePoint publicKey = ops.basePointMultiply(privateKey); + int length = privateKey.length; + byte[] computedQx = new byte[length]; + byte[] computedQy = new byte[length]; + publicKey.getX().asByteArray(computedQx); + ArrayUtil.reverse(computedQx); + Asserts.assertEqualsByteArray(expectedQx, computedQx, "Qx"); + publicKey.getY().asByteArray(computedQy); + ArrayUtil.reverse(computedQy); + Asserts.assertEqualsByteArray(expectedQy, computedQy, "Qy"); + BigInteger bigX = publicKey.getX().asBigInteger(); + BigInteger bigY = publicKey.getY().asBigInteger(); + return new ECPoint(bigX, bigY); + } + + @Override + public boolean verify(ECPoint publicKey, byte[] digest, byte[] sig) { + return verifySignedDigest(ops, publicKey, digest, sig); + } + } + + /* + * An exception indicating that a signature is not formed correctly. + */ + private static class ImproperSignatureException extends Exception { + + private static final long serialVersionUID = 1; + } + +} diff --git a/test/jdk/sun/security/ec/KAS_ECC_CDH_PrimitiveTest.txt b/test/jdk/sun/security/ec/KAS_ECC_CDH_PrimitiveTest.txt new file mode 100644 index 0000000000000..00da4fa3aef53 --- /dev/null +++ b/test/jdk/sun/security/ec/KAS_ECC_CDH_PrimitiveTest.txt @@ -0,0 +1,3049 @@ +# CAVS 14.1 +# ECC CDH Primitive (SP800-56A Section 5.7.1.2) Test Information for "testecccdh" +# Curves tested: Curves tested: P-192 P-224 P-256 P-384 P-521 K-163 K-233 K-283 K-409 K-571 B-163 B-233 B-283 B-409 B-571 +# Generated on Mon Nov 19 10:52:17 2012 + +[P-192] + +COUNT = 0 +QCAVSx = 42ea6dd9969dd2a61fea1aac7f8e98edcc896c6e55857cc0 +QCAVSy = dfbe5d7c61fac88b11811bde328e8a0d12bf01a9d204b523 +dIUT = f17d3fea367b74d340851ca4270dcb24c271f445bed9d527 +QIUTx = b15053401f57285637ec324c1cd2139e3a67de3739234b37 +QIUTy = f269c158637482aad644cd692dd1d3ef2c8a7c49e389f7f6 +ZIUT = 803d8ab2e5b6e6fca715737c3a82f7ce3c783124f6d51cd0 + +COUNT = 1 +QCAVSx = deb5712fa027ac8d2f22c455ccb73a91e17b6512b5e030e7 +QCAVSy = 7e2690a02cc9b28708431a29fb54b87b1f0c14e011ac2125 +dIUT = 56e853349d96fe4c442448dacb7cf92bb7a95dcf574a9bd5 +QIUTx = c00d435716ffea53fd8c162792414c37665187e582716539 +QIUTy = ab711c62aa71a5a18e8a3c48f89dc6fa52fac0108e52a8a0 +ZIUT = c208847568b98835d7312cef1f97f7aa298283152313c29d + +COUNT = 2 +QCAVSx = 4edaa8efc5a0f40f843663ec5815e7762dddc008e663c20f +QCAVSy = 0a9f8dc67a3e60ef6d64b522185d03df1fc0adfd42478279 +dIUT = c6ef61fe12e80bf56f2d3f7d0bb757394519906d55500949 +QIUTx = e184bc182482f3403c8787b83842477467fcd011db0f6c64 +QIUTy = f9d1c14142f40de8639db97d51a63d2cce1007ccf773cdcb +ZIUT = 87229107047a3b611920d6e3b2c0c89bea4f49412260b8dd + +COUNT = 3 +QCAVSx = 8887c276edeed3e9e866b46d58d895c73fbd80b63e382e88 +QCAVSy = 04c5097ba6645e16206cfb70f7052655947dd44a17f1f9d5 +dIUT = e6747b9c23ba7044f38ff7e62c35e4038920f5a0163d3cda +QIUTx = 2b838dbe73735f37a39a78d3195783d26991e86ff4d92d1a +QIUTy = 60d344942274489f98903b2e7f93f8d197fc9ae60a0ed53a +ZIUT = eec0bed8fc55e1feddc82158fd6dc0d48a4d796aaf47d46c + +COUNT = 4 +QCAVSx = 0d045f30254adc1fcefa8a5b1f31bf4e739dd327cd18d594 +QCAVSy = 542c314e41427c08278a08ce8d7305f3b5b849c72d8aff73 +dIUT = beabedd0154a1afcfc85d52181c10f5eb47adc51f655047d +QIUTx = 1f65cf6e8978e1c1bc10bb61a7db311de310088c8cf9768b +QIUTy = f7d438168e7f42ab14b16af53a7a2f646ff40b53d74cbcc7 +ZIUT = 716e743b1b37a2cd8479f0a3d5a74c10ba2599be18d7e2f4 + +COUNT = 5 +QCAVSx = fb35ca20d2e96665c51b98e8f6eb3d79113508d8bccd4516 +QCAVSy = 368eec0d5bfb847721df6aaff0e5d48c444f74bf9cd8a5a7 +dIUT = cf70354226667321d6e2baf40999e2fd74c7a0f793fa8699 +QIUTx = 5f4844ffcce61005d24f737db98675e92f7b6543aeb6106c +QIUTy = 5424f598139215d389b6b12b86d58014857f2ddadb540f51 +ZIUT = f67053b934459985a315cb017bf0302891798d45d0e19508 + +COUNT = 6 +QCAVSx = 824752960c1307e5f13a83da21c7998ca8b5b00b9549f6d0 +QCAVSy = bc52d91e234363bc32ee0b6778f25cd8c1847510f4348b94 +dIUT = fe942515237fffdd7b4eb5c64909eee4856a076cdf12bae2 +QIUTx = e6369df79b207b8b8679f7c869cfc264859d1ab55aa401e8 +QIUTy = 1f99c71f801a30b52f74da6e5e6dbb62ee4c5da1090cc020 +ZIUT = 75822971193edd472bf30151a782619c55ad0b279c9303dd + +COUNT = 7 +QCAVSx = 10bb57020291141981f833b4749e5611034b308e84011d21 +QCAVSy = e1cacd6b7bd17ed8ddb50b6aee0654c35f2d0eddc1cffcf6 +dIUT = 33fed10492afa5bea0333c0af12cac940c4d222455bcd0fe +QIUTx = ef0b28afc41637d737f42e4c8aaceadc84ba2e0b849ca18c +QIUTy = 57797942e552173bba17f73278e029f42335068bd770ddf2 +ZIUT = 67cba2cbb69ee78bf1abafb0e6fbe33fa2094c128d59652d + +COUNT = 8 +QCAVSx = 5192fce4185a7758ea1bc56e0e4f4e8b2dce32348d0dced1 +QCAVSy = 20989981beaaf0006d88a96e7971a2fa3a33ba46047fc7ba +dIUT = f3557c5d70b4c7954960c33568776adbe8e43619abe26b13 +QIUTx = d70112c5f0f0844386494ac1ad99dce2214134176ebfb9af +QIUTy = d3c187a038510ab31d459e2b7af1a380dd7576af06267548 +ZIUT = cf99a2770a386ca0137d1eca0a226e484297ac3c513f3631 + +COUNT = 9 +QCAVSx = 26d019dbe279ead01eed143a91601ada26e2f42225b1c62b +QCAVSy = 6ca653f08272e0386fc9421fbd580093d7ae6301bca94476 +dIUT = 586cfba1c6e81766ed52828f177b1be14ebbc5b83348c311 +QIUTx = 58b3c63e56bec9d696bf9a88df2873738391f76368aa2b49 +QIUTy = 5776773b261faf7ba2fdc4fe43b92c0b1c7a2fd054a43650 +ZIUT = 576331e2b4fb38a112810e1529834de8307fb0a0d2756877 + +COUNT = 10 +QCAVSx = 539bc40fe20a0fb267888b647b03eaaf6ec20c02a1e1f8c8 +QCAVSy = 69095e5bb7b4d44c3278a7ee6beca397c45246da9a34c8be +dIUT = cad8100603a4f65be08d8fc8a1b7e884c5ff65deb3c96d99 +QIUTx = b7fcc0f52c7a411edbed39e10bf02b6ae0f26614c6b325a2 +QIUTy = 47483b26eb67776de2b93ab7119d5447573739e3d55e72fb +ZIUT = 902f4501916a0dd945554c3a37b3d780d375a6da713197c4 + +COUNT = 11 +QCAVSx = 5d343ddb96318fb4794d10f6c573f99fee5d0d57b996250f +QCAVSy = 99fbdf9d97dd88ad410235dac36e5b92ce2824b8e587a82c +dIUT = 1edd879cc5c79619cae6c73a691bd5a0395c0ef3b356fcd2 +QIUTx = 6ce6adb2c30808f590048c33dffad4524ebf7a5fd39b747b +QIUTy = 4966bd2f3d00569b4d4c0409fbd7a2db752f6d09bca8c25f +ZIUT = 46e4de335054d429863218ae33636fc9b89c628b64b506c7 + +COUNT = 12 +QCAVSx = 8d3db9bdce137ffbfb891388c37df6c0cbc90aa5e5376220 +QCAVSy = 135d30b5cb660eef8764ffc744f15c1b5d6dc06ba4416d37 +dIUT = 460e452273fe1827602187ad3bebee65cb84423bb4f47537 +QIUTx = d1bd3a3efabf4767fe6380bdf0dbf49d52d4cf0cbb89404c +QIUTy = c150c2b4c8b3aa35f765f847e4f7f8fd8704d241a181ee99 +ZIUT = 1bfe9e5a20ac7a38d8f605b425bb9030be31ef97c101c76c + +COUNT = 13 +QCAVSx = 9e0a6949519c7f5be68c0433c5fdf13064aa13fb29483dc3 +QCAVSy = e1c8ba63e1f471db23185f50d9c871edea21255b3a63b4b7 +dIUT = b970365008456f8758ecc5a3b33cf3ae6a8d568107a52167 +QIUTx = c1b8610c8c63f8d4abda093b9a11a566044bf65c6faa8999 +QIUTy = a5bc4b3ca095382e9738aee95fe9479b17879b3ad5295559 +ZIUT = 0e8c493a4adc445dc9288a3b9b272599224054592d7265b3 + +COUNT = 14 +QCAVSx = be088238902e9939b3d054eeeb8492daf4bdcf09a2ab77f1 +QCAVSy = 58d6749a3a923dc80440f2661fd35b651617e65294b46375 +dIUT = 59c15b8a2464e41dfe4371c7f7dadf470ae425544f8113bd +QIUTx = 1fe776f73567b6ac0b0d6764164de6c5be751ba8d1ff455e +QIUTy = 4c160bf38afb2b71f684261664115ce874553e8b059432d2 +ZIUT = 0f1991086b455ded6a1c4146f7bf59fe9b495de566ebc6bf + +COUNT = 15 +QCAVSx = bf5ae05025e1be617e666d87a4168363873d5761b376b503 +QCAVSy = e1e6e38b372b6bee0ff5b3502d83735e3b2c26825e4f0fcc +dIUT = a6e9b885c66b959d1fc2708d591b6d3228e49eb98f726d61 +QIUTx = 632bb7651dbf49dde9dd125d13fb234e06617723beed3d1b +QIUTy = f4ad5209638488397c5f44f994dd7479807e79f4887d2e71 +ZIUT = b30f2127c34df35aaa91dbf0bbe15798e799a03ed11698c1 + +COUNT = 16 +QCAVSx = 6cc4feed84c7ab0d09005d660ed34de6955a9461c4138d11 +QCAVSy = 31225f33864ed48da06fa45a913b46cf42557742e35085e6 +dIUT = bdb754096ffbfbd8b0f3cb046ccb7ca149c4e7192067a3ee +QIUTx = d9c098d421d741f6faab116f3e4731d28c5558e19fe112a1 +QIUTy = 38d4dc48ccdb1d3ed8d31fd06784a4f87a68aec1cbd5b08f +ZIUT = 64a5c246599d3e8177a2402a1110eb81e6c456ab4edb5127 + +COUNT = 17 +QCAVSx = 36157315bee7afedded58c4e8ba14d3421c401e51135bcc9 +QCAVSy = 37c297ca703f77c52bb062d8ce971db84097ba0c753a418f +dIUT = d5bcf2534dafc3d99964c7bd63ab7bd15999fe56dd969c42 +QIUTx = fda1d5d28d6fe0e7909d6a8bafa7824db5572ab92ffe7de6 +QIUTy = 134a297c1d9c8bbab249abacd951ed11e5a99f92e7991572 +ZIUT = 017b8ca53c82fab163da2ab783966a39e061b32c8cfa334d + +COUNT = 18 +QCAVSx = 98464d47f0256f8292e027e8c92582ea77cf9051f5ce8e5d +QCAVSy = 449552ef7578be96236fe5ed9d0643c0bb6c5a9134b0108d +dIUT = 43d4b9df1053be5b4268104c02244d3bf9594b010b46a8b2 +QIUTx = c3020b7091463d788f1f1d76f7cfeec82ecdb3b7d99c345c +QIUTy = 9a7710d5179591d8f3df0aa122301768ae7db7eee2d7f583 +ZIUT = 340ef3db3dbebdd91c62c3d4e1a3da2c7c52a3338b865259 + +COUNT = 19 +QCAVSx = 563eb66c334cf6f123bf04c7803b48a3110214237e983bf5 +QCAVSy = 0f351104819199ef07c9a6051d20758f3af79027ea66a53f +dIUT = 94cac2c2ca714746401670d94edbf3f677867b5a03bee7ad +QIUTx = b18554a2e743ef0aa2f040987c4c451004e096df3d80ddae +QIUTy = 6e3e2c618f896e36ba620077684b70a05ffb79bf5e6c7640 +ZIUT = 2162144921df5103d0e6a650fb13fd246f4738d0896ce92f + +COUNT = 20 +QCAVSx = 86828c4ac92b5507618aec7873a1d4fc6543c5be33cf3078 +QCAVSy = b22ca72437545e10d6d4f052422eb898b737a4b8543ee550 +dIUT = 2a3a9e33c8cc3107a9f9265c3bdea1206570e86f92ac7014 +QIUTx = a7ba38be1bc669dd23ccfcee0645b1f0db8cf942deafaeb6 +QIUTy = b82db79d80cd0e37f28d4163adc389dee8fc7797b5c9831b +ZIUT = 4c69e7feed4b11159adfc16a6047a92572ea44e0740b23af + +COUNT = 21 +QCAVSx = 6700a102437781a9581da2bc25ced5abf419da91d3c803df +QCAVSy = 71396c9cf08bcd91854e3e6e42d8c657ce0f27ab77a9dc4b +dIUT = 4a6b78a98ac98fa8e99a8ece08ec0251125f85c6fd0e289b +QIUTx = e769dbbcd5ce2d83514b768d3d2d5aa0bcd8f66af15f5500 +QIUTy = 2fc6d0b039e0f28f74fbeffe9e883d4dd72296e4e95cae71 +ZIUT = 46072acefd67bff50de355ca7a31fa6be59f26e467587259 + +COUNT = 22 +QCAVSx = a82f354cf97bee5d22dc6c079f2902ead44d96a8f614f178 +QCAVSy = a654a9aa8a1a0802f2ce0ee8a0f4ebe96dee1b37464b1ff2 +dIUT = c5a6491d78844d6617ef33be6b8bd54da221450885d5950f +QIUTx = db1b24f7466bc154e9d7d2c3ca52dcfe0bfc9563c5fdb6f3 +QIUTy = 1c74fbbf5bd99921f1a9a744f8e1cf770bd6a76a772b3003 +ZIUT = ec5580eabca9f3389d2b427ddf6e49e26d629afd03fa766e + +COUNT = 23 +QCAVSx = 3cec21b28668a12a2cf78e1a8e55d0efe065152fffc34718 +QCAVSy = 1029557beba4ff1992bd21c23cb4825f6dae70e3318fd1ca +dIUT = 2ba2703c5e23f6463c5b88dc37292fabd3399b5e1fb67c05 +QIUTx = 7543148906cef9b37a71a7c08363cdd3bba50142d65241aa +QIUTy = 8b3a6973de8dc271e27c1ead1e962fdaae3710c724daac38 +ZIUT = 7f3929dd3cbf7673bc30d859d90b880307475f800660ea32 + +COUNT = 24 +QCAVSx = 7082644715b8b731f8228b5118e7270d34d181f361a221fc +QCAVSy = 464649d6c88ca89614488a1cc7b8442bb42f9fb3020a3d76 +dIUT = 836118c6248f882e9147976f764826c1a28755a6102977d5 +QIUTx = fcd345a976c720caaa97de6697226825615e1287a9eff67e +QIUTy = 58ea42edbeeafca9ff44cfd7f29abd2cbde7626d79e422c9 +ZIUT = 72e88f3ea67d46d46dbf83926e7e2a6b85b54536741e6d2c + + +[P-224] + +COUNT = 0 +QCAVSx = af33cd0629bc7e996320a3f40368f74de8704fa37b8fab69abaae280 +QCAVSy = 882092ccbba7930f419a8a4f9bb16978bbc3838729992559a6f2e2d7 +dIUT = 8346a60fc6f293ca5a0d2af68ba71d1dd389e5e40837942df3e43cbd +QIUTx = 8de2e26adf72c582d6568ef638c4fd59b18da171bdf501f1d929e048 +QIUTy = 4a68a1c2b0fb22930d120555c1ece50ea98dea8407f71be36efac0de +ZIUT = 7d96f9a3bd3c05cf5cc37feb8b9d5209d5c2597464dec3e9983743e8 + +COUNT = 1 +QCAVSx = 13bfcd4f8e9442393cab8fb46b9f0566c226b22b37076976f0617a46 +QCAVSy = eeb2427529b288c63c2f8963c1e473df2fca6caa90d52e2f8db56dd4 +dIUT = 043cb216f4b72cdf7629d63720a54aee0c99eb32d74477dac0c2f73d +QIUTx = 2f90f5c8eac9c7decdbb97b6c2f715ab725e4fe40fe6d746efbf4e1b +QIUTy = 66897351454f927a309b269c5a6d31338be4c19a5acfc32cf656f45c +ZIUT = ee93ce06b89ff72009e858c68eb708e7bc79ee0300f73bed69bbca09 + +COUNT = 2 +QCAVSx = 756dd806b9d9c34d899691ecb45b771af468ec004486a0fdd283411e +QCAVSy = 4d02c2ca617bb2c5d9613f25dd72413d229fd2901513aa29504eeefb +dIUT = 5ad0dd6dbabb4f3c2ea5fe32e561b2ca55081486df2c7c15c9622b08 +QIUTx = 005bca45d793e7fe99a843704ed838315ab14a5f6277507e9bc37531 +QIUTy = 43e9d421e1486ae5893bfd23c210e5c140d7c6b1ada59d842c9a98de +ZIUT = 3fcc01e34d4449da2a974b23fc36f9566754259d39149790cfa1ebd3 + +COUNT = 3 +QCAVSx = 0f537bf1c1122c55656d25e8aa8417e0b44b1526ae0523144f9921c4 +QCAVSy = f79b26d30e491a773696cc2c79b4f0596bc5b9eebaf394d162fb8684 +dIUT = 0aa6ff55a5d820efcb4e7d10b845ea3c9f9bc5dff86106db85318e22 +QIUTx = 2f96754131e0968198aa78fbe8c201dc5f3581c792de487340d32448 +QIUTy = 61e8a5cd79615203b6d89e9496f9e236fe3b6be8731e743d615519c6 +ZIUT = 49129628b23afcef48139a3f6f59ff5e9811aa746aa4ff33c24bb940 + +COUNT = 4 +QCAVSx = 2b3631d2b06179b3174a100f7f57131eeea8947be0786c3dc64b2239 +QCAVSy = 83de29ae3dad31adc0236c6de7f14561ca2ea083c5270c78a2e6cbc0 +dIUT = efe6e6e25affaf54c98d002abbc6328da159405a1b752e32dc23950a +QIUTx = 355e962920bde043695f6bffb4b355c63da6f5de665ed46f2ec817e2 +QIUTy = 748e095368f62e1d364edd461719793b404adbdaacbcadd88922ff37 +ZIUT = fcdc69a40501d308a6839653a8f04309ec00233949522902ffa5eac6 + +COUNT = 5 +QCAVSx = 4511403de29059f69a475c5a6a5f6cabed5d9f014436a8cb70a02338 +QCAVSy = 7d2d1b62aa046df9340f9c37a087a06b32cf7f08a223f992812a828b +dIUT = 61cb2932524001e5e9eeed6df7d9c8935ee3322029edd7aa8acbfd51 +QIUTx = d50e4adabfd989d7dbc7cf4052546cc7c447a97630436997ad4b9536 +QIUTy = 5bea503473c5eaef9552d42c40b1f2f7ca292733b255b9bbe1b12337 +ZIUT = 827e9025cb62e0e837c596063f3b9b5a0f7afd8d8783200086d61ec1 + +COUNT = 6 +QCAVSx = 314a0b26dd31c248845d7cc17b61cad4608259bed85a58d1f1ffd378 +QCAVSy = 66e4b350352e119eecada382907f3619fd748ea73ae4899dfd496302 +dIUT = 8c7ace347171f92def98d845475fc82e1d1496da81ee58f505b985fa +QIUTx = b1a8dcac89aca2799320b451df1c7ff4d97567abb68141c0d95fc2aa +QIUTy = 3524950902b1510bdc987d860afc27ad871ceaea66935abd3c0a99a8 +ZIUT = 335ba51228d94acbed851ca7821c801d5cb1c7975d7aa90a7159f8fa + +COUNT = 7 +QCAVSx = abe6843beec2fd9e5fb64730d0be4d165438ce922ed75dd80b4603e5 +QCAVSy = 6afe8673a96c4ba9900ad85995e631e436c6cc88a2c2b47b7c4886b8 +dIUT = 382feb9b9ba10f189d99e71a89cdfe44cb554cec13a212840977fb68 +QIUTx = abb6f1e3773ff8fc73aea2a0b107809ce70adcefed6e41fc5cb43045 +QIUTy = a963897ae906c10a055eeadb97ffdd6f748d3e5621e5fff304e48ba7 +ZIUT = 8c2e627594206b34f7356d3426eb3d79f518ef843fbe94014cceace3 + +COUNT = 8 +QCAVSx = 13cf9d6d2c9aae8274c27d446afd0c888ffdd52ae299a35984d4f527 +QCAVSy = dcbee75b515751f8ee2ae355e8afd5de21c62a939a6507b538cbc4af +dIUT = e0d62035101ef487c485c60fb4500eebe6a32ec64dbe97dbe0232c46 +QIUTx = 88537735e9b23e3e0e076f135a82d33f9bffb465f3abce8322a62a62 +QIUTy = b4c8c123673197875c0bd14ed097606d330fba2b9200ef65a44764d3 +ZIUT = 632abb662728dbc994508873d5c527ca5ef923c0d31fa6c47ef4c825 + +COUNT = 9 +QCAVSx = 965b637c0dfbc0cf954035686d70f7ec30929e664e521dbaa2280659 +QCAVSy = 82a58ff61bc90019bbcbb5875d3863db0bc2a1fa34b0ad4de1a83f99 +dIUT = b96ade5b73ba72aa8b6e4d74d7bf9c58e962ff78eb542287c7b44ba2 +QIUTx = 37682926a54f70a4c1748f54d50d5b00138a055f924f2c65e5b0bbe4 +QIUTy = 596afefcdd640d29635015b89bdddd1f8c2723686d332e7a06ca8799 +ZIUT = 34641141aab05ef58bd376d609345901fb8f63477c6be9097f037f1f + +COUNT = 10 +QCAVSx = 73cc645372ca2e71637cda943d8148f3382ab6dd0f2e1a49da94e134 +QCAVSy = df5c355c23e6e232ebc3bee2ab1873ee0d83e3382f8e6fe613f6343c +dIUT = a40d7e12049c71e6522c7ff2384224061c3a457058b310557655b854 +QIUTx = 399801243bfe0c2da9b0a53c8ca57f2eee87aaa94a8e4d5e029f42ca +QIUTy = aa49e6d4b47cee7a5c4ab71d5a67da84e0b9b425ce3e70da68c889e7 +ZIUT = 4f74ac8507501a32bfc5a78d8271c200e835966e187e8d00011a8c75 + +COUNT = 11 +QCAVSx = 546578216250354e449e21546dd11cd1c5174236739acad9ce0f4512 +QCAVSy = d2a22fcd66d1abedc767668327c5cb9c599043276239cf3c8516af24 +dIUT = ad2519bc724d484e02a69f05149bb047714bf0f5986fac2e222cd946 +QIUTx = df9c1e0ef15e53b9f626e2be1cbe893639c06f3e0439ee95d7d4b1e3 +QIUTy = 7a52a7386adda243efdf8941085c84e31239cab92b8017336748965e +ZIUT = ad09c9ae4d2324ea81bb555b200d3c003e22a6870ee03b52df49e4de + +COUNT = 12 +QCAVSx = 1d46b1dc3a28123cb51346e67baec56404868678faf7d0e8b2afa22a +QCAVSy = 0ec9e65ec97e218373e7fc115c2274d5b829a60d93f71e01d58136c3 +dIUT = 3d312a9b9d8ed09140900bbac1e095527ebc9e3c6493bcf3666e3a29 +QIUTx = b4a0198dc8810e884425b750928b0c960c31f7a99663400b01a179df +QIUTy = 812b601bfc0738242c6f86f830f27acd632ca618a0b5280c9d5769f7 +ZIUT = ef029c28c68064b8abd2965a38c404fb5e944ace57e8638daba9d3cd + +COUNT = 13 +QCAVSx = 266d038cc7a4fe21f6c976318e827b82bb5b8f7443a55298136506e0 +QCAVSy = df123d98a7a20bbdf3943df2e3563422f8c0cf74d53aaabdd7c973ba +dIUT = 8ce0822dc24c153995755ac350737ef506641c7d752b4f9300c612ed +QIUTx = 00dfc7ec137690cd6d12fdb2fd0b8c5314582108769c2b722ffb3958 +QIUTy = 5eef3da4ba458127346bb64023868bddb7558a2ecfc813645f4ce9fe +ZIUT = f83c16661dfcbad021cc3b5a5af51d9a18db4653866b3ff90787ce3e + +COUNT = 14 +QCAVSx = eb0a09f7a1c236a61f595809ec5670efd92e4598d5e613e092cdfdca +QCAVSy = 50787ae2f2f15b88bc10f7b5f0aee1418373f16153aebd1fba54288d +dIUT = 0ff9b485325ab77f29e7bc379fed74bfac859482da0dee7528c19db2 +QIUTx = 7e603e6976db83c36011508fa695d1b515249e2e54b48fcbcfb90247 +QIUTy = 0179a600ce86adfca9b1b931fa5173d618da09e841803d19b0264286 +ZIUT = f51258c63f232e55a66aa25ebd597b2018d1052c02eeb63866758005 + +COUNT = 15 +QCAVSx = 6b2f6b18a587f562ffc61bd9b0047322286986a78f1fd139b84f7c24 +QCAVSy = 7096908e4615266be59a53cd655515056ff92370a6271a5d3823d704 +dIUT = 19cf5ff6306467f28b9fe0675a43c0582552c8c12e59ce7c38f292b1 +QIUTx = fc20e906e609c112cfc2e0fea6303882c5db94e87e022373ab2c082a +QIUTy = aecdf1daa71782bc5a26bbbd8d7e8a76490e26abc17dffc774bd7341 +ZIUT = 7fdc969a186ff18429f2a276dac43beea21182d82ce2e5a0876552b1 + +COUNT = 16 +QCAVSx = 328101ba826acd75ff9f34d5574ce0dbc92f709bad8d7a33c47940c1 +QCAVSy = df39f1ea88488c55d5538160878b9ced18a887ea261dd712d14024ff +dIUT = 90a15368e3532c0b1e51e55d139447c2c89bc160719d697291ea7c14 +QIUTx = c6837d506e976da7db3ad1267c359dff2ea6fb0b7f7f8e77024c59e9 +QIUTy = 67eb491d2fc8a530c46525d2a8b2d7c1df5fba1ae740a4649c683ee6 +ZIUT = 3d60ab6db2b3ffe2d29ccff46d056e54230cf34982e241556ed2920c + +COUNT = 17 +QCAVSx = 0081e34270871e2ebbd94183f617b4ae15f0416dd634fe6e934cf3c0 +QCAVSy = 3a1e9f38a7b90b7317d26b9f6311063ab58b268cf489b2e50386d5d6 +dIUT = 8e0838e05e1721491067e1cabc2e8051b290e2616eec427b7121897d +QIUTx = e9150f770075626019e18f95473b71e6828041791d3f08d3faeeaa2b +QIUTy = 475f70735eaae52308a3b763dc88efe18ab590ebafa035f6e08b001c +ZIUT = 9116d72786f4db5df7a8b43078c6ab9160d423513d35ea5e2559306d + +COUNT = 18 +QCAVSx = 2623632fdf0bd856805a69aa186d4133ef5904e1f655a972d66cce07 +QCAVSy = 2cef9728dd06fb8b50150f529b695076d4507983912585c89bd0682e +dIUT = 38106e93f16a381adb1d72cee3da66ae462ad4bbfea9ecdf35d0814e +QIUTx = 7be6c4c917829ab657dd79e8637d7aefd2f81f0de7654d957e97658d +QIUTy = 430d22d9e8438310f61e0d43f25fa3e34585f432baad27db3021bf0d +ZIUT = 207c53dcefac789aaa0276d9200b3a940ce5f2296f4cb2e81a185d3d + +COUNT = 19 +QCAVSx = 8ee4d1dcc31dee4bf6fe21ca8a587721d910acfb122c16c2a77a8152 +QCAVSy = 4ebf323fff04eb477069a0ac68b345f6b1ae134efc31940e513cb99f +dIUT = e5d1718431cf50f6cbd1bc8019fa16762dfa12c989e5999977fb4ea2 +QIUTx = 2ea4966e7f92ed7f5cc61fde792045f63b731d6e7d0de2577f2d8ece +QIUTy = 1c4a7b1ede6f839162292df424be78e8176fb6f942a3c02391700f31 +ZIUT = 10e467da34f48ad7072005bccd6da1b2ba3f71eafa1c393842f91d74 + +COUNT = 20 +QCAVSx = 97dcbe6d28335882a6d193cc54a1063dd0775dc328565300bb99e691 +QCAVSy = dad11dd5ece8cfd9f97c9a526e4a1506e6355969ee87826fc38bcd24 +dIUT = 3d635691b62a9a927c633951c9369c8862bd2119d30970c2644727d6 +QIUTx = 438bbb980517afb20be1d674e3ac2b31cef07a9b23fb8f6e38e0d6c0 +QIUTy = 0be5f1c47d58d21b6ed28423b32f5a94750da47edcef33ea79942afd +ZIUT = 82fd2f9c60c4f999ac00bbe64bfc11da8ff8cda2e499fced65230bb1 + +COUNT = 21 +QCAVSx = ce9126dd53972dea1de1d11efef900de34b661859c4648c5c0e534f7 +QCAVSy = e113b6f2c1659d07f2716e64a83c18bbce344dd2121fe85168eae085 +dIUT = acf3c85bbdc379f02f5ea36e7f0f53095a9e7046a28685a8659bf798 +QIUTx = ff7511215c71d796bd646e8474be4416b91684ce0d269ef6f422013b +QIUTy = b7bf5e79b5a9393bb9ea42c0bdb2d3c2dc806e1a7306aa58e4fdbea5 +ZIUT = 530f7e7fc932613b29c981f261cb036cba3f1df3864e0e1cba2685a2 + +COUNT = 22 +QCAVSx = 84419967d6cfad41e75a02b6da605a97949a183a97c306c4b46e66a5 +QCAVSy = 5cc9b259718b1bc8b144fde633a894616ffd59a3a6d5d8e942c7cbb7 +dIUT = cffd62cb00a0e3163fbf2c397fadc9618210f86b4f54a675287305f0 +QIUTx = 04bf4d948f4430d18b4ed6c96dbaf981fa11a403ed16887f06754981 +QIUTy = 7c1326a9cef51f79d4e78303d6064b459f612584ac2fdf593d7d5d84 +ZIUT = 49f6fd0139248ef4df2db05d1319bd5b1489e249827a45a8a5f12427 + +COUNT = 23 +QCAVSx = 7c9cac35768063c2827f60a7f51388f2a8f4b7f8cd736bd6bc337477 +QCAVSy = 29ee6b849c6025d577dbcc55fbd17018f4edbc2ef105b004d6257bcd +dIUT = 85f903e43943d13c68932e710e80de52cbc0b8f1a1418ea4da079299 +QIUTx = 970a4a7e01d4188497ceb46955eb1b842d9085819a9b925c84529d3d +QIUTy = dfa2526480f833ea0edbd204e4e365fef3472888fe7d9691c3ebc09f +ZIUT = 8f7e34e597ae8093b98270a74a8dfcdbed457f42f43df487c5487161 + +COUNT = 24 +QCAVSx = 085a7642ad8e59b1a3e8726a7547afbecffdac1dab7e57230c6a9df4 +QCAVSy = f91c36d881fe9b8047a3530713554a1af4c25c5a8e654dcdcf689f2e +dIUT = cce64891a3d0129fee0d4a96cfbe7ac470b85e967529057cfa31a1d9 +QIUTx = a6b29632db94da2125dc1cf80e03702687b2acc1122022fa2174765a +QIUTy = 61723edd73e10daed73775278f1958ba56f1fc9d085ebc2b64c84fe5 +ZIUT = 71954e2261e8510be1a060733671d2e9d0a2d012eb4e09556d697d2a + + +[P-256] + +COUNT = 0 +QCAVSx = 700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287 +QCAVSy = db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac +dIUT = 7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534 +QIUTx = ead218590119e8876b29146ff89ca61770c4edbbf97d38ce385ed281d8a6b230 +QIUTy = 28af61281fd35e2fa7002523acc85a429cb06ee6648325389f59edfce1405141 +ZIUT = 46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b + +COUNT = 1 +QCAVSx = 809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7ae +QCAVSy = b29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3 +dIUT = 38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5 +QIUTx = 119f2f047902782ab0c9e27a54aff5eb9b964829ca99c06b02ddba95b0a3f6d0 +QIUTy = 8f52b726664cac366fc98ac7a012b2682cbd962e5acb544671d41b9445704d1d +ZIUT = 057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67 + +COUNT = 2 +QCAVSx = a2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3 +QCAVSy = ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536 +dIUT = 1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8 +QIUTx = d9f2b79c172845bfdb560bbb01447ca5ecc0470a09513b6126902c6b4f8d1051 +QIUTy = f815ef5ec32128d3487834764678702e64e164ff7315185e23aff5facd96d7bc +ZIUT = 2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ec + +COUNT = 3 +QCAVSx = df3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed +QCAVSy = 422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4 +dIUT = 207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d +QIUTx = 24277c33f450462dcb3d4801d57b9ced05188f16c28eda873258048cd1607e0d +QIUTy = c4789753e2b1f63b32ff014ec42cd6a69fac81dfe6d0d6fd4af372ae27c46f88 +ZIUT = 96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024 + +COUNT = 4 +QCAVSx = 41192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb922 +QCAVSy = 1af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328 +dIUT = 59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf +QIUTx = a8c5fdce8b62c5ada598f141adb3b26cf254c280b2857a63d2ad783a73115f6b +QIUTy = 806e1aafec4af80a0d786b3de45375b517a7e5b51ffb2c356537c9e6ef227d4a +ZIUT = 19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62 + +COUNT = 5 +QCAVSx = 33e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792 +QCAVSy = f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2f +dIUT = f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef +QIUTx = 7b861dcd2844a5a8363f6b8ef8d493640f55879217189d80326aad9480dfc149 +QIUTy = c4675b45eeb306405f6c33c38bc69eb2bdec9b75ad5af4706aab84543b9cc63a +ZIUT = 664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3 + +COUNT = 6 +QCAVSx = 6a9e0c3f916e4e315c91147be571686d90464e8bf981d34a90b6353bca6eeba7 +QCAVSy = 40f9bead39c2f2bcc2602f75b8a73ec7bdffcbcead159d0174c6c4d3c5357f05 +dIUT = 3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190 +QIUTx = 9fb38e2d58ea1baf7622e96720101cae3cde4ba6c1e9fa26d9b1de0899102863 +QIUTy = d5561b900406edf50802dd7d73e89395f8aed72fba0e1d1b61fe1d22302260f0 +ZIUT = ca342daa50dc09d61be7c196c85e60a80c5cb04931746820be548cdde055679d + +COUNT = 7 +QCAVSx = a9c0acade55c2a73ead1a86fb0a9713223c82475791cd0e210b046412ce224bb +QCAVSy = f6de0afa20e93e078467c053d241903edad734c6b403ba758c2b5ff04c9d4229 +dIUT = d8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8 +QIUTx = 20f07631e4a6512a89ad487c4e9d63039e579cb0d7a556cb9e661cd59c1e7fa4 +QIUTy = 6de91846b3eee8a5ec09c2ab1f41e21bd83620ccdd1bdce3ab7ea6e02dd274f5 +ZIUT = 35aa9b52536a461bfde4e85fc756be928c7de97923f0416c7a3ac8f88b3d4489 + +COUNT = 8 +QCAVSx = 94e94f16a98255fff2b9ac0c9598aac35487b3232d3231bd93b7db7df36f9eb9 +QCAVSy = d8049a43579cfa90b8093a94416cbefbf93386f15b3f6e190b6e3455fedfe69a +dIUT = 0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d +QIUTx = abb61b423be5d6c26e21c605832c9142dc1dfe5a5fff28726737936e6fbf516d +QIUTy = 733d2513ef58beab202090586fac91bf0fee31e80ab33473ab23a2d89e58fad6 +ZIUT = 605c16178a9bc875dcbff54d63fe00df699c03e8a888e9e94dfbab90b25f39b4 + +COUNT = 9 +QCAVSx = e099bf2a4d557460b5544430bbf6da11004d127cb5d67f64ab07c94fcdf5274f +QCAVSy = d9c50dbe70d714edb5e221f4e020610eeb6270517e688ca64fb0e98c7ef8c1c5 +dIUT = 2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08 +QIUTx = 3d63e429cb5fa895a9247129bf4e48e89f35d7b11de8158efeb3e106a2a87395 +QIUTy = 0cae9e477ef41e7c8c1064379bb7b554ddcbcae79f9814281f1e50f0403c61f3 +ZIUT = f96e40a1b72840854bb62bc13c40cc2795e373d4e715980b261476835a092e0b + +COUNT = 10 +QCAVSx = f75a5fe56bda34f3c1396296626ef012dc07e4825838778a645c8248cff01658 +QCAVSy = 33bbdf1b1772d8059df568b061f3f1122f28a8d819167c97be448e3dc3fb0c3c +dIUT = 77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848 +QIUTx = ad5d13c3db508ddcd38457e5991434a251bed49cf5ddcb59cdee73865f138c9f +QIUTy = 62cec1e70588aa4fdfc7b9a09daa678081c04e1208b9d662b8a2214bf8e81a21 +ZIUT = 8388fa79c4babdca02a8e8a34f9e43554976e420a4ad273c81b26e4228e9d3a3 + +COUNT = 11 +QCAVSx = 2db4540d50230756158abf61d9835712b6486c74312183ccefcaef2797b7674d +QCAVSy = 62f57f314e3f3495dc4e099012f5e0ba71770f9660a1eada54104cdfde77243e +dIUT = 42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e +QIUTx = ab48caa61ea35f13f8ed07ffa6a13e8db224dfecfae1a7df8b1bb6ebaf0cb97d +QIUTy = 1274530ca2c385a3218bddfbcbf0b4024c9badd5243bff834ebff24a8618dccb +ZIUT = 72877cea33ccc4715038d4bcbdfe0e43f42a9e2c0c3b017fc2370f4b9acbda4a + +COUNT = 12 +QCAVSx = cd94fc9497e8990750309e9a8534fd114b0a6e54da89c4796101897041d14ecb +QCAVSy = c3def4b5fe04faee0a11932229fff563637bfdee0e79c6deeaf449f85401c5c4 +dIUT = ceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b +QIUTx = 9a8cd9bd72e71752df91440f77c547509a84df98114e7de4f26cdb39234a625d +QIUTy = d07cfc84c8e144fab2839f5189bb1d7c88631d579bbc58012ed9a2327da52f62 +ZIUT = e4e7408d85ff0e0e9c838003f28cdbd5247cdce31f32f62494b70e5f1bc36307 + +COUNT = 13 +QCAVSx = 15b9e467af4d290c417402e040426fe4cf236bae72baa392ed89780dfccdb471 +QCAVSy = cdf4e9170fb904302b8fd93a820ba8cc7ed4efd3a6f2d6b05b80b2ff2aee4e77 +dIUT = 43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604 +QIUTx = f989cf8ee956a82e7ebd9881cdbfb2fd946189b08db53559bc8cfdd48071eb14 +QIUTy = 5eff28f1a18a616b04b7d337868679f6dd84f9a7b3d7b6f8af276c19611a541d +ZIUT = ed56bcf695b734142c24ecb1fc1bb64d08f175eb243a31f37b3d9bb4407f3b96 + +COUNT = 14 +QCAVSx = 49c503ba6c4fa605182e186b5e81113f075bc11dcfd51c932fb21e951eee2fa1 +QCAVSy = 8af706ff0922d87b3f0c5e4e31d8b259aeb260a9269643ed520a13bb25da5924 +dIUT = b2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903 +QIUTx = 69c627625b36a429c398b45c38677cb35d8beb1cf78a571e40e99fe4eac1cd4e +QIUTy = 81690112b0a88f20f7136b28d7d47e5fbc2ada3c8edd87589bc19ec9590637bd +ZIUT = bc5c7055089fc9d6c89f83c1ea1ada879d9934b2ea28fcf4e4a7e984b28ad2cf + +COUNT = 15 +QCAVSx = 19b38de39fdd2f70f7091631a4f75d1993740ba9429162c2a45312401636b29c +QCAVSy = 09aed7232b28e060941741b6828bcdfa2bc49cc844f3773611504f82a390a5ae +dIUT = 4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8 +QIUTx = 5fe964671315a18aa68a2a6e3dd1fde7e23b8ce7181471cfac43c99e1ae80262 +QIUTy = d5827be282e62c84de531b963884ba832db5d6b2c3a256f0e604fe7e6b8a7f72 +ZIUT = 9a4e8e657f6b0e097f47954a63c75d74fcba71a30d83651e3e5a91aa7ccd8343 + +COUNT = 16 +QCAVSx = 2c91c61f33adfe9311c942fdbff6ba47020feff416b7bb63cec13faf9b099954 +QCAVSy = 6cab31b06419e5221fca014fb84ec870622a1b12bab5ae43682aa7ea73ea08d0 +dIUT = 4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147 +QIUTx = c9b2b8496f1440bd4a2d1e52752fd372835b364885e154a7dac49295f281ec7c +QIUTy = fbe6b926a8a4de26ccc83b802b1212400754be25d9f3eeaf008b09870ae76321 +ZIUT = 3ca1fc7ad858fb1a6aba232542f3e2a749ffc7203a2374a3f3d3267f1fc97b78 + +COUNT = 17 +QCAVSx = a28a2edf58025668f724aaf83a50956b7ac1cfbbff79b08c3bf87dfd2828d767 +QCAVSy = dfa7bfffd4c766b86abeaf5c99b6e50cb9ccc9d9d00b7ffc7804b0491b67bc03 +dIUT = 1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e +QIUTx = 59e1e101521046ad9cf1d082e9d2ec7dd22530cce064991f1e55c5bcf5fcb591 +QIUTy = 482f4f673176c8fdaa0bb6e59b15a3e47454e3a04297d3863c9338d98add1f37 +ZIUT = 1aaabe7ee6e4a6fa732291202433a237df1b49bc53866bfbe00db96a0f58224f + +COUNT = 18 +QCAVSx = a2ef857a081f9d6eb206a81c4cf78a802bdf598ae380c8886ecd85fdc1ed7644 +QCAVSy = 563c4c20419f07bc17d0539fade1855e34839515b892c0f5d26561f97fa04d1a +dIUT = dd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3 +QIUTx = 30b9db2e2e977bcdc98cb87dd736cbd8e78552121925cf16e1933657c2fb2314 +QIUTy = 6a45028800b81291bce5c2e1fed7ded650620ebbe6050c6f3a7f0dfb4673ab5c +ZIUT = 430e6a4fba4449d700d2733e557f66a3bf3d50517c1271b1ddae1161b7ac798c + +COUNT = 19 +QCAVSx = ccd8a2d86bc92f2e01bce4d6922cf7fe1626aed044685e95e2eebd464505f01f +QCAVSy = e9ddd583a9635a667777d5b8a8f31b0f79eba12c75023410b54b8567dddc0f38 +dIUT = 5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76 +QIUTx = 46c9ebd1a4a3c8c0b6d572b5dcfba12467603208a9cb5d2acfbb733c40cf6391 +QIUTy = 46c913a27d044185d38b467ace011e04d4d9bbbb8cb9ae25fa92aaf15a595e86 +ZIUT = 1ce9e6740529499f98d1f1d71329147a33df1d05e4765b539b11cf615d6974d3 + +COUNT = 20 +QCAVSx = c188ffc8947f7301fb7b53e36746097c2134bf9cc981ba74b4e9c4361f595e4e +QCAVSy = bf7d2f2056e72421ef393f0c0f2b0e00130e3cac4abbcc00286168e85ec55051 +dIUT = b601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d +QIUTx = 7c9e950841d26c8dde8994398b8f5d475a022bc63de7773fcf8d552e01f1ba0a +QIUTy = cc42b9885c9b3bee0f8d8c57d3a8f6355016c019c4062fa22cff2f209b5cc2e1 +ZIUT = 4690e3743c07d643f1bc183636ab2a9cb936a60a802113c49bb1b3f2d0661660 + +COUNT = 21 +QCAVSx = 317e1020ff53fccef18bf47bb7f2dd7707fb7b7a7578e04f35b3beed222a0eb6 +QCAVSy = 09420ce5a19d77c6fe1ee587e6a49fbaf8f280e8df033d75403302e5a27db2ae +dIUT = fefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535 +QIUTx = 38b54db85500cb20c61056edd3d88b6a9dc26780a047f213a6e1b900f76596eb +QIUTy = 6387e4e5781571e4eb8ae62991a33b5dc33301c5bc7e125d53794a39160d8fd0 +ZIUT = 30c2261bd0004e61feda2c16aa5e21ffa8d7e7f7dbf6ec379a43b48e4b36aeb0 + +COUNT = 22 +QCAVSx = 45fb02b2ceb9d7c79d9c2fa93e9c7967c2fa4df5789f9640b24264b1e524fcb1 +QCAVSy = 5c6e8ecf1f7d3023893b7b1ca1e4d178972ee2a230757ddc564ffe37f5c5a321 +dIUT = 334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce +QIUTx = 3f2bf1589abf3047bf3e54ac9a95379bff95f8f55405f64eca36a7eebe8ffca7 +QIUTy = 5212a94e66c5ae9a8991872f66a72723d80ec5b2e925745c456f5371943b3a06 +ZIUT = 2adae4a138a239dcd93c243a3803c3e4cf96e37fe14e6a9b717be9599959b11c + +COUNT = 23 +QCAVSx = a19ef7bff98ada781842fbfc51a47aff39b5935a1c7d9625c8d323d511c92de6 +QCAVSy = e9c184df75c955e02e02e400ffe45f78f339e1afe6d056fb3245f4700ce606ef +dIUT = 2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d +QIUTx = 29c0807f10cbc42fb45c9989da50681eead716daa7b9e91fd32e062f5eb92ca0 +QIUTy = ff1d6d1955d7376b2da24fe1163a271659136341bc2eb1195fc706dc62e7f34d +ZIUT = 2e277ec30f5ea07d6ce513149b9479b96e07f4b6913b1b5c11305c1444a1bc0b + +COUNT = 24 +QCAVSx = 356c5a444c049a52fee0adeb7e5d82ae5aa83030bfff31bbf8ce2096cf161c4b +QCAVSy = 57d128de8b2a57a094d1a001e572173f96e8866ae352bf29cddaf92fc85b2f92 +dIUT = 85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0 +QIUTx = 9cf4b98581ca1779453cc816ff28b4100af56cf1bf2e5bc312d83b6b1b21d333 +QIUTy = 7a5504fcac5231a0d12d658218284868229c844a04a3450d6c7381abe080bf3b +ZIUT = 1e51373bd2c6044c129c436e742a55be2a668a85ae08441b6756445df5493857 + + +[P-384] + +COUNT = 0 +QCAVSx = a7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066 +QCAVSy = ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437a +dIUT = 3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1 +QIUTx = 9803807f2f6d2fd966cdd0290bd410c0190352fbec7ff6247de1302df86f25d34fe4a97bef60cff548355c015dbb3e5f +QIUTy = ba26ca69ec2f5b5d9dad20cc9da711383a9dbe34ea3fa5a2af75b46502629ad54dd8b7d73a8abb06a3a3be47d650cc99 +ZIUT = 5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1 + +COUNT = 1 +QCAVSx = 30f43fcf2b6b00de53f624f1543090681839717d53c7c955d1d69efaf0349b7363acb447240101cbb3af6641ce4b88e0 +QCAVSy = 25e46c0c54f0162a77efcc27b6ea792002ae2ba82714299c860857a68153ab62e525ec0530d81b5aa15897981e858757 +dIUT = 92860c21bde06165f8e900c687f8ef0a05d14f290b3f07d8b3a8cc6404366e5d5119cd6d03fb12dc58e89f13df9cd783 +QIUTx = ea4018f5a307c379180bf6a62fd2ceceebeeb7d4df063a66fb838aa35243419791f7e2c9d4803c9319aa0eb03c416b66 +QIUTy = 68835a91484f05ef028284df6436fb88ffebabcdd69ab0133e6735a1bcfb37203d10d340a8328a7b68770ca75878a1a6 +ZIUT = a23742a2c267d7425fda94b93f93bbcc24791ac51cd8fd501a238d40812f4cbfc59aac9520d758cf789c76300c69d2ff + +COUNT = 2 +QCAVSx = 1aefbfa2c6c8c855a1a216774550b79a24cda37607bb1f7cc906650ee4b3816d68f6a9c75da6e4242cebfb6652f65180 +QCAVSy = 419d28b723ebadb7658fcebb9ad9b7adea674f1da3dc6b6397b55da0f61a3eddacb4acdb14441cb214b04a0844c02fa3 +dIUT = 12cf6a223a72352543830f3f18530d5cb37f26880a0b294482c8a8ef8afad09aa78b7dc2f2789a78c66af5d1cc553853 +QIUTx = fcfcea085e8cf74d0dced1620ba8423694f903a219bbf901b0b59d6ac81baad316a242ba32bde85cb248119b852fab66 +QIUTy = 972e3c68c7ab402c5836f2a16ed451a33120a7750a6039f3ff15388ee622b7065f7122bf6d51aefbc29b37b03404581b +ZIUT = 3d2e640f350805eed1ff43b40a72b2abed0a518bcebe8f2d15b111b6773223da3c3489121db173d414b5bd5ad7153435 + +COUNT = 3 +QCAVSx = 8bc089326ec55b9cf59b34f0eb754d93596ca290fcb3444c83d4de3a5607037ec397683f8cef07eab2fe357eae36c449 +QCAVSy = d9d16ce8ac85b3f1e94568521aae534e67139e310ec72693526aa2e927b5b322c95a1a033c229cb6770c957cd3148dd7 +dIUT = 8dd48063a3a058c334b5cc7a4ce07d02e5ee6d8f1f3c51a1600962cbab462690ae3cd974fb39e40b0e843daa0fd32de1 +QIUTx = e38c9846248123c3421861ea4d32669a7b5c3c08376ad28104399494c84ff5efa3894adb2c6cbe8c3c913ef2eec5bd3c +QIUTy = 9fa84024a1028796df84021f7b6c9d02f0f4bd1a612a03cbf75a0beea43fef8ae84b48c60172aadf09c1ad016d0bf3ce +ZIUT = 6a42cfc392aba0bfd3d17b7ccf062b91fc09bbf3417612d02a90bdde62ae40c54bb2e56e167d6b70db670097eb8db854 + +COUNT = 4 +QCAVSx = eb952e2d9ac0c20c6cc48fb225c2ad154f53c8750b003fd3b4ed8ed1dc0defac61bcdde02a2bcfee7067d75d342ed2b0 +QCAVSy = f1828205baece82d1b267d0d7ff2f9c9e15b69a72df47058a97f3891005d1fb38858f5603de840e591dfa4f6e7d489e1 +dIUT = 84ece6cc3429309bd5b23e959793ed2b111ec5cb43b6c18085fcaea9efa0685d98a6262ee0d330ee250bc8a67d0e733f +QIUTx = 3222063a2997b302ee60ee1961108ff4c7acf1c0ef1d5fb0d164b84bce71c431705cb9aea9a45f5d73806655a058bee3 +QIUTy = e61fa9e7fbe7cd43abf99596a3d3a039e99fa9dc93b0bdd9cad81966d17eeaf557068afa7c78466bb5b22032d1100fa6 +ZIUT = ce7ba454d4412729a32bb833a2d1fd2ae612d4667c3a900e069214818613447df8c611de66da200db7c375cf913e4405 + +COUNT = 5 +QCAVSx = 441d029e244eb7168d647d4df50db5f4e4974ab3fdaf022aff058b3695d0b8c814cc88da6285dc6df1ac55c553885003 +QCAVSy = e8025ac23a41d4b1ea2aa46c50c6e479946b59b6d76497cd9249977e0bfe4a6262622f13d42a3c43d66bdbb30403c345 +dIUT = 68fce2121dc3a1e37b10f1dde309f9e2e18fac47cd1770951451c3484cdb77cb136d00e731260597cc2859601c01a25b +QIUTx = 868be0e694841830e424d913d8e7d86b84ee1021d82b0ecf523f09fe89a76c0c95c49f2dfbcf829c1e39709d55efbb3b +QIUTy = 9195eb183675b40fd92f51f37713317e4a9b4f715c8ab22e0773b1bc71d3a219f05b8116074658ee86b52e36f3897116 +ZIUT = ba69f0acdf3e1ca95caaac4ecaf475bbe51b54777efce01ca381f45370e486fe87f9f419b150c61e329a286d1aa265ec + +COUNT = 6 +QCAVSx = 3d4e6bf08a73404accc1629873468e4269e82d90d832e58ad72142639b5a056ad8d35c66c60e8149fac0c797bceb7c2f +QCAVSy = 9b0308dc7f0e6d29f8c277acbc65a21e5adb83d11e6873bc0a07fda0997f482504602f59e10bc5cb476b83d0a4f75e71 +dIUT = b1764c54897e7aae6de9e7751f2f37de849291f88f0f91093155b858d1cc32a3a87980f706b86cc83f927bdfdbeae0bd +QIUTx = c371222feaa6770c6f3ea3e0dac9740def4fcf821378b7f91ff937c21e0470f70f3a31d5c6b2912195f10926942b48ae +QIUTy = 047d6b4d765123563f81116bc665b7b8cc6207830d805fd84da7cb805a65baa7c12fd592d1b5b5e3e65d9672a9ef7662 +ZIUT = 1a6688ee1d6e59865d8e3ada37781d36bb0c2717eef92e61964d3927cb765c2965ea80f7f63e58c322ba0397faeaf62b + +COUNT = 7 +QCAVSx = f5f6bef1d110da03be0017eac760cc34b24d092f736f237bc7054b3865312a813bcb62d297fb10a4f7abf54708fe2d3d +QCAVSy = 06fdf8d7dc032f4e10010bf19cbf6159321252ff415fb91920d438f24e67e60c2eb0463204679fa356af44cea9c9ebf5 +dIUT = f0f7a96e70d98fd5a30ad6406cf56eb5b72a510e9f192f50e1f84524dbf3d2439f7287bb36f5aa912a79deaab4adea82 +QIUTx = 99c8c41cb1ab5e0854a346e4b08a537c1706a61553387c8d94943ab15196d40dbaa55b8210a77a5d00915f2c4ea69eab +QIUTy = 5531065bdcf17bfb3cb55a02e41a57c7f694c383ad289f900fbd656c2233a93c92e933e7a26f54cbb56f0ad875c51bb0 +ZIUT = d06a568bf2336b90cbac325161be7695eacb2295f599500d787f072612aca313ee5d874f807ddef6c1f023fe2b6e7cd0 + +COUNT = 8 +QCAVSx = 7cdec77e0737ea37c67b89b7137fe38818010f4464438ee4d1d35a0c488cad3fde2f37d00885d36d3b795b9f93d23a67 +QCAVSy = 28c42ee8d6027c56cf979ba4c229fdb01d234944f8ac433650112c3cf0f02844e888a3569dfef7828a8a884589aa055e +dIUT = 9efb87ddc61d43c482ba66e1b143aef678fbd0d1bebc2000941fabe677fe5b706bf78fce36d100b17cc787ead74bbca2 +QIUTx = 4c34efee8f0c95565d2065d1bbac2a2dd25ae964320eb6bccedc5f3a9b42a881a1afca1bb6b880584fa27b01c193cd92 +QIUTy = d8fb01dbf7cd0a3868c26b951f393c3c56c2858cee901f7793ff5d271925d13a41f8e52409f4eba1990f33acb0bac669 +ZIUT = bb3b1eda9c6560d82ff5bee403339f1e80342338a991344853b56b24f109a4d94b92f654f0425edd4c205903d7586104 + +COUNT = 9 +QCAVSx = 8eeea3a319c8df99fbc29cb55f243a720d95509515ee5cc587a5c5ae22fbbd009e626db3e911def0b99a4f7ae304b1ba +QCAVSy = 73877dc94db9adddc0d9a4b24e8976c22d73c844370e1ee857f8d1b129a3bd5f63f40caf3bd0533e38a5f5777074ff9e +dIUT = d787a57fde22ec656a0a525cf3c738b30d73af61e743ea90893ecb2d7b622add2f94ee25c2171467afb093f3f84d0018 +QIUTx = 171546923b87b2cbbad664f01ce932bf09d6a6118168678446bfa9f0938608cb4667a98f4ec8ac1462285c2508f74862 +QIUTy = fa41cb4db68ae71f1f8a3e8939dc52c2dec61a83c983beb2a02baf29ec49278088882ed0cf56c74b5c173b552ccf63cf +ZIUT = 1e97b60add7cb35c7403dd884c0a75795b7683fff8b49f9d8672a8206bfdcf0a106b8768f983258c74167422e44e4d14 + +COUNT = 10 +QCAVSx = a721f6a2d4527411834b13d4d3a33c29beb83ab7682465c6cbaf6624aca6ea58c30eb0f29dd842886695400d7254f20f +QCAVSy = 14ba6e26355109ad35129366d5e3a640ae798505a7fa55a96a36b5dad33de00474f6670f522214dd7952140ab0a7eb68 +dIUT = 83d70f7b164d9f4c227c767046b20eb34dfc778f5387e32e834b1e6daec20edb8ca5bb4192093f543b68e6aeb7ce788b +QIUTx = 57cd770f3bbcbe0c78c770eab0b169bc45e139f86378ffae1c2b16966727c2f2eb724572b8f3eb228d130db4ff862c63 +QIUTy = 7ec5c8813b685558d83e924f14bc719f6eb7ae0cbb2c474227c5bda88637a4f26c64817929af999592da6f787490332f +ZIUT = 1023478840e54775bfc69293a3cf97f5bc914726455c66538eb5623e218feef7df4befa23e09d77145ad577db32b41f9 + +COUNT = 11 +QCAVSx = d882a8505c2d5cb9b8851fc676677bb0087681ad53faceba1738286b45827561e7da37b880276c656cfc38b32ade847e +QCAVSy = 34b314bdc134575654573cffaf40445da2e6aaf987f7e913cd4c3091523058984a25d8f21da8326192456c6a0fa5f60c +dIUT = 8f558e05818b88ed383d5fca962e53413db1a0e4637eda194f761944cbea114ab9d5da175a7d57882550b0e432f395a9 +QIUTx = 9a2f57f4867ce753d72b0d95195df6f96c1fae934f602efd7b6a54582f556cfa539d89005ca2edac08ad9b72dd1f60ba +QIUTy = d9b94ee82da9cc601f346044998ba387aee56404dc6ecc8ab2b590443319d0b2b6176f9d0eac2d44678ed561607d09a9 +ZIUT = 6ad6b9dc8a6cf0d3691c501cbb967867f6e4bbb764b60dbff8fcff3ed42dbba39d63cf325b4b4078858495ddee75f954 + +COUNT = 12 +QCAVSx = 815c9d773dbf5fb6a1b86799966247f4006a23c92e68c55e9eaa998b17d8832dd4d84d927d831d4f68dac67c6488219f +QCAVSy = e79269948b2611484560fd490feec887cb55ef99a4b524880fa7499d6a07283aae2afa33feab97deca40bc606c4d8764 +dIUT = 0f5dee0affa7bbf239d5dff32987ebb7cf84fcceed643e1d3c62d0b3352aec23b6e5ac7fa4105c8cb26126ad2d1892cb +QIUTx = 23346bdfbc9d7c7c736e02bdf607671ff6082fdd27334a8bc75f3b23681ebe614d0597dd614fae58677c835a9f0b273b +QIUTy = 82ba36290d2f94db41479eb45ab4eaf67928a2315138d59eecc9b5285dfddd6714f77557216ea44cc6fc119d8243efaf +ZIUT = cc9e063566d46b357b3fcae21827377331e5e290a36e60cd7c39102b828ae0b918dc5a02216b07fe6f1958d834e42437 + +COUNT = 13 +QCAVSx = 1c0eeda7a2be000c5bdcda0478aed4db733d2a9e341224379123ad847030f29e3b168fa18e89a3c0fba2a6ce1c28fc3b +QCAVSy = ec8c1c83c118c4dbea94271869f2d868eb65e8b44e21e6f14b0f4d9b38c068daefa27114255b9a41d084cc4a1ad85456 +dIUT = 037b633b5b8ba857c0fc85656868232e2febf59578718391b81da8541a00bfe53c30ae04151847f27499f8d7abad8cf4 +QIUTx = 8878ac8a947f7d5cb2b47aad24fbb8210d86126585399a2871f84aa9c5fde3074ae540c6bf82275ca822d0feb862bc74 +QIUTy = 632f5cd2f900c2711c32f8930728eb647d31edd8d650f9654e7d33e5ed1b475489d08daa30d8cbcba6bfc3b60d9b5a37 +ZIUT = deff7f03bd09865baf945e73edff6d5122c03fb561db87dec8662e09bed4340b28a9efe118337bb7d3d4f7f568635ff9 + +COUNT = 14 +QCAVSx = c95c185e256bf997f30b311548ae7f768a38dee43eeeef43083f3077be70e2bf39ac1d4daf360c514c8c6be623443d1a +QCAVSy = 3e63a663eaf75d8a765ab2b9a35513d7933fa5e26420a5244550ec6c3b6f033b96db2aca3d6ac6aab052ce929595aea5 +dIUT = e3d07106bedcc096e7d91630ffd3094df2c7859db8d7edbb2e37b4ac47f429a637d06a67d2fba33838764ef203464991 +QIUTx = e74a1a2b85f1cbf8dbbdf050cf1aff8acb02fda2fb6591f9d3cfe4e79d0ae938a9c1483e7b75f8db24505d65065cdb18 +QIUTy = 1773ee591822f7abaa856a1a60bc0a5203548dbd1cb5025466eff8481bd07614eaa04a16c3db76905913e972a5b6b59d +ZIUT = c8b1038f735ad3bb3e4637c3e47eab487637911a6b7950a4e461948329d3923b969e5db663675623611a457fcda35a71 + +COUNT = 15 +QCAVSx = 3497238a7e6ad166df2dac039aa4dac8d17aa925e7c7631eb3b56e3aaa1c545fcd54d2e5985807910fb202b1fc191d2a +QCAVSy = a49e5c487dcc7aa40a8f234c979446040d9174e3ad357d404d7765183195aed3f913641b90c81a306ebf0d8913861316 +dIUT = f3f9b0c65a49a506632c8a45b10f66b5316f9eeb06fae218f2da62333f99905117b141c760e8974efc4af10570635791 +QIUTx = a4ad77aa7d86e5361118a6b921710c820721210712f4c347985fdee58aa4effa1e28be80a17b120b139f96300f89b49b +QIUTy = 1ddf22e07e03f1560d8f45a480094560dba9fae7f9531130c1b57ebb95982496524f31d3797793396fa823f22bdb4328 +ZIUT = d337eaa32b9f716b8747b005b97a553c59dab0c51df41a2d49039cdae705aa75c7b9e7bc0b6a0e8c578c902bc4fff23e + +COUNT = 16 +QCAVSx = 90a34737d45b1aa65f74e0bd0659bc118f8e4b774b761944ffa6573c6df4f41dec0d11b697abd934d390871d4b453240 +QCAVSy = 9b590719bb3307c149a7817be355d684893a307764b512eeffe07cb699edb5a6ffbf8d6032e6c79d5e93e94212c2aa4e +dIUT = 59fce7fad7de28bac0230690c95710c720e528f9a4e54d3a6a8cd5fc5c5f21637031ce1c5b4e3d39647d8dcb9b794664 +QIUTx = 9c43bf971edf09402876ee742095381f78b1bd3aa39b5132af75dbfe7e98bd78bde10fe2e903c2b6379e1deee175a1b0 +QIUTy = a6c58ecea5a477bb01bd543b339f1cc49f1371a2cda4d46eb4e53e250597942351a99665a122ffea9bde0636c375daf2 +ZIUT = 32d292b695a4488e42a7b7922e1ae537d76a3d21a0b2e36875f60e9f6d3e8779c2afb3a413b9dd79ae18e70b47d337c1 + +COUNT = 17 +QCAVSx = dda546acfc8f903d11e2e3920669636d44b2068aeb66ff07aa266f0030e1535b0ed0203cb8a460ac990f1394faf22f1d +QCAVSy = 15bbb2597913035faadf413476f4c70f7279769a40c986f470c427b4ee4962abdf8173bbad81874772925fd32f0b159f +dIUT = 3e49fbf950a424c5d80228dc4bc35e9f6c6c0c1d04440998da0a609a877575dbe437d6a5cedaa2ddd2a1a17fd112aded +QIUTx = 5a949594228b1a3d6f599eb3db0d06070fbc551c657b58234ba164ce3fe415fa5f3eb823c08dc29b8c341219c77b6b3d +QIUTy = 2baad447c8c290cfed25edd9031c41d0b76921457327f42db31122b81f337bbf0b1039ec830ce9061a3761953c75e4a8 +ZIUT = 1220e7e6cad7b25df98e5bbdcc6c0b65ca6c2a50c5ff6c41dca71e475646fd489615979ca92fb4389aeadefde79a24f1 + +COUNT = 18 +QCAVSx = 788be2336c52f4454d63ee944b1e49bfb619a08371048e6da92e584eae70bde1f171c4df378bd1f3c0ab03048a237802 +QCAVSy = 4673ebd8db604eaf41711748bab2968a23ca4476ce144e728247f08af752929157b5830f1e26067466bdfa8b65145a33 +dIUT = 50ccc1f7076e92f4638e85f2db98e0b483e6e2204c92bdd440a6deea04e37a07c6e72791c190ad4e4e86e01efba84269 +QIUTx = 756c07df0ce32c839dac9fb4733c9c28b70113a676a7057c38d223f22a3a9095a8d564653af528e04c7e1824be4a6512 +QIUTy = 17c2ce6962cbd2a2e066297b39d57dd9bb4680f0191d390f70b4e461419b2972ce68ad46127fdda6c39195774ea86df3 +ZIUT = 793bb9cd22a93cf468faf804a38d12b78cb12189ec679ddd2e9aa21fa9a5a0b049ab16a23574fe04c1c3c02343b91beb + +COUNT = 19 +QCAVSx = d09bb822eb99e38060954747c82bb3278cf96bbf36fece3400f4c873838a40c135eb3babb9293bd1001bf3ecdee7bf26 +QCAVSy = d416db6e1b87bbb7427788a3b6c7a7ab2c165b1e366f9608df512037584f213a648d47f16ac326e19aae972f63fd76c9 +dIUT = 06f132b71f74d87bf99857e1e4350a594e5fe35533b888552ceccbc0d8923c902e36141d7691e28631b8bc9bafe5e064 +QIUTx = 2a3cc6b8ff5cde926e7e3a189a1bd029c9b586351af8838f4f201cb8f4b70ef3b0da06d352c80fc26baf8f42b784459e +QIUTy = bf9985960176da6d23c7452a2954ffcbbcb24249b43019a2a023e0b3dabd461f19ad3e775c364f3f11ad49f3099400d3 +ZIUT = 012d191cf7404a523678c6fc075de8285b243720a903047708bb33e501e0dbee5bcc40d7c3ef6c6da39ea24d830da1e8 + +COUNT = 20 +QCAVSx = 13741262ede5861dad71063dfd204b91ea1d3b7c631df68eb949969527d79a1dc59295ef7d2bca6743e8cd77b04d1b58 +QCAVSy = 0baaeadc7e19d74a8a04451a135f1be1b02fe299f9dc00bfdf201e83d995c6950bcc1cb89d6f7b30bf54656b9a4da586 +dIUT = 12048ebb4331ec19a1e23f1a2c773b664ccfe90a28bfb846fc12f81dff44b7443c77647164bf1e9e67fd2c07a6766241 +QIUTx = bc18836bc7a9fdf54b5352f37d7528ab8fa8ec544a8c6180511cbfdd49cce377c39e34c031b5240dc9980503ed2f262c +QIUTy = 8086cbe338191080f0b7a16c7afc4c7b0326f9ac66f58552ef4bb9d24de3429ed5d3277ed58fcf48f2b5f61326bec6c6 +ZIUT = ad0fd3ddffe8884b9263f3c15fe1f07f2a5a22ffdc7e967085eea45f0cd959f20f18f522763e28bcc925e496a52dda98 + +COUNT = 21 +QCAVSx = 9e22cbc18657f516a864b37b783348b66f1aa9626cd631f4fa1bd32ad88cf11db52057c660860d39d11fbf024fabd444 +QCAVSy = 6b0d53c79681c28116df71e9cee74fd56c8b7f04b39f1198cc72284e98be9562e35926fb4f48a9fbecafe729309e8b6f +dIUT = 34d61a699ca576169fcdc0cc7e44e4e1221db0fe63d16850c8104029f7d48449714b9884328cae189978754ab460b486 +QIUTx = 867f81104ccd6b163a7902b670ef406042cb0cce7dcdc63d1dfc91b2c40e3cdf7595834bf9eceb79849f1636fc8462fc +QIUTy = 9d4bde8e875ec49697d258d1d59465f8431c6f5531e1c59e9f9ebe3cf164a8d9ce10a12f1979283a959bad244dd83863 +ZIUT = dc4ca392dc15e20185f2c6a8ea5ec31dfc96f56153a47394b3072b13d0015f5d4ae13beb3bed54d65848f9b8383e6c95 + +COUNT = 22 +QCAVSx = 2db5da5f940eaa884f4db5ec2139b0469f38e4e6fbbcc52df15c0f7cf7fcb1808c749764b6be85d2fdc5b16f58ad5dc0 +QCAVSy = 22e8b02dcf33e1b5a083849545f84ad5e43f77cb71546dbbac0d11bdb2ee202e9d3872e8d028c08990746c5e1dde9989 +dIUT = dc60fa8736d702135ff16aab992bb88eac397f5972456c72ec447374d0d8ce61153831bfc86ad5a6eb5b60bfb96a862c +QIUTx = b69beede85d0f829fec1b893ccb9c3e052ff692e13b974537bc5b0f9feaf7b22e84f03231629b24866bdb4b8cf908914 +QIUTy = 66f85e2bfcaba2843285b0e14ebc07ef7dafff8b424416fee647b59897b619f20eed95a632e6a4206bf7da429c04c560 +ZIUT = d765b208112d2b9ed5ad10c4046e2e3b0dbf57c469329519e239ac28b25c7d852bf757d5de0ee271cadd021d86cfd347 + +COUNT = 23 +QCAVSx = 329647baa354224eb4414829c5368c82d7893b39804e08cbb2180f459befc4b347a389a70c91a23bd9d30c83be5295d3 +QCAVSy = cc8f61923fad2aa8e505d6cfa126b9fabd5af9dce290b75660ef06d1caa73681d06089c33bc4246b3aa30dbcd2435b12 +dIUT = 6fa6a1c704730987aa634b0516a826aba8c6d6411d3a4c89772d7a62610256a2e2f289f5c3440b0ec1e70fa339e251ce +QIUTx = 53de1fc1328e8de14aecab29ad8a40d6b13768f86f7d298433d20fec791f86f8bc73f358098b256a298bb488de257bf4 +QIUTy = ac28944fd27f17b82946c04c66c41f0053d3692f275da55cd8739a95bd8cd3af2f96e4de959ea8344d8945375905858b +ZIUT = d3778850aeb58804fbe9dfe6f38b9fa8e20c2ca4e0dec335aafceca0333e3f2490b53c0c1a14a831ba37c4b9d74be0f2 + +COUNT = 24 +QCAVSx = 29d8a36d22200a75b7aea1bb47cdfcb1b7fd66de967041434728ab5d533a060df732130600fe6f75852a871fb2938e39 +QCAVSy = e19b53db528395de897a45108967715eb8cb55c3fcbf23379372c0873a058d57544b102ecce722b2ccabb1a603774fd5 +dIUT = 74ad8386c1cb2ca0fcdeb31e0869bb3f48c036afe2ef110ca302bc8b910f621c9fcc54cec32bb89ec7caa84c7b8e54a8 +QIUTx = 27a3e83cfb9d5122e73129d801615857da7cc089cccc9c54ab3032a19e0a0a9f677346e37f08a0b3ed8da6e5dd691063 +QIUTy = 8d60e44aa5e0fd30c918456796af37f0e41957901645e5c596c6d989f5859b03a0bd7d1f4e77936fff3c74d204e5388e +ZIUT = 81e1e71575bb4505498de097350186430a6242fa6c57b85a5f984a23371123d2d1424eefbf804258392bc723e4ef1e35 + + +[P-521] + +COUNT = 0 +QCAVSx = 000000685a48e86c79f0f0875f7bc18d25eb5fc8c0b07e5da4f4370f3a9490340854334b1e1b87fa395464c60626124a4e70d0f785601d37c09870ebf176666877a2046d +QCAVSy = 000001ba52c56fc8776d9e8f5db4f0cc27636d0b741bbe05400697942e80b739884a83bde99e0f6716939e632bc8986fa18dccd443a348b6c3e522497955a4f3c302f676 +dIUT = 0000017eecc07ab4b329068fba65e56a1f8890aa935e57134ae0ffcce802735151f4eac6564f6ee9974c5e6887a1fefee5743ae2241bfeb95d5ce31ddcb6f9edb4d6fc47 +QIUTx = 000000602f9d0cf9e526b29e22381c203c48a886c2b0673033366314f1ffbcba240ba42f4ef38a76174635f91e6b4ed34275eb01c8467d05ca80315bf1a7bbd945f550a5 +QIUTy = 000001b7c85f26f5d4b2d7355cf6b02117659943762b6d1db5ab4f1dbc44ce7b2946eb6c7de342962893fd387d1b73d7a8672d1f236961170b7eb3579953ee5cdc88cd2d +ZIUT = 005fc70477c3e63bc3954bd0df3ea0d1f41ee21746ed95fc5e1fdf90930d5e136672d72cc770742d1711c3c3a4c334a0ad9759436a4d3c5bf6e74b9578fac148c831 + +COUNT = 1 +QCAVSx = 000001df277c152108349bc34d539ee0cf06b24f5d3500677b4445453ccc21409453aafb8a72a0be9ebe54d12270aa51b3ab7f316aa5e74a951c5e53f74cd95fc29aee7a +QCAVSy = 0000013d52f33a9f3c14384d1587fa8abe7aed74bc33749ad9c570b471776422c7d4505d9b0a96b3bfac041e4c6a6990ae7f700e5b4a6640229112deafa0cd8bb0d089b0 +dIUT = 000000816f19c1fb10ef94d4a1d81c156ec3d1de08b66761f03f06ee4bb9dcebbbfe1eaa1ed49a6a990838d8ed318c14d74cc872f95d05d07ad50f621ceb620cd905cfb8 +QIUTx = 000000d45615ed5d37fde699610a62cd43ba76bedd8f85ed31005fe00d6450fbbd101291abd96d4945a8b57bc73b3fe9f4671105309ec9b6879d0551d930dac8ba45d255 +QIUTy = 000001425332844e592b440c0027972ad1526431c06732df19cd46a242172d4dd67c2c8c99dfc22e49949a56cf90c6473635ce82f25b33682fb19bc33bd910ed8ce3a7fa +ZIUT = 000b3920ac830ade812c8f96805da2236e002acbbf13596a9ab254d44d0e91b6255ebf1229f366fb5a05c5884ef46032c26d42189273ca4efa4c3db6bd12a6853759 + +COUNT = 2 +QCAVSx = 00000092db3142564d27a5f0006f819908fba1b85038a5bc2509906a497daac67fd7aee0fc2daba4e4334eeaef0e0019204b471cd88024f82115d8149cc0cf4f7ce1a4d5 +QCAVSy = 0000016bad0623f517b158d9881841d2571efbad63f85cbe2e581960c5d670601a6760272675a548996217e4ab2b8ebce31d71fca63fcc3c08e91c1d8edd91cf6fe845f8 +dIUT = 0000012f2e0c6d9e9d117ceb9723bced02eb3d4eebf5feeaf8ee0113ccd8057b13ddd416e0b74280c2d0ba8ed291c443bc1b141caf8afb3a71f97f57c225c03e1e4d42b0 +QIUTx = 000000717fcb3d4a40d103871ede044dc803db508aaa4ae74b70b9fb8d8dfd84bfecfad17871879698c292d2fd5e17b4f9343636c531a4fac68a35a93665546b9a878679 +QIUTy = 000000f3d96a8637036993ab5d244500fff9d2772112826f6436603d3eb234a44d5c4e5c577234679c4f9df725ee5b9118f23d8a58d0cc01096daf70e8dfec0128bdc2e8 +ZIUT = 006b380a6e95679277cfee4e8353bf96ef2a1ebdd060749f2f046fe571053740bbcc9a0b55790bc9ab56c3208aa05ddf746a10a3ad694daae00d980d944aabc6a08f + +COUNT = 3 +QCAVSx = 000000fdd40d9e9d974027cb3bae682162eac1328ad61bc4353c45bf5afe76bf607d2894c8cce23695d920f2464fda4773d4693be4b3773584691bdb0329b7f4c86cc299 +QCAVSy = 00000034ceac6a3fef1c3e1c494bfe8d872b183832219a7e14da414d4e3474573671ec19b033be831b915435905925b44947c592959945b4eb7c951c3b9c8cf52530ba23 +dIUT = 000000e548a79d8b05f923b9825d11b656f222e8cb98b0f89de1d317184dc5a698f7c71161ee7dc11cd31f4f4f8ae3a981e1a3e78bdebb97d7c204b9261b4ef92e0918e0 +QIUTx = 0000000ce800217ed243dd10a79ad73df578aa8a3f9194af528cd1094bbfee27a3b5481ad5862c8876c0c3f91294c0ab3aa806d9020cbaa2ed72b7fecdc5a09a6dad6f32 +QIUTy = 000001543c9ab45b12469232918e21d5a351f9a4b9cbf9efb2afcc402fa9b31650bec2d641a05c440d35331c0893d11fb13151335988b303341301a73dc5f61d574e67d9 +ZIUT = 00fbbcd0b8d05331fef6086f22a6cce4d35724ab7a2f49dd8458d0bfd57a0b8b70f246c17c4468c076874b0dff7a0336823b19e98bf1cec05e4beffb0591f97713c6 + +COUNT = 4 +QCAVSx = 00000098d99dee0816550e84dbfced7e88137fddcf581a725a455021115fe49f8dc3cf233cd9ea0e6f039dc7919da973cdceaca205da39e0bd98c8062536c47f258f44b5 +QCAVSy = 000000cd225c8797371be0c4297d2b457740100c774141d8f214c23b61aa2b6cd4806b9b70722aa4965fb622f42b7391e27e5ec21c5679c5b06b59127372997d421adc1e +dIUT = 000001c8aae94bb10b8ca4f7be577b4fb32bb2381032c4942c24fc2d753e7cc5e47b483389d9f3b956d20ee9001b1eef9f23545f72c5602140046839e963313c3decc864 +QIUTx = 00000106a14e2ee8ff970aa8ab0c79b97a33bba2958e070b75b94736b77bbe3f777324fa52872771aa88a63a9e8490c3378df4dc760cd14d62be700779dd1a4377943656 +QIUTy = 0000002366ce3941e0b284b1aa81215d0d3b9778fce23c8cd1e4ed6fa0abf62156c91d4b3eb55999c3471bed275e9e60e5aa9d690d310bfb15c9c5bbd6f5e9eb39682b74 +ZIUT = 0145cfa38f25943516c96a5fd4bfebb2f645d10520117aa51971eff442808a23b4e23c187e639ff928c3725fbd1c0c2ad0d4aeb207bc1a6fb6cb6d467888dc044b3c + +COUNT = 5 +QCAVSx = 0000007ae115adaaf041691ab6b7fb8c921f99d8ed32d283d67084e80b9ad9c40c56cd98389fb0a849d9ecf7268c297b6f93406119f40e32b5773ed25a28a9a85c4a7588 +QCAVSy = 000001a28e004e37eeaefe1f4dbb71f1878696141af3a10a9691c4ed93487214643b761fa4b0fbeeb247cf6d3fba7a60697536ad03f49b80a9d1cb079673654977c5fa94 +dIUT = 0000009b0af137c9696c75b7e6df7b73156bb2d45f482e5a4217324f478b10ceb76af09724cf86afa316e7f89918d31d54824a5c33107a483c15c15b96edc661340b1c0e +QIUTx = 000000748cdbb875d35f4bccb62abe20e82d32e4c14dc2feb5b87da2d0ccb11c9b6d4b7737b6c46f0dfb4d896e2db92fcf53cdbbae2a404c0babd564ad7adeac6273efa3 +QIUTy = 000001984acab8d8f173323de0bb60274b228871609373bb22a17287e9dec7495873abc09a8915b54c8455c8e02f654f602e23a2bbd7a9ebb74f3009bd65ecc650814cc0 +ZIUT = 005c5721e96c273319fd60ecc46b5962f698e974b429f28fe6962f4ac656be2eb8674c4aafc037eab48ece612953b1e8d861016b6ad0c79805784c67f73ada96f351 + +COUNT = 6 +QCAVSx = 0000012588115e6f7f7bdcfdf57f03b169b479758baafdaf569d04135987b2ce6164c02a57685eb5276b5dae6295d3fe90620f38b5535c6d2260c173e61eb888ca920203 +QCAVSy = 000001542c169cf97c2596fe2ddd848a222e367c5f7e6267ebc1bcd9ab5dcf49158f1a48e4af29a897b7e6a82091c2db874d8e7abf0f58064691344154f396dbaed188b6 +dIUT = 000001e48faacee6dec83ffcde944cf6bdf4ce4bae72747888ebafee455b1e91584971efb49127976a52f4142952f7c207ec0265f2b718cf3ead96ea4f62c752e4f7acd3 +QIUTx = 0000010eb1b4d9172bcc23f4f20cc9560fc54928c3f34ea61c00391dc766c76ed9fa608449377d1e4fadd1236025417330b4b91086704ace3e4e6484c606e2a943478c86 +QIUTy = 00000149413864069825ee1d0828da9f4a97713005e9bd1adbc3b38c5b946900721a960fe96ad2c1b3a44fe3de9156136d44cb17cbc2415729bb782e16bfe2deb3069e43 +ZIUT = 01736d9717429b4f412e903febe2f9e0fffd81355d6ce2c06ff3f66a3be15ceec6e65e308347593f00d7f33591da4043c30763d72749f72cdceebe825e4b34ecd570 + +COUNT = 7 +QCAVSx = 00000169491d55bd09049fdf4c2a53a660480fee4c03a0538675d1cd09b5bba78dac48543ef118a1173b3fbf8b20e39ce0e6b890a163c50f9645b3d21d1cbb3b60a6fff4 +QCAVSy = 00000083494b2eba76910fed33c761804515011fab50e3b377abd8a8a045d886d2238d2c268ac1b6ec88bd71b7ba78e2c33c152e4bf7da5d565e4acbecf5e92c7ad662bb +dIUT = 000000c29aa223ea8d64b4a1eda27f39d3bc98ea0148dd98c1cbe595f8fd2bfbde119c9e017a50f5d1fc121c08c1cef31b758859556eb3e0e042d8dd6aaac57a05ca61e3 +QIUTx = 0000001511c848ef60d5419a98d10204db0fe58224124370061bcfa4e9249d50618c56bf3722471b259f38263bb7b280d23caf2a1ee8737f9371cdb2732cdc958369930c +QIUTy = 000001d461681ae6d8c49b4c5f4d6016143fb1bd7491573e3ed0e6c48b82e821644f87f82f0e5f08fd16f1f98fa17586200ab02ed8c627b35c3f27617ec5fd92f456203f +ZIUT = 018f2ae9476c771726a77780208dedfefa205488996b18fecc50bfd4c132753f5766b2cd744afa9918606de2e016effc63622e9029e76dc6e3f0c69f7aeced565c2c + +COUNT = 8 +QCAVSx = 0000008415f5bbd0eee387d6c09d0ef8acaf29c66db45d6ba101860ae45d3c60e1e0e3f7247a4626a60fdd404965c3566c79f6449e856ce0bf94619f97da8da24bd2cfb6 +QCAVSy = 000000fdd7c59c58c361bc50a7a5d0d36f723b17c4f2ad2b03c24d42dc50f74a8c465a0afc4683f10fab84652dfe9e928c2626b5456453e1573ff60be1507467d431fbb2 +dIUT = 00000028692be2bf5c4b48939846fb3d5bce74654bb2646e15f8389e23708a1afadf561511ea0d9957d0b53453819d60fba8f65a18f7b29df021b1bb01cd163293acc3cc +QIUTx = 000001cfdc10c799f5c79cb6930a65fba351748e07567993e5e410ef4cacc4cd8a25784991eb4674e41050f930c7190ac812b9245f48a7973b658daf408822fe5b85f668 +QIUTy = 00000180d9ddfc9af77b9c4a6f02a834db15e535e0b3845b2cce30388301b51cecbe3276307ef439b5c9e6a72dc2d94d879bc395052dbb4a5787d06efb280210fb8be037 +ZIUT = 0105a346988b92ed8c7a25ce4d79d21bc86cfcc7f99c6cd19dbb4a39f48ab943b79e4f0647348da0b80bd864b85c6b8d92536d6aa544dc7537a00c858f8b66319e25 + +COUNT = 9 +QCAVSx = 000001c721eea805a5cba29f34ba5758775be0cf6160e6c08723f5ab17bf96a1ff2bd9427961a4f34b07fc0b14ca4b2bf6845debd5a869f124ebfa7aa72fe565050b7f18 +QCAVSy = 000000b6e89eb0e1dcf181236f7c548fd1a8c16b258b52c1a9bfd3fe8f22841b26763265f074c4ccf2d634ae97b701956f67a11006c52d97197d92f585f5748bc2672eeb +dIUT = 000001194d1ee613f5366cbc44b504d21a0cf6715e209cd358f2dd5f3e71cc0d67d0e964168c42a084ebda746f9863a86bacffc819f1edf1b8c727ccfb3047240a57c435 +QIUTx = 0000016bd15c8a58d366f7f2b2f298cc87b7485e9ee70d11d12448b8377c0a82c7626f67aff7f97be7a3546bf417eeeddf75a93c130191c84108042ea2fca17fd3f80d14 +QIUTy = 000001560502d04b74fce1743aab477a9d1eac93e5226981fdb97a7478ce4ce566ff7243931284fad850b0c2bcae0ddd2d97790160c1a2e77c3ed6c95ecc44b89e2637fc +ZIUT = 004531b3d2c6cd12f21604c8610e6723dbf4daf80b5a459d6ba5814397d1c1f7a21d7c114be964e27376aaebe3a7bc3d6af7a7f8c7befb611afe487ff032921f750f + +COUNT = 10 +QCAVSx = 000001c35823e440a9363ab98d9fc7a7bc0c0532dc7977a79165599bf1a9cc64c00fb387b42cca365286e8430360bfad3643bc31354eda50dc936c329ecdb60905c40fcb +QCAVSy = 000000d9e7f433531e44df4f6d514201cbaabb06badd6783e01111726d815531d233c5cdb722893ffbb2027259d594de77438809738120c6f783934f926c3fb69b40c409 +dIUT = 000001fd90e3e416e98aa3f2b6afa7f3bf368e451ad9ca5bd54b5b14aee2ed6723dde5181f5085b68169b09fbec721372ccf6b284713f9a6356b8d560a8ff78ca3737c88 +QIUTx = 000001ebea1b10d3e3b971b7efb69fc878de11c7f472e4e4d384c31b8d6288d8071517acade9b39796c7af5163bcf71aeda777533f382c6cf0a4d9bbb938c85f44b78037 +QIUTy = 0000016b0e3e19c2996b2cbd1ff64730e7ca90edca1984f9b2951333535e5748baa34a99f61ff4d5f812079e0f01e87789f34efdad8098015ee74a4f846dd190d16dc6e1 +ZIUT = 0100c8935969077bae0ba89ef0df8161d975ec5870ac811ae7e65ca5394efba4f0633d41bf79ea5e5b9496bbd7aae000b0594baa82ef8f244e6984ae87ae1ed124b7 + +COUNT = 11 +QCAVSx = 000000093057fb862f2ad2e82e581baeb3324e7b32946f2ba845a9beeed87d6995f54918ec6619b9931955d5a89d4d74adf1046bb362192f2ef6bd3e3d2d04dd1f87054a +QCAVSy = 000000aa3fb2448335f694e3cda4ae0cc71b1b2f2a206fa802d7262f19983c44674fe15327acaac1fa40424c395a6556cb8167312527fae5865ecffc14bbdc17da78cdcf +dIUT = 0000009012ecfdadc85ced630afea534cdc8e9d1ab8be5f3753dcf5f2b09b40eda66fc6858549bc36e6f8df55998cfa9a0703aecf6c42799c245011064f530c09db98369 +QIUTx = 000000234e32be0a907131d2d128a6477e0caceb86f02479745e0fe245cb332de631c078871160482eeef584e274df7fa412cea3e1e91f71ecba8781d9205d48386341ad +QIUTy = 000001cf86455b09b1c005cffba8d76289a3759628c874beea462f51f30bd581e3803134307dedbb771b3334ee15be2e242cd79c3407d2f58935456c6941dd9b6d155a46 +ZIUT = 017f36af19303841d13a389d95ec0b801c7f9a679a823146c75c17bc44256e9ad422a4f8b31f14647b2c7d317b933f7c2946c4b8abd1d56d620fab1b5ff1a3adc71f + +COUNT = 12 +QCAVSx = 00000083192ed0b1cb31f75817794937f66ad91cf74552cd510cedb9fd641310422af5d09f221cad249ee814d16dd7ac84ded9eacdc28340fcfc9c0c06abe30a2fc28cd8 +QCAVSy = 0000002212ed868c9ba0fb2c91e2c39ba93996a3e4ebf45f2852d0928c48930e875cc7b428d0e7f3f4d503e5d60c68cb49b13c2480cd486bed9200caddaddfe4ff8e3562 +dIUT = 000001b5ff847f8eff20b88cfad42c06e58c3742f2f8f1fdfd64b539ba48c25926926bd5e332b45649c0b184f77255e9d58fe8afa1a6d968e2cb1d4637777120c765c128 +QIUTx = 000001de3dc9263bc8c4969dc684be0eec54befd9a9f3dba194d8658a789341bf0d78d84da6735227cafaf09351951691197573c8c360a11e5285712b8bbdf5ac91b977c +QIUTy = 000000812de58cd095ec2e5a9b247eb3ed41d8bef6aeace194a7a05b65aa5d289fbc9b1770ec84bb6be0c2c64cc37c1d54a7f5d71377a9adbe20f26f6f2b544a821ea831 +ZIUT = 00062f9fc29ae1a68b2ee0dcf956cbd38c88ae5f645eaa546b00ebe87a7260bf724be20d34b9d02076655c933d056b21e304c24ddb1dedf1dd76de611fc4a2340336 + +COUNT = 13 +QCAVSx = 000001a89b636a93e5d2ba6c2292bf23033a84f06a3ac1220ea71e806afbe097a804cc67e9baa514cfb6c12c9194be30212bf7aae7fdf6d376c212f0554e656463ffab7e +QCAVSy = 00000182efcaf70fc412d336602e014da47256a0b606f2addcce8053bf817ac8656bb4e42f14c8cbf2a68f488ab35dcdf64056271dee1f606a440ba4bd4e5a11b8b8e54f +dIUT = 0000011a6347d4e801c91923488354cc533e7e35fddf81ff0fb7f56bb0726e0c29ee5dcdc5f394ba54cf57269048aab6e055895c8da24b8b0639a742314390cc04190ed6 +QIUTx = 000000fe30267f33ba5cdefc25cbb3c9320dad9ccb1d7d376644620ca4fadee5626a3cede25ad254624def727a7048f7145f76162aa98042f9b123b2076f8e8cf59b3fdf +QIUTy = 0000001145dc6631953b6e2945e94301d6cbb098fe4b04f7ee9b09411df104dc82d7d79ec46a01ed0f2d3e7db6eb680694bdeb107c1078aec6cabd9ebee3d342fe7e54df +ZIUT = 0128ab09bfec5406799e610f772ba17e892249fa8e0e7b18a04b9197034b250b48294f1867fb9641518f92766066a07a8b917b0e76879e1011e51ccbd9f540c54d4f + +COUNT = 14 +QCAVSx = 0000017200b3f16a68cbaed2bf78ba8cddfb6cffac262bba00fbc25f9dc72a07ce59372904899f364c44cb264c097b647d4412bee3e519892d534d9129f8a28f7500fee7 +QCAVSy = 000000baba8d672a4f4a3b63de48b96f56e18df5d68f7d70d5109833f43770d6732e06b39ad60d93e5b43db8789f1ec0aba47286a39ea584235acea757dbf13d53b58364 +dIUT = 00000022b6d2a22d71dfaa811d2d9f9f31fbed27f2e1f3d239538ddf3e4cc8c39a330266db25b7bc0a9704f17bde7f3592bf5f1f2d4b56013aacc3d8d1bc02f00d3146cc +QIUTx = 000000ba38cfbf9fd2518a3f61d43549e7a6a6d28b2be57ffd3e0faceb636b34ed17e044a9f249dae8fc132e937e2d9349cd2ed77bb1049ceb692a2ec5b17ad61502a64c +QIUTy = 0000001ec91d3058573fa6c0564a02a1a010160c313bc7c73510dc983e5461682b5be00dbce7e2c682ad73f29ca822cdc111f68fabe33a7b384a648342c3cdb9f050bcdb +ZIUT = 0101e462e9d9159968f6440e956f11dcf2227ae4aea81667122b6af9239a291eb5d6cf5a4087f358525fcacfa46bb2db01a75af1ba519b2d31da33eda87a9d565748 + +COUNT = 15 +QCAVSx = 0000004efd5dbd2f979e3831ce98f82355d6ca14a5757842875882990ab85ab9b7352dd6b9b2f4ea9a1e95c3880d65d1f3602f9ca653dc346fac858658d75626f4d4fb08 +QCAVSy = 00000061cf15dbdaa7f31589c98400373da284506d70c89f074ed262a9e28140796b7236c2eef99016085e71552ff488c72b7339fefb7915c38459cb20ab85aec4e45052 +dIUT = 0000005bacfff268acf6553c3c583b464ea36a1d35e2b257a5d49eb3419d5a095087c2fb4d15cf5bf5af816d0f3ff7586490ccd3ddc1a98b39ce63749c6288ce0dbdac7d +QIUTx = 00000036e488da7581472a9d8e628c58d6ad727311b7e6a3f6ae33a8544f34b09280249020be7196916fafd90e2ec54b66b5468d2361b99b56fa00d7ac37abb8c6f16653 +QIUTy = 0000011edb9fb8adb6a43f4f5f5fdc1421c9fe04fc8ba46c9b66334e3af927c8befb4307104f299acec4e30f812d9345c9720d19869dbfffd4ca3e7d2713eb5fc3f42615 +ZIUT = 0141d6a4b719ab67eaf04a92c0a41e2dda78f4354fb90bdc35202cc7699b9b04d49616f82255debf7bbec045ae58f982a66905fcfae69d689785e38c868eb4a27e7b + +COUNT = 16 +QCAVSx = 00000129891de0cf3cf82e8c2cf1bf90bb296fe00ab08ca45bb7892e0e227a504fdd05d2381a4448b68adff9c4153c87eacb78330d8bd52515f9f9a0b58e85f446bb4e10 +QCAVSy = 0000009edd679696d3d1d0ef327f200383253f6413683d9e4fcc87bb35f112c2f110098d15e5701d7ceee416291ff5fed85e687f727388b9afe26a4f6feed560b218e6bb +dIUT = 0000008e2c93c5423876223a637cad367c8589da69a2d0fc68612f31923ae50219df2452e7cc92615b67f17b57ffd2f52b19154bb40d7715336420fde2e89fee244f59dc +QIUTx = 000000fa3b35118d6c422570f724a26f90b2833b19239174cea081c53133f64db60d6940ea1261299c04c1f4587cdb0c4c39616479c1bb0c146799a118032dcf98f899c0 +QIUTy = 00000069f040229006151fa32b51f679c8816f7c17506b403809dc77cd58a2aec430d94d13b6c916de99f355aa45fcfbc6853d686c71be496a067d24bfaea4818fc51f75 +ZIUT = 00345e26e0abb1aac12b75f3a9cf41efe1c336396dffa4a067a4c2cfeb878c68b2b045faa4e5b4e6fa4678f5b603c351903b14bf9a6a70c439257199a640890b61d1 + +COUNT = 17 +QCAVSx = 000001a3c20240e59f5b7a3e17c275d2314ba1741210ad58b71036f8c83cc1f6b0f409dfdd9113e94b67ec39c3291426c23ffcc447054670d2908ff8fe67dc2306034c5c +QCAVSy = 000001d2825bfd3af8b1e13205780c137fe938f84fde40188e61ea02cead81badfdb425c29f7d7fb0324debadc10bbb93de68f62c35069268283f5265865db57a79f7bf7 +dIUT = 00000004d49d39d40d8111bf16d28c5936554326b197353eebbcf47545393bc8d3aaf98f14f5be7074bfb38e6cc97b989754074daddb3045f4e4ce745669fdb3ec0d5fa8 +QIUTx = 0000012ec226d050ce07c79b3df4d0f0891f9f7adf462e8c98dbc1a2a14f5e53a3f5ad894433587cc429a8be9ea1d84fa33b1803690dae04da7218d30026157fc995cf52 +QIUTy = 0000004837dfbf3426f57b5c793269130abb9a38f618532211931154db4eeb9aede88e57290f842ea0f2ea9a5f74c6203a3920fe4e305f6118f676b154e1d75b9cb5eb88 +ZIUT = 006fe9de6fb8e672e7fd150fdc5e617fabb0d43906354ccfd224757c7276f7a1010091b17ed072074f8d10a5ec971eb35a5cb7076603b7bc38d432cbc059f80f9488 + +COUNT = 18 +QCAVSx = 0000007e2d138f2832e345ae8ff65957e40e5ec7163f016bdf6d24a2243daa631d878a4a16783990c722382130f9e51f0c1bd6ff5ac96780e48b68f5dec95f42e6144bb5 +QCAVSy = 000000b0de5c896791f52886b0f09913e26e78dd0b69798fc4df6d95e3ca708ecbcbcce1c1895f5561bbabaae372e9e67e6e1a3be60e19b470cdf673ec1fc393d3426e20 +dIUT = 0000011a5d1cc79cd2bf73ea106f0e60a5ace220813b53e27b739864334a07c03367efda7a4619fa6eef3a9746492283b3c445610a023a9cc49bf4591140384fca5c8bb5 +QIUTx = 000000eb07c7332eedb7d3036059d35f7d2288d4377d5f42337ad3964079fb120ccd4c8bd384b585621055217023acd9a94fcb3b965bfb394675e788ade41a1de73e620c +QIUTy = 000000491a835de2e6e7deb7e090f4a11f2c460c0b1f3d5e94ee8d751014dc720784fd3b54500c86ebaef18429f09e8e876d5d1538968a030d7715dde99f0d8f06e29d59 +ZIUT = 01e4e759ecedce1013baf73e6fcc0b92451d03bdd50489b78871c333114990c9ba6a9b2fc7b1a2d9a1794c1b60d9279af6f146f0bbfb0683140403bfa4ccdb524a29 + +COUNT = 19 +QCAVSx = 000000118c36022209b1af8ebad1a12b566fc48744576e1199fe80de1cdf851cdf03e5b9091a8f7e079e83b7f827259b691d0c22ee29d6bdf73ec7bbfd746f2cd97a357d +QCAVSy = 000000da5ff4904548a342e2e7ba6a1f4ee5f840411a96cf63e6fe622f22c13e614e0a847c11a1ab3f1d12cc850c32e095614ca8f7e2721477b486e9ff40372977c3f65c +dIUT = 0000010c908caf1be74c616b625fc8c1f514446a6aec83b5937141d6afbb0a8c7666a7746fa1f7a6664a2123e8cdf6cd8bf836c56d3c0ebdcc980e43a186f938f3a78ae7 +QIUTx = 00000031890f4c7abec3f723362285d77d2636f876817db3bbc88b01e773597b969ff6f013ea470c854ab4a7739004eb8cbea69b82ddf36acadd406871798ecb2ac3aa7f +QIUTy = 000000d8b429ae3250266b9643c0c765a60dc10155bc2531cf8627296f4978b6640a9e600e19d0037d58503fa80799546a814d7478a550aa90e5ebeb052527faaeae5d08 +ZIUT = 0163c9191d651039a5fe985a0eea1eba018a40ab1937fcd2b61220820ee8f2302e9799f6edfc3f5174f369d672d377ea8954a8d0c8b851e81a56fda95212a6578f0e + +COUNT = 20 +QCAVSx = 000001780edff1ca1c03cfbe593edc6c049bcb2860294a92c355489d9afb2e702075ade1c953895a456230a0cde905de4a3f38573dbfcccd67ad6e7e93f0b5581e926a5d +QCAVSy = 000000a5481962c9162962e7f0ebdec936935d0eaa813e8226d40d7f6119bfd940602380c86721e61db1830f51e139f210000bcec0d8edd39e54d73a9a129f95cd5fa979 +dIUT = 000001b37d6b7288de671360425d3e5ac1ccb21815079d8d73431e9b74a6f0e7ae004a357575b11ad66642ce8b775593eba9d98bf25c75ef0b4d3a2098bbc641f59a2b77 +QIUTx = 000000189a5ee34de7e35aefeaeef9220c18071b4c29a4c3bd9d954458bd3e82a7a34da34cff5579b8101c065b1f2f527cf4581501e28ef5671873e65267733d003520af +QIUTy = 000001eb4bc50a7b4d4599d7e3fa773ddb9eb252c9b3422872e544bdf75c7bf60f5166ddc11eb08fa7c30822dabaee373ab468eb2d922e484e2a527fff2ebb804b7d9a37 +ZIUT = 015d613e267a36342e0d125cdad643d80d97ed0600afb9e6b9545c9e64a98cc6da7c5aaa3a8da0bdd9dd3b97e9788218a80abafc106ef065c8f1c4e1119ef58d298b + +COUNT = 21 +QCAVSx = 0000016dacffa183e5303083a334f765de724ec5ec9402026d4797884a9828a0d321a8cfac74ab737fe20a7d6befcfc73b6a35c1c7b01d373e31abc192d48a4241a35803 +QCAVSy = 0000011e5327cac22d305e7156e559176e19bee7e4f2f59e86f1a9d0b6603b6a7df1069bde6387feb71587b8ffce5b266e1bae86de29378a34e5c74b6724c4d40a719923 +dIUT = 000000f2661ac762f60c5fff23be5d969ccd4ec6f98e4e72618d12bdcdb9b4102162333788c0bae59f91cdfc172c7a1681ee44d96ab2135a6e5f3415ebbcd55165b1afb0 +QIUTx = 000000a8e25a6902d687b4787cdc94c364ac7cecc5c495483ed363dc0aa95ee2bd739c4c4d46b17006c728b076350d7d7e54c6822f52f47162a25109aaaba690cab696ec +QIUTy = 00000168d2f08fe19e4dc9ee7a195b03c9f7fe6676f9f520b6270557504e72ca4394a2c6918625e15ac0c51b8f95cd560123653fb8e8ee6db961e2c4c62cc54e92e2a2a9 +ZIUT = 014d6082a3b5ced1ab8ca265a8106f302146c4acb8c30bb14a4c991e3c82a9731288bdb91e0e85bda313912d06384fc44f2153fb13506fa9cf43c9aab5750988c943 + +COUNT = 22 +QCAVSx = 000000a091421d3703e3b341e9f1e7d58f8cf7bdbd1798d001967b801d1cec27e605c580b2387c1cb464f55ce7ac80334102ab03cfb86d88af76c9f4129c01bedd3bbfc4 +QCAVSy = 0000008c9c577a8e6fc446815e9d40baa66025f15dae285f19eb668ee60ae9c98e7ecdbf2b2a68e22928059f67db188007161d3ecf397e0883f0c4eb7eaf7827a62205cc +dIUT = 000000f430ca1261f09681a9282e9e970a9234227b1d5e58d558c3cc6eff44d1bdf53de16ad5ee2b18b92d62fc79586116b0efc15f79340fb7eaf5ce6c44341dcf8dde27 +QIUTx = 0000006c1d9b5eca87de1fb871a0a32f807c725adccde9b3967453a71347d608f0c030cd09e338cdecbf4a02015bc8a6e8d3e2595fe773ffc2fc4e4a55d0b1a2cc00323b +QIUTy = 000001141b2109e7f4981c952aa818a2b9f6f5c41feccdb7a7a45b9b4b672937771b008cae5f934dfe3fed10d383ab1f38769c92ce88d9be5414817ecb073a31ab368ccb +ZIUT = 0020c00747cb8d492fd497e0fec54644bf027d418ab686381f109712a99cabe328b9743d2225836f9ad66e5d7fed1de247e0da92f60d5b31f9e47672e57f710598f4 + +COUNT = 23 +QCAVSx = 0000004f38816681771289ce0cb83a5e29a1ab06fc91f786994b23708ff08a08a0f675b809ae99e9f9967eb1a49f196057d69e50d6dedb4dd2d9a81c02bdcc8f7f518460 +QCAVSy = 0000009efb244c8b91087de1eed766500f0e81530752d469256ef79f6b965d8a2232a0c2dbc4e8e1d09214bab38485be6e357c4200d073b52f04e4a16fc6f5247187aecb +dIUT = 0000005dc33aeda03c2eb233014ee468dff753b72f73b00991043ea353828ae69d4cd0fadeda7bb278b535d7c57406ff2e6e473a5a4ff98e90f90d6dadd25100e8d85666 +QIUTx = 000000c825ba307373cec8dd2498eef82e21fd9862168dbfeb83593980ca9f82875333899fe94f137daf1c4189eb502937c3a367ea7951ed8b0f3377fcdf2922021d46a5 +QIUTy = 0000016b8a2540d5e65493888bc337249e67c0a68774f3e8d81e3b4574a0125165f0bd58b8af9de74b35832539f95c3cd9f1b759408560aa6851ae3ac7555347b0d3b13b +ZIUT = 00c2bfafcd7fbd3e2fd1c750fdea61e70bd4787a7e68468c574ee99ebc47eedef064e8944a73bcb7913dbab5d93dca660d216c553622362794f7a2acc71022bdb16f + +COUNT = 24 +QCAVSx = 000001a32099b02c0bd85371f60b0dd20890e6c7af048c8179890fda308b359dbbc2b7a832bb8c6526c4af99a7ea3f0b3cb96ae1eb7684132795c478ad6f962e4a6f446d +QCAVSy = 0000017627357b39e9d7632a1370b3e93c1afb5c851b910eb4ead0c9d387df67cde85003e0e427552f1cd09059aad0262e235cce5fba8cedc4fdc1463da76dcd4b6d1a46 +dIUT = 000000df14b1f1432a7b0fb053965fd8643afee26b2451ecb6a8a53a655d5fbe16e4c64ce8647225eb11e7fdcb23627471dffc5c2523bd2ae89957cba3a57a23933e5a78 +QIUTx = 0000004e8583bbbb2ecd93f0714c332dff5ab3bc6396e62f3c560229664329baa5138c3bb1c36428abd4e23d17fcb7a2cfcc224b2e734c8941f6f121722d7b6b94154576 +QIUTy = 000001cf0874f204b0363f020864672fadbf87c8811eb147758b254b74b14fae742159f0f671a018212bbf25b8519e126d4cad778cfff50d288fd39ceb0cac635b175ec0 +ZIUT = 01aaf24e5d47e4080c18c55ea35581cd8da30f1a079565045d2008d51b12d0abb4411cda7a0785b15d149ed301a3697062f42da237aa7f07e0af3fd00eb1800d9c41 + + +[K-163] + +COUNT = 0 +QCAVSx = 0000000574236f1428c432130946783a5b3aabb6c27ea5d6 +QCAVSy = 00000007908c251b8da021cbac281f123f7af4fac5b3dbb8 +dIUT = 6653b6077398fadc7bf5e60158170148c3dc4527 +QIUTx = 000000071f8b2877d6027d9c1ade4244f2dea12692ef23d5 +QIUTy = 00000005c15ee776221c72b84b347ce383f38067b89c3e9a +ZIUT = 04325bff38f1b0c83c27f554a6c972a80f14bc23bc + +COUNT = 1 +QCAVSx = 00000001699744092fe2b5fe7ecbf6987b7aea0a06fd2cb0 +QCAVSy = 000000035de441df9408d91f0e021df8f0526b8063031495 +dIUT = 00000003aef44754d0ca97d42b4e97aa92156263c0e078f6 +QIUTx = 00000001b0108c786bf4d340f0505bdfc7d45b514611ad94 +QIUTy = 000000022c9c39d5fb9456b8a2221cea4f058f6a8d2cd84a +ZIUT = 05f9ac3a3dd88429600958386c55bef4b1aa5f0c24 + +COUNT = 2 +QCAVSx = 00000002965db159171f5cb7e7a1bcc61611aeaca8c52c9b +QCAVSy = 00000006871d1e9c1fe845268076a995803a6d49cd075554 +dIUT = 000000031172342e6d37cc1e062a4494c39cba48f9ad9a8c +QIUTx = 00000003a27ecaec2b66feac2040f6890128bd0058d31924 +QIUTy = 000000014007e3209b6d7127b0f393e5e58b1590b9f40be2 +ZIUT = 022e0290eda5d348894129f7455d1c766d32d5c2c2 + +COUNT = 3 +QCAVSx = 000000055b68c0c2c246fe0f2cd5484b58814c65213ea541 +QCAVSy = 0000000539c11d2592a2f6393b6e86c54df909b95fe0d5a8 +dIUT = 000000032a511cdcd4bfc567ceac8c24ed04e8894df78ddf +QIUTx = 00000006978dacaa47d8f3bc90b41ec7f4f8ac79a86ddd07 +QIUTy = 00000007f8b0ef4270760376bc2d5faed83da7872631d09f +ZIUT = 037f659f430009fcdae4e9f6e6316b0f5dbb268212 + +COUNT = 4 +QCAVSx = 00000006b8ef5a62d3b636a5a76bfeb1ef8ff4d8b3d9e2fc +QCAVSy = 0000000675a757266718398d8af66d2971798478e2f37d28 +dIUT = 00000002c6f64fe609eb8eeb5b53fab6308898e63ff2e3f6 +QIUTx = 0000000549e1a82ec284bf77d528627e52d832e236c92ad3 +QIUTy = 000000019883aa9b458b35bd544d6882812150c1497d31d4 +ZIUT = 00503bbb9b62f50ae7a8dfd74a1741826f09290651 + +COUNT = 5 +QCAVSx = 000000056c4a3586acb03099d52b2cd4ac59269cf51b8730 +QCAVSy = 00000002426561cbd9da1b23a6003de0e5f7c4a065a5c2b8 +dIUT = 000000026a56867513ddd8ca94d7923baa1f7fb00daa38fa +QIUTx = 00000006c28a40dc4e5503d2c4b8ab0b6b7046e8e25ac09f +QIUTy = 0000000121911654a5836005d8036d976585ff1d831e587b +ZIUT = 012cf17799fdefa2940b18d56e80d44414c5b13884 + +COUNT = 6 +QCAVSx = 0000000741c69a4edb386c94f819d1b5ddd0281e4ff29765 +QCAVSy = 00000000d32f972abac91be85a709eba07f5d16215ae602d +dIUT = 0000000386811079c8021c2d79f4de952cb2e599c42e19ed +QIUTx = 000000060aa42a62e21eea37e362b4d3de837f0c49d3ac13 +QIUTy = 000000069b20d6fd16d13b1883df05629ac7d1b82386b344 +ZIUT = 062a2f926ab435ac14e05d44c27b46b6820b713aee + +COUNT = 7 +QCAVSx = 00000001ef47795fb0e380405ab5e88defc3ced9a92514a6 +QCAVSy = 00000000be6181d7fc03ca8bfdf11869cea28cfa0e5f5f64 +dIUT = e46e9c965268647f2048474c7b1a54dffe728f1f +QIUTx = 00000007a984ead440310cef2e1338972ff2dddb65cac3d2 +QIUTy = 0000000333c1a93427fe6ac502760b7778898a8bb6a40ad9 +ZIUT = 0399b9294e895486bdefbaad7a729353ce09586357 + +COUNT = 8 +QCAVSx = 0000000374d7f9ba8cda8a68de7279d3ff8674032fd47c02 +QCAVSy = 00000003ede995c3a4e8a6fe21cd1e4cd4ca3812c0d692a5 +dIUT = 000000027334971405b0461c3ede67f2ba336734451a8378 +QIUTx = 0000000767c31ee9303b1b2cd3059f81507ef304ebd3102c +QIUTy = 0000000251e0d430dc3f63f3a37bab1e7a957652cf67e22c +ZIUT = 022325a9a769a902c2e64c80a1d35429ced42ae0a4 + +COUNT = 9 +QCAVSx = 00000006577df54e11c7e76202f94f564e6137b23ce6e441 +QCAVSy = 000000068936600aadcb25fd4024ed3e845b2bbf807280e6 +dIUT = 000000019bb480739011235c6d5c6e74d6a7bb4f20f61b7a +QIUTx = 0000000093549075704d79dae772317dd65244fa772569eb +QIUTy = 00000002a8a2821dd39d7e7653ca71cfc1a9ed857801a39b +ZIUT = 051392d5377016358405030b48744003db66440a2d + +COUNT = 10 +QCAVSx = 0000000261d15345ceb492229a8d74597e7dfd19aeb6848a +QCAVSy = 0000000114a122ce28ca15620f7b40a1f26b4234c956bdc1 +dIUT = f4edb58bcc3d6e9d317229420a733281eccff1cf +QIUTx = 000000027183609b7593b1845365c081d45ff66c9ab5e370 +QIUTy = 000000069b981236fe930947b6b77f374282a18e4be993cb +ZIUT = 045dac076e79de2fc631315465d3ef6245f26647e5 + +COUNT = 11 +QCAVSx = 000000070e380f49370a0027954a4ea880bc1929b28c5329 +QCAVSy = 000000046fe3b454af9420a811f1e15f774da5ae1a40b459 +dIUT = 00000001b990491a12fdee231aa2a116e1e3c1c91d0fd478 +QIUTx = 00000003da869d09c4e4545ac1689fc72316012632d0abd9 +QIUTy = 00000002c820f40310e5ffd2f8bf439fba879bb2ef621b2a +ZIUT = 014f7a46847ed6a7ff605b0e52c616e4ad3f0d5029 + +COUNT = 12 +QCAVSx = 00000006e60af77419b9fe0fc5c79ca1a22a1011402405b6 +QCAVSy = 000000069bca34005b578cd7a7a6929bd3f6ce29943b5ed9 +dIUT = e829b9942fd96487f6012908fe04f6d8eaaf1966 +QIUTx = 00000005ab2074c04df57160167735f7fc2d8f629d34ff18 +QIUTy = 000000012e9da6d05bb3e2acbe5ba4afb4a0dd72db07d6ac +ZIUT = 00eacabc34555956995623e60482e5c118e34e2094 + +COUNT = 13 +QCAVSx = 00000004f750e27500e10f0a176b83f14bc26d6bd71ebd74 +QCAVSy = 000000039e5009067c0ee2c8f55b7e84da7a391f08af7504 +dIUT = 0000000157ce8f0b6ce92e426ec99f223ad82763e4bd3ff3 +QIUTx = 00000005d3989cca4ae732de93672b25c9260861b4c0dce3 +QIUTy = 0000000436a331ead24f2807b55260f9dc3de668cfbfebb7 +ZIUT = 0414a622645107f115576f51cdf39d1393a2d7851f + +COUNT = 14 +QCAVSx = 00000002ab9f5ba94102d21a706761eac0092190f1cdad04 +QCAVSy = 00000004addd77e199c132d18ac541b117748d2319db7fe5 +dIUT = 0000000379885f45f2d707be1c11d86c41bada493b2a5603 +QIUTx = 00000005ae31cb29b31d24f5f94c30e9c02f07f38bff0ac8 +QIUTy = 00000004d8d8e39bf87f058543dc8990a91214da416cc558 +ZIUT = 056be002daff11c4066e10acd046a85e170fa4c122 + +COUNT = 15 +QCAVSx = 000000043d25d2de9293b84d351a33cb1a52f5930a4c8b76 +QCAVSy = 00000003d259d8236e9c8d6437f41e6d54611c52238fe2d5 +dIUT = ba8c5864db3efd768b9376fc2b6c1f85f46f6af2 +QIUTx = 000000062f622149823f255b4f86906666f3a3556af080ea +QIUTy = 0000000274ca32c10f9add61a026d20ad3ad56b17fb06a46 +ZIUT = 021fef8e473daeda8ef6bf07814d7b9b613e3076a3 + +COUNT = 16 +QCAVSx = 00000000560e1a421865118bea16cdad6b67aba384ef387b +QCAVSy = 000000058b213ec2ab3942f8f6ad60a956955b589066b856 +dIUT = 00000003e5080484d3730b2248ccc48260d4bd1857605ad1 +QIUTx = 000000058aea6e40b8cb25e6622a7be4ff01b79c92de72a5 +QIUTy = 000000043f6776b6deff3d29b4c703899d705c7fecf525c4 +ZIUT = 03a287fd1cca68db47a3c74c12627fc3728568dd66 + +COUNT = 17 +QCAVSx = 000000038e485de92e41f1caca6c0eb9d811a5aca89bf345 +QCAVSy = 0000000331a1677c46a68e964811a9cc5e4e53ea71e23129 +dIUT = 5d052ba1abea724978caef1879245672d5aef891 +QIUTx = 000000036b84a77337a9de5c1dd7ae3c899381382f0fffa4 +QIUTy = 000000056d4ac39fe881fdb8e60d4559658aaade45663ee5 +ZIUT = 029558b41b8b92387bc22c868f51bb7acb6e4ee2e3 + +COUNT = 18 +QCAVSx = 000000064259e500476dda3e97e25e491d466c2b7958bd49 +QCAVSy = 00000003c2e53281393641a518d1dceffabee8b29bde1402 +dIUT = 000000039180187a9eddcf38dc264f055b07d20b9f9a8bc4 +QIUTx = 00000004b292d1fa09dfc5e6a3ad99fd02feb74d480e34f2 +QIUTy = 00000006e1888009a0a0491c0be6abfac943d377f0b4863b +ZIUT = 0530020c8f6362312bfbe5c1c605b40dc2e032e81c + +COUNT = 19 +QCAVSx = 00000003714276997b4478e2d8b59af5f2e63e22bc4c31e4 +QCAVSy = 0000000673f28d962abfedee62eab47c3b4579a1e5168336 +dIUT = 000000016d37862b195763c6a01d5e39b9459a32507c2b21 +QIUTx = 000000033440e460c475f2058a767ec466ca18bce41f830e +QIUTy = 0000000372aee323d063fa89acbffbf55024ae24e4929f19 +ZIUT = 0521673006a1d9608911d54536e122d809e919d804 + +COUNT = 20 +QCAVSx = 0000000275ec15f27dd2da6e44dfe6235472d5bd3a2502f8 +QCAVSy = 000000058fd02262b27c185dde26b2c77d5a4f4d50dc9928 +dIUT = 6c658794b039c820a8b033008fa8ac7556bcaec3 +QIUTx = 00000004cbfb286691e415081a1785ec6b0aacdb1d231d1d +QIUTy = 00000005dd6acfe91d68a8ec23686478c0ee8c89277aef14 +ZIUT = 0460579beca16cccce314ff3040de4785336fc358c + +COUNT = 21 +QCAVSx = 0000000233af36103039226f416dd22e1a26b73f9093d38a +QCAVSy = 0000000734258a175c97768a9f72b824b99a91f5cf8e3d96 +dIUT = 0000000169c8da22c35a855495047a104be00b1575b652ab +QIUTx = 000000045efed9c8bd2a4e429588f344f49d1e63e668bd01 +QIUTy = 000000025d1af85ac21d59822d7df8f0e4bebadf3b5d4401 +ZIUT = 05ba66964483fe473ccbd00c37ad3ba40cc5969f62 + +COUNT = 22 +QCAVSx = 00000006d032152240f28be7f74df8f6d2a450c1229a5a95 +QCAVSy = 00000007aadac77cc4448985d1794636bc1d582f3d101a33 +dIUT = 032fc790864632630c49a29e9ad0fb6d10f2b58c +QIUTx = 0000000779cfb3e17c902a2584ed3382a8bed8262db98424 +QIUTy = 000000004af273875f8a2ab9a94ac0d1e4a23390b2bb505c +ZIUT = 0277c4a76e1613b2ede699a675c1645a786075009e + +COUNT = 23 +QCAVSx = 00000001f8581ec61df1409227aab7a015f2c71d29e3716c +QCAVSy = 00000001c1f51cc4185b68a260e31b4b00c03a4403f65c25 +dIUT = 00000003c1de5bb40e70933ed7db84ce2cb468cbba299b3a +QIUTx = 00000005ffe0f16018bd4bdee5f73bfdad04d713f2216f50 +QIUTy = 000000042361c881f0081cb0544efab0c3b34f59eaadeec4 +ZIUT = 03c6481dac387af39e8c09a553068ac496eea03691 + +COUNT = 24 +QCAVSx = 00000002ba22fbdaaaa806c8570f14ad4c882a610ccb8d84 +QCAVSy = 00000006d4438e528ca887b05bd2564df93bef9bf660da78 +dIUT = 00000003881275ba48bea0becc0211903467f5d0aae321aa +QIUTx = 0000000776e40fe7149985337ef1b6c9b830cb3608752aa6 +QIUTy = 000000058e6ecbb27b0b2d3cd0e3a7ba538de3576fd5b9f6 +ZIUT = 07b5d096d06d41c3ad6458cc93417e6facc99bc7b8 + + +[K-233] + +COUNT = 0 +QCAVSx = 000001f40e34b3ed4a1b2d40c056fb75f2ad543c897cfd82f542cf746a0f202f +QCAVSy = 000000c130a1abe92bc4c977c800777996ccc50b90df991a2e81dd515c188599 +dIUT = 000000135a5b8c3ce047fbc5df26277d3bf83ac33ddadb5cf4a050ca82be48f0 +QIUTx = 000001a53e5c138b3d83905d563aa1db01274633c986b52f78225a92e33e7952 +QIUTy = 000000ecabd3e2e26729a965604e560ed4498a22b31c39642e1cf99b1dde3ec7 +ZIUT = 00a822b141ca1f5ad32899e68c54d1fec3df8100df485ebf1c5868a9ac89 + +COUNT = 1 +QCAVSx = 000000c864c2a462a9363a4ac3d818211bca0369472d186288a27567433bda45 +QCAVSy = 000000689d4d0006eba054dc69fcc0786780fb5f74d3989213504e2f6e666980 +dIUT = 00000051be6fbcd4878c55439b0bcbbe5ea8e84bc9db89e70a8e8ebf34782da8 +QIUTx = 000001c5a1e5d3ee516e3ede723fa2d5cd3456b116326303c5ee49273a5604c4 +QIUTy = 000000568d0fe7130295541bfa265074147546e9733736ba007559d716d8e094 +ZIUT = 01662682bec2dfae05e38587c8e6a4d18aef4cb3416989c47c11bbe2810f + +COUNT = 2 +QCAVSx = 000001782d82fcd211c0247c87e657efcc5d2ff6b05eb935330a53903fb3bfa3 +QCAVSy = 000000cce830a515d690ab98149579ad3481384859e565d07fa61f50ebd669a2 +dIUT = 0000002ecca595e55e6c85c5af78c59540fdb749003ff4ec361c38b48e7da6bc +QIUTx = 0000005a48fac476c31cad0c68e64e65e687ae4418fb5d3b4bb2abb990dd0de4 +QIUTy = 0000002d9add706626f2859ece110df2dde89faf3e8aac433e2595e23c274082 +ZIUT = 00215d511cb95e0e073ee999908a7a844afd75c9acb7a9d724f7fd322b01 + +COUNT = 3 +QCAVSx = 0000008d800d3767abf5731695754ee8829b858ff4eb604a448ad66490b49c19 +QCAVSy = 000001bc0f0339649ad4d7b7cff3fca9e965a38625e8f45bc9602a33c0798a33 +dIUT = 0000006a7c03892df184d56cdccb9d5e9a16483a6c9388ae212aa926c8fdfb5e +QIUTx = 0000014aaf880e81db69aba2b403bbda7f361e3339b483ce2699f30bf5281ead +QIUTy = 000001b71559bd7d9384e517b87f1138a696fbceb3510d8c41c2158d4aa3e5b2 +ZIUT = 01394e02c70104f2a5308b2d101b02c70ef2d13540602b8e8f82dc6d569f + +COUNT = 4 +QCAVSx = 0000014a3e121add7a5267f5cad204b3f49215084786b23f8d94d9fda02e0f19 +QCAVSy = 000000394fea175dad9b34d525434654d0c86637926cac3a3292a2e4a514b5f5 +dIUT = 0000002e2ff8791bc64c00f3b0f1d5d5cfb9ddb3b193814599f7dbddedefcfa3 +QIUTx = 0000018045cc9e65f6e275e322a62c18efe2d00cf93995feb53561273a3f1306 +QIUTy = 00000164e0073c0d4b3e12e22f837bd3fec421e3bb09e0c0dd997422830f6403 +ZIUT = 008556a4c3a8906ddbcb946099ca5dbe7bdb6cd8f37fbb50c96fcefed32d + +COUNT = 5 +QCAVSx = 00000089667888f8425c5a623134622f1ea9d9af36df9772c410d6e31f2b4db8 +QCAVSy = 00000084430fa47164d1c0eb97042a44cbef400bbb545faea4ef49ba5e3bef42 +dIUT = 00000066972e71566746f2f76c87793774054ea275e2a7e27ab7c2d05c5f2412 +QIUTx = 00000020226dd73e318e4fc8d49dd43e59e260193d1bb248cbe4c06b4d6b8389 +QIUTy = 000000ed12a4f389696ab31c93ea3ec4d8eaf18be097fc9152e2c42b73ff4528 +ZIUT = 004ea6e0e34ec7c9bbad47f0f6f8ec0608e736d91e0e56cf3e5cffe8c370 + +COUNT = 6 +QCAVSx = 00000164da099225eb3c641fc83c77204a396eab9495b12a22f68e7a4b8399d5 +QCAVSy = 000000cd98f2704c7494e6d20375e74528c8f56f867e9dd763298142ea01724b +dIUT = 0000001e53baa16bc0262b5329a711b0eb188a1bca7ef4b5c85061225d41d4a9 +QIUTx = 0000007d6d785fa323174eb9cde5b705428e4019244835bc94702f280c25ffe5 +QIUTy = 0000019aa0ef433074c484d14e611372f03ef8912f1a8246ceb1e90c817db3db +ZIUT = 0160d0b9b92a4acd089738fd489ae39734551e888fd05a020ce26498270a + +COUNT = 7 +QCAVSx = 00000033a8b08a3c33c343032ced1c0f5e826f932dee879ec1607a2af5d46298 +QCAVSy = 0000006c4f27a49b51a89f6d0960160ba5b8fec08dd2cd4bc909a490aebe4f7b +dIUT = 00000042a8032a11d1657755c49e477033b0d341da2fe993a4577b41a40cee1a +QIUTx = 000001f6629697da620d597fc1f51c83374213f37e952fc117ee65a9e766aefb +QIUTy = 0000002b36dedc787ac951d2879d72414da2e7575a6cd7c42e0fa20b32d461f7 +ZIUT = 0038381b342efaa70bb79adb76ceb775de5f45f863559ecaee1ddbbd0313 + +COUNT = 8 +QCAVSx = 000000cfe15f861aa0153485f38ac033df9c8d812afde167b8918bb94a08d963 +QCAVSy = 000001bebf067f85126d114932162164201b1374bf1840aa11d5e250639d0608 +dIUT = 00000043e5770978195f917152f057ba1fb0156d894d32e8bb54c7f62f7340a6 +QIUTx = 000001487d1fdabccd7d89da25685b042980ab170aee3c11f31180e3b7c50a4a +QIUTy = 0000017e383dd65a1ec8a409007f75035e5b161335d9c7756ed970490fbd171a +ZIUT = 0122169f1dff445ec663270375dfe914016c38ce6c2d40d0b8098abc60ac + +COUNT = 9 +QCAVSx = 000000763e286be50740b7f8bd78fa70bcac880df3d7371eb33fda2453b3ed23 +QCAVSy = 00000057be6c5f7d990b75439868339ae327af04a049b38b92332b9cb8cb27d9 +dIUT = 0000004c67c6103e62124600a0d9e923dc217a022f57c6feb219c703334ff339 +QIUTx = 0000002352fe9341e62c609fc1538e0270405e7001d747b87500e644a112c5d9 +QIUTy = 00000041f3b15b714a6f7ef647e23665ea530efcbe19b0740436cda812e83939 +ZIUT = 0054d47c9d0a9fee258122326be25daf35f0ba0b8449e16b4623a8c0fd7e + +COUNT = 10 +QCAVSx = 000000bc8a71ad4c1134def026e4723e310223fb2c5859bc7594054c894da552 +QCAVSy = 000000c3650563505535033c7a6c448d73bfa08fb8370234c7fdbac1b34daa22 +dIUT = 00000019e54da872995eb3dcdccc50418ec351400889fae75a0ba4dcff25f1f9 +QIUTx = 0000015e67eaebe52ba37f5b73a199d950812cec1012fd410581444bbf23e0c8 +QIUTy = 00000022055ef821df33042fb8316ddad76485dbd2590e2f5498a914e4f0ad39 +ZIUT = 0071aed39f5c44a7ff72db3e0f8284da39dfb2d894f278d2006f9d2686e3 + +COUNT = 11 +QCAVSx = 0000016cc1ae13fb348252493021cd6146d531f0b722842a44c7979689f1ff38 +QCAVSy = 0000018c0963ff0ea37048c9f6f47644f2a7c8c503863c27cf21ee6e0a3224ea +dIUT = 00000013a5ffc9a0f7069c1c66148699612e5cfab7e2bf7b3255f181a0227192 +QIUTx = 0000018de4dc4f6a4de5c3638ebba24dc7064983b159f55b139c7680a1cb90d1 +QIUTy = 00000135532d8148af3e227d4a8960e768c565f72c1ac0a1c9a7bd185cf994d0 +ZIUT = 01ca68ead4eddc8847a3a661cc6628e076bdd4b45047ece72245d094dd3b + +COUNT = 12 +QCAVSx = 000000e49e182ac5d932be8b05fe340e8cb72df35647decd679a8c59b5d8fbfa +QCAVSy = 00000181b95a965abd16ec2430c26dd071984e854a967ff114ee7831bd314b2a +dIUT = 0000002f5d2a7e0877a4c99073732386e8d59734a23dd7f0df7fcd54d941e760 +QIUTx = 0000014798094680cbd32fb1ee9dcaa6b8739a556305235933fb27157d319e57 +QIUTy = 000001c855f0d453c1ffb5f668b32a8b3e309e0e8101bc39b6dbe7de214015e3 +ZIUT = 017a893b2e090780ff8daaf3588f9dfc0ac4dfe1f1e263697a9d1f398ab3 + +COUNT = 13 +QCAVSx = 000001598b2fdb5bf1a3951fb9ec016ecb4d28f66c2e9d13596786593585d719 +QCAVSy = 000001ef65caf15795d14a0be89cac7c680323bc59803ba874cb2968672cb8a9 +dIUT = 000000652a11f6c3117f1326fa6877405cec7331c4f146a97f74ab0c44de01b7 +QIUTx = 0000002cd6d4c1d2cc5e34205eadb94f4cfd35bb569da722c4d9b19b8d5cc2de +QIUTy = 000000ea3004e5b0930df7f8bda314c8bc1145463eb60022cd2dcf6c0c824e50 +ZIUT = 0041fa5fdf495b885699249b7746334b76c59e1c917bfc1ae371b96941f4 + +COUNT = 14 +QCAVSx = 000001b6cff3b7fa215e378605c93f86f5cd3845f45fbde8be079dec29bc8862 +QCAVSy = 00000166222efa5dba9e858c245dbb5da668239ab5ba728618fb85a90ddc760a +dIUT = 0000002ad5f71c6384af62689b35c24c4ddfb35acf8106cb0c19502c2ca184af +QIUTx = 000000fe1b52408a712841bd62f0ee51307f26331d402bcc3a5ab0405d1c5e80 +QIUTy = 0000010a731a7d6a6a4f5b40b2eaa810c1902db27b28d297bc05f3714cacafc0 +ZIUT = 015f5adba59d1ee01696cecce4b63e78e68508303ee496ff5abcea25ad3b + +COUNT = 15 +QCAVSx = 000000cf402aebc3e4247a9ab43da9755176a810e011f9fd977de1be2fd534fb +QCAVSy = 000001bac45fa42d605ad3479c7c43e724910716737953cc8504af14f331d34f +dIUT = 0000006f01cb54781cbda6d88deb59843ae0836b1af683efc75650be84f208a7 +QIUTx = 0000004d00a8f0820da9097fe50e8e7defdac29607dd4cb1dd881d4e61f1e78b +QIUTy = 0000008a4a8e9c811b444367952752ab8c2a5198efb28fbedbf3fbd701a857a9 +ZIUT = 003d5c29b3753e89ce5064575393392b377ca657a0b73872c82165fc43ae + +COUNT = 16 +QCAVSx = 000000f38ccccf08e5bdff3bb35f7e75bdced68d3791dcf7843ca88ff092136d +QCAVSy = 0000015ed7697a4b8c99d0147828f6c861ffc9cfb0f33dce9d14b0731e1da262 +dIUT = 0000005dc1ba1839f5d1fea85ab3614c55a9c5fe600853c71a61983c7dc82de2 +QIUTx = 000000b6cb6ffa4e2eabcf7b987ebb520165a8ec9a22a6f9ffb100f38172a0fb +QIUTy = 000000d39814e1852476e56e89ce8cdd64372840c01570a86940ace24bb9cf6a +ZIUT = 007c01f906caa590898a09f46b6f5383658e7fee656aca0f111f22939960 + +COUNT = 17 +QCAVSx = 000001e328571df933acfd4c96f3c4bde71e9175cbcd62aeecd76384744a0f3f +QCAVSy = 0000019ff48aae0c252eda8d340b25c4dda01a2f21aaa35d39baf036696a1101 +dIUT = 000000241e1df5587031dddae196891c28821cc7879ad35832ae718f6e792e66 +QIUTx = 000001c172cee2b76503eb4d90b39ddace825b23c32375cb68eaecd7348490a3 +QIUTy = 000000c246ef9c6e2fadac77c73ee9dd5adee828b7918417395b5997be1a0278 +ZIUT = 019eece7d3fafc9274d361c6fafd9efd9ee485cbacb3baaf6834feb4df6a + +COUNT = 18 +QCAVSx = 000000f4aa7f9340a9da46c4f06728753a4adc5af53a4dcb467f70b4873da785 +QCAVSy = 0000007f321e2bc4e29a68ac23c77cedd3bbcde0bf7b92a27ffa76496988981d +dIUT = 000000044ac55a913a8c7f7ed7fc5679f52f47cbb9730325be21b7993779d187 +QIUTx = 0000009794861017b3debeff302e425327fe269d78753b73bc1bfb3a77f716dc +QIUTy = 00000002581a49c1269f5ec868dc6d7f5c2d8e749632d47ab6d9e68dbad985f0 +ZIUT = 01e4b7e89fb1b51179b8792f5cd581c3917e11246d3846f6344ee82eed66 + +COUNT = 19 +QCAVSx = 00000068d9e55e7a105b7bb44b21d669bb0ef657a91437ad84bf6d5853270c98 +QCAVSy = 000000143c8bedb54db07df8f67083c59a0aa7cd8a0efa42f42fd62e442e0b62 +dIUT = 0000002bc136778531089da5c2fab3caeec256c54b0b35fc2c65f7b8ee6161c3 +QIUTx = 000001fb258a31d166bef9cd664cd7b66cd8c186e7025c77f0bae731587e9ef6 +QIUTy = 00000060dfd4e475e92805d1935d0382dc1767067915cc00ed3b24f65382d21a +ZIUT = 0145710c3ab0780ec233424d4e28b38d29f886965bbcac49fa300e1ed886 + +COUNT = 20 +QCAVSx = 00000099eb91cda98620103c3205d6489e68ad7e57d0a51dc502d6e30588f418 +QCAVSy = 0000003fbf829929edd28e906f58f87abed6d6d177f436f0dd940dda25eaf188 +dIUT = 0000000d56595471435d95fec37df622f18ee7dabb24379c82bbf714c5abc5e3 +QIUTx = 000001a52940a452aaf420b37b5f32c2c337306894a882feea7addadc01927ee +QIUTy = 000000771b9f62a2a6fa892503225275490388b8bfc2df77df3e806bedba7d88 +ZIUT = 006941a2a531083563dd886b06c0860770a4724bb04a4ebb2afb1ba2636b + +COUNT = 21 +QCAVSx = 000000dccaa22b43391dc052597ae3bd07c6e5f021f39e987756f6548171ee94 +QCAVSy = 00000128efd49af3a6b32dc16797a978f0ad4ab0db66ababd6ad5672f4f812c9 +dIUT = 00000019c8ab2b32f2ee93bf2ff6bc44378b60872bdaeb6ba56b514c8f388ba7 +QIUTx = 00000083530fa3df315a8740ac52f4d394b80c4a5f210baba0b6dc2205e12493 +QIUTy = 00000037b9d02ed43e9d41d0dbb8403b9021b4d2c1bd360ee53c31c27b492005 +ZIUT = 001d754ee5351d4582974734072abac23376e24348370934e7b864db0f52 + +COUNT = 22 +QCAVSx = 00000170917b33b37b8eaff2461e5f9eb8f0797b13aabd915a60706cd4f32cb6 +QCAVSy = 0000007651e0742c0d83d4b68552e9b7abec3644ba9755cffe6d4e56943a6b9b +dIUT = 000000503160104d88a0c0f63956e7c3bba702963f9f1b53fc119a592eeea4f5 +QIUTx = 000001463c78e498abf34033ec3e1d973dc12509e2d234fb91403715e42f61f7 +QIUTy = 000000ade7abb98a0308886696353aad33c05bab5cf3c0d4e969cbf4c4ceec93 +ZIUT = 011346b83791e4bea7f6ba6b1265e5050895d84027c106f77353418f75d7 + +COUNT = 23 +QCAVSx = 000000d8ed318382b85c2525a02c22c67f5bf366335d94767eb5cb45739664c5 +QCAVSy = 0000017d8fde7bbc568fdc802a3e3455f3cf35602df70684c8acdda165a02656 +dIUT = 0000004547eaf9be1ce5af1386e311046ec83260b84a2ca91055f60668b946e0 +QIUTx = 000001504938c167680afb8b6d5858cfaa191c40196fc4e500c662c5346ecc90 +QIUTy = 00000137d1ba942228dae68c450b1a033a2c810a995971f01c24089e4a6fdcc5 +ZIUT = 00b4938ed1ed012a9a53892ed9949397cdc4e4a612d54dcf80cdb039f47b + +COUNT = 24 +QCAVSx = 0000017f87f13f6dfee6081bb5cca532fe268c271d2756b31bdf643297cf695b +QCAVSy = 000000f3a746955e12dd0b71919edbf23b2322cab328dd09bdf87bcafdcd2884 +dIUT = 00000042fbe554862f3595184a45510ca53df97c45175584b5d2de042723358e +QIUTx = 00000131b8d61b9cfb0536c588214e45888ebe48391eeecb4d7fb5be8eff4acf +QIUTy = 00000165da49557a0aa9d45dd378d5f899272cc697682276ae91d2c0b675c469 +ZIUT = 01b3d2578bde3066a253db5322c85cf9487ce77b67ece955e281b0d7d0e7 + + +[K-283] + +COUNT = 0 +QCAVSx = 03f075c24c35a9dc9952be6fd32b761dce63f4720a22408e3a14bbd097e012b5694c22a0 +QCAVSy = 0675825b40202e95be7dab5a826147e04b8c51a09b0034577c1f31f8c16a70c8e1c85b89 +dIUT = 015fde49b802542a52c70b23a0b1784e5f8780b56853f9a5f8c3a5266e8727dce97d4a17 +QIUTx = 0611edc045dbe43ecc4ef6b324cd51f70fe3d7ddf877ec68b798909c3c4561756aa30e5f +QIUTy = 00833b25511704af09b62d9f7cbac59814e75bbb9c735f55538491dbfa60c1e0115efe42 +ZIUT = 0745552817b5d729310b7dbebae687648714a9ae695dad20ca1ab6111c3d054670f21132 + +COUNT = 1 +QCAVSx = 0799b430e92320ffeabf2d6cc87399e30c0aa84420ff8eba2309b99487b742d722e8b7a5 +QCAVSy = 0217362801fd6d2d286e5cdf375cd0ae569b700005312e37e8e35b1592efb9b5eaf47b3a +dIUT = 013b911f62f3aa884354634547ee622807d5d106020330ae2b9798c0c4cd0eadb10ba948 +QIUTx = 078d2ecd4d902332b6b3c7bd4ba7d200fc34c45eda30998b6025ed47b1f4f8e68f328624 +QIUTy = 04d5e53647dddf2fccc8816dac8bc70c29807622cc95539a72aa3a9b230ca1d25ee7b516 +ZIUT = 02eb0c1ceb6179232e91cff91fc8a30553c6ed7e0a71deb1bda0a10735a84593dd903636 + +COUNT = 2 +QCAVSx = 00ce47a743d48b86fefd6b5c02f2a97b2762a2fe57e0bdf85c1d6a29de8862c4c99ed53a +QCAVSy = 0322e596069f916568ca248ced57efe90534af4a9f90a4f40f797e452967031726bf41d7 +dIUT = 0177632b69e7edda3cf007307504343cc2162326f62017cbddf360a876dc93b81f04c58e +QIUTx = 03815ab6480e4ad24a6628275ef2ee0ce7d58699239dbce23338842bc58c42cca94d2412 +QIUTy = 02de833cc664cac90d30fbeac603efbbce9276d4f16ab1c46e7e11c81a9aa9e25c82969a +ZIUT = 04a9dd2cf5076814e5329c518c4f27b429dbe01d46682d476e7e78880de368b064236ba9 + +COUNT = 3 +QCAVSx = 0728975839b42c62036a7afffaddefc3024b7258407bed565caea939be33d16ac94445c7 +QCAVSy = 07712630790b05ae04d8d7d9f2365dae9ad24c4c61b3eb20c0a7987e6a4c4b0f598c371f +dIUT = 003bfe9a1c985386e5ba2b31553a55151e78ddc38f07432b5c42a1cd2da278fd0b68e047 +QIUTx = 01d9c3337da95ec6e5a4bff1cc92783989b66c9230107870d4a578699338e38eb2d92eff +QIUTy = 00cdaad7d0eb0f445aa763a5dfb8f38f55355777ce24f753b5ad3d3cbab125f491698d56 +ZIUT = 044e2cd2bc164d21cf4b9833c0aa62ed059282e62b82f4500aeb422d17e1f6e7e8bbd500 + +COUNT = 4 +QCAVSx = 055672d73998451089e2b7c7104b42247dddd132d40ad087b588d6a385da64f5a2f46838 +QCAVSy = 02b4cb1581f9e2b378eb7a4f64f5a7d4320b2ca3d3474726f670c3883bb8da47f3d745be +dIUT = 00d95af52a708e692d02677b21032f7aead6003f124e72013f37c06e0bbc20e3532b3cea +QIUTx = 06e487f91e73bdd344fb8bc8f4c1f476e727fb2671e9d6c8fbd775f1aaa24caf2e9a36f5 +QIUTy = 0663e1cff8099757bb9ff1b87890283aa49cff0f7b12fe184ed2a428375d2796cd81de91 +ZIUT = 04d4f04d2fcf1bcd8150eaded90e467d3d38f753b6fb54eed8f9d29cd3dcc7be2c83de11 + +COUNT = 5 +QCAVSx = 02cc28a4cb76d147d98dfa677dca14e1771347b9681c65cdb540f22c907613fdccb0c8da +QCAVSy = 07d4065f990c8fc37d100ece38fbf574ce444dc37355e0702b80d1eb1bdd670997e8f271 +dIUT = 00c733d9094032cc7aed6c54a8ced753eaf2a48882285a3b4c7e6021f26bece0722840ad +QIUTx = 026896b039d7068d98a326710ebb7a978bd47661154645ae30cd83d60535067e05151ccb +QIUTy = 00d83a263bdbd8c8abf0310bfbfc83917a86b0d8c4be0b155ab7b9e2c705605628bbcdd9 +ZIUT = 01c343540541604f68ddbd63c483760d824ded5c18be7e56e6d36a9ac6d25772afb0a90a + +COUNT = 6 +QCAVSx = 063880eb538c7275ecba4db53d9b68c287fb3778bef514974d1e7e31a9ae365a2181415f +QCAVSy = 04af9f2cf92542e1ff8ff28f8e7c8e809584e243a4902949a765a284986c750b1b06c89a +dIUT = 00db39d7536072dc3448cd7d2160e50c811f648358eb0db1d5428e81aa7a686b7865adfd +QIUTx = 03a721906ad13dc15c311fd4e552f3bc87b7d92ceeedbb0c316a952785ba4689fc0ba270 +QIUTy = 029514f3873bbc3b9e217061f7a6261fdc6268685f9656f1d5eea472cc2db5a8c162e6e9 +ZIUT = 05e38079815477b8a79096ce339c4a255f8b213be74715ea61ef7dd0c0b5f161d9de7521 + +COUNT = 7 +QCAVSx = 05bfd2895a2e66366db7a83788c72bce48f79b5c9524a08ae273c78ceb39ae97559d5ac3 +QCAVSy = 04a2b0a55f80155a1a330fde6cb6d97eddb0a9dcb66c49b392904abe8b381f91090dbb21 +dIUT = 006649bfd641dabf1b9d499d4fb04beb099475d0aa15d5ef6848b734d2d413008b604308 +QIUTx = 008f6576d62affc71836d19adbbc3d504210f12efb61c42057824515290c502f2e09b6d8 +QIUTy = 0021643be87ae6e549b0d5fbb558c1303d14b1ccd77703ec74f9602f35ca8d7a5139bce7 +ZIUT = 0531ccf51d1096982f7c2ec513a92bf51c7ac5069cb15c5e2a053ceae7e5550908a19101 + +COUNT = 8 +QCAVSx = 063547f7570bd6959733c03d2e6c4c88971f314adcf28bc851dc52ed4e8c1a4ea06f8702 +QCAVSy = 0122d3773b0934e900fba7ebfe1ad5ed5bec0fb1a9ddcf4eeb61cbed040074313c0b3170 +dIUT = 0081860a653d6d94446d7766164ff92c6c5c1545c735304b3ad4d5178c8b14d0181e9471 +QIUTx = 06b68815bb83691d16749c4be16125e2a6d6dae94252739ba7bf0db0d50198ea2fe43ddf +QIUTy = 039e0d93018a46125620f6ffaca5a0668343c57025a60c31a9d6e51191cab338993b46b5 +ZIUT = 06ffe79d2b7664ee2d8303ffe0ceca8c49a581fcdb49c4af6a060ff204eea74f4cf39cef + +COUNT = 9 +QCAVSx = 009047f7d77397db70e39fe9e4ba9d97a995a7ee066ecf538179e937ac86cacdac510950 +QCAVSy = 007cd875167f06a2fb9a819e2cbdacefc16cae0eef2cbb0b2d49beae109db753c9506170 +dIUT = 002243e8919bd7a97cef0e9cde63c76d4e107150294fcf8dd7676451ca3bfa5c5edb964c +QIUTx = 03e439e3ebdfa7a23a9deb09de141905c653c4f202edf2cf5f09faef88ba3113701e49f0 +QIUTy = 071d071b86ed0f468fc6019de23fe4ba2cb3b50032be35e92d2e5af40de706ab524e82ab +ZIUT = 0311c430db78b6203e27b52988e1e9dae890c655dac4acefa7ee9612bec32e3e5f52be55 + +COUNT = 10 +QCAVSx = 04bdec19300c8afdeed86499d2703922df57b2ffec37e45c03a5e2909de3c333bd06a5e1 +QCAVSy = 01aa4f40844f2413f1fcbded003b1d15c9f1df7548de2a2bbf71b516657ad8d8c77cf72d +dIUT = 00512a42841e1227fc9fed51c2268731684136f225cfbf45648987e2453a7186f6a7edef +QIUTx = 022f76e5ab714fdf78571e84c2b6ea3a17f12999be483bc67e1b843d209bdfec0347a43e +QIUTy = 02eec1fc0e85f330c53dad7bff4862d8afff8aa14f94756e95b8f01fd7eeb8fc54527787 +ZIUT = 0701d92ed8687138014b4379f1c34677e1744f6ae8c89958a5962f14408d587b95472db3 + +COUNT = 11 +QCAVSx = 0611f53af4b488990e7a52e5c73856a1e74279bb0f36d3ab1989b2ccd99391b6c6b3a13d +QCAVSy = 054ea95a234f65897195bc97b03fa6d246ea5ab5f41da22c08ed817aa7c04adf372982b3 +dIUT = 002a8af497d1a3dac0732a393dedf75394a3f519ce07faed3f77dc0e669f3a1b1c6ddadb +QIUTx = 0571f0c87f88888ec0738961834021765cc4f5c8db2b1f9ea9b8fe9847f8964349fdc44f +QIUTy = 04ef7c8044a609694746ccaafe87fc7f9f1a78d00f8354f5da7ee2f5da7235ac1ad4b57c +ZIUT = 04f2301ed85a5c91c31a7fd125854904340a55e34976a20743bd33d95e476450f301ee62 + +COUNT = 12 +QCAVSx = 012706ec0a0e76425d8ab4e0d55930a4416e4dd0a1af6d97987252988da0ac9627577cbe +QCAVSy = 04215e8715129cc76301791701dc5fe1abcd672b6aa19ba4c7e532ee7a913eea60dbc9d0 +dIUT = 01de9fba4ab24d06e74ae5ad36ae195c2360c728eb38c50ef533329e70c5ae19f489b6d5 +QIUTx = 048d61e0b9b8064bcca8ce40d4f9e68b23684137726a44ea75c8f2f8850f0333fbe985e6 +QIUTy = 05fcaba38d51e2112b6b9f34e6779c10c0c559c3ecd156022966cf92a8c7f65020a79ebd +ZIUT = 0643900f337ed362815f181e0628ed5184dad3e66a1f030e947f116696312d835f7f6e7b + +COUNT = 13 +QCAVSx = 05bb20bea4fd85d0162689c550054001409b6c712d356a52f793d78aa2d8261a43c5b6de +QCAVSy = 031be5cafc8aaef19b861503413a7b73b60b37b0180493d82e9426f47b6587393d08de08 +dIUT = 015d3a222d5709cb339d93cd29650664f39bf3201c5d1e86d3aef8f795b9fddf47d8c4a8 +QIUTx = 01e2b88de3772b09c63d036e0dbba435246987497b6283dab8ccf1002486de0730277b43 +QIUTy = 03ce182b7f0cea21a06a1d4de8722cbfc59b9d9d79bc760b9d17d85671561aeaadd54941 +ZIUT = 063b1a3db331f91abd0af837db9d5f040620d1ddd7fccf8b58e0df43698351ea1942548e + +COUNT = 14 +QCAVSx = 010a3ca2435b135ffea08792b7f19b4ee181207c29be1ce1fdeacdb69a669f9cdde9181a +QCAVSy = 024908274b1e98c6d197ed2783c3c953c1b3b34fa43a8b2f5742584e37fea407269b43bf +dIUT = 0098c570666792efda65fc9e7909931158dfd4477be93332e493d69866b6602c4951de6f +QIUTx = 04dc6774fe46ab0ed2768d379e7564a37c6bb1dd1bfc555727ad94c20f4732cabf2a2c82 +QIUTy = 06c6cf0f421f91fca22b4871216a9f1fe3878f07914e96ae94ac770b6762f9dce08ffa2d +ZIUT = 0516da1d64bc4b25ce4763e6438257d62fb1ffdeae16d68701d63b603ad53e8587927669 + +COUNT = 15 +QCAVSx = 053a0dd6135e43a114e5000aec40ba2709b3a613730f1cc2006b446935e237bfccc394d8 +QCAVSy = 03b66ce6cf01507d462eeefff6211bd4c56070116c6907468f7c76fe01140bf0d5fb7b79 +dIUT = 00f4b6db4a87cdd30029cc3be89e40b9bcb014d010a91a252c56cb28671f354a804cb4d8 +QIUTx = 066ddf04831fd1c72bc48b709061c1aeaaad19c9da3d8c1506fa775d4f5a5412eee0286d +QIUTy = 03aa1d13146ff192792b74a5c64ad3150fae344fa830e0f44733d867f4e0ae053526c62b +ZIUT = 049c68c333b96705eee4a3def0d568b0d4faf24df2fc2f1bf40da0af0946240c38e97f74 + +COUNT = 16 +QCAVSx = 06d4a6f3e87b6d8c49cbe517a975d2ab8c6339135596d6b30cc65cc80c1284508f49789b +QCAVSy = 02963b356f2434ec249bcb6589ede4de36cecd3450e6f5e477bfcdc29ada4aef0f45ac53 +dIUT = 01ab82c5a62ae47ecbccf666cc3323b35128c52d17be11baf3bdb56006e5d568baad8bbc +QIUTx = 00a04ad7a583666a40437f968b02cac7946745b4ca949021c5443deb70183f88e1778fe0 +QIUTy = 02bb591c32f0db3430342f0e37c45449c293c54f6b7df6f797c0992c2829858b680f2bdc +ZIUT = 04dd44c1a30edac2e39a5bc9902625880a18516385c90a9cc6b94c4f111e0260863ccab2 + +COUNT = 17 +QCAVSx = 076452e19d7a10b885123d503f5d0433e163df134fffb8558f8ac26cfb30629f8cfb093e +QCAVSy = 06b3a24b2a4b077770d396bbf154af41eee3503573a6de9afe0f6d18b02fc9761ca1643d +dIUT = 001254af1791cc75694ce590bb518a770a750446171a30edd6c0382a17e6880a1aea5b81 +QIUTx = 02b766c993b398d2426a7a0a49e9d001079d0fc32197181c56eac1805e4f87c9df055dea +QIUTy = 036e7bbd3be9139d4d43a8655ef7d51a062d9947d1a48010ef1ea10eedeb27f0d1ffe765 +ZIUT = 0049c165339e9aeb2b516684b442921f1fef3091cf781e03fb3f56e93af1f3d6e500c81f + +COUNT = 18 +QCAVSx = 018e0bb7516d2c42e9dd96caaff5f20bfddf3e8623fc947d4d70491536790b8741cdd372 +QCAVSy = 032c0fffbda2fa863cb9d15c36545020d5bb24d930daf2fea4555f7c24d6aefbb2c01d92 +dIUT = 012017b9a0599fbf13cee10850a8f8bd06ccc00bd29ac6779f1bd93346b22c98327e0fa7 +QIUTx = 0421c62dcab54ba800eafac232fc730ce70f6d5cc53ff53d371269cf046daeaf451b33e7 +QIUTy = 03d635f55233da3c490a959c6e63a94fcdbe471fbfca19d2c5a3fd12b04db380c3c895cc +ZIUT = 0645d7f4c5479baff5bc0cba654a3dcfda56c0e9d19f50f9d8d8c6357c09a140effbf223 + +COUNT = 19 +QCAVSx = 024abb155e49124282ea32e5b544621ae9b513aa0476da3bddb75260d5f5fa2e7b898987 +QCAVSy = 01bdfb0a079a55bcfce1ca8bce3019cbcae6164003384166ebbb0bb733539565adc446f3 +dIUT = 004f197c85432cb42a1777249ae411ef4bb2657ba4bad35ae538635a151c8d6a564f9cca +QIUTx = 040c88924d5a24a853fae408aea5b3bc827d7315fbb58e6ea1f6a65677dd4c4d304bd75f +QIUTy = 054b82869ada4433f7208f8570f24f06cb64046e8ac086ac57d3707fc882c6352733dff6 +ZIUT = 028017c2a0240fd746ee72a0bcae1e53e05b7af254298094c381e735523854ea5fdd4f5c + +COUNT = 20 +QCAVSx = 07527512bc934938cc5240ce70ef65222db85c13c961c1f31f914205067d64b1a4c85314 +QCAVSy = 02aabdb81ffed2c001acbb4d0b7be539304e32e431e02df8b192ad74ed1b4b0606bfc90b +dIUT = 014e893483d1d8b7621cf48bd24bc8a1b95bb40a08c16c32874a652b59a2252139428dac +QIUTx = 01574e17ce26311c40abf3243f4889a2eae74a8341aa7838551056f4395b8f02bdc327be +QIUTy = 0086e59f985348f3f8d7953800b1d75e141521249c43fe0616913db5d1d4bd5400abce55 +ZIUT = 02603c00998deba52db12814b1f77b2120cbc1dca59009c0d6ea40dcbcabca32c50380d8 + +COUNT = 21 +QCAVSx = 07ec29da2f304ceba8d5e249eb6054a4e4f59534ee59d25c1dc0e12cc38f768b83daffee +QCAVSy = 0112c7d4a37fec842271a0a822d37637e6ed55190713001aefe11b06f7e1d34e00fcdecb +dIUT = 01eb6f6c91a880a5462185c6a700e8637b8f447d09d1b251460fe57f1bf462efddddaec0 +QIUTx = 031b3026104388374cfb7c7b4ef64211a47e20b9561a3bbca53516040b7bda2837309454 +QIUTy = 024f8aeb23a35e1c22225967c7911868c84efdd873dbbccbc763ead67e72a2324aa4c6f2 +ZIUT = 026a719bff31da4b4ebaed7bd043064f9c3930b5774c4a99809332c808aacba4b9e3733a + +COUNT = 22 +QCAVSx = 061ef59389edf8f8273a662a4195411e9448bb1b77fb0800be525eb5a6a03b19665719a9 +QCAVSy = 029686f8477fb5c769efb082cb3f1a0c79db55cb264e2112c0e779e7b558f70045816a10 +dIUT = 0147be4e38667e32a6a61ab980ced92e42695925b113c694a7960aedea2e1d571a42d3de +QIUTx = 06f599f0c149457a32f1a2ffabd4dff916259382912b6402b50cdf5c235fdd1b790e5eaf +QIUTy = 04ccf1d8a4bfeb77ff3290e65ac601ee5b97fc1b1869a2eb9f0b76277e8066c086776c40 +ZIUT = 048c48c993040619536f45482c494a39b32e75fe69e478ba06e376228b79eb83d3ff9168 + +COUNT = 23 +QCAVSx = 079d5760ee6ef978518bbce536b031c655a8acf5604497ba43de0beb6877a547c3edd458 +QCAVSy = 0421b3051dd36396d20ffcd7cf34fca022516dd4bffac73fc995ae9ea814ce0e4027f7c6 +dIUT = 01e1900be61adb7e55559d99a0b7d9354456f5151e2fd7b83c005b10b16004ebe876c068 +QIUTx = 042ecc99ff48b53f6619b484af8fa59b234a981c9c3e9107bbd1cdaacce81885d06e02a9 +QIUTy = 0183da0d7fee7f3e70e117f0e8a4a742cad10aefcdc4aab9bb31458237686afb4facf3a9 +ZIUT = 05d85b16bb2a0d32c73d1402838bdfa512d744fa88c74d3d90cf714c2480e03363d5c6ec + +COUNT = 24 +QCAVSx = 024784d3d3d5e8021ffed8a2709a9f54d5395d98fa442a655a05dd94262b603596f8bff1 +QCAVSy = 03e8e39e08cce55e1bed2dfe0d2f8c141b06401dba037ecb384744930c8178d146416324 +dIUT = 0077e41ab2d09c34c588abc76d4312602e71f60019027b986e0ded372535c2b6a933a533 +QIUTx = 02923323f170074222d3a6a287adafd3d1fe12715d57b91b1ff476a2b4fcc385de261ecc +QIUTy = 04cc498d67c6267cc7c4c2d40a56cdc2a6e715edd8b2a9614eeb33d0b6fd162cbb85a714 +ZIUT = 066abb838b5f12b6fc15ceb745600686bc2d5773e53469c2ee920cfba5459a1cab20d153 + + +[K-409] + +COUNT = 0 +QCAVSx = 0177f736f6116320cafbb5b4dec202d40508182fe011189b81e1f3998f5408607a46bb150ac47bcaaafde47b8a7b72f478bc22d2 +QCAVSy = 01df4ef4b37e0124e55b67f3586de24a88a6c5d98854007d4b0c4b4ccd68d51fafa7638bbe555d60b74def217c6a63c5b4068fb7 +dIUT = 00084b711e3c60822e70fa6828b5abfb0e448888b35b0c8bb09f806616dc1ecf22dd86237d937c1bfde62b75ae655953fc6b2f7e +QIUTx = 0068a3f8b12e02d10e2f52095526bc4048b8f6ac3a84531772870789938f1aeff813e05e509ea9587d2b7e4aa14344bac3ec46f0 +QIUTy = 00d1ceb40c7d5f3297e2955f0f3eb1422b3e6bbbfbf7eb518b9c17ae8d40feb84aaf36f5e5bd96075b2b4dbe538ac011962ac705 +ZIUT = 0176bc5c4036ce5125493a58dd265f04d190f028366f7799f70aedf29ac67b5b37c37238593377a47944f5b639f43856dbd560ec + +COUNT = 1 +QCAVSx = 010c4c68a9f1a62a326556b6d977a79cd9c4476c05b1add4a2cfd3068249a3c3923822428d352c5d74e5d64acceedbdaa6efbe4c +QCAVSy = 00866ae940dd31b5e6e3f20b3b4d87a6a02c78173c80aa510a6edff852c629e6064df5d7c600fd98e58e8e8c662bb4b96c8ba905 +dIUT = 0065188bb7796e451f44727a1a0674440dd33d258ad2fdc7b98faf64b11e7e8ce5e8c21e799f1ff2fd29d4c94aa158962068a59f +QIUTx = 0032c5768452f3c1f3bc54879379ad420891267742b37fb096ee7b8c21ceed0041e9470cec3bedcb799e90bdbb31192083ff0344 +QIUTy = 00f9c6122927fb824246d1dc1ce0fde71a6849a82d41065da1d85256a9b1979bf7f286366fc8b324893ebe34e59c046007399414 +ZIUT = 00575d9e7f70a4a1c5c807b6b5d6b7330bdd764db2aa60f3bfe497e6bfe90f038fb4f6acf7ac06efc3d157c3dc907b2ae093c6a2 + +COUNT = 2 +QCAVSx = 01e4d580d5e9ad81671c6cd662d5569bafe4d75aa4f449aed56bd800619520c9f32c4e230c4d91b1c411f9086d5291ba137014a2 +QCAVSy = 000c8ffb42392ff397bbd467972f3ed251d5a079965da0b1d2a3cc16c31d255dce9886937b2dc941eab0d8be8bbcd15aa6ed96d6 +dIUT = 006cb17c3fc21ab48e5c3717c791118d4761e2c51986bf147942554dc5a18bf9bb6c67bdbba908a1e8ba8e7790f59a397134f683 +QIUTx = 002b890418afc5797c9746a44ca059367ae0663bcf058156860c613ee05e11da3f2f799c70a68fe72fd5dac2469daa18107029de +QIUTy = 01356904b197bf9e0657f4349d252bbb375c66206fc0d8312599bdbefee8608ec948dce486807baa535ed06adac9c797634711ab +ZIUT = 00ce87aa5e7700384df59d3f1075d282c1aa511391c42ef609b8de1264eca8f7737df91565c73ee884ea882d47c56d979141f0f2 + +COUNT = 3 +QCAVSx = 00b7d19354cadcc94708267aed8b23e484e32a03814b026a800f5ba01e9204c43052e4d47c6fcd92329654e0e9015b012f79344a +QCAVSy = 017995c15796c5ae93e0a207a2707004fbb1a49a0d47fd404f12d57849d8397cd4d2c6d2b4b90f864403d4acd16a32b7ff4877b4 +dIUT = 0011d43bc08da9ce5defc94b4ef90d9324de080347ff4df86645d325603a2dffd28ecaf0775ec53caf5a554eaf8b68487df88654 +QIUTx = 01257b6abd470d294b59ddaedacd545dcf43808af890f576288803342fc61eb396f560af74342e10bb94d224c24d8e5900e5b972 +QIUTy = 01dccad97ecef4387a1cf512b16dd5bc7ab615fbc5087ac19d5fc2762f615b4904ea39343bbb185db64a19f7f70ecf0d557b15e8 +ZIUT = 00691dd6b5177702d6a0b1f8b07f3b018478680de7ee079272ff75659335c96afcea7650caa01f996aa37946b78e14a83e579fb4 + +COUNT = 4 +QCAVSx = 00f2a11ccd3a53c95ea98f3144fb77d4a684f9a1f423eb81e3a8bfbe22b680f21870f58caeb6946c6b3b873699cffd314063f408 +QCAVSy = 00fdf26eede6cba7248240720906ce076cc4322d18bc7683d2240ba68476ce79022780b2fa54e0f7c76528b77fa631fe5abb5b95 +dIUT = 000d6b259656d526777dedb5246a192f0c05c7270a3b4e64a9d6c877cd06d2962a1ac84ec2d89765f967f6044f2dfa56903107f3 +QIUTx = 0193afa13bd1e081cee5df1286fe44a293b7d1b10c290a5f2ae7be2d02736009a26d83aaaa9017a8c8bf60efa15fcead07767d48 +QIUTy = 01d02fd66a7806c4c8445fa615254ff32bb9c1d85a3904f939c1061e250d3eb6413130a2a5570994795310e96dc3aff3b8218ad3 +ZIUT = 0136f5c04cf9a56db24ad99bd286feb800aea38d44f819be1c2a9dba15c635c4e122893570233a4c5754a41499eafa39a35aa57e + +COUNT = 5 +QCAVSx = 0117449fbea6b2d5f4e8e4d39a7228424cf06f456bf3ae39bc1fb2a99e4183b716e194fc507465664d009d5bcee3a426ba932c10 +QCAVSy = 01146d32b70f09e65fcf69eb9ae66162d10bd04369de8e8187fa9c3d1b5dda26f10b469cd4925ca37e0994415757e6895e588145 +dIUT = 004bf7351b195875d01f6306ca127db8a1a5f597719c0d10e1d68f5d4855bf07605790691fcd0d8b5db137d3fc2679de75a06781 +QIUTx = 01d386645aaa48e2fd0950e6a9ace9dff62c8f5e94cdba45bd73c6be6bf7b763a2c9a807846312da3ab821c049ac0861f82337f0 +QIUTy = 002a6436ef8a1261aecc38c821da774a391fdcc7750c9437d9dfe64c823350813999f0fd4f07f1d6d98074098612bc52044249d4 +ZIUT = 004f684f9d559d16485f0023bf012006265ed81f06fbc1441334a559e5500a3f77603565013694023e0d8f44fd12dcf69eb8d654 + +COUNT = 6 +QCAVSx = 0119980f11149dee5e2c2d00561d3c26a42a5a44e874765ddda4d818ea704edbba23abed5e08be92d655d79e55c5bc54787b4dd4 +QCAVSy = 01366b3dda3e9879c4481ddc367e51c1c0541945964636d5021687c285c47d40e79ff7f0bb56a93ac560be8dcb970f58b23b10a7 +dIUT = 0069da659010345c6900fdecb31df9babedbe4253398290b34012fb134bc59147572e62a60f5cacced87b0f8d1ff7c049dfe9692 +QIUTx = 0038687019f7c219ddd9567b20f5ea1e8a50451dd40bf5b65f7b2e133de6f36e4a3f8fa2f977efe920f845d176c8a57023cc55c2 +QIUTy = 0149397fbc42bacf85c59e04535df1d52715761eea997d4ff87204866cdc3d4a54c2425ad214a7a0dd592f4a991ab768c8f404be +ZIUT = 00137894f637460a63576824536944cddb42dfe63169c84040a0345ad7516ec4f1ad00bb4de20ea6ea43824b9b0f74dfa6881cfc + +COUNT = 7 +QCAVSx = 01fa39b5d3375d43247ac9500061ebff7a0c15b8c5dfe9c751784386c981860de6e1b9584da0f42119417f32338290910a9a259e +QCAVSy = 002bdecd502ba64a6f21d08fa4250389d4270324456e9441657495c72ad760fb348325f89b7a5404a2c21c2aa07711bcf5f30412 +dIUT = 0006dfdab3ca1b2a2821cefdb5872bb95f023161ae4e2d549d0fb1f382563413584491657db101c323514832c363f636a9e69e83 +QIUTx = 003e9a9b5f282066e233870dcb00c4aed2d73a331f79d49c8d5c2d93908b0ef5e72b748814d1b8840642d75b7a9a55301b1e7c82 +QIUTy = 01085f57691e04afac6e884e2fdbd8df802f4d435bce611231ab3274761ead5e2e6a344a53f33c0fa156e3132062f72bcda3fc0c +ZIUT = 00f03b0b43a351311689eb1d3fc457013f294a7d02ad850c72e4ff9b64ce68a47beb49bc5bcbdc828534f8c8a5e13de5fe522eb0 + +COUNT = 8 +QCAVSx = 01b255d5bb75d25970301de9e0e3959a12205d511f8e64f042a01c950db471b1d6d5847f75669eeb0bf187f1559db3b22aeec096 +QCAVSy = 017e590cfa855349136198c2ddd8a5210882473c9dd591c02e202ca0404bbc9f6391d73ae011dac9965155d2650139fe2e54ec67 +dIUT = 0029b2fcb308596a975c5b4cd1e75267c5424e00774114ec2051a571b299766189fad24e92f96e3d527736ea480367bdbdd0530e +QIUTx = 014c757399be201e08afd8b4a671e7d3b6d7f8844498ab592e1bf69315347ce82dbd785d45922660d4d0d27fa2b0ac62e707fcec +QIUTy = 0098f0773d3efe9c290a992eca05875d3463f0736b2dfef4affd9ff00f96ade53399917dea074c798fc535738f0c5689a2447f86 +ZIUT = 018f55b81f15f862aed042f37433050ac61718c9939d432b2a20e12d647f99753b8dd5127cf8963247fe7e1d5ade1442229bc646 + +COUNT = 9 +QCAVSx = 00ecf7064f528fadae380cb382984811047a0d7dd9a8de8e76f8178aa60069e77a948acfa74d2c77a76851659a98197054da8d44 +QCAVSy = 00b98e13497f776072711c42c18dbfc8eb8c8523ff633af988a1f242ed3c3c565d18cf224f8751f2942e360ba16e0f5830952919 +dIUT = 001b98015c0202ea16417971a37304250839bd6a6e5d83497f7f93f0f7472a21fce4be5be776e90959dbc41a0e85ed225837e8d5 +QIUTx = 01fec09f94571614e7cd8e958ebcd7a2fcd8c248d408cdba359630545c31383922774d3b24e20591d8b41e954e16654fe85cbaca +QIUTy = 0031e0eb1dd1ce467a8b78d10d25b9de92cfdc2773831e6e28a152d02ae2a5a510994cc010462254441ea41121c0677fb4178bda +ZIUT = 002b560d1949297dc7e1bbe8ce49a595762924afcf0271e9c493c18ad5cbfcea5f3900c7b793ae5dd44f48884b0bc3b52c66e05a + +COUNT = 10 +QCAVSx = 004e05c34dac44e6e1b08cdfae6357c20db7a544dc253dff1c23d4dba871b96781b6a61638d73865dafe0a9443c3ec328857d23e +QCAVSy = 01226c427778bb224624cd215493d7a4f32a4f141979236409505d8cf58d81dfd3c793e59543a780314f3cd8ee17664dc2e4639e +dIUT = 00473bcecb137711e5e89763a40f77dbe2ea8c2509d209064e39cf905afaa901085f8e795c9b8017c9a5d0a1b96812c124a3ffbf +QIUTx = 01c8e9adc4816e6606ffff5e1a7d48a7854c35aaf055d31833f0cabde8bbc4d2458e3cd3c82a4af80745f595b3ba12f8b5c0ce90 +QIUTy = 00fc43f193b5589aee62985735e3628374dd45a86a61baaf78c21fa6e787856ea6b8b88316540571825865ce6b8578add5faa69f +ZIUT = 000b43cb539bb4bb42f195ffdbcdeb482b69301c0155a840cd381f55c465a8e57ec51d6555871537b56bf84a1544cae2b2b8eb38 + +COUNT = 11 +QCAVSx = 016f6960fd2357d2f70b5f778be5e0aa71556b9d2f4cceb14f7812da858ab872818b4610d41a8f66200b4343422227d9fddf712e +QCAVSy = 00aaf592a725e7738388896b9be9f78c1c3d6972b9f99034d02cc0f9776a9f6c2f9b7d501f75be18599b088c4c5881c66146e5b9 +dIUT = 0020dddd67134a418378baa0ddfc9111c0a2ed492b289569dd0061bf1226d235bdaa5203d3efa2bd0141d2ace27c3ae8e6daf11f +QIUTx = 0167d577b2a43cc1a7d88a6be883c28dbf48c3e1fbf21ad83e7a7e3d753fb0b6d3f80cd1376fd98be260f494757cdc063256d5b2 +QIUTy = 015ed7003b7d2bd5e0359303660add090049039cf7df396989ea18c702f704c45cf6fde7ad072d31253d1d5295e9c5d1d5c62c3b +ZIUT = 0113dd2cf8732ceb8a893e149f13d52026e5d829322d0f1233a624fd6b74d56e7e6374d70942a25152ce5073831660333fb3e070 + +COUNT = 12 +QCAVSx = 00f549c47dc8e92fecd38b5750895880e449f1e31abe0bb1eacc84298f836108e5a308ccb9578dcbd4be6177752eb231e78f011c +QCAVSy = 0093663ec3fcb54d676897bfc95db5e54ad6eea1ec7b46ca4bf3d2535839f101cb3e6d5f11b6a36bf40363c31c9f88137862674f +dIUT = 00607a5a6532177b52f23492717dd0a7b2af98e04884f77075e4604410c5044a08461ecf37c4efa3edc2cb667c84b86415936b70 +QIUTx = 000a5677ac6c00d2646054dbebfc536db0a9b351a2408a73e083ad62d182fb87cb80322c539553ecdbc213ce84c66ddf8dc1d234 +QIUTy = 01327a0a3769240fda45f94bb07361c74aa8c8d119414a7b5666e25a3ab6881975396325a77f541a1ba268012a82c5110d2a49e2 +ZIUT = 00c8e62ac25c11e86b98642e4ec7adde9d9436f9337369fb065abc9ea784f90b8b8bebae35da92185486191dd9f49370b1148ce6 + +COUNT = 13 +QCAVSx = 00411e5d4c96e35de9b541da5fac691336462c882d8e8ce4d6eb7121417e70950c4d9502f64565d5a6cfa735c90eef83c7b861e2 +QCAVSy = 0096b904e37ca1c2db59a54615627e1c3356160fe175284aadc3b2fa06ba0b30aaa07c84e64e48652e5feb303595066e0f8468f7 +dIUT = 0034da9a453711f04a0b1ea1b9af701e0dc3a55cdd585e43e3ecf41e934ecaf880ff1614dce5cc992a69addfc408dae1b09b8d05 +QIUTx = 01f7bff435547a89516d017d1bdac4cda36041a0d3dfd03258562b2e28f40cd64f6ae2b70457773f9675cffc40c021e4702b08d6 +QIUTy = 0013c59a72f0c83f5bb90a0bfee798952fb91ee329c98c4b5914f445ae7c8483767052b5f529974621545ddcd6377f5e387d573c +ZIUT = 012505746f1a40ef75f950595211ce04f87f1daffffdf8c12600a9e2994c8c1d8b19c0e0559adf9a94762cb983569de6d0d8baca + +COUNT = 14 +QCAVSx = 000fa8243f000a3398808a1f88ffc5a342968fee5c7b26a9e1ffa26efa885e74e1c562027d95db08cc15bd25a3fc11ab4dc13ca2 +QCAVSy = 00fed687c7197ff1aeb980e72a3a7c318142052c2389b0866db3b87e5c8025e79bb4f4f996fa6352ab9cb20172ef78d6ffca906f +dIUT = 003141afbba8b4d9f0cbe8297f365873196739465e3e20a89af9fdf8b01d195aa1052e6176b5fad856136b6b320eebfc08c1cd01 +QIUTx = 01805ffc576e8a45f06297b2335d03abc8adfd15ad37e76d80d3b4180d5f72efc90f3f2b036acd817f40fd49064aa25ea383c82e +QIUTy = 01f22da6b50ac5628943f05b141493cacc0f02bcdf3bffdb43582343b68615761a180bd7d1ab1ddc15f5374a8f665d13b4b91272 +ZIUT = 019a71ab576546e2351aa92b6075e8229813e6a2cb3647147b192b4597f1217223e7197d846c0d65ea0d4aa4c503bd000ba312ba + +COUNT = 15 +QCAVSx = 00be7d58043263ab2f42252d41b582d862c2b243ce18576081bd6edd2f63f0164f365cae67268d227f3944677e1c146af864b8ae +QCAVSy = 01a4bcbc6416d86597a148ca4d610ee656a00026ce6047bd9fbd40d89530196a4693ae595d69956503b9d2ab4aabe7c958a14c69 +dIUT = 004e517796cac9d7c75316eb5e68963fe6324781fab986e940200e711ddbf9882d99a620a976352e2496748cfb61dccbf6d659cc +QIUTx = 0056a452fb1d558079c3e91bf22f86884ca89788806fe7d6d6ca40b5485079d77dc43e466a71259792c65ff6ab7204066c0e67a8 +QIUTy = 01f29b723d9f7d4de6ccc2f9708079c5d30ae5d960e62a7c4f6dc98bfc95b4f531f197c39486705432594203c25147156dfd5b5c +ZIUT = 014f4b7ea93c9dd846d2228c2b6a8dfe616057232b7af845a570cb6cacf9feef2d8ef4fafb285b38e63cce0a09b4d82dbe43a390 + +COUNT = 16 +QCAVSx = 011fea58d9e36cf8ed4ef3b42f77ccea93bf542ac92141dc2c094061985f3df786d192a57bee072550b302583f0f9428301b1b76 +QCAVSy = 01b3dcc1b8a3545264427386329eb81fe992654040694781c0d8b27c1e49442b99bab93ef9666fea14d4843ee4bc5b045ac50c11 +dIUT = 001c80b64d51e8025699e7be2c4b983cfa4b7e91b112e2eca5f9d0cb7e3d4f85aff7b33a921eaa124cb7002eab62973d65e16bc9 +QIUTx = 01fd0e4eafb26c08c9f8e747d4991f468c76b4864166e37642b583db285a4bc4c33979917d9129a91cb0a75c1aee7cd4fbab73ce +QIUTy = 00468efabcf448fcce821f3de81e994d79a7d99ea989ac81fa135f7ac88b154c767909c681f7e48c00b2e66bbaeb8f8688f44672 +ZIUT = 001fe2ed30ad4143c5eeb0b7622e6aa49e4e4d51c1ddc467b3fc54215dae931be0b6b6443e716895acb6570cdc21fcbdae46e5d6 + +COUNT = 17 +QCAVSx = 00ca809340bd13354b6071d073e65b9b0d2bac82e22abfcac7e70afd9d224852f0e212976e5ec823eb8950e02bc759ecf56f79a8 +QCAVSy = 0031281e8976401aab58fa8eaf8636feb013170bcab5781be0a28d27339e9470e166c7f685f2ea9143310dca1b3ab8e1c8e60592 +dIUT = 0043c96c32cf648b036112421adbaa925cd54175abad39e5681bfc9eb4b1b649aec1c876ec1ec4610f1b3b06514a48e6ea7a4a25 +QIUTx = 00de181e81b9e7776d474694a2d124d0b876d9548f20ee3386304945d9131f90457d9b938df098b035bedaaf80ed6d979404fc70 +QIUTy = 0181a3516dbea9da97d6ececdb10f96d54469d273ab366e89a40fdcedcf1bda837d5c14bd10c0b6a2a9c8a47810125c764dd35ef +ZIUT = 01610efb48fd22261921f7484ed6382fceb6bdf28f3bc2340a175b7971b93ed5ff357ed55e5307bbf42e40a5b3fabdaed0ce19a2 + +COUNT = 18 +QCAVSx = 0074795b0a9ca070491fb54a3bc249981defbec037e4040f76656428b1538b978503f81f80ad9ef97c5e127ba51ec040584b9a20 +QCAVSy = 003ece27f3daefe7bdffdfa727b2af95af8591af946cddfe37e85643b8d179ca8b9529106f9c5f3a95a8819225f9d7d4a730fd22 +dIUT = 003636854b8ee0254bb2d0ebedc720b66b20129a21f1a4fe39118cfdd4d137dbe5e570ebe2c48a7f9ac21cff3e5adf47434697db +QIUTx = 01efc0cd1a86ce7544f25f44e63a0913c11fd6b08bc09ad8cd82f3af7e32a7a7ecacd56e25526589313879d4a7fd4382d4114e4a +QIUTy = 005a34ef7403599c2f83f3e83299524893f2418ff95d6c2fdc0a3db970e62fddcf4cda182aa78b54fd8c2e818fb1ee2dd2776763 +ZIUT = 008d990982aac8d5371b867de21e09064fef30e73321337dc24f19ad5ddb6c4ad217136b7c61e360a73fa7571d526c8f514a06d4 + +COUNT = 19 +QCAVSx = 011eb64ed4249e1195b2d1307a35a514d66d29ba6f9044f9c02b4b2d3cb3e3d4c0cdc5489cddfb96226c9ce3e36fb8ff2eef208c +QCAVSy = 0099880b0d0d43c5c579ad77ddae68f2c917f4b062ea8d777b9cdf465cbb59107e70992714e8cbfac76296d5ede99c48d38a8973 +dIUT = 004998a062a32170bb358954d2c2496da886200827fa13566836ae26e38d51926ca3d202589f7bfa27ea22d399973db6f9fde9f4 +QIUTx = 00f71590b04290b5f3cd9ba0e394a3be5a1514f45e53497f6cdedbf839728e0288135d769e4b28932c875823fe256e891997c476 +QIUTy = 009d16ba726a5a9e09103bc94a09d8079ac8edf23410c8469f79f55f3355cfb3ad703624ec6d75eceae3881da20903c71de1f5ac +ZIUT = 0155dc98729c8c1bc65eb8a3ec09135f46bfa313bf56aa3169e312db8991abda338f8ac7a75bce42884068efb7e6e625939d2b88 + +COUNT = 20 +QCAVSx = 00a15e96a776eadb8f8a0b61360335cb5017d7d97116489341e995157f1adf178e5628bad3e830bee54433119164886db5c34654 +QCAVSy = 00551ca5605e4ae0534534a0ab343d039a3ba7a1cce832c4d65e26bae7ab8e5f9c74b3d421a528e559778ab27b59aae1a916d4eb +dIUT = 005a3f805fe3c3266feb3e0bb7da6761bb117618bc57af357b53f199e6e4cbc1281975321403ea6de618ec32e86b8ca1e10d7c43 +QIUTx = 01ae460e1248504d33d67ed750f1d618e53728d55e390dfc18d94b56dbb3d3c0bdc96c92ca1eca9f44fb8a58cf36dcfcc0588cbe +QIUTy = 00f7011fc321ef6258dcfc1fdc2c0a4e54c86ec939bc9ceca6c291750c1ff540b34a418793842a2c5cab6061dbbe9b5be3fa6115 +ZIUT = 0109e85c684d027a625ec5e6df952e2f20a14ed5b092d1b1b38435251303844d230fffc53d84b923555e1e1cbebe20b5d68c3bc6 + +COUNT = 21 +QCAVSx = 016427e72bc57d26a910a6722eac2c78fba8abffccbc11a9f8377bfe213ed9ad64bde2ae8687f8ff1dfdb29b5dcecd02269828c2 +QCAVSy = 00ad4f9abc21da0d31f19659cd3b0c185581436ac08b15c0b48a7ac39eed03e0ee97e164cfaa5abc774412cbfff94a9ea2a9636a +dIUT = 0055901e9b6586b7f3372660ebcfe90249900c902d7c632a8d17fae21d3fde3037325b5775eac5a174a1ee2b3ff2bc5ce69d8cc1 +QIUTx = 00ba952233531b6a6c7ade6f338d24fc65777b5d305297e66d32cb1bc506c5bca2287d3acd33fe19653d6c88a06eca3712ce9caa +QIUTy = 00716beb14f02233630f34603e309bf6e2572f0b791dfa4c582af6a37abcdd64e8d785a95ddff59bbc6fbe1b7fc735725efcf0ba +ZIUT = 01ae814e02c4684c21dd7e58a65ec51ec68c37e59e299ce65608186c0acce08e41c8320b1941a611fe66b1921b558d7f402d0eb0 + +COUNT = 22 +QCAVSx = 012e89dccdf975851accf0294cf4bde1259c907a6d3acef69f1939b558c4d211522e4eaac613e3ac8491c93deb6d344a9f87acbe +QCAVSy = 01a52608ead09d2db123a0dc782ab20ddb793d5bb70ac95c58e62146beb62bb668fd57f92038e4585cde1f91ee8c52526afeb1b5 +dIUT = 00044ae43bd247e75afa7bd8dc28e75bdb9ddd99df56668c831454dc28f3e9a44ecfd47ba8420a286f1ef372fd29b365df9b82f1 +QIUTx = 00202694f378d70965d42828ad5f37137bf8b63cec2c0d158e5ba94cab1f8e61e5a300986ba349b3adf3efc05e65670af88cd3d6 +QIUTy = 00baf0da4aedb972f88a215dfbff64e4290fadc25da3f0d83f35e65bc4177d3025d71d8eeb9c41470f3c719e00ef1fb7552e6a89 +ZIUT = 0140e7db3f6415d884822ccc7316a329dfed177b76c0117abd722feca889bee4e14e65d26c6cc935c0e94205f05fc1a7abfb0348 + +COUNT = 23 +QCAVSx = 00aba93ae1d1552880b31f503fc4be9f91d10247f14c816015ffb2bad29ab8180e7b50a27144e01c21e63c3dafcd251308bac768 +QCAVSy = 00e4ab66e514bd02abeae1c7123788a692584ddb4a909a217fb35de66588233dadef7036ff9d9f24eba3772e2fa3037bbae63cfe +dIUT = 0056d73730753ada70fd801c749c2f1f1a61ef5bd6ecb796a9e15efe9bbe6158f669542787350f4d643bda6f3e8c6423b817b530 +QIUTx = 0025a06b71a0ae252f2f905221983ebfce21ad96121a5c0dcc5ef0d0fec301ec77ef4b915818fedcda7f3fd733c7f9e529079cb6 +QIUTy = 00026890d5303b619c7f81f60fb82b26b0b98d8f24c45cab41a44eeb3a3a312944e889b4035e04360b305043e30d0cb9041a89de +ZIUT = 002ec4deac3e83d60ad39969f2f93b49f31875831ecd51ea5c37ca48de081c0c8cc660edc53a222f3043447f9cb752763be7494a + +COUNT = 24 +QCAVSx = 00aa4eb898443cce3ed2c072d858775ac221c24e33eca6f31579663544bb33a4a068a86d13f167b65304c5f7f25f895f65b2f428 +QCAVSy = 0083cded30211b66f1adf17318b6de50d7724c0584995e068b724703ae08ed71a32b334987a7b31d6c2637152917327d37accd33 +dIUT = 0062b026d49720660cf6a4f569be98dfa108c8eba08234ae9a87f3c88b6c65934b996815322a16f9aabed13317bf7725bea5808e +QIUTx = 000f52925394cb52bc330e06390c0c0a2e10ed9797149fbcc88d80fbcaec173e24a05daef98401d5e47f3b765bedbb8246312856 +QIUTy = 013d99c1710805d5fc7db7259ac9e134b411d00d73fb0762e3d211cdc56bf7f714512d04a630c8732551ee734287476cf511e836 +ZIUT = 01c9cc05d19f96c4d233039cfbc43ab68d657bb507f46a353091fe98fc0f422a8e7593c195d326977a2be6bbd2cb44eb1fe81650 + + +[K-571] + +COUNT = 0 +QCAVSx = 03106a5c1d923a0990ea8c6008c36c366b53e5622b98464044741fbc7840284db8bbf602866c30ccbf5f9b7e59cc1d9bfcc5b970fa624da9b15f6cb336f5dda7e6b9924d5dce4543 +QCAVSy = 005c5c7bbd5a789ac4c6283deb0d0d37c4852baa57d6bc2b0ac6337feb09704c44d1b385b70cc394fa235d83e6e7111787e57d0902c0cb132a190a6e62f398511c0c2c4cd50d4570 +dIUT = 0173cd1631e18ece01b73b3572ffaa7495c4bc81f4078ae50d69cb1e338acf13469117112921166ddf2d29f3a9f8e10c67e88c9a99203a834565be76ac59126436739a6afa029cc5 +QIUTx = 03fbfbbcfba609157f68a23126d805f7c75efb19befb595e3a975e08ff46bd34c8b87b9645c0e86ea0ad915465d5c856c69bb9b722b0d17bf97ad95c4602dea17c6b512054cb22d8 +QIUTy = 071c16df71e1b71b4bd3d9938827d3959093b9db1ff86bed73944a42dcb67cc33102e28c1d0e9804a6450656f4bf33ad72ecf7bb83bd282cde4bc15d4e48064aa8ad2f02979f5f3f +ZIUT = 003198a6b5d6cce847e24348a6a6ceff7a89ed3794d7acedc4e858c80ad04a74dbc02c7038e05ab26b2a299ec92ee0d2c7e66a81872a5157fbc5d4d37ad598d6ddee995ed28a2d74 + +COUNT = 1 +QCAVSx = 0211223c4b729b206be01f8085a997e1dde5cdb27c048925a27369bcca6a3e2fbfc65637f1eceb133be749679a17b1ce58821f46bd1844a89cf0042c8043cb105e01a3fc948d2663 +QCAVSy = 02b1ec2e6e2c2375b464b0a502c5053b5b348bd08178c72c603105d0468196a4695dc267d6e109f1b1274453b6eff14ddf3783969e8825648debc216afff9258f644d77ecd9911cf +dIUT = 00937edb3aa29563d2248591c9fb448985095f913a7458315593cfce87e68fb0f1a525b7310a101176e34d45c1004538954e2044543817cab0d563df6cb0d5e8617bbba150e755e1 +QIUTx = 02363cc5624b06df1956befa597d4c757cc2b1001a3e1544d24408290f694877455ba92e56088462f0ffacbd393cf835b56b7046a15d4b724dc6c3573cb156c0df298aa8b1255cb8 +QIUTy = 0409f773b98d5edc2734d835953281b82ac0e15d902d887a7c6ba75629a37671b101d18ddfdc4193d98b18551414c49173004530f7976d27c273a73ddbb898fcb5fade9c0bb7883f +ZIUT = 00577147459262e5ad42f222827f20ed574b2118924205bcdbd339ce20cfb085d072fd70f4ca1f5768fafaeb5710f7ccbea4fc2ae5377b0cff20a889a2201739139bf788a9bf2d7d + +COUNT = 2 +QCAVSx = 004d48be599ebb1ed602472d7a87f4cd2080f44ec28855fecc3a9cdde25551787abd27cc1da7e77817e94c9c0289c005a0e36e3bcfb0d381e8cc9684b6f7dd05177f16f63f8721ca +QCAVSy = 062cf71af0a2f8e35c4d7f9312bd34a846a380f63f0dc7294c18877103357e20d1f0eeff312a993deb2a1ecfc80aea06a5b71e4f8b9cefaebcd32626919064f88af416d86e3e7af3 +dIUT = 0034099b0773f021ee0d3dd185c704b5158a94328daa09768fad5804df1da2fc067190cf1028c30237bf2a48da13abae35a25c3e6387d3993f9b568305b8bf0818ff527dd8205df4 +QIUTx = 0674dcc4f755c44fdabdc078488107bb64a460ba932c7e185484ccd27fa870031107e9955204b0630b9b4d3608d9aa931d7c766cc2e45878eb6d8cd96bdf711b2fe8b47b8d233ed5 +QIUTy = 05d96be6b7e2ba74c8032af19ca2f2b39d2fd4e8c89b156b6b25c2ea4f71f74a02ca7da2a463acd7605d5350fd16a9c9052534e7e81d648e4060a2b01c459c260cb6567da1fc5314 +ZIUT = 014662b261d0bc2168642bfa4f80c4b3fe8176f604ad3703f443ec7aaa3dcf3c5465b869a8fcea60b8f55ce7118806c5d28a04848bd961db0061209b59bc02979acce9324d7c0c31 + +COUNT = 3 +QCAVSx = 06bf252e62c9969171a9717671da0f7032e9520a497ec831f4dc776ac87e0194af99546c41d08048ea06da9235cf1369c3ea53e6b8cbb7a7fd4296354548d44edf463f77ad341b02 +QCAVSy = 0294d5f7e736dcd8990198e4e0f0b398b8ac6a87764af601596234a2e162c9c667e47eb3d987efbaeb03b5e3699a38ef953c74fb28fd7d8a4ec5a36319ccc44a19aa88201ddacbf8 +dIUT = 001547438df76fcb5e2ae6925845bbfb03b4fbe8255616ec7fbd97b48f112692219f4f1275e6d2453d5bcf3bac4106f0161b8119f487d88b5f8c8e08b3aa17b83fe01102d76392d3 +QIUTx = 0427e2dc11ee5223bd9c3d9418c79114682f91dda06e7d88c339a7e56e0dfb636b6e63fde8a381146ecb705ca202d2b73df408451763c5166066a97ff4e4f32f0b4cc942344b0b2d +QIUTy = 0760c8a388e2eea27ef6838c7d45052e38cbee2096cbe89f774774134076658df90c62c7dc0e3fde995d7a99090993009ab6c535677dbdb376f183eb5092d2cb6a8837b6bea35dcd +ZIUT = 051ec4db0622b7b1c798366453c70f959376ea3942aed2e931ff62a4019eb12ba5ff119214c8bfd8bdb66e62b562400f2d3d48a84b1b3baad3667f735ad4d0f183bdb91aaedcf1f1 + +COUNT = 4 +QCAVSx = 05701e63b01c16c4eb19938265ba134cac7316278e2f1eb40a04775448bded97e7a37d01fed8a4e0b43ff4dba21a47759ccd45bf9671dd22eec65b4aff8b8db89dfe3e490c0ac9d6 +QCAVSy = 02dd97b6415aee2b01cfeb3cd2a03578abfed9ca87be9a26d899595a87bcbd972748fa6a0be4eb557e69c6d28e2bba1580dc74e2751d7ccd918c46b4be6875a4e4c290d959c23c12 +dIUT = 00c7b4252ca9b192c5feaa9a210fd84e2e48320271f10f67ea9eb30b0de8086d59dae04259fd12b086d890e22d45d27d7c8455dcf7ada796e35e3a3138342cc736bc3ed3781c4119 +QIUTx = 0325623838e8b18d81b68060734254eb02b8ebb2264556fc9850c36d3035449aa764f351dbaf7bbca9b9adb11f27cc88a1ac6fb71aa10ef8d0d09392b0ca7eaa7a5cc14078cc18bb +QIUTy = 0098fc7656d9de3a51923dba290ecbe413ef8d951f24e9248cb552309f97127fb9429ecf6dd07b6de894e16ab60e33b4ee73024ccbe866de5e17f1b478dc7727a1bb42371820b12d +ZIUT = 05b355eb5c47d8027b6c5301d2463b99c636db207792e2975ab1a53c1cbb131280288432a79a3b47271d6a2bd777298baf8a675f66be9dc72c3588d299df8b52e7840322b43c2071 + +COUNT = 5 +QCAVSx = 032fa1816fd2317c16b5b19a25d46fa5e45ab15ee9f2b1d1274c2a06023994db309fad56f60b3ce57f32dfc7d045a84b7d805232be34c7e759514c30a25207ba800215b2060f04c2 +QCAVSy = 041469593d5748072b9ac8fde023095289bcdf65ab1bfc0856f83e9ae06c897303bd16f5e45823d65fec8310fd4332b65cff47a799af4f7c8638e2d7f85948c43f10534c980ccb62 +dIUT = 0066cc51980d3851b488c2c181496c83505fb957b1ec4a84df1e105e30d002bcb978b6d0bdc3b7644ed3dfbc33ca6bfe4362cd8cc541740b0de8cf2edcce4592e34fa11ac26ec922 +QIUTx = 0771fa29e5930d6dfd36d3a9e7159675fd23d0b5e1fd9ae6454aca9e8127f1e7e3f5322b5c16b095573b3266d08f0dc33043ffb3d7b08e4e052ed3f0349a329025ea6ff3e1668547 +QIUTy = 022f994f9974692dbb6e58cc7ae5f90652ee231e0a3961569dc646d114522a3777410c1b352d668079f80010bb540e4c28408665810fe61fd60e70d30c688eab8fde04364dee5c9b +ZIUT = 052bd78bf1326c6d91840a351d4874d36b147139882356c595b8607f9998773092a99adf70adeed19e122d4d2fec16285f000161145135d96355cba039a96335e7716724c249f88b + +COUNT = 6 +QCAVSx = 03e63dd4c98c151361c9902b763ae32f2d6de75953fa3d6838c1d613d448fca73bf302d30212a96d32b9549e17c5cf395c565191f6a22dac4da7c1e1a9d9bae86ebfb72c82ea199a +QCAVSy = 041609ab9c12c15e5127005ebeff6fd1f73b6912ed070af87f5ffc21df903dde1d715582dd2f699040200045cdba9ecd758ac4d084d4c8d78219f6fad94d341ad77daccdabb54a2b +dIUT = 01990d15fa2cc90e783d432201784bab56b6d29d1f2665a76cd013eb96f6300ed8f762b78a5596ac7e8c1e76167f107c20443b1ac732101e9f0aca12551a536d152df2b3db0f20de +QIUTx = 076c3d72f0e715f2491bc9d99278a8ef3c390b3a96e9997b37e5b7bd8a5f07af68f8e0ee3892b63ff112a73a849f0e84a782d4fb426eb5f2f15adacce9e5476a6daccf3a7fa9a291 +QIUTy = 0540a763823599e0c86027bacc8cbb30e3a2467276fc4f7e5fd4ed385dfc6f883fed7bca69df21a0668b55ebd292da8fd6356a3ec5cd1c762c01473aa067004cacedad564fe06910 +ZIUT = 0226c28e5a6bc735935f9df2c1b02d096d4dee41ffb95a67905aab8de1b2d8c66e2bb471293091438d3f05df7e48003e58a958b72f839f7f2e2c54287fa3cadcd41a2542ae4ec03a + +COUNT = 7 +QCAVSx = 06f91a7ce11ba9bf2de1fe070f9dc843bb717c306d9c63b5078d2a11323f20c9c0d7b7743d311ddacdcf5dd00f498b199672c78ae25e6864d62bdc16935d6fb8dad2082d3676ebf3 +QCAVSy = 04593c5bad12c3d655c6611c7ca9711f9e32a28fee54b3b8243962a3c55d41f2c185e4c58b7a2998e978021b95b724635daccbd7fc30d20720797bc291362c55b024acb2bdcf3d59 +dIUT = 002b0937e731f59ddddf0e94fba92bb1a6ceb819e7659bcf6edd4b4af49c2ef25c5b6039256f928363e18404b1653d3998054c2c25a3f83a0c5548a139e3e6a180756746cd34ee29 +QIUTx = 0270c4c00de2709010c7cf047a0ce69b87f41dca48d35b71fba4b258886d73ae42defb8653951c1bd3eb4ce0e6175a946c67afa67753475c51fd525b0fd9f5a26dafca319faa5e15 +QIUTy = 06680bbdc281505f5d3fbe29744a999e07ff612576993f6f8be3113db1ee6cf23799867bbc80a140376a9b6327451f98bf8fd1db46f9d9cc05e88704d5712d4567e1df40d39e99ef +ZIUT = 051a3deb052d3e99bb6ab6c6b284db2c998e9bee543e02e57f1b13fe9fafbfe53a89658c58eb947dbd178aea2f6cb28e305c9867bd65bb26f71793f90c984ca11113e1a8dbc8f7d1 + +COUNT = 8 +QCAVSx = 05ab2a7f10ac89f98c409580abc11ad90c93360e6ab282920b59d316ca9f2b23aeb50876cb1bcbe8ee9ae6b5533fdcd11ad4f86d8918d66389da87c98bf1d6323bd0947d8099083b +QCAVSy = 0689e1947276791dcb9527183e32a08072b7e03dcad175fe3cfd7beefc848dcef483380c6005411385c7027c9a52b60a6e537a875380d25bc47c7bf2364dd68a66f21d0f57866a42 +dIUT = 01cd41cff762402a834e7e0ab908fc54940f697b50022a4dfed8cf0b13d7e0ee523fbf33ee9693895f918d94e15b084655d61b2294ca51c4123fe5e0868e9d0d1cac2138f0577a17 +QIUTx = 0610797bbc6d9131180ae54ab66e6780849258369741470e076cf05e0785bb4e7900b908d38d8dab3b9427b952add20efb758cff80aeb641c4dde1eeda5509f386d5658559609cef +QIUTy = 068d2515f425a0e3037547342f1b6ff931763f5052e536ea4f78377b5c941459c8c2201482afcf3cda7390e9e5d319451864ca03683541ab2cd77a9d88fd7a610ca845ee5cd3d498 +ZIUT = 00697c751ddbca7034fb4d3fc1b2618daf78cdae464e8332d1215020c8f896f4864c7a6f2c61a363f730f58fd3bdb4f78a90b40aeb83b4fbc1d8d37cf6a27a6f722c68a82979fa16 + +COUNT = 9 +QCAVSx = 0034091c3ac6fc5299df18f162eaf7a207fc1543aa498e7272e15a92772f57772229069456e219c9c2872bd53783b0fb1345f5e84674c4344129a314146b7030fc75197a20c588aa +QCAVSy = 049e3a3f5ee65875e1401089970638b807df97568a5995c8fe2f502473b83f58c556c5f214ed6f03ef8ece01401a2134bc041f66922fcc4e3938e0c6d302eb42200678a97139f291 +dIUT = 019dff0d72a8b042c4e92f1dae7407bf4a106cda564db7508e5a76b03130c91d5e5cbcf2f578c2e9dee43849f911d7773d4c267e282c277b731f88a6ef0eeddd520f57e743ebf965 +QIUTx = 05bb60a5fe8e3b173cf8413eaf413a3286a5a7aa378f21446c61057696012746d02d10a831f785c9c96561ffc6ad4f9ecdf4937fffd8e698408e660fe896f7ed44af6b3b42ea849f +QIUTy = 037e3a35e48aa66bd851c59f851d4a1ff334e0e589dac30986acd06d6eb8ce236f2a9688f278a14dcfe0660b5fa0e97ecfcebbf5b40d3d3f5150a5545acba6239c00419ac72dc2cc +ZIUT = 0322517da30e010aeaa2ec9bad2745d8e67f906294ecd6b1d16808be3837f79070d0e1bbbd617f4b8b031d3b51ea2acc59de408a130138c78571f8800fa907caf550d23323d1c818 + +COUNT = 10 +QCAVSx = 057b7c65bc51e87bdad37c2b4dae67fb008ce71fd3072e41b77c562d7c41748872a20bef8517ba4be89637dde98e2ba1b3b01f63940713e2823d8dab68a5cc78561de14085e4cf87 +QCAVSy = 00ba77430a5560089dfac4f68b4f34937a384dd607bcbb5fab5677a7fae09ed07cfade399e87ce9fdd9397c681aa3378ce3bc82b007f6de4f7cb96dadf55a4c8734a37f39a5c2f25 +dIUT = 01e1416d429926cabea547bb2776710a52f7130393081020312b3962195eb6ed17c6d436bc46a5b47a7aaacf8f8117fea3cafa16665cc1845b0ec94faf687579b1c116ba183e825f +QIUTx = 065660a58688a16588a9c16b8272040a30afe3150630676023fe165686dfbda64fc85995ddc18c9c5b029bffbd4dffa8f62989c639a68623eca78009cb088ee1cb42c4855b79d302 +QIUTy = 0492c3867f137bf2787a7ab0568d3079b8d9a1e0b0ba5d29d0c7ba616d0bb27725da2ca6bc67bf084fab52599ed42b0ef48743423cbc6f4135692c309ae2630cc4a5390be93f274b +ZIUT = 000911ec1cf82a22c849b401dfe56453a06f4af32644ea8b63135b68a979236d05968eeadca7f0cd339d295cc58967a7f38cfad6e947a71295733e42ca3c1ba9b4ff6195607bb530 + +COUNT = 11 +QCAVSx = 06fa7477edec5f1e742881f8d7b2af56375113e992b797fd387eb5b53c33c6ba7236417b2c7e6e346267f1b8c6d7857d6e08f9a60e86de23da4b368424fb003f96b4c89f5d244a74 +QCAVSy = 073e1fedf62e8c81283622b53eb2cdb27b64c3c1dd78da0c90dd6c3c776ad146302e43aba541379bc8f3bddc2e19ff15d96664ce2d09eb6fb5b13848a82b31b452d8e84da3b85318 +dIUT = 0196363eef1a0e5be97d8f7601fe40ff4010f4949f016908a906ed5cdaf1221d3a593b3a4676beafd1fa14bc0f7c533b17086f207f9c484cfc2fbc3db2be4123a8e86f3b4911cce3 +QIUTx = 01b12e38914ee0075a888d6d61cdc7570c511d90a9e3a0e2738c3a9981ab9aba9a6c61460bad079a28429a5207d2c801af2fdceda366440a11686765e9ba77f7a6bc55012d4c9510 +QIUTy = 070ede5877665fd636adcfd07220d745ed7ac0a9b0202159f450c9f6c1b837192a69ee6ad955327eb9cd326a0588b59723db4e8fd258b11db888a53eb14f2be08512688329059892 +ZIUT = 0724c979affb3ab8d307529759bae5fa67319d441851e5817fef014350e3014e068428c9dac395c5e7b9e5b8877457b3e4625ef49ede4ae3626755eefc3fb3cf09c23e8a5a9f8c25 + +COUNT = 12 +QCAVSx = 018bb6cbfcbfbaed468564b368f0b0abc3fbca47dcc19f2c846bfa287370e1b912f6b70e08519f577f0cac325b79fd66b6b23aa1e2ae262bcd2e7a8b2c2d98d9ed77a54c7295f98d +QCAVSy = 05be9bbd91772bb42266aba9c893e56670cfb66cafbe4401ca2cb5765b469504848597c7f446e99814746787158a83ebf8e3796857363a8e04f8742a09d7eca16386d60fd7c858df +dIUT = 00a19a0edf508347f4402cecbce127dc6410b1967d3f89e6b3ba08b48aad08cd6ca5e5d1228cdcc41a1c380f2ae9052d73db7550e7a3c1d857056c98947f5b2c71c33c4eebc1210c +QIUTx = 0629f70558308708e6929b1ad0fe3128a8af7f96591b47cb8ea2c3454120a6d393ed989d13231c661966a378b967efa64d3c0938e9c0b8b16c99d7349bdd59e2d44804f8fee1fb47 +QIUTy = 06a5e50fd5024d8953e32242823250e998ca602b52599405129735a874e833b3bd73d7a9dc53adea092ba8d24207f5ea5657a29919b88a6d63fd0a943b56dde4c8478481b57723e4 +ZIUT = 005a526588a3a2ce08b20925e83987eb0a1e68f997102df7f9af83823ac8e06abbd29c04cb1f974ba9c9ac49b48b5af37679a39b532d359cdec3d41b3f80a1ee12c80276256b738d + +COUNT = 13 +QCAVSx = 032184b6863e2cb5bc71baff5b6b57a10594831cc11a9e5eedec4804e2016e3dd064cffd12a1eea0f6932911ded345ace5c1ff250b9648d93b953386dae9b5628c3c62527b890519 +QCAVSy = 07f783e0341a871e6256da349ebb539f88767d7dac1511e3c3e4d43b0fd31d5dd2c2f0f176eac544a871f42b983f8fba4df67ab6a239b7df997226304b73165d962f4e1d2d18de9f +dIUT = 004cac3fcc00734442cdd80eaf824412c20ea9eeb03d43b999d49de61873602020a2b3c47965f6f453b91b7a2c1d93e13a89544533e35a122cfc8612c8690b69bb7a557875f960b2 +QIUTx = 03e211c3b4986927c4388d1680cb4770dee6c78266724582c66ccc50c6cb28239474d521facc7206af6bb29cced733edbbc0d20b9264ce63d9437188e3d31c0e0bc3e9f9d88429e4 +QIUTy = 037a7c59012a82d59cc1e2f0fd4fd751e5737acb77f2a0799e0af38996ab5e11090a6396cc480e6f2aabd8fad44611691e5822115fd49d2a000c9b49d1f4964e24d43fbb81fa879f +ZIUT = 049db68dc9fb4cfbad8247ca4fe7c573c0640abead8f319194d665ecaf4f04b61f84f5df0d8a6386f6df04ca1a685a7394567eba5deb9f739b1e623ed6507021593f0e22e2dfc3f6 + +COUNT = 14 +QCAVSx = 071e167e59e2a709ebf4be3d83fb9dc69ed749e3ab8a54e202c35f8d45deaa2bda86c2afa1b0a04754d18898fcdd9b185f1d8ba2e180a47ac291bb4aad8f997f73b1423bcd7e9b92 +QCAVSy = 057119085bc7cb2023d23f88101420f9f508f0db94f8dfbedd5cbe88cec80a9dc708df6cccdf815d75b146280d7cd2eb97cf1a7dd550be523824f932a777679f2ee9f66d4258dda6 +dIUT = 00d514144d4548bcfcbcf57009f7e8ee104b15456f491826bdfd9ba67e871fdbd8fc8490ecbcb269091fc7529e5e55713a81de20c0ed01ecb3159ae61424bdbc5653732587d1e94f +QIUTx = 03ee5f877b737dae40baf91e0cc581dfe8d291f8c451d5bfc0b690df7025875d9569d52021b3b6890e01a2ba95899e2928a902cd5dc8143c07ea26749a9c94068b5c34c596b0943e +QIUTy = 058e1ba516a818cae9b37086287e088083e2b421fef0b59ba816ab031375d09d7af7d57866744687be3bb41ce2276d3a38f97bbb9fb59f24a92f0085b04ee5ed1ac0efa671394f73 +ZIUT = 0343c45daab4f91e02ef9bd6e1cd157b00ab0ab0a3e0d9734918a1d896cdf7cc1212bf74d7bb9bf96bd4abf42df325756c407217f44a5950c2b66af820692742ed7ebe14e48d2d88 + +COUNT = 15 +QCAVSx = 074f1a7b5cfb0eeef1e15e63512c73188dafbe88e8e9c42073b2b652b9f028214f0bec79142d8889416abf7a83e29f479e7bc3ca657ef0a10c2ea3ade3117c0d369dacc2339d1c12 +QCAVSy = 00e8992a54076753029f2c0e9d8c166e6ba84896a4785ffff598c4823e5461ff005490bb7fb6d878ac34f427fd9db48cbdf12eb9826d68fd2cf171d4d61c3f275d44947d4df4c752 +dIUT = 00ccc6dca5a985583ce00812c3d07822f6341c79d78c16b2e7ae4bbf5bffac1acd9deab678193f8f89b0e2aae52e30311444dd11253f96d62db3abfb17e423f0ddf0e991081154c3 +QIUTx = 03826215343cfd4ad968d572bab2dee2279f9e8effa0ff80b0df5dd2ea822b502274e507c87d2429dd8bbdba6eb8ab433b1ee1cad3a97c7d244194fd9a43f3e1ff33144e2db80864 +QIUTy = 070f4508ae391ce24154b38873af0082d95895ac92fd1aa321ba93beef404a63f7b1afa1feec997885523a6688ada94dd45eb32ca7f1bb87e63c4de97493196c3b53cf83d218dc37 +ZIUT = 04a565cb3e15236a7f6c413afeb419c082427b10a6d07ff87e81740716433c06b3254414381e4ff9860340dd6201ab6621d162cd12047a5515ab1d65f20c97eb3d7132642f8ad58a + +COUNT = 16 +QCAVSx = 004b54b3cefd415f5eaaca4ae4e5dacfbce20cba1932a2f50549bcd31630017ad21475df154ff37be13ca61a4c60336b33d0ffc762aa9e9e9fc6e6fd17250b5e4022b55141d23fbf +QCAVSy = 056f7c8d65c568de95bd1664fff71429ec738987697f217de5adf36d14a80b6fe585e4685e03c81838abedfdc05a1e01407af4ab989fc1d1273ba8a182c461856d5effe705d7dfe5 +dIUT = 01886213658bd17e7dc334dd8003926a447c34a197ee5d6d0bbc46e85ec1cfa6802858d1c367276ca572ba27aa7a5d1e216902416b48af6e4277945e465d7d840dff1438543caa46 +QIUTx = 047f6cc42107c40c168dc679a864f969b53f756257113b7502796efa54cdcce704b9344ee4bf964752d68910262bd26ab6b347084404b28306ca3425f29894ce6fd4293c5973522f +QIUTy = 060cfdb5467675a789923be973c6645dbe26d00a39d4e81255217291a3882cfa8f91f4aa8214d3524c95ef6a24e47b3b9d0ef55f670756ae4a4d9c65f075f4170b2d18aafbca0265 +ZIUT = 047265831f1f589b5f30806e2fb80aa7844cbf32b6993384beaac7d992b327b97dfd0bb89ca09e711507e846ed4ad003e7115fa8843b23d38f320e43b5eb506bde48fbd7af4983b9 + +COUNT = 17 +QCAVSx = 07ec71bea081190a9c4cdff809ed2b65a77800cd1b3beffd1e4004d126ac352d24235c797a5a567daef7393d276638132ea7f0f61e550dc251d341f66102f96c2abf7ee37c0fc9ed +QCAVSy = 00efc2ac8705b2f9c9c06a910a304c42b1ad53101aeb0d146319dc24815c7cc1983b1cad91d5f9c6d5eef1677a1f2d2bdd75a1fb4c5796a4c56964aa3e43f3da26c737edd9cb0910 +dIUT = 004c0dd3715e8888dc2222069e7f611801685140303e16b8b443433d5e18a4b1803d5680416aebda7ae7e9449154be346a7dcb36c1db22744673fb3b245e58440787ed3dec6d3db5 +QIUTx = 02fb241eb2c28a1b0675b5760fe5663efa603eb0590842f455973f0573e148a47e63f97e8df9a570b0655d5afc42019fe95fe44fdb02a68271d82df580010f91dff0cb3d9bda8992 +QIUTy = 033f93a9dc39d87403b6a94dc0632dec6757842d0aaf8ad8c41ebb637058bfc11c19a3a9abddf204201ef4f96fe9629233a5070a08794d14470091e30cdd876aaf65407627233234 +ZIUT = 059b62c25c96955b8fb4deddcf90ebe6845ee71ea357739273d6d67f21a0c47d154add9d5d4d2b657fe1988ad614b0b4902faa92fe999abd754ad33cd6b92fe2f6a68a6f2c1eeb27 + +COUNT = 18 +QCAVSx = 06708686b4f5ad2fec457aad5ac4a3dc4867a477eb54fc0d493511b5561ea151dd4caf5d4311983500b48c8043af09e3f4042d5a07ebf050a4e801daeef3317be093955020452b29 +QCAVSy = 0525c8682583b55f7ecec59b920846f75d11d021e9ffb20018639f6ab93022472c192d398e150cdc630a11fcf942e5d238cd6c14b30f44a24d2f843ec5d135ddc7abda56047abc21 +dIUT = 007d54194fc226cc39f640d3d17b9b95b70b51f98ad5ca1991566108d839e377e21ba48cbf441530b3341ddc61b0a58141aaa66530241fa529505d70804b2560c5be481310b9962d +QIUTx = 02ed5f3a2efa4ab0f9db5fced7b1300de4d457a9ad0827457e5e1c4bc15ebd183775de4b73c1f820dd4033366100e48b4164d04e9fb6cf1a4bdb55122a86005fbd0bd2cddbc95fa7 +QIUTy = 0327fe654ef68563cc8888acca85163c2b154fb70b0f4a2b58c36388a0c25f80a4c887977d46000dc4d86e95cfd8f9065c00eb28653c8fb477bbb5c63dd47b83ca5e0f871e9eed3d +ZIUT = 02777c72853b76b29f69d3aa27a1659789a025af0633d833b22b57bf328d231ebd128bf96a4c8a7ffd2ee7a51e5ebb7a8e5bca20e4ad49671a2123dfbc0d6c40594e04765186de06 + +COUNT = 19 +QCAVSx = 07ce7674403dfc62895d71e2ab587ce735f279f12f7df3161335be43fc2908ea736f6f58b932d793aff66f332735d4d38f05cb03cf275ca0e00da1f57381e08bfeb5017877342272 +QCAVSy = 07d6649f3d91e7bf5f8de611bd971818106df2e37935bb464cd9e7469629c6ae7e7f2b2240276cb0eedb7a26d0c7d377f4009a1dd48a793cc993fb0d4a04db1dbad4493304bc5c0e +dIUT = 010740b958285242045cd5358d7ff9232b7d7d413af7e205c285f88492ef27a2fb850e0567ec24c480c75ad32f70342025c86267dbe4ff80a2c509e5b9a45130e99e7c7cc8cc6ece +QIUTx = 03f3f585cafd46a663b6cf8b8323ef9159d5195d3118f3edf38732ca0ff73b2d065d9e69ae1e3978b2ce6dc61500f7b8bbf6f6a70b47bb64cc4fd195bba6ac932b70beafe174148a +QIUTy = 00b1566fe619f2cc00aba05e24a6cccbc91338b2eef553da0d477d6c8c0ac4c656e134dbcf31ffb15c67d589bd2918f1174909e5428c71c90e38c4e11b56236abfa1de6a8579eb4d +ZIUT = 02c2ec1632e83416182a9a438f7360b88061bab84f5bded3dd8a0c87baf44507df94fdcf99353b107e61cfcfc8af071b3aa8cec7b34a542bf2ab8ea0bd9db67d66b428c9a6c14458 + +COUNT = 20 +QCAVSx = 0483ad7382e348afc7f271d50d8d39b814b7d6dc0c562a6ba556568045bd2d620906ab1106f9137ff725892e8436a8cd7b88892a32f19ab269e2ad30d7f0ec00e3a052fbbc466307 +QCAVSy = 041cc4b0f195dc73c4a8e10605f2a382923abd2381f24e4abbd401e087c50d18f6dab01a25db7e89dfff68c663494fb4d087a816b85444d882bec2ac25e42fde78ebcca79a6fddf0 +dIUT = 00c85e5d2ded5bc3b6b553fe0a02311b72bc5cdc8e96df179ce57511c26ac9e873fc1f76cdde9a7d8e52a7e9be5c7753620331e8977a98902b48ae9899ce8a6a6636611276ae2383 +QIUTx = 0289aa5209fe7b1ad7b9c5e0e630ba5e02929ea1b1f114d30a0648012bf029e066453f2d28e1d503665dd0833f0ba37e4583b434dd9956100a1ae6e54f96d9347d806741d3a76e31 +QIUTy = 033afe87b29edef447ff5a02e63f64905b5f53ac856cfd7755ad542812ecdd568e8ae1f9d32fea0f02018dcfd0e16d6a6a2797b7e3dc855bfdb6b0d0b2525e143678d539bf8c0672 +ZIUT = 07e1d202a54d34020939f7aed56931f21b206761e4fc79b9a7b320f81077be322ae7809446b5b3ea701618ecdb0a1796ab80407a281bdbcb4d580131b61f8743bfef7a4d9c5941f1 + +COUNT = 21 +QCAVSx = 07a5e8eb4968497a11b90c60e13d5f3c61c6868573a6b6db7c208a856d54e74f4368e28100b9e0bf49fc3104e146fbda784623a36d9f01f23ebadfab04d7f48ff66506c698bedd11 +QCAVSy = 013db968fc7cd338cb8e3042a171fa306f9ab6f6c865ddc5ba5fe994a30d8fc1fa127191f08e4e14b9aa086a52fbcaa46d22107fd6df53108b53fe0bb96bc974c03a8c6528f9792d +dIUT = 0053a48cfda8ee232cea3549927b22f375d6096560025e213161d43eed02d07365d9ede7c93d457ea51ea2369e87463eddbf25a06bb1f080fb4763074a8283dd3d69f1de865295e3 +QIUTx = 04790f9db600b9a0a57e03d274a3d23a55aa0d86b2d6fa07fafe3c9d4c3393771dde89c70a6470a31bad105c21d4844cd7bfc3b59738f9d6c528c414d524f88e0c862e4e17aff454 +QIUTy = 05dc12db04e2489db8a46cdeff9f8d9d2e00d024f656c781eb4d2db167624b3a70addaaa158ca00601d4cad065917bebe766912faba9987fcc5fc8a78dd21643aa650e6a4a7e2061 +ZIUT = 07f49ee5d822b17e3f1ec9946fad8d0a0a6b327242afe675806b3e6b7541745e21cd1b70df926af057a9f8deae4cb9a1edc782014426152e8aa4cf6a4080dad4678dc8ff0d9e1af9 + +COUNT = 22 +QCAVSx = 013caaf8ce2e2321cf256f2b64aa89add6968c298624a22bd38ef94deb3a70ea44ce87a948ea56bf0ee9407134f8c97b17b1f54561ff7747e3f6b656f80d60778d05b8c4cbbbcf3c +QCAVSy = 0047a2dca3eb6754b0a9fd16b081fca497b29dd2ec9e6a7596d06b059c2ab18900fcc58715247276e390df1dbab26ba81235a4dc6738237fcefd3812b7ab436c926c50c600e6e907 +dIUT = 015a5e5946fe2c9cae6d412c618c1bd07724432b2f1dedb1327d8a99ce830e6b030f4025c14b4e3d1912ea9a78290a1cfc7d0189a30c614010c873146a182f639193a2912edcd04a +QIUTx = 03140887e87039797869f5d9db50d91ba69d0bfdc5a677c700610562f680d951a5e0517cb2f966367d48e423b046db4e68bc1c4b3183dc80bee126e89014994cdf83c4312a3e5ea7 +QIUTy = 07b8d706962cb192f0ed14c4da710d1b1b073fd8ca497a94379a7454c9c3d4ce6e5fd2e6386852a77c5435abb23536dcc83986cedd4512752f295ca500f055f462763c29fb678caa +ZIUT = 058cd5608dd9d64d4d822baeca123358a4d7e56d3777ecdf569a149c2f85ed35479eaeaababd0b026dc3b56aedafedfc8491040413f85b669d8512a3ef7bc8fe8706b5c7585370aa + +COUNT = 23 +QCAVSx = 0743b3c965a83ee9f6bdb9901a1dcc1f78196544a88b9cf8117f89ed1574e5c5d804fc451112c257877e12b0a66c693c6655c12bba4535d99d62405f4a9dcebc056d8b7cbbada120 +QCAVSy = 03efa58aa3a8c6a24f43c5581fec041442ae955275dbc1d46d10156059d2637b9a82994b024a247d2a66724ba90d02787b168b1fa1f4b6749645406c438f8d316d670f1e0d8b0301 +dIUT = 00bd58e19c05df7e99bd962070e0b4c7576042858447e023b41bb29745a89a4874dfe325a15d38d2fb9e870f419dd15f4aaac65dbbc5ac2c540f57cdb0e45bc86621726d922d14aa +QIUTx = 01e4b2a277ddd78f2f119c05b6ae1ea7a2a744961e08940f6569ee8808c53bc7a12138064ed5c8c222eef2774e70c28bce3a6c05f3a654e121006ab62bc94381d01ca0d1b08234d6 +QIUTy = 07eed8cd7a8a3549b0d9ef8786879efdc9c0f4ce90b3991a33cbbb1d3704db93513138b19a50ecac880e578de21046f03a200048180884bc42cf9aafe58cc1eaf536d6d25f1541d8 +ZIUT = 03bf7a59bbdd688682c45664d20c19cb2d24fcca6772120cbeed1cde762d449ebf22855627eb6b2be6e7f7c0f0034d02686f2a4488549f8cb198e02b46972bcb88914bea66dd6400 + +COUNT = 24 +QCAVSx = 0722f1e7a0607750dae2d62c5d3d470f006c3254558eaaa294eeedbca8d30bf4abb955deb62e4179925f6cbadf3bf8776f15dcae3556addf797105a77b7f6f71206ca0e6ea91e188 +QCAVSy = 035d108ca0d620cab96b7cbf617d1b5ac06e37792629886564fd147c58e55e423344ff4f1fba4af0fe34152b384b7685caad15d3bc270e43422ad874e71e408a71a6c8a90d2ad978 +dIUT = 011463070fcb4a28be4e2a67c29c7fa48a4c585a307405d06a1a0678e909dd6eafb898662cdd8bcc019deb14e5d92d172ba1c438ef0f64d80107c7e8e68029f4e0aa814a1099ca38 +QIUTx = 00939398e463886f0dbb48a74f573a1215000668e10b57989dc300b2f9a8c08cd43d6cbb7f46ec77c1c294b23f86299027d2b93fd6eb18210a8230bf46e3921f182c9260c30847ab +QIUTy = 03d48ec633b9da1650ea762656b3e31f26aec07e7ca6aafc1ed7cb466eaaf3993e0467048c967bb1e9b4ae073a230c1e2f74e2e618666cf56a06f2b65ec3955b6ffbb06a908cf616 +ZIUT = 06d410e9ba6b8b87b00d0f676de8ba27f6afe7e308c2e992f318fc14cba0a447316ad86e8e6c1d3345d8e4035735232c2c597e760b8800a89a521567b09408f9c7be279c137c963f + + +[B-163] + +COUNT = 0 +QCAVSx = 00000003a647ba32dac71ec6780b0638a70cd24fc3bd4c8e +QCAVSy = 00000002e69e961541844a4aa33769a7bce710f6640a560c +dIUT = 00000003edae173de8fa0cf0412d6a7bdc81fdbd0617adf8 +QIUTx = 000000035466701d0b0030d098b6ed2343d355c24c907271 +QIUTy = 00000000d8bc02f341d261860dfb65f0cb7f0b488d8296cc +ZIUT = 0100fb42d177ffe6c31378e2e04e0da7376ffe8765 + +COUNT = 1 +QCAVSx = 00000001282898936486dc2e3cd1585f32d5544264e191e4 +QCAVSy = 00000005e9e98bb7499bf895f77f8fc8301d6e1c7a9f6191 +dIUT = 0000000178dcc8216425d4bf71c8f2925dd1af86dc04a268 +QIUTx = 000000011e49430cdd06f2e765b8f2cc067cd424e2e75485 +QIUTy = 0000000083af15b22cd7dfd1dff7396bf3f3038f50524991 +ZIUT = 0681c9e59eb7eba769f5b6f2b06ddf1efd12997995 + +COUNT = 2 +QCAVSx = 00000005874fcc8c484c014173102dcb70c624ee6108d31d +QCAVSy = 0000000049693f4edc714b0d0baa5bfc5d8bc6ac04089de4 +dIUT = 00000003ea1e79e52a070898d6a3c4e748e95ac8710d77f6 +QIUTx = 0000000137860ba3458af13c22af8225f561e01331cd87a8 +QIUTy = 00000007720356e15dc73f9fee7a1c021feca97cd41204e3 +ZIUT = 01e0749a21fc508f76dade85435bbbe12c448bd8c4 + +COUNT = 3 +QCAVSx = 000000003748d798f140268f1e718b3b23aa2acc0333c074 +QCAVSy = 00000000c42a927ab579696123095575ac949b07a7d1d4bc +dIUT = 00000001ad5ca9abc8bcdcc482995ad1a977e4727150bb36 +QIUTx = 000000025ae78311b0fcf369566a319f89849546aeaec305 +QIUTy = 0000000640eb0fdf520480afbeb9f2674feb1d6df482d7f5 +ZIUT = 0320398f7acf791e0d602d7b94742cce58e9fddbac + +COUNT = 4 +QCAVSx = 0000000380db3df2b1c0154a8e8cb304aecd581d35f315cd +QCAVSy = 000000071534ec2e8b357d9e069d7f1fa98bd44ed8b06826 +dIUT = 00000002d28a8aa1d89fa3e5e596ffd1808254ee17a0d0fa +QIUTx = 00000006e6c52494ab63c89c9788556f716677f3b48042a0 +QIUTy = 00000004e98258b9c56f02d3edb4ca5b0aeeaa9daaa6fe0f +ZIUT = 03e4de43de85223d818e5be6549c29cdfa1afe1782 + +COUNT = 5 +QCAVSx = 0000000136e0d05b4f398b827e198046148b2f41573fc07c +QCAVSy = 0000000739934cec10572852e1f619222e2f5ec4e0fa5aa6 +dIUT = 00000002e170f7f4dc152fe4706f99d9be229e1317d82bbd +QIUTx = 00000007900dac251de8a944cf0a1bf2eb2efeee14676e9b +QIUTy = 0000000091e7df67f77622729d59b7e34b947127e7fa2e5d +ZIUT = 037b178aab014d5abab305e37deed7f4798cdb862c + +COUNT = 6 +QCAVSx = 000000076c3ae4a781673627d0e9bcb615f626a160a55dda +QCAVSy = 000000058c0ec8f2649c2ddcd9c24b643433b14d907c5903 +dIUT = 00000002923d2c802cec42def2633debdca759d59744d3e8 +QIUTx = 00000002cdcb4f91ed7d17768db80be2b3ac9e0956b1d971 +QIUTy = 000000032433f455a6cd253e91582d2f6f5a712655da1d69 +ZIUT = 00958b2aaa6061222dd248a6b9700fb6839dacdc99 + +COUNT = 7 +QCAVSx = 00000000d65f0516c1b3eed9220e59b3d049dd1153179ac5 +QCAVSy = 000000020bfe107a89a7360cd2e217534d6df298cc4bc458 +dIUT = 000000025b17bd6e4207d9fb1a3af02fd5db26af8348aeb0 +QIUTx = 00000006f6f5b1f3b18f45db4fb3777e6840fb5a5b61a914 +QIUTy = 0000000737ce14aeb24e0591585a7417b89256749f461de6 +ZIUT = 0393387e1dab35748f20d506a0e2b4dc0ee6c3ff39 + +COUNT = 8 +QCAVSx = 000000040d903ce2b30f70a6a03849b0e1758fef8887bd31 +QCAVSy = 00000004abd8bdb7c1327c99b33820dbe18ae114fb435949 +dIUT = 137e8132ad288923e64811e92298f5c0dcc95705 +QIUTx = 00000006f2cdd1d630dd731ed77f901c7b0e735515e26d4e +QIUTy = 00000001062f2f715c4d2af97bb1be8b6cfa2e3ee314253e +ZIUT = 0212358d3f8bce69b662447333b3edbbc9b2f7e805 + +COUNT = 9 +QCAVSx = 000000022ed24643f0cec68c8e4ad1aa2c4369d8aa03f594 +QCAVSy = 00000005ccca62b6dd1d316dedbd0f1d530bed6e556b3ad8 +dIUT = 00000001c48c50b7d3ecdf3b901bad0eefc3e3826e3cea9f +QIUTx = 000000019175573117dd851e6eebfd9fb1e5a884ebfefee5 +QIUTy = 00000003adf37e4ded52573fa57c8cb2bfca6c65c3674462 +ZIUT = 023472fa59846f7be07cf060cdd69a9fbb27d4fe44 + +COUNT = 10 +QCAVSx = 0000000793f4b31172eee66f2769eb305d03b5c3f7cfff8b +QCAVSy = 00000001f3ecec6bbda9bde8a4da14db3e5ff934b9835b17 +dIUT = 00000001162d9ed3a660455e8c015d1e45d1515749a3dcd2 +QIUTx = 00000004283eb0e5085d198b378fc95f6fb4c3198b4d3c78 +QIUTy = 0000000107a1168f2f47b963e4b3a9024e0c357a5ebdf92c +ZIUT = 0173a056c4c9ef6707cd23928999c4680f42b71f7c + +COUNT = 11 +QCAVSx = 00000002ea7a50834602f112f6dd0e6d25f064f9d05eff26 +QCAVSy = 00000001bf3f69d14acc8333533a88c2e8824863a47ae027 +dIUT = 000000019a1d16f4a572f3c1b51ea2ace69280e7137b8f8c +QIUTx = 00000005cede96a70f714cd68963f2d6ca236269a938f311 +QIUTy = 00000006cdadd54b6f733c80934787e28c2ccf58b1227bc0 +ZIUT = 03d34f411a297d7c990fa4a83b5f54759607f9d33f + +COUNT = 12 +QCAVSx = 00000006dd1305349e8aa08020073a0de5afc5dc1b6a62d3 +QCAVSy = 00000003497eb7bf4089ef02cd0a5dd0f86bd8798a44c56c +dIUT = 00000002efd4400dad3cfad8d1637fa9290c4b758a3015b6 +QIUTx = 0000000513131b4bcb72ef68ab043ee84fc8cb03b6d8f187 +QIUTy = 0000000120b7d5772bbb17ecb1c9e80c36f808fd54a93aae +ZIUT = 06120aed8d4c1e506710e2cfb98ca2022e642ca89f + +COUNT = 13 +QCAVSx = 00000005a0e341118e69827d6a7f8282fbf0b94400f08240 +QCAVSy = 0000000423b993d4367fbf4f6504d9e09a64123a3b53d128 +dIUT = 000000012b0d64977cfc13b48345ef7072d1a3890eafb95b +QIUTx = 00000001b9363cf48735676878d80ce1481b8588683f7444 +QIUTy = 0000000768fa7327cd7252c8f696ed4947868915ada1fb5d +ZIUT = 021a58087968c5df57afd7c343a4cfa2ee8e7073f1 + +COUNT = 14 +QCAVSx = 000000001a923d6191634306124c1e267309b07dba32decb +QCAVSy = 00000005a3517f5426a3411a727eddc29a3ec229558368d1 +dIUT = 000000033ac953803d0446b3cda4ebd071b4eb027c11bfd8 +QIUTx = 00000005c446e9896ca44cca733e9f4e5b64afddc0537211 +QIUTy = 00000006bad1b2522692f970b38be6935dc7d1c09dcd206f +ZIUT = 03da9c0879219e48c3df56174898fab9ee5b0a6bcd + +COUNT = 15 +QCAVSx = 00000002fa8baf0d6128add9b902aa181c81e24298451e2e +QCAVSy = 00000002b93d1f6913914ffe1559c7c114c631bb6b29617e +dIUT = 00000001bd79145ae7f42c6b25d1c38965ec08fd27533a7a +QIUTx = 00000000e9d8fc3a026925c8add508f920fa2e5ff5282688 +QIUTy = 00000005b7bf631259ac7d36936c130ff206d820b13bde81 +ZIUT = 05b33fe3874d32aed99919265cc0074902e538fe54 + +COUNT = 16 +QCAVSx = 0000000353e2da45ab7c4930280c3edb4ba90012d56df62f +QCAVSy = 000000026931e30b97ff5ef7bacc0de4d9490708522e3b2b +dIUT = 0000000330ca1f5ad77d7a66d87423328020c91ec79f3764 +QIUTx = 00000005ba37d36997c4f2abe603dfe042232738e82b0b3a +QIUTy = 000000073c8cd950044972a005c6f1af8e4306e0ccefb946 +ZIUT = 053dbce9826af4d290036feb46875e975b7848a9c4 + +COUNT = 17 +QCAVSx = 0000000721670884daa8cd627638ec90f3448efb0f2489ba +QCAVSy = 00000004f84a983bec6b2889c8211bf231149b5bebcc75e0 +dIUT = 00000002d23140074d6eddd5bc099b17de12afb9ddf2ecbe +QIUTx = 00000006e06cc7c30f5ed7e686c3a75a1d44257770601cb2 +QIUTy = 000000030dc414c4afb390ed467af471aa9bd2b75f32dfd8 +ZIUT = 00d49b971cab937f40908913fe259849679ca076d9 + +COUNT = 18 +QCAVSx = 00000001d6319ec2dc5c08f0261aed0231418d6dc3d0cda7 +QCAVSy = 000000038e64953f7cdac71d052e55855746b43d44181b91 +dIUT = 00000002449c1b9ff09e7a9a03b17f5ff461115f5f3f1a7f +QIUTx = 000000073f9ddddc4650933deccc9546d392a35dbbc66a76 +QIUTy = 00000004de7558dde649f72322b39e31c8e29ce6f599485e +ZIUT = 0483ad0b7f8a716273f624b8979c19126705266e4b + +COUNT = 19 +QCAVSx = 00000004f167907bf4b98e8696d81da7d2c1056efa0dc14c +QCAVSy = 00000006cb9ab65143832b9cefd5d9ce69ec4db2edd067aa +dIUT = d08b95d9a4ce724ec462cce12701fd8c3d53fdcd +QIUTx = 0000000026a770d86e1c89ba7a86aef649ba7ea86fc7d5b2 +QIUTy = 00000001db1020e0f764df54a53c23c938cec98d9a77ad1d +ZIUT = 00f69dcb547119fc9b8c454335aab184c3ada5f1c6 + +COUNT = 20 +QCAVSx = 000000079b6d14c743271402d1323603215feb3c68b14455 +QCAVSy = 00000004e3905686a538c25a02bea92f42184021b5ea2593 +dIUT = 00000003808efe6ad50d250d87192e16499ce3259428f3b8 +QIUTx = 0000000013a02e25fc927875afa557bd673f65870459e671 +QIUTy = 00000004038dbae5c5e54084708a24bc3fd072e769c12377 +ZIUT = 01bc5ee5261b2bba55b10cbaa6cc3c97b98d00ffea + +COUNT = 21 +QCAVSx = 0000000772f42d272a057de0ff926c9f94605c6675d21526 +QCAVSy = 0000000602e7e53255de9bf58c057eefb79bce431b5c3808 +dIUT = 00000002ad232a7a41e6cc2495538d87b023cdec7b6e1f23 +QIUTx = 0000000549e30780d93f796fdcf691905575d85c66453bdb +QIUTy = 00000002162a885bea31344543f5d06191369dec6e70e967 +ZIUT = 008574d838d3de87965fc1b4343fe4f078588c4ea1 + +COUNT = 22 +QCAVSx = 000000050b2429460971739a9d6d5670bc6d759e5656768b +QCAVSy = 0000000492bc2d3f638d4978e4ca58ca5a4ef19c5eccea8d +dIUT = dc99b19f3d8847875190e9588b2bbd830dbd3a95 +QIUTx = 00000000f65d984d71dcc18bf172abe4d3993ce0f7cf324c +QIUTy = 000000001b49e6a2cf1173aadac3af6c09e966f31141abd9 +ZIUT = 04579b477a92ed961cfdb2014407e88e7716452a4b + +COUNT = 23 +QCAVSx = 000000017d52116f0c95587f1b7b06c76e98d99c82dcf20c +QCAVSy = 000000024ea22bdd990bd79e63e735b21282ae1b5ea66648 +dIUT = 0000000356ab85b04d0851b8f66b4a796526d3f3e3882844 +QIUTx = 0000000776a2e1af932d74519070bfa941eaa93e9ff5e97a +QIUTy = 00000005abe9ed46245fd0146250d2a563c46ebf7acd2342 +ZIUT = 035a8c10e64403c52ef8d17c5f4dead0df81fb1f21 + +COUNT = 24 +QCAVSx = 00000003a7ea10ba1d6aa545700b40b737951a9e736dfa0c +QCAVSy = 00000004f9352fb2ac2444e928754e3655fd62e3a42564e8 +dIUT = 7a7b547550c758a9de7f06e2f38e55f5e9e44ce6 +QIUTx = 000000045952c0b517e685cab09470327f9d4b212751b049 +QIUTy = 000000044a429a6efb04bcea0240ab5805de740aa61f994e +ZIUT = 000142615e3607ac148c4de8f334be849235d01cdb + + +[B-233] + +COUNT = 0 +QCAVSx = 0000004756baddefc3dc337ab27b5452eb10affd9e31f5b55c330e90f0f686a2 +QCAVSy = 0000012a79f65232308a21c98c01555ccafc7dce15c8fed3025a760cbd6c2327 +dIUT = 0000003c3ee474ac0d0bc1df567e3c35f5f766c5332b2d6730ff0e4d8e75aedb +QIUTx = 00000061e8a9b517fd05a026ec376616229fd8639a1fa76defe5398022f9d9c8 +QIUTy = 000000706b5cb08738a94552fee584b1372fead4af79040909fcf6f50084bbfa +ZIUT = 00e9f3d8c4f1bec0f920e763ea1bb7415899f01734609e7547dc425ec946 + +COUNT = 1 +QCAVSx = 000001186a028f9a18db927f63253c203eb26aa3aba0d40b1a3abc64e47a22ad +QCAVSy = 000000cbd8b95f89e421128bc73a43c5cc254e3867096ab89d788b2ed3b90a96 +dIUT = 000000aa41a5a01a4e66a67997b0be16f56b160b0561ad07f3af2964386461d0 +QIUTx = 0000002d91402446557068c40fc075dee93916b0f1a9392e47e56b747125ae1f +QIUTy = 0000013ab0915e4acf779516826fa1dc1885a06abc5d0809c92240ccf9c3d8a4 +ZIUT = 00f1fbecfadb158d62eb1109c085124fad67a8795b58815eb396c95db4b9 + +COUNT = 2 +QCAVSx = 00000093bf85621602238e98d09c98828d51a49460362c23c5141d3d1b235296 +QCAVSy = 0000008497152187a8b3b2958a1d0a2eecff4492251807cbfd03d5f2685bca37 +dIUT = 000000c6677c28068b462e34862ce6c9d8ad8c1b3c7efe80cbab41da419278e4 +QIUTx = 00000042cb311dcff2482a2cece696c1eb64c69ac2aa599209a5c18763a3150a +QIUTy = 000001b0329f36c135d002f08be3e3ffa9da18c5d6a70c360f4f871f12bf3f95 +ZIUT = 019ea831c51d88a7cf754495a1c474082ed481c8eb83190a77defb09d479 + +COUNT = 3 +QCAVSx = 0000004549648692af95d88e4e1d4914d8c9769aadac5a0f75783265f3eb9657 +QCAVSy = 000001b094b4802f397663d0e682fabf1c94c4e214e48327b95eefcb92b771fd +dIUT = 0000009c61024b3dff219b37f1be6701804adf247414448dd0f0dc51293ac913 +QIUTx = 000000124120d8409850e71e33c9e2d9c40ea32bed11d77804786e9b076892ab +QIUTy = 0000006dae1ba4817296ff63073bac9ce065d4331ba1a5c899cc1c07405dae3e +ZIUT = 00088425fb04c2ce408f08d81385a322703a077bf00ba0791e4e79b80419 + +COUNT = 4 +QCAVSx = 00000073c5cf4a01d09e3b41b5e7778c6b9ba52daf88fc404f8e2fd09db4027e +QCAVSy = 00000070391edaa76f0e3970394cac0338061058858c3c73d5cb512e5326304f +dIUT = 0000006e69d064dbd9a794f68e699a0e941bdda6a53a1ceca3b3db82925b6f8b +QIUTx = 000000c57d61fcb1fee90d5d8c97cbf188c8ef8259b0ae2587ecf1ff8cd2e2fa +QIUTy = 000000b8ad86c6805a4ab44513dbba2f5098b9e9c1e05b679f52937aece2b182 +ZIUT = 019b5efb23bc18a4f18c22fe2fd5cdbd02372cabde5e5c9f4b4f9a49438f + +COUNT = 5 +QCAVSx = 00000123a6b081a761e86c042e1914af47f093b2655543e564584b60642539a9 +QCAVSy = 000000518ee3c1ae546404df1eccd69aa6856431d1c8881cf0578cff4eb8c11b +dIUT = 0000005ae5de30c7c3171813a2dd3e3ea2c5ceaa0473c39457e9929071e1a420 +QIUTx = 0000017cf9fca05d4a55e4b68fee7a3bd43f047303f2a266d81bb5e1ec7e2558 +QIUTy = 0000003b0af43de05003397de1d4b27827ad2fcd675cbf61a445a1ec40a569b6 +ZIUT = 01f36d9519c3d47f030eeac3338db583b96fefa551a4b56cc5567f2d9d7a + +COUNT = 6 +QCAVSx = 00000141fbbf2b361c2c8ce5edabfa22aa4755581e5b1a66600362a0ee7bc574 +QCAVSy = 000001aea3cac203f8c780475a2609b2970cc86f96ea4011c348da8262b334aa +dIUT = 000000c68796955b68b5f8827e38ac0782b1ac2c4552caef0c60958467cd85c1 +QIUTx = 00000034789fbc60f1086034c8f2ce86fd4aa335194c9146890357dc475699e4 +QIUTy = 000001d37f796327f71ec31510468463d0b2905488a4a60267870dfee567c250 +ZIUT = 00e54b1c916ff3ba1aa0b2b99f0ebde4f1a4cc6a10d959bb2f7f4c777b84 + +COUNT = 7 +QCAVSx = 00000096a0d3f36e8f753791074cea697b2471627e0c9e7a294a029a9d3b9429 +QCAVSy = 000000b767174a2920b62f1f02fa79097845d51d93e0c8104410831a2dd55c3c +dIUT = 00000074245cc97dd450935689ea3fca7b0b30c1d67ce6e8be17cb1192575caf +QIUTx = 000001e1c570acc653c706fd7740194a554de7f3799a12b820d6a941197f761d +QIUTy = 000001e2225e8d0d41c808f6ead7af320fb25fed29a99098a0f0e11cd869e53c +ZIUT = 00bc0dcf7585753cc79aa412d2740b4b2d1c644fc9755cb0550286bcf68e + +COUNT = 8 +QCAVSx = 00000166be2426b3bf8e6d05a24d7d1f2c0e329e4120cfc8e6ff52486f095586 +QCAVSy = 0000007371e288145fc25a5a9cb5f2a386034f2f328c6eaa24c8b096e8ab1f0c +dIUT = 00000097beed4b738a6205cc9ea046b448b523128b93101a02d964435eb17806 +QIUTx = 0000018358da94079a700a10b20a2325d33d80e95eb4fc4a98101c312635939c +QIUTy = 0000000c4f442d0071c7bd1d217cf235fd031dec309e85ea2014e68b50fc2ba0 +ZIUT = 01b7ef3148be331115321b1c2a68832fdfb991b26224a60dddce3e060d27 + +COUNT = 9 +QCAVSx = 00000181f3bb0b097713277c5f3b46cef02aa9cbe29ab95c76e9b60a1f7a51e5 +QCAVSy = 0000002e2fb672d72bf78f7cfedc40d3726c6b4fb585417c7476b655e32bbd3b +dIUT = 000000759c55da55e1fdb5ba7f8b893abaae5925b9b08184a3d554957acf3ec0 +QIUTx = 0000002af25f810e18a81b69da254a65b8a6c7ab80ddc27c85622e2348add132 +QIUTy = 00000128b753e4b21a8c3acf85aab92a9aa6a7b33f2cb69d7024baf8e8b07142 +ZIUT = 0041249865c913b287a253150b207e2682efd96057cb0709e9bbb48c0fc9 + +COUNT = 10 +QCAVSx = 00000065aa4115e59e6045aaf99ee1beca1fab923bbdc919206e0931620ba996 +QCAVSy = 00000128d00b775899a58a59bcb2ab79d609e2dcda98e6523bb67168554f84e6 +dIUT = 000000ee639d89f0e433c075e2ef57cc243581e95b261f8a93b8ef6f5ebf8015 +QIUTx = 00000006638f6bcd85043395d01d767ff77e9d677f37ef400f2e16fee86dbaf2 +QIUTy = 0000006c12496266debb1d8343b9684e27c5f7129c17024a8e6704672a5f3d63 +ZIUT = 01cf480fbc2be2c2c4448c88890972c7ff9cbe08a75e26c3809596b8b5c0 + +COUNT = 11 +QCAVSx = 0000013576e700f36367fb741842f231889f36822aab2933c245eed57b9dacad +QCAVSy = 0000017910e9071a3e42e7f21b363f0e687d289810a4ec29c36ece14854e1dd1 +dIUT = 000000929b09b67b29aa4ff15d6779a1733065049faeb2c227012c49f277ed51 +QIUTx = 000000ca0403d95d85f0cb0ae4d2aeae18e187b79c201ed68c14ad24ed003922 +QIUTy = 000000cf6b0a502b290d0aeee820661accf6ea597687c45c7f93a773d25f62a6 +ZIUT = 01ce8abf3c8ccfa30e5f35ddb75f5e106aab1e67086156a1ededa1717b77 + +COUNT = 12 +QCAVSx = 000000e9fba71a64abb177fa436cb9739c9f68c0155adc897139c1bf3df99a53 +QCAVSy = 0000019af1131be47de08870835da14946fed73034179f809298d0149b16dd36 +dIUT = 000000e27af04efe2d86ffed6ecdf718fc0b8e049ed222e7600c3ce31ce4e97a +QIUTx = 00000145ec0db5fe62b92547792012268af21ba928a8fd98d0a1dee3d8fb2559 +QIUTy = 0000010a031cea56b183e93093008ab705cc9099e5b65c5cb4407324b96fee90 +ZIUT = 0025df759a20312361b9f6767efe8e8d69979e34639469a91fed9fce04f8 + +COUNT = 13 +QCAVSx = 0000011f994a416cc1990b8c61767a3d68fbea73af7b48b655e47470fccc791f +QCAVSy = 0000015de988835d6812f0bdd7007a895971e1a06f4d22ce1303c9f55efe647c +dIUT = 0000001a726d7b9928691eb0149ca8f0edee47bd0c734113ab6003241ee193de +QIUTx = 0000007426bfa8878fe59b16a9b8c63910a1e2fbc6b07ba995ba04c31402112e +QIUTy = 000000944e9616676cb2fc7fa0f9e1b87a358748243e80fb62264284645a6a4d +ZIUT = 00437ab4a53756ff678a1f580c0fd1f33b23021d62060808453b4aabe627 + +COUNT = 14 +QCAVSx = 0000010513620aee0d0478872438e99b23ea4900153f9366eb17d61bdf35aa19 +QCAVSy = 000001136dfbc8401bbda0d675ca06a0cff6bdd467c0ac9a978293300728e7dc +dIUT = 000000f459c7672169c1259e4e199333964c1fffbce75ad30dde1264f5cb86d1 +QIUTx = 000001b44a81895d2105fa16a6e09526c09ae7f6cbdbce210870f4e33db8b6f4 +QIUTy = 000000b1e072c62a2642975f06c687c6467da295ef93f04d1c5494a624683c80 +ZIUT = 01ebd55823c57d1fc7b36cf1ed2051ead64db6d114014d3407186f50d957 + +COUNT = 15 +QCAVSx = 00000035dffec9117ed7167627a24a3ebddd49a3f45d91ad18401d3d449b2fef +QCAVSy = 000001931754ce5cf557a1c1acedfe5e9a7b0b91f81643da8586a6865885f042 +dIUT = 000000656a47b8772b08b1d907c823fb6c45c65f9f18f8b43f3a61e6c74611e1 +QIUTx = 00000153cdbad92eb8d20da0c1c7aad46d08336cbc976e8d6f83947e4f4d6616 +QIUTy = 000001c977b97a5e1205ca66545df3a526b6e325e087c0e070839fe7ec1ee788 +ZIUT = 006d07f6e08b11a060ccec43b07ca7d9eaf6c3ece06f4785519284bf6f0a + +COUNT = 16 +QCAVSx = 0000004845ce661b1eae34c1699f1bfe38dc87ef28b8b0a7771ff366dc21d863 +QCAVSy = 000001096b1954b06eaa7073ed939801aa2974da1d60d66e97c31df0f6876faf +dIUT = 000000f14f5ec4efaf86e43fece65f17ff91b1a8d61be3416eeeb884f4e2d14e +QIUTx = 000001d9f8c01e9c20f6150ec7620a75e39e96f9247bece137b0365bec54254c +QIUTy = 0000006008373b9e087805294dadae00894667fdb9f6b8a4d16295e5b9d21a6d +ZIUT = 00aea594f092b4052f7564b2e5651bcf43ef7e336a064d6bfb1a89cf5e51 + +COUNT = 17 +QCAVSx = 0000014734192165c96fbdb794cab1e2d1ef111e1a20a7205db01aa803a032a2 +QCAVSy = 000001ecdfc3940b7d0618cd6315441751f663df74d356492ef934b4ba2b2ad1 +dIUT = 0000001fa5cbd88a146f6ccf5f79dfbc70868fd9bb4c8115976c96270ff7bc5e +QIUTx = 0000014d276f4281cb50a26b29ec81fced96d0e909994b2285433855256d58db +QIUTy = 000000ac4792af62a0dc4fd4eec384fbf3fbb82c8347486bc1eb1338bc7f3ab0 +ZIUT = 0099d6d076e14ccfee15ed7e7ef384bfee12deba8c9ae8f6cca3486a1494 + +COUNT = 18 +QCAVSx = 0000007e1f3251e2a0aa6de1f8df86b85ed9d11da5eb7136add45ea7d25c867c +QCAVSy = 000000d96281e0756de9daa55d2ef6573bb2fe2dd09b71d91191a5a043bae0f3 +dIUT = 000000f58684ea14a68fefb8cc26b267a13419c62d7261bad14e5368a9819a18 +QIUTx = 0000009a65a85394070fe0e5a108164eb289cc3d77ed0848fd57f384e62caa20 +QIUTy = 000000e7f56f2c27be4faeb20e274c2604c6dc2d88597030ad2164fad03cb904 +ZIUT = 01b1e977c43afd203132c085b95db0e2046a4b6ac2c046ee9ad665050578 + +COUNT = 19 +QCAVSx = 000000be1ee750f2712b2acb20c45e97357c50db3be895b33f830c71bc9f4f3d +QCAVSy = 0000015fec810cdb179fcd1ce8e4dc1a2499e40de8a4a49a9420f00e56110cf4 +dIUT = 000000eefb24789b32b436ce39622c114c39a6cd1e58ec9443c8870e5ee2f801 +QIUTx = 0000013fb1ca9ed709bb386fba02cc7862fd6c64e1087be5f61ea733946c1634 +QIUTy = 000001cb4097e44a730700debfe8143fbf9bca3a3d6c46985a27cd5043b2ca5a +ZIUT = 000e4cb704355cba1b40cee3da102cb048519a91b4c789b3757cfdd933aa + +COUNT = 20 +QCAVSx = 0000015c2e2ce0bc722cea4cbc7c3352cbe0d28b5b002e44d93705895d791afc +QCAVSy = 0000014f616983ad08e745315c4767b0ae21a6fd8a629c258ce7aefa4c17a8e0 +dIUT = 00000017524d506616bd205cb3978bc75e3a3476233e49b6dc206f9711697557 +QIUTx = 00000150a17327845e7bc79d8ece12930dc2b77654caa1082b57b0cf8e05b1ac +QIUTy = 000000151c76822d8df5effd8c6943395b6a8d538431d42e846e9ff8de7eaee6 +ZIUT = 00d8c13bc5e819c6101daef3f6fb5be6bccecf233c4b7fc65054e8e8d3bc + +COUNT = 21 +QCAVSx = 000000bafa9bba92725eef0c4a0afcbd4263e55f5155645b5c58a96bc3e9e965 +QCAVSy = 000000d1b3d0e35d617e09e078c571a5f41ea22dfd112d67a94d8dfbba66e9a9 +dIUT = 000000a6b05d30a703f1179a80f8a864b34ca15c453e82808a1095e435e9bacb +QIUTx = 00000093b3252251fd9d6d9c81d78cf1f134cdd554d63c2a1e2f1afa14e2d4e4 +QIUTy = 0000008aeb0a8ab3ff5e4fb023f7e1917f0108890af11abca7da027fadacc3b4 +ZIUT = 0129af50fa085133771753f297a313bba0d2f5882e7634b7ef5adce760ff + +COUNT = 22 +QCAVSx = 000000798bf5ab761bb6acfed0cef1cd71b3ef46f2504323cafc4081592dd6f6 +QCAVSy = 0000016277aeb3e1cac0121b07d9378a3a0cbc6567b48423929e36dc855e9d1a +dIUT = 000000168d09809eb9f6acf31134eb5eb1af966e212b9b6be68cfd22401425e9 +QIUTx = 000001710a05f02b5505729516b1ac73d45f3cf08f1c5134d2f73d12570243c9 +QIUTy = 0000018611b10dab507583f2be10fd4296f537d4af09576f96979f1eadfe291c +ZIUT = 0077c4ea1095fadc4cb4190a3fd530c7d15325e5d79b8e8a2b708e2344cf + +COUNT = 23 +QCAVSx = 0000015f723da9a38c2da5062c17d0b837522f7c69c793f79c17fb6965d44a03 +QCAVSy = 00000132b17760ac2e2bb9f813ed7790c5cd3aa0d38ab64e2e272ddf4a4c2c1a +dIUT = 0000003824f71ec3255bbd03642d782cc6794e1e54aa8fa5f2a331ee13f78450 +QIUTx = 000001a4e35a8c32717f2aaa3eeef177848e580e0fed6c8096868f6acc4e1c09 +QIUTy = 0000013727604e81d3a9d93d243fe79e2db8a442334a8ea1852b9f83cae1bc3e +ZIUT = 00d9eb3c79cf442595dad03ed4a38daf358b97d5dfc01cb61ff200a47958 + +COUNT = 24 +QCAVSx = 00000051b70bb8b8e2341b86821d54b974b696bda443acb7ea65965d27d2ac70 +QCAVSy = 000000c7784eef889c471c9d26b3e0de24ad2b4bf8bbba6fe18f51a412188058 +dIUT = 00000090adc0b207dae381622cf92e04bce7479180ec6e1771662f5c3179bd99 +QIUTx = 00000106adbf9bbfdb3083598a7f6db2e91d2e7c174f705fc216631b7d05edf2 +QIUTy = 00000190d84ca6f4695fdbca40d26a74998a05c3d761dbf08981b645c0ea239e +ZIUT = 0124c19cffc0b9549bfa378a548e8ce11ee7fca28d2d898de49ae1f2ff61 + + +[B-283] + +COUNT = 0 +QCAVSx = 02504e1a17819d39f010a4a69a0568299402b58f944a384c7d1a62c9c93ea4d1ff300e13 +QCAVSy = 0265132f7b4c64b74b9179ed0f2e211f4328d625405022f554170da932b80fdf7c1aab12 +dIUT = 02f43455842246a2cc8ec068e9d6c6e4160f6ba4e3b5d831d93c1daa8fd3d5a9660c7bb1 +QIUTx = 0561e495563018169804d4c8e2435b4afd85da376d914b69d39246f8e06113aa32e642d2 +QIUTy = 0781a7f59de7f42f5f9d6c3481f33fc5deb357c6ecf4c758e370d2435de3d8ee737703f4 +ZIUT = 065194e26090e74047ee75f13f9769d20e1b52189650011e283daa090732cc53755dc366 + +COUNT = 1 +QCAVSx = 01623a9675e8c40366e26131e47b1af06c8b33acf5e92f54644816dcb844382c944cc21f +QCAVSy = 029d280f4d4c0c5fd70f7e24095950128bea3cae3ca46f6a5f70b739fe1a990268804e38 +dIUT = 02b941e692e0a984c5ffa883c9f9f8256a43ab1fd1ad9782a42e429a94e910e482b91c23 +QIUTx = 07b90af116b737d9008e4c18f6ad539d29ee1790008a1daf2e856fa672eca4aafc96ca63 +QIUTy = 06aaf78d0f20657b77b97cca30eab79b679a3aaa90b10907f979cde988ce718491010c2a +ZIUT = 075c535cc70de19c92d7314afa2f33200903431f6990ad40ac31dadaf4e492a799b75b05 + +COUNT = 2 +QCAVSx = 07b8369728432f7528d3eec8a6788e69cd2eb88162c47512742ee0f027ccb4157a28a223 +QCAVSy = 05986eb7f109aa1f8556eba2bdc88e4913b65effb944eae639636cba7e01dc3718bcb361 +dIUT = 0287de172ba50f327bfc7d5a8c0156d25a1f0b9f71d389852f2e3b587406cb74ef3bd041 +QIUTx = 00a03490765fc90c23553c0e2b79dfa232b51a73f21554e5eb18da4c994d925f8ed2bbef +QIUTy = 0304ffd41c5b0ab2a70b82188e8f1578d6ab7d3ce3ce34fa45dcc32207f163e91c5d6814 +ZIUT = 02956f63d48a49a330e2068955cc2886dbfd5bf72a81b10ed83f2d758dd315eca172927d + +COUNT = 3 +QCAVSx = 073b092a2a4d7c9a17bb88e75b40a9e4e43b99813cf61682d49b92905c2dd606790aed39 +QCAVSy = 0566ad452a2d8ef0a327ce8e2856146fecaf09e4431ccc04256a077f60701ce4476b6dac +dIUT = 0153bbb8a3ce4a1b99960f56186ab50207f588f30c94beef28408423ba44fc875faf38d8 +QIUTx = 04f2c2454899623af13b65820aba145738407f77186abafa52d24b35bfdf5808ffeae076 +QIUTy = 0111f448460ad2430aaec788de291548475a1e5836dac520d8e493c9f601275e70ea29d2 +ZIUT = 068a3f6938c44b797524377508585842c6a7f1af5ffe9131dd3ff786ae56e1739345d3d7 + +COUNT = 4 +QCAVSx = 0455e87bc230ce7fc586312dd207c529e47e3c74cc0ce5d073fbf4b1c957f8cbbd9113bc +QCAVSy = 021ffbf62fb2531db39ef2d0bdce0d9c141c92e9cdca627caa39b593fc4a0210e8ee481f +dIUT = 032ac0dcb9aa3972401f9f58845ed765da36b7d6f77355779bfb2439827ff3556a75781c +QIUTx = 07159c86b9c6adb2160c28d86118f84564a90c149ede28329463677a4c87729f897c2f98 +QIUTy = 008a78167e1690625992b0efc2e0ef6f6d61e81837c8ecdfdab51d15340e37e7d8d05120 +ZIUT = 019b48d5eeaeb05b58801ae8f345ad9bacb91daac885e506949b849ebc67bcbfa308aab7 + +COUNT = 5 +QCAVSx = 0652ccc8921f439af42a2301236b5843a42f1fd99ecfe1b4134c3de014cdc76035347cc0 +QCAVSy = 03341d80749f1a5ec9f7ac6252384fefd38b6f2bbcdc18febe86c160f5e78c003f066e06 +dIUT = 02689bf21475d32fe71a7355efd9a7787caa9545ebeb853e5184ce42152429051f40cbc4 +QIUTx = 00d7e5bcfac578fcd728180645176d7e088b68d330a209f18b968662fed16342b3921a20 +QIUTy = 06f750b3b5e98e0099b695965aa1d16475d1074f9231127ed703e2696d4b56afdebbceaa +ZIUT = 061b3bef1766460f6296ed47d39ebf5a710d202d2b7e7cac0f0d3b235405eece99aa30d7 + +COUNT = 6 +QCAVSx = 062331b933afb4384fa3a4d224551ae8120bc55fc7ea73f2be749e217afc4e1ba79e760f +QCAVSy = 02bf51c44f8361c3054cad640f92446fe3820b063cf4bb22ca17c0a274fd46f50504fbec +dIUT = 01052042988dddf470d0a2e36fff5b93ec69f4d240a8e37c064cc4d599467ba27af3c9f1 +QIUTx = 00c7c9ff77e018b8801bddf886702556b126a6d9a1831a1f60f35872e524c134d553e4a4 +QIUTy = 0035d767b58b499d9fb54562c3830411af59e7088a4a3333d5dc7fe5b0f7f1e1c5e3ac2b +ZIUT = 055d579458860a3dd92ac6570847632f04460755c22a4c432cf4dde9611d2ce1608ca185 + +COUNT = 7 +QCAVSx = 021e82d6af6d321198176ff8986c2bc786a0081326cc85f026b71b32ac06c0bae6b4cba2 +QCAVSy = 01e9733fa9d29961269420db24edc0d5ae285d78c9ae14b38b1019f13652f190277dc47f +dIUT = 03bb9ad5fa552d38d1a77cb553c631e2d0940db6b04f0bd7011ea735be50d045da9a9c1d +QIUTx = 0687071805c25a7d0b1739f7cf681b2f295c4f9d8937351d21d1d43f634e9a57105bf127 +QIUTy = 0633ba21872e379c50e448372b1c0e65e85d07edd712d7dc06fa69a299f6037dece660dc +ZIUT = 054fa7c6c84fb89e5892d9194540860ea31ae2b6e37a86971344230ea512a3f6c0569216 + +COUNT = 8 +QCAVSx = 045d62d01db5ef173d0cff315a92a9a105d1ad784ff9b08e721f3580e06265ff538a194b +QCAVSy = 06b764c1ff76985496b94451b756c4f30fdfc638d8990312bbeccbfbd73e8c5a855adb75 +dIUT = 0133aa445dc80d7d5a097d1da11d510e6571a783b4fb235402717d68ba8fd1454e6b319f +QIUTx = 02d26e46a6ed9fcf1d2f89c63d80e0172dedb4f5aeddff092836aac8599094885557ead9 +QIUTy = 07d6713974701c160aedec8f94e6446bf7d3c790cbff8702cc7840a7818e5b626271f723 +ZIUT = 0353ff03afda3772984aadc4000e1275656607154b06c3a59c664945fa6fde1c255ffa86 + +COUNT = 9 +QCAVSx = 04a561b5184aded9c7bd9868f3043b5e2de51908f9c03d5e6b08a3088bcc50ee3203e263 +QCAVSy = 05815b579ff5dec6fac977ba7088b333bf4c0231da021874ee00d71fe25d3f4d50a57ac3 +dIUT = 004661f107a9b570045ddbb0738ab69b1c17a9acc11da5dac7fd864b3dfc36a25282d6aa +QIUTx = 061babbefee5211c4917506ce5f9f9e3d1e52b2506f38ca096e1b653ca9fb69f46105702 +QIUTy = 0014bfd2ef228b5a03e26230c1e897ad081a704013cee55166ca46de395fc52f5d21203a +ZIUT = 050795ba093d2e02398c358951f20c9e3b4f60628a96a4d0c46cb8fc0005e5331b38a09a + +COUNT = 10 +QCAVSx = 01d7d7536cd8383e1c0b1b8aae02baa9fd2c4e68b21808c1754d0b151361157f81245930 +QCAVSy = 073034da416797da95a3836eef27b1fa271f59a434848e980bad2fdd53ffd1e366ff6917 +dIUT = 0036bd21f84ab9db6f4bddc94635f19f80acb2813da5399e0777832c2febdc71862abe33 +QIUTx = 068ee3245754d51df7780046af39acb407c4998c620bff94fb374faf4b498006eea0cf88 +QIUTy = 0366a449f09ecfbaecc49d880307f57246c11c5bea00af42718677a8def15e5926da1822 +ZIUT = 02ab08d63cdb4be2502558e67eab27570f2d029e7f981d153b973080585d01e42f7187d9 + +COUNT = 11 +QCAVSx = 02042f5a3fe5e3d3335bb7bcdb9dcbd8716ed18d7fc2ff4297bc1feb7cca310022e2213d +QCAVSy = 07bebb6c0e046d5afdbfa87ea98ca7f55e9cdbb055d0cc549b4458d6998bdbb345177388 +dIUT = 016597ae6e49e79d069034972a63525a3c3e2d2c253b9e1dd3f37816812cf54ad65c546a +QIUTx = 050ea073522dbe51408f85f0a6086bd4c8efe572f80aadadd7e70ebb4b728bfdbfd4f1bc +QIUTy = 07da520017c7ad2916a2719b8558958f77c712d352cff9c0ad99fbc98a0e065eb7ac7feb +ZIUT = 0599757e3ffeb484b32d3b47828b6823d46786d35477082ceacf3a5a11552394fe58f53b + +COUNT = 12 +QCAVSx = 067afdf788f8f4831c3c7d7604d07a5bdc59da42d932731faf5eaf0753280966ab693790 +QCAVSy = 001b39d1d872b65e31251c1f584e4fe3ed75d53ad90e836fe90c8db94fe77cef0bca7204 +dIUT = 015ea8567c7b82b483fa365e8e681c0a635f563a1c81470b4dfe44f194fa91eb7842181e +QIUTx = 07afe2b22b54fe895c242c20c054989fa804e591970dda8a7ce109d6bd31b6daa8f2fc74 +QIUTy = 060733bd5a4ea9b5ea7090acfee918106b7f25272f3f7cb36eda38bacd21375610cde928 +ZIUT = 005e331af55e96153d8a7b906a4a19016a26381977b49f80b9d70db099053c6a3b8e80d5 + +COUNT = 13 +QCAVSx = 018866a4fa2f7c2534e563a291de871a8b3052a674f5dbc23b9dea0e8cefda06abc32c8f +QCAVSy = 058dc4cf1bf985d1b566970847cba6b8a4f40c7e62a5808b0720bbb8cdf3b4531e380be7 +dIUT = 002911d938d9508aeccb9877e127d1b1461acdaed035f20e0f744c774f1c72703b5c4b49 +QIUTx = 0386bfdfe60373be114b417c4dceb443223fde67c0fef29ed0f867b5a15f5ea0ccb4dcca +QIUTy = 02fac38ec8494cf7576233ec8282de384b67f0ca8048084201039d194c8bda4f6e0aff3e +ZIUT = 07e132ea71a16c7cc261b9d6ff6fc52cc490da616b07d92f9e591fc1e630d3442572338f + +COUNT = 14 +QCAVSx = 000571d7bef056089172f13423a585ab979f4b8f77e752c042c0c65263b476981e5f3157 +QCAVSy = 044bca693e9d3b1a7fa6ad42db7f36b1a65712d09ef3bb715e2640a182f436620686c0a4 +dIUT = 01662f554856c0208a31b195148f828e0b5c92a4ea4c033248bebf957b586b409ed59850 +QIUTx = 07055264c3de3a622d26fe7ad700bdea045d4b3ce718f4e6ae44cf376c3a96a2650b3221 +QIUTy = 00f45cc1138668adc8150d37c072bb4245660c18785683c7b17aa1fb8591ba6cda23657a +ZIUT = 010f26817098ce1bbd6743784d6fb65e60699c14933a2c8d854027aa58b58db9e66a53a7 + +COUNT = 15 +QCAVSx = 016eb4bbb3c386e0f42fb037bee478c4c0dbfbe55cc68e33fdb029b9e5e724aff4fd8bf6 +QCAVSy = 0251432f84568a44971e86ab715d3879e614e10725735ef8fb6652d079c7908f11bd1f01 +dIUT = 012c0100a9963ee17d7acf4ddf8e02d8ae75f3b99114f5366afb4a00ade9a3c0ee39a887 +QIUTx = 07794fa19c6b10d399e0f52d36f483c7851848e62bacf95b5af51eca09ad445ee19ef34d +QIUTy = 06140d2ee16cd0a6cb1960509a7ccc664be97644a95ae16f4a173d9a867015f0837f0560 +ZIUT = 00bdd8ccd1b40c5bc2efc1c105999350fefaf784710914ff639582f1277678699491140c + +COUNT = 16 +QCAVSx = 02417c65694d850c7c866f7e11639a5f8718ca9aabb392fa8610e2d5d7dda3375a607f9b +QCAVSy = 05133938dc99144d16ea7525c3fe4e32e320ed075b96527e13b2a99c9f27ade9ef9edcb6 +dIUT = 0345c276b05ece9e7c86811f8c8af48b22db41d4066275009611b880d7d2cef329c50e82 +QIUTx = 007afffcfa31c110aab3bb394530a41c416af566bfba8f159f984437e799dddaaf8cdfd2 +QIUTy = 065fb3c68446a74068bab7e36ab80e984707e39a4a143f5a46d646342f9f12f26a32291b +ZIUT = 014a83e747c90aec6101c0a752d92eef7475b00051ecad3d7c2e50cf4eba1ef3c80b8c94 + +COUNT = 17 +QCAVSx = 00c5d6149f87174ba37f4c1c6f67f6905abb319f526b7aa1be1dd205df930ab1c91bb1f8 +QCAVSy = 00c2e21e1206cd4bb5b622abe97ca3f252cbc68d054a77f8ebabad593fb1863306928bf7 +dIUT = 03afd5affa346b5259697d9217952afcd03ddfec04631bd995c10ac2583b0ca8d2461f5d +QIUTx = 06b4c2c3615b266543de189c896cff77b5557c782c215961ac7324185fc9a81098f2ebea +QIUTy = 047fef1960739ae0aee39a3ffdb82e890d4236fc22dad395d490bc3a5eea58e8cd03edbb +ZIUT = 00afd29e352779a39021536ea50c24fa264c599f8f8fe8f2ccf0615a6547a064d7c1a150 + +COUNT = 18 +QCAVSx = 0173044e5be63997d7925e431bbf004cf0f0ba85aa295a341e8f5857a120be89d77653e9 +QCAVSy = 0737cc049690f970824a7b0c2022439682c9d82f4f23e48e5f07fea96267ca3bd4d730a5 +dIUT = 03d5771f8485c3b8be62a56f3936513e3b631a561a942613df95140f473214df617c4c4e +QIUTx = 05906cc4529b220228efbb0545bf55ec03c86f87e2f4e3a3cbf404e07b73a5b1a5f528cd +QIUTy = 016588e480c4856cd2ee9aaf1e302812fbc0b33f527c29b77ce0f4878ea089d025a440c0 +ZIUT = 0477990f17d65589289c28e54a56a83bc05ef4ea6863c5ebe840925c9fbef64ccd6e69a4 + +COUNT = 19 +QCAVSx = 068587e69deddf4b55ac51f2a17dd8bfd6f94e721003214215bfb24b248281e75a3c6594 +QCAVSy = 044eee9c702bc4c1e210c7cc214524592568ac0f9fd67d6ea02b4dc3efb42cfbb2263dac +dIUT = 00e2c0c602fb132399ee9f31008365ea22cc1260f79fe3ae61089b8a6fa4559cac91aec8 +QIUTx = 06e6e318c0c4c0b661dfd3e722090ecd32fdc9ca3d168d9c7174c1d40adbb2ce672d9252 +QIUTy = 040bdc1dbc7b163f7c9551f47daa8294ac2dc4fe0d472c4e2f2cfefc95d523ff59e0e880 +ZIUT = 067a661346fe052ca27f3f03e75bbdfc8fe6d0d85c62c8f79525252aa241ae9de97d56c3 + +COUNT = 20 +QCAVSx = 03f1226d802c575f871a213b8150f7818bbd625663b73e720a737f071896086da0b14cd9 +QCAVSy = 07d1cb0ce19c98a63aaf7b314f1f5720e32887053384ac0f5eb69b6c471a8e3d3d16e76f +dIUT = 032d573fdeb85a4da2297896631414518d4ba07dc4dd72f731728890d0b44d36f2309c0e +QIUTx = 06f6ffea0a87bd9eeb539c48a3fcbf388159862259c7f7840e64809fbedb01a83812c0c6 +QIUTy = 07c795b8f2847fc39fa56c2de1e6cbbf4945087cb2e3b919dc776b4cc1c83e4b1c79b8ba +ZIUT = 06476b0620eef165941a4507e6d798d6f150ab29333c0552281b629170d3291b2f9b3f41 + +COUNT = 21 +QCAVSx = 02a911e7e6d2fc770d1eabc7df701bb119084a685900d22d52d598fe1d28fc891b31b487 +QCAVSy = 01b8dc6713ca453e91b2ec4e4d1f834b08eebc7e8886c3a458e70925242c4b22bf0b2053 +dIUT = 00a6aacb5dd3e835814f452d8207d15a533638f70e94f87c06196eff8838d48eed2e2674 +QIUTx = 02dd0093a8d419831f34bac6c60a570c51d08e699b181c964b667d0d17ed72a49119acd9 +QIUTy = 01a91976be5d5e037f22350d67ab7bfab51bbc4fa6026d347d28fb4407bccc40dd10a00e +ZIUT = 0746719f2ad08f8a8d6d6fbf15723f336285ce75d3a2fcbd5a0c54c577517a22bc264161 + +COUNT = 22 +QCAVSx = 07541aa51d7302e2bb557c27ec15d7f9c3ae3b76ec2f86cb95e8dead7fa06b578397f1f1 +QCAVSy = 017ea22f6b5474f0f5f0f4ead54172064051538d3e232a530dfca5f2a0dc67746c8bb1da +dIUT = 00112fb2ab56443765676a1e41b3cb91eb1a6790e964ee900cfc9295636ba4c6fa87aad2 +QIUTx = 03f507d99cc2498e2c7f54fb3c9c032f382548e2e3168fa140125a526048568f3bb3e5a1 +QIUTy = 05270df77efc7d6c55f9259bc82273c9b6bdf3676e13c3601b1b3022b962de1129cb3b14 +ZIUT = 03cda4b5f44b5d3dc248310f994419fbcbd665115d1876046652251ad4aeeb1dcf184288 + +COUNT = 23 +QCAVSx = 021fb14e52cd4243a520f630229b1dd6961c49bd96f43fa9cae37add84da7ae72dc3078e +QCAVSy = 00dd638bf9053fad6aa4ff2d330b8a4a20bfe3020f40b9692302d0b0a3c2d877856ec46a +dIUT = 03e4f1c4f30e2a8d6fd559f7fe8820e886949de87c01d8eb64c7b40f1548cb617a926033 +QIUTx = 05e3fc56ec162885c1291e4ae9c19c8eb2bb559eb7ecd5817549b5a2ea3a66d951880aa6 +QIUTy = 04c004f2ae4db4f748b437bc115e06ea2017a87798298dd6004616fcffdcc7ec2dfd6db9 +ZIUT = 015c892f95768a96ab5a4f9523b7fd466e101f63b88ad8f1fecb3027cd70aa00735dcc90 + +COUNT = 24 +QCAVSx = 00d08ed3856abef7d4a62243c92d6e670ceb3af32357fdb9d39c19175a10d1cbab36ce78 +QCAVSy = 05db9fad7fc8afe79c8b9ce48e62ffa0d46b805a9e5821e2761c25c0edba92b120b063f2 +dIUT = 00ae7eb3d40354f9f8fed18f2162dee38156cae0535b55370da3638f01668aecf9708be6 +QIUTx = 061e8858e368d9c917f129d932ddc4cca521ff419f1d74230e8aa5b1b3e9ce67f41c4b4c +QIUTy = 02b0d7fbdc636a3bc34bbdd2a89291b567b0fb2af32383868bd40d4ba4cac9880c2540b8 +ZIUT = 01adf5a96358e18d69fd383b4dc7b20dd646b68a5c9f1417bcf426240ca22b8f32bdf1a4 + + +[B-409] + +COUNT = 0 +QCAVSx = 0146989a50297be373dd665c45455a2ae4c221da5cd424007bd97f9e8e846f96740f3fa58c3c94129671cdd4d7ea650a2aade9d7 +QCAVSy = 01b42bffda843946a14ad6080f95b8fc6b7e173528d08ed36fe640aaf85aa00fb5edd5905a38b3c7961b7722b77b8dcb44bb25f5 +dIUT = 00ace92103ffe262ac17ad42a46d4366f4cb4c580eff3ab1dde6bddfdbb7374811d52b1fa99320b4af5d4e9208c14eb8efa8916c +QIUTx = 004ebc4d4acf9b404dabc3af3e8cbea8b88b32999d3ecb7f367b12eb3a6280b840038e22681637a7d16436e014f69616abf72e45 +QIUTy = 009e24109541c8024217e9ab2c963fa9e373640095a6c25a26eefac58e4342c0c85448b2709592a12402fe2b68a793c558ce8cd6 +ZIUT = 01d48a586be9285fa38dd3e70b0330b0ffebd327ceefef88fdc1521ef2fd61cbc9124e03b0c926e70fa56acb3edb54c3c48fab2b + +COUNT = 1 +QCAVSx = 017e9f01b1d6e5702328330d232a1dd3f2c592cc409f6caef0708440837f3597510f111954aa51e5646ccf47eff1f07a4f8ae1cb +QCAVSy = 003714f6ea1fd143ce751e2d85baf54c5523976108ed482fd6ae103743131ca716026b16a1e496231f991cdc8f6db447f5f95f8e +dIUT = 003ff22f7d7c049989a43e0ea3f5d61798159c178aa792d79d1ffebff8db70ee1fde040a4b5f1ed33fb3ff23c44e7c6b21b0623b +QIUTx = 01d5c9260e73ea36e4deaaa4b8f4541f678066b690771a86f0dadc580fdb895981e6dd02dd264ed9f9c1763bd54a6052a2d3dba7 +QIUTy = 011a706826365ece28e38b33620bca016d2d9338518dfd6868370476dacb41e3b947465769ebe81b620731673576f77451d0fe14 +ZIUT = 01856c92b46d671d8a7f6cc468efb60a61093d006c95bb931c1fccc336d4a8490fe17fe163c972bac39fe728f24534a0c34d2d21 + +COUNT = 2 +QCAVSx = 0183ee355a93cd13aff1756a08e58e2195a826298d43f6d07bb1c382b4e568d0080939260009c6afcbed0f23252e01d6d14c6d8f +QCAVSy = 01b2309b3819c2454a48ad253ac97bce3c79b51f50ed6803cf05464b74a5a1de22113e23c018c5ced9186ddb981c629e2e9db3ee +dIUT = 0096de2c3929c4085f9cc1d3778c2dbf3db7f0f77e7ba7bbc4e408c7d65e2c8b88b0755f160badb524e7697c50e60c8d99e56da4 +QIUTx = 019c47d79914c8bdae754ec5ec1e81c8ff329a938e6971eee3c945c4ebf489e14b15e6135616c898c80b7b06b8af67061c769ab5 +QIUTy = 000088022b4fb0e754ec4fab8cf4fc636255426755fa99b56805c15eac04325155dccbfa4145e161c40f189bdbaa3dd3e0c3d6c9 +ZIUT = 01972e225e08b47512e92c0da9a1bdddb1802be402222cac5788b322e101feeb06b66b2fe726c1cd8aec92e02f37d15f4c97e64d + +COUNT = 3 +QCAVSx = 00e85de9d63e34e5c7bba6ff9b16f4c84d95f11dfe92107b1fbecae98ce6eff3db96d86900bfd22cd423dbce1e5726be8e597933 +QCAVSy = 00b7141771f7c816d55ec8c53822d2e7a192fa54a17e5b99b2d90961b54a99fed53aba4bda1a4074ad3d23f9c911205795b5450b +dIUT = 00abd5d61cde31180301c269d52af856baa39b89f5ef45367f5519210c71d77b318d053ec0c2f49bf46de05cabf23c7d2bd7d23f +QIUTx = 01a7ef3d17c301e8661ba66c1cdee82a9b44d716909e3663b423dc06ef6be4f616cd179321ce7a572da4bca2e89b768edc8459b3 +QIUTy = 00df743849a20bc3026062b420d3942f18e2d6c5307e6e1955e33b09d5951dc59b31a2b1d58c233e2c896e2d9ccaa8eeb8e8f113 +ZIUT = 00b6661a866abbf1843dea8f220e360fe7cd7d9e85c316138fd2532a57d7d2a6bfe6e5518019c603a2d0e338ac6a8690093c2883 + +COUNT = 4 +QCAVSx = 00ca870acbe4eb3ae65edd95d6944eb090e0e550712be3b1369e473203f52b1838654f7a4342bd8309704fed6933ae9d162ccd7d +QCAVSy = 01796cc286bf3d53ad636977374f8356e45730b7aa43805fb52801f73be3e9b32808984aaebbed7be5e39e51335b0dff34782948 +dIUT = 00f323c8ee433c9ba15d3708069834acc4d937be5017e1d182ec76466aba282c73b5e3e96fe106143641402c72c62484ba1f12f2 +QIUTx = 00b74f52520119fc08536cea584220de9b062401e64ff6359305c2e6b0c04a95f77baf53e23c326aee76211495c30b2c150b9275 +QIUTy = 01540588e2fd5688d1b35763908c1f823eeeca8942f6216ce04cef66ed6991df6a22fb74411b13d06513a65b64e62815ee020697 +ZIUT = 010889037c707d90b833d03256ff2e8a5ffce16fb3613486221494a4fee82e74625a93d966c2028d0930115494f9456cec4d2b6d + +COUNT = 5 +QCAVSx = 007eb61dfddfc3c0d083fe2213967986381d9e30e684afdf2bac8f1a362e8c6d6358df95930600427dfc1eb14118fd1239b67b69 +QCAVSy = 015ba87f98114cec8b2cb45bba3dcf006b287e07e3bef1da27ce08da9e4f48bd241f59a1f9c93c837884715750f4085f913f4f7a +dIUT = 00133da2ba54b36244c8042f0e2da3718e56dbd2848ef427bddb24177f624475b53400afdcb18879e8fe6b4609a4f7bbc2152b13 +QIUTx = 00e3a2f4e63cfbc1ee844745ab3e1e5be573204609aece5e28b8fb8ab8ae06898467a95a7b59c0898a414abff2703ccbcdc09209 +QIUTy = 010d73c43b630170395104acad6c1a563d3296632332a1481ddc2c31836bd1a3ee1a7364d7f5b8295db95a3745b4bbbeb8095bc2 +ZIUT = 010a8aafbb243fc9466bf381eae173c01be95d88a9c131b07ed54d2f117cd3af4019ffb196ebe8290b1269622f9df26763ffa211 + +COUNT = 6 +QCAVSx = 0082f148ec34d1d08b26e79e3772e12d659598b73b6fff0bab1845e9a5b5071449ef2759fed63aa80624b83a6b2e9d739b83f6db +QCAVSy = 0109cea048a720ba749fc522c85af5fe783751c39fe8d0515ba0f0d3dcd19f18c22da3909f02d78735aa11b2feba0f8d330c5703 +dIUT = 00df7554c0132fd4e4a2b9217875f9924a55cab319b76a7c179cf0222937579996cf94920bafd453e52f5d2fc48001329fbd78c4 +QIUTx = 0160851cff947ce72a118aab4dad4ce2c3ce9bc330ce1d06efad7f630e45bbcf37097d94051d9d310abffa8d96ed22a847cbe693 +QIUTy = 0079a3ddde636bc62af41e6ec0e073fe6462e38ad4b9e3a36ecc8113a2c6394ced21abdc8ec5969e58e009ea13dbe929a96709ca +ZIUT = 01e17b8844c4c757553a628d6f4c48f3a337ed2bbb6e4047dbfcfbfd02bb81c6e096f8ccbb7f2e5d10ee9cbcc960e3a99e79bd09 + +COUNT = 7 +QCAVSx = 0083ca04df8458e5e6ce6e13b937dab498521d826fb9541234567e995f0683c80f438516eeff0cf8918a5f8b5262ccdca3997417 +QCAVSy = 005f8b3c20e3fe2559efe0e85a12276df922ef0f4257fe703be2529f6effb6f299a1a251c01e38d43ca6ca576ef1e0beb6c9121e +dIUT = 0032735dd7f118d29f9f3cab3a072db8c886d42fa5de7bea65036ed3c8d44a11e8f96f4e1a6f254888cab214305191a26dd1dad1 +QIUTx = 002d39e0f89fb875151ee3b354f8ea159e7fba6f23f8a764d49e07ef43f18d3cf86e1baaae0ad79d4000709a50252f1ce3603135 +QIUTy = 00ce44a9b775b03cf42b310249660794c25e0422b03ad9babaa23610613251fe0e54046e04f9210436dd376003d18f98dfdae189 +ZIUT = 01167edf7a3c50e13be126eb2caf6b5f8f761cc8dba413246423b877df74a3aa3f48144b44cd133ad9f2d05ef97a08f7ca511d7f + +COUNT = 8 +QCAVSx = 01311536a9745b7475e6c2fd724c23d9ea66803a139b47e3ae263b0fb7e42e3316279bbf622ae262531b2e2283ecc1a6127c9b09 +QCAVSy = 01d48ccc781f0bdec3130910044b76909a9abd7fcb18407dc42f63912fa2667208003ab2d28102adcfb93ddc053760e53c2daa78 +dIUT = 00b04f33b68799630d62f44337c77c5a6b6e0f7606b5c87244aa4e7da698cc8ff1d3311b48ee7c9a6812baf9054379aeb61c0c13 +QIUTx = 01c5940c2de2b3735824ae2994c15086fa958750e4d83123af047e9b3c264746c9b5d919da215355d8c28b2808a37d0cc5f2f6a1 +QIUTy = 000abfe6f1510a182eff78dd802e9ba21e668aea5732c732ddfc5df9301f5899f02bae80f8282601ef3eefe414ef2c726fe00258 +ZIUT = 015c0d202bfdee2dfbd4be91625171992e6c6b1a1d06cc1b2b66ed64c9d928bd4f062912900d3f89045c7190f513d3b019a634f5 + +COUNT = 9 +QCAVSx = 010c273530f54fe174bbbd5c2771a55a42e64050c3bf2523e6082af476eb025787696edf6e438dd056b598f5000633c264fd7ba5 +QCAVSy = 00443e72da93b0c7825f4223c796826fd1322345ea25adf3df1a2c6958908c0fd9b13e93cc005f4ecb155a2fff7ac54fa8180785 +dIUT = 00d4ebc31c9a65ee3b1abd9d6e6495780c54e633f5a2a9f61c8408d767d0916d91cb54cfcd937538df92cfc45938e33b77d724f2 +QIUTx = 014dfaaa70518f367cdfca89795a0db374bb7b407a58caac24ba46824dce78501067d7e0467d30b9e1fdbb0a7eace15fb0c208cf +QIUTy = 019d62be2b12a17a78f6c9f7e703669765f763c6235fe7af78f25044e99c4b1b90653640b3f0ae481a55d47d1eb17b86c5bada1b +ZIUT = 007c32383aae80e1111207894c8cc5be66fe538af4a19195742a94a4c3f5c765d9776a56177c485ddb53c038b70478959d374627 + +COUNT = 10 +QCAVSx = 013beb8d36d1e7f53d80beea33efc3e0098deaeaa17977da8f9aae9c576e7920e8f6da55a20930ce60fd490b4fb0154d49277d99 +QCAVSy = 011dc1d87f352e12bdb41a1b7a1f1e516629ed323c5d5b263ff036f023f0ff5f722d056c24a411f53b347d0786d84f7be879105a +dIUT = 0026176aaf98a6433566f1dcc1919e94453e9cbf3c97e069b4a17426449167f6a1089ac16a102a4b3e432a978bfb46255dc43d1a +QIUTx = 01535fc949b49030308bc0da9793d57088766ac8cf22e8d6c276d8f3f7650f30135e1f6c00300c1344e2f0306ea0e270b09a80af +QIUTy = 00b8fc3fa61dc22c55501f2a6b2944946d99f7bbfefbec7acf4fb200c1002e322c39172ec0a2b6ce0807f1e3ebb1ea3400353143 +ZIUT = 01166107ab98db1dbe22c5888a70c992af4faf4623ef593802aedfe433809c53ef4ab0b2dc4dc2546488b356ef3265356055d8f5 + +COUNT = 11 +QCAVSx = 01690c74649e92e1c1004f43fd6e4690be595904c56d2acd85a49af0a17d34368c8768d039ede9c92ad26b26306b5ffdef7bfd19 +QCAVSy = 0081275f7e2ff068a6c1b92dd38c034256ed7322b027702994c74f5b818124d34a190987fd658892fc99e7acb9877bd6fe946919 +dIUT = 00bf3e7395c72aa84c0960e5c69022ce39067404534473c4c7829424f81f1d44b31f20e2b982e251cf9ffb327a7d834f59d1948a +QIUTx = 011cbc4ed9036a27effc89ffd55fa1e3ead0fb93bacfa0a78bcafe3914ab1a97860fec1334caaba07243591603e67791aea4bcb7 +QIUTy = 0101074c444627630ad0a5258e24438d71f26ab94d05bb47d1ab97858c4b92c6ff1cb9be66b984fe8e16e44f393e63f9d64281c8 +ZIUT = 007e7a249094eb52bee0115b8bd5545f81bf0b7d66998fe124c9a3dd3c5715d03b2f973d47c19af5108a2ae005fcca65e61f337d + +COUNT = 12 +QCAVSx = 005c24f4ad9bdcb1460685a22da54dbddd1507ef6de469da4170ce30147579a54945dbb1bce9f02e470033bb15fc1a70f831e79b +QCAVSy = 017ca932b90a08ca2e3f55c50cc0e13d279d7bc9119c573c3f741410bb7c1cad1076c3ba42aed1ce69d56228b082fb6de0eefb68 +dIUT = 0096d403b0fa601c9a75aa7de9fe9e11d42efa93d96dd35102da05d3ac807e44194e18e79c8b5be11c5fb39c8bd4e312325afaf2 +QIUTx = 0009833946294d4aeecdb6f7254ca489c0ff13af2dc6e2ca5626835d5dd22241440c37a63690cd11867581ff61b7252d07afb8ff +QIUTy = 006183fee6f4d6ef5b723c53c96c5c1ecdd84652e379c937878d766f83370500412359c22d4778bdf807b3c84e5b83350910a1a9 +ZIUT = 00b9d8b68642b2729340d8b7c5ed3b3a8913c4a3f6b947473017c0e105bc7edc60daa9b0732772220f93eca4878085f756e3adad + +COUNT = 13 +QCAVSx = 00aabf6aabb3e90f956d7004ffc893c70f8e90cdc31fc0c7a88f16320541d58443af39405d888d9676557cdd394b27dc5449f945 +QCAVSy = 0127f26dba06c33f8fb45d955cfdb5cedda93dd8a45db42ee0b9264a054c16a87bedad45c0d9a0f35bbc6aa7a1295622e83ebe8b +dIUT = 0067125ec309ab5dc7ea568f8815a2b30cfac3366bb4f0160d53738ab995ce75681fcd5e492f3a9725b4cf75ba4301a786049342 +QIUTx = 01f1d1aee5fc594ca4a22b81bad707d821bef3253966f5d77956157483961696f4c60476a42b452b89c1ecb3615475ec9c96dc87 +QIUTy = 00755c5ef55889b415cefa0e881a3efc9be86f36c67615423b452eab4cd5611aef4198ddb31aecb434eeeec12edd05913af19fc4 +ZIUT = 017d60394c7ee64ba73db91484713370daa821255807349c237e5849411bf0bab3a1b353be3cd07eeddc5c2ffc74336225dae6f7 + +COUNT = 14 +QCAVSx = 001f4ffbf22f67c1591b0a770e563c0aba66fe01561c5e227e522b5dde23c748cacf8f4a02290de26b47767d388a5c836d3eff4b +QCAVSy = 002d273f2e8516e508388f8ed2015ec9fe67c66f832cf2b261dfad5856128042fb4a61a91a37b341de4296d4bf63bf67a3458a74 +dIUT = 006b2cc2387f69afd43978b7f66bd17666257081ba4d66ee6a9a82b7c87c4ac5f0eba6bc2d981ca1da9ff202ba72cb7fe9c06cf0 +QIUTx = 0086a44d6ee4e8c50d1e10d7d1d113a9610750210679e0e4cab8c62267842938ad5d933c980eef9d4644791bbfd35bbac649d213 +QIUTy = 011da63212631605fea0e93f5826b1929b2bd1db950615fcb05eb47bd9cb69eae03b1c33d7a9e47b335a40498238fedb8999b04d +ZIUT = 00b19e052edd44421ee2f5ba845911fed9183d885da85d51dc819ca565ce574f7db257509876377b40c5a08349019563b60e13e9 + +COUNT = 15 +QCAVSx = 01b0833eb3440450e3fa5148c25c2df2e0020626f2407422217e4ecb8bd8a751a72bab2ec5642ae90fd29d8c4d79e9cc191b5ba5 +QCAVSy = 0023078905b6a33009ffea1a1977db943579afbeb871970059696b29ef90dd8461776b343a09c853a538e4f22fdf854fcbf3b734 +dIUT = 003e098f3f195e89da71d6367000f804079adca3275b2e793e8d312c8e402cf0d0ce5331742f87515f4dd9cc668246194b9572b6 +QIUTx = 010af4ae334ba40bd6538e0f095aa56f61a2bd2b5f38e954b7617d92ba10603cdcca836554d0242ddb37d5e1576b0be69f0eece7 +QIUTy = 01b335521aec305f314d7f23ed28cc0c4d23f33a6785fc6c6de93e5fabce271302f9557f6d2ae77c52720eda5a2e15436443dfd2 +ZIUT = 01697512676ae56ff5ab778c411042d217ad24a24ea05bbc253e4395fecc8a07fe77ae0ca4ed977459f1a14d9b83931bccf46107 + +COUNT = 16 +QCAVSx = 0174bd233f861c7b853cca8f5a383574849ef2cd76ef22bc0e159f713a1d07387c4203b11f4c339b669674fcf1dac199703beb07 +QCAVSy = 01e2c778cca64963d87329e57c8bc96d0f6737041fd087dafc07dd670e2ce725547e1a261c43fbc54e14c3473ebdbb31fda8473a +dIUT = 007d849313c6499dae472b0bddb76dec45806f82e098723301df33b6bbb97f794bf26879fc33c2973f86c1551549641a819b5711 +QIUTx = 004812af1937630b8ea7d0ff723cbb05b7a2740fc4c9be792db204f929674c32e47d85e4770b903d3290a6d62c274cb257b76837 +QIUTy = 008c6f61711786bf5c54eb0c1b3126d641b24a6662b67b257302a9a61aa8cd503846bcbb1b14fa5c97454368b6c27dd2de2ae80b +ZIUT = 015960ea8b92bd77d52874e3ea82ed1763440189d68728d3974d4c01d6aafdbb5274648f6f3eaa4faf3fc72d09892ab038cb2fb7 + +COUNT = 17 +QCAVSx = 00c1dcb737d253035bb91d2a4a85f37d00142be81fc9278cb23a4d1d79d27c8d3c4440b2c842bc1e21f6924e14dc831b0abfb845 +QCAVSy = 000c73d5687b0490ccc07f654101acddb36cd0c2eecce165df276f83be211d01d30ff5c243f0900572ee6df07f539df6a4689b0b +dIUT = 00bfa594856c67c2836b7fb171b67c7a41ae43ef3450898024a9313654fcf31e1e1fbac7ad52b2bc4358975a5c61ab9f4e3e4e9e +QIUTx = 00e1b5309a44800a916ad8a4d19b82a58b00ee048248050a6ed6c33ce1bc9701547e93d7c9042f8490654b73a2cd7d73f733c0bf +QIUTy = 0180b20338746351faccfb9a3711a4e138457550bbf58316034c6f216a53749263dffe2359bddcdc89ec6446a9a4a9f4ef90c86d +ZIUT = 01127491ff33a67ffc4757416cd02a081cafb723aff52af35b069b89963e8e3ef5bc19c5a093ccf511e3c3c19be789280e986809 + +COUNT = 18 +QCAVSx = 013d96a267d1a2a9ea83aeb1b01d8ace22e251c82f5f5fc3ef5997a3011a74a10115df60e98d139cdd360e74d76fa522eeb56f4b +QCAVSy = 016b655ab7cd0d39f588fbefec54e4f45047664c8b3be8e57ab113770f5fe0c62300f4a09fa2899e73bbc9823265f55d5cf4ae18 +dIUT = 004a020e06c400ef2498c111cde15087cda48a6fb2ecc01d985b57f0d3921920e92c43f3ab688129dc01ad29fc31d68e9622319b +QIUTx = 0167227f62849594ed63f247f780b2d11dd9a2c2c71bd6b71294cf8b59ce690bfe00da9bc1db8d1daac9bff8c00e7bdf071fe0d3 +QIUTy = 0136c3ea77d093d9739fbe6891318b14959778599bd1e7d5a97bfc82ffe85fd5a9a01b82f72e11fad96d2f5cb5798f59efea15ed +ZIUT = 01254508553eab09fbc2fafe13fa9b324d9217d7d0ba4cedbe5dc869ad68de4f87774dd17d6428ed242c71956f252969e6bd5837 + +COUNT = 19 +QCAVSx = 01787b30b3b204e298690b9d711ffeef167adc5792068b5c8d422ec90f94c2bdd284cdbf8bee642f70bd7be2da906b9edbbc2cd1 +QCAVSy = 0043078f912110290a13d90160f0e71582fa39c0e75d8190eb811d450220044cc6d680d956a98860e6fc85bb86d65990a160c5b8 +dIUT = 00c19b391665f50353547fc72c9ed019f5311690ee41e7c895aa7ef92c60fb9f3454dfac575245a6869f1fdec745d63ea56c8922 +QIUTx = 0053a7a62a8b4044b60af76efa5b44429bf65f65987d6a062163dd55f08dc9a91b8bb9b6270f8a026123f99eb9372ccbdd27ca3b +QIUTy = 00add46f7ea7092f48ddaa2feb96cb24bf92d2628fb6e4f7cddf523e5f84011cf8aababd6009a13f29a63b6b7ee664c66f3829f3 +ZIUT = 004b9accc21d7122835fc21410ed1d83767c47a54ffee5f0c180fc55f3d0e8484af3ad38020294be92f02f0ba7e2b4f4eb1db07f + +COUNT = 20 +QCAVSx = 01e9da0ad1a15ac3c431f220954ed2e502af7b746c3fd57b2eceb7748658020a095664878354df0aa181e57e5ead2c985ad3023d +QCAVSy = 009cce73a54708348b48f8f3f674bb7654f441f283d4e8a4ec8f8592ef52395f24c112d5942d3ae08ffe8d999efde399888a7cf3 +dIUT = 006c9098b53d10f2ac0284a99902658f667ea4cab28698af3fa07006a1bb46363b103c4aa4c92c1c3fe7539097fa70b8a4fa46c5 +QIUTx = 00d3edf652f43f9c9a92a2e4d34ba83f5d7e950c28346a2a6851bf75547050140a4e9c1c1b500e1d2ad364c306b9a44af503a621 +QIUTy = 0099b26c64367f1903da95df51562d25042c01a1adda75bba58bdb0d8aab350b52ecfbe98488c2619de01cd70f5e008953bca547 +ZIUT = 0093e2581c159d74d11f8667ee03399208b5c1a4ee5b20070ce8d97d251ef1236dc81dd688b2f07a730e6b8aeca0c193a28b178f + +COUNT = 21 +QCAVSx = 00c49294fb712942221a2500324af7bd8c7ec1cd1b8094ded1bac0010a8696083f7efaecaa5103d6762499e1be4857d320030281 +QCAVSy = 00564fa1110b393925dfbb24ba9a6b3373f4624ecbc3e12f9706f3ab0542992d8db6c8d8bb25fa0614d486f6d1ac9f3d98b9edfe +dIUT = 00a7fa38a8ab8030d6b497a23bde5e5007e39d14da9f82dc564ae3cdb4af5fcf41bcfef7adadb59171e6d7d3d3c3ac67f7be7073 +QIUTx = 0013bb3ba91d5d2488af572d995cef8fffb1fd85d113421e8d2c0c3aa97cdb8a933fc0d3f05f4646ce841ebdcf1a98604bffa3df +QIUTy = 01f2e04ea16a012d4864cf2ca7564846de73a33f24578dc4d221359c4f2f86ca823cb0596bfe4760e9eadcb4ad508ab1a171ecbd +ZIUT = 008e2f1c4bad19c46a5134afccf7f4ec14ab591c8b8ea48d9c3d1e7354ab43ba20aa39a65fd92cdc176cf3dedecbf9da49a8d855 + +COUNT = 22 +QCAVSx = 0134add2c499172df792d94a9b3895e245b84073c325263a858c1e9f7cf30a44f268d3f8358411dc0a9caab505c0abc016130bf5 +QCAVSy = 0031c236b143ca036c883641f7f9b957f4f798a31667c41560340279fce0962a21bd8bb52fa23db71a84f35a5794ef5e075972dd +dIUT = 00ce9f827bd24c014c3ee59edef747178d6c030c19669ad8e718ba1302bef4b5ad2c1233448f5275b29a896c0b2e7b0da92068be +QIUTx = 0176e31012d9c604b2d1a1922a28d8a574f060cc36388b2816d2f8117da20c0699ab0a08f76fbaa476f0a9c424bf4c952b4754fd +QIUTy = 011fedc3e8f8e828e0ffbf02fd85d29c0201fd0f53bf2614c10ae51ccb58cbc4900c38cc4c9a52d86d89f9b8c2de4e227f4e228e +ZIUT = 0190a1693eebe287ec980236d8762804d23fdb6f222763a0efc364f9280fdd53394c2badcc51ff09557f3b97cae7f70d790bf9df + +COUNT = 23 +QCAVSx = 00f0ec972dc9fdfd08cd8dfcba7298b4df2dbd80c20b2889e663ac58cc348cbf8f9ffd31ffb50618d6c38d72a99d5c5d2eacc001 +QCAVSy = 00bb0b48893cdb915e65cd5d797804802017a295343654246a37fe3a60d7de987e6a9a10aaf063d96b10184612ccd26407d7e03e +dIUT = 00e36f3b9a1341995b13fe70bc545d279e6db1482c92b13ce8cc0da1c100ea2faa803a64a58cc7eb1cfd167570835c522f659347 +QIUTx = 00d1ca82393b8d50bd1898a909bf39333eca3bde98b0b0dced66f828630e69e6eb128b7cec23f07260047073260a765331dd6f57 +QIUTy = 006c535ff943a0fe750fc6c39904a6912ba1ebc0f46c1b0823e4013c77475ea29b3f32481966f1b165bedba6c17a1494fb6d4f3d +ZIUT = 001469dabcf2210aa7de0040b201221eb4d1a4725431fb5a93212a66ddea4187e078f5e3d82606f6cdfc0ffe6b69574d1d0ba643 + +COUNT = 24 +QCAVSx = 01378444e0deecff3aec5ab6e74e8123ba98d8b91a507cfca0d85097aad944c15b4fd89c8cbe2c7451d8ec641045421b4bf6978b +QCAVSy = 016447c213c9035de7bcc29bdd61d6ee6ed5579c36bec56bc6b44f9286bf9e99fac97f356708cd0310dbf6338f9af8d7b1359102 +dIUT = 0008a06716ed6f4cf728f9019928f367c77a9052490b9a8ba87a59cdca84e77c6a299853f5496febe652f4ba333501c4fcf2ba2f +QIUTx = 00a045b5e6bbb7950495f6d5d645a2b7d72006725d0223c7ff75534022c9260ab0d2d8d333789a3dccfc3a89502ca500bd0c1f61 +QIUTy = 01ec556e1b1621ec1893654e198d5923e311478a8bd2ffff280c9092ffc0737289a997492b6e9ebf931947634ef7f43b429cf36a +ZIUT = 005c701a93d7790322aa7c67440fdd9ee8057a0dae86d1e856ae89e7893da178bd67777f86db2be5c8e31dc50ed8a440aabc342d + + +[B-571] + +COUNT = 0 +QCAVSx = 03b63f5fa112ae6b5f113c765144fe4cbd6020e26d400c11609a3a634b9a325f416b0e3d3215734c68a1c2c8fad1d0bb9eb3939a41af22421f68781e7eb0664b9df5cea448deaa3b +QCAVSy = 008e6cc77bcddc816e84cfc1f626824fa24d3d5fd33d8093cbfe1fc4d881b63b494123bc759670edcb1887bb3b9d5a8b516bc503828163709d4dacb594d277a15a92c064e5770d1b +dIUT = 0344f22be87999b95b2287f67430ea8fe646c62fe38b7ce61f1f956597c27bddd9902e20d4436abf3bebd8243ec29a00481a8a2c19f550e99641b5f14aafbb5bda953a7559f8653a +QIUTx = 06af71fcec1a2904116fe14878663764c1ec74870e5d2d53919f0b635912db80dd5460d9e699458ff8494c5bfc74fba8d3b12f65f015e8def10de33f1800191f4cb502d21938b951 +QIUTy = 019584177b189c6641ffb678b6d7833d8d4bb25dee5018dda4e4c0d219048c01cd0da9eaffe346d53cf1a07b33b3dbdd4bc3acabe4832f9981eff2660991aac852147985eea3a51e +ZIUT = 06775e1b99a236e02b020bc73666e5751c1210dcb6e9b02a69f4075376e49f7a1476d2209e861abb73f5e3ad189d268e035b1de93d47b3a64de5783c9a09bc223e1cc612f26dcdf1 + +COUNT = 1 +QCAVSx = 0575cbb059f423309f993b6c06ac71d7bcc5d1e6a19afe72811cb612a6238c9ccc331e67da0c10b88cc2a5f1ef2ff6d6b744065d242f598da2d6335d4c3becf5c3953940c60efcc7 +QCAVSy = 06b433652e3a36a07018aa8ad3d2ff31ed785ce5601716eff7710fc13c6ff9ff75c7f3701d459fd8fe70c0b4afceda08681717db9821d8c858fd39e274ff37772f8e84856e706745 +dIUT = 02f4d2b7e63660e6c20949e06dc670be8aaf82530e0b6eafe21011fe9d0f4407c8549515734528cda299e9fcf738a97fbf43c4bba26744b327531b40143e158bc8645909ea888456 +QIUTx = 06ea711827ad8ed589b709ef35f6a9cd4625798bd887e5fe59c51f0f41c328b7ecdf84736c43fb70e3986ee5e5f986e009f641158a75cce6b39f53a8bf0682830194e4007148deef +QIUTy = 04c6b9f2a6099fc0367fa9609394c3221ad8c6fb111d2bdc4305053804788d32eaf76431406e768a448cb5c8e34c81225eec9015abbd92725c002712ed3192d807b36afea853f722 +ZIUT = 03a80ea8cfecb858f9b77bdb46b6cda26320ee8c561a2fd6b7e0a2b62201fbfe60f577780c75a98a11a69de4c4ee911930d2200b6972bc3123d7f278615ecc65984a59fe352a1cec + +COUNT = 2 +QCAVSx = 064aa66830ff44324a67ae8a907896897b507566cf52dfe13e3adbb1e793665d2b718358754efe809e4496218502feb5604dbfbc04a1107ca9ec4eadc7d10a9d6d1474cedf578145 +QCAVSy = 06f63f69f8c18b67f11051b3d30236a1a249088b2bcab5cff830cdb9eb3e75c1e87252e5d8e61bb1a66348fb681e962d65abc54d5dea2dd72c554590740074f7c66c4b8dfd307561 +dIUT = 012b6313b56853cf8d0273049cf7ed2ab8e632e59256ed043366857648f3f2a9674caeb6fb0fcd5fbab0bbabbce17a0fc4a78148499c389af57486374641695b0e852f3152eec724 +QIUTx = 040a78763d170459dd34b5c04ec782e698cbe903a5a348551c5248d9dacf19bcb9a498ea05e80e2d6cc1f3ea5ba3a43855b801c8c0356fe3e29ee224bb91f4ed0c85678379b72542 +QIUTy = 01ff49ce0a62e9edae6aa63a9848e44f185412d0feb46b87f91424bdaffed5168321ed76f235f75d33667f6d7d6a9c857bb4f85442fc40f9a20c04ae06362a46eceea15c45d69beb +ZIUT = 03edea7e47ded7c2ab1115f4ebcbb42677c7fba6e0cfd811602896251ada1d5a0b461aaf4e000f4d4231b96d8dee7630d9f1b7860e6418dac8c3b07b66af6fd1acdb44b2683b29b4 + +COUNT = 3 +QCAVSx = 050671af65cbef92f305e5facb4288cc04a4c6978a3b78afe4049c6a995fe8c3c0bb609abe49d152b1eed6c714d254fe6eff159a9ebd24ad16919ef76f4470057eb7c265a4bd96e8 +QCAVSy = 051d08e21d264d8e4dbc73408842ab57cd78d323e7deb625b3741994b8affe01af4461622db419afeead045845f6c3db6d982f45b692bea11cf25d18aca3c83bec840c7582a7062d +dIUT = 021997b5481c0cf6cf436bfe360c3b119b9e4dd56f3c2847affb2021cbac4b57dc18f5075d678af2ba6e9eefbc4138d818053f2df32a10e8ae5d6409f5b2f1f3cabf36f808fdc07c +QIUTx = 0560cf91328c26bba13f71c9b5dddd05c185969d88bd0e9d34a3607a923b23a5b675452167003ae2f0add5141ea4be41ebae91d3a6aa15c393dbf585ad6c9214b269e86b4f054bf5 +QIUTy = 02e32ec240418a9a4f9017e632f8a77897a2233d6f1f45b8f7aa818f847ddb3ceab5a5a12c754fce8d57b0320a076b53441dcf9f65ef3204e089191ef156ff762294897a72fca932 +ZIUT = 005b640015330f8416f2bbbf8b5660e01a7abba8b0197a29e52bb535d62f89ad0443e08b6e0d1d15f4eb03c0fe35e3e43bd7739cb692092698a2cd13126cee4432831ec7423b3434 + +COUNT = 4 +QCAVSx = 039ac9e91af594074dcd338da4f5240574f01e413a49b92246ba3d6de855e3dedf6e7fdeda9ab7f7f8476e770ce9bbc3a9a5eb984543dcc37f5f11be6e28a1d1090931f5c5b5a351 +QCAVSy = 0780d32dbb134899bda2e98848941878387aba6665fd24252160ce3123f68f9b5bd8f254a38b84ec536525fe007a863b6fcc489f937a05a5fd946d62825328a09f83a7cba27fea5e +dIUT = 02b539acc770758799f439670eae85b9ba34a8b4f371cc935a20ce8c566521eecd8c4f5aff116ae0db2ad6eae1a3384434c599379821ad05d81ada0548299dfd98cfd6d3f1573524 +QIUTx = 06dae538c820443977415cef4e79974ba762b69b434810200cc6fff326a2344cd21be19c153642df82a3e57a5531a8bf19767e1995d2728fcb661d58ec561ef23a34d8607971490d +QIUTy = 0504243c792b903184ea725a947ca89218ca9c8fa1e09a7dd68de88eae90f9bd2a8df414dd69a8b2b1a2ded2c6d7f514c8907997624eb0bc9ea933a2d474ef8f83baea3243834de2 +ZIUT = 027af05ecd0332784d64b0b1bdb45c310fd445c5a6d6b34f35f4eaa3fa3e171ab98763d243a1dedf46aa29864620a47d05eeaefd748186bcbcf187c01e7ce36e2a53ded071036b59 + +COUNT = 5 +QCAVSx = 06f6588491060a1e88148e4bdee38bc674713fe384d7cfdbf5bd90c9dbb6e1587e459dce6e0d69b8b2cfeb5055bee56a73c13436060198ad4750dae8253ea839a2e246d541459775 +QCAVSy = 05b61b8f7d8d6c8162a2269e7287d459034b8faac0360fcf99fb21da34a314e6735319b9d03626b9268369345f3a624acadb219b207188d0e945cbc67c982068d32613fc21f8b0f4 +dIUT = 0318a96e382782d4476f1bebf697a1076f22e1d2ec84747f9fc42505d5547daaa08d814721759659958685cf4ea4bba12fffb66af09f6694521f11c09b6626c8ae52fbfb336a52a1 +QIUTx = 06770f2fcd2e9b7f8bc5c292d283abad85155071fe37ef7ce84f34c7616da3dbe1bdce9ab04cea7bc4bc258c5d2ab77239d3d084568b2dff779988288d9fc6bb364f519d0e855ad3 +QIUTy = 04f6a1f4e5fe00fe9a25d8459b88803988ef2bf2fef5a23f13e7a7e7f3459abfc3d5c00303abcc5080fab81b09d5be0320ef990519a06af13c29562ee955715a82cc0daef2c5e0eb +ZIUT = 0763c0d659a7c080912005a2afd60ce57e610619b388ef3d5dd3c9386ab12069c6ef3a8e72eb741cba2da5c6f9267f6c09fada6459690ed4e432445d6f0f72dbcb059c87df36f665 + +COUNT = 6 +QCAVSx = 05a52cebf68103cab0266cf2c689c48f080549fffc70db9809c2a46f908b7289be597329f39ee1e4cca398664ffa9bdcf01293f43593d188e12411d57e559b3f6a30e9554869f049 +QCAVSy = 014e137165fb0d530e8653d7cb2a84618dd3afcfa3f08560179142aae972790ce746a2fd4469d41558744378c640ae73a489bb7f81cdca6b1bb167c794c26d6238a0d256afc3ba21 +dIUT = 028b4319eb7054cff6382820c52f9c332eae670d1f07cfc8f1472e9260f5e47a385768016cd2006700ca7bdc5d1d567d92460af7c2a425dd0d78aeee3d15fb28d71167e6486b81c4 +QIUTx = 05b1b114cef13aa5df306ce74197d680f9b8c9d8f6753a09db88466a6bb04eaf1eb873836022d7504f45fae85a8e4a5417edd7ce3a0e5eb9e79264884ed783577b3fc52d825f0b57 +QIUTy = 018e3226e36b4b336799c4684bba505e984dc8819166f17ceb840e36125b283a8c8635ddf7e770406d9856d82b37cff1fbcc5d3f5cf4b55eca41ee131f21ea7bcb19ce05f6564245 +ZIUT = 0428413f2d2aad4d5288885c2edc8b976321ae1dd4fc6b41275fb88b8c5e7776165effce79025163538a0e83c919220a407ead6cefd616b4b05294488c2ef5d30ab8caa55ccbd1b1 + +COUNT = 7 +QCAVSx = 026e2f1ee64e7958e902547a7db0a1e14866f3d2c0127c2bb9b09ee232d3d9518ee44ae8f5bb433a088069fa386cd5c8902711b762ac0da3a7a3420472c47e850f988dd60a636d7d +QCAVSy = 0677ff510052d4f460849fb8ef0d4f3519cd238e4e1c688b736cf6e3759550d134a1e6ca3cb479d68b4dc5d0bba1aee178bd6fe15ec196fb1f627d87079394f6f7854e053228dee5 +dIUT = 020115d17e41e13178b42a004c01d5e4ef1c76241049c7d31bf0ea85d6e070a2e2b92080e61de546fccbd4d991236bb360ef3f206ee16d8843a0ddc803463664a8ccdc2d87a10277 +QIUTx = 06c8ac34364acae35e3c417160333e48641868fcca04c0d577be06f58ab0a55fd7db779fe737779da33d009f57b5bad49702eacf575acbaf27df833070cd893a7924770c92eff3a0 +QIUTy = 061b82e545d41c62fef068b34cdbf01396115d2a1417f9719483d26986b6d52f8f6de06837795f6d9dd7cd095741114318c6e8a6206b3deeef014f0e44b0dc6684e100e4ac361650 +ZIUT = 031bd2a84369e93dfa00581446d52762100d985cc7bb91c4fa8be7472e2e8e9781c52b19a54330442441bacae23f4bdc76486eb475d51f26aafbfb272a5ab5db184a4d3c3006e5d1 + +COUNT = 8 +QCAVSx = 023ee4f9ec24dee203acfb658631313c7ad4394c47f1794d08b599ffc15f0e5dab2911d97e030ddf7cb4bbadf8a5bce05c35358fbd0cf95d3d5c7ff3cd8ee6b54e379d8d0123939b +QCAVSy = 0606be23e7c5746dbd38404fd607fb7f278ee249dc8e2740cf1bb9b1c07b1cf7e0a50a432567d1869799a803122510db437981a2aa126eb9aaf3c7be05a80fac1495e1c40ca1c106 +dIUT = 00847b545ef49615671f08be73a49147063184493340111ea4dce13c2f921f07bfacffc8441f4c7c9d0479f57f3a13f4c33c63ed47c3a43fb2f06d06a9780e5c0b3ac30410adc491 +QIUTx = 06994ddc5ae2c5b6f45dc32b710f1a49391a47f3a0f8c2d7846552fe487ef01cca0431155bb54533b067a29e8367373af95d6a7f0bf98d869b708f48f95f1b88a1530fe22547e97e +QIUTy = 04f6288d4d704f33a898031e7d0046fbf1e34a72c8af190f4d33163343c897ba0c0d8af8a86236a1c3b655b979dc4522d33d66a665b3b6501570f076322af0ad2bbaaa04ea2e995d +ZIUT = 04df20154fa49a1d6e04dc2ba6e55a7f2ae575de5e2c6e4091a4d2c36aa93ca9699b890f0ee4df53aa75d0d9babad68605bc027ec67c187a6826aac0f4bc596baae788b376110216 + +COUNT = 9 +QCAVSx = 00d4a0b11c1739bed094e72d7a6923836836d9215746c72cc680045a36d81adf5e25394f269a2ada1d9439ebc33bb931d6fa595a25261c244a1e17b046fb10fb54bb312288cf2e8d +QCAVSy = 075204f50d32ab8a6abbff982d1fe372b8c5415bb5b726b346aa4f08be32f8ca282c1ef6e152423360d97b728a074e6b3cf3b912718b1692cd983019741a2541824234bdc8c323f9 +dIUT = 034c2458302b43857f12ad8bd9a875237641a21e21ca3cf9a0956d3cfeded96a5e1f533d827b528fbb586da93eefbb66d0778b19b1a7fb6f17bbf9e79b9acefcdd7b9605e7898f26 +QIUTx = 032d3a7a4099f089fea9189211f7366f2edc4abfb316c5c05948d8de57fca023bfb6a11b102ea4120ba62192c0df610bd8d2f63fc57727f4a6b640abf8d299fac56c4c7af88349ea +QIUTy = 04e6399f1ced2669d3a5506d35ea2bebfccf0cec84bc97383aadc3b48347f629626e6096f890435e5933675048fdcefcdede3ed616e6560d42e9e17c5492e30bc2de4689c0592ecb +ZIUT = 037a380f525590582658e2dd272a32de67fc0cf5390b37f4d33c1359f075d4461ea38a55027317892a3d1d22f5ea333ad437667d2f3eb8781c39504036ae33e4b0a26b6894722f0b + +COUNT = 10 +QCAVSx = 03bb84032b7fffce27accf354b89dddf646cdcb56634df0f8520a7730f8abeb05f9933d8a4352d1c7767cc3f9b80ceffcdd0cb3a97b59283fd0a674dc4fd240333f020c82b4804c5 +QCAVSy = 074499336ac3a805430789902768252026b526ece54ac28e8cc878f18baf9fab42ba4ce34e4968aac1ee6a0bb15c9a709882a5372af56ea0b36817385fbbfeac4b906069e53fbfba +dIUT = 012db785a03c26be3a6e9a582e5c32a89570ad4308b713ce5471ea193dec1f32d68b4fcdfb1600fdb1ecb6769e26a0e057812dbbf0ed495592665e6b8e9a97378a30b5c660fbadc1 +QIUTx = 07edf7ee0ec77f5a6c3c9ec4ed8fd3cb814a342e9cc6470b54781ed6c141e2115c86dbd7ba27993eb7ebed7a38be488f96fddfa982f3691aa1c2a697f7706bff3d1add7396066194 +QIUTy = 07b3824b7f7b266fa42fe536adc2ac79b9d1e5b408e7217b3a99ddeb992f3123ff2d168774d300a818a32692e265afc6f6f578d9bd3121132b5979841f7a2d060e8948901d657c1c +ZIUT = 0420de313bddce87d07321e3f0af404d9d13e5369b79506e807178711153c9b1837cd055562eff3aadfc5954a221eeebb1bec1696d3df1cccfb8b61172a50d83cee95f4140ba070b + +COUNT = 11 +QCAVSx = 06556a4cc98466794a93d03388536776f7a4b3344c3dc4eb960a4a6458fc7869cd4e45b2f140c468a7d4ebba84c9482337a2a8adaac88a9a629da03dd247526642b0ab71fb7a8c70 +QCAVSy = 054b97d952b19f742856dacf4e50df0c3103baf253f4de65a3d9cace63fe82906d2c8e8a3312fb535e00f9b5ca69f87dbc7fa3f7d87fe024536604aafe4640593cccfef6fac028a6 +dIUT = 0202606a76b6a13d6e29280bc1613e115025770b245f5561d5883e135e159cc437b1c9355b2eee2b3babef229fe545aab2bcca155e8972495f1974bdb1ec0e60c4e6c79c48f26a46 +QIUTx = 06e74dba4e0702f186d334d3c49e2578e1edfac564645dda8c4a588158f8d7a3ef63243653c0d507427734fb4cc87adf4a36bd5abca1f920b9bd6e3bfa51c916d5710884594e9485 +QIUTy = 05b92147a2db48a3830ccfa28951a2b7e8eb84313b99b0a99031c7834c633f865a2f9844952528ae5dee02428a824cdfb7e20928ffc53420df38ead0b4240d0659d5adb1ff2e2dcb +ZIUT = 0606228f5a05077aeefbefac23c0d5bac7a6062bfc2b02ce8bba6698ea96b456b1f0d32c6e05dbb9be61a83090428eedea18c74f41238edede9e3a12e28722d2f314613c2e84d6db + +COUNT = 12 +QCAVSx = 01005182b029a48528eef5ffd0221ad87085abac6a72705203a3c1689abbbc0e12927a5e83b352a1bad97706101f44a1022ccc0d5522dc5d1ca1433de03a2ba1df864875f522be61 +QCAVSy = 018b02a98f0b3e4ccf44a96939a2083ab1f2a04dafd5bdcee3cff438bb08bff12043aa192c5fcf34e13b5c29742c5d864b9cac46bea6e96df2b1be4493acf950224d71737f990658 +dIUT = 0048678348ac33b92f2c59677103ea409946b5593d105fc4983351c4ede929c4b93bfc695876555e3ace417b82ac05b832676ac23e2955a09ee64a20a5f98e62499f43ba7f7fc8e1 +QIUTx = 031dd4808d2b341b8881f5e50a2dcce38df839009f92185978dfd9a60cdaee005cdba82655647736d407afb90c67cddb13ba2b01618f45e8a274317e02f770f80ef87bbbc1b11056 +QIUTy = 050a0671c9c0ce57a494e6911f1376cf1fc3393885ba8c26f6ddcbb5361876860a35afc1f4560f2970c30db3f1c817dbc8af2b025daed3a9da12d2fae9d714cead80445e6a0a0813 +ZIUT = 052669336019db5eddef5eab2336abeb60bbc7295e4bb663ab43e373fb6d888d7433ec89a487a91d4a59c289a9509ddd1bab33cd02a7bf37aaad78dbedf0b4ae5f2f35d15cb4e628 + +COUNT = 13 +QCAVSx = 07fab4e59328c700f74649bd90a7d51ff28958fe720daaab328cfc9b002aa706ceb39934db9ccf81deec95689ce8c776b4fc6542a82358cc51ebbc6d8e5322cb3fa6e4695e170fc1 +QCAVSy = 05acd45cffa29ddb34ee42e7410026798e37a8d1a9ce9f9294da5198164b69010c68c53281ccbfc407d141097da137e7849f228fdc1a07aa298be26ca771f47ac4feb2723d5a6666 +dIUT = 0017bab72d788f8b78b9bfc4912863c5a48922fe69e8a4cf5e6e91763efd5477a1cd439dedd0afea504e3b3af6823ea3089c0374ed9aee24a88516c8cf3afabe995b9b9675f3b5ab +QIUTx = 0161c14bbc84e42ec7677a8c3770065ecd1f0f44eac8242a715a61971e7e4ffff78ff57a1bf1b95cbfc2ed957d1195f9ea50809715c2439c7543e573520135426d47535b8bfc8533 +QIUTy = 01253633d02251464edcc53ed9e8a9ed9329320ef5eeaf35d64c59b9735c96e07f1a62ec17bcee4f04cd9a85a3eb504aaf37bb388c6c7d08d90aa0b68556b5c068ecbf0a5984460d +ZIUT = 062de5aa98b440c6cb7a1428f6b5e47452b30454eec4d651982b531121febbd5a3833b180017f7ddb5ce38d7bb1c842de1a8a8fc7fc981e24733b7662813fd010a4e757ca4ea5c28 + +COUNT = 14 +QCAVSx = 072676302ad18731b76202bc51429ebf7eccf6325f4e084c2f92e3288ed290488b9e36720e29daa2db1993a7d17ce8ef9d8ccec61de8a407176e2674c25d57bff2c46596358b3605 +QCAVSy = 03c0022d53229091e14af0f7450deca1cb5db821e71590608fe0986d73e88c915e5ee8dfebc8955913d9164f992f56394a662ef11c8214e8ada85df1b17b0b97414cdd662d188b5d +dIUT = 02ab2d43027b08f8abfa3598ef0144399a60b6037b17a3ae413d422efa2167e9ea4f19d7eca98d85c67c1fe85fbcbc1f12bafa30a85dbdf542466889315f1532defc5d181509f008 +QIUTx = 0328c0d67fd552ea10e5bdf7b87d50bf4dcba34dca569aeb869c5c7dc7d832ce30feed32e25a723793f97c557e2f978c5e1349e69b73ef9916001ffb0d6cdb2c6343e34538386e6e +QIUTy = 01d151b46ed004263cd9a5c0d46a840d03222631f92ff9280e95a35746cdbcafd9fed6811c7614b9d50aa2828dc7a275b39d3d418a349dd1e2b73211f4de9a34b42fca11b9760eca +ZIUT = 07c7eb4892816cc3388ebcdfb412984e05910c112dd15b8e5481719401701aceba22fcf35aab0c3b040096161011f6177097c505395d9d6d8a713f6a5100fb476adbe7b9cdf4b68b + +COUNT = 15 +QCAVSx = 06cd7931fcf1935f81f301479ed9ad0c6f9a05becf4e573a2ff409bafc442ec195f7e3fdfd08e58161d4e0fd37f62a969421b19cd48fe848a5d7f74b8137a7c726a9cbd37a2cf3b4 +QCAVSy = 04b5b2cd83b27895751c34d3ac5b960a133ec18b039c2e128d3441db4f76e8b75064094619b122e5fb2f1c2796559ad953c711e330dc7bf55edf29f095cae45557b7c8d5843d89bd +dIUT = 0049c6e4c05a197b24afd2707243ffbfd55b0088fd33d87dae4d21048f75f2b862563075241d2f36fdd0e9405ab42aa55cbf2095dabc3daedfae9deb922220783e8591cfd67600b1 +QIUTx = 001fe29a4c2dd000bbed129121b88edbb5c39b34003f170ac19fa9a85c5fe587aab821361f4963440f25acb49758810552f06b719a9eb43b720e9b7ad6ef9d41248d5f335f99515a +QIUTy = 01499db95808c719d24eb05c633db8b05cf969ca0bf656435b1fdf1b0928290f6a6bf880adb9fd53c86ec76e0f62ce89cbeb4c266f64a876d778231a0030c38aa00d66c6bd680785 +ZIUT = 05c638349000ec30881cd190c067e7f12b6b42d5842a8285a8ff0dc7e9c9eaf483309e48314fdc2ce7f9da6a468e549c8e70a50b68d07aee29708a98172209e5cd2e8c09cb66d982 + +COUNT = 16 +QCAVSx = 02984b653074c36a259ad956d5556512c2c731fa50f2005d0049a9d977de5c00b7a054c960cdd707896321490be433bd5effd44c564eaa2d5021175050c5bfc163cdb1e81df1335a +QCAVSy = 01a786d29098b334f5c1c4ae86a41bf275cc6787da7206916557a4f433192141034567e041d55d794a7707c7aaf28842d5c8f590375a43656918aa80e55b0285347cce8ffe1f15e8 +dIUT = 0186b31ce490c7f28f2793075a4ae645acb39e71ffe944ee62bf82587f1c3cbe288ce6024d8d035f107d9a4faed57a7b21ee1d6e7129a098004f22ccd52740c034a6df37b53d0732 +QIUTx = 06b15f1a859e3d80924611b20c1b94dff6bd0574fef81937f1e54d148d2d31f8c21b0ea9ce031c9455706f085a69fd492418558c7de9aadc2c9a996e7ed1feda329c7d7609bb6b22 +QIUTy = 032910544cb136e2c29aa33572aa6c3471a52ebca6b228bee749fa9ffe29296a4a5b6aa0c6dc9f095216e7b1513d81cba00794a3f558f74a1b541c73b2308f4f8e74028b5c2bcdf3 +ZIUT = 007a40a59b6632156a43158565a4eeaf80618e501c5ac5afdab4ce3cb76ac99a0bcd17e9eec549373ace8c96aac78e2af6600483a2c49ec81298a083d5237118de96a953999beb26 + +COUNT = 17 +QCAVSx = 01a8682e09eccd1868da202916a561ee8513c0d73470cd341aee79ed93556a3a6e7c7b20302ec74a0c5170a8e37d78a9b5d0de3900eb2a663a7247cf7943fd381d95b3aafd156167 +QCAVSy = 052fecc68f7695d4e41a080c47650d202874da163a1748e550373958e31bd0aae520996d30f384730f4854f5e54e68cc24958adc52e2a4c407356514f3ea7166056dc67e4d118fa8 +dIUT = 0341f8e86182de4fc3f43857250a929a41994d331da154c0249fa0d1c26a6de0e835fa08a8cc524e3dac286383f90bd2f4d2c75142f1d38108d9c062143c8e6edbbda0af87a76ad5 +QIUTx = 02c5c5eb7327402672573c37b492890343ab422b51bc65b600766ec1d07908ff03bcfde7694d832bcde52946339df0aab4074ae07a89f821f5a1130d2b73db0c423ae7a023ae2c18 +QIUTy = 0476ed3dbd936d1c36987a43512c8f0562e316122d05a7edd4e4248984c11f6eb85215d5aaa0262a95f20666c9dbf45248ae177d2dfffa3a6a950533298b5c3f4a1b62da1eafcd51 +ZIUT = 021fd2726973405fc30d2a1f2115907cbd0de90bb6bcb0496452e389b1b10ccf38e2400617040cf0dbb188f345337678b0ad8603dcfe926582d4321f384daec0943e2cd267f48343 + +COUNT = 18 +QCAVSx = 02cdaf139a0cda2800d61128ffe4d7323b34a0fcf48c9400479ff4c8291cbf46f16c41e4409aaedf14bc60a642b2d7baacde8e0051dd8ae01bf5ad2e6e6490c77cd406a999c565e6 +QCAVSy = 078edd29db6a3b87a11505b57c543ffb746a5b40fb83d7206180f3ae9fcb222c5411a77476660c7b311b646310905889a95a0f2fdc35d30fc61cc5560a2914232d62ad36386b9179 +dIUT = 0207a7382d8a22571226e0c06c2681d09bca19b5db7e7bbfc13ac208389df8168d77615e30ca86103936e53dd9af01cdfe24f508ec609399775ce84c8689f8d5f96f652e014e0de8 +QIUTx = 04608dc0512bc55c734cd562ac5825f7ca38b793f8ece9b981cc1c4032ddd8039164d0c646b42b2fd453b5a1d3a74ae23c32c7d584007de3cd34e33121b90fab3ada6621b3ac9785 +QIUTy = 06aa9ffbfd65c509370846707674ac723dac24a6f33a1e0bbcdf8b24ba32cf7bdec8fdc9233b757bc073d64dedf484c6fa01ef28e874fb0d34f58b0e32b18645c30bdcb516ee3841 +ZIUT = 07a47bdc7d54ecd391672f131b3214d0efc4d40195db1ec993a62fe9da875efff5403bd708fa491a01a94f4bddc7d516baffff9fbdd213ca1a4905f9aa679d65da25c0f1fd2afb0a + +COUNT = 19 +QCAVSx = 00051512e4a0dbc535c97be10ffa7425758382883040466601d5391bcb3582c11525293249f24497cc807216b34c92c1e075781c8391c3f6d3d14f88a1d50ea9fc75ff8d51ccf933 +QCAVSy = 039da46cac866ab347617ac5a8b4f1657034e3b8ddb66bc4273e2e1ce01641ece636979de8b2492dc69e88537c36b1c3ad0d35227f867e43df9c8917dce9f8c1ef3ba3cb5ca8ba52 +dIUT = 006ba8f12cc6e0e78df8cc6298848a740025e72c62d099e92584ac76f595ac1fc724cb06a85a07f0d4440faf3ddea2f265f2015dd059a16a03a29915b8731d604512ceef22b841f3 +QIUTx = 0636f435e80600666108737300773a8ed6ffa8ebf8307c81ff5f44353e91bad086331b8feff3f1cdb86e061bde5f71c5fb938f117e2226a97d2b66b098e9ff525182c816e702c6a9 +QIUTy = 01c1bd8afae6a94108fc2c755d5de3fa2a4b3471fc2a5cdf4adda68529bf180ff28db154ab4311247b392e93a335bbe8796608bbd6013f43cdcc846ec22267423c3cfda2ce8a3d96 +ZIUT = 07326196a7decc92c81ae5a0779c9a42f53d94cfa4c3a13f19dbb554138e0e864eee6bc93e39214e2f74705a4b172aab510444c93b5b3e62517bbb7279337102db1c61de349d9747 + +COUNT = 20 +QCAVSx = 004c2de5642431bcc6eb82efd4355540a8b5d23b12b0df7d31ad69425b94549877443ee8dd7c09cfbbed86f13665931d4b2a21759c33e10b4acfc63ba1ef61acaaa18c94e3cfc933 +QCAVSy = 01765b7a37eb806d43196d2931da1a1953742d3e0da7ccb67e0dfdba5e034914cce3ee6393bfde40670f406196067da8b293c6843593dd221c89bf97963676bd044e8c8ab8e717ad +dIUT = 010716f2e774f27f42de3f6c9694d8eca2179823091d202f2ba1629193a1c98700693398ffc83157f7ce4858e7535e3990d219bc249de164558cac807ee159778a012da19e5012bf +QIUTx = 0150b3adde162a7f09350dacf460419fe86b99dcd94f44283fba3e43d281b93bb54282812ce52265a94838968d67a9d6ecdc1b6cb64cf1594521c4749ea43d8e4ec045e645ff238b +QIUTy = 07b43321b6118b87c46c7b52288df5dd1cf7da6183ece5633b4c17cae362d821191f7d57923928339aadf7d85f7f19de9486709e4d2ddef42c55bb4d76a3cb50cad2a098ead5952a +ZIUT = 059052d3e1c66efa4b7dd39e74299e886367d8fe49d7cab90e4f051bec10316438fb29b1290dfdaec169decd622a1010cf0a0275008814f4861b4d83ba78515a8768d978be430011 + +COUNT = 21 +QCAVSx = 025038a0e72ae8c16e36e3e3b504ed7341ef709b9fec8be90177346d76ca7bc7133d0ec280acf066005c5cc10b52aa654335fe820a6617e560e270903ff1c2cc8af1398f24dfe2b0 +QCAVSy = 031074ca3931801a6acb765b6e9144172ed81d999ed9e835bd35526b03ef2a13f78376032b0eb8146c23132365fce176a7cbdca44b35aa379859f688ac26dc64c8149a4322d083d1 +dIUT = 01d0103fc7948af107e51f4d2cc0392b66808059d1f26cba05be6a381f522d4cb854137934accd1cea3360948e406d3108c943769dc700b4c9cc0cc1d84bab58a35e27eb240475f0 +QIUTx = 012bda8ded3ed7e8b6d39b5855a58d725b65e3857c2a674996eb393a3e3f91595bbfa87253a56ebac2b10ed406af9dbff53b22265fbeb5a769cace2b60b45dbf97ceed2b0a04db50 +QIUTy = 026454827efe29b324ae3f2d4c0dca3a3a95491511c531645acf545b45ef6ac4a50c09d3d21f213ca76b96fb18242ecbe08af68755de4e1077173475826eaabed26a75c369cd7b0f +ZIUT = 03acfa4b3d1c2a6b62af23bdff6a215a416d4437ce6cc114d17dc4201195987a5d7301da11b913254702d7172e31d64e59b24deaa3270f20445e51dc484f7a2b8c3cbeb0bb9efb28 + +COUNT = 22 +QCAVSx = 01bdfffd69c2e08fb03c853ef2ebd088e68d233fdb95f0b246de7955d615077dfd0b0ff02c64d01de793359096b85e057b1b7f9f59262dc2757f18243e182e1a0bfe9dcbb027d68b +QCAVSy = 0218be7d956029f139c19d2da346773b16d7afc858ab8dcb60d7e484aecec309cb3fea96af3903637e5db4db678bb5db9b0b18d83cf9ebc1b1aaf24f4367ec533684ce9d56582d43 +dIUT = 032d2f557fe47b8d280f682e24fda627dd7a58e9b00822a3aaf6eb7a014f476c17941adc5e2238a3080d706f1e16a451b7e92942779930c5670a473281cac78b858d1f1cc99b0aff +QIUTx = 040f3130e74b1c8eb265e7c4e6921411eb971418267e8dea879c2e8b563864f23a61b23422c9a06fa178a8a155e3e78457597587f3e35b79f19d0c2e185aef46db95819cbe127b10 +QIUTy = 01c91d27c2ae7113eb03be98e94d3ad6dec791fac2fe0d2c8c98b71371b058a649fa9c3fa3ccdbba932395c27affa20d95ac041bc9978e3f530829a2c64c89b1bcceac06854fb903 +ZIUT = 067a58e5b3287bb9aa83ed9ca2d718cf7165fb574b6a446c3019849cd1584673d561b574bc8f68419437c5e8113e060847cad3b5ddc2f67ad75bc1e3f04554e63a5e4945cfcb65f5 + +COUNT = 23 +QCAVSx = 008fc3b414f3412b403f01c253bd2226150225ddaab34d201089f49d79e5dcc2e3b68216faa66dac44529c7fe3ba4d28d815b088235955713bb7721383533b5d94221b4ed1e162b8 +QCAVSy = 02b32201de272b1b32b6a6a58ea22411c48f5dc5cf0f95872e6751ed622ceecea22a556975de6003869ae20af39b42ba8871789c82e8f3ad3cf6006f43bc4c7d4102032c43f8f797 +dIUT = 03eee29196a8be70eb3a310464059cc0c4c42f13487ab1a0762c2cbe304ebe63503e6c7068a7f4bc197f81f65b4295c14b210f3cb2378b67401fcf52bec02c13b61b6de14e1b7e5b +QIUTx = 0177acc5fe9f42f4de2d27ab9bf6f7e0eace303c266ff8b3469082aba9367e66440bd6b1bd8b6e1aec92b65e35aea8f007f09d4cd67eea5d6000736cabbb9dccc943ebb5656a0586 +QIUTy = 0716f1898e2a8c27319de7a2698f21d5de58a4b8b8dd02b5e433110d3977fee8ec5c089d170af02a4ad3c1fab44b0d1e2a3beba9e0719cd8bf8364478d686c4e35f7457d24d021d6 +ZIUT = 06b272ca3330c0cdfbe60a1746bc0ddea6257536cdd8e976f2517eb541460a3f0e6ea7fec2b495e0f57712c8cac35e8a7d64d876c29851bbfeb6fe726d57e0be43dc76a584ef9c93 + +COUNT = 24 +QCAVSx = 0565a82994d7e6f53eeb6bf67523ee680ffb770118673c3e15c3200e6c8d1f26cabaf00c1da48e6374316497cba5f19f17420f267633f40e5b06362789bff11adf596d5b1cf768ef +QCAVSy = 016b2d4daaca9c6bed976b2064ef54352a58ae34367835a6210e1578291c1de8d67c20bc3d6ffa620c87b3098a2b9f3abb8d2cacd5b2ee2b68399eac4e8f65cebdd66300fd049b5b +dIUT = 0169a2d87586944c3173bf9a2275e3080003db648c2d1e1c56e2c37ce0d7cd9f818ea6b7bba343f774ef0f334ea5c12ef0be7593d04ed945458d71e17112eb01d9041d2133b13473 +QIUTx = 051e521764265af7f01bcd9c3fd022dfdb2d4a2c58b3b23d2e550302c42aadd57d1df6fc18e465bd98442495eed22f3fd6700284c9fa7833b5165149b8e1a91e0e099a0a5732d5c2 +QIUTy = 0198e7e7d094e207528c583865d262a918fc2a39261e95c07dcbd044efd3981899078af3eb97398201a4650f0dccbf19f922c8dbc3839bf6be0053f84531c71843a9e6a102ab58d6 +ZIUT = 02da266a269bdc8d8b2a0c6bb5762f102fc801c8d5394a9271539136bd81d4b69cfbb7525cd0a983fb7f7e9deec583b8f8e574c6184b2d79831ec770649e484dc006fa35b0bffd0b + diff --git a/test/jdk/sun/security/ec/SigGen-1.txt b/test/jdk/sun/security/ec/SigGen-1.txt new file mode 100644 index 0000000000000..83463a21f5b80 --- /dev/null +++ b/test/jdk/sun/security/ec/SigGen-1.txt @@ -0,0 +1,5879 @@ +# CAVS 11.2 +# "SigVer" information for "ecdsa_values" +# Curves/SHAs selected: P-224,SHA-224 P-224,SHA-256 P-224,SHA-384 P-224,SHA-512 P-256,SHA-224 P-256,SHA-256 P-256,SHA-384 P-256,SHA-512 P-384,SHA-224 P-384,SHA-256 P-384,SHA-384 P-384,SHA-512 P-521,SHA-224 P-521,SHA-256 P-521,SHA-384 P-521,SHA-512 K-233,SHA-224 K-233,SHA-256 K-233,SHA-384 K-233,SHA-512 K-283,SHA-224 K-283,SHA-256 K-283,SHA-384 K-283,SHA-512 K-409,SHA-224 K-409,SHA-256 K-409,SHA-384 K-409,SHA-512 K-571,SHA-224 K-571,SHA-256 K-571,SHA-384 K-571,SHA-512 B-233,SHA-224 B-233,SHA-256 B-233,SHA-384 B-233,SHA-512 B-283,SHA-224 B-283,SHA-256 B-283,SHA-384 B-283,SHA-512 B-409,SHA-224 B-409,SHA-256 B-409,SHA-384 B-409,SHA-512 BB-571,SHA-224 B-571,SHA-256 B-571,SHA-384 B-571,SHA-512 +# Generated on Tue Aug 16 15:27:42 2011 + + + + +[P-224,SHA-224] + +Msg = 699325d6fc8fbbb4981a6ded3c3a54ad2e4e3db8a5669201912064c64e700c139248cdc19495df081c3fc60245b9f25fc9e301b845b3d703a694986e4641ae3c7e5a19e6d6edbf1d61e535f49a8fad5f4ac26397cfec682f161a5fcd32c5e780668b0181a91955157635536a22367308036e2070f544ad4fff3d5122c76fad5d +d = 16797b5c0c7ed5461e2ff1b88e6eafa03c0f46bf072000dfc830d615 +Qx = 605495756e6e88f1d07ae5f98787af9b4da8a641d1a9492a12174eab +Qy = f5cc733b17decc806ef1df861a42505d0af9ef7c3df3959b8dfc6669 +k = d9a5a7328117f48b4b8dd8c17dae722e756b3ff64bd29a527137eec0 +R = 2fc2cff8cdd4866b1d74e45b07d333af46b7af0888049d0fdbc7b0d6 +S = 8d9cc4c8ea93e0fd9d6431b9a1fd99b88f281793396321b11dac41eb + +Msg = 7de42b44db0aa8bfdcdac9add227e8f0cc7ad1d94693beb5e1d325e5f3f85b3bd033fc25e9469a89733a65d1fa641f7e67d668e7c71d736233c4cba20eb83c368c506affe77946b5e2ec693798aecd7ff943cd8fab90affddf5ad5b8d1af332e6c5fe4a2df16837700b2781e08821d4fbdd8373517f5b19f9e63b89cfeeeef6f +d = cf020a1ff36c28511191482ed1e5259c60d383606c581948c3fbe2c5 +Qx = fa21f85b99d3dc18c6d53351fbcb1e2d029c00fa7d1663a3dd94695e +Qy = e9e79578f8988b168edff1a8b34a5ed9598cc20acd1f0aed36715d88 +k = c780d047454824af98677cf310117e5f9e99627d02414f136aed8e83 +R = 45145f06b566ec9fd0fee1b6c6551a4535c7a3bbfc0fede45f4f5038 +S = 7302dff12545b069cf27df49b26e4781270585463656f2834917c3ca + +Msg = af0da3adab82784909e2b3dadcecba21eced3c60d7572023dea171044d9a10e8ba67d31b04904541b87fff32a10ccc6580869055fec6216a00320a28899859a6b61faba58a0bc10c2ba07ea16f214c3ddcc9fc5622ad1253b63fe7e95227ae3c9caa9962cffc8b1c4e8260036469d25ab0c8e3643a820b8b3a4d8d43e4b728f9 +d = dde6f173fa9f307d206ce46b4f02851ebce9638a989330249fd30b73 +Qx = fc21a99b060afb0d9dbf3250ea3c4da10be94ce627a65874d8e4a630 +Qy = e8373ab7190890326aac4aacca3eba89e15d1086a05434dd033fd3f3 +k = 6629366a156840477df4875cfba4f8faa809e394893e1f5525326d07 +R = 41f8e2b1ae5add7c24da8725a067585a3ad6d5a9ed9580beb226f23a +S = a5d71bff02dce997305dd337128046f36714398f4ef6647599712fae + +Msg = cfa56ae89727df6b7266f69d6636bf738f9e4f15f49c42a0123edac4b3743f32ea52389f919ceb90575c4184897773b2f2fc5b3fcb354880f15c93383215d3c2551fcc1b4180a1ac0f69c969bbc306acd115ce3976eff518540f43ad4076dbb5fbad9ce9b3234f1148b8f5e059192ff480fc4bcbd00d25f4d9f5ed4ba5693b6c +d = aeee9071248f077590ac647794b678ad371f8e0f1e14e9fbff49671e +Qx = fad0a34991bbf89982ad9cf89337b4bd2565f84d5bdd004289fc1cc3 +Qy = 5d8b6764f28c8163a12855a5c266efeb9388df4994b85a8b4f1bd3bc +k = 1d35d027cd5a569e25c5768c48ed0c2b127c0f99cb4e52ea094fe689 +R = 2258184ef9f0fa698735379972ce9adf034af76017668bfcdab978de +S = 866fb8e505dea6c909c2c9143ec869d1bac2282cf12366130ff2146c + +Msg = c223c8009018321b987a615c3414d2bb15954933569ca989de32d6bf11107bc47a330ab6d88d9b50d106cf5777d1b736b14bc48deda1bc573a9a7dd42cd061860645306dce7a5ba8c60f135a6a21999421ce8c4670fe7287a7e9ea3aa1e0fa82721f33e6e823957fe86e2283c89ef92b13cd0333c4bb70865ae1919bf538ea34 +d = 29c204b2954e1406a015020f9d6b3d7c00658298feb2d17440b2c1a4 +Qx = 0e0fc15e775a75d45f872e5021b554cc0579da19125e1a49299c7630 +Qy = cb64fe462d025ae2a1394746bdbf8251f7ca5a1d6bb13e0edf6b7b09 +k = 39547c10bb947d69f6c3af701f2528e011a1e80a6d04cc5a37466c02 +R = 86622c376d326cdf679bcabf8eb034bf49f0c188f3fc3afd0006325d +S = 26613d3b33c70e635d7a998f254a5b15d2a3642bf321e8cff08f1e84 + +Msg = 1c27273d95182c74c100d85b5c08f4b26874c2abc87f127f304aedbf52ef6540eba16dd664ae1e9e30ea1e66ff9cc9ab5a80b5bcbd19dde88a29ff10b50a6abd73388e8071306c68d0c9f6caa26b7e68de29312be959b9f4a5481f5a2ad2070a396ed3de21096541cf58c4a13308e08867565bf2df9d649357a83cdcf18d2cd9 +d = 8986a97b24be042a1547642f19678de4e281a68f1e794e343dabb131 +Qx = 2c070e68e8478341938f3d5026a1fe01e778cdffbebbdd7a4cd29209 +Qy = cde21c9c7c6590ba300715a7adac278385a5175b6b4ea749c4b6a681 +k = 509712f9c0f3370f6a09154159975945f0107dd1cee7327c68eaa90b +R = 57afda5139b180de96373c3d649700682e37efd56ae182335f081013 +S = eb6cd58650cfb26dfdf21de32fa17464a6efc46830eedc16977342e6 + +Msg = 069ae374971627f6b8503f3aa63ab52bcf4f3fcae65b98cdbbf917a5b08a10dc760056714db279806a8d43485320e6fee0f1e0562e077ee270ace8d3c478d79bcdff9cf8b92fdea68421d4a276f8e62ae379387ae06b60af9eb3c40bd7a768aeffccdc8a08bc78ca2eca18061058043a0e441209c5c594842838a4d9d778a053 +d = d9aa95e14cb34980cfddadddfa92bde1310acaff249f73ff5b09a974 +Qx = 3a0d4b8e5fad1ea1abb8d3fb742cd45cd0b76d136e5bbb33206ad120 +Qy = c90ac83276b2fa3757b0f226cd7360a313bc96fd8329c76a7306cc7d +k = 1f1739af68a3cee7c5f09e9e09d6485d9cd64cc4085bc2bc89795aaf +R = 09bbdd003532d025d7c3204c00747cd52ecdfbc7ce3dde8ffbea23e1 +S = 1e745e80948779a5cc8dc5cb193beebb550ec9c2647f4948bf58ba7d + +Msg = d0d5ae3e33600aa21c1606caec449eee678c87cb593594be1fbb048cc7cfd076e5cc7132ebe290c4c014e7a517a0d5972759acfa1438d9d2e5d236d19ac92136f6252b7e5bea7588dcba6522b6b18128f003ecab5cb4908832fb5a375cf820f8f0e9ee870653a73dc2282f2d45622a2f0e85cba05c567baf1b9862b79a4b244e +d = 380fb6154ad3d2e755a17df1f047f84712d4ec9e47d34d4054ea29a8 +Qx = 4772c27cca3348b1801ae87b01cb564c8cf9b81c23cc74468a907927 +Qy = de9d253935b09617a1655c42d385bf48504e06fa386f5fa533a21dcb +k = 14dbdffa326ba2f3d64f79ff966d9ee6c1aba0d51e9a8e59f5686dc1 +R = ff6d52a09ca4c3b82da0440864d6717e1be0b50b6dcf5e1d74c0ff56 +S = 09490be77bc834c1efaa23410dcbf800e6fae40d62a737214c5a4418 + +Msg = 79b7375ae7a4f2e4adad8765d14c1540cd9979db38076c157c1837c760ca6febbb18fd42152335929b735e1a08041bd38d315cd4c6b7dd2729de8752f531f07fe4ddc4f1899debc0311eef0019170b58e08895b439ddf09fbf0aeb1e2fd35c2ef7ae402308c3637733802601dd218fb14c22f57870835b10818369d57d318405 +d = 6b98ec50d6b7f7ebc3a2183ff9388f75e924243827ddded8721186e2 +Qx = 1f249911b125348e6e0a473479105cc4b8cfb4fa32d897810fc69ffe +Qy = a17db03b9877d1b6328329061ea67aec5a38a884362e9e5b7d7642dc +k = ab3a41fedc77d1f96f3103cc7dce215bf45054a755cf101735fef503 +R = 70ccc0824542e296d17a79320d422f1edcf9253840dafe4427033f40 +S = e3823699c355b61ab1894be3371765fae2b720405a7ce5e790ca8c00 + +Msg = 8c7de96e6880d5b6efc19646b9d3d56490775cb3faab342e64db2e388c4bd9e94c4e69a63ccdb7e007a19711e69c06f106b71c983a6d97c4589045666c6ab5ea7b5b6d096ddf6fd35b819f1506a3c37ddd40929504f9f079c8d83820fc8493f97b2298aebe48fdb4ff472b29018fc2b1163a22bfbb1de413e8645e871291a9f6 +d = 8dda0ef4170bf73077d685e7709f6f747ced08eb4cde98ef06ab7bd7 +Qx = 7df67b960ee7a2cb62b22932457360ab1e046c1ec84b91ae65642003 +Qy = c764ca9fc1b0cc2233fa57bdcfedaab0131fb7b5f557d6ca57f4afe0 +k = 9ef6ebd178a76402968bc8ec8b257174a04fb5e2d65c1ab34ab039b9 +R = eef9e8428105704133e0f19636c89e570485e577786df2b09f99602a +S = 8c01f0162891e4b9536243cb86a6e5c177323cca09777366caf2693c + +Msg = c89766374c5a5ccef5823e7a9b54af835ac56afbbb517bd77bfecf3fea876bd0cc9ea486e3d685cfe3fb05f25d9c67992cd7863c80a55c7a263249eb3996c4698ad7381131bf3700b7b24d7ca281a100cf2b750e7f0f933e662a08d9f9e47d779fb03754bd20931262ff381a2fe7d1dc94f4a0520de73fa72020494d3133ecf7 +d = 3dbe18cd88fa49febfcb60f0369a67b2379a466d906ac46a8b8d522b +Qx = b10150fd797eb870d377f1dbfa197f7d0f0ad29965af573ec13cc42a +Qy = 17b63ccefbe27fb2a1139e5757b1082aeaa564f478c23a8f631eed5c +k = 385803b262ee2ee875838b3a645a745d2e199ae112ef73a25d68d15f +R = 1d293b697f297af77872582eb7f543dc250ec79ad453300d264a3b70 +S = 517a91b89c4859fcc10834242e710c5f0fed90ac938aa5ccdb7c66de + +Msg = 30f0e3b502eec5646929d48fd46aa73991d82079c7bd50a38b38ec0bd84167c8cf5ba39bec26999e70208af9b445046cd9d20c82b7629ca1e51bdd00daddbc35f9eb036a15ac57898642d9db09479a38cc80a2e41e380c8a766b2d623de2de798e1eabc02234b89b85d60154460c3bf12764f3fbf17fcccc82df516a2fbe4ecf +d = c906b667f38c5135ea96c95722c713dbd125d61156a546f49ddaadc6 +Qx = 3c9b4ef1748a1925578658d3af51995b989ad760790157b25fe09826 +Qy = 55648f4ff4edfb899e9a13bd8d20f5c24b35dc6a6a4e42ed5983b4a0 +k = b04d78d8ac40fefadb99f389a06d93f6b5b72198c1be02dbff6195f0 +R = 4bdd3c84647bad93dcaffd1b54eb87fc61a5704b19d7e6d756d11ad0 +S = fdd81e5dca54158514f44ba2330271eff4c618330328451e2d93b9fb + +Msg = 6bbb4bf987c8e5069e47c1a541b48b8a3e6d14bfd9ac6dfaa7503b64ab5e1a55f63e91cf5c3e703ac27ad88756dd7fb2d73b909fc15302d0592b974d47e72e60ed339a40b34d39a49b69ea4a5d26ce86f3ca00a70f1cd416a6a5722e8f39d1f0e966981803d6f46dac34e4c7640204cd0d9f1e53fc3acf30096cd00fa80b3ae9 +d = 3456745fbd51eac9b8095cd687b112f93d1b58352dbe02c66bb9b0cc +Qx = f0acdfbc75a748a4a0ac55281754b5c4a364b7d61c5390b334daae10 +Qy = 86587a6768f235bf523fbfc6e062c7401ac2b0242cfe4e5fb34f4057 +k = 854b20c61bcdf7a89959dbf0985880bb14b628f01c65ef4f6446f1c1 +R = a2601fbb9fe89f39814735febb349143baa934170ffb91c6448a7823 +S = bf90f9305616020a0e34ef30803fc15fa97dffc0948452bbf6cb5f66 + +Msg = 05b8f8e56214d4217323f2066f974f638f0b83689fc4ed1201848230efdc1fbca8f70359cecc921050141d3b02c2f17aa306fc2ce5fc06e7d0f4be162fcd985a0b687b4ba09b681cb52ffe890bf5bb4a104cb2e770c04df433013605eb8c72a09902f4246d6c22b8c191ef1b0bece10d5ce2744fc7345307dd1b41b6eff0ca89 +d = 2c522af64baaca7b7a08044312f5e265ec6e09b2272f462cc705e4c3 +Qx = 5fad3c047074b5de1960247d0cc216b4e3fb7f3b9cd960575c8479fc +Qy = e4fc9c7f05ff0b040eb171fdd2a1dfe2572c564c2003a08c3179a422 +k = 9267763383f8db55eed5b1ca8f4937dc2e0ca6175066dc3d4a4586af +R = 422e2e9fe535eb62f11f5f8ce87cf2e9ec65e61c06737cf6a0019ae6 +S = 116cfcf0965b7bc63aecade71d189d7e98a0434b124f2afbe3ccf0a9 + +Msg = e5c979f0832242b143077bce6ef146a53bb4c53abfc033473c59f3c4095a68b7a504b609f2ab163b5f88f374f0f3bff8762278b1f1c37323b9ed448e3de33e6443796a9ecaa466aa75175375418186c352018a57ce874e44ae72401d5c0f401b5a51804724c10653fded9066e8994d36a137fdeb9364601daeef09fd174dde4a +d = 3eff7d07edda14e8beba397accfee060dbe2a41587a703bbe0a0b912 +Qx = 6dd84f4d66f362844e41a7913c40b4aad5fa9ba56bb44c2d2ed9efac +Qy = 15f65ebcdf2fd9f8035385a330bdabec0f1cd9cc7bc31d2fadbe7cda +k = 7bb48839d7717bab1fdde89bf4f7b4509d1c2c12510925e13655dead +R = 127051d85326049115f307af2bc426f6c2d08f4774a0b496fb6982b1 +S = 6857e84418c1d1179333b4e5307e92abade0b74f7521ad78044bf597 + +[P-224,SHA-256] + +Msg = 2b49de971bb0f705a3fb5914eb7638d72884a6c3550667dbfdf301adf26bde02f387fd426a31be6c9ff8bfe8690c8113c88576427f1466508458349fc86036afcfb66448b947707e791e71f558b2bf4e7e7507773aaf4e9af51eda95cbce0a0f752b216f8a54a045d47801ff410ee411a1b66a516f278327df2462fb5619470e +d = 888fc992893bdd8aa02c80768832605d020b81ae0b25474154ec89aa +Qx = 4c741e4d20103670b7161ae72271082155838418084335338ac38fa4 +Qy = db7919151ac28587b72bad7ab180ec8e95ab9e2c8d81d9b9d7e2e383 +k = 06f7a56007825433c4c61153df1a135eee2f38ec687b492ed40d9c90 +R = 0909c9b9cae8d2790e29db6afdb45c04f5b072c4c20410c7dc9b6772 +S = 298f4fcae1fe271da1e0345d11d07a1fca43f58af4c113b909eedea0 + +Msg = 1fa7201d96ad4d190415f2656d1387fa886afc38e5cd18b8c60da367acf32c627d2c9ea19ef3f030e559fc2a21695cdbb65ddf6ba36a70af0d3fa292a32de31da6acc6108ab2be8bd37843338f0c37c2d62648d3d49013edeb9e179dadf78bf885f95e712fcdfcc8a172e47c09ab159f3a00ed7b930f628c3c48257e92fc7407 +d = 5b5a3e186e7d5b9b0fbdfc74a05e0a3d85dc4be4c87269190c839972 +Qx = 897089f4ef05b943eeac06589f0e09ccc571a6add3eb1610a2fc830f +Qy = 62ba3f6b3e6f0f062058b93e6f25b6041246c5be13584a41cae7e244 +k = 5b6f7eca2bcc5899fce41b8169d48cd57cf0c4a1b66a30a150072676 +R = f12c9985d454ffbc899ebbbb6cf43e3debcac7f19029f8f2f35cce31 +S = 12fcb848adbd8b1b4c72b2b54a04d936e4a5f480ae2a3ea2e3c1baae + +Msg = 74715fe10748a5b98b138f390f7ca9629c584c5d6ad268fc455c8de2e800b73fa1ea9aaee85de58baa2ce9ce68d822fc31842c6b153baef3a12bf6b4541f74af65430ae931a64c8b4950ad1c76b31aea8c229b3623390e233c112586aa5907bbe419841f54f0a7d6d19c003b91dc84bbb59b14ec477a1e9d194c137e21c75bbb +d = f60b3a4d4e31c7005a3d2d0f91cb096d016a8ddb5ab10ecb2a549170 +Qx = 40a4ab1e6a9f84b4dedb81795e6a7124d1cfdfd7ec64c5d4b9e32666 +Qy = 83aa32a3c2fc068e62626f2dafce5d7f050e826e5c145cd2d13d1b27 +k = c31150420dfb38ba8347e29add189ec3e38c14b0c541497fb90bf395 +R = bf6c6daa89b21211ea2c9f45192d91603378d46b1a5057962dafaf12 +S = cb6b237950e0f0369323055cd1f643528c7a64616f75b11c4ddd63c7 + +Msg = d10131982dd1a1d839aba383cd72855bf41061c0cb04dfa1acad3181f240341d744ca6002b52f25fb3c63f16d050c4a4ef2c0ebf5f16ce987558f4b9d4a5ad3c6b81b617de00e04ba32282d8bf223bfedbb325b741dfdc8f56fa85c65d42f05f6a1330d8cc6664ad32050dd7b9e3993f4d6c91e5e12cbd9e82196e009ad22560 +d = c8fc474d3b1cba5981348de5aef0839e376f9f18e7588f1eed7c8c85 +Qx = 66f49457ed15f67ed4042195856f052fe774077f61cebcb9efddc365 +Qy = 3a6e3f3423eec7308a69eb1b0416d67cc3b84d24f251d7cbdb45c079 +k = 5e5405ae9ab6164bb476c1bb021ec78480e0488736e4f8222920fbd9 +R = 7b7beaf9f696ca1a8051527478c4c075ab45aa4768937886dbf38618 +S = 93d4cf110a37c5a6f15c4e6024822118539e860dee2f60b8c3f462f6 + +Msg = ef9dbd90ded96ad627a0a987ab90537a3e7acc1fdfa991088e9d999fd726e3ce1e1bd89a7df08d8c2bf51085254c89dc67bc21e8a1a93f33a38c18c0ce3880e958ac3e3dbe8aec49f981821c4ac6812dd29fab3a9ebe7fbd799fb50f12021b48d1d9abca8842547b3b99befa612cc8b4ca5f9412e0352e72ab1344a0ac2913db +d = 04ef5d2a45341e2ace9af8a6ebd25f6cde45453f55b7a724eb6c21f6 +Qx = 8d642868e4d0f55ee62a2052e6b806b566d2ac79dbde7939fe725773 +Qy = 79505a57cd56904d2523b3e1281e9021167657d38aeb7d42fc8ec849 +k = ec60ea6f3d6b74d102e5574182566b7e79a69699a307fee70a2d0d22 +R = 2fd7fcbb7832c97ce325301dd338b279a9e28b8933284d49c6eabcf6 +S = 550b2f1efc312805a6ed8f252e692d8ee19eaa5bcd5d0cda63a1a3f0 + +Msg = 4cc91f744ac858d3577e48813219aa3538dd813b186b42d1e6218376f07cc1cc448ddd6b37240e98bf953f49cf54d65c12878b33c0bf6eb1c60254f0b6fa974f847e53abc56773eef6f29885dfc619e6a48fc15a667ca94001a0c945b6357a53221b0f4b266181456b0d2d25e90708777f1a6f85971c00140c631c1991e0fd06 +d = 35d4bbe77d149812339e85c79483cb270bdac56bbf30b5ef3d1f4d39 +Qx = 7924b1d7f5920cce98e25094e40f2eb3eb80d70b17e14b3d36c3671c +Qy = 26c5af35f71e61858582b7cc2b41790597c53ee514ffdf7a289d108c +k = 751869c1d0e79eb30aae8fbfb6d97bfa332123fd6b6c72c9cd3c1796 +R = 26bb1b92b0f01e94eba5fa429271371db527ce857abba13bd1103f64 +S = 836aba9c63e1252c2b2d72a21e6a41b82241ebe32647e7f814652bcb + +Msg = 58f43cc1924de4bc5867664adbc9d26b4f096a43aca47c27c52851b006dc2a658919ef9ce5b5ac48372703be15ac51631c2bd84b88f479f113b0569a9a09e230ec1e8e573474c6075284d3e57d973829af35325d9e7dab4a5f9b065155bbcaff3642a82ef4c9b9e127d3575c050721653da3b087d3fa394192897a5519527d19 +d = 2c291a393281b75264c9b8817af684fa86a1cdc900822f74039dc5d6 +Qx = 18cb5826ad60e6696bf07655032a3749f6577ca36da3ccd6e66a137c +Qy = 194e14820fe02d784fd1363ff7a30399518309765bd3f4412d646da2 +k = e2a860416229dfd3f5a5cc92344ca015093a543943a0d8f73bf2b2fd +R = 00e300c1ef4a8c4ca5da6413856f8981db49de29bdf03f32ffc3ceab +S = f250f18a51ba5f63e1584097841099fa6ae4e98ee458c061d1d5aed7 + +Msg = 113a2806b052fde683ee09453098e402204155afb3776fd1cad3a9103421d327eab8f9ec0dd050ffcc83f93b34ea707705fabeccfe43ab1a71c95298fd3ec769d99ead1066950eee677d225816e0faad19cf69e1b35d16771689e2092cafe16d7c0dd7b0db73fffb8d0f3eaed83004dd21e753530ec939c89ba25578fa5f785b +d = 831ea25dbeda33d272a1382c5def0e83929170ab06a629eed6ee244b +Qx = 076518e393940d42dfd09819409d66966d8c9189c83d554a9cc8a082 +Qy = 44d0ceaf4c0f50e46bea4a52e30423ce3ada19edd363ac5694c65cb8 +k = 6be6dd9f6a083915ccba54626caf12d246d3aece0a7eda7d8d85599c +R = ff1460946e06fb6f5d35e8d2625ca70ffb9b45308e3fabf6ad8351b1 +S = 6029aa3990918e8cb8a388d53b0772e5cdfff49c3405fe0d3a95933a + +Msg = 64cbfc8f2e2149a31b3e8a80c4a552f6c62aaeb7990b6e0ee55500a9d17be04213406578caf315951086dff5c2af3b5ce17d425d185101ef26f86396ba3a129a4f3f8e2dd595f59efb6c0f5c2dcc394569d7268695e9ac7daa84203f1f1895f1f9e4b514a5c9cd23baa63454710144fe735ad9b8f42d8c43267aa434a26d7e5f +d = 70f74c7324ef137318b610ead8ddc5b964e0eed3750b20612fc2e67b +Qx = 279649e2a2918e683520cde3fc98b0ae58a7100e8de35e7c9cc797b6 +Qy = aa4de6be34be61f02880139787b9038f4554a8ef1c994b887c2974b5 +k = 8e984864f86f7a2a73f3edda17dbccd13fac8fa4b872814abf223b1b +R = 3b18736fa11d04e27e2614cda03a63ec11a180f357b0b3192920d09c +S = 2f0f3dbd570727b14fbb29155538e62c930dd51c4035275c1365dc60 + +Msg = a10a11c8e30fff118d371daf824f16c08200b83ea059436466a4611ccac93b2dea2de8c1006f946196aef7fe9b0c251a391b0340f21797798278b412ff2b53842eec6450728e2bca062f8337a2c204b9ea04ff660cd4d4db559f2f11c4d8ef199021339fcc82396f7a93926cf5f247e37d8067fe50692de54f102bd5ab51925c +d = 026be5789886d25039c11d7d58a11a6e1d52cb1d5657561f2165b8a8 +Qx = 3fa617c50b177da1a2bdb98b780ad21ad1195c4bd24465f6187de3c9 +Qy = e3fd8d8876dfd03a4a4e31a1acad3a08d983826d286c250c4e5620c1 +k = 0128b8e3f50731eb5fcc223517fc0cf6b96cd1d2807eb4524bc46f77 +R = 3a6b633f96f3d0b6d54f7fb29ac33709e4f0dd8fa0e51606ed9765ca +S = 63e8c119dfa51784decd864f6911f2210a80f8f02d472d88df10d119 + +Msg = b3f720bf566ffa369259f4361959ae0641d2755ec264a4c4349981df2b02563275b2b9adb5aee47f7a456760a971991ffed6b17809bb9694138d1677fa916123795239353158fc6b22d10f20d26f5d2dcd8c56c44373eea5b93067dba2d7c5318dac2e9e8714873cb1b37f58c011fd14fa1e535554efe05f468bfc8e11cd8b99 +d = e79c18d935c2839644762867aa793201f96a3cde080c5968412ce784 +Qx = b7ae1e992b1c7fde1141f40bd913358538ca0f07f62b729f13cea327 +Qy = 811252d12120e04805fc171a439d382c43b68a21e1a0bdf5e4ec1da4 +k = 7abedab1d36f4f0959a03d968b27dd5708223b66e0fc48594d827361 +R = d35047d74e1e7305bb8c1a94e8ae47cb1591c3437a3e185e00afe710 +S = d9c425c9d5feb776ac8952e6c4eee0ecd68aef2f0e7bff2e49c9185e + +Msg = 0a398a46df7ccc48d1e7833f8bbc67100f1ef77a62dc78bbc115b2a662f9591fbaaa91ad3d788e2fdd1b3164e45293d4f5686c151296901768028ac80ded4bf89c647ad35f0c7c4cb318c0c757c1d83c44d850e5fd4677281b3f13b1ee54de79c8c042813f9d3312dcc6111a68299cb7e829557d7f3d96e702f65aefc6499415 +d = 0d087f9d1f8ae29c9cf791490efc4a5789a9d52038c4b1d22494ad8c +Qx = cd95cf8fb1cd21690f40d647f2353672a1076cc6c46bddaad2d0fc56 +Qy = 934262f74d9ee0f8a2754f64cb7415923d64bf00c94a39b52803f577 +k = 557d0e3995dc6377b3911546dd7aeaeec62a6d8f2af6a274382fc37f +R = 56df0ea6afdcc232ceb41729eec00cf906b69b6e28423a36d3c92cc5 +S = f4f70fd948c9a147f55317fdea7b8a84c33e721014552d5800d63edc + +Msg = 8c33616821a6038b448d8918668977fcf1ef5aa0cf7c341837b39bbcc9bca875a3757f4b392630e9995b9bbe4eb66978b877586adaa02f99d2344dae082a7603351d8ffcfca081ab403cd0acb90d078dd1d0789c2eb3185c62bff2d9f04cd38e509e3b83c12ed0a5c6808fc42f7ba5b06acdc496c8ad9be648ee6a4505f8560f +d = 0830aebb6577d3a3be3ba54a4501c987b0e0bb593267b9bbadb66583 +Qx = b88652020e083ccc1c43dc83d1881884dd4c7e3b4e3460b344b1ea64 +Qy = 22b69b517f86d7c26dc37c0f8feb4bb07fe876149fbcc3334fd2805b +k = e4f4a3280574c704c2fde47ca81ec883d27f2c5a961a294db7cda9d2 +R = b30b8a0079d9a134b5e1618c2ac63e3fbe0e95866b9dbc5f423f2707 +S = 3dc36746610271ef66e0aa52cc2ccadc5c9b08dc769e4dc4f6538c11 + +Msg = 94d56535fd4edfe67a0daa6579f9d53bf6b7b8830ae2aeb62892ff59f18756ddf2811b449c7d20d65d54f8507de4e7c50eaa084830637812aa4b250a4d61ab67845be36e4a41cdc0a70f8d6e3a63d4514f0dc197e6486015046a316153d5f3a3a4a0ae1ed7ea5fa55e12e73d333333685c02e0eb636234ea7e6d4b76b4b76b5a +d = 2acc9b97e625263e8e4cd164302c7d1e078bfcdd706111a13ccda5b2 +Qx = ce1a06f82df874dded37cca03b56c0648e4e8917ecd40ee73ee61588 +Qy = ceb6177b8f1ac7c5c6e6e1f7737cc3026952ee392badd2cd7af32f9d +k = e401fa80f96480d437ed4f61a783888062ec33d530b188fd48016a6d +R = 28674f447c4742e4087bbccfb522fbad4e18b56031d2ce8f532b078a +S = a5a7a13d15b423dd17771f73cea98d89dbffa846cc209b45c0e29b76 + +Msg = 5d8ebdf9eb28b47bdafaa36bf0b66a9eaf99b6c83959da4f2b1151b4f4ecd28fb115a64c0cb9491093a7e9b9c53ec423e4c72e7765bb9c818da0e8c428667e44474a71db4867130c77c40bfd8544b2d7b9d6464d2b8e6a48482153256a32437c3a747231f51134dd14c703407e31146a6fcde23bededcf16950486e90ca69ac0 +d = f4e873d4fb944fb52323406f933815092b7672221de4d1c45917f3fc +Qx = 0dc2cdddb990341adb1de73f02d87fc3822485a659a15145f4251d5f +Qy = cf78b2a83c7352eda1af2c74e1804ea04b35f76c04e89d90281dc2bb +k = 5d1476c682a64162fd2fdc82696fc8cab1469a86f707ea2757416e40 +R = 82982b38ed465138df4018d7cfb835edcb591cb57446ca49d163782b +S = 8ef1d7b326cabee7f7ab95b7b98d3c27a069c0fd95a1599c0ccb422b + +[P-224,SHA-384] + +Msg = 25e4416695f77551fdce276355528ccf1ddc2483821c5d22d751d50111ca2fadc6593b52c74f4b5957494f1df25b0b2f86950d0d19229ec6506fee8581d2dd09d48418b146ff16bd84a17ca0dc83b1888eb407376da6c8a88fa1e60b8c2a2471dfde4b3996ef673d5bde3d70c434dc9f2488e9de16ae657d29e5e59ec922a1ec +d = 62c572ee0d6f81b27e591d788bfc2f42b5105d2663078dfb58069ebd +Qx = bd6ba605639b98fa8113a16a3bb004ddfaec901c98a931206165f4a5 +Qy = a3190b10ef39e88abd60b2293b4707512b45c6c5ed5794cc11454427 +k = 0f0bb1e428bcdebf4dc62a5278068efc0f8ce75f89e89b3630f102b2 +R = aac0ea27e129f544abcc77f110e70bbdd5aa3e425dc39d5e8887025d +S = 10e5dd06aee6b8419a04aa33d9d5678b0039c3acc3c4b61fe106bfdc + +Msg = 9164d633a553deccf3cbd2effccf1387fa3177cd28c95d94a7d1a3e159c5e5c027758cc26493301b2f4d141d8d07a5fe5fead987ce5f30abeafcb48c302afc6c2309f0e93d9b6818cbb6972d222cb7b01302dfe202ae83b89f53150ae4a0e2b8fc0fd1091f19b4ab2e6ab213ab322d04f2c5f57113bfad3c5675227237abf773 +d = e2f86bf73ba9336fa023343060f038e9ad41e5fe868e9f80574619a3 +Qx = f5d5346f17898ea6bbdfff19c216a8757a5dc37b95315f5481628381 +Qy = ae61fd172ac8b7a4f13870a932dece465834cbd4f50bbcfb802c824e +k = 35724ac043e3b44b73b5a7919cf675190306d26aa67c27c28c873534 +R = 535147c265af138eec50c7fb570bcc8d2e6f675597b0fcc034e536bc +S = 743812c188a1dddf9fb34b90738f8b2e58760d6cd20ccceb1bb9c516 + +Msg = 019df05929321ecea7ee1de4f412aba1c8d3c24437db04b194a68a0a59dd871be10bd3a4be6edf551350ea49fc7155a4d887e1221486291abe77a30633a4c4f7868fe2df24311cba0c73804883954460e122387ed414111ff96ff1aebac8b6a6491d8a0d16e48a63bf3d027c0f68ee4a4b234d73b412196706af8ea022b4dcef +d = b0a203438e2586d7575bc417a4a798e47abc22aa3955b58fc2789f17 +Qx = dc5d217862a1e5b00c95affa9d8b925a72b9beaeb7a86dc397e788d8 +Qy = 5f05f8e976ae1eb1036eca6d683a82850795bf9127dee5f8b2859445 +k = 408e9c8b1f33136d6ddb93ff3a498bc09d4eee99bf69cdd5af0aa5a2 +R = 1b5a964c8b1fc634c6e2b82322499df1d7f0c12a4d2a77723c816ab8 +S = cf54599a36ca064fae0aa936de5266f87704409d22a15d28c01b7f2a + +Msg = 5d09d2b1d3fa6e12c10d8b26dc9aabc8dc02bd06e63ff33f8bb91ede4b8694592a69e4ed4cdf6820069e2b9c7803658949e877ffe23bf90bcf5ce1409c06c71d86885a94048b05ac0ec9db193e489a5a2bfa367caf6aa8ecdb032be366174343f6875d2fe1785e8d77334f5f469cec64998e08d3303e5c9a1923b34fdc105d65 +d = efcfa50fad6fb2065f9a55f28c0c42fa24c809ccb19b6fc6d8ffb085 +Qx = 61521a0cfb72be77ba33cb3b8e022743cd9130ff49e97093b71aa178 +Qy = ce0819aedaf6fce639d0e593f8ab0147eeb6058f5f2b448231584ea9 +k = d1eea821f286eae6ebc1f61b08f9ad4323a3787e94af4c32cd31351b +R = b37caaa71103752ac559f9eb4943324409ebfa8b585f684dcaa5c411 +S = 7c28e7619e2944ab4b7be022878c8052ebdf2cae5dff4f976c49686a + +Msg = 50f6dfc81c6cf189e0a310f992907fe93356cee9dea9a41c7671a8daf3f4cfe0c459ce6122c1e731dbf7593419d7114cb73b46956158a982c5d52c72f43f0f822046093c69aeff1f7e4cd8af00ba655c5baa2e7b6a400b4be1f6fd51b3e4cfb35a69c80a28c5cafb771b6c2e52e0aeef0e3fd045e8d40745f3f8b74fd969f816 +d = 61a17816937987764cdc064dc7b5b4f5b16db1023acdfe25902957dd +Qx = a7e975c0a8f87c683bb8e31bc160843a7b69c945f4850bd60e1c08c0 +Qy = 8930a454dcc2aa13bed7ea89368b2c9d689d816b2acf4e52585ee9c4 +k = 44b1fdec2629f9075f89c134ac28ff19bfddaa9db02a5d7f853582b4 +R = b0f5635d8bc9c53a1d54a3ec63de59ed66e6b2358d4ab79755414326 +S = 67c68fe265c7e5aba4232deeafb88545a2aa266fb9f2c2bb3f3ae8d2 + +Msg = e90129ac6672c85bb7b6b18e9dc199c96c81fd65034b53c77818364d512366fb9cd1bc7c82404c451e561fc1ed916c0948f6ac561b33a1ccca093f07684b8c2bafa9e966377bd208556018a5bafb9edcecf70498c7140fe9c8cf3ad8b8c3b0aa489df797944465047465415bb0e24333235fcdd59a98829a3941eaaf62033e82 +d = 79d5367314ec664aa0f6ca36f95549502a05bf8400bf532d669fab8d +Qx = 3191f0237102dac159032ab2dde53cf56c9ec827b5caddfe9e83c02a +Qy = b496b1bdcca4434ac0d0d91ea38ff3bc33f9f54095bfe17796d5a9e2 +k = da529c52f5cc1f435d873109cd991d6cd7e1631d9ff1dd9521dd5db6 +R = 8e0ac63903f4921755430572c3f08bc272790639bdf1009fe2a9a714 +S = 6278c841a2d0a270791fe54b36c49d426d67907aa4e4f59c8638ad97 + +Msg = 3c9a483c9bee33b601549c592a82e95b4319b1e74b777877f0971bcb4273716b268e8f99f876e42f942f4cf08284896bbc1ffbf094ac0956c3cedfc3580cffa8c74fc6db29a371f2da2d05edb9185ece741fe0d3fabfe9d5b4d373755ebed13dc6840cfa3283b9ea46ec8b95c434f253ae86998182e9cc0e95ee64f323fc74b0 +d = 1320eedad4745121793a7eaf732b0b4498f7cb456cac8cf45a1f66f0 +Qx = 9fdd99906ab77fd29e9021bde947d05a7a9eb153612269bfb0899bc9 +Qy = 681b65b9ac8e4c2899bb622dafb253b7bf5a6e38e5f6595f997c291a +k = 66ed8d8934633f4125f593cf1b1d3745c4db1f15dde60cf46ca1c7f2 +R = 80199485a3a96447b39f7679cd47412a78675ba17dcbd10465dc5b48 +S = a251fd9f136a3cb0dd0bc80659ae032e4a761ba7045da0034553fb8c + +Msg = bfc073fdda63c5fccaa0ca8770c293e8154e7aec56128bbac4fdbd541d602216ebf7ca1e02b514d6e396f20683802ba3f334310a9226576926e3bb19ceee27738d13377cbafeb09d091043501702a07aa31d1f29d50ddc55adcf16ffd40578e734a4e6cb6535f26ad48e0c62ad90e79720000e87d419e92dca3e11f943655b03 +d = e18821329447d3f65ba7279e96bd4624ffa1b32b90f6e8331b1e876d +Qx = 46c9ed837232c47022df2f1a1578fbe65ac9f2e81c98a74cc22ea31a +Qy = 6fc5e9568ae62b31412a0b0b367242e9fd7e518c83aa06a069e1d90d +k = a4c1eb402a2fb3af26e0e14a3d2fc8ed3bc1a8b2475270356a79fdd3 +R = d478b68733d8ad44be46766e7b66af782fbdc7ff7ed0b191176da98a +S = 5eae9160ccf71fd1d359d89cecce72ef8afaeee2365f6ba828aa450a + +Msg = 08079955d1a1f33728128c73673ec9f21a6ce138dcab5adc4dc068e6ab57314b9fbd8b013123b2fdafa9524fbdd0288777a233de8055cccfad83046ada6a19f01c47817496667bba8fc8b9456fc0e044a562d931dab1adcb66af8b66325bdf28d83ded3e2937958ccd19da540d70ef2c189f55a506c9c0d63406394c5bd3823b +d = f73e030d5a696b358986d3efaca121cf71f775f8835a21e6135145d7 +Qx = 9ca2c6ea87ac8dd3a23a5b4010841a7c8af309038882ae44634bcf55 +Qy = b0a347dbd5ded3b8702ac5a457e8b32bd4de06fd315095fa1b7d5fe1 +k = e3cc786c1288ea567836c51d6d69dd0cab5c015987d936ccc3a4beb3 +R = f1234da71761b7a0f49e661a419d2a739bdc4544bf87690e3d2f96db +S = 096d16bf8020c3d3c233894ad8eb81206010e62c6e692a215e088fd4 + +Msg = 23900b768f6cd42b8a8df0dcbc9cb5daec8de36b9d5c619adcc1ba2b649103d5af123746cdf19c3fd0665a6fb9338156182aa06181e3c6e37ce56979612af2927440424f89cef43fc754854b8a5c43370808cf5f9929cf47712512ce2f8a2a20d2e9f568c2848b27dfbe09142843c83905ffa5da3b15501761b03dbc2c5398b6 +d = 7a0789323f8741c157a1753ae165ecaf8e8b03a60561f8b80cee467c +Qx = 101271a9addd4bd1f19d00bf116c8524f52cefd598e85dc381597acb +Qy = 2f17d14f4d8ccb28b216553718152ba7c104646d8eca986dd9ddea39 +k = d169f04f05b60c625cda864d187938863964dab7bb3b9dfc04b05519 +R = e4a51be686a764b709da23ab48b1985e153c6ee238d945e743907afc +S = 118a8f1ffe3cd556ce6345bd1a398dd9cc3729b7fd6d8af9bfd82f40 + +Msg = 1eb28c0bcdd18f73e347f957ece15b4cc83a771b0877e1feaac38e24028fb38ccea8b54ee017dc7c3d5a1327bc6f40b294aa65d7dc487f278846cd101ee84202f14b38aa2c275046aa2577f65ebaea41cd383e8def2fd0b4444dcf426fa75c4082cd7fa035cdb1e0d34a3c79d42130f5b0273eae75bc701dda3aebe7358f41b5 +d = 78e795d0edb11fd9e28dc26b21e751aa89bea0d87932ef11c95c0e18 +Qx = 9edd544107977134bf6360d43ccabb3c94d627c03963c0a04b439627 +Qy = ece4c61d319a0e41f3de7863e7c355bac94395aaa74cdb5f74a87a5b +k = 36f7c0f76808b826a0a974a1fd6e155e00a73f1d34674a8f88be405a +R = 3e319444438bc2cc92f323ea842cb402b3c3c2448c89869ef7998edb +S = 3420cc38f058f41c31e71f4b1ad488f801111c73541de69fcee60695 + +Msg = efab51855407438fd5c250670366bca3c026ecec4a59394f00d8a4b51746d0c4564366656d507e3e13e62fe7abeb976b8859895848dbaecf6582f1898ea06f00d4247702ed9721bd375aa83ae4c67c2eaa6e080777ea5ecf2cf787d785389560ac91cf63a52f0373c3185e18a3b8a466e21b61a239f1b77624eb1acacc76c4e1 +d = bee02d8bc5bffb3fd3b4c9d6f686409f02662d10150d1e58d689966a +Qx = 8848f964c847fe9dddc774618d4588c9cd56bbe588d7b1fb369c8bfa +Qy = ebbb699fbd0dc08859fe9132285fe20dff3b9d561c0640b6e0717607 +k = 59f1450d857b40e5552a4b8cd4ab0df2f01716635d172c1106840f21 +R = a206d8398a16a991bc217f77f23c6f648384f254f255a8a876404444 +S = eb1169cb5b1423dc0bfaffe565ae57f986e00de06405e3e7b605862e + +Msg = 31c29ca10279a417f0cc9b1382cf54dbfdfc89f2e6ef08c403c11f580cbf8674b141ed1a417563282d99a55fc616d836421cde9424815c95e7fb7668bf3f137b29937f14882d74e034b732d78d91af7721aac4950734f5fa5d4b4d35534974f8cab6d2e6dca75ddb57e99148c8a59df9fc5bcd723e546e8356f671cf2f65640a +d = dc0ddf6e501418bb8eafc5d7ccc143369e2aa441df8fc57d5f94a738 +Qx = 063a5d632f4144376e14cfb03ad8ccf1489b613acd184d20dff66545 +Qy = e77727f057b043d8a0f7458196b72e92d11f85b0891c6aaa9d915f58 +k = ff0e5cae2671db7a1b90e22c63e7570bdd27352d45bac31e338debe0 +R = 5bc0b4998481ecbd3b6609184a84ca41d69b08c37138097f559259f8 +S = 0df8828eb1ca85e46405b94e1a2972c34c5e620a54e2f640f04aecc5 + +Msg = 8db476f92e332519c1a0ece5d8deded6efbd2d8e8784eea0a6b4c3b4296c35f5f8de4317e5c1627b91fb1973fee86c06e4992aa5a20cb7475c8808ff1da354d07a488dffa7838c6ec1e3f99e3acba831f27bee8434eeda3eb36d0c6df3658883cd40068b1bed841310f6eb38d4a3d07d85848770ff7933c054cd8b34662660b1 +d = 229d89b2fcf8441ffc95ebb2ac2ef156e25825782044b2b8bd6a3e01 +Qx = de616848d8044a44789ef1ba3a6dd66fe9257ddc57f7534e59a701be +Qy = 26cbf74a6d25e5b34b96d30f327abd574cff7f7dbe6686573a7d6c5c +k = 3b18ca6ec8e8e255ac88f64302745ca0b73ff94b2b2d48be95b4aaee +R = fa94fd8b827c06115c1eefd50afc02ce5926ee0e789667783c01c34b +S = edf766a66973cfc33e4159966c07321a7f6549c3c60e8586ef41402b + +Msg = fcb272c828fe8fd3c6f8de9410c7b6e2b36717c1b0e5e359e9109bd7fc378978aa98182a9d99961898ed88999b050d3b64d1457d7a899d6d273b9f4dde2aafa36d76329d62509043c338f265fc4c7d938459b7fa3b230a9f6cb632b61489546bb4181a5ad7f0d7369b8caced48eb374b075b2b325bc86add0f3b680cd9e80acd +d = 97d747068147c0393a0bb5c159e2c9f1bd538f6204823294883abe28 +Qx = 3858a576eef2ce24d01766997fb81b3f3f78b6104cd188610be221d7 +Qy = 95ffc677ac7bfe3e0bb4cffb17355a964c8356a807151b3cba5d1f4e +k = c1a2ec1ef16cfd5107c892790daefbed061be78bd8576696b60f64d5 +R = 18c908541843fcdac99b9ff6bb397f3f8094d16b42670216e4eaa2d7 +S = c107a8a508ff57c5d4f78f86cc37e129c864d1c44ed5e73909613b74 + +[P-224,SHA-512] + +Msg = 7522492bdb916a597b8121f3e5c273b1d2800ef8c1db4f7dcbae633b60d7da5193ba53a63d7a377b351897c3b24903ae1cd1994211b259be3e6ae2cbc8970e4957fdf782c7d1bc7a91c80c8ef65468d4ef35428f26e2940ae8b0bd9b8074236bf6c00d0ebe83f9ddb2ade0f835138d39f33b59f244e0037c171f1ba7045a96f5 +d = ba5374541c13597bded6880849184a593d69d3d4f0b1cb4d0919cbd6 +Qx = ac635fe00e8b7a3c8ef5655bdfb7f83e8532e59c0cc0b6534d810ffa +Qy = 1d067aebeba66e79b28ecfe59ac6fdf5e1970dc3a84499c9d90cd8e2 +k = 187ed1f45c466cbafcd4b9577fb222408c011225dcccfd20f08b8d89 +R = f83d54945997584c923c09662c34cf9ad1e987da8bfd9be600e7a098 +S = 4ff2dba9dba992c98a095b1144a539310e1a570e20c88b7d0aa1955c + +Msg = 61097114ff855c3e34a62d9b853f8982d35f29cfa4a89893badbca7849e5fb437a1a38d6451bf0ca5a0d528e352b8e4b57f2ea359a7fc8841d49dd3e570f9b016f14156b0bbc4be822e260bd147ec081454969e11cb0034b7450ef4deb7ed6edb977e2f4ed60121aa095fb0ab40240dc329ecc917f5c64b4410612af065ee9dd +d = 1e27187134d0a63542adf4665fba22f00cfc7b0a1e02effe913ceedc +Qx = ecaea8ceea55c3bd418fd34a4ff2499e25e66a104eed846bc00c31d2 +Qy = 3933a356ab1f2dabc303ff0a5d076131e77032e6f502336883bf78a7 +k = 34cb597deae9a3b1cada937abcd247161b19b2b336b20e2e42ae01f1 +R = 58177ba46fb291490b39368774accf72736412c1fb5ee0f27b9b1e02 +S = 58337d78b95a080bfcabb5809bee012501b4da84b8ef310a4628f11c + +Msg = dd09ae6c982bb1440ca175a87766fefeacc49393ff797c446200662744f37a6e30c5d33ba70cbd8f12277fd6cc0704c17478bbab2a3047469e9618e3c340a9c8caaff5ce7c8a4d90ecae6a9b84b813419dec14460298e7521c9b7fdb7a2089328005bd51d57f92a1bcbeecd34aa40482b549e006bbf6c4ce66d34a22dda4e0e0 +d = 0905b40e6c29bfcbf55e04266f68f10ca8d3905001d68bb61a27749b +Qx = d656b73b131aa4c6336a57849ce0d3682b6ab2113d013711e8c29762 +Qy = 6328335ffc2029afbfe2a15cc5636978778c3f9dab84840b05f2e705 +k = dc82840d147f893497a82f023d7d2cbf0a3a5b2ac6cc1b9b23e504be +R = 583af080e0ec7c1ba5a491a84889b7b7b11ccfe18927c7c219b11757 +S = b23700035349df25d839f0973bef78a7515287de6c83707907074fa6 + +Msg = 37a73e2774d3b274db426c89b945696daa96035031f72cea01894b24508c7f81961ec254d36ed6a0f448e11cf7950af769dc6cd2c47e52c6caf0ea92c270974f0214b4db436c36a60fb722060a6bb544462a82e1714f5906ec32886f7d59ebf289541c3a00ec1e004892ef2b1286a0194f55d083c6ec92c64b8fd1452e1c68ba +d = afbaede5d75e4f241dd5b53220f3f5b9c1aa1d5d298e2d43236452dc +Qx = fe83e59fc8ea8b939355d3258fe53a64d45f63031a0716b7cc416173 +Qy = f151d23060f1c856eb7f1f58be72a7228c3af89e43b56e9695b558c7 +k = 0fbbe7b40136c81a8fb894498d5502157a1cf5a89d0643de92cd38f6 +R = 24f3f457c7b72b7e759d5a8afbf330e31c5d8d2e36f92c0e79c5d87d +S = 36fd1193def34f12a960740fd79fb38bf2b480726ccad540eb42cdf8 + +Msg = 9dc2046ffdc6804544db964481abe5d2d276a2a9eeec4c7ad40215b1de23561d402db69bd0f6eec2254711eea4487c64d9a6b62c3ebaf5ffa8db6e7e3a6e17154d126967a47a853a6f8339bdca9be306a13c7f992ded7619b0da59909a49b1e0930360e05b47f18628a36d69b2f87f2bfddd6a5d4a72f84dc76dbdd43f3a6a35 +d = 950b07b0c2b7539a21b5135bfede214733f2e009647d38d8b21d760c +Qx = f43d13bbfcee3b724063b3910fea49fd591b81e86fdb813b1a492d0c +Qy = 6b4c8d6fa5dc661889e3cf5ec64997a78222837885f85d2fe9b684fb +k = 83e110d0d1e700d2f36543028737d2a2f1474aa3b4b28998a39e4793 +R = 2685265bc878e85d10ab13293dec190881a57c4a467f8fc2170432ea +S = 80a347bb49036522369339bd6485a967cdda818915d8eb947302fcf9 + +Msg = d9c6847fce688c5e7525a1098b545cb6c15dcd21a02761fc82fc664372a667390680135f91c01a2fa5430c634b1a6d1cd6002d8aa021e7bf5956a7901c2f81bc25d502ba5f55a55f30c0323dc68205cbefec0538e68654e7b327ac1743641896c3e740d8f66f400902b304eafaa4e0d8cffae140536f0922444cc3216a675697 +d = 015bd9f5dfef393b431c3c7fced24385d861ccb563542574a5d2a9bc +Qx = e868690641e2cda13b289a6c5d2fb175940396044d9cf27b4f2240af +Qy = 4c78c9abdf2b7fc67ed4497001d7bcf1daca1739dc14a661f91d7c40 +k = e2374350f47c08f3c1359d4edf87e61d1ba4e7dd1540d8d9062efa79 +R = e12dc088d2bc032bb214c77d0e0fb749fc8e61ebe1ed72996f1084b6 +S = 0ab58aa31e0bba5fbc76855e6549f1036fba0a589aeab978ab01b8fb + +Msg = 69df8a01b66f04930efd2012ff2243874f256ca8758145d2a9e4ecc84d0dbdbd0dc494ae06db0ccbe819918137c90957114558580d6623efbafdd342b38dad9f08708084d32f874fba04782ce26aaab78de2102ad171f8a8f2b30b5bd3d55fdac5fa3acd6f7def7e61c2533938572b331ba6d1c02bd74bfdbf7337ade8f4a190 +d = 0a3c259df933247445acffb6d8265b601d597fb9997dc2a1eb4deef4 +Qx = e67f4385a9da54253cc371ee9bc6739ae6385a4b87669c7baf0c460d +Qy = 2bb00b6ddd7b67d9ac5653ec04ca8529fbf16f815c04da3c2e58e82d +k = 8bf5859665b6a23e6b05a311580f60187ba1c4ae89e44877fb48af66 +R = 653675fb993c3fa9e57b32e33029ec230b966e8077c72c1ec90ddefc +S = 792723bf87e315147cd4303de7f1dfe95cd7658ebb95c38c1a196140 + +Msg = 927524982b8d60777c1105c86fac05f634abf58c73f84fb95d81ba0b86e1e43592c4fcad2e395a40fbe7005697d86088e2fb3bb7287eb3f917d4f2dc281f5cbe65d05b4f9623bca849b10a03beca6aa2056a12ebb91cf257ac448c5e9a78f8349a6a29b17c8978bef43a443cbb8a149eb23f794844fc41693f2dbb97181444be +d = a1c8ef463f9e7e3dd63e677412f87cf9ea4ac9a6a2dae629da5b9916 +Qx = 400e5cd4b315ceb309545cd3277acb70bdae2073fda6ad896ea14b27 +Qy = fbe1d2466cd2e116f38248bd5cabaa6cbe6c4a2694d998abd7b0c991 +k = 82f55a25d3ed6e47c22a6eed0fa52ed0818b87d6ea7950281dfefc09 +R = 16305a46a3f6f9e216ef8f6a6f5f0760d064a885657c864e1c1ea035 +S = 58fd97050bfbca6f87e64e1458c4ad80bae26e280356da344ad3b25d + +Msg = 5f9042283561e7f19a436d01c7ef5a950a6d77ede5629cd7e43c0a5d58e8c5673c37945a453291d12938253c71dbe12c8b022ba7276eda6be034ef5ec1ec77dbd1e08f0d7b8e7725b7ec671c075e008a20f77f4ab266f97079b0aa6337df59a33b881954084057b21f294dd14bcb0869a4a6f1f597955ec7bf9d19bb3537a66a +d = fa511dbf6fef7e5e9c73e4555eb75d435f7884322d9faf5d78cacc0b +Qx = e8dccd706c31f895f2f261ab979cbab51b8ae28196bcc12a42046380 +Qy = ec246be8e71ea3859cb717a59990fe22e4b76858ff49becd70739a01 +k = a37d665fe4314aa4cd03eb8e6a1f366b43e11fdb419c96b48f787b62 +R = 05e4909bcc172ab4140be291aad4660e375032bce2d762b6269ba764 +S = e347a1c9d3670690e1d8d1d4cd9579848f442199c10526488da5cebf + +Msg = c2ae5573d3bf396523bfb703db8502fd0760cd1be528f6ddbfb95aad399e0b19f3bd9e0fabdb05d49e3f893dffec5b627c9c2f7ad5f32e92e4e27a38cb5c28657657377fdfa1b66cd7ac3d15c6d49df92d284db99f69744f37dc7cb4e7d52920fdb200a7942623a7057ba82e467dcccaa5da416b48510d8364446a6a5e2a5aa8 +d = a58bd53646400a646f0e4208320dc679a9664d1c6bfb27fdc8eac7ea +Qx = e22e0dc4ecd96eb0071b72ba4b4988bf784f3fe73cb81bfb93d9ac4f +Qy = b3e213e518bee1367a4fb3703b9008bac9d95a1fc4aa61225fff9f3c +k = 42c5b6f87d3bb1ed74f5ee8398d8f8c61e9e50ffa7a1da12d39893f9 +R = 5c0e5c6f057de1e99ef5d237a60d7a07fa9a42b120a82f573d9fb7b2 +S = 2fffc0bf550bd2f650fed085a84501cacfa6a1bb984df1f9237eaa59 + +Msg = 03c1a1cd30a039d0dcb22fee2450a7fa79495a0d0f4f43d2de4d75bce003c0334a8860f5c164dbd94888a9f751235a3e570d31070e3e1293a7be616af7176600585d36ac013600157d2569d491da4b8a3bf3630c26e0b9925412189f50b0ae6f04c86477932e2ecd8c3546106ae1ebc684cc3adb27ed665eddece886adea4ce3 +d = 64bd4452b572cc95510ac2e572f41136299ff17f6e8448f4ffb571d0 +Qx = 92521fa25c2e034d127e0921efdb167f0b2ff8b20504487ed87fa264 +Qy = e72c770e37375ad7dc2c4e63e5701826f6606f6ffb9461ee61b4e872 +k = eaf76ee4d7e00d13d8a6d03dffd07ad9a8bb6dc8176c9f93059b1b7f +R = cf5058e2a6cf5e61a138b013eb292f38a1b9f07239ae5941dbce8919 +S = d14198621650d985d270bc997da6e78588fd0ef843b874c66a3de3c3 + +Msg = 888f6d9bc7c86c0079fbfd42d8c08d6958f40f6e570fb0b1f03d2f8f8a63df4fcc87b379a222cf835820a999d34996e08961f13b86b075e7fd1c303cd3baa44de42168561589012f7e5300da4f8bdf470c07119a5d9f7ba7293568cd7c6a1b7fc1e41cda40bed7d46e5a28af67ae2aabfefe67a86a1c601e6f5ee543e09bd7b6 +d = 7f3edb710df9d982f486233d0c176aa88f5a0ee81efa9b8145020294 +Qx = e7611e013e7b43ff5b8b57ad83333bffcc9e469ad23070b5791dc594 +Qy = 7784da0a11dbe16208c6e0b6d5029e71fbec4dffc9fa046d3eeb71c9 +k = 94db7ef9a232593091eb9a74f289529c7e0d7fef21f80b3c8556b75e +R = a971f45bab10b1d16d7234ca8e4ec987da20d9e867f28aa063296e23 +S = e38c538d65a7e1a28fd3ec53f015a7e5beb60e9d309f1e3ba4b2c3d2 + +Msg = 48453340f1317769e6ee6e103153714365731163dc18f84e9f2fa4b120f9c5a9645ee2f9b66c84c26d95912b422b009b64af96aa418b2427a4209f2e7513ba8e43ec8cf20b34e7529b22eb1199545afe9a9f7d9bcb320aec9ee0162f91c0d1dd9674c9c284f25199c5e109f6f84d7ed0d269cc6413edb81bc2c83e37d644d8b9 +d = b569f8296ff1d9cc01fffd9919016e5730c1858bdb7b99527153751a +Qx = 242f34959516a4706172f7dede23110efa314bff22eb320ab88feeff +Qy = 45e3227710900a8acfc9bcce728119d042f64ca40876c2b380ee46e0 +k = ae61523866a8f43e6cdd42ba27a34ed06527e8a5842901a64c393f76 +R = c2732a4e0815f9f785500e80147e9486994446beccf8a6a352b97585 +S = 6ecaece6487d7920e398f7f951ab7c7aba5832dabf03704106ad1244 + +Msg = 4bdfd3b91d83108409ad765b256e0c9b9937ecf647f8e6f9fc807e2e72af8246178b3fe046b4ea10170450d71a4eec790ecb05f03d7077341de26c4db7eeae24d55c9a9093e837dfdb38168fe8230cb9605825a1282fecd741989bfcdb34678fe077477927f66bd26d003e5dda22043341a14dd31841ba483ad5ce2701e0f68e +d = 41a4dd8eee39232b728516e2f21e66011e7426a6b25986c3ffa237e4 +Qx = c32988171caab178bf50dc7310bc7f604df5a9d19a8e602519c72d8a +Qy = f8985d112ad9de05969e5364d943c1cc5cd198359f4c62b19da0e117 +k = 827d4999da81fa920c8492ccc1e2d5cdafed9754cf7382a859952071 +R = 89c61da7422ccd676baec07e2185c12e947a2374eede87847304be6c +S = 2685379624717ea28422e8d001c090405a130b4ef9f1ac726c3ca502 + +Msg = e6cdee8558bc1eacc24e82f0624ce8d02cc8d925b4dd3dec3a72f4a4e0fb76076bfa3ef2e2c33bdd7c27b322bdc09bbfee8fe46f75dbd7bbd2af09690b7137943efe21706e0a1b6d3089540fc58d85ddb55ea836616db573e36c521be008893f40a0a7c349602cc178ea43be59d31ec6449e7ff2c5379379f7d7645134df1bc3 +d = 67fa50569257c8cc89ac0325db4902003a62f30b917f53e4035a7e04 +Qx = 6773a0436a9c42635730413b19aa4166f08c69c0e5002953da42253b +Qy = 555138290b093bf2fe79acda9131d920cd1e7ac43fb8775776cd713c +k = 557cb45fd3a30b3bdbf08c56eabbd4478736024aaa52bf8448096453 +R = 8e92cf7a674aa5f7542dd95c695589a05747431692edd04804299b8f +S = af4908b41f8180b71a6ff10fd51f3d143147af6ddddf7534d3284ed9 + + +[P-256,SHA-224] + +Msg = ff624d0ba02c7b6370c1622eec3fa2186ea681d1659e0a845448e777b75a8e77a77bb26e5733179d58ef9bc8a4e8b6971aef2539f77ab0963a3415bbd6258339bd1bf55de65db520c63f5b8eab3d55debd05e9494212170f5d65b3286b8b668705b1e2b2b5568610617abb51d2dd0cb450ef59df4b907da90cfa7b268de8c4c2 +d = 708309a7449e156b0db70e5b52e606c7e094ed676ce8953bf6c14757c826f590 +Qx = 29578c7ab6ce0d11493c95d5ea05d299d536801ca9cbd50e9924e43b733b83ab +Qy = 08c8049879c6278b2273348474158515accaa38344106ef96803c5a05adc4800 +k = 58f741771620bdc428e91a32d86d230873e9140336fcfb1e122892ee1d501bdc +R = 4a19274429e40522234b8785dc25fc524f179dcc95ff09b3c9770fc71f54ca0d +S = 58982b79a65b7320f5b92d13bdaecdd1259e760f0f718ba933fd098f6f75d4b7 + +Msg = 9155e91fd9155eeed15afd83487ea1a3af04c5998b77c0fe8c43dcc479440a8a9a89efe883d9385cb9edfde10b43bce61fb63669935ad39419cf29ef3a936931733bfc2378e253e73b7ae9a3ec7a6a7932ab10f1e5b94d05160c053988f3bdc9167155d069337d42c9a7056619efc031fa5ec7310d29bd28980b1e3559757578 +d = 90c5386100b137a75b0bb495002b28697a451add2f1f22cb65f735e8aaeace98 +Qx = 4a92396ff7930b1da9a873a479a28a9896af6cc3d39345b949b726dc3cd978b5 +Qy = 475abb18eaed948879b9c1453e3ef2755dd90f77519ec7b6a30297aad08e4931 +k = 36f853b5c54b1ec61588c9c6137eb56e7a708f09c57513093e4ecf6d739900e5 +R = 38b29558511061cfabdc8e5bb65ac2976d1aa2ba9a5deab8074097b2172bb9ad +S = 0de2cde610502b6e03c0b23602eafbcd3faf886c81d111d156b7aa550f5bcd51 + +Msg = b242a7586a1383368a33c88264889adfa3be45422fbef4a2df4e3c5325a9c7757017e0d5cf4bbf4de7f99d189f81f1fd2f0dd645574d1eb0d547eead9375677819297c1abe62526ae29fc54cdd11bfe17714f2fbd2d0d0e8d297ff98535980482dd5c1ebdc5a7274aabf1382c9f2315ca61391e3943856e4c5e616c2f1f7be0d +d = a3a43cece9c1abeff81099fb344d01f7d8df66447b95a667ee368f924bccf870 +Qx = 5775174deb0248112e069cb86f1546ac7a78bc2127d0cb953bad46384dd6be5b +Qy = a27020952971cc0b0c3abd06e9ca3e141a4943f560564eba31e5288928bc7ce7 +k = a0d9a7a245bd9b9aa86cecb89341c9de2e4f9b5d095a8150826c7ba7fb3e7df7 +R = b02a440add66a9ff9c3c0e9acf1be678f6bd48a10cbdec2ad6d186ffe05f3f2a +S = a98bea42aec56a1fcecec00a1cc69b01fcbcf5de7ac1b2f2dcc09b6db064f92b + +Msg = b64005da76b24715880af94dba379acc25a047b06066c9bedc8f17b8c74e74f4fc720d9f4ef0e2a659e0756931c080587ebdcd0f85e819aea6dacb327a9d96496da53ea21aef3b2e793a9c0def5196acec99891f46ead78a85bc7ab644765781d3543da9fbf9fec916dca975ef3b4271e50ecc68bf79b2d8935e2b25fc063358 +d = 7bbc8ff13f6f921f21e949b224c16b7176c5984d312b671cf6c2e4841135fc7f +Qx = f888e913ec6f3cd8b31eb89e4f8aaa8887d30ae5348ed7118696949d5b8cc7c1 +Qy = 08895d09620500d244e5035e262dea3f2867cd8967b226324d5c05220d8b410c +k = 21c942f3b487accbf7fadc1c4b7a6c7567ce876c195022459fa1ebf6d04ffbaa +R = 2e6cc883b8acc904ee9691ef4a9f1f5a9e5fbfde847cda3be833f949fb9c7182 +S = 2ac48f7a930912131a8b4e3ab495307817c465d638c2a9ea5ae9e2808806e20a + +Msg = fe6e1ea477640655eaa1f6e3352d4bce53eb3d95424df7f238e93d8531da8f36bc35fa6be4bf5a6a382e06e855139eb617a9cc9376b4dafacbd80876343b12628619d7cbe1bff6757e3706111ed53898c0219823adbc044eaf8c6ad449df8f6aab9d444dadb5c3380eec0d91694df5fc4b30280d4b87d27e67ae58a1df828963 +d = daf5ec7a4eebc20d9485796c355b4a65ad254fe19b998d0507e91ea24135f45d +Qx = 137c465085c1b1b8cccbe9fccbe9d0295a331aaf332f3ed2e285d16e574b943b +Qy = d3e8d5a24cd218c19760b0e85b35a8569945aa857cbf0fd6a3ce127581b217b6 +k = 343251dffa56e6a612fec7b078f9c3819eab402a72686b894a47a08fd97e6c23 +R = 775e25a296bd259510ae9375f548997bec8a744900022945281dc8c4d94f2b5b +S = d87592ceab773ae103daebbb56a04144aaccb1e14efc1024dc36c0e382df1f70 + +Msg = 907c0c00dc080a688548957b5b8b1f33ba378de1368023dcad43242411f554eb7d392d3e5c1668fad3944ff9634105343d83b8c85d2a988da5f5dc60ee0518327caed6dd5cf4e9bc6222deb46d00abde745f9b71d6e7aee6c7fdfc9ed053f2c0b611d4c6863088bd012ea9810ee94f8e58905970ebd07353f1f409a371ed03e3 +d = 8729a8396f262dabd991aa404cc1753581cea405f0d19222a0b3f210de8ee3c5 +Qx = 82b1f1a7af9b48ca8452613d7032beb0e4f28fe710306aeccc959e4d03662a35 +Qy = 5e39f33574097b8d32b471a591972496f5d44db344c037d13f06fafc75f016fd +k = 6de9e21f0b2cacc1762b3558fd44d3cf156b85dbef430dd28d59713bfb9cfa0b +R = a754b42720e71925d51fcef76151405a3696cc8f9fc9ca7b46d0b16edd7fb699 +S = 603924780439cc16ac4cf97c2c3065bc95353aa9179d0ab5f0322ca82f851cf2 + +Msg = 771c4d7bce05610a3e71b272096b57f0d1efcce33a1cb4f714d6ebc0865b2773ec5eedc25fae81dee1d256474dbd9676623614c150916e6ed92ce4430b26037d28fa5252ef6b10c09dc2f7ee5a36a1ea7897b69f389d9f5075e271d92f4eb97b148f3abcb1e5be0b4feb8278613d18abf6da60bfe448238aa04d7f11b71f44c5 +d = f1b62413935fc589ad2280f6892599ad994dae8ca3655ed4f7318cc89b61aa96 +Qx = e0bbfe4016eea93e6f509518cbffc25d492de6ebbf80465a461caa5bdc018159 +Qy = 3231ee7a119d84fa56e3034d50fea85929aec2eb437abc7646821e1bf805fb50 +k = 7a33eeb9f469afd55de2fb786847a1d3e7797929305c0f90d953b6f143bb8fc6 +R = 96d1c9399948254ea381631fc0f43ea808110506db8aacf081df5535ac5eb8ad +S = 73bf3691260dddd9997c97313f2a70783eacf8d15bdfb34bb13025cdfae72f70 + +Msg = a3b2825235718fc679b942e8ac38fb4f54415a213c65875b5453d18ca012320ddfbbc58b991eaebadfc2d1a28d4f0cd82652b12e4d5bfda89eda3be12ac52188e38e8cce32a264a300c0e463631f525ae501348594f980392c76b4a12ddc88e5ca086cb8685d03895919a8627725a3e00c4728e2b7c6f6a14fc342b2937fc3dd +d = 4caaa26f93f009682bbba6db6b265aec17b7ec1542bda458e8550b9e68eed18d +Qx = e3c58c1c254d11c7e781ad133e4c36dd1b5de362120d336a58e7b68813f3fbee +Qy = 59760db66120afe0d962c81a8e5586588fd19de2f40556371611c73af22c8a68 +k = c0d37142dc8b0d614fad20c4d35af6eb819e259e513ddeac1e1c273e7e1dc1bb +R = 25dd8e4086c62a40d2a310e2f90f6af5cb7e677b4dfdb4dc4e99e23ea2f0e6dc +S = 90ad62c179b0c9d61f521dde1cd762bfd224b5525c39c3706f2549313ddb4f39 + +Msg = 3e6e2a9bffd729ee5d4807849cd4250021d8184cda723df6ab0e5c939d39237c8e58af9d869fe62d3c97b3298a99e891e5e11aa68b11a087573a40a3e83c7965e7910d72f81cad0f42accc5c25a4fd3cdd8cee63757bbbfbdae98be2bc867d3bcb1333c4632cb0a55dffeb77d8b119c466cd889ec468454fabe6fbee7102deaf +d = 7af4b150bb7167cb68037f280d0823ce5320c01a92b1b56ee1b88547481b1de9 +Qx = cb3634ec4f0cbb99986be788f889e586026d5a851e80d15382f1bdb1bda2bc75 +Qy = 51e4e43bc16fb114896b18198a1aebe6054ba20ed0c0317c1b8776158c0e6bfb +k = 98edd59fafbcaee5f64e84eb5ed59fff45d14aabada47cee2fa674377173627a +R = 261a1cdb0fd93c0fb06ea6068b6b03c330a12f621a7eba76682a1d152c0e8d08 +S = 7ca049bad54feee101d6db807635ffb8bdb05a38e445c8c3d65d60df143514c5 + +Msg = 52e5c308e70329a17c71eaedb66bbee303c8ec48a6f1a2efb235d308563cd58553d434e12f353227a9ea28608ec9c820ed83c95124e7a886f7e832a2de1032e78dc059208f9ec354170b2b1cab992b52ac01e6c0e4e1b0112686962edc53ab226dafcc9fc7baed2cd9307160e8572edb125935db49289b178f35a8ad23f4f801 +d = 52ad53e849e30bec0e6345c3e9d98ebc808b19496c1ef16d72ab4a00bbb8c634 +Qx = 7cca1334bfc2a78728c50b370399be3f9690d445aa03c701da643eeb0b0f7fa8 +Qy = 3f7522238668e615405e49b2f63faee58286000a30cdb4b564ac0df99bc8950f +k = 8650c30712fc253610884fbba4a332a4574d4b7822f7776cab1df8f5fa05442a +R = a18194c7ac5829afc408d78dde19542837e7be82706c3941b2d9c5e036bb51e0 +S = 188ead1cdf7c1d21114ff56d0421ffd501ab978ef58337462c0fa736d86299af + +Msg = d3e9e82051d4c84d699453c9ff44c7c09f6523bb92232bcf30bf3c380224249de2964e871d56a364d6955c81ef91d06482a6c7c61bc70f66ef22fad128d15416e7174312619134f968f1009f92cbf99248932efb533ff113fb6d949e21d6b80dfbbe69010c8d1ccb0f3808ea309bb0bac1a222168c95b088847e613749b19d04 +d = 80754962a864be1803bc441fa331e126005bfc6d8b09ed38b7e69d9a030a5d27 +Qx = 0aaeed6dd1ae020d6eefc98ec4241ac93cbd3c8afed05bb28007e7da5727571b +Qy = 2dda1d5b7872eb94dfffb456115037ff8d3e72f8ebdd8fcfc42391f96809be69 +k = 738e050aeefe54ecba5be5f93a97bbcb7557d701f9da2d7e88483454b97b55a8 +R = 8cb9f41dfdcb9604e0725ac9b78fc0db916dc071186ee982f6dba3da36f02efa +S = 5c87fe868fd4282fb114f5d70e9590a10a5d35cedf3ff6402ba5c4344738a32e + +Msg = 968951c2c1918436fe19fa2fe2152656a08f9a6b8aa6201920f1b424da98cee71928897ff087620cc5c551320b1e75a1e98d7d98a5bd5361c9393759614a6087cc0f7fb01fcb173783eb4c4c23961a8231ac4a07d72e683b0c1bd4c51ef1b031df875e7b8d5a6e0628949f5b8f157f43dccaea3b2a4fc11181e6b451e06ceb37 +d = cfa8c8bd810eb0d73585f36280ecdd296ee098511be8ad5eac68984eca8eb19d +Qx = c227a2af15dfa8734e11c0c50f77e24e77ed58dd8cccf1b0e9fa06bee1c64766 +Qy = b686592ce3745eb300d2704083db55e1fa8274e4cb7e256889ccc0bb34a60570 +k = 2d6b449bb38b543d6b6d34ff8cb053f5e5b337f949b069b21f421995ebb28823 +R = 5e89d3c9b103c2fa3cb8cebeec23640acda0257d63ffbe2d509bfc49fab1dca6 +S = d70c5b1eeb29e016af9925798d24e166c23d58fedd2f1a3bbdb1ef78cdbfb63a + +Msg = 78048628932e1c1cdd1e70932bd7b76f704ba08d7e7d825d3de763bf1a062315f4af16eccefe0b6ebadccaf403d013f50833ce2c54e24eea8345e25f93b69bb048988d102240225ceacf5003e2abdcc90299f4bf2c101585d36ecdd7a155953c674789d070480d1ef47cc7858e97a6d87c41c6922a00ea12539f251826e141b4 +d = b2021e2665ce543b7feadd0cd5a4bd57ffcc5b32deb860b4d736d9880855da3c +Qx = 722e0abad4504b7832a148746153777694714eca220eced2b2156ca64cfed3dd +Qy = f0351b357b3081e859c46cad5328c5afa10546e92bc6c3fd541796ac30397a75 +k = b15bbce4b382145de7ecd670d947e77555ef7cd1693bd53c694e2b52b04d10e1 +R = 9d086dcd22da165a43091991bede9c1c14515e656633cb759ec2c17f51c35253 +S = 23595ad1cb714559faaecaf946beb9a71e584616030ceaed8a8470f4bf62768f + +Msg = 9b0800c443e693067591737fdbcf0966fdfa50872d41d0c189d87cbc34c2771ee5e1255fd604f09fcf167fda16437c245d299147299c69046895d22482db29aba37ff57f756716cd3d6223077f747c4caffbecc0a7c9dfaaafd9a9817470ded8777e6355838ac54d11b2f0fc3f43668ff949cc31de0c2d15af5ef17884e4d66a +d = 0c9bce6a568ca239395fc3552755575cbcdddb1d89f6f5ab354517a057b17b48 +Qx = 4814d454495df7103e2da383aba55f7842fd84f1750ee5801ad32c10d0be6c7d +Qy = a0bd039d5097c8f0770477f6b18d247876e88e528bf0453eab515ffab8a9eda3 +k = d414f1525cdcc41eba1652de017c034ebcc7946cb2efe4713d09f67c85b83153 +R = 84db02c678f9a21208cec8564d145a35ba8c6f26b4eb7e19522e439720dae44c +S = 537c564da0d2dc5ac4376c5f0ca3b628d01d48df47a83d842c927e4d6db1e16d + +Msg = fc3b8291c172dae635a6859f525beaf01cf683765d7c86f1a4d768df7cae055f639eccc08d7a0272394d949f82d5e12d69c08e2483e11a1d28a4c61f18193106e12e5de4a9d0b4bf341e2acd6b715dc83ae5ff63328f8346f35521ca378b311299947f63ec593a5e32e6bd11ec4edb0e75302a9f54d21226d23314729e061016 +d = 1daa385ec7c7f8a09adfcaea42801a4de4c889fb5c6eb4e92bc611d596d68e3f +Qx = f04e9f2831d9697ae146c7d4552e5f91085cc46778400b75b76f00205252941d +Qy = bd267148174cd0c2b019cd0a5256e2f3f889d1e597160372b5a1339c8d787f10 +k = 7707db348ee6f60365b43a2a994e9b40ed56fe03c2c31c7e781bc4ffadcba760 +R = 5d95c385eeba0f15db0b80ae151912409128c9c80e554246067b8f6a36d85ea5 +S = db5d8a1e345f883e4fcb3871276f170b783c1a1e9da6b6615913368a8526f1c3 + +[P-256,SHA-256] + +Msg = 5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8 +d = 519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464 +Qx = 1ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83 +Qy = ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9 +k = 94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de +R = f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac +S = 8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903 + +Msg = c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1 +d = 0f56db78ca460b055c500064824bed999a25aaf48ebb519ac201537b85479813 +Qx = e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8a +Qy = bfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39 +k = 6d3e71882c3b83b156bb14e0ab184aa9fb728068d3ae9fac421187ae0b2f34c6 +R = 976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db +S = 1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932 + +Msg = 3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee +d = e283871239837e13b95f789e6e1af63bf61c918c992e62bca040d64cad1fc2ef +Qx = 74ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde8 +Qy = 29074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614 +k = ad5e887eb2b380b8d8280ad6e5ff8a60f4d26243e0124c2f31a297b5d0835de2 +R = 35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1 +S = ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96 + +Msg = 0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd50f9e51deaf98272f9266fc702e4e57c30 +d = a3d2d3b7596f6592ce98b4bfe10d41837f10027a90d7bb75349490018cf72d07 +Qx = 322f80371bf6e044bc49391d97c1714ab87f990b949bc178cb7c43b7c22d89e1 +Qy = 3c15d54a5cc6b9f09de8457e873eb3deb1fceb54b0b295da6050294fae7fd999 +k = 24fc90e1da13f17ef9fe84cc96b9471ed1aaac17e3a4bae33a115df4e5834f18 +R = d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884ca +S = b46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89 + +Msg = dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d10336ca443e1682aa04a7af832b0eee4e7 +d = 53a0e8a8fe93db01e7ae94e1a9882a102ebd079b3a535827d583626c272d280d +Qx = 1bcec4570e1ec2436596b8ded58f60c3b1ebc6a403bc5543040ba82963057244 +Qy = 8af62a4c683f096b28558320737bf83b9959a46ad2521004ef74cf85e67494e1 +k = 5d833e8d24cc7a402d7ee7ec852a3587cddeb48358cea71b0bedb8fabe84e0c4 +R = 18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c387182604 +S = 77c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c + +Msg = 600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f25659157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f336fdd87d972d3a8b8a593ba85955cc9d71 +d = 4af107e8e2194c830ffb712a65511bc9186a133007855b49ab4b3833aefc4a1d +Qx = a32e50be3dae2c8ba3f5e4bdae14cf7645420d425ead94036c22dd6c4fc59e00 +Qy = d623bf641160c289d6742c6257ae6ba574446dd1d0e74db3aaa80900b78d4ae9 +k = e18f96f84dfa2fd3cdfaec9159d4c338cd54ad314134f0b31e20591fc238d0ab +R = 8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68 +S = d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb + +Msg = dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e05e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3c238fddd6e450a77455d534c48a152010b +d = 78dfaa09f1076850b3e206e477494cddcfb822aaa0128475053592c48ebaf4ab +Qx = 8bcfe2a721ca6d753968f564ec4315be4857e28bef1908f61a366b1f03c97479 +Qy = 0f67576a30b8e20d4232d8530b52fb4c89cbc589ede291e499ddd15fe870ab96 +k = 295544dbb2da3da170741c9b2c6551d40af7ed4e891445f11a02b66a5c258a77 +R = c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b254 +S = 84a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30 + +Msg = 51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b8596ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1854bc8859734341aad237ba29a81a3fc8b +d = 80e692e3eb9fcd8c7d44e7de9f7a5952686407f90025a1d87e52c7096a62618a +Qx = a88bc8430279c8c0400a77d751f26c0abc93e5de4ad9a4166357952fe041e767 +Qy = 2d365a1eef25ead579cc9a069b6abc1b16b81c35f18785ce26a10ba6d1381185 +k = 7c80fd66d62cc076cef2d030c17c0a69c99611549cb32c4ff662475adbe84b22 +R = 9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902 +S = d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f + +Msg = 558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe70688c035688ea8c6baec65a5fc7e2c93e8 +d = 5e666c0db0214c3b627a8e48541cc84a8b6fd15f300da4dff5d18aec6c55b881 +Qx = 1bc487570f040dc94196c9befe8ab2b6de77208b1f38bdaae28f9645c4d2bc3a +Qy = ec81602abd8345e71867c8210313737865b8aa186851e1b48eaca140320f5d8f +k = 2e7625a48874d86c9e467f890aaa7cd6ebdf71c0102bfdcfa24565d6af3fdce9 +R = 2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9 +S = f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199 + +Msg = 4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e +d = f73f455271c877c4d5334627e37c278f68d143014b0a05aa62f308b2101c5308 +Qx = b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde +Qy = 423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a +k = 62f8665fd6e26b3fa069e85281777a9b1f0dfd2c0b9f54a086d0c109ff9fd615 +R = 1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620 +S = 880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430 + +Msg = f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e877169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b88059bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d76dda04995847c657f4c19d303eb09eb48a +d = b20d705d9bd7c2b8dc60393a5357f632990e599a0975573ac67fd89b49187906 +Qx = 51f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce +Qy = 4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1 +k = 72b656f6b35b9ccbc712c9f1f3b1a14cbbebaec41c4bca8da18f492a062d6f6f +R = 9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c42 +S = 2bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c + +Msg = 3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6bcd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67defaa89497aa8ef994c77f1130f752f94a4 +d = d4234bebfbc821050341a37e1240efe5e33763cbbb2ef76a1c79e24724e5a5e7 +Qx = 8fb287f0202ad57ae841aea35f29b2e1d53e196d0ddd9aec24813d64c0922fb7 +Qy = 1f6daff1aa2dd2d6d3741623eecb5e7b612997a1039aab2e5cf2de969cfea573 +k = d926fe10f1bfd9855610f4f5a3d666b1a149344057e35537373372ead8b1a778 +R = 490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb +S = 644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7 + +Msg = c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b01e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbfe22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f71eb7a49eb4c4ec55799bda1eb545143a7 +d = b58f5211dff440626bb56d0ad483193d606cf21f36d9830543327292f4d25d8c +Qx = 68229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76 +Qy = 303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c +k = e158bf4a2d19a99149d9cdb879294ccb7aaeae03d75ddd616ef8ae51a6dc1071 +R = e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb +S = 9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333 + +Msg = 72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b5759649c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc7930cfe89e526d1684365c5b0be2437fdb01 +d = 54c066711cdb061eda07e5275f7e95a9962c6764b84f6f1f3ab5a588e0a2afb1 +Qx = 0a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bb +Qy = f26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae +k = 646fe933e96c3b8f9f507498e907fdd201f08478d0202c752a7c2cfebf4d061a +R = b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64b +S = d7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851 + +Msg = 21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983ebeec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d2046f23c1aa2e54b7fb6448a0da922bd7f34 +d = 34fa4682bf6cb5b16783adcd18f0e6879b92185f76d7c920409f904f522db4b1 +Qx = 105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d73737 +Qy = 6c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4 +k = a6f463ee72c9492bc792fe98163112837aebd07bab7a84aaed05be64db3086f4 +R = 542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d962663 +S = 4f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f + +[P-256,SHA-384] + +Msg = e0b8596b375f3306bbc6e77a0b42f7469d7e83635990e74aa6d713594a3a24498feff5006790742d9c2e9b47d714bee932435db747c6e733e3d8de41f2f91311f2e9fd8e025651631ffd84f66732d3473fbd1627e63dc7194048ebec93c95c159b5039ab5e79e42c80b484a943f125de3da1e04e5bf9c16671ad55a1117d3306 +d = b6faf2c8922235c589c27368a3b3e6e2f42eb6073bf9507f19eed0746c79dced +Qx = e0e7b99bc62d8dd67883e39ed9fa0657789c5ff556cc1fd8dd1e2a55e9e3f243 +Qy = 63fbfd0232b95578075c903a4dbf85ad58f8350516e1ec89b0ee1f5e1362da69 +k = 9980b9cdfcef3ab8e219b9827ed6afdd4dbf20bd927e9cd01f15762703487007 +R = f5087878e212b703578f5c66f434883f3ef414dc23e2e8d8ab6a8d159ed5ad83 +S = 306b4c6c20213707982dffbb30fba99b96e792163dd59dbe606e734328dd7c8a + +Msg = 099a0131179fff4c6928e49886d2fdb3a9f239b7dd5fa828a52cbbe3fcfabecfbba3e192159b887b5d13aa1e14e6a07ccbb21f6ad8b7e88fee6bea9b86dea40ffb962f38554056fb7c5bb486418915f7e7e9b9033fe3baaf9a069db98bc02fa8af3d3d1859a11375d6f98aa2ce632606d0800dff7f55b40f971a8586ed6b39e9 +d = 118958fd0ff0f0b0ed11d3cf8fa664bc17cdb5fed1f4a8fc52d0b1ae30412181 +Qx = afda82260c9f42122a3f11c6058839488f6d7977f6f2a263c67d06e27ea2c355 +Qy = 0ae2bbdd2207c590332c5bfeb4c8b5b16622134bd4dc55382ae806435468058b +k = 23129a99eeda3d99a44a5778a46e8e7568b91c31fb7a8628c5d9820d4bed4a6b +R = e446600cab1286ebc3bb332012a2f5cc33b0a5ef7291d5a62a84de5969d77946 +S = cf89b12793ee1792eb26283b48fa0bdcb45ae6f6ad4b02564bf786bb97057d5a + +Msg = 0fbc07ea947c946bea26afa10c51511039b94ddbc4e2e4184ca3559260da24a14522d1497ca5e77a5d1a8e86583aeea1f5d4ff9b04a6aa0de79cd88fdb85e01f171143535f2f7c23b050289d7e05cebccdd131888572534bae0061bdcc3015206b9270b0d5af9f1da2f9de91772d178a632c3261a1e7b3fb255608b3801962f9 +d = 3e647357cd5b754fad0fdb876eaf9b1abd7b60536f383c81ce5745ec80826431 +Qx = 702b2c94d039e590dd5c8f9736e753cf5824aacf33ee3de74fe1f5f7c858d5ed +Qy = 0c28894e907af99fb0d18c9e98f19ac80dd77abfa4bebe45055c0857b82a0f4d +k = 9beab7722f0bcb468e5f234e074170a60225255de494108459abdf603c6e8b35 +R = c4021fb7185a07096547af1fb06932e37cf8bd90cf593dea48d48614fa237e5e +S = 7fb45d09e2172bec8d3e330aa06c43fbb5f625525485234e7714b7f6e92ba8f1 + +Msg = 1e38d750d936d8522e9db1873fb4996bef97f8da3c6674a1223d29263f1234a90b751785316444e9ba698bc8ab6cd010638d182c9adad4e334b2bd7529f0ae8e9a52ad60f59804b2d780ed52bdd33b0bf5400147c28b4304e5e3434505ae7ce30d4b239e7e6f0ecf058badd5b388eddbad64d24d2430dd04b4ddee98f972988f +d = 76c17c2efc99891f3697ba4d71850e5816a1b65562cc39a13da4b6da9051b0fd +Qx = d12512e934c367e4c4384dbd010e93416840288a0ba00b299b4e7c0d91578b57 +Qy = ebf8835661d9b578f18d14ae4acf9c357c0dc8b7112fc32824a685ed72754e23 +k = 77cffa6f9a73904306f9fcd3f6bbb37f52d71e39931bb4aec28f9b076e436ccf +R = 4d5a9d95b0f09ce8704b0f457b39059ee606092310df65d3f8ae7a2a424cf232 +S = 7d3c014ca470a73cef1d1da86f2a541148ad542fbccaf9149d1b0b030441a7eb + +Msg = abcf0e0f046b2e0672d1cc6c0a114905627cbbdefdf9752f0c31660aa95f2d0ede72d17919a9e9b1add3213164e0c9b5ae3c76f1a2f79d3eeb444e6741521019d8bd5ca391b28c1063347f07afcfbb705be4b52261c19ebaf1d6f054a74d86fb5d091fa7f229450996b76f0ada5f977b09b58488eebfb5f5e9539a8fd89662ab +d = 67b9dea6a575b5103999efffce29cca688c781782a41129fdecbce76608174de +Qx = b4238b029fc0b7d9a5286d8c29b6f3d5a569e9108d44d889cd795c4a385905be +Qy = 8cb3fff8f6cca7187c6a9ad0a2b1d9f40ae01b32a7e8f8c4ca75d71a1fffb309 +k = d02617f26ede3584f0afcfc89554cdfb2ae188c192092fdde3436335fafe43f1 +R = 26fd9147d0c86440689ff2d75569795650140506970791c90ace0924b44f1586 +S = 00a34b00c20a8099df4b0a757cbef8fea1cb3ea7ced5fbf7e987f70b25ee6d4f + +Msg = dc3d4884c741a4a687593c79fb4e35c5c13c781dca16db561d7e393577f7b62ca41a6e259fc1fb8d0c4e1e062517a0fdf95558b7799f20c211796167953e6372c11829beec64869d67bf3ee1f1455dd87acfbdbcc597056e7fb347a17688ad32fda7ccc3572da7677d7255c261738f07763cd45973c728c6e9adbeecadc3d961 +d = ecf644ea9b6c3a04fdfe2de4fdcb55fdcdfcf738c0b3176575fa91515194b566 +Qx = c3bdc7c795ec94620a2cfff614c13a3390a5e86c892e53a24d3ed22228bc85bf +Qy = 70480fc5cf4aacd73e24618b61b5c56c1ced8c4f1b869580ea538e68c7a61ca3 +k = 53291d51f68d9a12d1dcdc58892b2f786cc15f631f16997d2a49bace513557d4 +R = a860c8b286edf973ce4ce4cf6e70dc9bbf3818c36c023a845677a9963705df8b +S = 5630f986b1c45e36e127dd7932221c4272a8cc6e255e89f0f0ca4ec3a9f76494 + +Msg = 719bf1911ae5b5e08f1d97b92a5089c0ab9d6f1c175ac7199086aeeaa416a17e6d6f8486c711d386f284f096296689a54d330c8efb0f5fa1c5ba128d3234a3da856c2a94667ef7103616a64c913135f4e1dc50e38daa60610f732ad1bedfcc396f87169392520314a6b6b9af6793dbabad4599525228cc7c9c32c4d8e097ddf6 +d = 4961485cbc978f8456ec5ac7cfc9f7d9298f99415ecae69c8491b258c029bfee +Qx = 8d40bf2299e05d758d421972e81cfb0cce68b949240dc30f315836acc70bef03 +Qy = 5674e6f77f8b46f46cca937d83b128dffbe9bd7e0d3d08aa2cbbfdfb16f72c9a +k = 373a825b5a74b7b9e02f8d4d876b577b4c3984168d704ba9f95b19c05ed590af +R = ef6fb386ad044b63feb7445fa16b10319018e9cea9ef42bca83bdad01992234a +S = ac1f42f652eb1786e57be01d847c81f7efa072ba566d4583af4f1551a3f76c65 + +Msg = 7cf19f4c851e97c5bca11a39f0074c3b7bd3274e7dd75d0447b7b84995dfc9f716bf08c25347f56fcc5e5149cb3f9cfb39d408ace5a5c47e75f7a827fa0bb9921bb5b23a6053dbe1fa2bba341ac874d9b1333fc4dc224854949f5c8d8a5fedd02fb26fdfcd3be351aec0fcbef18972956c6ec0effaf057eb4420b6d28e0c008c +d = 587907e7f215cf0d2cb2c9e6963d45b6e535ed426c828a6ea2fb637cca4c5cbd +Qx = 660da45c413cc9c9526202c16b402af602d30daaa7c342f1e722f15199407f31 +Qy = e6f8cbb06913cc718f2d69ba2fb3137f04a41c27c676d1a80fbf30ea3ca46439 +k = 6b8eb7c0d8af9456b95dd70561a0e902863e6dfa1c28d0fd4a0509f1c2a647b2 +R = 08fabf9b57de81875bfa7a4118e3e44cfb38ec6a9b2014940207ba3b1c583038 +S = a58d199b1deba7350616230d867b2747a3459421811c291836abee715b8f67b4 + +Msg = b892ffabb809e98a99b0a79895445fc734fa1b6159f9cddb6d21e510708bdab6076633ac30aaef43db566c0d21f4381db46711fe3812c5ce0fb4a40e3d5d8ab24e4e82d3560c6dc7c37794ee17d4a144065ef99c8d1c88bc22ad8c4c27d85ad518fa5747ae35276fc104829d3f5c72fc2a9ea55a1c3a87007cd133263f79e405 +d = 24b1e5676d1a9d6b645a984141a157c124531feeb92d915110aef474b1e27666 +Qx = b4909a5bdf25f7659f4ef35e4b811429fb2c59126e3dad09100b46aea6ebe7a6 +Qy = 760ae015fa6af5c9749c4030fdb5de6e58c6b5b1944829105cf7edf7d3a22cfb +k = 88794923d8943b5dbcc7a7a76503880ff7da632b0883aaa60a9fcc71bf880fd6 +R = 6ec9a340b77fae3c7827fa96d997e92722ff2a928217b6dd3c628f3d49ae4ce6 +S = 637b54bbcfb7e7d8a41ea317fcfca8ad74eb3bb6b778bc7ef9dec009281976f7 + +Msg = 8144e37014c95e13231cbd6fa64772771f93b44e37f7b02f592099cc146343edd4f4ec9fa1bc68d7f2e9ee78fc370443aa2803ff4ca52ee49a2f4daf2c8181ea7b8475b3a0f608fc3279d09e2d057fbe3f2ffbe5133796124781299c6da60cfe7ecea3abc30706ded2cdf18f9d788e59f2c31662df3abe01a9b12304fb8d5c8c +d = bce49c7b03dcdc72393b0a67cf5aa5df870f5aaa6137ada1edc7862e0981ec67 +Qx = c786d9421d67b72b922cf3def2a25eeb5e73f34543eb50b152e738a98afb0ca5 +Qy = 6796271e79e2496f9e74b126b1123a3d067de56b5605d6f51c8f6e1d5bb93aba +k = 89e690d78a5e0d2b8ce9f7fcbf34e2605fd9584760fa7729043397612dd21f94 +R = 07e5054c384839584624e8d730454dc27e673c4a90cbf129d88b91250341854d +S = f7e665b88614d0c5cbb3007cafe713763d81831525971f1747d92e4d1ca263a7 + +Msg = a3683d120807f0a030feed679785326698c3702f1983eaba1b70ddfa7f0b3188060b845e2b67ed57ee68087746710450f7427cb34655d719c0acbc09ac696adb4b22aba1b9322b7111076e67053a55f62b501a4bca0ad9d50a868f51aeeb4ef27823236f5267e8da83e143047422ce140d66e05e44dc84fb3a4506b2a5d7caa8 +d = 73188a923bc0b289e81c3db48d826917910f1b957700f8925425c1fb27cabab9 +Qx = 86662c014ab666ee770723be8da38c5cd299efc6480fc6f8c3603438fa8397b9 +Qy = f26b3307a650c3863faaa5f642f3ba1384c3d3a02edd3d48c657c269609cc3fc +k = ec90584ab3b383b590626f36ed4f5110e49888aec7ae7a9c5ea62dd2dc378666 +R = 13e9ad59112fde3af4163eb5c2400b5e9a602576d5869ac1c569075f08c90ff6 +S = 708ac65ff2b0baaccc6dd954e2a93df46016bd04457636de06798fcc17f02be5 + +Msg = b1df8051b213fc5f636537e37e212eb20b2423e6467a9c7081336a870e6373fc835899d59e546c0ac668cc81ce4921e88f42e6da2a109a03b4f4e819a17c955b8d099ec6b282fb495258dca13ec779c459da909475519a3477223c06b99afbd77f9922e7cbef844b93f3ce5f50db816b2e0d8b1575d2e17a6b8db9111d6da578 +d = f637d55763fe819541588e0c603f288a693cc66823c6bb7b8e003bd38580ebce +Qx = 74a4620c578601475fc169a9b84be613b4a16cb6acab8fd98848a6ec9fbd133d +Qy = 42b9e35d347c107e63bd55f525f915bcf1e3d2b81d002d3c39acf10fc30645a1 +k = 4d578f5099636234d9c1d566f1215d5d887ae5d47022be17dbf32a11a03f053b +R = 113a933ebc4d94ce1cef781e4829df0c493b0685d39fb2048ce01b21c398dbba +S = 3005bd4ec63dbd04ce9ff0c6246ad65d27fcf62edb2b7e461589f9f0e7446ffd + +Msg = 0b918ede985b5c491797d0a81446b2933be312f419b212e3aae9ba5914c00af431747a9d287a7c7761e9bcbc8a12aaf9d4a76d13dad59fc742f8f218ef66eb67035220a07acc1a357c5b562ecb6b895cf725c4230412fefac72097f2c2b829ed58742d7c327cad0f1058df1bddd4ae9c6d2aba25480424308684cecd6517cdd8 +d = 2e357d51517ff93b821f895932fddded8347f32596b812308e6f1baf7dd8a47f +Qx = 7e4078a1d50c669fb2996dd9bacb0c3ac7ede4f58fa0fa1222e78dbf5d1f4186 +Qy = 0014e46e90cc171fbb83ea34c6b78202ea8137a7d926f0169147ed5ae3d6596f +k = be522b0940b9a40d84bf790fe6abdc252877e671f2efa63a33a65a512fc2aa5c +R = a26b9ad775ac37ff4c7f042cdc4872c5e4e5e800485f488ddfaaed379f468090 +S = f88eae2019bebbba62b453b8ee3472ca5c67c267964cffe0cf2d2933c1723dff + +Msg = 0fab26fde1a4467ca930dbe513ccc3452b70313cccde2994eead2fde85c8da1db84d7d06a024c9e88629d5344224a4eae01b21a2665d5f7f36d5524bf5367d7f8b6a71ea05d413d4afde33777f0a3be49c9e6aa29ea447746a9e77ce27232a550b31dd4e7c9bc8913485f2dc83a56298051c92461fd46b14cc895c300a4fb874 +d = 77d60cacbbac86ab89009403c97289b5900466856887d3e6112af427f7f0f50b +Qx = a62032dfdb87e25ed0c70cad20d927c7effeb2638e6c88ddd670f74df16090e5 +Qy = 44c5ee2cf740ded468f5d2efe13daa7c5234645a37c073af35330d03a4fed976 +k = 06c1e692b045f425a21347ecf72833d0242906c7c1094f805566cdcb1256e394 +R = eb173b51fb0aec318950d097e7fda5c34e529519631c3e2c9b4550b903da417d +S = ca2c13574bf1b7d56e9dc18315036a31b8bceddf3e2c2902dcb40f0cc9e31b45 + +Msg = 7843f157ef8566722a7d69da67de7599ee65cb3975508f70c612b3289190e364141781e0b832f2d9627122742f4b5871ceeafcd09ba5ec90cae6bcc01ae32b50f13f63918dfb5177df9797c6273b92d103c3f7a3fc2050d2b196cc872c57b77f9bdb1782d4195445fcc6236dd8bd14c8bcbc8223a6739f6a17c9a861e8c821a6 +d = 486854e77962117f49e09378de6c9e3b3522fa752b10b2c810bf48db584d7388 +Qx = 760b5624bd64d19c866e54ccd74ad7f98851afdbc3ddeae3ec2c52a135be9cfa +Qy = feca15ce9350877102eee0f5af18b2fed89dc86b7df0bf7bc2963c1638e36fe8 +k = e4f77c6442eca239b01b0254e11a4182782d96f48ab521cc3d1d68df12b5a41a +R = bdff14e4600309c2c77f79a25963a955b5b500a7b2d34cb172cd6acd52905c7b +S = b0479cdb3df79923ec36a104a129534c5d59f622be7d613aa04530ad2507d3a2 + +[P-256,SHA-512] + +Msg = 6c8572b6a3a4a9e8e03dbeed99334d41661b8a8417074f335ab1845f6cc852adb8c01d9820fcf8e10699cc827a8fbdca2cbd46cc66e4e6b7ba41ec3efa733587e4a30ec552cd8ddab8163e148e50f4d090782897f3ddac84a41e1fcfe8c56b6152c0097b0d634b41011471ffd004f43eb4aafc038197ec6bae2b4470e869bded +d = 9dd0d3a3d514c2a8adb162b81e3adfba3299309f7d2018f607bdb15b1a25f499 +Qx = 6b738de3398b6ac57b9591f9d7985dd4f32137ad3460dcf8970c1390cb9eaf8d +Qy = 83bc61e26d2bbbd3cf2d2ab445a2bc4ab5dde41f4a13078fd1d3cc36ab596d57 +k = 9106192170ccb3c64684d48287bb81bbed51b40d503462c900e5c7aae43e380a +R = 275fa760878b4dc05e9d157fedfd8e9b1c9c861222a712748cb4b7754c043fb1 +S = 699d906bb8435a05345af3b37e3b357786939e94caae257852f0503adb1e0f7e + +Msg = 7e3c8fe162d48cc8c5b11b5e5ebc05ebc45c439bdbc0b0902145921b8383037cb0812222031598cd1a56fa71694fbd304cc62938233465ec39c6e49f57dfe823983b6923c4e865633949183e6b90e9e06d8275f3907d97967d47b6239fe2847b7d49cf16ba69d2862083cf1bccf7afe34fdc90e21998964107b64abe6b89d126 +d = f9bf909b7973bf0e3dad0e43dcb2d7fa8bda49dbe6e5357f8f0e2bd119be30e6 +Qx = f2a6674d4e86152a527199bed293fa63acde1b4d8a92b62e552210ba45c38792 +Qy = c72565c24f0eee6a094af341ddd8579747b865f91c8ed5b44cda8a19cc93776f +k = e547791f7185850f03d0c58419648f65b9d29cdc22ed1de2a64280220cfcafba +R = 4782903d2aaf8b190dab5cae2223388d2d8bd845b3875d37485c54e1ded1d3d8 +S = dfb40e406bfa074f0bf832771b2b9f186e2211f0bca279644a0ca8559acf39da + +Msg = d5aa8ac9218ca661cd177756af6fbb5a40a3fecfd4eea6d5872fbb9a2884784aa9b5f0c023a6e0da5cf6364754ee6465b4ee2d0ddc745b02994c98427a213c849537da5a4477b3abfe02648be67f26e80b56a33150490d062aaac137aa47f11cfeddba855bab9e4e028532a563326d927f9e6e3292b1fb248ee90b6f429798db +d = 724567d21ef682dfc6dc4d46853880cfa86fe6fea0efd51fac456f03c3d36ead +Qx = 70b877b5e365fcf08140b1eca119baba662879f38e059d074a2cb60b03ea5d39 +Qy = 5f56f94d591df40b9f3b8763ac4b3dbe622c956d5bd0c55658b6f46fa3deb201 +k = 79d6c967ed23c763ece9ca4b026218004c84dc2d4ccc86cf05c5d0f791f6279b +R = 2ba2ea2d316f8937f184ad3028e364574d20a202e4e7513d7af57ac2456804d1 +S = 64fe94968d18c5967c799e0349041b9e40e6c6c92ebb475e80dd82f51cf07320 + +Msg = 790b06054afc9c3fc4dfe72df19dd5d68d108cfcfca6212804f6d534fd2fbe489bd8f64bf205ce04bcb50124a12ce5238fc3fe7dd76e6fa640206af52549f133d593a1bfd423ab737f3326fa79433cde293236f90d4238f0dd38ed69492ddbd9c3eae583b6325a95dec3166fe52b21658293d8c137830ef45297d67813b7a508 +d = 29c5d54d7d1f099d50f949bfce8d6073dae059c5a19cc70834722f18a7199edd +Qx = 3088d4f45d274cc5f418c8ecc4cbcf96be87491f420250f8cbc01cdf2503ec47 +Qy = 634db48198129237ed068c88ff5809f6211921a6258f548f4b64dd125921b78b +k = 0508ad7774908b5705895fda5c3b7a3032bf85dab7232bf981177019f3d76460 +R = acd9f3b63626c5f32103e90e1dd1695907b1904aa9b14f2132caef331321971b +S = 15c04a8bd6c13ed5e9961814b2f406f064670153e4d5465dcef63c1d9dd52a87 + +Msg = 6d549aa87afdb8bfa60d22a68e2783b27e8db46041e4df04be0c261c4734b608a96f198d1cdb8d082ae48579ec9defcf21fbc72803764a58c31e5323d5452b9fb57c8991d31749140da7ef067b18bf0d7dfbae6eefd0d8064f334bf7e9ec1e028daed4e86e17635ec2e409a3ed1238048a45882c5c57501b314e636b9bc81cbe +d = 0d8095da1abba06b0d349c226511f642dabbf1043ad41baa4e14297afe8a3117 +Qx = 75a45758ced45ecf55f755cb56ca2601d794ebeaeb2e6107fe2fc443f580e23c +Qy = 5303d47d5a75ec821d51a2ee7548448208c699eca0cd89810ffc1aa4faf81ead +k = 5165c54def4026ab648f7768c4f1488bcb183f6db7ffe02c7022a529a116482a +R = ebc85fc4176b446b3384ccc62fc2526b45665561a0e7e9404ac376c90e450b59 +S = 8b2c09428e62c5109d17ed0cf8f9fd7c370d018a2a73f701effc9b17d04852c6 + +Msg = 1906e48b7f889ee3ff7ab0807a7aa88f53f4018808870bfed6372a77330c737647961324c2b4d46f6ee8b01190474951a701b048ae86579ff8e3fc889fecf926b17f98958ac7534e6e781ca2db2baa380dec766cfb2a3eca2a9d5818967d64dfab84f768d24ec122eebacaab0a4dc3a75f37331bb1c43dd8966cc09ec4945bbd +d = 52fe57da3427b1a75cb816f61c4e8e0e0551b94c01382b1a80837940ed579e61 +Qx = 2177e20a2092a46667debdcc21e7e45d6da72f124adecbc5ada6a7bcc7b401d5 +Qy = 550e468f2626070a080afeeb98edd75a721eb773c8e62149f3e903cf9c4d7b61 +k = 0464fe9674b01ff5bd8be21af3399fad66f90ad30f4e8ee6e2eb9bcccfd5185c +R = f8250f073f34034c1cde58f69a85e2f5a030703ebdd4dbfb98d3b3690db7d114 +S = a9e83e05f1d6e0fef782f186bedf43684c825ac480174d48b0e4d31505e27498 + +Msg = 7b59fef13daf01afec35dea3276541be681c4916767f34d4e874464d20979863ee77ad0fd1635bcdf93e9f62ed69ae52ec90aab5bbf87f8951213747ccec9f38c775c1df1e9d7f735c2ce39b42edb3b0c5086247556cfea539995c5d9689765288ec600848ecf085c01ca738bbef11f5d12d4457db988b4add90be00781024ad +d = 003d91611445919f59bfe3ca71fe0bfdeb0e39a7195e83ac03a37c7eceef0df2 +Qx = 7b9c592f61aae0555855d0b9ebb6fd00fb6746e8842e2523565c858630b9ba00 +Qy = d35b2e168b1875bbc563bea5e8d63c4e38957c774a65e762959a349eaf263ba0 +k = ef9df291ea27a4b45708f7608723c27d7d56b7df0599a54bc2c2fabbff373b40 +R = 66d057fd39958b0e4932bacd70a1769bbadcb62e4470937b45497a3d4500fabb +S = 6c853b889e18b5a49ee54b54dd1aaedfdd642e30eba171c5cab677f0df9e7318 + +Msg = 041a6767a935dc3d8985eb4e608b0cbfebe7f93789d4200bcfe595277ac2b0f402889b580b72def5da778a680fd380c955421f626d52dd9a83ea180187b850e1b72a4ec6dd63235e598fd15a9b19f8ce9aec1d23f0bd6ea4d92360d50f951152bc9a01354732ba0cf90aaed33c307c1de8fa3d14f9489151b8377b57c7215f0b +d = 48f13d393899cd835c4193670ec62f28e4c4903e0bbe5817bf0996831a720bb7 +Qx = 82a1a96f4648393c5e42633ecdeb1d8245c78c5ea236b5bab460dedcc8924bc0 +Qy = e8cbf03c34b5154f876de19f3bb6fd43cd2eabf6e7c95467bcfa8c8fc42d76fd +k = efed736e627899fea944007eea39a4a63c0c2e26491cd12adb546be3e5c68f7d +R = cf7fc24bdaa09ac0cca8497e13298b961380668613c7493954048c06385a7044 +S = f38b1c8306cf82ab76ee3a772b14416b49993fe11f986e9b0f0593c52ec91525 + +Msg = 7905a9036e022c78b2c9efd40b77b0a194fbc1d45462779b0b76ad30dc52c564e48a493d8249a061e62f26f453ba566538a4d43c64fb9fdbd1f36409316433c6f074e1b47b544a847de25fc67d81ac801ed9f7371a43da39001c90766f943e629d74d0436ba1240c3d7fab990d586a6d6ef1771786722df56448815f2feda48f +d = 95c99cf9ec26480275f23de419e41bb779590f0eab5cf9095d37dd70cb75e870 +Qx = 42c292b0fbcc9f457ae361d940a9d45ad9427431a105a6e5cd90a345fe3507f7 +Qy = 313b08fd2fa351908b3178051ee782cc62b9954ad95d4119aa564900f8ade70c +k = 4c08dd0f8b72ae9c674e1e448d4e2afe3a1ee69927fa23bbff3716f0b99553b7 +R = f2bc35eb1b8488b9e8d4a1dbb200e1abcb855458e1557dc1bf988278a174eb3b +S = ed9a2ec043a1d578e8eba6f57217976310e8674385ad2da08d6146c629de1cd9 + +Msg = cf25e4642d4f39d15afb7aec79469d82fc9aedb8f89964e79b749a852d931d37436502804e39555f5a3c75dd958fd5291ada647c1a5e38fe7b1048f16f2b711fdd5d39acc0812ca65bd50d7f8119f2fd195ab16633503a78ee9102c1f9c4c22568e0b54bd4fa3f5ff7b49160bf23e7e2231b1ebebbdaf0e4a7d4484158a87e07 +d = e15e835d0e2217bc7c6f05a498f20af1cd56f2f165c23d225eb3360aa2c5cbcf +Qx = 89dd22052ec3ab4840206a62f2270c21e7836d1a9109a3407dd0974c7802b9ae +Qy = e91609ba35c7008b080c77a9068d97a14ca77b97299e74945217672b2fd5faf0 +k = c9f621441c235fc47ec34eef4c08625df1ec74918e1f86075b753f2589f4c60b +R = a70d1a2d555d599bfb8c9b1f0d43725341151d17a8d0845fa56f3563703528a7 +S = 4e05c45adf41783e394a5312f86e66871c4be4896948c85966879d5c66d54b37 + +Msg = 7562c445b35883cc937be6349b4cefc3556a80255d70f09e28c3f393daac19442a7eecedcdfbe8f7628e30cd8939537ec56d5c9645d43340eb4e78fc5dd4322de8a07966b262770d7ff13a071ff3dce560718e60ed3086b7e0003a6abafe91af90af86733ce8689440bf73d2aa0acfe9776036e877599acbabfcb03bb3b50faa +d = 808c08c0d77423a6feaaffc8f98a2948f17726e67c15eeae4e672edbe388f98c +Qx = b0c0ad5e1f6001d8e9018ec611b2e3b91923e69fa6c98690ab644d650f640c42 +Qy = 610539c0b9ed21ac0a2f27527c1a61d9b47cbf033187b1a6ada006eb5b2662ed +k = 1f6d4a905c761a53d54c362976717d0d7fc94d222bb5489e4830080a1a67535d +R = 83404dcf8320baf206381800071e6a75160342d19743b4f176960d669dd03d07 +S = 3f75dcf102008b2989f81683ae45e9f1d4b67a6ef6fd5c8af44828af80e1cfb5 + +Msg = 051c2db8e71e44653ea1cb0afc9e0abdf12658e9e761bfb767c20c7ab4adfcb18ed9b5c372a3ac11d8a43c55f7f99b33355437891686d42362abd71db8b6d84dd694d6982f0612178a937aa934b9ac3c0794c39027bdd767841c4370666c80dbc0f8132ca27474f553d266deefd7c9dbad6d734f9006bb557567701bb7e6a7c9 +d = f7c6315f0081acd8f09c7a2c3ec1b7ece20180b0a6365a27dcd8f71b729558f9 +Qx = 250f7112d381c1751860045d9bcaf20dbeb25a001431f96ac6f19109362ffebb +Qy = 49fba9efe73546135a5a31ab3753e247034741ce839d3d94bd73936c4a17e4aa +k = 68c299be2c0c6d52d208d5d1a9e0ffa2af19b4833271404e5876e0aa93987866 +R = 7b195e92d2ba95911cda7570607e112d02a1c847ddaa33924734b51f5d81adab +S = 10d9f206755cef70ab5143ac43f3f8d38aea2644f31d52eaf3b472ee816e11e5 + +Msg = 4dcb7b62ba31b866fce7c1feedf0be1f67bf611dbc2e2e86f004422f67b3bc1839c6958eb1dc3ead137c3d7f88aa97244577a775c8021b1642a8647bba82871e3c15d0749ed343ea6cad38f123835d8ef66b0719273105e924e8685b65fd5dc430efbc35b05a6097f17ebc5943cdcd9abcba752b7f8f37027409bd6e11cd158f +d = f547735a9409386dbff719ce2dae03c50cb437d6b30cc7fa3ea20d9aec17e5a5 +Qx = 4ca87c5845fb04c2f76ae3273073b0523e356a445e4e95737260eba9e2d021db +Qy = 0f86475d07f82655320fdf2cd8db23b21905b1b1f2f9c48e2df87e24119c4880 +k = 91bd7d97f7ed3253cedefc144771bb8acbbda6eb24f9d752bbe1dd018e1384c7 +R = 008c1755d3df81e64e25270dbaa9396641556df7ffc7ac9add6739c382705397 +S = 77df443c729b039aded5b516b1077fecdd9986402d2c4b01734ba91e055e87fc + +Msg = efe55737771070d5ac79236b04e3fbaf4f2e9bed187d1930680fcf1aba769674bf426310f21245006f528779347d28b8aeacd2b1d5e3456dcbf188b2be8c07f19219e4067c1e7c9714784285d8bac79a76b56f2e2676ea93994f11eb573af1d03fc8ed1118eafc7f07a82f3263c33eb85e497e18f435d4076a774f42d276c323 +d = 26a1aa4b927a516b661986895aff58f40b78cc5d0c767eda7eaa3dbb835b5628 +Qx = 28afa3b0f81a0e95ad302f487a9b679fcdef8d3f40236ec4d4dbf4bb0cbba8b2 +Qy = bb4ac1be8405cbae8a553fbc28e29e2e689fabe7def26d653a1dafc023f3cecf +k = f98e1933c7fad4acbe94d95c1b013e1d6931fa8f67e6dbb677b564ef7c3e56ce +R = 15a9a5412d6a03edd71b84c121ce9a94cdd166e40da9ce4d79f1afff6a395a53 +S = 86bbc2b6c63bad706ec0b093578e3f064736ec69c0dba59b9e3e7f73762a4dc3 + +Msg = ea95859cc13cccb37198d919803be89c2ee10befdcaf5d5afa09dcc529d333ae1e4ffd3bd8ba8642203badd7a80a3f77eeee9402eed365d53f05c1a995c536f8236ba6b6ff8897393506660cc8ea82b2163aa6a1855251c87d935e23857fe35b889427b449de7274d7754bdeace960b4303c5dd5f745a5cfd580293d6548c832 +d = 6a5ca39aae2d45aa331f18a8598a3f2db32781f7c92efd4f64ee3bbe0c4c4e49 +Qx = c62cc4a39ace01006ad48cf49a3e71466955bbeeca5d318d672695df926b3aa4 +Qy = c85ccf517bf2ebd9ad6a9e99254def0d74d1d2fd611e328b4a3988d4f045fe6f +k = dac00c462bc85bf39c31b5e01df33e2ec1569e6efcb334bf18f0951992ac6160 +R = 6e7ff8ec7a5c48e0877224a9fa8481283de45fcbee23b4c252b0c622442c26ad +S = 3dfac320b9c873318117da6bd856000a392b815659e5aa2a6a1852ccb2501df3 + + + +[P-384,SHA-224] + +Msg = 39f0b25d4c15b09a0692b22fbacbb5f8aee184cb75887e2ebe0cd3be5d3815d29f9b587e10b3168c939054a89df11068e5c3fac21af742bf4c3e9512f5569674e7ad8b39042bcd73e4b7ce3e64fbea1c434ed01ad4ad8b5b569f6a0b9a1144f94097925672e59ba97bc4d33be2fa21b46c3dadbfb3a1f89afa199d4b44189938 +d = 0af857beff08046f23b03c4299eda86490393bde88e4f74348886b200555276b93b37d4f6fdec17c0ea581a30c59c727 +Qx = 00ea9d109dbaa3900461a9236453952b1f1c2a5aa12f6d500ac774acdff84ab7cb71a0f91bcd55aaa57cb8b4fbb3087d +Qy = 0fc0e3116c9e94be583b02b21b1eb168d8facf3955279360cbcd86e04ee50751054cfaebcf542538ac113d56ccc38b3e +k = e2f0ce83c5bbef3a6eccd1744f893bb52952475d2531a2854a88ff0aa9b12c65961e2e517fb334ef40e0c0d7a31ed5f5 +R = c36e5f0d3de71411e6e519f63e0f56cff432330a04fefef2993fdb56343e49f2f7db5fcab7728acc1e33d4692553c02e +S = 0d4064399d58cd771ab9420d438757f5936c3808e97081e457bc862a0c905295dca60ee94f4537591c6c7d217453909b + +Msg = 5a3c80e608ed3ac75a6e45f6e94d374271a6d42b67a481860d5d309cc8b37c79cb61f1716dc8aa84cb309ef9d68eb7fc6cf4b42333f316a5c30e74198c8b340926e340c5de47674a707293c4aa2a1a2274a602f01c26b156e895499c60b38ef53fc2032e7485c168d73700d6fa14232596a0e4997854a0b05d02e351b9d3de96 +d = 047dd5baab23f439ec23b58b7e6ff4cc37813cccb4ea73bb2308e6b82b3170edfe0e131eca50841bf1b686e651c57246 +Qx = de92ff09af2950854a70f2178d2ed50cc7042a7188301a1ea81d9629ad3c29795cb7f0d56630a401e4d6e5bed0068d1e +Qy = 6135adbd8624130735e64e65ecbd43770dcc12b28e737b5ed033666f34c918eb5589508e4a13b9243374a118a628dd0b +k = f3922351d14f1e5af84faab12fe57ded30f185afe5547aeb3061104740ecc42a8df0c27f3877b4d855642b78938c4e05 +R = 38e181870cb797c1f4e6598cfd032add1cb60447d33473038d06df73919f844eddd16f40f911075f8a4bacc0d924e684 +S = a58dd1ca18aa31277de66c30c3bb7a14b53705ce6c547ed2cb0e336f63c42809422efffcc722d1155f2254330a02b278 + +Msg = e7d974c5dbd3bfb8a2fb92fdd782f997d04be79e9713944ce13c5eb6f75dfdec811b7ee4b3859114b07f263846ae13f795eec8f3cb5b7565baff68e0fdd5e09ba8b176d5a71cb03fbc5546e6937fba560acb4db24bd42de1851432b96e8ca4078313cb849bce29c9d805258601d67cd0259e255f3048682e8fdbdda3398c3e31 +d = 54ba9c740535574cebc41ca5dc950629674ee94730353ac521aafd1c342d3f8ac52046ed804264e1440d7fe409c45c83 +Qx = 3db95ded500b2506b627270bac75688dd7d44f47029adeff99397ab4b6329a38dbb278a0fc58fe4914e6ae31721a6875 +Qy = 049288341553a9ac3dc2d9e18e7a92c43dd3c25ca866f0cb4c68127bef6b0e4ba85713d27d45c7d0dc57e5782a6bf733 +k = 04324bd078807f6b18507a93ee60da02031717217ee5ce569750737be912be72da087ac00f50e13fdf7249a6ae33f73e +R = b2752aa7abc1e5a29421c9c76620bcc3049ecc97e6bc39fcca126f505a9a1bfae3bde89fb751a1aa7b66fa8db3891ef0 +S = f1c69e6d818ca7ae3a477049b46420cebd910c0a9a477fd1a67a38d628d6edaac123aebfca67c53a5c80fe454dba7a9d + +Msg = a670fda4d1d56c70de1d8680328043b2b7029633caf0ee59ffe1421c914bb937133d5a0f9214846b2e0b350455a74c4ab434c56de65a17139bb8212bf1c76071a37536fa29348f871dbb26baa92eb93d97e923a6d2ffd9be25cbc33075e494e6db657bd8dc053fe4e17148d8cf6e2058164f2b5766750eb01bbe7b361cdb848c +d = dabe87bbe95499bac23bc83c8b7307fe04be198f00059e2bf67c9611feaffb2c8f274f6aa50eb99c3074186d8067d659 +Qx = c2aa0a695125279705917e02a4f258cade4c3ff9140a071414babf87764f426f7f36ffda9d5f3394375d24864235476f +Qy = 8f9808da0ce0227cf453f9e456f557db9752e23b45cce4baad5fee3844ddd7e1112bcec01ea9d67c7a76f3535bd0cb58 +k = 65a0305854033cbc6fe3ca139c40ca354d45801ecb59f4a923c251dc6b25d12d452d99b5d6711fdb5efac812aa464cc4 +R = c7fc32997d17ac79baf5789e4503f5f1a8863872bc350a91f12dd3ef8cf78c254e829217809e8e00b6b8d4d85be3f1fd +S = 1422e1838a22496df93486bce1142961dbd8478ae844b8dda54e210afdae0d9e930d587c91bb600b0bde7237186d94e6 + +Msg = 7843f918fe2588bcfe756e1f05b491d913523255aa006818be20b676c957f4edb8df863c6f5f8c15b3b80c7a2aa277b70d53f210bdfb856337980c406ea140e439dd321471407f374f69877b2d82367eed51e3c82c13948616dcb301d0c31f8f0352f2846abd9e72071f446a2f1bd3339a09ae41b84e150fd18f4ba5d3c6bfa0 +d = df43107a1deb24d02e31d479087bd669e2bc3e50f1f44b7db9484a7143cdca6a3391bddfea72dc940dbce8ec5efbd718 +Qx = 76bd4be5d520471162cb5c36f80038301b325f845d9642204a84d78b3e721098932827bf872bde0a9f86383953667d29 +Qy = 415116b8b878f896a5aa4dbbdc21076f27135d8bbcaaca02489ef639d742bd63f377da0c8e8ab36ff19b4a7cc5d4ceb4 +k = 798abad5a30d1805794540057388ee05e2422901c6335f985b9d4447b3ef75524751abfeab6409ad6bf77d4ae3014558 +R = 98744e5c6742fa5118a74a70db4957647a3cc12add4e876b45974a6a8707809f871daadbfc0b865e01624f706b65f10c +S = 9e256e8da8eff5a0c83baaa1ef4f7be798eba9543bf97adb0fff8719f5406ea1207a0cf703d99aa8f02169724b492273 + +Msg = caa83d5ab07febbd2e0fe2d63738b9b7b8752594bea7aaf50345b3d2f316653a8c9222f2b7877b64679e9573e81461a426029e45b8873a575094a1d572e0d32a9f0a9c6bcb9a2868543b7d8bbe4a69a09e7321f05f8366cced1b72df526f895b60aed2c39c249653c7839538770d4e5f47d3926ec0d168ab6a1af15bf1dca1f7 +d = ea7a563ba2a7f5ab69973dca1f1a0d1572f0c59817cd3b62ad356c2099e2cdca1c553323563f9dfbb333b126d84abc7f +Qx = cf4717c5f5de668b785f06bdc9845df5a09e4edd83f4669756407cbb60807305c632bc49f818f4a84b194369aa07736f +Qy = 7391e4982af8a2218f704f627d01f0508bfc8304992a2d598a420bf2eb519f33bd7caf79380793733b3dba0cc5e2b9d8 +k = 7b9606b3df7b2a340dbc68d9754de0734e1faeb5a0135578a97628d948702235c60b20c8002c8fcf906783e1b389e754 +R = 0d680010bed373287f9767955b5d2850e150b6713b49e453eb280148e45230c853d99ea2d2f8fcbd3ddcba19aeec0af1 +S = 64329763a930ab5452afdb0557fef16ff71810d6343dfc9c6ae18905c3d274db6554cdc69d6078a1ca03284474a94f30 + +Msg = 594603458d6534974aeeafba919c4d0f4cb6843a3af41204bbb88aeb2fca2772d305163dba863da050aabedbaf89db521955d1715de95bbcef979ecdc0c976181ece00355385f8a8f8cce127c9eac15ce3e958a3ed686184674ec9a50eb63271606ee7fdcb1323da3c3db8e89cad1fb42139a32d08abcfbf0d4ccfca18c89a86 +d = 4cc70cb35b3ddeb0df53a6bd7bd05f8ff4392a2db7344f2d443761484b3a468a4ee3d1a8b27113d57283fd18b05f7829 +Qx = 40e1fe21df34bb85a642a0abe819ebd128f7e39b84d8dcc4a9a599b372fb9588da1484600ec28b1297bb685f9ae77831 +Qy = f3aa69ada57879fdcbe8df19cefabc308add7d03b17b1fac2f7783fece6a8dfe20bc36f518692677d96e3f730a67a671 +k = 8eda401d98f5688c34d8dbebcd3991c87c0442b0379154eaa2e5287dabe9a9e34cfc1305d11ff68781df25d5611b331d +R = ff2d772786e159448bba26afd8c3281941a4cb0c56fec6f5cccb4c292c4ee0f7af9bd39bbe2d88148732585e104fdb30 +S = 07a1d890770daa949a17797dca7af3e8163da981ec330c03d63d1a8312c152be6a718163205ffa08da7dcc163ba261f4 + +Msg = 733252d2bd35547838be22656cc7aa67eff0af0b13b428f77267a513c6824c3dbae533068b6817e82665f009560affcfe4b2ddb5b667a644fc1a42d24f24e0947e0dc50fb62c919bc1fe4e7ded5e28f2e6d80fcf66a081fb2763526f8def5a81a4ddd38be0b59ee839da1643eeeaee7b1927cec12cf3da67c02bc5465151e346 +d = 366d15e4cd7605c71560a418bd0f382fd7cd7ad3090ff1b2dfbed74336166a905e1b760cf0bccee7a0e66c5ebfb831f1 +Qx = a143f277ab36a10b645ff6c58241ea67ffdc8acf12d60973068390f06b4d8f4d773b10c1ebf6889b1cfa73ebb90f6ca1 +Qy = 7a17cad29bb507b309021f6f92cb5c10ba535f4a3e317fcc68cfd02d3ccd269f465169c73d30ff308f5350d881b08aec +k = dbe545f920bc3d704c43d834bab21e40df12ec9e16a619a3e6b3f08760c26aae6e4fd91fad00f745194794b74bb1baee +R = cdc39b12bba30da66fe9554713c05880ddc27afa4d2d151440f124c351fb9496dc95046516b0921083347d64369846ac +S = 797d0344e49f9ba87a187c50f664e5015d449e346b1a7bd9427c5be559fc58173651880d5aadf053f81899d3368d6181 + +Msg = 5a182bd174feb038dfae3346267156bf663167f713dea1ce936b0edb815cd9b8c8e4d411c786ba2494a81442617255db7158b142e720d86c9b56680fb9efd4298cdd69079a28153494c42a24251c7ad42ecf7e97eabc1b3997529b2a297cbad2474269b87a0b1e385f2d7f8b6eb8d1cd75eaf7e91d1acbecd45d7b2bfbbe3216 +d = e357d869857a52a06e1ece5593d16407022354780eb9a7cb8575cef327f877d22322c006b3c8c11e3d7d296a708bdb6d +Qx = ce9a2185a68d6094aa5849a6efe78b349946f7380f0c79aa9664246cfcc71a879e90ad78a0474f58644c6a208168150e +Qy = 8354fa47673cb3e07d446521345706c5515584b2602f921c3b9c44dded9e2c3f90ce47adb36d7e5f9f95a8c5ad8af397 +k = 1e77367ac4e10924854d135ad2f2507f39e2bafdbce33ff256bcbe9a7329b8d27185218bcc3550aafbe3390e84c77292 +R = df3182d49ad70959fb0c95bc7312750ce70fc87f1a328d39d9b29ac05d31305ce7209d6c24d13225d9567b489f7a187b +S = d812b05abab0e96de13291e1f0da6479444ed5cd9d959b76f6cb43d394769035364f7c831a104dc7b5bd9b4a8e64df64 + +Msg = aaa99fb1c71340d785a18f6f668e898c25cf7a0ac31d13c5b388b7233408493a5a109af6d07065376b96f4903df7aba2b2af671a18772bb0472490d1240cde28967680727dd4acd47e0308920a75da857a6eeedee5b6586d45dff3d8a680599665aa895c89dd7770b824b7dee477ac5e7602d409d3cc553090c970b50811dbab +d = 745a18db47324a3710b993d115b2834339315e84e7006eafd889fb49bd3cc5a8b50c90526e65e6c53bddd2916d14bead +Qx = f692578c6f77531210aef55c9e004ce3b66cf268c6900dde31a8bbb76e7562e3fb76242de34ca330d2501030aa119466 +Qy = 40965833b28de926c46de060aa25beaeda98f8415a6b1e3564aa77870cf4c89bd4fde92c8f5d9bf0eb41721586859d8e +k = 11b9b36720abcac084efdb44c9f5b7d039e3250cb1e9c47850189ba3cfc1489d858b2a44df357772b61d919c7e729c0f +R = 02b252c99820cf50e6ce060ab55bd4f682276e29b4ae4197417432e6a7bfb8cf0bac89dfe105456af805d822cee77696 +S = 8e248bbf7d7028d63177e565c9d1666ee5be4d1ffbfffc9c7814b0cd38f74b98f3f2cd59be42b9f132bfe5ee789cd96c + +Msg = 1fadfa8254d3a0b82d137cfdd82043d5dc1fef195d5297b09cc5cfb061f59c933451c0dc2a11b4037f34f88dacb803251f8880c4b72585c3c196e6fb23484ca43a191f8e41b9b9a37e2e6fcaab6738c3c62d1c98e1c620bb788b7b51a04f998a510efdba0d3418622fe8ce203b3fcd553b9b4206365a39031797ad11e49745ec +d = 93f20963ea5011ff4f26481e359309e634195f6289134087bd2e83eee008c962780a679784ee7ac6acda03d663ed27e0 +Qx = 0edcde3533ea019e18f1a3cd97b7962e8823dda36c389f8f9287549f796d11376392b8a01c7a80f127a8f75795e04f54 +Qy = 63d7c458dccfc02f5148d755d59f9bbc8e3c3ea34908777928440747795955741296abcdd5386676419ed8049fedb489 +k = 3ad308faf04c42ee5ac69d36bc0aa9a96aacf55ea0f27dac4f52e088f023d206340a6324874ffad169ff80624de24c96 +R = 209b72f9aae72c4339813573c3a8408a9e0be641ca863d81d9d14c48d0bf4cd44a1a7985cff07b5d68f3f9478475645b +S = f6292e599b22a76eda95393cf59f4745fa6c472effd1f781879ad9a4437a98080b0b07dadad0c249631c682d2836a977 + +Msg = 9ecb6f5ed3ba666a8536a81ef65012c2cb8b433508798d84708abb06dfb75503886f78384fb8c7a4d2d49ef539d9b8a0b60938c7f07471dda91f258b0d99691b38a8403a2bb3f956bdfd09baba16d9b6877097a9b6213481b47a06e139d23ec7abad5668d21f912fdb70d31bb9adf9b3ce80e308252fa81a51674f88d02db72b +d = f175e6ac42fd48ec9d652c10707c039c67c4cc61d8c45a373dcda6e4ca6c53e947e49c24e01b48e7cdf92edfe6d316a1 +Qx = a40c64f595491ce15790a5a87fbe64c1800247b42acd08fe5257700719f46afc8acce0e4ede0517a312092d5e3d089cd +Qy = d565df9dc2f381cc0c5d84f382a43a98018524c0b4708a44b3e2817f9719f29fbf9c15803591ed9b4790c5adaba9f433 +k = 812dcaa6d4f9a43ccc553288065d13761581485aa903a500a690ccafbd330ba4818c977b98c4bb57f8a182a1afacfae9 +R = d000f18d3e4c162ff0d16f662e6703e7a6f5bff7a333ed266fa4f44c752415946c34945c342c20f739677186b1d80ab3 +S = ae7f1271c89e0aaa238710d039ea73a69110cc28fcf426f2fe6754b63a59e417fa84f903cf7dccb5468b43ff083bbfd5 + +Msg = e55bfca78d98e68d1b63688db12485578f36c489766f4d0bfaa0088433ff12133aaca455805095f2e655940860958b3ead111d9070778ee3bbf3e47e43d9eba8b8d9b1fdf72f793fcde2bcaa334f3e35fa2cca531ea7cf27fe9ccba741e38ac26129b2d612bf54a34e0ae6c166c0fef07fcd2b9ac253d7e041a500f7be7b8369 +d = 46c4f0b228b28aaa0ec8cfdf1d0ed3408b7ae049312fb9eaf5f3892720e68684cc8ad29844a3dc9d110edf6916dfb8bb +Qx = 13ddec844731b7e30c467451df08ca11d6c581cb64abd8a257671cffd26f5ccad4df7b9ee8924047a88a5d2d7567609c +Qy = d74ca94f590fd1d13e190cc1e03c3da6c3faab15c7dda034af3deefee8aeec3628fa8b1978c54cfcd071baa319a46ec0 +k = 2a9dd520207c40a379cd4036adef9ee60fa8bc8c0d39b3ad91850ac93fd543f218b1688581f23481a090b0e4c73792ac +R = 94e08cca20fe3866f643f53ec65faf3f2b4d80cd9bcc8ff8f88bb28da9eada324fc2d048908dd3d08a9e0ebb547731bc +S = 8e6f82c4d3069b14f4c844b4ca133a9503493265c9f77a7d4775eda67de76798a23dd7ea48e0ac3c337dd62bf058319d + +Msg = 02c6b3c83bd34b288d96409162aa4ff114e9d134bf948046eb5ebcc0c7fe9dfceadda83ed69da2fac00c8840f6c702a3fc5e6959d70f7e8af923e99e4937232ae3b841ffefd2e62fab3671a7c94a0281b8ea5bc176add57c5c9b6893fe7f5d48ce7256b96510810c4e046168a3c5be9843b84d5268a50349b3444341aa5490dd +d = 1d7b71ef01d0d33a8513a3aed3cabb83829589c8021087a740ca65b570777089be721a61172b874a22a1f81aef3f8bb6 +Qx = 8d2721370df8f097d5a69396249a315f6037dc7045b3da11eacae6d43036f779d5de7053d101768b42cc2b1283a3aaea +Qy = a046039ae662141f9954d278183eaa2e03917fe58583e32d344074d59d60caa5b0949c53066525d5cca923e2f201502e +k = d1b25ad25581cad17e96f1d302251681fee5b2efbb71c3c15ff035b2145d015d18e0e52dc3187ab5a560277b3a3929b0 +R = d836f52b14c7391744868daa2d5cf27eb9380b9b6176195573d5b04842e9f2fc3794d6cf877feafee63d11b05f6a6bee +S = 8b89042fef2c04d4bd6c9d66a06a010514321d623a5f8d57ba5ac3686872eaabca9e0ba2d058ae7028e870acf03ca32d + +Msg = 94f8bfbb9dd6c9b6193e84c2023a27dea00fd48356909faec2161972439686c146184f80686bc09e1a698af7df9dea3d24d9e9fd6d7348a146339c839282cf8984345dc6a51096d74ad238c35233012ad729f262481ec7cd6488f13a6ebac3f3d23438c7ccb5a66e2bf820e92b71c730bb12fd64ea1770d1f892e5b1e14a9e5c +d = cf53bdd4c91fe5aa4d82f116bd68153c907963fa3c9d478c9462bb03c79039493a8eaeb855773f2df37e4e551d509dcd +Qx = 3a65b26c08102b44838f8c2327ea080daf1e4fc45bb279ce03af13a2f9575f0fff9e2e4423a58594ce95d1e710b590ce +Qy = fe9dcbcb2ec6e8bd8ed3af3ff0aa619e900cc8bab3f50f6e5f79fac09164fb6a2077cc4f1fed3e9ec6899e91db329bf3 +k = df31908c9289d1fe25e055df199591b23e266433ab8657cc82cb3bca96b88720e229f8dfd42d8b78af7db69342430bca +R = 6770eea9369d6718e60dd0b91aee845ff7ed7e0fcc91675f56d32e5227fd3a4612bbcb1556fe94a989b9e3bcc25bb20e +S = c43072f706c98126d06a82b04251e3ecb0ba66c4bb6cd7c025919b9cc6019cdc635256d2a7fa017b806b1e88649d2c0d + +[P-384,SHA-256] + +Msg = 663b12ebf44b7ed3872b385477381f4b11adeb0aec9e0e2478776313d536376dc8fd5f3c715bb6ddf32c01ee1d6f8b731785732c0d8441df636d8145577e7b3138e43c32a61bc1242e0e73d62d624cdc924856076bdbbf1ec04ad4420732ef0c53d42479a08235fcfc4db4d869c4eb2828c73928cdc3e3758362d1b770809997 +d = c602bc74a34592c311a6569661e0832c84f7207274676cc42a89f058162630184b52f0d99b855a7783c987476d7f9e6b +Qx = 0400193b21f07cd059826e9453d3e96dd145041c97d49ff6b7047f86bb0b0439e909274cb9c282bfab88674c0765bc75 +Qy = f70d89c52acbc70468d2c5ae75c76d7f69b76af62dcf95e99eba5dd11adf8f42ec9a425b0c5ec98e2f234a926b82a147 +k = c10b5c25c4683d0b7827d0d88697cdc0932496b5299b798c0dd1e7af6cc757ccb30fcd3d36ead4a804877e24f3a32443 +R = b11db00cdaf53286d4483f38cd02785948477ed7ebc2ad609054551da0ab0359978c61851788aa2ec3267946d440e878 +S = 16007873c5b0604ce68112a8fee973e8e2b6e3319c683a762ff5065a076512d7c98b27e74b7887671048ac027df8cbf2 + +Msg = 784d7f4686c01bea32cb6cab8c089fb25c341080d9832e04feac6ea63a341079cbd562a75365c63cf7e63e7e1dddc9e99db75ccee59c5295340c2bba36f457690a8f05c62ab001e3d6b333780117d1456a9c8b27d6c2504db9c1428dad8ba797a4419914fcc636f0f14ede3fba49b023b12a77a2176b0b8ff55a895dcaf8dbce +d = 0287f62a5aa8432ff5e95618ec8f9ccaa870dde99c30b51b7673378efe4ccac598f4bbebbfd8993f9abb747b6ad638b9 +Qx = b36418a3014074ec9bbcc6a4b2367a4fb464cca7ec0a324cb68670d5c5e03e7a7eb07da117c5ea50b665ab62bd02a491 +Qy = 4ea299c30e7d76e2c5905babada2d3bb4ee5eb35a5a23605cdb0d5133471a53eb9e6758e49105a4eaf29d2267ba84ef2 +k = 935eeab3edeb281fbd4eead0d9c0babd4b10ff18a31663ee9de3bfa9ae8f9d266441158ea31c889ded9b3c592da77fd7 +R = 738f9cb28f3b991335ef17b62559255faf75cad370a222464a492e27bb173c7f16b22100ada6b695875c7e4b1a28f158 +S = bc998c30e1491cd5d60dc7d1c38333165efe036b2a78db9b8f0e85ee68619cfba654e11ae5ca5ee5a87099c27cf22442 + +Msg = 45e47fccc5bd6801f237cdbeac8f66ebc75f8b71a6da556d2e002352bd85bf269b6bc7c928d7bb1b0422601e4dd80b29d5906f8fcac212fe0eaaf52eda552303259cbcbe532e60abd3d38d786a45e39a2875bce675800a3eaeb9e42983d9fd9031180abd9adccc9ba30c6c198b4202c4dd70f241e969a3c412724b9b595bc28a +d = d44d3108873977036c9b97e03f914cba2f5775b68c425d550995574081191da764acc50196f6d2508082a150af5cd41f +Qx = c703835d723c85c643260379d8445b0c816fe9534351921e14a8e147fe140ec7b0c4d704f8dc66a232b2333b28f03dee +Qy = c5d0bb054053fd86c26f147c4966757aa04b00513a02d427b8d06c16055c607955efdc518d338abfe7927c195dc28588 +k = c80f63e080650c8a21e4f63a62ec909adfb7d877f365d11ee1cb260baf112eb4730c161c1d99dba98fc0d5bbd00dc97d +R = 81de2810cde421997013513951a3d537c51a013110d6dbb29251410bcb5ba001a9686b8490f1e581e282fd2ed0974b22 +S = 9cab0bbaffe91c7677ec3dd1f17060211a3cc0be574cbca064aa8c4b66ba6e64f3d80e83da895042ca32d311c388d950 + +Msg = c33ff63b4e6891e00b2349b3f2907c417ca355560544a91e24a7a0ee260d6850aeded29fc0176b6039ca6187e8333391047cceaf14b1077df8f147dad84d36b2dac5666dc2f69dc9b58b88cc73956efdb3b47f91831d5875051c76b0c4e9fc087012a1f03eeee85d6745b46aa50bd9cb0110c2c94508765cec162ee1aa841d73 +d = d5b72cbb6ec68aca46b9c27ad992afd8ffa02cb3067b234fcfa6e272e3b31be760695ff7df988b57663057ab19dd65e3 +Qx = 135a6542612f1468d8a4d01ff1914e532b1dd64d3627db9d403dc325651d3f82b0f6f0fd1dbdeca2be967c4fb3793b5f +Qy = cbbd40f6d3a38d0dfb64582ff4789d7b268241bc0c36de2884bccfaeeff3b7b2b46a30bb35719804e0d11124b4e7f480 +k = 9da6de7c87c101b68db64fea40d97f8ad974ceb88224c6796c690cbf61b8bd8eede8470b3caf6e6106b66cf3f0eebd55 +R = 17840911ecdf6ae0428b2634f442163c2c11b8dbf0cc7a5596fbe4d33e3e52f9d99e99ad169867b1f39e89c9180cedc2 +S = dd7ed67e480866d0474379ea4afff72870746f4feef2153be42f13bf472b1613d7faa5c0abb7f7464070f94d7cf3f234 + +Msg = f562f2b9d84b0e96a52532c3b43c39c8018c738bd8dc3797a7de7353971b2729d522d6961b1f2e4df3f6a4bd3653e6d72b74fc0dba92ab939c4b542e994e5db6dd8ed4f56f651e699052e791237ae1f552f990ad156226ae8f7bf17fcbfa564f749604f97e9df0879d50985747d981422a23040fe52f5ec74caf1d4aaad8a710 +d = 218ee54a71ef2ccf012aca231fee28a2c665fc395ff5cd20bde9b8df598c282664abf9159c5b3923132983f945056d93 +Qx = 01989ff07a7a452d8084937448be946bfedac4049cea34b3db6f7c91d07d69e926cce0af3d6e88855a28120cf3dba8df +Qy = eb064e029d7539d4b301aabafe8de8870162deffe6383bc63cc005add6ee1d5ced4a5761219c60cd58ad5b2a7c74aaa9 +k = c5d39b436d851d94691f5f4aa9ef447f7989d984f279ae8b091aef5449ac062bcc0567740f914624ad5b99fc32f9af0b +R = 07d5b1b12877e8cb5e0aa5e71eeeb17bf0aa203064c7e98b3a1798a74dc9717252dc47c7f06aaf1d5fe15b868323bbb9 +S = 69428cf101a7af5d08161a9fd7af212e02e33b6062aebdce4c96bf3a0684b5394cb902ca7c2dec6e2f01f40c4576009d + +Msg = ace953ae851f571d71779aa120915f27450b236da23e9106f8d0756abdd25861937941228d225d5fb1aa1b1ebf759b1e326aeb3b6cd0cd87edd2ab9f6a7ad67b63d2c501d6a550edb2e7c9d216cc8af78dd33546af64d00abed4d0d2cfc5c9a7b5a055dbe8f7547902d185cf46937314832bc5c602419a82ab83dbd9d3bd5aff +d = e6ab171f6937c000e144950801ad91023ae8e8476856c2592d9f7d5bb7180fd729211803d39a412ead6c0be761cfa5d1 +Qx = 38bc42b8c9d8866d09b214398d584b1b24a488dfacc3420d1e9506aa825b19fdf1ba74e7b8f547f47b571467fe8c4d1f +Qy = 5179d62668d3f6a7ab5c8e3761a685e12008fb87d0529a97645f65cfb5364376c1b6682e0ffcddd0bcd995c41d013ad3 +k = 05e9718aea9669c9e434f73866da5f252dec6d24c47a1c4ee3233450b6ec626de9746ebe095b285558dfc89fc1b622fe +R = df9bab9dd1f22ec6f27116f38831cb2089aa78aa8c073024a0faddd9a48e810a5e8e2cadd80fbf8dbd6088c71fe30b5b +S = 1e0e8718567d12d18558c57f9e87a755c309e4ffb497335a3adfc8d7475ce8fd882d5dc33a8f5a16274b7ad74bb7862a + +Msg = 9635ab832240be95301bedb94c5aec169eedc198cbbdfedcf41e9b586143d829b4597a6b2a81902828332825fd84a785f187a3894e21bd99d22c4f94dcf34453fc052f15ec64d1447c932cb38fcdd30b7be851963409c11881438cbaad7e96f9efbde317f2235d66af804477a5dfe9f0c51448383830050ecf228889f83631e1 +d = 14acd516c7198798fd42ab0684d18df1cd1c99e304312752b3035bed6535a8975dff8acfc2ba1675787c817b5bff6960 +Qx = 29909d143cf7ee9c74b11d52f1a8f3ebd4a720c135612ca5618d3f432f03a95602ee75a2057e1d7aab51d0648ac0b334 +Qy = 404b6c5adffbadfa1b0380ae89fed96ec1ca16cc28661e623d0f1c8b130fbaa96dd7257eae2bf03c2d3dcbc3dbc82c58 +k = 7f623c103eaa9099a0462e55f80519c565adaeffcb57a29993f3a8a92e63a560be8f0fb9d23dc80bff1064bb41abad79 +R = 932ab291950c16b2b19a8036cd2e905714c6229cb190a73b3ea49c48dd8e76063a453c7c3267a57597d2973678216296 +S = d17d4c5ddbb9c27beebf526f113b416c8abfad53d11c4224813c7f351ba41a77dd4e77d6e4a65bef2c9f62cc37a469a5 + +Msg = d98b9a7d4fe9d0fd95de5056af164a8b7882cd34ab5bde83a2abb32dc361eb56a479a3a6119db3b91dcad26a42d2206749567f0d97c34a981a91fc734921821a429f6a53401743a5c406ba9d560f956203abc9d1f32f1a13e7d7b290f75c95fdbf857ea597021461c06a3aacfa554ede3d69e4ff03bbbee5b7463ec77de2b3b2 +d = 2e780550984f3a00cb1e412429b33493c6eb6cd86d12f9d80588c247dcf567bd04296d2d4b24b889d9c54954b7f38f57 +Qx = 37dac42ef04663238443ef33e8addee2e78c40d50a1751913a7f5c37d1f23a26c7f86e16055c788b8ca9554f06b2f2ef +Qy = bbed1549652904e3d00c39b01cc0460dbaf3185e6190c2705677a9701de1fe56dff4f4d8418ee15059ff8fc36800982d +k = b788ca82811b0d4e4841765c71eafaa1e575378beedcd3860d8b92db3d070ac5aef7c425067860fbee6c50cf0c642bbb +R = 7292b3851870daeb2555a8a2fb198ead78739fcfb75327e5c32a82c6b77d58983e5ad548ccb75dcf9411039c9576d9b9 +S = a378c61802d9f1dd062b6e18f16416a954018f77df4df95ad1b983570377d5cfce4cc7861759e802c52f81abc4f49aac + +Msg = 1b4c754ac1c28dc415a71eac816bde68de7e8db66409af835838c5bb2c605111108a3bf13606ed5d8ade5ed72e50503e0de664416393d178ea4eec834d8d6f15039847b410080fd5529b426e5aadd8451c20ebd92d787921f33e147bcbeb327b104d4aab1157fc1df33e4d768404b5ccb7110055c2508c600f429fd0c21b5784 +d = a24d0fe90808aecc5d90626d7e6da7c9be5dfd4e1233c7f0f71f1b7c1c6fd318fafe18559c94718f044cf02ed5107cb1 +Qx = ec8ae1fb9bb88589d27d6f27d790392853396f37bc0c381631d85800fc668eea0886bf1c6cff801147df19778d5b1604 +Qy = 1e1a8336c1e2506f8ee388b55cc648ae73b9295ea78467979d2affb364536fad28120f51ec62a67cbb6ce7784780389f +k = 755d025509b73cf1ea8817beb772ad150b4c17a52378be187daffe3db0158921e5e552d1ca3c85df28519939f3cb794d +R = 23ff2ffa62bbd427d49995d9c9950116e0d5a06ef076a4553448bc109e6482c5e87d4c833bc88de0bc722bc98cae2e61 +S = 9aea13d487c3ea6917e16374caafcf0321c12a80d28902dd8cd81909bb04b8c439e2491e504756742d0d0bfb15a9c34c + +Msg = 3cd8c053741dd9f974c6c5dbf8a1e5728e9b5eafb1cbcfc3452f5fbbda32a8c7564dee157e8d902c52514361da6d972934a56b3276e2a9379e328e24282e0db697c5bc29090fc489ec46b7b188325dd4e96494c250de0f4a89fe2ccf919eaefcfb50c288113e6df92714feb7f46e0822478c796d0f4ff3447a32997e892693ce +d = 1c172e25732555afee7ded67a496f3f11babc0875898619f4519c29321e201e8ba1149f2c20b48e5efba235d58fea7c3 +Qx = 13e9e2c8bbcfe26e8f5f43c86268c5980ee693236a6b8777f3a7323718baa21005b482d08aafc6fa6e3667d91353544c +Qy = 9ba181b3ee505be030f87ecd249b00670a791489b42af04976013483ff95b630c91c01e95757e906129f2f9b4ce719a8 +k = 08aec9a9e58bdc028805eb5dc86073d05fff1f5fb3fd17f510fc08f9272d84ba7aa66b6f77d84fe6360bd538192bf01a +R = 2b4337c3dfbc886ffad7858ae2480cb62227e12205a70361c42f1a5ca9e658ee30fc3cf4030d85bd065edad83b99821f +S = 2550cef8574bf17fb3d6b0c9d04ab266962bac3621bac233ff2e4989712d2a4a07171c0aebd3040cd6a32c3bd3efb8b5 + +Msg = ed955dda6d9650124804d3deb6aeef900e520faf98b1ef6f14efcada7ca2433f09329b70897305e59c89024d76e466b28fe02cb2a9b12e2478c66470259d7c282137a19e5a04ffadea55245c0f34a681593fedc42931d8b3321b3d82e9cc102cd00540ad311ec7bd8c9d06db21bea4ca3dc74d98931ae0d40494aefc2345132c +d = 5b96555dbd602e71d4d5d3aee19fd1ea084ee23d4f55c10937056762bc2015cbded2e898a487f5482ab7e1e971245907 +Qx = 6e14c17bb831b0112d7f3543c5fd17c78379a516c9e0539b03b8b4bfdead2820343fc84b0382807573ded6c4d97b7003 +Qy = 7f60021d2de77546db666721c9aec84c3e2ba8de0ba77443600dc77e6839bbf9316271adb22d4cb47d08f745ecb1dafd +k = 7ad6f4ffd2b429ba10c6f112f800cacf1ad508cf8eba880893bb9659c1ddaaec57dcdc093a114500460d457bdde324f2 +R = faea950ca513806bc59028c638d6302ffc86978c3ff1f06db015dd7c4777050186cb8dd871f5e926e1416539c1939c2f +S = 2c592240eabb8a1f9878e1b5c9d5d3ced7b3a7ae571f5a86494ed2ca567a36eb72e7bea8934bded29594bccf67ca84bd + +Msg = ce395b001da2a58e49691605d44af4206306f62f561bf2394060d2a5591a350277166bed043819035f1e60b5b3fb5ae113ddd0473f8ef6b2b050c472c2a264e1d8b3ca82a4f158c40f2d78d9ce5e5ea6de243f2e1f13f47f6c6f403b270912c81c636be35b396ca58468b3fb60aa83911d61441a0528d973bc31f965d4059080 +d = 8df9c3c710a25192f3dea970910bb3784e3509874cccf4334823eb9f7a8d05b067f2d812d61e878e24b093089a0b8245 +Qx = 92c9e32b20cbe6d4ed0727c6c942cf804a72031d6dfd69078b5e78ebce2d192268f1f5e2abce5aaf1f8d6a35f136837f +Qy = d5167905fa7689e03b9fb1487c566f62b36f2bc1c4a2bfb6a836113b5c8d46f7c1ca51b628b14397fbc06ec9a07f4849 +k = 258dd05919735cd48627c9fe9fac5c252604aa7c2ae0460d7c1149cd96b7bd2ba195ad393bf392a2499f06aead5ba050 +R = 413793bcce52eda0f5b675a8d687cce86d5c9e1659b38a89e96246b5e05f8b0934d17dbba3b2ea44c838aa5fd87125d1 +S = ce7309fc2d6e3438818a1a29a997410b025b0403de20795b97c86c46034a6b02afeed279aeb06522d4de941bfdf50469 + +Msg = ffefe316455ae4ffdb890bb804bf7d31424ea060ecacff419d0f7134ff76ad434063c0ec0f8bb7059584d3a03f3625bb9e9f66ace1a47ac4b8f3e76fc7c420c55edb1427d1fa15b387ad73d02b0595c4e74321be8822752230a0dcfb85d60bfa186da7623a8ec3eb1633f0a294b23ae87216b14ccee9ef56418dcfab9427371e +d = 6002cb01ad2ce6e7101665d47729c863b6435c3875de57a93f99da834f73e3e6e2b3880e06de3e6bd1d51ea1807ab0d7 +Qx = e4216e1a20af8e8e3e74653ac016545001066e53e64af679ad1c85841bb475aed3e00ead052ae9955f48d675ff4ace56 +Qy = 8804c17641be21d4c6386902c9c5c888af25d97ca383703ea4a85cf93bbab360c0bbd2993374da499a303778650270b9 +k = 6b9507fd2844df0949f8b67b6fde986e50173713ac03df2edf65cb339859321cd3a2b9aab8356f95dec62460ab19c822 +R = 018891f6381ed358b422f79a299cf0789cee783ba388af4d82cbbe17f3709751b7fd9400e9702820c28b9afc62fdf489 +S = aef73bd590802b2fd2a65c4f7fec89f9b24ecc199a69254785925f334cd1977c5e1f858bd9830d7d7d243ea707b1af0b + +Msg = 304bccb718b3a9e12669913490cc5bcc1979287b56c628fad706c354241e88d10e81445a2853e3fc32ece094ba1abc3fdcab61da27f9a0fca739371049fed462ee6b08fa31cde12720f8144a6f00ce9b1a7a6eadd231f126717074b4efb5c72ce673ca5859000a436f67a338d698759f12c461247c45a361fb6cb661fdbe6714 +d = d8559c3543afc6f7b3dc037a687bad2630283757ba7862fd23ed14e2151a4cf5fed3d249268f780e0b96b6b46274a2d5 +Qx = 5f94223918f2ec9f0a08342cb99e724881c92453957c59672860f69daac01b660331a0f5845e50f1f27766b219c89e7e +Qy = d76d83396130d10d1168d76c7fc83742ffffbe66d9f4da4ca3f95f5ad6dac8cc7bb65d16d317d37aa99fdbf30ec7439c +k = 4ad5a92b5b8e170b71c8a7ed419dc624c7680004562b8d16a37b6e639f581ce81d5f0d98cce44d54c4e7136229148340 +R = f7baa6a5488ab462ea59aa31a36402b15880c68110b6069f51ede0c3b52a7b1e5bf926fdbe95768931b7d5f87058835c +S = 28b1c4ef448a432f7c91b98b0c6471691e888211b6af907369a8930859b8cdb2e94f466a44f4e52f46df9b0d65e35de6 + +Msg = 64f9f05c2805acf59c047b5f5d2e20c39277b6d6380f70f87b72327a76170b872bfe4b25c451602acfb6a631bb885e2655aee8abe44f69c90fb21ffde03cef2a452c468c6369867dfd8aa26ac24e16aa53b292375a8d8fbf988e302bf00088e4c061aa12c421d8fe3cbd7273b0e8993701df1c59431f436a08b8e15bd123d133 +d = b9208cbfd186ddfa3efd5b71342ae1efb01a13ebc4c2a992a2cbee7254b7846a4252ece1104b89d13d835911f8511224 +Qx = 166e6d96cb60d916fd19888a2dd945a3306ff0d7b0a5e30729f47d3dac3de2be3fd5cd7437e9a80d6c48cf960d2d36f8 +Qy = e6b2b70f131092ae210f29cc6bad701318bddb31bddf921695855c6208941100d0cee5d10799f8b835afe3ea510e8229 +k = da706ab5f61531f2378b3c0a2b342108cd119eadaa88b859df64923bccfb0ec2393fd312826f65c15a6587d1d460015b +R = d9124c42858080c62400e4d4d8136304e03d910cbe9b9b3487f4d27c7e0540a314d34bef8c850045c8746ca631c11c42 +S = bbf6424a3b70166fa799f49e918439d515327039258ef9bd88435a59c9c19659f8ec3c8660720b0c08354ff60e0f5a76 + +[P-384,SHA-384] + +Msg = 6b45d88037392e1371d9fd1cd174e9c1838d11c3d6133dc17e65fa0c485dcca9f52d41b60161246039e42ec784d49400bffdb51459f5de654091301a09378f93464d52118b48d44b30d781eb1dbed09da11fb4c818dbd442d161aba4b9edc79f05e4b7e401651395b53bd8b5bd3f2aaa6a00877fa9b45cadb8e648550b4c6cbe +d = 201b432d8df14324182d6261db3e4b3f46a8284482d52e370da41e6cbdf45ec2952f5db7ccbce3bc29449f4fb080ac97 +Qx = c2b47944fb5de342d03285880177ca5f7d0f2fcad7678cce4229d6e1932fcac11bfc3c3e97d942a3c56bf34123013dbf +Qy = 37257906a8223866eda0743c519616a76a758ae58aee81c5fd35fbf3a855b7754a36d4a0672df95d6c44a81cf7620c2d +k = dcedabf85978e090f733c6e16646fa34df9ded6e5ce28c6676a00f58a25283db8885e16ce5bf97f917c81e1f25c9c771 +R = 50835a9251bad008106177ef004b091a1e4235cd0da84fff54542b0ed755c1d6f251609d14ecf18f9e1ddfe69b946e32 +S = 0475f3d30c6463b646e8d3bf2455830314611cbde404be518b14464fdb195fdcc92eb222e61f426a4a592c00a6a89721 + +Msg = d768f41e6e8ec2125d6cf5786d1ba96668ac6566c5cdbbe407f7f2051f3ad6b1acdbfe13edf0d0a86fa110f405406b69085219b5a234ebdb93153241f785d45811b3540d1c37424cc7194424787a51b79679266484c787fb1ded6d1a26b9567d5ea68f04be416caf3be9bd2cafa208fe2a9e234d3ae557c65d3fe6da4cb48da4 +d = 23d9f4ea6d87b7d6163d64256e3449255db14786401a51daa7847161bf56d494325ad2ac8ba928394e01061d882c3528 +Qx = 5d42d6301c54a438f65970bae2a098cbc567e98840006e356221966c86d82e8eca515bca850eaa3cd41f175f03a0cbfd +Qy = 4aef5a0ceece95d382bd70ab5ce1cb77408bae42b51a08816d5e5e1d3da8c18fcc95564a752730b0aabea983ccea4e2e +k = 67ba379366049008593eac124f59ab017358892ee0c063d38f3758bb849fd25d867c3561563cac1532a323b228dc0890 +R = fb318f4cb1276282bb43f733a7fb7c567ce94f4d02924fc758635ab2d1107108bf159b85db080cdc3b30fbb5400016f3 +S = 588e3d7af5da03eae255ecb1813100d95edc243476b724b22db8e85377660d7645ddc1c2c2ee4eaea8b683dbe22f86ca + +Msg = 6af6652e92a17b7898e40b6776fabaf0d74cf88d8f0ebfa6088309cbe09fac472eeac2aa8ea96b8c12e993d14c93f8ef4e8b547afe7ae5e4f3973170b35deb3239898918c70c1056332c3f894cd643d2d9b93c2561aac069577bbab45803250a31cd62226cab94d8cba7261dce9fe88c210c212b54329d76a273522c8ba91ddf +d = b5f670e98d8befc46f6f51fb2997069550c2a52ebfb4e5e25dd905352d9ef89eed5c2ecd16521853aadb1b52b8c42ae6 +Qx = 44ffb2a3a95e12d87c72b5ea0a8a7cb89f56b3bd46342b2303608d7216301c21b5d2921d80b6628dc512ccb84e2fc278 +Qy = e4c1002f1828abaec768cadcb7cf42fbf93b1709ccae6df5b134c41fae2b9a188bfbe1eccff0bd348517d7227f2071a6 +k = 229e67638f712f57bea4c2b02279d5ccad1e7c9e201c77f6f01aeb81ea90e62b44b2d2107fd66d35e56608fff65e28e4 +R = b11db592e4ebc75b6472b879b1d8ce57452c615aef20f67a280f8bca9b11a30ad4ac9d69541258c7dd5d0b4ab8dd7d49 +S = 4eb51db8004e46d438359abf060a9444616cb46b4f99c9a05b53ba6df02e914c9c0b6cc3a9791d804d2e4c0984dab1cc + +Msg = b96d74b2265dd895d94e25092fb9262dc4f2f7a328a3c0c3da134b2d0a4e2058ca994e3445c5ff4f812738e1b0c0f7a126486942a12e674a21f22d0886d68df2375f41685d694d487a718024933a7c4306f33f1a4267d469c530b0fed4e7dea520a19dd68bf0203cc87cad652260ed43b7b23f6ed140d3085875190191a0381a +d = de5975d8932533f092e76295ed6b23f10fc5fba48bfb82c6cc714826baf0126813247f8bd51d5738503654ab22459976 +Qx = f1fabafc01fec7e96d982528d9ef3a2a18b7fe8ae0fa0673977341c7ae4ae8d8d3d67420343d013a984f5f61da29ae38 +Qy = 1a31cf902c46343d01b2ebb614bc789c313b5f91f9302ad9418e9c797563e2fa3d44500f47b4e26ad8fdec1a816d1dcf +k = fc5940e661542436f9265c34bce407eff6364bd471aa79b90c906d923e15c9ed96eea4e86f3238ea86161d13b7d9359d +R = c2fbdd6a56789024082173725d797ef9fd6accb6ae664b7260f9e83cb8ab2490428c8b9c52e153612295432fec4d59cd +S = 8056c5bb57f41f73082888b234fcda320a33250b5da012ba1fdb4924355ae679012d81d2c08fc0f8634c708a4833232f + +Msg = 7cec7480a037ff40c232c1d2d6e8cd4c080bbeecdaf3886fccc9f129bb6d202c316eca76c8ad4e76079afe622f833a16f4907e817260c1fa68b10c7a151a37eb8c036b057ed4652c353db4b4a34b37c9a2b300fb5f5fcfb8aa8adae13db359160f70a9241546140e550af0073468683377e6771b6508327408c245d78911c2cc +d = 11e0d470dc31fab0f5722f87b74a6c8d7414115e58ceb38bfcdced367beac3adbf1fe9ba5a04f72e978b1eb54597eabc +Qx = 1950166989164cbfd97968c7e8adb6fbca1873ebef811ea259eb48b7d584627f0e6d6c64defe23cbc95236505a252aa1 +Qy = 41ef424b5cb076d4e32accd9250ea75fcf4ffd81814040c050d58c0a29b06be11edf67c911b403e418b7277417e52906 +k = e56904028226eb04f8d071e3f9cefec91075a81ca0fa87b44cae148fe1ce9827b5d1910db2336d0eb9813ddba3e4d7b5 +R = c38ef30f55624e8935680c29f8c24824877cf48ffc0ef015e62de1068893353030d1193bf9d34237d7ce6ba92c98b0fe +S = 651b8c3d5c9d5b936d300802a06d82ad54f7b1ba4327b2f031c0c5b0cb215ad4354edc7f932d934e877dfa1cf51b13fe + +Msg = 00ce978603229710345c9ad7c1c2dba3596b196528eea25bd822d43ca8f76a024e29217703dd0652c8a615284fc3edcc1c5ad1c8d5a8521c8e104c016a24e50c2e25066dcb56596f913b872767e3627aa3e55ec812e9fdac7c2f1beade83aef093e24c9c953982adf431a776880ae4583be158e11cdab1cbca3ad3a66900213d +d = 5c6bbf9fbcbb7b97c9535f57b431ed1ccae1945b7e8a4f1b032016b07810bd24a9e20055c0e9306650df59ef7e2cd8c2 +Qx = 2e01c5b59e619e00b79060a1e8ef695472e23bf9a511fc3d5ed77a334a242557098e40972713732c5291c97adf9cf2cf +Qy = 563e3fe4ad807e803b9e961b08da4dde4cea8925649da0d93221ce4cdceabc6a1db7612180a8c6bef3579c65539b97e9 +k = 03d23f1277b949cb6380211ad9d338e6f76c3eedac95989b91d0243cfb734a54b19bca45a5d13d6a4b9f815d919eea77 +R = abab65308f0b79c4f3a9ff28dd490acb0c320434094cef93e75adfe17e5820dc1f77544cfaaacdc8cf9ac8b38e174bef +S = 11b783d879a6de054b316af7d56e526c3dce96c85289122e3ad927cfa77bfc50b4a96c97f85b1b8221be2df083ff58fb + +Msg = 54a255c18692c6162a46add176a0ae8361dcb8948f092d8d7bac83e160431794d3b9812849bf1994bcdcfba56e8540c8a9ee5b93414548f2a653191b6bb28bda8dc70d45cc1b92a489f58a2d54f85766cb3c90de7dd88e690d8ebc9a79987eee1989df35af5e35522f83d85c48dda89863171c8b0bf4853ae28c2ac45c764416 +d = ffc7dedeff8343721f72046bc3c126626c177b0e48e247f44fd61f8469d4d5f0a74147fabaa334495cc1f986ebc5f0b1 +Qx = 51c78c979452edd53b563f63eb3e854a5b23e87f1b2103942b65f77d024471f75c8ce1cc0dfef83292b368112aa5126e +Qy = 313e6aaf09caa3ba30f13072b2134878f14a4a01ee86326cccbff3d079b4df097dc57985e8c8c834a10cb9d766169366 +k = c3de91dbe4f777698773da70dd610ef1a7efe4dc00d734399c7dd100728006a502822a5a7ff9129ffd8adf6c1fc1211a +R = f4f477855819ad8b1763f53691b76afbc4a31a638b1e08c293f9bcd55decf797f9913ca128d4b45b2e2ea3e82c6cf565 +S = 7c26be29569ef95480a6d0c1af49dc10a51a0a8931345e48c0c39498bfb94d62962980b56143a7b41a2fddc8794c1b7f + +Msg = 692a78f90d4f9d5aee5da536314a78d68c1feabbfe5d1ccea7f6059a66c4b310f8051c411c409ccf6e19a0cbd8b8e100c48317fe8c6d4f8a638b9551ce7ee178020f04f7da3001a0e6855225fb3c9b375e4ed964588a1a41a095f3f476c42d52ffd23ce1702c93b56d4425d3befcf75d0951b6fd5c05b05455bdaf205fe70ca2 +d = adca364ef144a21df64b163615e8349cf74ee9dbf728104215c532073a7f74e2f67385779f7f74ab344cc3c7da061cf6 +Qx = ef948daae68242330a7358ef73f23b56c07e37126266db3fa6eea233a04a9b3e4915233dd6754427cd4b71b75854077d +Qy = 009453ef1828eaff9e17c856d4fc1895ab60051312c3e1db1e3766566438b2990cbf9945c2545619e3e0145bc6a79004 +k = a2da3fae2e6da3cf11b49861afb34fba357fea89f54b35ce5ed7434ae09103fe53e2be75b93fc579fedf919f6d5e407e +R = dda994b9c428b57e9f8bbaebba0d682e3aac6ed828e3a1e99a7fc4c804bff8df151137f539c7389d80e23d9f3ee497bf +S = a0d6b10ceffd0e1b29cf784476f9173ba6ecd2cfc7929725f2d6e24e0db5a4721683640eaa2bbe151fb57560f9ce594b + +Msg = 3b309bb912ab2a51681451ed18ad79e95d968abc35423a67036a02af92f575a0c89f1b668afe22c7037ad1199e757a8f06b281c33e9a40bab69c9874e0bb680b905d909b9dc24a9fe89bb3d7f7d47082b25093c59754f8c19d1f81f30334a8cdd50a3cb72f96d4b3c305e60a439a7e93aeb640dd3c8de37d63c60fb469c2d3ed +d = 39bea008ec8a217866dcbdb1b93da34d1d3e851d011df9ef44b7828b3453a54aa70f1df9932170804eacd207e4f7e91d +Qx = 5709ec4305a9c3271c304face6c148142490b827a73a4c17affcfd01fffd7eaa65d2fdedfa2419fc64ed910823513faf +Qy = b083cda1cf3be6371b6c06e729ea6299213428db57119347247ec1fcd44204386cc0bca3f452d9d864b39efbfc89d6b2 +k = 3c90cc7b6984056f570542a51cbe497ce4c11aeae8fc35e8fd6a0d9adeb650e8644f9d1d5e4341b5adc81e27f284c08f +R = d13646895afb1bfd1953551bb922809c95ad65d6abe94eb3719c899aa1f6dba6b01222c7f283900fe98628b7597b6ea6 +S = 4a9a38afda04c0a6b0058943b679bd02205b14d0f3d49b8f31aac289129780cdb1c555def8c3f9106b478729e0c7efaa + +Msg = f072b72b8783289463da118613c43824d11441dba364c289de03ff5fab3a6f60e85957d8ff211f1cb62fa90216fb727106f692e5ae0844b11b710e5a12c69df3ed895b94e8769ecd15ff433762d6e8e94d8e6a72645b213b0231344e2c968056766c5dd6b5a5df41971858b85e99afbf859400f839b42cd129068efabeea4a26 +d = e849cf948b241362e3e20c458b52df044f2a72deb0f41c1bb0673e7c04cdd70811215059032b5ca3cc69c345dcce4cf7 +Qx = 06c037a0cbf43fdf335dff33de06d34348405353f9fdf2ce1361efba30fb204aea9dbd2e30da0a10fd2d876188371be6 +Qy = 360d38f3940e34679204b98fbf70b8a4d97f25443e46d0807ab634ed5891ad864dd7703557aa933cd380e26eea662a43 +k = 32386b2593c85e877b70e5e5495936f65dc49553caef1aa6cc14d9cd370c442a0ccfab4c0da9ec311b67913b1b575a9d +R = 5886078d3495767e330c7507b7ca0fa07a50e59912a416d89f0ab1aa4e88153d6eaf00882d1b4aa64153153352d853b5 +S = 2cc10023bf1bf8ccfd14b06b82cc2114449a352389c8ff9f6f78cdc4e32bde69f3869da0e17f691b329682ae7a36e1aa + +Msg = cf4945350be8133b575c4ad6c9585e0b83ff1ed17989b6cd6c71b41b5264e828b4e115995b1ae77528e7e9002ac1b5669064442645929f9d7dd70927cb93f95edeb73e8624f4bc897ec4c2c7581cb626916f29b2d6e6c2fba8c59a71e30754b459d81b912a12798182bcff4019c7bdfe929cc769bcc2414befe7d2906add4271 +d = d89607475d509ef23dc9f476eae4280c986de741b63560670fa2bd605f5049f1972792c0413a5b3b4b34e7a38b70b7ca +Qx = 49a1c631f31cf5c45b2676b1f130cbf9be683d0a50dffae0d147c1e9913ab1090c6529a84f47ddc7cf025921b771355a +Qy = 1e207eece62f2bcc6bdabc1113158145170be97469a2904eaaa93aad85b86a19719207f3e423051f5b9cbbe2754eefcb +k = 78613c570c8d33b7dd1bd1561d87e36282e8cf4843e7c344a2b2bb6a0da94756d670eeaffe434f7ae7c780f7cf05ca08 +R = 66f92b39aa3f4aeb9e2dc03ac3855406fa3ebbab0a6c88a78d7a03482f0c9868d7b78bc081ede0947c7f37bf193074ba +S = e5c64ed98d7f3701193f25dd237d59c91c0da6e26215e0889d82e6d3e416693f8d58843cf30ab10ab8d0edd9170b53ad + +Msg = d9b5cf0b50416573ff3c63133275a18394dd4326be2041e8d97e6e4e3855a4a177e9d26dfd223fe8aa74564edb49bd72de19916fb6f001f44530d5c18e2c332bce1b7415df5927ece5f3824f34d174b963136b53aef1fb78fb0c06a201a40b2db38e4d8216fc1e392a798c8ab4b3a314496b7f1087804ebfa89bf96e9cdb80c0 +d = 083e7152734adf342520ae377087a223688de2899b10cfcb34a0b36bca500a4dfa530e2343e6a39da7ae1eb0862b4a0d +Qx = 70a0f16b6c61172659b027ed19b18fd8f57bd28dc0501f207bd6b0bb065b5671cf3dd1ed13d388dcf6ccc766597aa604 +Qy = 4f845bf01c3c3f6126a7368c3454f51425801ee0b72e63fb6799b4420bfdebe3e37c7246db627cc82c09654979c700bb +k = 28096ababe29a075fbdf894709a20d0fdedb01ed3eeacb642a33a0da6aed726e13caf6cf206792ec359f0c9f9b567552 +R = ee2923f9b9999ea05b5e57f505bed5c6ba0420def42c6fa90eef7a6ef770786525546de27cdeb2f8586f8f29fb4ee67c +S = 50ef923fb217c4cf65a48b94412fda430fac685f0da7bd574557c6c50f5b22e0c8354d99f2c2f2c2691f252f93c7d84a + +Msg = 9e4042d8438a405475b7dab1cd783eb6ce1d1bffa46ac9dfda622b23ac31057b922eced8e2ed7b3241efeafd7c9ab372bf16230f7134647f2956fb793989d3c885a5ae064e85ed971b64f5f561e7ddb79d49aa6ebe727c671c67879b794554c04de0e05d68264855745ef3c9567bd646d5c5f8728b797c181b6b6a876e167663 +d = 63578d416215aff2cc78f9b926d4c7740a77c142944e104aa7422b19a616898262d46a8a942d5e8d5db135ee8b09a368 +Qx = cadbacef4406099316db2ce3206adc636c2bb0a835847ed7941efb02862472f3150338f13f4860d47f39b7e098f0a390 +Qy = 752ad0f22c9c264336cde11bbc95d1816ed4d1b1500db6b8dce259a42832e613c31178c2c7995206a62e201ba108f570 +k = 7b69c5d5b4d05c9950dc94c27d58403b4c52c004b80a80418ad3a89aabc5d34f21926729e76afd280cc8ee88c9805a2a +R = db054addb6161ee49c6ce2e4d646d7670754747b6737ca8516e9d1e87859937c3ef9b1d2663e10d7e4bd00ec85b7a97a +S = fcc504e0f00ef29587e4bc22faada4db30e2cb1ac552680a65785ae87beb666c792513f2be7a3180fc544296841a0e27 + +Msg = 0b14a7484a40b68a3ce1273b8a48b8fdb65ba900d98541c4bbd07b97e31bcc4c85545a03e9deab3c563f47a036ff60d0361684ba241b5aa68bb46f440da22181ee328a011de98eff34ba235ec10612b07bdfa6b3dc4ccc5e82d3a8d057e1862fef3def5a1804696f84699fda2ec4175a54a4d08bcb4f0406fdac4eddadf5e29b +d = ed4df19971658b74868800b3b81bc877807743b25c65740f1d6377542afe2c6427612c840ada31a8eb794718f37c7283 +Qx = 33093a0568757e8b58df5b72ea5fe5bf26e6f7aeb541b4c6a8c189c93721749bcaceccf2982a2f0702586a9f812fc66f +Qy = ebe320d09e1f0662189d50b85a20403b821ac0d000afdbf66a0a33f304726c69e354d81c50b94ba3a5250efc31319cd1 +k = d9b4cd1bdfa83e608289634dbfcee643f07315baf743fc91922880b55a2feda3b38ddf6040d3ba10985cd1285fc690d5 +R = 009c74063e206a4259b53decff5445683a03f44fa67252b76bd3581081c714f882f882df915e97dbeab061fa8b3cc4e7 +S = d40e09d3468b46699948007e8f59845766dbf694b9c62066890dd055c0cb9a0caf0aa611fb9f466ad0bbb00dbe29d7eb + +Msg = 0e646c6c3cc0f9fdedef934b7195fe3837836a9f6f263968af95ef84cd035750f3cdb649de745c874a6ef66b3dd83b66068b4335bc0a97184182e3965c722b3b1aee488c3620adb835a8140e199f4fc83a88b02881816b366a09316e25685217f9221157fc05b2d8d2bc855372183da7af3f0a14148a09def37a332f8eb40dc9 +d = e9c7e9a79618d6ff3274da1abd0ff3ed0ec1ae3b54c3a4fd8d68d98fb04326b7633fc637e0b195228d0edba6bb1468fb +Qx = a39ac353ca787982c577aff1e8601ce192aa90fd0de4c0ed627f66a8b6f02ae51315543f72ffc1c48a7269b25e7c289a +Qy = 9064a507b66b340b6e0e0d5ffaa67dd20e6dafc0ea6a6faee1635177af256f9108a22e9edf736ab4ae8e96dc207b1fa9 +k = b094cb3a5c1440cfab9dc56d0ec2eff00f2110dea203654c70757254aa5912a7e73972e607459b1f4861e0b08a5cc763 +R = ee82c0f90501136eb0dc0e459ad17bf3be1b1c8b8d05c60068a9306a346326ff7344776a95f1f7e2e2cf9477130e735c +S = af10b90f203af23b7500e070536e64629ba19245d6ef39aab57fcdb1b73c4c6bf7070c6263544633d3d358c12a178138 + +[P-384,SHA-512] + +Msg = 67d9eb88f289454d61def4764d1573db49b875cfb11e139d7eacc4b7a79d3db3bf7208191b2b2078cbbcc974ec0da1ed5e0c10ec37f6181bf81c0f32972a125df64e3b3e1d838ec7da8dfe0b7fcc911e43159a79c73df5fa252b98790be511d8a732fcbf011aacc7d45d8027d50a347703d613ceda09f650c6104c9459537c8f +d = 217afba406d8ab32ee07b0f27eef789fc201d121ffab76c8fbe3c2d352c594909abe591c6f86233992362c9d631baf7c +Qx = fb937e4a303617b71b6c1a25f2ac786087328a3e26bdef55e52d46ab5e69e5411bf9fc55f5df9994d2bf82e8f39a153e +Qy = a97d9075e92fa5bfe67e6ec18e21cc4d11fde59a68aef72c0e46a28f31a9d60385f41f39da468f4e6c3d3fbac9046765 +k = 90338a7f6ffce541366ca2987c3b3ca527992d1efcf1dd2723fbd241a24cff19990f2af5fd6419ed2104b4a59b5ae631 +R = c269d9c4619aafdf5f4b3100211dddb14693abe25551e04f9499c91152a296d7449c08b36f87d1e16e8e15fee4a7f5c8 +S = 77ffed5c61665152d52161dc13ac3fbae5786928a3d736f42d34a9e4d6d4a70a02d5af90fa37a23a318902ae2656c071 + +Msg = 45db86829c363c80160659e3c5c7d7971abb1f6f0d495709bba908d7aa99c9df64b3408a51bd69aba8870e2aaff488ef138f3123cf94391d081f357e21906a4e2f311defe527c55e0231579957c51def507f835cceb466eb2593a509dcbee2f09e0dde6693b2bfe17697c9e86dd672f5797339cbe9ea8a7c6309b061eca7aef5 +d = 0a3f45a28a355381a919372f60320d6610cfb69c3e318eb1607db3cadfc42b728b77a6a9e9e333de9183c58933daf60f +Qx = 832cbb7061a719a316e73dbad348fa67cd17c33f40b9000a3d3b691a2a2cd821052566717c3ead01089b56086af1366f +Qy = 1e15a048d1dce642d9ebcbfac7f92b1bcee90fd0240cc79abd29e32e0e655c4ee1fd34fb88178bba92aca100e7794ed0 +k = 2a78e651623ba604c42cf094fc7d046629306f508853427ba091448800d1092c041bb2323035fc9d19a8d44950f7dcc3 +R = 0db0cc9a2bda8dd7e565ad36f91b1c5756d78164dc8a72a5bee4b6bc45ea38c7a16b01d05b1893d4e06b62db24c30385 +S = abd383edaeda7d0b8de1b54fcd3c28874fed62ab266f1f84c8ba796a7b54e5e0695fdb43ce7fe90ed00fa468d87bca64 + +Msg = 4672fce0721d37c5be166bffa4b30d753bcf104b9b414db994b3ed33f36af4935ea59a0bb92db66448b3f57dad4fc67cef10ce141bf82c536be604b89a0bc0e8bca605b867880049d97142d30538fc543bd9d4fab7fdbe2f703815cdb6361beb66acff764bc275f910d1662445b07b92830db69a5994857f53657ed5ca282648 +d = 2e408c57921939f0e0fe2e80ce74a4fa4a1b4fa7ab070206298fe894d655be50e2583af9e45544b5d69c73dce8a2c8e7 +Qx = a2b24a5ad4a2e91f12199ed7699e3f297e27bf8b8ea8fbe7ed28366f3544cd8e680c238450f8a6422b40829d6647b25c +Qy = 2732be0075536e6519f6a099b975a40f8e0de337fa4d48bd0762b43f41cab8deafdef9cfbb9973e457801e3bf9c93304 +k = b10b6258afdde81f9c971cc1526d942e20cafac02f59fee10f98e99b8674636bff1d84a6eaa49c0de8d8cfdc90d8ce84 +R = be428a8de89a364a134719141ee8d776a3a8338f1132b07e01b28573d8eaf3b9008b63304c48821e53638b6141f9660b +S = 866181dbef5c147d391bed6adcee408c339982c307adc718c2b9ab9e5642d8dedc36dd6402559a3ab614c99c1e56b529 + +Msg = 9ae48fdd9bfc5cb0f4d4761e28b2073bda05a3e3fe82c212e66701dc4573cc67a829b0f82d7520b1bf11db0c6d1743822bbe41bb0adbd7222aa5fae70fbd1a31f2d4453a01c81e064d775388468be96f6063f8673b7b8d4455fe1bd4c801ad5e625a015eaa4a1a18da490d2af8642201eaba3c611cbd65f861d8e19ca82a1ee6 +d = 1c285da72a8eb1c3c38faab8d3bb4e68dc95c797082b9a3991a21c1de54759071ecf2265fb1eff504ab24174bc6710cf +Qx = 11acb1b5cc59a4f1df1913a8d6e91cbdafb8206dc44aff7d9da45906b664fc33194d9935a82aa4d62f39618897c86025 +Qy = 832ed0b9575fff52a3603bfe89f312751b4c396da98324117a61b3f525d27b2266f6cfb22be07e50b6874435e380ed62 +k = 2513075e02cc7fb3cff7b7adde46da31c5493749b5cf02758bd5b098a838bfd4d5e4c7fb8268bdc37e219c30efebe878 +R = b3d638b3be45f14f170da5bdc22d2114deac93ab340a25b3af2b5c18584bb9147e00dc6c67a2274f79aa4838793eb63f +S = 876112bdca2c725eb2f6dbd76d07710a31f0c16d38430cb0817f320a25a9ecfec8a66137d0304612ae29a6a484fd3319 + +Msg = 817d6a110a8fd0ca7b4d565558f68b59a156744d4c5aac5c6610c95451793de2a756f774558c61d21818d3ebeeeb71d132da1c23a02f4b305eccc5cd46bd21dfc173a8a91098354f10ffbb21bf63d9f4c3feb231c736504549a78fd76d39f3ad35c36178f5c233742d2917d5611d2073124845f1e3615b2ef25199a7a547e882 +d = 9da37e104938019fbdcf247e3df879a282c45f8fb57e6655e36b47723af42bec3b820f660436deb3de123a21de0ca37b +Qx = 722d0ea6891d509b18b85ca56f74deb5c3030d2a30433824123d430d03c99279572c3b28ecf01e747b9db8acc55d0ba3 +Qy = 7e2605ea7092214f366f3639037bffd89fe103c646e990839d3a1ced8d78edb5b9bc60d834fd8e2a3c17e920bdae023a +k = c8c18e53a9aa5915288c33132bd09323638f7995cd89162073984ed84e72e07a37e18c4c023933eace92c35d10e6b1b6 +R = 6512a8a2be731e301dcf4803764297862bbfa0ac8daed64d8e98b34618ecb20520fc5d3cf890b7783edf86e7ea407541 +S = 4ff10301f7b4168fae066361376007c1d7aa89a75c87719d0b54711ffef5ef3726f3eef84f7ebc025c110bde511b17f6 + +Msg = 464f10ec6fb229a51db5fd0e122f2cb8a9a022117e2987f4007bf5565b2c16aba0714e2e3cdd0c100d55ac3017e36fc7501ad8309ab9572aa65424c9eb2e580a119c55777676ec498df53ef6ae78fd8a988130ee0e6082bf1ef71cd4c946021018a8ca7154d13b174c638912613b0bdb9001c302bf7e443ad2124ab2c1cce212 +d = 0661ab3bf9f7bef51bec7dff758de289154557beb9ce18cc4b8cc09a871e8322af259cf188b593dc62f03a19e75f7f69 +Qx = b4f100558043858efa728082d9b99ad5192b59b0947434f5ba7ff2514508a6d71ba54e7221c31cb0712103272b3f6fa4 +Qy = 34f6df4eeb2da11498044635067c2715ed15ae251c78ffb9030d87909ea8539b66394e93109ca54c0406cf99960c3e93 +k = 84a87137edb6894f96c5a8e94a3765162034feb84dfea94e1c71411170c285a80321ec7999e25861844143209804882c +R = 4dc9d1b949b36e3c3847ac1c7ed114e1bc9cbe76119cf6fcd3f1b69ee6ee54e3255f1bb288fe2f8bd6d4049a21793c27 +S = 56a561d647b62ccae1e6df818b1a6fbde66c82ef0ff69ee415f183e7daf76be22630c7e02cd3fd729dfa490f26824584 + +Msg = 4e3e0fb96320ddccde8b463c273654c4f7164920b1d63430921d2e808dee403e6420eedda0a557b911d00736a4f8798dd4ef26673efd6d190988ad4929ec64f8685cfb76070a36cd6a3a4bf2f54fb08a349d44642b6f614043fef9b2813b63457c76537d23da7b37310334f7ba76edf1999dad86f72aa3446445a65952ac4e50 +d = 66e7cfdeb7f264cf786e35210f458c32223c3a12a3bc4b63d53a5776bc9b069928452484f6241caa3781fd1a4109d4db +Qx = 3c7682de540ab231daf21bf9fc80bda6abf7e17dcc79d476c7b7c3bd4d42d386877fd8ba495c1b0333e04fb5fd2a1505 +Qy = 0a1582e4f4d72abea9d3476aff8369c41261f0c5dddf2ca82e10f7a163f73df09473d9e5e2552187104e4cc7c6d83611 +k = 2fa266f5cce190eb77614933ca6a55121ad8bae168ff7a9043d96d13b5ca2fe70101ff9fe1e2b2cd7413e6aa8f49abde +R = e7ecda9da0c52d0474a9f70094dc8f061d7d6a22210d3b69a7be8f389aa666f256322099b87d16ad35357ea856574dba +S = ba348eb40a2830ec5a1130264ac0a8675420b1ae243e808a778135809ece21f42c0c881166321102b4f02df4c5c7ed9d + +Msg = c466b6b6baf7e6ffa876ec06105e2d43534e0517c07b1c4c9fb67ba81ce09525a7721ec3c290f2b1f65b6463d41598e7a25b2238501629953a5ca955b644354fb6856733a2e5bb8f5bc21a0c803493f5539f9fb83aab3dba2c982989c2270c61ab244b68bfe1b948d00c2ed975e09c29b5f8a7effcad8652a148cc880d503217 +d = 92c2f7ee64af86d003ab484e12b82fcf245fc330761057fec5b7af8f7e0a2d85b468c21d171460fcb829cae7b986316d +Qx = ca43a306479bf8fb537d4b9ff9d635bbb2a0d60d9e854d5b7e269d09d91f78c6b90b616e4c931629453645a2bb371e14 +Qy = 356c4d7f10e690614eaf7f82ba0f9dc1aad98130c0ad9fe353deec565cc04bef789a0a4242322e0058b46cd02f2de77d +k = 6ec81fb74f8725ba225f317264460ee300cfd2f02092000989acbdad4799cf55c244a65c557113328fe20282e6badb55 +R = cd7a4309bcebc25a8e10899fe2eda5f8b2dbcf329cd2f3d65befd67393e83fba2f8a67a15c01a6ac8314f9f5e87a9dca +S = 6dcfc0426bc148e67e91d4784e3d7e9bc3b7ce3676be62daa7f3f55dfdff6d9dc735b5e3e0bbd0785db1f76f7ac065f3 + +Msg = feac892b7720af80b3c9eede51e923f18d3d0c5de4c31f4aa75e36df7c7c2fd8f41778851a24b69e67dccb65e159dd5c383243bad7cfedcc5e85c8a01c34b0b94ba8e07e4c024c09d279b3731e8b62f9562d3c4f5042567efe42a9d0eaaabab28bc6f11232fc8ceaaf4518d9f3b2bebf020294496b7f6b879e69503f75fecd3d +d = 15347caaad1067f1848a676bd0a8c52021ae604b79d02775a0459226e0391a3acd26653c916fcfe86149fb0ee0904476 +Qx = e5a0463163964d984f5bad0072d45bc2059939e60a826ccca36c151460ae360f5d6679f60fe43e999b6da5841c96e48a +Qy = 30f2dd425a3fa2c95d34124217250b39e3b4a14f3e6e415ae8e5b0409eb72f43f78b64d0ce6f2d49980d6f04cd1391db +k = 1a2d224db4bb9c241ca5cab18920fad615fa25c1db0de0f024cb3ace0d11ef72b056885446659f67650fdff692517b1c +R = 87b4de0fb21df38dfc9a4b1e350da67547e307f55b5b9dd6615e408afe7c3553a6e02722847367439e636074faa2182b +S = 375d965753b9ed6c6c08576726f8308c2f8dbd2737824464e71265d47907e26f615bbeb8203ec617520d4ecd1851dc44 + +Msg = cf2982e3bf174ce547741b969403cd11e9553067e6af8177d89511a0eb040db924530bdba65d8b1ff714228db0737c1756f509e1506014a10736e65be2f91980a73891496e90ff2714a3601c7565cdcef5a395e2e0e1652f138d90d61eaa9cba993b823245647f6e07cec9b8b4449cd68a29741cd1579c66e548ca0d0acf33aa +d = ac1cb5e59bda2eff3413a3bab80308f9fb32c595283c795de4c17fdae8d4647b5f108fd0801aee22adb7db129283b5aa +Qx = bc6b1a718284803553c173089c397870aaaecca579bb8e81a8cfa12473cd2057567fa8726a19ed427cc035baeec2c551 +Qy = 14f82997d1129b669f0015350e47ad561b1b13441af4fb44656f15ed0c5706984d66655accc52f2e943eef39cb1cdc21 +k = 8053a46e875f446056b06d4318fa3e8977622de7207cbf0996bf35b0e9b19aaa507f642bcf0be9f048f1af09806f6946 +R = a994eb15b64114ce8a9342d18b5edda96a6d76314a5ac03da723699177d352a4a9f3b7121b11a91e43a6af4025da51d6 +S = 8183ae33a888e99aa76882da0a6705ad102f2bbd9572fad0d2e4d6d70151970469e00c5220e59c14724d771c1384b302 + +Msg = bf9fdd4107ef5a6070108771ac9eee4f0c8043bf0d04db772a47294f4137e2439d94b337114b074e57e0cb78d0ccf352a2833e9788ee2a1a9ffeacd34f38fcefb86653d70c7dadd4cf6548d608e70acdef6c7530974b92c813798add659752a8c72b05e1ad9c65c21834ce6fbe49d8a1426b5a54270794436d284364fac6ec1a +d = 205f1eb3dfacff2bdd8590e43e613b92512d6a415c5951bda7a6c37db3aae39b9b7ec6edd256609e75373419087fa71f +Qx = c9f1f63a18c761b077a1ec35fbb2de635db9b8592c36194a01769b57728c7755d4c79b3d5b97a1a4631e30c86d03f13c +Qy = f8c4a38770054d5cc9bb9182e6d4638242c4fd16e869ac22e44c4b9402d594e0c6f5df6a9a7de32a4893d9f6588f1950 +k = ecd395c5d8b7d6e6b2b19644e0d2e6086c912c6a0f5b8ed4b94b7290b65852c9741ce8eeb08d8751ead8a183e17d76c6 +R = e81331d78b438b0b8d98c1be03385ba5d614af182f1677f259126cc3de7eaac6c19b02be955d936b6bf9c27c6796e6f0 +S = 17c2b7a8e0fc93909762aa9f86f9561e759ecb88f02337b2018363be6095d9e4324a6d3296046686624b5efad6b52878 + +Msg = 5d634fb39a2239256107dc68db19751540b4badac9ecf2fce644724401d6d632b3ae3b2e6d05746b77ddc0c899878032248c263eda08d3d004d35952ad7a9cfe19343d14b37f9f632245e7b7b5fae3cb31c5231f82b9f1884f2de7578fbf156c430257031ba97bc6579843bc7f59fcb9a6449a4cd942dffa6adb929cf219f0ad +d = e21e3a739e7ded418df5d3e7bc2c4ae8da76266a1fc4c89e5b09923db80a72217f1e96158031be42914cf3ee725748c1 +Qx = 0f753171922b5334f3dd2778a64ce2da8295121939beae71ad85e5344e893be0fd03cf14e1f031adec098e0c4409449c +Qy = 45c10a0ffc0eb2f1cec5c89b698061108313ee7d449ad580efad344f0e7cf35be8a18fca620f112e57bdc746abdace55 +k = d06bea06b25e6c30e866b1eb0657b45673e37b709013fb28fd7373afc8277cbc861354f821d0bd1927e52ec083a0f41f +R = e8d4a31dd0e7d2522be62a32608e744c3775ceb606dc897899f0c73f1a40ce9a8be854cd506e65cd81fd7fa2c616cb7b +S = 8151b681b6b6046d3c36f332d06d9ba7751e740631cdb759f88c50a25a8e950d5023df8a15c77243743733c4feaf21d5 + +Msg = c9b4ff721b3e886f0dc05856ffff0aabb64a8504b1746a47fdd73e6b7ebc068f06ac7ffa44c757e4de207fc3cbfaf0469d3ac6795d40630bcafe8c658627e4bc6b86fd6a2135afbc18ccc8e6d0e1e86016930ca92edc5aa3fbe2c57de136d0ea5f41642b6a5d0ddeb380f2454d76a16639d663687f2a2e29fb9304243900d26d +d = 93434d3c03ec1da8510b74902c3b3e0cb9e8d7dccad37594d28b93e065b468d9af4892a03763a63eae060c769119c23c +Qx = a52c25f2af70e5bc6a992ecef4ea54e831ed5b9453747d28aec5cffb2fcfee05be80c5cbab21606b5507aa23878adee1 +Qy = 2cf2a9afeff83f3041dc8a05f016ccae58aa1a0e0dc6be9d928e97f2598c9ba5e9718d5eb74c9cfb516fd8c09f55f5b9 +k = 13d047708ae5228d6e3bbada0e385afdb3b735b31123454fdf40afe3c36efed563fd2cce84dcc45c553b0993d9ca9ec3 +R = a0203f6f2c456baac03538ed506a182e57a25151802cf4b2557613b2fb615ebd4c50ddc505f87c048a45bad3b2fc371c +S = 0eab56457c4080400fa3af124761d5a01fef35f9649edba8b97d22116386f3b8b363e97ef3f82616d5d825df1cf865ef + +Msg = db2ad659cf21bc9c1f7e6469c5f262b73261d49f7b1755fc137636e8ce0202f929dca4466c422284c10be8f351f36333ebc04b1888cba217c0fec872b2dfc3aa0d544e5e06a9518a8cfe3df5b20fbcb14a9bf218e3bf6a8e024530a17bab50906be34d9f9bba69af0b11d8ed426b9ec75c3bd1f2e5b8756e4a72ff846bc9e498 +d = e36339ddbe8787062a9bc4e1540690915dd2a2f11b3fe9ee946e281a0a2cbed426df405ed9cb0eca42f85443efd09e0c +Qx = a1ffb4b790d1593e907369b69de10b93cddbb02c6131f787422364d9d692768ef8097970306cce16c97f2b10c538efa7 +Qy = d0692028601ea794d2563ffe9facc7273938fab47dd00b8960be15549a9c2b3f8552583eb4c6cd212fe486c159c79153 +k = 2226f7329378cecd697f36ae151546643d67760856854661e31d424fae662da910e2157da9bb6dfbe3622296e0b5710c +R = 20dcc25b67dd997621f437f65d78347fb57f8295b1b14453b1128203cda892bcfe726a2f107d30975d63172e56f11d76 +S = 51cff592cbef75ef8321c8fa1e4229c4298b8180e427bee4e91d1e24fc28a729cf296beb728960d2a58cf26773d8e2e2 + +Msg = dbd8ddc02771a5ff7359d5216536b2e524a2d0b6ff180fa29a41a8847b6f45f1b1d52344d32aea62a23ea3d8584deaaea38ee92d1314fdb4fbbecdad27ac810f02de0452332939f644aa9fe526d313cea81b9c3f6a8dbbeafc899d0cdaeb1dca05160a8a039662c4c845a3dbb07be2bc8c9150e344103e404411668c48aa7792 +d = 5da87be7af63fdaf40662bd2ba87597f54d7d52fae4b298308956cddbe5664f1e3c48cc6fd3c99291b0ce7a62a99a855 +Qx = 54c79da7f8faeeee6f3a1fdc664e405d5c0fb3b904715f3a9d89d6fda7eabe6cee86ef82c19fca0d1a29e09c1acfcf18 +Qy = 926c17d68778eb066c2078cdb688b17399e54bde5a79ef1852352a58967dff02c17a792d39f95c76d146fdc086fe26b0 +k = 1b686b45a31b31f6de9ed5362e18a3f8c8feded3d3b251b134835843b7ae8ede57c61dc61a30993123ac7699de4b6eac +R = 9dbfa147375767dde81b014f1e3bf579c44dd22486998a9b6f9e0920e53faa11eed29a4e2356e393afd1f5c1b060a958 +S = e4d318391f7cbfe70da78908d42db85225c85f4f2ff413ecad50aad5833abe91bdd5f6d64b0cd281398eab19452087dd + + +[P-521,SHA-224] + +Msg = 58ec2b2ceb80207ff51b17688bd5850f9388ce0b4a4f7316f5af6f52cfc4dde4192b6dbd97b56f93d1e4073517ac6c6140429b5484e266d07127e28b8e613ddf65888cbd5242b2f0eee4d5754eb11f25dfa5c3f87c790de371856c882731a157083a00d8eae29a57884dbbfcd98922c12cf5d73066daabe3bf3f42cfbdb9d853 +d = 1d7bb864c5b5ecae019296cf9b5c63a166f5f1113942819b1933d889a96d12245777a99428f93de4fc9a18d709bf91889d7f8dddd522b4c364aeae13c983e9fae46 +Qx = 1a7596d38aac7868327ddc1ef5e8178cf052b7ebc512828e8a45955d85bef49494d15278198bbcc5454358c12a2af9a3874e7002e1a2f02fcb36ff3e3b4bc0c69e7 +Qy = 184902e515982bb225b8c84f245e61b327c08e94d41c07d0b4101a963e02fe52f6a9f33e8b1de2394e0cb74c40790b4e489b5500e6804cabed0fe8c192443d4027b +k = 141f679033b27ec29219afd8aa123d5e535c227badbe2c86ff6eafa5116e9778000f538579a80ca4739b1675b8ff8b6245347852aa524fe9aad781f9b672e0bb3ff +R = 06b973a638bde22d8c1c0d804d94e40538526093705f92c0c4dac2c72e7db013a9c89ffc5b12a396886305ddf0cbaa7f10cdd4cd8866334c8abfc800e5cca365391 +S = 0b0a01eca07a3964dd27d9ba6f3750615ea36434979dc73e153cd8ed1dbcde2885ead5757ebcabba117a64fcff9b5085d848f107f0c9ecc83dfa2fa09ada3503028 + +Msg = 2449a53e0581f1b56d1e463b1c1686d33b3491efe1f3cc0443ba05d65694597cc7a2595bda9cae939166eb03cec624a788c9bbab69a39fb6554649131a56b26295683d8ac1aea969040413df405325425146c1e3a138d2f4f772ae2ed917cc36465acd66150058622440d7e77b3ad621e1c43a3f277da88d850d608079d9b911 +d = 17e49b8ea8f9d1b7c0378e378a7a42e68e12cf78779ed41dcd29a090ae7e0f883b0d0f2cbc8f0473c0ad6732bea40d371a7f363bc6537d075bd1a4c23e558b0bc73 +Qx = 0156cd2c485012ea5d5aadad724fb87558637de37b34485c4cf7c8cbc3e4f106cb1efd3e64f0adf99ddb51e3ac991bdd90785172386cdaf2c582cc46d6c99b0fed1 +Qy = 1edeeda717554252b9f1e13553d4af028ec9e158dbe12332684fc1676dc731f39138a5d301376505a9ab04d562cc1659b0be9cb2b5e03bad8b412f2699c245b0ba2 +k = 1dc3e60a788caa5f62cb079f332d7e5c918974643dca3ab3566a599642cd84964fbef43ce94290041fe3d2c8c26104d9c73a57a7d4724613242531083b49e255f33 +R = 12592c0be6cce18efb2b972cd193d036dcb850f2390fa8b9b86b2f876548bc424fb3bc13c1e5c415fa09d0ecfcae5bf76fb23e8322d7eecb264a2ae6d20ef50d405 +S = 11bc9713be88e3b9912a3e5f5d7b56f20573e979b1a75d04ce339f724bddffa4665d25995fe24d32507d8a07c5e10169f5338ef2827737f7b0291752b21237217e3 + +Msg = 7ba05797b5b67e1adfafb7fae20c0c0abe1543c94cee92d5021e1abc57720a6107999c70eacf3d4a79702cd4e6885fa1b7155398ac729d1ed6b45e51fe114c46caf444b20b406ad9cde6b9b2687aa645b46b51ab790b67047219e7290df1a797f35949aaf912a0a8556bb21018e7f70427c0fc018e461755378b981d0d9df3a9 +d = 135ea346852f837d10c1b2dfb8012ae8215801a7e85d4446dadd993c68d1e9206e1d8651b7ed763b95f707a52410eeef4f21ae9429828289eaea1fd9caadf826ace +Qx = 18d40cc4573892b3e467d314c39c95615ee0510e3e4dbc9fa28f6cd1f73e7acde15ad7c8c5339df9a7774f8155130e7d1f8de9139ddd6dfe1841c1e64c38ea98243 +Qy = 17021782d33dc513716c83afe7ba5e7abef9cb25b31f483661115b8d6b5ae469aaf6f3d54baa3b658a9af9b6249fd4d5ea7a07cb8b600f1df72b81dac614cfc384a +k = 0c24acc1edb3777212e5b0bac744eadf4eda11fa150753b355bf96b189e6f57fc02284bb22d8b3cd8bba7a09aae9f4ea955b382063425a6f8da2f99b9647b147172 +R = 183da7b8a9f9d5f08903359c1a2435b085fcf26a2ed09ab71357bb7634054acc569535e6fe81d28233e4703005fc4bf83ce794d9463d575795aa0f03398e854cefd +S = 0b3621145b9866ab7809139795cc30cd0404127a7f0fafa793660491009f6c53724fdb0b1ffbf0fd51c131180b8a957fe66e76d2970247c024261c768dee9abbfb9 + +Msg = 716dabdb22a1c854ec60420249905a1d7ca68dd573efaff7542e76f0eae54a1828db69a39a1206cd05e10e681f24881b131e042ed9e19f5995c253840e937b809dfb8027fed71d541860f318691c13a2eb514daa5889410f256305f3b5b47cc16f7a7dad6359589b5f4568de4c4aae2357a8ea5e0ebaa5b89063eb3aa44eb952 +d = 1393cb1ee9bfd7f7b9c057ecc66b43e807e12515f66ed7e9c9210ba1514693965988e567fbad7c3f17231aacee0e9b9a4b1940504b1cd4fd5edfaa62ba4e3e476fc +Qx = 1e855c935139c8092092cfa733db1292530506eeb2bbb1687f9602c36d97a6714e998892d5d3b842d1896a6ece9d549e9792881a256256137b3dff180c96cc5d07b +Qy = 18d83b6e93cd287311f7bf7c1d7f9eeabcf0b69c12f2d8f40e333e81e956d968532a37a4c04d761874df293b484cd7053b03fdbc2fdcd3b4c412d6f272fb7c93fe6 +k = 1d98619bdc04735d30c222fc67da82c069aea5f449af5e8c4db10c1786c0cb9e6f2cc0bb66fa6be18c485570d648dafcd0a973c43d5c94e9a9dacbd3170e53fa2a0 +R = 0bf47fabe107ce0ec03e2ad60a79b058e1bebb18568b6a8cdbe86032e71aa30c15766105b2ea952cfa79bcab046df601159f96e179bbcf252dc68ac73d31481fdae +S = 1f918fec69cd07d90f9d892b7117e7519c3224947f4262f1fd97077dd5386a6c78aeddff3ee97e59ea353f06029f1336f0d6ef5c0f4b17ca59343a55319b7bfc3db + +Msg = 9cc9c2f131fe3ac7ea91ae6d832c7788cbbf34f68e839269c336ceef7bef6f20c0a62ea8cc340a333a3002145d07eba4cf4026a0c4b26b0217a0046701de92d573d7c87a386a1ea68dc80525b7dcc9be41b451ad9f3d16819e2a0a0b5a0c56736da3709e64761f97cae2399de2a4022dc4c3d73c7a1735c36dbde86c4bc5b6f7 +d = 179fa164e051c5851e8a37d82c181e809a05fea9a3f083299b22684f59aa27e40dc5a33b3f7949338764d46bfe1f355134750518b856d98d9167ef07aac3092c549 +Qx = 1857cc7bbed20e87b3fd9a104956aa20c6502192910e0e7598410526ebfe1c99397b85189612a60c51fb8f4dd5cb08a8cd2e702563062dcb043410715c5323a0046 +Qy = 1fce8d135284310d2f38c216030634b32cd223222f0d9d8d2b7c55477c4b8b74fc6c96a6092f34b05ca44d3633a5037c2166c479a032bb4f949f89fc1ba5236d07d +k = 16d9704c0cee791f2938bb2a8a595752a3635c2f557efeecefd719414b5f2aaf846080f582c76eae7a8fddf81859b49d0131c212524d55defa67dca1a9a28ca400f +R = 1c9a4e51774384e8362876a87c572e6463a54413c7c6252c552ebb182f83e45ace436ade4ca373d8a7216e83efb62c8b41c4d5132a0afa65078f16d189baca39187 +S = 1e92a7dd5fea29a666398e1df5775cbb5664fe6943fe4c1d2bba516b7543c84df584458e53919c4ffab579a26fb3c892a5d1a77b0a07428c89350f8b559e627b014 + +Msg = 14c69f8d660f7a6b37b13a6d9788eff16311b67598ab8368039ea1d9146e54f55a83b3d13d7ac9652135933c68fafd993a582253be0deea282d86046c2fb6fd3a7b2c80874ced28d8bed791bd4134c796bb7baf195bdd0dc6fa03fdb7f98755ca063fb1349e56fd0375cf94774df4203b34495404ebb86f1c7875b85174c574c +d = 13dabca37130ba278eae2b3d106b5407711b0d3b437fbf1c952f0773571570764d2c7cb8896a8815f3f1975b21adc6697898e5c0a4242092fc1b80db819a4702df4 +Qx = 0bc2aebf40cd435bc37d73c09d05f2fd71321111a767c2b0d446f90dd4a186839c694ceb734e027e7ee948f0f63e4d3f1656d3d543df23c342a599306909b347109 +Qy = 1f4c98ac03f0718e58d5d1762c920445b11dbdd60ec7f60095809204e14965a4ecb0be6fea06adbac8ba431d6f144c75c199225df2a619a34be99897125b3a10af8 +k = 0401187c8b89945a1e48cda9ee52167789f4121e67482a7ac797899f5d3d2e623aed31e4adae08a8d43e69028fa074d2650317cbc765f6ed191cf0317b4bae57881 +R = 1e572afed754016fba43fc33e352932c4db65efcb84e2bd159b40fc5925893b161effc40240be28d8c07154d2615f605c6f0451b976522d95afd37f46602df7a12a +S = 030370c1c5352c2b663ac1858b42f69545b2f58ed5b2c007f303726977d3c756b5d644ec6788f94c886f78269aa190a3d8d1ae10e4fd24d937c4556fb9e1953fd6d + +Msg = 8d8e75df200c177dbfe61be61567b82177ea5ec58e2781168d2277d2fd42668f01248ca3eb29ffa2689b12ae40f9c429532b6d2e1f15891322b825a0a072a1c68fa09e78cfdef3e95ed6fdf7233a43cb68236560d49a3278f0b3f47cb08f475bd9ab2f60755ea4a1767de9313b71a1b9ea87ef33f34682efbda263b0f8cc2f52 +d = 198681adbde7840d7ccd9cf1fb82056433fb4dd26bddf909af7b3b99da1ca2c05c8d4560ecd80ba68f376f8b487897e374e99a9288ed7e3645cc0d00a478aae8d16 +Qx = 057ce3777af7032f1f82308682e71fe09f88bf29dacd5018a725e1caa4b1e2bfdd894fe618f9266f31ba089856dc9c1b70e4a2faa08b4b744d1aafcd5ae99e2c736 +Qy = 199bcfef2021bc5890d7d39ec5dc0c26956801e84cae742cf6c50386eb289b6e97754dd25a94abf81f1cb1b36935b5eb29f4b32a6516d2ff6a7d23064a0daec94b3 +k = 19d2d74ad8ee2d85048f386998a71899ef6c960b4ab324e5fd1c0a076c5a632fd0009500076522e052c5c9806eef7056da48df6b16eb71cdf0f1838b0e21715fce0 +R = 18ecacbcffd5414bbb96728e5f2d4c90178e27733d13617e134ec788022db124374bbaa11e2c77fe3f38d1af6e998e1b0266b77380984c423e80ffa6ff2bcafd57a +S = 1c727f34b6a378f3087721a54e9796499b597ecf6666b8f18312d67e1190a8a66e878efc2367b551267494e0245979ef4deed6d2cbf2c3711af6d82ccfeb101a377 + +Msg = 10631c3d438870f311c905e569a58e56d20a2a560e857f0f9bac2bb7233ec40c79de145294da0937e6b5e5c34fff4e6270823e5c8553c07d4adf25f614845b2eac731c5773ebbd716ab45698d156d043859945de57473389954d223522fbafecf560b07ef9ba861bcc1df9a7a89cdd6debf4cd9bf2cf28c193393569ccbd0398 +d = 08c4c0fd9696d86e99a6c1c32349a89a0b0c8384f2829d1281730d4e9af1df1ad5a0bcfccc6a03a703b210defd5d49a6fb82536f88b885776f0f7861c6fc010ef37 +Qx = 164ac88ed9afe137f648dd89cdd9956682830cac5f7c1a06d19a1b19f82bb1d22dfeefea30d35c11202fed93fd5ce64835d27c6564d6e181287fa04a2d20994986b +Qy = 05cb83669265f5380ccefe6b4f85fdf0049e6703f6f378a0b2e52ed0fbbcf300afebb722f4ed48e3819cb976c1d60e2ba05646b478f6dfecfbae730e9644c297f00 +k = 189801432cba9bf8c0763d43b6ec3b8636e62324587a4e27905b09a58e4aa66d07d096dbce87824e837be1c243dd741f983c535a5dd2f077aac8beee9918258d3cb +R = 0917723f7241e8dc7cd746b699ab621d068dd3a90e906aaf0a4862744b96fd4e5ccdb9c7796c27f7196e693d06ec209464c3ea60ad6313e9b77cceaa14767e6651c +S = 0957b0ecdc3668f6efa5d0957615bcfffd6419c5e57579b74f960f65ae3fb9e8284322ff710b066f7e0959ac926d3cf9a594bdb70bbec756c96910b26a2486dee9e + +Msg = 80aad6d696cbe654faa0d0a24d2f50d46e4f00a1b488ea1a98ed06c44d1d0c568beb4ab3674fc2b1d2d3da1053f28940e89ba1244899e8515cabdd66e99a77df31e90d93e37a8a240e803a998209988fc829e239150da058a300489e33bf3dcdaf7d06069e74569fee77f4e3875d0a713ccd2b7e9d7be62b34b6e375e84209ef +d = 1466d14f8fbe25544b209c5e6a000b771ef107867e28ed489a42015119d1aa64bff51d6b7a0ac88673bbc3618c917561cff4a41cdb7c2833dab5ebb9d0ddf2ca256 +Qx = 1dc8b71d55700573a26af6698b92b66180cf43e153edadb720780321dbb4e71d28e0a488e4201d207fc4848fe9dd10dcabec44492656a3ff7a665fe932445c82d0b +Qy = 1920b16331b7abeb3db883a31288ef66f80b7728b008b3cc33e03a68f68d9e653a86e3177bbc00014fa5ea4c1608c0d455c2e2ac7bd8ab8519ebf19955edf1baf8d +k = 160d04420e0d31b0df476f83393b1f9aff68389cc3299e42ef348d97646f7531a722b66ddfb9501bbb5c4a41d84c78be7233b11489bceb817d23060e6017433fab8 +R = 08077aabd0a342f03f912007c586cfedfc63f93d1118f720d5b62b3ce141a60f86f111dfd8fc2e31a6778981f1a5e28f29a7369bd7897bb41240c8d3a9c170e0ee0 +S = 00abc75fc154b93840579457820957e89d1260fee0a4b9bb1946f61ca1e71afd76bb5e1077b3e38ceb39d1fac5ef8b217c4110617b3ad118e02b3fcc2a39ef38613 + +Msg = 8a7792a2870d2dd341cd9c4a2a9ec2da753dcb0f692b70b64cef2e22071389c70b3b188dea5f409fb435cbd09082f59de6bc2ff9e65f91b7acc51e6e7f8e513148cb3c7c4664f227d5c704626b0fda447aa87b9d47cd99789b88628eb642ed250312de5ba6b25f3d5342a3cbb7ebd69b0044ee2b4c9ba5e3f5195afb6bea823d +d = 01a99fcf54c9b85010f20dc4e48199266c70767e18b2c618044542cd0e23733817776a1a45dbd74a8e8244a313d96c779f723013cd88886cb7a08ef7ee8fdd862e7 +Qx = 1912d33b01d51e2f777bdbd1ada23f2b1a9faf2be2f2a3b152547db9b149b697dd71824ca96547462e347bc4ef9530e7466318c25338c7e04323b1ba5fd25ea7162 +Qy = 0bbe9b1e3a84accd69b76b253f556c63e3f374e3de0d1f5e3600fc19215533b2e40d6b32c3af33314d223ea2366a51d1a337af858f69326389276f91be5c466e649 +k = 14fafd60cb026f50c23481867772411bb426ec6b97054e025b35db74fe8ea8f74faa2d36e7d40b4652d1f61794878510b49b7b4fe4349afccd24fc45fec2fd9e9e7 +R = 18b1df1b6d7030a23a154cacce4a2e3761cc6251ff8bf6c9f6c89d0a15123baef9b338ada59728349ce685c03109fcde512ed01a40afd2ca34e1bc02ecf2871d45c +S = 0a399f9b9e21aeddf450429fec2dc5749e4a4c7e4f94cee736004dcc089c47635da22845992cd076a4f0a01d2cc1b0af6e17b81a802361699b862157ad6cad8bd1d + +Msg = f971bcd396efb8392207b5ca72ac62649b47732fba8feaa8e84f7fb36b3edb5d7b5333fbfa39a4f882cb42fe57cd1ace43d06aaad33d0603741a18bc261caa14f29ead389f7c20536d406e9d39c34079812ba26b39baedf5feb1ef1f79990496dd019c87e38c38c486ec1c251da2a8a9a57854b80fcd513285e8dee8c43a9890 +d = 1b6015d898611fbaf0b66a344fa18d1d488564352bf1c2da40f52cd997952f8ccb436b693851f9ccb69c519d8a033cf27035c27233324f10e9969a3b384e1c1dc73 +Qx = 110c6177ceb44b0aec814063f297c0c890671220413dbd900e4f037a67d87583eaf4b6a9a1d2092472c17641362313c6a96f19829bb982e76e3a993932b848c7a97 +Qy = 0f6e566c4e49b2ee70a900dc53295640f3a4a66732df80b29f497f4ae2fa61d0949f7f4b12556967bb92201a4f5d1384d741120c95b617b99c47a61e11c93a482d6 +k = 1a88667b9bdfe72fb87a6999a59b8b139e18ef9273261549bc394d884db5aa64a0bc7c7d38a8ef17333478d2119d826e2540560d65f52b9a6dc91be1340cfd8f8f8 +R = 015f73def52ea47ddb03e0a5d154999642202e06e6734ac930c1dc84756c67bbb1cca9f21f92d61bfdb2052c5dd2833349610f68139393d77250a7662ef7bd17cbe +S = 155c744a729f83b27d1f325a91e63a0d564fe96ff91eaa1bad3bff17d2abffa065d14a1d20a04dd993f6ed3260b60bcc6401e31f6bc75aaafe03e8c1a9cd14d2708 + +Msg = ec0d468447222506b4ead04ea1a17e2aa96eeb3e5f066367975dbaea426104f2111c45e206752896e5fa7594d74ed184493598783cb8079e0e915b638d5c317fa978d9011b44a76b28d752462adf305bde321431f7f34b017c9a35bae8786755a62e746480fa3524d398a6ff5fdc6cec54c07221cce61e46fd0a1af932fa8a33 +d = 05e0d47bf37f83bcc9cd834245c42420b68751ac552f8a4aae8c24b6064ae3d33508ecd2c17ec391558ec79c8440117ad80e5e22770dac7f2017b755255000c853c +Qx = 1a6effc96a7f23a44bf9988f64e5cfafdae23fa14e4bee530af35d7a4ddf6b80dcd0d937be9dd2db3adcda2f5216fecbce867ee67e7e3773082f255156e31358c2f +Qy = 1e7760190dfbe07ec2df87067597087de262c1e0a12355456faba91b2e7277050d73b924e14c0e93b8457a8b3e1f4207ce6e754274f88ad75c000d1b2977edc9c1a +k = 18afea9a6a408db1e7a7bb1437a3d276f231eacfc57678bfa229d78681cbe4e800e6065332a3128db65d3aa446bb35b517dca26b02e106e1311881a95b0302d15e8 +R = 01c49b3c1d21f1678bdbe1ac12167e95e06617190bdee1a729c1c649210da19e2e210f6689e1310513bfe2ac6c0f4ee5f324f344b31b18df341eaadb826d07adc9b +S = 129d4931ba457443012f6ffecd002f2abc3a4b65a58fee8457917ebcf24b29a1d3055b7fc62939a74ebb0c3582172ee7c3c75e0b2fa2367c6e04df63a7a91d593ad + +Msg = d891da97d2b612fa6483ee7870e0f10fc12a89f9e33d636f587f72e0049f5888782ccde3ea737e2abca41492bac291e20de5b84157a43c5ea900aef761006a4471072ab6ae6d515ffe227695d3ff2341355b8398f72a723ae947f9618237c4b6642a36974860b452c0c6202688bc0814710cbbff4b8e0d1395e8671ae67ada01 +d = 1804ab8f90ff518b58019a0b30c9ed8e00326d42671b71b067e6f815ac6752fa35016bd33455ab51ad4550424034419db8314a91362c28e29a80fbd193670f56ace +Qx = 0a79529d23a832412825c3c2ad5f121c436af0f29990347ecfa586ce2e57fd3c7e0624d8db1f099c53473dbc2578f85416ad2ac958a162051014fb96bf07f9e1d17 +Qy = 17c0750f26df0c621d2d243c6c99f195f0086947b1bf0f43731555f5d677e2d4a082fb5fe8da87e1592a5fa31777da3299cede5a6f756edf81c85b77853388bb3ab +k = 042d7c36fec0415bc875deb0fab0c64548554062e618aee3aa6670ffd68ab579fe620d3a9316357267fd3111c0ed567dca663acd94b646d2ba0771953cd9690ef42 +R = 0d01dfbef126febbdfa03ef43603fd73bc7d2296dce052216e965fed7bb8cbbc24142bfcddb60c2e0bef185833a225daa0c91a2d9665176d4ad9986da785f4bfcf0 +S = 16627e2614dbcd371693c10bbf579c90c31a46c8d88adf59912c0c529047b053a7c7715142f64dcf5945dbc69ff5b706c4b0f5448d04dd1f0b5a4c3765148bf253d + +Msg = 924e4afc979d1fd1ec8ab17e02b69964a1f025882611d9ba57c772175926944e42c68422d15f9326285538a348f9301e593e02c35a9817b160c05e21003d202473db69df695191be22db05615561951867f8425f88c29ba8997a41a2f96b5cee791307369671543373ea91d5ed9d6a34794d33305db8975b061864e6b0fe775f +d = 0159bff3a4e42b133e20148950452d99681de6649a56b904ee3358d6dd01fb6c76ea05345cb9ea216e5f5db9ecec201880bdff0ed02ac28a6891c164036c538b8a8 +Qx = 12d7f260e570cf548743d0557077139d65245c7b854ca58c85920ac2b290f2abfeccd3bb4217ee4a29b92513ddce3b5cbf7488fb65180bb74aeb7575f8682337ef5 +Qy = 17560186230c7e8bff0bffce1272afcd37534f317b453b40716436a44e4731a3ec90a8f17c53357bc54e6ff22fc5b4ca892321aa7891252d140ece88e25258b63d5 +k = 14b8a30f988cefdc0edec59537264edb0b697d8c4f9e8507cf72bc01c761304bd2019da1d67e577b84c1c43dd034b7569f16635a771542b0399737025b8d817e1c3 +R = 0fc50939ebca4f4daa83e7eaf6907cb08f330c01d6ea497b86becda43dfcad47cb5c48f5eb2cc924228628070bcd144088c449a7873242ba86badf796097dbecd6d +S = 0ccb6463c4301ba5c043e47ed508d57dd908fd0d533af89fd3b11e76343a1cf2954ce90b0eb18cbc36acd6d76b3906612d8a0feec6ebed13d88650ed9c708b28a11 + +Msg = c64319c8aa1c1ae676630045ae488aedebca19d753704182c4bf3b306b75db98e9be438234233c2f14e3b97c2f55236950629885ac1e0bd015db0f912913ffb6f1361c4cc25c3cd434583b0f7a5a9e1a549aa523614268037973b65eb59c0c16a19a49bfaa13d507b29d5c7a146cd8da2917665100ac9de2d75fa48cb708ac79 +d = 17418dfc0fc3d38f02aa06b7df6afa9e0d08540fc40da2b459c727cff052eb0827bdb3d53f61eb3033eb083c224086e48e3eea7e85e31428ffe517328e253f166ad +Qx = 00188366b9419a900ab0ed9633426d51e25e8dc03f4f0e7549904243981ec469c8d6d938f6714ee620e63bb0ec536376a73d24d40e58ad9eb44d1e6063f2eb4c51d +Qy = 09889b9203d52b9243fd515294a674afd6b81df4637ffdddc43a7414741eda78d8aa862c9cbbb618acec55bb9a29aac59616fc804a52a97a9fc4d03254f4469effe +k = 1211c8824dcbfa0e1e15a04779c9068aed2431daeac298260795e6a80401f11f6d52d36bcee3cfa36627989c49d11475163aa201d2cd4c5394144a6bb500bbaf02b +R = 1d59401b8ac438855d545a699991142685077a409de2418c7ccfe01a4771b3870e76287a9654c209b58a12b0f51e8dc568e33140a6b630324f7ef17caa64bf4c139 +S = 143af360b7971095b3b50679a13cd49217189eaee4713f4201720175216573c68f7ac6f688bfe6eb940a2d971809bf36c0a77decc553b025ed41935a3898685183b + +[P-521,SHA-256] + +Msg = 8ab8176b16278db54f84328ae0b75ef8f0cd18afdf40c04ad0927ed0f6d9e47470396c8e87cde7a9be2ffbfe6c9658c88b7de4d582111119c433b2e4a504493f0a1166e3a3ea0d7b93358f4a297d63f65a5e752f94e2ee7f49ebcc742fa3eb03a617d00c574245b77a20033854d82964b2949e2247637239ab00baf4d170d97c +d = 1e8c05996b85e6f3f875712a09c1b40672b5e7a78d5852de01585c5fb990bf3812c3245534a714389ae9014d677a449efd658254e610da8e6cad33414b9d33e0d7a +Qx = 07d042ca19408524e68b981f1419351e3b84736c77fe58fee7d11317df2e850d960c7dd10d10ba714c8a609d163502b79d682e8bbecd4f52591d2748533e45a867a +Qy = 197ac6416111ccf987d290459ebc8ad9ec56e49059c992155539a36a626631f4a2d89164b985154f2dddc0281ee5b5178271f3a76a0914c3fcd1f97be8e8376efb3 +k = 0dc8daaacddb8fd2ff5c34a5ce183a42261ad3c64dbfc095e58924364dc47ea1c05e2599aae917c2c95f47d6bb37da008af9f55730ddbe4d8ded24f9e8daa46db6a +R = 09dd1f2a716843eedec7a6645ac834d4336e7b18e35701f06cae9d6b290d41491424735f3b57e829ad5de055eaeef1778f051c1ee152bf2131a081e53df2a567a8a +S = 02148e8428d70a72bc9fa986c38c2c97deda0420f222f9dc99d32c0acba699dc7ba0a2b79ce5999ff61bd0b233c744a893bc105bca5c235423e531612da65d72e62 + +Msg = c4bc2cec829036469e55acdd277745034e4e3cc4fcd2f50ec8bd89055c19795a1e051ccf9aa178e12f9beab6a016a7257e391faa536eaa5c969396d4e1ade36795a82ebc709d9422de8497e5b68e7292538d4ccdc6dd66d27a3ece6a2844962b77db073df9489c9710585ba03d53fa430dbc6626dc03b61d53fc180b9af5dea6 +d = 0b65bf33b2f27d52cbfabcadce741e691bf4762089afd37964de1a0deda98331bf8c74020a14b52d44d26e2f6fa7bcddbe83be7db17a0c8a1b376469cf92c6da27c +Qx = 10038bb9a7aea626de68c14c64243150e72c69e2f8a1ab922bfbdaa6f33d24fb4542c0324357b0dd640bbcd07632ecd253f64ca2bfbfbf3de9b24fffd0568ab82da +Qy = 0faf867d95308cc36d6f46844a0f535dc70f9768eed011a2464d2f308fa1d8e72c3616aec7e70516908183ffce7fdd36984a15f73efaa3858c2edf16a784d40e6c2 +k = 14aeb96c57d99677a1f5e4588064215e7e9af4027bfb8f31ff6126dbf341b8e6f719465e4273e91ba32670feca802549808322b7ee108bb20653cf20f93284d365f +R = 075ead62edf7d86c5d1bc2443d1aeb5dc034fd999e6ea012cef7499d9d050cd97d262095884e9fc89a42e15bd3dee80fe3c1ba10f4caabc4aabb86347023028b663 +S = 129a992a6ff66d41948d11fa680f732b1a74315b804c982805190ed9d2fae223f2b149980b9241998cdea0c5672595a8a49d5186a0ef7a46c0a376f925bdda81726 + +Msg = 1c1b641d0511a0625a4b33e7639d7a057e27f3a7f818e67f593286c8a4c827bb1f3e4f399027e57f18a45403a310c785b50e5a03517c72b45ef8c242a57b162debf2e80c1cf6c7b90237aede5f4ab1fcaf8187be3beb524c223cc0ceff24429eb181a5eea364a748c713214880d976c2cd497fd65ab3854ad0d6c2c1913d3a06 +d = 02c4e660609e99becd61c14d043e8b419a663010cc1d8f9469897d7d0a4f076a619a7214a2a9d07957b028f7d8539ba7430d0b9a7de08beeeae8452d7bb0eac669d +Qx = 0fb3868238ca840dbb36ecc6cf04f5f773ea0ab8e8b0fdcf779dc4039a8d7146a417504e953c0cb5e7f4e599cc2c168deda8b7f16084b5582f89f2ece4cae5167f7 +Qy = 1f90b5c15eeda48e747cf3ee8183166a49dbfac6161cbd09d29d40a6854f4c495e88a435892a920cdaad20d41985890b648badd4f0a858ffcbd9afdfc23134ede18 +k = 1f875bbf882cd6dd034a87916c7b3ba54b41b2ea2ce84ebaf4e393fcf7291fee09dec2b5bb8b6490997c9e62f077c34f0947fe14cec99b906dd6bf0b5d301e75ca1 +R = 07aa70425697736b298233249f5d0cf25c99e640c9ff88035ef1804820e1bfe7d043755f02d7a079494f7fa6dc26740c4e6b7b430c63f29c67bbd3a5c88d2f0e8d1 +S = 0e0d42e4ff11cf5be37a9fda348514d5097a662f214687cbfb28ff42d635b13029871ca4f464bb1fbce02d5da4d5fb61b2a071844259fc863d136197bec3a61e7c7 + +Msg = adb5f069b2b501a3ebb83d4f1808eb07710ac4a7b12532996855a20bcc54b2f76812915f632163c3654ff13d187d007152617cf859200194b59c5e81fc6cc9eb1ceb75d654050f260caa79c265254089270ccd02607fdcf3246119738c496dc3a4bd5d3be15789fc3d29a08d6d921febe2f40aef286d5d4330b07198c7f4588e +d = 17c3522007a90357ff0bda7d3a36e66df88ca9721fb80e8f63f50255d47ee819068d018f14c6dd7c6ad176f69a4500e6f63caf5cf780531004f85009c69b9c1230c +Qx = 13a4bea0eed80c66ea973a9d3d4a90b6abbb5dee57d8affaf93390a8783a20982eba644d2e2809f66530adeeee7f9a1da7515447e9ba118999f76f170c375f621f7 +Qy = 12f9dfaee40a75d8442b39b37a5c19ea124b464236e9b9a31bae6780cfd50f7ea4a700154b5ea0feeb64e9b35a1b0e33e46900cca1f34d13bb17e5017769841af27 +k = 18388a49caeda35859ef02702c1fd45ff26991998bd9d5e189c12c36cdae3f642ddd4a79561bd1d3e1cd9359de8f5c9e1604a312d207a27b08a6033f2741794ced5 +R = 15c6264795837dfea19f91876455f564f073c5c84a3c9d76e67872ae0447ba0d4850d8721302b25bec7ebfedd2721de140b2f3dead547042b24b0876117e7093cc1 +S = 060eb74236c189a28ed20bd0822eb22d75f7d97c9043a3c8e3f6d4c90bc8ca02ac4d37c1171c799a1c7dfd2fcbf83406b5e48c051e0fbf0fd937bfe6c3db4e18154 + +Msg = f253484d121d1ce8a88def6a3e9e78c47f4025ead6f73285bf90647102645b0c32d4d86742a50b8b7a42d5f6156a6faf588212b7dc72c3ffd13973bdba732b554d8bffc57d04f8167aef21ee941ee6ffb6cce0f49445bd707da8deb35dca650aaf761c3aa66a5ebccddd15aee21293f63061a7f4bfc3787c2cd62c806a1a9985 +d = 0c4dad55871d3bd65b016d143ddd7a195cc868b3048c8bbcb1435622036bdb5e0dec7178ca0138c610238e0365968f6ddd191bbfacc91948088044d9966f652ff25 +Qx = 014858a3b9bd426b678fdcf93fc53d17e7a9e8fe022442aaaba65399d12fd3a6a381958fb0f07ac6088f4e490506ec0f1ab4d0dbd461126f7eb46ff69cfa8bd88af +Qy = 18c18ce29ecc6d79d26a2de0cd31c4b32e84b5e90f6ba748f86c5afbd89618aceb9079460cbd1a8261ed5476973e61bf1d17ea78b022387443800c9247d21dde550 +k = 05577108f4187a173e5c29e927a8fc8f5ffd37e184254a6e381ff1018955aec91a35f30085e8cee6a7555c10f9efdce26d62f2b4b52dfdbaeafc3a30983e2d50d5b +R = 0344375ae7c804cbe32ced7a20976efae5d9c19eb88b6e24514d1d0cfb728b0f4601098b18b2e98f42b5222dd5237d4d87767007bf5acb185c5526d72047e2cb1a1 +S = 02de4cfa908c73c1102d6fb7062baf54a056a9517701e036c9c51e09899d60051612d59348945f845dffebec5aa395b2fac7229929033615788777306ccad96d0a3 + +Msg = 33bab1c369c495db1610965bc0b0546a216e8dd00cd0e602a605d40bc8812bbf1ffa67143f896c436b8f7cf0bed308054f1e1ff77f4d0a13c1e831efbd0e2fcfb3eadab9f755f070ba9aeaceb0a5110f2f8b0c1f7b1aa96a7f2d038a1b72e26400819b1f73d925ea4e34d6acaf59d0a461a34ce5d65c9c937a80e844e323a16d +d = 03d4749fadcc2008f098de70545a669133c548ce0e32eec1276ff531bcff53533144555728ad8906d17f091cc0514571691107350b6561858e90dbe19633aaf31bf +Qx = 10fe5986b65f6e65d13c88c4d2aed781a91026904f82129d46779bdadaf6b733c845a934e941ab4a285efdea9c96ecc9dc784d87e4d937b42c337b3a9cb111a9600 +Qy = 077853768a2a4d6f596f57414e57ec60b76d3cd5ece8351cd1f335ebcb8801a3d91fb82c65caaeb5c31eea9918367bb5906863ff3ccaf7a6cee415e0d75c15ac2e0 +k = 1fbb4de337b09e935a6dc6215ffcfcb85d236cc490585e73251a8b8bac37cfa36c5d1df5f4536d33659be1e7a442529a783452f7efda74a4f661b6a127f9248aaf7 +R = 09d8f10eeff6178594c89d6e8184f9502117384813243ddf9ccf3c8eac5dc6502c472dfc1487a5caffc569f7dedd14a8ebcb310e9bacdb79fb6655aba026cdf87f2 +S = 0f74236c7915d638708d17c9f10e39dda358faf9bbb821d8dcda0d151aac143bfb165ad0a23a65cd3de532e32cad928728f5ae1c16f58fc16577f3ca8e36f9e708b + +Msg = 08c8b7faaac8e1154042d162dca1df0f66e0001b3c5ecf49b6a4334ce4e8a754a1a8e4daf8ec09cf1e521c96547aed5172ef852e82c03cddd851a9f992183ac5199594f288dbcc53a9bb6128561ff3236a7b4b0dce8eaf7d45e64e782955ee1b690ce6a73ece47dc4409b690de6b7928cbe60c42fc6a5ddf1d729faf1cc3885e +d = 096a77b591bba65023ba92f8a51029725b555caf6eff129879d28f6400e760439d6e69ce662f6f1aecf3869f7b6057b530a3c6ff8ed9e86d5944f583ee0b3fbb570 +Qx = 0fdf6aed933dba73913142ef8bdcd4b760db8500831cd11d7707ab852a6372c05d112a1e7fbc7b514c42142c7370d9f4129493cd75cc6f2daf83747078f15229db6 +Qy = 0ef91dffb3c43080a59534b95ca585ee87f6145f6a0199b2b82c89f456d8bd8e6ac71c78039c08177184484eb2ebd372f189db3a58fab961a75a18afec1ee32764a +k = 13aa7b0471317a2a139c2f90df1c40d75e5a8a830fbaf87030fffdb2ef6f2c93d1310c9ed7fe9d7bcd4fe46537ff2495bc9c4f0aaff11461f5e4bebbfbce9a8740a +R = 1c7a21800962c91d4651553633b18612d931bb88bff8b743ed595b4e869437e50f8e84fbf334c99061db123a1c40b73b07e203790561a37df65a660355ba2017d78 +S = 1301e1782559a38f1ca0eebe9bed0f5c7c33103d506a24f8a688f500ee1fe37f97b6685319279e82e6fe43cfd823ccbc123309974cffa76c4f8d41ec02a3cbc45f1 + +Msg = ba74eed74282811631bd2069e862381e4e2a1e4e9a357b1c159a9ce69786f864b60fe90eeb32d8b72b099986fc594965a33285f7185b415df58fead7b8b50fc60d073680881d7435609ad1d22fd21e789b6730e232b0d2e888889fb82d6ad0337ab909308676164d4f47df44b21190eca8ba0f94995e60ad9bb02938461eee61 +d = 015152382bfd4f7932a8668026e705e9e73daa8bade21e80ea62cf91bd2448ebc4487b508ca2bdaaf072e3706ba87252d64761c6885a65dcafa64c5573c224ae9e6 +Qx = 00b8c7c0186a77dc6e9addd2018188a6a40c3e2ba396f30bbd9293dba2841d57d60866b37f587432719b544d8bf7eb06d90a8c0dc9c93b0c53d53b2f667077228ca +Qy = 1dd2e5c73ab908ae34f701689f1cd3cf5186d3a2bc941e208bf3ef970e5e429ee9b154d73286b2e5da423e75b7c7b78c7bdf915da92279db43265a0cdefca51f86a +k = 0d03506999f5cc9ec3304072984a20a9c64a22ad9b418495ca904f4bbddc96e76d34672cb52763339d3f3bc5b1701c00a675b972797e3a086314da1a8d338436566 +R = 085406c0ff5ec91f598bb579ad8714ad718c3e133d5dcc2e67c5d2339c146b69919cac07f3bc2bda218f4c7c8be04855e2ca6fff7fbdc4fc0fda87c8c3081cad4f5 +S = 1b45f2066e583636215ae135afc202b8bf3f301eccff2e1c0198b9aeddf695fa8179488e7b622fc307f601e2f6551815117cc836bb09ef888f8e64a45d9c84ad30c + +Msg = dc71f171a28bdc30968c39f08f999b88dc04c550e261ecf1124d67f05edeae7e87fe9b8135a96fe2bc3996a4f47213d9d191184a76bd6310e1ee5cb67ea7fc3ef6f641a0ba165198040fa668192b75a4754fc02c224bd4a74aade5a8c814adf151c2bfeda65165a04ef359e39847c84e312afb66d4cd1db50d41ef3fe5f31296 +d = 1750ff0ca0c166560b2034bc5760fe0b3915340bc43216e9de0c1d4a76550e8b2036e8b874230f8d29354aed43e183610f24fd4abd4b0be2f111dae942bd7a121f7 +Qx = 1b4b8947192a7c0166c0e0b2791e217370836283e805f3ee11cfb78445aba3c5bc39fe594e01916617ad59e7c8e740d8f2d07d88905d3f33bd5e51aafd4943c5dc6 +Qy = 1175d117232836c28e717ce2a55e59f4ec550effde30d18e3d99e42c6aa2283c7b3e7f2f6ff1fca605dde78c3a5bffa689347b4c93f51ba59a1787bb7d5e43861dc +k = 023645023d6bdf20652cdce1185c4ef225c66d54f18632d99ccf743bf554d04c214c88ce52a4f71ec75c899ad1b3c07c34112ca20b55c217ff1d72c9528e2774ce8 +R = 1e933f68ce0f8403cb16822b8e0564b1d39a35f27b53e4ae0bcdff3e051759464afbc34998ba7c8a7ee34ef6c1aaa722cffe48356fd0b738058358d4c768b3186c1 +S = 0a67368a305508ce6d25d29c84f552a4a513998990fef4936244f891a2909c30d5fdc9e8a267ecbf3c597138f4a08f7e92bee57d5420eadd700fee864bf78b2614b + +Msg = b895788d7828aaeace4f6b61a072ffa344d8ea324962ba6dab5efda93f65bf64a0f2ac6d5721d03ee70e2aef21cdba69fd29040199160e3a293b772ffb961ed694a8dc82800dab79367a4809a864e4aff6bc837aaa868e952b771b76591c0bb82249034e3208e593d85973d3fea753a95b16e221b2561644535c0131fe834ae7 +d = 023048bc16e00e58c4a4c7cc62ee80ea57f745bda35715510ed0fc29f62359ff60b0cf85b673383b87a6e1a792d93ab8549281515850fa24d6a2d93a20a2fff3d6e +Qx = 0ba3dc98326a15999351a2ec6c59e221d7d9e7ee7152a6f71686c9797f3f330d3150123620d547813ba9d7cc6c6d35cc9a087d07dff780e4821e74ad05f3762efd6 +Qy = 18b051af9824b5f614d23ecadd591e38edbfe910ad6cbebc3e8a6bec11ea90691c17deb3bc5f34a4a3acd90b7b10f521f6ee7b3cfbfdc03b72d5a8783a4a77c3e4c +k = 06099d2667f06c58798757632d07d8b3efbe9c1323efb0c244be6b12b3b163ba1b7cf5246c98dcc0771665a66696d687af5f28ed664fd87d5093df6427523d4db84 +R = 10dc80ea853064a2ba5a781f108aca3785c5ec0aa45aa05ba31d4de671170797589e863d54a3a986aadf6f670277f50355713dfb27d4ec7e348f787910b3cd668cd +S = 018572bfad4f62e3694d1f2e6ffd432faed2e2b9d7e3611a07138212f1e79e6c394839f7cfae96bc368422630016fb9346681eadc5f9699e7331c3b5fde6d65e4c6 + +Msg = 2c5bd848c476e34b427cfe5676692e588e1957957db7b5704492bd02104a38216535607f5d092dc40020130c04a3aaf0f1c52409834926d69a05d3f3188187a71d402a10ba34eac8629b4c6359b1095f30f710219298bf06b9f19bfc299981d7e251ca232a0a85338a7e02464731d1b25d4a1f68baf97064516590644820c998 +d = 02b8b866ce4503bb40ffc2c3c990465c72473f901d6ebe6a119ca49fcec8221b3b4fa7ec4e8e9a10dbd90c739065ad6a3a0dd98d1d6f6dcb0720f25a99357a40938 +Qx = 1b8c7a169d5455f16bfe5df1ba5d6ec9c76e4bad9968d4f5f96be5878a7b6f71d74bfac0076dd278bc4630629f3294646f17d6b6c712b0087e2c4d576039cfdc8b9 +Qy = 18faffd5422dfd1b61432fa77b9a288b2b7d546656c0dcca3032179e6f45ee3cf61d6a447fc51731cb54457343a41569fcf78cef42895f4da5efcb14ea1fc065f8d +k = 0ac89e813f94042292aa1e77c73773c85cf881a9343b3f50711f13fa17b50f4e5cb04ac5f6fc3106a6ef4c9732016c4e08e301eefac19199459129a41a7589e0628 +R = 05bc7a253a028ee8b7253979b8d689d41d8df6fae7736341f22e28b6faf0cbbdebbd2ef4d73e56d2021af2c646dc15539a7c1e1c4dc9c7674808bd7968d8a66f947 +S = 0fd71575837a43a4cf1c47d0485cfd503c2cf36ebcea0fdef946ad29acb7fb2e7c6daf6b4eb741eb211081aed6207d02569f1518988f275ad94c7fd4735cb18a92e + +Msg = 65a0b97048067a0c9040acbb5d7f6e2e6ac462e1e0064a8ce5b5bbf8e57059e25a3ef8c80fc9037ae08f63e63f5bdb9378c322ad9b2daf839fad7a75b1027abb6f70f110247da7e971c7c52914e5a4f7761854432fa16b2a521e7bcaee2c735a87cad20c535bf6d04a87340c229bf9af8647eedca9e2dc0b5aa90f7fea3cdc0a +d = 0a43b32ad7327ec92c0a67279f417c8ada6f40d6282fe79d6dc23b8702147a31162e646291e8df460d39d7cdbdd7b2e7c6c89509b7ed3071b68d4a518ba48e63662 +Qx = 172fb25a3e22c2a88975d7a814f3e02d5bb74cfb0aaa082c5af580019b429fddd8c7f9e09b6938f62e8c31019b25571aaceef3c0d479079db9a9b533ee8e1670abd +Qy = 0ff5516223b6cc7c711705f15b91db559014e96d3839249c5c849f2aced228a8998177a1e91177abbb24b57a8ea84d944e0c95da860ae0925f1b40c0e1b7c9e0a46 +k = 0383eda042e06c0297fbd279a2ad40559c5c12ad458f73458eebcc92b308d3c4fcec20a5b59f698e16fa6ea02dba8661b6955f67c052f67b0a56460869f24cfdf7d +R = 1b9c35356b9d068f33aa22a61370dae44a6cb030497a34fb52af23c6b684677370268f06bb4433be6795a71de570088aec17ce0c9933d2f76c7edce7f406f62fedd +S = 06f07ea453cfa20ad604ba855332f62834657b0b795684d50c1562a675456e37f4dae45f0df47d8e27e47bc9ce9c9cbba1554c5b94b0b17401b73c8d0c0902c6cc4 + +Msg = d6e366a87808eea5d39fe77cac4b8c754e865a796062e2ec89f72165cd41fe04c48148068c570e0d29afe9011e7e7a2461f4d9897d8c1fa14b4ff88cab40059d17ab724f4039244e97fcecb07f9ffeec2fb9d6b1896700fe374104a8c44af01a10e93b268d25367bf2bef488b8abcc1ef0e14c3e6e1621b2d58753f21e28b86f +d = 03c08fdccb089faee91dac3f56f556654a153cebb32f238488d925afd4c7027707118a372f2a2db132516e12ec25f1664953f123ac2ac8f12e0dcbbb61ff40fb721 +Qx = 193301fc0791996ca29e2350723bd9aa0991ddbb4a78348ee72bdcd9ed63ce110ba3496f2ce0331b5c00d4d674c1b70114e17ce44a73c3e16bab14ed1ee924202e4 +Qy = 0aea9b288cfb2933ec0a40efa8e2108774e09b3863b3193d0dac6cc16ccaa5bd5f9ce133aec5cd3b62cbaeec04703e4b61b19572705db38cfaa1907c3d7c785b0cd +k = 0d0e90d5ee7b5036655ad5c8f6a112c4b21c9449ca91c5c78421e364a2160bbac4428303657bc11ea69f59fb0fe85a41b8f155a362343094456fd2a39f2a79e4804 +R = 1a8c23a2965d365a4c2ffd0802ae8b3a69c6b84a1ba77fd8a5f2f61e8ec3a1dcb336f136e2a997252eaa94caf9b5ad6c9ecff5bf33abf547ca84985bb89908a11d7 +S = 1cc42a2dd97aa42b9df5ea430e0d4cb13106dd6da6e8c9315c96ed7b052db365bbde6960c9a965954a4398c18ea7db9593bbfc3c3b6b3466ff806fccac3de6424ab + +Msg = f99e1d272d0f5fb9c4f986e873d070ec638422bc04b47c715595e2cf1a701cdf88bc6c4b20085b357bad12ccba67cac8a5ca07f31ba432f9154ff1fadefd487a83a9c37e49fb70a2f170e58889cab0552e0a3806ccfa2a60d96e346851d84b7de6d1a4b8cf37567dc161a84f13421e3412457d4bc27f6213453c8519a2d7daa2 +d = 0969b515f356f8bb605ee131e80e8831e340902f3c6257270f7dedb2ba9d876a2ae55b4a17f5d9acd46c1b26366c7e4e4e90a0ee5cff69ed9b278e5b1156a435f7e +Qx = 0fc7ae62b05ed6c34077cbcbb869629528a1656e2e6d403884e79a21f5f612e91fc83c3a8ac1478d58852f0e8ba120d5855983afd1a719949afa8a21aec407516c3 +Qy = 0aa705da6459a90eaa2c057f2e6614fb72fc730d6fdebe70e968c93dbc9858534768ea2666553cd01db132331441823950a17e8d2345a3cab039c22b21bfe7bd3b9 +k = 19029260f88e19360b70c11107a92f06faa64524cfbd9f70fecf02bd5a94f390582a7f4c92c5313bb91dc881596768d86f75a0d6f452094adbe11d6643d1a0b2135 +R = 07f2158e9b9fa995199608263969498923cf918fdc736427c72ce27ce4a3540dce2e8e5e63a8fc7ba46f7fa42480efbf79c6ed39521f6e6ec056079e453e80a89d9 +S = 08e349eed6f1e28b0dbf0a8aeb1d67e59a95b54a699f083db885f50d702f3c6a4069591afaa5b80b3c75efb1674ebd32c7ead0040d115945f9a52ee3a51806cad45 + +Msg = 91f1ca8ce6681f4e1f117b918ae787a888798a9df3afc9d0e922f51cdd6e7f7e55da996f7e3615f1d41e4292479859a44fa18a5a006662610f1aaa2884f843c2e73d441753e0ead51dffc366250616c706f07128940dd6312ff3eda6f0e2b4e441b3d74c592b97d9cd910f979d7f39767b379e7f36a7519f2a4a251ef5e8aae1 +d = 013be0bf0cb060dbba02e90e43c6ba6022f201de35160192d33574a67f3f79df969d3ae87850071aac346b5f386fc645ed1977bea2e8446e0c5890784e369124418 +Qx = 167d8b8308259c730931db828a5f69697ec0773a79bdedbaaf15114a4937011c5ae36ab0503957373fee6b1c4650f91a3b0c92c2d604a3559dd2e856a9a84f551d9 +Qy = 19d2c1346aadaa3090b5981f5353243300a4ff0ab961c4ee530f4133fe85e6aab5bad42e747eee0298c2b8051c8be7049109ad3e1b572dda1cac4a03010f99f206e +k = 1a363a344996aac9a3ac040066a65856edfb36f10bb687d4821a2e0299b329c6b60e3547dde03bdbd1afa98b0b75d79cf5aac0ef7a3116266cadf3dfbd46f8a4bfc +R = 1ff097485faf32ce9e0c557ee064587c12c4834e7f0988cf181d07ba9ee15ae85a8208b61850080fc4bbedbd82536181d43973459f0d696ac5e6b8f2330b179d180 +S = 0306dc3c382af13c99d44db7a84ed813c8719c6ed3bbe751ead0d487b5a4aa018129862b7d282cce0bc2059a56d7722f4b226f9deb85da12d5b40648bf6ec568128 + +[P-521,SHA-384] + +Msg = dbc094402c5b559d53168c6f0c550d827499c6fb2186ae2db15b89b4e6f46220386d6f01bebde91b6ceb3ec7b4696e2cbfd14894dd0b7d656d23396ce920044f9ca514bf115cf98ecaa55b950a9e49365c2f3a05be5020e93db92c37437513044973e792af814d0ffad2c8ecc89ae4b35ccb19318f0b988a7d33ec5a4fe85dfe +d = 095976d387d814e68aeb09abecdbf4228db7232cd3229569ade537f33e07ed0da0abdee84ab057c9a00049f45250e2719d1ecaccf91c0e6fcdd4016b75bdd98a950 +Qx = 13b4ab7bc1ddf7fd74ca6f75ac560c94169f435361e74eba1f8e759ac70ab3af138d8807aca3d8e73b5c2eb787f6dcca2718122bd94f08943a686b115d869d3f406 +Qy = 0f293c1d627b44e7954d0546270665888144a94d437679d074787959d0d944d8223b9d4b5d068b4fbbd1176a004b476810475cd2a200b83eccd226d08b444a71e71 +k = 0a8d90686bd1104627836afe698effe22c51aa3b651737a940f2b0f9cd72c594575e550adb142e467a3f631f4429514df8296d8f5144df86faa9e3a8f13939ad5b3 +R = 02128f77df66d16a604ffcd1a515e039d49bf6b91a215b814b2a1c88d32039521fbd142f717817b838450229025670d99c1fd5ab18bd965f093cae7accff0675aae +S = 008dc65a243700a84619dce14e44ea8557e36631db1a55de15865497dbfd66e76a7471f78e510c04e613ced332aa563432a1017da8b81c146059ccc7930153103a6 + +Msg = 114187efd1f6d6c46473fed0c1922987c79be2144439c6f61183caf2045bfb419f8cddc82267d14540624975f27232117729ccfeacccc7ecd5b71473c69d128152931865a60e6a104b67afe5ed443bdbcdc45372f1a85012bbc4614d4c0c534aacd9ab78664dda9b1f1e255878e8ac59e23c56a686f567e4b15c66f0e7c0931e +d = 04ceb9896da32f2df630580de979515d698fbf1dd96bea889b98fc0efd0751ed35e6bcf75bc5d99172b0960ffd3d8b683fbffd4174b379fbdecd7b138bb9025574b +Qx = 0e7a3d30d5bd443549d50e9b297aaa87bc80b5c9e94169602d9d43d6d0c490c0bed8cc2170288b106bdbf4c9f1ce53fd699af0b4c64b494b08520e57dc01ab9a8b0 +Qy = 1d81056d37aec8a75d588f6d05977416e6f24ad0117a7f4450036d695612e7bc2771caed80e580314eebc88c8fc51c453f066e752481f212b57165d67f8a44f375a +k = 046639c5a3ec15afae5e4a7a418ac760846512d880c359bc2c751b199ce43b10887e861b14127809754dbea47f6cc0140d2817e3f5b9a80ce01abd81f81b748433a +R = 0f913de91e19bd8f943d542ae357bacc942a0967abc9be6c06239a379db8cc733fa50013e0b0f088bce9d630262feaa33b30d84f91bcf5ce9976e4e740fcb112f84 +S = 08a73a5c9c24235e0d9cecaac653f68ce5a6fb186ce67fa058d6ddbbd4d0a8c4d194e571148e8ad6c8882b4e33d2f60fb23dd7d07a1ae60864e8277918f592b3dc6 + +Msg = 6744b69fc2420fe00f2352399bd58719e4ecdd6d602e2c80f194d607e58b27a0854745bfd6d504de2eb30b04cee0f44af710dd77e2f816ac3ac5692fad2d1d417893bb0edba2707a4c146a486f8728ca696d35cc52e9c7187c82d4bdb92eb954794e5ad15133f6bfea1f025da32ada710a3014cf11095b3ff69a94d087f17753 +d = 00a8db566bd771a9689ea5188c63d586b9c8b576dbe74c06d618576f61365e90b843d00347fdd084fec4ba229fe671ccdd5d9a3afee821a84af9560cd455ed72e8f +Qx = 04f5b790cbe2984b71d41af5efed6c6893d15e13f31816d55a9c2926a104eee66f1ada83115d1388551218773b8b9d1138e3e3f027bb4392c90c14fd232580b4a11 +Qy = 0660eb160e9bfc8c5619e70e948e238c6fd37739bc1bb657b8e8436e63628f91992be7e63d9a7359623a1340642777b22026feb51116a6c50c54c3589b9bd39b6cb +k = 1e7b5e53571a24bd102dd7ad44a4b8d8a4e60e5957bc3c4e5d3c73109f55233f072e572c7892f425ba5e64d3cb7966096bb34a47e26cd5b3e3b44108b310d9f681b +R = 1a88bcd7e2bdff6e497d943dde432fb3f855a7177c466319cb53b701230c299db030276269685857d1e3f28110e690f2f529c8d18115eb381f313bc891d92ad278e +S = 146f1984ea879274dfd5e86ad92e564a4de081523ddbb1c397b8f9595911ef2e6501bc081584d5340f7aa47e1af036234ac6f27a5ac31f78dd3b0ff1a62693c630d + +Msg = 16001f4dcf9e76aa134b12b867f252735144e523e40fba9b4811b07448a24ef4ccf3e81fe9d7f8097ae1d216a51b6eefc83880885e5b14a5eeee025c4232319c4b8bce26807d1b386ad6a964deb3bdca30ee196cfdd717facfad5c77d9b1d05fdd96875e9675e85029ecbf4f94c524624746b7c42870c14a9a1454acf3354474 +d = 1a300b8bf028449344d0e736145d9dd7c4075a783cb749e1ec7988d60440a07021a25a3de74ea5e3d7bd4ab774d8ad6163adae31877ef0b2bd50e26e9e4be8a7b66 +Qx = 05055b9ad726ba8a48219b0ecbfffb89f8428de895b231f676705b7de9f2022d9ff4e0114ebb52dea342f9bf76b2fb060c020e29d92074ebb1fbfe5290a58c8bc10 +Qy = 0415af7f20a6e945315adbf757316bb486c80780a0a3a15b4b9609f126d7341053a2b726ab63cb46feee527b0bf532b32b477e5671aea23d9b3c3e604b9029954b5 +k = 05a2e92717bb4dab3ee76724d4d9c2d58a32b873e491e36127985f0c9960c610962ca1c4510dba75c98d83beebdc58b1d8678e054640951d11db1bd2d8a4ab8476b +R = 104a78ce94f878822daaf00ee527fbdbf6cceb3cbb23a2caa485e4109466de8910252f92379ab292cac8d1eda164f880c0067696e733fc8588a27703a3e1f5b8f1f +S = 1ffe23e8ab5a31668a81161a234ea14879771fe9866f8872eb6edb672e0fe91d2bb75c9767a2dfbac7c15c802211236b22ea41ecd055a0b8b311ffc4255f86d5c67 + +Msg = a9824a7b810aa16690083a00d422842971baf400c3563baa789c5653fc13416111c0236c67c68e95a13cec0df50324dcc9ae780ce4232607cb57dd9b2c61b382f0fa51fd4e283e2c55ffe272597651659fbd88cd03bfa9652cd54b01a7034c83a602709879e1325c77969bebfd93932ce09a23eae607374602201614ff84b141 +d = 06a253acd79912a74270fc0703ed6507ab20a970f2bc2277f782062092cf0e60ae1ca1bb44dec003169bc25ef6e7123dd04692f77b181a6d7e692e66b09d35a540c +Qx = 1f15c6b1df156fdd8381cd7446e039435e445f8f36f0247475058da0e371bf72753f6e39f98066bc79370b038c39687ba18e16cb118fe6538b7568c5403c251f6b7 +Qy = 12d2b4f46b854eeae75f1c63f55b76bf0c604d47f870c28a50ecdeb52bba1dd9a0ff12e680804ff864111207652da7dd10b49edf66bb86be00bc06672de91982457 +k = 165faf3727e42fd61345cfa7b93e55fb4bf583b24bdc14ce635b6c99dbd788012f14da9a210b677c44acdd851e672f1a48188d6b8946c0efeebfe8a597ba0090a2c +R = 1ad9463d2759abd568626548578deefdcd8b2d050ce6d9c7ed05feca20167484b86e89bdcc936fd647e0f8aedd7b6add2b8cf13ff6ff013c2b5540c6c56fda97a0c +S = 1645a7d0e11015256cfb034adca198695eea6aedd44d9fbf496850ccfed950f43fffd8dbf41e113f2d3837d8a5dd62b2ed580112ff05800b1f73196e5576810e15b + +Msg = 90d8bbf714fd2120d2144022bf29520842d9fbd2dc8bb734b3e892ba0285c6a342d6e1e37cc11a62083566e45b039cc65506d20a7d8b51d763d25f0d9eaf3d38601af612c5798a8a2c712d968592b6ed689b88bbab95259ad34da26af9dda80f2f8a02960370bdb7e7595c0a4fffb465d7ad0c4665b5ec0e7d50c6a8238c7f53 +d = 0d5a5d3ddfd2170f9d2653b91967efc8a5157f8720d740dd974e272aab000cc1a4e6c630348754ab923cafb5056fc584b3706628051c557fce67744ee58ba7a56d0 +Qx = 128a4da5fc995678e457ceb3929adee93c280f851abe900fa21f4f809dafad4e33b381e0cd49ce8dd50e2e281cea162bfd60a1d6a1c0ee2228e6a011e171b559ab8 +Qy = 06eb0917cd72256992c49ea527f6bb0315f13d8047794a0f1da1e93737703b1c2a74a00441ef3b47b6a2ff789c49ae32d91cabe7b29247aeec44f6c40a76597a2ca +k = 03269983a5c2bcc98e9476f5abf82424566b1f08b17204d29e310ece88f99eb677a537f86fe2529e409cfef2c12929644100099e0de2f27c0f0ac11105a4dca935b +R = 1a5257ae1e8187ba954f535b86ff9b8d6a181a3b95c250d090cb4e9c3bfbd03aa64696a76c569728ef67780d6338d70ce46da40b87a3e49bfe154b93930890dfa93 +S = 05b6ccdfd5c63c7db76d3a0478064a2a376e0e050cb093be795a72a549247c2e4adba9183145c63d46479dbbdcf09986a6f64c09c7e16abc4853f6376c9558b014a + +Msg = 09952b1e09995e95bf0022e911c6ab1a463b0a1fdd0eec69117b34af1103c720b57600217de7cd178fef92de5391e550af72a8dcf7badf25b06dd039417f9a7d0f5be88fcd4e9655931d5b605452a667c9d1bae91d3476e7d51cff4108f116a49966fb3a7cff8df1c09734ce5620faf2dccb3dc5d94e7e9ac812da31f6d07a38 +d = 1bcedf920fa148361671b43c64e3186e1937eb1bd4b28cbd84c421472394552889bc05509aa732ef69d732b21b750523fdfd811f36467690fe94e01e64c9d5cbbe9 +Qx = 0d33c151d202a5d4d831348e940b027ee32e4b0b9b48d823a05c67ff3bdaee0189fc6680565f352c062e99968afc643208b4f9c7af185b861658a88c4ad0fcc8ba2 +Qy = 0e4441ddb546468ad8ffa6074f137edfbb81e82e0e7d8f05c4c54598aa996a9cde54cb371f642bfdd4ae7eca5b769696030027129a4183da93567ad142a2dff5183 +k = 046e619b83aac868b26d0b3cbfab55e630e0b55c461985b5d00f94ff3a5ce90ff412cebf46bbd84550d2031d573ca27d924624428360708c8d8491c29eb01d30f2e +R = 08427c0f0ac0263472cd423c0fb554bf3c851b9c775c566ab0f6878717bd57665830767b05b7789c5c0b078195bd943dc737325552d32877ecb04a7c41bd07cd80c +S = 10bb6652d6a624c40a7dd06828f15774130d02369ceb1a7d03b553e16e17b7fa5b5401f15885d5e4fc2e55c0c7a1b97871ab02f76386b93a16aa6e7eb65debac6dd + +Msg = 0bb0f80cff309c65ff7729c59c517d50fc0ed5be405ef70cb910c3f62c328c90853d4473530b654dda6156e149bc2222a8a7f9be665240e2fbe9d03f78a2356af0bacd1edb84c4801adc8293a8a0bd6123d1cf6ba216aca807a7eb4dca76b493eb6e3dbb69d36f0f00f856222f24d9b93ec34c3b261be2fca0451c00571928e5 +d = 03789e04b3a2a0254ade3380172c150d2fad033885e02ea8bea5b92db3f4adbab190ae423080a1154dfedec694c25eab46ce638be3db4e4cba67bc39f62d6e7db2d +Qx = 1dbc2cf19627bdccf02432b1761f296275230c150cdde823ce3141ec315d7d05e16b2c29e2a67491078d5316883e933d85b4b10d4f64c477d3c4e0442dc928983a2 +Qy = 07562e720807dd118d3d8b265b3abc61a71fce43e3dce0e7b5ae18b7a4cb01ecc00d39c1f22e150a9a8728997e502144f5b3f6fa9b4cb8a4136212b082ca394e3f6 +k = 0fbccd8d7804bdd1d1d721b5ec74d4ba37603bc306f9fce2ec241853d8e07334e6b4b12c4ecca0c54bd71193dd7146507933a20737c5f3e15085830fab9b30ca57b +R = 181915a3998d8fa214f9715f4ca928d09c36de168dc15c6970a8a062b5cea2dc969b2437ca17b684f78a1fd583aad8e6c762c8f4ab0c91b86a497145e3ca440d307 +S = 15a6c18c5c77f5470b27d061eafdc26b78561941a3b2ab0f5c81d40899fc053c3d9ed12d7d61e298abbae470009c7b2157731c58d7b16a66fa5abaf5e8a1b8ed394 + +Msg = 7efacf213382ce30804e78b7256854d759147dba9729c51b2759465715bf2c421034c23dc651c13d6cce95f71fe6a84dfbee5768163ac5789ac0474c5ddf4115684683c5f7c204b33b8bcc0c03ac58f66cef2f53b721fe2fac91ad841126101a88f512a7c2ded38549d9f050d4b7961dda48a1489f026c5d111701762418cfe3 +d = 124700aa9186353e298edefc57bec0c7d0201cca10c1d80dd408d5d71040592b0ac59facdadfa8712445f5977ef8d4854022720c3f02d60e0732dbb2f171fcf1490 +Qx = 0c80fc4cecae5d53348524ddba6a160b735c75b22fdb39af17e2a613d09246e3bb0fd3f2978577f6db5d2118e05c7898024808f8eb8e021d7969cdcf7fc981200bb +Qy = 1a880c93943fd446d4b3923b574d2221c1bb7b645fb5534dda60e827b497666ff586b77921f7e7f605147947194cffd2fef0678880b89cc0bc7fb74fa96d4b112d7 +k = 01a05238d595ded5c61d3bf6fde257dbf13095af8a5cb3a2e579e8e4c550fe31d12b71cc2dbcb295e6c4fd0fb8c22d1b741c097cc59d826ced1a8771f09983143c4 +R = 132762bc81e9922a8d642e3a9d0218affa21fa2331cfcb9e452545c5981c64a8f7e4cc8e68056023b2aa78bead59061d19c7f646c931163a91e544b106b3be8de9e +S = 0c3a1b0b000c3169984132add51d611e2cb7069a262a6983d2ae72b459c36e6469509bdb0f473600b8686700b08910779dee9ba83f82e755d4a4ef5f124eb09397f + +Msg = 28edff8b9d85f5f58499cc11f492abdfab25e8945975bbaeee910afa2b8fc1295ec61406309ce4e09f4ab4f462959fc2a2786802466eb26d3b01be6919893ae75d0fdc2dc8a82e662550f9fce9627dd364188aaba5c6faa1b2d8a2235adfa5ad0dc140f88a2b2f103f5690e877d07fe8fd30d02d2b2729bd3d8eb5b23a21f54c +d = 1f532d01af885cb4ad5c329ca5d421c5c021883bd5404c798d617679bb8b094cbb7e15c832fb436325c5302313ce5e496f9513455e7021ffad75777a19b226acfa1 +Qx = 0c0bd76b0027b85bdd879052220da1494d503f6a4bb972105a48ae98e7dda8c2d9fd9336f5646385b961ef68e8464e3a95b00f96614b1a408ceaa2c87b077b6a8fb +Qy = 17eb7eb5c78db7819af92e8537d110d9f05a5e24f954f4dde21c224d4040f059ec99e051702f390413d2708d18f84d82998c61847475250fb844b20082cbe651a6b +k = 14e66853e0f7cd3300ebcae06048532e19cbb95bee140edc1c867ce7310637651445b6dfeb1d99d2e32f2ffb787ebe3fe35032277f185d3dad84f95806924550abe +R = 0c5b3a57161098e2e8e16e0a5ae8ecf4a14df14927eea18ed4925d11dc429dda145159323ba970174b194b9b4608a8fa2373b7a825c5e8bd80574e49698285c2c82 +S = 1a0c038a51796158b42eb5b0dac37aff9ab93b903a47e06ebbdd15946e4bcc9a3b3875b18cf6294c33fc6c3693cef04ed1a43d08951e664c760e2cf3fb4e47490d2 + +Msg = bae2a8897c742fd99fbf813351cd009d3f2e18d825ca22e115276484bce8f82f8c7c0c21dd2af208404d8ef45bb5a6c41693912b630897d5246801bf0775aa9bbac8be98cb861d172c3563dc59e78a58ed13c66dea496471b3ad0eeae8995293e4ab97373edc1837ffc95ff1cc0c1e90e64ea8680b2ca5f1e09bf86b99b343b6 +d = 11abf508bca68a85a54bc0659e77efad3c86112c9db04db2883e76144aa446918bb4bb0784b0b6a0e9aa47399fe3de5aaecfd8894a0d130bb0c366c40d9d5050745 +Qx = 05c0ea363a3a12633ea39d564587ebdd3a22a175ef32b9ebfc7311304b19cb3a62b5adc36f6afb6a6f7fabbf810ee89fdb72854fefd613e7798e9b9ff5938ea54c6 +Qy = 0bd06a85e47b885c08124b55a3fcc07ca61647cda6efbfdbd21b24d1ea7a4c7300d46cd798e76063aa979adef6f0698b15e5b7ae8a2ab39ab4f50b2d20614db6317 +k = 19cadb8c7eb10565aa4567e0709873918720f0e4b42b4817afb0b0547c70cd1100229deae97a276b9c98ea58b01d4839fee86336d749d123b03e8b1a31166acc110 +R = 0667448a8bbef1c810d40646977dc22f3dfb52a4d80928ded5e976e199cbed02fbd5a08546756ece14548d721a6eb380d0e1a71ad0660dbcac6163c776eedd3e249 +S = 0ae7f0a238daaddb7fb4a1707fe5132daf653f8e19f732347134c96f1dd798f867c479a4a4609a568a15b61afed70790adbde13ac5f68c468d0230852c1a2c22581 + +Msg = d57a26a9593e72bfc87322524639bcaae5f2252d18b99cdaa03b14445b0b8a4dd53928f66a2e4f202fb25b19cad0eb2f1bfda2ab9b0eb668cdcd0fe72f5d9ef2e45e0218590f7ab9d2c9342202610c698bc786cce108a7d4a6730a13e9ea1b470e781f1237d3f84f44abde808516975546bd89075ef9a9732bfd7ee33b6f4399 +d = 18dbf520d58177e4b7a0627674d220137983f486dd2fd3639f19751804e80df0655db6afd829cdf75238de525e1a7a9f048049b593dd64b4b96cc013f970c05ea1f +Qx = 18b872690c37995be324ddb5c2bd5462841bb062f8e63da248a853de79c3d6bb9a2eb1e6933afda0998ca43491cc807b08ace2d5336a43d0ab50563a2d3d98755f0 +Qy = 002ff31221aa32aa6546f35e8fe5b9361f938362a5e89e77ae130ba8bce3729e912dfac35a2fd21efe84b45b8be2a340850e4b574e1885b35c2afbe196b57c6cf4c +k = 098faeb73054639cb2e4442cd68e7b3a13f4b3f397a7b26f303afa40789f8ddd3d918f1ce4f0be53c8cb69c380744e2297d7fc01e2b3daef4ce64dd3a2644234753 +R = 09c0e7649f814f70a8416cb78bc4601472a363fe97f5c587305778169677860dd97f87b5ab07c3a953bc4615fc34634509d6a25621bdded33ed42446d059509c190 +S = 120b90e1cfb8a1b5e530df7b17d1128bc051ca4f1a65dd9c9d9d3c59d2f00c7c1e994c52b8671d40294b4d574d2c04475d5bebeacd3a0d3870a54dc7a4805614f40 + +Msg = 8fdcf5084b12cfc043dd3416b46274e021bbed95d341d3c500c102a5609d3a34de29f8fa9f0adb611a1f47a97ad981f8129d718fc0d6c709eab1a3490db8d550f34eb905b9e00663543afc5bc155e368e0bc919a8b8c9fa42093603537a5614927efa6be819ed42ececbf1a80a61e6e0a7f9b5bc43b9238e62d5df0571fea152 +d = 002764f5696aa813cd55d30948585f86288ae05aeb264ca157cd09e1d09a10515a849b0791b755ccc656a34707be9e52f5762d290a7d2bcd6de52c600ff862eaf4e +Qx = 127279c88719dc614db387f102e55104ea1c704ac7f57f3bca936f728439b76556730dd7cde2ac1ad0a4c2c2f036ab6f00cf34cb87ea36113571f300713044106d2 +Qy = 134a0786c31f5f2291b83c50fb579ae4c620b95e5a8bdc0c7e1ee6b996c89d764f1b20403e7faa203f397425ada297045dd8ba0e4b155d4900da249e934faab7991 +k = 08bffb0778cbb06466cecc114b9e89ca243a2b2b5e2597db920bc73a8bbcbe3f57144ad33409ef7faaab430e13f4c42d304d11347360c84972ca20b1539cce3a288 +R = 1f8f504e64a502e51e7c129517931c3b71f0d8a63b19cfe01ff7c951c6525249608b3ef5d00061d77eb6b3d69581adeaa3732c773bbb9b919c3e7c71fdc09f44d06 +S = 058044fc64b340604ffd02a5b2918d76fd6fb59ea895feab7aa218e6f1e8c8f226eb9ee345ef8140183a69272582005077b008006aab11597e808d7ff1e8382c924 + +Msg = 00669f433934992257bed55861df679804107d7fa491672574a7624949c60049b0533383c88d6896c8de860704c3e6a6aefce83efa57c4d57e9ab253da5d15e1f53ab6dce218b592772ab0bc01fee8e63368e85c0639301456fe2d44cd5396a7f2b22761cd03b80eba7883eede8249a2f5db2183bf00550c5c002f45a5e4fb31 +d = 1b0c9acd3eeb618b4b0de4db402206f0f29adc69d7ad324b6db6601b351f723ac8fe949eeacd34228649bf0126276e5aceb0137d00c30dd858aef2d6b6449de2e89 +Qx = 1811c8884486aaa083ddee1c51cb6e861cb830bd5eaa929f72efadbbd1286566ae7e7ba7fde7e02529900d35ee64591652d28798bfc1bed0d192602a9cf5a7d22e3 +Qy = 06d7fc9dd494816cfd29613d4689af67f7d0a2e6fbad5d4d6e0130189172a1ab601c5ca71deaa8bfcb5a190d49da191672ff6fc048e146cb902acec5eae6d87e60a +k = 1fdc4f108070af3c66c9ba7b6c1f2603a19ceb4760399df81228cfc7eafde1082b5a0716a3ff82fbe84726f14dd0db3376ca184a78c3c60679bab6cd45f77f9b9ce +R = 1ec310339ff056faeb341c4499c43782078b04be1725ae9a6cdcb6011c46d1a4eb3d75c358225e4ec142fd1cd344186f5eb597f7ba559ddfa954824365d5b6edaec +S = 005b679a33fdb7e04834f071cd0ac514c04add9f2614ab9bbd9b407b1420fed3f3e02a108e7e279899e43dcf64ae4083c289a87cd7d2103bdc036a95d36800ac7c6 + +Msg = 4be81dcfab39a64d6f00c0d7fff94dabdf3473dc49f0e12900df328d6584b854fbaebaf3194c433e9e21743342e2dd056b445c8aa7d30a38504b366a8fa889dc8ecec35b3130070787e7bf0f22fab5bea54a07d3a75368605397ba74dbf2923ef20c37a0d9c64caebcc93157456b57b98d4becb13fecb7cc7f3740a6057af287 +d = 181e1037bbec7ca2f271343e5f6e9125162c8a8a46ae8baa7ca7296602ae9d56c994b3b94d359f2b3b3a01deb7a123f07d9e0c2e729d37cc5abdec0f5281931308a +Qx = 0cfa5a8a3f15eb8c419095673f1d0bd63b396ff9813c18dfe5aa31f40b50b82481f9ed2edd47ae5ea6a48ea01f7e0ad0000edf7b66f8909ee94f141d5a07efe315c +Qy = 18af728f7318b96d57f19c1104415c8d5989565465e429bc30cf65ced12a1c5856ac86fca02388bc151cf89959a4f048597a9e728f3034aa39259b59870946187bf +k = 09078beaba465ba7a8b3624e644ac1e97c654533a58ac755e90bd606e2214f11a48cb51f9007865a0f569d967ea0370801421846a89f3d09eb0a481289270919f14 +R = 19cf91a38cc20b9269e7467857b1fc7eabb8cea915a3135f727d471e5bfcfb66d321fabe283a2cf38d4c5a6ecb6e8cbee1030474373bb87fcdfcc95cf857a8d25d0 +S = 1cf9acd9449c57589c950f287842f9e2487c5610955b2b5035f6aacfd2402f511998a1a942b39c307fc2bcab2c8d0dae94b5547ddccfb1012ca985b3edf42bbba8b + +[P-521,SHA-512] + +Msg = 9ecd500c60e701404922e58ab20cc002651fdee7cbc9336adda33e4c1088fab1964ecb7904dc6856865d6c8e15041ccf2d5ac302e99d346ff2f686531d25521678d4fd3f76bbf2c893d246cb4d7693792fe18172108146853103a51f824acc621cb7311d2463c3361ea707254f2b052bc22cb8012873dcbb95bf1a5cc53ab89f +d = 0f749d32704bc533ca82cef0acf103d8f4fba67f08d2678e515ed7db886267ffaf02fab0080dca2359b72f574ccc29a0f218c8655c0cccf9fee6c5e567aa14cb926 +Qx = 061387fd6b95914e885f912edfbb5fb274655027f216c4091ca83e19336740fd81aedfe047f51b42bdf68161121013e0d55b117a14e4303f926c8debb77a7fdaad1 +Qy = 0e7d0c75c38626e895ca21526b9f9fdf84dcecb93f2b233390550d2b1463b7ee3f58df7346435ff0434199583c97c665a97f12f706f2357da4b40288def888e59e6 +k = 03af5ab6caa29a6de86a5bab9aa83c3b16a17ffcd52b5c60c769be3053cdddeac60812d12fecf46cfe1f3db9ac9dcf881fcec3f0aa733d4ecbb83c7593e864c6df1 +R = 04de826ea704ad10bc0f7538af8a3843f284f55c8b946af9235af5af74f2b76e099e4bc72fd79d28a380f8d4b4c919ac290d248c37983ba05aea42e2dd79fdd33e8 +S = 087488c859a96fea266ea13bf6d114c429b163be97a57559086edb64aed4a18594b46fb9efc7fd25d8b2de8f09ca0587f54bd287299f47b2ff124aac566e8ee3b43 + +Msg = b3c63e5f5a21c4bfe3dbc644354d9a949186d6a9e1dd873828782aa6a0f1df2f64114a430b1c13fe8a2e09099e1ed05ef70de698161039ded73bcb50b312673bb073f8a792ac140a78a8b7f3586dffb1fc8be4f54516d57418ccc9945025ce3acf1eb84f69ceee5e9bd10c18c251dbc481562cd3aae54b54ab618cb1eeda33cf +d = 1a4d2623a7d59c55f408331ba8d1523b94d6bf8ac83375ceb57a2b395a5bcf977cfc16234d4a97d6f6ee25a99aa5bff15ff535891bcb7ae849a583e01ac49e0e9b6 +Qx = 04d5c8afee038984d2ea96681ec0dccb6b52dfa4ee2e2a77a23c8cf43ef19905a34d6f5d8c5cf0981ed804d89d175b17d1a63522ceb1e785c0f5a1d2f3d15e51352 +Qy = 014368b8e746807b2b68f3615cd78d761a464ddd7918fc8df51d225962fdf1e3dc243e265100ff0ec133359e332e44dd49afd8e5f38fe86133573432d33c02fa0a3 +k = 0bc2c0f37155859303de6fa539a39714e195c37c6ea826e224c8218584ae09cd0d1cc14d94d93f2d83c96e4ef68517fdb3f383da5404e5a426bfc5d424e253c181b +R = 1a3c4a6386c4fb614fba2cb9e74201e1aaa0001aa931a2a939c92e04b8344535a20f53c6e3c69c75c2e5d2fe3549ed27e6713cb0f4a9a94f6189eb33bff7d453fce +S = 16a997f81aa0bea2e1469c8c1dab7df02a8b2086ba482c43af04f2174831f2b1761658795adfbdd44190a9b06fe10e578987369f3a2eced147cff89d8c2818f7471 + +Msg = 6e0f96d56505ffd2d005d5677dbf926345f0ff0a5da456bbcbcfdc2d33c8d878b0bc8511401c73168d161c23a88b04d7a9629a7a6fbcff241071b0d212248fcc2c94fa5c086909adb8f4b9772b4293b4acf5215ea2fc72f8cec57b5a13792d7859b6d40348fc3ba3f5e7062a19075a9edb713ddcd391aefc90f46bbd81e2557b +d = 14787f95fb1057a2f3867b8407e54abb91740c097dac5024be92d5d65666bb16e4879f3d3904d6eab269cf5e7b632ab3c5f342108d1d4230c30165fba3a1bf1c66f +Qx = 0c2d540a7557f4530de35bbd94da8a6defbff783f54a65292f8f76341c996cea38795805a1b97174a9147a8644282e0d7040a6f83423ef2a0453248156393a1782e +Qy = 119f746c5df8cec24e4849ac1870d0d8594c799d2ceb6c3bdf891dfbd2242e7ea24d6aec3166214734acc4cbf4da8f71e2429c5c187b2b3a048527c861f58a9b97f +k = 186cd803e6e0c9925022e41cb68671adba3ead5548c2b1cd09348ab19612b7af3820fd14da5fe1d7b550ed1a3c8d2f30592cd7745a3c09ee7b5dcfa9ed31bdd0f1f +R = 10ed3ab6d07a15dc3376494501c27ce5f78c8a2b30cc809d3f9c3bf1aef437e590ef66abae4e49065ead1af5f752ec145acfa98329f17bca9991a199579c41f9229 +S = 08c3457fe1f93d635bb52df9218bf3b49a7a345b8a8a988ac0a254340546752cddf02e6ce47eee58ea398fdc9130e55a4c09f5ae548c715f5bcd539f07a34034d78 + +Msg = 3f12ab17af3c3680aad22196337cedb0a9dba22387a7c555b46e84176a6f8418004552386ada4deec59fdabb0d25e1c6668a96f100b352f8dabd24b2262bd2a3d0f825602d54150bdc4bcbd5b8e0ca52bc8d2c70ff2af9b03e20730d6bd9ec1d091a3e5c877259bcff4fd2c17a12bfc4b08117ec39fe4762be128d0883a37e9d +d = 15807c101099c8d1d3f24b212af2c0ce525432d7779262eed0709275de9a1d8a8eeeadf2f909cf08b4720815bc1205a23ad1f825618cb78bde747acad8049ca9742 +Qx = 160d7ea2e128ab3fabd1a3ad5455cb45e2f977c2354a1345d4ae0c7ce4e492fb9ff958eddc2aa61735e5c1971fa6c99beda0f424a20c3ce969380aaa52ef5f5daa8 +Qy = 14e4c83f90d196945fb4fe1e41913488aa53e24c1d2142d35a1eed69fed784c0ef44d71bc21afe0a0065b3b87069217a5abab4355cf8f4ceae5657cd4b9c8008f1f +k = 096731f8c52e72ffcc095dd2ee4eec3da13c628f570dba169b4a7460ab471149abdede0b63e4f96faf57eab809c7d2f203fd5ab406c7bd79869b7fae9c62f97c794 +R = 1e2bf98d1186d7bd3509f517c220de51c9200981e9b344b9fb0d36f34d969026c80311e7e73bb13789a99e0d59e82ebe0e9595d9747204c5f5550c30d934aa30c05 +S = 12fed45cc874dc3ed3a11dd70f7d5c61451fbea497dd63e226e10364e0718d3722c27c7b4e5027051d54b8f2a57fc58bc070a55b1a5877b0f388d768837ef2e9cec + +Msg = a1eed24b3b7c33296c2491d6ee092ec6124f85cf566bb5bc35bffb5c734e34547242e57593e962fb76aee9e800eed2d702cc301499060b76406b347f3d1c86456978950737703c8159001e6778f69c734a56e5ce5938bd0e0de0877d55adeee48b0d8dfa4ac65fd2d3ce3e12878bac5c7014f9284d161b2a3e7d5c88569a45f6 +d = 18692def0b516edcdd362f42669999cf27a65482f9358fcab312c6869e22ac469b82ca9036fe123935b8b9ed064acb347227a6e377fb156ec833dab9f170c2ac697 +Qx = 1ceee0be3293d8c0fc3e38a78df55e85e6b4bbce0b9995251f0ac55234140f82ae0a434b2bb41dc0aa5ecf950d4628f82c7f4f67651b804d55d844a02c1da6606f7 +Qy = 1f775eb6b3c5e43fc754052d1f7fc5b99137afc15d231a0199a702fc065c917e628a54e038cbfebe05c90988b65183b368a2061e5b5c1b025bbf2b748fae00ba297 +k = 161cf5d37953e09e12dc0091dc35d5fb3754c5c874e474d2b4a4f1a90b870dff6d99fb156498516e25b9a6a0763170702bb8507fdba4a6131c7258f6ffc3add81fd +R = 14dfa43046302b81fd9a34a454dea25ccb594ace8df4f9d98556ca5076bcd44b2a9775dfaca50282b2c8988868e5a31d9eb08e794016996942088d43ad3379eb9a1 +S = 120be63bd97691f6258b5e78817f2dd6bf5a7bf79d01b8b1c3382860c4b00f89894c72f93a69f3119cb74c90b03e9ede27bd298b357b9616a7282d176f3899aaa24 + +Msg = 9aace26837695e6596007a54e4bccdd5ffb16dc6844140e2eeeb584b15acb2bbffd203c74440b6ee8db676fd200b4186a8c3e957c19e74d4d865ada83f80655323dfa3570907ed3ce853b6e8cc375ed2d758a2f5ad265dd3b47650517a49b3d02df9e0c60c21576378c2b3a08481eec129b2a75608e13e6420127a3a63c8a3f1 +d = 0a63f9cdefbccdd0d5c9630b309027fa139c31e39ca26686d76c22d4093a2a5e5ec4e2308ce43eb8e563187b5bd811cc6b626eace4063047ac0420c3fdcff5bdc04 +Qx = 14cab9759d4487987b8a00afd16d7199585b730fb0bfe63796272dde9135e7cb9e27cec51207c876d9214214b8c76f82e7363f5086902a577e1c50b4fbf35ce9966 +Qy = 1a83f0caa01ca2166e1206292342f47f358009e8b891d3cb817aec290e0cf2f47e7fc637e39dca03949391839684f76b94d34e5abc7bb750cb44486cce525eb0093 +k = 01e51fd877dbbcd2ab138fd215d508879298d10c7fcbdcc918802407088eb6ca0f18976a13f2c0a57867b0298512fc85515b209c4435e9ef30ab01ba649838bc7a0 +R = 11a1323f6132d85482d9b0f73be838d8f9e78647934f2570fededca7c234cc46aa1b97da5ac1b27b714f7a171dc4209cbb0d90e4f793c4c192dc039c31310d6d99b +S = 0386a5a0fc55d36ca7231a9537fee6b9e51c2255363d9c9e7cb7185669b302660e23133eb21eb56d305d36e69a79f5b6fa25b46ec61b7f699e1e9e927fb0bceca06 + +Msg = ac2175940545d4fbab6e2e651c6830aba562e0c11c919e797c43eff9f187a68a9e5a128e3e2a330b955a3f4577d3f826529ad1b03d7b60f7ad678f005053b41dc0f8d267f3685c6abe1a0e9a733c44b2f3ca48b90806f935141c842e3a6c06a58f5343d75e3585971a734f4ae1074ce5b54f74bd9342f4bbca738d260393f43e +d = 024f7d67dfc0d43a26cc7c19cb511d30a097a1e27e5efe29e9e76e43849af170fd9ad57d5b22b1c8840b59ebf562371871e12d2c1baefc1abaedc872ed5d2666ad6 +Qx = 09da1536154b46e3169265ccba2b4da9b4b06a7462a067c6909f6c0dd8e19a7bc2ac1a47763ec4be06c1bec57d28c55ee936cb19588cc1398fe4ea3bd07e6676b7f +Qy = 14150cdf25da0925926422e1fd4dcfcffb05bdf8682c54d67a9bd438d21de5af43a15d979b320a847683b6d12ac1383a7183095e9da491c3b4a7c28874625e70f87 +k = 1c1308f31716d85294b3b5f1dc87d616093b7654907f55289499b419f38ceeb906d2c9fe4cc3d80c5a38c53f9739311b0b198111fede72ebde3b0d2bc4c2ef090d2 +R = 00dbf787ce07c453c6c6a67b0bf6850c8d6ca693a3e9818d7453487844c9048a7a2e48ff982b64eb9712461b26b5127c4dc57f9a6ad1e15d8cd56d4fd6da7186429 +S = 0c6f1c7774caf198fc189beb7e21ca92ceccc3f9875f0e2d07dc1d15bcc8f210b6dd376bf65bb6a454bf563d7f563c1041d62d6078828a57538b25ba54723170665 + +Msg = 6266f09710e2434cb3da3b15396556765db2ddcd221dce257eab7399c7c490135925112932716af1434053b8b9fe340563e57a0b9776f9ac92cbb5fba18b05c0a2fafbed7240b3f93cd1780c980ff5fe92610e36c0177cabe82367c84cee9020cf26c1d74ae3eb9b9b512cb8b3cb3d81b17cf20dc76591b2b394ef1c62ac12ee +d = 0349471460c205d836aa37dcd6c7322809e4e8ef81501e5da87284b267d843897746b33016f50a7b702964910361ed51d0afd9d8559a47f0b7c25b2bc952ce8ed9e +Qx = 00bbd4e8a016b0c254e754f68f0f4ed081320d529ecdc7899cfb5a67dd04bc85b3aa6891a3ed2c9861ae76c3847d81780c23ad84153ea2042d7fd5d517a26ff3ce4 +Qy = 0645953afc3c1b3b74fdf503e7d3f982d7ee17611d60f8eb42a4bddbec2b67db1f09b54440c30b44e8071d404658285cb571462001218fc8c5e5b98b9fae28272e6 +k = 00eb2bd8bb56b9d2e97c51247baf734cc655c39e0bfda35375f0ac2fe82fad699bf1989577e24afb33c3868f91111e24fefe7dec802f3323ac013bec6c048fe5568 +R = 14bf63bdbc014aa352544bd1e83ede484807ed760619fa6bc38c4f8640840195e1f2f149b29903ca4b6934404fb1f7de5e39b1ea04dba42819c75dbef6a93ebe269 +S = 05d1bcf2295240ce4415042306abd494b4bda7cf36f2ee2931518d2454faa01c606be120b057062f2f3a174cb09c14f57ab6ef41cb3802140da22074d0e46f908d4 + +Msg = 3de9e617a6868dca1a1432d503f923535da3f9b34426b2a4822174399c73b1c1ee67311410a58c17202ac767844b2024d8aa21a205707d93865693ac25a24fc87034fa3a7a7e27c3344cb03b87602c15180a5fe6a9dd90cd11af4a0f150207bf2d83f55b12c088adae99aa8cfa659311b3a25beb99056643760d6a282126b9b2 +d = 07788d34758b20efc330c67483be3999d1d1a16fd0da81ed28895ebb35ee21093d37ea1ac808946c275c44454a216195eb3eb3aea1b53a329eca4eb82dd48c784f5 +Qx = 0157d80bd426f6c3cee903c24b73faa02e758607c3e102d6e643b7269c299684fdaba1acddb83ee686a60acca53cddb2fe976149205c8b8ab6ad1458bc00993cc43 +Qy = 16e33cbed05721b284dacc8c8fbe2d118c347fc2e2670e691d5d53daf6ef2dfec464a5fbf46f8efce81ac226915e11d43c11c8229fca2327815e1f8da5fe95021fc +k = 0a73477264a9cc69d359464abb1ac098a18c0fb3ea35e4f2e6e1b060dab05bef1255d9f9c9b9fbb89712e5afe13745ae6fd5917a9aedb0f2860d03a0d8f113ea10c +R = 07e315d8d958b8ce27eaf4f3782294341d2a46fb1457a60eb9fe93a9ae86f3764716c4f5f124bd6b114781ed59c3f24e18aa35c903211b2f2039d85862932987d68 +S = 1bcc1d211ebc120a97d465b603a1bb1e470109e0a55d2f1b5c597803931bd6d7718f010d7d289b31533e9fcef3d141974e5955bc7f0ee342b9cad05e29a3dded30e + +Msg = aa48851af7ef17abe233163b7185130f4646203c205e22bcc2a5a3697bcab998c73a9ffe1d3ea0b7978ce7df937a72586eb5ca60b0d939a7d1c115c820171c89c8116b7e2c7b98cf0f14e4c4df3cb2f319ad3ab0ea25ff14526ddc037469f000bf82100acd4cdf94feb4eba4ea1726f0569336604a473aee67d71afebb569209 +d = 1f98696772221e6cccd5569ed8aed3c435ee86a04689c7a64d20c30f6fe1c59cc10c6d2910261d30c3b96117a669e19cfe5b696b68feeacf61f6a3dea55e6e5837a +Qx = 07002872c200e16d57e8e53f7bce6e9a7832c387f6f9c29c6b75526262c57bc2b56d63e9558c5761c1d62708357f586d3aab41c6a7ca3bf6c32d9c3ca40f9a2796a +Qy = 1fe3e52472ef224fb38d5a0a14875b52c2f50b82b99eea98d826c77e6a9ccf798de5ffa92a0d65965f740c702a3027be66b9c844f1b2e96c134eb3fdf3edddcf11c +k = 1a277cf0414c6adb621d1cc0311ec908401ce040c6687ed45a0cdf2910c42c9f1954a4572d8e659733d5e26cbd35e3260be40017b2f5d38ec42315f5c0b056c596d +R = 0d732ba8b3e9c9e0a495249e152e5bee69d94e9ff012d001b140d4b5d082aa9df77e10b65f115a594a50114722db42fa5fbe457c5bd05e7ac7ee510aa68fe7b1e7f +S = 134ac5e1ee339727df80c35ff5b2891596dd14d6cfd137bafd50ab98e2c1ab4008a0bd03552618d217912a9ec502a902f2353e757c3b5776309f7f2cfebf913e9cd + +Msg = b0d5d52259af364eb2d1a5027e5f7d0afe4b999cc5dd2268cfe76f51d2f17b541bdd7867e23a1bb897705153d9432a24012108979c6a2c9e2567c9531d012f9e4be764419491a52eae2e127430b0ab58cb8e216515a821b3db206447c235bf44ee304201b483b2a88844abaa18bca0147dfff7e502397dd62e15524f67eb2df2 +d = 13c3852a6bc8825b45fd7da1754078913d77f4e586216a6eb08b6f03adce7464f5dbc2bea0eb7b12d103870ef045f53d67e3600d7eba07aac5db03f71b64db1cceb +Qx = 0c97a4ebcbbe701c9f7be127e87079edf479b76d3c14bfbee693e1638e5bff8d4705ac0c14597529dbe13356ca85eb03a418edfe144ce6cbf3533016d4efc29dbd4 +Qy = 11c75b7a8894ef64109ac2dea972e7fd5f79b75dab1bf9441a5b8b86f1dc1324426fa6cf4e7b973b44e3d0576c52e5c9edf8ce2fc18cb3c28742d44419f044667f8 +k = 1e25b86db041f21c2503d547e2b1b655f0b99d5b6c0e1cf2bdbd8a8c6a053f5d79d78c55b4ef75bff764a74edc920b35536e3c470b6f6b8fd53898f3bbc467539ef +R = 1dce45ea592b34d016497882c48dc0c7afb1c8e0f81a051800d7ab8da9d237efd892207bc9401f1d30650f66af8d5349fc5b19727756270722d5a8adb0a49b72d0a +S = 0b79ffcdc33e028b1ab894cb751ec792a69e3011b201a76f3b878655bc31efd1c0bf3b98aea2b14f262c19d142e008b98e890ebbf464d3b025764dd2f73c4251b1a + +Msg = 9599788344976779383a7a0812a096943a1f771ee484d586af1a06207478e4c0be9c200d42460fe837e24b266c8852d80d3c53cc52ffb1913fc3261145fc6da575611efd16c026059a2e64f802517ffd1b6b34de10ad2909c65c2155e8d939b8115400c1d793d23955b15f5d1c13c962ff92b4a815cee0e10f8e14e1f6e6cd38 +d = 1654eaa1f6eec7159ee2d36fb24d15d6d33a128f36c52e2437f7d1b5a44ea4fa965c0a26d0066f92c8b82bd136491e929686c8bde61b7c704daab54ed1e1bdf6b77 +Qx = 1f269692c47a55242bb08731ff920f4915bfcecf4d4431a8b487c90d08565272c52ca90c47397f7604bc643982e34d05178e979c2cff7ea1b9eaec18d69ca7382de +Qy = 0750bdd866fba3e92c29599c002ac6f9e2bf39af8521b7b133f70510e9918a94d3c279edec97ab75ecda95e3dd7861af84c543371c055dc74eeeff7061726818327 +k = 1b7519becd00d750459d63a72f13318b6ac61b8c8e7077cf9415c9b4b924f35514c9c28a0fae43d06e31c670a873716156aa7bc744577d62476e038b116576a9e53 +R = 183bddb46c249e868ef231a1ebd85d0773bf8105a092ab7d884d677a1e9b7d6014d6358c09538a99d9dca8f36f163ac1827df420c3f9360cc66900a9737a7f756f3 +S = 0d05ee3e64bac4e56d9d8bd511c8a43941e953cba4e5d83c0553acb87091ff54f3aad4d69d9f15e520a2551cc14f2c86bb45513fef0295e381a7635486bd3917b50 + +Msg = fdde51acfd04eb0ad892ce9d6c0f90eb91ce765cbe3ce9d3f2defe8f691324d26b968b8b90e77706b068585f2a3ee7bf3e910528f7403c5af745a6f9d7ba6c53abd885c3b1be583415b128f4d3f224daf8563476bd9aa61e9c8518c144335f8f879c03696bddbe3ac37a8fbede29861611feaa87e325e2f60278b4893ed57fb0 +d = 1cba5d561bf18656991eba9a1dde8bde547885ea1f0abe7f2837e569ca52f53df5e64e4a547c4f26458b5d9626ed6d702e5ab1dd585cf36a0c84f768fac946cfd4c +Qx = 12857c2244fa04db3b73db4847927db63cce2fa6cb22724466d3e20bc950a9250a15eafd99f236a801e5271e8f90d9e8a97f37c12f7da65bce8a2c93bcd25526205 +Qy = 0f394e37c17d5b8e35b488fa05a607dbc74264965043a1fb60e92edc212296ae72d7d6fe2e3457e67be853664e1da64f57e44bd259076b3bb2b06a2c604fea1be9d +k = 0e790238796fee7b5885dc0784c7041a4cc7ca4ba757d9f7906ad1fcbab5667e3734bc2309a48047442535ff89144b518f730ff55c0c67eeb4c880c2dfd2fb60d69 +R = 1d7ce382295a2a109064ea03f0ad8761dd60eefb9c207a20e3c5551e82ac6d2ee5922b3e9655a65ba6c359dcbf8fa843fbe87239a5c3e3eaecec0407d2fcdb687c2 +S = 161963a6237b8955a8a756d8df5dbd303140bb90143b1da5f07b32f9cb64733dc6316080924733f1e2c81ade9d0be71b5b95b55666026a035a93ab3004d0bc0b19f + +Msg = beb34c997f905c77451ac392f7957a0ab8b23325bd5c63ca31c109ac8f655a1e3094240cb8a99284f8091de2ab9a7db2504d16251980b86be89ec3a3f41162698bab51848880633e0b71a38f8896335853d8e836a2454ecab2acdcc052c8f659be1d703b13ae1b090334ac50ab0137ddb5e8b924c0e3d2e5789daaef2fdd4a1e +d = 0972e7ff25adf8a032535e5b19463cfe306b90803bf27fabc6046ae0807d2312fbab85d1da61b80b2d5d48f4e5886f27fca050b84563aee1926ae6b2564cd756d63 +Qx = 1d7f1e9e610619daa9d2efa563610a371677fe8b58048fdc55a98a49970f6afa6649c516f9c72085ca3722aa595f45f2803402b01c832d28aac63d9941f1a25dfea +Qy = 1571facce3fcfe733a8eef4e8305dfe99103a370f82b3f8d75085414f2592ad44969a2ef8196c8b9809f0eca2f7ddc71c47879e3f37a40b9fecf97992b97af29721 +k = 0517f6e4002479dc89e8cbb55b7c426d128776ca82cf81be8c1da9557178783f40e3d047db7e77867f1af030a51de470ee3128c22e9c2d642d71e4904ab5a76edfa +R = 1c3262a3a3fb74fa5124b71a6c7f7b7e6d56738eabaf7666b372b299b0c99ee8a16be3df88dd955de093fc8c049f76ee83a4138cee41e5fe94755d27a52ee44032f +S = 072fd88bb1684c4ca9531748dfce4c161037fcd6ae5c2803b7117fb60d3db5df7df380591aaf3073a3031306b76f062dcc547ded23f6690293c34a710e7e9a226c3 + +Msg = 543c374af90c34f50ee195006d5f9d8dd986d09ad182fcbefa085567275eee1e742bfe0af3d058675adeb5b9f87f248b00a9fbd2aa779129123a5b983f2f26fc3caf2ea34277550c22fe8c814c739b46972d50232993cddd63a3c99e20f5c5067d9b57e2d5db94317a5a16b5c12b5c4cafbc79cbc2f9940f074bbc7d0dc71e90 +d = 1f0ec8da29295394f2f072672db014861be33bfd9f91349dad5566ff396bea055e53b1d61c8c4e5c9f6e129ed75a49f91cce1d5530ad4e78c2b793a63195eb9f0da +Qx = 09ec1a3761fe3958073b9647f34202c5e8ca2428d056facc4f3fedc7077fa87f1d1eb30cc74f6e3ff3d3f82df2641cea1eb3ff1529e8a3866ae2055aacec0bf68c4 +Qy = 0bed0261b91f664c3ff53e337d8321cb988c3edc03b46754680097e5a8585245d80d0b7045c75a9c5be7f599d3b5eea08d828acb6294ae515a3df57a37f903ef62e +k = 0ac3b6d61ebda99e23301fa198d686a13c0832af594b289c9a55669ce6d62011384769013748b68465527a597ed6858a06a99d50493562b3a7dbcee975ad34657d8 +R = 0cef3f4babe6f9875e5db28c27d6a197d607c3641a90f10c2cc2cb302ba658aa151dc76c507488b99f4b3c8bb404fb5c852f959273f412cbdd5e713c5e3f0e67f94 +S = 0097ed9e005416fc944e26bcc3661a09b35c128fcccdc2742739c8a301a338dd77d9d13571612a3b9524a6164b09fe73643bbc31447ee31ef44a490843e4e7db23f + + +[K-233,SHA-224] + +Msg = f23f784fe136c9fc0d169503d361e9c6148b0f1fbdcae0a97fae1af7033ddef25cb7489c9963cfcb009a8cbfe44a8510a64a073eb1deae4c324ceb9302008c92c69b2dafcc9077fd3cc3c7c119edc3ced36d176ceaa55ac036bf7f07f6fa215e8bb8196e59a5e1c9af4f98b90ab4970885bd7015fa26a09e03c7cf6b4b23d929 +d = 04c1d414696cc3657dd9df73ace56eda2636769ce7082e064c260be45a5 +Qx = 1f228c0a75b057eb07fe7ce8223ed4163148c1fdab61e0f787271f836a9 +Qy = 0cdfa5655d96ffd5ffb6027bfaa04da7b5d8fbdbb6202c8bb79f056ce43 +k = 058f8511089fcd59324469f6736b92693afe26bd4719e198f1f2287dc5f +R = 016bafefb4933ffd00bd1db6d6c4fac8a06375603adc0aa2a5664083ff4 +S = 03bcb84b8f1990cfc7b88f2b8cc817105cd8e150808e7c87b310cdc47e3 + +Msg = 400bcb297552bb37f2f8135a9314a35f5126788bb6fa4dc74152731ff64c5dab4b902103d85443dec20e16b1d6629930cdc2bd183d4099f0e96295a63c2fe266f5e9d050c401a8681b4a438efe53cbd8f2f43e2a31e9f88926a9c82917d873f6e8cd5ff5eb8c1ca36126b0bfc8c2b0e85a7c9e7a45f1875ca9c82019ebedb729 +d = 027cb1d84865a16992476c9e353283d5d6a40c349a8e9179d1b1f403531 +Qx = 1191227d064176f4ab020faea61330df5eb59163ecb4ea59c23e6f1f6c8 +Qy = 12dbfbf85b3624b9f56446f840602f9b839bab1368295b3ae919cb07c07 +k = 01a41af270269be052a62a9879638e3432a1479b05776ce61f45c0c361b +R = 041a5f1d28b70bfa2925b9428ab8bac9fa174d88ae27d754824c7d16ead +S = 044d359065672b3d3dfe8389fbc6fc751ca6a46820626c466174fb9b922 + +Msg = 5f74d4b35c49fa454c97c05fdb6b9f6822cf1a2295f15bd766dbcb413d77c910bd8f4147e8f317fac2300fa21cb80134d1b6f8ae8e50518c1f648a28506e419f5a6e8f05abffdb3dd2587606c7e9c223ecff4f46b121216730ea13202b59128a7616bb2fd23a7e4a5aa08641cc07b669641313febfc88d64d99447353dae3f06 +d = 031b443f46c4b5224237fac1022ee1570173f664aba0c84dbaa4246bdc1 +Qx = 05f57b0e5f2e175006f4058cbb4ca9a0cac912c551ef1b94e97498fcc5a +Qy = 0f3a554d077b751478f8a2b7c2a9cf15effed958e0ac1a9e3db1e023c5f +k = 07ff6ef3026c5a960e632beeb7313b3bca0baec76cea1fd9b82cedc3245 +R = 0099741698549c32a4e86aab6194527cea703ff869849c538a938585a83 +S = 02ad706c6f5dcff512498d84f1877eb997dfbe9b3d13b339917632d3cb1 + +Msg = 8f92096876d9f81bcd992369d42d0b5877ac969004d17c8627c58d8b8b7bbf7a37e8cb6afa962b9b043bbbaa5bef4a5ee38d8bd31cb5866b828265a2f4102a616f87009cd346fcb8af5519fb577c60d8792472232f33dc615655e53d2b715b15a2697b492f108b7906e1e3597c6911f8cc30c7121ae338a6b747ec368f8e4a36 +d = 048f6ca29f35f253a4962734357c995920967b9eeff1ba5fd2080bfede5 +Qx = 12b7ca7c21292f8795b2fbfd63a28c5a4ec8c850d6240f973c903bc8170 +Qy = 1be9855e5c5a5064c27d1862010b2fd0d7be5a0180c861a288ceac89d6d +k = 07dcb9725323fd7668991ce9a907b7129d53fae9016e253c53d057d195d +R = 0498c4fca6ed7c2998347b464d3e562a74b0e4f3a6c1dc453aaa61bb710 +S = 03a77a13f011404d5c5341dcd2ca44dc2b08f21f09f524045c281fb221e + +Msg = 3d275dbde44494c45fc15fe89e2ae32aa26426a17e923e895c7941a5582fb95df4d49873ab1bde358017f336b911b886b626b744806ab8113418473c441f1964159ded1b12122d53ac56573167588e4b55f36b8bca8c67823883a51fb6e7f204d1c6b07ea49b577bfab9ca6b8d51f72268b022e3a4db6f9d265ee8382f9b7b66 +d = 019b940eabbe682f961d9f3d90432e347fef3910e641656825d775705b1 +Qx = 1efcc9f4576047c43eab1c13e0547b1c5ec1cd2afd2345fda72b5e1b50f +Qy = 0c7b5968af47e58f4ec15c0cd82ccd0b9f5bfde06c7f86fe5cd0105d693 +k = 03f783a94d1de73e4593f5d6d02238cfa0486e3ddf2bc0b95a528038e3c +R = 013c467531f3f6508534ad072edb210e4182ce5a798d8a46674e92a0b4d +S = 0685982aa8e2f3e46ecc03e00e7323f3b891da437235cfe9800139ee8d7 + +Msg = d2fa68e1f7dad02916b12fa38f1849d6d409dbad0344438520b4dd9b77d62d39ac9ae3cdeab03ccbcfd4de703c6e798873671731c108f322b9f2a68145e3e210c9b15b879798e5c53c5022742e9819b99edabb2f44d89ae221f7a99dc84421a6905695ff91928db608f861745f17584d56e34b75c47281435b1b0b34e490692d +d = 07a884b22e29fa9fe945e9ba13c0df8d786dc87cef0f77f069e182dd56c +Qx = 11e831647d0ffd53d75e44abceda753ab470b3cc93b457590617d925a19 +Qy = 03db5bd0aecd6504d904bcf9dcce131abd239aeadb9a64a9811eac823cc +k = 00241b763c6245b83afe61762b161c41467ef35b7f27a9c1066f02babd3 +R = 0514adca3481ac5f99287e6e966a5c223296b07a9456eb582ec5568688c +S = 07ff6a2f7cb1d2594a11d8d0adb6fe50b4e740f025e7b4333ee26163d92 + +Msg = 3830f75cf9df4eb2998c7c1b5fe11c1476bcf849c3a8fa7d3d0b5bc2292e5d07465ab8cc9381c575d909e509c5dac49c78817c04e4bef18bd51bb09aa5897f21634633a5ce6d20bb4638cb6c3927351eaec7b62cf4a33956916045c392f325adafb10a88a5f86d7e41dd77908fa7284210071c22aa40ef40da6339c02da05392 +d = 05da61f881d5a0dc085bb93764f584352882923cd237d878220ec624c1a +Qx = 18d740441eff1f785a14d04da4ba69540cbb469780ffd36e1dfae4f1de2 +Qy = 18072ab30e999ae26b872ef46a9a0604296d02c08fba9477d9e03f0f75d +k = 000f95c5678fd08dda790cc60bfa578118f8687228a2ef5f31e71a6884b +R = 074a6599b8cab75e0cf752e3f41288fbc673d52074950edb14f76524949 +S = 03523804351e3224e816cd4fb7191f332585f68053ddb32a85cc0fadc03 + +Msg = 65b9fe15e6c35d453caa6bad39ee78a720a04b60d8a0a0f049186d2f777e48ae2d657e174df53edb7beb9f7d8f21904ed674add0cda5b62a7308de76c324a144021e8c6d387daaba4ce48bf7dfe9c8aeee2c64e434ece1fa5ddcafcf3e5d0013a1eeec1742a00d384cc2ec0d7eda83bb4dccfb0e57045ebfc27a4f404d03da37 +d = 03fe9f04647f6d82b13ec1ae5a8c2e49bc66b05649ad778eb16149ad83a +Qx = 158eecc6b8918e7813ef990217c603b28ed1774c740382a8af5c9af6133 +Qy = 1bbffeccd41107c7e6f83e24c822d634a7ec064fae125dc8a3ecc4fc9b3 +k = 07731edfb3ef523a165a1b5817ab2805a5cf88043c98ea2393898e19551 +R = 01fa44fa18ebafee6f419fdb9de0e8365520617558b57e9ee89f2c8fc88 +S = 053f1b2da4cabad04fea1111d525f341417587823fce71e5bfd2353c2f1 + +Msg = d26521fd41eb5d46ece6836e188bf9cb1b461d011c41e002a935d256654d01725378e845920ec4a7fd3f379df54772493df50d312c7c6aa4e909e7b83f2442c3a5e85c37d68aa015098ecfb0a5e077370f4576f4bc63bf37e1dee06d780a3b6949af5e21c2a0960fcd20821ef5f17bebf5fd5b3bdda260842cbbfad45667287a +d = 05ebce648ace4cd555413de6a456fc487d14bf4b0b9a72311ef480d2f26 +Qx = 020b46ecbdc36b4dc01111932090ba185eab2cdc4fa89775f2a6177c592 +Qy = 104cac1c800103c79642321a216bcfae497b037b29888cf9f70c507114e +k = 027733120626e564b06ba71c4946c9c8bfae43f88511ec6352d2a52f407 +R = 0592de5184510e6ecb7be8a011f862470b918354a1ad82458cf716137fe +S = 010a9c5fb6e4b70571a35c56744b57baf0108728bea2bf639af1960d1dc + +Msg = b778c021b1a92c41dbd09963da07018075d73e54d62df5c2b7bf8abe137151650d1c1c6abce7eebd8f32e8c3e6d1433773f257bb3ba4a4fb6a02c0db1e47d03c27d3a90898ebd1927c21df24c4c5443ca5b81f8ef2cc0f5e8b3d08f472bf07085df737adaedec63d99acd77b87ba98225f198b791124ac2d9b191cb9251b4b00 +d = 056653c2f85593f789a926ba49fa3da9d7f946d8f1020508c5a527ce813 +Qx = 10d65f6f5415dd86a83bb10118abfc1b1670a1664eb6dae99fb68b85019 +Qy = 12c1e673e575086ec1e76b90d59c2cbd2727f726f88298552b678ba7e60 +k = 021e26c098c9f9da9c782857fe640ff6abb21caf20a093f2277845bd10d +R = 01d67cbc8209494dca1a74cee5d9894f98f03728214f7bbdac29b0c0e78 +S = 02215f758fcf0d8dd603e79658a8061ab45bfe6d854e52ea7074fd5654e + +Msg = ec14e07f615960015a489ef999e308b42a4c571473b9bd64b433dabd9a1b1ad02e33eee9100064405175928a94543a80f440040afa2965b4e5f95f768e7fab6d3c0a5f5e1bf1df7822f78384e80f2955ea85f044ac60537d895747979f935bb0cd3673193c4a32dd7803e48d7daf70a71bc2aa97236615b6411e28fc9a652145 +d = 049a91d320783cc70a5952c32036cfc75d41f1aa84127db2dc759fb291c +Qx = 190528df8fc3ae4db6e12930f176ec9c833d1668ac5808f1046366445a4 +Qy = 1f647d55ce80b18a9add47fd1a8e4aa725297d9da03246f5c1ce503dd56 +k = 01eb80e2596d6c01431e7a4fd9e22903ea85547a31d675ff157a789a137 +R = 04523776d88199ebac2f96f9faa434bd81bde770ad4458ef126fde9198a +S = 054665f31f92f8897482d34fcb63141a7539577037c84496167e9d3389f + +Msg = 89c645339ad0eb850e4e2fe583cee175b35feb02ed7541d7e9aace24cdd3939584f73ad39526de6399c86b36de77a018e2c70b532bd0f032f9137d10480acc30c49f9baaa86f9df0033b77e98b485bf7a69cb5c281e527d3ccd1fce2415f0dda4a268ce68a0a34b16afda54ed922cd6810ac8dc766df2a3a6c5e55972e9786fc +d = 016a20016602fc7088a60469843e1d29ad67e3c3cb9500b1e2a00d4050a +Qx = 04f157541dc3a8bc8a2ad4dfb3933039b67e331b7353a2fa9ede322f4ad +Qy = 1348a7b8c9495bcbecd556870715faf3d543cb8f2368805473bca17b82e +k = 01df1ee39217d7f0d838e8b2d30a1159d8003b06e50a00d637edf08d6d1 +R = 045d16826bbc425637e7a05b826bc907f7453c70141d1bbd2cda63dd490 +S = 01ae1703cf179dfd1d5407ba2b7324cc7cac15235ee9c3756177444e122 + +Msg = ace14c4b101d2d8453c2bc22b756af016b5de537df9c3e639d208ad04ae0bf6232dc90b90c33228dc85de956db771ffde05fb4d0b15e4f218ed2771d703ae5bf981252a5bcd60c16f14483131a481cbe04dc0adb1fb8aa32cb48bb5008e8a8e5c7b7465be2fd7afbc811cf5ea6293b1a464669b49f55f57b93a8707e6042fda6 +d = 00ba922149bada2551b7be1c3df076f3f97ce93c13c50c285fef3f42363 +Qx = 12daff2cfab994b9d1d1ba73bd2f8e7883b2d92f760b0d16351ec125fd4 +Qy = 115666f7c65b95ec2d713c5ab1a3eeaaf0f931b1859733416c3c778aa2a +k = 07fc7c9503fabba0972e0e8892ec6331e0812c6452d211c5561fde79048 +R = 06477ec9d8d8d45418b9efe7ae47c0863ff94c43d8f392c079b870a7cf4 +S = 06b5a5d020b3d980b9d7880130802435ddb4e7362e36a70d193f18a7fe6 + +Msg = cec2ba0d1772c87e87d5bbbd67220692bea4301aa1a66e8dbdd7e651d45c26dc2a0d45cfc32c34d76ae3e1c61db7b0fe1863457b93937d929e6ece7462ebd16adfd708353d6f7c27aafe06593c76da7149b0cc574a4290b0d8fe219f3eada7082aca38dba3f78ed0d5942d095fa5556fc8bcef331ff0a6d5d1f4e6c51d4ff5af +d = 02d635e12a58cc6dea44e71e87c37f91e8d08659f0b7955d24f65ab55ba +Qx = 1dd33d8224ffe63a32f2de5d4fcb0e5f1fca7ca2ade5b35ffbe75cdc658 +Qy = 0bfbe9dfe13f99258c787af82631ce2133dc73207c579b29869c7463943 +k = 04ef333049c575d6688aa04f87a6162185e4a57bb752a7f903e3aff86ff +R = 01ade04af08ea1c1877779fbf6335156b1a1437f3e449f07458d700c67e +S = 010fa82467d39e5ad51cda8fcedc72ee6a78dccd0c90544814e53ba9cb4 + +Msg = ffa13cd0f51ae2643d5d4edecb493ddd653e9faddcffc370e7e958abf726a5d67a2ab36cef42ea8ebe22a6f01b9c31f6ffad01e6894487d979acb5e618f765ac0ec3550ac5dbbcede8f9fdbe52fbaba5c087ff382b6d7a09b2b5084227d324d98ff98793040884799b96d2ca593201f4414f18c43b51c53c5e5059e0641aca02 +d = 0073883e5064e06814fc4de32e15f7a6cf825d2daf6eb1df8c83e25d80a +Qx = 00d3c79d627ee0d2d88f2de2dd082112c20dbc5ed66089454f7b8fd9f81 +Qy = 1a2580e779753bcb023acba1b0852492b989c767f664c7047de8e6689fb +k = 020231e05166271f47a91dd883c580ee313e9a07195ae511f0ee62173ec +R = 0303eb4a0df97577c4cff531b3f54aa282e76669c0c5ebf4c9779c9bb82 +S = 0692432a7dfde09db7743f08130b3d3327dd98cbdc323627603518f70d7 + +[K-233,SHA-256] + +Msg = c73e3dbac9513d0361dabe94071faf03a11cba18c06d131a172d5f0125b01a5eeb6055bf72c7106fe3f4be3bd2b1771cbe7f85366dccfbc3bac20538510c3f51179cc540ddafb2f3b05a0d276899674ab1d7d8fb4f6838f04e4f9e26b8c6af31540f63f4953c85840af4c57dfa78c704f637dfc8dd750fe45e2c1e149986d127 +d = 01532271bfae8d4dfe60f69b88d3006d58e28aacfa701861cde8d624db6 +Qx = 041c1ca965338976b4c45c28b1cb64836b3b4d3e7ba2b1323ea26fbcca2 +Qy = 1a177d042fba7903007db122eabc459e37c2c7fe82e42752b267fafe4b0 +k = 06a54894825644901baf2ec3681ce5aaf93a18757d93ec9cbce7ccd9d65 +R = 03edb77fc7686b520493604db18fc69edb4cad8195a958e27ef289c4bac +S = 004337ecfac57abb9271909aa43ff4e32851df7818dcd87216d051189c0 + +Msg = d00dcd0f3212a3167403abed91c20e76f5e7a7678a4fd970f944d11e6a8cd149d0aa6fd3164c5a74c0f55193a4fa3d8ba6f99cabed10544625a7bd92b3e0b46edbd4a269bbc10518c5268c3910a2aea567ccd32d4c7a0cbef09ea42c20b636d1f711d220e23dacdb9d1146e0494401349749e5ed88e38295232a7effbae3aed6 +d = 0550406c0db882c6aee6cf3b6baf377375208c3e90cc44a067cee43efcf +Qx = 073348eaa8f2885fca3baf31830a2b28bfe983e3046418561f62ac5d247 +Qy = 0033de5aee6d0bd4de286f1de1e80bf72e5e17083032bd4dc24577b6d2d +k = 05c0e7ad0f9bbd522c862326a5734a766423fff7efbe57c51c315fa574c +R = 02103f1a0200883850b6476c7d7e7d2b3e2f60923d028ee6f8227b1ec48 +S = 007cbbc3c6295ceafb3d9cf8411f85a045b11ef8472c5ed45346d26192a + +Msg = 3d36221f87157ca4db84884b8666660c4e2b6af330480c516cded9f3bfe132543626a39bb6aed1964eb5c33ea0b95b9841665417679fceb95d199d55accfce35dd3f2283c1a7ced57d0c4b9ebe3da6e1ff2f979b6440db27caf9f6a4bbfa47e20d29ae304f4d0551fce9cc4097eb2fbedb9b24680bb17d207bdccdbe799d5b0d +d = 0257dc63752920b6854d6c2d1cca68589a38418c3d036e73760a12214ab +Qx = 11a42e9f66ecf030d0446cfb751136347d4df0ee4e031058ebdcc04df80 +Qy = 0fb7161fac8cc5ad7bc4477a39350e419776f76f184e28abce886ae9cc5 +k = 00391d36c4044896ddcd68604d5f677d1df298f46abc00eb12f1165e8a1 +R = 04e19bdc6755a603085b66355256bce98d5fdd49b4f06b628e3e185574a +S = 07697b29ce5546de969c9c4bbb5ea65f712d6cda3410f3dbfa0cd5b1a8c + +Msg = 033d82a42d0eddf58fbe3e91ddff7190e3f9fc2b1e2eede977d2c0473b358b5fce1f981ca6f88fd61ce2f79e453e3a2b77d1baab2b970ed28d5dcff58873a620e195085e61c4b8480d829525a1a944e8a4b63352f0291f0311f1f98ceb262804beec1c74947618f8e3b067866255878c2502966cefcdda4f5fa2b13d92ce7840 +d = 029025352297a7be850f8852411c09259b83219135e0e8949c1bd5b94c1 +Qx = 184345e37f07077cc8df5947c1b1fcd8404b3c31586d6ebd91b240cf42b +Qy = 19dbc9091a5d282fd6e62c34676a06a425e098567b990c47e61ef14d77e +k = 02b2663a449ead3f8cce2459e04cf84333376624d994fd9312401ae57f1 +R = 03af223fd3a6b6b240e59dca83ce2477a577494438ddee3fd09632ea67f +S = 0606576d89f2094572f0bbcb58a15d9a4bf10ae3667d4e35cdd8da32102 + +Msg = 671a7c81b64b2919722d7b258bdbd90165bb757b53106e0af03d0eef27452942f40cf52bc95cc7f6567df2613cce795f8bcfc723b2735efc35375c001d37c58480d89343697146b524835df3dbd333f7c06c98e36d3c4592ecd1f34ab57c341bb0f4c785f5b8372775f74b4bce60763fad1788e77ea158d735a64861320b36c6 +d = 02dc82d0e69e498528925c0e62a13fda9af8cefd047c10c3ffc2e41da3e +Qx = 0e5463926235ce53a85b489c3c278320ed986003962a5fc7ad4cbab0d9f +Qy = 1453e6edde95670a4653186ebd8246c28a94dd84f5a669bd3293176f1f0 +k = 034a8dfbbdc98bb1d9b175600bffd866306dffadcc4bbb6f24e7f918da5 +R = 03cf1407445cf1a619a280e139242056c23c58979f0b3f0aa7e1fc074e2 +S = 02e55f27593f2c76fafccb71493f14daf50073b35cc85f002528cc6d691 + +Msg = 0ef677f4799298f4aab73b7393598041f56e902ced1726af49657b6601a06186212e3ee8cd4bd33b760dfa2ea3c38884f94358d51dd479f2ccc8b0b352fa4e44fcfdcfbb24919d04e6ee1108527b8e8d60e8d1b467c30c18c5455e5835d483161d3fc26b4a67d6df9e3ddd9331247cb18450188752a1ca219f3396a872cb13d8 +d = 041535fff5d279bcd744b04e643458ce20b81df8a9e01b1181d52bb14e4 +Qx = 021e1227457be78e49db22335139a136ba290d34871f90ab5e6a8db6ac1 +Qy = 0df43b381a4d757864c39ce8d0b64d6a32e9e8be30f92a10a252d46a2e2 +k = 03019bd459b34133dc7331caa8976bee67f76db3a45b1793cb545e26c68 +R = 0025611bd4e3473aaea85228b2bf37eb1b4458d8166012aa098d9c1cab8 +S = 07acd38506e984fb7f1607b50837018f9b4246623dcfc9d7aceb486e76d + +Msg = 9290df0cc50c3cab6655f3a6de1f4cf613d9bc06ea7c99f38038369ff2fadefa57a3c7ae7940c1b98bb1d03503cc271f7a891bf38eec93c31dcec7892dfd2e1ab337bedde3e5325ed8d9cb7fa3096f6fafc3beb3a66cba66ba826d1032debfb4908cc9dded8c0099c85072daac4373fbc428fcaa9a6da02181ebc33f0cf926fb +d = 000ecfe580a624df66c25e87e7689fc3b471d205970ff9ab51a64aa12ed +Qx = 02ca7b9c98bb8106ae14a87d5f9f7ae1f99a5524992116e68af89da6daa +Qy = 0a2fbee769eec313cf3c8519d3f96167477f0f06dcc470408e3f637b6c2 +k = 044f065c49bb7ff0772d628104bc2e222f1fde42aaa8b9345d324d7f936 +R = 046301f3f07922d338d5b7d82104597fc50941e4bc0a15ab5e0408f9fa1 +S = 03495e335905b4842b97f00b344313ca7d6a4ff60cfeaa5d589e0a31782 + +Msg = 855c7be75fda372f062709827f333630acf28954a62a5193ff675f0dfeb63f32bca418f7cbdb346bf388d62315b19a592267ca407120db93d4e3d7125b867c4c4670b7a57a76f61734cead2caf2425eb9ff0a63293e8cd6defc9648257b401463f4533a2425e0024f1ea93365eeee3c6da20d25928602ec8b426f9b39f97f3fe +d = 013c72c73358ffa168423149ecdd897f0a5f75a641de008649f00134944 +Qx = 1c70e1b6c01477f95e718f193e13c093b101e9f16024082ac699ed6ebb6 +Qy = 1f8013a88264266cb5cc5bd38e477fe0a1aa49ae4a5ff94cb58439a7c1b +k = 07ad8a117f34bf2fcf7d689b8124e08118e28ebd172f8c220d57d3f0b88 +R = 012bc7d380192f2efe55625e39927ef799993af9451c662b562a239dfe7 +S = 035961b27e88d6731220f70e96d555f63853d14149df7bf6d24fc29441d + +Msg = 9c896f800281812ed57d31623d563377a5c725cec84313472b90e73f77d400f5d4fb236255741b73d46f7e5254d04099bec274db8a9af5fc7cc220d42cc172cbd3c3595c49ff74bfaab7b5e46c90855b611f74753ccdbbabf92e011d52e9ba753b83ed2a251a632e1bd5c6d346e38e743950c8ce0f394a837028575fa44bcc26 +d = 00ac60e2e70b7c4cda64071c7738f68773c94df9456a8ec3bbb468fa7f8 +Qx = 00109614a2ca27b7a749e53777e0f3ee2f57013ee83ea539ada6d98d8a9 +Qy = 05668f4b27213a8a024455b398de2cd7635cb620d7401f5deb4fa9ab2f4 +k = 00098489f0966e27555268a94378b7b8685ac610fb0964694aae9aa716d +R = 06d151437a0aac232a472af038b0fac095d224ce0e5487510e30c31d605 +S = 0563dbfd021c1b77f980530d0120e93c9ee4f1f092a268bd8aba7d3110e + +Msg = 139a14ead998d1a962fa47c47ef2953aa136bd912fe940709b8c560bc2a0c4bf8f3aab30a8e21b7d5f487d30b0097e3da723f11b5cb4e8c5724f5a2fe0d68ee4bacbb85e5eacf18094d2a8ec4506cf8497836a4a905059a998ea750adc54c27c69cbd0b0c1f9743a62f3d988f3fa0a9865a73fc071f526623085a2ef12838888 +d = 060bf720052e8b9508a801340c213cf53bbecf4975faee63d4b44fc647a +Qx = 196e37671def44b35c9e8c719130389b40c7ebc0ed5ae354dc73e0c40c7 +Qy = 0d3fa0a45a3cc5dfb61085290f6d18d710ad5d0d3ab31ce65b0e6915a72 +k = 0729c7e1de10e92634857a65a2ed75103df6bd4bf63b1ad6383c37a0435 +R = 06808491ffebf088476de7daf541bca3fd943d4c2089b848a130abdc0d3 +S = 02c0dcfff06a07e928c15a1fc2aceaa4b4dd6fe8eb67ccd4d01240f249f + +Msg = cf4a8e754b23d0fffc1c5c80b0cb11deeaba3064b315bc2cee96db5b9881baf90d30af4b69066f757b3020706def77a5fc1632d96bafba22a9c8cd3b52d535d941b3c7cc02b7fe6b51639d5e2084478ab3a29d2f5e0e16639fc2833a47b58e2c3fb5b2ea1830fe2ff68e571a8f281617a23d9a28db1c64ddfb1083d055030e5a +d = 07cf3c216592febd8630a478b5b3e3a605084020322adb13ac0a626bc7b +Qx = 08eee2ea13a08d4e4d71ecd2547f6d80b8f88879c9edfab5a675831fef2 +Qy = 05117c0d8a0442ad7b95cac1a984dfb9efbb7eb3c3866955da60e6cea8a +k = 038de0be25c23cbde9ed9fb259cd9a06b69bf15dafed723970dfcb91307 +R = 051c9c5fe50eb81a11c8e7b2db145c6b5dbff2c51def56f4981774c357c +S = 053887c6cc2f21bff461c9182c17f634ee2b301c3cc4af0bb1d3075f74e + +Msg = ae64030d4af9b36c8d3a6af0aff34e5ab201df04274691fb420b7d5c40c401ed7f3ade96065d34f2490d17943e27156e7bed83cd7222d0d5a73d167855fbe7ff6c3ed87f20986ad8bbbd80fed5f9705c6c783b423f641d40ff1f367f9648af5a79ea3cea0236997558bd9dcb011ea4dc64d61ea1e1f85b4f696ed586bc7705be +d = 061eda5999e5a9ed4485d2a0ac5510549b76ca37df858ea5d95aeed571b +Qx = 1642d56359cc0a5f261fdc405030d45b0d6f9c08a182d354bf2687dd9d5 +Qy = 11bf0dcbf62749a99e4b02b284aa7a6479b59b363d25319a5315423a589 +k = 03094fac5381a1b31e53f43a537d9e22ebe6bd2c149f2f69d792bd56f53 +R = 053c8c4f9a30e0500e01100bb97c00ce98f5cc6578686daa1bdbd679373 +S = 047086a88ea014f06d6345608bd0a6010e650b9f6f984b6efea9a4fb277 + +Msg = 94a9d9cd9efa3e4ccf2a37f904dd9cab5624ec9393cf8816ea591c5e70cccd2f105388ae133708fb974998ae61d218c71785f9eb808d1c28d953cc7eed00dd9854b6b4568c5ed5ee3df3b58a1e04c64f1c87fee4365ec9aa41b08a6bae234dc43a0bf2f61420acdb891a40f17f246972afee75a4c0b249dee0fc8f9b9c8a243d +d = 07e7e73171e4d2f2989dc024757c186485435b82544a448f5cfca05f281 +Qx = 181c8cf579d9259020461184979757b097d5a94245a2b9a1f8a6931ee0a +Qy = 14baf1b761a0af3dd9c0521c6489f9a778da824283c94087698daa7cf78 +k = 02b57fabe6b866fd25ad8802c6b02b680c137ea9b623457b35a24d5a5f3 +R = 07421dbfa83859354345b9c3f1ce6242605094d924a4d38c7bd952e3910 +S = 05ee48a3a5119bb3433b53a625101492216421ce67fc04dacf947ec600e + +Msg = 4db998df7b90678b8aa4ec6233c9b4629800ad1f3e2cf8f7afcac62fc6982dcb290e44587015eca8dfe77dbb4a80f9bffe75b11e961e70deed14555db6dae47d49e73004f000eb8677c18f7e8234bf0a5a104266167a05ef07152e7acc2f0368b37efe69c0c2feb51eedf7338cf9ed398f066cf1f66bacd89ab9376d41da35a2 +d = 05f7270764a0444c7159d2db867930fdb0fb9fa6b8fc80ca02e11753095 +Qx = 06806c7164a09e11629e16608b7312d9d988acefa626fe8e34e03203d11 +Qy = 19c4200c9522618dab8a16e217beb3011599ed6cc09291fe9d451f0cf02 +k = 04a8958c80481a18c6e0893da9ab2d48fa6ae30a0f1d0512196e658eba0 +R = 01d301da51eccd15e09ce0bc2d0bdcb215a43ed13792084e2969260d46f +S = 031f96a2f322d27d0bef23ba7c457fdc45a6e612f7d13e9277d36c8def3 + +Msg = dbf9b8a4ae316bd2df0c80db1cb5d7038364a2634925ff957d7c03511b57d486274b2ecf191746827c325a14dc94daacd66ad86d369e3f598f176c4f0eadec7e9edd13e34043efbe0a801b75b8186b4a6d89ceae4fb250ab570d65b6dd7c04382738fe3f6f6c867a7d84b35b20720cb0036a5d81a87126f236833831d9ff00b1 +d = 0179b924afa4acf30ecbe2b3c12de533a1f9675687876a7e5e5ddc8e03b +Qx = 175bf95ac8e768727d3b4a74c2b8a04b221247a3b8386ddf35fc39976ad +Qy = 122f32f941066150c151b9db92b86f86a10cab0828a77e4f0d5c4026540 +k = 0210c75a63699b424585f65497c6e46988c28eff3e0977e3ade599581dc +R = 06087e46c0677e3ca64a0cf030236583935d0dc03c896685dc6e446d9e2 +S = 0252e42b8f03b085f38c6849bd420837d985c9fe14750a654b584c4cc5d + +[K-233,SHA-384] + +Msg = 986d9e5d636526f4deb7545c037fe81b09c74496ddb8e42e61650c74b6fe348593f0cf8f8eca5e839baf62f17bf6ad96ec0c71dc44fdf11259dbfe7499157e402f6bd5076972354150723afb632799a990c44cd0a4fa9609ec4db133e3b4700be3ea4a338e8ba1873d345e80163ed60d0de274d7617a8382980bc2138b0a2a01 +d = 02c9eb4d392d7f2eef606e1861183acb1fc753d666225f0f154d9eda147 +Qx = 0d58fd7b5aa570b1c4b2190ec413fbcc9ef44d33ef191b6e23abcb38690 +Qy = 173e85377bdd8dac58222cd1d0f7ed98d73d6fb6c2eaf34819b08ececa9 +k = 064f9fb13784c99185f334700ccfcc4ff60b7f4d613c3de6dc5d1b8dd5a +R = 03bff54e3610ade656bbe002867168db1b521c49225eb9662950b01955c +S = 01da3fd8c08d8e17692059c669da3c7c4c146df6d3cbeaf34598d28eaae + +Msg = 68d0be2883598bfb1433886aff118349157708690380c42b8919859d96db069c7fde6e117a3669f2cff94a0f1b66b27b09e3f1b24d26299e11552a084be428446f3174da2e0414655bdceb38e58fcb065b6661190862db39c6545dead34a03584632e988d0459659dc7c7c78d4d00fc2aa10465cf24b2410f14e2a62173c9962 +d = 024661c89b77b2c743cc175a6130904461138ddc4ef771ffb9fc2c8679a +Qx = 090383de7ca48f1e71a43845565a9f0c53d2c9f8c2e0f6c4ec7eb6437fc +Qy = 1676582272e7ebc9fd56e1010a570d744ae4fa70eed3e6eeaeb0e0eda7c +k = 05cc5b36c7300a1cc3f624e9e663861b4e296f7e7a27e8f8f0a2d54eecd +R = 039c6f5b484411c434ee161ebeda7aa21b7bb26bde0301d9ff92921337e +S = 02aaae737aedecfd5d53af56ef154ac6430a45ff03a3495a34a5fe0e97e + +Msg = f0ba0407485fecd7337f4b22236533a926cc744a5f06dd08276750196f1bf7ea7984278f789f92dd07e36895a8bfe297ea43d4a1177c0368900e3b969d3083cbe626f0e27e7ab38e185c923dff46d9ba187b2acb9cf4b23ec8eedbb8044b96b5263d956e50cd6240c66d5d96517130c743752404ed09473f05d0004dc5971ff5 +d = 0065e20e5ce534576d7c17616cd4ede3bf4f500894850723bcc9f895f4b +Qx = 01413f6dd5349e94311f1d25e400b69c0f0ea446294eba4bbeb10278b85 +Qy = 066a05055d856621161d4f0e33dac82e5c0cd91ed8aa56e9abba9ec80cb +k = 07377147b59dba008ed0e6b366e511f94c7f7c9088615c6d46f46736b97 +R = 05515a6bdfde3b4b78489194d39f4bb439f58a6b3c3f9e16c8a71590b14 +S = 00778f79083d11efc8ff959f607c4cee7cc8f38b855028ea248fe291adc + +Msg = 3827276694e413c886129c452c9a66e7d09dee84f5f09bf34e4baa308b4627e096c7d45cf6ef45ba1d9a4019a60399feec10fa80e333e2aff1251c85ca48574d9b9e1affb9666828dff5afcef3edaf5e8cae823505a0c73afe76c1bf130399fb06b092ba34ab0ae15ac6c682f9ee8479b065ce75b57213b8aae0f55e4e386de5 +d = 014c85f66fbbd653f1e4e590cffe62c343ba6062df4b271fbd02e5d42f7 +Qx = 18930b4a59a1c0e92febe650347c49e29a4e83cb8c507e30ad835dbc94b +Qy = 0a237bcd130235e34b4439293f15e7a3913d659089e38e5619fa52e3c0c +k = 03c1f8d076fb4fbea91a97800607b2db3fb5a45149c0d30dce79f07e963 +R = 04b9d2c66d8cc55b64f3f62dc629ce8e50ae0bad8a4d14e8b6567fc87e4 +S = 00b9dfdbeecb061a455dd052258f3828d4b7174af972c65bd0043a9776f + +Msg = d1afb8965b48d66b9acb1ece674d9548f83395275f2d8135554cfcc7ceb96450d850dd874529433883709483d0743798db5e0dee955a4f30ba328c7934b8dd9207f3c336cf89141a175ebe23d2faed629eb4236a8aea8300604c3eb7704512f240fda66acedf1494a85058dc6a31bf9531958c332b93cfe5545046876c6b99e0 +d = 030ac7a78593b570b29f6d3d267abb6ba7e5870ee1c8ee4f1ab2f141051 +Qx = 0a409e90eb4314f95967607ea3de9817a0fdb439cf406135262624e7fac +Qy = 04b1dd719434e8dfa5861887736f32ecd635878ed4b9e290c423da09059 +k = 027c4987ff872fe499039b4432dc889960ea8e3f07be42e36a5827b3964 +R = 06829b5e02b5849689d152ceacdddbfa8f68d782b3ae8da23ea48b1acbd +S = 03dba0d2b4400495ee098325ae4450b32b83689349e82a69b799dac2cbc + +Msg = 4f95b71669fdfe5dc46d4b951b085e099de349fc740535175337127910acf24e9a0e4b2f23196ad23880da47b740d77d74fe9bcfdcc44dd7d8d1a181ac290de5cf4da22d5034cda3d8020bcc776dde8cef1786c9ce4d2c2cfb035da61406af745efb7ef1a55f2eccc5000319cf1d6380963025dcea641cfd15a3106751fec286 +d = 06d7516aa040f7d559cae248e485834e8d9bb608279ed4d4f7e1dbcd2b3 +Qx = 127a92888fdac8d4ba9c0243c9aca516bcb431911254bc2cf51883623a1 +Qy = 0606c30fbb9958fb1140643f32c5dd582c2319f71bff197d58ba3e598bb +k = 01104b6ad82327b0445e75cff0efa1281d266a9dfe4019ba2ed22dd6976 +R = 01f247b2850463e362ff8879054d3459b2cbae84b9d4bc005a2ccf4736b +S = 05b3dbdf04758d546e54c43ca5973bd8ceba646a4dd5d17ae5d2f8ec516 + +Msg = 2ad9e17780c824c4f2d1e1cbf19ab85638f2f71cb4fa3518f08085b8b358f54d4f08394a5ac29cbb3cab828c5f07f41eec51e6cd61a5f2cf44dbfa46834370cebdeb328fd3bf681e61011b5c2ebc8945ac7a2a8467606051008b15c89390e111999255bfe28634ce9bc2850a2b55a4af1c4c2f94403c78aba1ebc87386ab7b32 +d = 0137050d7b455f43a8dc2516cfff5a91062c1a2727b27df41488f3dcf18 +Qx = 15ccc90a5f3906469e3ecf7a70c429f5b50fd0ce74065d41f1bd6dccc1f +Qy = 0fe5611b8b1b35a907bc188ad2b1fb7507d1043d148283911af3ad782e9 +k = 04881e879d7c76eb2ee61fe1844567316d7efaef047b96979e6dceb7858 +R = 03799e90bc64cfd7d0246a7fc89a4d8ed0399277cab2af40fa2ec8196d8 +S = 067e8728f4d8398e4e1c25775620865bcc2d4cfe635a1f4c6b7306f6d9f + +Msg = 958773c37d3eba003aa5c489f72118b3022c52b93399e9d8001695664918b86893f4922c7b6e55b1855ed0fd1d8de5dc61af403ad660fec60d7c44bd0102c069957ed804d0d416facdc1a95355ef58554606579ef89b1842f1055cfa2ae118abbc485356824cc09dddb77d0671cb3011b33bc86cac526e3f6bb3293c7bdca1ff +d = 001fd447b33a2ee3595b9f885c290d241422afdd74c3dc4981955a7e9ad +Qx = 0e706408803188263cb149428c60de57ac757f0776e5b27a2d5a859f58c +Qy = 153b5e13f17f0178cd90427f7d608a5659b9e03effebc89da65d59698d5 +k = 0339300c00cf7e8c6195ffb71e509613018e6a417782e4f52704026a510 +R = 0227c80e36e3571e1c783358c9ffed237b251332e8ed05a8d3b454c53b5 +S = 0679a32cee8ae001a18d9a9d0ed7e99e5ae67ffcd54de7b48c62e76ac8c + +Msg = 9cb2c496b1bc7f040228571e005e7e936e48e8f469e295edf914f5648701249a20bff6b98b5e862603dd9f12bb71c160aafe9df02e2e383e9b8a9a9d700f4425ce408feabbf754be543f52204c849fed6c9d3e36e03dfbd9e35c18d7bb2295f1c484a66e73440a0a5aece5fe80b9ade9321ef18cde3eb2db15e4b18e788b0441 +d = 06a061e10b4a6e7001d95411cb31bdea9c84670a59ed61b14fbbb05c8e7 +Qx = 00ad2b726b805919cabc90d058c78896d2dd8a78484c1fec5bd5fb0e07b +Qy = 07e048ddb487f667633d6d030338ded21a2ac5f65373ddcfe1e4a3424ae +k = 013b4a86b70f0e4de6efdafd7ecc993f0d6f231b3d743ee5adf82db1515 +R = 0541c2d3b2c6f0655dd415e327f0ef07b03356f8047117c41e704169698 +S = 00300f45026200b8cc84fd564778281bd1d7e03727c242a249d9ad33338 + +Msg = 9a4bc0a029e97742ed3bca207d5912cb568e4403cda106b00247520ea02008b14c041b8c9b976294252da835f4ff27456039d79d90315abcb0b9b6958a22352672e229665457ec79571ca80447c8ff2a86e6af3dabe7427c8bdcae65e3c6746a56079ce2cf8d22235180f46646a21cd9e86032cfad874cb9c67f882fb037a13f +d = 027ec31ca31acb4d2fbacb49fc085f1261b0042cc755cc97f9b199e7a37 +Qx = 1d521f7abc2fd3b0a10732ed641cc1b7fdd7b49cf61909b215220c5253e +Qy = 019e9095c67af1b89ae6c486c4f9889c3f2994743eafe55bd9eafe438d9 +k = 0151aa44fd97be14578d68f87dbb884c960ab59d950c392e607ecae6bac +R = 07be427f46958538004186d52aa50a0f83d184a9d2f4da2974163854eec +S = 029d4ea73ab5b336ed44556f6944e734e531a5c71dc6c929e7253323906 + +Msg = 8d89e22cf802dc68ff22d43c436c79311e705ff6fd845e77c880f399f403e6d5e9e2b35511553c978171189e288cb2200fd95f84ec5ee9865c0eb9190aff6dacf783ef200e82027fa992741876456472bdf27f2bd8ee55db15408c957a120eb64cd24d299818726a73fbb0697eba726a326719765735b37a2dcff0c853c906bd +d = 04c6f4d88e5a4f4f83196f2dda9dcf2a66eaf94d50c851f59bfcea1d876 +Qx = 1e2677c1305f545472e373615d195d1f7a315f592e26fbbf44c42558050 +Qy = 1638140f48bad525625a87d0e537db5500f034e71e60e8a8c48eea04108 +k = 02185d8ec6f35d5c3f965cd00597d93caf45bbe186d4128bf877ec304eb +R = 075199f4d8af090e4666754a7dac0c1599c207735c0f54c9f11e305727c +S = 008cadf59a224f812d64c2f492e7ad4a923f3463b878dffc75eca5f8fb2 + +Msg = aa1bf5a79e5339fb9ef6c2817bd95725551d064bc5064d6586c5a879901adf808dc2ef7c78ec3b434b84569988db58b5e8e9782b1cbc2cc7c9b68e66f32d4ac4ebe7e75b345f654c7b8a5e650acc9f170f75b7aaa3957cce248cc69cf93faf8d72abc6fc1cfa9ae2d18a7b31ce720147e88e84f6563b2197882fe302449ac5ce +d = 01aa169ea84365c22981bb766bfdad27e373440850569957544b0f9332a +Qx = 1f97d91302c70798e2278348e36bbe01587e0031ac3c422141e3d4c1504 +Qy = 0a95108f6b7ff41546c98f4ea4d1b587a3280e49c6cd0d33abdebf9a1e7 +k = 03c9efc0f72d88168c2b1f7fa1c6e275839303c2bddca136dd19ef446c9 +R = 0639d1a1066465b4b2f443cd9677cfe3bf5bb33e3e9b14cab2d37f4a859 +S = 04582792ba78f782f112711ceaf36f5f0774b92a6fcaee327d687658835 + +Msg = 475664d5e22cbe0da0d0289ca9a666a37270dc71c81cffac91f6229fa39315c1d55f7e0a89b6a7a07df7d391dbdf8fb7af63d2da46ecc3b60110dbcd842da97f98d2b67f562b0364ef8e1c589519024177c8ea079794f271f6d35554c0e9d0a39062383c95721b72f4e74eaafb6fbfbda02cb670a7c4c94f67b8ebc6442e84e3 +d = 04a665b92c0c33a3f8b9eb4b0ec061d40b603de36c87096455102ffe57b +Qx = 0f0ac5238553f0cd74e6f34f7f82563cb01138e5c9bac6d5e7b8b7ad4fe +Qy = 1903e9fd8a5a2aa32913b18bddef20667061f919f8d61a5b3c814ba4aab +k = 070ef25950a795b5e22fe4cf5402f49029c5d97cf9f57f0806c0bbb5855 +R = 01248dcf1993ac2eeacd062f853ebb4b2072357e728f0589258399ea95a +S = 069800eb2e2b3a9162196dbaaf67cab4ae123ea817f223acb6e889f6d7b + +Msg = 9e5397d94465390a82a3c07e3ebf21b515776d18b4463aa5810e6b2f96ca61e92d13e034fa853c3fa45411f51f79df6f799a2c6906e6a5b7896a4576a4464f9e0be2b529a43e1f503fb640d79db6b68f3a3a7deac1b5832fbe86673784ff6db1f8438f7dd332cdd1e7ad9df8b6731aad1b6a72bde52e6bc62d80b8da57822c48 +d = 00531540d94823e19ab2b95cbc6e7492e1effcbabce875de6ba96f53aa9 +Qx = 031ba225249916a5380235220b9657162eef43d59ccab507639e19bcd6c +Qy = 062e85d61366a73b62255c741a065708701c8fa024a15401a4cd58640b0 +k = 05375df0a23646e8033ec9e3ad269e7167a663b97b4f52cf18fbb5f50f4 +R = 05bdf7d643ffde5ea191553a9c99eb42fba9a8b6e2013dcc520298d224d +S = 06cdd9e0d58bd4c5cfe66589ed7c7d15331f3e164dff562b6971af1a41d + +Msg = 3cc4c4192f317e52df6f8cefba6d4cd823c942aaee11b9a0ef5de5c2d181073b7085a55805e9554def8dc13eb978e7396044d4f4a14be2c7605998c062095c929b9c23b2b1b2fa73dd19a0c0af44ca4789f9841fa62dee8a5f91b3cc4b3264f5f67334c3f0772b30bd7431c3fbbf1f34318ce1889b6e8a76ce6d42079a451e56 +d = 022a89addd8b85809e87e0aa2c038593ec277054842854de1197833a51c +Qx = 08e760b282d0ae4eeb2fcbbfdec851468fd8e04c4dec71fc2d5d3a98a13 +Qy = 0849a56b9b0b0a1ede6b9f9522685e7ace3baa57f72709aba705814d138 +k = 05515b025d6196ffdc8bf275479d72b29a752eb3e70ebf07d4c4e7bf74d +R = 041902f9b7bc81d3a88066b03e4111ad8ff4d99dd868d5608d1f43eead4 +S = 059adb96af9f404d2f04d89fb39cf38ba5689f47bda749ae9aa1ecb097a + +[K-233,SHA-512] + +Msg = 72cdef5bdf710978e0aa334b86b8ff4a58630da314eabe98b4d611aab56f55c526983d54d19bbbf9ddba30a84b18aa0bae9f9503e9b222f842f084db83aa39625403213ca321cc0d9c8a136c826e6ea4ec108b913dd0a9ce9d5b8c7e3af53c3876e56a2037ebd6d99f037a097111c837647bedfe4c494e4288ed6427c15969e3 +d = 01df252a11ff97b4421b3a2361db94e908e8243cd50d9179f9e03e331f1 +Qx = 129f011fd5fedf3526f0437ae800a110435db907af60e16912d58523202 +Qy = 08026ed86afa7ec80277f322dfc8cf693089968ed9ceb8c95c930415a23 +k = 04fce14bc83be6f862f06680a32e9a51d1a569fdf1d9b10a89eb9fef4bf +R = 04d7b8d19dd9cabc3c2245a9d2c8431c3151eeb6f49676a865e78c26c2f +S = 0373e69da1fe35ce41ff344447fa7ffe6fc71e28dc68244372745739fc2 + +Msg = 8e4eb88c0b2d525b2c58b8e00f32def90e6dd382301de49e0ac053dbc6b61afe926d85193e2c4948f7402a3d7c614cb2c58e060362b0516a1ba4a7425f1b3d09aa20d4c3c8993a387a3248aeec51e6efa8f558dbdcfcaa13ee08413227c8351e3107e9a3e3ac124224aaea91bfe50c11c1c8ae582e718f50bc5d5c06076517d6 +d = 01d7125c299ebd0dbcc050f07de931c7ad0450af590d0a2d0228a66ac5d +Qx = 13ebde8790a113bdde87c11ccdcbc39e354b193d772921b86657f53f74a +Qy = 0aae910b0e22f1a2505f55fef2eae47ab6d47db6e49190a5469b4b6dce5 +k = 0113d1737bee59f9f477f71f77a0ac1aea86aa67002c34a1b31c421cd7c +R = 066f9871da9a22f07c9b2a44fb6c01ac74ba17649cecc33b729afcb488b +S = 037fad90c288510d0cd8e99e5d930f4fe197df779dfd6088da48986c601 + +Msg = 370fdd80f330311dbb3959666001bba61cdacf20f72f78953d946fa6cba02d24b5003f5452d535609e489b9434f192011f99f918defe877d51349870e7e75502f61145f7c261dbd2a0840926d824ebe9be3c5a77a3a84340aea930378367ed3615a47e3f792c7773f83f91ebea718a05fc62e9ed1d78629b2c27ae44fe8f8d4e +d = 021238e66119844b146d40e48341f522f6ac2f9c8a0b33aaf95a3099a41 +Qx = 1dc3ac1ecb670f867337b752cdbf48bed9f32589366f7c6ba7424af1d66 +Qy = 1e3a38ded8148bf45484ab6b77e0beff759812493347e32d2d54a322a2a +k = 03626adf8e70506e74ea27ce740f7eed1c8b37d50415be6a2681c67ad2b +R = 07a9c9056b51f1fe3e7733c6f54ed96662aa7f5a08a961f91fd6d0276df +S = 05e7600e9fda45bb966fbbb5a9404af961058a128824b6d84d9d47ebdbf + +Msg = f86c4433787c3ec3cb1663389ccf53d62f9425274ccef05fd14b1b8fef676208867764eb98d16d006ee6ebdc27b8d9a8ddd303d941fdd82b630694cdc698bbe6bd524411907834286c94b24ee199fe6d646064277f244b7df3ea2d9d52a9dc6a33d7c8d6dbc919da0fa987a67621ef0829e48310e0ea2bb86fedcf4effc0b94b +d = 015e1bdfdacd87c42ed439f3e243abf27fd42e54f3ebdfb47f60dbae5fe +Qx = 0fb7fa51c1a96baab65fc85c3b769ac84ca7b63a1fe9f507a2ee0c49395 +Qy = 05d450aed449f8f1aeaa9df0131f696c2bcd4528808d2f52b6a73f72811 +k = 070ca3f5dc30c70e576e2d2b30935b05b6e68598eeaafa1bfcb9e156e05 +R = 07e3cdc4207456773aa52b44156801b316a7ac850b3a9e717a9ae7fcdb0 +S = 07ad6de3ba8730ac887f045cae80fe2fb5237a8594e7125c4792d478594 + +Msg = 4117d593aa92e3eae1124ec7482737cd3573fe5f0f2a5051a7ce86946a2abb9e47a0c6ea75b262689b0b486476d2ab09a20efc2fb921419b1811b51a2e15891ae9e45a17ab4b96c665c6c423fc00e2d66df5804a164f0f3c958df6f25d7da6829b1fe162a0a8cf130858c83f3555d6ad627db70cb41303cc6380f7b3fed2563e +d = 00e09410548c17bbbf28a68c3963a52d39743a4f1ac28e6dfe7a6ede281 +Qx = 1f5f36a21a3b7fc5ea37528566da695922d7d9b7e6800af9c1a00f68242 +Qy = 03df4e2ba0c8648cb1fa19663f31786b850e6b80068b8c007f41de08608 +k = 03c0a2a4bea270eaf66adfb297c0e3213254cd87b11edcd90cfcd6f3104 +R = 07b684e337d6778f84bdb7a6835e91877b41d6af4b76311258fbb8339d8 +S = 064a0c22057a858b153ecdf4d275cf5523dacafdfcb46423b5613c85691 + +Msg = 882ecaff3ec8f4023df5397167f238869f78a5c499be19aea85c7486e73f66f0e08e71cf85f3f1b6f6a70796bf46a18e6b555a0a87c2088640ca73051b3dd59ebfef922be0372208fce602d8001681297b285701dbbe24ccb42541b5db4aac1a1c7f407e11c83db15b38cdbc25e930fdc6558f64d9503e214571a435d890169b +d = 049f5bea6e72d98579b78cb07d89f64503f8759dd7a73cd73713c120428 +Qx = 0974dcd68cd85117f363812a0473e972c89551e31c74c8d99f1073eaafc +Qy = 0f306c9051cf3b84803307beb3dc0d34a9758a4f535100e846462a49053 +k = 022a5564b468e706762e3ff934aa22d9aea0bf2b116b61182c9f7be19fe +R = 02e050afb84e1b0591fb64d46dd7d4a939552d68bdb4213f16c5d7ec5ec +S = 063225df0057d5368b2e103eb2181ff5760e6b2a9c13c83da042722c3e4 + +Msg = 99b3b8f876f8359bd6369ce84f9261581c52d744b90261a1427ab9e447e6d833b6b3e89af8dc770f1dd55692d01c8bbc4277a729fddfa7cbdb2ec99133201dde44ac691a77904ca816feb0a1aaacbb9fba85048bc63d73506eb908ecd697caf582747051a3a38ac8930c9a4365f407ed94ca7f2d26913c53f4c010c7ed9d7ca4 +d = 005eaa818690d1ca4838f0bc667be5721d178c3869884260fb230277c3b +Qx = 1f7b3b50167cb2ff7482240bade95f2850a02805742e6e29eabf7f9ad34 +Qy = 0f8038a8cffa0f798a01e333251996662bc3c0ee56d94c392269b63edb7 +k = 064d518f7b8c87325d8edfd42a52793d87ef8db283606dd676be8584562 +R = 07128123004a515e277dd5b571e31bbc877cc966e27ed5b2ab2c16e881b +S = 051d70485148996ec30f92097e4a12b5edf804e03e312072336bd912268 + +Msg = 8c1a83023930a85c5b2f9930521b8b8963d5523a3323d87f862a17d3505ccee01246ee1029b8b8c2b608772c4096d1e914cb398f027d91184a8e94e4feeae121eabb504a2a35c8bc9294edd15ddd979946c14c792ad787dc2d4deffa284830fc90b3f8c0ced6a99fc6de7c41b9ed261402a6b3d702ff86a9392731ecc37430c0 +d = 0603d89cd2f741d734587e77554fe6bbb1e5739d5ff73084d4de8ed69c4 +Qx = 122f2b7802917e4164ac2f54033621c78cbc7040217e5ded6b9217f95bb +Qy = 1f867df743e73806957066c2ab45c04bf1af158e146a9d1eda9e974e0d4 +k = 076850b8ca9e454bdb320da624c0dc63e14ad279185e4f8c9e49905666c +R = 04bc63bafd5bad022fe5db246680a0a0ccd0b50ff50482d3849c92eec7e +S = 07b6d8a8446ddfc64392af0aa1763d45877023c0be9ec78db47efd3c366 + +Msg = f3c9dedd7115339dd3ede7d8d06a44de66bf80b4888ab7bc386cd40a92789042440a13d2cc90dbcacca5feeec1e0e3c51724146e2c4904ed6b05c7b4e9b49d7f458ada695c5d2fc36f1193329b87c1268aa38eda9151430aa0bc004e5d2a61b9390accfc699f2efabfec785eb34f52b1beff1e4c5492e922acc348667d2a3986 +d = 07977b3aba53616dac27b4d74930da23966a88ad98f1769674789c0be3d +Qx = 0aa61b4bd2fa9c61914ae306d69d3ade7d6cf621399e5791dda8a054dcd +Qy = 12e8d9274d5593f5074c49ca34a7e2d64f9d9ccdf42df6087134b811762 +k = 03b8ee56bebb59207e107bb0c16938cab707e425f38b70f0bc918fc1b8a +R = 068502a3e5e51f5481aad31eb6614152f4957eef1becfe3a297b023a94c +S = 07b6b43be63aa79c10876179703b69caf9b03c5401b999a3c5be4737999 + +Msg = d878c4ee0bd6c84652d7f9e68df7b90cc78776d8d1b60f3e4d7465032bf401f1527ca7bfd4a3dd916e13e93fadaa5e5f20c9f47d12f8fc922a9a3aaeeeef294c221ca1adf7df85b888faec8002f17ff202da1be837827619904121167bee2d2cd694a263d9a99062cada3399dcbfcb283597a96ebec129c65e0850ec4cb4e2d7 +d = 050cd20e7eabd29008cc977d0a17e1195d79587b8f15ac2447e15daafc0 +Qx = 01ff23ff4ea1f30663b17d8f1c67ea37b8c5df7009d0c0301db483803a4 +Qy = 0ec6bde92921b83d4d84be8a67a23e1718e575101b93d9a800550a20e7d +k = 041ba36d2e810e47c3de583772e9b5908c257b2aec232d855669d4dae2e +R = 079e96ed1dfc4e31774159ef311805b5f8001203cf37a72921efaf5cbe5 +S = 00b8abcd623b17357f65ac365301a8823365ab948ae3f7fc6a4a0b8ab5d + +Msg = ac3c118cc9cbc8eb3b74d8ccc9ecbd81d1996fb25ca43c8a43bffeb244f722b93c9e969241d45d5b81fda0b399f1e3623687190e428dae077e54cad1eff75ec2f7fbb9434bf716833421bc2634885677579c237340f76787b2eb19b446d56c0f2206099b81493349f4db0ecad0e2dbe85dbff7d7070abb3d3b12ef0cec828af4 +d = 02dbb24fcaf9f3cd5d50d209937f0e2d134fa20ee3c9c2f1fff3dfbf302 +Qx = 0a07240c52e385ecf75525201f9810859123bfd8ce04a5e8f4dc4ec88b2 +Qy = 09bd811196ca9ac45b28031b9f65f9a5c4ec497d995f7dec6eb06dd2874 +k = 05785beb1ff70c7bea89b1fa14be09332ef94b09eebcc9fb1150bfe0d55 +R = 05279bb1b1ad8174e88bec4c723d65eda768c1d08d1c64c332a240a284f +S = 015a90383c2c40ddcf721067b3435915a843f9c4708cc133fd1ee53f442 + +Msg = 700313698cdfdcf0044ca07bf9e5f0702ece7cc66e35decb28d5f8cb7e7e5367a95cc1728a90cc9a53a2b5fcd4702028b742538e9b386f5d8b4a2411579ed9553021a95bd00a73f03c4184a6145aaa367e3af76659d677fe7a2e98f9ddf4aa20eb8d1a1db72c3f5590598801be7ebf44255fd7376d89d998b7068bd1296fdc38 +d = 0047142197d3d43fa46545b547968680ec81688589d1ec8d7c7e90eb969 +Qx = 179450d83cd6dd1609830ec78011143eb64d2d1509ed1adfa085a58d786 +Qy = 03ee40673ac564c6b5732868d0f8a57727150a23c484228890d768dae54 +k = 064f8892245a198c9c819152edc168e69dc7b562ef1f54dcc1960cc7db1 +R = 0293f2f989fb6b6e7cf304faf3f63eef61ab89a626cf8152e15f38bf93b +S = 04948643075cea6413b1c88a9bf11aa176611f56d027f2b165d00d46e87 + +Msg = 0374673e1a685bdee55504ce3cd333f70084dd4ae685464a16924eccea34531663fda60229166478b30193459a3113253cd6494dc26154156252dc6e822552c7c04d790eb9f8fcef2ea8dd79e72f881f7f20fff93cd73ad303c0918ec27c6486c4da61f82bcd55422d16650cc68bfd4b0132c1e7075bbf17dad919095860d445 +d = 031352b49ecde5434aac05f898e6ce4337304845d748f114c14319fe97f +Qx = 187ae6bc9167d9c69ce5544ad650055cb9a4e69c1772322d5722e68e7e0 +Qy = 0042187e9d11a921adafc694b5cc8da9226ddad1b65f764274954b17333 +k = 0761189e63fc0c3b5db92b281e5a4bc0d6fdb30bd14f8e69ca85a211bc7 +R = 0453560e6e725a2bfe0383884ba3b3dd0816d8522d9e0762f781f6b6340 +S = 01aaec4bd98c765e4830de6593280779d1222918d4acf08c8fc3d0aa351 + +Msg = 8b237085f135d6e94592f8d855ca397c8c1028236a3b412adefdac888245874f586d06950ee18118f751bfe26f4c31465ec34b578caa44cf1b7109ac4f6eab7f97ff9699b34271df035d3bf58a2ed4bcbf7577cf8e5792b1945ebb9389b680baeb8518c8fdc5540e192aa4fde0eed0d7c82be2e362b286f582d65752c8db7038 +d = 0176f124c24e4420f6e726a6ca25f09dfa0c5a37e5bf879e7bdd36c3b65 +Qx = 098c37cbd44aac5d5c749524b840fd849652349fb3e02cc8f8fd0a23790 +Qy = 151a9a88da407ae41e52b3dad1ea6031c7a36bd834007c0cb1e2c2f2f0f +k = 022e299985cf289f2fbe2b1b270fbf12ba818cd2b506f642e659cd541bf +R = 0686ac0c09f90a077cb446c910e07fdf23e845487d0333efc65b9b84147 +S = 01688b18cb42082bea69f18511b0fd9fa35da83d738763cf13ef92a119b + +Msg = e3a086ec15574f7017b3cd5f5a47ab7a73980f11074333490dfe9f8ad8926f9ea7c82271aaa74e77133b1025b0b22a6900fbb71251bb6549341a23d194e79d03462cdad52ee0d1b6f5d0d14e1136026961fa3467ccf0864bf7ae3fcc3b68cb35df7324bd9bbe58fc8aa9f63c19feedf19d935b71bf5981c74fb2a487f84e453c +d = 0755c48c3dbaf71042c58cb137f3632e3cf9d90b7b9a58fd378feef3d19 +Qx = 0bd9a720553afbfc5349e4a65a21fed0444c30304f7018ec1ff6fc8d1f9 +Qy = 109a1d6b9cc4fbd0e888d0a2b6883fd06a5da347c0d4f7882fd29eabcf0 +k = 04fedf8785c6648798748504b1c9b6a066ab6606bc9a69534f93e908f4f +R = 001e71744a1b683858444da0d270f43b0d5644424f2b38ef48a639685b3 +S = 07ff8199ffe723abacf1947a828e8596dc49ce655319087e4aca6ca34ee + + +[K-283,SHA-224] + +Msg = ef90f85fbda05e693006e4c64e1dac56223becaf0890f73b5274e6e289a5a1de2c141b825c24d595b3fd18ca855b5c1aa60dac6b5356275b11be670692cdbe5f282f93ac7b2e410a96cb9e9f80defcde98f3449f99e192bfd62040421a0ab8f99acb85369f25e5efbf81439efa8a5e1d9cf781355a0f47b037b09fe4086389a0 +d = 1e846c830a8ec04e8572d1a9d2df044ab47352fb346f67403a3bf87243871b164511c53 +Qx = 12e43e20941f2641154bb66a56f2e0428a7ad22d607fb8af658df0b382bedc7d5ae22cc +Qy = 22f226cd65052071066963b112aa302973fe2b5fdd7bb827d13da7634dd2fb9e3852ddb +k = 03a76f87ede2b5d40a0f10e15e90e29198fc3a03943efea39ddf7afc37ed4e18832af8b +R = 1be2c776c707098438fbd0561de578e4b9449f955a25626f2fbea257fc578ffa1bbbb70 +S = 1aeef69983da1a535b10a47e66d890c4413c7a8cd6a2511a1a670a4c573d4808f46e23a + +Msg = a3ebc17c867cc9c7c28797f6364f6574b80c7ec5b2d8e1542a6f5db8568c15032f92cfbceefa3fe4ee654f690b0455ee5d38dd84bb8665ffc1ff8c849bdbc4aa0ddfdbbca4eb37972fcbcee8cecc1aae21ec736ef61781716b60247b7551ec4e552d0b59a53cec5964c67cf7988787cedf769eabcc9cd5243f58034d96f0e43d +d = 101c5ed48231a56ca0ea85eb45de0e395e6df2efd4987a226ae36489dd8b2dfbf7c465c +Qx = 7011260f504d809baefb54af48c890f94fa5984c8bf228baa4b6ea14d46372390d1a8ac +Qy = 2bbfabb680659aa2611435c4058ed773467a41cdda8250f3490e4f491f1bbae452c5c36 +k = 12a3c7f0b3d64614ff97133873d75c7c1406e316e8cf60d22139dba462055baffe6c8f5 +R = 0a9933496d60716a39e1c3f3bf22a7da546eafebef80dc6f25d0c109ecbc430fdb3e80a +S = 0be56197a0098b022a7914c10f40207da58403d6c7d04edaf7efc96de740cd71f67e0de + +Msg = 60269efa4d0ffafbbc655f6f00578eadce7fc0a7eb7db923dca49b6f2bf3e13f7f829cc6133e022c3c92143c075ab9ced0531a91e6e79848194ab98bb852f40c84e7aebe71fb8bc0fd1f97ed5bb6bad6783d8dc048df42738e841d978456e055e1b8a781dfecfce2218701c7af77e7894ccac5bfff360aab0b6136b978bc39c4 +d = 019679dc589440b11f82b3716e5b2a2bd42c3b1c83e88a28e304cf5148877faf760b4de +Qx = 743ae04e4b07d154ca0749a011c97a31ac68d8e1da3491f331136873598896e5320ddcf +Qy = 776c05891c27fd912267ac166bc9acbaecbf80ccdd887aded2d7b8c2a4a5d139833aad3 +k = 099ad7fba5284e406f6cf200a39e398aa0426448c09b95e691f653d6096a63adbd39965 +R = 0285a82340d9a6d96ed9ad0fd0916216fd20edf979df41a55835ef8fafa00d242ef6f11 +S = 0a8548b405c171d2a428507f7adda4944bade7cda6dc580b1d3f94e15d7e10f0a08e008 + +Msg = 59d704d5b1f3a0605f1497f22f71b8f45b26138bc86371f00a4517554e7f6e7fa5d35189fc656ce68bd2cb8510fa3e3c3df815dfdd749b2b6ac997d443f3954c7a927e138b579801ffd035cea90840733e7884ccfe43d8d3a4a26b430673274aae312abe4ac1e1d7c67b73580fedf2d8de46572493c9205ebf0e8b4d75ccc88c +d = 1703c21fb1e09f8947e12fddf166fda6f685221fbd803d75a0ae377a54a1e494e6c5e7b +Qx = 767564e13ae544dab22c3763c5d330a5571e07ff8f2f5ba3fd729379709b1fb184f990c +Qy = 27f9e5efbd1ff6ac53a6174670eb463b12f70a603354e25c577ea292b13b8e5f022ac9c +k = 10d875acb4d0dc211a82e78c0249e74de16768003b53830bf5648cf911fef6a57f8f048 +R = 02af92243b9dadcf21561ce32ca0744810478f8d5be8e0f83d9632ecd8e86ff467268b6 +S = 1f6c50fb3bdea228a6b623be9e2ea2c371dcfeb0e604ef1029b6766c43b193d86c02f27 + +Msg = 12c8fdba3bc5f68e13f7ff8e7bee876fa68a970afc6924314dae0c2482763ced8d4752cec29ea288d350acd8a06c69289ae41ad345a1b88bcccaac903f2bff39015c289a8ad608606bfd65270a7bcdb5fb10c89bbc2d16dcb91fc9735d66103f6b1f3575622cf4d8209290315b033ee1f79968939410f465a2d37add46af2d59 +d = 071de8eb14cbfb88e61b908990ce08b81e624ef4f2cd9cdf3dd7ca9097d5ffed9ae9a71 +Qx = 136d50e1aa8203a0cd2c2d545b81d00b95c6b43b74b1fba3a6402abf756d38087affd49 +Qy = 46bec77240de7bde85ca4345f27c6df341c72a4eccd2cd495e86376c183ccb34f271cd6 +k = 1d80734927505d8d4818b3bdf1aa2e5c557e5f717a5b3fb856ca9a2161bfd74a130ee38 +R = 07894bf10885a698899b118f57e7da22222e3d187a0aabfb99fac0ce0e134b6b44a5f90 +S = 07b4a87592004d6ef8345415064b4b4672db2943c7e6098a9e6d59ee3324847e753703e + +Msg = 26013a3ddf687bb2f37d9700923906f118d5cba5d8ed5113a0e3e84cff00918125108f74f4b243e351aa5d07fa7c6ece29f5700f23e50286447883d2a058c3258a12e4ed8770cabe627ebea7ef6e8c77811ed7d9a19c53287093e39226236587ddbc63b7ad5e7ad9895c64d1d03ee432d45a067afe27d4cca920ae88a7a68db1 +d = 1d156eb15762ed00c4021884adbfc2426e910b18a5bc474268196f4b74e593a8f38702b +Qx = 0a99b45860615d7caab2f4e9bc01196a61f52f95c6c7fef615a4746d48553692d5fcf13 +Qy = 56f81a0088dec1382f8a3a863901d3443c8792cd13ce13a8f63b02d107b66d9d23bc492 +k = 1999524ce9525d85b562fd13634fd9ac50fb76d83b9d72d6976d6fbc47af7e1f354eee7 +R = 067748d49389c9b87a85b518f84f41b18f52569ba531985b8fe5e1f0cf9cffa958da3f0 +S = 00c44a583c704f69160c6258332f3121b022759b163c74c7c96058fa8e3a9928afee948 + +Msg = c4dbf70b9a2165e7279122460d05ceb8e43e03fbe2ae7c314007fe2b1d8567cac727a10fba5cbead0ddb167d387da8e8f3d6bc0ad851cc32885809d07a776fd4a95a979fe3833610af89df0f454d9edfabe12495a118fe83add5eabb2acf54ba7ba7c4be20fc77478c0a0f0726c4e60317422a612a234a7567648603b63f1c12 +d = 17d6eb1219cab8577168be86b61f372b27ca70fb1f1a767947895c185344e966db17aea +Qx = 65d8e43a290a6957230501509b95a208a6c37ddcacd1e882d97c73c38b2a256caef5e8b +Qy = 02169cefa6ce170ce20a0b5463f5bd146224e0813acff304307da88830b0777b86cd3d2 +k = 1519e37a66b4e665b2e3e59b8e836869a886c879aa1ed47901a6c8a8f365efbc67fb410 +R = 1734a8bc9a13f51d921a297bc6b2d38610c20b32b0adfd5efdd01a4db5084f3b0697904 +S = 0f9f00b25a33b166f09e2a819dfda80d87f6a2419a7b4162e435ee02c0fc10a669df6d4 + +Msg = b1d53b6af1face9b59af11c726b0099111d1adb3666209ba46b1744a528ed0f72be5a1b82423153b896384faebef0362343e2a4599803c08b8513708938aa8a498145fca1c63ba41aff06d1a18aa2a045fce7fcd7e5552a2b98d0df97b6876f06a9cf52a7a40fb737996adda97c3cedf7fe421235ac6951060eba9c0377e72a2 +d = 10ede9be6615b3b2a294d67da78127ffbf3a15bdba6f4fd78be7a60415b5d1a097c0cff +Qx = 6418eac385ce94c1982c216ffeb0b26f9c061ccdfd785ded75efc6a329385898331fda3 +Qy = 7d41f9cf1248a37fb8baea7f3545bbca707a903966019ad56e4dc810b6863e243968b48 +k = 134ac4de6ed71106d11fa736960eef2873223aa87b1c5bf5c823de6c78092cba4726ec8 +R = 12a37587ddf224faaf8dab61210310792d4ccef650c98155a227bf468b7f323575115cd +S = 10982c965331cf8529ef6adfe17dc3fde63dc2a557cab451d7c9408a089229e22b73d43 + +Msg = e78f538b1ac21602b00a09e3db243ef4803b447329c94a1476cd91a88ff790da71421b60092c8a6e55327c7982e7655eb1fd6e40fa9b9fd2f10107dfc585994dfc5bc2143d18794a39f7f69ae679b27dd11ed22040d5e93aa83f71783525a4db0c3fd7b43e57dafd0033d5317680df19c2ecaadcb37ef896c61a758a5e455206 +d = 14f237cface123b64e8578ff33f86bfd2a8181b9c81f36b9ca31e2a446f0d91dbbe2249 +Qx = 7aa347c03d8845f1566bbc3fa1d66ecb41ed1dab0a402405d8300591a1f3078f9fa532c +Qy = 63bd10274437c2690ed6df60ea632f3d4faefcc07a72ae8d85c2f999bafd373053265dd +k = 0570bf3b42aa44c11603d94e14b524b8cb1363306196924082ae71021707c3138503031 +R = 10f7f4af1c1e3f9e8e0c95f991c348bce6725f60aa12ee7b398be64728242088a469a58 +S = 17145a39fa4dd237e31a98daf3974138638b9462a31b87ada3eade6bf7f597195eb28b6 + +Msg = 8a6ca8ec436d2c706fcbec6486b5665b21c174edee7ebe108211c388b1219a8224179f7438e0bb7d6e41ac4a67337b52d4cd9a069fe6c88960ae20be29c8060efd7c62cb7a9a37136a250e68f253e7f27755df53ce7c570135641ad49b43507e5483e17b919cedffdc0d4913b1d5e0ca0629876c0a551841a0fc2090d2857cce +d = 08dbecb26587cb2ed7df2404e680fcfa5bf8cf6a58e87a350a1600211b3c844ca86daa5 +Qx = 66610ce348821a77e8a6eb74a675ad9312b2622ad2e1e6d8dcd0be8b27d8384844a7234 +Qy = 014c15776bbd144c0c24bf419237db9401fb7f97a7c4c0ef50a9afd27c3964088f79643 +k = 0204586a9314bc14bef8ccce8b9ca3874572b375d01c6b4a41c743c16502a27e91a9fb4 +R = 0fabfeb17bb8c1a57af7af81d99cfb7b0ecbf4e5e4a6ed483aee4be8ee4c70c2ef23941 +S = 08071e162dfeb068e3cad256c3603e07ae48b35f1bafdb726cf4ce32844e1a2181f23f9 + +Msg = 95bee02b423d2c6e60252da4632f693a2d8f6597b4f9c6e356f670c3a9e4e80063e92facb6421d0325b99dc150464ed2ec1d0bac72a042b35d56d33d2fda686a75d582d4756522218b4ddd25ed45503d90d3d185cba6cf0ac211b22aa4e1318a8316c369186f7130446dafad64f7966f5414f43af37a87127534060a23c6165f +d = 191badec2d28cbbe62c072c6b57eb5d4644d0c0b3283951bb66096cd15edd43a1bbde53 +Qx = 020224b00428031056ed370147c51e68ffc02e7fe269ca15b22310a2974d383c6c83fcc +Qy = 1686568fc4768158e75b4ef0427d8e262cd0638801ab158311749e0f432d5b69a667f0d +k = 03b1b6ca5e627f00176b599b68fe54e1b5a272c323a06b55e4871875c0e729c4c79326a +R = 1ade251b9360a6ca1b48c2fce0768a01193a415bd23956fee1e5c4c5076b3571abae082 +S = 0adff25020af4e2b4908a33ce1d75c793934921267b6c4a0542924300fce40fc0031021 + +Msg = ccd7f7c0e04d1ef9a3c5617d77480bc624beed6582bc28e9e3a369b12144fcd96b735ee41713f4173b64b28c6102d82dcfc7876e06e76fc497d1d238bf6d85bb5feca630bbd0c0f0fa7c0c72e28e9259087698973ac66244bc6e69c04deb22eaeaee7b20da239ab6333576f01349c76f594498620933b8969450ac2bae66db8b +d = 0ff5e3d66eb57fd35ba4472effd6e7a016ca461e39000a7125e99080f6ab6ef4380dd7a +Qx = 19d8c1d9aca39de0e627981d21e35a628c35fd4096aaa86f61625fcd078f0400f615cd5 +Qy = 52ba2854ccd64407f6779c5e259917b251c9e34ec0d95c05488f30802b82cf4b25b5389 +k = 16c9cabed653c57676ee46c8912cbc507b246078834f1667d0708e4c666346299c1fc03 +R = 12ac0ec9501ac91a2b57220e9c00ec6e815399ede94a658c36f9e89bbf1674316d65dc4 +S = 0c9480160c4e9db4e82b4ad26cb79e083e9e2056e68a2ea554aca45802bbb188389bc4f + +Msg = 65e9124a2606c8784c9489add2999f4cbe6186395df20838d653b263a207ec46995d2685b55d1874e7ef05a6a3bb5b60a7be6751ad568cef1bcea2debfc494d1e2ece0dc8028c88f1b2c6e4ee26b639c5e81f6448bd25b73ec4608a8e8cf4e0155c29b6f0a62781493b03bb7384c9808529d5f87da6564ae196a365bd282f46f +d = 1f3591eec4a8a3fe6ae6debe230d238a6b73cf3791cb735add1abee64239bb100f15166 +Qx = 483e7e2b8f7ff95b86008c3042ab83a4b6a48f15ce1cedbaf3b586b56ab606e6f23a4ef +Qy = 287cbc8c609426f1665976e8120afb8de96b43978762ed44bea5aa1418b9af6922c6066 +k = 08165da5f5427b38c447382c8dd0940c3bddf8f048185e6cad260031f7c0a2ffb83027e +R = 09034633dbd735cec6208bb6f4455b295b7d730c9301bbd1c0e9f101399f2b3425a13fd +S = 0204ec149b416ca3467e92194449cf2ca0f41ca1fde79145f3af856085b298149a3253b + +Msg = e793c60fc725fd537d5fd38e9b4fb52e268722ae6bde5a058de8d20db301f5e8d8e1ad85532198835a04b76f27ca3c972be5617a55677cffa8219eb64fe53ced242efe1b889990979227dbaaa15ed39d3b6be8c5a3237ebe12bd96f333d947f80048463d3859e34f865d83faf03894c2243a06cc96788ed952e606c2d8948271 +d = 05af03cdb45961e7ff35fb0146904ddd6c2bfd3cce814073d3aa56eaa9f13b4f7423926 +Qx = 70bf676b9b0db558eeb8bb94a1248bcb599d1e8975ee13cd37dcb78af19307d1b7e57d5 +Qy = 6ed9bf30c627062b99ff9d05ca03441b6194c34364cbe7b73b46ec9716ad8a9970cbc99 +k = 192c7b1fa8f221edecbeaa51447818474dd9fc89e962e8e87400938ef0dff432a6c4b86 +R = 1df1a4f9578e9cae8102aab5eac70eddbabe4ced99b5bab1b1dee59c41b81e392968c14 +S = 0f2b1319335ee497fe3ebf1891a71cded59704365774e1ed9950f79100e70950783bc7c + +Msg = a57682d21cebb48190199e9f57493696eae3a59acd22f64d5ef4729decf6c2615b326817a6bc118bb7234bebfc7276dd998838c009a7348e46431574638dadc48538d6048d572e50d9c5974d2049ebe1837dd857bcd1447b1514b62808a4e7a88162ae1bb08a0f6d3db6f25874c6cd0cd4ca6333f1bd57bd192ef67e4616d182 +d = 1ec9710ada06e6270720692a06d488ae2ba863b905dd2fc323e7ce68dedacb35fc8c7d8 +Qx = 5cda72b5b068f70b3c431def41b8ca1d4381e8c2fdf0821cfc17eceadf5e3eabf7987b7 +Qy = 79ae508354fe31899cda71e01cbc80e5192d24f1f13c954208d2ab8412802407ae3763f +k = 04f7b9372a8fed536396f0b87d4b20494786bdb8db77200c1aac1896486a05d3c940cb5 +R = 072ecde2a8f506f0fef273c8915a9edc29e440d48fc6cefb50e7117492fb4a13e123bed +S = 0010dbd6229d770c468f5d8bd20edd6928bd8824b7fc2b10dc45fbd3242191e7557b984 + +[K-283,SHA-256] + +Msg = f646e7334e191c2bf0056d3bfd23f03ef7f0777b923f962519a8399d311b8f68414c689ca34b96871fae99eb7ea534fcd83e788e56eeef817cbfe33677283c736b99bf6a626f9515291e842bf99f694e4e8aa7c9911c591a87d5f112b3d96b064594e2b368e6d1bf1a1cd343d54916a66da22c26355266aa2884120fffb8b94d +d = 0668de088c6913640fbefbe6d2c44ab26e481802dbf957044a4957c3c5d0a0fde331501 +Qx = 0d3a50cb9d347cfe45d2a313813fec8b928a9b1defca6ff4b89c4787717f275c6b7337f +Qy = 762e47b0669f625c39c74d50e2b46875ef366b7c3b005c16ede69a2fba161faf6b3d0db +k = 0b24bf54795fa02eb9527f21ead5497a6db2bcc7849a16d206239f830df313dfb7a2716 +R = 0852d8b6fe93b0b36af5d99530eed08669eb9a25972fbea59f32dafe88b722bada98ab5 +S = 0e5b08d410f2252f724dfcecaedb37b92a6c09cde646ff6237007f4199068f945ebebe2 + +Msg = a2d7e69ea381d3edfde4664c56c4cb140d01cc4425df757975cedc995b89640dc016ab419b137ff25a6a6d64a309b23890439d2ba157262393cf93d15ca1b1ffd19373ef12367f8898aaf56d5544c2f019a4854f69b3d8d320e03135bb7b675e588a5c3fe4b703938fa0f964916501297cee2fd04af767155c7739419f9dbb7b +d = 0e6af57cf47de1e6f07041eb5e1a413fb7ddd82f8c7f7ce957eb28a118004930bec4dbd +Qx = 21e31c4e4d412a261e40483b9106bbc1b0d7e7414e53d7b9fd84175229c8cefbbf6defc +Qy = 46ff2dc601dd407883af7dc71a6ef4286cd3b1b6ccee4fd861865bff8fb38ad51b63d49 +k = 08f9e2113d0b223c04e678e8ebdd3aab4816681a9ef08b18a38afecc57d79c971421469 +R = 0d2c9113a18bd51008fd327a55c214c9584b6f1b816cf3b95e7346080da2cb07dcef8aa +S = 19167051872759c36ba9eeb5d620cafd3289e8b7660fc847ff385b5143b3aca38780639 + +Msg = 7088f60e9375ec6a42f705f851fc76cc833c4dcbb3352adcce9f59197c1b7121e7aa661c4f8ad9f4ef280af3a2981e90c01291f7d1cf7d3ae2d96b37fe6975e11b7c6c02b8ef044d1470b1a26b9c72e8c4e7b1dd83c8acc9542e2fc7d211b87841dcceea2ab8128d0ff7bb622b60faa4a89ea7008f7d55f8f9de675bc4596fd8 +d = 19f9b63fde8c6aa6177f2a38981505d04f8ac62bcc21007b05615d028cfe851ab9cbbc6 +Qx = 5a3e567b227869f948180547c2713703c90698dc04864140d22b24bdf81b3996829aca5 +Qy = 5b2ba535040afed0bf6f9d850713e54013729bc6dcbaa336ebbfb9c461f7ac61af48001 +k = 051e20545a0a98dc3fec59e4ebdf101c6aa2768f344c1e19424c1eaae4aaf7ffeb5205f +R = 05fb3329f63587e8febcdec49f92de88366a9f75d0b9a0f374dadc6e7a62b833753e990 +S = 12edfabf1ce434c850b58804f1f31f8afb20fbb36ee69b68668e231e4c04fa75e658478 + +Msg = ffd6044ab991849939e8a29184b4d0ac3e07acb63c7e6b886df9e8254073fa800d5910b9fe34fceb547565a2344eed4de394ce2251ed51ec882ee9207eb7340464c742d9d140fa0964f6bcb1efcc2d13919af4f727953de41b20728ab975c1ae0ce784865f23ed1325c68daa95ed5c932893610179be94f13b9a4149f09833b3 +d = 17704c1f436beb52f7ec97192e23e206ec09f9e8986e06bef71467c192bad6f0066b3c2 +Qx = 329294a36ceae2b2c56bb6e21e52ec32af11aca9ab7785be9c2d79652e7960c0cf7a8ae +Qy = 658a89a48fb95cb7028252fa9792d91b989d7cef3fda8ba9c8e4ffaf19269f2a69f0a24 +k = 0aa8d2e210ae40ba1f9f051ad85d37f7cdea43aad890ef802519cc5773e9a0984fe5d6b +R = 1908e3a2740fa04ec0b23c964c4c3cca51c4603e7553461dd02f8319a7ca2ca09d0aef5 +S = 12d7860d7b438df4653fe40fb9e986cb035b1384464e061bc4ee3bb29aec74d16b0a694 + +Msg = c9f81c9ff7d80011fd41f2de97a6c1e6a22cc2da7b2b9e4c50e1354c3e139b44529ac786ce795fc501dcbf11a935d4728a7bba44b4e86b5e5990fed4d3e24fa5ab6f303e1842918f156e00dccebed6897c852207ae5941c630014a41696882066c2b296d39cd8658cb5830eee78e29a00335a99a0ba90722ceca5a2e9a99a2c6 +d = 0c7d1ac8faa689698f5c6325a3b3f35e7730bdbddabd0693f2bfdc5c838bd62f84508d4 +Qx = 095a930071ce56f28a79a66b751283c756c4f2566ebc2a10770ca60cced6914bc9a0d77 +Qy = 46f70021e7a949c7f55b059d4c8e81ee23b13809a35932d83b8398fc8684c5a90f3ec71 +k = 038ae832c25dcd30c1ee3f5fbe84bd8779c876c0641907695aa598132b0e581ea528332 +R = 0eb27c86d3ca86ef53aef0465d257e6b681f891a6357cfbf51260dc6e35a82799de0e97 +S = 0e8207959e8be94e7407543df80d38d9e662106ed68e1456dd1826602c5b73f27ddc901 + +Msg = a60de761eb32490184dc1d29e21fa33889295ca587b994746874c7289eb9c83e9c7bacbb4066c761a06b65ecd78d701bd41f305cd7eb258c630f3febfbb0a367ad16737b146fd793dab23562e8001cd113135b1c981d1ca23eb3be0fe3e24fe3fe1089caf9fd8f4f0d1f90dcc7dbea4a9e2357793b65daf342b8e6d109c6dd10 +d = 1a173d158866db0ec665ee632b5fc397893f6a44ee17c348e7452800aadd8ce676e7fdc +Qx = 6a9369a93e0b5165ac6e692db035495c5cdd6df243d9756098385ad616374ac1e1efee2 +Qy = 32f72a02c36954cd8221126e4eaec02668f454214e4508cf72b6d945e14d9b7c5d404c8 +k = 0200713a78f58c755db4897f9b7e52057a087816a07fc388d66d34ea9e0bcf2f47e182a +R = 11a26ee24610e705a42329f86aaa80d78934b4bbf19314f06eec46067d85c8377e04d91 +S = 077e35add124574e98e0056bbb106cd28ba8c3bc0c47063ceebbbf2684983a2a0061950 + +Msg = 2cd0320cc73120ef13e83c8144b270c9a1f2049a9250ef7ee83ccc7584025140a51e2227a5ebb824deff55b3affcda63ecb1fd3f337c67c08054dc82fdace0c4bb9cef1bea9dd792635f655363d05903cd6b5ed50ee669bcd8157509366cd85aa40d19593265da26e5641590ccf04672a6df52badd4b99964a8643d9687b499d +d = 05523cfacf4ed3b74ebc30f608292e45173001d80cc801f729c5f71fc213b243f041ad5 +Qx = 410751ae7d8bb2295f584ba3d55eda41a80b8520b02bb4e5ca669a1003d6f2829e0a01e +Qy = 5fe16244f76f0c8b24bd3ca3b53c697097e3ab0e2b44962ea534a655d6c7d80b857c21e +k = 0a634f4cef0ba37c9ab211c57fe6574c67933280c91c8b175fa4164755bcde867fe1772 +R = 0b9f6946a578ee38433e98478a4c31b67e838939cbf128f023090c4848471482fd1dec7 +S = 157159e15a2d16da2e913c5ef00833a8e5513ee4e7d6cdc849fd822c59886d0ca3695ec + +Msg = a743d8337bdefc4753f937e869a36439da1f8c75e1278c3f6a4a969d93787dac93293818b1cbef5b8636e1a6cb3acaac1e15dbe0841c8001512b689292f3f4805997ae26ff52f7fe1842512a020c448ed01af2a061f3638689446ed5f6bed9fc70726ce4104bc11142de63873fa7039830223e8f152996388417c48e0c1fa81b +d = 09f6bd008c04b8823ccc3ee7d5aca535c211f35e9d9e7cfaec518b98647fbe6d28283de +Qx = 70019957dac0e9be0fce6abdfc00ca737096ba2d2bea9ba570acab6d73eae2132d7eb06 +Qy = 559545f82741ddd1cbb9dab0cd06454fda8abbd9d1eca752e57ec05498b14e4189f1b9e +k = 0fe407c226fb15bc63d37cc9840a1a1fb0ac4fc2939fbbcb6e1236831379d367669ffd9 +R = 0e96e301bf1193dfdd2815597e016e0a282d6e8f9d1d67a7f7e7d05288594f1ea92584e +S = 07488687f13c3a2b9ae90536db7868f2bde1529ccdc0c84eb85c53ea979228d1fda7c94 + +Msg = 6a7a3ad614a3a09d2dc5a80204815d0c6471057acc0fa73f3cbbf1801902c3e1cba3c1134a79a8ce61994a94a5afa85ae1a44b2cdcf5153f8625713c872da36aba0afcc5c2f26636dc3f60e04c256a5b023e20e2e7a3f7305bd5b3033fcf05368589f19021f8c9096a88679904b657bbe5b9bee67d6e53d176fce1de9e54c64b +d = 150d2812505c82584201e93f6e0cb875d29dc7bd99d9c0f98e0ed20128886e67e1f1071 +Qx = 12c7750172bea15487a05580891aed51bf81548f4b65c51c6c54b990bae8857a20115b0 +Qy = 3db9e7a17dc8b24ff080d80842f0488f17f7d43a40ce6ffad52c65f5a875b4b33efe3fd +k = 0c5c52dfb50b210ae13c2f664d958b2491bfa91ced638f925941234bcc4d66de1eeeb73 +R = 03887a270eeb515a59a7387d8acbb4e72dcdf13f317a6a93ace5cc98d69a79c64a9e7ea +S = 0e922b2d021cd71e213bdb36ce3ebf56a34617d4dcca30fc05f238a1c097e38d7cbcf91 + +Msg = 65bcd77a3ab345cc99b9c1300755288102a6ccf140bc7d1ad25df246ef01fd57a8614b352033b88cc6ffffe5b38b99ecf03baa365ab5529d6751a3c020d0198561969aade09091434d84ffe13b46df043d0a61e20a08e9c32b646771fea1b29e202d40aae1c7079873c3af494ecf6ef5eda855736c9338b4a5c29a086a8266fa +d = 1b3fb9e1ff70f94bc9d7742ea535ca982215af3df381b5ebdf1db40c7c849a7978ceb98 +Qx = 769a897a443c41ae7a8c1e45290ef39c40887ab8f4aa3f9ee8f3096921222ed7de45739 +Qy = 72621bfa30973da61fb6d363d66db25daf818ce79dd3268ac0520fc99ca7917fa3a2360 +k = 03fa84ee38587f9c848b65b07c47551e27f15e7a87ed0ab705c99c8b7a4ee9e86a8e4ea +R = 11b214ebe67eda2bd6e84c33be05c4373d2536e2cccf152e56b1569cc96d261e50910cd +S = 0e100646cbffa016664bb57c1a67108645238573867c0b595c46e6053f844e5482a993a + +Msg = ed1acc360d02ee6c36bbc223d91bc1d2009a3e8f8dfc4c3796cd8555b0d2b46716f4c8058bf34c2d4954e098274ab9c2cbacff46a0578a14e77fe104196cbc6d2753e3bb5422b8b79fd004ac0aa920eea94925c016ece16ed4dea916fd92563ec65692a61b28ee84bef0007120bb1e31bb75b8ecf68406a71af9a18b4edf5320 +d = 147fa46fccf0805d14c1b84ea59bb8b8283d54ca0ceefb29b5585e7141340c55b7232f7 +Qx = 4ace4c65ce07fe5ec22c560bc553bd791434a691c2d865c52b5e38d541ef191ef419067 +Qy = 76250c829de137b6549d22a12f196629d9d34cdd83758e5daf45fae41872c9b15190ce5 +k = 18c4f89cc022236a0da6105f19c6661a8325d36fa285e3ca71c1a4af3dccb016cac186a +R = 0271b421fd572de8a71d1b18ad2325bc0fb58cabaabacc1f015ee6b14bec49762f1f8ce +S = 12e679010ccb143b7de0c3f6c82cf99a961a4f154be6c87abb111cde2d721d864d7a1bf + +Msg = 2debdb95a21d72b69c545988727366a42b819ca6398a82129c5e3772aea93fac0aae9a27b11969ff0ffb9dc0301132ca2452cd863316cf24ae7696422d4dc68e37316161abc146e86f04b72d9a27a350d8545cca245b2be43c33bb822dd813d13e08a718f784845df8a4ef49b02529871ec76bb3fc1ba31089359f2ede73e767 +d = 0fae097ea56b35a517be5480802f450eb832b244558d0cc922cd4a5b40b84d02ef11216 +Qx = 4f6bda2dcb9560174ffa54f13fa5edf17bebd41399a1dce1fe13e82a2b487eddfe25a19 +Qy = 76dd375f2c5f24c342a8e2491271cebf5b97ac666aacecc8d693a85ebd2a93eaccd4059 +k = 05e3a67091b9e10c7fd20fd70d51162e5d78555059802d0c3b133f49b89f37be6a119ad +R = 0ddf93ef8797571af3cc9a66660c569445a2b5384f95a12d680c570694bce49bf2264cf +S = 02f50d68bda006b88798d87c232f5ed1796c841074f063da03a471e0c00f08b10f410b3 + +Msg = e4e0c6c8fc01244abf81e139c961b6a6e2d95de5dff1083e8a48b40e3e5b9ed909152c92b1cf2263179629cdf76ae553b58bb2e9223ce4f9ffb5f170f5f0c5ec97294c34a7529a897e9397f71198cbcd68bb4055cb8cd6b690290761b3b73303f82788379df145358afe28f2997d191d968929b7a4b9a0f6228797dfaa17c613 +d = 026cd72e6ae19b3f4c53493fba1e8082a8df1fb7da6dc111b47a41f713f49b33f618d0c +Qx = 1c411f5e298c9b61023fb26765cf4132cc78ed77c07c3e815fd43032cdf0ae8b8920f96 +Qy = 35647b4c0807b287014043560d70c9b14651cddff4bdf6d44ead5e87720294ff8954406 +k = 10e9bc449e8480474afffd20b8acd6dd08344981c4a6cc789c5338ad7e486c526d6c4fa +R = 0e81594f1064e018aa3504bac75946d77f9e745673043417a47c0c82488e224cc4104d7 +S = 111bf8635b1bc3f6cb7f9b685077b38d67160d143ede2bd8b6ae93327d7f55c5317f00f + +Msg = 04710947b7c90855ba4e59107b919d4a1df22b503c5c4c33b286b6b08e451e6fbef8ba40852f9f0ee62c9217abe6156bed46ad6f0e25f70f528f3a73d099338c578bebd6879d810e6e173c2b0af1f7caacb3531ff0e6a7856e4c84db355d110febdb21c683223eb5990ef2038d462ddb7962bc0feea5f850954943d53041f66a +d = 198e13c7d95bbbb6e226688719639bda988867764ffa9b029018b5547850daecf58fe1f +Qx = 30b511d719217c485866273ffe2996a19e0a670b7a3fb077944a21f63ca2f22fe5a524a +Qy = 3a4d9a808e8d77c9dfcec6d033139fc33e67d7c8dfd7329c895bfb77f565391c37c8d8f +k = 1721f1ad4adf3c32614feb7f8df3374e24f76a32e27854a57dcafcbaaa3082b13e461ce +R = 14b2622432adcfed7c2ecd2b52e43be7f611680ceb4bedbfa9dd9af54532911a07440de +S = 0ece991128b10399188b18933c0d185e85d111ad401baee5ac376b84c523f130f70fee2 + +Msg = c62d07bb1ef756b6b2fad355c66b5be086b6dc387b37cbc4a63c841dba3fce65b09d3de8f239e3649382d172f065b78f8a53e0283cf345de06b4ee0b4b7d8611bfce92a7d993b1938419afe817611bc6df3ef74191e7e39ca2339fcb5b5cfee3166d09cd52a1a7d3779722aec328d326a11bbafb6aa417920225ac453146b9b7 +d = 19098a39956747de24ded56435fa1e6c30cc2b8088fe9a75f5d07b2f5939c7a60db64ad +Qx = 68cf5a2023753717d89d12d6861c8411e6081c3158339573dc5598b1700148d00b39dc5 +Qy = 76a22dcd4ff4f062eeff83a58d2ce6a1808af8733ae254f5157efa8ea35a85cc744692b +k = 142e4907ce239cdaba562d1fa7305bacff05a75e2927800c7b7ea322b47c9ea47846e12 +R = 104620d752b73379e1e5d35e5b24a793d7a309685c00f8bdb97bba9876999ed9c763d0b +S = 059cab3abb0738d8af4ea6dcbfca6d0ef11b6e591ca109b040347d7d4736724953cd9fa + +[K-283,SHA-384] + +Msg = e4d8d49c9bc566261d9134d5e237d9cbd6b67d2619a9bd06b7c9c139e091aa10682cbede114e1d4777d9cd67a16b7d64278e99eed62bbf25ec5a5a8fabcb0a3468b0e73fd02ac6533e04b1110d29da3e34f33eaa228b78341b357a5d892a61beb2168c3bd5e66bffe3f2080a1e246f55a41ebf9d579e188d16991aa060460d6a +d = 1636bd2be121e07ee83ac5e880cfdfca6a56f2b9d0badff003e872348368c7c2cd96b6c +Qx = 007acf46ab68744a9baaa33ebf6be20c1c093242b0056bb9885d93a4a9bb4640f17b2ef +Qy = 15415c1b671e98f00c1fa364bd69cf998c0ae140485159b0a341994a4e27000e108f4fb +k = 0d0d4886c3500bff68455c41f5840d0313f33ac0155a693d27c66fbdb12791c2b5f8552 +R = 0256b8ff7d37fff7dcc8cc4461984a9bd9661643fd3a68d07fd30d426d10b8c7f4dfa34 +S = 1f516f8ed4372780380a798d2da04d691aec379483bc0d10560ca79edaab453d3e77585 + +Msg = 2d1358fdffc14630fbc421b443d3c22ba10ef34f15c6c5bb3c73a9b8714e4c411de69b9cd6628fe2eba5efc4862af66ff916505023e0514f564164b389ea422d0f1beb92adcd65baf43556614eba25e43852ba65af78f62d64b36696519ef8284ef7316ea52c365b99f63a39e6701f81ad520d7445cfc0113c38ecdad4bf5b7a +d = 15e5f555119c19b055b15b0c0d2813068bfc184f864e250b202384f5728bbbda1cb0f5a +Qx = 13cae2f0c3ba04d039c42cae27de4cf5842a3e24be35d7a3cc7f05083f02951cbeaa63b +Qy = 5d69ad5b7d64d6b19772a1794562b1fa5c2fea03909bc509e7d47b0e8144acb3c26fddd +k = 1b881d95b7de9aed9fb5ff0085ca4da2fbd413b9b947066c98aa0257142c9000bbb30e2 +R = 176f9e3c9e9f98b2f5f352ca74310badf9f598f4d42cd2b26e5ea0999ae31e3c678fad2 +S = 1f2dba4e17470cdf7e1815d30771f352807b38080d44465f86044f5969b017c9059daf3 + +Msg = d6336faa5c3e838f4fa58626eb353d4cff9ba8f0aa0e6c3d0d850e8b22f5b0f047afc97767f1afe2040b85d4e401ba688a4da7a0caca7fac450899092c4fea789231ba9b07782010720f45d16d353798867dd7fef4a324520014ad5cb32684ec50cab742b750e05db040ff51140e8d740f6774a059feeb493b10d8ac722f23fa +d = 190c8f17bdd38669e345440d2c7631d67cee9c6548c4e7b9452377adb9303430efeda0e +Qx = 3235a8b7981b3ff376b6b0959a42cb56631fbb9f82f1694b9e273e6b7131e758fa0d370 +Qy = 444e5747420d7f5ffd6119ef43b998d4ea4a58da13ff6fe7f241ccdfd4b6fd33aa93e3d +k = 0b2a690793107257d7bdc37c492eca48c4c9650ba0d657e6eb62042b16169fbe27f8984 +R = 168a83fcc67e0c155f1fa2329363729872e254f2e0c3ef85f3b3c84fa3406de4191b6e8 +S = 18c0f8e6b486e6d7d16b4103506d74bb2021232c0b1638858295a63ca35e0d6d26a6266 + +Msg = 07384a3f650bd270b14ca388a441af201b7767a2d47e9033f50cefd3af8257ecb38f5267e141cbbb2ab7327d8fc78cf27198ca3543d39553e178390bf1b921618432ad895e4f8153783a7ac22f4ca3cad4560e64f1ee4a7bcad05df98ea49a3847dc2143b27c243e48be59c869a547988e2205358e8db98b635ca21b745df4d2 +d = 0dbbc2a0409ca58a9e39e33b95fdd15080443c1dbdb5874bee991bd1b127047f08ec9f3 +Qx = 5a687605e54e49e3c40fc5ee8fc014a62d72e8595280a66ce7d367aac2df4d16b98deb3 +Qy = 30abd03dfc224f459dccd1606287cc30016be317c6207532a0725c957ca5fde692a9c43 +k = 16bc5aa29cea64ce3297172f36fe4ce820c943908c21c9967697db0cd93bb8a12e42348 +R = 1b1fdf26a6eb2d736b8c1ab165af2ac31a4c206c5410f61ac7805a68992dbd62b457708 +S = 14e9a22ce703d942a4fe2e84a4c1c1b44538a33fbfe904bfbb17af6490d372acae4668e + +Msg = 824f26dcb4ce0ca020982814d5c727e629cbeeaa818c49668f8f6d743f0d0ad362b24cbac48027898f386889ca5411d7d1f9afc69493b1d9ae4d7b695c9fa0a30bb59e6be2cbff79231767e96cd8bba349fa2f97955d56f05430ab4ebd007064e3d5add94dfe255b6deff19650883ce9966e1a2affaf84d9540f65c87ab1f936 +d = 05495e6c59ca1873f36b756579632fd47f9fb95b64f52589d70f2739aa6a3bf8cf8c198 +Qx = 6df40d8259be64c8ac64a28359290bd52e843f330a68c2b605ba4f777d7bd7a798e9344 +Qy = 458667cd7021b291c3415d64f9b054db71d3fe20f232f2a2286aede89ddaf1ee8c68aa0 +k = 138f05303ea63bad47c4c9a9d43c52c264725a668db5b631d9892daa1b71f62656cbf73 +R = 05e35c1f3b30b43cc9d60bf8779f3b31e053de0a390da50ea676dc9722a17ef00d68aec +S = 1691ecfb826fef1ea0895242129cc3e9a14e1f84fac49d62ffc0a3455ad9c97becd5980 + +Msg = 07de1e4bb9be15a710a74806d4447b093bc08ed04392d1bd5abb414f5f4b4d9d43520d0e46fc81c2a97e71086b28e53242449ed37fd7ed1c5772dbabc430fcf82ad20437b38eac15820421e51912325c872894452c3f8a10ddb040b35308e583c155c3707b52df467c4945f4e1071126ed46611a3253c297f5cbca9e27f58448 +d = 1724987c9b698519b6c225cf1261b77d0300045e5fd774dcbf13f285e6bd74512cb7edf +Qx = 46adc9bd5f0cc0d8bc64f4ba491eae3b7f6fb4229bf94b804807c6137787adc0fed4b2f +Qy = 41375e2c89da41af84529811ce7aef26b983ea8add6e37c32f2b00bd47f23f25e5fe194 +k = 02ea4ed0e87687a50dc3acc7f4c089040ddd367d1a3f470a711501ccaad63c201b87ea6 +R = 1be198a1b6e91453018513902f0a8a085c76a2798a2a0538ede30dab65afb6b9b0496d7 +S = 16342f87a813780aec006ee218a615c4e1c78c0c759d48d4094639b5b4c32a9658c4d9a + +Msg = 1edbbbe71057bf7d0bfda922be21a3a4dff57b017ebf6fa99651246cd173bdc9b11eefd048ea599c1f98e907932aa04f64ed0a007831f30daf186c88807400970904d6090b2cf181e0f65f03b4234aceeb420867812562e47f452152bb1ddaaa48487170d06e47c5e9a7c0faa4fe494663d2fec22f7665ceffffc214b21c6b8f +d = 1a5489091cfd51a0970508ee3e8449081ed175928ff8386592c83043a7911bbc2f8778b +Qx = 0aa1562c94bd16a3f8a1d6c465908ce3b83ba6711e7d8b0b9353d3c55d13dee213aba70 +Qy = 103a789854f63a139e31348f1b2608f1e71c88b5d42809f2460642ff46a470ad8573543 +k = 18435a6d3bc02b3019e1b156ddd6f3e1bb9c5af70d1a2cd2089e677cbacc21624ec8947 +R = 031f561b668aeeb4df43a3a34716c4e67232f56959104b7237b26e3c95dd40e15eb076b +S = 0f2ddb6e6d18a7393425c16b3e5a5aa232cc48198d63e46a601cd3ed221a8427178a0bb + +Msg = db5cf1de38a5187af11c1f0f19a36db52f8417de997229e83072fb51a3b7152a3b383e9919c1b8427582e53d4e7e25433d46cdf01492021c237ea0a87d38c71634743115a6b2aba66d3faa8003158340a5078171e0bd55a6e5d8c7fb2631a31c1204e1479bbfe79ac70d5e5823af502922a900576f0088a33e42ec3e26c0089e +d = 1a45ecda0788fbd7cb7a716dcf4c6e83d4148bf63ed58078690ebd238c00329c462590a +Qx = 7a1e2fb4e8e79e3946086fa65042362418db0dce51541121c73972a435aecb99f634023 +Qy = 06bb02df9899ac3f207732fa7cdbc36a60c17592af7ce06b8df4255110e26a02b231800 +k = 1c986f88ba3d5109c0afa2c213dda8df462282f024cc8efc758a5342a0de91c40452443 +R = 1efbd9e0d912e170c9c55bfbdfa6106fea4a4e013e7dc26628a1aea4f6b806a51866003 +S = 0b1347f4f85adef612f5c3a436cfa59eaced5c7cfdbb69444936d71812a2ab2461bbb5b + +Msg = 4adaa850eec8272d25d76600aacf2cf66e754f6c5efa65c55a2a31b7bc69437d9a7e47c6f51c5da93895a45221f5f92c2e20ee6a95eed3cc7249688261a35d82872284900eb54dd1df6024ec48963ce43e8ed8b8cca8ed22beee8f0aadeae53726cca05443316537840ab824cd1b595f36064e9a19333748d4f4972178e7f5ae +d = 11461776c33f20b176dc8f2b0cb2446a9b69e55b6c7bc7457a7fb4639116b452b79661a +Qx = 043ba7157559659954ac58b44f19262bef9e3a00829c70af66d07cef08ad899d7f8ec23 +Qy = 1e8dd9c947b5a6decd1a26fc5d0eecc9605d22abda747fca038571bb37036d9034e8061 +k = 18b231de7fc499b461afed9b80f4405bc005011865cdfeb25570b7c0ff79b6ae94b6ce9 +R = 0fb203f47a4e2e9365ce070ee7fd4540f3f7e9ecf69b4400eeded0f5a7bf6e5a5c6d004 +S = 0e635dc65233f27b8350db22b90a3b8611e6fd1b3e0f515e42fe8788b1376079816308e + +Msg = 11d212a99c39fb5e4ca0096bbe6c81ae1490e1b8e07374b4e773bee4fdd24a3c13d653919db663d2c32aa4db140c4ae2d472d4f878946e527ad33b3dc93012d97458f96cb622ddb56f1ce7c2474ad0d5291dc35545de47b7053d137a8e79dabe06757ab53e26eaf751111bd27690e57ffdab5337eb6f81889e9d1b1ac729012f +d = 025a65f627db2b4d6cf83c5b0c00265b9b63f7656c5e3382139e4992bcdf3cab502844a +Qx = 5a35e7e0b914a3e01ce3a885192d2ecd27418e09898631de122db0c48e8b58658720fcc +Qy = 009eab47197d5f56927848855b6ff96db7c36f810ee7c89b305ef780ba8c993d65537ab +k = 18516ceafb61cf2c7e7c511a8918bfe394c7fb2fbc40fb3052e156cd4020fc674684f84 +R = 1892ac13b86ad00e38ce2427c8c78c93b08605a75ca22b3658132dcf9d9df7c4b5540a0 +S = 0437b33615c16a85ccb8c4769ee7c5f94122d31e2b5fe66291b401fd90257ebefe33818 + +Msg = 9e4ec74c09528fdf3153a0f6955f20c70915ff524b2e19c991ec4c5b41ea9185e3e876a02ed6f27c9b3479dba951bee8680c4c99be1a626808114408856994be7444ccbd5ef9859fa479b1050bb836034e20c531b4d618f5843fe1d4b613a731895b489a2363f3f5397d5ff964cf037e9b11e3ff5e1c3d403e5a46b8387c1241 +d = 173b28fc29f10245221a907778708b3ee62e0480aa9051d4c3eb4e8d552e6aad5509943 +Qx = 24bb9bdef975af892ddc1bbd31314926a9c81f8f1864829edafdfe2744e793c100c0483 +Qy = 28ddde61b4361ced9c391c86c28ece9b902c48d14c61684962007dfd69d0468dfd65e7f +k = 199af64f79ebbc5b789d4676a07c224e4f6fd33285e5a555ac90cf65d0b669bc58ced4f +R = 137d746d515b90890a413685bd9b26a1c05efee4c11a4b40bb621c9fa2580c46c20a687 +S = 1647f70ab7c68a0f522420893a466940ccf79067b323d940369f8b8694ccc3fc0daccad + +Msg = 5fe8253d2134c434cb0866796013722e82184638b024a5a30938039929ccd8415c71f71f239c5c5a81f7a9cb493dde209f189bcf766c17c6d9589cd0c7de7f07ff9f24d2320669b589d084f8a8ea71127b9760b7355b162616afb34bcdcd416f1a062035102e29b70069b2b4dbf70179b8d60bc2ee5a455efd40194533bf560a +d = 0624616adcd45e1fdc6cfeab2b17230d73d91fe0b39f4664f3c6891554f9b8e238257f7 +Qx = 10917ef84bd5c0b36c97cb5586d3057a34f2827f239cab2af2e6081c5bdffd48dccb0b2 +Qy = 78ab47fe1bd3e28055c688c78e617ddcf6c5060123e9d65c562df2e94cac973ab3b1807 +k = 0795e229185bc1b3d6d69b08189fdd7a822cd18ac55971e4b35e51838bf12eacbc50e2e +R = 185483378a162b8edd6a12f44e3aa4ff829630fe3a1c9ccc66e34775f69bb6a94282489 +S = 01662cde6cd497be7966a0a77b0626ba3c4b82e20bb3f2e839178a31aaf440aa0e059cd + +Msg = db49891838fe23f0530abd4a4fbba5ea970afa5747f6a0a10d2cf4d841581ea2178705c1203f00cafec91d0a72d25448072c9cf7d7ca5580b39f8589ec63128faa95cb0689574a6bebd515049a1eb9699922cde0366b5cd58aa8f3d3e847706896f7e1cac667fbfe94b2eca9e7be79a810806ca4bf53f219bb30532ca2254c11 +d = 199757ffaa2c59e198d66824eaad37cc42d49b2e241b6a60382d05e425e800eaaf32470 +Qx = 6ad18bdb3e51cc053f56b9f9c35e2d6eaecbc9749f41a9ffbf54634838d7745ca064890 +Qy = 5dd77c42b31aebbbb46277176df08d81919ee0d9ddf14c3e4c0cccb207bf649c48fc8b9 +k = 109d6332ceec5ea211f642a746a6ce055986b4a2feeed7e847904f7f411bf8361318d92 +R = 1a49fe690a34151056d290790a6bfa7b70958e69e9baeb30c55efc61dc5dc4934f2fc95 +S = 1710a4ba5b404d65f66a8fca2751a920224db0cc0266f7b0bc054069ea4cc51b1f017bb + +Msg = 29d385d09c1142a7c181fe4b6e6132e414c15aa8605b44208c0399464613b966edcc2d46cf203a3f85d943d8eae658695dac74366224a0d0348083bec0106f5eb8809ae8d07f792fdd7c48fb1a25d5ef3bb9acd40b20c61c821024a9acb2ede321bd2d0dda849c22d76f421cbd8d51565d3c4266f666455ca1c0c3777aa44107 +d = 06e51381dcf21050aef2e9b97e35303cf3bd91956854ecf9b6b9827871d2efbe8201c5e +Qx = 52fee805d7938b8b97459b9fcb4b80cbe29f20a9aaebc07ac019539a4a966c5ee41751d +Qy = 78aaae02974de6530f285b4bbe87fd5d0c9a2ecfde5fdc9a3303e4b988f673c778004bc +k = 0b426ebda6628125d73efd84e6bbab6c4c8fcf7fa29ffb3c8d6b0a861dbf81cd18d088f +R = 1270045e963b59e4a4f1237c2240a5b26a7ba8e28ea01326fbec00e5d95d40e859d88b3 +S = 1d721477ee1df1388e1b7f92c048e5759c060ce1291098a2fa647974a62a258a189b4cd + +Msg = 774c1cb8fb4f69ecfb5c7857d46415568d88f1f9f05a4bf64a1e1ff6d64aec16e1d09292010d1f067c68dddbcde06ea49be2ad3838053f0b9c0c2383edc451ef0188565118e7b3c66a4fa372b96633dc8a753106283b02d0322df273d58cc9bd061ec219f1e1a9c8ca1400e5e39c1b2c254273377dc98a1a2c44e5c2a5b89167 +d = 018adcc22cb9a2db64bad3d60f1608c353e091637b948914115ebd43679904f955c8732 +Qx = 0630bdd8937e961d5396f9ea5310123a340ba316fbb7d79bf8573f27a0065c6fd6f8890 +Qy = 737a0ac1116e0e2979f973cd705588a71cec5e2a9f22e7e81fc61a4375624f55a6182bc +k = 10a0c04762d02f9d3014bbff287864743426cee14daa43b22149ce73d1ba609c0ba6be6 +R = 0ac29b041a6b95f9ab685470f50445d416df5f7ee06313185794f2b542fcc00606bed69 +S = 00a4241b97b6ccf0dcd533a15867f5889349ec353395d47e31c9eb6b8785736b3e285cf + +[K-283,SHA-512] + +Msg = c406aa4295f85c854b4db2de5a7a2defae53a319866921a3673af5b48c85ef22f6eb4cef892c790d8e64530fc20c729b2821b5f5e515560b1ac764106560c3a6a05657e34cd6deadfe2884bd288cef4ca92e1f25adde7d68a30fb0a1b3678156ced62e466718e68e9d67099ad82613b8d06bdda1a7b867c2455422818ae9eeac +d = 1898276f159c10d92d8d4b6ae214d68c72792a4b5f1f79936ca3c063dc8d9a88be439e2 +Qx = 394cf9bb273923c88be7a1c49412ab8599e0cc5509926102c122326bc0b34243f7d1cf3 +Qy = 72330906f47e8fe95f63d0f0aca1115e77fc702a923c32a16505bcd9021da05fd9cf63b +k = 058772fbb30227a136de616ace4a0334be0996d60e9772ae9bf672b7c38fe3ee1b24f98 +R = 10e0cd3fccd1728e99e2294efd6dd4797b6492ad95a789aab7fbd177475a047f1e5d38f +S = 0c5e0b2d1991718355be14bc57e2d6ff9fa63e0812b9adae69f64da610cc6cbe36fe4c5 + +Msg = cb2809152f8258660933472c06ddcdb65f6d5221fa29d5b0efec9c2a7914dbbf9ce0a468ce146fb333d26f510a87a6bb01bf8816756a1b5df81c5f65360957cae84ba038e37e88777580e91c34e2f5aef4fb55af7b81ad28aeba05e0b1c64a15381a6719fd2c16e38a441516e1b394952d984baf9e051b1dc1bda2e12f8ba5b8 +d = 12ff37c808c3cc029a9cfbb67a5ed21f3bf362b49270d4ed0f1e38fad25ebd79f112a50 +Qx = 0cc00fb36bf62e777a9f6048761e53633b92866158200c43900db95aa1342b576029090 +Qy = 55d7e57221ad939f5639282cbfc203114ee69baab4fdf194f4d2a937d8a57b70b54a907 +k = 163d8eec726d01a1bbb19995777919f68689f7c2920f3549fef966593c4fb012a5c3a1e +R = 0cbf5c3bf1ee58869e1d3c15a05c23217f1c252da97f79334bc79efe3f5c62164669ac9 +S = 1fd51644f471ea497b0560b65fdfa2fd0a6cef469021303f97753d22ce1993d1ae5b96f + +Msg = e060af96d4a7fe512bbf26be9a27bb6a8ff37547d4a7bbbfa710db24cffcfc760dac120f89f642880db2df6307f9ea5441d5932d49762d182b29d8e7fb067a61ab0df622f75cecc917e27d0326085d34581e052c85f50a37713e27518aed7c4434f86970e00a0a4b8503989e72614131b7164c1bdc82d2b6aeac0787f9838476 +d = 02b8c1fef9c6def32b5f4127273ce384b6add4aecec957c1662f52334f5ee97f49852d4 +Qx = 36a4fe1d77bc431012d25ff49fb5468f975353be70e7507d71966a0ef433df51dc32324 +Qy = 58d705cc883a690641f0ab85af4959ef4258a7ba9cde36dab77c125a1de1d395366584b +k = 0865f59502382b324e1dbd75db150f342336fb19145fb43a733971da555ac5828a3457f +R = 1ccb2e56c02cbe8038bf78dea256704ee6e51054668ba8c2ba11aef4ac6f9320d46ee8d +S = 030e662c0e7d47cb3b835c63599d0c9c2e77ca47dbecd7ac834c2babeb039eb630cd0ef + +Msg = d235c31f0a82957a087c7597673970aa39321d4c2640685a03df8388b5eae4825d1fee29926f416d5e62a2e9ca1ea7cefffd31607e750fa9675983608e0f8dc895371b190574d065c5c0c23ffdaf49e65362914363a3fffbc2c1bb487cbd4f69ec22dda5c7dc3bbab805c81faa85787cc176bc0e5703924f395d8c9e7e7701e2 +d = 0afb1c45e9a9f02942b8e04da4b815498454dde6643de186625a98b3c1c6993abc8bba4 +Qx = 02fed49c59e9d5c09202a5dc29d8dd527a870a180feded66ea6fc94ee094122ae97656b +Qy = 3620820bdd5910037f5877649be38db3571a9c6ac632602d2013d0d5abe1f00133f6cde +k = 1fe749d9916f11100af525ee343b3b74a493f92339e432a482dc8e86ffb5affc4630037 +R = 120f6f13331cd4d1a5b9707483c74dc0722452062cd4534e94cf40840d22ae263244a51 +S = 0bc2e37a481478f879de612cf4a833f7e12b8df33f5b0d6ac5f5aa431678ff053e2bc1a + +Msg = 1a2559777a5fd8f269048feda82c4d9fceca95803f84a813789d6ed070422240e443789c5231d63d5268ddebc060dfb99c4eff2ff115d2984d8bbc5c05314562ea6864fd543e7e0a3b8572c017d8ae3563027d79bbe164d40a5bab354720e45094b9b26391ceb55339592fc2f10b97dc9c2649f7227648f5cd2fc46d78d31c0e +d = 0ff537d73a4da0ae3a4894016b71dccef3bc886f3d24a5abb7dd96cf8fdcbdf0fdc5e51 +Qx = 01bd0537dfb29f727f91fb469c31164e1bb0ee192a5b89b880f3fa40e3e5437f0d2f9e1 +Qy = 6df9bab2f9198494094a63f2ea091f60108449f0741806400694a93702f61fb0351a81e +k = 0bbc511c6e1772ca6cd1cd308126c18c5db498055a4b3f1cb0dba3285f6d38b083e647f +R = 1ba756f3c89b732398b90bfa2f92b2a77159c530a8020b75cdb9697c6d75c18d36040b4 +S = 18207cf326bfe97d657ac4197ee5c20c75431ee552681a92a5815db0d984fe597700bbf + +Msg = 658c0d3f764bbc952fa55a258bac16a5bb5184bfa76cee06baf9ee6b9ac3f116e08bb2406b1dd4be487b057f3b29c2043ebc33019b2017c4deccb86f50ff15fc9248ea5fb64261120b1960525aec3cc18827c23291722c5add8a3761ff8516c61956c62b8cbb13f3d92bf3eb45a70704c01bb3625d21c38ffa83a6db086ee968 +d = 16000d2e879906d1040b32eb6ba3caff700e5565871ac75f10c5c15b509964bbe5e14c7 +Qx = 2ba89255d1c89e42518662611e2efe3b5e3b8043926ae9c43974ee2986185269246a433 +Qy = 2b87762b9ada81bde958d1f9b81246f49098695391ba3b4b3b9ac5727f19fe42fd07946 +k = 14e837476e628007b2df21b5035a39c24cd4869bb52dbbe13c9666ddd8a7e3eeae29f65 +R = 1b5091fc755c0f908ee13ef9bee40dd16a5710befd1e265a312e595842d52cc135fd722 +S = 0fa25f43c3c074d702e45d216e3704d942e9d67b3c0728645ac6c53b9be7300061e5fe5 + +Msg = 4f10001e3517c2c1f973b555f4827681e096d860c4db08f1f4aef8000c9c24bebe59f8bf3d7d3cac959a1a5477bb0ea43f2e746b5d14ed48a58ef35484b0ac786d2fec669f945e846ad73e6b77a9e47012a951b398941566330d89125eb3c1fbb2f06adb951ff5f047d102fdf28b5cadb4a3e1a10412eb3474d2ed5c3fce78f5 +d = 019528d505bf0584628d0214bc857150a929d3f59619bf8f3acab545fff0977c9bcdc97 +Qx = 0cc8863e1443e61fedc61abaff87d80450345489728d78c333b36fa28d8754a29cf3ba1 +Qy = 0205ae70c35396c07f9f96aa7c59cf8a28aa2a365b4a1b68e7414d8c4ae5220c8bae9ae +k = 13d555426101fa3c239b7830fe0b6cf08a1c01f9a991f806c84baae20daddf5dec8f868 +R = 0af8bd9856dfd783217cf81b09b464614aa824b0298f35308e6427c679607853eb66c7d +S = 0e6c1933d6ce25d0a00effbaf1db2cb2542cbe7521330c34286cf3bdffc20c001cd7722 + +Msg = c43ec3c3232cae59bdea7cfaf18a4672035dbd2b8b6b1b44ede376b36cc2d8baeb921e416aa177f5977da8bf1d713509e5251278b6622790056271715cd5feac58bee5baf50b216e8eb886279c5a384cdb696470275b7487fe9ac4c506706f6b0f9809d1ccb102546a4297d2017c2a8df9f02f30d3d1bd9aebf6a92a02e0d202 +d = 067795ce117bc0a389397fc22a01cfd9422cfbfb5aa44131938a8c45e48e1d5a718539c +Qx = 07924de08acfae6260009cc2f02daa2fc2a809e6ab4cd8858a9e9c2c15b17e29f1bc5ee +Qy = 04f36cc2d36df63474a579b96f6e59b890782ad8fa865efd80abd798ca2938bacbf8212 +k = 1bf3242e75f8331fe70113ec8e14ad0814850bb8cb262c7d0a44ca69de52d32dfcabd0c +R = 145148d59c5be2b6d39dfa33e904c161456822ec0ad64b9dc52befbd6496c9303fc062f +S = 0b75c3c404d694e086c0f5aafd534e7d8596601f675b2fac9384fca6084711e35149f9c + +Msg = 9b7d675a3d2cdeb280ea28289b5fc2a3ef6b535ebee8ad242fb031e2e1f364e8ee806568b2f8627c5a5b4f51f4f65c71acdc1152c08b9211b81907b551e0ff47f5a6aca45dcfa06f09bf195d19d7b165b52111b601fbd97b192f62465f8ba20773b1599c8041e91448eac7a5763ca0628f40768324c5304e1119ca6a1fdb0778 +d = 19269dbfe4184249952a651a507584746c5b62c64cb3b17e0158aaf4d086a4afb0330c1 +Qx = 6c60a475f2a3635fa523e1b138edc36f51e94a34e75989c2cacdf8949115d96f11ae752 +Qy = 494d5e23ba9071b3e52c58b1d0740cf90cee7b084b9ef7a4a7be8aa47ce7b3d97c8c51d +k = 111f4dc771b6ce5cc2f42172d3d70fe77c73683bdd2ea331ff711b7e9d8c3e4f2d7d6cb +R = 027f224c01847c52ebc180ae81009923ae3453be1e0d94b5c2934603577f36653ecfccb +S = 1e7b771631e5e72b7ddfb9c73f684b93270269ba4216cf3926e43b2ceb49756e7e7e0e6 + +Msg = f4a08daf8f66ce57a986f14b918099bcadcc4308bcde7c169ce8536a40d94a928cfc0968180a2c2a242c59df73ff79a03687998c421cf9a0e661630378779a4744ae2a6cd24ff61d7fcd6c11a4c8bcaf358075e96f864df0998ee98ee393b37bb38747b70bb7a208740959b45174a60153ee566e0f62528e9a5e4466186fa650 +d = 03835814de0d6441cd80a44e40350cc8bd62ffcc81e939a4410bb9c9259e30463c453b5 +Qx = 5ce9f6c979bc1d6bc41f41095b7677cc184da8918265a7f0e5b9dbece2ca9e0667cfbad +Qy = 39a395aeaa04f5168de809164285974d306e474a610d89fd401c375c9b73f0d23dbbcf0 +k = 0b714d734d063aa81a389be69c56dcc23bcced3517e330572f79c769645e7dd2fd55c20 +R = 0e4d4494f91e79f2b1d1c0e22ebf744ef448f57c951f1b5f4da3592fe60008ab00f5f7e +S = 02edaa4d8731b598c24b993dc5bb4888ea3c2dfe2807daf88170982667e69b76a8ecfe0 + +Msg = 864647405c70939fdb4c026bcad53218ba1d438d82c9138f0f0ecac815dbfb242307cca52c84826cf6556c51082a23f14252dfaea43ba229f7493db2bf8ae9cdb0228dab9e25cf385b504b92cca94f813acceaa1f18de851b8936c4dfe9e4e17002f02dded6b4c231ea5e614ab46fcdd637b8c6193e8d0c2df1b3d883b97e1e8 +d = 0aee83dbed3b703cb6e60d51e373eb20e298ac005fa6a572d02fa1e6da0345558ad2a46 +Qx = 0dc25760af992a8ecc108373281bd0d246f95933ec943f6346c1b2b941a03b33951f622 +Qy = 6e35f02d225ba11d2ed7ea392898f78ca0deb2a47871eba6cd2be7440a410d910097de2 +k = 1df142187f8b27f4888075a3784aebe0fb7d80b0b6d3497a7adbb88cb6bd26cb82109c4 +R = 05a530bf1135ea6d599928cb0383f5d391d19be333b1577ee4eb6f2a78b54e4aac0e09b +S = 06f3033cf392f698d1a1141cabf138c411f4e20687920f2915e17e805e8657a887c7953 + +Msg = c87c8f3ad5c28a027b28ae5021dbe8d425f74181d519451f1fead7a1f9dd102fa6785b147b610610cb59bfa91fa363bb79ea602a7d7e1439f874c5dce748e5c320560c2d9676f3a948754c72b6db249478b7e19c9829ab4de2e344535d3e0b7c20c272f82556a280ef491524b255c4fafb9c8ecb87b0149ddd9d7bf6159e3337 +d = 17b65c66514019ff935e9d571a4e68e9ee4463b7b9a754b93f4f7741693f4399879fa8a +Qx = 5bfb704629596ed05096783e49864a11874f319b4020917f1ba700ddb0606e6e72c1793 +Qy = 69194592be64c33c2f63771af0e4100d060e9750031048002680541815b311ba8f7ffa9 +k = 171b5c698175300b95dfd5ed8d3fd7cf4e19105ed7193b6013103555808743501ee8c46 +R = 13f001f287dd5c7ad9af8d0105b47caed66ede41dc1e121a602610ce20e41af91cbe586 +S = 1433d5263d5233c40c0ca526b3657fcce8cb88ee65105b5f5ec82b26e12bfff11c8812a + +Msg = ac7da7611e2ade20aad64b418a16e02e79ab4894d758550210eb10013a9b5533132be701f8843c840807c4167c38d21dff168d3baa65d5bcf285b73dcbb75819f8d7a20a849de335e19bae2aab2ca560b93d340731f291599a5b28afd7737460d291105cbba6d0290e836f6f6c1113d1b2faf90ac5de7c64e25206d79380a4ed +d = 17d2071f39ba35515a8ec977ddd36ca15983e15bcda626f15af61d87d58114f4c80a8be +Qx = 6f09c255fdaf78d7d341fde4586526fcdec34a28448c7fe65685a67b6c33564ce9249a3 +Qy = 24ae4483fcbe3f823a7ce53db96ef2f6c68670e107e68cee4f358dfa844112d6b2144e1 +k = 1403078da10f55724fe7b56dfc55990507307386ba82ca8f6340d33769ab1f6ca894bdd +R = 0a54a35767a1cc77b2332b04694404fe5a31ed8851ccc2abfa5542b0f5acd9be9b1f02e +S = 0577e0a1937172a6d45177c2b328d72f75a08a8a774a31151b89fd451d531348695d870 + +Msg = 5757c472fa2f81430dd920f39b61066a28c870b80e6c96f822f8f19b398c3574d159cc22120454dcd7e97be8211916e4bc8db365b2dbb99a6e597d06e6645046a0abdccbd06741e9c0eedf33cb78d78a540c2a390719acc498331e694e6b0118cf4f787b51c7b7237458a6149d6dbd0a08bae8097e919f970fde920485e9a0ac +d = 11504659e12235855fe55220287a101e511d39a627f8a0d414446385d4a88f31507fe74 +Qx = 192fb9bcd157c7ef385d48470c3173ccf1ef9650da7d680d8473d45ab2064a073232ac3 +Qy = 14ddf872b711157d121b0a61b88a7eeb7cd260f1f82ec5f62fa2681e28c7f2640e305e7 +k = 17e10962721f041946bb5ffcce724c9f284b1c8970f974a069c36dd4391adb8cecb8bde +R = 1546450d25e2536aa14b8751e3b3e7eeec8a6c1cd967ba0f03e6bfe64c0a59072280636 +S = 0159c8d6499fcfe8ac7b2e84990a714d7888d883c16c016c4b165f36d62c3493afa67f1 + +Msg = e350383d04af0f4081bf09b95d1d53040e7acc64e56b13b653df31dd119617b800e0cdfeb935dfa5d94f1d7814688d8ce41021810958759cec76560e1e5c0581456acd1a020165849b2203f1c11d318d816697f36a86b59f160faeac7dba71682d3c031d0d547725ef69cbaa28345512e38b75ab011911d8924b2d17a857a96b +d = 16e4cbabb03215767249ba2a608708b78d7387be9e77f5efd2462467fa05e8dcde2c036 +Qx = 112b7ea5d21df8ce52772a1b76a52ef6f0da62cb7718a467a034618b7ce701a05cd2467 +Qy = 649e0ad181437b4eeec87e202d8fab1c240f9dd9b31311284c24d89160b1895be541319 +k = 120e4bce412311d3e7adb36dc11d4cc1da8a4b9d6cd5219e772b3dc2b2b8ce08833748f +R = 1ff2d53a8e6c1c23807eee681156a146e8f2cc1a8c262850dc69dece31860bf094e7f73 +S = 1e8906c0bf2a5f922ca271def90d704a1425e5cacc64bc5761b000c7df0f8f9fab51f2c + + +[K-409,SHA-224] + +Msg = f153cc61981a46d8a47d17d29ec157fa93fcf644beb84558db7c99c57fb131dcbc5b65581ced5ff0b29bfdc66ff703ecdd4290f7c353c02a3e6d6867f33f3dccd1a0b6752b8a35fa143f8921a5078af9c85b212564c5b795da9858c7955095938fcd10c21e35e1abe905e84c8b4bc05f2a06091ce876d9519b96951d08c7ac9e +d = 011c6528939672bed3e8c905b7ba594c3ce95f37fb28044f210cccd01dfdb42c10e8e1a0b5d6fc757834ca7f08e98cbc52b0edd +Qx = 00b570ec1fd09d7b4d102f83cf37129d94c9cf2f982b702c5d1172bae2df558008518493c08dac6f76a6646156f123c4f33e798 +Qy = 0e3cfe1aafbf25a5a4536d6c0cfe13a540b4a3c97d4e7bc6c0346addb4b0c32dce089a7a5385e8a3e67606b45e2062c642bbbad +k = 027cecbe83853037cf46aa98e1e1e552a96af0bb24e57756d8239fea5d769b51b83f195b7801b562259ee644ab4047764d130a0 +R = 06a1601e07dfdff9d3b4ffdbff124b717403490853099fb4a00ea98f84ddd64e908f99b40a2ba6ab88b2491a8d948fcc2f207db +S = 0741d27c0dddca3641b56ba1e9bacb0da1fcee46b9e33ecc6990b98cf0db74668ef1009a50e5d55f80e6642ea48689a529c8a08 + +Msg = 258c91524423b5c876432b1930c7b07b56eb5e3945f1e2296a4e5bfb9b9123f800ad195d6104641b1f1970bca553c2032f83d17252e52403a9381c1fc18eaffdf026f7537aa27d84c5e3d6e39e651a92a41139cec5181fe794457f556b390943093be719acd23fa1ddf7ff0aaf0479484a381a309b4f681af74bf97caef08c22 +d = 07e3b714496dd118d8f3f597961eec5c43d0265bf85723b0b9b0616977e0acc2cf686cb6afa6cdc19114e27ab000e762dfe467b +Qx = 07dea0ceb73b9bfaff7147a36436cfa7955eab02ce7fe9b60dcff3e088c5c9281be5907de3e06ebb2e21dce8bf3ff85feeed500 +Qy = 1cfa9b30af20612666e5df798f91eb4647d8f5e1747c1b18adc6b73a848d987434c56d13ad78b775c4096e9f20d4878bbd9572c +k = 028a8353c05129dcaa7caf0343130bf2e2186b9cb5ed0a27a565e1c24eb882617cc299d486be76fe0f8f3c52678b6992288d7c8 +R = 034299ca2aaaad51f12c90e8205da305523713516ba6e7d245eed8ef94a1b2409b98ae93476aed6c9b9aef50406860b4e490db6 +S = 01a1adc76c65d77ea686d769dcd007c0101b4cdd0934402fa47dac22f8ecac28fc05c2f6763a6781655ed5e7d84c41157255a4c + +Msg = a16a0d6fd57240fe88c7c36b9f7f9040cfcaa9afc4beeb8300818c5f90cce73b819a12c31d42af33146399cdfa4ed4954d068dbb0f1f342269dd29f1fe357e7224304b67b0f924b794780fe7e6aa9dfa3380252fe7177b43e7b1789718949b9ec1b943c83ed4399491482f0f59d2cb8050ab6f8b5854d76c50651428cd29c40a +d = 0182d1e937b037bf7f84144f7d4c94c935269c9aae7d500aa459a7a0ec113b232dcf282908eee4c84b8106cd38cdc41db3f89e1 +Qx = 0bd4f1ee6a967123d70d488dbf0fb43aa5e93dee5794b4492277fe559776f740754850477e275cee9f1c375403a4933dc986920 +Qy = 191a544b98ba954cc6e060ba26a52fecbd1f0dc7c15381004cccb799a9f7960a3cedd02d36fcaeb0ceb844bb4683998d776dc5b +k = 07904af733742716366f8ba07086f924697ac8a01bb4895bdb5715081ee89eaeafbff4cec44eb0ce14e774dba71bb9b091d2594 +R = 0723b2068957c4f2ac1df69378fc013797a3b071de30b514c3e610002dc8bfced32bd2f9e8f692b653e736696cf818b0ecc1e10 +S = 058455b8f9abd5fcc28a4ef839ac0245c3feda1fdcbc3c171b6928c6abc931e8b0ec34382d63e414657e9319d2965fdc9eb74cc + +Msg = d02ff569828fd1add21f6bd1c50cbdcd09222e458ee79fd5dfdba3cbb84e9d926fcf196cccedece77d5aa17f8c8cbf3a9facf0f02c71d5c1c8aeda9d75f6fd7b6f2c5c70dff992ef6e02c438fb3c66da5a503b3c39acbe2a069da457595b542190d818015d462670b0807c401e36b1bfe05baff3a8ccf8d1f5f8de7840e87993 +d = 07ed09428f460724c8a5225a31151e031d9949493fff5703369c401762345d002c4ce424294baab22d9e71edc4f854510cf0e6a +Qx = 07fcd003a8cde5503f5582a42738738ac7efc6cdb3813a00c072fc114006be9881c0a881ca35988dcfb8088f3d07a03943cf230 +Qy = 0e7041e666c1bed3b80a691ecff60ad4afe3a544ce58030bbbcc130045e2c611d65f322ec78aff6757cb5df8ad54ee8a09616ea +k = 02828c8c4bb1722b0f03262de32ca8a605c4046badb20d8eb9f19aecc5c69f199aa48d09b61f285254425cb4bb5e0763dd471bb +R = 06c99d796c5d4fa21c5cb7cee0b7570edc9d7e9d7c3604f5ca3766b17e44bc71d8a74ac268b8713cc2ea0adc3dc1971c062b4a1 +S = 075962e0ccbda2280e502559f48c8d37704964f67f8cd3b443b89be740976f1bd929c175560fc8cfb282661c0fa792a5b200401 + +Msg = 57befce973b225cfce7f996fa5a1a43acd160681b88a87b7de04544eb7b6a719718f1ca7f559b6531bfc18fca3836d2be7f7a6e48387b7579a6845796d30e46f0dda9d82680f8c96c5f0989741adef9762c3db763cae2699cb6c112543635e20ed5cfb4b55ca2ccb32d2d13936085a8ff95ed658a54be73f80c912ccfe5f0ca0 +d = 0390f05b9619c27b800e99aeaf61ef7f6249367d5cfaeae3c7b523a8b29153eb8a77132f6c4412545a842d6deb7b7aea7e2bda5 +Qx = 1cbcfc492a2a6bb8a7341df67ef2bcdcd706afabad5e7ed1d63387ad9b0dbc47ed17b82de6de936752632e43c393a93fc5cec0e +Qy = 111768994b2dfe9677d9dbc45d4b55fbbafdaaa2b2638ba1605c35301fa557d628a87d0a7febcad9f8eb4b51fc9c807652579f6 +k = 00b8d236a9f8edba7b5207b4c7848807b933b214fa25cfc5a0e73f750d30051264bb9f6702837b0f65a451d4ef24f047ec4e9dd +R = 076bd4755427fda22a0f177624477c59de12a12621aac274b980b5e1ce5dc700591eec13dc5bb48c5c8643de287a07a48a6a7fd +S = 065a5b0a00548bcd7f59518f122d79c7552ca6097f3867604b462201add5f326807f0e8779f2177f277e5ed25253885ca81220b + +Msg = 4277ba40cb462860ca722cb4ee71c61836d2ceba18bc91f3fad7dea478972c6da0ebc02815eaaada1d1a5e93d7ab353855ccfdfc94a5742fe18daee2328871e06c1ab0a9a989d1239df2d2d27f96c415e7ef9a941f06c6790675361173cc229aac7045f49eaca207f59c497619ba32e932b5c1c6576812ee5b146e2cc7de5e62 +d = 007d18652732596add3db31f7a0ce6020d03f3df58131b0c7c633faf619b8210cd309d6c0c4083aef1a1b6d2a756adad0bfe344 +Qx = 15ad0682962b4dfc8901a0dc77d548ed616286733cd9b3ede937cdf4401ab8b3e3516d466ba43b6ab5356c4e72845767d55d27c +Qy = 17e4de3288ed44b48e7c47b16e2afb513c9763d5bf4cbf9a357c128c94a758e3ff946957df461531def2b8d8411b81f45f0c2dd +k = 01a896c30fcfdbe583d6b0119f467f47758ee01d4d601eb698f444ed0f76515c2b8053b11ae7abd0eef7aa61145a53d12d560d7 +R = 053b1cd57dfdd8d1802f3e295e450a155c366bdc2bd222d18a4d08369c25e53f1f633958b22d80755ecaf8362d548b28dff1ba8 +S = 069339fc6058762a99576a96e76f75275f848102bcbc281e59fda26c98fc48a3f1061755e80740a233e03287f510f4549bb1874 + +Msg = 57ff6792ed4b12220d179bc0ea57ff217f322c85bd3676a681d32d7e4a3e0c8e891fd267df17caba5992f68c35ff670b60b4bbdfff82404f6ed996c30539bc395120f97d4d7a652eaee82bd8f9360bf8bb73748b8bbda9f9480eb54f7eaf2609d4259329e8a5ea020521e7dbd3ec56f23c849932cbdf2875f5d5c774a9d6b0c9 +d = 02a91244ea4623b63403dba807d60b914ca3b901a2523244c322f2f11251446d3f15e869d086ebecfa1a39ce304e8b5c8de23e2 +Qx = 0b7ad8f0a52ec21e54e28ef603d76652dbfecc7dd2427cfaaff3d280f0d1f62187d77effcb433b5bd44c3d0c0d26c38d3f5930e +Qy = 080641bb0163130be4444f79c500ceb8d6a9b2cac42d21d31b2fb29da075bd41c6613f278944adfe92d3c99d494be9d4714e9b6 +k = 070125c89a1262a88f22e874c55ed149de6d961d6abaab2d13db9174e3cecb8f497529957058a0afe5361ddf9d3a5a3b923c7ef +R = 01a28cfad13969c6449e5a0f879e01ef7dc1cdcd0bc77d20f3989c588a9cad12a4b52743c12f4f6e2154ad963bf234ec96263f5 +S = 066d7f0b364a640c6c620e3d030448d155cffc9ffd46a6adfa1c13e1b01892463a4724465aba3eb07009fa604f3af18109cb72b + +Msg = f85113eda64478f460b60f8084220134933de049200a5f37884da7901471542e26690a5fabc3cbf9e679ade71b6e54d869bc136c3d34cc4a9efcafb777abf046b5ae5429136112a9a36a475121eb1f33f1f43481286fc1ada98a41064a1fa38c89e99a93065bb2a119348a9e452497fd5a0d2b83a66b09da9f47a0583732adf4 +d = 0068c56c6b5d50d1d4e13d3837d8c5e8ba2f825e121b63e97603fdfe78bb6899600ff0dc87b6b3b6868ad0d2f62b7b7a31603ff +Qx = 0d9a4f5992308013573f97864c23b98d276975d80cd6455e9f0d8a62d6674f3aee3d27dec15903da4e9d5908cebeb765ee02c80 +Qy = 01f61189caacb05dfb982bcccd603a769d0e1be8f9223288b5426e7f88854356fe825f11a88918085692f33b0f4c61ab09a861f +k = 02ea7f0d81fbe3d4c865ff5315d1cc38f9e9a8653fc91dbdf445b62fe09b30ccddf508783ad87c8a48a6ccd5c9e817fe2977f90 +R = 02d7847479c16c4cba834ce5962724f185be06cc04a9a8d710cc72e6063a7b64fbf2694f5b62de65d3d347d34c0dbfd5a4d93b7 +S = 069e32bb19d20e873d0e62b306db4d5663576e4b2fe75e8ec79b7a63f38c8f1007a817ce30612e8578d48c63b04b1d34904010f + +Msg = 42811e9ee6dc509572e1cddbe5baf00afeb0c5c13e3755b922eee9e210001676082bc9edc3d78db2b5bebea7a2c0cd2b369226c2b8f83b28f33fb513407ab9d287d14b112d6c3be2493805ace5cf6fd366d03cfb28f4ce3f0f060880db64d6962e997463ba7c05b6fcd1e66babe4b94afc5c2d38c7050c69571d27b66ef0090b +d = 03c88084f8b78446db431bd6e240a0c050813d2a763675b0ea869cbe183df697146cf29c03479af3d34587a95cd257027fbeed8 +Qx = 15a09436de00d8d129e297ea60e04b704c0a8183d64a77d1c527189e25e21d6bb62be8ef5eb2dbd833e5f9c7d5c3e69c9c01882 +Qy = 001c32ba376d2e9de28fca644b0d567ce1f4ef0aaddb2adec6213d03bc8cc99f9140005bed3cb6c3c0f5533275734aaec47404c +k = 0132f4763959863a32919eb591799ffb8613797bd0b617c73654ec9eb32e2fb86631b66e28e1b4cc4aeba65ba8c75aa1cfacd73 +R = 05fe0ccbd430d9459e0093cfe2c1d1d3edff8c1ae7111299d2e04f414c46ed2cc88ce9cc9e23e187e87ef551de993f52214d609 +S = 0557acfe6347baafe031dc16032c45559693e2793d9b6d372670b09757c6f4a3e5ae5e55264137d1859c8d9f8f03c25de409bf9 + +Msg = b38f76ede7441ae0887e689d556f43155b38dab7cde487ce9ef9a46f2957c830d4d28006873fe2368197a6931f6fcaad755102686a457a7edccc8d344e2d2a9162e3d71d41c09a022539ae6d404955a6ad748231aee1f974d4f159940532fb3b1fa0254bfc5805d2fc68696856fadea386c542d3cefd1be3af04ca595e54be25 +d = 051af7b63bf3297ae20517faaa1552f4fde65819dbbff6a52721611e5b7dc1242ed6e69768cdc37ea8cdfd1a5971f06b84b5803 +Qx = 09cd1280a2a79b182ddbd1712dbfd12cee3345a89636d7673a5fc3e1e51400603176e27d538e90005625aacf5cadcc8a8c25532 +Qy = 08b5aabedce498476b4c65ab3cdc81f819c2db670a7236c0357a86f9087b83e7568cc6e5139fb92f81975756d7dc4f48be87df2 +k = 00bba308a3eee9e3ab6d2482bb728bf44cde9eedde15af7300c57c2c1e6fed2ee4e404aeee3923e7871a2ff4ba6df64f9d01a87 +R = 07a9e69664b7b81edc5d47c014696d194b2ca4705b2e79af692b285ec476169d041dd9eef20f7d496fc49b8597574d2602757ca +S = 01521d7cf6aeaf1c8dd54a7776cfac02967983083770346d9768a2629d606be90d58ea82377413a0fcc3e4e66f05a0d05d933ef + +Msg = 356dc86cef7979148e995fc5abe2b14a7d5e4e42c9b3509b4363bb80c581a66f4e7e4aa53a4bfd37f9a7eccf75fdd726f348f6a3f779e6599f61bd1d668517f40453b39bcf35db0852a6a6218198f52b7ceda2ec55fca5abe8e5d93af9a42b9ae4de9530c5870211bacc27c39aa094013db703de2fd3121f08d7e97dbd4e8946 +d = 03d65bdec48972d03811b78150a06956eb22d337dbec5416bbd8185a6322cd8c0ff8000210dbd1326422289071cab65175f5d10 +Qx = 00c9c1bb0a80c4b4863d78003e21ee60fc553ff72968c165f6eb6940250a6cb7d545c6aed3760e42370df79b0d37c2d1433c486 +Qy = 01a9d994828ac09a86c18b9758b3f6b91a5775931a7a6e4d8b052204c972b993a3b420eb8ff7e91df77253a9f5847c5968b5636 +k = 0156d12708324cd30037753c78225d183723d3f15930f23bae854f121094bfffb5d7dece1fca93bbe7457a2237760aef3db8e3f +R = 071466e80e2a7cd8e6cb6dfde259a08619f880a71899c58bd4cd33c29f7b321d269533720101f2ef70f5b8e8f05c9cbe1ebc303 +S = 077330e08712ad709f855d92355cfb7d565efd806c6a853712916f7c943bfc79e496366deba79ef7491abad23086db341f339e5 + +Msg = 06fd39a50bf25e89f1071ff81fec5d1e35b6dd68990414ee403dfdebb792627b6a4ae3d2236c159e4441ff90b61ec87b1592c538515f0486b19e58583394a05e6411e69b4285d6d6589982ac0eeb2c912c4948789cad741183663fc070943389d4e9a1150b8f6088fc50605915e9e24b2d98a1f539024770e4820e14ae42ea8e +d = 01f1a8b5f35dbbf82c102df550c72216a243f986f0325920f6186a16d1da74228cc02be6024c7411160c183c923c743354f9438 +Qx = 157ae8d90fe2416f70a7ce0669acdc0b5064ba650cb5416e59e6672e45b591774ebb2f793c3a58e953da1ac08272d0b949e7b50 +Qy = 06d49b9784f8423812967b857e25dc3af1312a6ff29579f6acb6e155b6848ffac6fbce51bd2d41a22ef955f690e2487a4bbff00 +k = 04cc45e00847818397c6abb3d176cb8bd77814abfc253e3b0d799dff2c3e09a5195ed5e6232873f2783c8e670b52a839e06bc30 +R = 067b418a5395216b83ab00d5568eeb62ae0693af2b0e4d052c6feb70562dcc06ef852002687099dda114477871b924775e8460a +S = 061d1e4d713689b2036272ad41571759b52a78e0f8a84d1f3a277aaa33ad558f0b71f3c5a99d403e49df1afab66059db20f9f32 + +Msg = 6daaa41150ea252a3e966a338377307d909b95080e006f13027f2be5059d9208930c5a329994c0b794ef50eb059bc6c215f68cf42260bd410f9bd86d2ad5ab7179c7c92de4a93a5f6aa17de5aefea815e7c0b78a8cc53c21dc4dee037b29c9df4e12343109283ffd5d8a3b81fba1b5e95506c7e01ac056c86dd0ee23bc21af0a +d = 031dc621200cd174193d95e9092ffb86189c52cdbb9ed937593f2cde7c4a0264b9100e1b8407336c8dfb5520d28a18dc4e39a89 +Qx = 0904bb904d50bff09bae5dd21f425c808b41001ac917b022f7e1cda6e46504781a69baab4a6f0f100c4fff9ced26f871159cd30 +Qy = 15cc300b0efbac707635c72bf855de4290f1b8b70c16f9bd0cb771ed5c760ada04d0ff648f118d64e0aff6a6de16def15cf7437 +k = 07e32b1fc1cebeec3d84f56a67c8ea2b78723e7010a725ca4745e849e573e8e4a4ce11d1af4ee508b80fb5336de3cb53161bf44 +R = 071cd81dfbacbb67be5903cbcbe402c0420adfa9d14148bea600b178fd06278572d34eb46d857085a2a4f48cd4ee9109d607dae +S = 0347b1029e67a6ea2a45af1f7410dc951db813eabfd3c7f3e2c294b81e1c54fa8c98569efc580b68007bfa316424ac6eb353ac2 + +Msg = 6378dd1c12c5197b57d47dc46a67949bdd1e0809004e94d49b0234126a08ad5bf8723ebfd132145813136d8b7dd096f56c34248f09a65c34f60c2f80f9a51b3795f3d2518b11aaeaf6dd45a323794080b78f85d629e5fa719b6ab0b14c78cd908befeaef0dbfaa08cec9318bbcb376d48b11b68735c9554a45293db5e9239ae1 +d = 016e6750245a88340b0f0665b890459f8038e9b1366f2fc1326245a88d4c523ec94429f21869ce3dbf75126e58f77241c99efaa +Qx = 10184fd47e8e1e4d534ca1cf67f15bc8a80921b07e251c22eb88f25395e08d7a9283774aed204fb5c14aa13c63a94ee691b4ff4 +Qy = 1252ad972bb8c0b286c222f42f7d42ca6561bac5e517921bda53e51043f13e711da8a813bb6880678e4d6a16820bab819d62e59 +k = 07f18539d00152f5b9a75d4f114812b87024e8a8f9c9a8d12139d0a74d87986f4305bde60375918ff2dfdb88b6deda640e17364 +R = 0735a15e7bd1f69f4e90739d42ae239a8e9238ad28b63ce291b57cb5b99922fbd5dbb7f74fcc23117243efbd036eded6ee0f28b +S = 07bb3dc77cdd4138a02e2d5fd4f6ff8516b4c95b8255c629132ea8705c399fc60f8fb660ed3aae52db283aabc3626a5559dfe85 + +Msg = b898d0f9bd80e083fa541f457d14d853bba55b120424a95e1d9511c8833f48444329e0349d68204c4b4581ef1c4dee23ed0a4445727a72e1e6cde422f7c10ae132a3fe681f9d741fda263e73f7cdf10759467c9d76164086abf6780ad474772771eee22d195339bb8f6235e0d992bbe282b13ce4fe01417f507a2c4fa155e108 +d = 0788fabdafeebb72f6385301e30024b56639e629a400f9c50d402cfc9b5817844f06a451fbda29c7ece41dc9ffcfc625fe0ff0a +Qx = 09b2c36d221d18189e1617cb2f2ddcd64cdf8a42ba6acc55f04e9722b11588f7fa861a3940820d9dabbab631d7fd4106c60f37e +Qy = 0da099cdb10dfe2d7c0a16ed332b459e7be31f44b0b2d595dc948f0b073ac4e439f24f215fba5ed50aef3702731d6561eee1986 +k = 00581369aca680beb705f52b6bef075de83ad29034c3d6b2949b551a0bbd100897a079b49d41d5030e1a6950fdb14d70dbbdb41 +R = 04f62415c99c8e6750f9c41c31cf050eb58f61f62eb0b0023d61dfc30e7879d4f5a87e88faf55522631a29fb69d16e15c354323 +S = 06df238f34b5ae664860b43ea11defe3120591cfa371367096006c03e83d372bfb70da6f789665136b7dd1c59894a2fc5038c4b + +[K-409,SHA-256] + +Msg = dbe04561ea8579672a2b3afa94426a3cbc274b55263989d41a778bcb082da797d84d930ca847a481789524940701cd5f1d11b460bdac0bffb0b3a3abe1ab689c519700de85a0a571494ba0cfc3c865450eba7a9e916b7fa9df55e8a1c246c992e6a0b44b78274e008472bed8d8411633e6520e1a906c5d0c8aafd572fe6f1f64 +d = 01b8dfd64563dc219d6eeb53f2e3ad1d771140d0960b211dc1f757af5e297dc7548d6133ddb574711d466688f80dbd65a7bbcdc +Qx = 1ec530638ea0663cd3a9b237dd66402adf50d3094391f2343d7d6c52c1d14145c245464a3b771e4b1894462fbfaf440e53eef7e +Qy = 18349e244b24c8353811c29a60d8e02caf195a424aeafdfd0361846d5ce5eb83da1901700f00fcb85a0c2543b49a8a3ccbac157 +k = 026a26cd09c9329cd45ceb4c798846dd81af67759794f5cadab84de19a835f8a0ae49b12853b1e92822477a73891f85acce4216 +R = 04d83a5f9dad246717135bec6e386ec6b73be9ea6d1a17334ea2003a723d510914167d136254d6cb64b16ef7eec5044b8f2ba28 +S = 03e81601d0c66b507a491c530075edc5b09d770633a4c2355b3b1c7df9b200ebc7dcb706be1696aab70d4c6e1c4a7e532284670 + +Msg = 48a8300820fea2ad83c83f7d6b24192715329c3f159d56644e11ed25efcbd3d31600a813b909812987b97d1087e74a63b4494cc031c63492b6615e9d6e5b36f62cb2ef88b9f736595800de465789f43811165a5fc093ee6d776008739de8de2a84e878748641be8bd52e5b891c4145f52bbd46644852a43108e93d86352b2a3c +d = 0422131829608ff730c24ddf7e8b4a2600eaa9681eaf45432daa7d41fe2fb488fd0199d431a1ed823801ce21f4f01a4dd4248ca +Qx = 06ff24eb0ab812303bdc9a23719caa789eb75775e686b9511bf6e07d60447d1601a48ae7f3041cef5aaf3ed2adb6feb422fbc54 +Qy = 09a351fdc9422a81ebef5407d0d74b52a348caf3cf6e1c6c2af722c408941de154619a1d54bc23a9dfc0c4964f3936d62daa6a4 +k = 0313ec63c34ed325d770664aed3bfd1a16eb636516eb686e806b0acf6f0d117998b30fd52068a36f03d0db3ec13e6989c6f196a +R = 0088167f96d807bdd61e65fadaf0c56b623db42b831909d12641e4d00e7bca6077b36cfa759fcbbf087c31f294f20a09e0bdc96 +S = 01cbd06232b4c73cdd13208dd254ebf9351745ee6196e3a94b9213e931f141e4cc71f3d318a67e7b8060e11e88783fca0be41cb + +Msg = 276e3a986ce33256014aaa3e55cc1f4c75fe831746b342eadb017676b0cba7c353b3a2b554522c12e6aeaf1364cd2eb765a404b3d0aa61258194a30219d76d2bfa98ad20e7e91756cf65e50d7914157f283f2ba3930c0ad3a97532cc747b1cb9c806fff497f0322025a3d02ff407fc7b5808585b91d95523c9d5864efdf7d983 +d = 0095ae8e4c7e55eb5da01acc05ecfe72a4dcd8ec152f1c8dc165014f70eb4e4a7861aeb2b96c418b2d4db58659e76184e013a49 +Qx = 0a3987d7262dc30e8ec11458ff7091ca993bc61f142ee535d544a2c88a47f9601107619617a5e65cdd6d5e1a034aaa223044342 +Qy = 1fc8af29d5134ca9baf92041b6d6aefabccaca4013c55c1581ac05db6141290235ea09650a289907785d282cef1b9efb381ae66 +k = 066015a77c99015ed6983bb379772bd90e03b9c010e695853ebf8e461a20fc12b20bdda47eef856f162dfbd9fd4fc1ec49105d3 +R = 067c49b96e5bfb6a6d625346c3ecff13b8c8b7e59c764b73b256ac970aa4056460000e599a8195f2d235a75cee8e5634acfa7ed +S = 03ce25ef1af0784645f0579da381542f5b8aef377e5b79193314f84853e2a07a4f1aaa4d8210f3a3c249a879cfa3ea8af43a929 + +Msg = 6a4fc1827c3a7256faa8ec6a0f3d23559d6949f8cc20e7f76111dc4ebd59213951cbf0eadacaeb8862d6baa0cb298645e4314b1c303bd0d5e9893304d4b7fbd36ab05fb6a5edc3fef763e3a4124d61539eb616b359c5cb55b5e2bec50c91dd95fc39ddf521aa854216eb5a707819fa6f067b316a17a3b146e7cc2dd517f7d63f +d = 006f2075bd730f34df111ebda919167b1d3358ada32cd6747cb3353bcfb814a77ac70cd51b31a0e538539453bf9eaf9d8b384c9 +Qx = 0bbc153deaec0bcc36c03d24afd20dacd9e78d104d94c279278d04b597ccccae43cd3e64c9e1e58fb5408f376dd7827ede9dc3a +Qy = 15ae0d803acf12d9d3fd41f74357b1c93cec0480f2e586d0e18f15e569d27d3d106e192ee0c1c570351eff1f463dc07d3bea933 +k = 0314330098250e38145d11a48f5043190c6b44f8572ae57cf83b1f3c4c03ce38b90ed5e157464c2613c82943d78c938fcde89d7 +R = 0160b20c370ef4b9cca3f7dd3c23f70efe6bd80751ca021731bdfb0f45ae07e5f2144c77795aafdb0c3a92ebbef75fb2d334dee +S = 045188dd2402ad36ae4278a9910648ed5e71d64737651c133aa89850e3bef2207d58ba4169e471a4737962f5fafd50a37a28e1b + +Msg = 4b088199bd8c94775d8ee508377d672dbf50f6d2c7370e99821ec8f9387492fb2eebdbea473ea18465565f79e2af418555f10c4a527e05a9e20c9c00b807dc8b350cd4ccc2d87e91f66addf02ce4f43597aa258ac6fbe9365cc2c8e8bbe5c884abc929710e8423cd6722a8f473bb55804159a92a3d8b6661a536b4fb9293bb0a +d = 03887d284e9ad17d38bc6da9d83c192a434c509340a7f233cebb032b09ab7c4c6e8730b4a80844898616c9abcd16b753c6bb4c5 +Qx = 12a6d5c5690ebf14ecfa54ac97b73e88e16e757c34c6bbfdc9a3a119f298860d330af295756dec41eedeadc5257b202451faa06 +Qy = 19f40ff28bb72af659d5319286fe21f01819952d471ce2433ade745042a47c2dae798199c364ceb99029c2dd5cf57ef5daa2b00 +k = 035945b45221300f83c5fafbaf0645a7386e209d025b3e1dc367819728f630663fb732b251a019e08dde0f64dd3f60a10065c50 +R = 00c323c86e8cc548123d1337936d4be948bd4bce4631a2194c2bf04e1fd714df2c90e3681e41a21d58d9567a5df9fc478dca8e8 +S = 0493d3f4d22cf8517c301f15bde52cef17c05fed2482f3ef15cdbe32c5f0975e054d45b13faf906896201942f29e5693bfbb229 + +Msg = 848a13465ddcfb2dc14f7bc0db0756832c22dde1e31e4d8b3ae0dd1aafbdf15e954889e95d3bdfd6e5ebb6171fad62592c23277a89e8ba53978c9b1afedfef7e1c3f6d9f31077530460b47834b30bbd84a4da601be988738aa815d3d7e72043243a5288751ee08b4815a017fb5d9bd55833698a0d526b1ed79da35ef0fac93da +d = 02ea5430610864257c9dc393c3addcd0d8d5bc8aab1067643b08857210464428aa85cf1ae6c743fd2682255d4c8eaa46ca21e73 +Qx = 1e502d3f47823ac7207861855fe6f6aad1fa4f2149bff2643b079da23fb270599f744669b3c8ceb4cb0989aabd43d26d93c8146 +Qy = 0cdcfc138451bb59f34dc82b8128088b5ae0cb8a77dce1895d5ffdfc8b4be24a206b9856954508b82b80d0163b276683489074a +k = 0426b90275d720d19c6ef5c8c74c568a636257740530e3ad10de0d518c4eaad8bc58cf4506cf5cdf7f2b03edd1caadb28fa3787 +R = 0123ad87c094c4ccfe4346dadad54a6b1ee1bffaa1b7b9094fe2e6ae785a2b77ce3f5e568e43e8b7fa997206262645f56078657 +S = 00d56cd5cc64736ff7ea0d9840916b1e1c94e11611f93b1b11c2ee98c79d92a8af1a560c9938dc4bdd0b84252e259ae5669d1c3 + +Msg = d1850545c04ea65528849973c220205c35eae98826d169348970d1420b4d872ce233af1daa9e62f6a562544ae3a0633a954a493e9766dd5d87e47486559fdf86229a7c9e1726de21895abdcf2422d438f4ad98d88b45c56742694ad5e11894253270997c049f0f419842482f21c792fbe5613e2defecd485585f1835b6f4c578 +d = 062c757c92eaef41f5d81169ec4968145b5aa2bc1d2a3a5fd000634777748ecb93677b3da12e3be33272a8f0a52300f4a5a37c4 +Qx = 139660fb8bbba59e8f4e95e5ee5b97227220f0e1b293901fedcc6dab86e7c5a9d20c1a097ee2e926a934cce679fb8dcd8d2ed6c +Qy = 08ac510ddf735184e8fa9693da264194fb78da5d1cdc0bf5faadb33950ca191fe233eb8dac8adcbfe15b4f7c09d5ddeef6bcd1a +k = 026868bf1764993d650aaebf117521cd146ea20067cc14a5843f726a3d68e41c3fba82a83d406b2275b3459748b3bd1a8d32f1a +R = 05b17d13ae4d9535d062a2653bae4d15b9b859a87c33e175adc3ef04781bced888f3e93e9804b2251a40b9344c0f8c6bd5be0ba +S = 01ec3322c5beba4423b13a0528c71739a6b39f7b0e0e58a8274a8386167cadef51e5560a3e9d97447e3d3c06288459fe6569345 + +Msg = 421c9784d6fd507c82904e1054edf9bdd1efb58a0b211340086069ad38b7b0dd15c2345fa8767ef71254ed1bd5c35f742b1d3f4765ff9007a5477ba9e5d3d5a5cb5fab4efc1cad73701d4776c6c4343f42b5d94a9eb78ae428dfe5fbdd8e6ece09d5b75cf4346cf27db856352225ab04e6ea56661554fbc39916accebecb3935 +d = 048a313c0c11489939fc0cffc6ccb9f179093c4e13141b92dbbaac441b7ae878c9d412066e95615174a24692555cbbe904a14cf +Qx = 0677c2d364fa86b8b0c79af754e675ea3e806d5583e62087e01590b824d2730e31326591167f02bdd29f8178787c4e1ba9d2496 +Qy = 0e7f78c423baeebf6defe9feb8ada8874cecab083ca2e71d9d8a3fbe846eda69262a1f5b4a3baccaaa4f2cc87220edb1fa6b6bf +k = 012b8df87dd935775b80c62ed6c76974fa5772939a9e7372cb74e033fbae4f78d75b8bfbb82240cf91009b5bef4d63ded04cbc9 +R = 000590a9e8de60b5cb181a1c11c2f6115c66b05e71e0c558ae203ee18e54de68016f4c7ed2f01cb0cbaf1bdc45218c0fe2b1552 +S = 0521844eee9168a501e235de5fd19c84f052445fb0e68bba687ace45d8630070ddd3b73034d1d65788a51acf91273fd187a24ed + +Msg = 7910bab15b6429947655e33a67f41b76f1d7b71534f8904d6a0472c2faded038565272d0b5f51aa915e0d624e9ff48d50ebfa2f09324864f26c29ab73eb39b436c5c459c7cff4d2b62992e3489cb4ddfc05d7366b161a463aa1b782641d93507de43c8cd0a0a0a9d1c644f4554e3edaf7fd794248110ca9387e73ae5d00d299e +d = 046e2adfe5d3549e1e6fa1fe69a7cbb4ac9b111c8903d544268f8318b0b47d4b78fe3e56eb5e639ad5382e7cd5bd4b2c3e70ef6 +Qx = 12902439be50c97aae7b40328984934d6c843415f76f3821c8e8323aba96ee41359e2ce5ad3179063ea5e2c7deeda4d728d5852 +Qy = 1eb59fe96b269cc973b1fe1f3720aa9aa6ec4cf303c5cccbaaebe6ef7c9f5356ec5e76b26b09479d9831d9f5aa41ae1d61f4c47 +k = 031893aef1baee0e21b50cff7002435b058d73dc4d8301ffdcf1e0c315d18c2b16f282e5b294dc88369b25e2a1a19abffb578ab +R = 039281ef10b9a2664b755a2db67b3c410276a424edf7681a5c97244eaac5826368a8095f1b9b76f8e490e2783694d5bcf3565ea +S = 039edd50721dd35d1704167e8cb609f309b9ed73d3c1eece181f9582aabc647c5ec8bd258e5802fb0647372e4c3929cf59ae2d5 + +Msg = e6fc96e060b956c25d50ad25443f3c30a12d199a47451a49ce88307201dfb15ed816982e8888a28daa92eaf3c5584ca6ab2ca9e14577f84396de2e0ac214b24a2279f5e7b344fb7387e9afc8f0a2b77a4d024a20ce6183499b17096947444bbb753d9b39e5c694239d28f9c454bb05468d17ab564ee6cea3741747ccb7f108af +d = 0480103fd6180a431c837643566706e2b9597de0a1346a224d176a5b2c54aa4d064418ed654a5d39f4773fb509f86473ebb373f +Qx = 1d39e2772ff3d26c5936ab347bd5a2940ece42b1964f030c59ab453acd7f44716ba9d88f0828de1a4e730ab27fe1859915818c6 +Qy = 140b1b66b0a87de29ba2cfa799d944b3b898fe7ac43de68b01fb41464506e2f014e0d11bbc0c24996428c93bc1a5ecee5956bb2 +k = 06e9bd0290548d35168f7db7fc292bc161a7710b78ac49ec6a42c9423afea1310597e5978b22b4dfa192489323b2317e4714d37 +R = 055dbf88b6221dff098345226d59d396b6773611ca6e747d26d5d758760d830693df0f5c602859f9caffd0dc3790dfa08c527c2 +S = 03e679447b622c4b06871f2337f5a24150e76efcef9698c6fd463867508e9d7b803667c32989a881c98a90998944c070aa58b17 + +Msg = c8a8a0d41f35537e6fd523ee099eb45e1ad6ab54bed4d3e315e20227db03292e39dc1a91bab439c0d20e36e7fea6ef08983f390a6b5551ac3b4f1895220b2867fab95552cef9bd8702962839bd9b2c72772640e7d3be3c5889d226acbefdcb448432bc503e5a5fe7ae9ae7696c720a799f9882c64ae0385f656074dd8a6821f5 +d = 013c489e8311c6bef02c8f58903b2ba2a98a27cb935d75a30d320af9a14fa3cbc6adcce09235a9eaf333dd05f4b2f1694985dc4 +Qx = 046a1c0e7753cb499d19b2805df770ba54f1c6e03611c302c73c72902867c51c1cf9ed154b8f30f72002421029de7ba2d8fad22 +Qy = 02aef9c34c7c8216a805a58dd88185f40493086213cb4c85e4d226bb5e892aa37be353d9123e9900f8b0790a43d55a19d78c48a +k = 0491dcc881731112ad5e9e1df459c27381a7bf8270f97743466e178bf5ca903971b362b73fdbef8a75d4292e63e225396c7b32f +R = 048425b76147427b8b1969bba3809dd70f0fda24cfb0e92509a7824f027b61cd38441a691efe213f3c331da8c82f94bbde511d9 +S = 00df36683f22e9e86c88097d75409ea297d391550440e4327f67b7af1b09141a0e7a1db40c4b0bf4d60376a6636dbeeff0b6b91 + +Msg = 3407cd6d2845197cd7414a30fc3df7184da204222ffd65c4d16a12cadabf603de8043ea14f5e6ddcc22d3572dc06dec1a23cd924e1847ae285ecf01754e2d1247876431eb98e897e47412a2330bb32990f9714122109e94b38f82cfdbbf2eeb4c6f88f5dbf9f0ccb47939df8be321dcd9bfd9bb99cac9f94885fee7d443fbd87 +d = 02419bd2200f8e1d87db848b0379741685e680d9affe693eed49d82931030b6cb05d21a4965f4e1df2045c8513a8f574ca9f2e7 +Qx = 0641a6ac72455ceb142e00d6854acc5f8b86db7bb239a5054c1ed48dffb6d050458ffea8adb68613ad3cf5977ea7330268abaa2 +Qy = 1a954ab7d62796e5aed370285d3bf91ddd34eff3b995d04967db41c2171cb2157d85032c998795ed476c891702d63ff0108f45a +k = 02e9928f427a86c4491a47b31454ea7d497435af81c07bc96fa61f4507494fbe4ffc1fffa8faadc2a44c7e69c4f976661750f8b +R = 01e8ff4cb8c58fa48aaf61488cc4118df90e8c06cbd88234cc920e5795597ffdc0ab967fa7461082a49de56f02f84cd9d564316 +S = 06e77ac43fc7af3c126f997fe15011fa87a27479fbd5af48e28ccc2c1bedb6c0695291dd67beeec3f17cbfecefbea46b6325fdd + +Msg = ad43f8440071285d01fd79244907803601aff4bc5d14c77483a87cd742144d41c68269d76c9a83c09d2178bbcbdf99f927b378497ffdc907a75a3b0ad019e69758dfffa480871eb6e1e17c8539373de611a557fad120d0bd147f8debe5f09a02e56fb607e9c1253ed592071f042e42fee39775b407225a2b86a950d81bb7d7ef +d = 0722951879a65bfcb414e11712ee9431eeb32319e0ff28601112f89276ffc2b96eb65c7fd77d023f09914a53e2aae2c84652bad +Qx = 0a0304caec1b68b34c822a2a031145677fe515dda977f6932ea2a3291c6bb4fe8f297b7d3c632f9b3806a8cd26e32403c27fc7a +Qy = 0012d4c3231898a4202f3f251802c690353ae9cc28ae5089e259149bce444d31a38927dcb42ed613d4818e235884749057ebd02 +k = 0331611e81d3e6e3a24cc829c1cb9087a8c6f64c286e5f1acfb1ba764eea5ca55be544d3cb95fb98407fb6c8f9eb1b3f7ae7386 +R = 056901f11ec69f91b31f7f41f7856752568b7d34ff3af1a2259fe15ae0b01391eeaffb629976525fce5d182663b7b23a8001bb3 +S = 04e89c3155afda2e64c749536392554cc299b70020362e6701e3a649f0a63ae5a5da4efed5c73b5e8098c0cf47d6f4c45c6fab9 + +Msg = d61a3765229dcd0b4fa6c57280f851ec2bd54d3ee2436935cd6d94e0120d0844adda163995fbc4cd9d7275da859ad8ebf30af9efbdcfc31c7c9ef42bce9011d37cf9d15fb018e117bbc102f7d05750e5072f73d02c2f45509a55627a78cbd9082cbf36807759d1fe2ecbb92ab30cf28434941712d38bdd100955d611987b5968 +d = 03f5b5a772d24bd5454bf26759dbd433fcc7bae4f5c593664c4d75da0cdf9430d7d9162bce3d7f6e13a344259da5a7d6a1635bb +Qx = 1ca1441b1f6e13138880196e69743206ce09c439a507a11c0fed069d4ed23676b27a3a337c976c276809ae725229c9001708742 +Qy = 13c47b14e3069af070869c12f0f39e35a6f334d98210d33c9da01ac80057911f5a392fb5c8cafeea01c1953e97d47e744160243 +k = 01484461d02c0337e8113e51aa7d46330f57d423b79b580a544d372524a853db9dac0c0d16f733b273bf888271135a5162e70f2 +R = 0256d7ab133904a792987f8cea69e8e3cc674cd3c577f40ef6f12b31f52ac6366a2a3ea2b2272c7bab8be00ca0d17989b6801a5 +S = 020d82cb9b3b1f25d993fc18b7303db4cfab91c03a97b249176f9bb2aa5ae7f589c74060d25058c7acb6de1e888ff44481185b1 + +Msg = 1f3c23636414ced48fab6763eed5b22537968e6bf08c178b3d31fb1f6ea773c6979759701d94bc1bee7c354272811edec58eff50c93331b22723d460e56dbee90466b894354777b23b13a37d15a84c762caca70c01518bf34d0c2f072145d274b3b6c932b48bd815fe81161d8507ffbc2f783bd212c29b2887af6d2ffa9d2b4d +d = 046bb4a141c9099d531dd23ac440eff1f5b10f7cf34920b6b702311d490d25344c665ed5211d401def24986c8094165d10f8934 +Qx = 13db47ac0e33af0cc7d74f6ce647fd80cdc1849b15c349bf501c95893be5a440f85b9b029713339fb888d7a93632ea4e0bd8136 +Qy = 1f26f7009cede02e054d6499c9280794184e212e3e1091032fe0e3c189de26d04aa8a5909569017cf06ac2a20acf579ca81f3fd +k = 046e55a908f13441bab63e5327ac346781399d5a9035a72aa21df708b814b67e420b455e1410014cb53e6ab00f526ceb396bcf6 +R = 06db7a7b03d6a85069a943fcc332cb8c54ac978810374b12eaed4a5fa5342c8eabaec238bfc6107fd03d75dc2c6d258c218a186 +S = 010a4115161765dd0c22a0915a0d8cc01905de91d3f08c6d2d85a6a92e1dc00904f3be67fef000ce19f57157deb9afba7582b59 + +[K-409,SHA-384] + +Msg = ec69f2937ec793aaa3486d59d0c960ee50f640a9ce98a3becffc12d6a6c1c6c2f255d37d29f9b4d068373a96beadac98fd5203a9f229bfc70bcd449640165ae5128e3f8d057769e28356e73e35d8e9af7876f608390090892c67391ddfcc1c332aa61efbf72d54bc615998b3be8ab0a9d372784bea48c9fab244482c75cb2de3 +d = 06f2c6e9ea8109223d9a349fce14927618fc4fa95e05ecf9aba1546619eaeaca7b5815cc07e97ae8cd1e9973ac603f84d838393 +Qx = 1f5a9824584cbb0d5ed57f677caf62df77933ce19495d2df86855fb16456a50f157d18f35ff79b8a841a44ee821b36ea93b4f40 +Qy = 1a88299000c07a9ad0e57c22fa8f15218cd90ea1de5b8c56d69506ad0fd12b513ffbd224cb6ad590b79c7677a8eda47a8bdc484 +k = 042325aded3f71fc3ff0c84106f80a10af08d76d5e710a35d462e880e015a36d063599573ce2044537b9f62b51ed4fd2ed8b860 +R = 0667c74ee2d632aed13cad47e0b46a5176940652d7da613e4965876e7e22d89994bdeadd6b5d9361c516fd51a4fb6b60b537e9c +S = 026a01220a1166a4d0172428753e98caf0aaac5b0a09c5a3f11b2645d243991d141f59d6cc502ac44b70e7c48d6b0d7b6ec4869 + +Msg = 70e11efc78d7f079ae41ac3c31c96d3220f4abfe23814a2a4a78d9b1a25e838c3408bd416062e4b0a5cdadf0c6e16a11e00f59711b417751f5e4b43ecad99efbdb2a81c91a034e89edc94eb552c3eba62808563cdf64453a1db07daff8742aea4a9fa738e1322da316b26dbca2954b2bc0de6da7518d28e6677dec6ba8af4285 +d = 004212b7fd913d794fc6bb33e0276e349c052c969ecbf6afc89b28f75a599a9242acf74dec9f374361ba296ba42a38407f9b7d6 +Qx = 19220ebacedc60762877881262c0c3dc0c8a709fe2ea16cdaad3b680d7cc8aae8617f0acc9b5c9861ede651481f39927a24ecb2 +Qy = 18afd77bc7fe54266275fcadc0fe8d4c0dba7a1264c79bc31479f4bcd02245cde991791a7b7e65fbfa907457fb6d450c0985ae4 +k = 04c01ff477786304b24cb9c95ed70ba376ed6e4f6b3ab2f99ac575c92d3801e7f43bab072268705d61d3e2fd881f754b9c84235 +R = 00987cf8ef2b382fb25a6a542e688aa96c098f5d16be0c7d46e961b4a4152c372cc0683993843bf5a04f81e6068843582fca48c +S = 036fba32f80cd2e66bf31baf87616027c5b107f72f11fc766b42e2774e29e10e860577c0d3a27a3b49754e6a189680b7a638408 + +Msg = d922fa515e3bed60b517a2d37cafe4c041e5ab4b5c8d8d4011bf9fc4013dd8abf7add71fcfde5e71d6abe76bd0f749e960cbed55711c87b5629a2c39cff48ed7d0feaf5cc4765e576a4959521f9a45fcba0dc65ae618826447e02ce6e1cab5ce8d6c96c3211adbb0660de7df7453f3aa726016941d00d8ee536cc106a603d126 +d = 06baeebb5ffc89c94c3e8b37b9b0904e7c4b251d204894655bf3b1235710215c29820b9d401c9ca7df1404d2d62d708aafe208a +Qx = 0a0b2a185ad7ddcaa0d8d21b643a14948d3552e25875506d64e236a90d274ad1ca678e628acc208bfe6b56c02df9f5a36aa94ec +Qy = 0fef210c7137237da8ecfc2f069cb9390c132d1c6ce961f2bb3ca925ee727c967f8a46727c8811c94ef66f20836c661a5cd1c59 +k = 02185be104ad16abfe4fb83de5db067d37ca58510b786b109514debef56cceb4dd6ebe53b25127b85faf9c28b56d6586c26d60e +R = 0404831192b4bd453c0a7e850815ac3fad88c7a2da27d29e83ca6f22213635a366018ac0038b1fb1e4c512cac15b614fb69b3e2 +S = 06f677c361547c91428d0e200dd00777262a138afcd828238d132c56b2c232e2b446cc693fdc4013f05ce7021aea5b5b2f1b34f + +Msg = 4f64d0f6bfc542a0d4347576935bd68ca88524ead03b8d2c494061d0658e6c3e14576b5bcea5f2f992f54cfb52b5c7cf1dfc517205e0454510eef1b7054a8cd06ab53ed2468193f98ff0dd62faf076549ab2a270f259276d5729996c120792c6f466a74ab65035bf38ff2c055b43e2a8b8e2449a2375ddbfc18242157bd905f8 +d = 008e5f66ba53e7caad1feda122a80c32c82d2c32a7237b8ee8ead44ea8f2f01d77c7056b9dd60b92d051f060da8532c1fd0e8f4 +Qx = 1a3d020a0c7e3f3fe5b3d9fa6b6148cd0c481b4f9e14dc85aeffff35e62545654fc313f930ca2e33dced28ec28d0fce6ceaeaa2 +Qy = 13c1ac166c3c088e8a4a9d44556e3344e52e8741ed1a8b526a45268086e2fe54c24d398553d509439ad4957454eb68af594e683 +k = 0095caaf063abba5073aa7123b2c0e1666d29bfdfdfb0c484e18931d756ed0845ea15dee1e9abcbbe4576113a8806aab9476b16 +R = 04d6e33001933221e9eaa78da5874f639749c7396dae90f2da4ccfca15b50ee9e50521cd84d78a098e0c383fab0186b3dfe1b3e +S = 001e17cc7baa3e9ff4d882da970caf7d55b4e0fb7f0cdaaaa8290fe2fc9cc31d51b34b5dcc825bf6799ce22fc95382d46f3f98c + +Msg = 7047d478ec5282d55db8c19c97af10951982d908c759ff590f27d57e2664f08d526cbb2bfde39bdbb1aa3dca5a8d3feb50b868be6651f197abccc9d8040b623de367e2ea1d20ecd302afb9e273f4be9f3f64f2c2eb3f92d5e0e375db6549da2a589f0604bc7146562ccefd15995a7c4208f640e7a17afbca69cda4e173380523 +d = 04ecb22b44e809f89b16abb10be062c89b41ee34e110403e42a20ce59a99afdc22f6f6dda56e1d9d1b8ce1d057f390db111def3 +Qx = 0dbb4a6ed11f36eb78417269c1b1e9725eba1666591afaffb5582c8b4d5bee1d73922b0164a05bf21a12052171abbdd31305552 +Qy = 1eb385afe8588ceaac9f39a5cb4455e02bca48f3d2242730e0f9e06ff1db24344379f96356531676cd5af234a120f4b61f7e041 +k = 01cc97a718ebeffed4ca7a9a4389d6b0fafb73ab000463b68b5580267aec203b6231cfb5afbf7ad8192f0947c7f40d9e060ab32 +R = 021a29f56c31227daf0dc5dc919434978943b80f4b18748bb5f7d6702153b966a0a4af6f209ecfa3aae0e4f32a1b7c6ae58a55f +S = 06921b2e2ab81517a0785c4ac3be3d7d4b4c917d7a1e4313b123ae96056a2a4a66d9e00819d8c1cca5bc0d75e4e05477c1fcbff + +Msg = 1a8384b4771a410663e56eb36c5d9ede8d161a8fb0e31d3f74bcb017b9e31232bb2e2f4c65a2d85bcd1cedd93ef08d4bb4af0095731574ab3f2762788a1ba3bf0ee46684da8d9dd384432fee99ed3c69213d790a5d81b351063eaf2bda71ca4868ac36be1b571024a8bf09039b347fa996d5d161078314e24b7d073e05cb3d48 +d = 051f9500c15ae73d6d479b9f3d2caccc2039d8d03820befc2aae3bbaf65d59bd9cb3c4e3aa8bed5b3acb70a5566047ffad80729 +Qx = 0ee8ca7f55225760c515bae053ebbf4ab23567f95c7091fee2acfff079eda297ec6a7e9d526e12e5976431f9d7e52a2318ddcd8 +Qy = 185e2c17705a2555fbb8afbe8e41ced8ace95c83e198be3c7dcdeac8c2c5bdd988800f1194e553bd0348ebe6c29c16f35d50895 +k = 073f96451cab2d3ca9810e265b3461e0fbe7f32fd6702f06891b97969b133eafd68e53b526b5e32b0d06ab61ecd75e1bbb21b7c +R = 067d55e709f6966cb2082d8021a313850c53305a3bcc926b6f9a122181665328fdc8e05a88de812357be85d22c61c919876fec3 +S = 063d5ee4a63b1fae39f266a9f826754f5bca4d7bd414dedd16858b5c6ac2d4162e28ab57215c6713320d3d6960f6b55e3f1897b + +Msg = 43513d6dd8bb0af7a6f5a2b35f99957d335a48d54f2c4019ce9518b35441d4935518976ab1df37110b5b53532cd9e2c66d9f87ae7f683d7efdbe1775a6c15eecee84c6f879999d0706f6779dc158c111fe8d7201983883bc8334f51dec60004eb1087347bfdab20f8f2f260556681e05fdbb8a6139857fd3bb2df5bc1f2dc143 +d = 00cf01dc4462cca764f4f8cbef48c51980737b9b98d1384b8de9f4c733829db7718a9b5eaa46a8475c2144fe4454cb8eeb0a443 +Qx = 0806457fbb7fc577497c937600c5a9c4df2c20cf7dad4510e5ad617fb2849bfe6956c3efeab6b805cb7b63bf5d1c94e5ddb456e +Qy = 0915071cee2094efdcc155f893da8d83d9a5c234d0f04f738b7af5b8fddaf1d3aa152fc11894a13caee0009bc106a64323e9dda +k = 024968902b50febf13be11821d0d316f2daaa07737af45ce2e855aea6ed58f226d2279ebe4295c5d7674104bff75b899609561a +R = 0549f18f1d654f26ca134df4707694e5d9b3693bb34ab5123ce4d9e4c2b2d9756ddad957a4169fc9bcea29944903080f6f5d01b +S = 021887355c6360bc4ee59f1badb5325763e9428e60b31a7abed06ef03bff0b1265662d604dd2e0140c355c70fce1b56ab143201 + +Msg = 752300bc5066d0efaf807183a41725e349907b7339d77c79921ead3c685b616b0eb97e708f3880fce0136c510c8cb53b22cb424af6f1c34633600939a0647c02d8f9601f9416f1d24a51657241fb559c25dfba91402cea43bca1a13718b3945b048725f3df560e6717cfc6ebd894e29bff1e0c7763f15b8ea93e67385f059598 +d = 063a9a565497974c6dd459bea0d1196d74f263f333c31b7e8591499960e1cd79e2ef4cc8709f6d54713f873b16e7b0be42f71c8 +Qx = 18872e9d9410dbde671fc050ab88101f01d146a72d62b630b29790b20fc02cb62cd0ebb5b453a46c60ec2d2c66de8715c320578 +Qy = 1b6af51db1c42b743b89be0900d23f7da80b15f2e7a2a965c7bc13800bf58589560af4697f873b6155194badf5a19a653e63da3 +k = 01d3278e6e78386146fc15006258d7a62a1345db3c2e44fb8d3bf8101727bef254a9fbff157072326a85b5ef4e17c5b0212bedd +R = 07bd5b54d9c6d6f9c87f4a66472be2c4bb7f521ae56c1dd71781d95440b0a151d206ddf627e5ed3f9c7df2fc914a78454e97616 +S = 075e39ff66ab0e0d1b46f9679b95d10b692874d45fd6898c569aac28a53569646bb29f8556e529ef83a15c574ad5e1c82878154 + +Msg = f620603489944769c02e2f902c2299dd5f32b5fb463c841b7e1fc0249a85d2c31684bd3daacd97de8291c5d39e84d6e59d3dde1b30c181bfe8d31b8d8e080bd191690a67fa00024ac8c1b10981b40d4f88789ecc58fc69b15417fff34834e23453bb9933a43d08afab74d056f366b40ad167b51ee5f008db151a12b467d3eaa2 +d = 041074dc186193d30aac7cc6d269b938ab40b257d095e54ba79967a377a91b8f73671470cd07f0a3d1db7cf0a31ba9070625e43 +Qx = 18fe9848dc599a759d90530480a6f11d052d2ce21a7275769ba02a61658c3b69ecc546aa6599e6699353ee1d65ce533c69fb218 +Qy = 192b9c41bfeb2af4f29dcd1c43d3fe72a070b5d085d070acdb8c02f0dba00c9471df1dcca1006709676bc08b8ddad97310e25bc +k = 036447681292dc781f7f4ed60126945354ad1df5987266038c5049d698b2ae12965b6fc58f3e944c4751406087859973d8afcd2 +R = 0541c22a6cb984cafddb3269ba3ee56af64cb36d03b7cd1693b112a7df20f0422219f85c6820130ad53ef69fb66f3326bb863a9 +S = 00fa66b163ec3582760b048ba9a0fba9443d7e908b67d749d732ac9b6e89c1fcbc6d3ff4e02a43ee41414b15ead0cb83749e0a9 + +Msg = 5575f610762b42ce4e98d7bcf45a7a6a0d66ec7f27d6b8b17f1961249d905bc7e58e2ce0806d467f106b16285dce4544c72666d08b5e2276cd0c4e13187cbda8aecf57b1855afedf8fad39ee4fe009f204e60bdbec79b123456ec2d85631d382b8a2f2c7634af3992e4707f7b4215e2c9d3b0aa8fb08267953883a4213669d33 +d = 010820db54ccf0226161aeaee79cfd2797f87702b4ee91adf8543b3c9e79579d0df8a889e366ec1e0718e039b87a37c24d620e9 +Qx = 02eb4e313f158ba7497130e2d64804ac45a7db207c55d41f39979e0303dd2641c81050fb7f24f2fd2485b90f60985cbb15d56be +Qy = 0a190fb6c81c104164578da6bd4f2b193cd11935e1f87f14e824c2bf8c82c39f0be1a6de3dfc6dd68af8cb14f6a78f38773a7ca +k = 0118e911f676f004fe581d1855e5795e5f4ddb33fb8d409d557aeea87895b7c23a513ca0010f98b3a63f2c65da5e3b6c37cf5f0 +R = 060c7f7c47c16b294867cee3e65eac8fc828229a5d3adf8e68e14dee620e9d4e7b78c8b902b5042b5f19c94e621c52836c95ba8 +S = 008d036087b23319553faf835b793c73204cdbe2c1c2463e74de8f404e66ff15ce9384d26149e7300ed1a109afd1f915edef912 + +Msg = 81cf067411dde2d0ab04fe5fa1e28e6975cdcc571588de60a35bd956a535fbbda4affd0803d244f3f7e6902a2c9a7ef2488691b6bef7f8ffb33be09ccae4c5285265e4957f7928ea5cbabd6823297f59a7cfc9939a49f26bde74c4c69e2d38c1efbacbcfdef011213843158072be84ed3c1781f67a0e2d4e9ba76a585c17fc0a +d = 059d2a06e8bfd5e14a9bc8777958b85be5e97af892d2cdeb0ecbd2d5017952b5042349db5fedba2e26e7b85bbb31ad313d99434 +Qx = 0af276952a1216ac88ca7a194f5b27b7c98c78c42f852dfc1a2cd4c1a477ed16eebfdc90f613b6e264576a35c45f49aef8a564c +Qy = 0639625074b69346dc6c617d624d63ce415a36154a817f4e18c59a3b09e01589407077b19bbbdd57b04ef8fc2cc23c673d52910 +k = 002728f7e9b4772ab790af0be9ed5b3eab697c4710249169d2a5782ab3797b8fa21bf8c1de659e3060af5a286353402ab982320 +R = 02a7027c6f94cc236dc8cbae35f9c38102a663b84f66143e2fbf9a152b1a6478bd803bf3171f933f63509d539a54dd348002ef5 +S = 0549ecf85ca1bae6d9f0038dcef90c93121a654552780f5583a7d44a73a9360c6799e76a632bc8907ce4626c0439f1518e3a250 + +Msg = 8ea18387940035cff2f37278d321b344231075db43c7fa7fee9bd3fdefe5e8f03e7af9deafa1022eb108e19ec11fae34536a4fbac2e8c8139a081a997c080cbe8f3e2d2a72ff26edcc5338b21372fa1498e439e4d9bb12d51cc539f859047957b1b1f1fc30b90231eb06b365a4d404a1fd5a0e5cef171fc95b04d0b557d78ebf +d = 0405590893cbbe18f4ad99df28b5f9d17f8f1882269aff0b7eee9392859d68927a99c942a3075269ddec6d69c0df2d76ab9d801 +Qx = 06ce67ace45a9cfa0cb45e8e1d0eeb44e94bd7527fed6b563f1069140a3f36e010f85e1ae5ef14d626c78465cae43230090baa6 +Qy = 1a66a58d87621b63ca662130ea342db029acc2d99bf76cf6ec4e53ba71bde4b00e508d332081055a65fc6f44a96f4e947d729dd +k = 0035f09e0c15b41c958596ad3f5c4bd4a3685ac94f19fb97503fb5fa29115cb18fdff4bd104535847ff36650b7461550dacf2a3 +R = 051775fe1503ce80b3d581ea3e5ba761665568ce0eb7d6a7163d8d025d76002ca7bcf6d688b6477ae85d09c0d4017aba5ea8019 +S = 035cbe69edfb6fb99c9e45240b7a587c3805ab2ed6b0399c7dd8dd76187363b2ba1def66b2c3dae4bc2e40d164bf0f4837798d8 + +Msg = 6a253c1aa17b2b1e6624afc8e7456d366ef5b1bd78e740538260f395481148a64da0b6a58cd53d7e06c691beae1a616547cd95c4d259a371e51c2c0e334c8a5311ae31e4c7af325686ff9f7a36f731010ee1a9b8a29169ceac36a060dd23611dc9713c615424888bb574ad5f5755d7311bd169336ae986c977a394bf16487c4e +d = 062bbb4f565aa0f23b88ab9029d33b995729d10fcfc33ba7c4051e2fbc72f15636a834e3ebfe604b927cdfc89f53c57f36890db +Qx = 125242acf14c7e08e9f2f0194f734841758b1eea1e37ba80b9855a14100a5f0b57bc52a0200cb640121d96769e9cabc45362f56 +Qy = 0dcf52cb899470943a37d260aa85fe83c3869c862001021660ad09b4d73f7739ad331b3566bffad590534207c6db9acf98399b5 +k = 06095b4ed8d51e37f6c723648af4cd4585d9d250d7519139f58a93c75f197c4bbd1142da59769a5fe178415c677caed1c3da667 +R = 041b212a54d4396ddea2898dadc363ac3ec5385c9b3b8ef1ea17c3d2f751d4f79137238548ad759b5e1700d7d78072df3bf84e3 +S = 0149242afc524b0c3583037da153f539aad85aa0c19c6c70852e3c3923df8c3abd0189a2abba872932eee2e6f45e02f98e810bf + +Msg = 0f91d0f0139faf3b90a3d4bebd7e96ff6bb6f90f6c68321fb392637d8ab2a60d649a7b7364ee6e4e274e1a8d342caee36cc11c56c54247fb0a8e8ef81ac4322b454dc9a195dc54567bf47ec8d4fa4cd32e76d78ea2d08bcbce3edbb68fd8597e56d5a9f2df4e47b2701046df89615961db601bd8204584a6a6cfbb627e2a1190 +d = 03fad7031cf8810544a3e4bd1382c0a2e22c5a9fe4804ce67b27591fc516ee81dbac841d399327168aa6abd79e2b5ef85df1528 +Qx = 1ef0f918c683be57eeab95d5d1850bd492ace7f4b37785863647774a028e963ee2c0eea801838aa8217fad75c5780f1c36e8d4c +Qy = 1d5dfc69bcad46bde5539c58ebc89e1db2a3f65069ed963280cc2cf228b2568bd53c6e0e164d6b63a5d3c2b8e3be9d5139a62ef +k = 00eb16d784e2aed724cf1e4b72fe76b00dc80948c07f9c7524eb0e83bc59c12a8ed16fa7ff21dffb8bbaa82925848a19c93884b +R = 04a07e79b4f771363ad4c46cde0aadf3df4a233740a89168c97b54559029c51dc2c79b7cc94a0e4e3d2f94e376fe47993da28bb +S = 0360f559d37a777119b2aeebf00cc17e2edf04a2cbdf74366f5d34368d2eb2c92958e4dc2b7453d5a509407a4d4643cc0235f57 + +Msg = 50c17c1fe4dc84648e5c3c3ab8f7c971d4c58d8d56d2b5ddd92e35e6792111ed8dac7644ac8a07ca8bb4e38e071aa47b22ffe495e9083f9bf781ac1b5fba571862c909c7aaa7b8d05ddfb7ef61c99700de734d5658f44ae9fc908c85a2dac8e7f854d6d24be805fcd7f873a91252985c5c73129c60177ba8fd99daa87b25a073 +d = 03db41b4f637fe7977c90e4f1a21799baaddd1826c667102414877138436cfae1b9959842b8097b5276f15f2b982ee59df263c8 +Qx = 18eb25bbdeb41c5d14edc675fcac8a523acbfadd6456632bd593ab5f694a7734b163aceb6e6b3d8ed83fa1cf7b5adb9871a6626 +Qy = 14975abca1cb769a243936e65123167e535279197a37d8c92c7b138f31cad4e95c5f62b06f438f94c1a61634b34be7b96f09fbb +k = 055fce73c9c385f007256253281c6b9d0930d127939026495d0a30f25f77fdb6b334043c39fad4223852f7101fce72746ea205c +R = 01d7c26e0236afeac032fc5f3dbffc8c03b04417b514adc26d6a4f697b4e87a008d5ae97544a274c25ff66b98111d7c651c9381 +S = 07954191fad321e7f2de95a87d5a9c4527e658ef85faa6622d5f34f8bc2b84c881ededbe0281456e9b70eaf7a207e253d216533 + +[K-409,SHA-512] + +Msg = 3583a3226e2dc463a462fefa97024e6e969c1b13bdc1d228e2d7823d9f7c09012390c2535baf086588000e908309090daac6e6d2b06d2ede6fae838ed47f30b5b481185f607a3586f6dea47c8f84e9d3b96d5b0ebae2462fde1e49d84d36658e87dccf5e30c0937feefd8862dcdb1a1ca373f6ae41641502ac54df6633a8cec1 +d = 065b76c6093d9c49591293471286df1a4444e60d9d06cfa114e175afb5f119d2abeb273b0596019a0ec5db5b5869f2cc827b364 +Qx = 0266321fd15bf6b1af862496f467069819e3860f74a07825e68f3d023985bfbb838a49b6a41b6515cacf404ebf12ce0bd3d6d70 +Qy = 01593c7a8e629599e63d3282cbea78023518277e6731fe8d88cbe525ded554b51a7f8803ab9e330f210619dd07df8f67e1066a4 +k = 035682af873829e16b72bb86f3ee99b5d9f052e4a631b07f87d3b361c8d8260a877231dbcb3f4d461b4a1d4467824a26a5a6414 +R = 00a483dc2dc6408c256fdf63b04d71d3c58a08db7167da217f466cbbfb2d68444c10e87a9a1bb04efd71135c00226e58414d407 +S = 078acfad2f2492f74b0281d53e4224c7544588ca9ceaeb16bf759b20c2f3d3ed69c64615c247213d51800569dc8b00078de68ef + +Msg = 60ca58462d53d074b370127132f4e59f5eb8d15594dc721a94286afd082a8934e52462c9c1c3910f8b50d7aa3671dafa5972958d876d7992467b2fee3795a6f9d8a7bd3003a8582ea8c003aa1e02c08ab6804d85bcfa13a815d75c938671f0af0706c68bc70a6155708ca755cac2fbb68b2952208d63e0e2e3d816f04c61bc03 +d = 07e9993f3fc1fdc4c376ef77ecded96006ac1159740bd1b2dc6ae3d97e15a67383f1fc931e460b9af3fe14a54e47919667ed06c +Qx = 189b82003b546f94c066963239c7a590e064b88bb4548678853545920e413f2be32125e40efb82d2c9582d2d8269c1d408a7ff0 +Qy = 11583b267727ba6c1e17a244ba7acdcd836986089860ee312b6dc2d88a984b1fa232eb0419730db8fb94a5e077009c1d55979bf +k = 07574dbe04e1ac2bb34e40f32d6f6db364a95cc5770b79888d72b74bd4dbce9fd91136e9e1152424d76688dc995bbf2bea34175 +R = 009e42a63b41877e200829356a2191fbb6f2a9a234be58c76b0852e4f348ca61e7492f90a37feb8b95a6dd6df9d1a2e61c63b4b +S = 01499fdcc804fee8193de080b085b7513eb8022503de5f64dc12c04c0ba24af30e30f63f0e3eac2c82eb20c6672336f8732ec5a + +Msg = c749f9bb92ca9957ca6d0124206ebf65e860ff38a225e241950bf4526cef3f4fa9184ec83f71f813fe852dc08eca6b45b14fc7f2c6a19296529bfda007efe9d0d26492de2a902b45ed39603e22f0a763dfa5deadd97ef6feb859d860baa2cfd1d066c0be0f9f4e0e2fafa69cc51b12e814ad2e33b0acc0bcbe1df8cf018dcd4f +d = 00c11e2979498695c660a2bdfd105b115bc4ff8664ea15cfb40c725406c6fc9a13027bd1d72ffff6258f29e4e19b845243444a7 +Qx = 0904a9bfebc23607c7c89b7aa89315343852cb894f54fe42ba4225285e58c6bc318b55691aa6a6ef22eb11f44cbda89f157d7a8 +Qy = 19cc1826280e54832b455f0ce0cf89bdb62e973a8e819fb776b1a202b4f207b8baf9072929c9e3f6a8ff996d6d529de899b024e +k = 070fe023c9341df9348f08882bef47bd8dd7f13db7215d1cd52cdbe7919031a62455ca969a8cc6db0a05a0b4befb47c142c4f34 +R = 035e7130d59d92ff8c4f264fb2c346e052bc305c7f57549a0fe43cc7cdac6aadf2ce1939222decef4e1f900e3c2fb2c52bf53f5 +S = 0008d5ec1ed2091309ac11eb88157ba5122bb9b5c858a46769a130f7a941818445664ac78325e0b6d2a11bc89d08fe0e87a5bcf + +Msg = 4de8414780ea20f7943b1f1adae5e3962d96e828fee43bdbf2831bd71bd25df2976a3be37a7a667c7fbe1200de578920090d131a750c9bc09bd95b261234ea8cc25423c4ddfff5656d6b32da6e2f6f530e6673a8660aeca31273bb9a3a21bbd7031a2fa71ba37c004d3d1c64b2c0798783e47b2efe1a208959ac16e35d444245 +d = 068dfc23c6635bd1fa1076dcbd456ad6e8df7ce7c1370fe275803befc4ffad007fd062a61cf1d50b93aeb9afe1aab47a65af82a +Qx = 05591f8cb59ccea17bfbcb74e69f05218d16175f0547ab95f507ef8d7426c077b52b82dcd06baf6eae7a66bc72422236e589e42 +Qy = 126a01d5c2331a2d00949e07ea9242ebb50d830b0aaa74bce841d4e43bbaa9e9aaa01ba25db7a8a2f4d72977c0f016f625cdebb +k = 070682c9659089a703dd9fcdf2f3fa0c1d1ef5fae3f8f1b3dda55d9b611770244f8926898c904f6952c1847d287bca21db4dd59 +R = 02734111e3b736ae795929f835701bf290dd50c0fd625738ab2769242c1403197a3f4dc29ca618c2e292c6bec6dccff71adb698 +S = 0755292cc5363fa74e0193a806879d3a275b4beebc97250fb230efbb8364b2a30098c0488bcc6e20449622d6a5fd2ae24d7abe0 + +Msg = a081d54232f84bb19dbd52ec3812748e2e6486f6cf1b177b27929504ca878036547eb43531bb5b3edc81bfe105370427e92831d2239cca0106d031d9fa8da9cf89c6fb6401377d5936b6329ccad854e5567181b8f16a37c35f333eaa0ffe91d727d183fbab935fdac2d5670dafb3fba59e4fa2df1746c58dd8360fa08af7f4e6 +d = 040807fb888e1d9fd33604546656a493629d94d4a0a9de2608962225ed158167f9e2438abe2d12a11e2adb6c2b66ed78215b0b1 +Qx = 1787c0e6c55acd69bde9b0a84d6022796d5b5c60fe5357bc0fa4386c16f61b38bfeadb6cfebee7e7701bde24418b8b5642afefa +Qy = 0d9579d271ba3d5e2327eb863cfdca397070055b97714e385ffc2fc23528f696dac1a4d0e535641f6c876f1819f2672a8c31cdb +k = 010b8f5356d8a029659492c444876f1d274b82681d4f600cdb5fb2afde13598ddb71676d9ed86e83351c70678886e8237a865d1 +R = 0304f43f9705d189f47ee09a079494030b0756993a93e4c6ee6b5e664f63431f99e505747c24377e5930f13492483e6cd06ebdc +S = 0580d4707c97f0330f908042a6cb2a2b313f07bab34774ee03bbee63a4ff881b68def47cd300fb49deb49829bf486d1efad39b8 + +Msg = ea60266f1538565b3ff42fa4bbfe319be070329059c52c8bc04a7da2824f209c1145a05e551ea59ded8ca8439c328f6907da4e81d658937df614be98c7b8648818ea80ef40e49aaa4431f4a211d62acf2611f5d60c446b2b25745078c643859be1b12b3141a09ab765dd63ea1f2a2df015eca0840087a5db378c4c4cce76cba7 +d = 033bda0a02badae08fe40c239b9d59e5bfe1c4d4b9b7a5acda6790bfd77ad08dde5e93a2da80ec54a7f88146d72218bbb88aa10 +Qx = 02dec536832c8acf007daa66a47e4eeecfb6991a359f8c412299ef56c6ca2faaf18c4db708493e84786a7837ab74c5fe0644cee +Qy = 0906c8f603b579cc2384e0803d31d577f7c91c55406db3b2db91bbca323fdf3cb6d010617ad1aae7bf414c4d974f22e6f05af53 +k = 051e8d027e62db2397e4a807d98a24455a76eff6dc259ada89e794dec1484b44724894eeba842f60b73287642570460896dbe77 +R = 031769e6777444095d934d05dcdf82405c43ae91ad5fa9201568ae2aba25712717f1af2b8f49f6eef373237bd70c34889d0d271 +S = 0023498aa50ee095f33a4081bfd70a9484089c85fc7a4569f560ed67243745c823cc0217d29e2938f06ba9c8790650d10fa5b1e + +Msg = 82f38c9405ef0d26bcdd5b3fce4fb0060c3095f61403418e17c337933f0563c03691fabd32ab5e896c593439e7492a9970ae325c67196d9e83fe0f9780409a930326f7e6efae035ef8c321cb9ad12461edd5cde66c04739fe079db65406b3c2d22f2d04b1a4335285513d4ceb901d2ca2ad10c508302266c2cd6079ff14eff4b +d = 04ff431769d26b8837d3e1295f5464fe82be29edefba76323e92078a6483ea0daa96221549102509a1bdcfd46a5a2e5de10c39f +Qx = 1beb74d427d849705cf26e26312446f27a7c5ff26ea9dc1aadca763254fe53a622de29cba4fa81ee2f9e0319e752f72be46cc7e +Qy = 08dfcda35a00ab77c3c47dbc05b0678cf561f575369507097833e86e523dec879e0ae9583b4261f7a73c9dbd417accd4ae6688f +k = 005aff3ad332af23e0dc38c16853252825076d602ed4c6d947be751af5dff3f59611e6166c31740b5e5a167260adf2a5466289f +R = 035c4e8e1858b9694cfef3e864ed959638ba309ba2066a28fb9d0e02a66cd4c187dc6fd8ca5fabe68acbc2074168157b685aa6c +S = 04ec2db89645018f9845b7ae31b8418a767e3570d401f41db18e424fe861bf09114d78606a056617613447d125a283be5bdb6ae + +Msg = d8506fab4f681ba4ae86066aed447571eba4fe04e6585fe3be6af2ab1000a3da68c5b0c711a85ddf3a40cb7c8944eef81f2094650459e14f5b848e6add7e580b0198070f873eb3ed5d0728eabd92bc1398764b94cbb4cdd7cc2027b9762dd10782658cd9e8a5022ac062fec535d892198c8a387b3d2b6f7c92b1af6ab7dd9e4a +d = 03f85ca1169ca7e9df44cbc6bc7d2868c9d94e8f8b699a42ca492dca0914eb5789a9032218dcef7f95f959c9554a1cd83360439 +Qx = 0aa3c77dd4324258bebe7da5338c772d3496e3fd0e57f455459542f1a1c5b47692f51c3815c9549d0c23fdc1ff610fff6847ea8 +Qy = 05e626d6aeb86dc51f3b359b10862cd33ac9927e38127f7f17426f2369d62132a2a62fb6b8354c5ca0b3e5c7c87117b4f777a0e +k = 0495099cc73c9930333ae3f9d0b7057d7c70e2bc7c805c0c6a44404739b3fb68f9fafa53033b54b7ad7bfaf4bbf7baba0dd5a0f +R = 005612fe87c6a3a164d269da902aa43c5a4e0333770ea6334f05750be3f31ee758d169291e15b1540d40b60d1bda279599f254e +S = 011a633bbc058550a597585bbc9f33099eb517795600b019255f649493d4a6dd533be8b0965d9f9d9698677491bf929198ff34a + +Msg = b3f30d34f252a4c26f396079e773142bf61c0981d912333ade3de4e27cbc72cd8a16b31807f0c46116f87accb854487d83ec8c6a61565e6fca145eab70048245db08616779d7047db63aabd90dd15acbb05eaa510072c151c0518f1b34582b95f43ec7b9484b2993c176de79e84566764467f72392ef31619426d159c91816d4 +d = 03a97deb36d68f81f50c8829d412ee5de7f9d775633cb69c09dac558182039e275fc258240517a7c4aa592e364765321f27cb12 +Qx = 13f0f4c16a47ec3a46e7a088c1b6a63ef61eaea46aa9b2c532d8df84dbf64991bdc2c81ced3635e562d1403dbcf6aab2f8aa9da +Qy = 03aaded3b99a454b820fed989dbf6430ddcda67db58e356397d06aa137fbdb365ec43994abd9c0a9fadd2887da9539bb4ab3c44 +k = 06620ad14a5835b9e9e104607c317cc599416683a60ed8865acf78ae1e861246567cf9d91f759c2d4c82cec835a4784d3c231f4 +R = 068faabcb7c716fd73f129ebc6625f5b4660a88e47dc7dbcebab321051a61e46b74409e2b0af420e1671ef4efe04973c43471ff +S = 06851e5da033da0f28a89dbbdabe93ef11331c55cc03d5b096c0522370be681241fbe71d1349f219ce57761c85fbe208ac36a36 + +Msg = 0fb13b7c09467ad203852738eda5ddd25b17d330e82c279630b0e1f0c86681f67f6e537fb00da9419114973c8559306de58b0387d86e52d821d982a60769d2f15fd5ac2ee6dc55d8ac04ee247282cb2866b8cb8b4d7b4b6cfb33bfefdff09a73d727193e5fb939ff66ac5fcb644a44f9083a790888cc538c5eb435243c6a34a8 +d = 03b1da0ffed24e1a3b5ba22bd684337f6b08053591620541bdad50c761d66201a2cf21a4cc636426456525b598e96baf97d9851 +Qx = 0116a1790e621272b56cb4579ffe6ab629a2d077b779b73e039d74f58c476283c110bb18b9c9ed63de7288dd678064de68b7df6 +Qy = 122b43afccb88982f2e07ff35468178572bd72b644322d9e1ee68f78880169a83a5bb88c6c994762a7e8d80e09333487ac30fa4 +k = 06d7a24f0fcad549e9c36dbc70ce264a75eb37b74db98b1f6a824ad1e5635be9818f45c7544927807dc0fb3bb5fd38556e8656e +R = 0232339b50bdb772d15f2cb8973f6dd9397af45cebb69adfc089bb802e9c4029dfb2078a8a26d7197de10638ce512e5904ccc5d +S = 056add03244174966d53105c570e8fa660ae8c5d53316a24cd26f24e29e4b7459f4c9daef07442247b63665f97a3c07d91a8706 + +Msg = f9b8124281628cf4e1da0cb4f021c8d19d815644cd80c7c8de4cc62722904ec4cddd26cc4891f30b15098a25ba6923c6abf4774deb6e1883fbb409862f94467e75a725e7154be860fd58347577c83adbf18535c54b102220197afa062cc1c84f6094490ce488af4a08d2c5b808a2572e18a59de96c87162f88413795351cedc1 +d = 040bac7e0d3b54c7753c79d43469e310d876015d948fac4e3a9765444754476af72330e88d79ee6119697aafac8435ab5690754 +Qx = 0bd4fe8daffe47bfdfc43deca20b15da7c999084bee8983c62e3dd33740143c38d8f432cbacea51e6f53994265b2d8f4c393f6e +Qy = 06d88c33c31f4e143b13bedd5738bc1191fe6815a099fb7b44617fdeb08daa0cb74edab7f9a8c67ac1e9c0f0fb21a9f02ef4b6b +k = 020f2f6fcb3e471d47f21fb15301784f7cf3632dad3627a9ebfce587c0097871eca580bda051b100f991aa6de5edd3a7684e839 +R = 014f8884b5107e9ee5cf6f5d137ec9d59a85a6fa0431053d58a1400fbf0d518e8910179da1160de2c6cc8ea8ba8f3af8e0e1f6a +S = 019aa8d55c8d876989f9b9559db0576f91c4610dc9187c74aae2d4f212cd94d90dd81ee4483d88d866aec1ed469c5e3eed7d90c + +Msg = 4e3cd6100520db050af0daa69fe3cfe6603a223d4f2a6318fc5836db8640d4c7fb80bb781302036d2d6fb8e552b4eaef3133b98ba2d36b9ef0b86243b0391413c73d48ecbf1d19170f1b3b781b35ffd316afb1d55d1dda8e91eed5553780cb2714a93e7ece698b832e853e2589c5ba2b8a997bbbbf625071ded66762af8cad42 +d = 025b7eb3bdefba3c5134438caf968f615b315204f348006f82e8d61057a8a8a853230cf0500f9d0b8c1551a59b9184862dd2ed9 +Qx = 17d2029cb711e52df416c54b63a95a66602a1d15c3761d91071964e0128c91ea766b3d409f72d9fbb5161a459c3fd7990f87d88 +Qy = 1e71a9c66a4d4dcf199aa329e44b99f80640fc760fa7326f29c273aa13b153df5277feb3c049e407630173fdc9f735d7aee4e10 +k = 0575aade2692534b5a1a17d36c36973d24dc501c75c3b0b497a3d2fec80c67be7107988e47199d4863044fe9176762497b5aff3 +R = 024c6004fa92cad446b8339917f517f04d22db47b3f9bdb83d863dadb5431866ce21b13e780495bd66152ab33eeff8830cf8538 +S = 034aa568aca7be851d276d2235e42b6624df1cce2b97f6413dd3fc506f0f18483f95f911feb0eb220415ac593f2c93dca0808fb + +Msg = 5411708381a65bef4381c9e13a04cdd5ba0c15829f7f25ccadf695f635384d8e4704cb562741747831b33852567f42fedbd190d2980f1bc921ce01c17d659d4bdd7eb787b3927fcee659dd3b65132496c687f2249272a473d46326e66b3cb78dafbb522390162c168f73bdec88adb145e6afecd561979846ea4c8cee38dc1686 +d = 0673b3a2985c95904732632e5d988d8d437a60db13215bb6aa880b348f011c609a1e860461427a8cf0d622abc47f910f5c97ffa +Qx = 0c4f1c0cdc44d867ed38d093eb967bfe285df897868c83ffcc0c53463e3852a1b2039506d9508bf01d0d79ae537e42fa2070a5e +Qy = 0c2bd9343041c2c4100c5d795ef355c796a6ea7954cd729e11063b14a27fc2c3a9ffdb3647613b44238eee17d9cc49e8c5dfbe0 +k = 019a9509f5f6d947532638a3c80782b556c553edaee9ade91e457f7b5d2c9055572fb116f52cf4d3a2a0eca72fcb32b2f58e952 +R = 02def440e968d17d9904c5640619af2f447f74b7c067537db4a15be87df4fe68f44897047fa8af146462ceed4beae36d54e1aaa +S = 013d5b00fef639c556d66420090c2cab1edc57b7257dc35addd62a5337300e94ea7ee116e06b744da1b575d90da81e8ae2cd424 + +Msg = 23757fa60fcabf543e603d8b31ef0cc99b3ed16b4816a84e01dbfc858872fcb79fd03d2f8a1d4f28c25dc42a39e20c34f81ebccda1682ee9bd22fe323e7f8ea90cf4a2a6ebb634cd1153cdc35f7306f28a2efd822bf23131baa1543d0ed5ab4c8168d3199983fbee117085f90550ec3ffa2b06070d3add1d707fc2593285ff58 +d = 00db7dcac414010b816236cad584dabeaec1da76c97182d1b62f87bb7fe2946a64d10430571b2b29ccf2ef72c969a9f045f1f3b +Qx = 1f2a6cbb9c1fabc8db2848c74d918312267888d822b7dfd1634a543dcca4be7c997239f6281d1d8b5da9adc694706b7b19cfb0c +Qy = 1bde57a2ac15f4e6b26a373a624588a3379c8eec758f3c68695e2eb1856075d90085f43283d982526c5e57913cca5e2b4169f8f +k = 05a3d856ad1d6164993cc59e70f8551e2408da92c7e6cd52df51b37dc22e9ebc42fbe6b83c332eedffd4086a382056175ad7009 +R = 0489b0344ae4278a0376dcc64ef9ba8595bc2fd62ad22d42fb431d2863d8ca353cd9e59de4ac10108fc247d6ee9ef643f6bdb3f +S = 06aa27335e15dc910515385764387798cd4a9b4cd6d99d7c42e07fc04e2bfedf8dfaa7bda396f88253357d3e2545e895d9aa3b8 + +Msg = b976314d2f066f8893307a726f450dcf2cf865c170e90e6908ce9787eec48e1e2119a731b2bec3c12fd4e6282a393774251bcaef91af6ce57c63a8b45bedd72ab862cd169b7c84b8f6a72084ff823a96f2f8eff3483a7ebfabdabf0998377c5a6836d88135cf61c65a0ca7ca57727da68047dc635c17ad13731035fe9a6402af +d = 04717efef16e1ae267e155aa1daabafc68515aa391dfeb73c13d01f3132bd22c984228dddc4dff4c39979e7585acd3f730cfcfa +Qx = 1526c58a3de46c95cb0527869f7d637f9441cb5504e6a01f339907c6df3d079361a41571cf0a0f11996028a41682dab5decf786 +Qy = 1581903be8a19bf8bde1d89bee0d436f061ca1a3ddded4b7793fbc32ff852671103f34e16d469eacdbfa457643d1b18dd1c4107 +k = 05c846bf61c068b421efc472469ab1ff8d9f34847ae0065ba6f4a000be53727b3fcf97a780362566e13ebab84b9ed5f0cbbc225 +R = 00aa138e742ae81eafa820632f31e87bdcfce6b909d85805e46d87d1cdb8b968907470c7ef5806accbf6245628c70d264fdd95d +S = 04df507115384327f7b8311dfd1227c19a6124cb9bb5901bed45d8d5ca45db0903f53e7bbf136350e66bf2b4f3d978f8bc546a5 + + +[K-571,SHA-224] + +Msg = 964ad0b5acc1c4db6674e86035139f179a9d5ec711b5bae57d2988456bb136d3aade7ac9ef10813e651ae4b9602308b071d75a934a6c012eb90c5eb9b2947b50fc97b1d36c5bf9eb13a7b06c94212c3dcdab402a563262298defff62b836ead1f78f9d20713710fb48115cc5045ba15140fbb4bdf516e4150d830d02cf30963d +d = 19cf4f4d06825499949f9e0b442586fe1bfe3459813a2b92cd8de0f775a4735e02655702ead8e60824180761808d9e816d60bdb0238e1e8039ca7bb63c92e1cf8433ef447e64ead +Qx = 07b9cb1728cba80367b62872a986e4fc7f90f269453634d9946f79b1fedf42ca67af93e97ee0601bb3166e85357e8b044e39dcc19e608eaaa8a0066ffc48aa480c0e1e8d5569cbf +Qy = 580858ab9223c2b2ea58df506d703d64b387a78ef43846894e7a2e47c02252bd2c1e3d21ada7c21d50a08cef0f9a189c4e850c058cc57c37918251b5aaaff2321d7355b6b555644 +k = 0726d5e317f888dddc94c73acb14b320ff509908052868f8c6b14e531ca467c1f7c8287476674efd0d636ca94c24a69d15210bb43a368a11d3453d69ca80430cbfb8b6e45d8f21a +R = 04ec6205bdd8f7eab414110ed620dd3fbbda4cb3ad9e5559a114ca9344782847621961a3577cbbe43d94eff6ffc8dd7dd09c049239f026a928301ffcddcc910bf196853edc86d31 +S = 16535b1af98a75b9bc0f122ca3ce23a01800fa33b43584a94fd8a8d6f40077eb739f07c9f0e179a157a28023735fc8da2e2ebbee5f7308925900e657fae7c3b321f14fc45346f89 + +Msg = baddec4794effa668cde267016dda67bc70b847919a9aa595f93ba9dc27354399ef7a607fbead31e57a8ce698beabb10f313d393980425e67cf95be45d512f00e950c0c5409573ddc3d556f23daf056259ee8914e860562a674311452fed780b3e0317a7fe93baa81fb98df3ae4328b28ad0ac8f8ea33efe24faee658ad026f6 +d = 098521a732e72ed945a549afc92318fef7156ed1d1ed9bab93b581478cb2339eb32bcef705c9bf61cf2873ddbadff8ff3806740a2e30ce67d1807a8179dfd5d952e6f8a583baf81 +Qx = 1e09410bf4f84d53a2abf8d106fc64e643edefaea263dc98c308aea16ec75f083b3e6b442ab261226c59ca5fa622db68f5cb5f2d1d465b01d0048554b0ccbf67c0aaf934d2365f6 +Qy = 361e5b43d313a62c7b3897c7db8a42116127138a1009f0bf9892981fb4fd6ae231b8940e7509f96e2a49285143010dfb4516ff810a91a4d9d2974c522ff343e93e8aad00aaa78b9 +k = 128056de96666acd09b93c5db7ba1b8fabf57251ec480d42b702940b5847d2a59b04eb5101bb3990c3ae2a41181f19a2afcf08424f8b922a95df6b292b1856dc4a9dbb1c717ba5d +R = 163483a7e0d1012695ce0c113ec8fae3694bccd40fc038d4038f81bd39e71c969cc7f0af8313a9fdd3d028ab24a43279569dcba73fd78ad74897964ae715928b1cf7fcb779b12af +S = 10aac6929432a6bc7e12ffa86e4d2421e0535fc44a1160fcfbee477c29a987e783a7f753eb2278ce08954c7e90284d2ce7c42de103a9c59d8e4c459b457688ad515cf156cfc56f8 + +Msg = 7ef7138fc657492d229054f8a50dcafcfcd1dc06f1c16640af3f658907e2969248b54416066eb119adbfa23b8dc578aef18bba79610b9cc109394b900a25e55a779230bb858b2ddd9499a7775d392328db9177aa9571c2f61dd52010b48502154e914a0c55a54edcc04a6713cf7bda8744a893926118b09df877d1a4f3d95e8c +d = 0336fb21549e397a190beac38a1ee10f0551952da15f71e11dfda415e5ee08da2356f114d450c661f52b2b32cfc7b9be61732672691a079f0927989b7e9f4efe6095a242155b641 +Qx = 316800fa2d8f8f3f9aa87ffb628dd7b2f63d4d8389ee86ed41bd4c3eecd3f3836ba92e2ff7ee5626213f9ddb41b43561c5dc0bcc3df0a872e4b8026c09c7b52b89b4975a43f60b0 +Qy = 207f956df58f75286232967dc1d3e6507634f45c0014c48b42868fecce5b9434463abfcd2b3722a7f5ed25607270148466f6ffad6a8c86e538640ece80e84f7368d33c68807fed6 +k = 1517b3524b6d43dcf3964f7c35c89bf14dd1542c37606452e2035ff0bd0cd1edd6d7b801ecb1f573e957131c0b3f30d5006f6e4748a11b9db10fad41961f4ae53e848c6dc6e1a52 +R = 1ffd4865dae7387ed797c5ffe58a929cffeab521e48284bd7d4427d5856e9d2582b91363f1d353a0ab1aabfc132a778a516d4033c64cbc991d724115d72ff8e94ab4f95a9514843 +S = 10f010aaf1bb714042fb8cf06a9501dfd1ffa598d6b3e68e7addefe00e18f3a5db8414d625e374d9ae70bea43b57c6be4a590c28e50a548cdb2e30dd9d6e3ed1d9cdada9f8b0049 + +Msg = d58e1ff1d49a471d0567ecf8f29173dab5fe5f6184ab4cdd095c231fa7b82551f99a482994a46c3d8ebc07297fc9e952a5dee7d5f199b119f6f8b250f8fba45701ac252db725e75c4da27ad77d59a4eac448e54a277986740dfee6596811e59afc9755e53d24b826c09e497e29e69a22bbc85be11763064e9ecad7ae66458ca0 +d = 0e287ebfd9ba294128cbd484fc5121d271cd33e685bb1804f09b40aaacf64b5a9f2cde9b30a4a02d3a9bda97d92f46bb8787b3c61f280b1e1a0680f1f0679d3bb34d53725d62e52 +Qx = 52903a7afc17cce078b4b658766a67f2f75ac04e296757fd762fc05d6a7b4e4151598a872eb4618efcd06c43cdc3e54f437c0ef1b091ab5e4927d3ab4227fb24d4413e0327abb84 +Qy = 385e808bee8dad1a1b84d644aa29fec324dac2242709421479fa7a712d18b54db59778724ccaf4e51a27da090c6dd0b7967024db0a8684944b77295c9624ce3aba24ff48c86ac85 +k = 15e8cb22e371965801d99407d96200015ba58fd7eaea52c03269d8a374fc7aef17fbfd4480d29b781292e179936a68ed175802f34043018ed1d6b5a4df667d859cd2ae53ed3cfcf +R = 0d3a57af73b7504ef18c03ed2c52aefe1d1a3f0e27f78c11d45e9825647d5ff6e97af51a5e366e52e01e5e832e4264a1d5b6967cd9debda59c955568e4c8bf804d843a49a0c5401 +S = 064fd7ecf4470f07b4df3b3046041e49f310a463210571606f00a1915c5220a27bb7a28cd0bcdbe374651aac06d4d9e017e31879b7819301eabfe3a7afe4b53f75ccc465815b4cb + +Msg = 4949ba765c14c31f68ee0ca26bb42ba2edee63537de4a6f5c42bbd862c21288d6ff48145260365193c6fd2b56dfb014da26b8a483776b717c6874f627c9a622154b824565b23e178240f53ee9748c45759ba5c035b584df0f09504e95eb9bce0301653aadb860bb25e6ea6b9606e0ec3bdb8089e6aa0d5763d331757490715f9 +d = 149de496fa8f88b2741864d0c35b3df666b87179b7bd06cd426a45f13bc87ea9f50dea85e1fd02a532630e0e3a231cc3e7fbb7c7ba85b40cff1124e72c677c6a3ea6aa40ffc64b7 +Qx = 0bb610e4308e229e4b4ddddff5c4633ef2ab40bf74514433bd068c7d59a6260ac79366dcdc039d5585e660a4cbee990a2cb55a99ea3d26dd9df856b0f3ee5b968bcc349240a9a2d +Qy = 3e3ef4be63fde6ca09f12f8220e1d9b5016f267ca5aa09a2dca8a0e0feda9647fe0e1f7ecae7147a10ff893f69a4f74172c6e9a62f0c5bd96d49b47379c9c84f5ef8e59dea104bb +k = 1cffdb963c2c8b8609809e998075299776b44d2808df509773f310124b5f318d7431f1ef8b38fac5cd5580348abc41e6e6396767f4780656361dc9a71dcc8e7c9239d6eec5cdb94 +R = 0982b9989c92e1a5d25dce832bd8a3f602f0eaea69abcfda285cb3841fe3f019503e6faf8a693712380a48a6af8844b6bd718f0edf3b57662a4fe82ee28d036ecc4cfc7310871c0 +S = 1678bec58d69def3fe35a64810b27fd06bc29d165593990f6f42c4c7676fd5d4a965fc92cf20ab8616c7ac7b4b308ce6290c5e8b4edf6859fd6f6f01878f2601e22acaeb5ce1f36 + +Msg = 5bc63e5c50b1650f0ed4a599960f1e4e11f6c151b2123fd71d9e3c44662312a74b6854290628e20b30eaba81555acb2fb49b640bdab2528619c7fcad0f2a2880c7ea232d427d7c935fba2313370fda8863a7e7e203d63ea15d0cfa083e716ce6068c63fa616ddc225c9e413e694cdf6b355cb1293af5d6cdea51168f5634e878 +d = 17605d7c5873d870462375d741b4bc6375f3d47f7f5e9d998917adf2137a81e63b66917b3dda8968930c4b850f2270eb3187fc756e2beeaa67fe0d73053e6cc0ff0004a21250551 +Qx = 0d8ac3e76c25cdf4902426569763f4ae0638ebb1fbcee6e12a4e0b89d6d451cf420d10441a0a9984710dcac13bfd7ba70370afdfb58e2d982ac367e178f6834b4cd2d232e7f246e +Qy = 12b5fd5b686e58df08b695fc333937eafad6006be5a7bfb1426206102a79bc32fd9ef46e19869448fed0e917fe059b76c8b5a9c403c3921ad07e6c19ca7bbfeff5491b22f8bb961 +k = 09179b3ea906137dcdbb97b27f3690bbe3bc4f1f57c46ed60b8503cae97602717a0724e055a5c52199ae3f08f1586b87fbbe514667d2eef2fe44092f3c916976c7b71eed67e8fb5 +R = 05b28342703c83ec2df898458fea6f71030e4e9c567d140ab09cc95df29ccfe199837cd58ed00d07241988bf3c863504d065ebbeb8ed11cdcb02da0a945ff38ca58d629f76832f1 +S = 01442a5606791569749b5a9f20ba8eaaedd1a2ceaab2ef55d5d41271ba23f6a5b6a33c76763fc99b291b07283122596a3331fcc9ac038447f3e0cb54872c140300fea65d7809191 + +Msg = 610f6633718e49d232b3798654095e2efa0de11f41258b27aa01956480c870d901efa77e109d5f95f1f5101d3c90fc51312d9b3019d2e42e0067eed7b457dc7fbe5466923b62c83d7347e4dada571b57813bb9c21d5e308519b8eedb7a7706508ad04aa69698e03636eb30fd9fb363ef3a185756494ee01175b16847f5b68076 +d = 09214dc2da0967912c31995cb8f5bcf4bfa832c5a2d3610f3a9857e5eee7c77100d599d9ed003b4106013155dffd6c48859b846e45e0ddbc5fe24f4891c9b2df51407e9cddbd974 +Qx = 64376a92c1227c1c479260c7497147760c103bfa5be95ca1593f29a851daf2e5c3a5c73c1fe3e6e2506fcea710254ab5eb2daf8aaefc19cbce7b1c4afbaa2fcda1ef85750fc0a3e +Qy = 70638482e5c7c17a82980b863cde11294c0df717bfa4b9f884cbbbbf80a64dd2cc7c7d89ed21e10561260d372da2fb726de71863f0f60e8ad0fa5e74fb5d29bae0cbe8ad6b32f6b +k = 0621176102c6ebc2c810eabab9f60feb71083c07751c66f719370713ec2de9ee3957bba8d768b076885db1f226a9d37588abf1b141d81b70f0af711c52edd30e92e34a1d3ed214f +R = 1a21d460ae85d0703b4b10a2f77547e45135048ffea590ce86e0a1c049f8a4aa7b395f723b7480cc84e33f4772df8f181f3919f3c0b0b4f276b0f855174103a2f7bd757584425cf +S = 0b56bbdf6e2be1b9e754f9b48b3ba9a13403c17c5cfcc4910112704aceea9a34209df406ee40e0a10cbc26d03839f95e775e80ec5e29b156fa277a5ac68abd99c7005ea6ba2695b + +Msg = c548f0546cee0c0400401cd540a0aa9377f27ac64492e6baaf38e794db4df83e64ca3d83b67bbb46a6c269c04c2725287cce0dee984a0d468c9ce495a7e554a6835d72c7493bfe88dbd5a044a148c89001b8087fb03e57c2b7212d0b175d616333a9affd8a1802dd49ba9be3ab6c6d9f99a5578d26cc4707a5860c6c804d69ce +d = 042f2682e9ac8b76f3c0880e12c292524601dce9ea6982dcf68bfdb0d3fbfb50dc9229e54149ef09b95bbf624eb04ce1427077f30d8536be9f69970ddb449ca22ab8368d2689ed4 +Qx = 116135b273ef876453b9c4c39e4be5a815874857f4a72602f0d03b4ecd9a4ad73b90600c71111e317df0782fc92e6ce2b194c204340bc11e68cc22ced38e99f90dbaf0f917e970d +Qy = 36dfa65a6e9d0ba521ade7daa2f6b01e1d14fbe7b5abd29ae71c4eff66c390914bf46f09f4ab8a06dc0fad6fa257a85f993d6829b5e0add5086b8fe2ecb8027d08eec1bea981cc4 +k = 0bf116711b31ca347d41a6cee5aa13a74e042ffbf79d2ae9448598e6950d721b3773ae6f25d7b49ca9dbcd62feb011d5d556bb9f8a55a7acc9a3a166a4169351bc31a293db68eed +R = 11dcb7f4103e814439df22764f776a74aa86ce9717585712b224803f0ff193d5f541d94142812c726b75e8c2c37f2a4c33db6af118af73d3ec4fda49cfc911fef1eda9a470ff200 +S = 15fa4ada3a6e95164aa8972f14ab7572a3b898feb6cde160b8f25094f67343d35e6efdfab18793f77e09e5a42f56bae747b2b66fa9fe1e4a97e5e05ca743c058b1024cc848393b8 + +Msg = 9431c6c5237f6b4b35682a0c32f68752035c8b295a1763c5dbdfd73466cea64a00ecc11356d02d2a9211dc54548f5db1651e4471898402c887fbf45005a3bda271df0158c98319d4d6751b8ca6b07100182957d5fe0d97c4e2294406f83e9afcae4850bb089f2252490417b5afd8f07f4c795fa84c9c7cdcce26bd97273c0072 +d = 17ed9a9c75cf66528428e85b0f019e3488af8b893b12023ff1b4ca9c3691b74e594539afa0f4d7c3863d15399b862f15e27bb077392d6bbd546ddfd46728c75177338466eb2f4ff +Qx = 760779389124c702686d8d7c25dccfa74fb333317bdb414965d2c271ca5e687c4cca57e6f6149e1714551761abd4d651e7b04451d8be8e58c0c9e361fe0c6771e3d547d6ac3e8cd +Qy = 52d5725d14b9aef93b83d638377f5a19e3cd6e3584121fdfc2c3ba1a588491d7e9892be081c9e7585a15b37a9cd4c204054dadf06a9f4ebe98f95f6554941982faf109c2af98c65 +k = 104ba3049a642d9b49c4302e9173a9efaf215b67e060c5e9673521641c9c2a5b14bad25a448e46faf73810979a3a50104ec8c5230a909ae588213161fbc10381d7c75b35c84046e +R = 1bf3e89fb0beb1ab854a5513278dbd8b9c6b05c94ab67145ceb1ffcd93d1a2aa374db46ef327043518a7f272b957dbbf9d6cbd6708f4c89f05865932b7e816b12a59647d972f6e5 +S = 13a8c121c9c170b244ae3a55aa2d53f4ae5af91b1f72c066207e3f52e44723bd4ae419d24821b83648cd64fa70536605912a5a9319dc446a6b2b639cb99ed2485271acafc2bc988 + +Msg = 417cd5f60416f17081d2c70e9a510114e08be83573bf9deae75fbc3095dffc8a7f7325f61f9d6565381710eda871388cb17619e4448836076338ee309a2bba5f737319002e259b4a875cce1bb97996101c9a7abe0278dcac203a712f0809eb3c4b85a9c380550ab0bbc5067a8edfa78abf03c09b5c08f21714e1022ebfcada4a +d = 1bcc09b3f2f1d26ab9955bff7e8c0f85c8a61293511a196b53d7963f4a4503849c96fb4daa68c9852ad9185e01a35f0bf298e34a09ec352cb6da34f89a1f23e8ea27712a8f43aa7 +Qx = 1326341764a4aea222e7413a4a6f7bdc0c35ba246e3c68728ce06bdb19f2e1b9102add88a8511130ff48c0cbe4012ab52de93329670a319f6b1e7e7dbf177667d4a98d3891ec147 +Qy = 7a4aaa73713bf8fb3907d49e5653cf82a9587518c2f8269cd1e556a3be3589dad4c238e4c80681e141be93c318f0efddee3e378cd46512d778b9033dc8706bb843a3c3546e76e4a +k = 13412a98a2c14a9672ecd42db9c079a689b147ad91869c3d45a7046aa9dfd3f31edb43ce6b84e9edcd7e3ac6b96d89f13878cf5befb052a6f8a4e5577bdf916adb10d908d5e99b0 +R = 11c8a92044a30be397007a71d9af3e4222556a10f3a07a1521c1bcef73b4ddb94fefdebba5944d5bd91313560718a8f520bb5cd5666539756a5e9b66a1b2d18fde5ae72e61d584c +S = 1ea510e23ccc7596db529dfbea78c99fc78ae53da32ad7c7bdb1df01039310988ea601828fdfc59a0cd237110cfee9de8711c073be44dd4d04bca4b1cbec278b1a9ef175d93f70e + +Msg = eced8c412a153a643ccd69596389f83b6a36880286f8aeede503452bef8305942d95734fb5733f37ffeceb1c2dae7b1396c3323de11089082745c28a1756f784423fa7ad68bbfbf0d93ff8b7ad62220500df6d6895788402c1f5c69c06dd9ef55e2401cf297184e411be87c1bba657f847208c0e750f94a3df92f253b377b4da +d = 0ec52fc3d9c272ca80623e06b15c35f349b13548ef7ee400bbfa04196850b3b8cc7b239238c827f9b0a3160cd97969ce21d66752791f5896e0385b0527d4d77e4b9fc70f04d73b2 +Qx = 5cd2e63dcd48fc793c18776d030398dfe3f8b6978eec6d23f49240581fe1e141f667498421f4c40a9430587fa282441a78bb641894cb79d929c299f1aede218a0078c247f740252 +Qy = 0cd2843ca87d98f6336c0adb97bbb9c5293a03e5b86d5534e2849ebbd73dff837ffa488fad7d134908234d0d7fdac8c7fafb4729ecf0516c42995fc9337f60db2f36eeac69a4e42 +k = 1c40a15fca0c959852afcb4ca6cbcc99fb680950c64ba18ae5388bf783052b6ef3730b1fb1487189ad983b6a68bcfbb707466092da52ea8893d8bc4898eb133fd771e78379b9c13 +R = 14485cb1caf1527350587d6695ee3df2b21c13084df0c093ca5109d7c192e7e5df2232ede11dbe5ff2f46b13dc2dedb709a0fc1641c1f32857040147599d8f179fea6b2f2417646 +S = 1a16ebf12c11d2d0a64b7ea124623ffdfe2650fc9603ded571e76dbd7e3b27cd32fcb709e2ba04aee0e8e1b942a4e829cd0c9683aee67eec27d4244a2cefc36f84f7de209e22a62 + +Msg = 30e83ea39a92036e22b7bed7639eab5e5be1d00c20b4a9b9afa9a0d1653369cbef363c119cc6f921c8f84663949c8b8dc9b743ac2b1861a480476e9b64c8f333f34b6fa0e1ddf09d49618ee4f3c1f46751b5595f0aea413d4ca46f3c26b974b112cbe99c813a96a4423764c069454946f213c5f066ec38108f947abeeeb02fb8 +d = 06403de7627de22d1dcf6b8da5af62f9ec59ec065cc1ca1311bb98aa439a6d5985619b17c17a70f59e17cf180ea6828ef57f5f1f8ef05680a9fc12ab7faad5af61e4e11fb45d341 +Qx = 5575c329d73f261ab6897153d7261f87e9730eb5dad49c05d782cb02e483fac4a9ddff31d2fb695a62cdc44edef6398be8f4f84aea1d63d0b3a771fe91889dfac4780063d258325 +Qy = 183e63ee783abbd00547567bb99e9b578ad8ce63d229db41c6877534487568c423d4c389154af9627708d8d8f863597bc668e88f9412b21a6696d07bba06fe7aef93b26950c69ed +k = 0e751a4918643ba3e68bd9406a4386e876d0d66342aefb4ef75bc4dcb8cb2e2d9f8378bd02c388c776535ba85d24b206f5bef4b2f23a1c99fe2f2e8ea201009ca468e5b2e21dcda +R = 0ad6792fdff4c621219549834cf03808645171d944088f5a6d3cf1bd826b5588544a32f231e8428a03ec02d6c1c1243fb6b79b1cc6d732be5be8f2cedf03c1e5588822eec559b7c +S = 178b64bc5f9fcedab17822e831fa52d49ed10afef1c5912893df4bd8dc960b474ed25883ddc343341b696fdebd06e177f234ea45553cc83920a8c799ada2deccf1ddf1dd9aed863 + +Msg = 3ed244dc16a5cb292db4b1433b0ca3226913f07377faa20c6c1402cb4d026de808ca74a6d4ecdd7c4e662105bff6edb9fae0117c50aa053aef677c0750c7a446edbb879110030758912e8fa666489d702d8fceb719963b24a256429bbcc869a1f4ab9de9db89263e3684d4daa1df2ed94bb59dde2abba63793e5f82aa2e4db83 +d = 01fb980aef64254aeb9bb613ff2fc6967503db4bc1f337882f1566cbeb57489cf32e34f310549f41cba1b951f487453c29753a184e33330e90d4b973d2e406c99a239a5c3f96233 +Qx = 36ea761ccc71ba55aeab229aaf874a7c2d1ec15d821401e2988dccf02798c4e7bea80d9fb8d30be213fc80475a17f45d60c53249b66858d29c73e73117162934dd71096d746742e +Qy = 49bc28f4d45d29c3560915698d03271028f56c29f0ead0608cb72dd0b62490f95bbd67145a6c0adff0d6ef396b4deea6a5e2a33f242bf17e907b136c039c127d6012c88b76aab3d +k = 0ed404ee6b59ffc445b16f11b9b1471249443f8a7309ad8a662b7cb44c94866828c906fd64784c699cd29d3d972e5db3d42157452630f14536eca23cbbdd1d37e199e5a586fc352 +R = 1056938496df511d745f2cb88acad279ec2d58bb36498fcd8139d426d596de6d145b765a5b3e8366845fceae91d14075356a32515134e577937ce2af7e732b4e89a9164d083adaa +S = 0d5156c776f2184babd69c1f200b8bd94289d45a2f8b7cd8e8afb1455e8901d8c3ed14b7a23b0976b85a22b86f3ccff4ae91e286f696f39646188b675895684f33f0368098fa7ca + +Msg = 40343935d9423ad30f3fb1832bb08a5d20ddb3a55b59057cd275320db4a5835471c96cfb7d67f41ef860cf5879897b8dcf307bd1a52a6226847b768ea38ff1858f59e64cd635b51e6863773cc6c64b363ec47ca39266422406264668415c189e2f92447ac4c63ee5d74e95d1e6af05016917ad237f482ea0b02aecadd370a8bb +d = 1d96dc09dfaf602789c1dffa5c9ba130832badcf180429660daadf4cf1be5cca92fe9713173861670eebfe3a0ba25bcc76aecac60a756f07b69687e05c7e25984a39556469f62b4 +Qx = 452b1cd70e3c88bec1fd0e4b8f8e9bd5f844ffc12f3d6769eeb1c9ea90e599619908682eb5e43b1d6eea63ba9353fb64b59d6549d19cd95f2f54156c81fba53aa0dc91244e7ab8b +Qy = 20926ca366dc657d133f0ff9149738738ce68f3cc2f61dad590e2502e8fea714b89543f43d97b46b7075c58375efa379cde208ce769a16be9a377a111a8ac51459840a223f34695 +k = 1dfd064dbe64c25a832faea1819cd836d22583fc40b2ecbc19b1f5173c25f33ca8cb7f30bcd619ef73a4c14c46e610c8996059612728f508bf7db7ab3191ad61955e8b1ba409692 +R = 03cbb0ae5f7c0978ad8c10c4ff099767465ed6fefb7358f3eb58a79366707107cc88b305661526f2972bd16923375dd898ae72e81f290b86cf9a4dec086d7ef04d7a7bba5087f8e +S = 09f77a86f0da4e35c395978603cbb9c4dcccf126b7cc924cf62732593bb1aff0dabb6d58321debad4410dbfa1fb8fe249bfc336db7669e4ee13485ccf8dbde01ca4cdb9acfe5e74 + +Msg = 274567f8841183e68c4f6c6b36c5a52fb0e88492e4076b9cd768bf571facf39dad6affeb68941ee326ee461ce1f33c26e4bfb3c9e0cae8241fbcc14cc69c1af68701fd0be3def1e87b7d52b682ebbe1cc225c1bd177b0886e3698a06d0e410a1f92c9bdf7239189f6acde0d0653815a72987671b415d1e8a70e685d6e5b14c33 +d = 09d98b32c8eacd135ffb8e13223690ef02c0c1f29ea8b4da193502c8cb3f39f9eed608c02fd457f2fb685ec4595e8fc8f388d26778d225d2b18c9bc8b199d8b65c0d1a6af33854a +Qx = 775560724ab7d98407e20af12b03634a757037f8b3854957e11900d58460ca20d93ef06436921f8d4481ff9123a9eff3973e17d441511df3cd88d0d6dfc8016d2cbfb8963378463 +Qy = 3082aa4a81d4e6f0ffc94511327202f2baed72c08026e05a288eaaeaa36a1a4961f400b4712ce68778ff38be43adc2222a986ef0fecde62f861575842429816c8fc77797af018c6 +k = 1f4acd3430931ecba5e9d986c6712467526ed94a0bfff36135da3ba7dd9870ceb38fa0b658dd391ce658774c6725360dc20e5ef41daa9cf52fa863840ca91053e7287ed29ac69f5 +R = 0502abe544fc3262663524cf88a5bc256b20829b7bed3e2779f559506adce3c4f3a89e18bfd31819f78ae3809d9d0710c6591b2fc90039328678aed9df2fae38a74b66f69295d82 +S = 0b2f055248d9633cafa4db3b3cef0b76ee02f6bda3d508e19c68870e76a02c69dd1013a03fd741e854cb34f815432bf48138203177141be7209e957f4db1a958fcd45421a213c98 + +[K-571,SHA-256] + +Msg = d9c99b8da92d3c2e40dea3c4025dc37770e867c4d2746c4d726b6de24250591a586c166c88acb8ed340e161d4c81b9d14c919a1b06f1feb22c5ce5fca2693bdaf4994ac72c8983c87f331473fd094eccb3d5f3528e69d487562fb5a65c150a8217192f8aabfa7adcfd0b6916d5000248fbbddf1ca2f38e3d9ed2b388998b7cfc +d = 04d873ac744c4f68bb044783ad69e1a733cb8b8f483f2695bbd90c4211282036ad7914a53b25c3e890c6824643cffbdc4138d7ff457e3fbb99387494eb5cf2bdf1ad243a3a1e644 +Qx = 4644456a4e5c543af7a086640fa9ff6627c2d9f17066d255c3e805db31fb1ba895682e94f6ab96d6ca449b0c3f76bfd6593d182f422689b31d9dc3bc0b70df210a96d19af9ec2ac +Qy = 1d38f8572a06ce22c1586a8329f9421414b334352f1e8b961f7e0732ee01e838eb975bfb2f62132bbfd9acc6ef8899b4fd388c2b59e564fc3670da7a008ca016de678d6dded137c +k = 0b050aa7266201a42dbee063ae2a21398ee1d2a190de9fbbce2468836e416b3ec18d7340c81fd2a5283713f9aba33e8cbb105eaa2abbf0b687fe2713921bcbc02a4b77df21f762f +R = 08351115714bc8f29b84a6e3f0a23bdc219d4271a9ee18bdab54c3acc9cb3468beb1f89b0f981da5aa7d7ec7ad451bc5e91bc98440fe20f5877a4e73614820b9ab6f2bad3e2e609 +S = 0c64baaeed68178f5a1d8f095b0932fb73f9a02462df5e8378746ecf17d05971a0a287d5a8e0317db055b02d4f4b5864597d0f9a9cb1ae68577dcaf7db09c55bf3d3575197295c9 + +Msg = d2b88a01fa17703c99e5b867c645e98feec0d6d1afaa20a97b5fce9c23f0594460142af4e36a5739b8d26d3ba35a0263caa5429b4abba157f359fce701c43372500fd2ae1bc2ed80bfcaf8cab7016ff93d4a27f565b7e67fe7dde22bf02c48be12114fbff2421517c825019c0ccc72d927bef156140d7f0e9b6ee37af78c3efa +d = 18d2eb947297a054f8a789771dd875b12b26ef057fb91235dff3b062916f85aab3365609bd2a38a861439c8514e33f174c198139354e63766942f605107cb1b9709b782622b295a +Qx = 3f6454f1dd032a925c6bc3e1c62892c1dfaa700d3badf83f07c1185c31ea817641865a129572f3351340fec331f5ed466db7bea3ffa9723c951b518ce6f3c9263a7bd6866c8b0b4 +Qy = 188877b68c10cd6ee543cc5638bf0f82db25b9327b2d81269dc61250eecb976d6568a9df29277836b97973e3615e0a4345e610b33909c2340a23c61dcc6e2baf2bc363a33381802 +k = 0ec6af799d92ab52c51cebda61ab642d4876f374edb17253a1de3e880048355e58367096d3bc0402e4b93fa6a6c8d55c529b9fd68a27962c19274393ebe1bd0b1197a28125275bf +R = 095c42b3ef01c0f9ab96693526e903ef3ccf0d843776089d15e77093fa9d010872d65cee1801f821bcce747ddc5875eaa462b00424e6cdf0995b87c6cf33c37d4463848a6ad7fee +S = 0c4f0edd4b2dff4f9fd1fea5addef6d483bb51c27bf5c7aa13f9482243e5ed5571bbe0a658543c69b731de56b6b34de27795095b3676375cb4686b45d48010fe8c941208cffded3 + +Msg = a704a1428cc894f958774368979fe075353b56790555386e3b043dc6a2919b94a11c7f85883f46b4d47b324d349c28c667bf9a000daaca1d7191f2a0fd97a4867aa9f72422134a690625408a9ea4b723704690b69152655f9e9dd5fa3dd94814d97dd4f13e85c3f9bca769491c2461fbd17e28afac00bfa81371d5039013da8c +d = 0594fc0b7a5cc0216d2e78eeeb6394c8225de795f4b73bec48b2f4ede185ba622b59a16dd3eedf8cf2c94f2ccd6dcd205f64c97cf1b7f1e34129e94b5129502909f43940dba0746 +Qx = 271cbd3e0d73ac19b975559450d686ed67eeaab4175435b2801e8989966d7c5ba81ee7d749e43dffa12efba820462bdb274a57d04cd7e92c180cdf555686c78aad58444d5f17129 +Qy = 7c407b46e93d4c2b12c967cd3e41320ea8535a2ff24372a5791fac9e95865e14d545dd3627dcb4aad2350db248ef49469ff4d59a879a84a19d1c0e5d7ad3db432af927c88aa5d48 +k = 1e730d50a9747c7c1ce2918fda7575bb81a74757cf9625d0f0619aab7f1eb6954dbaab749e573290406e599eddd7d3376dcb3fb98c116ed7b65729dd04ece3eab1d7b4bed52326c +R = 00d59ebcfb30d7b27c87d56ec2fc9286b04b39e68dc49b395f374e19647bcc58f2fdce1c0dc815cb2aad55cf863a4786efd6c3a0ce56c1d92aa20a19245e74550c17fdaf7a08340 +S = 134e80d63c9b328e02ebafb75eabf0fafba886f48b25206cca9086e03658ce2047c94a5222a206c6c5a57ddb8f59c5ba1408fc56668066fef4557124c430cbd1267455e0b31a8bb + +Msg = f8a87c4acadee27a908718461e3b45060ae4ebb009b10a15926460bf219cb7e75dc3a993fb9a741b94e2fd71615c50f6df958568f452b2cc284f0516816bc0d2e2d45f663155660a26326f63f4aa42a6e1cc8462a2ec620a365257ec042f55e4047b62af689592a1a072553ff174dd629a4f51837780ca232cf479a68c1ebdda +d = 0f000631106c5851e8ae0802b01e7a8a8540b427a8a3956a1d36f0600be89318032320cc420931d825cc964e823745c60aad3437ebc1c91d32004472e9677605fb708e5a71a0d83 +Qx = 34136cc7b8e2dcade5cbb9b3d0e0857c485ee791f862273749b5d3757d072bbeccdd8eb81c67fa6927c1aa54d823193c370fc596d0d903214d7967b905292f4b96549b3dbc9b47d +Qy = 56f69b42b29ea82b9f2fc377e874b58ee785010bb7f5814907fb5531789606810b71613a36035cd257864e414fe0e6ea353f398745df87ccf25b3a25cce1c78f61f5039d66241e6 +k = 009781f5d960870a289cc20f6b1af56602e5e12d9a7353e81b89a90b0a9675686f15511157d9fb70b82e8b2e25534f8ad22e14ed518e62a88f1ae21c56d4ab7763808851762d3ec +R = 0f3eba5ddbb8c127419fe5e8cc1aae2239bfbcd2ab43a006020b96c9e7db832fb09e0bc887aaf24848491d4de935b78141f426875f7dcf2937748afb303ec5eebd01b6a82a8c4df +S = 17acc35bd81cf24f983072585ee1e096459b408da909fd82b5ea86b77154ecfbffa7fe97271f50b67ca3c29ce704b28186b831300db0aa0dd6147d2d160e4aff14348ba76e6f711 + +Msg = 10b5438294a77c7e517ecfe8f8cd58d75297b14116aa93e574996ec4acb21837e6297cc0e7e7b5861e862062f192f2206a01b1caf42c6d7181d02c7d62b76c2881f8479449b02d32c6f792714d8f70f0c75e81c7d9abb996be87f5ad9a01fe42b75855558d5f00df392b62ae0d258f3f67dbeaf07208952e679a2c573aca941b +d = 1023997206341c6147c536d034a9c38b4012035dc2c9b7ef0bb9cfe65e7d788296f055d508a1fd957b2dc7f9eb10c27790f15f30d81670945e54a508c57b70b46b4a09f4c769289 +Qx = 66bd3f503cf42a20cea4a55cab75940907f38fac7fb024c55245f02d72d80336574a72fb248b1b61e3205b31489ed789ee78d88e487db3f5a1cd48efa1487916b8707e72e4be7e6 +Qy = 10b6e4330af0270abeccf0901dad2f8f64f4993ca93a7c5281dfd71c6ec405f9a9bd78008fd22fef76fb79e20a571df16c4d97244c7356e3ad16cc489d3a9b2e3fdcd5f23b48e26 +k = 09137bd8436dd126924943e8599c87f64564297117766580e6344aa3c02056c811fb996f264ac4f8f0cb33eaed5ef8f120d43a1d2b3e5e34697765ff9db4b4683ce5c1596d74723 +R = 03b684a66e92d352847f63196181160db3de7a304b6e43679340eaa9fc828322b5b9c16a1772c981ff0febb474488daf998d4acd867e78019b61804bb675a98cef24fdad088afcb +S = 02649a94d2bc243e997bdf27be7d6364459c38845c3bc8d1c8b549ad4689c8a4b4fd55193ac769b1da607dc96458e2f6abc602bb4048cf6b0933da6785795d04d10f22e439748a8 + +Msg = d83a52d43216fdb16b1b40469863ca8eff4df9fa358deccb5ffd18b3e22a9d654aedc98f3dbdc4f5b4e56b4299e25d8a5a38d01b34eb93de382df1ae4d1c7f966e84b84c393d167aecc6f1192c4b42cae83748b1ee3d9147ce7de74cebd122695b455e8082f86e3e488fb0f51b3b7edcd579940d1cb9d045296e5e38f201b7ef +d = 11ebf320ecf6a908ea5b868afb8e22246ce84e743e1076d6185ec65dd79043380708bf8da4ba802c3b93b8d15509bb7d7de9dc29f1e9fb0f0f2cb97a26698f955b1f7ef668122be +Qx = 38b2760315b0999f9629922bcdff65cfdee4938d4aab8cc3d200aa9c1db843fcbfeb9da10afbf10280110c49f0c18f15c2aac4f39af35a79557c68eb6cf6afaab973538b98b0a6c +Qy = 7da55796396e919f9b5967608af06bd01e8870354317e76bcb8597a379129e35bcb69bbf6b38911a03c3076f7fbbe9b179e078b442c604519e330282f6f6c21aba515d6d73c0257 +k = 1c219274e54a4c5e1e1aee3bf805a7002bbfe1c030cd4c8a1617dcea2a14b1d537a64cb07c5a1385edd76f3e4ea9a38e38b458d2c7bf8eb56a57fd33166bf59a8af2e9639106929 +R = 08677167a7ea1aec4de76d1c5effdb5a1655965850bd6498aaa4fb3fa50f213fa4d99caf4145b4ba87e34797babfe614dce6ac21d9c13dd0fcd9802b1414aa92dfa18318c7e57eb +S = 048d6161a3739fbb3ee1c223bc82a46255d10a86a605f6c8e1934b13f1a8662f30f8e95f53848119c61f08037ee5a2440c8faa11a6b1800078ed476b2a3f4cfdb25367c8dc2989f + +Msg = eddf5553ed4db6e8ce72cbcb59fb1eb80671c884ebd68e24bd7abe98bb1f40806de646f4d509be50a3fabfa85c5630905ce81abfad8a55f4cd80208afffb9056bc67d9dd7f4660a5f924af2a3745eec2daec39a3fe36131fe9eea444b92d31f6a125f12125159ba095f89968a7028549466f41ad45668a861f671050d2a6f343 +d = 0746d5c824d78f42a1fd63d8fcca61f154ba3e75788b7a0b87f53e5420e23a935b02eaf67bace8dd8a8e7c1caee30154c2428e0a437cf12e235f41c416f92fb54528865fd4766d1 +Qx = 63645fd3810e2458d15b43287f329c354b07324c0707f19847c544f129e4de1799996f805fab7dd356567970e10eb21d875e8ee7bbce56c666511f9b4a4cca986683e937d6f0b3e +Qy = 595485c9a7f2a97fa7f8453df13b75682931fae10f3441042199fedba91a58c105df57b83d2a3911a2d34a2d41e451d0d2549b0a0a65b42aca40aaa618c252baec171da7937d812 +k = 0674788e75eb9d5ceaadad9fae036f129178fde1a584d73cf284acae3b4cbcc208ae7a5d35aa473f4e1201c19ee5bbe685ff9218a8e2188f3428ab45bf09b6b600fcf81fadd8d69 +R = 060d6dc42329687012a93ffc5b846b4dce3df46ad12eb61437832f81f4fcdea7392582fd75e701e106e5b83521759da6a22a21addb63b73783592d3f29347f3d484e05c19db148e +S = 197f3b2d4f3e10425f4cb60dd1ae84fd8c87f62a2cc822342d5f0be4f0841623227c5cb0f8bf83fef483a061e30ecac86cea0210036083a99fa1247b49e19a7f401a815cb68ab3b + +Msg = 3db94335f6d1a125309622c0a9d71bde1da09371f0285a93bd0aac255fa8f10a56074e0f6057f1b1aecf2d86a2319590ead96a2ad1336fe844e09339b456be32374ba2e659fbe9d0f2cdd83444d117d2ce3204ce4b4294dd05405634b84747ffb4227160c4e5c2c9da9815b0c6d20f55705f16cdbaa13d107ae666d707ccbe6c +d = 00670e72ac2de50dd2cdd975a6cdab10ac45e37ef7a28c685d77447051496b5e161f8b1b93f6c7f32fce8ea05e94ed35fd7cb28c44bf51ea29cbaf5aaa31d6abca30a89430323dc +Qx = 54db4acd0815aa7ebec4f7661d80465c64f1fd4147507549352bc07dfcc6041ad309bfb1434b60f73b3d61ebde91f849004d55257e98b6ebbbeeabe960f9429a55a36ff75c1124e +Qy = 5b6f36f76b3b3c780b6a70bb8ea150e9cd6895ff6a6765a3516acbb4f5efa91434def52dd0ab81f618ff28db10fcf39264be8e7ea76e06516335ac5ae33ba5393080f114189110c +k = 0f74a0ec1a7496043d78891e308c82b4660606642ea669e4406683d44b79dd6e6a1b810292bcd6a9f59bcc2e590518bdf2e9224755654026d85cf2a3d9768d909278448f0d63fe3 +R = 047d808febc1065646e6a5608d62d1445d922084487a64e9ced5fafff2977eb3a7e29984230946e3fc77a766820747122fdbbb9100c591ad7c9dd29d07efa2e8a43357e3c47762d +S = 04dd6c8ce75bf2792ef227cd5a3102d30a9a31690ff5c21354f8dac9f826c86ebfaa04653f0ead103b1c8ea59f0a78f5d4e8eab597ec6c028ebcc57f4ce4103ac14579bd6e15166 + +Msg = 69166ba40768d0a3930325405edfd85f3272f7b8e600b0b319f070274c91f9f03d0e6ec4bfc7b4445e91b87cecabfecf5e77c7301ee3c6b0affca2fa02c92216698705eb75443eecc25438db2d2fb4b24f4195d6b9c05c53e0868d3e58477100607ffdc31b18c40b4ad7202bb034e58653daec0f6b33c024d42a3fc84bd8f86b +d = 0369a3bb96f884983c23281bcd04e24a3e5f6359f81e3c8e46f3f6b865eb6bdf98a630e90646275c587e41b546d3ca7688cc207afda15cf9b25cf83bd6ad27908647f3f9de59de7 +Qx = 0eb02f6e741b3f83a9dc50853828b8a6e0861ffc644162515a264730c662ba388ac0d705f8b36f5388894df5c1bbc3582c85de141abb7712caadd2d616da589bdffdd9258808a41 +Qy = 5dbf831f450da6f8e503c19a7788c1317ebe556a458e2bfbf3137f986c9c966a14ca90344be1b76457159c9d70f13af7fe0013cf605010a8a3b84bc0fe187c7d93e4cfb2639de57 +k = 0ce22f7f2f01355280ba2d2cda06a55771e66f598bf79c65171e08a98f1d954e4beb3ec77ab06ee60c5fd156a7098023558e3d630641579cc179739bda6d860f8ba1d5ef717ebb2 +R = 0ae86b40d10ca45c20bdb3db55a6dc12e9b75754679eccb44c40fa57351c23c062282e1da9e1703176e4b8f7f224982f2474494772a20269c43a18a7a03fd12d8ebb975b83ade0f +S = 15ff7b34c3316d9e7ee3d7b48ebf97d98453ca32f3fc67fd08761d93cf34cfa5a2314fd0752d263c3eb7cf842aeac395d41ad3c04c1a9d3808b4fb7489e880d130c35a26b702952 + +Msg = f64cb668b72f1e6dd026a478505c0eb33446ae9a2993bc7648aaed02e172fa9a0e05eeec61e756ba246c1dad7e85d3f01baf734b1905c5bbd1b08d833c2cf1e079eca75b866d705c407eea8618d23ebbaf269c7185984b3bd4117ecfb295ee6b47eecc8d3a78bb96552f6be314656f91caff793838226662c75cd7804b6bef79 +d = 026717b039df834855511815d5665ff9b654facab469390ae257b7f0eb4dfe66ea0dc037242ed0c13bf229b8f7ff26da9b55fe4750d3451c62804aad493c179ae45d08ece5af085 +Qx = 191a6d1ab9cdda2d593d5598a966efff829c04c421804c2297e658adc5c9a6092e146b25c730ff7ee65cb9812ac9ea0c18dc6b60deda948b4b7568e8b8e14411a6969d7764652ae +Qy = 3744af98387421d958b26971d21928b73bbf5b0f0ef183e9f606d0348fa715f153a60b6c7991dcefead2ebb875d0c1dbd3665dc42a241c565ea0fb0e6349b4319c3de633883a516 +k = 0dcd28cdfe9028a4a6df1d41019bc58e4a1540ca94b717d258f2afe8bec560f3028e15ec1e8bfd422415961516659fa2b006256745e85e488c359e8cbc94cd2592bbb892a19c45e +R = 07ba5911415a3d21a3d98b400f61eb63ddda689bfff0c8c3ab83668b1e4bf8a703c853d3585b8bdc29aa2fdc41d5e7534850f4656ec949f0a13fd18295b662c9829723e5a7fe3a1 +S = 1b027e38283d74c962fe0e7b58dfbf5e21ce1d9c91651bc98284008f44fddfe4cec9441994e690d72a8ff3ba2b538718aa678e7de046b653403f3b7c064ee07c9c3c6d23e1b068f + +Msg = 51ee0b98eb6a3e3c1afcb35a33697c048dbf61374629ac5702a57801fafbea4d6fa5a26c9d1b79d1c58257ac0106387fab2d4a1b7f8c0dadcbe7c830613531b3c209bc17f792bdba1c1fae1b7528aac53dc86c2094b40194577325c05d2258303a2d17c854e7449489c43991b6877a50692a6340a528a6b188440ac0cddd4c4b +d = 1d642f2d393ed4abea37173e4a79534af87adf534ead4a0a1c46fb047619221e3577e6b8bcc776114d01159c736ab78af3e53feac339d7afe58be8e7a8ed290f1dad960f1b5de94 +Qx = 23d1ea50229b70b46578df6904fd528e9930985426eb2f1ce10eecbc0c1658395948380c4047d67bc4072be2a2624d62a301da41a5265f040642d1937fbbb7cbd205e1db85b8685 +Qy = 625c82ccff6047b1ef4b08f1913f7366c4f6c0312c21e5ab01b598d1a9618cf5c22cddc64a4732b477dd5c06e332b846c8015a2e5a195326bca46c29cedcc2f24d37ebdb7c2eaee +k = 0c9066831d61a4192ad9de23efcaf578a5d5774960a2b3e3e292e0decaef62d1701b86ec6183d8e17a699d418ef9d084b982c97a55bd76c8b038ac5c639451096ca4d331f070ad8 +R = 005778acb38b1961195d38463abd9c19d9e07dcd997f19676633fa3c44caa44ad1a9bd63435f3138ad8f22a731e749a81161c5448eb462fcbcd69ec2255cc2923ac697ed319316c +S = 1a1aa90113952608dd17dbf391ed56231ecfa7d649f3274774ed2b6034a2207c05c6d8b6cec480ae27b58495a50b1e5b74a17ce6cf2e43aa273c2b813c0e6c79976882b7e4b1c93 + +Msg = feee50aeacaccb6b1c3d95c6524044edb78322ee836d8159c4a4c2cc6982480567c4c6cc4806a564876622266e1ebd45f2f4be851b79da025bd57d0e6acce1ec1c8c255eb89713a1e4897d4ee0f7a248b9d4bd3ad5dc0e57f60ebfb65691e164bc908956a019083e923cfd33dcf37c735af3462768a1e14a8051d7aee74d5228 +d = 08cb70be29e83f697a3e2f67d86f1c1ec9a163b5335cb4a06004b6634948bf60b8ad9df9b27d2bedc4975265ce44a7884e57082d521320ca4372d38fc77b18d3fa05ad8aa5c43d6 +Qx = 4c042bde9e90b38b48e60551d832a7c80377a81e8c5b010d0e491cf765c432b5edb0771aaa5f672edf3ba108dc71459d245ad60f3884b8cf33f8cf797f36b20e4be39c8389e66b4 +Qy = 75f2454c41c0323ee1a640755077d36a65be7c2a014db36719ec217e21a9c004bae5befb499bf6be67e82d3da70475abf9dfb751c84c409fe838cf1c6ae109d27f24d75c02cc5b3 +k = 186f16dfdd7a71f20a5e634ffc465356914bb52286d3d5ac00f3ebc02497112fcd592e1ecb2ebbc819e07ea092e465e66f3e58da7a2ddd41c8787f57c135ba4c168539b4743c3a5 +R = 1c2140d294fafe3d9effb33ce73bb7e5485c93c7aa9d33b7535c7053831a1dbe79075713794c87e52bc887ded969d2dfa6a1e2630cff96760310e04cd2a75be6fa020a12fc84d3b +S = 110aa165707b7de1b3a8e05e4502701abb5ade0a27deb04fd93c6eb24ed2b67ade6c49d78e874d25247e948f704d3c5b925f84c5b07c9b289c4f8507e75d0f8927c6dad6dbce885 + +Msg = b115f7370d6a93a90fd9dfdfb292956be34b61992ce1fa5627c5e928d74bcdeea66d4040c473306a0070fa8363c4303bea32f73ea3639b5c6676fa5a1d68a2cc1f91f00580d7453a23ae70af4cb1f1657aa82c5b305374effe5d67d559e46a6cee6360503d21070506f1af30bb000d2f2f85caa6465810f89968f33abae81cb3 +d = 1eef463771f9c6285f3257691dea0844687606d4dd00b6020517f190891cc1be97cfad21d147ed8881b5a6e19b22ceeae30e1132476325f2de0e9af2e14c80b8c780a9d2d6c96de +Qx = 24de3ebe03d2d91b88794a77635aae6743e597410ae10c356a51e3af88fa7f9c4d648c7d1fdb887c8313914ed554eede282b24a2e66aeafcc0cc96907bb2f3877eeb97df491bef3 +Qy = 1ce1f9fd4d7d3870997f34f54f2ba8f08ac94ea94f74a766f2dbc02e4d5149802e3135a2d762e3b8abb01461968f1e88cfc8c7fda49c099e392e80d57f0c14de9c4fa1eea25732b +k = 026b545702baa340fb6d1bc2bb96f7fb1a77a2428cc122ea380a258c747d4e0625bbf4e3dbc2ca2f15bcfea92f2417cd5d22f2bb5f38a9ba313b3bded506d3e570dcbcb86c2debd +R = 091c162d040a12f08a416296a43501d92e2ecd6be302b5e1754b9ec119fb8a572626c509855c7c868a07b263f66070ac986f95e4c83150a5a492d5ea8a7f8ebf556c17ad2bcc996 +S = 00c217fee7bb202d6399f6b1ae4e5811d9361573ed4fe1b3fe5d474cf06d0236d59dd3580145dc0bc7632c721b6463c69490a67d1be1fae99e34318af6df939f9f7f36a9bb8d5e9 + +Msg = 726782eb0d9720daa64e4a77b5d8dd67a1a193f15eb6b5162e3d89c925ba63b7c7e1c4bfc8d6f11915b0e14d16ab53ab015317bd5958b0beb6074199e05181915496575768d026c23e92e06016598de008c3718aaabcda8b68bebca0a73ecfc7327e8d3646106b7d114dabc46cfe56265c326ee56fd2ca87abb5bed8f997c735 +d = 13bd452b0880b101df1aa65724fb60d5d85b37ed5419027481661a3617e0fb37bda1151b9b5b41f908ba832011f7850b75a07b678e5b8cb35c5fc8b94a625e4398cd5ada2b04cc9 +Qx = 31d88b62d2edd5f6ed29258c143bbcb3d29413afd8f86873698a9efb8d2021186415d301599232989a0df5ea91ca222c5781314f200c708de30751feadc277d50e64842dd355ba5 +Qy = 1c76f19ceb1be48f5540265b8b018da62fc225cc0d2d1675bf7df71456cc8e35b002a220e2e80691600a2c1ae31e980d0cd22b4741c25bfbd413f10b375a4d8adf70a65c48ff006 +k = 1b9235221a6df49e39b4cde6650e994f624fcb5084daaa62aef54bc154949f4da9074636c44f50ea40da1a3f01bf67e9b62a725ac0537a4e37ba33fdea8ba8b2286bf82901a933b +R = 01dffcb5b5eb23694da4978419110ed2bc7961c571a2e68daebe21e598c8b483b34f3178978708db6d78455cc1fb4f73c5ab7607cbb4f05d4d008c7bbeac88562fdaf7a370ba394 +S = 057018fc97d7b16d69af2b7dd4a859f09dc178a6025e1bd6839ec7c75c0383c59eee7079fe61aa6bfb3e2c780d4ac0ee074e6b13223c239aa60ea1187ca4937864f89e2c65056b9 + +Msg = 1c2418243fcd89c6382b7c3b2a8c341f26d08174a9e9296c4a5c98c5793a0fa48dce51e30811a96b515aa22bf9af89a43de06d696be1e531c5dece1f69fa6ecb7f20be063c602a16454ddafb14385ae3f8246c3f989d0566e06e7ed1864502896ea19df8393259c4dab3b3380a4a80b4103cbef4f38cb69198b7cf74ce94883b +d = 1288141ec2244e4bb3f62daf4ee588aed09ce22be55e3d42e9085a947c1f8cd16533635d170bd64ae0b417346fa4670c25d41387acb2a8e14407a1931d9f7c5358a14eca40974bb +Qx = 7ccb7b12a7d6997ed2a11eead3278a3f45ea284dfda8e17f6d926ddd6881a44d02a0f7504dadbbcb0cbd6b85c113aa0d3b4efef1ca151cc38cab1aa8360a6d22e3d6fbc0ed980d3 +Qy = 31b85dc2d2096bbba6c465629ea09ae3421cacc5581770ce3479070f23b3aa938333c7c691d9cb93a4533b2ce389ae34dbebe8f333cef530abe17cd21448f701608febd42d9bdc0 +k = 1e411ab53c48cfc1ef9eda97002dc9181a78352de13fbee3bed86cb00c10e7406033fa0ea97b50764b0eb2dc6eb8ea83e47bb3150ecb9437179c124f15fac6ac19b0c8bc324f171 +R = 14420d78f2f9f1010018848b0442ff6e6203c1dc06a4d523802190f462ed3c11c7aa7678bd03ba27df01cacf4121309551877d3a2bbcfee116c59926daafce55a4e0a7d69c5c938 +S = 16de0b369c28ffa0bd6ed8802a503929cebb5c0a4bf0c0e99b14659b48aabfd08bcb64bc2e39855d7d514d7525b3c4dfd2244f37019b5f86254cdda599bb144c8fdbaad5525cfad + +[K-571,SHA-384] + +Msg = 1de4b642ec7220c64b91561caed7832044d6e811ac909f3b199cceb0d8a7db91bcdc801412044f5c34b355b95a2c6170fe497f6d5259bc20715a38cb0341c88e93029137e94d895bab464bca6568b852340a5c5d6a225475f6eefe2fc71ffa42f857d9bab768ccaf4793c80c4751a5583269ddcfccf8283c46a1b34d84463e61 +d = 01fe06b94a27d551d409b0eb9db0b163fadcf0486e2a6074bafe167f9a3b4ce8ac11f42cf72f9a1833a126b9473163d29bca2ad139dd1a5e7fedf54798bf56507326fae73a3e9a2 +Qx = 38d4dce42bf8fffc39a5b6583a1a1864de288ef8479449d599115bfa35b37954ab288ffbe81e69d58693e2c8c81639df12e4b36f62b2ab042e92a0715b518c63d0ec630051d4be1 +Qy = 59c72c0bfb0ea1ac5e2fdd4fc380d08037a3d0eeed4990ff02e6cf5a16817ea598085e28f8269da86c547e7b34e16a06724ee73776529c5b5dea4ce3321fb168827ca1cbdf8856d +k = 0a3b18c8c9f17badd123c674869ff428d533d2ecb8c74f9784220be7a90dda591003df5259c5dfb612ac7398aa04cc9e82863eb0cbe66b6e7f45dd15dad252f74a538d5f4354c96 +R = 09c368c80f697c1718c55482b2c6c5c0edd7257a3a53f7193515629aa40a9716cc889d41c120516b54f3a106a171082364886e5d3a1e9482a103f072988f61de68f034d658bd976 +S = 0e782ef47b250f40c56e3ac4de112347174bd59fd4cc991a2b538ca90cdb222d048fec62e2773492a1d327152d1d6591740706fe2f8e1d65de888d47fdf173b2645813ac0fc3078 + +Msg = 70279be7d7ac72a32606642ecd81b5d4d0f95fbc3c0b07d85c16adf2788601e44dedb8e55e0f9e0b4ca3ca35f5be7511b0e69224a05204af67aae11ce154af6d594d47f6e3142ad183969544aa95cae1edf42bc699137f60178c12b10a67698e37ab9f3edbfb3acdf1b3513d62fe3db33b16cbb4e1f9dfe732c107f9d0c953f6 +d = 09cdc7e4945c485a41728f83d5188f539e372ff4fe38fffcaacbcb4522428e4f93ef4972556f4398fe17bdd885768f0fb5590df495badc794d4d274e22f2f4a2535555922fa43f9 +Qx = 3c6f046aa3007ba7f883bc1e0bb43a9a0a1daecdea3e2b6c10b2481d11a834af241d60cad7cab27b677c9ac11f2e5b5226c0a3de13029229af00e5a092340af9b230e0ed992acf4 +Qy = 6326ffcd62e1a68b63ac680a743130b1440bbcd3966207dbc8a8f4336eb6a7986aa53cfa4fd7bf363b30706b4fae01568020b41caa70ee3d51db982de66b0ee39777da3fecf5b01 +k = 0c717523a308418eeb2aeb816346b74149d56b9620774cab582f01681bec73adb779bcc7462fff35685a4e1e114c8fba474c68fe2650344fc9cf610908966a9dd1779f76bce0cdd +R = 0061067f377bff6a9be30c9c79d8abb7f54cc8f09eaacdc190beb27b1e6d297cd32b043b31feb49958745b78e42ac074b8722e1a7653bf03611d87c44fd3891ae410b23a2140b83 +S = 00edbe756a5dc78c8a29baac9e2059154294e3adac9a5adeb7b27ac6e4d4086821cbd55467266946ed8f6f03abff35b59434afe84067c1daa1e0bb62ee7c56b85e7f831eea99047 + +Msg = 4d7e0ad520445b6a5cb46b7c77fbd367614044ae6004494c2b3a89089287e2836c73b799cd8c90139eac427ebe335804c3788f3728ffb8edd7f49a4bcc76a9e24ce3c2299cea88c04645b82033115380f81b0c1d823e470631008d350cf0c0dba1915519985b8a389ccd8c809dbd5bb5051a79e631916e0d052d9b6cca18e0ef +d = 02bc753d007c4491cfb8ce0a6c96455acd16d37e02c982db216b8cc1afd6d10c6be4e15a3988b8b8b86b2b5b59a5c1939889024849317f27ee08a06bd8e7524d4ad83a1de208564 +Qx = 0ea922b09e902ce3847f14d3b3afc5562dddf15811cb2e7b9e06e1b919d795f8451a3dffcb92b418d30bbbd1a7ccf827ea0f1f6554387fa2fc51755799040133d7a655c7800b713 +Qy = 1f12439a0c0df9f6ef08e89eb1a62e2cedafc0460030810b2483ad9427c48dc061e4640ebbd9b4a398841c863a6e3d510e5c66934d66b317b1640bd05018a35677c6ac2c7839706 +k = 0385f9caee4731627276875dd8d725fe79626c18841562e8a13fa7531c7be9adca565c22459d519d643ea22478d7c51b4c286920b050bfa54ab7d42966e389c485b52cdb4fa1a0e +R = 02ac84262fd121bbec43e81021c0f0610fd2fc0b26d66581ddaa78714ce58be46965283851241d792ad6bc79af39f09d2d4bda83996ab41f1fd206b8293cdb6c4eb9d96f39efa25 +S = 1d9c9bc330adeee8f58ebfe8c1ba401d4433efa04a44185b0e8e20b634691bfe058770d074289e636af3e96c118edf31d72b5766c30f6fe84ade42f284fc7f2707bf27b3a309638 + +Msg = d49903f38b5c9b17542310425e59377f61f5b4f4740cd97371ee2116083f7758e69e7e2c1b0950ec6b76f96e3c91c721d6f2843afde8c7505a559c8a64bca2e665aa1131b75bdf86fb5b90581c7d3b61c2cff88f3fccf356ddf5ed282e27727be061b6925c51ea7f1a495f471dc8a5ca1a88bbe29e92338d3c9361460398965a +d = 02082c6e61d0d72f040905d8c1c20d47b029f41ec68d6cbf43ce97c3b2a0a770557a33cb803c432cfbd3958fda30ec1bba77a6613c318597a85ad02b26c44bb77ca96d9cc1194ea +Qx = 59ff339d505b307e05adb45aa314d47f2450e1b1aad840b5550a67c11940d0e78654755a8e28fb651e12e48c66cc1ce0338114bc1ffb00965b342ef3a3caf495f1d73a69c3f3d17 +Qy = 724e9474e6de57b9f8cbf6f6bb4f73f5769e6cb0e006a34c2510b379995c9e054cc4981c709ca85a3aebdf29090ca07dce5bd3c313c6153b551012d72a8f84600350e8754bc4abd +k = 18d65ca6c2ef1fb32dddfb9ad4603e03c7cb1791a9ec7b41266cb68b6048aa111f5971f3cbef3f0dbb9ce409b59c31cc59bd6f100ee5247f8c36f26ca77cb252331fc3be7346b5b +R = 12853f9d695b8ac4431c1ccc8498f3fc4916eb6a5e66b3795a3693f3f5a29ad13e58dcdaca5774f1f295e2d2d3c63c69abbcd9f388a3383371028fdcc8bd77f7554d6aa3f0431e8 +S = 0d1c324afdf01ea19e9453d2b7397584d773716d6a08b6e38f9a9fb104122ecfcc9de7bf1e5a6cfd52a08b7cecb002ebc21798d474f035fe7d4554bf632f237bce14aad88b47d4d + +Msg = 0e3f4afc3e7b25c1bf2d98098a5a87db1224d9bb45adc6e434732b8722a708ab80a1f3f6ef3c5aa70d2e1dad3e4416b12cc59171f05736c4b58bd084602c344f2f0bf3cfdcfe04c64e87597a99de23ded64b33607f7c273ec321f6462518715b11e91361e89ce5415bfc2ef520bfec378244a3bd2a4b9b6b3d68815f2f75baf6 +d = 0e298c93351323e2c5304015a4878997ae4e79d1c32f1dc64262e534d4f2c4b3e222356ffce746763373fdfb936fd330d3214a18c07f1205b20c9a941331cd676040ba1fe3dbce7 +Qx = 6ee4952a83477d89ea05ae63d5169cb0f7c7ff22f15728c6d69dfb30d1f28158e2667f9342cfd9b32f2fd537dad47c190d82f72c03043f2a9c5d97cd09d07ed4c35b96104042554 +Qy = 26d5935dcebc0ed5a07b7ffa50de3c8aac309dddb61b8c560230379696d81d72bda3c819c46387e7f026b384bb0f7b2ca90c402bb67b5e37d343cc21a8d1a0f822dbb2766030d73 +k = 12d23969d230e0e2712f96b11e196202dd3e6ac755c824f92b9c765e3fc808d4e7236c8a3c06ca2c8272c7ac953fdb936db30d892246cbdcb7f98c43177e1c30afcc162af511364 +R = 022f6dff5bc1eac1ef568588e2e512103cf56ebcb610e124a125fb004064a28291c19e83ea08171bd1b14ac729392c7c46354e795d63e3bb087fd100642465efd817b79924408a1 +S = 1785e1fd773446e3b90b8704cc2723b8da2f99d1d699e817c3c4622015d178b0cebc19b3a6dd972f75eb3828a386973c0a5e67ca192d69f1a84c825d1253f1062a990c3f1a947c7 + +Msg = 8fe32671f6927272fd3cd8dd4e34d44d27fac8c88b41bf9a48039e914990bf06d1633b38b9200ce1c2a275b9c55498e5da2d0707322c3ea0a0fd7aff598fb801628264e13047c8008153e8595a0dc95d54e70b882ac2ac9314d2b78e7b93922da818d7075215e354708994af66958954c92c074d132dbb2488e5a531c755a8e2 +d = 104f4ad56594c5cec2a988c5596d73adaa5a81802b40110dbae698ddb1f0b271fd1479c38abcdb9b234e69cd0da8a0328d2135c287d5b130a09fa0b899058e7800eb2dfcee95c1a +Qx = 4e8151aaf2aa6a6159622baad134be41c404982bb0101e820eac8f0a52166546c53927d9b419604e9b025757eaffac526d4fbebde5fba0841c6812dff2e9bab5054d4074a125ffa +Qy = 4413639ad72d6eba870e1760c71966544f3f881f88880fdef1edeff47cf6c235e8dfef1eb1d8df51f9c48b985912f1f70b61fd3d4b859e052887560872fe6e95db0f435778d5c4c +k = 0cccd1bf3424d8bb0513fda3db93e81bd34175d84aefafd26b37eda9e767618247bdc94ed2b1882bcae4c83eafc30a7a4a80806fda10a5e70b8827287eed8eac2721939a63c2175 +R = 05b1460e856548287683dfbb93efc869e80333a9ddcf292e2fa3b3c8d430563a01340685c6db1059aaa8b298c8db9e8281f36e3a9664faa17f413cb439ef24cbdc1a4d58872ff6b +S = 0c6faac191c95738f7c6ad0eceb035e5d22ae85e4bd0e27f2e65ab293717c0491be3d1b5ace80f4cb4bac7e33258706010c2aa48d84c9e39c95e30805fa7669c42bad84386f7754 + +Msg = a8fa01136a0a78313a5d160c32fe5d1805eeb3730c18ca0c47818e82c48eb4c9e5b2dfe3ee5facef9ec59b68f4e6f3213f77fba9f8ba06dcde546ae348d343233883894f4423331b536f62373a495852977a51cb192cfbec04b5582b4ece69f345979e234de32da7a120138a057a7119735c4cb19099bf48bb202e7ffac04def +d = 0c4989bf33b3136bcb4ba67906eaff2bcbc6567635aa4b057acb7353ee87ba3cb4cb9838f8f679729d5c6ed98e6c4199cf58605f009c6873a1b8321f83cd3c0973b7a3cfd9dbaa5 +Qx = 3871c7781f2b4f653f0d49a224576bd1e5363d5171bd21da89f590f49fc212d8a57ac8a140d923c2949ca287bea803afd763f15f909c099a07297e8ba1b37c70e1e8f0fd1fe9d1c +Qy = 5806bd5b4858ba0814da2167d232d55bb5c41ea0a36fb28a0a151c1b79b22cb16613ccd9dbf92174e42578ef88f4da6eb44918acf427fb7e4022da3376243e75410ba6ae012ddfe +k = 0a9eb767077886c48bc54503a0d2d62f0192d3581bd9ec253107092c22f68a15293d7c3e7aff56282f0cd35e86a2b3c55c9eec079201d99b5f49946780ce6aa18b225c2dfd72cf8 +R = 03eec6ffb390ecb2af4f5ca17fa8a7fd6938667b319f0f61e5c7523efb77afccddddb5114ca8c461b1c28dfe7eb85ab156e24e891cc6f9511d703e8b3c8443d04fd8de80f5d65f9 +S = 10cf3156cf71dafea6a0d6abbd503d72b13e6a684076ac900f390059cf3fc325966b3548b58e14a82bf291d9689783b899db7d4baba524b0b63d31f9900a84fbabc2ccad95742f3 + +Msg = ba2d83b21c783d6ef2f3b7b10e910a418a9b9f49ae0fd37990335b3a3d15627846c9a12a1f31a3d0e062ad1bec5650606ed4dd06c30e50c1e8761a29f4ea1a20f74635d5dac22e5b787ac10f4ee82b338a641484f91771c128c84d31cdab0a6b9616078c898665655ee9dd4ae73d33b94bf091b064928b959623aa71ff73b4db +d = 1a96f2ad56e31397e236cafc108087479c9823589a5fbc3dc7488d0e5d1199cf245d7f21f524cc0e8b47feca14c93fb760e631434a91188b32965053942f3bd39b3714f9d6f1a11 +Qx = 0195bfb66e20ae295cd22d59b27b3880a890fc44ef5c720b568bf7f72266293841dcf0572063a96c62736d9d4a9cce31b10c03016305a409858a79070477d3e989481ec555c8146 +Qy = 491122a199176e2492e07fae4ddbf02d2a40a21bbd99b8f742b546db2018cac27fb4b1c03cff55f61b7caf13b0f3b097ffc8e1549eacab89225e0cf1e96b268eab7f9a1a69258f1 +k = 097e28225aee5bc9a970a150502dd14bee900d3b040b0da9cb52f5824e66af46a991bbf6423fe1e089cba47593af555b07b45e47b0f4141b0412ddf6e91153213c5b8645ae7bab2 +R = 1439928b55917e93d59341532cd1f9d09de1f6e0d9a04514bd4b692603f2cfb75a579301b39b8cd92fbfc8832839691c23e0ad3efd3b4c7c3e9a366c1554c6dd13c50dd087b3055 +S = 1fb432e72be6fc524a7106b21d03fa71852c18c67edcb8b265db3b144214e7e6d10caad91f81616e03ae7913fea1e8d11e90d54b17705e8d04c8c20f0f4f46f117cc423ca178ff5 + +Msg = ea2d5f4e9797bfc2f33f0fccaf530db2bdf8abcec00f09a0338eefdba318221ec0e050cad1a85c3f76b784c6e8c18da2b062f333eeff18b7b781e67d6d0a4368b8231a892e0f4103012348e5df53ac745e4d34e2cd1ee9369f97d4801ff485fc144b2007008036bbc07cb1c302a00054b54f3713919191e1d5052978c9c2895e +d = 0c08ed8e0e0f8b0d0714b46a2164b933f8147692f18da97e5a108c44d5a5cf221cb50536e41832b83bff4026c6df156386235cf5e3e9a67b7cf9b2fa7707c5e0ff33a91601b8e34 +Qx = 2d516bdd1914c83aec1cb242710ed79efa61cbb31dcf8d238d8f5e089158b2ee2bab407e01996a1621b1a869a98227c12296cc2a71c1ef2d0f26bd6614f2ac77008048abeedafcf +Qy = 151474bef5965c455eb95ca2ffe1d589107dc251d22635f4a9fc7270358b64e4d2b81666b60c4a5c49902b0fa9963197b22f90a09cab97007842816f64fc49e351710db84980032 +k = 01125bde6086753b3bcf29b7d5a4fb0a8abffa6503b4f0b39960eba226062bdade57e4d73e8c1621792626203e83fd5c231a53b0ce10890881460802788d481f233466060f73359 +R = 199a1e40229786b966592ae6e275874ace23d5605d0c3371a4f9eca7ce4858927958bc1c2780e9f2f79767c1c72117c79c408f972006841cb621837ac002cc6510e0432d99a1f64 +S = 17f4e5e23e494ef149e4abce2d8a1ab10e3e6c2cc93998fc63baed6565ed350b220b282855e2824f398ae76b8679201b43450f62237f6fec643ea659e6c86abc24a63d82d9bf219 + +Msg = b2293b0a09f41decd9d8e637b1b08c2efe612f33c9c0beebb6e05033c6103b958f8aacd125d7c810b4c287349f5f922d2c6ed554be597fb8b3ba0e5a8c385ed8ae70d5ae19685298f20e8d844fb5ad98db12ba7e5f45baed9045c3e86b3cac9bd55b614b82fd075954fc59bfc6124cbd68edae988596575f379d8921b594c75d +d = 144090a0ee38cfa21fabcc24d35139a99656911ad4f6dbffb77dbe74e7993edfa9fd63d2c4f6bbdbc8ec21ba13c9f4a3576b5d6e3abeab5af5ac81b1f2bb6d4c42dde645d854d9c +Qx = 208729b3c7abadfc221cfad8be642588d5d1c20989fea731cfccef25886905e4b1e61cf9548d89c24f5706f5243dc8aa7d5b2675c2c6d2755ce6a12e5b12c28a2cd9c597b7dacb3 +Qy = 3db73ee445ffc0f6c77467f3add3b1e97061117e221687f5589a030f5248bb959bc2ed98c9fb66da8679dea3949b77652dcf83ab9c50a00f6a9c22bd8d16e093b2deca4b0c7596a +k = 0adcadb26626eb9f8db9ae98c6808840b65d6f886a3f0c45f0b993a8bc62bb5c08dcd87940dfef4f220f5e50234fba3a55e7127fcbb967ff78ce4fd6938a9bb653747116541cb85 +R = 18f7fb6ee028c3dd754d6e7b687560fa269b5a5fabb1d98529e0a27dc66bdb1ed79b7b5c64fb71e767d9497b9255f26b8150b9903caedb25f51594f5b7ec2870515f701bd68faf5 +S = 09ca9519388402d5d96dd9ef2d4ebfd0ebcfa58bf8c1970d04851b2409671c9d5e4aa833555df374469a4d277aab93b8df8d553399908c930f81c2d9769f1b30a13f61c02b16852 + +Msg = acce54270252e7d9e983c08c993cd6b7e3caf482a9149036afe4665bd3d0662a6818047187872862d5718b8ac063477f693caf1a9baa8bdf2f36d411a796f2b46ab56f66bc94924229f8264016d6769c85d9bbb7d6bb042fefdb8fde1be026b86af2017aacfe38c97309b4689b23fff94f1de880064f1d3ad9d74dc804c41f41 +d = 1df26b672b2e3617b6b6c631d3c6be0cb49c0a690de49643e0f416215bcdaefc03fa9c708471f1d87476d58c8f147517ec8a14aa945ef001fa01984d5c3d81f7083ea500558fef4 +Qx = 767ca8fe8f3a7addf01b230b99499b33c83db95db05e1956fb1891fed60406865291d79b0daca0c307a3ec8b1bf2ac2cbab728c6ec65c013e01775ee21a29305e9403f72883a138 +Qy = 0acfb786b09e5185dbd8abf831d12967107dc57a040d7c800d904b530eed1e19a8e52e653fe8bb824cc424d7254532d0fee62e8ee7ce8e871cbf6e4ca3bc040444585b9a4e397cc +k = 13e5e47048122c8301258c638bc0f00f8f9646cba927335535f68f4f4f51f23ac5398ecc21eb0bfe8fa6a2084e11fe67587bfa791cfbe2527797a4d98046f9df37662cb7e86a5a7 +R = 164b3500ad14063101b6c5ebabba53dc5acb4d6771d3b05a505e6a67727ca8ff73d996e1329c0f6d8f738237ee0f0be415003e2db515ef93931e09bdd853b9497826929eac9e9a8 +S = 06b65511990c061a6d2a97fe2a5053c775ce2bc5471865abb7261d0436a04b79baf41a0a852a57600cd4c6a114b3a8466f721a684aac2592640bc149980545daa271fa9b146f2fd + +Msg = e25274ded4840df0d71d3369007118f002b83e2d375c78f7e29ade067db15cce21842611f3f015db2efec57da77cb9d16eb1e00a8c1444d48dfda569e29fca1ebf40a22fc646a9fd44460f0e473bde487634bfbdac2c312f66a1c2982c6fe76c54ac72b6c8cc9345e47cb319a974b3cc4bb40634df74b4ad7e18adfa9a71ddd5 +d = 189918b832e9fa30161fdd927bfc267f6405335df3d66d225e17173af52a671138883bcb94c4403ca3e001fcf09ef4c6488934d6775af2b1da30a8f331579af2d0fbb530298d8f9 +Qx = 53e6b43c0551f32b7b34467d188985600c5c0ed12448f2e763609f40039f92002bc8e70d8dd3e337c3507fc996a1557d5f2fb3132507e49ce653482cdc86f6ca5903b77fa1619d9 +Qy = 4a9ac78a2c23be0841b96cdb1d55862e4854b530f1fa3f469ba9f7185e3f91c28d03c27d9666345bdbc7a44764595b303f49cc43bc2d0e944862913d280273cfd00e15b6b55f85b +k = 0b47a185140b583c330c64a10d50748e019134bacf153cb4a23753f140a4d607d5771a8f0f535f9c35baae5ab6c37a55f38acd12f15be18d5bd9662383b30e4d0ce487e8cb553e9 +R = 1a2ae62cc9560590177aa544945377ff6ab1b34e7e32a25140f99996c130e170015636647756a5e8522c936eb1389c206ac74c012941269165f3772373047521f69510c7f3e6acf +S = 1d86f4a6ab2bba7f6305c2df754652bad40d7c273ba2aadfbbe65c07ede4ac0e65fc0a37a0139a6ecab296f58c6c2532701bb008bd9e1ecac2771d9384aca094537fcab47f3ef06 + +Msg = d8a4aed87c316012482819b03a1d91691f2ad11a2f46082497ea8f64880d686891f7da550b2ac17199c657d4eb9d04d5cb8eaa180f743b87d23b1c86103f9e9bb60f4e19f0ff9d160f180aed7735130c03adb62502e69be5c624ed7bda2301f30580ae0921b02e103a638f5623c02c186e3bfe6ff134c762a2bcac1f879a9353 +d = 0bdcc175eca3a399b944eb0334ff33c4fd130999c8ac0e7b52ac5b774fbad53ccc3a31024f5262b2eecfeb2104b14bb244307effe3dbe8ed25686dbf46a42c4b6f8e34010ad826a +Qx = 7ab1a9279a8408828c2bd21ae6c643ad82633d636d36fd91498cfee49c8a635313f56993d02cc46da3f5b78fd243516cd23c14a4c8d79cf27dfcb05f52f0cee59cad5646a9389b8 +Qy = 799beb1ada93a48819ab70b74c36d2dcc3c5cca1f7a57ec58e643924c3ceb7a90c9cd9bf7ec762a2c428d16ef431a45cd5d069cd828601f903cb0a28182af2392b5ad12ac3a24c6 +k = 04ad8d2759df82dd70ebe9f3402d3d533a1b4635dfd0024deeee52b32373550f550b9fd4126aaa6c3a9b1f352c40c86e13f78e259abb17f85f0041e0cca9e2ae59f4ee3ba2fbc83 +R = 1cf9ce41dd5dbc3bee9f46f82e4bef10cefe79a87e8e00d002097045b9acd46364560e0fd27b0be6655e73b5cff272c8764b4c80ce0e1c91a94b8d05209a28b553f589ee2fa1b11 +S = 149fe587b144c37df2c48c2b7749c509421cfebab734003e51383cfb773c3ef5a24fbac0255cb807f5b95607121c5848d3f9656227b61d5a14042351de084d9b88745be242b6158 + +Msg = acbaa5ffc4eee0850075c0e502a70cc7a897a919f5e7bca4e798385601a26f411fdae5466ba9f6b6d8d7f819a749b799fbf4a3bda9105063e74914e8583ed8b31ea4d22164bee6f14bf53afca269b901c80cb3265be32ffd4ca4bc4ddb83e11eff82ead6d75dc4aec8e5c67f35d58a8a156cd1c0351abdccc0c5396c8fbe6920 +d = 007ab5a55a1d8ecb7f5dca2afdf9ef465569a4b0374716f604ad42a6e0271e934b09655e8e2529784b69b2894bb399b02aeeae30e9e7ae70a2a8e56b9e775bd978a04c728e3951e +Qx = 2df88e368c8162c1dcea5ceee3a4c52cfc8d6121eb81c31236ba26dfd1874c61586d2daacd96cb5ebc7053be57641bf53bf2651cfacf370cf470db86e1470bf285c7166c197e094 +Qy = 30067763f9fa6a9082ea16dcbf53c2b6f11c9ba1817198e5a4e189dd98141ab682ba4de0b3f873ae54efc080a2a03f755efeba3c0ade8ea67228b1a5a11d730302f1eb7c6bc3737 +k = 0d3dd75ec61e0f87737812fe1ac86ba336b1512bb9f7ceac2c7d1a5b4d5dbafca57a5209028cef9468ebdacb2a35988531baa094a1c901d9650f2c5d8e03a1621fb33ea85e2b506 +R = 184a98dec91b9afe52d4dd6b2d9f2d7e3c42e8e614332080aafd2621136ac7965beb4e8f97b222c1b2e5448b79534db4e710331a2f877f8fc2a9259129f0b24d24289495da22542 +S = 0fa384a04c4b0b0745abea373aabc09404a6037f302e234e7a2840ff39c2b86ae37c814e8bf3f3f7cf743748f2b88d02d66a3adef2028de94013c07075fb73f00555aa900337149 + +Msg = 9a57b63a4f418404e8f5dcf3052b9bc04a4f6d2c33bde8651506d9cbc5542ffb9023292dea463111fb78913ccdcd182faabbff9164219b8900c7f9fb394f7d9678f77b18f8d58526ec64d7c1328953b983a7c416583e05a069cd76aefe26e5f5687b70abfbf9f58f052dc0863b4fc3bef805cc3bb05bf76a83235af9d6adfe66 +d = 1e7d4da72b1d82e17a066fe387f2a0a7fa4c60ab993ee09710531789186077f2f32b42ddda497d5fb57356383e1f96973df043307f0b6519430c3f0d40d62954032872fceb7dce9 +Qx = 37c59e95132f0027f661511d1bedc3018bffa62aad7f44d7370f5b169d683882fca3dd0c4260fa8f72a47a44fb0fdcf0d7776ff0632378022bdd223753c66f98dc04904344ac741 +Qy = 2d7f19468b8e4f32eeeaabd6e402a35f38dbb9f2476cf07881d8bcff170b0a6e1ff8cb1bfdcaff734a32ae9bf34a909ae7fee689e3f1ae777812a45dd46ce13fe648016353c6bb7 +k = 18ad70fb9c5673e5a39b3a1655ff76eb84519555a6cd88e86a26f9448a54f04516c2449bab3f75e74a8d15c69926ac43fe01ebbe7e1c97e73870e3cc4c0ca431cf614f35659e3eb +R = 12abdbfb2eb08e326289fdf5615057d912749db4f17848c1ac73bf6a51fbe3e1b2732d4eb656715a6c459c6c3065b67b577f21b8eaca7d657c3b3171e8a4849f55024c69487e50d +S = 09609da5049092e0aa8ebcf10c204de54c968b09b9bfb3eff90b80bc675d557967b35f52e459f37fd198a83a858e5d7f9f5aff8b2ef7272b236dba5857e88515ed471a60bf6da49 + +[K-571,SHA-512] + +Msg = 97b79c76d9c637f51294369e0bb52c4189f2fd3bd0607f91834aa71b3555605a89ff68e84fb5bda603f502f620e14e8b0c7affefafa2f0b303009ee99653ae4550a05315e551dd12a4d8328279b8150d030b03c5650ed4f8d3ba7c3a5361f472f436b200b321e7863c771e20ddd7bdf739c51de3676f953a5501e4477aed1bd8 +d = 15b7271d4319db5743119c8103a7d4c6d57e9c62f3eb93762156d2ebd159980aa57cea948e416717d715a2e458851f1b2e9ad4172bbcc53861db29c3ee0ba8e82617a5866170847 +Qx = 03a5b9559b2058299161770166766aa65e151ac6a22a90205afd27de5eb99c5b1db369ad52f09141d3bf08884b96414c283b2669ec2a2a60c960a2f03d425dc4c229c0bb369d90f +Qy = 024f3a9cf3dd257043dceefe6617a98e222e1cc820f3e19e63c64fdcf7ce8d9c7af7323c9aaaef4df02e498597581082fa3767c8a38f508f4ca2c1eed6f298dc8142668a0027490 +k = 0c585e425ae4a34f9b7b9205f095ea07599716f1eab1a8bbd934219ad760c4606ebbeb06cbfd3952e045a040b8ce20603aea4f965d1b6e87eac7a61672823fb2de7767e3466c730 +R = 129162cce6fb05e1fc8630ec6c3a16d108bcd251719d89631497177e6fe6d1373f114ad9dde6e04a4ee0b4747f91c78703012e5a058c132d54f2ccccfc0f9326b27d60322b497e4 +S = 140163edb5f3c4b49228e4614bfc6da9f73674eab82678ad9947b2a635f733dbce99ce3209f613e2a75e62ed84db4d7d13de6d789b7cfedc0cb6a028d8316db8831db66c91791c5 + +Msg = 564ad0e37c9c37a60872a4780a723d08d1159ddc77bd834d74c1025cdf3cbd5338c3fc07a904fcad9b979b2a2ceb1a0139af35e5112305fd662a57af6312624b9bdd3a64849f95f59a46ca8feb2ed56f87f258518947474c1729275c4d89b7dd286ed65f286cbac76002cc63b92a73ab6bd13c4adef282f32297e441bdd8fd36 +d = 07219ea7917d174a5386df985d0dca798ac9f8e215ab2f0003aee929a2dbd91e37fedead0ed95b1e8aabcf516bdf54337b4aff7ace4c6b3179f2e919a49db50a41c9d4d58d4f636 +Qx = 2fd7f6ea770e0a6f1eeb3318b6b609c0e76ffeaa34e75f56910e8f658b70940cd7a5918328473b279f882816955b2e3702c22e0b3e03863f8d99c64f3a2c9d1c68f59a28eaf25ad +Qy = 6c2cca84218aa019326cadae9639069dd27df4d1e95a4c8e7d7cb426e70e2d38650b382e325dc3835afa719145d16a29e4ff67de37ac8949641f0d140072f59718450a669973206 +k = 03413376b32f18385cced4549e231e514eadfe05fffa0b252732f5c88d13d9c6e0c35be3dbf72029be5e4573b8f8829f6efbf58a12b5c161bb7055d1944eecc93f82c12c5c56d9e +R = 1c45c25f3e8eef9b92142f12e4119842122ed7672fdd82c14b3c34ade3243a4c50495c06b5984d0260376c4fa44c60b2e34b0084066d693943071bb663a44884927352668efcc62 +S = 08cdac0f4498173bf4e59de98ac9a26fc2c752cfea7a5b75141d4e1d019e25d70a717ac3ebb82884436ebe1007b0488c4ff29fa31fdf02f77fd99535c99b69c9d4e5f432516da77 + +Msg = 072ed5b14754fddaf54e20da42432df49bef38f4a3b1841b2db457ff86c44880727aca945770adb41269df41fc17f6a687bcaffaa45a3e59070526ed53b8dc3b78cf9a80a85461eaf4b477e44d5ec4c2bab9c05aa747a5a520b35fd09e8b44539d060ba1c3470267e0dda111b15dbb587614a46e1e477127f963a16cf3a43ee5 +d = 0bc623152253da24bf8d752bd78aedf7d5f6a2f889453ccdec14e10753335ea8bea83fd181a1f3680ed50f2324fbeaadae160cc85831750e021f3e44121ea1b1efc29a7d0069479 +Qx = 003f3a6cc6964ab2f6da95c0a2a7b75afe4f77faff16fa28aa67809afd9495cde1f5dce079ec4e15ec8c1a2095a12e8adc409fe8729d865f50ff31ee75d7d807afd2c15cb142be9 +Qy = 76b15c1ce931ba06dd56dd8e4f544425fba4f37f951a188c8e7eb13a2850c93b8ce60f10b3783647a2d053e2764a957656a184a385e95c2013685d4954a2b2aa20e4a15dbc43b78 +k = 1e091f4febd694879f78e83842572280daa48db65c463e66d9a7ea57b82fda531f116800530a03cef2cf7e5be5eeb6e420213ff757c27b8e8a94513e417f4acc62adc02a76a4fdd +R = 0264c499f7daa6ccaaf191d3502e86458ef088c9bf2ad989851c221364b24a1a3f4404fbd0eb44a41938ac6ab67002faba0bdde7f44ffe6bc10def8317c4e2807c3ca711cb6cd33 +S = 1b91c18fc55635c5e3cff70503e7a49572ba52b11bac193230c88d6eb65eff6b2d9a01f53ab0eb34f5e208538136811157f872a8255b4d249b6ffe021b0c0763cde4d7a7e72b0b3 + +Msg = e660dbdf3e61af39b83b95d3f1970f66d616f03273f7dddb98f768452b21cd39604a31cf80590d4a5e4b0d4917519e10fd325dd4ab7a52d70d154506329baefe0d5816f514ae109483122b4fa8fa1ebd7fdf1fc4e21e8d278a50c05d81c8f489596633d949c6c8fea96fe91430c01522a5afbd5042be8aa47da04581b2bd21cc +d = 0645947d981d258f2954558c31022a3b6ba5fa7b675312f794cb61bfff1d9ce87267e4a1dacb7c8fc58624d31c85ebe22f80d26a620fed5df5bf38515e0903f0b69a606048197d8 +Qx = 2d03e05c4b555943fd69a299249e7148e99633b286da69bbcda64e7b06ce9321d62bead7b8d095a68d9a3ab9e9cf1aeb1d8c4904a073c21806830451a79fe7a907b32df15ea4567 +Qy = 23cba4f6f1815cbe1934734a901206596c6f482011f6cb6d452329f9412d2ef4566429e7d35f2d247eaa7849ee141bb16914b64920fffe6b7923cfb19759fed6e1f80d6c40a0ae5 +k = 18955bb752f0af7d7aaccd0628dcf1f52d836fb91dc78b0fecf21ff5992d9c1f891f0eb3c139803b88736ce10ba4733a523854c4ae9ac35421beff9b20e0c8daf90bece46737579 +R = 110a428aa96277c9a13d4529f58ecc57cd7209a7340b4a78694dd9ec800f36c9c306221fa110e0b3fd65b9dcb67307b7d7678997a3143c04ba96d72be83a1cd6b01ef22acd0f82c +S = 0b7ae2da5cd36006a92a5b2e6369afc2728a93edc845ccb1500e551be361f8658819f7d3eb82ad41d7f2beea1a1cab6f103238a6025acbf03a2b08339841694022c17db8c6c6886 + +Msg = 8c9acbdc431565feae60e08bc7da113e12372ed373f1e1fdd581f98c8a7b0c79ac4aa42c7ffbc963fb4970fe26c5b5dd314b7051fe971c1186ebcb5650f7f7011a924de893f06961b8c75da7bff331847feead4abd2e8b9d6ecbedac18f4eac207b948e6e4215e4d5cb483e5c66ce7ad788cb89604d3a3e051539094079e7bdb +d = 14cf93ca69d94ee8fbea0c8da9d76aea092b73073d8f5385b65c6dd4d567fe86bc2cfb8e8be890c3c6cd9abf7dc3a17eaecee3d7a9455887863e496c48dc3e47821bd3d825b6bed +Qx = 3dfd1fac02ac4bd3e3017a3d94f29575238937824f80ba0b2eec185ce8c641e9fc72194323c779dde8c4fd6e748e09d66e82c82add75106a0e1739f2b977d40ecd3cb15a1eca420 +Qy = 6a73dd31226adba7ed8d08476b5af10a806fe8de72251400a83f6c9f6edf5e0cd6bd1fa8f3595c3ab32b4c4548729c455e4eaf83230e1335cf181cfea6b6bfa6cd4ad75ac3278cf +k = 176972d9402d5d6c9753532e5ea907f256a872c100f87bd390c4d610bc00c408a97bd55dff2de1ef2fa8b9716e33a5a39bb6ed2ab541848685040656ad0468b360f42c3742c1fd0 +R = 00be28427524a3b0979cd82fea407463647a77ac45c489744a9998b545a13516abb9213ab0d89a2f5f872d927ad48dfa502de95524f94f34b174933f3faa7b554a1c2c3a688a0ed +S = 1d49594454516c1876f23f2ba0b1fa4dd8bee028bed5524b7635a2df5b8459f4832b3db5f6074cf07c169cbfd9099a85ec2f5c42043c5b851c81a71c87affba34b11eda67e0ab69 + +Msg = 53ef87d6ac7b9698f40b3ea9f3442e7b64207b140b7f66f73fb7d5f8f98452d30a4e493b6c0e3268371e88e612b818d4d847f032ed4983817d020411a52d81fd2a17b58ebdec199d817c2a8ba77042bbd747a6fd4bcc7e844ea829fd8461b389aa0b5957d92962b6d4e86385a8fbca90b8fac40944607117e9a4ef6dccb8fc1e +d = 033feeaaaa28f16bfaf5ea9c7319cf4561ba4fc55327a8477b6cd58ef6ccad3962ee1f3edb243f3a04e7e49c8e23509fa2d63252adb186b8bc7e9255cd61fa9bc45242d42da3a68 +Qx = 6fc62c39bdd41ef7083ae10dad59e38dad217c55864a55a6a80bffe2f5e7da977d79db9ed8c9ac22d6f096129a0c680ac93fd77da4ad96e292a19b48454f91c93a3132559fecf07 +Qy = 66f1f737ad3af3df674637aa5efbb844bbc441966bae73973481628e5c2c67cb74553a7c8f2c5fc478edd8265bd6c99d6ce122a245e46fbfc21992b950f04cbda5eb220261316c5 +k = 0a5b86b76f98310a25111cc3d1b0b70fd0c20208cd0bfd8007cb569a187c3a97edd8e716aac938900c3ad8ed3a0d091a18555ab532b50f25184454d84af2beafadf754862b8ec74 +R = 0de2eade32f537727eeb82dce610b48106b277d15d8fbdb77cd312ab9983ab21bed05f05186a5cb2b530ba72c8c68b768c26d942f9224c6e6b9e7827c48e129833cb679c70aeb29 +S = 15e4fb92190bbf8dcf7548057d1bd5e5ec54a6edf54f6b88f50e96ac87ed7a7b7c0fe1e1174ba3e822fb7e7c083948296cdcdcfbdc4bde036a07f84d210001ded91c554ace71efe + +Msg = dca1b7a9a313ead11c2d54739d9017ae27f9d08b3544e418aee862bb57e427636cb6aedda28e10f12aa15d2355f4f8ef112a86fec5dc46e6acef693cb8fc37c3e4885f3be3d3ab31ea4d73a0de904e95c7135a149f77b621d642f9bd8ba192d39cfc58b6f19a797c4f3b4f3a87054298e3ce5eda0ff7f44f8134c9a108285dfa +d = 05613dfb53149bf5fdc4e08ccc1c752b0b66ab43aef2d008ed40f3df40fcbb2938d2c41e3ea2dd4428aeba9059a97efe5593119673866a19d27a2ee37dd357e22b6bc849e7e22cc +Qx = 7ef12ccf6b64c7ca64b5da45937281ec770ede572b9a8eb685f3614bc358ce550195e74666af9bb54379c1fe1304b76430d1e51a9976bba02e5781154c9bc187a31201ad99cb48e +Qy = 43d4ca20f06b26d75be1454e96f0568bd740165a2bc6e5b8429d557a79666bb7b9cfa597d392cc5b8ecd180c37f9fe2088d7908e59ff644ab05568d974ab42ec9e01676e1b24169 +k = 10b4b67007af35942216e9aab1d6561bf7684f334a80c7d909a6154cfde8ef06a148af104d534d7dda59b5cec7949de4086ae669edcc4d68b88347d2445edd3037525c97564ce78 +R = 15bfb47a27c6970fbb3256410d5c2f6c04eb308569a966790636899fdb3122f9e3015455c4b50a6bd8cf519afc22ea845794f51e6994214feacf48322af48590d02cc9812960917 +S = 090c61f6c64381845491dac81d5273d58c59d9cfeed214527a52c8f23b0146431692a25cbfd77abba22d4bc61ef24093c593c827ef645853bc8deef7c3b07bae919152b90c17f4d + +Msg = aff61d62c8f5c31bbb7d0a64a6ac589e918bbf2f13e7ad13abb9ac26405e267249a7c9922139bc28140833e10976b87e91cf28285274b2b48b63d24ac94c85c70fafa78f8ad05955c0ce6c02b841ee196dab12306e3e3d6138371217e2b474f7e67a80bbb78a47e374ffe2c9f86292e471c551da50d46e7b5c8331029f369767 +d = 11b92c8b72b86c51903387a65aa206988d443d1988253329ad3a89c902ff1ef8cf73b7f2e4aaa352443bcb833712d94c3e637ec12cbe4c2d4606878576b17fae1512fc77785b737 +Qx = 22440b63bb4557996b63faf19d9f391c5085cdc2cda3755622a6cedc676222ceb5a56ec36e220e507973c0f07e4b2e2d565a69967804ad311f0658a9854b1eddfb5270f4a86b769 +Qy = 50199c9e443555123f153249cf7256dc3e82c5d8cb611adca0cd4fbb0a9a90296bfa770c1b0c0b43e4363b0227273a9ec9f00ecf83afc605b0dd2e5e24f739dd0b4ef6bb11950a0 +k = 0e5ebd85f5fd9a9a81067fdf51b1906023e68672d160ddcedeb35787688dcdc314359ff5347907b685a718ce38a69be17de292eaef189fb9ee8c63271bd6818904cd246503dd227 +R = 051387b0d057985dce86cb962bbca7d9a047f70d96c20539ae7d6b7cb8bffff606f03b8315f15a53049c6c1c227f86d395c2217d32aec32bbd406c790a6cd2706775ed8a0ba1ebe +S = 0c7f3b7e4a8b65a58c1280110f6c2486cd2d2df7d48b49074e98accdfca4a72fa7d43bc25c6576279f4a70f22c98135ba79158bcc3452940963b556304da8e1ae88973d827bee32 + +Msg = 721017294f17ef351e41256b57a64a79f3636628c4bcbe676ac9a2d96076b913dc4b246c9945183ec9bd2d251441b5101eac44e2fa1bef59dec03ccd7fa5accf3b7d094d68dcf78c8de4e2f19f56bf0dcb3b66b9421ec3f8b353b9fd74feb2e9affe0bf9aa421b6f03eeba3ffd58fba56b3ebd094880e50de01ee62a108a24cf +d = 0c3c90d5ce4375a08b85575faa78ee6bbd9e5571ce5a90582042617b807339c282cdc3b003d82006264b1c08c20af4ad4549fbde53d262facb98d923d81b8eb6093374b6a1e84cb +Qx = 1d900b4f64c07cb959049f2bfa18012f9bc2dccec5a73e9a48a9d5d65499e31ec4a1615c4c50177c032d388263eba1a90e07ea68f081e10272e88a41389bd2626961b646c76ed8e +Qy = 5c094fedfb5b118accd64d5d46ca2ed92b3123a62042a556ffee9e3bf709092fff88231a26917d368db51d1959ad3285c7faac16ca57677651b070aa0abad96f07d35c5fb8a0ee0 +k = 14d4070307cd269cc1a3c048ec0847edbff46f64c1ba5b734d8a800e50a0a02af57cf24750d292e2c247ef1b860a9d7b5069a32f5b0546fe9e019e04af62316eb79507281fbef6d +R = 1cda7f743c47ae93a9fa533145feab4c46252afabe3d54990663b5891b4979c645ccaa05c744420ed6fa235952f370f5aa187250d7b069aea1123f19f0f18da18fde98100ff6ff0 +S = 180b4163f2eba6e3769d8345dd8cb003ea120164442efa885eda5bacd75f8d705b7f1bae2976f67cdfe984430e36f93455ee7528fa6febfe92e42a002da165c63dba8fc589e7851 + +Msg = e2d1f33681759adb7954bb5248b0db3c3885fea0d4c1c0c226eb1e6d2d3ef1b9ac281a0f1c2fe5175b67114b6a501e2426d1454bd5790dcbc4c232cf06b017de8a9bb39e6033f1edb5003e8de3b44cc3d6150c3c952afb442952483cc688908337b7c1a8b5c9da70937ccfa98b2b0098c530ff848010b8e8ee0a8d65283481a8 +d = 10f184c16228d9034271332178ed485d10b6aa76003efc160d63fea26fbbdf5552205ac7df0d8c852a1210cf0ba512f20b798827b36ad56b12a826fa7dc1db45aed264ca6822659 +Qx = 2637543ed8a11271bbbabb2cf72999f65df0104758c2fd6fbf3e1c5132ff1c1111fa5504ee86bed8f219d5025f8ae07055a7849314d2d439408ea2b2ddc40320c57f5d41255d0a6 +Qy = 14e360137ae33ce6930b844d42bcda4050b25f349e9e19fc4fe82f5e4f73cf9bb50212ea875a5735faaa1d5494f1685d6c8177448dbf356b408ffc2ba0726c9befb9de9f0cebe32 +k = 1146574a96394c82972eed1ab7ec98bd08f27653c565f0626fecb431ee4fc6f830554df35fa62b5f82eaad49524d3d4b0598cc7a2181ce9860e271812373d21be9536fc181c3f12 +R = 0dbf465de2c5242fb527f6e4a4188adb96a2030ed8417cd9431365173f569bfdd3e420f86947da10a703370d7f38dc43e2249a2476690829545992645c9c83d82af8adae893780d +S = 1499782e0163f80de68e3a580ed08fdec8d6552ec69f186a74be89480be28a0df6acdf7c65a72f115f8a59fbc28bb94af64cb3bb3cab20bd25265237a010370d9a5c781c1e26f3c + +Msg = 414fc5d2bd56b30040e105cb891788792da595583b11b8fcc7320f40dbf64d9263532dc57344dd17573c95eedf851668b5d552e8796af205f3a0043af1a829fabc2e93d9af9091fdd9e0fcbcc9d6d9ec960aa60e4e2964c29a2f375400366480e513f63d124db7745847310e69a38c8455e4e602056a6a4a14a8694155e0a9bf +d = 181baf9d497159f837cba58a11ca435c442e5ca792ea559bff9f6a1f562c05bf6bb5914afbd1bcaea75b35f88bdd832314b249a5298622c89462344d3f28a44ba3d059df432fc71 +Qx = 6f3915f884e250034db97327470197d13f0716d1d810e43055757460dc252f5281717b3ef3fdd51085e65a0e073e78b697a21bc33137213981fc05d9b34caf7dca7a4f99be78596 +Qy = 47a96ab5ebec6201b7c65ce7a6e70effeaeea1c095a0172e9e2c7bfc88f7b05ea575076caeab189f810258373cff2484f4fb9c8167989f61aa61ae27113b5140c95f7faa505d2d0 +k = 10e9e6047651362accc816389b26ea6befb0e34fe7363126f8c4ff9333266f46d63c4d45075480da9ebdd0f8da7224b470d914ea1d68cd821f563b574bdeffdd0b3ed73ecb9133a +R = 00e36644cf0861f45b333092d44fdd99f56e89bf3607f75a06920dfab0ccb1831208296aa2431bdb75c5d50f15bbea2e13d185db6d7175c221858fd2b22afbeca7431c290b15d3f +S = 023ee3b9ce817eb0a6733c85062cc3bc5f1ae62bdf3a74e3ec704baab05784dbb5ed01a6a2a73c80a3e754c013ba886108d9eed2bc210f29a4774bfe5508ecd876ab47a8527c530 + +Msg = 3b592cc8972a4782870e079b82a50f84b4c2d8ca90bd500d1ce5678982e266c391c556d8162ac3aab967154d072dbc0ba1dab5545cf2651753dee2881eca5abd412fe624bf3f9d17d33692d21ce23ad15ccffdfd250cb1949e73c9e40a64ebebb03852e92692dad1d7baef97fe109f35b7a492b343d4b643a4a7b1723eaecb64 +d = 083fae86ab96bce99a53e50b7eecff38e4e25b21c4b0f6a4986915de245eae24f16b6a00a4db159ebc27f5a6a072da94ab6be5bf75f5eb3f75c4452bf4ea7014392eb1e02706fb4 +Qx = 78003779e0287bee54df31f64c58951df7999b48b647a6bac416f844485a4cd7a53a64170f9d2d31fdef0194a0c262b90e5bd33a1782d2ad56c210cf80abb5fb118cffd71ad79c1 +Qy = 73f89ebdf0e255205a7525cc12b7e1c58303ac3b3417183179c216ab8e47f33d0af3238e3ae64d418ee89ef3a2cb4bc67a1d2fb1923947b9dbf3f4fa39ff82327d0ce3db24d2324 +k = 13d126fc4033f537b00a81372031026f6a7a2062863a68e36c6909c548833d1a8f5fb5fe25c7d9f2c65b1dfa974630204f71e96d657095b93cb54b00cb88f32adc08eeff4036654 +R = 09be9f4bcd7b8ef111337fb665379509b8b17a2212a80d5fecc685f1f362c45f930acaef9df47c33c6028cf7aae424264575b4635a11edd6b005ad26cf2021051501fdd1b77d2dd +S = 0dd196343ef76bec527c5929e02fbd5d02d5b0a4b5f2c8561978e600856de56d42943f1d74cb81b67010bae98de0efddfcddea5d354c60c1fa76138801f6cdc5bc932c136309b6c + +Msg = 0079a02cbab3dc02601fcb5c8607d555beef7cd71a66911ab6514a4ae21c5a9c0e166f8cf5fb198ec5a49a96e17cf041f35f00406b79270ebfe56dc6b8417d2529fd625686ffbc8f69685aefa2fd30a937c02f25b48be4679e6fde821de928b33b12470867def874bb8c7c8038ab6594346a2c44b39210d3610994ba60a05e06 +d = 1a663efa7bf4d8479bc535fad71e9b5e4f4281aec55967baa008ba17ac2f89cc3398d30573edef29d590fddce8cb157f655e92779f59e7a18d0327d02e7daf4c1216143b3688fed +Qx = 6b4bb31856dc516be60a0d2d9f42508738edd4f925eca9c72a13cf136720867babb38622fe97df70a1edb35735365f34c74baef9aca539aa1dfdead3324f41a16ca69bdf86b43f7 +Qy = 6c4a91d3fac9e7647a6aec6e4369158bdcca2275866bcdc5a09b2f0f1eba10551da9613eeb1e8d3233316b62a5f4641d6aaf669b975dfc511f2437d43c9eebe53c5115fb4741b80 +k = 0a843d0cf776878fa9ceb163d7aaebd29ba3aea0808c3459036b258b99ccae4e2444bc3211b5898c0769b7d7e036c07803497e13803132b3c6301412af3be8eb4a853e939a247a7 +R = 00356e282c096fe1690fdac4c0c66eda155ec42356dfc4783cff0160e1d76b33a99442d4ee0e3f6e1c5bde4a16c8e18bd18f98a178c3fa4a560d8fb8b4b1d72663576f8baf8672f +S = 0c5018c1383fc3847819726e1e940028892e1abd164b413293fe50f219f2059105218e4e3b952b912a3258c4ae52dcc03ac5f027fdfa448a8d58e3aa5c21e790b3b47bdfbf21175 + +Msg = 88573bd94ef50459814806efa868ebf92b066fbc2f7a4be9d2fa06b9dc1a72f72d783a6bcbc107b18a6314511bff217037a2252e7a5cd34cf9d5b2fe9c7846931f0133b2e95876cb800dc4ed7c4a4e4cc4f1195acf99fb0ec224b1f8fa8af71f72d390eca9d6be3879032a318734a63fec336c79035a43f70271def10c4955d3 +d = 0088d1a2c0219696a94337cd56516252b74139ea0733b17fdcbf7692c3e5f6c3989e5da2aaed7468e65a5d578571928ca273ec3b6aa72cd196f560f05095cdc8346e5d31c4c2e0c +Qx = 357801cec0888461ffde22d83afa9ca008ac88518f4b09074d29a846f5900e024a8e5947bc25ed0e5c980a58fd5e9aadfbfab31db8bec575fe886deda80134d91b3de9625465302 +Qy = 710806c7ed33f6879374c59ea144326f5948980c8013144345c5070122c0ddb7e18e9f752eadf2a9b0854dfb7d9b2f0d80ff0ba46197ce6017885939e9f59b642a8fa41639ea75e +k = 16940f69013026bafb6f400c037272176b04e35e9f1563d382dc9982968a186e3e1525775d27150b34b8ce5e70b537f0149ce1a521d056b52e75da7e39ee8a529ed987c70b8234d +R = 199058e36449ee1a3388d7357c9c1020b2e4c02144aea14b041bc584a752c94fb6e474959b24bd2c0c104f5ecfe223ebdede672298c29195033aaad5db1852ce4dc3185ba2409a6 +S = 11f3defd9b442378c461e2c68b239d2e4afaed691238c5ac4e0be46ebd461639a60176f9884133900f988e2d730d34df5e2bd8a14681014c0a213f8d233b3c50ae3064fc38d1a19 + +Msg = d0e02045ece6e338cc8ab41d4a064c982ccb1748c48fc2fe0a6f10bdc876094358a6a90a45facec798a83cc95c6795cf0f0d7c66b77e22cb114c1432bfdaa1485ff35b6a58107cac3b7e58cb4f6c87c68db60b751e78f1fdfa54b8923b98caad0a4f31226956d065c083ace5f1e9e91944dcca51879d782e40358d58ca758750 +d = 16cc8a0fd59455ed8d4de561fd518df2e008f7dfaa5f7f29ac2489a411e233917b43eb3ebe2596fc824be58871949545e667dbcf240dfb5e0c615ade0179d9ea2a1b1ebb8ab9384 +Qx = 2477e678793593e2abe837961895c7ecef71af1feb882ff27cfbabfa0ba3ed771b79223e7b2d2388efd371d5c325854cd60e48484f818e1a8146fbb780cd6ce06ba63c0db67df8a +Qy = 01b696114838bb972ec6d536abd809d3a436650191c43b2bfeefab2b400d5921a7eb78e307266acc190e05f3869017f0a66f886bd6556c58aafb1042478cc768a4f86758e9f4c32 +k = 1e1b851bb95d2913d6d35b756d49fba6f4c127dbed80fe4068260cab89c1d42f7a6843f731e83b379ccd8a4915d2e29550f3f6ccde607cd0b066dd5fa41ac2bf37bdcfc26cd4d04 +R = 10d4291346685fe070b267edad91154df83664dc115f058ea036c712929634d53662586bb50cb6473c2170db5d4ee43be0c50532015937202e193d15d5189870691ba65aead7f3e +S = 0b2a15f1ef00204bcfb5108d8f1da96ac3297aa041074b68989ff5b6b276380de7887753fe3d416ba691ba0b2ad7fc065ace02815b2323fe17f6445b0fa66dba5d99d8e7d557cd5 + + + +[B-233,SHA-224] + +Msg = f1b67fde01e60e4bb7904d906e9436a330c5cb5721fd4e0a3c75b83dade868736bb1d21cfb1b5c6407c373e386ee68ec2239b700e763728eb675a153b8ac44cf2a87be85fe8ed6683430cf4b7d718891cbf8d583d0a37cc952cc25fe803a7aa4fda80f05541a2f1f2601cdd0c095f7110f2a84f7d641b8531572269b21cbe77b +d = 056673197bfeea9bd7a8b820b4ae51a50411bf118a692bb9ed3d304da53 +Qx = 03489be62e53910c20cb508de019c3e326f65051f26749944b4454f156a +Qy = 0f775ac38baf19499675725e8190aeea16f52346b1c890d9583b38c7521 +k = 0a6c9914a55ef763913273b062475fd0188eb2d5af9c8c1dd97cb3cefc3 +R = 08601a42d7f7eb047e8ed9820ddce665c7277f8ef38c880b57109b7160d +S = 026d6f50f0508953657df5d753c595ffb8e1c19f8d092f8ce8db54f76d0 + +Msg = 1d496d96b533c632ed6a91f6e3653cdffaa5b8cc0008b35e49b2dd52fe261105c2ec7ee71a4ad5d51fdc3d36d688a3b7ccb3b3b0c3a65be17b8d8aa172e3005cfbf37a2d1b1a6e268c090c6f318e7e96f9ec9b9f5a8fbcc7558d89e840f7e76e44bed91c26ca48e6f5cbc253ca2fe8cb81c484cabd24070e488f9c00cd96ad4f +d = 0468f01d483144e514ec257f2e5fdee28a927f2adb19714c1f3524dd0d3 +Qx = 16b3cad89cc42b80bb730431963526e26ae3b415b421575dfb6ed973e17 +Qy = 1acaf7de06e20262efae01fc80969cdc1a281f68e8c8bc0d2d4fbba3a3d +k = 04d261304678301985f5bb3f6ae465f11c9fe0e5031b31f194969252703 +R = 0878a87b2867c03f55726ea2a6db822788f4aa4e9ef609997940ee8c8b6 +S = 03545153f0554a8f55301d4b948043de3057cace62c8032c8ef8a11dbf8 + +Msg = 723400655027f474446843645757f7e2cd466bf97275067b4bc4c9d79bb3b19b2421835d69db916f24b77c381fa771fc1e7a19d2b4d09411ae55acccc615b16fd24705762b441ab67083a921fd4ae569ce0de69449aa96f5b977ac7dc022fdc8335656853796f54b3fbd118577f98920624eb0a00204f1ef83827245c06646cc +d = 074052d027f05465a8083a59cdbf32600224e1f563f653b34314651517f +Qx = 06999290db440eb5b3291bd4bb4a1af6386654fc4d275ef136c0e03dbca +Qy = 1fed0b1f9284e488c7fa2a010766c340bc25dc132c7679c2598e423c3c6 +k = 06e38460379ac3fb13f64d4de654d4fa30bd8178da0bfc29fab2a1e2e39 +R = 01b18bafe55e5c24fa2df4c09112b44d24e78dd09557349ceb1b916d280 +S = 0ad7cfa003267a6b7a99894f75720cedc9cbf820d355a6b840709f42f62 + +Msg = 155860cb31a142082bcc0bad828d747e916392d21f1873b3a3c1d28ca3ff9d45ddb66a712e3856b6afd07c8d2b2a7badab296a9775b03f6fec0befa2d8d6d00fe3938df244ab46e836a3e686c8b4f918da49f0bb3940bba34a9aa22c7caf02df7758b0de01d9f47af6146344b9be3842d9c055eaf0fb399cd8db95c544a62d8a +d = 01856e7544223f55f80de72a6ef3822fa8fbd68eb397d06e2d76ddd35e0 +Qx = 1a117e52f09080625f85fbaad8ebe0d3ad410f034242bf48365e88ff735 +Qy = 008b8bb7958d191265901a3f15b2919142505efeea13df6e42da8b0dc1d +k = 0aa106ad1461353865706bee9aa092b00fcf1b0108ecc1266ad5d8b6579 +R = 0bd6fcf49029df32fe0fa47f39cb9428d95d00a84a5afb392d7b4b365e0 +S = 0b17734befefebf03d1c79e59c12ed3c57e7d120dfd993bf276de559588 + +Msg = cbd6e305cc9f0dc90caee6e65a74582e9357bd25c78e33a7b14e1ac7e9397ff4466f192fb432143e6df6d61a0ab808ec0a361a6d95a357a38cd3e241fe03ed883ccc364b248ee2a08702110745c2688bdcefa33c1a45b9c8b200e45cddf3e3f66b8d37eff07fbb3366ea1558ef304085613c56707095724b3e134c7a7d3f8dbf +d = 0860aa2b589f2defc617be73e191502e5d9952bf60547fef19eeccbca26 +Qx = 06abc5619422b7d548c612e54df0385c293632d4d97c21e2e15ad98d0c5 +Qy = 06c36c072603681c1b03f6a023c8e987f39d931bc2a200eff82239ee38f +k = 084fb252dae9a96a44212d18e15cc52d179cd5e3392ab9da57d04cd5a9d +R = 037cd554e7815699f033ca9187ddb116777ef847b92353f613152c4216b +S = 05f806dd062043420dd056998bdb9822b3177406a536d766c4aacdeee81 + +Msg = 812a218ff1ee1472c189f63386e5b8ab341671c3a4dad27a8c6249d1c0f9a29338b471b6179f17a078b6504e804ac55ca3b13e68a623041bc1a092ea2adf3fa1124bbfeb161e6d7c483433f1548763b84da00352a6386e1339f674d45dab13898147ede468e0e01d2c4e0ed66b395a16cc3ded3e952ac739205f35a83376cbce +d = 0d0dec052a00ccebd0c0c5d9a08272f75744a2582cec7ddd924a2b022b2 +Qx = 16bb8c3d319b93731f1055756e57bd56d50b6b9ffbe42735925cf6f7675 +Qy = 09dad7b87a749df130b45d9cac8011101c15abb7e64bd4fbdd94107fa31 +k = 04098547601430c723ebcb04b23e0f1ce8b1f79ff7ed3d05ba130922b01 +R = 070ea6221c0d62930b019faaa856ad2c84c3989ec54040bffc42d8dadb8 +S = 0aa20fc58beae8ccc880e7fcb48a471faa5baeb36bbe5aee71ed9f8adb9 + +Msg = 0204b1fca831919e89e108cf140b3770f531a696b1d9a4d1fb68809eb10afccc257cc90cd36717c02b2f3d6d3d1d8a93cc5c48aa7ab9f9fddfe121ce9143376535a0c65e247c6558eac49fd1d6d1bf431ba918c471cb3d536ad485ec51f6471a340ac75f160c4c54cd3ffb9dcc123124b42df1fd2eaa005e3377c5d2d55938c6 +d = 08a017d717d6d1213f2b74c53281b07258738c0c7db649ea1ac46b9a3b6 +Qx = 1eb379e27de6c04c5320cbc18e79ed9e8993710ac70ce823f1ab5762b67 +Qy = 0f552192645d350361762aae79ffba39c33c2c5c0df208219f1b339016a +k = 00e4822b2cffa327a8396301b21554da6fa52f418d67114bd58e850d935 +R = 0d64dbdadb4ada2d3a8892049f7fda3c733030522b44cd72ab850b77bd0 +S = 06fbae2d8e4fc04abd8a6e9cb011974ac851ec108e38f9c72603f7a04fc + +Msg = 2033eb48756638cb56e2cc39a3e775cfa11fce86cf71f04487dcdbc7f262bc8350a30ced54d1fcb697b28a6e96f88f782947c997872307ed963e1d68985f756435af77f57755cacbb4c6b50ed419deec9f39f0a549a13e54254fa0a5832dba2d943ad4aed8688889a2dd29dcb4ea12abd6a6c50eabcb3981c3a0c1ca5f0b9629 +d = 01b56c14442b084cfd22aeef0f8028ec57c8b571c9fc1e43de05c45e47f +Qx = 0d450c533b13b211b8c91dad0738402a5c811460426ee2f35ae068f2c12 +Qy = 15e1c9f9d398925c619f8aa0bac746eb7907d3d510814cea185a7efe771 +k = 0dca09773730a2758b7f4d9257a8e6bd942c141e46bde5ca54a79468c4f +R = 0379773ebb7a2860f3422d8f8f714b234e5abd8860defb19c659c9c6179 +S = 0cb9272a27661604425ab84632f586048483b9f9cb80b9697898e745117 + +Msg = 2986ab1cfe8873009e932dc68d4727d77ccbbf378e43fe4aa7c54416346b036b89c0aad1b82977c9fbc39a00f1dc916c0561d8dd70298c02b6cbfe572e0ef2058641e841c6875e8515f3c1082765e046c90c956d984b76e0e8e6eb433ce26c1757ac5b13422479141971c20102e9621d18f51096ae3173c2753facee2862d66e +d = 05afce37c5594586ac46a34ae291f591eacb9880a7de92701977f447fbf +Qx = 02a069ef14f2989d2b715c5006642ba966cc84df88bbc27e713e15c47bd +Qy = 0f001f60b8a8102a971faa2c42d3ea9cec37b49c7e6ec0cae9f7fb35713 +k = 09756db630ed9b708bf1ab8aae6a7559bc235c4e9f4002ed26e2f019aa1 +R = 06b9b2c1d214373647d9a2d24ba69741218064004614368915d5cfaacaf +S = 090dd607329c27483fe43b7be137c3f51c23217c939baae40b53e65af2f + +Msg = aabf5aa90ceef91c2155f90660adbcb0eedb996f5242cee15468ae217058ebeaad8cd4ff8cdc754a8ab85ba43c59fbab6386686fad5e27ad3848fe52191c7e4b203720841501792a625aef2acb6e36493b792fa55f253effca682946ad8c77e01f44e92ec3c258d0dd98d3183f4dc4a0bd3eca183794abd6232a6f9e4add8f57 +d = 00696df05dc7a54a9908a73eb18416a155cc8df4ab26032539d86eae537 +Qx = 08f9f494ddf8d0030746a8c0b8d215dda6cc2724f411a7ea407629294c3 +Qy = 1ea2e9f85f06412d29c677aecf624a83c2fbd86482dc0d564906a91d97d +k = 0d62b06628d3884f0a329a7b6b4f832fabea4ebc85ee03e63f2967e7810 +R = 02e39824f272d4b74810594810957963c777207217e53a672010605b9de +S = 0e64bc44af64b6f879f0d32f814acfbb98795ef7b2f246b3f91cacb55cc + +Msg = 29ff209eabbde02b10b3fd559671fa53e418750c32c4a18d31cc0186d1077581bbefb8770ed079f536e866414a07431ae6633955bf42a2389b6f8a565d6e4ffb4444336e0030093876a26d4e3106e9ac697788e41f8a21c755eeb86a7c60f18e5e1069f16408a4c375a6a68d42959f2fab7ac09736c7b37c80c05897d8566ce8 +d = 05ca31e88c5b2e96e433af2023a66095161710628e7bfa428944d6676b8 +Qx = 08232d4bbe25536ea7f83c145a8d2b1cd72c383eefc2adaa1ce72c7dd9a +Qy = 100b738c6f1551b3240293ee8e8ec29fad0cc485ffc2cfded96b68162bb +k = 0df9e1b418ca1d41d749ee998446ba1cc54bc8bf72eac6f30929b40b5c9 +R = 0d4248e0bb60fe46abf7bdb2effe804b9d394d8a5514a5791e149d435d3 +S = 0b89a459fb99cccebda754c4b2ae264c9aef7b5b610427f42c35dbe7d3a + +Msg = 97765d876c80819f4004a36d09ccba78e600efc71eb7e869d3a00f658d2ace6769c7ab1ef590f41fb070aa8e08615e138df45ffbb6473d4a86ba5fdf17dd6dc9ea9ee19c0332563c99e6a3451c211d286d69102b47bfa6e07d468d9bde82e5c2063fb1ebbbed6086f542cf68ba46d4f214634afb1146dd5a6f3d50912ef5b824 +d = 0ef8fe84727a2ad8bf4e646ef28a492adfaf785a3a2ba6e6f985c649a8c +Qx = 03435eb25ce9891a78c120098992c666940103eefd80d9bd64f1d4ba37b +Qy = 0ddd6a4a01e443c92afbc247f634b85f1c858a2aaad35a26f57ad4c9126 +k = 09753a236759eb32e13f19b9d2ad06f7b4db4ac7b1df96813463d0cd557 +R = 08408fc46149dcce0753d7cae0f50c8c5fcc97acf7a1a02a9f68c0b80c7 +S = 0b5ffba104acc6d0cba87523382ff928859718122c4d0d2298e74985d89 + +Msg = 21cf768d087d1e4eaa8a05e2008020e243116206d675c09be42ef2bc93617ecbb0575c873c6510ede9979215531b62126552738862fc4323d487992754e39d8f0d7e111e165ff254200e05082f59a57ef649bccaef6f980094fad3b7ef93bceb161760e200f0a2e396fbb6b6142dc84d872311bf932b84616b22231747937d58 +d = 03edb94b8c62f9af30c14a790c0f5d65e362a21cd8569b9725916d534c0 +Qx = 065133691b888cd2513964b5a905ed9334cff6367e25c09db1743045d58 +Qy = 1408e1ac721bfe2198086c1834d484b6e5692c037e09928cff87f4b5a88 +k = 01d8f800ba05d8173b0f1bb3aac0aff68c6b24cf98c28f5a69b0b5a52cf +R = 097c07d4352e39e1878c42fe97ebd4c3ba5098706879fad9be4bb2dc2f7 +S = 0bc669db3a488e613665cd26da7927c6b6a073ba6b0951c00d22ab1ffd1 + +Msg = 7b8e58eecdab3e40212bba6bf284f9379265b3d2baec3e4625aa08d0ced851da193c292ec793dab42732c07b4e94d8b19c83aed796a7e3a6c2b954a7a9a1ff9b2bd4ca62592c8b68f709f1ad38a5c8033ebb3f33d176945bfc68e9ef2b0cee2d45a13ce89d238a33c09ce2c0c63c4233aba5717b85c4c161dd7648a41a5e39d8 +d = 00a7519be62562318da1b67d22cf8e720353d22641e0cee11c7a352bb93 +Qx = 13b63dd8ca9044a3e518a67999a781a5b62994b6e20454003a9bdb8715c +Qy = 1a2f9bfaf528b7f5bc8c3b02eccb71666c83e4a598b4077de999d90fe27 +k = 0992ba1a8331bc4d88be7dee06f96098bc2ea56668f345e187f32f38171 +R = 0c55b45bc7bc3092ffa82234b06ad45525b45f8904011f1bd6cd356f0cc +S = 0e6163e70ab56d43fa27211b98b48f1cade127237bec1c6556020d39990 + +Msg = f8f268d2b04fe47e5052c8d0d653787384b9654f0bd2138a6f52b80713feeed452b976a90eea4edcfbb62d04f3eafe172ddebd7cdc3701ecd6008e3d82e8eb217b13b5228839f61075159f3bd1e1409c08903874b6dfee2789dd72c208ae769ec8c7d52552a2b1fd73dad24de8b571f88e2184d0ee7d063a121187f97e746f2f +d = 0264022fd7dc2328a6436b522793ad9406d7a586667a0daaf1bce927338 +Qx = 12d7e7f8519a7e357510adfca2f50182dc5fa12fb2a77409fb781ed500d +Qy = 0ceaa9a22b7ef9febd8a9962ce21d83fd2a2a938b9d7a78d669dd233974 +k = 026fb8fa6e746106500dd29ee32bbd03b94302ec3a123356b23b3055e51 +R = 0f416418f7aa4d437e7606afedf961b968a67d9a1524d60fe3f6df4d3d0 +S = 08d3afc975a8147fa8230fef4b16e3024180a9768702038f955357ce8df + +[B-233,SHA-256] + +Msg = d288768cbd066fad4bb2500b5683fa9e4eaedfb3dbb519b083f6b802efda0a022355565c5fc6babeccb22f3adbbda450ce5d633193d1431e40c0fe631a295cf85965cd3f5937b31866bd6a5300eaef9941daf54d49832acfceed90e572ef34ccc94eacd0fd6b903fee3c572b963d21e2881656a214d2a4c125778dbe3bbeebca +d = 0da43214e2efb7892cc1ccde6723946d2a8248a6b4d6c8872fad525ec3b +Qx = 0db09738bf0a0dd777f67e82be50dc8c2d8e91598bc0b8d4486f67c04a5 +Qy = 08ef463e2f37ac7c3d276676cbedf17ae11e767ec577da7ccd90cde3b74 +k = 0249cbd55e307a0fd10a0c70b1c0d5e2416f4d7f144779ddc11911f4a08 +R = 04d1c99f9d486fb92b132d68c0173df891ca757572f7acc03cb41d46bbf +S = 07de2deeb58d55d65fb37f600d916cfa49f889f02ef53dcce412703d1c9 + +Msg = bf0ab46e0a756c11229b0ea961f8d57218be5b00ab8b0e91d7664cdf5e0341c412c0e992d26ab12115197db39df2d1a6e18ed26a91be461432a2dfc21d98cb16003e339b0b0b1f100e4e6f4824ddac5442f22a1fac26326ed8a89cc91343d7223986d485cc8c64424e84d56be536c57e4dc5faee459b1958efd79e07e90a9811 +d = 0aeafa49d776b61f6a30d66ff64bd40dd8d79891dd5293c1b5cd3b46a7c +Qx = 1ba1b87b16122e6939da5dcadb8902177a9f9ef09194c8695008b80b588 +Qy = 08f51ee5cea1f4fc9c44c70df57326ff121268bf4e02cd9b2626fe7c1ed +k = 09d640ede5bb60b9aa78e393ed453b1643f6dade4aa20e994db53e81fac +R = 0277bbfb7479077d5fb6813670fbc7f46055718199550130b122a7cb8b3 +S = 0f8dd350bc0bd2d84cdd374c56ff2341de4102269a1e80df7e35969d4cf + +Msg = c7b1eeb7c19eb16e7f42b61d79e421b71de797a6cab4e0baee522fee7acdb533f7bbf5855316544e1b82b4f2a18ad0a2311e7622549332122171f32fc62a90e408207e0fb90d1b052821dede9c41b15b6e07d84d5d7b9e31e6396a8ed229fb6232b3051298dc5321aa589f4e289d27169f14c8cc93644916d9b72dbc92c43488 +d = 0e95db309f4305b621f51f93588a2678cb19aad0932f365fa0aaa3a3895 +Qx = 1177eefc44b6070e2c41537e75c91e2f08908c0d950bc90cd2f4720b335 +Qy = 0f751312dde55b1bcabf31665deb6c12d043d5ccc89800622a557a7ed37 +k = 00015798ef57a771d62d194389817c93de1b225398fcc0d2b81d94054a0 +R = 0eef7161a167f69a6c89b0f173db2c4a7033b5d801c0d89642ce65e377b +S = 04043f8985bbe0221fd595f9355c33e1930b5e10a1452e81c31259e1e3d + +Msg = a738eb074e1f277dc665118ca055e6328059ab26da188c16f56384c566e43df8cff3d2a10d2d15c3c1406de8f734b20be5dd1ce937a4289f0ddfd7bddabd03586556eb8233b8feefedaa1f49bdec6d45fd562c2a83fa9fcfc2013bdd77900857199e51fa9c7cbeab925ba8f6c3c5fae46bf8e9c574b302f1e5f9c44400152a78 +d = 0d4319cc8e409b8755880827f3200d3f0f1c64d6356fe74eb1f5aa42499 +Qx = 0bf65953f2d08477f7fd0428c31125184e3bad4d5da00c91991949e0562 +Qy = 0f1669d0d116817d625128ae764b3fde956432552d24d98f08a12925afc +k = 05e8704febc38bb8ea76f3c6433c1f0421dc5e5af959723a5a2f0e9a970 +R = 0307c0b838c65d1a47792cb367253bf7c9f627435f1c7ed74494b318446 +S = 00031a9b35e935be6620243f4878a38d4e617fb25f7a4883893366f39cd + +Msg = b28103d77e5457c42e026e713ea6ff03722a36512da17197140117442a976f9e2139c54a759fc26af5811b455e5a0d3a95362d9939c1e738045be9237b469ae2106ceed7e7842b44cc0a475d5af6d781e32ff1dd1f4e1833dbc7f82b27dc7e1562d0e29213fd8911105104a7a16f665b926aa137f70d868c90e72f8ee2c95b64 +d = 09e556c945052e5954915c773b2d47970c521fcc99139269c3ef46093b7 +Qx = 0db68c16ffe64bede4a849812df0b8e202f74500cb7d5349aacf7f3f026 +Qy = 084b5892ea74835e96e9dfb1bb201a4dcaf32da25dc00dca019d806f5c9 +k = 0d0c9e0b6d4526d5f6494d2c72f812fb8d26e17c7a44f6b5e3f9e684cad +R = 0a379ac253f3aaf94cc49e91fe3f2908107a9e1a4d102e02395eb18cf08 +S = 0854c2f6ecbfe95cfd14045faf71ad47561e365c1dd5f515d8817c3198e + +Msg = 463d04c84521ae671bb35c0a7acb3ae509b1b0470f39b8fe7ae5f3c9fbadbeb2bcc3a87e284cbdff07407a351f7ba743aeac50c4a1fef7375b90eb4af8ea2df040776bbf3e4389e7a80bea40530842642b9895ab9ef5ac8ed6c9ce7917d7b3ebcf80b801da845943313988c1970e7748cc306f914c37414f8247d648b580000f +d = 0becc76f8a77615c4f92ae1f91645bf5bb908e75ef22fd544aae63a3c8e +Qx = 18cd93bfe8fc8ceef2b9be14fa947b60fb122f5099cb5bcfad0cdc601e8 +Qy = 16de11e673011e30f6fd92025a60d7938412ac63b19d23e45bbf53c6c4a +k = 04e75a7b92c42ba0581eb1201fa5b3fb2ac82460e953c26ce6bc60e145f +R = 067bad23ecac0883d218b1368d822b3bf9b82453c0e5f3e336777c6a507 +S = 03788a331249463533384a61c47232aee6f057634c37560ee25895b2a03 + +Msg = 8b2379b5553ae7db6023cb010e26ae91322bc3f94dbaa369481936f90a886e5d3827d995ccf03ca59f46805fbac0337d31a8f117cc7044218a934d5bf507090e7e21178a7162c8fcb39111e6967803dbf9d752f3ae737ba024d0f4f7627e08be58efbe997a164106bfe37f67d2f19c0fcc7a6c7eebd96a72582a9c7bdf881896 +d = 020572c2a3dc3ea430cd8cde9d642081c21658e8bda165550cd9a5d37d9 +Qx = 16117486794f14d171dfc3ccffef0396cc9fe5aa45d6d39ce0f252c4168 +Qy = 1b6a12fe2adb279dbbefa4eafa273a2ddbafb2c6401067a5ef5e859fdcc +k = 0edc8d0b64496da309b10630e9e5917c9a807ccd7cc7bab14360873eeab +R = 0e1fdd3b7849806fe587ad93aef737ba0472409b7239981f0d325785fa2 +S = 0829449a0c39071a832664e8148e762efc36fda9e030e0d062458728273 + +Msg = 3090bf7373731cc44c00372c1ac59280b0f36e627ccf763fa68a7be37bb0ac8cbd4f70db54fc652566c78ad268f78f015e4bb1e41516fa56ac303a3bb4a52e1fe897d8338db5a6e37cad685e704b994504bd231c7dec0002dbd907a7ebfa809833e32eb23fffdb44fe4a18e11fa19d67356cfd703cf39a75b1a290b8a7c73afb +d = 0769cfbf2dd8248ea1e0ac9b275c9d6ddcf923fe762079b9ed62ccbaa89 +Qx = 1aadeee0e31ba9505da3e195d883643d260dac9fe5e86102c8ed7f88eef +Qy = 0d925bd5fd700fcdec60cef9c9fdd304faa102d9d721b4f21291f8c96a4 +k = 0f2e203410107c075e25c4adc2f55dcc277883d679ea307df7d52060fa3 +R = 02fc0975c2e70328da4a0ad2b8bd344a8171c2c500c55b1c92270230c27 +S = 08871b6791f7d03796a3aa537fa820f0eac8f2463c9f918468e7588b784 + +Msg = c37389cbe3f46eeebdda343e354ccd543e96b0c2a87e057aa6b9c4895a403de706d658bbc9066c140e50fef4b56af2db1f42efb70b8021254649983f1e11d04d6b10169d5a1c2093b6ab89227b88a30537c776bb7575749c3ed87bcb29effd8e4f17915b4d5dff6cab9678d88f33abead1e73dbdc5c3307ff3d3b2d5fd7bfa83 +d = 040ea4a37b388f0cc464f7e2bf92173107b268ff77a8acf5f517b4ec0e4 +Qx = 08acee84d29638a7285654d20f8e0653c7386140aba0bd2fc157d517643 +Qy = 1482ba5ebb82ba46654aa1eaa6a5f01e030177318921a0c99fa3f6eee9f +k = 0a6fbf938e9cdd009c838196ffeb61f7f545f7e7e9a6cb18d1f595a87b1 +R = 096a80172a7b3b65c0a8acfa8b89cedf9cb19f6eaa5d38436c300b7c0f4 +S = 0b7bb96ddfc9d1324bea96836c557cf88d6ede9a93ada8fbfdfcfe56244 + +Msg = 8884def8c3b9c5f856b9c2352c85ea71aae3c8d0e84ca74e70e404a21467159fc9826548d16dd1ec5a75dc2c23ca37b30312f25e1194e0f9385a0499db34c855412bbf58979ffce7fc3afeb7b8dbf9898df44023200d809f520db99eae315b5cf85674fab008a20340fae8f6974034fd3e55bf08c5522a460680218f9757e368 +d = 037fc7898df9b37b5390537352f5c0b8de22659166c19d7d4df31c3938d +Qx = 198674b40d2a68ed94d5b2c51102393d1332404f75187130669b9de0df9 +Qy = 13ee77d854a60f1aa74041ef1fb58727c09f13039bb4b33a818dfe9af2a +k = 0cf92eebec59605b1d45848f5d06e93ff2767dfa282929208ba801a9fec +R = 0f7bd93dd4df06219fb974a4e85030840c7d4877f131adccbd98cbd25de +S = 0c2c4a864459488eb5498a06b0b56ce7fc98fb29b1eb9b6238da8cc8f52 + +Msg = f1fc154d469433f56c2bd42aa52237a4a4bfc08fb6d2f3f0da70a62f54e94e3f29c629c837e7adf0474fa8f23251b9b349a16848942c0d9cf5db1d0fd99527020dbe21cf0b94a9aa21f376bf74da72d36f87b306b0696771efa7250c6182b426a4500ac14de4a1804b38db8d4f3beefb8c9bb619ac82cb63fb37c2e1d22951f7 +d = 05d5069425e7a9925d2cfc6360a708147b2c1b55ede243591885147ef3b +Qx = 1f35f161ce0963dca70066b3a6de2a74ea1941a27cdfabd9e433d8084c7 +Qy = 1d5d9cca5b741b2321d8511a777fcc2515c99ff8d13ff20266a163c94b9 +k = 01b9c83d36ada7e9367790ee850163ef4420104e0dd3299ef6d65191d7c +R = 0dca4e804bf74aa496c15025acb4232c637c9b81e9e26d6f2065d6be21d +S = 012014f77a4ddb7b266abf2c65a653988ee6f913e700f3f83f3e78c88ab + +Msg = 885cd348f7983a0721f96c0e866821223d3e5a95178b16d18652b4062b1b2278aed6f54ab06f7e37ae6ce1020aa3eb812d215194bcd212302da5b971fd86aee1dcb23057dbedb569bd0bbef80df538da69ae2358cb03bb77c64d3ead475c8c5ae5bfbdd75684b421a26f1a7b0c37548fa32d805acdc91230dd70a48232a12846 +d = 0ffe3e7b82ca62b96e057ee072a4718ca20a6cc9a3e51e4fe8ed7b4b9f9 +Qx = 10f774adc83c1893894855366f1db1962bc697b8e1d047a01a08b12da4a +Qy = 078c6ff634d5dc8ffc4d8b1a53bbf94046023095a8c2b41618c4330a4de +k = 005a4a50de4e97280d6ed1324214d91b271deb649a2dae18d21a0182022 +R = 04bc8ba9ffbca81b5f19f0d8b1306900ee642bc5cd9a9dc9867a4531b04 +S = 0353567acc062b83459017c70cff4f3b8ef0925032b51d7300261408549 + +Msg = ca3b0e2f1c7db4e73c699f06e432bb0f63705ba66954bec4a259bf31c161bb4861476e2f2f7dde9d841d1ea6bd0990cc793cd7a10432e38735c3eeda7a0d786e8821239bdd6c4972c96c2cf68ec5b935391f963a50fe16af2719c9029943b539ff0f1f5645962a6ac46c75d2037fa0c7cd46deadcdfc66e1ddcaada3a376acbf +d = 007a9cb5ce27c763646de414ca2a4dcdb774d69ed2bde7a817baddbc9de +Qx = 086d4ac1e3d54f7c154c5370f5c9a2d22cbe8f794df68974706bdc9172c +Qy = 17770a2ccac923423137731a14e97f6ca65a8cb3642eceb4e70c78ee929 +k = 0538b86e0a899281ab56d28f40bf3b7435f9a57e334a3269233766049a6 +R = 007ceaac3aa0e260c371843104f5cb91a057741b38889ee796e69f920e9 +S = 035eedd44b036b843deadb8e8df9d96b16e719ba350a634553457ae71a1 + +Msg = 4b0a31b746763beee77cecd318b90acf50fac4172cf4bfb354e5a440f651cb89d7a515e09ab19e9850803ab9167c2aee3b395a5da10dc9aff799d73756dfb0a9961d93bc32f15a96bf13962a03d5bd42ddc8b5928def7fc48fb063f42866fc5f96cf88fe0eb125b7c01906ad6a7fdade28ccb0a421ceff50ae03a974671b2c27 +d = 0c03fa9e38dc1c697f70bc6381f2bacaf860bb5632fc837f728da959ac9 +Qx = 195f386c7efe108fd1d580f0a77031e180e45a23911ba983217207a904b +Qy = 1a6837095a64f71ec53ab1c0d9a3a39d69a514065d83f1af26870e41741 +k = 0d4f48085b367787a614b57c06ee8018b2e95e989c2e8cf355e71db1091 +R = 0391710f815babf07b6287b7aab8b9d2ce04bee2a144f4d4a46fd17cf77 +S = 0ef29cbd771b8a6f414ecb73b7937ffe0a108593ffc6899f28d4030a9eb + +Msg = 3011d42792b21c0f1719faf6f744d576f72c5fdfd22b1a520d0e8d47e8c2b06823d853b13c9fa039fa30a6f2e3e27bb2100c6a35f55703806bbf0f79b09d0f629f8042ec63fa04062f15f2edb92b19237980005566f02bb12a40b4ec66e4ba6c599d928b33f72d7437c0e399a8e6a9068d1fef24917fc4f9ab5464ea6684dde9 +d = 087dba00e3fe4802e01718017510094924496bd2785d4ac1a352c530473 +Qx = 1198518db2d1255aef955b9b80471aba60cf6d8fd1feae6d8e048ab1403 +Qy = 1833332a116214e4d9fb37c8e0ab7552b87348434a67a0c41f73972dc9c +k = 0378578acdfa572b1de4e032158b28bcf00ab7dbaf07b0e772c39603216 +R = 0be2cb45d527a7685139290f1098de975b69957fff2c5c29059ce417950 +S = 06abf4afdcd2990121723b94ab8145d01cc4917cd70416620ef100c67bd + +[B-233,SHA-384] + +Msg = 05a5d3a3b79f4e51b722e513620c88092a9bb02408f5f52a32e782fd4923f4fd3094fc5536caf4b645d830260eba91b5173f3833dd65600fb9e246aec968b1f6ebdfddb4059fb2de7e636ed60bb7affdb74aefd158e54485d5f26be373cf944c6570daf8fd7e4b77fad57300667d6decf5c65db99ab8763bb4ecbb09fdf47e3a +d = 05a387e7affc54a8fbb9157b5ebd400c98e2d7bd5c3e095538987d4f8d9 +Qx = 1a97224cafc063967b25cd1a43283daa5411f3eabe9386b8b14c9768c29 +Qy = 02cefaec5141bcb084cbc9aebf28fc59780897ad1424fd439eb43eb911e +k = 0fb7ec3804654b9c3675f7b3c427f6d01f83872e96de2742e59c93151fd +R = 0808d829d78e65eea47122c92f8c2cbf5a8d6717a057ef1659fb6f8cd3c +S = 0ef338e09dac0b12fa6109d15924efb694a0b672afb4ef05f4e6f2f7b88 + +Msg = 247a101c8196eb93a440280650ad463795690bc620e46e8118db6900a71eb493d03fbcf2f73a79bb47aa8e2d8c87ef70e4cfae36fae5c45fe247d8cd0f7d0718dad106526945014b4f3bec324897d8e1fa2f457b8a68e61873b7fa0350fde3b87b7b001c13953c2050a24f71fb77eb455053e49200ebcbba7299485c0f1a40db +d = 0adae709a930d6f5a5c0e3d8ef4aab004d741d23f0ffb8287f7059890c0 +Qx = 1541eaf3dca942957c48d693d2eaf2a456646d2fb3eb8df1779b917a9b0 +Qy = 09737958276dc31852e57063119f1d2d061616b6a2fd35b4a1a3f046954 +k = 0390d5ed395f8ee3478c2765525c235587dbf5bb2316df3a1e8c664185b +R = 0ebcc4f84bf2deb9b3d669158998fc96d7516580675e24348ca58d70d2c +S = 0b99462b85e6ce6b46e5aca221250ac9de7ccf3e63b38919b61700be866 + +Msg = a16678c71976a3ce3362ca379b3272b92e8ca7085b43752473db34e4d6b61eeed3875f49f3328366fc9d0644824e0104817de458e4c1036636b18b83dbaf063f2f99818959224906571c7b28873d9c702360888df151e9ad1a7003e6130033203acf8a69889be6ebd90816f2abf0764f10be68653b1e56766ecc3150bef8b042 +d = 035d391411e6d679751092c4ea5a079c591e77ebdcb57c1d9006ae70d90 +Qx = 01298e6f1612f90dbd2eedadfa8ecce22dff1da2d1cf057c41bd37d4b06 +Qy = 073136a1caf7dae2aaaac571a900135a51ef031643e9d5f01934333b864 +k = 09e343003670f61db85aedc0249db21953d232bc45488c3d6ceaa6072bb +R = 04ac435e88f8e487b9b217e7d68fbba9bdea0b9685769878818f25e661c +S = 074d8f4dd58c922d7e79f30950bd54c10c1cc52ae3b8d00b675c8e501a4 + +Msg = bc2f080a7f0b69a6b142b8f3fb481a43bd71d07418df4f3b802568073c1a8d35729ad197f34a4e941a6dd511c63f201d1f6c34a1b66545bd5f43508c10bda1d6ef60ee5bdd25dde975e50c61f76cd36d50ee3bd8dfa2dff59524db9ef12f1e28d109b552cb42f021963f559c843476b5c889fc567b7840297c5a480e18c221dc +d = 084e79093f1947d6ab9cf399782436e36ef87c59a4c090930c9a74ddb10 +Qx = 08e756774def210e2d6f76d6e4b0b43d86adca0880f017abfc911bafb5a +Qy = 147e6a20c1aad897829339630c5edd327ef9a7e40795630504318cb71d6 +k = 0ce780ea99a344d67de7921feba6ae062817101068266d5d1a140d2b49e +R = 0fb2474b854b8e5d6920ed90e69b5b386a1b26a947b1cf28a13f7c5d3ac +S = 072722017a67ea6754873f833fc51318d41d6ef598d3ec2d3e0eb5bf41d + +Msg = ea71cede8b63ddc5648eb244184bae265cd65d50f77a9e25ff93f02b132487c08732544cb88936d4fff7c0fedb39685822dd1c9be1158f647c605c9bb5f6a1ae34722fa08882c14b36b6c93cab33c9a269c7c10f755b6453ed045ea3e56f29e95a9404ba189a0b48848120392b4dcac43148b706c3d9e4c03db410cbe5dca3da +d = 079b6be015b8006f86fd81c2792bec6b42c08bee2d295cf9dc214c326ab +Qx = 0e24338d5e33ad12d41eb623ad0905f64d5b75835fec4e693eebf9bba10 +Qy = 101b4297b5b62fcca7c61637a2a57365e911d3bc7eb0fc7adb0a9dc7bad +k = 0f06b001e5f874d16632e3c8d49f13d70f48ed4eecaff9d3b741f9d02e6 +R = 0de16d8fd7bb1783a2cc4b9ac1563eff3f87e4e6d75e6a32a4aed1ecb02 +S = 040bdb1197ee8ee51e4ecccb8d42dd985913809c131aa9224049425a052 + +Msg = 319b41d16e18059a1324c37161c937e882192cd949c420ce9c59208a0ac208ebb06f894a7fd78df2a3c5f23f25dee6595d3dacb25a699f115dd482ccd36fc54ba29dda279335424c86b07a1b1fa76a5411bcecaf4d37065b229cdce0bac75b666c6626ec37a716e9841be93c907f87453ad91d36846561f284421a89013b88c3 +d = 0ca9d751a060fde64336cdc88122819f4b3cd1b4e7df42d495197787894 +Qx = 09549785f4f9c71f20133f5a1d409b244df55445beec404cf8cd4d2cadb +Qy = 1b246647d7570f052840d4cc01182d1dc3bf357b25e5966434e1c3c2a30 +k = 09e99fe741cb23f7eb039f5df8414d069b5c2e3c144dcd6cbc6da56ef43 +R = 0cf00f519c18e7a0fcc84c1e338158399f16929ad89842ba97a4afb5bf2 +S = 05854ee1a6aa5a6a74bec0b4696e80aa275210183c86f45dde7002d7ae3 + +Msg = aebeee215e7b3d4c3b82db243a47506ffbf2263f6fe9de5b69286e8649d9218367c36ba95f55e48eebcbc99de3e652b0fecc4099714ee147d71b393de14a13e5044b1251e40c6791f533b310df9e70a746f4c68c604b41752eca9ce5ce67cdc574a742c694ada8f20b34d0eb467dce5566023f8533abfa9688d782646420c77b +d = 01dde4b2d49338a10c8ebf475b3697e8480227b39bc04253a0055839e9e +Qx = 0504bd3a97baf9852d6d46ef3db78ee7555db752120d020cd056b1b4e50 +Qy = 18dd305f6a15e91fa46d2a6d30f2ec8fbe2baec491e26d9a2ac81155c85 +k = 03b78d2772b8ce01a00ffe2e6be2f9e2ca2c89ea3b29bec6d6cf31afe33 +R = 0c0c51fba155f98900eaa2d2935acd615e917f9dd979dc8d92f1d6e00c9 +S = 08c8354f95e24ed13d8ff3755e1122dbb4117c76b21b3bdc7f4dd856f8d + +Msg = 8d353a6b6f35590baef59b638914d3e934d0145b045d221d846517ceddc8ff5e3d28826d3459f8ce1260f705e80923f39abc73d5949aa7aa8ad1734be0e992bff0c9a8f4cc9bdfa430d4cf52e29d3737b0cd3231b72b16e15e1a9040b832e4a920b4a1d94c4964ac6c8abb75bbbdb10825f882ae44c534c7154c446421a04d87 +d = 02c8bea2803fd746c874fa110a716538c179c82712f38d33d0f6d037e7a +Qx = 0a034560353561cde19db89dbcad5c9dcb74e239efc604e86ff38a0577e +Qy = 185e0b02c48be2e90c916a7c8ef2b41a57ea8d4f21d8cd3a0878a03875b +k = 02e39f851c57643bd799c4f3b2fcc5eec8ff7f9e9e279efa647f969cc6a +R = 09b2ad7efc7ed60d9cd3dedbd4159b1e05f05ce5ec2d2cdf7a0e0657482 +S = 03fcbd4ace6a140c8bfebe36ff30848966bb0d3eec323cc8ddda55faf00 + +Msg = 847f134b90f10ba3636ec24f36a94111f26d58428fda5bba4501e58c7bb55809f52320cbe9e0df55af1e40bbac9f3eaa26a55d78b60621d4356d090d98363662f406367601eaa9eb9568b1a1b319730bad7bf6a7ddf1b45eb6922faf8d065c540b671c50df758ebf8c4aca6f01878e5e0012dd038c58833e2b13ebdb9a9f3fc3 +d = 0b9119b3b4b30cbfb98ddf0a4f6953417e515fcf0e5a94e83ebc1d1d14d +Qx = 1be65d340f7e99067bbbf961c2b357e1fd47a74393cae5f93a40c5dc280 +Qy = 0c04cd8ca3ee253b99e44ee6bc0e52d2f016b16f59c738b9f2bd8c1b9d8 +k = 02c851ba0123ff0543808931ab3857b5c15d7c10c343f232913f6e0c92e +R = 0ba2b33550878e223cacb80e45e382dae84e76bca5a2ef8371b84d08572 +S = 08c370f82506e97cc15837f59e9779448decbd87bde0a463bc14b18edca + +Msg = 99d23950493bdd931915e9f9b65e4cd1329866c0071a19d4f7d6fd190689275b7b10fc07503dd1c27a4da274dbeb3aa5cb0e71e9b7b03fc2697729b7be913756e6760098951d7015df181cf14b1e0b954e6260276af553e3e59907794b863e941950718ef154669c5c262946ba120892e0239e05910c2194f712db46e37e53b7 +d = 0f4ab2a573f3771d1e4222e251faf14e06cefed544e804c299c9a8395f5 +Qx = 0b1f973d6495d277e24320622b9b99fccef8eb5c1c6952f35b82d4479ef +Qy = 161dceea4d3c9caa4f640f51b37fcbd5b8932642a94c8e7aaed5db17fdd +k = 034ff28a5ed6958514c603b3af5a991e2e9b4cc2c0a7aa73ab2d70bd05d +R = 01abe4a7b27395a37089f91eab27ccf29001ced1bb3348a6f919d466477 +S = 057449e55d3f2a4004d647ad6e8fbbd516adbb4de40b1a872ad8ecf67e2 + +Msg = 7bef2487bc2bbbcbcc1570bbd4ed437c0dbcbbf63f666a3355aec49ea6ef593da25aefe9ae0d94db50692475425dee3c88cdea975794ac69142c25732f3541457d68d9101c8be069f2b515aadadea2019dc7abefa6c12cb3f76d9f4b5e46546f77eaf636aa8f2329130922111151a4df913d18b7cf9d0308f01ad84d878adde7 +d = 0f4649cf30d4a5269296a45977de2652cb06d3ca2aff4475bb24517b927 +Qx = 100ddcc8e09ba2122a6535c6a0a2dae83abf9e17687b5f6aae7ec6a2df1 +Qy = 048f5587360ee251925b7ed02de82307ba219a707705623727f98346a26 +k = 0a38b2bd0e9a5044db19d4312ec88d19ce1a9bf0eede8c357f898b0bc67 +R = 0d0ebabc8761ea215808a2c3035b14b614f64be0c2741b3d7789a8659ff +S = 0f9e742bdca44c11bcab196f910c0d887e90f250817ee7027f6df8207a0 + +Msg = 87c717eef6dd3c7434b2c91de05723783bef603d170f654b49a04b067b077c405d2d757ce780101b930196ca4261efcfbd3fc1ebb762cc0eecf101072988aca508c41581936526d3f337053000dcf77b16172492c5d654c6612bbd2523a6ad5966d7091697a29ce882fe331f79a7eb59e5a3fe536263083cc59b8133bfd33c1d +d = 0cca24ad914c24c011f41f80d27ea41caf41fcc8dc9dc6dff5248b2b474 +Qx = 0175b73db13324a678b8afe086944a7ad257cd33fe9538c59b9177d1064 +Qy = 16a98ac9e0ff59de1ad94b50f8c709ccf4342f983c7530be64c3f1548fc +k = 029c83def3a5c386b0bc3cf2663b8f4b02f26c6e3e14fcb17e9460087f3 +R = 061df783609ceb355aba3b1753d38f42434bd75c8354029966e7a788be0 +S = 01e8a093f53a1d73d5a994b97f2b2f210125ecd3dcdf77c68ea3199856c + +Msg = 9bf48c2aebf473b3a4a928b3b6a4d2fb7e9193c9e60bc2067f9f03083a8cc7b892bdbf05601118bcc34dd283e7be996bf19b0bd36727eb9d65276b6517bf0c77ae0a9091e7a9e46182a2586eb22324939801034e5ba94ba30d1bde7d8fed51eb71036fab6224f8ff30a008422efcff7ea239ff23b9f462777e62b41b396c5dc5 +d = 0f5e12d536ef327e3b0ba65ac5fc3f7f4880f5968f3340eb8868c1d47da +Qx = 0b2910f5de9475486b3975ce91c02187e8803e68586f3a1df14df67648e +Qy = 0f28af5363ed851c42daaa810afa1fd0d2e001da7764671fd44fb6737c5 +k = 02a018753965bdfda98512c7f9da3e9235a4a77aab9804437b652182347 +R = 0b6fd02b2d84b7baf1a5eb592cde667ed6d4c2c821ca336027a72d9abdf +S = 02253faa5935885945121a374010b2257123cd5db4c54a2aa0e08c8197b + +Msg = 716d25519ae8f3717da269902be4a7566d6f62b68cd0faae94bce98c8a4ac6f66215ebac5407d6f64adf9d53f79f02e50921b6f0e8c805926a839443d30d9294eaa802faa7c5471d81fd1db148cdc621a8dd0c096e06fb0b71943337d5325e1bca77062684873fe904ed9012474ceae5b138e079f941a665a995026d13d7eed9 +d = 08c30d93536b8cb132277645021775d86c2ba8f199816c7539d560ac6de +Qx = 0d69332763cf533d48e56065e1b5255790f8c0eb23471fac9b945e62195 +Qy = 0292df8c77d9a6803f60bf0722ed57ae2aa3bc816403b000fe2940e02dd +k = 050967928d6089da5b16c88b7927de210325c8d8f5e727fa1ba3bd95b5e +R = 02434697cb5c2ad95721943154bc81e2ae16332fa6629788f505bbc1522 +S = 09a5a6792b1b9c2e200ace5a3d50c04f69084dd9222c021ef5fce14d4b6 + +Msg = 01e76755007b2ee5ac9e1d4c8adabad6d0f9c1c08ac6e2622b7c1ead89bd3ad0921b9525b49a780a262fe8fc0904a80391717ad7cac9607de55f7c744af8a132ec45ce79723f4a4a8c8b9ef658b360bd3890df164c9f1cd74eafb74feea251a34514ff2a57ae7a6d4bec2067cbf6ee4fdaabf13721bf9ae178b9034ac5e9665b +d = 0fa3f15a506ccf7b50bbbad0a54d3223f5a95eb54f0d1f4e5d0cc21469b +Qx = 0e797527d57fb3a18c71d1e82e7935e37e719439952d4b972f0c1e0c835 +Qy = 0a345bef4c5015e97a148b8991bed4b7ef48947b12f316b5621e94d49d5 +k = 075afdc12d4d50a7495f5a7d309696dca23e9356a0cab11c3b3d7b8c54d +R = 0960ef460000fe8c761038bab7e29d665100494d0874b6556862c2808aa +S = 08d3c004426dde6c18b1c9ae00a44ac947e36755d8c40eecf47bfa963fe + +[B-233,SHA-512] + +Msg = e95abeeb2c51a8cb75ab74253dbe130b5560cd52e2a63d501d26e1458aa568aca6694be91eee5fdfcf582c47c1c727084ee2b2c810281cf9b095808bf7e7c668eff00a6e48b06df3fe6a445e092c24d5687d7d89acc8063275caac186c441bc697b2f67aa71b03294e1adeb7e557c296dd91304ba0587cda3c984619f1eb4f2b +d = 06400a4830889115aa88b860b3fb65905b01fd126c4aec2785518c2543a +Qx = 1a2051662c1681bbbf6bccbd33c44c7c7fc80b81a1bce14caa36a73f7a8 +Qy = 11583d3ba8f22080488471d8103f868100a97af94809b58bff1435b16a9 +k = 0ceac6e5d10c55888b9ecab8d3f6ada7f4d0bde2f109699157d194efa42 +R = 0c148f2337008ccc3e61501dc5df3ec95d3596d97eae96a7ab085a915d8 +S = 036d1debebaaef50243005e25c791b9674cd6fa986dc3d32e089fbfb2ec + +Msg = bb8d8515365d240b2071daef0d80558fd3d0e059be9f6abb7b7a0a5f47e2ddca7d1b3b5101d5c583143258520ce8db0a87f877a395615c9bf879ef46f2f20f68bbc9706f82781fad69019396b27f292cdc70fff1772e90205a2225f80889f9daece1d03914d8776ac5bad24d8fb190ba10a2ca17768b918c2e079d83734eb372 +d = 0c7b73c324250f14fac0edc941f79bdbc6933ee8f64bf94b847bee5eef6 +Qx = 1af7266ee56bf0518f2875d4f4d9ec508a01769d9c1fd0a885a48bbd80c +Qy = 084167ada99502475478465315bf8163870a9ec1b43f15d68f0304ab03c +k = 03badc9b8098c3b4d7e943a2365093028b579519031a8643b50c0f81eec +R = 07ad4fc96c21963395f56eb63e1b0b4d2c93d827626e7bd4448697ded97 +S = 0e7504e6a9f662472e3e6f18a40f7645922fad2ef7313d600a5a6ee314d + +Msg = cd8b2403435fac9caeffa21b55eaba52d7efee0f89df7142340cdffeb89556303ca01a800429397e2ff6c746743b6bc60a87133274282d4cac02e4ca90ad95d80c93b84163b96296f67d40b2a1124b2b6534ab6b60fdee312fbcdf468d0e84eb85fce4ff360136bb31ced3998d29cfaa3ae685e638ee272058f123c4f35f8b6b +d = 03db7f28e161abf52ab0adc8c4c8544fc989af081303b8688f22b7b2eb7 +Qx = 0ab94312e53832265b929f3d529bec33dbcc5c17b969e0afbe2d559ec39 +Qy = 1d53b2c1be229e2c224e6e9fcb8bb0f044f3f9f5677c60bc9454f36eb06 +k = 034a8f980896284fe6d28b0b49703f1384d799e3f11a04b1e62da12965c +R = 0e374fb355f30d7e427bc5db99ed76a914d6e286099c72f28c07302c741 +S = 08d5ffd41f8a1fd3de6c433635fddcfc2b21809d91496ac17571afbb856 + +Msg = 4bb08eeb202564efb5bda40777d71f1bcc4c7c10b611e803e5c570876f3e319e9e2bc2d32031c56a32fc0d1fcf620d4e4377d881e9e1695bcdb78acba370b849115b86c1c4b83edfa03299da8e7fd14c7cadb81a8e4911c8e427e32c8c9b67e317575331967cf58085cff0c0d48ee0b8e7dc0b49687bb1c70c703a5dad08ec81 +d = 07e9d2fdd017d6da6029e88f78927d9ac9437f542db1f1fa99e32bfcf1a +Qx = 18429bf08752aa470a8f0801170a7ab96adfb168ee8212d76ab0b994e46 +Qy = 072a5071ce308d7daefb3e8f4da4681842ffe0f35dd8b071f0775c83f82 +k = 0a0f330e011d34714875500b70c881ff6b1c9e96da930eef75ec78ac120 +R = 0439bcdb86d40e8f64db5dbead95d85d6a771d811480c5765ffcbf75422 +S = 06c01f64e2812d18b0946ea4e6599e8cfca0a2b606c3c35c803ef2cfed3 + +Msg = 0bce683d835fe64e6484328aa13e18b0956f6887b5e4442fce36ff09aed015889794e79da8aa60b4be565c78685674c51e1e7ac60db6a763c777198a56e382a03aff8b40862f961ae23e8b8683b76a5577769422418972ab0049119382edde9e752b42e8b93f403c1ef8665d7ce8530ce4ed9ebf6d397827cba6b7645e177231 +d = 0c94052760fc74c2b405ee4dd5dd2a7d38ebc16df9cc32df706075450b5 +Qx = 1d2a5ee02d97f82ea9c8833b825cc57b0cb51d3f2a2cfa7577eba676eca +Qy = 149c68d98d0e9cb242962326a26164f3e3cb6d81b51f281474b0f8d333b +k = 0fdd3ade90da682676d40008cebeadb9b2378d8a821e9e9428018cdc768 +R = 0f6d244daea95002daff2ff6513da694eee58f8b6c2d47ad121be87559a +S = 0b04788fbb5655a053d0fb7a38c39e1fef68ff17860442ec8b8ad049842 + +Msg = a6defc770426daad4dafba3bbd2a69881334f7c31269b297e440926db54cdad3fd7ad200f5ada2b72ad221ad99a06ecac9c2563a8deed89f0d0896991d1a652f6fa282affefbdb1c1985652300d1792725071631d75a182b683a48448063c7d2563ec3d430e0fd3acea33a35cd38ec0b5b07af96af71d0bfcd879d9864ededf3 +d = 04076b93487c2da8aeaeb4725fb53b7b41b465315335c18c6ca041175b4 +Qx = 158755fd290910498f6c8eed83bcebcd1fcafef4878c860da118efa250c +Qy = 1781fdae501c2c147eca2c6c809d9428fff2f853b57c7d6add70fcfaa0e +k = 07debe933553ba3420aa06e1bc52a1653f8a19b59c0bc9c47212389442e +R = 09e09c6d96e33c845535468ec7f5b79cf30123538011d0b5ffd935d168f +S = 0963bbae921317666f5852759e9ebf05cd026a5d9f026942835ff0daeb2 + +Msg = 7803cdf4758c199962b62943f475c6c31356f5d9b997a12e21146a2399cd0dd3b97a860b2ce639e2801571599136d4a8cdbfb12fd1a5ce22374991e090533ff42823a2c58d2076b772814eea7fd7a1fde68263ef912681c72c7aa3e5a7cc44ee8c65e72228b7631e600121ea35bfbbc783b6ae3c0c8f80198ada218be533760b +d = 076ddd73ee4fc1f5e6766e229cc7236cdfce312417ea291f7c3328d5ab1 +Qx = 15185e029c0d4eb5102e0fe900ef3c921acc744feb44570a288015d0908 +Qy = 0ed56bf93394a434cd84b521040d40452bb39755da5e273a05e8c0ba792 +k = 084e9e4a9c84a602c18bbb6b183d06969c8b8538e2ff901f1c2794d5eb5 +R = 0fde8e9b1959477ddb3423661df1e7182e4b583849d6d17fafd7dc5406c +S = 01a12bd30e9c8b74912c670c0845ff5ecc77f29797160bd4992efa61f4c + +Msg = e789461e1dad0b6e21abeb6ae2e96385549d1bae39415188c8f833233da6a3328144c97ddb36e0ff4d9e19d84f869e79e609c51b32de59892fb0446dd28cc164a3e53534c950d26f87fb74e682db2038cde778bde06c3ee2eca2a077d8fcc2b0332e352e0e7e6487444a8ad60e78ff213b16fda9faf374dc6d27b7a3c4c6d196 +d = 07e1f8988ad804aae7d09a99be19384cc599e7652c02c391542be74b17b +Qx = 1fa4751e507740a7345e06a8964022fc6caa901cf0c2077a2c0fb86be8a +Qy = 0683c593a0bcd123d958deb6b430d49d5a2386d44706f4149dc526ad896 +k = 01d288de55b90dbe72cd8f1f86a3ffbc2902f4b5f0cf4e641d32aec6f20 +R = 0048d16d87dbf4fb8e994dd874c10d5d16846b9ce2cbd43d09df62ca970 +S = 0e2ee47f422095d629c188df97e2839fc6239b9e2dc26baf8161b037236 + +Msg = 9b58c145d1b6c887f2b25fb672cd49c3a1117224be697c15182d4048be92968a6500f8bcf747fcf33145c13a8d72e891a6e0c4c7310c2b62f3181bf586fe32f1ecf4feee8c2c8bf6c2bfdf9d5f88981ce080095c93e49a772d8e7b59f9cffccec3ca2f212ef4c6748f64e224f4f098334d83108bf6f8c7b43c5eb549f1526897 +d = 09b2292b0244c2aabe8b43d95039984d504ebe05eaff318760e4dee739f +Qx = 12618d89f50b7f83ac470705dbe9ed81beb03929732a3f2aa7a636eaf59 +Qy = 15f0f70c808e053b112a8c32ee422aac2b926c5b6a279a787fddf819990 +k = 0fb38174a83ceb9236fec8ea39be2b3c77c3dd2cf42d140e27838202d08 +R = 084941856a387a56022727f81a939d77d12b01dab603ea0cdef6d9cd6c0 +S = 0bb9fc30595f94d664a590ed4f163e4526809819baf96bbee629ff86bd9 + +Msg = 52310a901fe9681a23dd6e02f12974d57f2c4f653322d9a0ff8b338cc6c2bd9f4765c90c6b3c9fb17df3f492e67d204e39d81a8fdeb92c852a1dcc6151ed6c63049037235c6751c9a902748163a567b714725b4d3995e0edbde03215c645b1a1da3147f7406245432800c50f823a1f991c863427ff4c68e4e16d1b106ee40dd9 +d = 07ca463b50fdd92d9163f1c2bdfce2ee45ba1437b79162e3e959b814cab +Qx = 08eeeb146216c73ccff0096e1100008f8b1f3f0c5754c0abc4ed39f7f63 +Qy = 18c9228b11888edd66b2e661284f583a0e8d3c3e922932cd9fc1568f959 +k = 0025291ec0dc2b0c709c5e69695980564552545c2497636b814aa049ccd +R = 098dc98457ce6e69f77123d5d2460ff569786dd60fe07e847ed5bc14da9 +S = 0cd320afad2a4247fea5b74d78dc3df8967ab3159b4c8b191814d368dc2 + +Msg = ff419c011601cfaf833067cf28dbe6e935ebeddf8b5111a97f6eebf3bb28376334f329cd877a134b074790a073db766efe018fce666a34650cbac285ae856fb6b3b8b96877282bc11cd9f9c8e510ed1f69bc2725a44a1d2b35de1edfd8bc9d20c7525ab0bbc27662a7cfc1bbd1e0f4fce5b88411521e3893e027cc8c73acdabd +d = 0c3844750f63fe0c2e930bc38fe88522f4e72a2fd0db9778ade20e939b3 +Qx = 075acb00b5999f8b272a15a2cbdf8cb630dc3eeb1e78e58f58e467396f2 +Qy = 16711aca424ca335878d273eca75d804d3f009a1f3628568530ef265eaa +k = 0a63e7a20d100f14b8b709f0a6c383166c2151a36dc471f061b0f20dac6 +R = 04063be9d8e4f0f9afe0c79374c69b36910b5d2b1010e0f4db2e4cd23da +S = 06a6eb90659aa79e4a2360ea9ffb99a415175dac6c3efef104bef6fd57e + +Msg = 05a89c4824c5de66587875011e704bc6e06e991ba8f3aed331cfffe55aa266a08c729f77b8d082dca4d286b2d451ea838d726cc2cf298fddf2d7376714c5e37b64506f353917caec525a1209391449c078c5197a371feade74f8fc8a1a1d67576edfda13c14ad324342fc0b09277941dc072ec0d39434ff1cb91fc59478fcde7 +d = 0a3bea235dea86506be4476eb7999dcb8e584a34238c4a894ad6823b93f +Qx = 14093a072c21c44d1c4beddc5c8dd9a2845db0935bbb4e1c4edb0aee032 +Qy = 13286ed584deb744c9c35d7ae7eb9cad1c7ba2b670642de0399b230716d +k = 078eda19f0cced2f84c1a7b354e5a79bec035b8bb279473f32d60f5d17f +R = 0964e817f0cdc251eede4157a9bd830c476627c3f27d2931b4f593b0178 +S = 08dbf34e597ae06ad92b13900a4944e54a5bf0f16f586baad157da6dc96 + +Msg = 13e6b5241365d9d0ef9e8b05cabb3248afd221ec02eab92284b98bda3d9272184bfe5251d35705defba5085381430e99b33a3ab77d7870e5102757d065862372df2434a25556b76e54ebc39d4e6c3aba5cd6acf0c335756f7d9385c1068d4cfa37526a9a58c0ccc7f87a8189176c5d4f201499236058ec061357dcdb5acdba40 +d = 09a367cd1cffd8dfcca179e167ea437ee48e9b6f42559dda9224701d3f6 +Qx = 1052d751901f6f8e61858d3b15eb59dedd21e4e997531ef65622d575029 +Qy = 112737be67ec621509d73cd613d7b448035397fa66eb881f90a6d531ea4 +k = 0d8dd8f1cab623ba6a4e840962fb31de97a4d14aa6dd34dd21154105030 +R = 0a8276d0f069f34c60b26a55d47df69e4c9ae2981afc59e14b5bfcaa498 +S = 09351c4b3a06b839eb2e9f450d9c3d15efa45509886ea3f2610ee1dd156 + +Msg = 139a1a5090b97afb8fecfff8745efacf7dcf91a4393a7b629564e598d58d5be39c05c5830d4c8ca85d29e9e2c31ad0447864e867d0ef4788ac734f8d871daebceda98d449308c2afbe97724c3af8a468f1925065f39e52ba4b7d15728a744b1252a20476dcfff7bcb82aa72c209e72abb3c24419bc26191390ffed340c1b9c6f +d = 046f4ad2522e78b9b35297d28f361fb0ce82306322aedc119251d8241be +Qx = 0b976c53a966e0834d5f6bc3af10a5f12cb6d16cb2303a3c6cee7d35f22 +Qy = 1a1097cb56662265f4f2f52df375d70af086264752477c34c6af522f1ec +k = 06a0d21e5aadcb0c9e3f9fedd2d896b0236dc90e33778fb114e970122bc +R = 068063fe0a31b7e7925cf8959c3486985d98f58224d5f67cd0218af192b +S = 0f11a22ced98173040062ff9e69d1b2a1b5a939eda0a6944e96fc62fa4a + +Msg = 3315e5cda5f252e3291b61e493ab919c20a8af1286d9660cfa2f5ca38b6defe19ebecf820787fe692d04eae8a5f5d37abfb593309569cedf45efd0cecef6951b718924c8380ba52e8ab8c9bfb2261ed5f01cc5a5f9fc5fcdd269a0f122c597afdd9a836cf8f96838c3e8962c1788c3ce4128719b3ef4fc88569643dcad6da16f +d = 0ac82137e9c7a5ecfb8b1a7df9ab50732934566a392a6c8915ee8ca8144 +Qx = 00f7f835f8223fa6c49eaf6650e33dc9d09e1d2bb098925d908606570b2 +Qy = 06e659ce8623767e8214b076d7588746bfdcbbed59b75bb19477366cc78 +k = 080655784e3e31c6a498a63d4d84f7e5a353a66641ca17d4e223441bb1d +R = 07faf31d1d31ef4edac1c63072350536df84c417e0ef808c6be39617e74 +S = 089023aeb53ddd3e475d11c53479863739e62dd64348646581012784689 + + +[B-283,SHA-224] + +Msg = 067f27bbcecbad85277fa3629da11a24b2f19ba1e65a69d827fad430346c9d102e1b4452d04147c8133acc1e268490cd342a54065a1bd6470aabbad42fbddc54a9a76c68aceba397cb350327c5e6f5a6df0b5b5560f04700d536b384dd4b412e74fd1b8f782611e9426bf8ca77b2448d9a9f415bcfee30dda1ccb49737994f2d +d = 299ff06e019b5f78a1aec39706b22213abb601bd62b9979bf9bc89fb702e724e3ada994 +Qx = 405030ce5c073702cffd2d273a3799a91ef916fcd35dfadcdcd7111c2315eba8ca4c5e3 +Qy = 75988c6602a132fa0541c5fda62617c65cfa17062a1c72b17c975199ca05ab72e5fe9c6 +k = 2af633ac1aee8993fc951712866d629b43ed4d568afa70287f971e8320fe17b69b34b5d +R = 165ce308157f6ed7b5de4e2ffcaf5f7eff6cc2264f9234c61950ad7ac9e9d53b32f5b40 +S = 06e30c3406781f63d0fc5596331d476da0c038904a0aa181208052dc2ffbdb298568565 + +Msg = 44adcb7e2462247b44c59608cbe228ada574ecb9f6f38baf30e42b589fb9b157bb0560e5a2aa5523b71cc0d7f583b502bec45d9b8352f29ee1842f42a17a5b16136feaa2efa4a0ae306402940ecd6b71e57d1467c98e7960de2a97f88b43487e4f4016af1292381d70c18c7e6eed99a14cdeb5b3caf73688658e4c5b54c81e08 +d = 09c2804f8cab768248fb3fff8a055b3f4585c00de5c1615a19f9425b9432ea09afba8f2 +Qx = 2570ff62b03a5124f08f752aa71ddc57944cd94197fd286d5a2a107b116d7b8ff1b0421 +Qy = 37714d9abe9aa0a9668fce89a3fcd5cf2e4548102a181a777c9b3f1008ac6e8d3a31a2f +k = 0dab5ef658ae3e2ce2bc5c88a8b8022a0ca5eb8524815ffae414327e3afaea5fcb8a7cf +R = 2d99f82d92c9554722bb793988af0fd0bea776c5608f5939db7c8634eeb24ffd381dbef +S = 27ceb1d01ec9a3ec0e74d79e08024359e117488020de6458fbbcad28b173918fc7d129c + +Msg = cffee6252c7eb6d91d8fe100a1e62f0ad9f862d78ca2b747a6c17b8c9ea8980dc239b3b673310e6e7483582399163e39d889abc1a613fe77849ebc09b4f7f4fe0688b8a9869ae918a88294c7ee199be50ee9460db14725ae70b449d0cb48f30e7d817ec02c0cd586119341dba0b74f0279330807cfccc99c8c340b72c1764a45 +d = 2e625a6bc6d0ce7c06231de827068bdb0abc8ffb57c82b35ee3a0f873b9473905974d34 +Qx = 0458bf39974812a4e0964c31f40083300454104c0d65f22c5688bfff3c256b7ea958900 +Qy = 738dd33e32b9af93ade2dddf4147187a9270543afdfd66a0f2a53d6d3d815ef59795f60 +k = 0a9388815c528fdadcc5d3b125c7a38db57fa8c163ba795ee00e8e307bf760619e705c9 +R = 2481571400ecf9dd31dbd9c905fa1006cd5bc7afae759da3312ead8d5a7dd0c25a37ab9 +S = 13952fa427d348b6347b9e93d4cb2c4cae3429dbea6aafd1e58d5a34805098722b3b8da + +Msg = d058ab5dc07228253707ef224897ea0fcd09c3d5cc91fdce9e03c1c59c53fb4596be2ed929c7455e67ac7f4891aed3eb06ad88f2c4aaaabff045b959f900d1019d706b60526375851bb891494e99995928e4cd51c9616aa651ec77bd7e398916bb9ed3156391bf7fb1e29181e2b011dae2edaf803607def2ac6b194929a57f45 +d = 376ac24e1b86f8a55c052d92a0bdc6472fa03acdcdbccbf7c321ec0ccd97aa0a66b4181 +Qx = 7247c755b23bddf944e29348da82495b4f61d02a482c6111d8698cc77e8dda4c341f20b +Qy = 0f8c199138e1f4f8344facd90ac62d55f3c9a15ba7a672ce40241aa26419af790cf7dd6 +k = 25d07c7afc5a335c2bd7863c1965a48c12f2687b2a365a7c2700b008ee8a0e8e35a68a1 +R = 23fc2837a879b79e470305088acf596eb0159edc2008478cc4c3841a1bd66fab34bbb5e +S = 0a909b83bf77e74511063366ea1d1308a8a544864783459a60fb2669785ab1af8f4cb06 + +Msg = c86f2cc7ab5df5cf1a236fd83792769474cef464032800ffe98a44cf29dbfb6f24088160eb31a11a382ff2a49f3e05e983462f5304272f96c0a002b69af3d233aebe867ee63fa46666760a6889d022c18645b491f8d71b6a3b6b4ef058e280cf625198715b64b025bf0449445d3dd7e1f27153926e617bd2c96638345431d1ed +d = 2b50a6395fc02b9ac1841323de4520292f913519bc0d6a471aa28021322fc4dbcd7b802 +Qx = 696d5ac4bc40e679524e246210b7bb0f93ccfe7dc506ba87be3fd018f829c93e62ad1d8 +Qy = 65953e01d9db8fc5d64516d864a33aa14af023e601d69875ac0f7af92a1e78aff0e475d +k = 0aa25b43329de4e7739fd9134e4f4b3d68a64e55af47a2f6ccf71f518f19059b68d34cc +R = 1338a5dda5fa09667604a6a7666b0e54e6b688b98b31c25d037ddf55ee6bee7565dad09 +S = 00aec025232c16e778f90785ded5348f3d5345b8344b2a762480383777328e0a0b11cb3 + +Msg = c1328d8d2e5b6ffc850a9600bd6482518ddd9cee3fc9140febb72bcd444b0cd7e8074587d51b62cce4b3d4f34ad3355353fabe363369cf790db2df9fdac3a0ec4757e2dfb3b683eaa3e26531691ce765742e1c0bdc0e1028d347b6085fc459df0989c6a144271454eaffe413cae2ad7c8b2371fd2df1afffe56df727009765a2 +d = 24e5889722f6c35e18ca47effa9e415b1ba790066a91fb3c9f7b001ce28fc732b09bc23 +Qx = 7d4a57e6aaec6b51dce5408f6a7fbe9ba9d55f5abe2da55fcf015ca25dd74eb61c1556c +Qy = 2123390178b2992059151afb51ac652b364f562c65451eccc65d968e9e7210921c93c9c +k = 320d2a7f48cf3583e8d7e712b330d40ddbe4b6c128be5a43d72bf57d4227603762de7f0 +R = 09806a8e70742c6c4a9ee6f77fe7a36489e1fe8c442ddf9cdcfa61f019ab9b41241d949 +S = 061fda247ba7c198aa532906bc01d509088d6c2ba0f14ca3ecc5ba36f3595db1df3e64c + +Msg = 7176b7013ea27e94281977eacb976bb31c753bf80fa09680a29128a6fc15234f79f0e9900aff3217ce9be72c378042c6c34fced0158740073d1a985fa25987fb218002e425868fda5a47de51abfd04de34e2b8634cebfbdc98e80f93d94096193eaa82dc8778fc23f3765c7acdad94fdaa272df0ff0f28190c10a462ee78ac92 +d = 056d15b81f40b6378588a5efe43e21b95e18120d514bfdda0e7759a1d0766a8a35ce5ac +Qx = 306cb78fa576bdd2f43cf7b71d7e66a98b850d87ac087dd2e1ff62596a2e8d4cfff1344 +Qy = 3b1e3b12db842e00c2faef04d3e39cdb71546e4e3ecf21eacb6131c3501fa30edcc0b70 +k = 1e8969d6cad41a40d8306d2a8db3290d547106eb59f661e0d0eeb163044a92aee4483fc +R = 06786637c3bd5a95eba5ce015f151d99845255175ebb9e593d912c75cc45723612c4ed5 +S = 384471c17c45ddcf62b588993835bb913be88f7a8e46e52e211972ffb3b7768410bcb7a + +Msg = 4c3642ba040a9955b9d50dcd1c936688c17c363854358afa8ca49c6abd906dfdc4d89bb4cab0bbc363fb5b74e1f004d4b09ec9dfeed4c0bfb482a9061a1f487a3d79195ff7b65a0504bced3a28db0ebe8fcf8ab1ee4a3ae91324d15d890ac4c479144dd5538d2e36d3a587769ee9cd2d5c6f85a03362a022fe0efc4a3902b71a +d = 12fb2fb5bf5f7e42a500154823a174ba2d05af71e3b0cf47fab46e673ea1822f1563def +Qx = 2414d172d74a6281169835d18bfaae91f1f1cdfa9ed451884466e63160ecdd4a2c7906f +Qy = 2d892bb19b47a4fd9d851d3b101ba99acf6d11345596635cedd5d7557427a2896a913c9 +k = 20786f42d77195bea5761f86dbed8b452f858b447d2f3775ba2a4865d738122363b50e3 +R = 334507412368f08bd0992a5d56581ea7139e8adc88abe4bd80dfeefdc7a37a481b18609 +S = 0fd8404df06a02618cdbf6c28610d5dfac9907635d9e5f2887f11a7f18cb8b7ac95b5d5 + +Msg = e471f39c18b081362adc7da47dec254dab8d765f005ac574640d78c14222639245563912d942f3be212ee3cef134407334c8fe3602fa0e1629de5331643d76715dc1b0ffcebd484d86c5211be4b285a31688b205fa988e6c15b36daf396ccdcc209c7dde2a732f5c31c84c7ea041408ebf15e56632583af0131bd7f531b5fc45 +d = 30096c54fd480647e017f8cdbbdef292e799f054e3279d228b09816a757566a744a8266 +Qx = 2d4b28fec18cd888017fd5a27a375131bec3aa7195c0a4f255eeb3616437079e356a6cc +Qy = 27c607dcf0b068418eaa7de8da6f9707650e8d95aec571f7ec794415fc175061b451519 +k = 36880905a376faa594978713c2de1a90c8e27baee65bc60b1fa6508fab5abf843f66ecf +R = 295193f1c64181bdf749987bbc8ff2a188126131f8f932bb8ca952ffa201f109762e18a +S = 381c496b4035bba880225dcfe74fcf101103e38f9518d9427c74a5ec86ebf8f7183694e + +Msg = 8a93fe53e83075c4025228540af7e96a588520da34e3eadeb99a4ab2f3dbbb8f85fe63a3b86c1f4ec912e665ca05b43e869985eae3791b91205afb1380e16c25b74e6793fa63e4a55dcf25dc22d03f09deddeb9042b620434111afe08c5657c7d754af66ad91a1b5423301b1e8e6389a1404060d1b6a99fe0f89598482979e42 +d = 0a1b7e9c8c2dc25b494b5ef3195b294e41cd3c2c35235ab42542bd3e2a52d5826662bf9 +Qx = 6232063dbb66a56e2a92dbdfd9b3c136eade9c214d831691d9b49c56a3962d20f14b8a9 +Qy = 1b47b85bc223fde1918abf6308b74dff7f3e686af9c9d7a1855a1b77984d258c1f9aeda +k = 29b4221eebe151fe758218138535d81182c991c3b7fed93f9a6117e98c1c2f97e546937 +R = 1f8040fad671e2f32a1094413ee955ea5426bc906b8e034d87d7408e63db173b05afbfa +S = 22a353c431a9e9315ff69facfa4e15f6e6ee1be2750472823db31b49b17fc759e6b94db + +Msg = e193a8ef6f454ca1aed38bb67aca6d08280d421b196d89938c0582b7cde74dafd71716f3818940af412d4a7ff3960a8517aee108ae03576b68ee7557d35e6f1ab823d124de7243dd02b542591f62c80d822608572889573e4c9dc62f99d68e07800da6f83cb6f5e03d1f2ac15f90e38b4f25e0a75e354e4b60cc81c0bbe81d39 +d = 059b1a8fb84530bba7a607ee88310e31bc6ea6a6881603567a1081a05a3a9ff87e719ef +Qx = 0b9a71aa3cb4cff37586b1e522b0e332ad5962eec3dfeffcef3851976baadf611ae5226 +Qy = 6b1bf0b43b406b5edc6782fd391d9fb070fa3570d3cd5b2b66d7a95dbc45ccb1626172c +k = 00a77307da9845ec4572a24c9e74a17b76b6393da87a9d7b1b8456235473ff39d243ec7 +R = 36721835be490b5ffc4a42bee3c6d231417f7038c367efd9ecaf7fb3618ae8492906de0 +S = 237833bcc3e4a721e2079e579d1aaf2519c01cc238056fe0c0990dac7fe50e75eaf6f96 + +Msg = 8a99b9db191f6cabc88b430bc2293e6774d5180f019d871839289e25aec29379f14606e742190b7aa062e3b29fe0254146d9614856c5140c7315015abb98ac00da2c7e33cbcc82c24b797366f12767322c4381454d9d1eeaedb616b0ea5c66d1422da459f18081f4f966d05ce279c6ee69b1bf94b8388d38d4b770d9ed69025f +d = 30ddc2c7a4ce300cc2b75f0f977033f16c1f8bb13aae3d494c381f9a6dc8622499ae4df +Qx = 47bdfd7c77ae0c53e327c15c30d90ab1c9b670fe2241dc0ffa939fec3cf6d3c1f493f3a +Qy = 6a286aa2310a4d0468b62f3144a9da2e66d15bf86f60045824278e8986ff87a27611920 +k = 38afc3d11c66eba3441a5ea298fa593eec57b84ea29973c306ac9d46bb8d8e2f4c8b049 +R = 06c830f6c0be99fea4712f1c75f5a4e439800dcf062a16d93135c3255d3cd04bef5bc7b +S = 1eddfda0d0e02d382ae243e604f76939dc21f3ce106243b2d20aa562b78e620fb456428 + +Msg = 5c437b331831530aa94623b1736f00b986172699f0a02a5e5df0008bf25341787e2e66046f2c929dfe0058c3cb89fc5bebbe1025bb1edd1ee31522ed568e7b5b4ca3991afdc76a68cbc2c4f81863e27fdaf6a564fab2c6354e5c657de81390f8a4132669fd24a48580c716b5b7961a9c091f614d11cf45dfdaec8946a54a11d8 +d = 07899928922fbfdb5407517725edf231d15a8b62d90b7fb6d8c8d20424850dc44f797ed +Qx = 614257f54514cf37df2cd78850658a85ee362764ab8186423aa0f9a1ff486557f8f167f +Qy = 3ceae9d1370df045d20f576931ca63bdba8885f463d5c82e5edca5116ed3d2c2b0c4861 +k = 3395493478e69e6e1088166f622a4f9ec7feb998aa552b54bcf0fc67c06079f45a14993 +R = 3f31ad171dd59c9deb21851e631f223584b17f72a6807d5239ae31373512def954d5ebe +S = 28f095ae43ba5bdd899573ce6823eccd8e127c6c03cb59dff43c087ca24e1ce5504d1ed + +Msg = 91aa08567d8da4c90684dc06068f69deae240212842ff1786f04ec41b40d9187aa92c76401f9fcedced62876a34df82ad7c1e63b68bb2a972257ea8542bda6a7f1a020c9b122943b6d651abda8b8d322a8fb762eee376daa2d3637a71ed6c4f5cf96f61c0da2d6e1dda3370d80e51da2cbd8aef3267168c67359523faf910dfb +d = 2a2af63d1171930758bd3e5bfdac62cca1a83a3b55a49b3f80cf0d9ee4b2082757beac0 +Qx = 7dd6fd0868ec478e7e5c08965fa4f1efe8db4d0c04f0b6c63b5dfa397607a0d9d5ce909 +Qy = 54ff4fba9058179a2c61951fb4955cb637b01267f8f08b3aad614738c562f602d498f04 +k = 179482dddd033e8849abfd4991304137044d7433d7bf858a794340ea1cd66e736b821fb +R = 071f4cb000ca1c51c698c867a78961e6d7defbd60109f79d1d165ed045a653ddebabd10 +S = 1e2975f4a1fce0b3b0e13c3f50005fa664ee9319cf774d2e107c406d36158bcecb0e5bc + +Msg = eb5297bf408c1a55e400a20a3c10acbc5c2bc6d6ccfcc0941fb7a6fd4d2834415a6df86c3a6c4b867d1215aeb8222153da8cbbb1576c92c07ca2c36d8f243fd911f9a057e39ee25832454e28d7ed52a8d04169b9b9677a16b32d5d211b8573a8986e9bf36d7206417ad2771daa11bc21fd7ee1029b65ff7c9b2705a6dc9cf9cb +d = 35994e89e13916ad82608f74a639e6aceb756ff913aec440519946d6434af9a60a6af49 +Qx = 1f7805dfc9f90d4f8a1b241dc9d68aa41cb77b63d530cb3733cede23bb87ee5118e5bbe +Qy = 1c3f1aa3a1218de78a94ee8f88d3f787fdc68674e31792d919dbca681a6db1dabe89b61 +k = 2116684a4307c67a3d8c1014b33b928a962a8daf86c4031b0c1d47315d74bad7dab2aad +R = 33cab952e9382dc074d666f1f2ab2bd72ba394a404ce2fd02a6f7a4dc096d713827c94b +S = 33b2886738d882146c0cd715701fe4e8b94b0d28c73a6b79d2899391119ba910bcbe3be + +[B-283,SHA-256] + +Msg = f415d0adcd533dd8318b94560f86732c262ad2c6dff9dc83e2435543f429a2158cd2fbab0d96c027f71008c4895ecc644c2ceaefa80937f6cc6338d15d36e459a16bd9387a361a6d800acfd834ad5aecf442e30b70f5bfa164747cf9f89325b80976052a83a5e896c00c54f81472b14329cf23bec10a8e693005de2a506ba83d +d = 29639da33f48e4fb0d9efdf50bba550e739f0d2476385cba09d926e789191b6fb0a73ff +Qx = 770f9693777e261db9c700eb1af0b9e9d837ce5eabd8ed7864580bfb7672ced8ffca598 +Qy = 68aef01c8126889204aaca8f3ccb089596f85e2aca773634bc5775ee4d27c77f2af83e7 +k = 32a930fdb1ba2338554a252d1bf7f0169d18750a4ec4878d2968c5e735f98b9d0c25edb +R = 30cd65f1097d3fa0d05e1d6072675f1377a883b683c54b8a1f4960f90d68f3ee8c7bd98 +S = 15c61ddf43386a2b8cf557760200ac06a480797e21c92e45e6a311e1a508b03c4d9632e + +Msg = b178d86c9335b85e02178fc4551769db589ab91d823fac219c7e14e2f029753b203962389476723832f8d9631dd7764e6dd35da290afa42a794476f5c7727b3688aced848dabc9954201578cc7b25801710931f45cba1199d3788d64dc0188412e70723fb25b8ecb6718358150c4037b5b81466dac1686cb5270bb1c72d34bb1 +d = 0583a7ecbf2a975a32d07428d27ac82e5dc13d1466c4fdfc1e6a05a8d9a289f1010617d +Qx = 3775ec793ee4bff15027c70d9bb5dedfb7d2e41af8895faddddd4589cc5a00bd222b3bb +Qy = 300f7cd572d82f2f0a2d99a83977ed2034e03fdd76a0267455a524bd8199424ae5b81ca +k = 1e58b1f66c927f4ae16143856d67193d889debdac8eb03936f1b36d550c2f2639e13f8f +R = 0f897dbc8ea12f4370fcd08e8700e5e4c68dff97495f401d01b782f2ebbe259bc0dcf25 +S = 3c32424fdcca39f411663284658b8f0c1f950f0cea4354f02f4b359f18e3fefac0976e1 + +Msg = c8bfe9fa7c848531aa2762d48c153cd091100858aa0d79f994fd0e31b495ec662209a9c8761cd1d40c3d8c4262cf4dc83c4a2549a5cd477726ab6268b4b94a78b1c4a7e700812872d7f41912a723dd9abc305420ea1e1fb1fee41bf643f3a24abd6e8fbf6fde2475e290527724a6f99fd75374bf7cb01b34d3e60d8db33c4de1 +d = 0f817ab1b49131fb9bbe8c112c25a36f064efa85de7506fb9cd29d81b326bf276277f7f +Qx = 2b3a06e07fce1848494d3227ff77d1c43f4ec3c037ad73ffebfebeeae87d3bff7f7e59a +Qy = 75df52e6a34229266ff28b1c217538ae23b3912e4bae8de5cad9b57b7c1c9ca8aabb2e8 +k = 0ac57fbb899193b88fbf4ff2c502af72943b133e8d40459a833275212f6644f566f5c58 +R = 3e13307d5fc2b7ad24e9422355150578c78e1c99a6f9a24f9ca2e8bc6856936c5c4af2d +S = 05e8b77b580cdacc2660e6f8a1877d93c5983d135d63ca0e0b06aa8daedf855c9f661fa + +Msg = 9a5f563d0f9fd1f31f3a822de628ae970954f4e71292492d727109036491c29e66b9b0f2c90c26abe94c08502f5e923a9ddaf6a7d91e9541ce90d0a49f03ce4e4769753d5b7d922e1ceaac4b4cfa4262732a09550aa076b8ff9d46a50fa17de17e3b6bd606698464d116fcd5f1ae11bf45b0c48d3b738427cb47b0d1272b03cc +d = 2782af76ffebf3e2bfc0576b70e4f4bb87c762e2bb230d278ce776310a14f5b678f29af +Qx = 00dc21b3be7efaba5c7f9f22591327f0f97083d4d844415d3148d227931256d026ec9d4 +Qy = 1276f1d9e131f13bb129a1192fa24602fb508c9679ad2124e49c70a891777cd601955fe +k = 0255972b5329863f380de945574793beb0430dc416a8f2543330a125ce8d69f72dbdddf +R = 25bcb54e188aef6e362a62fd88daaacc8e697dceadc8a6b6f804ce4a36856c8da6de97b +S = 1e12e18e1e281606c16ed1f49804f8cfb33c29b0ae92c072d5c41ee3e6836cf1813d722 + +Msg = 3d6b065721da9de82cb33ec2c27107eb399b1e69ac8fa51145ed4147e20d72e27434104e76af988a3bc94f55e36677a05182fe2376dbe38195fc6a30673a4dca87336c7304f3f31d49216fbdfea00fd1e105d8b0c13ab11f8892e0045e915c17dfaab07b24ed21b06af5a8cad4f45fbee5a25bb6e87466a7bc422c0bb896440b +d = 31b827b88f14d3822244809096157df3c0aa99da90c00cd9f0b18dfe306f6881834e6b6 +Qx = 7b3ed076a2901ab2625bf05fa6db10a8c156412fd2d26741738f5eeb6a9189157526946 +Qy = 6a8cc2061352c36f264d23dc2857fbe02af34397ae5130c582e885f50f2c112f141c07f +k = 0b36f5d6da409c4a27f38ff9686cbf5f4714f4e17234fbee6e6deec97c9f0d4c585d42d +R = 356911114c9ff9ae4f3a4fcc5379c987b9d298554cdd39ce124f04707e7fd1ea25231e9 +S = 13c0a321c4c5a1e89dacddae38a9b3dda32a20627e53dcdf28ee26a550797c255eefe6c + +Msg = d125f0e2e6135567adec9e77da2afc6862e28d618416632ced829d14ee8b61116da59dfb44098a40a0b927731125617e3d2f32cfbd1546a6e758c1ab6597e75db07add52ecb61d37da2e9ed04df95b36ac249f4cbd794cb561655cbbe4b34834c497b3d392d78ed0db8db683aff0076fb6e43acba3fa2b91210cc6cf3fa594b0 +d = 27da4916f1c471cff80bfa14d12aa10270fc3b26caed010c0111f6e5a40d914a3927763 +Qx = 7d8202c88fb915446c521884fb756375a2b8d178f6a87306c1c8b67b926e830c8285c15 +Qy = 224dcebb8a7c46902532870ff855c780b2884dbce2956cd34dd6ffef8dc365b96753449 +k = 3fcb1e759418e4539f9be76354cc1914ccf9a111338890eef723431925fa132ebad8695 +R = 0d4d4f23408db58a72495aaec6dc335ce85309fedccb6ade053c23347abdc9e77a81aa1 +S = 129b6b322573dcc79704d08921cb54f31c571573da78cb09d0aab40c4036ee8f195d88a + +Msg = b380f97687ba24d617a42df1b14e5506edc4b62dfec35ed9fd886bb769832cec7f9adae10c21b7cd9152588797b4efc6b2b30a873d3f25e683ea9be070dd69731949a51121e534fabfa3a2eae0ee90a454182248bedf2595cd47ad08614177d58f7a773f5023b538f5f568682c83fb60e3fb1aa859948d01bf7b214e7f2dc719 +d = 10608eb51dc0ee97d6e488a23c582ecf0ea1df9a24db77094d87b3fb6ca98507280a934 +Qx = 399b3e571caecdfa1efb243323159a45618702600b870954cd614e494bccd70e381f68a +Qy = 2e2fc57721a500611badf48fb435a6e399cea356d281e853f55ef2cf9fc5f70dc8b3da2 +k = 0a8045b4f55115dedd8d742545f9f2bd6e5ab81cdbd318747aebfe9f74b0cbc964b6040 +R = 2d022631bb7e05d316a1b130faaca5af5eac67dd25ad609e6e2a067ff74fd4ba534db2b +S = 04595f184068433962d250394680701fbd2e2bd613a47e5de68fa1eb83cb08fb425571f + +Msg = 3f9ec57e4228e1a6ec49df02c58d756515305e48763ba1dc67298be9a1548576c28c82b4e9b3f62357d9b3c522b16d5c496a39effbdc8290edd2cadc0019e6b9fae1e61238b13b6265ad2ff413a5a0684babdb0013e7632051455e6fd943815213c555dba96cba8911e006bfddec6c3353065004538f37e48df9e339498d85c6 +d = 123f9eb8babed548df08cc3afc1d3b3bbed52b538d4654f2088fe76062fbea75b85a560 +Qx = 3b2e980ae7a847394720a9cb982fc1e41f9381b0f2e08b87fdff1bf891b9637cb22485e +Qy = 4a367d593edfaa4e17113b6b1ea3ad185b3155b1bcbd9f00f4482e509b43bf7eb67a448 +k = 2adaba166d703d4d2d431a26200acea7fb47216fd04882f91c5730a55c349770d58a452 +R = 2c83e6a7b4fd48e1ba4fda8ed7891425213764078926d8862d0eb64765ee2900b3deccd +S = 3561a949d583b7de9263d07ac427bc175b75dc52f43f3ebedf996218c94e51684ed5f9f + +Msg = bdbd7b7bf3337bd9d21a3c6db379f95408c17e49dd394e94737ceae889f45dc0ff5d48cadc53703a16b5589939506b548f8dfd34c577c084f372166cbea320c8fd07c809b211e0749ea639e68f890affa1569b66bd763c7c710989e491011371eb1d93ed9479ff0216b7f79c901a2023e2cf80b565d1c0517e73117190cd2f02 +d = 06a18e626452111922e02e31d662f4301319946a204ae8a34f06b91dd1b5b96456365e3 +Qx = 77c1fbe6a645b85fa0316ae412e8dc558c7c066d9aba900650749eb7b14a149ee57a259 +Qy = 1b2f3002ff4936653412c8ccb8a67dcae18d78dcf6dcaaa75061013d2134af2c3fa0e69 +k = 21bf4ca10d03a93d4675baa26285aaa554836bd0bab6e7fe42600ffe9137d5e304847e1 +R = 20702aa5b5cb45cbe8025b4ddda0a42a1ab746117d45382d018b2055b62791ad91abf54 +S = 12c31f9bdc096236d3ec46c4e6cdbcea47e4fba0e28d4df0fbc19e8740ce6dc0577b242 + +Msg = 436b288512ea57bc24f84fdd117da9dc1858bae8c11637f99295d88fa9d05e3c053a2584a6fe200ad190b3077d9a1608f660349dda405066c1562f6897ef69b6b674d6bc11fa470d0b96a7cf8f6e098c9ac03b0ef415aa045867ac7c11d16cee78ecf08850ccabf70f761682b561d0d0e4a889d840dc74932648ca2fb58259f7 +d = 3307fd717015b12a2dc76ada21442ac1d97519f66898b214c2ea317ab0f0905e819e4e9 +Qx = 4ff9b8d60ed177df635a3953c0f5f5c0254224bc48d34329136706d6e8fa1b16ba0916a +Qy = 2e50ef73f43ea9a5ad07c6bd68a82b7239534e195ee929aae7788c073dbe9e968c2828b +k = 14d8339f610b348f4639ac20dfe2b525517218f0c71b1908d407603b25f19971a1b5b4d +R = 2acf3dc4e3569e5038fe97920de626ddb36bf213afa0f939785dec8319eb8321234c574 +S = 01db40fa416527266a3949211fd9fec158412c447c392ed6a7c7f159a1129da864d33be + +Msg = 672faa156dc188bf16bf8933d65e091c633f294486049ce96a4a403dca28a149f4f840e8bef47412285363e9e89006614b013a41baad9885f1d9980cc897ffbd5f8a7d0e63feaeb42c07776efb307ed680ba1cebf470dd9bd8a2a9efc2b1daa569524394f9a50398add1a5bd2f7c263f9e63c2d49461acf98444fd23341ce78d +d = 14f9f412e3c7d770626e800d43cfcbba3ae6aec8563af748e8a97b67d244334b6e6d2b3 +Qx = 2293b37c84e7514564635e517bbdb9bda0b4a41217ca64c38e94a4bd00753255b4cc389 +Qy = 088c10bd909964ecfe10c373214544c6f60ab85b8f5545afb0fd2ac03d036db7ea9e67a +k = 19b21a4d73012dd2a2ec3ee280a9b855b89e6ad53438431cdb5d2cec0e5ba21300e9bd6 +R = 3baaac69d182bf1a12a024dbc9a52ba244a654716e2756c36ddf8ca634129cf9d2b23b2 +S = 13ed92730d0a6d75f2a4a56b39f82d063e1be988dc58f0ba5f553fa88b6510116005727 + +Msg = 4321334cc8ee44f1cb392a4b280a95561809dd3639ddf43b6e11cb73067597988d95b8643d86c76c3c6b932d9262b9b8b55a04fba0666dd8b8ff1e8fdf799ae3945b6e30d3af3966f1a6d634d5e012710d66cb447fc3375130968a2e1e647780aada2609d87247c90338dd71c3bcc3902311caba27d5d4ea4d73ccea960d4bfa +d = 3091a6a8bdac1e43542dce752694972e734dca31c061c7d1000754296d0748055db3f09 +Qx = 5c0761d01020a30c478617313c67008a1332a0e6f295c5a9f01b3411eef585a9dafc693 +Qy = 0eadfc6f7bb9986b0dd221b77b54287042ae8d1ae5788706b79a354fe785c66145bfe81 +k = 0afb2e2e29b26a686368b127e38c2f5726fd55a13e9f87cf00e831d3fe19d9511d07e81 +R = 2685f634a8c16ee79acf62b7a1fb3acaec0db47c6ff5f2c97a804e9550494b128b2287b +S = 12b545bd76b8d2cdfc5452291d5e4748a5e981c400daeb65c20812a65bbe936bc613219 + +Msg = 2087e22094570d39fa937f15a3ef0601709a66666344186a33b487d041793fbb9709a95af250b1df0762ea98e911aeb3ff1fa19f0aca53fd4179e454e0e91636e55cc5b17cad9e1575c82ad265dc34c4a66b7a31ecb9ef9dc756f2ac1d9dab35369a6bad4a0f47e629daab91addc6d297d1e5d81477b3966d8c3b607ed194d88 +d = 1195921b91353db9bcd00510efffe009c94f6bd8d790f5fb3e5a0101c9ca5d21c6ef2eb +Qx = 5dd8aa95e24c054d508bc5081546677b9a8e8dad40d3f8a184af7cf07cdb09ffa2e0498 +Qy = 5032f208dc3bbad6aaab63211e13e17656c750c6c2a6e3caaf55a7c30ae5ba241d8641b +k = 3223c6439db7255e89c28aeb046e906ba79f4e9b8222ba5ec201b964d3666301f74967b +R = 0fb7e194dae6420ac447e7d4f882da3c4859f53a948833a0a08f918acbe03c2e915d1eb +S = 2336f1206b46b3166b28918bdc1c817b22ab16b355030cfd635ab3dade20d2dbde08b6a + +Msg = 15c7bca449a73b03bbfa783f5a91ca0b7916889a5d99d541e2e8593c3b176a5b634ba20b34407fbd94ae1c1398f5313cab7402f3bcd7ad277a8c66d09a6df5dd086b20a0a3823fbbb80980cd86bd13e527eee15656cc977103e80113539e26695addd9eef6a1f56986168d9a53f8b5de833f8962c3826cca106ae9e8c00208d2 +d = 29dc20446e9abacb43823e12a83737b46e6e577466b5a3925e0f9d496824dadb4d4b50c +Qx = 4b3c1d41d8172ba15fc92d9586f29716821ea82274ac8e4fb3452ccca3e34925f1e736c +Qy = 23e22cec962d759bc659841f259de954911aa289e9994bd76a30149a73711bc41b29904 +k = 0931ef56f08c379d1ddce0649f45ec21eccf3dcfa178616f45b200a06f82172b91bffe1 +R = 178348d533217543af694c8d3cee8177e22740b657bc6ce6df9e57f0c1f14fc9407c440 +S = 3eb25dc4ed42495b54679653ab1cd4d61c854207994a7318026afdfd44c89cda9247388 + +Msg = d12fbb82ee7a57eaf76b63fd6bc6c0a65c85f135f019d43ff7bc295cad15d53729d904fed63d69d3ffe8b82c0ebaf0399e2717ece40e011f710b5db46aa457c23b85545953398b814816a1e7a8ab5b0b14c4a0451b0bda9d0d2ec4a374bcaae208b7fe8056bfa17d6b7ffd4ba2e9179f49b9cd781b0c06f6ce3eec26cd428cb6 +d = 3b9b77d19a42e9a555da8ab70aa5638890b2ed21daefa28ca6323fc658662dabcbfaf52 +Qx = 632fdf8ebbb755c960ebf8fa5d6b679416e488faeeb021c0782352279a7ae00eed33094 +Qy = 41aa517eff6854ba04e2de6794848823e53ca580353f2b25e45fd4efd3a369cf80fbe57 +k = 2450beeca6f1ebac3e82e3aa3239a5031f54ffe65fa6a45e2bf2ccbda448a2cf6988141 +R = 28664212774e23b6513f73a9b2da97f5eeafd10efe742e314f6913a6d0c0e3e581cc6cb +S = 025bc733edffbc1330689e7aee0dc121b64a72dff19e1d7c5990206d6daae5bae75d0b9 + +[B-283,SHA-384] + +Msg = eab0a37915c6b43b0d1e3ef92e6317b3afc8b8301b22f6059da8271fc5fe0e419ca6097daba213915855631af64e10d8382d70599d903d1535e25cbf74da3a12ba2f13c33a8562e0db03edce791f1d39af8850fd1feff0eb25f9ad0a86dfab627b96e65831bffc5f6d9693d20493bc9dd6eb3e9325dea50b055768e8aa30d49c +d = 0b9f8f3e89e9c1ef835390612bfe26d714e878c1c864f0a50190e5d2281081c5083923b +Qx = 542ea231974c079be966cf320073b0c045a2181698ae0d36a90f206ce37fa10fb905186 +Qy = 7e6eccfe1303e218b26a9f008b8b7d0c755b3c6e0892a5f572cdc16897dcf18433f9a10 +k = 31789e96e2ae53de7a7dbc3e46e9252015306d88af6bd62508554f89bb390a78fdbaf6b +R = 0fba3bd1953a9c4cf7ce37b0cd32c0f4da0396c9f347ee2dba18d636f5c3ab058907e3e +S = 15d1c9f7302731f8fcdc363ed2285be492cc03dd642335139ba71fbf962991bc7e45369 + +Msg = fdb93afd5dd1e3eaf72c7ea9a6cddb07fc2054499ffe152cb2870163eee71ace5bd420b898cb4fa80ea53fbbaece2a1eef6427b632320e9c97e38acb16b62fdbf6585b54fabf0a703307ca50f86387bed1815a05b0c8991e0743d10cdf49c8facfd7ddeb8d4a7b706b5a29e1d00ac88b0ee88b3153185495ac8388cc70104154 +d = 3a30a1c15b9ed71e102341f97c223a9b5ea3e6a335861c3cf407ef691a18cc639dbe74c +Qx = 40937b263c87461eb5d409008255d4e14c54d7a86d6e3eaf2ad9c559f7a6b9d2582542b +Qy = 7562e3a04f22ad37a1df0250215c163b45a6bd04a4b96c30fe2e2b7ded5486b172ef09d +k = 13e745c76b33e6e91f47f8423653b0056014841f4df890121655ac2044f3a6d58b9e213 +R = 22467497bf1b5d29476f24aaf5f88d905be7900406c64033913fc88601c62063a924456 +S = 19cb024c7d6be51d15337a207e66fb0e473956932faf6d755393dd5a899bf63610ff887 + +Msg = c78e35d1a5b1bbb0ec21e7ba7b7c74c859d88f3e100e40ae34128cf093885dae4e87cd09f3239dd8e79e25305220880dd352a650225d9bd193b9b84e488c458b0b5fde1af941c0c9fdf952d2fa41f665918dccae27ab7923da4710f8c27ac8ed424992568dd6f0a6c3ecead21650ed162e0292104eef3c2d8551be866a88d279 +d = 083330123cc64c11888c1fd388629d0b329a50ef31a476b909a182c930ff02d0c389b93 +Qx = 2e3a3e712676bede22893a8911ad6a683306e86487d24585bd6fe4f2657281f0bae2dc8 +Qy = 773889a95e9bd579be379fbf84dc8d26d47335253356e5b01c09eb8ed57474d6c0b0491 +k = 0d630f20623e93c274239200393cc552d03da6bb9e74f4a44a518e2642e84e761dff7a9 +R = 27b8997fb98ad04488f5dc8ae5dc88b2a3231fca76d7320550c74cc540110c0cee5d8fc +S = 1824f1050e85d527847faff236b7195965e7b93343ebac889b23425dc27226d50a5266c + +Msg = e05435f695997229cce314e50065f3c5f71981988dddccaae6efb81f936b22cb48813f506d1edf5ebd69b0be34f278592c5935f0f6db0cca1ef9d62834fbf3c4c03f4da0596cb4d67b7b767e85dde7b7c6fbef7d89babe6f97b876b33594a9e36ab87079861ee556fb03274ad4af527342a4794192b8933f28c6220f954c77de +d = 1dc2b656c207eabc9e0d6272099babca8d149c9c4258b779c2f06de75f76d77505271c0 +Qx = 2b03407b65809825a32ab50f1b556a65c3bbbd65cfcec898514637ce606182517fa1a4d +Qy = 21c97e293ec74dee17c89b962356b7bd50c7b23fcc30ec7fdd0a629d11373e28380a8c8 +k = 2d0dc9317a2af5a7d0a23c00d126b7fae4c06bda0a5c50462ba26bddf575adb091d0e50 +R = 211c396875b5dc71ba87ff2483b0ffbff60cc3656132fda7422a81964f1bfbcb5ecca23 +S = 0a0ed7bf1ca853b9b19924c706eff373b97585b692b4b535ad71cc4362073caf8f61a3f + +Msg = 0f9f36477076c4b5a7d1ceb314a397fb14646695b0803e36e98908c8a978770269f165a1fed8f4b655d4efd6ad283d7f5d51b6e1e302d360e8ebf4e887c7523a757ffd55384e114bbfc6b7a0ec8511079507b919065ca018573418f9e394854c5704227772161707b4d0246ebceb91192f0eb2ea994ce61fd98a6d14cc8246c5 +d = 0081772348ff2d7a3fd57fe703555ab2e14f5d203c4cf0292f944e827e884d95f3b1d83 +Qx = 3f7174e88ffa8bc0a770fffa4bc30a436fce331dbe7154f6e2fc0cdd09e76840f089b3f +Qy = 561e6aa3feffb2033ea716ae94b9a7402bccfed1fc4a137cb96fcdfe4685314f73a8bb5 +k = 3a8c40754ef7ddd0e289b2cdac5e06c72dc3d6ae9d0351d9295aedfd6f0e88809674bae +R = 1443b46c0e6bce31642dcf3037e25b6ba2b42daa9a83f5c0bbfb2487ce717c37b91f46b +S = 3f59d5a925fe19c795b4992c265a3c61b2452237eb34efb9aba30208ce07d1ad47e2279 + +Msg = 1d38b1c342b6611dbaf412a66c1c0b8397692755f576df33b31c2bd12b7f0707cc423376391f7b00aa4e7b7fe54532e2b39c3c5284b9c8ccce48eaf9308ed338992f1d4ecde6cbe352e46339d7d602942158387881d9b493fd40cc59d4f9b53ee4191d42352c6f7bf32c331f0c5afbd44a92901a4b713c7cf6ccddf7de4cc6e4 +d = 1eb6bf2ca1b5ffe6f6a795733eaeed12de6e87c53571e702635b9dbd0d96b47df4a005b +Qx = 0e64dbc1a08acf6ff0e820593cad79a46e3bd818ddef5ca0960fde799abacc7b840eddb +Qy = 6115d3de2bdd011ad053550471368581a5f125eb0d32090646fe4407980a42988e551aa +k = 3b28fc6d0e4a7fc449b811b78900fb9f89885f4d4f70cb5a2b3d4f8ab87bd5448f4bfd2 +R = 2601923909c8c953087b0c0acda57d8c01f814dc9722171d8409d0acd2fa4d9c1314693 +S = 3eb316cacba93bd473a4b4acae4f2b5a5b2ac9856519032e63a0c718698956e8f35673b + +Msg = 3353ad05ef90e9762bcfedd6ef44a1e8ea0392ebef30cffd48ae620f3e567e1cd44882d514e7c6759200d4bcab18afd3038c3d3f8c50f7bba32a04eee5a4b1cfb8c349939e4efe0a46fd047d02ed000d8fa1b98b0af5586f120d9ad174b3aea33905b979ece1eb3660b1e070c8821b32df41904ad68bbd8ed247aabd94066f16 +d = 3b2a3e65e5a306bf8e3955b60e856dfa9bf68c1275a678ca056207a0ec67c96eb3f8309 +Qx = 2c542cef892b06372af7d9c321ed5309995c1cbbf1a466e70bd30f3856ab7c5d18f4e3d +Qy = 2a8acdc12a7cc0b54f4dec9cf61c484a5cf86c4cf6cb5ed615479123ef1c6ecbb6c7ae4 +k = 09bb5e49188621466440a0841b007525000c2203d9821f4c6afab63ac2b97cb5e2e3dcf +R = 00a09da1c4bedff47945898f4f4ee9a0857bb56be535544aff9d729ae44e23d678fc71f +S = 2390be08ba0861b32ca35ba27a0c8dd1a4e96d28cb007133a096b52afa0126bf2a2abee + +Msg = e7ec162185fe9a5803c6b03d98041422315ccdac67e48fbd07a1ef3c5661158710abc6791bd0a75d56791b4ac0e7695d53c5989d9fa6a3b037583b2a80d2b154b024f1c36b63548be9afe1d51f2f68b2ba94d4ca1e69a35ac10e15ba72242aac20f7526b12ff9d3cde9a9bfd70d55adf9bd92c66d092d7d08e9764c84bf7f329 +d = 1fd4d1af0bb7c79ed5fea7bb45574e46534387bd916649485ef15207352d7302e81dc01 +Qx = 77057d3f93011440a78718a3cfded73e4196e7fde96e794465c51be8b679f912c10edcf +Qy = 59873441c590c43e0f00f80afad5b0166f94b62214ea45da29174874e44356b29eda6b9 +k = 3f224b35737e78ec5bc9b081a601d8fe19e33b4787449d3353d2ad225358211cf9f7f0c +R = 1a7bfe92c30ed1af478282786bdf7b5b89cd0fdba5e534bdf13899dab5af108803d73f6 +S = 2ba14810de4f5cf48b56e94bd6c439d230dfced3cb698c77627f59faff0ac5a42c43067 + +Msg = 87c8f2e3f4fdebce0ca9300fc1ebcaa934f51a12b6b8f2cb6bb6eb77965468663044afeb2a1334cb5a81e74b8427267f8b34b5e9ff0cf157a9f18be2b1942e32ca61dc23ea13c3f9fcfa16df8fe05e067938b6994982676463fb12842d4ec532cb904cf222aa805dd0d86ab9a33a83e294c6d81e8dfa273835e62e9041dc8ff6 +d = 20380b1136b5283e9b7f54b7535ebda33b129ceb177bf5d3d07b1daed5edd9fb3862530 +Qx = 5e7d0931db006c6abe04671d1aede760f2b1ac5c866570f8e5a24ed356fdab49cc5cdea +Qy = 7004920fdb0a744cc545068bf82bc5d7a46edf9265fd7c5979b9559f5421c9a98f6db89 +k = 3cfbb1204caf6011fceb8d4be987d9a41b81bcdd95b94919b220647d0e7a18feef4cd01 +R = 07096beda28c20d2e62d9b0750142d3d21b54c38c7fad1ed65e4f9b386f3dcfcc43a3c2 +S = 3d0af02aa39e329e4c39f2a1d6797f0e3d14554dedbcab9abbd158273a3c7116225abab + +Msg = 2ac53e8a50c4afe3b38904255b7cbf150c5f79dc15932dc0ac9aa631521f68a0d4b6bc5a04d55c99a36531fd4886a23a8d99f262ecd2a9feea925d7a96ebe9b6979a207b7f9378afbe404fc8e959b0333572a2c911f8743c0ba64eebc7ef12fe5435d2cb0e5091ae518b6e4233489efe3c16c6f21abf4e2c6808b733914e5a7d +d = 19f815b98836948e0a0dc9c30828c31b13e175f1e79f23d084ae1bbe64823f4866214b5 +Qx = 5109d8ce934972f5520101730d0a14b99213ea17772e3e7637d622a5de13fd2ffe3bffa +Qy = 502927e0c7baedc4bb3ed2bd1b15fd2d06dd43424393b246dd530d5d8598b56dfcb3cb7 +k = 10359d5cd8a9b7532c9902bbf1cb83d0d34bf37e73e7c0f5729b62a10bd4d8faa0f53a3 +R = 3503410a6feec71fde2feb14375d50f99ff9a2c8bef47e676bcc6c3045efa9948891ab4 +S = 159b1f65fd566ecfdc08b87e4ecf99ceea3088a750e2c3c9d868bb432de6a61f289d06f + +Msg = 0b201469cac4c078f587edecdcdb6efd5752cb4a3f43ab540463c4d908c27527aa3592f2f9acad85dd94a3c056bd28618317ebdf2e7dd6c5ad26fa3c31dd8e5c50c60418d91c93bcbb59ec1adb1db791f485ded78a5cdcddd23dd1cfa4f13443468d8a5f2d648059b9c4470d0f4fe7733d56a28a2c24456b6923703ef32cf0b8 +d = 01854e954654e726cf4bebc0e5a840e8809fd716059211c6ffeaed36829808363164684 +Qx = 7a6e7c542860e815d3fa24fbaf99989e8b9c812b08399056ae4f9a850a6711a7385b622 +Qy = 0dde6bff33891a64744dce6456600f5a6a11049906608e77f8afc38b922972c805af258 +k = 2c9cfd376903122625c7fdca50e93d4c216f0c7d07f33b3b51e54e666e13b67dc89d290 +R = 18321f9ee35d47648060213df1275ae89c2ec7d17abe8093d8a431ced23aa61d3f8df4f +S = 09e5a05a62b006a7787c97be38df6fb9fbc1433aa2241b5a788fa727229a18e07d7a8aa + +Msg = fc5e4dddf4c4a328b685035ee79069770fbebcc56c14e31afb4bbcdd5220e025f31eba794fd6c05e64f19678dab33ce4f084bc32790392f14bf35669d75b6466b4214ec30d58ca90ae285c9058f5804a1fc9d7a995958f2a0e84ee52e8a78b601bec04ab607ffc2091749cc548c6754ed14e2e5f92315bdacaa7a12823ef76bf +d = 3548f8020819588b3202f4c1ac62eaec6a47c2a19b2900c5a3cf5b4ba5804231141c647 +Qx = 38563f2482a399bf1c13f42f8b85ef64a3599c22da9688b97530718bfefdabca3ae8637 +Qy = 5c4aabf6d8a90af345008d5a244d0671cbe1afd08000c4eb37702a9bcba6dbc058ba6da +k = 32649876d776117003305f0ec9cdab5cd84bbdc747d3dad5d8d54a8fdc84d519d50df45 +R = 1f5160851981772c502088eef209f7f89a7c8ab35e630d16330bec7723e398fb37c84b1 +S = 073a7333a7037e1257d4d70be87c30bef770f9d728dd7e2615d47b399ec650aedc867c4 + +Msg = 284cad790e6207e451a6a469cee3befc3ec43e047cf91b9dff1485718aa29de36a43f7c51eacd8589f0c3a96ec18e8ccfa92941b50b2132e3612d5b45e16f60d411d1c53e373e1ba451352e28970ada9dcb9802102518a385dc571dcf6900971b00346098a58042e0d1d129bd6801fa640a895a458a45b31318fe63ebb30c6e3 +d = 3cc4505005c41142308f1489226b7b542e2e7f24f1d3089ff6b92a4b0013f490ad52e60 +Qx = 280b77ddc6648d9cc3f5557d406ea2a089c8179d4320781b2eb76ab07fcafd2535b91de +Qy = 05f23bf4171aabbf0fd50049aa017c0dae70b065964c685bc03b958cee2fc3249149d31 +k = 2ef488215648524f6caf85233736eddcd9d1d838c6a2799c3a68580492d40f9800bd119 +R = 3e8e13db22c97281307edd4037f0a75d2c70a070614e94e02c860f36a53aa738fa0db2f +S = 356f2651b51a6be0c697300a8c2641bfaa1795397eac208385c3729248e36baefc173ae + +Msg = 6d46e57abea9d115deda48b69fe8e0b36144df2f6a659509ce1b514c8cc4769d46e5f71df2a084f1db4a22fdd3ef0c2f90394f2898ce291b9f279c0664aa01419f5f6bee1fc1299871b27ecd57a5ac548f99d01871b8c238a6b46044c953b2e78e22346a0c7663af4db62799038ffb5c21ee512e26d01e70a4ed967377ab8405 +d = 144a2fc8e0aa63506e14e4307df36416f963dd9da78655832f5b991af8c3eb97df78efc +Qx = 3fe8867b560bfb21dda517b8f4d50578a11e1d0ab7ed4ab3796580d31bdf710e8e22284 +Qy = 5a302baa3795e2d132c55d90858d14d4b17aea0ab70632b135f94bb23112d163357f8ca +k = 0b5225132f19419715170f5a3f26919b4127a05b4f0406f895af1e4bba95786daf95259 +R = 0651d17b00ed9a06bfc6a913883b5cdf51bd5f2dd22307cc5ad3bb545f623516232bb6e +S = 01128d4784fc0fc050af0b97f859616d764b22f40734ba65aa15e2cf80e7bba3d15f42f + +Msg = dd750b39bd8753f4e473c4484e2b36ce2da7576813ebe05861c339ffae1d029bc793173ed394091c00685ad82f0550cb21ed1c68f0c27cb7396922239cfb886647af204e88a9101b7453a8ab662e270b87a8a13f2fe61d695597382cabeb781933bebfd7d0dcd33f77266e43e32d937f2dc89f67525e522977ce73e9ad36c8e1 +d = 24ffeaf139043ff25a395e4c560c7680c1c2155191378917eb25194136b4a69597dc277 +Qx = 0402bf61c0e36385e5fa8371a553ed8652466fdc3ed9d4a3ce1bcc567d1f451f6703dd1 +Qy = 4dbea6f67e1117116f30fe42e84383768b0da770f8a2b4cd8a4fec330a0034554a13808 +k = 3e4e78f012eaf1778c086a3bbd9e996da0ddde651236ebdb6348062f56b36f63a901561 +R = 1e2312720f6fbf44d7a6449a7f30019c38e69f2e6424d4bd1054f40798e9fe58d080b86 +S = 379d1b610a976730dfdf3300280f1c61109ad13c788e8f8f9a8d5e0130ca9482ee417da + +[B-283,SHA-512] + +Msg = 4736e59fe5812f63737eed57a570182c065538abd9fb0a1c9c2059199e7052ba57d84b5fa1cda2ad9f216610361ce1dfb9334816b6bea509283756a03aaae2e5b0597f492d078b6b015a40c9785dcc5d2ae266176980db04f5cffef40e16661a50ef871c5f531d73fd5d114fa19bae9dd2da4267a131fc31849da38c2b78d1af +d = 1d1f2e0f044a416e1087d645f60c53cb67be2efe7944b29ac832142f13d39b08ac52931 +Qx = 10b2d7b00182ee9666a6a2bf039c4358683f234ae41a9e5485fd6594e3daa880c0dfe0f +Qy = 0a419b2f40e573dc2dae4b22e6f56e842e50d631b6126153178585bd05a8b9e6e87e4c8 +k = 3e4d36b479773e7a01e57c88306404a46b6e62bf494b0966b4ed57e8a16169b9a1bbfe3 +R = 30513169c8874141cdf05a51f20273ac6b55fe12fa345609a2fede6acbeb110f98471af +S = 33fd50b214f402deed1e20bd22eba71b156305e4f5a41ab9374b481ee344ab3f27f4bcd + +Msg = e573fa7d4bf5a5601e320130de91f4ad87eb7ca6b8998488afcef69c215b0cccd221b8b66eb0af9d699af9ad6c4b4a580e82941f31e4c0a9bd83995dd076c5ac9bebb34481061e7cb1b26f6e8c6b26ee4bdf9887f7ae2eb9fad3115a21dcc96acce85d23a040c0ebbe0a56e75714dbfa803d6e279b2f4280bcb993f96ba321e1 +d = 1337362609df74d25f7adee382225e6a04dd6ee4c6b45fa31499ce9edb0ec046325caf9 +Qx = 287b288ce6f65fed9f95c99fa4b8c1aaf6de65ca563df30ac67c1066d2ba2f5a554e09c +Qy = 25567fe183dd400d256c333da92dda2e364afe84492ede9fa0e913ca7f12069b5a44b48 +k = 31b84ec438302155f2e84dd118c0d8479267f8d19c8c5d96d21177e20b23e0180dd6d33 +R = 08133e49644044bf9ba3b4c8bdc3973647d650c58fae4a7ea5a5fffabafed56e759010a +S = 1d8cc410cd04b188418b20cebc8f66ab0dc29a42f9067aa2926dbadee39abce79deb396 + +Msg = 7862864d0d78b44e2a28af44a0a16d8e9b1b8c4b794db0410c0a863ba011018ef43e1e11f2fcda2f56fdb2a69cc817df425c9cb3b458922ba00d710190cae16d61af3c304a42fbb3d0c4a74a297253fccd70aca414865b41f68b01c561be281265fa89f63f975d3101334886e85929a5a47fa8dc459b663548faf8ed7484958d +d = 1be00aa0afdfe92e24a2536594d4b41701ad4dfb223aab35ff49310bdba7566057fe8ac +Qx = 13583d8cd163fdef7c11e91f36c1d3eb2f7957d219244db883708a7c5777611b0066812 +Qy = 7a1f4df45073b838277d8da7daa7147b0f10aa98b5ec02fbbf97c89ee17f3a7ab4f3f27 +k = 26b42f369ff9b2740147914a2698cf1ec9bab44caa3b5f05957ceb9a32073729aef0fc3 +R = 37640dcfa11483b3754ea027f5f239500894dda4f4c8308f0623db256eba2113c41ae61 +S = 2096767a1f8210b175334fad61b4c7fb4e2d6c7811b5d22521af7750f101077e2fd4e44 + +Msg = e73c96d1a84cf7cc96065b3c6a45db9531cd86a397e434072a38d5eeb9a90f62bf5d20bae22b926cfe967647d2bbb5dd1f59d6d58183f2cf8d06f4ac002ead026409ca6a1f868b406c84ff8887d737f65f9664f94801b2cd1f11aec336c0dbd4ec236d1cc4fc257489dc9709dfa64eae3653ac66ab32344936c03eeb06d5852d +d = 12ad0aa248db4fbc649f503e93f86104cb705d88c58e01d3ae0099590a69aa006aa7efb +Qx = 08d262f57f9528d55cc03c10bd63ded536bee9ecc617221d9892ae1a75b7cdee175cb33 +Qy = 754e40e8823e89fe23dd2748fb74e9e93c3b33f188f80377a32bc66f6a92da1804c04cd +k = 2405a351a3bf9a6dd548e8477452c4d9d719e32762754cd807a90abddd3ad380e197137 +R = 28c5d807ea1c3ddb7f2c90f3af644c5d6a2757336ae46c2c148752a2fc150e8183cfd83 +S = 397c8c52fd67b99792229194a787518db5be8e8c291b1a30e105b00f108ce41f8ec8fa9 + +Msg = a73fb0aaec838d011110d49c5e94395ce07408917bacf7689d2cfe0948c582214b263c6b80e0a55f1e159086817605723740569eeaa1bae96b979679165c5c35ef2142525e943e595e6b4b160acd7ebe41de19775346363f779b1f80b6d5f0785b92a648028e456af8496102d19dc6526247a654bdae3368f075fa9ee92b2f4a +d = 2cfbb8f340cae8e2e2322829148981cd9e509b0c65497fd8d9da5dee9dcfd39b0f7556c +Qx = 260bb17da74429f049f3a7eb73fea9cbeb5b14ce553d7772a365376d0114ed2ef3087d0 +Qy = 5889e41bca54c09be20dd406a6e1f11f9d31d720e0c4e2e88f381ba89a97f12fa9faff0 +k = 3fd7cb455cd97f7f9cb888444f39569114589612b108657ac59178ffe31a33569c9f0bb +R = 048a10915fd3bf9ffab1cb13632359466ccc539128cd98c6273d5d8d26c64d57520394a +S = 2d0f67f9baffbb34094c5fce36f47cb73a537ff984c89e38d073678c21148056bdd6893 + +Msg = eda775984c7c9f7db47af30dab314d070fb77e9b623baa6b73e2cbda800f167b20fdc2e7219391efacf908f4ceed9b9b6bd3541b52ea087177e18c97391214758cf6455311fad336ab56cfdce57a18add8cf85b0a0bd6fa7297dbaa34bfc8585b0f06a0aae055186658c227e19cddb65de88d260f09f805c2e8854dcc524189d +d = 070e82a1f3fa6158d15b7346dd56150faee5c98c9d07c996e01a06dc9b211b12ff62d60 +Qx = 3d3ca5fe316a0820e84a8bb5d231bb14c810a87c7392d7f960e7cecacc56c337f88b0ea +Qy = 27ac0ded5633a98ec5734db9de1399c83a181d522037266d856c83e5c8047c4eff2c4e3 +k = 311b23487750c3c4b23b28424c33328c39d6f594d2a9b459a883508b985d8aca039a2b5 +R = 1465736c3c9e30e895b1544690e05108ca221cf2352ee4af1b5ee4130029a82b277b076 +S = 2819b94dca3a58cc5a96790871640fe0fae38883de6fb4712126c1c1cbfcb0c005c5af0 + +Msg = a4a13e0bfa761b9bf37fade6570d41c161e20558874911ff3bee38e5649849b159beccf321c6bc7243f99c01a2fadbab9e157e9952ca65d8ea676c74fdc976d00501c626b8465c6cf0e4fd1a7d1260aea987161b821528b0b423e62ecc5193a0a49442b0c3e4ec9c4786a3a86b199c07dd3a17033d430d2c83c100f54e0a7c31 +d = 0b471bbc5f7a07996e370da4a09e71e2119ab3a562a273f079401951fbe4df39a4493da +Qx = 333e9d5e077bc64d022e49d5d207385a19282aff1b73b307523b0f861b4ce4219308c82 +Qy = 5414e431f3b90a2d4a454d073cdd81f8b224180ac4139104166ec33ab33d079dd147ebf +k = 3e431c39ef6f4b7674a1bf414460b58998ed7aa5b1af7ddab746cbcd2ed9f42ae3827d8 +R = 151df78c0f453d396d71528032933566e176eb7f6910fa9df2e9b2f5ebb6038777ef209 +S = 08a1c4a1e21cc63fc15a78f0a11a1bc7a59a5a31f57091a12896fa670dfdc05c04053b7 + +Msg = 7ceda7a7248640f7055309ae712c19d741375d6a7e0608e07f0135bb830dc3e8863ee9e7a75331a5e1bd38c42cdd484d4f45a26c2c1d4e05ce0d0ca941f4e94ecc6b371102f31633629e9861de558bcb6407d66eb91f1062ac0e0409db68b9f2855296a7f42fc92359a7dae16c73fd2dddea52bd866a4d501aedd8fe3b3ea733 +d = 3c65cf80bfb507dff52f9bf2f93df0642020d41619b3990009409e7210fd7130ac44ffe +Qx = 3beb5b9b8785c5601093086b709c0a05955be42eca3d217e625349e5a875efa82d75ed4 +Qy = 07cd4e64475d628e6f562f0ac9c3f91075626063a52c2b621796e557799ab2f1ebf8dbb +k = 16212ce91eed7153fef806d2561912be1d988410641d5eb72d586cd4e6782deae4538a0 +R = 26ea04dded2cbeca81e75503932982c7fb5cc7d38a45a3fff8c4ed7f844dc759d8da302 +S = 061d3756e3da1c7816f0d72a8c84dd1f3b93624b631f5051c801af4e472fcf82d896c18 + +Msg = 609815edfd58c0e26a4b06dded831d2f33466a130754b96d8d7c3b4d99fd4b0789ec719bc25338d0ae8c5880560c02687d352d77c291e406eae865c3b26d00f2e63dc644ce7e01d6e96ceeac8bc1eeb257d36cbb25d89b5fff6e30b6051506a0ae54cfaf6214f30985d54cab78f708029c1fc0175bc58e888db89dea8d300abc +d = 0f4d33a9c7e6744ab3c441828bf0f1866ae1c042cc54abc754e3801263a96cbb3955dfc +Qx = 4b925b97bbe67adbb6e918acbcae0ced8dcf11d012e1a97875b750bbb7d01945bd64df3 +Qy = 4591cc9caabc0db8fe9047e6b1f8d850ac4389fe67bb84f6846b631dc3524c8dbe6a06d +k = 0483aefcad5e382351125b333dcede8ef50914b1d1f1843b075f242acba18c290c742cb +R = 1fb791c288e2cd52d3837c56b02fc99f53a6ee27ad6dd9c0a31ca08d8fa64eefccc5c87 +S = 0a041ca35422d8985c1c706dcb0b8ece64b65285bd0a934cdb41fc08223885147281869 + +Msg = 82d8ebba707b72655497320200ce719520c1ae7f46f38122958fd99322c25c9f4d4344bcb77a6658df0eece5df163412ecdca58475d56b0c2d14a0361e4cef458df146925d473a43692b15e9bbec550f1bde3444f2a5b2ecb55d2abd273ae999f16a32333529d94455e485ca4585e6b07bedbfc2bd1eb766abf0d28bdb1ae6ec +d = 3a4824bdcea6a144d85f1b194431724cc49849b6cb949b4766d641ae95477d1ec3d1464 +Qx = 2c9eb36eca01dc2fe921933f4cebe8046b3679abed80d2f8fbcf8f254bf17be3d551a56 +Qy = 34c836aa4e946425fc9f49f3f62e33d8a0afd320292a34d0ef8bde8ad79a10e3f95f2f1 +k = 23d8725af57d835018e8737fb4e8b2eed3ec5a83fda137c710fc1df875416ff82fba90a +R = 0d9f57ba8b6a9a1cbba67adfbb938211ed2d267468f79ad39ea1eca7271d135bb67c18c +S = 0f09a600d97c69ab521bd1ed6bcf0c0f69255c334e0aea06c68bba81d53e810cc553c9d + +Msg = 9c6fce18a6a96349b10c9f2f5f1505c8ab727a650b44bc0782a5f39fcb48b45fc7c1b82180d5f229b8abfc807071f931d333d265fc940c93fae7520d8d40ef59d7c6e3678c6a2ecde52b6a8827b1ffc6ed269cb9832feb20e593a7e3d4708309342875199eb2ffceba7ecd707b122516c815e83e27872eda812e3ea52ee3c4a8 +d = 27ba543ea785df1d53d4ae4c1bd0a3a994cddf0c25d2b4e8ff17ea7aa00619e858da1a5 +Qx = 7d375a9e78ccee85fd795e3fe6bc07f50af3456edda1ab00303f6de6b5b02fe09859c63 +Qy = 08d0d54ab9a239b5ff955452b32bfd2372fe095751bea4b56d52f79b4fda0fa635f57f9 +k = 00ee7010af4a517502cc5d5433d98916f6750e8a9009ea04b8132268673d4a02a3e2031 +R = 3c147b66efa47a842eb90371eeae907f0c813ca0937e488da95ff8ee16d389f3ab902ff +S = 01469d005eacd9ac84a140c93ed0aee09083a4822730a28df35058cad29267eacf03968 + +Msg = 5eac15a64c7653d125605869012b8f036804817aedacbb5a5248a595ee0c12329f91e8179c187192d3ed0d4ca2e202d8d4d9c93ad3f3ed931121c193af5b47a8a5dc39775b6c2d702708e5134f77a31bd62eaf87e39e6fd3f2b9f782c3057e162dd53b3addf92bf0ab99835c7f6649abd1c5322a1ebb2ba313df9464a74c14d3 +d = 0708d0907d14dcd5f40e2903e1e90e48a0ffaa6d4d9b84ca14df4e985c294f74eb9f2d2 +Qx = 6fb0fe1c3d5bfee5399c98518bc3ff135e0c351243fa0540717a9b1f7990eb8cf43597f +Qy = 5212fd4d6a50c08cd99ee5988103fa639b1123c878d416cc553639bdcee1f8e927bdc8f +k = 151465f40204d76f3bfc2e4052549869c19da82c678c332f536ef24567ea034358866c8 +R = 0803d3e8c876d46a9198f2f769faa76c4f66bc5ff4298b9640ccb8e67ff8d10f86342c4 +S = 00da3344354114d163d14d4c288785adbf9a8b31371c6e4420383c80ba0a430019c6acf + +Msg = df735a7e60bc267b18f313ad56bff830be5ef119baf43ce27c6368ff1dd89f010afd4f48740b11c12101c5903bfa71d6cb3d6462cf875bbd55a570ffedf3564088dfe8c8d3148231b78b5adaa6c53696737d4704daa59eab8d986fc6e519e81540f201e77b923a6a4af65d7173635b3b19b2023022186a7b8e869e1ed51717ab +d = 21fb0a6b94080da8b8299b87457dc09d21bc430ba5f3359d92aacc1151be9941739567e +Qx = 179831c55ead3d11844fea2e18d25cd4d658822e626550aef1afe37d88aadbcc9bfd666 +Qy = 75f8087d759ede340157667c1bb12be272b8318aedf2e8f8b487f4bcd12a50ca66f9281 +k = 37833e9aab843a6b967264fdb705b419ed63fbb09c12170491019acc7c21b9ee28a00ba +R = 1c9601440d109a3f4eb69a1a669bdaab9f4222a34a04ace8ae313b10bbb66811bea7d5b +S = 3d2f9ad7595dcff69b65f035ce600f2667f8499d3bd25f789d3f3c1bf83d2855f68eafc + +Msg = bb107b0eeaf175a786a61db923bc6d51dad5e922e85e57536118e032167b197b1a1f62d9bbcde04922fde781665c1094181c16ac914cf6fbbfb27bb8346b2134f05c55a8c6b9b481273758e380666d6e22c28577c29446cecc5c3df9ed9f1be060ca55ab2b7fda36a147aeb46df0275bb923e0876b703452fab42f6b7ad2ceb0 +d = 2c80151f91301fb6b0c7685bd172f20515b46bf94dbc4160d0720fbaedd40ec00084447 +Qx = 4a62b0c9749ae9ff00dc1d50d2b4a4941741abfdf13c8e416549ea27fc26b14f191f243 +Qy = 2c9cdab7c6512c322bd200167eb9657f8e8c84864b57480a80a3c6efbaa289ab8cbe4d8 +k = 3df951f8c4490fc7c2d50a72a93e0e82c5a20be8d91afd890d6846bfd146169ab58b382 +R = 1f2accc7f7c4b5f877e12cc17b227e1ba110577c9f4e1785e6dacd8491bc6017129d798 +S = 27a167e6f2b43ce9663b810ed4f8ef15029fb6f2be2ddf25c014d844953f501d1dcf6d6 + +Msg = f47e49ae30b09b7666600b7a95e81b0afa1553da5e01fd917e4ce1b58dfaddb8dc8c03c0f5591f533610deb6a7bb5faf5dd1ec4103a587a1a4c58a110a706b0f301a5c408b3d984c210d5b4a0b347d2b5447271f25b527b3c7864f7cdfa735dfded47c63b723fa0f0413c57a24ffde9a95c35f743f892ab1ed1df704cde82d9c +d = 1538abd7ce8a6028d01604b1b87db3aaf720e04220edf4d1d28c2d731aa25f509e58f2f +Qx = 3076b5c3a12b8a2e1368c7e3458458dd7ba6c5a6dda8c82cc6b30d1ef767d36e015207f +Qy = 369c7a80cf01e9f32c08f9924db08a7d0dfa5e9a8e0e29b57f5eea8506841e6e3da04f0 +k = 3f0052ba6ae6bd7a7aeb077a764d21caced6b241f63616ae4e4f0d98d2bfc0e44dca592 +R = 01281bc0bd36ba1f3e1c262d98ddf4e9bf1d80dbf97db02089fdf1d2e625abb5733ec3d +S = 076db2215d9f33054efb397c449f05db198d38a24749f046ee20032f5899dc142052e37 + + + +[B-409,SHA-224] + +Msg = f2380acb0d869d1cf2e25a6bd46ebe49d1c9270624c5507be4299fe773749596d07d10f7c2be1c0b27e86f27b4a6f8dff68cfe5c0b4c58dad1b4ebec7bd00ab195fdd635d9fa8a15acf81816868d737b8922379648ed70022b98c388ede5355e4d50e6bc9ec57737d8843fabda78054e92777c4b90466a5af35dd79e5d7a81ce +d = 0beb0df3b0e05a4b5cf67abef2b1827f5f3ada4a0e6c3f23d698f15a3176cb40e85bf741c9fbc78c9e207fa7302657527fd92fb +Qx = 1da1761981a65cb5c77ec50ebf7acc11eaf44bdd2f70242340ec26ffada7a4b5f661e13d6e7ad341cd7dd1ca491cb7a0b580be3 +Qy = 19ba11e4c4f2f5507d6bd2aa2f96b03510a03d5f8c38bcc8acd08080d9effd1f8ae5a5586603b2e112964514c831bf786b2fcb2 +k = 091e575fc79444fd2d9021bc267a1a076438d73464726bd0fe4ac2884a374e71bd462b1516b3e97c3202854bd0a286214b9e92c +R = 057ab9d5cf4d18f05eaf17d3b5a4af96c3eda8ee48acf5e02eefdfe2f542cde32a37c04f285794ddccbb14383a645db040bda81 +S = 05275de4157b32723366a0d63831e6512241e3e4416f3af02e22da8faeabbddd761160304927a71cfff4d6e8937347c9b78cd3b + +Msg = 22a97fc0a9694dabc6f274ab52eb592dbbe8beeb646ebe6cef60eff341a13017eef980aba6d24ab3afd976e2f6a84cf652654d4a54a36b2f2f62fab8858f8b0479a48fe9f47f8fd5a4a1f3141a91cbca186507b2bbfef5e4c4d2df525f04ef7c4720fb443ccad540f03a2be468d88c9545d1dad579fd7cbcd103bbebc9e9f961 +d = 0504865a30984a9b273d1bc289d734d10e0aa56e93ab14720f1a42a27d8cc932cb8804b963175de6fe57d8eafa8ab7ea0592dfa +Qx = 02de5872c40a79d5238722fcb94d5158009e28fb41ea012e92028dc3c87855fba71f50e6d0dff709867de185f9a9671e7a91e2f +Qy = 0fbf607f69609ae96982bda3f0317fe46ad1e0207030fdca702cd97fb5d5732f3abab24b10669875a64bd2a74c8603897c78d22 +k = 032d0f950d10d028db6e9115e9944e7c768e2da731df49dc9128bf145a747662de08cbe0517fca6fa185abdfcc4e3ab604e196f +R = 0e7d16daa689ddeb08074285f5293bd9f1c051ca5589e69e4b62c32af110b6f3981d9624df15c7cac0ddd62aee9c41c7b6d690b +S = 02f6bdcc551aef0e4e8da2df38288dcc29fe600de2f8b6cd8149f88146150790915148f069372151c3bdc4d719526eff252e610 + +Msg = af36c04af0e3fd64bf52dedf52fb788d2d1bd67fe05d98880cc7ad3c20436abf02f637fcec209fbf888903fdec8682717299f8a4386768153b7faeb6581db57fb9aaf4615b4ea8d924198fdd158363a1f40312527d6bd14c13d19985b668c6b88a7548104b1ff057d07082eea421f50062a315bc3866378f2d2d634f03fbc0cf +d = 0cc08a4ea5ebe32027885a8c212870e7c45b6c610117994d6a42a284c05199414a3a0e8e6645ac5c2ebf21c505a601f69c62b85 +Qx = 09d2beb607f2bab64451327e1dc67f04f7569ffc0c67b410c6db06dc04edddb1362ce8d8b8220be77c447640e7d0c676e5ad1d5 +Qy = 0ab813e800e75b6012faea43be56fe9d5a22cd46fb1f4f1ba65eab19f75f2ce9d8187e4940fddc485c42cd18d40d47415a80b02 +k = 0cfcc307f847eb696f16af32502690711ffbaa2e60e75f80cbcf7704152d5eeb9ddeb701952dd58fefb159926a83245fefa6196 +R = 068d1c646dca56393caf3239d9fb30d1dc56f991a8dfdbc0a7b69d273aec69a53056d9553e105c7917e522ffe446cbea23227c8 +S = 01db30aceed2b126cf45163b9d878a6590e9ac8284a31ccb0faeba2202679f181eaebb664b5537f408b693800f24da590082dfe + +Msg = 6bd6f52a6204b60f37929aeff28c87ef61ddeecc231e52a7772275f9329add899c130956f8c50ac2698aad3654fdb49b74a6427a62a11eca0a8ee8b719b8c0df7b9f0bb0af5fef4918a8c83367d29fddd04b6a1ecad904471e5b59c8fe3cdb06b4f8f96419518dda960845d83c49a49f1b1f2fd1d2682a9d60c25fe3ce982cf7 +d = 07156ef0a74ee1119532a2a7e8c02be1559c3c21897af9d5b34553c3d0feca4a8d5929d1945df824478e0c0b92a6fac8c84f639 +Qx = 01df419310cf133408e9bdb32fd85f8f0950263e1886f2e2e108a596e7e76153ec47bf9b33f69c1128dfbf52557f3c382de85f1 +Qy = 16a15517a811c77cc67ec4fe2bcba1290e4981880c071318aee28e30854692ed2d6bfb71e6e74fa97af750889ae8d010189733c +k = 063f127c38160e85acdd4d5dee1db1c32cd9da6075b2d2f46b010636e374e0262a0453394aaa8bbb5fe7b2dbcbcd62ad601cf51 +R = 0250cf50d52a5950999b9c0ddef219218f76dd9f22a2213def9ba98d258c2f8359d08d0efc208e23ea3614c9e27b2e4576b9c12 +S = 063479550873dea8a3ec0306ffa9252739c34c87bbac56d3d9138764347d5220bea9c27d6a308dc2ec53724d6d3ac4862d1735a + +Msg = 0eb8de25f63abc9cba16823270e9b6f3fdedf0fb90f6652a34688970932e3ae98f6d3bf0fefc5f247f72960a6975bff1f1acc2188a1775fe8974b2bb2b4c8d226ceb735113a14009e8ce66d58808fada4e6f697fd016829913352c0f659b6be354a067df00cf74919580750aa6064f21264d89dcb28b3b2d4d699115c36d1310 +d = 0a95c7abffa92e2c637611ccba66ff9d2ab121b40a85c5b71454cb0dca1f098ce1be8d9ea4933d1a91bcd270c5a33687835d6e4 +Qx = 048e6b8614c0c7156dc41884e17e36ef528a493c28c9e6275c3454d83beb939ccc74952732c18424ba21b8ea9c528966c692141 +Qy = 00ef9efe1145029d8d60d14dcf079d43e3cea0e18010f680bddc2729ffbff9a981cef2cb595a69142b25a0a39863a929adb635a +k = 0f43af45b0dd631bfe38d85979ff1612140b9cf80b4504857df17279d9d8ea12d5bcd2920fcec81326f15832df6774b9c4bf5b9 +R = 099f403ced566fde4d9755258445b6d6c2a4e234f99425aaa78ef118321f8579fb513ccbb71cc2732e31668a6a6bb0fdc7f4018 +S = 0d8568971a4f219d6d3d8bea6aecb4bf7de53886d2e6bbb0f71d054c63768c34d4d1883000019c59168fbb32f4317330084f979 + +Msg = cad58ca7a3b9967dc0ab62a43037764f8074ef9177d60bd98f623d693333971c24a575ed03cb61f4dc2e3d6285fb1204502a540f3c0bbbf23f5bbbd1544f322ce35d949d8b1d8edeb82e90927ac67ad49c91007056bf5096bd690d15ac00e1874fe33293d8003a4a2b094078cf09af799dde384143350c54a99e1f99cc31f2d1 +d = 02c438b07c6e0685d1f94a4bbafc013f8f21265d893f54e54c3ac2071606ad1ffacace0b8367aad724b1d9508c65ce52282e397 +Qx = 1fca66bdddefcc3c2072ea32f026c975a2c392dd7ed7e93e94a810e1125ec161bed698d8305830eb66fca5eeb71934ab3fd79b1 +Qy = 189c22a2c9f1fd7624f805fdf4faeeb931709d745a3feaa3cf04824f5fa58bbda144d4e96d83ce1e3282bd5fc9c50bcd68f5408 +k = 09230aa7b58505e2dc2f205b70a09cb9f4d8272f465b7380195ede0f7770af2a33f7623c310a0520e7436835cfcaf32467f154e +R = 013d0e70d8f4b1563efbd3c46feee15b88358562f769046f39df6d00477815e6b8763c023807eda87a86338c7b64214784fa2cb +S = 0662f43fabd03a0c05ebba700203fa2188e16504f8655bfd0fd090b109e68220122dff7a6cbb8bae08612e0d516e9f95ac15368 + +Msg = 281ce2643799bbfacc7d5993683a4fa656040517854f3c2dc7c4f8848dc305382e34e894d433caf12d8b493020a6a08d1fa05b08bf6c53127ad5f33bbe75b9db0615e3dd94408d028dcf3cb7598f6e7cb4c787681dabac7cba2cc06fccb7506fece6c7c1c1bf622d525ae9737085ab4ac578905950002024f30159cf0d99f50c +d = 09e8658f8f9e6cd98c0f4f0fd20d64d725653aeba339504def17f3ad12a63dc6157d80804e5f43f4ff48fc5573fde2c615ed31b +Qx = 15088531d914113a25f1598ba1d3cc611e27ea92ce8dc807fe8d446db14ef62ae2f06c293bcdd739f916cfedfc481fd941b4feb +Qy = 0a9135dc1b0384e7169fb4648973559e508319235a3f41ba174d5f58307448671cf22a3649168495c36b0bced09ac6df98f14db +k = 0d398fbed52228fe16d32a6ef539e4ee3858a1df327bec999ca25cdbc357de5a75903909973bbb0a5d0269862a74623a38da515 +R = 0e38910abb3d84b2b26ed17d2124f4787dc5612942e98521d9f94baac3d14159eeef9e09b9b20c807b479ba84640730a4ced4c8 +S = 0e370e575302ab0d8d08d5270fe89ba524b5bf21e43e70c4d335ec1525ff5696ced37f0de17e109fd833e5d179bcd4df42d7882 + +Msg = 0c061da1a16f2be130ae3b20b89745e840bee09633fb49671db28ec9a051545f57ee07e2410ae7ebc61c9af79868d3047705bfc64ac0c04ef0b286e579b650c7165443631e49e6a53c84cefa5625b1e1035a6ed89b8e839540040151132a937666524265e099272c1849f806db0fdf2be64960d5b5853965099459968e5beb32 +d = 0c4c13f65eacce85a51881caa6f82d9e48ec2ac574947d2751823a7f072d38bd9da0cdf30b6f19084a6d291052e7bbc2e1349e1 +Qx = 0af93430dd77e6016d1b076a52126a729f77e34bb3db11328d9edd56e29a7a09a7b6a54f72076fcba886ea78ab6ad81de43a821 +Qy = 1419e1bc339c03a8b4413ff009d76f9a19e201876ebbfbb3dc771b7df07bc19eb893ce23e40c679d7909c33af2bcd7d6306c0bc +k = 0889be0918e7ef34d3ed226f967301a10fc30111b3559e37f5fa5a57dd5c73ff672c5279d096c5b04c68b71d55e549d019281a5 +R = 0a4bddba9b7a402b584ceb82a54baab61e81973b7347e6dc9e3ce0f1e50dc21c9569d8ecf8a7da97c38e92e52636eb13d3b4c02 +S = 063c7291656466f7bd647073a50f410a2cd9e8c938aa1fd3b28ddc1cbdd7b78b757689dd661f5173f79896780ac3fdd4f3171ac + +Msg = 74ac2e1303297efc3ed8e624722df505df55b7f33964cc0d270604cc48b58205d8a11952232a8feb0079baa30d7d33660268b56a5a3dd90105f0703abef8f6636a99bc63bd47d9df100351bee32d8205dab0dbd2af36fd173409ff8d1fb7b24570f3c1e968458f58aea5aa2f46731ee91ffd6d3a060af6b3d5020daf1362af3e +d = 0da591461791ae7847e6d8dd8df46a63d3021644abe9520e158406c96540d8fd82ecfb1c3f6f5cfd7688c7656cc3e3dc94e586e +Qx = 1f48c95301956c62e2fd931df49953519b88ec3915c8de495dcb4ccba97bee023b1a6cd9a66dca29aeef8f4f1117eb954e47cdb +Qy = 10db6bf78cfeb92d29a922c4b05daa3cdff3917ba6978fe738296956ed141c749a938ca9f8f13f711aec930e0f1948ce7daf9f6 +k = 00576a91862cd63acc067563626977fee6f074d5726cf4f68e80d25029d4b8efe5ea845745c45e4cd42879e52854c3f385a10b1 +R = 0806435400248ec38a6d362e8b2cafc3f3bd46ba5baf538cd97683f76a733ba2b4ca85fa7d13b99f4076e7616e68d66f05ebd8b +S = 00ecae395fb324b4366f238f0df22d011bde5db6b0cf4189e3ad47101067ba87336ca47d637f09f7a40a1bc64de8c4aef7f497c + +Msg = 2afd17344552ccc577b0118caeb7dd56a0766e25f84df17c0505f9798931374b48df89a48c64e199108c36e00c0bf00a97ccde55787bb97c6765601765ab5417f3e75e35a9fe5e0f85a721d9f08440ed617afcdc200b318940a1e496040a6ad9090476b0fb4fcceee77b3fea11de09e7fb14853d1fff8ab12d66c101257e2d4f +d = 0b5eb943f0dd390b737510e2bb703a67f2dd89dc9f6dca6790bc7a260cb2d0fb8e1a81ad6009ed51010e7686d5b48233c6c1686 +Qx = 01ac00da454bc329f7c13950c848392cb4f31594fb7837f0986f61601fe244eca3db6c4f92accc2fbd1a4b8597b70e72d88b103 +Qy = 09a364065a9f67a0aa7518b75a0b4a9140787a67f852fa31342d6275c14713d484dec3116b9dbbb8af1d4945639997ded09cbc7 +k = 049176093dcde8549f95a8f1d1c87230046fd4b18a73243c3599815d4df8387a843bc8fe1fd67f3c6bbe394547e11866f41acaf +R = 09d7c4ddee55f61c5c4c2ac6efbba6164900344004976381c7b18c1de541a97cb58e14d14b6e433c4eb6d4bfe6d3e0a4e457469 +S = 0a9acf355bad544b3b120522365bcaa1e1dc6f1d3df1e30d3beb94f639e26147a81d154a684bbafac965bc39974c505fd0f811d + +Msg = 174b2b083541f8284645a810801e72631a11bd7bb805f684a7159e055afc44357f2c80df2b7853678d34a04144e0ede2327d03db6df23769ec41194a8d9d86af74d51c5bc11ea878c6a80689af71d3fdaf1c651003385332a512e03dd040c33d9c328ca89ec7ee9026bbacf30a7f3a68e0d894fb9f7100ffbc64bf17679dedd1 +d = 09cc63f32152284fca27ab2837bf1343144336a1fdf15b9727c47e877ac69ac9cf4c97b4bf42f1ab10d73de8597a554ed099efa +Qx = 044e655ad66ca9af330c33bc6d00ccbe4533a4c6a44a3f23c921b62eeec8cc1918e19956f3ed848fed93a7fd7ddea57096d1f23 +Qy = 03a71b221c85607821cd864af6f533f216b641ceae104b8e16dbfdfe7edcb2cf9ee0dc1679b696149ff42a051c51c861a3c7530 +k = 0db9bfe4c2e659006d31a7b44eb7bcd6dd23810f27c74dd587ab9af23aa5962dd18aef1e95da4ebf4aabfd558cbf72d2951bd44 +R = 0c3b91bf0794eca7faf227c4ee4085eac6d6918803242bff4da9c5dbac2e23fc32a4d4a192d7737be22810812558f820b0a2c13 +S = 03120a558c0edb58ae7ba36e886084801e7604558238c85a199af6c9e7506ea4e748791b04f3a92354a4f1407837d87faab66ad + +Msg = 758df71a952cdcffdc417b9fffdfb57582ab5c5473a8bdf0c2101953b023b77824263353dea0e2ede1f800a5757ec6ac0e1e4e3ab5a4cd85567d2d19acc6b7069a6e7368401cba2b6e642373654bec0ddd19fbf032794c15b7ef7e714e13e36875262c01e77766ed53cbcf735936dc9b33eaf2152a396349c82ca0297dbae4a5 +d = 09950355e8667bea8bbe3a2c4988436ab5394551b375e27fdc0c1a1d1b07ae957932f428f1aca0a486e54cd0b5bb0a5c5650641 +Qx = 02f623f81fb9a299b71ea8c58d5bd7d89e7be66ed8cfd7370de515eaceac90364438338a3fcf9981f1b6f0b30bc61c4b7c15791 +Qy = 16130b7c4061422d70b21251fa9c3d4e9636f5a08cea794a0fddf74ff5ab1b750cce0f2768d54fb2fb75e2851c2296b39c0ddd2 +k = 038e8c70cd35591012f45f27980095c4bcbb3bd36bec594927968d3747618c7f5810ea9e0a126e4d3e1e08185b031dbe0b37e5c +R = 0cf957d59b03aed0e48189d2b9256b5472c8a48b4911f9cec14adce5c6b4aa22d093a116364bcae01c1a739a4023da12a29c058 +S = 04cc2c22b243064758f52264ed84e757ff67c4f6596edcfe956b70f777d865d01e529f0a8a9a6e1895168780ab60950a62d2d2c + +Msg = b96d9f66b2000e9408d602096f032b112f0e05ea874229ab9daf6e05bee49b4722e4f2d8bf2eeaab9dad94438c76b7cc64dcbb59cb4e03f9ac70487a1d24d8d6b72d7462fe738a17edf381d52179b3acc0c0177c113eb4d10e8e78041deac1d56abda0ddf892edb8be956d285e7236bc6794168f8a180f622dd5f2b9e690c275 +d = 0a995493d6971c2d7e8fac3da9f8c0b5afd877cfb94924cfecc167f9d87002136ab253e3a4f9ddf5c9c99bb1dc1af0c6a3a3c4c +Qx = 0ac0e558dbca0fa6f013b7282e02717e91eb73304b4f7ac5e04f12f55824c441faebe5bb5af82189044827007bffb1e26557941 +Qy = 1178bb726242c718b416b21cdc9fd90b31ba6a8350f9b4ce3a188b1b5dffd0e8894ae6a417c4d74c920fda585624eed4c1d3f99 +k = 0d581293ab1e509baa50852bd3f21f6493cc524a2c16206e461e320c7f2c1c201b9d2a1dd4207227592a6457670a67cb72eeb58 +R = 022624cbbae5214d2c29e273c334b9ea78e10c7efff3611574d5fdf6f67a81472b606e0236aa47106097b9147fc1b56d062966e +S = 08895d107ba789d88a17c30a537402591ed788206487697a72f69285ee5eb4f03cdad6c2604e174ef4b9bb919d8b39bee6231c7 + +Msg = e7ae60ac55e6ba62a75d5328bbc15269d4638764169de0bf0df043d15f9152bed909b1fb8c7a8d8e88ac4f552c1092b62db00958a3a827f64896f6de4bbd8fa5258d6c36e3904d82d3eacf6eedba50b0242eb6b01212288448c3a9821c4fa493869c01149ff1850e8115cf9de1618cb8744626b1951d1de305745507c8b21045 +d = 070daf435cdc26ad66c3186267ad12d10f28d32d863f950cbfcf042fe9dfce553750ad098f82f7f1650c1126b3e4451bee6e11f +Qx = 19b41af3b557c274cf117d501ce7ccd04d8bff2dfc737d7efcd7888f2dda24737a6788f16b3b6cd589d3f65bd95194799d65659 +Qy = 11983077a2c371fcadbf47b10494f6ffc7ca8873b3d812c45a87c48e1b49edacc0ac37e5038cf1aba20360b74c0903c23a62331 +k = 043fb8cb87591747d12f4897dfbbc79644b87907bdefdbd7ff0f6f2e7970c7d40bb2fc08c17443d029a92487869f640607af460 +R = 05ea3493a8c04723de9de2cbd523481e3a8593ae8f010ecbd5add6db5a82d9b13ee7d24ecb417419639d0e9f4e68d14f6799829 +S = 0a9bbaded0a2894e384184e166bc06e1b2fabdc70536caeb3d0cd46b955743cfa8ac6edd03760d1b613fb445367734fa4270139 + +Msg = 666b0dc2ddffaa7ffd57ea3b2768f02d4b77c16fa007c6d1918400d195f068cae2dcaa69817e6e4c70d5b29c5598efe2d957bd12d0fafdcf5ac52dee80a2d46e77fc18cce2a49bfd787ff77b942c753974d22434742bdb494590d17c42af725b1309e54566276af3bcfbf5e174d3cf191b85903faafa1583282c97e66c5da6c4 +d = 0f8121980dfbe9ad0bf92383c7cab95fb72d5caba96e1de7772c6a179e85414802fbb86d725401451329287305570ec7fdd873a +Qx = 0c62f4e7eaf3f1bbae71734c86b8a40ed1297b9ba1151729f9363824425193e8605c2bcd6094aecc9d7ef2a41aa6b12877291cd +Qy = 1882a45555b68596dbc8bb093dbf1aab9900cf46653c58f5656f3688fbc72c5236297be2f0586a4031279b9014f2d3655adef41 +k = 0b4b5b19922bf6a34a00454374589f9c89745eb194b0352061a79401e23c0c0e1fecd7597b5a7cc1c463b76cce7ab921867de00 +R = 0f1fcb80a4fb49348fb326e808d8ed8c21c376f0713429a22bfe16d68cab0295b21d44029083769761c4fb853662d440eba4cfa +S = 0252a94a40008cc2c1a69113d8e14e989e7fe13918a2852de6930973a91784eb35e20d8ae150a88c459167f8ece998cbf6c5eb7 + +[B-409,SHA-256] + +Msg = 3e967cbc2bd936e0b6125dc5cf885735bdcd2d95b2f764de6931c4578ac8e0e87abdf96375481df67dbe1b6c43537e84ec62bfca6672cc5f3ea4125abd4a4119edffe04e42411d338e8b10abb1f1f818c50a9631a3f89feb5be5367bdcb0a8a82c96a427ba6ce99f9631d4411a2b7f5b14d32cb3901dc9d285e4cf5508940942 +d = 047682b2e3bcb5800a531858e8137692a9b1ee98ea74e929ce4c919c26ae3b3f1d4122d07fd9a70d8315fab727ccb67004187a3 +Qx = 17ffffc1d2009e844f8e625a3bf11749a8b4ea0b0fe3532d124112edddf72d518ef577f160962b88ee38b11445fdd356a26bcc5 +Qy = 0ca356fa8e90325aafb1826a694a55a80b2af52e70ad8d507d48946392da8b9fa27b8ff6927fe5130c69809d9a2c4b1d7eff309 +k = 058edc8f3665ff9166af55e69aab9d468f576bcc8f652e950082a48224b4923cb9396ed4ae06f05bcf7797352035484fdc501fe +R = 09b46600fb3b8204d4cb63ddfaad1482dd8cf8652f63c926895b8b8ebfe27295c052b3bb81dddd8687f4864f258a433010c89d0 +S = 0832f7674eea791b5f17db7cf9e2ab13253d870c6ab46ad01cdda30e78db8b8f51fd377dd55ec7786ccc92b17364a3c17ad5be4 + +Msg = ca1c90012eba4e7c5f01d8cb3814c58f48c03a16be6ed86934014365eee547070b870d1d26a872cfd28b60d9ee0a66dea223e9eaa90ee28076188d6091f26f665684f4b486af70669555db9058d485c677b2a34d4a98aa8d6f43bf6f44aff2a23c5d765e98f0438ab81be0585a5be29daece5d4116f44ce6062753a3ddc505f3 +d = 040cd1a06233ac27f3ddd108de7c6c0982793ee620d71982697713be9fd5143658929924cc88747a680779bb00da8a44e1e7d3f +Qx = 164e518a6719b1ad61a38a214ebb06dfb0553bc760799e668b1d0d098ae3f06dffd9b84c16de90db19043d72bed2601fda14b1d +Qy = 18e022ceb850eb1db59e6cf63c4a7c73bea0b70448a7dea77d5ee8a2e1a36cbc46454bacd5954792de82f3ec21ca6a509b0c7aa +k = 04a936fccec003bd9e8eb45d27c0eaedbd452e6fe99abaa62cbd0739bcf259cfb6884d1e60b82522c6146f081663f6f863576c9 +R = 0dec1635f2698d4666df2c217fbe3e644d27592c5607a5549c877257cba7bee29a8cac75a044e72d039747d0d18de1c34acf072 +S = 0138493216ffc3b8aa2e0c26f4fafaccd6609e6b15f767da7c907db64b5181bfdb447d73ede786144c70ddce7df7eff46dee4f2 + +Msg = a54c4351ebdb075d6a42a787647390f864b2bbfd8bb3d0e0ea9d767200fa344d1a9ff091bddb186acd69bcaecd767068efe4d752d185bfe63f6674279d0e7192d2077c400bbc0d5599ee28507c1253f05eae0687b965a015e1f3a292b4650106765266f5c95b77ad2d82a6a6e012f233169eb6b8d83576901cfd4a927c54d7f4 +d = 01ca6f752aae4eb7fc9c73a08d6fbd96bfde5030d759a2507bd45b6e1d1487e53abbe98fad4f41976364e0a1d830910ccf97abc +Qx = 0f6b7220bd24652572b37a0ff25e75f72d583c71c159857482ca9944b956a117a6b2ff96614898757b8a587e3c2b78d9943003d +Qy = 118fe425768bbf3a4acade281c41c745c9ac946c2f8b95d65787fb6b64deb71e6b38fd8c721e01c87efc7c2a6d8066fe3b35a0c +k = 04963aa161b5ffbe5d7e5058f0b1457ca1b9cd61d731a0470beefe5f8998904cf4594f98dcb41283f66e2b07c5c5d6a6c587826 +R = 0abf824d43d993107b552d7ded13f49ea0ae7bb845e56ad7e53cc5f9d64f99f9f250e4305ccd9f6594c92defa7f6860fab1c349 +S = 090a541f1844357f618e5ea34c0398ccbdab0cb363e266980ad304dfd675bc81c0345a4d723fbcc76ab5ed4cb0ba0af1b71bcd9 + +Msg = 6723dbddc8720feeb75e2a061b7fc49079f999fbc79ec8a8e01ab8d35b438b7049da5a23c49a58101742791f84f45d5f5cf551cd7de6926a0e2c4ffa1e378f038da597368c62df8cd8349bf046de46d02183dc05b3a3575f5f232dd2970057200e2c9cb60eaa6b4d72f8b73d4d40b98d1cc801d1a69cb5ed780a75a4064623b2 +d = 0fb9b1a9597d216028902abf743d25944258b48c9762d4589fe660396130b75f6006cacfde60f6204463cb8c18b032de1dd68d2 +Qx = 19b07f7f4ba100aa9e749bcf93a2c9955c442730c5e1f6f72c1b1d132b780d92f414a533282f7b66677c8cc8a3d5ba8b3cd3cf7 +Qy = 06ec6e9c495ccf600f8c19597e9cfdb639406b04f57a29dcd1a7a843c2c44e8321bb8508953e9c0503f77d36bdef24d5d39f85b +k = 0757f6acf74eb02b7ff3161b476dfd8349854154186c959179f11b9a15da3dface40ae6ed771096e053976866433382e640283a +R = 08fe276e7f63ce5f85fce19d1739a8a9986cd3c3fbe26fd59324efd98826f9db3b228321b3ad1d96145ca23cc02616d9e9d7aa6 +S = 016e06de8e3e0abf4a4f52bd2f827ca4c57412adcce3271fb4014069713f3723a038bf560788d8dd48430d3b30faf15ad9c0d69 + +Msg = ed53cec5e5500d62d38c829002916c657674ede4439c6f405ba672327ec677490e656bdd698f114c2ab5e6a1fc94a1a8d64466cfe9eaabd23a8b5c37f76a3c0decdef73b3e7b751cbf3b0817f4079560b5ea34cead88ba374201236bffc48eaf289bbaa4e828afa7d732473c228ad00588c9b443d65b998f21c3d7a9e9196c08 +d = 032109202d754da290c266f74f47805a06e6b5c3f721a72fc97a3bffeb8887e0c642d49a6bd034847d0a5ba09239c5dfdf0772d +Qx = 0f4dc8b94dfe0a27d4d41399005b242c3e5b14bc7cec55ff3a1561c894d73f365fa8fa2ccde1fd7bf3760b96ab2db78d2d50b03 +Qy = 13ac66e95c335b71fd1a98f101a392dd4696a806239fbdd0708acc69333febb48d4b649f14f42841d66ce03f1fb557a361c12c1 +k = 0b010ef786c13ece3a10eaff79b93ef3899aa385dcc1914e16abba90de0ca6389d664082fa727fa7c7907dc4c88bd621e6124c1 +R = 0488b8956c5999c317830206fc8b9f6760845c31bc4ba77584925dfe25c05a1e7d298a62e9748c7278eba622713df59accdd78c +S = 082701053ddfaa376c99cc42ad4587d84a358d9d8a9533888cc382623114aef51170de77ecf64af02e09bee203851abb22f5d11 + +Msg = 13829401bd41e9fe01329e9f5a002f90f1a6ecbf25fc63e7c1345f265ff02e496230f706c6ab377ea52d8707b54f8fc5c7f089044e2bec1dfc66a07da76ee12fb9ea0697d87706b0ebf677600bd2fe117f6cdefb8bd636a1b6b97549ee78f992c24acdf3a946053f06fd012a9c703efb8bd929a66aa74b05d61bff0395232b00 +d = 080536e820fac59b3203aea928475043b2576446619001647e35693a9e65d15236c3cbc12e1bbe0eb305973535c882b70197a92 +Qx = 16d7448c0afe992f8c59b19d6cec64d8fc5b10026a806760bbdbbf0012063f46d31e521a34771f826669c4d1ddd58d3aa13ebc9 +Qy = 1a3742a6f231546f0704345b9b83c72d5036522449cf60c1b3bdfa4c8d36e499d4ce62e6e7bb05c6132bed1ae44eed17414d2da +k = 042753a515e607cf9992dd1f249820dafe53993b59b1e57d8f2f9100f609cc15713d27f5dff4007e078d6da1061ddd36c169c21 +R = 07eeb1cc19ac45f52c0b63ff8ecf4f4f35958e86cc3e3a071a35446d490a426b48b6c287027b003488573a4834a06dad48520c3 +S = 01410d85f3f2adf065b60a126170c43e34e0883338118cd33b0b3eafea1d142480b236ce49d35fefd1ce4ad3d25e0cc9268b1d2 + +Msg = e696acdfcc96a6c088069b7595ea9516a36d8fe04dedeb789fbd965db0cc64b7017a821015f6210b6989e515def5a9605fec0d337e4ac59f3101a505168bf72ab6d98ec62a71d2f94071fc05b95e98d4efc59fedc138e3e49c5d0b44d1f48f7b1e7c1944ee189b242950d2bc804d31c7eeb45283c84638f043ab9533976433a4 +d = 0b05e5f0dad9583ea18fb8fc4d8c75fd2e3cf9e92cdd9b737485c953620d345006c31c288b380258b6500b84f729ce6730e5303 +Qx = 157c083ad9789966905c212dcfd7c049a8ba3863fd4886e4b118b3f06445fb0d4745c2a8a1193dc68915722089d0d382253b675 +Qy = 0867e8efb575800f834c978ee2ecf0f84f72e75dbbac86926b73fab8b47f38eee17a63baa02e3edb9d4f6b2fd2afc88b6de36bb +k = 0c72eb08acb1d422999ee8d51f9ddef9f897dccfafd886998edd3ddf30a638dbd0ed59d68885ce242fb838f022bccd4f3b5f854 +R = 01f4dddcacb088f6e24d331e8b111e390735a41e1fc29da8f5ffdbf7342f4b9056786f2a67159d1e57570bd69d69235ec562416 +S = 0809840df1ef8fce9b2edf8f970c07bdb5fb755e9d5bacd7996275c4f890173142c39299ce9eeb51d21a32acfc7761d5a2cd7ef + +Msg = 4058b9a8cc15ac148909eb97fa32aafbb6077b168dde91a411dbc973df7db056dc57ff78f0abcb70f70f800bd752197d681f44df4a7817c0e7f60f8f65489ecb6167c14b525e91fd2cc5d8b80ba380a83d031d5827c8b1262c687c90ef0e62723d9b565557f9f6fed0db48f3799274c2cd60a14303406c35802cba6261121296 +d = 0be1d277813e79051ca1611c783d66003ef759b9e104f32298017fb97667b94dcee1ce807dc6b4d62416e65d4120523bf6a4edc +Qx = 1fed0171b5b3c6d9092a6592944680a08a0d4f99f08a3ad1c22b5bbf11c0e4ab3cdae9526b0ca2b1bbd961362faccd5caeb1d37 +Qy = 1ae7d57db848e5c86c31f542f1995c76e916dea9aba882865febca630bc6a10ceb6732bd5f07f51bf2f37ecae7b7fbbca618ae0 +k = 09e3585213c6d6706524e3c8e753a2eb0edced626498eacd842d44a73c602d801a079f94b781ae1ac5d44209e8e3c729ed4e820 +R = 01098d98cf83c705515494cdef8c3f50ea8316d95b3ca5f9a1296f09021de57930184ee4b9f563aebf5fd0d5abc0885cd24c0f2 +S = 0d9706f4474a8fb0c701505516699025fde546a21a3fe519a173a3ac01f683d40b4db2642330bcdfe188693b15a476cd9339ae7 + +Msg = e793237d46e265ab84ba9929b196405faa3b0e4686e8693567e53f68e6991e57677974677682a2510c4c35b1968a90b32c4941af7813775c061c008a60f9f671cf7419c94253d6106b61e65034497f2d273a5058379bd986e3d917f708f0a2bebdba150f6d78a3af9c722a2430ab0f4bad602e91e18aaf258e3785fee78e4502 +d = 073c807bd7e07379782ab790720de4ae5106f16d34e80ed70da5b1594e660c9b775db94066b93e74f855f57d88b6ecc6228aace +Qx = 0301526b630ac3fca5085f633deadec27af353233e6f241772c7fdbfa42e47a04b0d3ae38c04eef2109390a71fa9fda652343cf +Qy = 137eacd97a8449ce83f19a13a248af52e512cfab3e2ce1ceb789874cb08757dd9e47ac21b5c0846498d8d7cd90122c437602d52 +k = 09245ba1873114ee2a3e642c5b15049a3566a2f003cb3d25250028655fba98203feef5f307a9f4c77f232976d83723f2621eaa6 +R = 0c8136d4b998ca0544ca1430abf55601f259aac7756c75d1371de63d1471053c789833c5cc257e323a71f80e21783df4efa169a +S = 0e2ecc6f0a418bee5de7c2418c4ad85d981b18048f94865821de696488ee19291912ae7da1cf5fe9708e2beb18e6cad4e3f7849 + +Msg = ffb8bc80e7619a562d8506eba7658bef0c25ace3dc1d01bdc2ef00933d4fa07b80364e5e5826074edd46a707dbc3b0ab19eec7ea8990839d7fc0a80b70661204c52bcbef57c1a7bdc861c10766033a82dafbead283d911a9502d5f9ef0a39d35ef26f3616212d4bafcd413ffd18b424fe09b48ba02ca5d97ec996205cd49d22e +d = 0a68379b2296a6c944ad5dacb593b302d8ef0b05873ce12bbc371d705f308c739d21f343349524aa72f05341e64f7435daef112 +Qx = 07fa0f698535b011833dac1ac96f3739ecf0c29f7fc1f8bd635f4f98daa70a39310611ef51b2fdc8b37eee3573dc34cd2528d39 +Qy = 0be1a9dc30dabee3403da4f2dac6622e6fb8496e72f3f17c169e7b554efd84ac655e727ae9520feaecc752601d5391270cf0cfc +k = 0630547017103c3f97de48ab6b942db94b2db9ed7dab0391ea9e71c1b788c547abc90088de5b3e36c9ee4280bb454c7c3710999 +R = 0916aac91ad329d6f330cb051941c781b9e59bfbfe45c4d4f6ce0d1aca982e1c612952bcea06784c57c121b14cc0dcca783d0c2 +S = 06a83d93f9bb81c61ac290906d74e2d3b964c39b4e96370f19cfb4a55a3f7901bca3deef4bb79ca6a798fb9b3a9b0137c5a9324 + +Msg = 946bde90a5b903dd281a51d7fa93d80f3fed07eaf50c18fe9fac5acf67326bb18effa3144e25c151efc006a50a274ec6c6a5d573051c4e2d117ceb0fa125acad07a10fb6534a8e5f5b3da2a1136779c51377bf76c3a4a93c0c6158f729f2293e414fcb952c9509f228c804f0adc1daa327a8991d48ccf4f3957c5f8ccbe3ad4a +d = 026046bbb269ddb1ec14ade56175482343a21b7c265026cef3c7d6a1ae0f6a68166b9e6c49a6e733ad2ad64df7137ef230038fb +Qx = 0d09d8118519f9d00df7514d2ff99483473f680b750604580b61017513870a3cf1c403495cba488309e2c084079d53139a36953 +Qy = 0d25e41038c18e4ba6f4e9d14f210b71f27b8ef2c1d4cdd5f63edf8fe11d548d070177e9ddae382fed2b163ff2b58546f10a99a +k = 0d6b0e5d83155a035248ccea95feb0b4d1af818e5ac6d5f41f1a255dd8b482a94de0f4e037b10339d1805dbb6b22af6ba834219 +R = 08059524790304a37f2a0d57bb2b93cec79a827b1fdc9ce2d7dfd4d277e0f71844d335314a30bbec5598a399e197a852b5528dd +S = 0e7870e2a0ed16cf340a04fed4d2048e4e231cb8918345e1852bcd3e30413a2219864851121a34fc98dd99976e2b20cf1d1bf2e + +Msg = 07f3fe1369ebfcbcacd66675bd4ab22edbbff72e68709cb57d4f590e49440f01691f490c58b5117bd24aa2fe2101b59c61c417c918ea08ea34bbb9b8aa17491ae5d9329affe894f42d7586017877fae3ce35bb80c97f92a004380374ec91e151995166e14ac00505fd1fa810cf02981bacbcebf5f81b2e633d3a3db6737890f4 +d = 0bbcda66978ea526f7bd867c3303b625f11b94dd9ee6e2c2f8688ff07f2bba83c662949d47ad47fa882cb7d203a7f0ef5dbc52a +Qx = 04cf5bc624553e833ffbee05ab863e5def062e0d57c28e71d758d6ffd3839504d7ed9d3b1a040bdce8e187ae0b4ca23aa565b01 +Qy = 0fc1a15b4f273737eb92a56928395f6518e05bf946afb65ebca3787f7f8bb3d946dfd26c4831cfd171b4c66c2237409ebf224d9 +k = 0a2cd205d957a20c79699e91684cd22746c476a79245f11e7cdf7e6b74f07cf2fd9eea65eda97e8994aaf51942e15695545abc3 +R = 0aa1da120fc19523e8162e6018e4ee053eb680ebc7e31d00db34f7b177c74c5e6ea344bba3c39ab7ebcd92996a1c156180b7dc9 +S = 071aa4588741208344b323642fe03f1cea73865ba645169df9c84bdbf7488829b83b8da172f1927de1c8cc318ede545c748c782 + +Msg = 3a1cb13438e3bac9ad4ab1d319e90e2c9f118dcf1eb54d6333c674a665d41451f93cd4a9334cd057a44c010edb668254517a63700a31eb0ca474c84873e486f2f8e158a1a7735362ea0cff8ef17d959ffd851b21a91412709b3c729474d2cb40f6ca0e397030eb2611b402916e4b656f0fd868247d80be3ce33d52054b7661f0 +d = 09be3dd3442e0330750f0a6252bf9cb317f32f942ae516a4038dea2c40ca6484fb33611bef016cc64baf166c122e87c15466fd8 +Qx = 0f05a6fdbe6f80c0f5ef3322d8accda4b9ae28c91b6198b888be713afa5e652e907e5ca9aff5fe77b6546115b4c732bbd4010fd +Qy = 00923d07aeb8c947688e7d3dcb16ca69440e2a89539a41b8fbb797523d3b766b46d257b87472f5084992422cebdc4e45556f5e4 +k = 094fe051a13ea8dbc89c4cc5511881a48ef5554de265f0badf8741ae5027eef25c617bb6a3f454a992fc68f5a548903809de09f +R = 0162687730f0ab2f57e348476d1fa4eaf13199ee44f44dad5807bbea4e5ba79e92556f287cacbbf1fdec9a8b78f37e78e52dc1c +S = 01acc734e2d0c81a56ee8c0465661c365edae56228ca43184ea1d7503da3d38e7607b1590f59f5190e5c7264cd0d7a39be71069 + +Msg = e58e7b881a563d54772125b2863718690a5276c93d9e1c5feabbdb5d6f7c7293ff0f89805b53663bb417fdd46874b8e6a466e7e3ff6737930a0662af1d5879b071b0dc4d014778dff26a2eca5992e763bf4c4698c382ac947215aa116515876008a56e5bf547857049c38a2d3737ed3393705fd346897c3beb80caab88e5b8cf +d = 0ed321fa283c662e87eaab99b7715e6cdc9b42e14fa5bbe2c56fdfb381369191a42da7e574839f90a85577485f19446fccaf6cd +Qx = 1bbb34e6bfb1c1335c48e8b44cddd8a46486fad4313581df216002b382db1d58adcae74af0d38445cac2f6cd9e2b439d106f595 +Qy = 084473a5da9f910b4807ec5ff450be353a187af6ace821b18e096c47752b6336dbedfc4b481e356e689fd9c03ffcdbf3e4ea39f +k = 06ae69e55ac1f7b0f844f5ee0b583e652e0e5bbfa4eae85c59eea1485148e34f4d33c9ddd7ac071a28ac0a6191d5ed03e88bb86 +R = 0c3509b6c0356e4a30a82fa7411d1fe17ed190b7eebf9310c44fd568494c894a4f4a1a09e58a4d030d47227e54f7220f3f79f4d +S = 0d44ccff47d9fe82627393c03f882d4b98633961a897381ce8b2cd18f38d69742802d18e6c988a23eb425b294f2c1b84cf42cd1 + +Msg = 8889ea1da1cbed98963941f6ac24f47253ff6af52de920765214f2024aeb04f7ad46936830a8eb04d95aba64ed7cda6ef242f454b67bc2de38a46b6524bd5c96739c4b580e89829a61a8249ec8dc27a50f43b8554cfb6f4fa4ca6875983d4b60a1c6b49f32ddff6fac0cafb64d55c6f594b195c207a9bd920dcf20e0080920bf +d = 0396b805073f3c3b552b1024dcf35559ac44f255b688871a3c6657f727a4b09f3806cbb75d26a00ae1728be632387e804775a8c +Qx = 09957f897a17241eec5b8415ed7ec1bde5df11583255e0a8136d076d72ef377ab3f553d6f56c054332a24098aed6d12878abbd3 +Qy = 1f58eee295765e8a55e388e235e833bc5cdc5d51a1d98e13429bcb7891b25487b7fd8ed804b1856cb6071cc28756bf00924bf1e +k = 021959970a6ad070d1ac518493e309289f3d9d6e2a8933bca715f53cee4ab9000ba2d0147282495e15e63f258dca87a5db7eaca +R = 0d1ca34413341c115f780e647519547602e0361ed4d70402f42d735353696eac6e4024ed2eacf9577252d40c27297e9389d1f7e +S = 08cd5bd43794b32d5bd2ccf7ae4deafffa0e0deb92b1eef9d3ef807d456e459f92e9f10627b7e7574ebe3c2faa858bd3e62e187 + +[B-409,SHA-384] + +Msg = 55053af9370901e38622734a5bc5589f6a20e258627f381fb0c366f3dbe58394e5997e978eb7ebbc530f6e6186f48294149b8594fb551c31c50521a8c4d67e5862921695604afb23977b6a69b21abe75966fdd11bfbdb6b51ab0a474c5fa07c4de7872a3bd81acc417655090558dfcd5af449b3347e61fa9e839bb9457de64c1 +d = 0a8fe323f6736bcabe971c7d964e75dece70cb54561da48a11c40027ebddb23e41c7b48600f569500fe8ea2abebdf480171dde4 +Qx = 020f2dfee967949643b6cb8a3810524044a4b873a4984e9795e4dd7976536a2d748b8cc636ef5c8fc92aba5677c4a0951a33327 +Qy = 0956ec5433d73162c9683558f0dfe8870cfe66575f2c34c765372c7c3bc3b291e95c4e3665e4ec5e72131975f0b1f5f30b0c844 +k = 013f26e13d43ba05e01f92457374fe2ad1ccf94ebf22334447f9360f7f9748bf3665ec3058ff6184fbfdbf7de9e1e2131cd3991 +R = 013c4c290cf89789bd6dc523deffa20c94e92e88a76eebe88457e30cddb066c7a43aadeb0493b264cdae67532db7dadf879d991 +S = 043bb7a8db3d79938beedcd6ce02f375e26ce807a2afd4fc446f372fb09a69fb34734df5dc8f6393f86577a8d29014494379624 + +Msg = c4264330534a6c2bbd8a3b757e0912558302ce302f835ad8c5474993832fd30036fdef40b10ee37293e871db5b0b149654f9e543e22111f9709ef45732125f713c031ccfbc9a2f3aba160c241d27be4dab87ab2fa9a795752ab2daf20f9d06a98d90d01c07133adfe83cb11d5176525e1bba6a9ba70ea48b224d46ddd8103f65 +d = 0105938ba9f25034da3e032dee121bdb192ac2128b50a2ed4bca042e96cfaf4660c9d35f3e67bafd4c99f9447e6dc408e0c4471 +Qx = 0f1a9243920d7cc26741eb828bb55e34c140b0e52837792ed6274a9aa6b5534cdc5c596a1141a746dee380c0d9c2f77094c36ef +Qy = 1393ed8c609751550ffd077347712f3b27a869cfb1b532c5b19c381365ae5dc8fbffcb2182777a17690616d71c66524017d861b +k = 0fc52aa8c590aa28c5353568c9dc69734adfae840f1e0642b57863dc7f4faa37bf3ca789a3d7afb32c57f66a61780e253f50af4 +R = 0c45b1629bbf3273c0e785a28cb8187ef387502ac4438a3372a5c72206a15d7c5ecf9203ecfd7e0ac910b6ceee3be50c6664f81 +S = 0a0c2d31a47ad5f9dc2d42dc36714cdce47666f6e2f05ce0e7136f166647540d1e5fbdc7c9fa0def8962f44f2f8bc9addc10057 + +Msg = 3236f1ad164e1b25d828f5202e3513c80c72a577aa9af56f041fd96cf5a3363f4b827723b1511a2f16360e32eac90ac55f4ee1146791420ef9e2af333c17d157b00e43992ef6f2be2d2f211361e468413dd93fb69232f0a0d110bc5fff361c0410344aa0636bf809062c73a7ac7c142063912b6ad7e1626fd2a384f35faffaad +d = 0ce11677ca818537dbaeb880fc967dc8bead203a2538a55e756679c4a9e7975b9b3e6aba4e6c6eab4152d0c0939027e9b0bd92a +Qx = 023c78eda396efa28c92b120c4ca1e19dc6c467234f9f73701d8966bd0826c20122af5f7c9ad5a5b855b6dc517c22131fb0b5af +Qy = 1ea47619f91ed4a010dd49ece7ec78c5e98297220b4c239ff4a8c29aaec008011acbf7e4f985c02311ca703bf4ce4ba43412ecd +k = 0dae763fced0e498e3efa1c6c412a25774c9bd6cd4bce25ab0a7266705cdd54040ec55bd7e6708e71b09ffe9c19af9a1ed9c878 +R = 0a70694fe5da7646184b23b4b434bca1b754257b8e7fa9994dce4a7a92b7ec8c7f8cc69f18d17915c6bbca24f6621f9563f7c35 +S = 009e6ba97ac2be8537afe7f8f8b9cde8841323b5cc63cf2ed46a7913096ff8d96040296a1bf9aad691b60e1f18233964a421fe1 + +Msg = 6c400ed098d8369dab6fde3553afbbd4d47836d0d12dd16015f15cb8d067a39391c85ca4e78c62b8b72c1592349ff8dc52db8ccb7fd80c085fae456dba6f4a2378e184dd59238c92cf04e40d43a66b342d2a1325a0bab12b1ac857f0564c27b35e6abed02ff5bbbdc3770ddbb2ee0513df48bcba925da6d61583076cd3129603 +d = 05a239ae0f40d76d8d3589f1662b5ca12176a4b2784faa8339b54e96a1e1294433a4d83bf904196f939bd8b33bdb4be340ec703 +Qx = 09d03b7985647027a17c06b30ce9fa1b43d0484195f584fc347f7003802613b524cb5641db3425ab4b3839e12c012853ea83843 +Qy = 0818f5e270baf5a771627b098a6f9ad8a8262e331c299fa0722a0df6ca09bdb9c92d22d72a73567cd5497d06639aa47349df207 +k = 0c22251c73998a3a49b3fc65acf01438941a8885d1c5072a5d41d779af70c044153fed4080151b524af402a4e8ede4448b717d4 +R = 02d3a7ebe5de23e0e601c6e41616bf2a9a7fb6193fef8e3f0a7fb8128a925f7bec3833669d1a304652b7bb1af5186b2f612da1e +S = 0b7bb17155068a8d9b3412d04d407556ee133e1a704ec5da87ed19dfde60517501af345e2e744d35d844f8ac8ad08b13b17c498 + +Msg = 039a149eaef2de30b0ae457b376ce6fbf88afd4cfdec02d3c5e00400d3b0484c1cd6ba74db5de65d6f2fe39871349b30fdf1ef29bcbb9e182eb3ec5629d07d98354a5dfa82d7f0db3dd10d1510c0dce086848a198893ca5ad24a663494f0596b4eee86199ea85e7e8f2f76e7a6bd4a052c54287f61b391f1e52f96b606151c34 +d = 0077390c62ac41aca995640fde0c79c76f4ea8a8dbb22323ed812bee837ab8798c5d0ba976c7aa634d4b1c2c155de2709e7352c +Qx = 1a9357770270c528f2af991c447bed86194d458f693a871ca38f271a9e6a566f5b9ba3ef3d2f9bde959e42934c95867b280e9d1 +Qy = 01f3a0516fed36d3622fae3f44d87c4bc67cee0a995cea242e530451d43781f2ebd163f6f521497fd7a1a6c7b93d33b77083a5c +k = 02555cc113c8516d741b47ca41f53ed07d509845f140dfe7dffbd01a3f751ea9f22e12c939a2ecb1827c0e56b1b1c5459b66aa2 +R = 0e88333875a507520d0b62b35146e37e7ce4e2f2478a61adfcbc6e1aa9fd0195a4960c633d9d6aa9a79323b7ee00ab802768436 +S = 094595255e8862d14980893c095608113737f42b05b561771f56ac1d54eb521bcefeb3928917c07c1bae74cb9aa80dbd34962d0 + +Msg = 08617d04fffd6644c40f7dd57919f7dcf3c888f4147535d12ca658302305bb8e220bb17ccdc480254004b9035b357120580882ef86aa5a061b2850100285b7d61588a664dd4f5394f5478e68a80f610c9204d056009c1c9e902161eda33ef61aa902e96b6f094a9f053135692182943d38b9763055a38739a2a2d133c5dbee89 +d = 08bf23b09fbbed1b55769907aafb97f4759cec98649b2c9da5157517d4f85bb70157076b5e4aaa7a940af042302f8be06a84ab6 +Qx = 0883c31c474333f74ab2b86f3eac865c4b2b54975ce19c5cfd23682d041ef3deaa43c9f9e2c194ccd3add6677de31fc9e07dfad +Qy = 0a5a36b54f4eea6b300491ca22054280b3f09b202b2a6b55df9e3271c763b6d8360a330c16f936d69fa463bc0c4071707c9cf95 +k = 0812c83aa9dc4139f8c3f7c55509f9e10e6cceed30e16afc028b1904b4d260ed0e77acc26e711a7a8e24c75fd780ed893c0bbca +R = 0fce07c6f791a05de29609b59d55b7062e82fb554341b2b2a8187baecb9c95b01ca5dbf8ac88c60babe10af2edf5985b35e10db +S = 02bd026a3e45ac439647a483261107829411c1b4a9ab603c080b92f605cf742754b654981460cf7aa72b5186b59d224dd015314 + +Msg = 34c959f549a307f21b850ae105f41299b8bc94fc292aefc61aefbe0a1bf57576ba8d9b80caac635e4edeb22530163fa9629665fcd43959f68eee32482f1845a78ed7278e6e43d09ed6fedf465001afc0d61f1d2e1d747623e82a762576b879c7024e34f43104593cdd691d53bccaeb8f212dc29bec6bc94cf69d0a8491db124a +d = 0082ad05d19b8e16f80e53a4cccf6869ab5128c5e622ed146fa8555985ccd2aa3b9957dd374586115d4d75b1c01cf98ecfc3646 +Qx = 04428d05366b0a46e6578fc7528d185a3f85da06c4179e9c9055dc0a7fb4afbc53c94954f268e36d2ba8731882bdd27d9684c81 +Qy = 136ba6048ec672601987e9b7402fea24f88c1a94717ed5a83794add0f31680592d6cafdec147dfbc400e73a6ba1d23d4cb0d707 +k = 0c00c897edea7bbfe1913e3da303d64d0d657a83c1eac9c111722b17c65391f2cf67b78219e748ceb269d6c65f01e92e6952979 +R = 0624c5bcfd8e0ef22ee6b34a8b26bc051912cabac102cbf56c364a743e8150195fc55a3fec90a8fabed5eacc1799b565745bfd1 +S = 0cddd4937da8176ddf0de7f52a4babb1f6fccf861533f796a487f35d060ad9ed4435e5a67166782b53c20bc06fd1b36c265c1b0 + +Msg = 514f4de08a6f49edbb6797c9dad6d33bfa367cc1a1b58a5becfe646c7f3352d5c5d95f7456e7112c4ddc746b9076b9756ae3916c07bbe6d3823895774a42d25d44b3309d18bfe7e3ccb1f85dacfec1654778c19e2981a853c1f40a7eafd16d331093110698c957fe9f1d86582706a6885543248b944bb70cdf9d2ea89190cb02 +d = 0af7e581aa4f9be5815f0c447e39de00da9194eee5e5f609668b9b69930b5b48a948614c2250260d1917f0ebcb00ebda4bb52f8 +Qx = 044703e0b49437315a64e397085ea2ba3f2e2c383b168f31a922e5916d590344906bd2a911074b7481aae7f3f8f4807b110f2e1 +Qy = 05a13607a3bb89a2a88e27d5eb5cac4eb498d34e6ea861c80271ed0c73e1fa893adce0c1982b8a8af6a0249796e5276d369c3f7 +k = 08e7fcadc844456f14ce9354b218d519d86c0c5211d62904c937d6fbe8cb16264d7d41d98a15e9f73a636ac3739770738d6b46d +R = 07aebfd1681bd5a2f995ad4a709e8681da742649c0530684fac251494263e98d67247e1e4fc174b409e7e24a7b055500920cc82 +S = 07b83b9b5133aec165316021472307b8b481e6381754a9d0b4f9d683c2ee7cac94ed4d8a72cef61fa1f6349b6c4a54ec38975cf + +Msg = 4e5d16cb1dcaa1abab1e371e1de02f31ef4e0944dfe1fdec45ab64326435b2af9aaf1a6ed8fdf1a6ab1182bb53a844c7cfd66da30aec0d41757f5988ada0017c4ca752597a9fd3637668bc1a92bb1556553f28d66805bb47f1ef91908ce098d452872da9800e77e1fbd43ffb0ed6fe6a62185d4be73ae96c9241b82cefb2da22 +d = 06d14107b08354e6a41d7d7d50c004419db8bdc50db43428df5e86084551237223c498bce71a17e25695bc438c5c09e009c60e2 +Qx = 088c1517355cd417a698b648508fd07a457ac13a49d1bad17dbfbc9735ee58343316e3eca570bca130c753e17a69fe5bd7baff3 +Qy = 1397a697d2113d94daefe6be491ed3edce9449c707a57af3a164d172cafece564d686fe0d25725c2919c60889af4d0354b05117 +k = 0f3bb2dd9eece25c56159f501af8b619a8c279d7ecbc08ee2af6b82ead80375e9c07227b73a10918d8c89d1a2b12cb76427a7b4 +R = 0407b224d8d9c0f11a8e09ac8d654dc6e1119e2c2804510a84ec61f9017899f9613e37d8166e0fcaae16c3cc11e9f739968c687 +S = 08c2bd7d02c4c537a308fa40db786ec64fbc2dd4c142b18cf9bcad66199afd4f44cbf221adb3837e84173d174e9c0d534720ad3 + +Msg = e29e75269754ec1194270f5c9e8267dfdd8c696008b5ebc92bb840981fd065672f07f6a0f1b19841adfc51b478371e1a0db9c3346a9f0a4ccbdecb7040191a00ddfd0a8faa0e69fcf544319c0155d02797eeef99fabbc55078f9d852927c23fd931685424249b87ed0c70a4a3e2d3b9a2f92830e7d8f7650c0bffa8f8986b7d5 +d = 099d96d2dc9c79549f031bd5346cf6a8544c312a3fbfc560dc8e378efdfe025b0e6e61e09c04c8bf4133396f993b0906c33dd30 +Qx = 0883e00d72c60f22ab085a90901ba3e8a510f19c3d62dcb3ee5066e0be094cceb30bfbed7068d0bfdf634a53e2fd002dc9e454d +Qy = 194baa5d7ae2399965fc4009ea83273676e66a56fd35a5939c26ccaf85633adf78b33dbed6da305979077418c625354c7fb6283 +k = 0c213540a452c4f2ef275dd844402dd5ea590f7df41ad35523edff09b7fbb096f8ae8a4baee95428fee03a9e6f6a14ceb90e289 +R = 071779b477245007ba1ef5f05446c4a08d1c2eab550db9c053e4588c9935f07ba87764f0fce14d4a7b982ebba89cb056aad8cec +S = 08174bb56cc85ebe7bca1de1f44cf93cf478d7fe59001c5947c66b837bd3a6d116f99dc4f9acb4f378b0321228518e1ba0057e2 + +Msg = 1a538eb447c18494ad5a5ad27be67fa60eb2c5cb2404eec1dbd7244cd802b17ca5497e779d5f779b981b165dab53ad19fd7bf2ea7dbb9b4baea782a43d758202f147e59d6b6b8ed54f4ea084bc18519943f6894d603e253ba3e8e339a6933bc3a0a47126087038e1c813c3f2997aae321b7c95a802b4b73fc7db95897b7c91e3 +d = 049f347dfd361a65910e97fcefbf60013a54837f2ae657d65e02397f59dc6bca27704fed3affdc3d833fdc621cc5e5f99b92a63 +Qx = 17942b58d42da750a366d7e4cf4cf465c856cd911e5352b50bc8a12704c1ac6ad54f9465e4fc5402b373d8bd4e4f8519341f133 +Qy = 10abcea49c66730ddad7734eb1311b2626b75ebbb299a28c9d60937e6833a9b3dda052379fbcf7875f18680924274fa1764158c +k = 0134c70f031648bf470ccca4ec19c837051bf700c851df564ef3ceb99d7d41439293bcea0c656c0e5361db92a03def51d7e4f26 +R = 06c0f9935abc5034a8b0a05e8d04de699b5916cb367e834f13642f0003510bfb68714be75c9e35b5e593eba45fe151d1df56d40 +S = 0930baf426b33eb4afbed64869a22712591db11acee7c4d3a221a1e98048f05900fe14816006854cb90631de5797f91176fdcd7 + +Msg = 7502c755bbd385079a4001b8cd653287dc3054f3b57de19d0ff8f63c0308c64c56f035117a8971d43654f89b52e923947e4760ac72be073136da70c5ad7ca1658cc0a2d2a880d3a0c0fe636fdb27b77ff260c4c1ef8a18da8e9fd777d732a37ae9906e6c4f381f0a3d941048d5a1f6f2cb8593873fa4bb1621a44bc2bebfbcd1 +d = 0dd226de602af4e9f8e25784bd1bbd4cadb0a8aef525d5e2d57b9f3555feb698765672c5099a7d6dd5faaded69d8d68b4804f26 +Qx = 07ee34cc7a24e2e693f9409f52796427ed86fa71bf88c923db305ebd5a83bf3b6f7612847f16d00f4a25614299a2df92bb693c3 +Qy = 1f63f177b54f8dd5c907ff318b66c2bfc1cee09348c035a4413fa3cf5acde0db1c8af4fb8deaaf8a3a6f8f06b0acfd20c6f0049 +k = 0e19c21b05c82dd8c873e5f30c1e3aa9348327f959a4dbd9c741e233c649a426cf7bd9d8e93232e496d0b93ce835f80fbcfdb2d +R = 042a3907a480329a6169b439a6945cdbe8e4572779c43fa6cd1f15062559dae9eda2712402ccbdf03d88a8a68b691f1f16f8f52 +S = 0d09fa4966d171a662a9ba6827fda830b5404f96f635edd8482ee009ec5c7b64a2a6c17793993610ae8297efa9fe4c35ceb5001 + +Msg = 95eca932d03f1df2e8bc90a27b9a1846963437cdafc49116ccf52e71e5a434cdb0aad5eccb2b692ca76e94f43a9f11fa2bdf94fe74af5c40e6bfd067a719523eea6b4e65730365ee498ac84c46e1588b9b954f1c218920cbf71b167fc977ee2a89429590f43bf637eecd91b0ce3be2d66bac5847205f76c06b914a970f543e59 +d = 0b6fdbc9c8c76cb2b822a940d8675889ca6f5132429da795462381ce29313a23bc132976fbeb346ed4c691e651028f873ce7971 +Qx = 147647d267afb4bdadf54baa3f5131e79dae8103f5b2ddf70e4652f9fc5495123be97215b811554241c53023a247936053288bd +Qy = 15205cd5bf0c5154b2dad8367e1b487689b898acbbf44f9ed67a37babbec739804dfe737b324ad663cd2cad79274344397099e7 +k = 07321d12d616dd2ee5f843d6ed7e92d18968b3a76c0e4ccc167790afabad1b7c0dd53d82aacac93d98679b203bad88d5ef0cd75 +R = 0672c5607acc646c67456ee77f2c02117cabd241f728ace5117626bdf91662323e7565438f46a3e25c048a8e2130e27fa1fa2d3 +S = 064aaebf9f2fcbc843ae1128eb6c7e7d1fce2b9901dae0f60afbcb08c7f2ea1b550e159947deb87dd8959921846e2923880db6c + +Msg = 8ff68cb00d03e730dddb05fe0b2344689529096c3da6eeecaf097f22c7fa340593106b1f6726f06b7ce7358edbcf801ead959438a42f94cdb467b3cd5b17fbbcf75739805f9eadc869c33c604cc58f81591b0b8bf4d42bd53a801f0f829a31af6c129fb4f20f1250f959754eff8c629b85a716b6a18465b6495798c0c5166c8c +d = 0203d77fac64591eb9a18de20a9d5eacaa1c3ec58a5ecdb3008c2d642e197141d16b3a9fdffe61429264f5b420f5e9926659a4c +Qx = 00f66ca09d15d0991b48ce7afde9a148565b73807e435ae0f16c14cd439454745f8ae153786d7c40cce3f43a8aa4f0564cdcbc3 +Qy = 00f4c919b7a97beba2559a8ad0f85dee40e8df28e23732d7de655262209a5170f94791e255e77e8c8cd64c8c9900092e0ff9d5c +k = 0859bc752300d4ba5014e302aa4cd2a979b3097dcfde5c59f4bafc5bc8a99411174d2ef3f7377df5a09269e3d9461be61801942 +R = 0691ea76acbd5e8137924bee13326ceac8231688af8595718e210bb857d6619c152e1fb46e03fa83bd6b5d81e2463f9260407eb +S = 054df52eb86c679d8f8514a09f5a3062d2424cdc19fbf6927f744aaa8c444223f1c28ddc84b1d135a886eb7ac7eab3c7b0a42e7 + +Msg = 01451c4f09720cd53377a5ed04c907a735477378ed960235a833049d6bad6e6e89958b4c4249bf0f6d4f043530c9e5426deb0ec3a12b7feb4860757b41bf602ca95655155356ec35a2db8e2657998f56529be4b714364f83a140846308a2973907ed7b08e935173ebbce5e29afe1444cd51c92824ede960056439555e7e74450 +d = 057a2e6a59d4871c3d547690237dd9846d6d5dc4ec0678aafc9c8669af8a641eed67bfea4b05fd6b3b5357ec4d0caf352691ea4 +Qx = 0351aaee4207bdac826ba17e3b08dd7f94c0c8ba0d9829d7bf0eeee7e6375458b5457bd787f0ff38564734b3a0412bbddd7c371 +Qy = 0e09c4dfbc33d61d69b5a8517baf5e4e1614920cbdd89bb05f0420be757253fb92308dfe1de8db822f57b67b393d8a70d989b26 +k = 0fbe560003dc220e4c966b21c874b828874a33a93bb69c49909376df67e5df1652fd91a1d73c7733f26c121e7a3b2d1246c9a61 +R = 08b85cf3a14fdfc69cd42750baf362286940994479f6ed7ce1d87af12c5ae075b311754f1d37d8ed10bea092bd3d9f7afd2f1e2 +S = 02360bc1f7a98cc87ee2a4feadb98554cce59aa0fbfc087747c7253e54c38815cf91c8517f5692f95bc7c3a713fb6ac43a34f7d + +[B-409,SHA-512] + +Msg = ccd494ca005ad706db03a3df6d5c6e876ef859ec77a54de11fe20d104377df1900b6b192126c598944d19a2364b2ae87ad7fd32265d59e1f22be5833f20767793677b628f18e9619f8ca32f3af3b41c31e87a98d1527e5e781bff33c1a8be3a82ea503e76afec5768d7f7dd1f17dc98a9e7f92fd8c96fca0db518bd143d82e6d +d = 00a3da7a6633608fcee9ce4253bbcec08d41ee6b00178ceb017de74e24d48fd89107c9f2db3556063abe3cb011938f4b4871795 +Qx = 0a6123b122d7d0d766897b15ba6b18b3a975d3d8058c9d359c6c6594cc0dc07d9ef6033224b4aed63d319cc2747c0660e38897b +Qy = 1ab5fad5e78f380aeffca8d15e60731720184ed456800967b2ca47d482957d38409ca07ea798bd892b529774e44080eb8510e6a +k = 0da042642b3117f30ea5f4b354047b164bd128696b8c00cc6fcc767246daf7483284e411009e05218246830940178cb4ebabf1b +R = 0e4ce613e6976e9e1c30c0c93214a0a37f0632de85eaa25464b69a251d592560b2039fc59b15ed7045c29c268693d7c9e06d8ce +S = 0ff3ad5ca70aac94facd842fecdf6a28afbceab80b549507954b7dea6da06d1facd11e0a88e9c2a549e6971a08d1af75aba8363 + +Msg = 5719e50d939a8d74efb444eb5a77cda48cbb59e7f976cdb2ea2848bfc558718b39ce27b893c229db94bf77992222d1746f8f52f858f85124a28193ae0da039c53d484681785f3367f6516fbb8a86560aea9e3428551facc98cdb1e9df8e2f37db823a7abc589f667b5c93c4c47061400220a2014197d514217fc252cef5a2433 +d = 0384723c8b4a316b450d1fce0b2645912b8acaeb3cad50860cca43bdc0206ed5b3b60ebdc29b3eda305d0d60eeaec261edc24d5 +Qx = 0fb89d87ca4282ccd048606e4d321e7ca73244b4d0c9d3df87d54e038a14939138bff33c81a9ddd64abdfd698bf103e45c96f97 +Qy = 04ff7e1706688a53a5544f4ed0f3f5e1f0fbd6f21174166d25a690f260766646cc6fb39020de9327199225e44f3d95c5984fda9 +k = 03a9f5f26eac81dc8ca0a17acc44322d43bfd18edcbafe24113f5e5fad0ef0a3db75ad1b2422c7321593e41e76eb2a767a14268 +R = 0c311000c27539247059e4a8d789ed4db93fbaea021272a90045bf6fdd70f4f32cd1e195b99ee6f03f4fb57c3a115ffeb459af1 +S = 00db8bb46fe0f99b4e6e1394a5db283e310b24d6006319986dd2c4cc169c775c89d4ad98d0fdbc3c0bef6b7fb6b43ef21049bd8 + +Msg = c84e5702a339259a61b5ba8ec1957f23ffc4f1eeef3a58f383d3731bbaabfcf49ce2ebb597960ac5115a2af1c62b193d4ab6c24433d5f168a1752e40145f19aeb6dee889a53a4fadd13eef60e28fcc7ed6a9b8b0ca286c1b3d66a4b2c327a629d15c148049e3a0ccdccf05cf22c31956014595e417060627c8125bd7c00f8850 +d = 0bd3136647572fef3de51b12e64b36460bd3a27dc660c164fc705417339cab21f9e1f9be0f3da926df459c5ba58b701d306e67a +Qx = 0f45e18834d1933a2a26e95467b6db85d8c3da372e607907798745cd9847bb8f8b51f996c7293b51550144f227933ba26722685 +Qy = 05d8b108eb3591b164745d116c80afdd4870187061c75af9b0c3e87dc8262586af14f4d6b1504d274c07c8e89247196d8ce8166 +k = 047a494645b99a3469369b72cc918708ebf453957b49ac4e209f2edd7a4861d014543754e37e1d1a0f477951a0ac2b5826a470a +R = 09de9e0147e1a268f80836d7db43779ce12e7947caa851d109273ba7e7dc7fc52c601f5bf69cffd5adf0695cd7db8de2a64781f +S = 0561aa76e1e9f2c1d4aaf6e2da143f67166f09199e1705b631d650528e94d643768cd611467284a9f543e50520e3e738e5d56b9 + +Msg = c90bf11d04a708e64b6f94d4cca64b92463eae878c377b188c82c1c5f05a038be20eca2e18034d46f00d9a6fc73c4084981748ee9d2915d87aee4e2321f4f9e11c176f01281913e324700d9cb474b7134fcc408fb4a7006acd9e63d4578ed4c2729d8e0d01b1e6174a43a024ad261eb644ae98979c3cdab75af357f6dbdf5db1 +d = 0495be0b0a9d357f6155fac008cec90442200bb842d89292fde38b7256e4117284a60249b3101b3f19f778b680c0d1d7422b84a +Qx = 11119cd910d4e962f54c9776c9180e7eac2f71cb9748ace4b7dfd2d2b3caef4964c7a55caa9763e008de600b727068eda9b9865 +Qy = 000b48246cfb7c86e9dff4ba77a3a53dbb1cefa168026b8929c42c3b0251fee5746897916e50f07dfe8b57baab7964447a2fea9 +k = 0ad4ab5ecb84118c33a4b06d1a9f5d2c4f1f3dd1cf71af596eea771f851d0371d2d72593c926d7b69b39cdf72931f6bb11d10cb +R = 0e959201622673d81ca16ed94e9e5be3f38bb8db48f9c09a585aa31ff39f14128d79d604a5f93c80aa961c85bbf99e276937f4d +S = 083099697856c780936ac01aea5e3a4d9b6e183639cd200464a5cc05232df30ff5220dce4e2af714c580d561b72dc4969166a6a + +Msg = e9b2a33906a1079280100039787377c2971c378b92e70a38ab41dc23979d6fb0c41e53a21b37632407adac6f212341cf6af8605b4978c85c9c16960e1674247f1795cd73b99ff28cdca024f5078490513c77114c2f52288f5376872c331151d7b2c08f7794f2c1f9e0d849d32d73636f0aa899988ca561a76f74543b37cbf3a3 +d = 079626354dfc4eeeb51fcf232ee9e6b0130c9bd40f15ed45606bb7faeca8f359e0c3e18bf12769254522fd4077eb24bd5454871 +Qx = 07ad047bb38bde6ae2593e1e41c36b7efbce1e0ad08def9b23d25b7ea9aa336eaf10217df16d32ada4af03dc193d44e6c77e677 +Qy = 0d2b9466ecf321605b9f4f9528124108007203ac32cfdc7cb87e1790ebf4bae497fb87011e0a81068e66a840d29583bb970e24c +k = 0074548d1a3df580e45babda6096f4c78cd70945ff190d9da463fbb03a511c45d45dd1c46dc0b9521579fb506bf015f8b835680 +R = 09e04e9ffc2cafdefb600cf61e803eb78cb416304210165fa7c93c1bfefb02cd4a255512622d524141de02c2cbd193991dcef67 +S = 01a7960232455f27768acd825b8ef91d4efacc38684d05a900a8512682ce19787033cd08c1f2412b481b88ad02dacc0ddaa0ec2 + +Msg = 672db3fb8cc8e5f831be700498d3ab3aef14b7548e8011b21351215fb6dfa09460d18f52c02c8815baf396d856a429bb9afd602a10c213af34db80447f4c06ab4bd28873c88eb9639b199042d4b2cb13cc364f734fd4ab7bebede7dd4da63decc0cc1f84e34d760013f66d71641073f16c08078880b67230f2d6c6bfe17d206b +d = 0ab42bc7d0e3c23f8bcf928e25f9f027b56f270398a1d37bea0ee5426b944a9c9ba6d0d7796899543feedb470f70b2ab148234f +Qx = 1415fe81100f208ec8afd5e882e5773a0c1d46e44627732900c7e1722cd77b3ae24438a8463bf571fd6bb422d7c583439c07cff +Qy = 19c3ef3688ed397640e873dcb20cee9755437d0023646d05612e8c360717a2e80e80f2b85860d71f9876f3a68548da7099f601d +k = 08b44ec25214602de46046b2c94a45f64e9d0903f6148dfedb76a80b8e6314e87bf7dce8e73b14bb274a88fa39136a00537779b +R = 00ec4c5bc88a959a1234413026700bf5d4287a0263fe75daa16693bf74cb5071a64eb18778da0a31210347aaa33130602f6b597 +S = 0b6c29b9177e89880f3eee3aff204b866020b3bf77d7c31204af383d9770804660711a8579a3f1ffe325f225fc7e7894ecc601f + +Msg = d7fd06b89226cfd66671ce5b4b656228c52d986afa7f6f30161680eb0c9cca177992a8a8c40167a64165c518c55f678702125709361b536bd928567c97737bd750d0e2e6e0c00296a6ca565f7c05cc8c54ae7a4e0c334c6a968fc18a959c18ebbd924457701316a4e999fb11084520dac68dc2d69187134c40891af0355ba89b +d = 07f7aa2216164ba689459ee5d5ca29e70ef75a5b2a4416ab588df1dcb9164330c0b405a9d80c3acc41c19f58e24e17ecbc0fa7b +Qx = 1decae837c7258ea9d90314ac87c57aa6d49828787054cc068edc1955245271acae72dce5c9cba422bee54f22e11810721c1ed5 +Qy = 024cdc9e1b27e5d4bd024654df000bc9a0181f7c0f4a90572c75e16b679f4362446993f9920e2244527801e8f6b1e9398bd8382 +k = 0463202dff25e6b9c633b60a3edcffc1a22031cff44dc1b0a5769214693ba02038fe5dcfb4a48db7ec49b33068061616daf2fa9 +R = 08c06b72b73dc2655645892447fc0c0f8055838b194e8fad99fc6bd50774e1ed08313eba4141018af33af95a3faa20b69bcc0bb +S = 0958f104326df6008135bfbaf5c2980cba2833af1b4f04b5918bb51ab0a0df637d6a4af902a5e07db3022c134c72315f25972c2 + +Msg = 83b7e9d3ec638fef51d2885fff5490c94e2509c126608f82660e5fc523032f3e85d69d9b76af145f6bd916dda35775abbb6d1902bf38880f8b9259822055c5b1bc726c51029972cf7474cf2a812f3251aa71813476bff55598d079f075a40c6c41498bd865ce960c518bef75a873b9d010965f342dc4b35ef5c5972efe6fdd18 +d = 021d84f070c6823a70f1a74225a472118c93ce9dc509aa6064051ca4574939dcfa96be862069424bdf1a23f62f2868326422e64 +Qx = 0f568f018b0dc4400bca3e9e4b0e5bd5245f15dc7acbcf4360b0be2ea5abbb87a3cd76aa653d32858438051cbefbcc4feee6f6b +Qy = 1fdf1e1bd7a2d3825df14f8bf8d5de825095663c3014f2eeedb9bed3c3416d56f805b623f40b847090d6b4b3bd5abc98ea55e48 +k = 03344dc1cd950a9c3d039b6fb6af8c5745395d2a3343d86dc6670580e331d59f6c0034367a6df52423a625d70292893961ceddc +R = 0fb010ba41d651fcc854762fa1437262eadfcabb95b9502a40b50f20cb34fa19ec570dad2e0521809ecdb2bff3f4e7055c02bec +S = 05a9c2dc0c1f946ce33f2f434c156c236b09098365a7f31e238b4685e7cd8c86a0b2455e5c83907167c1324bbb37e66e0b2768d + +Msg = c62c7bcc860f0e175128e1127dacf935ce62ae794cc4a0ce7966bceb023ac0498641d7281fbc86f9ef470bbc77f608f83f8d0dd6299cf08f2cdacc7a9642e4246df131820220e5c05d0dbfceda7f16b86add4793e9b6244d96b5c07cfa23574ceb43e8e8b5483192a92b301aa3b37702b8f94f0129d8af1617896b34990c9b02 +d = 0b6645344d17528968c719091b6e2072388881dc10bdb4c7fbf41906cadf3699b30f9c1dbfb4796d009480664e6276c0359e5db +Qx = 0b164b075b80fc8b8ec785d5c2ef84d49f2f4d276546c9cf2e17ea4d367828e9aaab985c5cd0882204e293dba0359d47d9bdc05 +Qy = 0a0c61f181d5d06ff20d0c41cf6d6cf7fea860075cdcbbab2efa0950e2276dafd4258a39c0fe4c45f3c04f76efa7d41392b4d34 +k = 0c497c621c5cd230fb1e4a4cb3af1cc9d8edf4af5c4af7f15c4ad0a8835b54de52d83bdb3433808a67628912a85c5d00aa222c9 +R = 00b22e5773aca4d97d2da846c3947bf9cf2474101a6f0d39d31629a6aa2a4c3a77076a671e37aeb4cee0a94e82e914c8c553e04 +S = 06ccd79ab93e344e6f112c1e4a39e8505a2aaf5cf85595cadc6ddd1afb0b1583d9334cf1c48f26e5baa38e05b6b52f9f12c141f + +Msg = b5bf38fd9e822925254418475a1ce762a94e336f12b156b1625a4574fee11ee472d537ef94b4a4b1c0a73b0140d0b818cd06636653e6c07f0f100118242a7703756f1cb1119b3477c4ced99cf45e07e83b7f2749c1a5f8d8c9272d221fe17f7c6a5fb0f8a16af46f232ce406aaf565c6b2766a2f6528c82e74fa1c0a7fcfd49e +d = 0f8c2f770cf5f8e1f900e996ecdcd84fcff5cd959777fd005d721a419123221a3237e39834b270d37752470deaa6cea023c5058 +Qx = 1f861984fa06f15b801216a1c33672cff43740f0f736b4f4abed5656a1bee33a2aec431680942f2b0b0dce9a9196b49263fe183 +Qy = 18633f4e057bb6d70a434f919b9ce4b7d9e61fbf46c1d9638100d77881755fe9829a69d696d555b1a26e25ac1a1c27b40f909a2 +k = 0bdd99022dd964306955c57b226aef036527eca481622618fa7395f53e60aa95a275f1f2d6e7354d8b55d3e83c85819e818199d +R = 02f1330f41a86c09205004215c24f42fe582da189906fb23fbcc52136fcb4970a33b896113eeabcec8151cf3b150eaf1ec2dd88 +S = 0439507edbd36ebe4fa5df34d220c1441e1a4175c9b0373fc85669facebb5bda7a4b415c269a7add207b461525c6cc94b7f7b22 + +Msg = 6d3474770933ec01b76be789304b6fda423b12a0ae8c87a5ea8d7ee9f71300f39440e1c7f5aa4b47c1a8628cfc3a490b15ef292a741344f40a8fcdd02cf3863bf3e32d53031f503703deab17fc52b3d4032f4e237dcc27231b85d3fd60b49ed7ee40c3344948d87c3f47564d20a11d50e4e520bd16c8701694fc70901a5da625 +d = 0144adae951fe897d5812ee4a16c0be4c86c5e57e615c398f5768a1223a9be20fa82ceccf8a16a31432bbfd17e594a4cd8a6a07 +Qx = 0bce072255f7cbaf565f82db122e9c582ffcfbefadab6d79680b2506792028b200ca7732a98322c290916c66c8a8ef77df6a2e5 +Qy = 1b4b6f65e678223bdbe5f8ecb68573ae3d7f111dac37d4fe3c0eb768c461187fc5859b13452381fe676257aa445bc7f38b4919d +k = 0128c12479b7f0630374880b214aa26e4e8626deca57148a6c6a0e37a97e89da8acbadbbfe7db28a0c5bd17303e1342af711f25 +R = 0a95124ec95e35747fb568e6659ff31867a4cb7c00985b36584201d1bac0775653e0a8b54cd9a9067ab3de434bc2cdf29ae287b +S = 0257e5410a6f0bd94fb3b5b10500fb45b501a3734f0c718035a9a1516d2f88e10d1e38b70c791028e262e0c3128cb84e6064ea3 + +Msg = 92ba7aaf71f625f7a2e024058dc8739da3567c306da4a812ed9e1542b7d1e982c16082166a59720203f4524c3bd463a662c26a82ec7b4376545206e650eed0d3dd7909dfe3810981393070d15c45dc4a75a8c5bdeba533cad1ec34fd20466a61e4cde3b25af9a80a9a54afdd7de1cf2a74ba32d4ea0082a037775413c61a8d1f +d = 0a51f065fb32c55bf4ff6f18ba9d488d35d9f8da593adb0ab1632533284e0adc43ccdbda9d9507b9862ac63b5ae7b0f78b479bb +Qx = 080e2f7ef17a11ae66172cf1c18eab12aca4c2ae06b8106aa1066677a93538e3dca0626e836249eb884a382c3b726736565c3c3 +Qy = 1e98d37a17ea736ae58eab093fa7dce3f10791ee9ef5ec00bfb27bf3c705dd633badc94642c385dcc276f9b1fd5e01dd76ce944 +k = 0d5cf7b3d28459db8dd69c314f6464f770c31f239a12656368c84c64693f23733661081d20dca9bec9c9659a8124b57a71ffd55 +R = 072ba8c1b4bfeca62e96a5649e851e9a311d7685603a11c1c299f5ed8605adaf27cae656cd31335a7ae363cbae5dc7a39512c1b +S = 01bb9819d25a211548461de4ff973ffbf475230baa161558d9cb7ee6f2e682dad21a465fc2ae058121224f8680296d30e3692cc + +Msg = b3fb9e48c333201324755a81f3ae5d4f0e2ae7cd24238fcc66d858e3aeb1ee03328660d6399676eb1b7d8285ba571e214d935bb45516fccfab57b8eb4c3d5f1d7357c768eb7b5e7b5710f599614bd4e92706eaba31f8a5e7e57af7ed13066af50b4540ccdc126b677789920cef8543907f0ba9dc92aae343d3425bd784ef483d +d = 095351c0bc07acfabe6477fe85f97eab520dc96bdd58b44b036328ceadaa56a1904d2217c5fd25155ff2aaf9005a3e2687fec81 +Qx = 1c1311230cfdf5824323448c68ead5e5885ba540a21ff90b951f85d84d78e26da035bfd99341b5901e1ebb18648a8dbb996fc9d +Qy = 017a037929496e560cd1c936d9eb15f79fbff737201dd880a69dfec31209faf5bd2846e3e664c668ad3d6500c5ed620f1bcc970 +k = 02234bafb54cad0d0d51f4b8508dbc8d014c303d90d21bc3f749ed7acc42f0335c5ab6d60002d3bb57cf07018e9c13b92c0a39f +R = 04d0609f06320d69870a3e66f19cd46a2e0e3e13fb8b7785163a7b567bf2c0f437b4e30cc67da288a3b34ce3110f6d87affe0f5 +S = 06c46d0248f7c309c1e5b80ac4b1459bf897e42f8f037031f5bbce0fde50af50cfdc4f60d5ad3d1af152298cfe77dcab287874d + +Msg = 9ec5f7d65082264b8a50be772c44277a73ed19199eb275fe5976f9799d8629fcb4a59a8d55074cd2eb2a0e02062d3f7cdeb05e62931a24fd1aaf14c257944d1b42eebd52726d6fe281211b39038e52baae077ea4df89675d860d6ba5a0f998d049614201b872e134367acc90066ac602e478ac3e43c3ddf4b0ca0aac1a68591a +d = 050245c1682344fef23bd549ac8d1e8e44b2840c43eec1cecd33daa4e9ef6b53f496104d7432e14248682cfd6f5b4853b65adac +Qx = 0d2f8fe524b2108e375c9603598b555d6c4c7724c7d11039178037b3a4dc82b66c3aeffcccd89cc34dc2b2f6695892323bdd805 +Qy = 1f98df95fc1837ec4d5239cf55e97d6b489b0a8d7bf12c1ccf95f689ad23e46dcf20dbb531f5179e754f0c29c8757a1dc67493b +k = 0c683f98253406c6587d87c57991fe5caa3f43b451875859feeb81176b732f1c1eed0ee44d1905d41922878617e03dac53562a7 +R = 00cdc9bc7d670a1b6794fd7da82d2ad1a0e92b82ae32656ddec3aca4de75f407f20fe782daa0004317fa3f12cefc48518298d5d +S = 03ee7c75810c2c05946b53e2f24feaa697af35174402c069b9fb03d89d73964c997eca4a5d6f9482cb23c8ce337a374ffc3e186 + +Msg = 61d657bf472676301503f6784b7286fb39fb4186bb88abf1edacb4a2693d0a1e2b77bbf2758c84f2cbfd1753e20841b1cd4b456400d53f4d686e666943f9b6ffcdb77f510be97536e9698fc84ae347d483bc8984548d1cf86b9b40d360f9c0dc5bd1c55868e26fce1460ba94ef5e94eb63c9f0776a0f446c0cfd4106d9f36352 +d = 08d3b0277f0e9fe54581d3a9499ccd7f015c08339591326859af969d2a26284e3b3beac4a0b74d324ce5cb5f38c7995e4e3a41f +Qx = 0ae18564ac04b54769e17df84aa54903df58decb870591dad73dbd712693d901f3f9ad43a71f23b77705de2b4ec1c3bc616356f +Qy = 19810f92e80560979ac6e72bee505dcdef15b4146185d2f8f5a955a4555523d982c34bbfc1326024410dbad3349e4c4e01c242d +k = 0e52dea77fc59298cb06fb1401d11c662a04500f0470965c4cfaded13b339bde52f4fa04c76a955faac16784f443b1ad9dfa0bc +R = 00c917d487d2aae1651d76147de2a706a01c8b3d223afde7d20c9dd77cc2329bd3e0e4fc01255b7c4ed1baae7d26667bc2e9ec6 +S = 0058c766fd514a405de91a4b9e99fc0b0146d954dc2e2decc2f3f066d0fe192832ad37a940949ca4e9abae0602248b3b56100ce + + +[B-571,SHA-224] + +Msg = 8e14f713a2c427b1f79491033994f76acbead614d12e73ac6f3f518f2052a10c1273aabe628ab38e0d3d5f8ff254802e9f44a51367bf80325b6fc39d907a37f731372864747b10749ea5cb3d3a83da39c21a7b02885a8c1770e4397cedc958e4baa21d5007569dc9dd1e45d2181709d900a394454090badbd0cd9c2cd2369aad +d = 0f42afce7f7b3d45f3f925ab29fc3882a89c9f585177887584703cf8bd8fc572e677adfa55b402446fe1e90dc855358d92c3267c35be9674b40c2ad5ce8dbe6a533c44b0ad8d2b2 +Qx = 63dbcfc2d9171a7cc1835c1f56ecadcb59aa6d5852fde264ab25603f06817a20f2787446445be8b2ba05c70fa25d9b9e34d5374febffeb536facd3da52d43d69fa7af4d4792c792 +Qy = 7686e0629de47916af19f9013f65fa3b5f9d196916cab2f765aff31adb5a959515e83fe3e00e91843c532041ba15f047e978bf2fc69627bb5cd7f3ecd74cdf1a8d623c1efd23fc0 +k = 3fae665eb7a54f51c522ad5721d9e2648f13f3d84e3d64c8148d59c662872b5cb7d911c27bf45884f2ef717d72bd0569d9901f2308d9a68d128c042effea148cc963a8252f1426e +R = 1df705ef13ce900ed61babed02e121dacd55a881ae32bd4f834fa8e362d059223b29ff3db835fa2b2db8fdb98c21dda5ef744cf24d0a798f501afa3a720a238ebd4fe3976a179b8 +S = 1b1e98db422fd48f1dfa049f38865f8bf9ec5618fdbfb50f21cc838051a1493e4b1e4f9ea81156481e5fd84124fbab740421173862c63920e3a833aebf0762e7b5b39a1591d27c8 + +Msg = 38b60d27ff08fb191811036dbfd5b39e1cc3427ff70efb67c851e9cb407f9fac6f348d289df98d055eec73299fcac068bd0fd9ffa3c5d244659e4f714a58d79f6727f323a7ee26369000e90e34e106f99f5ae2ae1b64ee89e5a1d304ef20c071a7773e9b977ed3d49f467d300a881c8371041394910f9c366942449045568f01 +d = 2f36613043cbf53ad36e2b38998bb867503359ae082d07d040e5a10a43e06ba9c91e7c73308e41e2391b65e634f83b162cbdf4e7a44ad818fb93a978af00f06be06731d8c5886c6 +Qx = 0fe1afd356670e1dc6bc195f9513f1dc6b03017416b5252c7b56153da538422e557d9918298ba6c78283efa0288c0ac61298846a6f8adf74df21747cbe7c18a2b825a330e843cd8 +Qy = 18b7659f0a7e8e7ae5d636ea4d1d5f3a1f846d4bf3dfbd96c6ae874354db6faedf02f75c4d1d8bd6a3b61e70ce58e38ea5de8cc16828f87a0667614f6640a3023b7f4aa93fba577 +k = 3fe351ff6ddf50752f7dfd8e5a72c9faad77dbea303fd97dc939eaad3aa7fed466fc8939a7a6bb7abee63455284a5338e59dc067236dd699bdeeae1424d993a9c76fb2fe9595423 +R = 04a0e13a9fde9f2fef417199f8584d0f60b2f04aa6b7524cd2a2826d63043b2188ca977c9567fc1ff292ed480dabc01589db8734c15aadb4ff54a552a7d9e66829fec1dc919dae6 +S = 01bc7d2c4ca9300d7a3001755ef25231d2852a7b9a3e91baf21f2a2bd2ff305be8a9de1d1bcd7bd9eac4ce12ecf8a91c0a409726085382fb8d2428adf1b42b37b50c9e8e0535d7e + +Msg = 21709eeaf9e1953822294a478dfacfb205fc25f447a73a76a32601c00784cbf2f9ebd41c22721d70cdb3842dcaff4a4f208d41c0816990e421cc4b8538ac2f347cdd0aa2a39f1aa26ace8cb6a606b23f6244894d4594a0f6a5b8f6a695fd66e1a41e2eb6a377017177fec56bb58c837e311cd04c5b50575faee32606b9636ec1 +d = 2e74948c46930cbcd9dbe2325539c7dfdd910f309fd610e6599d425aad9ae230a8d4681970a14f2a71fd08030d0a40ff40dade7de1b06a80441bbf7e2fcf1809cff39c7ef88bf9f +Qx = 1b75f2d281592c288fe6d5479a4e21ef626471819850cbbdf814593bae7e6ce2a35a978aea354649d979f161543fd4c12dae0efcdc2d95e82ae5874b9c04a2143535097b8a17c68 +Qy = 0c7160c2efa3aea1d18afc1a00b47209dfc750a5317ddebff04bc4d181f238d339a7690c24e55be2cb0c01719d34ec986a07727f2e412aa72434efef4d64ecf7c16e2e75ebd7ad8 +k = 0d3ae3d8e5e01ad838a7cc9a4d9b3e41eaf9894aed1d1ba597458391d4a2ae38c5d6efdb4d91761a415812d77fd9ceaebbf1ad49c282e693d71d89f0e2d1bbd94698a47f1f30890 +R = 1e2e9e2633885c85f70208de30ae9b7f72950e2de980607f6d0e73fc1fb2a4a8afc6388206c11b081540bb528a94e5386ce77a2d5c7830fca19223d57c1efe7ac488e69ae07e660 +S = 1250d1b920324919ef81865513db461409f6f8ad82f658dbfccfae4425906da306ba10cac84cf5379b6c1d8b252f3c6f86439413c617deadfad38a234bf2b0050fdabf7719bcc9e + +Msg = 3a131fabf3dc97334f212fce41c44300440d16de1d6060450875f7276f53c026e2a511681b5a8d75fc0d578546339542833145f7ee13c708df33e584445a75a5538829286480d339be7c777c03c998a6d3f037b25799ab2d541021502a0b02a9b9c337a8b176c4f30e5b186485a6103b1d1563ad4ae73ca806a5e4daa92e9100 +d = 1b5fab1d36f6f6d559f65d8b01edba610620fc3a38307b1fb1c5bd63e7ffbd4a9098cb8bdf50975a873f5d047ee2b627b090897a7fb5f56d3f4a0f3528179e7c969926fc0d3b0e5 +Qx = 5eb8c5a2bfc86aa9a82830d665296f74aeffa9c5b38750d0ff51d01c2dd0fb6f2209f8ba89ff07297ab9b1b06168757f48cb6eee618a7b44f1b3902187c33208288f35a06665920 +Qy = 5334c203f4ee44fdfd5f99686b18696b3433f203dd148324dcfaa03a0a250cf606486ef11ebcc1ed1839a76ad70909d835a4b30a014104a6ecbb284b33f50bfec33d8b5ede85ac5 +k = 243889e7ad32076a3ea436356eb572c1b4ae402d0218d3ee43927eca0b4fc21a19926eea35c37f09de4766f54e6079c34fb3c174afb953be1aac46d675bd300e717dfc2d0c3fae7 +R = 1d87b52dde9f502f02a502e7a331ca6dfc6204922fb94886efbe3013446d08240f6dba1210a76eaf804562aa92a14d220d59b6310d6caea0274a5e1e8aa3c6b57f239191a71fe3d +S = 2a5342df6908841b719f80ff905cee0ec3fd8be46396922c3f2f142393714b97128e083907a3a2343f0cf9aac73313279ed29eb44017e2a1cdd0fc86e4b7c536e9f7eb1bbd192a7 + +Msg = 679d85a762f2574b0b31b516270b7d33d5e166c83e91a0f48e0f3db20b52f42f9e6ee9648cf58267ffe3b713723cf3df52b5fab5c14db1e7189f7cb7170bc6ec7cc71946745e152b39180f828688a5b6c0b2957ab94283b90052a3c6e36843c391aa8810f9253b639a8d5a69aec10070603ad7a99dcedb544858d057a1d66b89 +d = 383e70c71b431eedd4574f65d01fb0304f7744d668408c847f7899eae44770a7f3243109740f177d7146a27748886b7b77ecf3792b512e8d8e37c3bf4ecef2b1253df7066498f01 +Qx = 769dd91fad550980225877d98f7c86963c88be141f91f7a3f1607e0cc6dab767aaa6ceabaf46b65a7c80b6a494b0dac1da5d2fc8c5b07ef7085ed1bbdf4273da3665a6517ea1e5a +Qy = 282fb94b4726472248f01ee43607f7ef969446313e849998fbf0058c8ad5e24457006b84fc0460b74d86ca281caa174e69fbb68673e1d28ccba17eae045eabc1839870831246a14 +k = 336909099a1540e6f69172d55e0c88a1afa99808005bf09cc803ae1e4e4fbeac2f77f984bddb482f1f13e4430e25e36962b1a4cae00f1fcd7f2c7a17372c91673d8286f9829bbdc +R = 290055d578012a5b7d88fe2f70581a0fff976756b4581875cf5db07e01f09c0bdf6ab70ffb5839567583d53c68e31a27c3fde12bd4f1e1315af2f742746277b1fb1349141ed3043 +S = 1480c63c8b90c7b51e092597fd8391a237b07f0ff7dbf615e6bdddd5aa880db29c9b9add5bde7e0e81d9a37f852c26f21d750cd2f95520d16da7404c2c3feee1489aff09f298d7f + +Msg = 236152ad31ce2ffc0dead3c142cf6c770672cd2e75af4a82fda1a72e1c775cec9b481c6f3e411644df7e7ee901c501405620af4b6e9667dfd46091788daa95ef2c6c9f5c240c06b15cb0df51f5f058d8a7934bd7845f007a35f99fa97200b20f3b5b14fbf1e372507f3b2f377e8d07d30fd3e222f398f26d8f428e320327f901 +d = 02261d4ead21f02fab19bbb0da8c272286704c8f0c6842ba47ded121e5cddef79fb34e6b9694f725ca502949faecfb21e3cc062a2b4c654bd542d9a1fe8d97bdd0905c510aa0999 +Qx = 3ef03980ea9b754b655948da63469fe526ff0ba2c0f572981d02f5693bff620b55b8e9e9f9d553a78a0138072369775c7976f028631e65887cbed62fb447c9f41da86022f4b41ef +Qy = 4446eed90f2716a7aedefa1385db9f5f803434517fcd80571adc9b7f086c9787b76306380a375668b05fbed30922746fecc0cc16f189dddab676516ed1fe4d02855a34a90975389 +k = 0b309f6c53dee8a8956358df45e72126ec76266d38babff185d4db1d449c8fa9baa4b0651af5f5b0aa70dee3dd55623060097e2f94ed12636961a7c0744b38f2f137bca239f974b +R = 2b42395206ae79bd9df1c729856101ec3c4a719616701f836c9d69b542b59ce973d91951853f89a0717abd4b929bc69e59cc379c941349dfb4f98d49f9dff572c614242fd370e56 +S = 1ecad482a8eadec6800a9d876a382125eafaa7bbd950fe5f0588126764126eb1b384424015c52ed6a335668506f25124aa78d98ec5739fe282af0c143c07da0fca53b9733e159b8 + +Msg = ba3f02c4847fae035d747db246fe4e82fb9224ff9cf568a6ae548f5dc2befb2079541d2cf9aaa6b18c281a05e7ddfcdbcefb25f41dd91cb3092b3343e16985e91c912215cd99ae4a099baf628e33a7b277e3c36a13aaef85418fca99f64d73b789f23ecbb76c3095ade0a5f7f34836a98c5be933b44a94a2eaa3f99b1d8e7937 +d = 316c78f289e1860bb623082be9d9238b88e38c5e978a868bb90f776235bdff4eff591877b7f350cf14c40356922b2b6aa51d64990360b2b0e44d6941b5dd9492b4f4e1f42ca163a +Qx = 6f4137a2c63b6b79138027464135021b034f97bcb2493943df6be844f1657a97632ac80541a3b43ccc828789517efdd9f86ba171c1262a07a6b337bdb0c8d5f018302a8046a1a8c +Qy = 425cf553554d18f6cc97f0caca2a7eebbf266d57030014273f701562d5b1444240b9d22060ac9bebb37deec393cebdad21ec7f13fe5c7f1752b4261cc2feddeb737284a6eec3663 +k = 1e0321344bf364f1ede39a49c8051f36875ad78e4b080ece9088111739041b121f3f334c6e923777fd716a52be669d6e45f381da11262fb4d09ad66dea74ca115838e19fe94b7f9 +R = 04f24ec978c52ffc7675a09334a895e044eb8eaf04d26c094d7607b77ac4168a02a972f577880a0d0c73f218815e3a7a70c91c50734c08d374a15fb42fd13367dbbe08fe9c2d4b5 +S = 060740270df0e1fdfb8e829c9601b9901223b19d07e9d7d422b9bade88a50fd6d4ec96842afc45900a0107ce85ea6d083d66ae202dba3a32e50c7c3af951cac7acdc6f4c406740b + +Msg = 6d0372b40559e075af56af853cbe18ba2d471b0fc8917764abcc69102b03d5bbe1fc12458215be66409c26c89f67c72a8933677a07f88993af6918acb074fa915fe883b24bc3d191ff1b08852f07eda98977e70eba072d8bf189cd545230f59559ac05f1fa3f4e65886d0bc274a6e02e2399812b2bf91abae81e21279c5de996 +d = 2c1bc13f8320d97a82f3d9354e195481902214e16a4fd89332a0499208e91d50e5cabeb4927ba030cb42f5bc53b10f500fa646a8c88508cb0d63ebfce5c4bd574c527d686c735ce +Qx = 2210791ca48aafed20de84ef9896a9c7584081f850b75884908c7b3dccc94e221401a6ffd982f292a9d5f9c1d066ed493da948ac7e93977dabd7b820bfc0fd21cd8d99c072bb69c +Qy = 33574c6ce7da749ceb480b4e00bb1a58203bbbca5c16923992cc9767aba5483e4d46ed39e71000a1fe920a4c1c211a14e63ace03635a2d77e72808e0664334890b819b3caff64a3 +k = 2e3db2d82c4b9de2bc0dd0a93c1c5b385f75ad03d0da527a034da2876b42e43cd88dc64833efef54af902d85c568bb8e71684bb16b28c32d80bb3e9911cb1b74be6ec520d99b381 +R = 065f4715e87ca3541ea695878ed5ccb7d2ea6eed5d6fc5ec29f9aa8deb4001cc7c06185d6ab2dde4347344d44f8300a1e92513af4690d713762336d2e6a94d3324a224f06eeadeb +S = 20104e0767530ce2f4351af4977b52339f34d13e458de0482bcd58ab38ee041c9adc7b05650260d919b2648e2f820407fd60a8d6b4b991b86eaf29c2c4d12d3b0b45cac2ab22c5a + +Msg = bbfe66c82bc060bd14fd0e40769d9b3a026eb447550dd9f118c30d8448f725f8366edef042447962ba7f7f833b9e9094d0ff600714697e632626e7d12a592e040bdcee166dcda93952323191021bd12f3b1647d0f25a41739994659dcbb19333ca30f46f539c6f0a5c354cda8969a1eda572a309950c84c7607eb8ac20163912 +d = 13bd80eafa67663e75d7ae139bf285d2b9f1e03d8e32153c73e26d06e86d7acad22bde9f121a3f1ea674dcc1fe67bc7f5398d5e92555056bc046a02b0ba86c2a0dfe32e91add5b6 +Qx = 4c01fef7f2fd8ee61726af1a2d046c7ac67716403b99e021082e96d733368c6c64d046986fb01a6b55cc930517762387eb2fa4a8eda23c700d88065bced8595188760170881a329 +Qy = 189bfdc8e7a710522ab5416182c9579ca255c5009e6ee6604ab033c1388639c0f7aad84642290954db9f4f7fbffd17481eabed38151160457d68ebdfd8695b5035e4e6e06532c0d +k = 3c5868345c5314aad5ed3a74488a85b2f049396022cdd1de855a0b33c2877f72e871805af3ed8fd7e7a392c4ff63acac6a6f0c431ce7af680984e8c81d0350abe491a01f0f9268f +R = 0c7e96b9e9a5935ccd51b901aadab6e01ebde44f57e6f0b84e7b58ab4f62ffc0f3f3f980665c581ee3de233ee49d11599529348f1ad3d362837c041cf98192bb324f577e973e1c7 +S = 2226922271fe8307bf597742618ea9c1c271c22c25b49aaa7c9292a81ecce2a55250415ea2ec8ffec54bf0508e64426cb9cd7177265fecc40e056e96cab661485e789f0c435b72b + +Msg = b35e9bf686717ce3b16a59963a32a2116130453b161a4e7ceb27b755856add836d779696edcaee3b5c986523891c8836109d431e55c23afbca022437ad19e6777efabb6da3bba1f5f44f905395b4cc7c9210590fd38da621582d059598e5e4569e904358e0dfc0dbfda4ce75538aa97480912852bccd433a9b96c9c66e9597d2 +d = 30834b0a4284097cdda2ada6947c6c281f7290a49b56becefea1e2788ea3ef78fb96807633c47c25138341768b241164ce0d42f7301728b928be2c047f2eb60fc2f844ab77306d2 +Qx = 03a21f0d8e01a64b235cc455c291e3fec8de12682f05544de207d910c7c24c4cd56f3354500d994380ebaa0b49a7604c6233a9aa24934c550c0e609f65fd4073cd6c1ee4170d77e +Qy = 67c83513e4acbdeb8343b3add40261edbf7c8fe0af7417264830edabfc40200283b92484630741378b997c3f8bed7285decc6ef8633aa804b3846d3b4517e5ad836dbb1df475818 +k = 0031afb24fbc52b01480754837cd84a5165d5f2ad1a1d572b92ab546c049413806f0f5239a77c751af4d57a84786ed1c11bc76123a82e7db3c0495b2fdc5fb9c8720eb7afb640c1 +R = 07a222cddfaea617f1190a0bd88af4d1983d2543dfba25c5036fe24529bbe2e382de89dc1e36c1f6df59c8291d1c4277198084902e5619b64128c265bcf03b7d8cd6b663c225f11 +S = 1ca84c146ebbd16300b813621d503d8c754e4b11446d5ee31cbebc71f4b85ed09c5c94bbdfc3570e8882ef790393234c5ee9e52f7d5b74ff4171d930af817eafc40ef203a1ce613 + +Msg = 57b5ae7e95c638b258d1e09b3fcb4341e203f5706862e199b103c8fdac72cbc5155e5cf8b300a0b3fb0ce1f897c45f7aefcc528182f73dd450cd84d5fe9eadff3f704dc2a01b4e847c22df430efd1c66b0199f3e5b59348af5386962a5ef25204fd230b54d58d7fae801c086f8f405d3d0aa7a9a9da15c22b868817cd897d853 +d = 0c81a79ced1eaaafc31b69a40d9939f4e484d625db6364a8e589b6b4d336d458b44287ea6c6aa7661113fc07806b147ff98216fa0c08708dc9d651821b922741deda522b4e436ad +Qx = 25f9b767b8796466c1cc8a1fe6286d591c04a0d115133fc7910640032b898a5c86547f57794e5aac0148996151d3ecbe0d5939dbff5722679ecff378e3f21bbf1354b1eb294d1a3 +Qy = 074c2b91ef3472e60426d2fe182ccc678aa0abb8dda15a428e4f6f1ac401b015b2b7d83535a0a92770cff7666659e1cd33941bea1168cffde82db0ea83668c2d387e6f4bdf28cc5 +k = 27b407a29553203b829a87eb25d6d140e41184634ae1c64c6ec38e9012d0b06a1f4ad9877d7ac4236a22145095990233e6c102a0052ba18cf6e47e289cce4f2ca21514d8868bd68 +R = 02416e11fe2f8e4738ecff1710dc827f4e03c8e7f04a4f52e755f0c1676abbd122eb9751ec1fdf6c7ba04b4e29f8dee52bff7e9e726e28cb3de6f9abf2dbf58c0519ccc7d70f076 +S = 0b96f107a26097a468c1d410bf90e223cd72c5ec98d4ee4ec2e32259d7670d7e7689e62d36549086139f6111884530e20f908d7be1edab75180c81a70ece341f7eda6e4a43a5ad3 + +Msg = daebfef74b452f039c999ba0528be3bd9e16deb5f46f6eae87b63db8b89952c949fd7db08311871eb2596865eed107aa065f030226ea675ee3256c31a3f85ddf4c21760582144e07af208f33c5f47cc026db5403186a65a47940691ea2d74ffb1245676260ef5717dd879d8b5b72d96f87fef5f762d4fd17454cb5ed83d8a11f +d = 2f24670c0f77d2ca0266a743023d2c7413d56d0b5ec77b454ac59087efc4ea4d46179e10278e4ba416ffd8c3f9786ed202faf8251c0ef5a9ea5371fbb35b7afe3d15a9cb4bad975 +Qx = 2da72b8ae64c5ee717c33758ec26153a342936f9d41dcbb136590e1303b0e220ee84c8a06b83d4d9fc924b8808de94dbd780cc8243bc4448efd27dfaa1572aae6abe574be664939 +Qy = 3b3a95d962c48a81c48713247801e4ee630ec7956c9989023ba16f02f5bd1ef2edcdd1c8d314be933225c64b7f8a80542b209b944e1f3fab95795ffa134e7e28e82307dc62c2962 +k = 2bbb9abd2732994011c8d294c5342e8b1f7f3c1f5718187e9f75832604b43bf75abad5ddc85e8d92cdc42656cc9f3349afad3f9022ccbb4937d9ffa9cf48314b604e82bda13475e +R = 3986059f2e096a3675215698e23b53f471c578891f6d721a34a0d231d16348d5bf9853c79c4f4aa94642ad06cb7bfd11f724800cb5477636b6fc0586fb6efb8eb9bbef62329a884 +S = 2beda064eb3ffa1c3b5336613704b3bc3d4ff7b0e977df16477c7e33d480d678804bbdc08088186fbc4764be398a26c13f88bdd23e844be0d7ce598bb87c1b3430da02ae96b3767 + +Msg = 62af0493ae79d71b552c4647d1fb7ab2f282a91cd44aebd8ef344dfd77b521b0c0a3f72e4513c8ecc0e4b84efef3df9482a07ccc1b740c571c5e69cb913740a792aa231b9dc87edfb72bac188293c6c6e788cb3dff32e8f483f8f34e21ee7efec71302cc3bdbfa47908a135f6ef3ff179dcef26d1a3987f7be967a6c0f799b0c +d = 20985f2c6fe3ea04bdbab66a8b6167e5969c073b9d53cf3c77cebbf73f4dbf75e601620ec9c3107bf3fbfc6c79f8f063409bf8fe1d14b19e323d857e23dc05157d270c7514137e4 +Qx = 010712d50ba7752962b140cfb943d9e8dc3bfa497bfe81c42606f4da5157656fe2ba5cfd33ddffa0f27fabef8e267688943514df45e642ee0454e05b49f7c00f5785777897d225b +Qy = 1a2c7db6595c6d4c55110210c564cf102739760e7f5a29706fcb2515d99ca00949d5b4f291716d0aa1e3a47efb9632410f60e2fee1ada47171f902f632bee85da75c7f3c895c24e +k = 2f26eaba6452e687af452d5e1208fa011e4c84ada92a38f0a204a254641c23ffe1c184fa8bfaff047db590ab40accda408717e4f30811b75cf3a5877ef99279476ab924d92565bf +R = 1280adcac1c79352635f4165f9c5c1b6e1e6e33bd74d781773f483f637462f80340f8d22cb24c9db5e49ace95a676df3dde53c8721f672006382ff806410bfcdbceda50e53285e6 +S = 07dd52973ef30dbd480047732622fb1b695fe3cfd080264d2aa30a6ff3dab4ab362518c4f3de4fae042fce78c0c8fa0e763eb187eae2ff8f2e79b3f38cc3c1aea897e1f28b71a19 + +Msg = 566f17851951777ebea3f8285610cd8ee5f882a68e7a4205e6fc9e2d66d210ee2505ee73d6503169f7b903012d43e7e99efa493a8e6ef926b16b9ad8f52156840ab561fc6b680120a88714fd66d1d0742189bf06c155e1138ee5314707173f7352e2cea0fc26e1553643f2490428718e44afd8372cbb7bf5b88234318ebf4355 +d = 2b3d641607b8a141f876f6d285ee46aea543880e772dadd5dd83d595b9643191d9597218e1d6adb081df133304037bcd2c05c24a54e6c4cca64fb2cc4569d6882315360059496d8 +Qx = 42f2bffe25142ac6c1af26643b0f1c317b34950a8a0f112a0cd4ea4131303674328e0bed5d9bc7ffcbb9712387cf67129365b4fa8a9e785b787c170463b24f6a7962c1e003c8732 +Qy = 070962ac4d3220f367f18caa7ceaadcb82fdba45cd2c034a97aab71f7f7546c09736cb080c10d9a95a5f984aa4a3ed32d22636a7b3d5ab29c86d85db59f6f17ba29eb220bb141b5 +k = 23d7021f5376e7b11be07288a0e47b4326c026df80d7e08c9a0fff11deccdadd479dad503ef2d4fa3f0ab2aada604b57fa7e09dbf5c8d493070b5faebb27cf68ad0b78bb6f3a9aa +R = 3059720e7a2dfff03789e7a514f75f2af5ed18cf1568fa2a5354dcddc9d3c7a90605e9b9a3d0d6fbfebddd615cdd52845ff922873079e06c4f349f7798410ee18e0c69045193668 +S = 1cc40209692cf5f8ed8b82372c95033e4199d378a28b9edcba516820ba21af1bcf5c5df2ef4146b91fd37dff89ec8f9962eecce5c5e285d76a5f03eaf99fa132e98cc40ad66c296 + +Msg = 25155825fc4f9a1c4dd1db837008e7e2594a879052431f5bfc76d0d2565b8fa726008befaeddceef73f3c60fa2cdf6d9a70e56d27210bd013034b38861ae49640ef208d3fe294ac4362f8eea44f58af3af8a9167a36b5acafb7ec95652d5885a0e08067ce1dfbb45a0c89ad1acb53eb404bf88fa5c3c463a0f912b5a2522a0d9 +d = 1afeb5ca87c81025ddf09c2b2c5ee22ba0105c0e619b67a324467485bd839030d149fee44d8bac6f5902a1245a50c3437046b7c89a84116b2147cddc645b6d2fd24d68e8d53bf5b +Qx = 119c46988a79e3ae8833ef096b0a1e2886c4b114ccfe881886859abc031df2b1e75818c82be8c5abafcbc5d7b3b8344e98e3f413d737938845e6eab5aec7e507f7baf0d339a362f +Qy = 3190912dfb5a1a31fbbbb50784b18051489a3cc0f44c42c71d3a54886ecf40507c3240395e8ced37b5253b915fdedd38f75bb26df2a0a8edba865f898a15f2d96f632f7f0638864 +k = 1facccc127c856db1994c4d9e9c76de6bffff81a88d7aa0ca1645e250e07674fba73447911c5b47a1aae815d5e96164854636d3168d0344b2d2d913127011b6434d5a5e545d3bcd +R = 21da49326f39577ee9f65cee64006525de88a834365a00f4f8cfb9a01dcfd6349a3d06bf95990a2c17b7e95cc0589714b7a795c7016b29bc844ae9031488ca354548976eed68415 +S = 3364def38a8ee3116cbd971794c859776107154234d8b198efb19655647bb9228c7c6be2e703672f795ed37481e994b6764d0b7c1bbeb2bd1db90b34f460278a54bd480bf4e9adf + +[B-571,SHA-256] + +Msg = 29acb0fca27e2a10d7b9e7e84a79af73e420abdb0f80dd2665696638951b52dd39ca028166b47a3b6a2eaeceb1a11c152383f0bec64e862db1c249672b3770909f775b794e0b9b28a5ec8635a996d912d837a5f22471b40ec2e84701a8804127a9f1a0b3c96ff654700bad3167240c2518fb5dedcc1be9f56a807083e587bc56 +d = 32c97639b69c7cdbf419286d0a1b406d9b1f2886521a8b979a36118d2a368aace5b02dd8c515f2041e6fb9f026d1e82e789dc826a56d2ef732b1bb0f49be2b696ab5d3d5694a2de +Qx = 0087ff1d8a4644edebd43c2d43d49e140940d215f272676fdfb72ccf58a12021de3d668f2766848044ac404fb45cf6e18fc6700f87aa53b4fac1e35e1731814f8a9d0233e2942d7 +Qy = 29fad3638177541d8392111064837bfa77b4455c21c5f7652e3fb302f4bff4a35b74de8aff3806538ef9ac86964cff755a81cb3002b6fb241ffcae8ac9621b8e034967d650836ee +k = 16a06e3d25873f6dae16bb2e569720ee9c6ae7b5ba36854c321a80be8b4be502b895e1a3d161b001f6cbcf53d164b5485d8a5efa0476f581f9c79b3a291025be01a435e2fc5ded3 +R = 347138a43f3ed1a1a26f5f11549eb8a41f64aad302b6383879886216ebb6d08a4ce270d07a5bec6018eb313430ff017c1bbf78556436d9255e97aba1481f0f16b85e7320df79d69 +S = 28f35e1aeae288122b043deff9ac87d39478607da60cc33d999b6add6209f452f631c6ce896afd92ab871387f5ea0eae5f6d5cf532e7a6ab44dcf44acb1fd1daafaf1ad5423d8e8 + +Msg = c92d67cf6536f5046e15b02158da698bcbba4ff1e4e9e9c882cda67f817210402ef917ae93682c9c3dd817b21b73c6c00b7bf92ea80ecbbef2e67f4f4379d078a2b0f297742b2bb9c3fa3297a7e8079f488555bd37715eec92b4b1cbf897640ae8a1d2a0fbcee5423ab31a37629f98630275e35094a896cc574be0a449bb1bc3 +d = 0f93672159276c5a293582b9f49607bbdb970112f6c63b2b3b5d32ad3c8240c86b1af13a8dff6502c6b6a17712cfd988f8cd23a60693d64104143b3f91adb37f852e9e11a0ef110 +Qx = 19dda59a839aa2ed28f69a62a3e3a753c6fc789fe0d8551bf59095f009d0327386e6df5437846c6803df2442e0359a367d04f117e3965397576d4287398b4b8c92ad278df4a447f +Qy = 4159ced60503f7cfcfcd587bb3608699f54693068101a838d575715de02fff81058d025dbdda430e176f60e423e6fcbba889914f6409ce51d51e89e4cd7bbde6d24404e5b043e79 +k = 10dd216d4b3da2fa6a75de60f722f1f128776741cba002c055d1445581242a175318291fae313eea11fd905b20d26cec845f57a3d5bf23ae4dc93d886c0594f1cf7be4f59f3e3eb +R = 128d5c00a48c7352eb980d9c80781f8abcfdc1ddae415b7ac94b4d85c3d7d4f7316e2b3344ca50c6ae82938bc728e640e59e2d733f0c7f7025e66c15c81e98a845c1ed4843b589d +S = 1ab59ce5e54bffc68fda96c920b839fe03d1976ab36978bedd973715ed631bfc8e3edd100043ac527aeb5ca121da848bce4ec9799f55b22454e9af32848943058b257e815b04056 + +Msg = 15413f614c4551e3b138b64f66d15f8964c40326a42b0afce820778eee4a88edb127fbf575da5263e5a2627b5461d311813ea868e6417615e7c4938313675009caac28bc7a2f4c0bc37572d9bf36a3b1794294e09c0121ceecaa4b916df45b0dd31225415e6c87cfeeb092a008fce2c543cd62365779ae28f29fa02a15d9dcd5 +d = 3db080bc99c5fe7e06d5032167af56783cb423fae59fb5b3c6bce5fbedf56b7b39b17810e48ea9a172881aa1f42f5e267349b60294d4a208b4437666b44abcfee5a1829e9467908 +Qx = 59d1b3f680da784b49dde3b361eee819d67339447d7bdf7965550264eb63bcc7674b0921f02e15d45466dee52b4c0a50c2bbbdf226af1662086476a9eb1236e3d4c2b6219af1bdb +Qy = 4e3466200dd6ecbc268cdc1937ac5123cbe33f32110cfdb8b7536987ddf5c9ef2464d2334f315b9b489cf227a6300b6e054fe40d36c057a692f2fd3e762624069e2adefb65d24d7 +k = 37fb32a902eae0c5d7cc9f9018a5d1a906a3d1b9adf5bfb696ff63f105cb2e736d9bc1961677fc897fd3a9e9bedd370be6f25a03fad425b5a293c66180df78db33aec4a188d3db6 +R = 3aa8ab9fc9073429e52469088aea91f00cfba271b9dbb84818460883effa0c51d6a48c1905d6f58d1312af073dc8735c29957f30324b467797acf86e028410de016338b972013ab +S = 198a746411333172daef76359e7ad23035a0f5d14c283cb268828bd876b96b5f767e0c1e2796def7a51429f39ab2332ac25d8e4f263f8dfb9c4c98da2ccc398fb3bb9a6b28ca28b + +Msg = 9f901557451ae2f8ec79b6d4adc794cbfd9b2e6d28f19409532d91682820205308b41498a4e1ca247a2baa8da93de95e3c0f7afd6ca46bafdbdcc6d3374a12684676a50988b86a960a82180648c8c1e38f8fd9af604c7be3be4b24799f4544ac96d6360cdb83d1d0847fda21642934fd6cf65385b50d86d4656987901fb88d0c +d = 06ee767f6f36bb8f364f324d8346455c899a49237d759003dd52cfa13b9baa4c71347b134b24ecaee32d247c34e3787a0c64bc5d299b55c86f64b47521d22f2c09db225b0c84cc6 +Qx = 3f971125860f4598fa310eb7a8c6b4e0c31bb721fdc17ce6df9af557beded6006b8eab10ebe7f3c4f3d759d4a87dcfc1fb767ef87beb1f5c845e3f41503a33b28b2b5aa1644dd1a +Qy = 3296062514d4e89d2105dda5bd65a315b9770c45afe4050d8c3d15001405b1e32be5867ee90cafbe4e239dd44d030b4fda855182f1fcf80963c1300cb842459aaa8c2827371876c +k = 2b247e2dd0024f534ed2797110df6ea4ba166c34d91c94e43b045c0ff80f124bfec1cf3be3da7c58389d352c8c5c1bc2a2e876a7e56301b1e688a085ea0222697fc63141564365c +R = 2858eadd14373aeca65ee5a2cbbaceae4b54a50e0941a696406dd86d05c07c5599379c066b2288d01b2a43c9ae34bcb8c36f59d490aa8d066fd3d7e539ebc620a7176507ccfb232 +S = 33c20d26dca20af2c56982fcfa6f085bc5c317d01f3b1dfe0ade1ef6e3e960b18b626d17d6696c936f04090ecd9606c2a6ecea1cd1883bbbca8b3dce3b0acb2688fb2834aaf922a + +Msg = 959fe5a19d7aea2ba611c7203e19f8e3f3cc101e03a98f91adfef602c424c580d5a868659368a930f9883d699fc633bd07f6cf8de474937db0bea86fa7cd140ec2f202663813033a757b93bd72afba15be5e47a4eb93e8a666aa1c72c241ca3922547d63fa3732fec54afea7ade84302e2f044275bb67433fb6b125b7913143c +d = 38e2571d9f22309a636586d62863ed67a70538287f3ef88b88c3c2fa1a2900d48c342b6f15c26b8e7fb4875cda4093b7de7ceda48fe1e2cc2975afe958040881de61f309931e48d +Qx = 5a221634ca85059543e2caf8bdf79c43bb78deb35e9c89e07d553bafb6b31750a1d85ffa7689e528c11d8a3dae442b4fb2a4a21238d636eb04ccc04c8b5d794b0a213fe0480b1d2 +Qy = 225ff457b6cbc12d152b08025cdb7e1e921ee553add9cbf83228d678d5a9f5d3d1fb4327a74c1dcb5d69a5b98f3ed1aebef0af09bd49d253a903636ef5a66844c500fa221470f2f +k = 3b4de49d57040141f3584ff596eda457e2835085d350b75391d90abe728723e1d1ac6413979d4fc3eba98d72a01248e6510c722df15df876da881ad50539e4248facafcf311b464 +R = 00f259038b4d3d036bde101aab29f4558e88e604c62f967bc7a35eeacc6a56294268f8ab00a34f9a0319b07754f502c98718e8b5c91093cdbff2c8496fd63d6fc2c50a35f87f423 +S = 2350d5406922e8822a91f7c95cfe8524f017a14cf7174ce534c60aeb351510d06ac20dc1249129247b21c72c14b02b710c26c10899bcf995143aee632e294176e903645b660e998 + +Msg = 97b9688d9ed5101b8cfb19e84b89cd644262ca1c7ee18944e29ddd3b4cca78e06338b270385b00a5e8b91ca5e628de3bba50e36ecc695b3ea737a9cf8b36871c473a54ba17819f49e730c0f253b0c769aefa6c16366fd2dd612f330e95fb119fcf3bf7f3e254438c0ab635ec04a8b2424a05b483ecf65b74a93636fbab7bf1d8 +d = 0c8f5736f1ae65592f3ca850f43d06441aaad8c03820f3b08d8a6db46488dcfb828459f8b3f34af73cce8dc7a5e3834e085a64523d890028e194214cef4003210e6eb530005b01a +Qx = 667ce3db45b8772f717ce20755ffaba968aa1314d75c84073042436823fb54bf8dda34a6bb45a61d610745b1fc10eb0eef71c4f55b26acceb442d822d6e2a27761c73b740f47289 +Qy = 56035da1adaae894e361f5283b3ea07b7d9f64a298be11de9fb487c2479b120381f1c60cefe5d32d37e4644ac86a170f82b1c4443eb71b940b21c7a016b559c6c79835532c276fd +k = 190468668989a607a3aa966cad071ca8e8eb152b0dfca9205bc9417a3d612ca1105c7b90340b04acd96a5223658adda16bf6b598ea9f32a2f8d1b61c2c2bdc08d6a49de246240b3 +R = 291e1fb18edb7a93badd6fab6f56ee0d390f3b6d298e97312d5277358511fc7621534ac035f3518cb140fa4ad5ef7d889c0d5f3f52a4e4d06bc9f647f99695531f85a4b76cb1184 +S = 2d916734e02b0a98406bb5a9723486a7ed40bdd0b39c4cb802af4bafd519803d23c6bed59a80c256a14eb878229942f67e0b8159d5cbf24b719043171b3958fd669adfc72eb7289 + +Msg = f08b250bf4a3980cb455338b3f4173723b3f44c97bacc9cf550149794a71426e398cb4a74bde141d8b7b4a72942f1c069676a9918e27792cb8f085ee037c78e3c468adea5123c4c64d8ca6a39f2f90140c5d2d80b669cbf0d1ccb466b18ded83a1d5f042c36188a04111c34ff769abba9aedda40a87be1e24b700225e2078056 +d = 1ee68c3994adaaa9e0d61bfcd3bc1cdf198d3fbfe28a44e5dd518867ea04b20e795eadacc48bfcf8e8216dceeaa069b756e8e99ed87b6b1d31154cc9310bc3b4555162a890b0c6c +Qx = 3efc83ad15d9bf889c9afbd769bdd1dc8925b0462c93868d85ca7554b540d8c3ef7b9a63becc85981972eee8a70b7f948098ac050ad594ef2ec249cc3b557844bae9cb2cacbf397 +Qy = 42a012b3a1d9e46cece4fc3460a2bedc9af4ce0289e95f69550eb3544f7c105b5769fa52234ac88f9045ea5cdd4937664846d26deecf511ba6996ce4072e763e8ebdfe709660888 +k = 031df03a6cec2346b92d9ae7d3d983edf577d9a1bb88098f886f38536d8d8cf25def57726790604e674d036cbcb864bdedf8475ba9c850d510ef93b844c037e04348d5f48098c20 +R = 112dcafb63bb125d9610e59883df481bfde43589e46656b5952cdd72238cfbcfee79e9165e3c9b89c9ffed12d303225ba2af19e00048e20e4edd3968807e4885003d148403321ef +S = 2ded1456df54a24214d8c1d3fb314db52b046ca31458bed69bb3aeb6a9ece509ee521fb8046ed43accc7e605440a09fd96db659c98a7dd606758c0c47e47acfa326b9ed73ba4b28 + +Msg = 1cabd16fc29d7d919622810dc8b23c770b790b98b119eeab1b20900fa94fc2ebaf76be4f5eea91fc5276c5621c8677d4d117c4a5a782ee2ca1d5b0db997fdc8a05b6b3fbb833d7a7b81c3c615c2a662929760a96feefcf89e46b563314c9b77c86bf34438458b43b694ceba741b97dfcdacc0ed57652ae62856ce10ed2690770 +d = 3a6fbf66ebc1365ea7699c72cdac2dd85907ec59cd26e2d18713354b619ccb83b7fc0db9193aa8493c1855f1a83fd987cbbb65de17c59fbe79256aa5392f4eba045346e9ba26592 +Qx = 559dd556241f9b11d0f91c5458ef6adb783f9f5051bc12cac9f0b214f836f7b149d00ba8218e873410a50445da9fbf68673f3282d783988981fb221d0579341892ba6824e0cf4a5 +Qy = 05dd0e594ce41122882538e51e9bf29d159fcbb8b29b97c5546582390ad5c59c975271c58ba1e75d70c3898fea929ef7316ee830eeefbdc69bd80d7b0e8133b977cd573a3b422ee +k = 1c5a193179ab859ec1166575007c3cacb30d31f341a0e82ed6d4ddb32da909dce08acfa10fb14183258caa743010fac6f7d0fb1f8c8f55c246e49a97f2bf571129144c23de8d68c +R = 2625d0bdf37396585d22811a12ae7e0c3f512ffdd0bf4d048379434af46c03c6067dbe7c271c417ac5307123bf58a9f2064bd2b3a2d4b4efa3027959bfe63e13a851f46a21da6e6 +S = 13f16b211b314a7e9918f3254da2f1aceb5340713985610f03ec1d0a33ecf9217d61076eb153d8f27aa31aed3c9b165be52f8d857de362b2c88db5dccfd708a996a46b76b4ebd09 + +Msg = 7bc8bbf5ebeacf40b3c82eb6eba5d994dcc6a3f2e12ef741f90f90e176d20c21e006ecdaf14cb5beef35bff46b2c374d9ee224516679b1a9e9255cd8ad8e60ed234f8ee7e0fc53c9021488158217d4b4369cc597d6053746efa1e73340bdd73c1bd2eed57b92426fd4d278d6a86e8be0f0a66ab3dfadefca8831b2f488636251 +d = 145748871a0b5c1cee628de04a12fd68ff2b154fda96e47afaa96389d66d22802968584f6753d36618d49ed205260f09d3f5ccc2b27a34390ce58179b9834ff92a86d66ea0a97ca +Qx = 6cc7ce2782dd67cf1fc16f1b24ae46fd085b969d936fefc409a9bde354cfd33a154a3113e837cfb88284d75a96f5fbe85274fdd0990af4a033a6c40b904a5e0f666e4d8b8bc3532 +Qy = 7adfea166087502657bf9e2c437beb2f62dab041553a06411f6c9dae83a2a2749a4e5a2a36fbe23d40816b1b8d206b9f5cea20ef200b9150061ca22fee2076e31c88d60a006ef4c +k = 26c820dc92f97dbf545f51db7d5ba649333dde38eaa47d8a7edad9a3cf3e6780442db234632458ff17e1d7b70019916708c128601ff547ac84dfb0173cf0a3c5d69ac96c3d7d395 +R = 338c88d1bbd0b93f3f1fe1ccfcbda65fa1667ec471730a40eda87f57b3eb63d979d8d6d819b974619799c90b09f33c051b8b522c3a1acede101857265ce1b58cc7eb5698049f494 +S = 3637bf89f9b66c7ebd8f91a8324eb70a510284b39f0f2e45578f26f5f1e4504ad70a389427f4d58960cbd918c2f8279de52096e25a1b0b0c3929fd5ef56bab6cde7c0d8e9d2fb30 + +Msg = 0cd2a45392871c0c262e7e6f036946354bb41f9c2187b8c4d399231280682f3e0a09731fbfd52c76ee63b9828c2d731f4cefee0a8c46419c398205b2ff80c67d7756db300a0a8385fa287dd37d9126f75998ae1cbab5136560592118db52fbf102b7ff0a1ed45b8a91a7d99d13a0f7fd4366392264aa1248d7324901467457ca +d = 3c71911d24ad19c20fc1d8a044d63c9bb417abc3778d7e6234c6af79b898cbfc2f2787244708d2fe203be786edbdc4c9b12b413156b7b0bab0be8af895d191d853cd58aafe1ccce +Qx = 6cc47aa586a73acddbc91398ff5782457e6da2b10e265153c678789d3d7fcfc485b03b089eb67e6d6955d5c8c7ed5f933d84853576e76fc60332e5f0a62c3ab23690317bf1b423e +Qy = 15604d94ab9f2ae1d74fe46b1a070160513709de2ba8e74fbf9922e9bbe7f6e743b25701a13f73eae0db0c98dc80c5f8528e16610fcf18f60eda3357ad5878add2554a6befc9d39 +k = 3681fcc5fc1f0d7d413abf2e44cb5cce9a4a252ec449ec4f550df4a172305eecc072454efe2040aabaf4fee58ed19c9090061d3c4835c5fec38996f013e5512c0147cb14a4f0fe7 +R = 0d3c26796bb86b1a20ed4935bc3824bcb9742513ce91a66dd523a3c0d8a5abe63488aabb806b5b113e90d3f3c80e3ffa01ad051e6b0d4edfc641689953ed65fafbaf3e554be31ff +S = 2e3129ff95b06c274f7ac08882dc1da6660269f3dbd21a3e48377a628f6d81326084bbb8d32b794fcbde8e574f853636fbbaba480fb36960b0994210bea319a99a46e29b79217b3 + +Msg = e97092625b09c9ae6e152e1cbee207d83361f34cb9b0e727c816a5ed851f12f91fbf88ad9d4c8f9d07350f5d828fd8574eafc768bc72a2b18aaf4d2b48fb10f7c3431137b51850154de9706487d69a40a8f4cb2c799f48c5d8f518aff752500de93cbb94ab04ae1e0c7183a32d79a27291dd07b5fb6e6a4fab76e85c3a8607e2 +d = 18bd74698bac36ef11add6b3e3fad227ecd868f370ec04569462565d2f0af2340bf793486953a7b79ab04f0ab1f0e4fd16bf6b576cce677d543e73aa8edb0e50372f24ddfbff966 +Qx = 231f891e63bc1c43377faa56c5799eb1c877954ca2cafdeb4883ae40bd78816ca5634f48f5ef5c22dc7d3d0df208bab4149815274d7b134cadb700d166a5e3fc73e9be1bab72522 +Qy = 469ea29ef860adf24afdd386347763008ef6fe2488d902c4d513bc0183fc52742782a6fe500d6b581902ccd4f9bf077f975bd5fa89bf240723b99f726c9fab4f953380745ff9e17 +k = 1590570de563ea96eddd900e4a0a7efa2e4a0b389854e96af32bb7555f098a8cb52d160abcfbde65998c34f91338a40d40cc03e4a9a241d3b16b0e893d3f7ffdbf8912f35c7f538 +R = 32402fbee4831b16d762ea2cb218279f4db5e20bc8b6e2e53e89a2ef3646cfb0abbac36116c8c708a1342db2fa0abd39d149e09db57aef65ad8092f37f7962f98c28331f0f20b64 +S = 2d1e38f40965e2697abc7df5896cf051ce5646f135d1ea0bb470a43250af8df0abf2a04ca1e0f1f31013025b4136a8a6bdaa474bf50752c571f883829bc3a5482ec20e2b4a72c90 + +Msg = ae6723b8df5d6ab5fcfaa22d32fdf106d211514cb1892c7c43ca6cd85c2532f85929c8a259ed251215063cf92e1502528d1e22d5cf67efa0b8ef21e8eb2f5dff881ba1433e8bcf2b6af8742ecb2bccde081e534615a305562cc22d3398f61f277d8ca785842bda85d8a40438d9bf1aceaedcfc22c85533794a69cfc320931d3f +d = 335699bfd058ee2e6163f55d1816bf3669acea8b73be9c4ddfe775230925e6093cff7a66813adf22222c8376faa106d85ac9f3c67929bc58d8986795b6d35d5b9fa546dceabbedc +Qx = 7995e02dd3d40f9bc2e6f4cb1c0d29923c9022169e64532d1b357f36264d18059c44a8617a6f1136e72648c9051a27714a0dc833428762275a1b5635a3ad91e65d2713236c20f50 +Qy = 6167d5839cd4476a638c50db218979a93da44dbf97281d90daa8b9b530960c689279fff6c342af97880db1e9c5ae57b91d7be727fd1c6210ec59416d1b675f4dd666e0b121d144b +k = 3f037ebe0e4c3910953e123becc09c0862490e7f590245c4cdf9ea5fce930a7d7ca5d17f5689edae1ce706b90efdf84cd82e06e4ab95e9e2368db91d50110eb91cf44e50cdce2cc +R = 2baaf025290897a5d68c5e63543256523fb086a6f1166ddfd3d50fb307e0f0cf78b5fa895f8b71944a7b67b8afe5f3e10f2d248aedf573860c42cd7aff258055ee7cce472e8efb1 +S = 0f4d239f5af023ff6c94ad7f66d43201c7e40262cd92467c4ab54be8d2b8e6577d14375064fbd00a6327da62f03f75262392add0ec119d820205065aa6238433fadc8d1734b8481 + +Msg = ee20c6b61886e02ed94359dff3559522ff550ca126fed4b2240ea7d999a182b7bb618c50528fcbd261d5e497a991fbac0cf4c105c0f664d6a00a9001c1ed522962fb44dd4159677ce8f1531019f86457c055c9cea6247086cdfe0442485cbbc4386ad002b4bd39a1a187752437f04569705cb7adc0c68f0fd059d946deb63f0b +d = 2c3eaf801330b3f1b0504f2399f1d24455db29911f750c246ba0a134c3b59da8b3562911197764699a92ea1d95a2aac587e24f743df1dad3e1cf7edf955203e24a0225717f8d2df +Qx = 703d69e2dfb13fb6e695b0b30b31d89c8789e8523a7eea15673aeb4f1909192c06c27558eb55f0315f395b1f3ce84d9c304905cfda1d119bec33af9ade4420de2edbe75cc5460e3 +Qy = 75e35b2d6a8550969d49ac5d656afacf68d3a1dc6d17666f46ce3413c855b627f0891912e373af2ba91211c20f067d66056e6bbc0814ff3921d944008b25d8772cc8d696bfe1d09 +k = 0a9ebaea478893aa0e3bbfd5d007bcec5ad787d9bb5a8e9b8b79865c584966f0bf040d36f62a8e97c123d2adb7f38eb49a86e9c2ce1294d04fef1b6fec7908c4ca1a70bd1699a9e +R = 2d495eb5f6fb187a0ee1fa772ccefbb969e854abb445ec19ac3860f40ee65f53b92f6a797003574bccf0b9de8014ad4e5745ed264eb3ae88040ef6518809b4c66f691d496a85d51 +S = 1840b2977ff137f2a8f2f7c25e347cf1262fd128e008e30e4752315deb5231098c65e9a585496a9d6b5b56cd0b6d7dcb7150a077fd199be2d2de0262aa84dad414e100ac6162346 + +Msg = 734a9eb8288e32f5a67cc1d88704523ca2c68b798d90e188d871d9f50d2da2063baf1ee6685c45832a1818aabc9afc0bc935e97969dc983a484f16d2bedb3c7c0b8221408be2480a5562d5d1e5d8763d1e474bf2826aa93a68c3b870e3bf34f4941cf590d88e1f5a8cd782a33992213f3f6b4b4f6dbfb3c3c8f21f5eaf4ef609 +d = 1c3ff067497e5d387f31f0ecc9c67b3c0dd6ec8c81318c492aad83c9dec6c99e4fa47447f6f7082d636c2591d0df940b947d0a4ae3778e2b7cc8fb92214638399def894ada276b8 +Qx = 2e56655e37b3e753f35eedca95f8ec07b7a3d3e14e365ec041cd9003bdb78a7a8b8ad277a67da5d63dcdeb0ee8d8efb68fe61aad9b1fbef4373ab13c44efacf68cc499faf5b5dbe +Qy = 47bbec643d74874b77f0fdbbd2df3f3ff0d35f4b3e1534b2c4d5c76b8cc51693a70e17d1d4cd64713c5c05966c826458fb5411ac840ab5998bf3cd64a0769c3e075259a70aaf94d +k = 149848f4534eeeb45fc38ddeace59e8f83f0bfb4cfcd2b8b7acd0bf19303051a6a8fe75d4cdec1be036645beb075c772aef4a58785c16d984eb43b9b0317446bc3b3abfe7ec2cb7 +R = 17eb68556224f995733077501ed295088cc1184fa3872f5f11e97cf67c7bc1febebd31206a406c4479b60246a517cada5859d4f1aeb98dfc108e96e9898c6e71e59e39b6284895e +S = 22904497dc7a98fbe117e4427d74f4ecfc4e14d4467c99227427e3abb8d3dcc406f3704a7783d822ec1118a1d91d5945d5b902a2ad325bcc9c17c68ddf8b5323df9c2bde392710d + +Msg = 68e27cc72fec8f3f1f3882c6efa08efdf21d74d13be5171da35ef2855666ad2ea6919d21dbc1cb6d296663dcbceeba2fe47a2c6507d3d4a67a61b55b0f81c93412d7e1fbe15a590e342a05f55daa55f8591171303154e615e81189a523b855829a5c96621ad118f522e397e2eea05c2603eeae6e3591215e29b2289bc384d8d4 +d = 04b4e04281b210fe78d516a5b69f878b7fa058941ee9ae8cc63b061d1eb9e12c3e0ecb8717ff4623ff5bbbcdb53c48adbd9c69636506ab929c5507d7ebafae5654aad65a263e48d +Qx = 538049d071158c62f0102fb664a47431afe320474a173463819d5f83f6737b43880ed378470d774d32ad59cd9d75e5bb06b118f1297af3f6fa910f40aaffe11e46cd56cbd29aa51 +Qy = 0a4a843af9841e2427357bdf26817656637bf4650e443ef303dd458ed092dca3cacf2857d10aa190c256467ff834bc804f8557f6c3bdde89927a5f2bd55bb9d9f1f08a044cbc208 +k = 1191110485f56335f0e65fe04b9ad8fac1c3573cb4690db3e9f62086312d394b0e354890c0f74e3df7c43e718ecf18caf6904e03bd6c0912f906de1d2bb4c49823bc6c0dbfe37f4 +R = 0dff371ac365cb7de248ddb2b2fdee624c527c6c1908dd287a294bb43a4be94c130bfa83710b0655f21695dd91703acca64fe2e7927eaf9c2b9b230de8002798224f9505379bf34 +S = 2f30f31c863bdd68fae16f97fba756e033eada18cb0a23d7d4b2c9ea3c832e61b52185fcd654d9eb281b92a9b102c3b17ebf02422a0e4a7a56a73974208371ef65434c38f4d7d1d + +[B-571,SHA-384] + +Msg = e67cecedf35058b80787589514a9c81c6b9f4bced4260411d2af75bc46b8b2c962dc9d260dc99ebbf8ee64950766efc0e394184bdc8e2891d66bd3300ecc880e9d6a3d0eb615322378afc3dba89938704e9a8d0c949d4bae9838805c00377e3fe5ec6a1a98ad7eaaba6b500973dac48b26b7fb2e1b9889f8c387de535d4b2363 +d = 30f2849a713aeac95fde5ce3af853e9d070ee60709eccf35a076567be2c43f0fa34420b0fc097ff577221275a3a56e759efc32183be2d76058a7d20e5dd59f00415114d73a15b8f +Qx = 6d4ed3cf180e0e307745faa49247f269c3fa0a69042b3b78ad645f43eaa50d479622e27429a6b6b1889944f85975fec8018d3321ed38f6c7d91f2efc98467a027ba4a02c7f231b4 +Qy = 5f2ebf6abf7d53fa32865a9b6ada9bee51c1fe26cad74dd6ef78f13872f340d64170031becb5073001fbca373be4e32ac3425d705ee942e6c4e639bf72379e34776680a387a0c6d +k = 0da9d8647d0950f558a3831b47858168b3379656e603f2bd44046ac7546892d1a7318c5a9873c6ff85683edd3881a0f1af5501d17939f0825ed37bfc9a2d95faf43d3be92b237ef +R = 0fc7eaeef74806606fe51882c6928a06bf552d18dcc4d326d44a540abb728146657048b20e5fe2868beb5f04f32d43e9ac23a7f22c6bf325bca24f5e3161c868911ee61baa8a3c6 +S = 33d63693268f3762635373fc901fd72e525965ac17e2cc009177f03bd3524107b30e4c6d80bbc4f87fb1f288ed56812994541fe063f1d91afa7213bed8be5693dc6c17ec9a0714f + +Msg = 2baa1ac3f07e34b67b6af087400f261e138b070c8475378063286c16fa73578303380236a4af2484ea01ba56c1c619f6ae4e5e6ac2594c8e5aae7e7f196f96fc5d0f507bebedd4d818e77b9120e5b4bc01c7ab6339e88b71d0886631cc7fd89659bf513faf149c61eb14d55060c8dfc7e6e4c2b4ec8edaaa6bc36eca50a6feef +d = 2ebb73d04e6e5361e20629e3ad119b33db5163ed91fd9a8aec4b774898784b6822a08992118a8fe6013094bad0be1e9bf01b27c069e4335bff7e0abd28a10443818f6b825e9cef1 +Qx = 01710eb0167e8c948d381e3a75aa1e036b70c414f69260aab434ee20b6724dd7393fc487b5b3822e5e8065b06d0785a4a7be7193352d5b9eee66755ba106ba6e40f98a08c730a0c +Qy = 6006f98fc25a641a7c6e67fedd37aaad77a9102be3e1e7d32dcb4c68029e623a42f4ca7d1ea725bfd475756b80e18904107c460fc03b9bd68aa46f9dfbd60618670c4d9a68a3287 +k = 1861e2a356a6fa8096418cde7fa17f1b893a7b63810f3fd807a82bf4c745aafdc4963eb7a0ad0488a776e915b64d2b684e46d244703eb63b77835167908f2d6b06a2ed7b53f0717 +R = 046688e12d26cd96bb05d3f418d8ec34f4426f594acd2bfd8e9abd79405e612d60737007440424bc4f546c54b7402d11880f68edd996f49277b729450f7dda5d05986b014b5244f +S = 341a80e74f3a69b966ef81ae95dbdd60ed5a0446416653c4df431ff7c4b4272665a523379d76725e9fbe196018f0e747100084c823b95d7c7b1785d3623e52e9adbe773b81b49d3 + +Msg = 0e640581f573068d8ebd2899a6aaeed0bf987ee11e22b05d25e88e9a1c3451f45ee3800d976f4603c18a041febef07a01086832a6f7ecd5d498d52e796a9d90758c87c36f4a5b704a39c456aaee2d5278183d5815d619c193da9fbc427d701bab0874bded848cb4bb066f56e119b637c78aeb6eaa387c41bec6cdd4bf7b2061a +d = 1bfab717d6f6e16d9bc6e89d2ffac7cbe0f808cc8ca2eb515af7ecce5f3b230303775710a21bd25c2cc4566bb53c78c78e3774a9f306c751cc6e149929e45eef60f56c1d2388c6d +Qx = 6935c3e8b58f7bacd045e745054c227687800ddd86d6e0c8b1e426f4df0e4b71feedefa9172c43becebbeee8ee382a75396fc5f29ef3d2cc55f8afa9232038609b5034513b222cf +Qy = 138463efe3b32259dd90b759062f848deda84f2bcc0d687c410f1ad2dd745517c96c3451432b1e490902208cabb68bb872ec493eabdf1f3b07595d23a54c53e512777abffb7fc65 +k = 00025bd48e2dbbf1ed8bd9c1514303dc503dd0799c7815870b902249cd1d7368380853d36f7fdefad973700ded1e0d66950181b0aeac73eb622c880571315f09504ed26e28e85a1 +R = 1b9d6ccb19b208022d3a579a66957429682517e84a71be42fd571fbbd0247609d0b5b33808189efb52d21e6421d3b08821d82900577791b1c54e239b0d908bfbcdc060cfedaefb2 +S = 3356320389ffde577496c5b46a0de6d53005f5ae3489c0d292c5f460a3b7adc5bd204bc50a3bcc8538e0f8319c79b9024b065223b7ed9b0f211c5c224d363f5bdfe04db97f99e19 + +Msg = 51a2a560ba226d629127ce1ea7e812219ceaddd23561256331458c9f11fe73990f21d0dcd974a3773040090cfdc8e0f01692d951a0cbb60f8448a016c67abf46a9c150466ac77e656ea827b0ea7d1e77ea32071ba8314fc8a2edf69008f498bd1c18061d7d00f3340a7e2cd73e9766862378d8702e804a1870b442beb2d0aa14 +d = 00cc53bf7f1cad5e3dede4b4f4b082831604c92dd2b147869cdf1107259305b1d50359647f9f3d7d4e1e608865c65dc7c9ea46bc324dcb8423b554dc369d621743cbfb592b70eb5 +Qx = 20187d7de90652caf1210703ef65cada3b88f978e14ce6055847be7127602ba7a5391cef0fc9b009134105da7b09b49beb7ba2f961b84e6d66bd818ea99ec106c6e8428b17394a6 +Qy = 197aef36e47b571ccc0b41f948392d6061060063137d8c3b999ae507b76132fea1563775be555616cb5816b9b19e42b34f9673aab833f4beb9d1a0848a4bbf2f6f44cd03982748c +k = 08acd0f8f9660d21d62f391112908be73a4342767328d3375a8806dffd2598b6d77fcb4793e69f2390389a78c2b11866cf0f03666a60ad088d2c77bbc49fff6efc5b7283d02bf36 +R = 1004bfb78dc0e4fc0f2624bec6893d717a476fc76bb5c1d94c1dbf157aab5d1dc80f98a3aeabaac94d9cf9e26e1dd172f5d8fcd5b2d48cb3b7f0a4863813357b5cf8eae84478e44 +S = 30b1c8857977181d12c53cc2efc53a427801cde2890cf2ea2c99c6958b6869d0ac78ee2c846c241362c885835af49c47d20c30f3cbfab27d9cfeaa6d858694bab059229e30bf845 + +Msg = 90eeecff0a2e37df318c441df220dfea013ef29774ee92a56b213e13a798858f31e52b6ccb7599e7314f12b48a89884b113c1ba0526a54f3e9a33c940944319e084bff320cf5f391c02c731c4c4f8b05afa273374a1705d6c85337782ba7d36b9c00767180cad6422c11c581672ff631fa4c49d41b02481568ec87ea97220400 +d = 2b009530cb9d586e35dd8951ccb686833afb7a37ec253e547e85b253ba999f0f186b6d4ba41091615fe57678e9801b4dc94fa683511da25637b2acc9fe60936be15af16234c4ee7 +Qx = 5913ab6a2287d946b5b6d1e6c3d64117e085da7cf6388e333cf58d22494f4b067c684dca770ddbcea5db73f048b296e9c17284a8912b3cb722d9eaa17b6b1209311fb8e8757cbf5 +Qy = 007124ac6c48ac56746563db247bcfe6b20215ccc5cfb1d43c923daa07d429c8f0513bd1ff1180ef0f7927fa23fda1af25d20b22c935c426f9ccb402c358b57b812516c43111779 +k = 27a80a19e9c320b57146845fcf97d6debcffbcae877c33c62aec62a3351ef40bd90ef4c2ca39f9e51086931d82eec4ee7870365cb14e9c54ae735069801ef12c571bf1c7c1cf6e6 +R = 1de22c8984c593a0948164e6cc8631489133972482f6a7fb1c3c13f97e4584604930d369224850a1d24f267f41bc6fca04ad79326aef61f0d429e0e1b9e9d9686ee10f2bc52b104 +S = 085c6b34687081e280a180cd0c4ffe95cebbb0ad6d3b20a7341e467812f88c23973701cbf3cd2bcd2811415d0bf0cd9df229a88754f4cb0c225a2d11f57369a29edfd7b04639055 + +Msg = d3740cad41e2e365d80ae81da97fdf06d8b6c278b505e34cb683fb55ddc5189da543540914c0accd405dbf0063f6222885fda4b316dad4a83fd03e8d7b7e936f87fc0a5b095defc8a4b22fa97f00b394e672d5efd3e0a230c7e44dfeebda88641143502a400ed62e2a51f9561e5d652a43d616f16699e875deb9610c77de8e1c +d = 2cc2d0d7189cc8fb3565a039aee7633ddc00ff427cafad32fd2010b10fe249c9724d91785e7080203626038109158e3a61a3970aa3e51688aa7f5184b22f63af63f80d3540ec023 +Qx = 5fe95a030efac2e5d9522680da58606e3e7544a317a3f24d726b69238367d30fa586864d8c143c3695126ce8dffbc7e7fb789f956dbf53aabbc38af988ce50f1fb30294ea3e2d48 +Qy = 193d1e745d82781ae5c3b3d2233e502959d6862fa7987c6416584504f65639ca765578378b75d3844df179cefdeccff3c4c43aeb8865063e176fd43a27c93e329f8d4f6fd5bad21 +k = 02df3920fe4d328315353ff11b0264045248b32f48e860dc59d931ad65f39e97e3a683c7b5c64b21c3fa50a9685fa11f49df9b14ddaae03eb02754b01e03f60fc6aef1e5d6d7d3c +R = 1b91c4217b1580cfab56812c16bb5aefc1534ee8d049aa2e1d52a5bfc11519ff89f0d36ea2bfdfce8b5d3cf1527dcf700c0208a70595e9ebe4feafd0eb597e05df54212fd6eca3e +S = 21ce52440267fb16e713eabb8bf2d502c81939799f9d09cf48a50dce5da999f3b457dcd73c212d5d070056b1f373b07ad06e90d96febb7f8cdb4c423ef946f0799c038a3ee68ff4 + +Msg = 5eb53b5f92121396c5ff30e0c92da48db4fbbdbf27297f9bc82614ab78f7fd863e34096c615a02e349d8bc7ae4b0700130704bedf32756b5ee6af10da1cd717d624fadc57a9aa6db4a6c5d6254c0e8f8c3c0d4d03c264eeeafd52cac2c1968d9d85b106167a49d0ccdbefb20bdc10a2555f8149203af52853169a02db94e5e2a +d = 3d8936c00c131e38c6566d2464c4e207c878070bbf681695a6cd98cab2c6e80fe98cda80c66a5cf584e90a071144dda59c07b8fc7bb42464dbee5b6f739b0f2ee5fdff7e5a4e7cf +Qx = 0fc3a8a320e816305772bd5116cec2795d58633a9f490be8a1a360f21d2aebed6038ca4a5081288b6bdb1066307c26897ce38c24f8ccc98a63e371ff6b54f6016917b430c267af7 +Qy = 69719c868d8fd25a38a7338811904e3330a7b2289a8384bf24f6dad5312160f0093bf556fa061ca5e52d6676a8f1a3e4656740c82d3cddf0ac4f903ea885d42610bf1b45d9e57a1 +k = 050da632cd7aa58340adeb20389a2cb9897b8ec944c47e7177da65d9386a9dec5d63be7bb2d0f5b4943932e1fd7d87d5d7a80bc50a63dfd101a6a28005c894c6a6fa4c652dc519c +R = 0e6152b9050127bf306662f6beee81d024492b91efe87a56e70596a4a72cd02dd2f10b970c9a69909f85bf4783dcd3c32505d7c148166ab43b503ab098b6d95ef09a7932359f60e +S = 1f7d68d53ba161b61eeb17139eeae1587a6bd148e288c1f73a6bfb3a0d1f6dd8f9cdc27fa9e8c7a681410500c097ad01f320303421f1239b4a9c4d5446562b5b3cb2fc45a6fe239 + +Msg = 5aced64f702a57ed7fabd045a40c967a485d2a70b0a5e82561d5141ef329469b2da5964a34df203a980111a77adca376c643b9030aa74516f054648c1534d912ea66582adf3c655dbd71ca55e47412315df5e2893e43b2e2dfe6e4dedf426f11846ebef34a99f5615460ce0475f7bc54b4a4fd99e83c982097c3136ac6188a5c +d = 3dc7de970bce28a943d7599f2a9010fc99435b93bc4ba884d42503ac2941aa63fd07db34bcbb1127d56d6a4e277d6ca32051ea3467e376f74f98c3999d2f276b282ef8a28cf0cbc +Qx = 2066a50b9f961a58620f473fcf7d5eb635da47f4ce362f428669ea578d50d1c1513c145adcc03ba98f3d67bb422141c73e2f94ef9559ccfdc0be20eb206d3d114a5db302bd0751f +Qy = 4437e655bd255e7f013d197210bed70c5c1a6cc1daccb96145c9c438c8a44b4074629830d8df9914166c9378b33040d71918cdd0f47fa64b7c69f43eee0f34414b8f64882f90ac3 +k = 3b2e20f4e258b7f0cf69a460fece9b4794a12a37c0f8e7aa6f4f51dbfaf508f6f1e0160ab4388891efb09f0ca1f73178f0e8598750c9debd3ff856cb3a2872762ef9e16487a9513 +R = 2f265aa99ff806ffeacbf9ef7be575ce5300d3cfd4225b1835774ee075d7e530c9fdcd681584223f84a497119b4eb1fe34cd31d654c2fa262d7549acc251cece9530b26cfa3ab35 +S = 2c05ce4b35544bd1f20a68eae7f3483e0a0628dbb53f0466166257f69a7a110d2838a76d204e7a955a8977508e65f2ef6d7deee13e4e2ec0f2b9a8b4bedc26b3502813b0334a1b0 + +Msg = 43c24aea343d4e088bea25be69a332c631275c36677093e057de69cc83a4c5e70ab270e5a8930f55846f1a22ec10e03007dcf0942c6761e89c65c6a4f032eed97dc3a2c7f7ed1e82552fe48828a132ba16c41f6bd82a49335428a24fa1679522000e6a1d12c646e0e4b4c584398577ea9493bb334fa3cee8bfdb6c2e66f46436 +d = 2de6ee12eefa7a4a736484b19b42a513dfc059a060976edc3b0aa4b50e98d72df6506fed0499ff8480986748e938289e54a5e86c0c29733a9bcf5985aa63d8a2b57933a04a8e8e0 +Qx = 073fa1b62d469f2991d54f1472b60da87ba51be0a9dea361d417b91a4a75373695e9f27b3c672322315d7b566b1f22b96c54adce3e958080fa8a02836955f6264dad3a87fd11f06 +Qy = 452c0a07ff65fff741c96851657a5afc7eeca239622e1260414ed736a04e487157c52da98a7845bcf6f311e0f2e59bb92248b6d47dcb93da6f7e0af644b7aec7603a01950293d8c +k = 1c87653066057636f9a98a7c69a84e103df480a92739abc4d5ba53891591e3aaaef6ef3ef5e89213abbf71af9c84d3b30898580e782f557a03694446492afb05ab801d7dd631c8c +R = 086d539546c61e82d74319f0180411172acaf08b5296dc6435d4ed7bd50cf23d3a071deb3be01f74408e64ad244f069cd41227ba127145df5a357489f944b61606ec75e8377db81 +S = 0a34d9975fbd601614d04aa41506b03fc15189ee8102c0431272d691a322f3e77bcfd19d8bddd19b307012b6c6349f5ecf88b5a69e83588b0e18096117f207304b38c16a9a8592b + +Msg = e89210565959d93b483659e62cf41f0a0147ea23890c2f1a694c377a826165e363860e4b084016cda878a43eb68465f81f397ecd50087a25215ce7c4ededa3552218071fa3acd7ae380655fc8fa884998209ffc8a2c26f1ca19dfcfee455dad35a4e72caecd8da47eb9ee21b889162f5d3032724abfd1a31e68612e18bfa9006 +d = 05468f0df2c9854f5f655743e79c750fd8812db28b096d97207bae7f5aafc6b6090c9c636ead9e0fde32a1ff8d539b53813733ca812b41b58ff85a941abe4f128d59fdf9847baa4 +Qx = 6591750fbc104f82c213fe88aa620e8a960fd6140598e2e6282e0d5c5ecffd09d22ed94166109561a7f4f694e171189056d8b300b54c8134485500effc7123aaa23862e89791242 +Qy = 05bf8ec10a9ac6a92c54e7fb2135e2aa4f84da571d33227bde0aa2e6c1532074882235f3103d9a51e80b7a9a19067f35047ddc52462db7c634c291e8fc5eb2154f6913bd0846b88 +k = 242308c430de514be1b9084a7e6c96894cd5615a7c71ea22316e539986e9702080ff6ceef2980144c55d9749830c20c9ea90b93dfcdd28fd862b6a15748dbb3d982e4a275129c75 +R = 361e1b7a0f981bcc65480b370c5e09b1c2e2a67cf41646f6a3d829f663c09115892237400317601fcee78a04269411d267dad3e8fc6f069529fbdf0bcf9b5f13c9c6de1681e8b0a +S = 2620c29f86cbf698cca5f79de364ae131345a802c0cccfaefdd7375dcc9ba6ccac91f70943eb606506e51e2ced50491eb8f48769810b6dc178d56702838f1c2f0930f2a9e4f1db6 + +Msg = 48629ec97f56273599cd9903f8a84ac2ba74275b40e1e42fa47649568babe05cf63c8417d828251acc2eec525b56dc9082b68d51b0c2bbaa7389fbee15d058cf482993b2bedc5a9101f1afdc79989a812478245d191550109fc17215679553c508c84e3d4cfdea377088d09eb214e6f92410facee4790beeecafe72b2e3ed192 +d = 3d3c6a7ab9450c94aa3b8a1ffb678e5b647af24cbfd66ee3944e6f264f406295b803767471fc67936fdfed1714b4b8761a07eec86543b7c4da6bd2fcb33fa8cda4077737f398e18 +Qx = 42d536f1b15a22f4ba80066798d8d1c2704988eeb9423319c1850a1ae6bba4097307b515640ed3112e93f1f6ae67c60a4b0d2b6634aa7038a60b52b2b447fd1651857b71711c975 +Qy = 79eb18cc7493a1c7f2f9b621969b9ce9ee37fc0701f6cf56f5d5dc6efb13a384517a387f253aae1e93bb0a919b0c22e4d6cbc79b449b268a068b7eb2853324b96715d75b8c26f27 +k = 23ce112d60a2f7c29d77d64acd9f587e0eb75ef8e739b8548e154681efc24243594eef5e33d845b1e4e89bac56f2e9586e042e0fff38bcf79c73fc9aa5fc908261df5cd2c6cb821 +R = 3a770df8a2bc35e122c1bd551c38400be47f2499ff57618ccd01e14a2e35e87a67b0e40f9a10eee7efcc3d37b474f2840fb8c24a9adf93734680ae6b25818369c8608a2f8f338f1 +S = 0728a4eae5f5638a51579e224a24ecd4c997001bb8681e23a7476fbf78b4fab84497000f20c1e67e8a4e4116498bcee49ff00026009af31c1037172188aacd264fde8db15c97167 + +Msg = aa3a9fe467b1ca638dd0622c9ea235a418b39b2e15ad81fee01b6892b240783d8db3c72e16c13df8016dac6addbfb85232158325bd7432fca3b8bf5db3abd0b4c5ccd0999609dc42199ca4680692a0805cdd68108bcb493a558ab507cec0a2782a9e976928985352edb2abc0c07078b59d2fd86fda7fc76cfe573181d934c46c +d = 01ce010ea8e6e1a0c26ab22eb90f0700dc73b232c429d36371e68e429792afb7223f10327708bcff779ea55fb5f22ad87aa054e84d10f5450f1bc9a89279062ea2173f55ab0f76c +Qx = 4b2b5acef5921e691f10ade81b91ba8e68e73b33a2494cf4ca6617707861f334eb07ca96dfd681dd63f78102f8d792d66102117b739d477e431d9a3efd79bfcc18cea156db58a0e +Qy = 7e421337d4cb7a98cf9c9c6fdf9fa242904d9906d8a6759ef64a82cbf923b2a57073ea0eabd14aa4295bec84d50a1722fecad3e5f064bd3171facdfff45b170e49f185a3c193f2a +k = 326b62065b7c779dc398ee03a8332cfb940b0f24a7d3de4a90323d9e390ad3fb1f0036abf6f525d8d88ab6641302d10db447b78780d366f32ce36ae571e323124b21984c48aea7d +R = 3d2b207b428829ed5100a92f7276e16978e374c734834b0d627cddf6aff5cab72dafefc6c038a91426e35ee0f2c1acc11c55a34a89874100b89588aba7b02e19490e66eb49ef6ed +S = 3259fef5c2a0779ae408b26e6c7d581fa973156cdb07c329dde0c12b6c498e7a94577719865b7fcc0db078ba72a27bf338ec6b8aa41c15963538c329c55dee67833faebe3b643ad + +Msg = 6c3937014361799f1461f652841b5137eb0dcaf01dd293298d002f27e9a770b9e1a30367e35c04603881f0c814cf8ecfbe1619cc49cd516b1d60d27de37ed52a5e1cc300e2face4669f308ebe6747255a3d386f16778e494a7cdd10b45171b2bfcdabd91b805bf24857708c1b75e368edb2874321324f83a19154d3a1578c767 +d = 1e7410d012aeef02b3723346d24ebafd684c99087ecccaea1cf3735d52c4c81dda41812c09f1e874dc964d858ca240a19963d5dc89451f5dd6764426ae41cb23f19cbfdca0fc562 +Qx = 400a3bb3ff07a339ff98f7c45fe032cf42c0e25de8dee2934ce42dfb0c9894f4fce27fef299b41beb8579270efc7b01c0663c3f72d7bdd9f6ff5186eca9c42d15faaef8784211a5 +Qy = 06fe998f7a0db06efed050d178865a2b7de6ca7c789cedff7f2158a5e07ac1d335ec0dbd213fc9465399028fad8b7f4d2cd16fb8ceae4d3d53abefd2b4037efd7f7245296bfdf9d +k = 2bb0fb9c428e42482d5dbdb35157ad0fa713fe732dac8604c0194e3f9738fac5cf3874bd863718712a3da45b7c4612c8685465ecaec0930d9fec32ab25818d2f25fad580009b698 +R = 1062386d3e77043298eb88be46bd4e6f33c83a7358926b30ca06a6b7139815f6e1630f73d352a2cb9bc0619d08a89d4bde1636c74b6580543ed743073eec2ae0037bea2b3c9228e +S = 1ceef759d804ff7de526559636d0bc7930c096c7b959f04f8fec5d7e96129fba14c8341b0ed84a64c6cce7cd5b058fab7f44dcf3e714544c9b6f9c1d46ce512870deb51856e9dec + +Msg = 12fea55ffda15db902aa6a4388b9807c89c193cbf75b5d2a4c95206fa43dedc45974c80079933451bdc5b3ea015ed3ca2c54156dc61afb1bc82adefed1491302a48b9d3d2f474ab45343c611677d360515b93fb36da7a1c1b2341c9cce185c881c0beef33d43967134a190c09034ae3261f3295b79aebd3fe123616f73cf2089 +d = 2139839ce38eb879d266065dde5e5ea227244323b330e3ad5a0bc690f3c210f794cf18f0d730693887548bfbc434f48ee10ed34cb41d52172b06e448df938170a5e17311cab8e88 +Qx = 2ecf46b90616b534ea25cc9993942fd7576a1c4f2f443d3b1f56d4490bf0af669c9eb9d110fe2a65609875e1a924bc4b9ed2ed2315047bbaeadaa1029b38a7a87dd8751d4128e80 +Qy = 2aec3a2f2557c7152a4907af68aa39485274f20927b2da70823440fbd09cbc308d46e30bd6b705f615b7074fe5421ca36b4aa53861983eceae9a69649495952e75b0f060b5d26e4 +k = 2e3412b61eb23d33ca2910dc25dd14c04d2c8b403d8077a72b9511d71ee9da6d7e1db093b92287f8fb00aea0576f6712c56d80cc4e3554e0faa9c7d911e3d17682de831bf649bd9 +R = 06a3075efec81a86175cd1dc2bfe82e83aff1db640184a6a3ed7a0dcdef51aa0be0005c54ac05f9b65af265af7f2ec3d1d7c137184b0d695d701ff1aed194faf2efa98ce6c5e502 +S = 237d7ff92480fa7d6d1f5a0564a2608afe5e95ce2c29dd88853d1ad9d4d2beb8d1f0423edb883faadd592394f52048bf2dc26d2dc19279477ed86621c7a5960ee3c3e2d345fda29 + +Msg = c8395546842ddb545d8ea3db4efe970453dcb06025ac3b7a25aa5ef62070f3021b9a1fea91ff7055b6c398073e7886a6f71afe53c82c47b71377dfe291972503bbeb25bd477bf0e7adc8a5d3f8b34ccd0080d61e121214e1b29802b711cdd8a6bb2275a2395c467ec2c1571952992e448d736d8bd70ee629c75b5e32b8323a00 +d = 274f70fe69e4dbb55c5d404e39f5196335047113087f8711f2f67f2be4964e4fbcb865680758df1c401cd677b0971654b7a6aeb7bee0d6d80ac0de14d4f46f356b2d5545c185aa6 +Qx = 2b2321e0a1df083919628dd8b4c318b9ded8a3e660ce5585b21e46843228b4d32da765a3776c181654aad0ce90724bf85b01b051d236342b48d41a1dbda1e9904d659c98a039a97 +Qy = 20227182fcf099d46d9882c0b0f26b0595a2a3166248898df2f3fd27c78e7c0b8b59ef0ed6745660c0dea1acb567f9d943928864dd1e94f8eb6b5b8473c0c91485643189cf679d2 +k = 2f234066c936625fca10dd080cbbb1228c4d2054cbdeafc8a0a248c0d22807fc92c661b4f69586ecf9469bc4c22895cc73ecf492fb2165a12b027194d409677e7185de24f6870a3 +R = 3a48daa8e379b3b2f377049a4d462530c9ea67019752f4af4b4192b02d6e028386dcb9ef95c8019e90e09dfc8dff5e6f6812df491906ced39befedf16caef614d8c174e7ea95fc1 +S = 33f18738cb26d88c8c048c58a210c7be70c71636dc62c022df1bd7747d8c67bfcf5ff2fb3990ed35becf6c77755ac62aed480df55efea578671bd8d50536a10e2c0192bd42d78e2 + +[B-571,SHA-512] + +Msg = 10d2e00ae57176c79cdfc746c0c887abe799ee445b151b008e3d9f81eb69be40298ddf37b5c45a9b6e5ff83785d8c140cf11e6a4c3879a2845796872363da24b10f1f8d9cc48f8af20681dceb60dd62095d6d3b1779a4a805de3d74e38983b24c0748618e2f92ef7cac257ff4bd1f41113f2891eb13c47930e69ddbe91f270fb +d = 03e1b03ffca4399d5b439fac8f87a5cb06930f00d304193d7daf83d5947d0c1e293f74aef8e56849f16147133c37a6b3d1b1883e5d61d6b871ea036c5291d9a74541f28878cb986 +Qx = 3b236fc135d849d50140fdaae1045e6ae35ef61091e98f5059b30eb16acdd0deb2bc0d3544bc3a666e0014e50030134fe5466a9e4d3911ed580e28851f3747c0010888e819d3d1f +Qy = 3a8b6627a587d289032bd76374d16771188d7ff281c39542c8977f6872fa932e5daa14e13792dea9ffe8e9f68d6b525ec99b81a5a60cfb0590cc6f297cfff8d7ba1a8bb81fe2e16 +k = 2e56a94cfbbcd293e242f0c2a2e9df289a9480e6ba52e0f00fa19bcf2a7769bd155e6b79ddbd6a8646b0e69c8baea27f8034a18796e8eb4fe6e0e2358c383521d9375d2b6b437f9 +R = 2eb1c5c1fc93cf3c8babed12c031cf1504e094174fd335104cbe4a2abd210b5a14b1c3a455579f1ed0517c31822340e4dd3c1f967e1b4b9d071a1072afc1a199f8c548cd449a634 +S = 22f97bb48641235826cf4e597fa8de849402d6bd6114ad2d7fbcf53a08247e5ee921f1bd5994dffee36eedff5592bb93b8bb148214da3b7baebffbd96b4f86c55b3f6bbac142442 + +Msg = b61a0849a28672cb536fcf61ea2eb389d02ff7a09aa391744cae6597bd56703c40c50ca2dee5f7ee796acfd47322f03d8dbe4d99dc8eec588b4e5467f123075b2d74b2a0b0bbfd3ac5487a905fad6d6ac1421c2e564c0cf15e1f0f10bc31c249b7b46edd2462a55f85560d99bde9d5b06b97817d1dbe0a67c701d6e6e7878272 +d = 2e09ffd8b434bb7f67d1d3ccf482164f1653c6e4ec64dec2517aa21b7a93b2b21ea1eebb54734882f29303e489f02e3b741a87287e2dcdf3858eb6d2ec668f8b5b26f442ce513a2 +Qx = 36f1be8738dd7dae4486b86a08fe90424f3673e76b10e739442e15f3bfafaf841842ac98e490521b7e7bb94c127529f6ec6a42cc6f06fc80606f1210fe020ff508148f93301c9d3 +Qy = 4d39666ebe99fe214336ad440d776c88eb916f2f4a3433548b87d2aebed840b424d15c8341b4a0a657bf6a234d4fe78631c8e07ac1f4dc7474cd6b4545d536b7b17c160db4562d9 +k = 378e7801566d7b77db7a474717ab2195b02957cc264a9449d4126a7cc574728ed5a4769abd5dde987ca66cfe3d45b5fc52ffd266acb8a8bb3fcb4b60f7febbf48aebe33bd3efbdd +R = 3d8105f87fe3166046c08e80a28acc98a80b8b7a729623053c2a9e80afd06756edfe09bdcf3035f6829ede041b745955d219dc5d30ddd8b37f6ba0f6d2857504cdc68a1ed812a10 +S = 34db9998dc53527114518a7ce3783d674ca8cced823fa05e2942e7a0a20b3cc583dcd930c43f9b93079c5ee18a1f5a66e7c3527c18610f9b47a4da7e245ef803e0662e4d2ad721c + +Msg = ba6be551bc60653192401ed8ff9e1acd9013d8811a7a1389528bf07438366f5772cd7aedad010c19c47622cec03a4d35b8003b39ed901b720629ab59de55a03c1ca50a62987f8da159e356245df58d5ae1936e65f3cd3acbe03ad1d0fcab4aaf2a7a947549ae776772201efbc6fab1aebfa1d99994d4f43dc28f39c0f279b992 +d = 2a69bc1df069c6e89722521a63675f318252be629e7558f3716917998e660ac960b0b750562846fe6c12ef492951e51e224754bab84a6eacd4147a5f26ae85ee4381bb14ec2a8c7 +Qx = 4685c0358ca31883cdfd7d609afa8b1e47540a97f473e0ebe98b0aaaab9418877aeead3a26fb01a4725fda20e7223a4fe7de0df6891c0812555b8b146918d3b80edd11615d95b77 +Qy = 67c92736447946c7577965b613e18950d813a4df049a6000895f9dac34d73ea46a83c6a4e7c83831af0d33026825664c44090953521175b9da2a7ac563a0fc5e13c85d34aaf49f2 +k = 1700d9ac00a987ff3a1d0be4290979317fe60f4f8ce1e0e72a026fc89e28c0070b76ada14f7a1a66ac2e8aef17eec18b568ada4fd59c05414e55356fc17d9e5079e6cabfc1f220d +R = 23a279662efec48f6cf8c7334862525b52ac37a9b03da6a063da2849f87801563242783434fca02fa23e32249666ddc6f596e07750ed21de303f4f10de56f1d37101cb0826bb8bf +S = 3b449467b150cba0d7c2b44280c5ac452f1217384ce121c979625d313394f6cef501b81980a02567ca55da2bc313dc0754b5256b08d8e3b63ea033253b205cc5dcb014574b8e9a0 + +Msg = 295720a79ac8201f40a66b06ae5d970afb15f36582897eed25cd92edcd00f70ac8e31c556eed4375ea044c2e8b227a8e02c0a3e996c9272d52ac7b3ad43b80f217295dddc84b177cf1e800ad08bf7fdd021fb2f49b54162092f8d628679c4ee335abbc90c027264c8b288c6e16eca3172eaa297ba50626b00fe0a0ad3a9dbeeb +d = 0d11ed1b78b22b3420df4ddc4acc7c2286d9569dd6dd88e0fa3ecae69bcced68bb81bbb4ca6e9b54e67856e7fdf39155aa27aecb9cc827ccb9cdcf9ac633561b27d8eebfc261aee +Qx = 1868a1335058a69e3ce24ea4e6e8dc25851777bb28d3a5da67b741ec9c46e26f2d2ae70a48c3e4feabb3b15b3c3ebd561f667ef3b95a587621de6073b9c8a904755566c5f7a3b42 +Qy = 6365a03c3f3066eca1af17bbbd08cd52e89f8095075b415cd4b82f3364cbff008fe3642fe71e8a8c634ad0e5d9979251e6cedd42cb97c2203f743210051f5ee1b70c861d2a72c00 +k = 075e49d2ff6f2aa8b44fad90446474ee0e72323a3c39e731b6c2b075cce0cb9d193bc3356f8fdae0e0143603a57028836ee6451cab101a6eb550042cb41b5c4233d3ad3e87034d1 +R = 207a8eed0b87efe65ec558a0ccbecb13b9215e176abd93c1a4803fcae713927ece70ec6c41c621357d78a13a950958871a52621f1de7ab74befd964a0e8f4820b84af3e0811bc67 +S = 2f02017714f54089652e02af36ac5165e44ac4a83747c805a9e003fde4bdb29561dcead2c76b02c195074396a2dcc1b93a256c721716f8eeda8dae443c3eea446118fec3cebc4dc + +Msg = a9cff41c6dfdc4a12f31dc375a5455950077ae323d0b7a3d9a8dde73b76e9d7b94ddf9c88ae8e6c262d704052ac47681fc35adfc56c904baaa6e146eb653984369d76a85596cb744941aa7b558c945ff2e81bd5ef7f00ecb4f43af23b4cea3bd4ba7b1899f1868a0c0ecfc62ccb1d588955597ffbbaf34cab2838efc2b866669 +d = 2c36ef754b5bd065e9eadde684750acc52795be80f54dd3d7a7d743d968a18f7e404bd71f8a76eb0395f396df5a7c2ff7e0ab6de35df34282fda6ee01fe5b9b68ecb4e378dbe32e +Qx = 4805e1a23b6eadcf91647b40903bc1fd3b9921861c942fc24d2c03d0544e7c01f004caeed04b5c4ebbce366a098a878c322cbebe7910bfb0f91b284ac1aef344152fc5831669b79 +Qy = 4f589ddb4da482ba1e9a59241b1dfbc7e9b9b69e8f69f8e90460ad58fdecc48a56842ea6aa0537abec0a605ebfb713e588685a98f62e05a7d52082bfd57e3d68fb7851b37ec5567 +k = 2f2002bdde0c0b0fd92e96abe76c0858e42fd7d94a181c711fc6753572539e18effa8155cde7b1e9ceab2394f9eba874b7ea257d7c308c8ac08500f4944af5f33057650608db8fe +R = 27f9109799bced42730faecdeea68259383a45033c6d5dc8d87adf994b46beb34177e013700b13f1253cf756a8866218e9c8adc180f3c242c56b3de28405b36940d53c2aab24f1a +S = 20a762ffb2f5a88b0e1356964fb558b555c424946109d16c7548f41a33cfe41da1f483276a27b188faf948a56670716ddf3b187570c9f514869c4492d7773d6ce453a075f9bc64f + +Msg = efa6c582d7fcf5e431aa89b3b00180c0e78efd7ccb0384d90b80e59a115a13e55001d951528c42860132531c9b8ab29dda7a657c53c2ce96fd85549f6f1810e121eb89961295335eaa0e40532d85814a4206e6fffdf9bff76599da9b2e71a22ed572910b0e3bae38ad72c7042579f106739a8628dea5a745168bd918736e488a +d = 19ffee50be5496507e3ef5c40ee88a49625e46d1dd1686a52b09ad4a8e3ee9ef364f953bfcd97c52104eecb6138067192997cd4ebadaccb73c7b2560879289a46353a756b73cc43 +Qx = 77dca410e722009ef11b37742c2c003ab3015d0ca0328a70d9d41aae04cb64f7746f1c348b08458eb3bb1788f9ffe7d0570a9b689a9b7aca43e05400bace7630d598f5b484d13c4 +Qy = 7291f74cddd9ff69470cf0d92afaaddcc4c8c274d4a7a64fd94292ddc8bf080606795376bb725ab4d32c72ef77dff34cfedd34aff2f463d635bfcd7e1fd002d84383dc5bf8d5d23 +k = 2ea37750fc3bbdeec100694068d55f92fdf35bff9ed49251c4b8bbfb2dec2dd4446999af8848e05c7b819aeb1864430ab4e8c1d684e1cf78947a71b04d5ab8ad61cc7e3e4e24205 +R = 12ff1852eaff37fee997531039adb1fb2f9b4f4199670c022e8534625fff1fa93390ee9bc7204ad2ba3efc2233260943f1d2381a3cc025b78c6d1f660a7bd6f42e5ed3c123055a9 +S = 1b4d8abb28ef1a9d77066921ed50eba64b8433cf00c66b8467269a4a914f568cdb86c766a7a6a52437c5d98cfc9a2130dfaba20f3c2001f31bba7071647d51fb9fbd5fc67ee120f + +Msg = 211acebfaf13bba33a9dd16722ec53baab92a140127d61372cbf1850f2fc894e942e25d780778235f880743953d04eca7a9205602e388172aec2abf35412b483490751f93b51239b6701cb0aab14e5179b0d7f55d8586358381dd83e3e436bf69a6820317d1701750cb1fea1293467ba589eec5f5779c2dbf2a9b8f28c4dc239 +d = 3129e96fd28c4198cc5242c1e3531a3979fae643d527044e98d7721aa56b5b4b45dfddfa17a4115e10a2b4f46d92f81cbdd7e86e588a4c6d8c2b3a83f54cebcee1d1dd33e85d81a +Qx = 73a92abcc991e3f89d82c47fa0fec48e3e7c4d97e2525f8dc2d24da39f616af4a5a804d2603703f6db7cc9324c5b56a21009373f6605f561c8503394e7746e51273b5722ffbc23d +Qy = 0684c842f03a53a60cce087f4fcdbf23b7a28c48b6b6544f583342a65d97dd87037c6fef176a1f00513713468273494a5be683b68c5e75bc08995fde763bb6f965da1acb7e894f1 +k = 0165e52640fcaf8cbdbfe73cb8058c53045e7670aafb2def28d2c9eceb5ed1634b5339cc47ba981eb6eb03ba714c7717e9ed5acc15c8f304702a0409bd4508015d4626cfc5484b1 +R = 27dcdf16b7156a7a05a752da28b5bd6b233e8a7c16eb7f9030f29c4352e6508f8424d1b5ba789dac4152ac4812ff7975cce69908371a81a4d7d9dd70a8dabebdc4e3af27234f0d0 +S = 32a654a31f09a9803e502a1440c2bcf122780f4f47aa37e15991d9a548583fdca48800804712816b212cd3c657e6bd4cb7443a0288592541473c5086e1277250612c21346538374 + +Msg = ee592e20e0a45c18089c2e41460e65a7d22ed9714379f095d43a308bdd383128aaa6fb24e9d35fd28fc95c5b792ad75c980d2cdf0f460ac60b12c5919d3cb28dac4d488196be6c2dfe462b1b0ce59f8501692255840f5215c0fd8b74b1996a267a5e3b22d2841cf0a0b6315ef4ec7180f1c8494f4c07d5869c01fa2711739efc +d = 3d723d2697cd07dd8444f992f2ab4a063db334034c25ea9be99fd7a1f495e3a644e5ea033a41264e0d24a911e55741d0cab80a0bd678eaec2bd1e60424d4491eb86d664900d907e +Qx = 0c7a229b5fb9fc774c1b6250f3bba2f0972d1aada7080641c014d012db0637a0656a43024ec0ea25ff70012646dc19eeb1033aebcc96a001ba876b2f5def6e198b8d4a53f7c7f4a +Qy = 09228a68eafaac214fdfa19923a0c19629de31ac0967c9d02c53dbf221f9affb735d3bad732f381f1ca414d70920231a78f742254d895a33ffab492f8e6094a542e77962a324ba4 +k = 3b3724a5933353bb9ff5f742f59385e780caa517a963590b7fc89882bed95cf90ca6365ce8b882f2d96e56bd866a5c437733b681308c570c51ec893ea95fede66c7aaf4561173f7 +R = 2a487c1fc29426e8e85f0a35c177cd168a444959b2f5cd4519b9edd52af3ea829cfe964ac2b59198af8e2d3859ebdf9885ebf57bdf5767da1611d3958de286f91ef397230d65599 +S = 10fc01efcb22b982f992efb71887bc79c3f32a9088bc2011c269924cee0f47c36452399d499f2933587081b872e9fd2191c20cd5cd94927839228ebcf22cf7acdf4608a2fa66310 + +Msg = fffca41927debbd53455821441d9115db99fb31bfc69752a382f57bc7abe021f148346ee29e17512c64b4918ab2391d12d6e5643bee6b5682885dc28177b292e23a37ff99b359b9cf7578432af56e0ad1028a6cce7428980654c145af8daf09addbb3be11228d3c742defca9d3b1667f48c63091fe3307ecf72667b02e008f24 +d = 1999ab45d66cd1d3a0fe6aa43bf5ef1e2a67637d53674f6fbbfb9b582be91fc42a12cdcad94b50b0fc7ac55030de24a0b99fbc4314fa743ef4b5198bcc5f54d8b669fbed78e2e91 +Qx = 0cbf3b0bb4a2e6c225aa922bea3b233da4661df5da7e0a1cd343a9b6655ee87fc60cd763dee21eaa2b81c4dd5af6f4fadc3ceea643b37a6b17a6501e1b9b689fb0c4716911c1f10 +Qy = 14b5a9ae025f09066fffa6797ddf95f27eeade06b8ca5be5738f770362d5213c46ecfca58e3c60cb2bae1f8ab1bf0577c80b4fdad02819fc174cafb33df64fc0ec79713f7b25209 +k = 253b533d3ad1c7095363e3fc80cb32471061e44dab3f9ae0ea6252f6ef169cee8badd3eccb77096ae9224f89baeee7e183058579680661655fb689419e36a61e8573de5ecb4cd09 +R = 3ba94f7682fb61de725a35caf1d4d799c4b05a1d1c44eb1c251dd8efab6b7d713c3fb917776902a1bb202f9226558f4c1e75964349717e6dff938d0befea07a9ca1bbd429dd6318 +S = 226f43be8e24062180c726b5cb721cc04ffd3acd82183925523ff9e8631aecbec2c224d5a291bb225f0da726d256aa822ee7cc2c7d69df3f2a5beb21132d91bea22e4c5db900cec + +Msg = a2f71619ea04f7057e6943c2cece8594b341ec3b96c3915d924f94ba13fd7aaeed41ffa0e842ade414784f1ef825fcf2dbcf7bd8263b802def45f94de596aec0c121fc06558c7bb06b9f27a9bf56c42090b5dc344e82b69c4f528d33be166764a593483f6fda0cf56e6000ff363ba220f5ea0ea2c3191615c7ae3bb4fa575324 +d = 2ce1cae0716205330d730e6bc6dbfb6b951dc83ee3b4a7dae75d057e32e8a46e22be75b5f09135452b29c34dfe81a9be2e8dcd243fbd946a0ed14a832a7802e20cfe1abfd3d6e4b +Qx = 75971399fa621ce535144ec1d57f544d798a0a59207166c3d657e5a80ac00e8f5b643448e3546064d68ae624aaabf36face3016561a248256ff9131950ab8b04710551e12222d0c +Qy = 224a50f321647f47de3db4fbe1bf1e3a3dce8a834312779f66037315e3326721e3fd63d4d6ef92b7ba1fa9aeb70f92e2a6701458ac8da49ac386491f2306adcd8dd781fe75e99e1 +k = 0ad95aa69cf9f40e13f8a72ed6d93388168abc8001670ee4d95fb4b726b1f958205ab2f458df8bb9ccf2405680d0e6951abbb922cc11d47cfded93c0efdb70caf0c54e7ae96d7e5 +R = 09ce019161bf29eeaf323933045f59d2efc372904ba50c4a6602b8305234a851d95f06a5b56193ad5d28488102ec25e3f421a5f5c4626b435b423d612e6ab60e0a4fe5d4952e2c5 +S = 04f7b7ac787b361c2bdfa767da9c22152e402184a7ac133f651fdcd928239215dc917401122a6d41e78299b4235e085399e594465b7f8dbfaae9bf302d83470b4295ea06bb9bd1e + +Msg = b60415a831eca2cf60c79a334ef2f327a76d290846ee588d5d33d0a826bb0c7ec3e11dbb384a7f89c8d180425dfae7463e0ea6497d2eec1dde112f1c1efccb532a2e2b66a28e2d36d4252a4c3b12850d465fe21bddc441b92e6a7b0f67744f7f6e7812a0603211a26518b311a5b190ed890ad852bed4f6ed13377cab3eebedf4 +d = 2c9d0fcfcee7e75c3245ba955ae04188b1033c55ec9c821d8de7685276bda3e9a93c3ae1b003e5ea722913e7b169d67b1aa2dc8cd42adbd9368672a3f81a6817bf3e5529dcb0c8b +Qx = 19cba4c8ddadb596d7303331f2a22461849ebfbc78ea69277f72dcfe23d08397025ff6691c61ed9958d68a9c5dd8a32048a89a2553afb9077ec43358763756b1473ab2cd8f25b53 +Qy = 319eeaa78444b7cc5d8cff4e9199ddd2c6dc7bd935a1be1d8b1c657dd5ac49bc92b0cd91304ef44ddb7ecac05518301bfa0e533402043533f99549621e31dcc282a52186478df2b +k = 385e12170ed0b23c9c65ff7edd413145fd343dd841e85c498fae5f36e57764168899902817d4dc39127010faa1da68000a511ac69f80708be5afe1631432f3bab7aaec2bdeb11b4 +R = 231ef400c6a3a0c7b26ba1b92341b72e138ca62d04ea2172854631c40c48081a18a57e9f055748245d3e83d10d21af39935b0e50c9c86956ac46c1ea03ac4ae023d84b24f830973 +S = 24d37d67afafb0676cd7b5da2960cabfc804b0b3244b5e6739f8fe43d0841693d28c61b8e76181f8aa24940d76fc5ea8ef3a95f72f67303e1ed85ad6e83cd2c44fd0e0f3f2f44f4 + +Msg = 5d15a08226cc74cf495be681b795d0bde26b19f29aca1a8c6ef77d50271ebdcb4e5fa2df23961fe11620b1c6580183f6ebdceb2c09516c8127be576496fb71449bbbf0a9d3d1c48a25024619b97c3e0d8b165897db96ae9758d13ac28441d7cbfb75b23cb423e0002046358bb6d64779974a5995dfe54b398f95f7d64fc52d96 +d = 10c057bbaa44ef0f565edc288bfe66d4f6acd8686899359bca418ba89fb690429489a37bd3c6c9f3a8714b2ca225868c6a45fee360e378a676f7ea39321790f32a4b005b81dce43 +Qx = 43b1e7d7b2aee3563813a6692f0b4b61ba82b801697c3e23724a2fbab2af80a2c56be55af41def0a90cbfce7a45ec61629906055a8b2a5013740e96859e580c444ae9f0ddf73afe +Qy = 6742f13244f1bf156d321eab2c3095ca548c3182c405187c3de2fbcb01d0e16e1fef246012c87d4d32378629a75b694572ec8583ae0cc813ac64f10bb05a9e52e4805590482f289 +k = 2b8076102a6448bd4c4e192e93cdb96ea9a6c7f6753818267ee9e67644df1a4a6c9ff64bbe9f64904648cc640fb7f0cce69f9e02878ee950b91ad559a9ec0ae15b676d933f1620f +R = 1ad97f4997037adfe306f3859d550f9fd89bce8b566e657d5742feb17466b6b8d507d5810a8cbba44d671b043ddb557df084bf5d1de74ef8bbd6a93690459fc16a17b80dd6c0f28 +S = 3262ef6e4175e7afe095d18157f67b3d12564d54954e9964e991c31bcfe1dee7e86b35491ce818400cc0f83b819f478f2f2c2d21c6c7a6be43938841559e09bce70b0d61fe51245 + +Msg = 9eca4bd88200baf61b901fca53dc1f1e7e3f83b94d58a6cc6a2adbc9b1a35fe3f8ec61787c76ed9a0d696167cd4fe46e1a0883fda564666131753c576a720125e0b712db1da0278067cb899bdb14eec08737e864544663abb1d62f34a2114be07e8e3cf56e2d17099299ce6b6d83b1a34e6153d7c6a32a72c7b1bf4583fcbcf7 +d = 2c182df7976ea93d996f3ba5d2221f3cb755cc7847bc3fe9e022fa4285046f5bfb426bafa3580beea206de36f87593ae561b4b74a03fcd61fbd0e8d6fd5668f2148819a88a650aa +Qx = 6004b26a184ed710a5fb67e9d042f7fb9c8f5584b1f70a91b0b3be41c3fd2cd1a537e962fdac8756df33f80fce2bb1bc7241d325bfc36dbaef7cf625918d589b6352fa744718910 +Qy = 36a29b04a494abfe809d956c3cd6f84ea51a7fa28cb39a52f16137a13f72f0726a84f6ae53ae24f5b468733f4cbfa0ce5bbbc1cc7b348fb996d33a45ff656a6a7557619f598a6b7 +k = 2ab349232bcb4f4816b26bd0049e130fffc90ca0b9308edd50fb9055358a87fe798d00140b0ae01ed8b1f6bb9bfb726b253c3d4949ce9eecaa6c7fa84d1ef812669fa929f26be0f +R = 0bbf2f9765b12742224ba7d064358c0305fb63e9b54a831e302a4546aa02cace798d82a188d2f536d78544c1571f481289d6ec69d117648026490e781f1eb9fca59bee05234ba7e +S = 27e07ee0a1a99c90753cdc8c0291da25a82c116e62ec58b93f91086ac1cc039b35ce7d8b53cdaa92a5ade65a7684b6e7ab79873dce33dcd467c39d0c764ee390b7fb25ca18912c3 + +Msg = 707450bd84141f3b61beb12ffa5ae89d812dd11badcdf6a88a2d50fc70e23f6d822ff4477047abc58cdfa28f97ad7f4911ae0773c04ebed1f51bb2308cf6e5712c4aaed461edd6987fdd1796aab70198276b601241f6a14225dce575830ff60f935fd9f567d1d210652e4710922fa793da78c8fdc30c273cb08365c9fc887f50 +d = 2d3a65bbe133cc98cf0eb56ee1362195968b4eab960a1d55d8b762f1361fc21348d6f275d4bea1de7158fb97c995e20b92a9c887a3e332d154667ad167acc632eb88a0ead6113a2 +Qx = 34355b54d00c3df7c2762ee2982cb777491aaf78e550c4d2ff5d5a893416eb3517671dbe522b8c553fd71edfe0306cd7628324f4f748091fc5d84ad8af33b896985674649a6f4e5 +Qy = 7e322a04eb600a3faf3e045959f1e9f798e1c965ced40fd4c0383c0d4e79a96bf693a91d7662780990d0c9dfca77a9bc0e13551d2ab35af8a153fa34ea903961fe66996ca053b64 +k = 0a59ac1240bcefc52456486ce23b780cc92c8b89314b8442a6898c373bd0adc3725e3ebac580546d1ec82ebfb2e04c608441d962d759ab5f5af1596c6623487e1347537a3c35bf4 +R = 0c47ef55d93ac36cee537160bbe39c3d4504184188533edfe589a5ab6e5a3e06ef413aa48710d304f0b2bc380fd69a34aa0b8e2e9466fd8a131cb056dffe4b809a59fd83e594483 +S = 2d8de1e8e2a52dd1be08435cda69e673b328573edeb1767849536e6f2d5fc8f18f7bfde936d8c32ecbfa97bf976133d65641320ca1c41e81c388fd6088884bbd89274b1976470fc + +Msg = d5ce9d59391cdc47ef942dd2a818d024ae3917deea8a5a4214e4db6a0c5e6b0936f3e632fdb68a3f0006e05c44b7232013e1da5f877cd197f44fd6f60c1fd2378995e9a47534948c5a09e33750f07a7165072ab38095373b07a50bc1391eb6b650ee13acd63d0352e7d9c31695ea1ec6323f9b5f57b426ace56aa7fdbf419be0 +d = 2a920e8dc928acdd56e3655b2340d4371c793e66f67405fb7a90f31e9c4ef466cc44331d1d2fe3ff7391d2576dc6640772166ef8c154a5ff1808f5dab2f03061070ec8b3f786c36 +Qx = 5edc0fb974314e21ad40d73524d5620b7279084e3ecb9e58b06340ae53d2383efd206b8b1eb3dd60c38f593efc05e2ba5fb8989472bac7db60fcada2d18d4108ab36e8c20cc710d +Qy = 0444cf65175f6bbaf647739cfd8407e7036fc6cc6208ccb9d776eb13e13b377136c683e108775d85b6bc5638926432a17344de965d45e042a0a8e0b63c7fc3a36fc15cf718f3baf +k = 35a0215892d0c52ece29559ebfa061011da8d597af6b3d1ee988ea4819be194c79a42681476140738b1b5dc191485bd20c96c282ab38ddbc3987343155366b6a5d1ce7053efcd83 +R = 1a69a9a51f6b0dc196b2a8db2e8bf61764d4c65b038f43b5ed6b5dc2673971c32928606f92b7caafb4dab3cd61ee724bba71a0d5c788cde4b96ef6b453f2a69126dafc20dbc7c82 +S = 13b5463636b8462cd9f479de8d114e29e7011489bcb9735ffe9ca0707a07df3c0aba05043eab387bfedd9fe982fbf04968f2be200e9e052cb4b02223b8579913d713acf94e7dc80 + + From 2d4185f4f1def7c32d1a556521e26ec656234220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20=C3=96sterlund?= <eosterlund@openjdk.org> Date: Thu, 20 Jun 2024 05:23:08 +0000 Subject: [PATCH 116/471] 8332717: ZGC: Division by zero in heuristics Reviewed-by: aboldtch, shade --- src/hotspot/share/gc/z/zDirector.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hotspot/share/gc/z/zDirector.cpp b/src/hotspot/share/gc/z/zDirector.cpp index 47e24063ead75..162e05f2c0763 100644 --- a/src/hotspot/share/gc/z/zDirector.cpp +++ b/src/hotspot/share/gc/z/zDirector.cpp @@ -524,6 +524,10 @@ static bool rule_major_allocation_rate(const ZDirectorStats& stats) { } static double calculate_young_to_old_worker_ratio(const ZDirectorStats& stats) { + if (!stats._old_stats._cycle._is_time_trustable) { + return 1.0; + } + const double young_gc_time = gc_time(stats._young_stats); const double old_gc_time = gc_time(stats._old_stats); const size_t reclaimed_per_young_gc = stats._young_stats._stat_heap._reclaimed_avg; From ff30240926224b2f98e173bcd606c157af788919 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Thu, 20 Jun 2024 06:15:19 +0000 Subject: [PATCH 117/471] 8334239: Introduce macro for ubsan method/function exclusions Reviewed-by: stefank, stuefe, kbarrett --- src/hotspot/share/cds/archiveHeapLoader.cpp | 5 +-- src/hotspot/share/prims/unsafe.cpp | 5 +-- src/hotspot/share/sanitizers/ub.hpp | 43 +++++++++++++++++++++ src/hotspot/share/utilities/vmError.cpp | 5 +-- 4 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 src/hotspot/share/sanitizers/ub.hpp diff --git a/src/hotspot/share/cds/archiveHeapLoader.cpp b/src/hotspot/share/cds/archiveHeapLoader.cpp index 57a96a8c4e03e..feaf245d22c6b 100644 --- a/src/hotspot/share/cds/archiveHeapLoader.cpp +++ b/src/hotspot/share/cds/archiveHeapLoader.cpp @@ -34,6 +34,7 @@ #include "memory/iterator.inline.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.hpp" +#include "sanitizers/ub.hpp" #include "utilities/bitMap.inline.hpp" #include "utilities/copy.hpp" @@ -61,9 +62,7 @@ ptrdiff_t ArchiveHeapLoader::_mapped_heap_delta = 0; // Every mapped region is offset by _mapped_heap_delta from its requested address. // See FileMapInfo::heap_region_requested_address(). -#if defined(__clang__) || defined(__GNUC__) -__attribute__((no_sanitize("undefined"))) -#endif +ATTRIBUTE_NO_UBSAN void ArchiveHeapLoader::init_mapped_heap_info(address mapped_heap_bottom, ptrdiff_t delta, int dumptime_oop_shift) { assert(!_mapped_heap_relocation_initialized, "only once"); if (!UseCompressedOops) { diff --git a/src/hotspot/share/prims/unsafe.cpp b/src/hotspot/share/prims/unsafe.cpp index d290627c1972d..942d9100c29ea 100644 --- a/src/hotspot/share/prims/unsafe.cpp +++ b/src/hotspot/share/prims/unsafe.cpp @@ -55,6 +55,7 @@ #include "runtime/threadSMR.hpp" #include "runtime/vmOperations.hpp" #include "runtime/vm_version.hpp" +#include "sanitizers/ub.hpp" #include "services/threadService.hpp" #include "utilities/align.hpp" #include "utilities/copy.hpp" @@ -244,9 +245,7 @@ class MemoryAccess : StackObj { // we use this method at some places for writing to 0 e.g. to cause a crash; // ubsan does not know that this is the desired behavior -#if defined(__clang__) || defined(__GNUC__) -__attribute__((no_sanitize("undefined"))) -#endif + ATTRIBUTE_NO_UBSAN void put(T x) { GuardUnsafeAccess guard(_thread); *addr() = normalize_for_write(x); diff --git a/src/hotspot/share/sanitizers/ub.hpp b/src/hotspot/share/sanitizers/ub.hpp new file mode 100644 index 0000000000000..23e8ef4576c9f --- /dev/null +++ b/src/hotspot/share/sanitizers/ub.hpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024 SAP SE. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_SANITIZERS_UB_HPP +#define SHARE_SANITIZERS_UB_HPP + +// ATTRIBUTE_NO_UBSAN +// +// Function attribute which informs the compiler to disable UBSan checks in the +// following function or method. +// Useful if the function or method is known to do something special or even 'dangerous', for +// example causing desired signals/crashes. +#if defined(__clang__) || defined(__GNUC__) +#define ATTRIBUTE_NO_UBSAN __attribute__((no_sanitize("undefined"))) +#endif + +#ifndef ATTRIBUTE_NO_UBSAN +#define ATTRIBUTE_NO_UBSAN +#endif + +#endif // SHARE_SANITIZERS_UB_HPP diff --git a/src/hotspot/share/utilities/vmError.cpp b/src/hotspot/share/utilities/vmError.cpp index 656fe9403fec7..0b3ccf9c747aa 100644 --- a/src/hotspot/share/utilities/vmError.cpp +++ b/src/hotspot/share/utilities/vmError.cpp @@ -60,6 +60,7 @@ #include "runtime/vmOperations.hpp" #include "runtime/vmThread.hpp" #include "runtime/vm_version.hpp" +#include "sanitizers/ub.hpp" #include "utilities/debug.hpp" #include "utilities/decoder.hpp" #include "utilities/defaultStream.hpp" @@ -2086,9 +2087,7 @@ typedef void (*voidfun_t)(); // compared to one generated with raise (asynchronous vs synchronous). See JDK-8065895. volatile int sigfpe_int = 0; -#if defined(__clang__) || defined(__GNUC__) -__attribute__((no_sanitize("undefined"))) -#endif +ATTRIBUTE_NO_UBSAN static void ALWAYSINLINE crash_with_sigfpe() { // generate a native synchronous SIGFPE where possible; From d7dad50af5df356089101ca440fca5232fadb81e Mon Sep 17 00:00:00 2001 From: Roland Westrelin <roland@openjdk.org> Date: Thu, 20 Jun 2024 07:14:01 +0000 Subject: [PATCH 118/471] 8334544: C2: wrong control assigned in PhaseIdealLoop::clone_assertion_predicate_for_unswitched_loops() Reviewed-by: chagedorn, thartmann --- src/hotspot/share/opto/loopPredicate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/opto/loopPredicate.cpp b/src/hotspot/share/opto/loopPredicate.cpp index e23da54f765e3..bccc01a86ddb0 100644 --- a/src/hotspot/share/opto/loopPredicate.cpp +++ b/src/hotspot/share/opto/loopPredicate.cpp @@ -373,7 +373,7 @@ IfProjNode* PhaseIdealLoop::clone_assertion_predicate_for_unswitched_loops(IfNod ParsePredicateSuccessProj* parse_predicate_proj) { TemplateAssertionPredicateExpression template_assertion_predicate_expression( template_assertion_predicate->in(1)->as_Opaque4()); - Opaque4Node* cloned_opaque4_node = template_assertion_predicate_expression.clone(parse_predicate_proj, this); + Opaque4Node* cloned_opaque4_node = template_assertion_predicate_expression.clone(parse_predicate_proj->in(0)->in(0), this); IfProjNode* if_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, template_assertion_predicate->Opcode(), false); _igvn.replace_input_of(if_proj->in(0), 1, cloned_opaque4_node); _igvn.replace_input_of(parse_predicate_proj->in(0), 0, if_proj); From cabd1046d08865f122663d18708d40e5c885c1c3 Mon Sep 17 00:00:00 2001 From: Sonia Zaldana Calles <szaldana@openjdk.org> Date: Thu, 20 Jun 2024 08:28:06 +0000 Subject: [PATCH 119/471] 8334164: The fix for JDK-8322811 should use _filename.is_set() rather than strcmp() Reviewed-by: dholmes, cjplummer --- src/hotspot/share/services/diagnosticCommand.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/services/diagnosticCommand.cpp b/src/hotspot/share/services/diagnosticCommand.cpp index 6a7e4d1bd20ce..faabe74a2ff0b 100644 --- a/src/hotspot/share/services/diagnosticCommand.cpp +++ b/src/hotspot/share/services/diagnosticCommand.cpp @@ -1203,11 +1203,11 @@ SystemDumpMapDCmd::SystemDumpMapDCmd(outputStream* output, bool heap) : void SystemDumpMapDCmd::execute(DCmdSource source, TRAPS) { stringStream defaultname; const char* name = nullptr; - if (::strcmp(default_filename, _filename.value()) == 0) { + if (_filename.is_set()) { + name = _filename.value(); + } else { defaultname.print("vm_memory_map_%d.txt", os::current_process_id()); name = defaultname.base(); - } else { - name = _filename.value(); } fileStream fs(name); if (fs.is_open()) { From c6f3bf4bd61405c2ed374b15ef82cc987f52cd52 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Thu, 20 Jun 2024 08:30:52 +0000 Subject: [PATCH 120/471] 8334026: Provide a diagnostic PrintMemoryMapAtExit switch on Linux Reviewed-by: dholmes, mbaesken --- src/hotspot/os/linux/globals_linux.hpp | 4 +- src/hotspot/share/nmt/memMapPrinter.cpp | 11 ++-- src/hotspot/share/runtime/java.cpp | 4 ++ .../runtime/NMT/PrintMemoryMapAtExitTest.java | 51 +++++++++++++++++++ 4 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/NMT/PrintMemoryMapAtExitTest.java diff --git a/src/hotspot/os/linux/globals_linux.hpp b/src/hotspot/os/linux/globals_linux.hpp index 8539eab9e9703..1cb0b553c5273 100644 --- a/src/hotspot/os/linux/globals_linux.hpp +++ b/src/hotspot/os/linux/globals_linux.hpp @@ -94,7 +94,9 @@ product(bool, UseMadvPopulateWrite, true, DIAGNOSTIC, \ "Use MADV_POPULATE_WRITE in os::pd_pretouch_memory.") \ \ - + product(bool, PrintMemoryMapAtExit, false, DIAGNOSTIC, \ + "Print an annotated memory map at exit") \ + \ // end of RUNTIME_OS_FLAGS // diff --git a/src/hotspot/share/nmt/memMapPrinter.cpp b/src/hotspot/share/nmt/memMapPrinter.cpp index ec5003c562e55..5480904d57c40 100644 --- a/src/hotspot/share/nmt/memMapPrinter.cpp +++ b/src/hotspot/share/nmt/memMapPrinter.cpp @@ -30,16 +30,17 @@ #include "logging/logAsyncWriter.hpp" #include "gc/shared/collectedHeap.hpp" #include "memory/universe.hpp" +#include "memory/resourceArea.hpp" #include "nmt/memflags.hpp" +#include "nmt/memFlagBitmap.hpp" +#include "nmt/memMapPrinter.hpp" +#include "nmt/memTracker.hpp" +#include "nmt/virtualMemoryTracker.hpp" #include "runtime/nonJavaThread.hpp" #include "runtime/osThread.hpp" #include "runtime/thread.hpp" #include "runtime/threadSMR.hpp" #include "runtime/vmThread.hpp" -#include "nmt/memFlagBitmap.hpp" -#include "nmt/memMapPrinter.hpp" -#include "nmt/memTracker.hpp" -#include "nmt/virtualMemoryTracker.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/growableArray.hpp" #include "utilities/ostream.hpp" @@ -203,6 +204,8 @@ static void print_thread_details(uintx thread_id, const char* name, outputStream // Given a region [from, to), if it intersects a known thread stack, print detail infos about that thread. static void print_thread_details_for_supposed_stack_address(const void* from, const void* to, outputStream* st) { + ResourceMark rm; + #define HANDLE_THREAD(T) \ if (T != nullptr && vma_touches_thread_stack(from, to, T)) { \ print_thread_details((uintx)(T->osthread()->thread_id()), T->name(), st); \ diff --git a/src/hotspot/share/runtime/java.cpp b/src/hotspot/share/runtime/java.cpp index d3e76364a03e0..674716a859852 100644 --- a/src/hotspot/share/runtime/java.cpp +++ b/src/hotspot/share/runtime/java.cpp @@ -48,6 +48,7 @@ #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.hpp" +#include "nmt/memMapPrinter.hpp" #include "nmt/memTracker.hpp" #include "oops/constantPool.hpp" #include "oops/generateOopMap.hpp" @@ -485,6 +486,9 @@ void before_exit(JavaThread* thread, bool halt) { if (DumpPerfMapAtExit) { CodeCache::write_perf_map(); } + if (PrintMemoryMapAtExit) { + MemMapPrinter::print_all_mappings(tty, false); + } #endif if (JvmtiExport::should_post_thread_life()) { diff --git a/test/hotspot/jtreg/runtime/NMT/PrintMemoryMapAtExitTest.java b/test/hotspot/jtreg/runtime/NMT/PrintMemoryMapAtExitTest.java new file mode 100644 index 0000000000000..2c51c079c737c --- /dev/null +++ b/test/hotspot/jtreg/runtime/NMT/PrintMemoryMapAtExitTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary Verify PrintMemoryMapAtExit on normal JVM exit for summary tracking level + * @requires os.family == "linux" + * @modules java.base/jdk.internal.misc + * @library /test/lib + * @run driver PrintMemoryMapAtExitTest + */ + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class PrintMemoryMapAtExitTest { + + public static void main(String args[]) throws Exception { + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + "-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintMemoryMapAtExit", + "-XX:NativeMemoryTracking=summary", "-version"); + + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + output.shouldContain("Memory mappings"); + output.shouldContain("JAVAHEAP"); + output.shouldHaveExitValue(0); + } +} From 642084629a9a793a055cba8a950fdb61b7450093 Mon Sep 17 00:00:00 2001 From: Hamlin Li <mli@openjdk.org> Date: Thu, 20 Jun 2024 10:10:54 +0000 Subject: [PATCH 121/471] 8334396: RISC-V: verify perf of ReverseBytesI/L Reviewed-by: fyang, rehn --- src/hotspot/cpu/riscv/riscv.ad | 31 +++---------------------------- src/hotspot/cpu/riscv/riscv_b.ad | 4 ++-- 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 5405314875898..2368a280bf2df 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1914,6 +1914,8 @@ bool Matcher::match_rule_supported(int opcode) { case Op_PopCountL: return UsePopCountInstruction; + case Op_ReverseBytesI: + case Op_ReverseBytesL: case Op_RotateRight: case Op_RotateLeft: case Op_CountLeadingZerosI: @@ -1921,6 +1923,7 @@ bool Matcher::match_rule_supported(int opcode) { case Op_CountTrailingZerosI: case Op_CountTrailingZerosL: return UseZbb; + case Op_FmaF: case Op_FmaD: case Op_FmaVF: @@ -7856,34 +7859,6 @@ instruct xorL_reg_imm(iRegLNoSp dst, iRegL src1, immLAdd src2) %{ // ============================================================================ // BSWAP Instructions -instruct bytes_reverse_int(iRegINoSp dst, iRegIorL2I src, rFlagsReg cr) %{ - match(Set dst (ReverseBytesI src)); - effect(KILL cr); - - ins_cost(ALU_COST * 13); - format %{ "revb_w_w $dst, $src\t#@bytes_reverse_int" %} - - ins_encode %{ - __ revb_w_w(as_Register($dst$$reg), as_Register($src$$reg)); - %} - - ins_pipe(pipe_class_default); -%} - -instruct bytes_reverse_long(iRegLNoSp dst, iRegL src, rFlagsReg cr) %{ - match(Set dst (ReverseBytesL src)); - effect(KILL cr); - - ins_cost(ALU_COST * 29); - format %{ "revb $dst, $src\t#@bytes_reverse_long" %} - - ins_encode %{ - __ revb(as_Register($dst$$reg), as_Register($src$$reg)); - %} - - ins_pipe(pipe_class_default); -%} - instruct bytes_reverse_unsigned_short(iRegINoSp dst, iRegIorL2I src) %{ match(Set dst (ReverseBytesUS src)); diff --git a/src/hotspot/cpu/riscv/riscv_b.ad b/src/hotspot/cpu/riscv/riscv_b.ad index b8960e5e9fd0c..9e78159d24fce 100644 --- a/src/hotspot/cpu/riscv/riscv_b.ad +++ b/src/hotspot/cpu/riscv/riscv_b.ad @@ -178,13 +178,13 @@ instruct convI2UL_reg_reg_b(iRegLNoSp dst, iRegIorL2I src, immL_32bits mask) %{ // BSWAP instructions instruct bytes_reverse_int_b(iRegINoSp dst, iRegIorL2I src) %{ - predicate(UseZbb); match(Set dst (ReverseBytesI src)); ins_cost(ALU_COST * 2); format %{ "revb_w_w $dst, $src\t#@bytes_reverse_int_b" %} ins_encode %{ + assert(UseZbb, "must be"); __ revb_w_w(as_Register($dst$$reg), as_Register($src$$reg)); %} @@ -192,13 +192,13 @@ instruct bytes_reverse_int_b(iRegINoSp dst, iRegIorL2I src) %{ %} instruct bytes_reverse_long_b(iRegLNoSp dst, iRegL src) %{ - predicate(UseZbb); match(Set dst (ReverseBytesL src)); ins_cost(ALU_COST); format %{ "rev8 $dst, $src\t#@bytes_reverse_long_b" %} ins_encode %{ + assert(UseZbb, "must be"); __ rev8(as_Register($dst$$reg), as_Register($src$$reg)); %} From 5cad0b4df7f5ccb6d462dc948c2ea5ad5da6e2ed Mon Sep 17 00:00:00 2001 From: Nizar Benalla <nbenalla@openjdk.org> Date: Thu, 20 Jun 2024 11:53:02 +0000 Subject: [PATCH 122/471] 8322708: Global HTML attributes are not allowed Reviewed-by: jjg --- .../jdk/javadoc/internal/doclint/Checker.java | 4 +- .../jdk/javadoc/internal/doclint/HtmlTag.java | 85 ++++++++++---- .../doclet/TestGlobalHtml/TestGlobalHtml.java | 90 +++++++++++++++ .../doclet/TestGlobalHtml/pkg1/C1.java | 105 ++++++++++++++++++ 4 files changed, 260 insertions(+), 24 deletions(-) create mode 100644 test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java create mode 100644 test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java index 8fbdce922fe69..d33e4874c008a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java @@ -690,7 +690,9 @@ public Void visitAttribute(AttributeTree tree, Void ignore) { } // for now, doclint allows all attribute names beginning with "on" as event handler names, // without checking the validity or applicability of the name - if (!name.toString().startsWith("on")) { + // custom "data-*" attributes are also accepted + var attrName = name.toString(); + if (!attrName.startsWith("on") && !attrName.startsWith("data-")) { AttrKind k = currTag.getAttrKind(name); switch (k) { case OK -> { } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java index 68495019c16ce..0c820dae91392 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -434,57 +434,76 @@ public enum Flag { public enum Attr { ABBR, + ACCESSKEY(true), ALIGN, ALINK, ALT, - ARIA_ACTIVEDESCENDANT, - ARIA_CONTROLS, - ARIA_DESCRIBEDBY, - ARIA_EXPANDED, - ARIA_LABEL, - ARIA_LABELLEDBY, - ARIA_LEVEL, - ARIA_MULTISELECTABLE, - ARIA_OWNS, - ARIA_POSINSET, - ARIA_SETSIZE, - ARIA_READONLY, - ARIA_REQUIRED, - ARIA_SELECTED, - ARIA_SORT, + ARIA_ACTIVEDESCENDANT(true), + ARIA_CONTROLS(true), + ARIA_DESCRIBEDBY(true), + ARIA_EXPANDED(true), + ARIA_LABEL(true), + ARIA_LABELLEDBY(true), + ARIA_LEVEL(true), + ARIA_MULTISELECTABLE(true), + ARIA_OWNS(true), + ARIA_POSINSET(true), + ARIA_READONLY(true), + ARIA_REQUIRED(true), + ARIA_SELECTED(true), + ARIA_SETSIZE(true), + ARIA_SORT(true), + AUTOCAPITALIZE(true), + AUTOFOCUS(true), AXIS, BACKGROUND, BGCOLOR, BORDER, - CELLSPACING, CELLPADDING, + CELLSPACING, CHAR, CHAROFF, CHARSET, CITE, + CLASS(true), CLEAR, - CLASS, COLOR, COLSPAN, COMPACT, + CONTENTEDITABLE(true), COORDS, CROSSORIGIN, DATETIME, + DIR(true), + DRAGGABLE(true), + ENTERKEYHINT(true), FACE, FRAME, FRAMEBORDER, HEADERS, HEIGHT, + HIDDEN(true), HREF, HSPACE, - ID, + ID(true), + INERT(true), + INPUTMODE(true), + IS(true), + ITEMID(true), + ITEMPROP(true), + ITEMREF(true), + ITEMSCOPE(true), + ITEMTYPE(true), + LANG(true), LINK, LONGDESC, MARGINHEIGHT, MARGINWIDTH, NAME, + NONCE(true), NOSHADE, NOWRAP, + POPOVER(true), PROFILE, REV, REVERSED, @@ -497,24 +516,39 @@ public enum Attr { SHAPE, SIZE, SPACE, + SPELLCHECK(true), SRC, START, - STYLE, + STYLE(true), SUMMARY, + TABINDEX(true), TARGET, TEXT, + TITLE(true), + TRANSLATE(true), TYPE, VALIGN, VALUE, VERSION, VLINK, VSPACE, - WIDTH; + WIDTH, + WRITINGSUGGESTIONS(true); private final String name; + private final boolean isGlobal; Attr() { + this(false); + } + + Attr(boolean flag) { name = StringUtils.toLowerCase(name().replace("_", "-")); + isGlobal = flag; + } + + public boolean isGlobal() { + return isGlobal; } public String getText() { @@ -632,8 +666,13 @@ public Attr getAttr(Name attrName) { } public AttrKind getAttrKind(Name attrName) { - AttrKind k = attrs.get(getAttr(attrName)); // null-safe - return (k == null) ? AttrKind.INVALID : k; + Attr attr = getAttr(attrName); + if (attr == null) { + return AttrKind.INVALID; + } + return attr.isGlobal() ? + AttrKind.OK : + attrs.getOrDefault(attr, AttrKind.INVALID); } private static AttrMap attrs(AttrKind k, Attr... attrs) { diff --git a/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java new file mode 100644 index 0000000000000..8d2d8e7dd786c --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8322708 + * @summary Test to make sure global tags work properly + * @library /tools/lib ../../lib + * @modules jdk.javadoc/jdk.javadoc.internal.tool + * @build toolbox.ToolBox javadoc.tester.* + * @run main TestGlobalHtml + */ + +import javadoc.tester.JavadocTester; +import toolbox.ToolBox; + +import java.nio.file.Path; + +public class TestGlobalHtml extends JavadocTester { + ToolBox tb = new ToolBox(); + + public static void main(String... args) throws Exception { + var tester = new TestGlobalHtml(); + tester.runTests(); + } + + @Test + public void testGlobalTags() { + javadoc("--allow-script-in-comments", + "-d", + "out-global", + "-sourcepath", + testSrc, + "pkg1"); + checkExit(Exit.OK); + } + + @Test + public void testNegative(Path base) throws Exception { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + """ + package p; + /** + * class comment + * <a href="https://openjdk.org/">Hyperlink to the OpenJDK website</a> + */ + public class C { + /** + * <form> + * <label for="methodname">Method name:</label><br> + * <input type="text" id="methodname" name="methodname"><br> + * <label for="paramname">Method Parameter:</label><br> + * <input type="text" id="paramname" name="paramname"> + * </form> + */ + public C() { + } + } + """); + + javadoc("--allow-script-in-comments", + "-d", + "out-negative", + "-sourcepath", + src.toString(), + "p"); + checkExit(Exit.ERROR); + } +} diff --git a/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java new file mode 100644 index 0000000000000..9f823fbad0501 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg1; + + +/** + * <div inert> + * <p> This content is inert and not interactable.</p> + * <a href="https://openjdk.org/" title="OpenJDK's Website" tabindex="0"> + * Visit OpenJDK's Website! + * </a> + * </div> + * + * <div> + * <p autocapitalize="on">This content is interactable.</p> + * <a href="https://openjdk.org/" title="OpenJDK's Website" tabindex="0"> + * Visit OpenJDK's Website! + * </a> + * </div> + * + * + * <div dir="ltr" lang="en"> + * <p itemprop="description">This is used in a jtreg test to check that global HTML tags are allowed</p> + * <ul spellcheck="true"> + * <li>Class C</li> + * <li>Has a default constructor</li> + * </ul> + * </div> + * + * <p contenteditable="true" inputmode="text">Here is a description of the class and methods:</p> + * + * <ol draggable="true" tabindex="0"> + * <li><p accesskey="1" data-element-type="constructor" title="Class Details">Has a default constructor</p></li> + * <li><p accesskey="2" data-element-type="toString" title="Methods Summary">Overrides toString method</p></li> + * <li><p accesskey="3" data-element-type="other" title="Usage Example">Is used for testing</p></li> + * </ol> + * + * <div itemscope> + * <p itemprop="name">C1</p> + * <p itemprop="description">C1</p> + * </div> + */ +public class C1 { + + /** + * <p lang="en" accesskey="D" autocapitalize="on" draggable="true" spellcheck="false"> + * Default constructor for the {@code C1} class. (this content is draggable!) </p> + * <div lang="en" contenteditable="true"> + * <p itemprop="creator">Author: try editing this content!</p> + * <p title="Creation Date">Created on: June 14 2024</p> + * </div> + */ + public C1() { + } + + /** + * A method in C1 + * + * <p lang="en" inputmode="numeric">simple method.</p> + * + * <div itemprop="method" itemscope> + * <p itemprop="name">method m</p> + * <p itemprop="description">the method m does nothing</p> + * </div> + */ + public void m() { + } + + /** + * A toString Override. + * + * <p dir="ltr" spellcheck="true">returns a String Object.</p> + * + * <div itemprop="method" itemscope> + * <p itemprop="name">toString</p> + * </div> + * + * @return a string. + */ + @Override + public String toString() { + return "C1"; + } +} From 001d6860199436c5fb14bd681d640d462b472015 Mon Sep 17 00:00:00 2001 From: Gui Cao <gcao@openjdk.org> Date: Thu, 20 Jun 2024 13:45:31 +0000 Subject: [PATCH 123/471] 8332587: RISC-V: secondary_super_cache does not scale well Reviewed-by: mli, fyang --- .../cpu/riscv/macroAssembler_riscv.cpp | 272 ++++++++++++++++++ .../cpu/riscv/macroAssembler_riscv.hpp | 28 ++ src/hotspot/cpu/riscv/riscv.ad | 44 ++- src/hotspot/cpu/riscv/stubGenerator_riscv.cpp | 56 ++++ src/hotspot/cpu/riscv/vm_version_riscv.hpp | 2 + 5 files changed, 400 insertions(+), 2 deletions(-) diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index 9961ce8e6dd39..e889c26e5f419 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -3611,6 +3611,278 @@ void MacroAssembler::check_klass_subtype_slow_path(Register sub_klass, bind(L_fallthrough); } +// population_count variant for running without the CPOP +// instruction, which was introduced with Zbb extension. +void MacroAssembler::population_count(Register dst, Register src, + Register tmp1, Register tmp2) { + if (UsePopCountInstruction) { + cpop(dst, src); + } else { + assert_different_registers(src, tmp1, tmp2); + assert_different_registers(dst, tmp1, tmp2); + Label loop, done; + + mv(tmp1, src); + // dst = 0; + // while(tmp1 != 0) { + // dst++; + // tmp1 &= (tmp1 - 1); + // } + mv(dst, zr); + beqz(tmp1, done); + { + bind(loop); + addi(dst, dst, 1); + addi(tmp2, tmp1, -1); + andr(tmp1, tmp1, tmp2); + bnez(tmp1, loop); + } + bind(done); + } +} + +// Ensure that the inline code and the stub are using the same registers +// as we need to call the stub from inline code when there is a collision +// in the hashed lookup in the secondary supers array. +#define LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS(r_super_klass, r_array_base, r_array_length, \ + r_array_index, r_sub_klass, result, r_bitmap) \ +do { \ + assert(r_super_klass == x10 && \ + r_array_base == x11 && \ + r_array_length == x12 && \ + (r_array_index == x13 || r_array_index == noreg) && \ + (r_sub_klass == x14 || r_sub_klass == noreg) && \ + (result == x15 || result == noreg) && \ + (r_bitmap == x16 || r_bitmap == noreg), "registers must match riscv.ad"); \ +} while(0) + +// Return true: we succeeded in generating this code +bool MacroAssembler::lookup_secondary_supers_table(Register r_sub_klass, + Register r_super_klass, + Register result, + Register tmp1, + Register tmp2, + Register tmp3, + Register tmp4, + u1 super_klass_slot, + bool stub_is_near) { + assert_different_registers(r_sub_klass, r_super_klass, result, tmp1, tmp2, tmp3, tmp4, t0); + + Label L_fallthrough; + + BLOCK_COMMENT("lookup_secondary_supers_table {"); + + const Register + r_array_base = tmp1, // x11 + r_array_length = tmp2, // x12 + r_array_index = tmp3, // x13 + r_bitmap = tmp4; // x16 + + LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS(r_super_klass, r_array_base, r_array_length, + r_array_index, r_sub_klass, result, r_bitmap); + + u1 bit = super_klass_slot; + + // Initialize result value to 1 which means mismatch. + mv(result, 1); + + ld(r_bitmap, Address(r_sub_klass, Klass::bitmap_offset())); + + // First check the bitmap to see if super_klass might be present. If + // the bit is zero, we are certain that super_klass is not one of + // the secondary supers. + test_bit(t0, r_bitmap, bit); + beqz(t0, L_fallthrough); + + // Get the first array index that can contain super_klass into r_array_index. + if (bit != 0) { + slli(r_array_index, r_bitmap, (Klass::SECONDARY_SUPERS_TABLE_MASK - bit)); + population_count(r_array_index, r_array_index, tmp1, tmp2); + } else { + mv(r_array_index, (u1)1); + } + + // We will consult the secondary-super array. + ld(r_array_base, Address(r_sub_klass, in_bytes(Klass::secondary_supers_offset()))); + + // The value i in r_array_index is >= 1, so even though r_array_base + // points to the length, we don't need to adjust it to point to the data. + assert(Array<Klass*>::base_offset_in_bytes() == wordSize, "Adjust this code"); + assert(Array<Klass*>::length_offset_in_bytes() == 0, "Adjust this code"); + + shadd(result, r_array_index, r_array_base, result, LogBytesPerWord); + ld(result, Address(result)); + xorr(result, result, r_super_klass); + beqz(result, L_fallthrough); // Found a match + + // Is there another entry to check? Consult the bitmap. + test_bit(t0, r_bitmap, (bit + 1) & Klass::SECONDARY_SUPERS_TABLE_MASK); + beqz(t0, L_fallthrough); + + // Linear probe. + if (bit != 0) { + ror_imm(r_bitmap, r_bitmap, bit); + } + + // The slot we just inspected is at secondary_supers[r_array_index - 1]. + // The next slot to be inspected, by the stub we're about to call, + // is secondary_supers[r_array_index]. Bits 0 and 1 in the bitmap + // have been checked. + Address stub = RuntimeAddress(StubRoutines::lookup_secondary_supers_table_slow_path_stub()); + if (stub_is_near) { + jump_link(stub, t0); + } else { + address call = trampoline_call(stub); + if (call == nullptr) { + return false; // trampoline allocation failed + } + } + + BLOCK_COMMENT("} lookup_secondary_supers_table"); + + bind(L_fallthrough); + + if (VerifySecondarySupers) { + verify_secondary_supers_table(r_sub_klass, r_super_klass, // x14, x10 + result, tmp1, tmp2, tmp3); // x15, x11, x12, x13 + } + return true; +} + +// Called by code generated by check_klass_subtype_slow_path +// above. This is called when there is a collision in the hashed +// lookup in the secondary supers array. +void MacroAssembler::lookup_secondary_supers_table_slow_path(Register r_super_klass, + Register r_array_base, + Register r_array_index, + Register r_bitmap, + Register result, + Register tmp1) { + assert_different_registers(r_super_klass, r_array_base, r_array_index, r_bitmap, tmp1, result, t0); + + const Register + r_array_length = tmp1, + r_sub_klass = noreg; // unused + + LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS(r_super_klass, r_array_base, r_array_length, + r_array_index, r_sub_klass, result, r_bitmap); + + Label L_matched, L_fallthrough, L_bitmap_full; + + // Initialize result value to 1 which means mismatch. + mv(result, 1); + + // Load the array length. + lwu(r_array_length, Address(r_array_base, Array<Klass*>::length_offset_in_bytes())); + // And adjust the array base to point to the data. + // NB! Effectively increments current slot index by 1. + assert(Array<Klass*>::base_offset_in_bytes() == wordSize, ""); + addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes()); + + // Check if bitmap is SECONDARY_SUPERS_BITMAP_FULL + assert(Klass::SECONDARY_SUPERS_BITMAP_FULL == ~uintx(0), "Adjust this code"); + addi(t0, r_bitmap, (u1)1); + beqz(t0, L_bitmap_full); + + // NB! Our caller has checked bits 0 and 1 in the bitmap. The + // current slot (at secondary_supers[r_array_index]) has not yet + // been inspected, and r_array_index may be out of bounds if we + // wrapped around the end of the array. + + { // This is conventional linear probing, but instead of terminating + // when a null entry is found in the table, we maintain a bitmap + // in which a 0 indicates missing entries. + // The check above guarantees there are 0s in the bitmap, so the loop + // eventually terminates. + Label L_loop; + bind(L_loop); + + // Check for wraparound. + Label skip; + bge(r_array_length, r_array_index, skip); + mv(r_array_index, zr); + bind(skip); + + shadd(t0, r_array_index, r_array_base, t0, LogBytesPerWord); + ld(t0, Address(t0)); + beq(t0, r_super_klass, L_matched); + + test_bit(t0, r_bitmap, 2); // look-ahead check (Bit 2); result is non-zero + beqz(t0, L_fallthrough); + + ror_imm(r_bitmap, r_bitmap, 1); + addi(r_array_index, r_array_index, 1); + j(L_loop); + } + + { // Degenerate case: more than 64 secondary supers. + // FIXME: We could do something smarter here, maybe a vectorized + // comparison or a binary search, but is that worth any added + // complexity? + bind(L_bitmap_full); + repne_scan(r_array_base, r_super_klass, r_array_length, t0); + bne(r_super_klass, t0, L_fallthrough); + } + + bind(L_matched); + mv(result, zr); + + bind(L_fallthrough); +} + +// Make sure that the hashed lookup and a linear scan agree. +void MacroAssembler::verify_secondary_supers_table(Register r_sub_klass, + Register r_super_klass, + Register result, + Register tmp1, + Register tmp2, + Register tmp3) { + assert_different_registers(r_sub_klass, r_super_klass, tmp1, tmp2, tmp3, result, t0); + + const Register + r_array_base = tmp1, // X11 + r_array_length = tmp2, // X12 + r_array_index = noreg, // unused + r_bitmap = noreg; // unused + + LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS(r_super_klass, r_array_base, r_array_length, + r_array_index, r_sub_klass, result, r_bitmap); + + BLOCK_COMMENT("verify_secondary_supers_table {"); + + // We will consult the secondary-super array. + ld(r_array_base, Address(r_sub_klass, in_bytes(Klass::secondary_supers_offset()))); + + // Load the array length. + lwu(r_array_length, Address(r_array_base, Array<Klass*>::length_offset_in_bytes())); + // And adjust the array base to point to the data. + addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes()); + + repne_scan(r_array_base, r_super_klass, r_array_length, t0); + Label failed; + mv(tmp3, 1); + bne(r_super_klass, t0, failed); + mv(tmp3, zr); + bind(failed); + + snez(result, result); // normalize result to 0/1 for comparison + + Label passed; + beq(tmp3, result, passed); + { + mv(x10, r_super_klass); + mv(x11, r_sub_klass); + mv(x12, tmp3); + mv(x13, result); + mv(x14, (address)("mismatch")); + rt_call(CAST_FROM_FN_PTR(address, Klass::on_secondary_supers_verification_failure)); + should_not_reach_here(); + } + bind(passed); + + BLOCK_COMMENT("} verify_secondary_supers_table"); +} + // Defines obj, preserves var_size_in_bytes, okay for tmp2 == var_size_in_bytes. void MacroAssembler::tlab_allocate(Register obj, Register var_size_in_bytes, diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp index 4e9a41625ad46..4373ebada146a 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp @@ -322,6 +322,34 @@ class MacroAssembler: public Assembler { Label* L_success, Label* L_failure); + void population_count(Register dst, Register src, Register tmp1, Register tmp2); + + // As above, but with a constant super_klass. + // The result is in Register result, not the condition codes. + bool lookup_secondary_supers_table(Register r_sub_klass, + Register r_super_klass, + Register result, + Register tmp1, + Register tmp2, + Register tmp3, + Register tmp4, + u1 super_klass_slot, + bool stub_is_near = false); + + void verify_secondary_supers_table(Register r_sub_klass, + Register r_super_klass, + Register result, + Register tmp1, + Register tmp2, + Register tmp3); + + void lookup_secondary_supers_table_slow_path(Register r_super_klass, + Register r_array_base, + Register r_array_index, + Register r_bitmap, + Register result, + Register tmp1); + void check_klass_subtype(Register sub_klass, Register super_klass, Register tmp_reg, diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 2368a280bf2df..533b548c88109 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -3313,6 +3313,16 @@ operand iRegP_R15() interface(REG_INTER); %} +operand iRegP_R16() +%{ + constraint(ALLOC_IN_RC(r16_reg)); + match(RegP); + match(iRegPNoSp); + op_cost(0); + format %{ %} + interface(REG_INTER); +%} + // Pointer 64 bit Register R28 only operand iRegP_R28() %{ @@ -10075,7 +10085,7 @@ instruct partialSubtypeCheck(iRegP_R15 result, iRegP_R14 sub, iRegP_R10 super, i match(Set result (PartialSubtypeCheck sub super)); effect(KILL tmp, KILL cr); - ins_cost(2 * STORE_COST + 3 * LOAD_COST + 4 * ALU_COST + BRANCH_COST * 4); + ins_cost(11 * DEFAULT_COST); format %{ "partialSubtypeCheck $result, $sub, $super\t#@partialSubtypeCheck" %} ins_encode(riscv_enc_partial_subtype_check(sub, super, tmp, result)); @@ -10085,13 +10095,43 @@ instruct partialSubtypeCheck(iRegP_R15 result, iRegP_R14 sub, iRegP_R10 super, i ins_pipe(pipe_class_memory); %} +instruct partialSubtypeCheckConstSuper(iRegP_R14 sub, iRegP_R10 super_reg, immP super_con, iRegP_R15 result, + iRegP_R11 tmpR11, iRegP_R12 tmpR12, iRegP_R13 tmpR13, iRegP_R16 tmpR16) +%{ + predicate(UseSecondarySupersTable); + match(Set result (PartialSubtypeCheck sub (Binary super_reg super_con))); + effect(TEMP tmpR11, TEMP tmpR12, TEMP tmpR13, TEMP tmpR16); + + ins_cost(7 * DEFAULT_COST); // needs to be less than competing nodes + format %{ "partialSubtypeCheck $result, $sub, $super_reg, $super_con" %} + + ins_encode %{ + bool success = false; + u1 super_klass_slot = ((Klass*)$super_con$$constant)->hash_slot(); + if (InlineSecondarySupersTest) { + success = __ lookup_secondary_supers_table($sub$$Register, $super_reg$$Register, $result$$Register, + $tmpR11$$Register, $tmpR12$$Register, $tmpR13$$Register, + $tmpR16$$Register, super_klass_slot); + } else { + address call = __ trampoline_call(RuntimeAddress(StubRoutines::lookup_secondary_supers_table_stub(super_klass_slot))); + success = (call != nullptr); + } + if (!success) { + ciEnv::current()->record_failure("CodeCache is full"); + return; + } + %} + + ins_pipe(pipe_class_memory); +%} + instruct partialSubtypeCheckVsZero(iRegP_R15 result, iRegP_R14 sub, iRegP_R10 super, iRegP_R12 tmp, immP0 zero, rFlagsReg cr) %{ match(Set cr (CmpP (PartialSubtypeCheck sub super) zero)); effect(KILL tmp, KILL result); - ins_cost(2 * STORE_COST + 3 * LOAD_COST + 4 * ALU_COST + BRANCH_COST * 4); + ins_cost(11 * DEFAULT_COST); format %{ "partialSubtypeCheck $result, $sub, $super == 0\t#@partialSubtypeCheckVsZero" %} ins_encode(riscv_enc_partial_subtype_check(sub, super, tmp, result)); diff --git a/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp b/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp index c292f671325da..3a34e87c14006 100644 --- a/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp +++ b/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp @@ -2808,6 +2808,50 @@ class StubGenerator: public StubCodeGenerator { } #ifdef COMPILER2 + address generate_lookup_secondary_supers_table_stub(u1 super_klass_index) { + StubCodeMark mark(this, "StubRoutines", "lookup_secondary_supers_table"); + + address start = __ pc(); + const Register + r_super_klass = x10, + r_array_base = x11, + r_array_length = x12, + r_array_index = x13, + r_sub_klass = x14, + result = x15, + r_bitmap = x16; + + Label L_success; + __ enter(); + __ lookup_secondary_supers_table(r_sub_klass, r_super_klass, result, + r_array_base, r_array_length, r_array_index, + r_bitmap, super_klass_index, /*stub_is_near*/true); + __ leave(); + __ ret(); + + return start; + } + + // Slow path implementation for UseSecondarySupersTable. + address generate_lookup_secondary_supers_table_slow_path_stub() { + StubCodeMark mark(this, "StubRoutines", "lookup_secondary_supers_table_slow_path"); + + address start = __ pc(); + const Register + r_super_klass = x10, // argument + r_array_base = x11, // argument + temp1 = x12, // tmp + r_array_index = x13, // argument + result = x15, // argument + r_bitmap = x16; // argument + + + __ lookup_secondary_supers_table_slow_path(r_super_klass, r_array_base, r_array_index, r_bitmap, result, temp1); + __ ret(); + + return start; + } + address generate_mulAdd() { __ align(CodeEntryAlignment); @@ -5566,6 +5610,18 @@ static const int64_t right_3_bits = right_n_bits(3); StubRoutines::_method_entry_barrier = generate_method_entry_barrier(); } +#ifdef COMPILER2 + if (UseSecondarySupersTable) { + StubRoutines::_lookup_secondary_supers_table_slow_path_stub = generate_lookup_secondary_supers_table_slow_path_stub(); + if (!InlineSecondarySupersTest) { + for (int slot = 0; slot < Klass::SECONDARY_SUPERS_TABLE_SIZE; slot++) { + StubRoutines::_lookup_secondary_supers_table_stubs[slot] + = generate_lookup_secondary_supers_table_stub(slot); + } + } + } +#endif // COMPILER2 + StubRoutines::_upcall_stub_exception_handler = generate_upcall_stub_exception_handler(); StubRoutines::riscv::set_completed(); diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.hpp b/src/hotspot/cpu/riscv/vm_version_riscv.hpp index f3a834b72379c..9556e2dc9ad5d 100644 --- a/src/hotspot/cpu/riscv/vm_version_riscv.hpp +++ b/src/hotspot/cpu/riscv/vm_version_riscv.hpp @@ -277,6 +277,8 @@ class VM_Version : public Abstract_VM_Version { constexpr static bool supports_recursive_lightweight_locking() { return true; } + constexpr static bool supports_secondary_supers_table() { return true; } + static bool supports_on_spin_wait() { return UseZihintpause; } // RISCV64 supports fast class initialization checks From 9ef86da5f8e2579fa1fdf40b4a6f556882e1177d Mon Sep 17 00:00:00 2001 From: Abhishek Kumar <abhiscxk@openjdk.org> Date: Thu, 20 Jun 2024 15:42:17 +0000 Subject: [PATCH 124/471] 8334170: bug6492108.java test failed with exception Image comparison failed at (0, 0) for image 4 Reviewed-by: aivanov, azvegint --- test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java b/test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java index ac411bab7d21e..0e2c6ce51c0db 100644 --- a/test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java +++ b/test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java @@ -109,6 +109,7 @@ protected Component createContentPane() { } catch (Throwable t) { fail("Problem creating text components"); } + setDelay(50); return panel; } From 99e4d77aac72cdddb4973805d28c225f17ea965f Mon Sep 17 00:00:00 2001 From: Leonid Mesnik <lmesnik@openjdk.org> Date: Thu, 20 Jun 2024 15:43:44 +0000 Subject: [PATCH 125/471] 8333117: Remove support of remote and manual debuggee launchers Reviewed-by: cjplummer --- .../vmTestbase/nsk/share/jdb/Debuggee.java | 115 +--- .../vmTestbase/nsk/share/jdb/Launcher.java | 116 +--- .../nsk/share/jdi/ArgumentHandler.java | 14 +- .../vmTestbase/nsk/share/jdi/Binder.java | 558 +----------------- .../vmTestbase/nsk/share/jdi/Debugee.java | 11 +- .../vmTestbase/nsk/share/jdwp/Binder.java | 343 +---------- .../vmTestbase/nsk/share/jdwp/Debugee.java | 10 +- .../share/jpda/DebugeeArgumentHandler.java | 73 +-- .../nsk/share/jpda/DebugeeBinder.java | 355 ----------- .../nsk/share/jpda/DebugeeProcess.java | 44 +- 10 files changed, 105 insertions(+), 1534 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Debuggee.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Debuggee.java index b0467a7e73ce7..f7472e2db035c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Debuggee.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Debuggee.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,55 +30,15 @@ import java.io.*; /** - * Interface defining methods to control mirror of debuggee (i.e. debugged VM). + * Class defining methods to control mirror of debuggee (i.e. debugged VM). */ -public interface Debuggee { +public class Debuggee extends LocalProcess { /** Default prefix for log messages. */ public static final String LOG_PREFIX = "debuggee> "; public static final String DEBUGEE_STDOUT_LOG_PREFIX = "debuggee.stdout> "; public static final String DEBUGEE_STDERR_LOG_PREFIX = "debuggee.stderr> "; - /** - * Launch debuggee. - * - * @throws IOException - */ - public void launch (String[] args) throws IOException; - - /** Return exit status. */ - public int getStatus (); - - /** Check whether the process has been terminated. */ - public boolean terminated(); - - /** Kill the debuggee VM. */ - public void killDebuggee (); - - /** Wait until the debuggee VM shutdown or crash. */ - public int waitForDebuggee () throws InterruptedException; - - /** Get a pipe to write to the debuggee's stdin stream. */ - public OutputStream getInPipe (); - - /** Get a pipe to read the debuggee's stdout stream. */ - public InputStream getOutPipe (); - - /** Get a pipe to read the debuggee's stderr stream. */ - public InputStream getErrPipe (); - - /** Redirect stdout stream to <code>Log</code> */ - public void redirectStdout(Log log, String prefix); - - /** Redirect stderr stream to <code>Log</code> */ - public void redirectStderr(Log log, String prefix); -} - -/** - * Mirror of locally launched debuggee. - */ -final class LocalLaunchedDebuggee extends LocalProcess implements Debuggee { - private IORedirector stdoutRedirector = null; private IORedirector stderrRedirector = null; private IORedirector stdinRedirector = null; @@ -90,7 +50,7 @@ final class LocalLaunchedDebuggee extends LocalProcess implements Debuggee { private Launcher launcher = null; /** Enwrap the existing <code>VM</code> mirror. */ - LocalLaunchedDebuggee (Launcher launcher) { + Debuggee(Launcher launcher) { super(); this.launcher = launcher; } @@ -235,70 +195,3 @@ public void redirectStderr(Log log, String prefix) { } -/** - * Mirror of remotely launched debuggee. - */ -final class RemoteLaunchedDebuggee implements Debuggee { - - /** Launcher that creates this debuggee. */ - private Launcher launcher = null; - - /** Enwrap the existing <code>VM</code> mirror. */ - RemoteLaunchedDebuggee (Launcher launcher) { - super(); - this.launcher = launcher; - } - - /** - * Launch debugee on remote host via <code>Launcher</code> object. - */ - public void launch(String[] args) throws IOException { - String cmdLine = ArgumentHandler.joinArguments(args, "\""); - launcher.display("Starting remote java process:\n" + cmdLine); - launcher.launchRemoteProcess(args); - } - - /** Return exit status of the debuggee VM. */ - public int getStatus () { - return launcher.getRemoteProcessStatus(); - } - - /** Check whether the debuggee VM has been terminated. */ - public boolean terminated () { - return launcher.isRemoteProcessTerminated(); - } - - // ---------------------------------------------- // - - /** Kill the debuggee VM. */ - public void killDebuggee () { - launcher.killRemoteProcess(); - } - - /** Wait until the debuggee VM shutdown or crash. */ - public int waitForDebuggee () { - return launcher.waitForRemoteProcess(); - } - - /** Get a pipe to write to the debuggee's stdin stream. */ - public OutputStream getInPipe () { - return null; - } - - /** Get a pipe to read the debuggee's stdout stream. */ - public InputStream getOutPipe () { - return null; - } - - /** Get a pipe to read the debuggee's stderr stream. */ - public InputStream getErrPipe () { - return null; - } - - public void redirectStdout(Log log, String prefix) { - } - - public void redirectStderr(Log log, String prefix) { - } - -} diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java index 0db3a6f718eab..35df95b2d6f8a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -103,52 +103,21 @@ public void launchJdbAndDebuggee (String classToExecute) throws IOException { String[] jdbCmdArgs = makeJdbCmdLine(classToExecute); - if (argumentHandler.isLaunchedLocally()) { - - if (argumentHandler.isDefaultConnector()) { - - localDefaultLaunch(jdbCmdArgs, classToExecute); - - } else if (argumentHandler.isRawLaunchingConnector()) { - - localRawLaunch(jdbCmdArgs, classToExecute); - - } else if (argumentHandler.isLaunchingConnector()) { - - localLaunch(jdbCmdArgs, classToExecute); - - } else if (argumentHandler.isAttachingConnector()) { - - localLaunchAndAttach(jdbCmdArgs, classToExecute); - - } else if (argumentHandler.isListeningConnector()) { - - localLaunchAndListen(jdbCmdArgs, classToExecute); - - } else { - throw new TestBug("Unexpected connector type for local launch mode" - + argumentHandler.getConnectorType()); - } - - } else if (argumentHandler.isLaunchedRemotely()) { - - connectToBindServer(classToExecute); - - if (argumentHandler.isAttachingConnector()) { - - remoteLaunchAndAttach(jdbCmdArgs, classToExecute); - - } else if (argumentHandler.isListeningConnector()) { - - remoteLaunchAndListen(jdbCmdArgs, classToExecute); - - } else { - throw new TestBug("Unexpected connector type for remote launch mode" - + argumentHandler.getConnectorType()); - } + if (argumentHandler.isDefaultConnector()) { + localDefaultLaunch(jdbCmdArgs, classToExecute); + } else if (argumentHandler.isRawLaunchingConnector()) { + localRawLaunch(jdbCmdArgs, classToExecute); + } else if (argumentHandler.isLaunchingConnector()) { + localLaunch(jdbCmdArgs, classToExecute); + } else if (argumentHandler.isAttachingConnector()) { + localLaunchAndAttach(jdbCmdArgs, classToExecute); + } else if (argumentHandler.isListeningConnector()) { + localLaunchAndListen(jdbCmdArgs, classToExecute); } else { - throw new Failure("Unexpected launching mode: " + argumentHandler.getLaunchMode()); + throw new TestBug("Unexpected connector type for local launch mode" + + argumentHandler.getConnectorType()); } + } /** @@ -198,11 +167,7 @@ private String[] makeJdbCmdLine (String classToExecute) { if (argumentHandler.isRawLaunchingConnector()) { if (argumentHandler.isSocketTransport()) { - if (argumentHandler.isLaunchedLocally()) { - connectorAddress = argumentHandler.getTransportPort(); - } else { - connectorAddress = argumentHandler.getDebugeeHost() + ":" + argumentHandler.getTransportPort(); - } + connectorAddress = argumentHandler.getTransportPort(); } else if (argumentHandler.isShmemTransport() ) { connectorAddress = argumentHandler.getTransportSharedName(); } else { @@ -247,8 +212,6 @@ private String[] makeJdbCmdLine (String classToExecute) { if (argumentHandler.isSocketTransport()) { connect.append("port=" + argumentHandler.getTransportPort().trim()); - if (argumentHandler.isLaunchedRemotely()) - connect.append(",hostname=" + argumentHandler.getDebugeeHost().trim()); } else if (argumentHandler.isShmemTransport()) { connect.append("name=" + argumentHandler.getTransportSharedName().trim()); } else { @@ -324,7 +287,7 @@ private String[] makeJdbCmdLine (String classToExecute) { private void localLaunchAndAttach (String[] jdbCmdArgs, String classToExecute) throws IOException { - debuggee = new LocalLaunchedDebuggee(this); + debuggee = new Debuggee(this); String address = makeTransportAddress(); String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address); debuggee.launch(javaCmdArgs); @@ -346,57 +309,12 @@ private String[] makeJdbCmdLine (String classToExecute) { String address = jdb.waitForListeningJdb(); display("Listening address found: " + address); - debuggee = new LocalLaunchedDebuggee(this); + debuggee = new Debuggee(this); String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address); debuggee.launch(javaCmdArgs); // jdb.waitForPrompt(0, false); } - /** - * Run test in remote mode using attaching connector. - */ - private void remoteLaunchAndAttach - (String[] jdbCmdArgs, String classToExecute) throws IOException { - - debuggee = new RemoteLaunchedDebuggee(this); - String address = makeTransportAddress(); - String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address); - try { - debuggee.launch(javaCmdArgs); - } catch (IOException e) { - throw new Failure("Caught exception while launching debuggee VM process:\n\t" - + e); - }; - - display("Start jdb attaching to remote debuggee"); - jdb = Jdb.startAttachingJdb (this, jdbCmdArgs, JDB_STARTED); -// jdb.waitForPrompt(0, false); - } - - /** - * Run test in remote mode using listening connector. - */ - private void remoteLaunchAndListen - (String[] jdbCmdArgs, String classToExecute) throws IOException { - - jdb = new Jdb(this); - display("Starting jdb listening to remote debuggee"); - jdb.launch(jdbCmdArgs); - String address = jdb.waitForListeningJdb(); - display("Listening address found: " + address); - - debuggee = new RemoteLaunchedDebuggee(this); - String[] javaCmdArgs = makeCommandLineArgs(classToExecute); - try { - debuggee.launch(javaCmdArgs); - } catch (IOException e) { - throw new Failure("Caught exception while launching debuggee VM process:\n\t" - + e); - }; - - jdb.waitForMessage(0, JDB_STARTED); -// jdb.waitForPrompt(0, false); - } } // End of Launcher diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java index 1686318950027..3f924c6ac47b8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -457,18 +457,6 @@ protected void checkOptions() { } */ - if (! isLaunchedLocally() && ! isDefaultDebugeeSuspendMode()) { - throw new BadOption("inconsistent options: " - + "-debugee.launch=" + getLaunchMode() - + " and -debugee.suspend=" + getDebugeeSuspendMode()); - } - - if (! isLaunchedLocally() && isLaunchingConnector()) { - throw new BadOption("inconsistent options: " - + "-debugee.launch=" + getLaunchMode() - + " and -connector=" + getConnectorType()); - } - if (isLaunchingConnector() && ! isDefaultTransport()) { throw new BadOption("inconsistent options: " + "-connector=" + getConnectorType() diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java index b983ac998f5a2..9879b68775fa8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java @@ -127,8 +127,7 @@ public Binder (ArgumentHandler argumentHandler, Log log) { * started with launching connector. */ public Debugee makeLocalDebugee(Process process) { - LocalLaunchedDebugee debugee = new LocalLaunchedDebugee(process, this); - return debugee; + return new Debugee(process, this); } /** @@ -189,51 +188,22 @@ public Debugee bindToDebugeeNoWait(String classToExecute) { prepareForPipeConnection(argumentHandler); - if (argumentHandler.isLaunchedLocally()) { - - if (argumentHandler.isDefaultConnector()) { - debugee = localDefaultLaunchDebugee(vmm, classToExecute, classPath); - } else if (argumentHandler.isRawLaunchingConnector()) { - debugee = localRawLaunchDebugee(vmm, classToExecute, classPath); - } else if (argumentHandler.isLaunchingConnector()) { - debugee = localLaunchDebugee(vmm, classToExecute, classPath); - } else if (argumentHandler.isAttachingConnector()) { - debugee = localLaunchAndAttachDebugee(vmm, classToExecute, classPath); - } else if (argumentHandler.isListeningConnector()) { - debugee = localLaunchAndListenDebugee(vmm, classToExecute, classPath); - } else { - throw new TestBug("Unexpected connector type for local debugee launch mode" - + argumentHandler.getConnectorType()); - } - - } else if (argumentHandler.isLaunchedRemotely()) { - - connectToBindServer(classToExecute); - - if (argumentHandler.isAttachingConnector()) { - debugee = remoteLaunchAndAttachDebugee(vmm, classToExecute, classPath); - } else if (argumentHandler.isListeningConnector()) { - debugee = remoteLaunchAndListenDebugee(vmm, classToExecute, classPath); - } else { - throw new TestBug("Unexpected connector type for remote debugee launch mode" - + argumentHandler.getConnectorType()); - } - - } else if (argumentHandler.isLaunchedManually()) { - - if (argumentHandler.isAttachingConnector()) { - debugee = manualLaunchAndAttachDebugee(vmm, classToExecute, classPath); - } else if (argumentHandler.isListeningConnector()) { - debugee = manualLaunchAndListenDebugee(vmm, classToExecute, classPath); - } else { - throw new TestBug("Unexpected connector type for manual debugee launch mode" - + argumentHandler.getConnectorType()); - } - + if (argumentHandler.isDefaultConnector()) { + debugee = localDefaultLaunchDebugee(vmm, classToExecute, classPath); + } else if (argumentHandler.isRawLaunchingConnector()) { + debugee = localRawLaunchDebugee(vmm, classToExecute, classPath); + } else if (argumentHandler.isLaunchingConnector()) { + debugee = localLaunchDebugee(vmm, classToExecute, classPath); + } else if (argumentHandler.isAttachingConnector()) { + debugee = localLaunchAndAttachDebugee(vmm, classToExecute, classPath); + } else if (argumentHandler.isListeningConnector()) { + debugee = localLaunchAndListenDebugee(vmm, classToExecute, classPath); } else { - throw new Failure("Unexpected debugee launching mode: " + argumentHandler.getLaunchMode()); + throw new TestBug("Unexpected connector type for local debugee launch mode" + + argumentHandler.getConnectorType()); } + return debugee; } @@ -486,194 +456,6 @@ private Debugee localLaunchAndListenDebugee (VirtualMachineManager vmm, // -------------------------------------------------- // - /** - * Launch debugee VM remotely via <code>BindServer</code> and connect to it using - * <code>AttachingConnector</code>. - */ - private Debugee remoteLaunchAndAttachDebugee (VirtualMachineManager vmm, - String classToExecute, - String classPath) { - display("Finding connector: " + argumentHandler.getConnectorName() ); - AttachingConnector connector = - (AttachingConnector) findConnector(argumentHandler.getConnectorName(), - vmm.attachingConnectors()); - - Map<java.lang.String,? extends com.sun.jdi.connect.Connector.Argument> arguments = setupAttachingConnector(connector, classToExecute, classPath); - - String address = makeTransportAddress(); - String[] cmdLineArgs = makeCommandLineArgs(classToExecute, address); - String javaCmdLine = makeCommandLineString(classToExecute, address, "\""); - - display("Starting remote java process:\n\t" + javaCmdLine); - Debugee debugee = startRemoteDebugee(cmdLineArgs); - - display("Attaching to debugee"); - VirtualMachine vm; - IOException ioe = null; - for (int i = 0; i < CONNECT_TRIES; i++) { - try { - vm = connector.attach(arguments); - display("Debugee attached"); - debugee.setupVM(vm); - return debugee; - } catch (IOException e) { - display("Attempt #" + i + " to connect to debugee VM failed:\n\t" + e); - ioe = e; - if (debugee.terminated()) { - throw new Failure("Unable to connect to debuggee VM: VM process is terminated"); - } - try { - Thread.currentThread().sleep(CONNECT_TRY_DELAY); - } catch (InterruptedException ie) { - ie.printStackTrace(log.getOutStream()); - throw new Failure("Thread interrupted while pausing connection attempts:\n\t" - + ie); - } - } catch (IllegalConnectorArgumentsException e) { - e.printStackTrace(log.getOutStream()); - throw new TestBug("Wrong connector arguments used to attach to debuggee VM:\n\t" + e); - } - } - throw new Failure("Unable to connect to debugee VM after " + CONNECT_TRIES - + " tries:\n\t" + ioe); - } - - /** - * Launch debugee VM remotely via <code>BindServer</code> and connect to it using - * <code>ListeningConnector</code>. - */ - private Debugee remoteLaunchAndListenDebugee (VirtualMachineManager vmm, - String classToExecute, - String classPath) { - display("Finding connector: " + argumentHandler.getConnectorName() ); - ListeningConnector connector = - (ListeningConnector) findConnector(argumentHandler.getConnectorName(), - vmm.listeningConnectors()); - Map<java.lang.String,? extends com.sun.jdi.connect.Connector.Argument> arguments = setupListeningConnector(connector, classToExecute, classPath); - - String address = null; - try { - display("Listening for connection from debugee"); - address = connector.startListening(arguments); - } catch (IllegalConnectorArgumentsException e) { - e.printStackTrace(log.getOutStream()); - throw new TestBug("Wrong connector arguments used to listen debuggee VM:\n\t" + e); - } catch (IOException e) { - e.printStackTrace(log.getOutStream()); - throw new Failure("Caught exception while starting listening debugee VM:\n\t" + e); - }; - - String[] cmdLineArgs = makeCommandLineArgs(classToExecute, address); - String javaCmdLine = makeCommandLineString(classToExecute, address, "\""); - - display("Starting remote java process:\n\t" + javaCmdLine); - Debugee debugee = startRemoteDebugee(cmdLineArgs); - - display("Waiting for connection from debugee"); - VirtualMachine vm; - IOException ioe = null; - for (int i = 0; i < CONNECT_TRIES; i++) { - try { - vm = connector.accept(arguments); - connector.stopListening(arguments); - display("Debugee attached"); - debugee.setupVM(vm); - return debugee; - } catch (IOException e) { - display("Attempt #" + i + " to listen debugee VM failed:\n\t" + e); - ioe = e; - if (debugee.terminated()) { - throw new Failure("Unable to connect to debuggee VM: VM process is terminated"); - } - try { - Thread.currentThread().sleep(CONNECT_TRY_DELAY); - } catch (InterruptedException ie) { - ie.printStackTrace(log.getOutStream()); - throw new Failure("Thread interrupted while pausing connection attempts:\n\t" - + ie); - } - } catch (IllegalConnectorArgumentsException e) { - e.printStackTrace(log.getOutStream()); - throw new TestBug("Wrong connector arguments used to listen debuggee VM:\n\t" + e); - } - } - throw new Failure("Unable to connect to debugee VM after " + CONNECT_TRIES - + " tries:\n\t" + ioe); - } - - // -------------------------------------------------- // - - /** - * Prompt to manually launch debugee VM and connect to it using - * <code>AttachingConnector</code>. - */ - private Debugee manualLaunchAndAttachDebugee (VirtualMachineManager vmm, - String classToExecute, - String classPath) { - display("Finding connector: " + argumentHandler.getConnectorName() ); - AttachingConnector connector = - (AttachingConnector) findConnector(argumentHandler.getConnectorName(), - vmm.attachingConnectors()); - Map<java.lang.String,? extends com.sun.jdi.connect.Connector.Argument> arguments = setupAttachingConnector(connector, classToExecute, classPath); - - String address = makeTransportAddress(); - String javaCmdLine = makeCommandLineString(classToExecute, address, "\""); - - display("Starting manual java process:\n\t" + javaCmdLine); - ManualLaunchedDebugee debugee = startManualDebugee(javaCmdLine); - - VirtualMachine vm; - try { - display("Attaching to debugee"); - vm = connector.attach(arguments); - } catch (IllegalConnectorArgumentsException e) { - e.printStackTrace(log.getOutStream()); - throw new TestBug("Wrong connector arguments used to attach to debuggee VM:\n\t" + e); - } catch (IOException e) { - e.printStackTrace(log.getOutStream()); - throw new Failure("Caught exception while attaching to debugee VM:\n\t" + e); - }; - display("Debugee attached"); - - debugee.setupVM(vm); - return debugee; - } - - /** - * Prompt to manually launch debugee VM and connect to it using - * <code>ListeningConnector</code>. - */ - private Debugee manualLaunchAndListenDebugee (VirtualMachineManager vmm, - String classToExecute, - String classPath) { - display("Finding connector: " + argumentHandler.getConnectorName() ); - ListeningConnector connector = - (ListeningConnector) findConnector(argumentHandler.getConnectorName(), - vmm.listeningConnectors()); - Map<java.lang.String,? extends com.sun.jdi.connect.Connector.Argument> arguments = setupListeningConnector(connector, classToExecute, classPath); - - VirtualMachine vm; - try { - display("Listening for connection from debugee"); - String address = connector.startListening(arguments); - String javaCmdLine = makeCommandLineString(classToExecute, address, "\""); - display("Starting manual java process:\n\t" + javaCmdLine); - ManualLaunchedDebugee debugee = startManualDebugee(javaCmdLine); - display("Waiting for connection from debugee"); - vm = connector.accept(arguments); - display("Debugee attached"); - connector.stopListening(arguments); - debugee.setupVM(vm); - return debugee; - } catch (IllegalConnectorArgumentsException e) { - e.printStackTrace(log.getOutStream()); - throw new TestBug("Wrong connector arguments used to listen debuggee VM:\n\t" + e); - } catch (IOException e) { - e.printStackTrace(log.getOutStream()); - throw new Failure("Caught exception while listening to debugee VM:\n\t" + e); - } - } - // -------------------------------------------------- // /** @@ -920,33 +702,6 @@ protected Debugee startLocalDebugee(String[] cmdArgs) { return makeLocalDebugee(process); } - /** - * Launch remote debuggee process with specified command line arguments - * and make initial <code>Debugee</code> mirror. - */ - protected RemoteLaunchedDebugee startRemoteDebugee(String[] cmdArgs) { - try { - launchRemoteProcess(cmdArgs); - } catch (IOException e) { - e.printStackTrace(log.getOutStream()); - throw new Failure("Caught exception while launching remote debuggee VM process:\n\t" - + e); - } - - RemoteLaunchedDebugee debugee = new RemoteLaunchedDebugee(this); - return debugee; - } - - /** - * Launch manual debuggee process with specified command line arguments - * and make initial <code>Debugee</code> mirror. - */ - protected ManualLaunchedDebugee startManualDebugee(String cmd) { - ManualLaunchedDebugee debugee = new ManualLaunchedDebugee(this); - debugee.launchDebugee(cmd); - return debugee; - } - public static String readVMStartExceptionOutput(VMStartException e, PrintStream log) { StringBuffer msg = new StringBuffer(); try (InputStream is = e.process().getInputStream()) { @@ -995,287 +750,4 @@ private static byte[] readAllBytes(InputStream is) throws IOException { return (capacity == nread) ? buf : Arrays.copyOf(buf, nread); } -} - - -/** - * Mirror of locally launched debugee. - */ -final class LocalLaunchedDebugee extends Debugee { - - /** Enwrap the locally started VM process. */ - public LocalLaunchedDebugee (Process process, Binder binder) { - super(binder); - this.process = process; - checkTermination = true; - } - - // ---------------------------------------------- // - - /** Return exit status of the debugee VM. */ - public int getStatus () { - return process.exitValue(); - } - - /** Check whether the debugee VM has been terminated. */ - public boolean terminated () { - if (process == null) - return true; - - try { - int value = process.exitValue(); - return true; - } catch (IllegalThreadStateException e) { - return false; - } - } - - // ---------------------------------------------- // - - /** Kill the debugee VM. */ - protected void killDebugee () { - super.killDebugee(); - if (!terminated()) { - log.display("Killing debugee VM process"); - process.destroy(); - } - } - - /** Wait until the debugee VM shutdown or crash. */ - protected int waitForDebugee () throws InterruptedException { - int code = process.waitFor(); - return code; - } - - /** Get a pipe to write to the debugee's stdin stream. */ - protected OutputStream getInPipe () { - return process.getOutputStream(); - } - - /** Get a pipe to read the debugee's stdout stream. */ - protected InputStream getOutPipe () { - return process.getInputStream(); - } - - /** Get a pipe to read the debugee's stderr stream. */ - protected InputStream getErrPipe () { - return process.getErrorStream(); - } -} - - -/** - * Mirror of remotely launched debugee. - */ -final class RemoteLaunchedDebugee extends Debugee { - - /** Enwrap the remotely started VM process. */ - public RemoteLaunchedDebugee (Binder binder) { - super(binder); - } - - // ---------------------------------------------- // - - /** Return exit status of the debugee VM. */ - public int getStatus () { - return binder.getRemoteProcessStatus(); - } - - /** Check whether the debugee VM has been terminated. */ - public boolean terminated () { - return binder.isRemoteProcessTerminated(); - } - - // ---------------------------------------------- // - - /** Kill the debugee VM. */ - protected void killDebugee () { - super.killDebugee(); - if (!terminated()) { - binder.killRemoteProcess(); - } - } - - /** Wait until the debugee VM shutdown or crash. */ - protected int waitForDebugee () { - return binder.waitForRemoteProcess(); - } - - /** Get a pipe to write to the debugee's stdin stream. */ - protected OutputStream getInPipe () { - return null; - } - - /** Get a pipe to read the debugee's stdout stream. */ - protected InputStream getOutPipe () { - return null; - } - - /** Get a pipe to read the debugee's stderr stream. */ - protected InputStream getErrPipe () { - return null; - } - - public void redirectStdout(OutputStream out) { - } - - public void redirectStdout(Log log, String prefix) { - } - - public void redirectStderr(OutputStream out) { - } - - public void redirectStderr(Log log, String prefix) { - } -} - - -/** - * Mirror of manually launched debugee. - */ -final class ManualLaunchedDebugee extends Debugee { - /** Enwrap the manually started VM process. */ - public ManualLaunchedDebugee (Binder binder) { - super(binder); - makeInputReader(); - } - - // ---------------------------------------------- // - - private int exitCode = 0; - private boolean finished = false; - private static BufferedReader bin = null; - - public void launchDebugee(String commandLine) { - makeInputReader(); - - putMessage("Launch target VM using such command line:\n" - + commandLine); - String answer = askQuestion("Has the VM successfully started? (yes/no)", "yes"); - for ( ; ; ) { - if (answer.equals("yes")) - break; - if (answer.equals("no")) - throw new Failure ("Unable to manually launch debugee VM"); - answer = askQuestion("Wrong answer. Please type yes or no", "yes"); - } - } - - private static void makeInputReader() { - if (bin == null) { - bin = new BufferedReader(new InputStreamReader(System.in)); - } - } - - private static void destroyInputReader() { - if (bin != null) { - try { - bin.close(); - } catch (IOException e) { -// e.printStackTrace(log.getOutStream()); - throw new Failure("Caught exception while closing input stream:\n\t" + e); - } - bin = null; - } - } - - private static void putMessage(String msg) { - System.out.println("\n>>> " + msg); - } - - private static String askQuestion(String question, String defaultAnswer) { - try { - System.out.print("\n>>> " + question); - System.out.print(" [" + defaultAnswer + "] "); - System.out.flush(); - String answer = bin.readLine(); - if (answer.equals("")) - return defaultAnswer; - return answer; - } catch (IOException e) { -// e.printStackTrace(log.getOutStream()); - throw new Failure("Caught exception while reading answer:\n\t" + e); - } - } - - /** Return exit status of the debugee VM. */ - public int getStatus () { - if (! finished) { - throw new Failure("Unable to get status of debugee VM: process still alive"); - } - return exitCode; - } - - /** Check whether the debugee VM has been terminated. */ - public boolean terminated () { - return finished; - } - - // ---------------------------------------------- // - - /** Kill the debugee VM. */ - protected void killDebugee () { - super.killDebugee(); - if (!terminated()) { - putMessage("Kill launched VM"); - String answer = askQuestion("Has the VM successfully terminated? (yes/no)", "yes"); - for ( ; ; ) { - if (answer.equals("yes")) { - finished = true; - break; - } - if (answer.equals("no")) - throw new Failure ("Unable to manually kill debugee VM"); - answer = askQuestion("Wrong answer. Please type yes or no", "yes"); - } - } - } - - /** Wait until the debugee VM shutdown or crash. */ - protected int waitForDebugee () { - putMessage("Wait for launched VM to exit."); - String answer = askQuestion("What is VM exit code?", "95"); - for ( ; ; ) { - try { - exitCode = Integer.parseInt(answer); - break; - } catch (NumberFormatException e) { - answer = askQuestion("Wrong answer. Please type integer value", "95"); - } - } - finished = true; - return exitCode; - } - - /** Get a pipe to write to the debugee's stdin stream. */ - protected OutputStream getInPipe () { - return null; - } - - /** Get a pipe to read the debugee's stdout stream. */ - protected InputStream getOutPipe () { - return null; - } - - /** Get a pipe to read the debugee's stderr stream. */ - protected InputStream getErrPipe () { - return null; - } - - public void redirectStdout(OutputStream out) { - } - - public void redirectStdout(Log log, String prefix) { - } - - public void redirectStderr(OutputStream out) { - } - - public void redirectStderr(Log log, String prefix) { - } - - public void close() { - destroyInputReader(); - super.close(); - } -} +} \ No newline at end of file diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java index dd6c8a1b82ddd..6b4f65bc625ab 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,7 +47,7 @@ * @see Binder * @see DebugeeProcess */ -abstract public class Debugee extends DebugeeProcess { +public class Debugee extends DebugeeProcess { /** * Mirror of the debugee VM. This must be initialized by every @@ -68,6 +68,13 @@ protected Debugee (Binder binder) { this.argumentHandler = (ArgumentHandler)binder.getArgumentHandler(); } + protected Debugee (Process process, Binder binder) { + super(binder); + this.process = process; + this.binder = binder; + this.argumentHandler = (ArgumentHandler)binder.getArgumentHandler(); + } + /** Setup <code>Debugee</code> object with given VM mirror. */ public void setupVM(VirtualMachine vm) { if (this.vm != null) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Binder.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Binder.java index 698ac2cbe8908..0a15c23b004a4 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Binder.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Binder.java @@ -98,13 +98,8 @@ public Debugee bindToDebugee (String classToExecute) { prepareForPipeConnection(argumentHandler); - if (argumentHandler.isLaunchedRemotely()) { - connectToBindServer(classToExecute); - debugee = launchDebugee(classToExecute); - } else { - debugee = launchDebugee(classToExecute); - debugee.redirectOutput(log); - } + debugee = launchDebugee(classToExecute); + debugee.redirectOutput(log); Transport transport = debugee.connect(); @@ -117,334 +112,16 @@ public Debugee bindToDebugee (String classToExecute) { public Debugee launchDebugee (String classToExecute) { try { - - if (argumentHandler.isLaunchedLocally()) { - LocalLaunchedDebugee debugee = new LocalLaunchedDebugee(this); - String address = debugee.prepareTransport(argumentHandler); - if (address == null) - address = makeTransportAddress(); - String[] argsArray = makeCommandLineArgs(classToExecute, address); - debugee.launch(argsArray); - return debugee; - } - - if (argumentHandler.isLaunchedRemotely()) { - RemoteLaunchedDebugee debugee = new RemoteLaunchedDebugee(this); - String address = debugee.prepareTransport(argumentHandler); - if (address == null) - address = makeTransportAddress(); - String[] argsArray = makeCommandLineArgs(classToExecute, address); - debugee.launch(argsArray); - return debugee; - } - - if (argumentHandler.isLaunchedManually()) { - ManualLaunchedDebugee debugee = new ManualLaunchedDebugee(this); - String address = debugee.prepareTransport(argumentHandler); - if (address == null) - address = makeTransportAddress(); - String cmdLine = makeCommandLineString(classToExecute, address, "\""); - debugee.launch(cmdLine); - return debugee; - } - - throw new TestBug("Unexpected launching mode: " - + argumentHandler.getLaunchMode()); + Debugee debugee = new Debugee(this); + String address = debugee.prepareTransport(argumentHandler); + if (address == null) + address = makeTransportAddress(); + String[] argsArray = makeCommandLineArgs(classToExecute, address); + debugee.launch(argsArray); + return debugee; } catch (IOException e) { e.printStackTrace(log.getOutStream()); throw new Failure("Caught exception while launching debugee:\n\t" + e); } } - -} - -/** - * Mirror of locally launched debugee. - */ -final class LocalLaunchedDebugee extends Debugee { - - /** Enwrap the existing <code>VM</code> mirror. */ - public LocalLaunchedDebugee (Binder binder) { - super(binder); - checkTermination = true; - } - - // ---------------------------------------------- // - - public void launch(String[] args) throws IOException { - String cmdLine = ArgumentHandler.joinArguments(args, "\""); - display("Starting java process:\n" + cmdLine); - process = binder.launchProcess(args); - } - - /** Return exit status of the debugee VM. */ - public int getStatus () { - return process.exitValue(); - } - - /** Check whether the debugee VM has been terminated. */ - public boolean terminated () { - if (process == null) - return true; - - try { - int value = process.exitValue(); - return true; - } catch (IllegalThreadStateException e) { - return false; - } - } - - // ---------------------------------------------- // - - /** Kill the debugee VM. */ - protected void killDebugee () { - super.killDebugee(); - if (!terminated()) { - log.display("Killing debugee VM process"); - process.destroy(); - } - } - - /** Wait until the debugee VM shutdown or crash. */ - protected int waitForDebugee () throws InterruptedException { - return process.waitFor(); - } - - /** Get a pipe to write to the debugee's stdin stream. */ - protected OutputStream getInPipe () { - return process.getOutputStream(); - } - - /** Get a pipe to read the debugee's stdout stream. */ - protected InputStream getOutPipe () { - return process.getInputStream(); - } - - /** Get a pipe to read the debugee's stderr stream. */ - protected InputStream getErrPipe () { - return process.getErrorStream(); - } -} - - -/** - * Mirror of remotely launched debugee. - */ -final class RemoteLaunchedDebugee extends Debugee { - - /** Enwrap the existing <code>VM</code> mirror. */ - public RemoteLaunchedDebugee (Binder binder) { - super(binder); - } - - // ---------------------------------------------- // - - public void launch(String[] args) throws IOException { - String cmdLine = ArgumentHandler.joinArguments(args, "\""); - display("Starting remote java process:\n" + cmdLine); - binder.launchRemoteProcess(args); - } - - /** Return exit status of the debugee VM. */ - public int getStatus () { - return binder.getRemoteProcessStatus(); - } - - /** Check whether the debugee VM has been terminated. */ - public boolean terminated () { - return binder.isRemoteProcessTerminated(); - } - - // ---------------------------------------------- // - - /** Kill the debugee VM. */ - protected void killDebugee () { - super.killDebugee(); - if (!terminated()) { - log.display("Killing debugee VM process"); - binder.killRemoteProcess(); - } - } - - /** Wait until the debugee VM shutdown or crash. */ - protected int waitForDebugee () { - return binder.waitForRemoteProcess(); - } - - /** Get a pipe to write to the debugee's stdin stream. */ - protected OutputStream getInPipe () { - return null; - } - - /** Get a pipe to read the debugee's stdout stream. */ - protected InputStream getOutPipe () { - return null; - } - - /** Get a pipe to read the debugee's stderr stream. */ - protected InputStream getErrPipe () { - return null; - } - - public void redirectStdout(OutputStream out) { - } - - public void redirectStdout(Log log, String prefix) { - } - - public void redirectStderr(OutputStream out) { - } - - public void redirectStderr(Log log, String prefix) { - } -} - - -/** - * Mirror of manually launched debugee. - */ -final class ManualLaunchedDebugee extends Debugee { - - private int exitCode = 0; - private boolean finished = false; - private static BufferedReader bin = new BufferedReader(new InputStreamReader(System.in)); - - /** Enwrap the existing <code>VM</code> mirror. */ - public ManualLaunchedDebugee (Binder binder) { - super(binder); - } - - // ---------------------------------------------- // - - public void launch(String commandLine) throws IOException { - putMessage("Launch target VM using such command line:\n" - + commandLine); - String answer = askQuestion("Has the VM successfully started? (yes/no)", "yes"); - for ( ; ; ) { - if (answer.equals("yes")) - break; - if (answer.equals("no")) - throw new Failure ("Unable to manually launch debugee VM"); - answer = askQuestion("Wrong answer. Please type yes or no", "yes"); - } - } - - private void putMessage(String msg) { - System.out.println("\n>>> " + msg); - } - - private String askQuestion(String question, String defaultAnswer) { - try { - System.out.print("\n>>> " + question); - System.out.print(" [" + defaultAnswer + "] "); - System.out.flush(); - String answer = bin.readLine(); - if (answer.equals("")) - return defaultAnswer; - return answer; - } catch (IOException e) { - e.printStackTrace(log.getOutStream()); - throw new Failure("Caught exception while reading answer:\n\t" + e); - } - } - - /** Return exit status of the debugee VM. */ - public int getStatus () { - if (! terminated()) { - throw new Failure("Unable to get status of debugee VM: process still alive"); - } - return exitCode; - } - - /** Check whether the debugee VM has been terminated. */ - public boolean terminated () { - if(! finished) { - String answer = askQuestion("Has the VM exited?", "no"); - for ( ; ; ) { - if (answer.equals("no")) - return false; - if (answer.equals("yes")) { - finished = true; - waitForDebugee(); - break; - } - answer = askQuestion("Wrong answer. Please type yes or no", "yes"); - } - } - return finished; - } - - // ---------------------------------------------- // - - /** Kill the debugee VM. */ - protected void killDebugee () { - super.killDebugee(); - if (!terminated()) { - putMessage("Kill launched VM"); - String answer = askQuestion("Has the VM successfully terminated? (yes/no)", "yes"); - for ( ; ; ) { - if (answer.equals("yes")) { - finished = true; - break; - } - if (answer.equals("no")) - throw new Failure ("Unable to manually kill debugee VM"); - answer = askQuestion("Wrong answer. Please type yes or no", "yes"); - } - } - } - - /** Wait until the debugee VM shutdown or crash. */ - protected int waitForDebugee () { - putMessage("Wait for launched VM to exit."); - String answer = askQuestion("What is VM exit code?", "95"); - for ( ; ; ) { - try { - exitCode = Integer.parseInt(answer); - break; - } catch (NumberFormatException e) { - answer = askQuestion("Wrong answer. Please type integer value", "95"); - } - } - finished = true; - return exitCode; - } - - /** Get a pipe to write to the debugee's stdin stream. */ - protected OutputStream getInPipe () { - return null; - } - - /** Get a pipe to read the debugee's stdout stream. */ - protected InputStream getOutPipe () { - return null; - } - - /** Get a pipe to read the debugee's stderr stream. */ - protected InputStream getErrPipe () { - return null; - } - - public void redirectStdout(OutputStream out) { - } - - public void redirectStdout(Log log, String prefix) { - } - - public void redirectStderr(OutputStream out) { - } - - public void redirectStderr(Log log, String prefix) { - } - - public void close() { - try { - bin.close(); - } catch (IOException e) { - log.display("WARNING: Caught IOException while closing InputStream"); - } - bin = null; - super.close(); - } -} +} \ No newline at end of file diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Debugee.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Debugee.java index ba1b4129cc796..ef95ee885604c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Debugee.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Debugee.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,7 @@ * @see Transport * @see DebugeeProcess */ -abstract public class Debugee extends DebugeeProcess { +public class Debugee extends DebugeeProcess { /** Binder that creates this debugee. */ protected Binder binder = null; @@ -63,6 +63,12 @@ protected Debugee (Binder binder) { prefix = "Debugee> "; } + public void launch(String[] args) throws IOException { + String cmdLine = ArgumentHandler.joinArguments(args, "\""); + display("Starting java process:\n" + cmdLine); + process = binder.launchProcess(args); + } + /** Return <code>Binder</code> of the debugee object. */ public Binder getBinder() { return binder; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeArgumentHandler.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeArgumentHandler.java index 98f11a426eaa5..72461a5230994 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeArgumentHandler.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeArgumentHandler.java @@ -57,8 +57,6 @@ * (this works only with <code>-connector=listening</code> and <code>-transport=socket</code>) * <li> <code>-debugee.suspend=[yes|no|default]</code> - * should debugee start in suspend mode or not - * <li> <code>-debugee.launch=[local|remote|manual]</code> - - * launch and bind to debugee VM locally, remotely (via BindSever) or manually * <li> <code>-debugee.vmhome=</code><<i>path</i>> - * path to JDK used for launching debugee VM * <li> <code>-debugee.vmkind=</code><<i>name</i>> - @@ -275,11 +273,8 @@ public boolean isDefaultDebugeeSuspendMode() { * @see #isDefaultDebugeeSuspendMode() */ public boolean willDebugeeSuspended() { - if (isLaunchedLocally()) { - String mode = getDebugeeSuspendMode(); - return mode.equals("no"); - } - return true; + String mode = getDebugeeSuspendMode(); + return mode.equals("no"); } private boolean pipePortInited = false; @@ -337,54 +332,6 @@ public void setPipePortNumber(int port) { setOption("-", "pipe.port", value); } - /** - * Return debugee VM launching mode, specified by - * <code>-launch.mode</code> command line option, or - * "<i>local</i>" string by default. - * - * Possible values for this option are: - * <ul> - * <li> "<code>local</code>" - * <li> "<code>remote</code>" - * <li> "<code>manual</code>" - * </ul> - * - * @see #isLaunchedLocally() - * @see #isLaunchedRemotely() - * @see #isLaunchedManually() - * @see #setRawArguments(String[]) - */ - public String getLaunchMode() { - return options.getProperty("debugee.launch", "local"); - } - - /** - * Return <i>true</i> if debugee should be launched locally. - * - * @see #getLaunchMode() - */ - public boolean isLaunchedLocally() { - return getLaunchMode().equals("local"); - } - - /** - * Return <i>true</i> if debugee should be launched remotely via - * BindServer. - * - * @see #getLaunchMode() - */ - public boolean isLaunchedRemotely() { - return getLaunchMode().equals("remote"); - } - - /** - * Return <i>true</i> if debugee should be launched manually by user. - * - * @see #getLaunchMode() - */ - public boolean isLaunchedManually() { - return getLaunchMode().equals("manual"); - } /** * Return additional options for launching debugee VM, specified by @@ -710,9 +657,7 @@ protected boolean checkOption(String option, String value) { } // option with any nonempty string value - if (option.equals("test.host") - || option.equals("debugee.host") - || option.equals("debugee.vmkind") + if (option.equals("debugee.vmkind") || option.equals("debugee.vmhome") || option.equals("transport.shname")) { if (value.length() <= 0) { @@ -748,14 +693,10 @@ protected boolean checkOption(String option, String value) { return true; } - if (option.equals("debugee.launch")) { - if ((!value.equals("local")) - && (!value.equals("remote")) - && (!value.equals("manual"))) { - throw new BadOption(option + ": must be one of: " - + "local, remote, manual " + value); - } - return true; + if (option.equals("debugee.launch") + || option.equals("debugee.host") + || option.equals("test.host")) { + throw new RuntimeException("option " + option + " is not supported."); } if (option.equals("jvmdi.strict")) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java index e3071e5cef0e4..d36c9d9624f20 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java @@ -35,15 +35,6 @@ * debuggee VM and to make connection to it using JDI connector or * JDWP transport. * <p> - * The present version of <code>Binder</code> allows - * to launch debuggee VM either on local machine (<i>local</i> launch mode), - * or on remote host using <code>BindServer</code> utility - * (<i>remote</i> launch mode). Also there is an ability to launch - * debuggee VM manually as a separate process on local or remote machine - * (<i>manual</i> launch mode), which is usefull for debugging. - * All these launching modes are specified by command line option - * <code>-debugee.launch</code> recognized by <code>DebugeeArgumentHandler</code>. - * <p> * <code>Binder</code> also makes it possible to establish TCP/IP * connection between debugger and debuggee throw <code>IOPipe</code> * object. This connection allows debugger to communicate with debuggee @@ -105,8 +96,6 @@ public static String getVersion () { } // -------------------------------------------------- // - - private BindServerListener bindServerListener = null; private ServerSocket pipeServerSocket = null; // -------------------------------------------------- // @@ -386,356 +375,12 @@ public String[] makeCommandLineArgs(String classToExecute) { return makeCommandLineArgs(classToExecute, makeTransportAddress()); } - /** - * Make connection to remote BindServer and start BindServerListener thread. - * - * @throws IOException if I/O error occured while connecting - */ - public void connectToBindServer(String taskID) { - if (bindServerListener != null) { - throw new Failure("Connection to BindServer already exists"); - } - try { - bindServerListener = new BindServerListener(this); - bindServerListener.setDaemon(true); - bindServerListener.connect(taskID); - bindServerListener.start(); - } catch (IOException e) { - e.printStackTrace(getOutStream()); - throw new Failure("Caught exception while connecting to BindServer:\n\t" + e); - } - } - - /** - * Split string into list of substrings using specified separator. - */ - private static String[] splitString(String givenString, String separator) { - Vector<String> tmpList = new Vector<String>(); - StringTokenizer tokenizer = new StringTokenizer(givenString, separator); - while(tokenizer.hasMoreTokens()) { - tmpList.add(tokenizer.nextToken()); - } - String[] list = new String[tmpList.size()]; - for (int i = 0; i < tmpList.size(); i++) { - list[i] = tmpList.elementAt(i); - } - return list; - } - - /** - * Send command to remote <code>BindServer</code> and receive reply. - * - * @throws IOException if I/O error occured while launching process - */ - public synchronized Object sendRemoteCommand(Object command) { - try { - bindServerListener.sendCommand(command); - Object reply = bindServerListener.getReply(); - return reply; - } catch (IOException e) { - e.printStackTrace(log.getOutStream()); - throw new Failure("Unexpected exception while sending command to BindServer:\n\t" - + e); - } - } - - /** - * Launch remote process using request to <code>BindServer</code>. - * - * @throws IOException if I/O error occured - */ - public void launchRemoteProcess(String[] args) throws IOException { - String pathSeparator = System.getProperty("path.separator"); - BindServer.LaunchDebugee command = - new BindServer.LaunchDebugee(args, - System.getProperty("file.separator"), - System.getProperty("user.dir"), - splitString(System.getProperty("java.library.path"), pathSeparator), - splitString(System.getProperty("java.class.path"), pathSeparator), - splitString(System.getProperty("java.library.path"), pathSeparator)); - - Object reply = sendRemoteCommand(command); - if (reply instanceof BindServer.OK) { - // do nothing - } else if (reply instanceof BindServer.RequestFailed) { - BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply; - throw new Failure("BindServer error: " + castedReply.reason); - } else { - throw new Failure("Wrong reply from BindServer: " + reply); - } - } - - /** - * Return exit status of the remotely launched process - * using request to <code>BindServer</code>. - */ - public int getRemoteProcessStatus () { - Object reply = sendRemoteCommand(new BindServer.DebugeeExitCode()); - if (reply instanceof BindServer.OK) { - BindServer.OK castedReply = (BindServer.OK)reply; - return (int)castedReply.info; - } else if (reply instanceof BindServer.CaughtException) { - BindServer.CaughtException castedReply = (BindServer.CaughtException)reply; - throw new IllegalThreadStateException(castedReply.reason); - } else if (reply instanceof BindServer.RequestFailed) { - BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply; - throw new Failure("BindServer error: " + castedReply.reason); - } else { - throw new Failure("Wrong reply from BindServer: " + reply); - } - } - - /** - * Check whether the remotely launched process has been terminated - * using request to <code>BindServer</code>. - */ - public boolean isRemoteProcessTerminated () { - try { - int value = getRemoteProcessStatus(); - return true; - } catch (IllegalThreadStateException e) { - return false; - } - } - - // ---------------------------------------------- // - - /** - * Kill the remotely launched process - * using request to <code>BindServer</code>. - */ - public void killRemoteProcess () { - Object reply = sendRemoteCommand(new BindServer.KillDebugee()); - if (reply instanceof BindServer.OK) { - return; - } else if (reply instanceof BindServer.RequestFailed) { - BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply; - throw new Failure("BindServer error: " + castedReply.reason); - } else { - throw new Failure("Wrong reply from BindServer: " + reply); - } - } - - /** - * Wait until the remotely launched process exits or crashes - * using request to <code>BindServer</code>. - */ - public int waitForRemoteProcess () { - - Object reply = sendRemoteCommand(new BindServer.WaitForDebugee(0)); - if (reply instanceof BindServer.OK) { - BindServer.OK castedReply = (BindServer.OK)reply; - return (int)castedReply.info; - } else if (reply instanceof BindServer.RequestFailed) { - BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply; - throw new Failure("BindServer error: " + castedReply.reason); - } else { - throw new Failure("Wrong reply from BindServer: " + reply); - } - } /** * Close binder by closing all started threads. */ public void close() { - if (bindServerListener != null) { - bindServerListener.close(); - } closePipeServerSocket(); } - /** - * Separate thread for listening connection from <code>BindServer</code>. - */ - private class BindServerListener extends Thread { - private SocketConnection connection = null; - private Log.Logger logger = null; - - /** List of received responses from <code>BindServer</code>. */ - private LinkedList<BindServer.Response> replies = new LinkedList<BindServer.Response>(); - - /** - * Make thread. - */ - public BindServerListener(Log.Logger logger) { - this.logger = logger; - } - - /** - * Establish connection to <code>BindServer</code>. - */ - public void connect(String taskID) throws IOException { - String host = argumentHandler.getDebugeeHost(); - int port = argumentHandler.getBindPortNumber(); - display("Connecting to BindServer: " + host + ":" + port); - connection = new SocketConnection(logger, "BindServer"); -// connection.setPingTimeout(DebugeeBinder.PING_TIMEOUT); - connection.attach(host, port); - handshake(taskID); - } - - /** - * Receive OK(version) from BindServer and check received version number. - */ - private void handshake(String taskID) { - // receive OK(version) - trace(TRACE_LEVEL_ACTIONS, "Waiting for initial OK(version) from BindServer"); - Object reply = connection.readObject(); - trace(TRACE_LEVEL_ACTIONS, "Got initial OK(version) from BindServer: " + reply); - if (reply instanceof BindServer.RequestFailed) { - BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply; - trace(TRACE_LEVEL_ACTIONS, "Reply is RequestFailed: throw Failure"); - throw new Failure("BindServer error: " + castedReply.reason); - } else if (reply instanceof BindServer.OK) { - BindServer.OK castedReply = (BindServer.OK)reply; - trace(TRACE_LEVEL_ACTIONS, "Reply is OK: check BindServer version"); - if (castedReply.info != BindServer.VERSION) { - throw new Failure("Wrong version of BindServer: " + castedReply.info - + " (expected: " + BindServer.VERSION + ")"); - } - display("Connected to BindServer: version " + castedReply.info); - } else { - trace(TRACE_LEVEL_ACTIONS, "Reply is unknown: throw Failure"); - throw new Failure("Wrong reply from BindServer: " + reply); - } - - // send TaskID(id) - try { - trace(TRACE_LEVEL_ACTIONS, "Sending TaskID(id) to BindServer"); - sendCommand(new BindServer.TaskID(taskID)); - trace(TRACE_LEVEL_ACTIONS, "Sent TaskID(id) to BindServer"); - } catch (IOException e) { - throw new Failure("Caught IOException while sending TaskID(id) to BindServer:\n\t" - + e); - } - } - - /** - * Check if thread is connected to <code>BindServer</code>. - */ - public boolean isConnected() { - return (connection != null && connection.isConnected()); - } - - /** - * Send a command to </code>BindServer</code>. - */ - public synchronized void sendCommand(Object command) throws IOException { - connection.writeObject(command); - } - - /** - * Receive response from <code>BindServer</code>. - */ - public Object getReply() { - synchronized (replies) { - while (replies.isEmpty()) { - if (!isConnected()) { - throw new Failure("No reply from BindServer: connection lost"); - } - try { - replies.wait(TRY_DELAY); - } catch (InterruptedException e) { - e.printStackTrace(getOutStream()); - throw new Failure("Thread interrupted while waiting for reply from BindServer:\n\t" - + e); - } - } - Object reply = replies.removeFirst(); - if (reply == null) { - throw new Failure("No reply from BindServer: connection lost"); - } - return reply; - } - } - - /** - * Add response object to the list of received responses. - */ - private void addReply(BindServer.Response reply) { - synchronized (replies) { - replies.add(reply); - replies.notifyAll(); - } - } - - /** - * Read packets from <code>BindServer<code> connection and - * notify waiting thread if response or IOPipe message received. - * Received lines of redirected streams are put into log. - */ - public void run() { - trace(TRACE_LEVEL_THREADS, "BindServerListener thread started"); - try { - for (;;) { - Object reply = connection.readObject(); - if (reply == null) { - break; - } else if (reply instanceof BindServer.Disconnect) { - reply = null; - trace(TRACE_LEVEL_ACTIONS, "Packet is Disconnect: close connection"); - break; - } else if (reply instanceof BindServer.RedirectedStream) { - BindServer.RedirectedStream castedReply = (BindServer.RedirectedStream)reply; - trace(TRACE_LEVEL_ACTIONS, "Packet is RedirectedStream: put message into log"); - log.println(castedReply.line); - } else if (reply instanceof BindServer.Response) { - BindServer.Response castedReply = (BindServer.Response)reply; - trace(TRACE_LEVEL_ACTIONS, "Packet is reply: notify all threads waiting for reply"); - addReply(castedReply); - } else { - trace(TRACE_LEVEL_ACTIONS, "Packet is unknown: throw Failure"); - throw new Failure("Wrong reply from BindServer: " + reply); - } - } - } catch (Exception e) { - e.printStackTrace(getOutStream()); - complain("Caught exception while reading packets from BindServer:\n\t" + e); - } finally { - closeConnection(); - addReply(null); - trace(TRACE_LEVEL_THREADS, "BindServerListener thread finished"); - } - } - - /** - * Send Disconnect command to </code>BindServer</code>. - */ - public void disconnect() { - if (connection == null) return; - try { - sendCommand(new BindServer.Disconnect()); - } catch (IOException e) { - display("Caught IOException while requesting disconnection with BindServer"); - } - } - - /** - * Close socket connection. - */ - public void closeConnection() { - if (connection != null) { - connection.close(); - } - } - - /** - * Wait for thread finished in the specified timeout or interrupt it. - */ - public void waitForThread(long millis) { - DebugeeBinder.waitForThread(this, millis, logger); - } - - /** - * Close this thread by waiting for it finishes or interrupt it - * and close socket connection. - */ - public void close() { - disconnect(); - waitForThread(DebugeeBinder.THREAD_TIMEOUT); - closeConnection(); - } - - } // BindServerListener - } // DebugeeBinder diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeProcess.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeProcess.java index 6eb1f32766075..b875911e973d9 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeProcess.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeProcess.java @@ -74,8 +74,8 @@ abstract public class DebugeeProcess { /** Argument handler from binder. */ protected DebugeeArgumentHandler argumentHandler = null; - /** Need or not to check debuggee process termination at exit. */ - protected boolean checkTermination = false; + /** Need or not to check debuggee process termination. */ + private boolean checkTermination = true; /** Debugee VM process or <i>null</i> if not available. */ protected Process process = null; @@ -164,26 +164,50 @@ public void sendSignal(String signal) { // --------------------------------------------------- // /** Wait until the debugee VM shutdown or crash. */ - abstract protected int waitForDebugee () throws InterruptedException; + protected int waitForDebugee() throws InterruptedException { + return process.waitFor(); + } /** Kill the debugee VM. */ - abstract protected void killDebugee (); + protected void killDebugee() { + if (!terminated()) { + log.display("Killing debugee VM process"); + process.destroy(); + } + } /** Check whether the debugee VM has been terminated. */ - abstract public boolean terminated (); + public boolean terminated() { + if (process == null) + return true; + + try { + int value = process.exitValue(); + return true; + } catch (IllegalThreadStateException e) { + return false; + } + } /** Return the debugee VM exit status. */ - abstract public int getStatus (); + public int getStatus() { + return process.exitValue(); + } /** Get a pipe to write to the debugee's stdin stream. */ - abstract protected OutputStream getInPipe (); + protected OutputStream getInPipe() { + return process.getOutputStream(); + } /** Get a pipe to read the debugee's stdout stream. */ - abstract protected InputStream getOutPipe (); + protected InputStream getOutPipe() { + return process.getInputStream(); + } /** Get a pipe to read the debugee's stderr stream. */ - abstract protected InputStream getErrPipe (); - + protected InputStream getErrPipe() { + return process.getErrorStream(); + } // --------------------------------------------------- // /** From a81e1bf1e1a6f00280b9be987c03fe20915fd52c Mon Sep 17 00:00:00 2001 From: Leonid Mesnik <lmesnik@openjdk.org> Date: Thu, 20 Jun 2024 15:43:56 +0000 Subject: [PATCH 126/471] 8332252: Clean up vmTestbase/vm/share Reviewed-by: cjplummer --- .../gc/gctests/LoadUnloadGC/LoadUnloadGC.java | 6 +- .../LoadUnloadGC}/MemoryPoolFinder.java | 6 +- .../metaspace/gc/HighWaterMarkTest.java | 3 +- .../share}/HeapOOMEException.java | 2 +- .../TriggerUnloadingByFillingMetaspace.java | 2 +- .../share}/TriggerUnloadingHelper.java | 2 +- .../share}/TriggerUnloadingWithWhiteBox.java | 2 +- .../staticReferences/StaticReferences.java | 8 +- .../common/PerformChecksHelper.java | 6 +- .../common/StressHierarchyBaseClass.java | 9 +- .../hotswap/HS203/hs203t004/hs203t004.java | 11 +- .../complog/share/LogCompilationTest.java | 3 +- .../complog/share}/ProcessExecutor.java | 13 +- .../complog/share}/StreamListener.java | 2 +- .../complog/share}/StreamLogger.java | 2 +- .../complog/share}/StreamReader.java | 2 +- .../hiddenloader/func/findByName/Test.java | 4 +- .../share/StressClassLoadingTest.java | 23 +- .../stress/byteMutation/Test.java | 4 +- .../hiddenloader/stress/oome/heap/Test.java | 4 +- .../stress/oome/metaspace/Test.java | 4 +- .../stress/parallelLoad/Test.java | 4 +- .../indy/stress/gc/lotsOfCallSites/Test.java | 8 +- .../vm/mlvm/share/CustomClassLoaders.java | 4 +- .../vm/{ => mlvm}/share/FileUtils.java | 2 +- .../vm/mlvm/share/MlvmTestExecutor.java | 21 +- .../vm/share/CommentedFileReader.java | 119 ----------- .../vmTestbase/vm/share/ProcessUtils.cpp | 201 ------------------ .../vmTestbase/vm/share/ProcessUtils.java | 65 +----- .../jtreg/vmTestbase/vm/share/RandomEx.java | 92 -------- .../vmTestbase/vm/share/StringUtils.java | 89 -------- .../vmTestbase/vm/share/UnsafeAccess.java | 42 ---- .../vm/share/VMRuntimeEnvUtils.java | 108 ---------- .../monitoring/data/MemoryManagerData.java | 61 ------ .../share/monitoring/data/MemoryPoolData.java | 59 ----- .../monitoring/data/MemoryUsageData.java | 82 ------- .../vm/share/process/CmdExecutor.java | 63 ------ .../vm/share/process/MessageInput.java | 37 ---- .../vm/share/process/MessageOutput.java | 29 --- .../vm/share/process/ProcessHandler.java | 102 --------- .../vm/share/process/StreamMessageInput.java | 187 ---------------- .../vm/share/process/StreamMessageOutput.java | 56 ----- .../AbstractClassFileTransformer.java | 44 ---- .../share/transform/AnnotationAppender.java | 62 ------ .../transform/TransformingClassLoader.java | 61 ------ 45 files changed, 74 insertions(+), 1642 deletions(-) rename test/hotspot/jtreg/vmTestbase/{vm/share/monitoring => gc/gctests/LoadUnloadGC}/MemoryPoolFinder.java (95%) rename test/hotspot/jtreg/vmTestbase/{vm/share/gc => metaspace/share}/HeapOOMEException.java (98%) rename test/hotspot/jtreg/vmTestbase/{vm/share/gc => metaspace/share}/TriggerUnloadingByFillingMetaspace.java (98%) rename test/hotspot/jtreg/vmTestbase/{vm/share/gc => metaspace/share}/TriggerUnloadingHelper.java (97%) rename test/hotspot/jtreg/vmTestbase/{vm/share/gc => metaspace/share}/TriggerUnloadingWithWhiteBox.java (98%) rename test/hotspot/jtreg/vmTestbase/vm/{share/process => compiler/complog/share}/ProcessExecutor.java (96%) rename test/hotspot/jtreg/vmTestbase/vm/{share/process => compiler/complog/share}/StreamListener.java (97%) rename test/hotspot/jtreg/vmTestbase/vm/{share/process => compiler/complog/share}/StreamLogger.java (98%) rename test/hotspot/jtreg/vmTestbase/vm/{share/process => compiler/complog/share}/StreamReader.java (99%) rename test/hotspot/jtreg/vmTestbase/vm/{ => mlvm}/share/FileUtils.java (99%) delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/CommentedFileReader.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/RandomEx.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/StringUtils.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/UnsafeAccess.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/VMRuntimeEnvUtils.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryManagerData.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryPoolData.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryUsageData.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/process/CmdExecutor.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/process/MessageInput.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/process/MessageOutput.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessHandler.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageInput.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageOutput.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/transform/AbstractClassFileTransformer.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/transform/AnnotationAppender.java delete mode 100644 test/hotspot/jtreg/vmTestbase/vm/share/transform/TransformingClassLoader.java diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/LoadUnloadGC.java b/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/LoadUnloadGC.java index 9b79865462d6f..1d95426554b6a 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/LoadUnloadGC.java +++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/LoadUnloadGC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -71,12 +71,8 @@ package gc.gctests.LoadUnloadGC; -import nsk.share.test.*; import nsk.share.gc.*; import nsk.share.classload.ClassPathNonDelegatingClassLoader; -import vm.share.monitoring.MemoryPoolFinder; - -import java.io.*; import java.util.*; import java.lang.management.MemoryPoolMXBean; diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/MemoryPoolFinder.java b/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/MemoryPoolFinder.java similarity index 95% rename from test/hotspot/jtreg/vmTestbase/vm/share/monitoring/MemoryPoolFinder.java rename to test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/MemoryPoolFinder.java index ca68beffca641..f7f5e19bd16f5 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/MemoryPoolFinder.java +++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/MemoryPoolFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -20,11 +20,11 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.monitoring; +package gc.gctests.LoadUnloadGC; import java.lang.management.*; -public enum MemoryPoolFinder { +enum MemoryPoolFinder { CODE_CACHE, EDEN_SPACE, SURVIVOR_SPACE, diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java b/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java index f13dae70c919d..244431100f7b2 100644 --- a/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,6 @@ package metaspace.gc; import java.util.Arrays; -import vm.share.VMRuntimeEnvUtils; /** * Test metaspace ergonomic. diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/gc/HeapOOMEException.java b/test/hotspot/jtreg/vmTestbase/metaspace/share/HeapOOMEException.java similarity index 98% rename from test/hotspot/jtreg/vmTestbase/vm/share/gc/HeapOOMEException.java rename to test/hotspot/jtreg/vmTestbase/metaspace/share/HeapOOMEException.java index 534df351169b2..493189a58c71e 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/gc/HeapOOMEException.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/share/HeapOOMEException.java @@ -20,7 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.gc; +package metaspace.share; /** * This class is used to distinguish between OOME in metaspace and OOME in heap when triggering class unloading. diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingByFillingMetaspace.java b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingByFillingMetaspace.java similarity index 98% rename from test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingByFillingMetaspace.java rename to test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingByFillingMetaspace.java index e3f9caf9533e2..217abc25c96aa 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingByFillingMetaspace.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingByFillingMetaspace.java @@ -20,7 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.gc; +package metaspace.share; import nsk.share.test.ExecutionController; import nsk.share.gc.gp.classload.GeneratedClassProducer; diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingHelper.java b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingHelper.java similarity index 97% rename from test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingHelper.java rename to test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingHelper.java index b6458f5865e9c..7c9e4bec1a615 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingHelper.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingHelper.java @@ -20,7 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.gc; +package metaspace.share; import nsk.share.test.ExecutionController; diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingWithWhiteBox.java b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingWithWhiteBox.java similarity index 98% rename from test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingWithWhiteBox.java rename to test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingWithWhiteBox.java index dfe4bb73acbae..678e9551fa750 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingWithWhiteBox.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingWithWhiteBox.java @@ -20,7 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.gc; +package metaspace.share; import jdk.test.whitebox.WhiteBox; diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java b/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java index 690f2a6751708..ce0dd65c7eebf 100644 --- a/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,14 +53,14 @@ import java.util.Map; import java.util.Random; -import vm.share.InMemoryJavaCompiler; +import metaspace.share.TriggerUnloadingHelper; +import metaspace.share.TriggerUnloadingWithWhiteBox; import nsk.share.gc.GCTestBase; import nsk.share.test.ExecutionController; import nsk.share.test.Stresser; import nsk.share.test.TestBase; import nsk.share.test.Tests; -import vm.share.gc.TriggerUnloadingHelper; -import vm.share.gc.TriggerUnloadingWithWhiteBox; +import vm.share.InMemoryJavaCompiler; /** * Test checks that static fields will be initialized in new loaded class. Test performs in loop the following routine: diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java index 476dceb395de3..3d57bfb6ea9ee 100644 --- a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,13 +28,13 @@ import java.lang.reflect.Proxy; import java.util.List; +import jdk.test.whitebox.WhiteBox; +import metaspace.share.TriggerUnloadingHelper; import metaspace.stressHierarchy.common.classloader.tree.Node; import metaspace.stressHierarchy.common.classloader.tree.Tree; import metaspace.stressHierarchy.common.exceptions.ClassNotUnloadedException; import metaspace.stressHierarchy.common.exceptions.TimeIsOverException; import nsk.share.test.ExecutionController; -import jdk.test.whitebox.WhiteBox; -import vm.share.gc.TriggerUnloadingHelper; public class PerformChecksHelper { diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java index 61a19baf98e36..20fcdabb13cf2 100644 --- a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java @@ -24,11 +24,10 @@ import java.net.MalformedURLException; -import vm.share.gc.HeapOOMEException; -import vm.share.gc.TriggerUnloadingByFillingMetaspace; -import vm.share.gc.TriggerUnloadingHelper; -import vm.share.gc.TriggerUnloadingWithWhiteBox; - +import metaspace.share.HeapOOMEException; +import metaspace.share.TriggerUnloadingByFillingMetaspace; +import metaspace.share.TriggerUnloadingHelper; +import metaspace.share.TriggerUnloadingWithWhiteBox; import metaspace.stressHierarchy.common.classloader.tree.Node; import metaspace.stressHierarchy.common.classloader.tree.Tree; import metaspace.stressHierarchy.common.exceptions.TimeIsOverException; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t004/hs203t004.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t004/hs203t004.java index a694698e2a39d..f9f1aa8a2706f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t004/hs203t004.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t004/hs203t004.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,8 +56,6 @@ package nsk.jvmti.scenarios.hotswap.HS203.hs203t004; -import vm.share.VMRuntimeEnvUtils; -import nsk.share.Consts; import nsk.share.jvmti.RedefineAgent; public class hs203t004 extends RedefineAgent { @@ -68,13 +66,6 @@ public hs203t004(String[] arg) { public static void main(String[] arg) { arg = nsk.share.jvmti.JVMTITest.commonInit(arg); - - if (!VMRuntimeEnvUtils.isJITEnabled()) { - System.out.println("WARNING: test isn't valid if JIT compilation is disabled"); - System.out.println("Exiting with 'PASSED' status"); - System.exit(Consts.JCK_STATUS_BASE + Consts.TEST_PASSED); - } - hs203t004 hsCase = new hs203t004(arg); System.exit(hsCase.runAgent()); } diff --git a/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/LogCompilationTest.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/LogCompilationTest.java index 0d24be9a16da7..0a069d272c004 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/LogCompilationTest.java +++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/LogCompilationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,6 @@ import nsk.share.log.LogSupport; import vm.share.options.Option; import vm.share.options.OptionSupport; -import vm.share.process.ProcessExecutor; import java.io.File; import java.io.FileNotFoundException; diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessExecutor.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/ProcessExecutor.java similarity index 96% rename from test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessExecutor.java rename to test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/ProcessExecutor.java index 0d9a0e0632961..9ab0a781d1f89 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessExecutor.java +++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/ProcessExecutor.java @@ -20,23 +20,16 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.process; +package vm.compiler.complog.share; import nsk.share.TestBug; import nsk.share.TestFailure; import nsk.share.log.Log; -import vm.share.ProcessUtils; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.BufferedReader; import java.io.OutputStream; import java.io.PrintStream; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; import java.io.IOException; import java.util.*; -import java.lang.reflect.Field; public class ProcessExecutor { private static long CLEANUP_TIMEOUT = 60000; @@ -138,8 +131,8 @@ public int waitFor(long timeout) { return -1; } - public int getPid() { - return ProcessUtils.getPid(process); + public long getPid() { + return process.pid(); } public OutputStream getStdIn() { diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamListener.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamListener.java similarity index 97% rename from test/hotspot/jtreg/vmTestbase/vm/share/process/StreamListener.java rename to test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamListener.java index 26c542f9bd003..c2d4e58c5bda8 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamListener.java +++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamListener.java @@ -20,7 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.process; +package vm.compiler.complog.share; /* * StreamListener listens on events from BufferedInputStream. diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamLogger.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamLogger.java similarity index 98% rename from test/hotspot/jtreg/vmTestbase/vm/share/process/StreamLogger.java rename to test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamLogger.java index 5162e4010ff22..690f0bbfbfc50 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamLogger.java +++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamLogger.java @@ -20,7 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.process; +package vm.compiler.complog.share; import nsk.share.log.Log; diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamReader.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamReader.java similarity index 99% rename from test/hotspot/jtreg/vmTestbase/vm/share/process/StreamReader.java rename to test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamReader.java index a8f56318da5b2..d983ae1aebea3 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamReader.java +++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamReader.java @@ -20,7 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share.process; +package vm.compiler.complog.share; import java.io.InputStream; import java.io.InputStreamReader; diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/func/findByName/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/func/findByName/Test.java index f891b980f8261..f78c9221dd503 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/func/findByName/Test.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/func/findByName/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,7 @@ import vm.mlvm.hiddenloader.share.HiddenkTestee01; import vm.mlvm.share.MlvmTest; -import vm.share.FileUtils; +import vm.mlvm.share.FileUtils; public class Test extends MlvmTest { private static final Class<?> PARENT = HiddenkTestee01.class; diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/share/StressClassLoadingTest.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/share/StressClassLoadingTest.java index edb91743c44e9..b269d7aa57ff6 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/share/StressClassLoadingTest.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/share/StressClassLoadingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,24 +23,25 @@ package vm.mlvm.hiddenloader.share; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodHandles.Lookup; + import java.io.File; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicBoolean; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; + import nsk.share.test.Stresser; -import vm.share.options.Option; -import vm.share.options.OptionSupport; -import vm.share.options.IgnoreUnknownArgumentsHandler; import vm.mlvm.share.Env; import vm.mlvm.share.MlvmTest; import vm.mlvm.share.CustomClassLoaders; -import vm.share.FileUtils; -import vm.share.UnsafeAccess; +import vm.mlvm.share.FileUtils; +import vm.share.options.Option; +import vm.share.options.OptionSupport; +import vm.share.options.IgnoreUnknownArgumentsHandler; /** * Does stress-testing of class loading subsystem. @@ -164,7 +165,7 @@ public void run() { c = CustomClassLoaders.makeClassBytesLoader(classBytes, className) .loadClass(className); } - UnsafeAccess.unsafe.ensureClassInitialized(c); + MethodHandles.lookup().ensureInitialized(c); } catch (Throwable e) { Env.traceVerbose(e, "parser caught exception"); } diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/byteMutation/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/byteMutation/Test.java index e6a3e8a890d74..e9a49e119c887 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/byteMutation/Test.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/byteMutation/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ import vm.mlvm.hiddenloader.share.HiddenkTestee01; import vm.mlvm.hiddenloader.share.StressClassLoadingTest; -import vm.share.FileUtils; +import vm.mlvm.share.FileUtils; import vm.share.options.Option; /** diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/heap/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/heap/Test.java index ea59685dfd3df..47de77729305d 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/heap/Test.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/heap/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ import vm.mlvm.share.MlvmOOMTest; import vm.mlvm.share.MlvmTestExecutor; import vm.mlvm.share.Env; -import vm.share.FileUtils; +import vm.mlvm.share.FileUtils; /** * This test loads a class using defineHiddenClass, creates instances diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/metaspace/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/metaspace/Test.java index 85bb7c6167fff..886e2e3d52585 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/metaspace/Test.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/metaspace/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ import vm.mlvm.share.MlvmOOMTest; import vm.mlvm.share.MlvmTestExecutor; import vm.mlvm.share.Env; -import vm.share.FileUtils; +import vm.mlvm.share.FileUtils; /** * This test loads classes using defineHiddenClass and stores them, diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/parallelLoad/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/parallelLoad/Test.java index fa4dbf3f4eb19..b3e433df95758 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/parallelLoad/Test.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/parallelLoad/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ import vm.mlvm.hiddenloader.share.HiddenkTestee01; import vm.mlvm.share.MlvmTestExecutor; import vm.mlvm.share.MultiThreadedTest; -import vm.share.FileUtils; +import vm.mlvm.share.FileUtils; /** * Verifies that loading classes in parallel from several threads using diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java index beb77041fdb18..6f2c82923b21e 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,15 +47,11 @@ package vm.mlvm.indy.stress.gc.lotsOfCallSites; import java.lang.invoke.CallSite; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodType; import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.lang.reflect.InvocationTargetException; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryPoolMXBean; import java.lang.management.ManagementFactory; @@ -67,8 +63,8 @@ import nsk.share.test.Stresser; import vm.mlvm.share.CustomClassLoaders; import vm.mlvm.share.Env; +import vm.mlvm.share.FileUtils; import vm.mlvm.share.MlvmTest; -import vm.share.FileUtils; import vm.share.options.Option; /** diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/CustomClassLoaders.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/CustomClassLoaders.java index 9596f7b1eab38..6be720088ac56 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/CustomClassLoaders.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/CustomClassLoaders.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,6 @@ import java.io.IOException; -import vm.share.FileUtils; - public class CustomClassLoaders { public static ClassLoader makeClassBytesLoader(final byte[] classBytes, diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/FileUtils.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/FileUtils.java similarity index 99% rename from test/hotspot/jtreg/vmTestbase/vm/share/FileUtils.java rename to test/hotspot/jtreg/vmTestbase/vm/mlvm/share/FileUtils.java index 1652e75beafa8..c749551e85b1f 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/FileUtils.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/FileUtils.java @@ -20,7 +20,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package vm.share; +package vm.mlvm.share; import java.io.File; import java.io.FileInputStream; diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/MlvmTestExecutor.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/MlvmTestExecutor.java index 2c219309b634d..5ff219e827158 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/MlvmTestExecutor.java +++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/MlvmTestExecutor.java @@ -23,12 +23,16 @@ package vm.mlvm.share; +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; import java.lang.reflect.Constructor; import java.util.List; +import com.sun.management.HotSpotDiagnosticMXBean; + import nsk.share.Consts; import nsk.share.ArgumentParser; -import vm.share.ProcessUtils; import vm.share.options.IgnoreUnknownArgumentsHandler; import vm.share.options.OptionSupport; @@ -261,10 +265,23 @@ public static void launch(Class<?> testClass, Object[] constructorArgs) { } } + private static void dumpHeapWithHotspotDiagnosticMXBean(String fileName) throws IOException { + System.err.println("Dumping heap to " + fileName); + + File f = new File(fileName); + if (f.exists()) + f.delete(); + + HotSpotDiagnosticMXBean b = ManagementFactory.getPlatformMXBeans( + com.sun.management.HotSpotDiagnosticMXBean.class).get(0); + b.dumpHeap(fileName, false); + } + + private static void optionallyDumpHeap() { try { if (MlvmTest.getHeapDumpAfter()) { - ProcessUtils.dumpHeapWithHotspotDiagnosticMXBean(HEAP_DUMP_FILENAME); + dumpHeapWithHotspotDiagnosticMXBean(HEAP_DUMP_FILENAME); } } catch (Exception e) { Env.traceNormal(e, "Error dumping heap: "); diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/CommentedFileReader.java b/test/hotspot/jtreg/vmTestbase/vm/share/CommentedFileReader.java deleted file mode 100644 index 019d237482c71..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/CommentedFileReader.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share; - -import java.io.*; -import java.util.LinkedList; - -/** - * Utility class intended to read file line by line and skip comments. - */ -public class CommentedFileReader { - - /** - * Type of comments that should be removed from file. - */ - public static enum CommentStyle { - /** - * Comments started with <i>#</i>. - */ - BASH, - /** - * Comments started with <i>//</i>. - */ - JAVA - } - - /** - * Get lines from specified file and filter out comments. - * Only comments in BASH style will be filtered out. - * - * @param path to file that should be readed - * @return filtered lines from file - */ - public static String[] readFile(String path) throws IOException { - return readFile(new File(path), CommentStyle.BASH); - } - - /** - * Get lines from specified file and filter out comments. - * Only comments in BASH style will be filtered out. - * - * @param file that should be readed - * @return filtered lines from file - */ - public static String[] readFile(File file) throws IOException { - return readFile(file, CommentStyle.BASH); - } - - /** - * Get lines from specified file without comments. - * - * @param path to file that should be readed - * @param commentStyle describes what strings will be treated as comments - * @return filtered lines from file - */ - public static String[] readFile(String path, CommentStyle commentStyle) throws IOException { - return readFile(new File(path), commentStyle); - } - - /** - * Get lines from specified file without comments. - * - * @param file that should be readed - * @param commentStyle describes what strings will be treated as comments - * @return filtered lines from file - */ - public static String[] readFile(File file, CommentStyle commentStyle) throws IOException { - LinkedList<String> entries = new LinkedList<String>(); - BufferedReader reader = new BufferedReader(new FileReader(file)); - String commentBeginning; - - switch (commentStyle) { - case BASH: - commentBeginning = "#"; - break; - case JAVA: - commentBeginning = "//"; - break; - default: - throw new IllegalArgumentException("Unknown comment style"); - } - - while (true) { - String entry = reader.readLine(); - if (entry == null) { - break; - } - - entry = entry.replaceAll(commentBeginning + ".*", "").trim(); - - if (entry.length() > 0) { - entries.add(entry); - } - } - - return entries.toArray(new String[entries.size()]); - } - -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.cpp b/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.cpp index c69025fe4c2c3..1f7305b381c53 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.cpp +++ b/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.cpp @@ -21,12 +21,8 @@ * questions. */ #include "jni.h" -#include "native_thread.hpp" #ifdef _WIN32 #include <windows.h> -#include <process.h> -#include <vdmdbg.h> -#include <dbghelp.h> #else /* _WIN32 */ #include <unistd.h> #include <signal.h> @@ -35,40 +31,6 @@ extern "C" { -/* - * Class: vm_share_ProcessUtils - * Method: sendSignal - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_vm_share_ProcessUtils_sendSignal -(JNIEnv *env, jclass klass, jint signalNum) { -#ifdef _WIN32 -/* TODO TODO TODO - int dw; - LPVOID lpMsgBuf; - if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0)) { - dw = GetLastError(); - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - nullptr, - dw, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, - nullptr - ); - printf("%s\n", (LPTSTR)lpMsgBuf); - LocalFree(lpMsgBuf); - return JNI_FALSE; - } - */ - return JNI_TRUE; -#else /* _WIN32 */ - if (kill(getpid(), signalNum) < 0) - return JNI_FALSE; - return JNI_TRUE; -#endif /* _WIN32 */ -} - /* * Class: vm_share_ProcessUtils * Method: sendCtrlBreak @@ -101,167 +63,4 @@ JNIEXPORT jboolean JNICALL Java_vm_share_ProcessUtils_sendCtrlBreak #endif /* _WIN32 */ } -#ifdef _WIN32 -static BOOL (WINAPI *_MiniDumpWriteDump) (HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, - PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); -void reportLastError(const char *msg) { - long errcode = GetLastError(); - if (errcode != 0) { - DWORD len = 0; - char *buf; - size_t n = (size_t)FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ALLOCATE_BUFFER, - nullptr, - errcode, - 0, - (LPSTR) &buf, - (DWORD)len, - nullptr); - if (n > 3) { - /* Drop final '.', CR, LF */ - if (buf[n - 1] == '\n') n--; - if (buf[n - 1] == '\r') n--; - if (buf[n - 1] == '.') n--; - buf[n] = '\0'; - } - printf("%s: %s\n", msg, buf); - LocalFree(buf); - } -} - -#endif /* _WIN32 */ - -jboolean doDumpCore() { -#ifdef _WIN32 - char path[MAX_PATH]; - DWORD size; - DWORD pathLen = (DWORD) sizeof(path); - HINSTANCE dbghelp; - MINIDUMP_EXCEPTION_INFORMATION* pmei; - - HANDLE hProcess = GetCurrentProcess(); - DWORD processId = GetCurrentProcessId(); - HANDLE dumpFile; - MINIDUMP_TYPE dumpType; - static const char* cwd; - static const char* name = "DBGHELP.DLL"; - - printf("# TEST: creating Windows minidump...\n"); - size = GetSystemDirectory(path, pathLen); - if (size > 0) { - strcat(path, "\\"); - strcat(path, name); - dbghelp = LoadLibrary(path); - if (dbghelp == nullptr) - reportLastError("Load DBGHELP.DLL from system directory"); - } else { - printf("GetSystemDirectory returned 0\n"); - } - - // try Windows directory - if (dbghelp == nullptr) { - size = GetWindowsDirectory(path, pathLen); - if (size > 6) { - strcat(path, "\\"); - strcat(path, name); - dbghelp = LoadLibrary(path); - if (dbghelp == nullptr) { - reportLastError("Load DBGHELP.DLL from Windows directory"); - } - } - } - if (dbghelp == nullptr) { - printf("Failed to load DBGHELP.DLL\n"); - return JNI_FALSE; - } - - _MiniDumpWriteDump = - (BOOL(WINAPI *)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, - PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION)) - GetProcAddress(dbghelp, "MiniDumpWriteDump"); - - if (_MiniDumpWriteDump == nullptr) { - printf("Failed to find MiniDumpWriteDump() in module dbghelp.dll"); - return JNI_FALSE; - } - dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData); - - // Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with - // API_VERSION_NUMBER 11 or higher contains the ones we want though -#if API_VERSION_NUMBER >= 11 - dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | - MiniDumpWithUnloadedModules); -#endif - - dumpFile = CreateFile("core.mdmp", GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); - - if (dumpFile == INVALID_HANDLE_VALUE) { - reportLastError("Failed to create file for dumping"); - return JNI_FALSE; - } - pmei = nullptr; - - - // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all - // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then. - if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, nullptr, nullptr) == FALSE && - _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, nullptr, nullptr) == FALSE) { - reportLastError("Call to MiniDumpWriteDump() failed"); - return JNI_FALSE; - } - - CloseHandle(dumpFile); - printf("# TEST: minidump created\n"); - // Emulate Unix behaviour - exit process. - ExitProcess(137); - - return JNI_TRUE; -#else /* _WIN32 */ - if (kill(getpid(), SIGSEGV) < 0) - return JNI_FALSE; - return JNI_TRUE; -#endif /* _WIN32 */ - -} - -/* - * Class: vm_share_ProcessUtils - * Method: dumpCore - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_vm_share_ProcessUtils_dumpCore - (JNIEnv *env, jclass klass) -{ - return doDumpCore(); -} - -/* - * Class: vm_share_ProcessUtils - * Method: getPid - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_vm_share_ProcessUtils_getPid - (JNIEnv *env, jclass klass) { -#ifdef _WIN32 - return _getpid(); -#else /* _WIN32 */ - return getpid(); -#endif /* _WIN32 */ -} - - -/* - * Class: vm_share_ProcessUtils - * Method: getPid - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_vm_share_ProcessUtils_getWindowsPid - (JNIEnv *env, jclass klass, jlong handle) { -#ifdef _WIN32 - return GetProcessId((HANDLE) handle); -#else /* _WIN32 */ - return -1; -#endif /* _WIN32 */ -} - } diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.java b/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.java index 2e9174452fdd3..3595428d98c25 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.java +++ b/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,67 +46,4 @@ private ProcessUtils() {} * @return true if it was successful */ public static native boolean sendCtrlBreak(); - - /** - * Send any signal to java process on Unix. It currently does nothing on Windows. - * - * @return true if it was successful - */ - public static native boolean sendSignal(int signalNum); - - /** - * Force java process to dump core. - * - * This is done by sending SIGSEGV on unix systems. - * - * @return true if it was successful, false if not (for example on Windows) - */ - public static native boolean dumpCore(); - - /** - * Get PID of java process. - * - * @return PID - */ - public static native int getPid(); - - public static int getPid(Process process) { - Throwable exception; - try { - Field pidField = process.getClass().getDeclaredField("pid"); - pidField.setAccessible(true); - return ((Integer) pidField.get(process)).intValue(); - } catch (NoSuchFieldException e) { - exception = e; - } catch (IllegalAccessException e) { - exception = e; - } - // Try to get Windows handle - try { - Field handleField = process.getClass().getDeclaredField("handle"); - handleField.setAccessible(true); - long handle = ((Long) handleField.get(process)).longValue(); - return getWindowsPid(handle); - } catch (NoSuchFieldException e) { - exception = e; - } catch (IllegalAccessException e) { - exception = e; - } - throw new TestBug("Unable to determine pid from process class " + process.getClass(), exception); - } - - private static native int getWindowsPid(long handle); - - @SuppressWarnings("restriction") - public static void dumpHeapWithHotspotDiagnosticMXBean(String fileName) throws IOException { - System.err.println("Dumping heap to " + fileName); - - File f = new File(fileName); - if (f.exists()) - f.delete(); - - HotSpotDiagnosticMXBean b = ManagementFactory.getPlatformMXBeans( - com.sun.management.HotSpotDiagnosticMXBean.class).get(0); - b.dumpHeap(fileName, false); - } } diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/RandomEx.java b/test/hotspot/jtreg/vmTestbase/vm/share/RandomEx.java deleted file mode 100644 index 8abcfb1ba80e4..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/RandomEx.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share; - -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -import java.util.function.Predicate; -import java.util.function.Supplier; - -import jdk.test.lib.Utils; - -public class RandomEx extends Random { - private final Map<Class<?>, Supplier<?>> map = new HashMap<>(); - - { - map.put(Boolean.class, this::nextBoolean); - map.put(boolean.class, this::nextBoolean); - map.put(Byte.class, this::nextByte); - map.put(byte.class, this::nextByte); - map.put(Short.class, this::nextShort); - map.put(short.class, this::nextShort); - map.put(Character.class, this::nextChar); - map.put(char.class, this::nextChar); - map.put(Integer.class, this::nextInt); - map.put(int.class, this::nextInt); - map.put(Long.class, this::nextLong); - map.put(long.class, this::nextLong); - map.put(Float.class, this::nextFloat); - map.put(float.class, this::nextFloat); - map.put(Double.class, this::nextDouble); - map.put(double.class, this::nextDouble); - } - - public RandomEx() { - super(Utils.getRandomInstance().nextLong()); - } - - public RandomEx(long seed) { - super(seed); - } - - public byte nextByte() { - return (byte) next(Byte.SIZE); - } - - public short nextShort() { - return (short) next(Short.SIZE); - } - - public char nextChar() { - return (char) next(Character.SIZE); - } - - public <T> T next(Predicate<T> p, T dummy) { - T result; - do { - result = next(dummy); - } while (!p.test(result)); - return result; - } - - @SuppressWarnings("unchecked") - public <T> T next(T dummy) { - Supplier<?> supplier = map.get(dummy.getClass()); - if (supplier == null) { - throw new IllegalArgumentException("supplier for <" + - dummy.getClass() + ">is not found"); - } - return (T) supplier.get(); - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/StringUtils.java b/test/hotspot/jtreg/vmTestbase/vm/share/StringUtils.java deleted file mode 100644 index 5643953869331..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/StringUtils.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share; - -import java.io.ByteArrayOutputStream; -import java.util.Random; -import java.util.function.Predicate; - -public class StringUtils { - - public static byte[] binaryReplace(final byte[] src, String search, - String replacement) { - if (search.length() == 0) - return src; - - int nReplaced = 0; - - try { - final byte[] bSrch = search.getBytes("ASCII"); - final byte[] bRepl = replacement.getBytes("ASCII"); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try { - searching: for (int i = 0; i < src.length; i++) { - if (src[i] == bSrch[0]) { - replacing: do { - for (int ii = 1; ii < Math.min(bSrch.length, - src.length - i); ii++) - if (src[i + ii] != bSrch[ii]) - break replacing; - - out.write(bRepl); - i += bSrch.length - 1; - nReplaced++; - continue searching; - } while (false); - } - - out.write(src[i]); - } - - return out.toByteArray(); - - } finally { - out.close(); - } - } catch (Exception e) { - RuntimeException t = new RuntimeException("Test internal error"); - t.initCause(e); - throw t; - } - } - - public static String generateString(Random rng, int length, - Predicate<Character> predicate) { - if (length <= 0) { - throw new IllegalArgumentException("length <= 0"); - } - StringBuilder builder = new StringBuilder(length); - for (int i = 0; i < length; ++i) { - char tmp; - do { - tmp = (char) rng.nextInt(Character.MAX_VALUE); - } while (!predicate.test(tmp)); - builder.append(tmp); - } - return builder.toString(); - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/UnsafeAccess.java b/test/hotspot/jtreg/vmTestbase/vm/share/UnsafeAccess.java deleted file mode 100644 index 79a0a7392deff..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/UnsafeAccess.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share; - -import java.lang.reflect.Field; - -import jdk.internal.misc.Unsafe; - -@SuppressWarnings("restriction") -public class UnsafeAccess { - public static Unsafe unsafe; - - static { - try { - unsafe = Unsafe.getUnsafe(); - } catch ( Exception e ) { - e.printStackTrace(); - } - } - - -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/VMRuntimeEnvUtils.java b/test/hotspot/jtreg/vmTestbase/vm/share/VMRuntimeEnvUtils.java deleted file mode 100644 index 85cab7a06db7a..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/VMRuntimeEnvUtils.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share; - -import com.sun.management.HotSpotDiagnosticMXBean; -import com.sun.management.VMOption; - -import java.lang.management.ManagementFactory; -import java.util.Objects; - -public class VMRuntimeEnvUtils { - private static HotSpotDiagnosticMXBean DIAGNOSTIC_BEAN - = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); - - private VMRuntimeEnvUtils() { - } - - public static boolean isJITEnabled() { - boolean isJITEnabled = ManagementFactory.getCompilationMXBean() != null; - - return isJITEnabled; - } - - /** - * Returns value of VM option. - * - * @param name option's name - * @return value of option or {@code null}, if option doesn't exist - * @throws NullPointerException if name is null - * @see HotSpotDiagnosticMXBean#getVMOption(String) - */ - public static String getVMOption(String name) { - Objects.requireNonNull(name); - VMOption tmp; - try { - tmp = DIAGNOSTIC_BEAN.getVMOption(name); - } catch (IllegalArgumentException e) { - tmp = null; - } - return (tmp == null ? null : tmp.getValue()); - } - - /** - * Returns value of VM option or default value. - * - * @param name option's name - * @param defaultValue default value - * @return value of option or {@code defaultValue}, if option doesn't exist - * @throws NullPointerException if name is null - * @see #getVMOption(String) - */ - public static String getVMOption(String name, String defaultValue) { - String result = getVMOption(name); - return result == null ? defaultValue : result; - } - - /** - * Returns if a boolean VM option is enabled or not. - * - * @param name option's name - * @return true iff enabled - * @throws IllegalArgumentException if naming non-boolean or non-existing option - */ - public static boolean isVMOptionEnabled(String name) { - String isSet = getVMOption(name, "error"); - if (isSet.equals("true")) { - return true; - } else if (isSet.equals("false")) { - return false; - } - throw new IllegalArgumentException(name + " is not a boolean option."); - } - - /** - * Sets a specified value for VM option of given name. - * - * @param name option's name - * @param value new value - * @throws NullPointerException if name is null - * @throws IllegalArgumentException if new value is invalid or if vm option - * is not writable. - * @see HotSpotDiagnosticMXBean#setVMOption(String, String) - */ - public static void setVMOption(String name, String value) { - Objects.requireNonNull(name); - DIAGNOSTIC_BEAN.setVMOption(name, value); - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryManagerData.java b/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryManagerData.java deleted file mode 100644 index ec58d3d43eb81..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryManagerData.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.monitoring.data; - -import java.lang.management.*; -import javax.management.*; -import java.io.Serializable; - -public class MemoryManagerData implements MemoryManagerMXBean, Serializable { - private String[] memoryPoolNames; - private String name; - private boolean valid; - - public MemoryManagerData(String[] memoryPoolNames, String name, boolean valid) { - this.memoryPoolNames = memoryPoolNames; - this.name = name; - this.valid = valid; - } - - public MemoryManagerData(MemoryManagerMXBean memoryManager) { - this.memoryPoolNames = memoryManager.getMemoryPoolNames(); - this.name = memoryManager.getName(); - this.valid = memoryManager.isValid(); - } - - public String[] getMemoryPoolNames() { - return memoryPoolNames; - } - - public String getName() { - return name; - } - - public boolean isValid() { - return valid; - } - - public ObjectName getObjectName() { - return null; - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryPoolData.java b/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryPoolData.java deleted file mode 100644 index cf2221bf13602..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryPoolData.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.monitoring.data; - -import java.lang.management.MemoryPoolMXBean; -import java.io.Serializable; - -public class MemoryPoolData implements Serializable { - private String name; - private boolean valid; - private MemoryUsageData usage; - - public MemoryPoolData(String name, boolean valid, MemoryUsageData usage) { - this.name = name; - this.valid = valid; - } - - public MemoryPoolData(MemoryPoolMXBean memoryManager) { - this.name = memoryManager.getName(); - this.valid = memoryManager.isValid(); - this.usage = new MemoryUsageData(memoryManager.getUsage()); - } - - public String getName() { - return name; - } - - public boolean hasName(String name) { - return this.name.equals(name); - } - - public boolean isValid() { - return valid; - } - - public MemoryUsageData getUsage() { - return usage; - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryUsageData.java b/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryUsageData.java deleted file mode 100644 index 60b9fababe0ce..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryUsageData.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.monitoring.data; - -import java.io.Serializable; -import java.lang.management.MemoryUsage; -import nsk.share.log.Log; - -public class MemoryUsageData implements Serializable { - private long init; - private long used; - private long committed; - private long max; - - public MemoryUsageData(long init, long used, long committed, long max) { - this.init = init; - this.used = used; - this.committed = committed; - this.max = max; - } - - public MemoryUsageData(MemoryUsage usage) { - this.init = usage.getInit(); - this.used = usage.getUsed(); - this.committed = usage.getCommitted(); - this.max = usage.getMax(); - } - - public MemoryUsageData(MemoryUsageData usage, MemoryUsageData usage1) { - this.init = usage.getInit() + usage1.getInit(); - this.used = usage.getUsed() + usage1.getUsed(); - this.committed = usage.getCommitted() + usage1.getCommitted(); - this.max = usage.getMax() + usage1.getMax(); - } - - public long getInit() { - return init; - } - - public long getUsed() { - return used; - } - - public long getMax() { - return max; - } - - public long getFree() { - return committed - used; - } - - public long getCommitted() { - return committed; - } - - public void log(Log log) { - log.info(" Init: " + init); - log.info(" Used: " + used); - log.info(" Committed: " + committed); - log.info(" Max: " + max); - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/CmdExecutor.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/CmdExecutor.java deleted file mode 100644 index bea1bd8282bbb..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/CmdExecutor.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.process; - -import java.io.IOException; -import java.util.Collection; - -public class CmdExecutor extends ProcessExecutor { - private final StringBuilder cmd = new StringBuilder(); - @Override - public void clearArgs() { - cmd.setLength(0); - } - - @Override - public void addArg(String arg) { - cmd.append(" " + arg); - } - - @Override - public void addArgs(String[] args) { - for (String arg : args) { - addArg(arg); - } - } - - @Override - public void addArgs(Collection<String> args) { - for (String arg : args) { - addArg(arg); - } - } - - @Override - protected Process createProcess() throws IOException { - return Runtime.getRuntime().exec(cmd.toString()); - } - - @Override - public String toString() { - return cmd.toString(); - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageInput.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageInput.java deleted file mode 100644 index d684d88f54373..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageInput.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.process; - -import java.util.List; - -public interface MessageInput { - public boolean waitForStart(long timeout) throws InterruptedException; - public boolean waitForMessage(long timeout) throws InterruptedException; - public boolean waitForMessage(String msg, long timeout) throws InterruptedException; - public String getMessage(); - public List<String> getMessages(); - public List<String> getMessages(int to); - public List<String> getMessages(int from, int to); - public boolean waitForFinish(long timeout) throws InterruptedException; - public void reset(); -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageOutput.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageOutput.java deleted file mode 100644 index 3a0b4549c4855..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageOutput.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.process; - -public interface MessageOutput { - public void start(); - public void send(String msg); - public void finish(); -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessHandler.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessHandler.java deleted file mode 100644 index 4ca3b191993f5..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessHandler.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.process; - -import java.util.List; - -public class ProcessHandler implements MessageInput, MessageOutput { - private StreamMessageInput stdout = new StreamMessageInput(); - private StreamMessageInput stderr = new StreamMessageInput(); - private StreamMessageOutput stdin = new StreamMessageOutput(); - - public ProcessHandler() { - } - - public ProcessHandler(ProcessExecutor exec) { - bind(exec); - } - - public void bind(ProcessExecutor exec) { - exec.addStdOutListener(stdout.createListener()); - exec.addStdErrListener(stderr.createListener()); - exec.start(); - stdin.bind(exec.getStdIn()); - } - - public boolean waitForStart(long timeout) throws InterruptedException { - return stdout.waitForStart(timeout) && stderr.waitForStart(timeout); - } - - public boolean waitForMessage(long timeout) throws InterruptedException { - return stdout.waitForMessage(timeout); - } - - public boolean waitForMessage(String msg, long timeout) throws InterruptedException { - return stdout.waitForMessage(msg, timeout); - } - - public String getMessage() { - return stdout.getMessage(); - } - - public List<String> getMessages() { - return stdout.getMessages(); - } - - public List<String> getMessages(int to) { - return stdout.getMessages(to); - } - - public List<String> getMessages(int from, int to) { - return stdout.getMessages(from, to); - } - - public boolean waitForStdErrMessage(String msg, long timeout) throws InterruptedException { - return stderr.waitForMessage(msg, timeout); - } - - public String getStdErrMessage() { - return stderr.getMessage(); - } - - public boolean waitForFinish(long timeout) throws InterruptedException { - return stdout.waitForFinish(timeout) && stderr.waitForFinish(timeout); - } - - public void start() { - stdin.start(); - } - - public void send(String msg) { - stdin.send(msg); - } - - public void finish() { - stdin.finish(); - } - - public void reset() { - stdout.reset(); - stderr.reset(); - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageInput.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageInput.java deleted file mode 100644 index 03d9ec6bd3e69..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageInput.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.process; - -import java.util.List; -import java.util.ArrayList; -import nsk.share.TestBug; - -public class StreamMessageInput implements MessageInput { - private Object sync = new Object(); - private List<String> lines = new ArrayList<String>(); - private int position = 0; - private volatile boolean active = false; - private volatile Throwable exception; - - public StreamMessageInput() { - } - - public StreamMessageInput(StreamReader sd) { - bind(sd); - } - - public StreamListener createListener() { - return new Listener(); - } - - public void bind(StreamReader sd) { - sd.addListener(createListener()); - } - - public boolean isActive() { - return active; - } - - public boolean isException() { - return exception != null; - } - - public Throwable getException() { - return exception; - } - - public boolean waitForStart(long timeout) throws InterruptedException { - long startTime = System.currentTimeMillis(); - long curTime = startTime; - synchronized (sync) { - while (!active && curTime - startTime < timeout) { - sync.wait(curTime - startTime); - curTime = System.currentTimeMillis(); - } - } - return active; - } - - public boolean waitForFinish(long timeout) throws InterruptedException { - long startTime = System.currentTimeMillis(); - long curTime = startTime; - synchronized (sync) { - while (active && curTime - startTime < timeout) { - sync.wait(curTime - startTime); - curTime = System.currentTimeMillis(); - } - } - return !active; - } - - public boolean waitForMessage(String msg, long timeout) throws InterruptedException { - long startTime = System.currentTimeMillis(); - long curTime = startTime; - int n = position; - synchronized (sync) { - while (curTime - startTime < timeout) { - while (n < lines.size()) { - // System.out.println("Check: " + lines.get(n)); - if (msg == null || lines.get(n++).contains(msg)) { - return true; - } - } - sync.wait(timeout - (curTime - startTime)); - curTime = System.currentTimeMillis(); - } - return false; - } - } - - public boolean waitForMessage(long timeout) throws InterruptedException { - return waitForMessage(null, timeout); - } - - public String getMessage() { - if (position < lines.size()) - return lines.get(position++); - else - return null; - } - - public String getMessage(int index) { - return lines.get(index); - } - - public int getPosition() { - return position; - } - - public void setPosition(int position) { - this.position = position; - } - - public int getMessageCount() { - return lines.size(); - } - - public List<String> getMessages() { - return getMessages(position, lines.size()); - } - - public List<String> getMessages(int to) { - return getMessages(position, to); - } - - public List<String> getMessages(int from, int to) { - synchronized (sync) { - if (to < 0) - to = lines.size() + to; - position = Math.max(position, to); - return new ArrayList<String>(lines.subList(from, to)); - } - } - - public void reset() { - synchronized (sync) { - position = lines.size(); - } - } - - private class Listener implements StreamListener { - @Override - public void onStart() { - synchronized (sync) { - active = true; - sync.notifyAll(); - } - } - - @Override - public void onRead(String line) { - //System.out.println("onRead: " + line); - synchronized (sync) { - lines.add(line); - sync.notifyAll(); - } - } - - @Override - public void onFinish() { - synchronized (sync) { - active = false; - sync.notifyAll(); - } - } - - @Override - public void onException(Throwable e) { - exception = e; - } - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageOutput.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageOutput.java deleted file mode 100644 index 473ccc071f9a3..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageOutput.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.process; - -import java.io.OutputStream; -import java.io.PrintStream; -import java.io.IOException; -import nsk.share.TestFailure; - -public class StreamMessageOutput implements MessageOutput { - private OutputStream out; - private PrintStream pout; - - public StreamMessageOutput() { - } - - public StreamMessageOutput(OutputStream out) { - bind(out); - } - - public void bind(OutputStream out) { - this.out = out; - this.pout = new PrintStream(out, true); // Autoflush is important - } - - public void start() { - } - - public void send(String msg) { - pout.println(msg); - } - - public void finish() { - pout.close(); - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/transform/AbstractClassFileTransformer.java b/test/hotspot/jtreg/vmTestbase/vm/share/transform/AbstractClassFileTransformer.java deleted file mode 100644 index 95906789fda31..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/transform/AbstractClassFileTransformer.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.transform; - -import java.lang.instrument.ClassFileTransformer; -import java.lang.instrument.IllegalClassFormatException; -import java.security.ProtectionDomain; - -public abstract class AbstractClassFileTransformer - implements ClassFileTransformer { - protected abstract boolean shouldBeTransformed(String name); - - protected abstract byte[] transformClass(byte[] bytes); - - @Override - public byte[] transform(ClassLoader loader, String className, - Class<?> classBeingRedefined, ProtectionDomain protectionDomain, - byte[] classfileBuffer) throws IllegalClassFormatException { - if (shouldBeTransformed(className)) { - return transformClass(classfileBuffer); - } - return null; - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/transform/AnnotationAppender.java b/test/hotspot/jtreg/vmTestbase/vm/share/transform/AnnotationAppender.java deleted file mode 100644 index b3891fec5e411..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/transform/AnnotationAppender.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.transform; - -import jdk.internal.org.objectweb.asm.AnnotationVisitor; - -public abstract class AnnotationAppender { - private final String desc; - private final boolean visible; - private boolean annotationPresent; - - public AnnotationAppender(String desc, boolean visible) { - this.desc = desc; - this.visible = visible; - } - - public void checkAnnotation(String desc, boolean isVisible) { - annotationPresent |= visible == isVisible && this.desc.equals(desc); - } - - public void addAnnotation(VisitAnnotation func) { - if (shouldAdd()) { - AnnotationVisitor av = func.visit(desc, true); - if (av != null) { - postCreate(av); - av.visitEnd(); - annotationPresent = true; - } - } - } - - protected boolean shouldAdd() { - return !annotationPresent; - } - - protected abstract void postCreate(AnnotationVisitor av); - - @FunctionalInterface - public static interface VisitAnnotation { - AnnotationVisitor visit(String desc, boolean visible); - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/transform/TransformingClassLoader.java b/test/hotspot/jtreg/vmTestbase/vm/share/transform/TransformingClassLoader.java deleted file mode 100644 index 5ce3dd02eb655..0000000000000 --- a/test/hotspot/jtreg/vmTestbase/vm/share/transform/TransformingClassLoader.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package vm.share.transform; - -import vm.share.FileUtils; - -public class TransformingClassLoader extends ClassLoader { - private final AbstractClassFileTransformer transformer; - - protected TransformingClassLoader(ClassLoader parent, - AbstractClassFileTransformer transformer) { - super(parent); - this.transformer = transformer; - } - - @Override - protected Class<?> loadClass(String name, boolean resolve) - throws ClassNotFoundException { - if (!transformer.shouldBeTransformed(name)) { - return super.loadClass(name, resolve); - } - synchronized (getClassLoadingLock(name)) { - // First, check if the class has already been loaded - Class<?> c = findLoadedClass(name); - if (c == null) { - try { - byte[] bytes = FileUtils.readClass(name); - bytes = transformer.transformClass(bytes); - c = defineClass(name, bytes, 0, bytes.length); - } catch (Exception e) { - e.printStackTrace(); - return super.loadClass(name, resolve); - } - } - if (resolve) { - resolveClass(c); - } - return c; - } - } -} From 1b1dba8082969244effa86ac03c6053b3b0ddc43 Mon Sep 17 00:00:00 2001 From: Pavel Rappo <prappo@openjdk.org> Date: Thu, 20 Jun 2024 16:28:48 +0000 Subject: [PATCH 127/471] 8333358: java/io/IO/IO.java test fails intermittently Reviewed-by: naoto --- test/jdk/java/io/IO/IO.java | 48 ++++++++++++++++++++++++++++++++++ test/jdk/java/io/IO/input.exp | 4 ++- test/jdk/java/io/IO/output.exp | 21 +++++++++++---- 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/test/jdk/java/io/IO/IO.java b/test/jdk/java/io/IO/IO.java index 1a9a25c90c710..328c189fb2f7b 100644 --- a/test/jdk/java/io/IO/IO.java +++ b/test/jdk/java/io/IO/IO.java @@ -21,6 +21,7 @@ * questions. */ +import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -34,6 +35,10 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.extension.AfterTestExecutionCallback; +import org.junit.jupiter.api.extension.BeforeTestExecutionCallback; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -48,6 +53,7 @@ * @library /test/lib * @run junit IO */ +@ExtendWith(IO.TimingExtension.class) public class IO { @Nested @@ -62,6 +68,11 @@ public static void prepareTTY() { if (!Files.exists(expect) || !Files.isExecutable(expect)) { Assumptions.abort("'" + expect + "' not found"); } + try { + var outputAnalyzer = ProcessTools.executeProcess( + expect.toAbsolutePath().toString(), "-version"); + outputAnalyzer.reportDiagnosticSummary(); + } catch (Exception _) { } } /* @@ -174,4 +185,41 @@ public void nullConsole(String method) throws Exception { assertEquals(1, output.getExitValue()); output.shouldContain("Exception in thread \"main\" java.io.IOError"); } + + + // adapted from https://junit.org/junit5/docs/current/user-guide/#extensions-lifecycle-callbacks-timing-extension + // remove after CODETOOLS-7903752 propagates to jtreg that this test is routinely run by + + public static class TimingExtension implements BeforeTestExecutionCallback, + AfterTestExecutionCallback { + + private static final System.Logger logger = System.getLogger( + TimingExtension.class.getName()); + + private static final String START_TIME = "start time"; + + @Override + public void beforeTestExecution(ExtensionContext context) { + getStore(context).put(START_TIME, time()); + } + + @Override + public void afterTestExecution(ExtensionContext context) { + Method testMethod = context.getRequiredTestMethod(); + long startTime = getStore(context).remove(START_TIME, long.class); + long duration = time() - startTime; + + logger.log(System.Logger.Level.INFO, () -> + String.format("Method [%s] took %s ms.", testMethod.getName(), duration)); + } + + private ExtensionContext.Store getStore(ExtensionContext context) { + return context.getStore(ExtensionContext.Namespace.create(getClass(), + context.getRequiredTestMethod())); + } + + private long time() { + return System.nanoTime() / 1_000_000; + } + } } diff --git a/test/jdk/java/io/IO/input.exp b/test/jdk/java/io/IO/input.exp index ba86b57b131ba..6f17a1379ec48 100644 --- a/test/jdk/java/io/IO/input.exp +++ b/test/jdk/java/io/IO/input.exp @@ -23,6 +23,7 @@ set prompt [lindex $argv $argc-1] set stty_init "rows 24 cols 80" +set timeout -1 spawn {*}$argv expect { @@ -30,7 +31,8 @@ expect { send "hello\r" } timeout { - puts "timeout"; exit 1 + puts "timeout" + exit 1 } } expect eof diff --git a/test/jdk/java/io/IO/output.exp b/test/jdk/java/io/IO/output.exp index 9044912cfaf55..a792b8791a4dd 100644 --- a/test/jdk/java/io/IO/output.exp +++ b/test/jdk/java/io/IO/output.exp @@ -21,12 +21,23 @@ # questions. # -################################################################################ -# This script does not expect/verify anything and is only used to simulate tty # -################################################################################ +# This script doesn't verify any output strings, it's only used to simulate tty -# Use `noecho` below, otherwise, expect will output the expanded "spawn ..." +set stty_init "rows 24 cols 80" +set timeout -1 + +# Use `-noecho` below, otherwise, expect will output the expanded "spawn ..." # command, which will interfere with asserting output from the java test +# counterpart spawn -noecho {*}$argv -expect eof + +expect { + eof { + exit 0 + } + timeout { + puts "timeout" + exit 1 + } +} From 265a0f5547d0ddb220391aef679c122768f02a00 Mon Sep 17 00:00:00 2001 From: Naoto Sato <naoto@openjdk.org> Date: Thu, 20 Jun 2024 17:01:17 +0000 Subject: [PATCH 128/471] 8334490: Normalize string with locale invariant `toLowerCase()` Reviewed-by: jlu, dfuchs, lancea, rriggs --- test/lib/jdk/test/lib/Platform.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/lib/jdk/test/lib/Platform.java b/test/lib/jdk/test/lib/Platform.java index e2451fc83664e..4a4b164cd17ee 100644 --- a/test/lib/jdk/test/lib/Platform.java +++ b/test/lib/jdk/test/lib/Platform.java @@ -35,6 +35,7 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.util.Locale.ROOT; public class Platform { public static final String vmName = privilegedGetProperty("java.vm.name"); @@ -134,7 +135,7 @@ public static boolean isWindows() { } private static boolean isOs(String osname) { - return osName.toLowerCase().startsWith(osname.toLowerCase()); + return osName.toLowerCase(ROOT).startsWith(osname.toLowerCase(ROOT)); } public static String getOsName() { @@ -175,15 +176,15 @@ public static int getOsVersionMinor() { } public static boolean isDebugBuild() { - return (jdkDebug.toLowerCase().contains("debug")); + return (jdkDebug.toLowerCase(ROOT).contains("debug")); } public static boolean isSlowDebugBuild() { - return (jdkDebug.toLowerCase().equals("slowdebug")); + return (jdkDebug.toLowerCase(ROOT).equals("slowdebug")); } public static boolean isFastDebugBuild() { - return (jdkDebug.toLowerCase().equals("fastdebug")); + return (jdkDebug.toLowerCase(ROOT).equals("fastdebug")); } public static String getVMVersion() { @@ -350,8 +351,8 @@ private static boolean isArch(String archnameRE) { } public static boolean isOracleLinux7() { - if (System.getProperty("os.name").toLowerCase().contains("linux") && - System.getProperty("os.version").toLowerCase().contains("el")) { + if (System.getProperty("os.name").toLowerCase(ROOT).contains("linux") && + System.getProperty("os.version").toLowerCase(ROOT).contains("el")) { Pattern p = Pattern.compile("el(\\d+)"); Matcher m = p.matcher(System.getProperty("os.version")); if (m.find()) { From de8ee97718d7e12b541b310cf5b67f3e10e91ad9 Mon Sep 17 00:00:00 2001 From: SendaoYan <syan@openjdk.org> Date: Thu, 20 Jun 2024 18:04:58 +0000 Subject: [PATCH 129/471] 8334333: MissingResourceCauseTestRun.java fails if run by root Reviewed-by: naoto, jlu --- .../Control/MissingResourceCauseTestRun.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java b/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java index 30cd81757df6d..66a60f11ad47f 100644 --- a/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java +++ b/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 4354216 8213127 + * @bug 4354216 8213127 8334333 * @summary Test for the cause support when throwing a * MissingResourceBundle. (This test exists under * ResourceBundle/Control because bad resource bundle data can be @@ -32,6 +32,7 @@ * @build jdk.test.lib.JDKToolLauncher * jdk.test.lib.Utils * jdk.test.lib.process.ProcessTools + * jdk.test.lib.Platform * MissingResourceCauseTest * NonResourceBundle * PrivateConstructorRB @@ -50,9 +51,14 @@ import jdk.test.lib.JDKToolLauncher; import jdk.test.lib.Utils; import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.Platform; +import jtreg.SkippedException; public class MissingResourceCauseTestRun { public static void main(String[] args) throws Throwable { + if (Platform.isRoot() && !Platform.isWindows()) { + throw new SkippedException("Unable to create an unreadable properties file."); + } Path path = Paths.get("UnreadableRB.properties"); Files.deleteIfExists(path); try { @@ -98,7 +104,7 @@ private static void runCmd() throws Throwable { } private static void deleteFile(Path path) throws Throwable { - if(path.toFile().exists()) { + if (path.toFile().exists()) { ProcessTools.executeCommand("chmod", "666", path.toString()) .outputTo(System.out) .errorTo(System.out) From 187710e1c1714ba28c7802efd4f7bb32a366d79d Mon Sep 17 00:00:00 2001 From: Tom Rodriguez <never@openjdk.org> Date: Thu, 20 Jun 2024 18:46:36 +0000 Subject: [PATCH 130/471] 8333300: [JVMCI] add support for generational ZGC Reviewed-by: dnsimon, kvn, eosterlund --- .../aarch64/jvmciCodeInstaller_aarch64.cpp | 34 +++++--- .../cpu/riscv/jvmciCodeInstaller_riscv.cpp | 3 +- .../cpu/x86/jvmciCodeInstaller_x86.cpp | 33 +++++-- src/hotspot/share/code/nmethod.cpp | 16 +++- src/hotspot/share/gc/z/zBarrier.hpp | 2 + src/hotspot/share/gc/z/zBarrier.inline.hpp | 6 ++ src/hotspot/share/gc/z/zBarrierSetRuntime.cpp | 8 ++ src/hotspot/share/gc/z/zBarrierSetRuntime.hpp | 2 + .../share/jvmci/jvmciCodeInstaller.cpp | 11 ++- .../share/jvmci/jvmciCodeInstaller.hpp | 19 +++- src/hotspot/share/jvmci/jvmciCompilerToVM.cpp | 17 ++-- src/hotspot/share/jvmci/jvmciCompilerToVM.hpp | 5 ++ .../share/jvmci/jvmciCompilerToVMInit.cpp | 33 +++++-- src/hotspot/share/jvmci/jvmciRuntime.cpp | 4 +- src/hotspot/share/jvmci/jvmci_globals.cpp | 6 +- src/hotspot/share/jvmci/vmStructs_jvmci.cpp | 87 +++++++++++++++++-- 16 files changed, 235 insertions(+), 51 deletions(-) diff --git a/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp b/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp index fdfab3ab5623b..18095632ac096 100644 --- a/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp @@ -34,6 +34,9 @@ #include "runtime/jniHandles.hpp" #include "runtime/sharedRuntime.hpp" #include "vmreg_aarch64.inline.hpp" +#if INCLUDE_ZGC +#include "gc/z/zBarrierSetAssembler.hpp" +#endif jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMCI_TRAPS) { if (inst->is_call() || inst->is_jump() || inst->is_blr()) { @@ -164,24 +167,35 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& metho } } -void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) { +bool CodeInstaller::pd_relocate(address pc, jint mark) { switch (mark) { case POLL_NEAR: - JVMCI_ERROR("unimplemented"); - break; + // This is unhandled and will be reported by the caller + return false; case POLL_FAR: _instructions->relocate(pc, relocInfo::poll_type); - break; + return true; case POLL_RETURN_NEAR: - JVMCI_ERROR("unimplemented"); - break; + // This is unhandled and will be reported by the caller + return false; case POLL_RETURN_FAR: _instructions->relocate(pc, relocInfo::poll_return_type); - break; - default: - JVMCI_ERROR("invalid mark value"); - break; + return true; + case Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_TB_X: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadGoodBeforeTbX); + return true; + case Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_BEFORE_MOV: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatMarkBadBeforeMov); + return true; + case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_BEFORE_MOV: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodBeforeMov); + return true; + case Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_BEFORE_MOV: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreBadBeforeMov); + return true; + } + return false; } // convert JVMCI register indices (as used in oop maps) to HotSpot registers diff --git a/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp b/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp index 35bfbb1df8ead..ba3d9c99aceb1 100644 --- a/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp +++ b/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp @@ -105,8 +105,9 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& metho Unimplemented(); } -void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) { +bool CodeInstaller::pd_relocate(address pc, jint mark) { Unimplemented(); + return false; } // convert JVMCI register indices (as used in oop maps) to HotSpot registers diff --git a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp index 09056b374ad29..94708d4224379 100644 --- a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp +++ b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp @@ -39,6 +39,9 @@ #include "classfile/vmSymbols.hpp" #include "code/vmreg.hpp" #include "vmreg_x86.inline.hpp" +#if INCLUDE_ZGC +#include "gc/z/zBarrierSetAssembler.hpp" +#endif jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMCI_TRAPS) { if (inst->is_call() || inst->is_jump()) { @@ -197,7 +200,7 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &, methodHandle& method, j } } -void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) { +bool CodeInstaller::pd_relocate(address pc, jint mark) { switch (mark) { case POLL_NEAR: case POLL_FAR: @@ -206,15 +209,35 @@ void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) { // so that poll_Relocation::fix_relocation_after_move does the right // thing (i.e. ignores this relocation record) _instructions->relocate(pc, relocInfo::poll_type, Assembler::imm_operand); - break; + return true; case POLL_RETURN_NEAR: case POLL_RETURN_FAR: // see comment above for POLL_FAR _instructions->relocate(pc, relocInfo::poll_return_type, Assembler::imm_operand); - break; + return true; + case Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadGoodBeforeShl); + return true; + case Z_BARRIER_RELOCATION_FORMAT_LOAD_BAD_AFTER_TEST: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadBadAfterTest); + return true; + case Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_AFTER_TEST: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatMarkBadAfterTest); + return true; + case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_CMP: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterCmp); + return true; + case Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_AFTER_TEST: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreBadAfterTest); + return true; + case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_OR: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterOr); + return true; + case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV: + _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterMov); + return true; default: - JVMCI_ERROR("invalid mark value: %d", mark); - break; + return false; } } diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index bcfbae49fd992..7f91f69c9e38b 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -3638,10 +3638,22 @@ const char* nmethod::reloc_string_for(u_char* begin, u_char* end) { case relocInfo::poll_type: return "poll"; case relocInfo::poll_return_type: return "poll_return"; case relocInfo::trampoline_stub_type: return "trampoline_stub"; + case relocInfo::entry_guard_type: return "entry_guard"; + case relocInfo::post_call_nop_type: return "post_call_nop"; + case relocInfo::barrier_type: { + barrier_Relocation* const reloc = iter.barrier_reloc(); + stringStream st; + st.print("barrier format=%d", reloc->format()); + return st.as_string(); + } + case relocInfo::type_mask: return "type_bit_mask"; - default: - break; + default: { + stringStream st; + st.print("unknown relocInfo=%d", (int) iter.type()); + return st.as_string(); + } } } return have_one ? "other" : nullptr; diff --git a/src/hotspot/share/gc/z/zBarrier.hpp b/src/hotspot/share/gc/z/zBarrier.hpp index 4a271c1469fc9..fa0fbbcd88f95 100644 --- a/src/hotspot/share/gc/z/zBarrier.hpp +++ b/src/hotspot/share/gc/z/zBarrier.hpp @@ -151,6 +151,8 @@ class ZBarrier : public AllStatic { static zaddress load_barrier_on_oop_field(volatile zpointer* p); static zaddress load_barrier_on_oop_field_preloaded(volatile zpointer* p, zpointer o); + static void load_barrier_on_oop_array(volatile zpointer* p, size_t length); + static zaddress keep_alive_load_barrier_on_oop_field_preloaded(volatile zpointer* p, zpointer o); // Load barriers on non-strong oop refs diff --git a/src/hotspot/share/gc/z/zBarrier.inline.hpp b/src/hotspot/share/gc/z/zBarrier.inline.hpp index 2c81c14865b51..b3191e9ae3f7a 100644 --- a/src/hotspot/share/gc/z/zBarrier.inline.hpp +++ b/src/hotspot/share/gc/z/zBarrier.inline.hpp @@ -475,6 +475,12 @@ inline zaddress ZBarrier::keep_alive_load_barrier_on_oop_field_preloaded(volatil return barrier(is_mark_good_fast_path, keep_alive_slow_path, color_mark_good, p, o); } +inline void ZBarrier::load_barrier_on_oop_array(volatile zpointer* p, size_t length) { + for (volatile const zpointer* const end = p + length; p < end; p++) { + load_barrier_on_oop_field(p); + } +} + // // Load barrier on non-strong oop refs // diff --git a/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp b/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp index da7adf7cc3a80..b41fec3d0a552 100644 --- a/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp +++ b/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp @@ -63,6 +63,10 @@ JRT_LEAF(void, ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_hea ZBarrier::store_barrier_on_native_oop_field((zpointer*)p, false /* heal */); JRT_END +JRT_LEAF(void, ZBarrierSetRuntime::load_barrier_on_oop_array(oop* p, size_t length)) + ZBarrier::load_barrier_on_oop_array((zpointer*)p, length); +JRT_END + JRT_LEAF(void, ZBarrierSetRuntime::clone(oopDesc* src, oopDesc* dst, size_t size)) HeapAccess<>::clone(src, dst, size); JRT_END @@ -126,6 +130,10 @@ address ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_healing_ad return reinterpret_cast<address>(store_barrier_on_native_oop_field_without_healing); } +address ZBarrierSetRuntime::load_barrier_on_oop_array_addr() { + return reinterpret_cast<address>(load_barrier_on_oop_array); +} + address ZBarrierSetRuntime::clone_addr() { return reinterpret_cast<address>(clone); } diff --git a/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp b/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp index a569ff3c15818..8a81f162bf1ef 100644 --- a/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp +++ b/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp @@ -41,6 +41,7 @@ class ZBarrierSetRuntime : public AllStatic { static void store_barrier_on_oop_field_with_healing(oop* p); static void store_barrier_on_oop_field_without_healing(oop* p); static void store_barrier_on_native_oop_field_without_healing(oop* p); + static void load_barrier_on_oop_array(oop* p, size_t length); static void clone(oopDesc* src, oopDesc* dst, size_t size); public: @@ -54,6 +55,7 @@ class ZBarrierSetRuntime : public AllStatic { static address store_barrier_on_oop_field_with_healing_addr(); static address store_barrier_on_oop_field_without_healing_addr(); static address store_barrier_on_native_oop_field_without_healing_addr(); + static address load_barrier_on_oop_array_addr(); static address clone_addr(); }; diff --git a/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp b/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp index 52a060427d5d4..c62257bd23b1c 100644 --- a/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp +++ b/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp @@ -1297,6 +1297,10 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile u1 id = stream->read_u1("mark:id"); address pc = _instructions->start() + pc_offset; + if (pd_relocate(pc, id)) { + return; + } + switch (id) { case UNVERIFIED_ENTRY: _offsets.set_value(CodeOffsets::Entry, pc_offset); @@ -1330,12 +1334,6 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile _next_call_type = (MarkId) id; _invoke_mark_pc = pc; break; - case POLL_NEAR: - case POLL_FAR: - case POLL_RETURN_NEAR: - case POLL_RETURN_FAR: - pd_relocate_poll(pc, id, JVMCI_CHECK); - break; case CARD_TABLE_SHIFT: case CARD_TABLE_ADDRESS: case HEAP_TOP_ADDRESS: @@ -1350,6 +1348,7 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile case VERIFY_OOP_MASK: case VERIFY_OOP_COUNT_ADDRESS: break; + default: JVMCI_ERROR("invalid mark id: %d%s", id, stream->context()); break; diff --git a/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp b/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp index 98fed480bf1d7..0cb7f28748053 100644 --- a/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp +++ b/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp @@ -176,6 +176,23 @@ class CodeInstaller : public StackObj { VERIFY_OOP_BITS, VERIFY_OOP_MASK, VERIFY_OOP_COUNT_ADDRESS, + +#ifdef X86 + Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL, + Z_BARRIER_RELOCATION_FORMAT_LOAD_BAD_AFTER_TEST, + Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_AFTER_TEST, + Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_CMP, + Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_AFTER_TEST, + Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_OR, + Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV, +#endif +#ifdef AARCH64 + Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_TB_X, + Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_BEFORE_MOV, + Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_BEFORE_MOV, + Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_BEFORE_MOV, +#endif + INVOKE_INVALID = -1 }; @@ -312,7 +329,7 @@ class CodeInstaller : public StackObj { void pd_patch_DataSectionReference(int pc_offset, int data_offset, JVMCI_TRAPS); void pd_relocate_ForeignCall(NativeInstruction* inst, jlong foreign_call_destination, JVMCI_TRAPS); void pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& method, jint pc_offset, JVMCI_TRAPS); - void pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS); + bool pd_relocate(address pc, jint mark); public: diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp index fb06abe9174ef..d92d193017362 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp @@ -1208,12 +1208,19 @@ C2V_VMENTRY_NULL(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject HandleMark hm(THREAD); JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod); - JVMCINMethodHandle nmethod_handle(THREAD); - nmethod* nm = JVMCIENV->get_nmethod(nmethod_mirror, nmethod_handle); - if (nm == nullptr || !nm->is_in_use()) { - JVMCI_THROW_NULL(InvalidInstalledCodeException); + methodHandle mh; + { + // Reduce the scope of JVMCINMethodHandle so that it isn't alive across the Java call. Once the + // nmethod has been validated and the method is fetched from the nmethod it's fine for the + // nmethod to be reclaimed if necessary. + JVMCINMethodHandle nmethod_handle(THREAD); + nmethod* nm = JVMCIENV->get_nmethod(nmethod_mirror, nmethod_handle); + if (nm == nullptr || !nm->is_in_use()) { + JVMCI_THROW_NULL(InvalidInstalledCodeException); + } + methodHandle nmh(THREAD, nm->method()); + mh = nmh; } - methodHandle mh(THREAD, nm->method()); Symbol* signature = mh->signature(); JavaCallArguments jca(mh->size_of_parameters()); diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp index ff159a490c184..b7ae365c1936d 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp @@ -68,6 +68,10 @@ class CompilerToVM { static address ZBarrierSetRuntime_load_barrier_on_oop_array; static address ZBarrierSetRuntime_clone; + static address ZPointerVectorLoadBadMask_address; + static address ZPointerVectorStoreBadMask_address; + static address ZPointerVectorStoreGoodMask_address; + static bool continuations_enabled; static size_t ThreadLocalAllocBuffer_alignment_reserve; @@ -100,6 +104,7 @@ class CompilerToVM { static int sizeof_narrowKlass; static int sizeof_arrayOopDesc; static int sizeof_BasicLock; + static int sizeof_ZStoreBarrierEntry; static address dsin; static address dcos; diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp index a2ba0f2b3e578..220667ad2ced0 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp @@ -38,6 +38,8 @@ #if INCLUDE_ZGC #include "gc/x/xBarrierSetRuntime.hpp" #include "gc/x/xThreadLocalData.hpp" +#include "gc/z/zBarrierSetRuntime.hpp" +#include "gc/z/zThreadLocalData.hpp" #endif #include "jvmci/jvmciCompilerToVM.hpp" #include "jvmci/jvmciEnv.hpp" @@ -80,6 +82,10 @@ address CompilerToVM::Data::ZBarrierSetRuntime_weak_load_barrier_on_phantom_oop_ address CompilerToVM::Data::ZBarrierSetRuntime_load_barrier_on_oop_array; address CompilerToVM::Data::ZBarrierSetRuntime_clone; +address CompilerToVM::Data::ZPointerVectorLoadBadMask_address; +address CompilerToVM::Data::ZPointerVectorStoreBadMask_address; +address CompilerToVM::Data::ZPointerVectorStoreGoodMask_address; + bool CompilerToVM::Data::continuations_enabled; #ifdef AARCH64 @@ -117,6 +123,7 @@ int CompilerToVM::Data::sizeof_ConstantPool = sizeof(ConstantPool); int CompilerToVM::Data::sizeof_narrowKlass = sizeof(narrowKlass); int CompilerToVM::Data::sizeof_arrayOopDesc = sizeof(arrayOopDesc); int CompilerToVM::Data::sizeof_BasicLock = sizeof(BasicLock); +int CompilerToVM::Data::sizeof_ZStoreBarrierEntry = sizeof(ZStoreBarrierEntry); address CompilerToVM::Data::dsin; address CompilerToVM::Data::dcos; @@ -157,15 +164,23 @@ void CompilerToVM::Data::initialize(JVMCI_TRAPS) { #if INCLUDE_ZGC if (UseZGC) { - thread_address_bad_mask_offset = in_bytes(XThreadLocalData::address_bad_mask_offset()); - ZBarrierSetRuntime_load_barrier_on_oop_field_preloaded = XBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(); - ZBarrierSetRuntime_load_barrier_on_weak_oop_field_preloaded = XBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded_addr(); - ZBarrierSetRuntime_load_barrier_on_phantom_oop_field_preloaded = XBarrierSetRuntime::load_barrier_on_phantom_oop_field_preloaded_addr(); - ZBarrierSetRuntime_weak_load_barrier_on_oop_field_preloaded = XBarrierSetRuntime::weak_load_barrier_on_oop_field_preloaded_addr(); - ZBarrierSetRuntime_weak_load_barrier_on_weak_oop_field_preloaded = XBarrierSetRuntime::weak_load_barrier_on_weak_oop_field_preloaded_addr(); - ZBarrierSetRuntime_weak_load_barrier_on_phantom_oop_field_preloaded = XBarrierSetRuntime::weak_load_barrier_on_phantom_oop_field_preloaded_addr(); - ZBarrierSetRuntime_load_barrier_on_oop_array = XBarrierSetRuntime::load_barrier_on_oop_array_addr(); - ZBarrierSetRuntime_clone = XBarrierSetRuntime::clone_addr(); + if (ZGenerational) { + ZPointerVectorLoadBadMask_address = (address) &ZPointerVectorLoadBadMask; + ZPointerVectorStoreBadMask_address = (address) &ZPointerVectorStoreBadMask; + ZPointerVectorStoreGoodMask_address = (address) &ZPointerVectorStoreGoodMask; + } else { + thread_address_bad_mask_offset = in_bytes(XThreadLocalData::address_bad_mask_offset()); + // Initialize the old names for compatibility. The proper XBarrierSetRuntime names are + // exported as addresses in vmStructs_jvmci.cpp as are the new ZBarrierSetRuntime names. + ZBarrierSetRuntime_load_barrier_on_oop_field_preloaded = XBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(); + ZBarrierSetRuntime_load_barrier_on_weak_oop_field_preloaded = XBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded_addr(); + ZBarrierSetRuntime_load_barrier_on_phantom_oop_field_preloaded = XBarrierSetRuntime::load_barrier_on_phantom_oop_field_preloaded_addr(); + ZBarrierSetRuntime_weak_load_barrier_on_oop_field_preloaded = XBarrierSetRuntime::weak_load_barrier_on_oop_field_preloaded_addr(); + ZBarrierSetRuntime_weak_load_barrier_on_weak_oop_field_preloaded = XBarrierSetRuntime::weak_load_barrier_on_weak_oop_field_preloaded_addr(); + ZBarrierSetRuntime_weak_load_barrier_on_phantom_oop_field_preloaded = XBarrierSetRuntime::weak_load_barrier_on_phantom_oop_field_preloaded_addr(); + ZBarrierSetRuntime_load_barrier_on_oop_array = XBarrierSetRuntime::load_barrier_on_oop_array_addr(); + ZBarrierSetRuntime_clone = XBarrierSetRuntime::clone_addr(); + } } #endif diff --git a/src/hotspot/share/jvmci/jvmciRuntime.cpp b/src/hotspot/share/jvmci/jvmciRuntime.cpp index 504fbfcb1b078..9770e329a8813 100644 --- a/src/hotspot/share/jvmci/jvmciRuntime.cpp +++ b/src/hotspot/share/jvmci/jvmciRuntime.cpp @@ -874,7 +874,7 @@ int JVMCIRuntime::release_and_clear_oop_handles() { for (int i = 0; i < _oop_handles.length(); i++) { oop* oop_ptr = _oop_handles.at(i); guarantee(oop_ptr != nullptr, "release_cleared_oop_handles left null entry in _oop_handles"); - guarantee(*oop_ptr != nullptr, "unexpected cleared handle"); + guarantee(NativeAccess<>::oop_load(oop_ptr) != nullptr, "unexpected cleared handle"); // Satisfy OopHandles::release precondition that all // handles being released are null. NativeAccess<>::oop_store(oop_ptr, (oop) nullptr); @@ -889,7 +889,7 @@ int JVMCIRuntime::release_and_clear_oop_handles() { } static bool is_referent_non_null(oop* handle) { - return handle != nullptr && *handle != nullptr; + return handle != nullptr && NativeAccess<>::oop_load(handle) != nullptr; } // Swaps the elements in `array` at index `a` and index `b` diff --git a/src/hotspot/share/jvmci/jvmci_globals.cpp b/src/hotspot/share/jvmci/jvmci_globals.cpp index 8253332e3a919..86d8491b73303 100644 --- a/src/hotspot/share/jvmci/jvmci_globals.cpp +++ b/src/hotspot/share/jvmci/jvmci_globals.cpp @@ -223,16 +223,14 @@ bool JVMCIGlobals::enable_jvmci_product_mode(JVMFlagOrigin origin, bool use_graa } bool JVMCIGlobals::gc_supports_jvmci() { - return UseSerialGC || UseParallelGC || UseG1GC || (UseZGC && !ZGenerational); + return UseSerialGC || UseParallelGC || UseG1GC || UseZGC || UseEpsilonGC; } void JVMCIGlobals::check_jvmci_supported_gc() { if (EnableJVMCI) { // Check if selected GC is supported by JVMCI and Java compiler if (!gc_supports_jvmci()) { - log_warning(gc, jvmci)("Setting EnableJVMCI to false as selected GC does not support JVMCI: %s", GCConfig::hs_err_name()); - FLAG_SET_DEFAULT(EnableJVMCI, false); - FLAG_SET_DEFAULT(UseJVMCICompiler, false); + fatal("JVMCI does not support the selected GC"); } } } diff --git a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp index f0ecc5af7d2cc..73bac7bd0909c 100644 --- a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp +++ b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp @@ -42,10 +42,17 @@ #include "runtime/stubRoutines.hpp" #include "runtime/vm_version.hpp" #if INCLUDE_G1GC +#include "gc/g1/g1BarrierSetRuntime.hpp" #include "gc/g1/g1CardTable.hpp" #include "gc/g1/g1HeapRegion.hpp" #include "gc/g1/g1ThreadLocalData.hpp" #endif +#if INCLUDE_ZGC +#include "gc/x/xBarrierSetRuntime.hpp" +#include "gc/z/zBarrierSetAssembler.hpp" +#include "gc/z/zBarrierSetRuntime.hpp" +#include "gc/z/zThreadLocalData.hpp" +#endif #define VM_STRUCTS(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field) \ static_field(CompilerToVM::Data, Klass_vtable_start_offset, int) \ @@ -66,6 +73,7 @@ static_field(CompilerToVM::Data, thread_disarmed_guard_value_offset, int) \ static_field(CompilerToVM::Data, thread_address_bad_mask_offset, int) \ AARCH64_ONLY(static_field(CompilerToVM::Data, BarrierSetAssembler_nmethod_patching_type, int)) \ + AARCH64_ONLY(static_field(CompilerToVM::Data, BarrierSetAssembler_patching_epoch_addr, address)) \ \ static_field(CompilerToVM::Data, ZBarrierSetRuntime_load_barrier_on_oop_field_preloaded, address) \ static_field(CompilerToVM::Data, ZBarrierSetRuntime_load_barrier_on_weak_oop_field_preloaded, address) \ @@ -76,6 +84,10 @@ static_field(CompilerToVM::Data, ZBarrierSetRuntime_load_barrier_on_oop_array, address) \ static_field(CompilerToVM::Data, ZBarrierSetRuntime_clone, address) \ \ + static_field(CompilerToVM::Data, ZPointerVectorLoadBadMask_address, address) \ + static_field(CompilerToVM::Data, ZPointerVectorStoreBadMask_address, address) \ + static_field(CompilerToVM::Data, ZPointerVectorStoreGoodMask_address, address) \ + \ static_field(CompilerToVM::Data, continuations_enabled, bool) \ \ static_field(CompilerToVM::Data, ThreadLocalAllocBuffer_alignment_reserve, size_t) \ @@ -109,6 +121,7 @@ static_field(CompilerToVM::Data, sizeof_narrowKlass, int) \ static_field(CompilerToVM::Data, sizeof_arrayOopDesc, int) \ static_field(CompilerToVM::Data, sizeof_BasicLock, int) \ + static_field(CompilerToVM::Data, sizeof_ZStoreBarrierEntry, int) \ \ static_field(CompilerToVM::Data, dsin, address) \ static_field(CompilerToVM::Data, dcos, address) \ @@ -784,7 +797,12 @@ declare_constant(markWord::no_hash_in_place) \ declare_constant(markWord::no_lock_in_place) \ -#define VM_ADDRESSES(declare_address, declare_preprocessor_address, declare_function) \ +// Helper macro to support ZGC pattern where the function itself isn't exported +#define DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, name) \ + declare_function_with_value(name, name##_addr()) + + +#define VM_ADDRESSES(declare_address, declare_preprocessor_address, declare_function, declare_function_with_value) \ declare_function(SharedRuntime::register_finalizer) \ declare_function(SharedRuntime::exception_handler_for_return_address) \ declare_function(SharedRuntime::OSR_migration_end) \ @@ -801,6 +819,26 @@ declare_function(os::javaTimeMillis) \ declare_function(os::javaTimeNanos) \ \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::load_barrier_on_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::load_barrier_on_phantom_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::weak_load_barrier_on_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::weak_load_barrier_on_weak_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::weak_load_barrier_on_phantom_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::load_barrier_on_oop_array)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::clone)) \ + \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_phantom_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_store_good)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::no_keepalive_load_barrier_on_weak_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::no_keepalive_load_barrier_on_phantom_oop_field_preloaded)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_healing)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::store_barrier_on_oop_field_with_healing)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::store_barrier_on_oop_field_without_healing)) \ + ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_oop_array)) \ + \ declare_function(Deoptimization::fetch_unroll_info) \ declare_function(Deoptimization::uncommon_trap) \ declare_function(Deoptimization::unpack_frames) \ @@ -851,9 +889,35 @@ #endif // INCLUDE_G1GC +#if INCLUDE_ZGC + +#define VM_INT_CONSTANTS_JVMCI_ZGC(declare_constant, declare_constant_with_value, declare_preprocessor_constant) \ + declare_constant_with_value("ZThreadLocalData::store_good_mask_offset" , in_bytes(ZThreadLocalData::store_good_mask_offset())) \ + declare_constant_with_value("ZThreadLocalData::store_bad_mask_offset" , in_bytes(ZThreadLocalData::store_bad_mask_offset())) \ + declare_constant_with_value("ZThreadLocalData::store_barrier_buffer_offset" , in_bytes(ZThreadLocalData::store_barrier_buffer_offset())) \ + declare_constant_with_value("ZStoreBarrierBuffer::current_offset" , in_bytes(ZStoreBarrierBuffer::current_offset())) \ + declare_constant_with_value("ZStoreBarrierBuffer::buffer_offset" , in_bytes(ZStoreBarrierBuffer::buffer_offset())) \ + declare_constant_with_value("ZStoreBarrierEntry::p_offset" , in_bytes(ZStoreBarrierEntry::p_offset())) \ + declare_constant_with_value("ZStoreBarrierEntry::prev_offset" , in_bytes(ZStoreBarrierEntry::prev_offset())) \ + AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL)) \ + AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_LOAD_BAD_AFTER_TEST)) \ + AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_AFTER_TEST)) \ + AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_CMP)) \ + AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_AFTER_TEST)) \ + AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_OR)) \ + AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV)) \ + AARCH64_ONLY(declare_constant(ZPointerLoadShift)) \ + AARCH64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_TB_X)) \ + AARCH64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_BEFORE_MOV)) \ + AARCH64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_BEFORE_MOV)) \ + AARCH64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_BEFORE_MOV)) + +#endif // INCLUDE_ZGC + + #ifdef LINUX -#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function) \ +#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function, declare_function_with_value) \ declare_preprocessor_address("RTLD_DEFAULT", RTLD_DEFAULT) #endif @@ -861,7 +925,7 @@ #ifdef BSD -#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function) \ +#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function, declare_function_with_value) \ declare_preprocessor_address("RTLD_DEFAULT", RTLD_DEFAULT) #endif @@ -912,13 +976,17 @@ #endif #ifndef VM_ADDRESSES_OS -#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function) +#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function, declare_function_with_value) #endif // // Instantiation of VMStructEntries, VMTypeEntries and VMIntConstantEntries // +#define GENERATE_VM_FUNCTION_WITH_VALUE_ENTRY(name, value) \ + { QUOTE(name), CAST_FROM_FN_PTR(void*, value) }, + + // These initializers are allowed to access private fields in classes // as long as class VMStructs is a friend VMStructEntry JVMCIVMStructs::localHotSpotVMStructs[] = { @@ -969,6 +1037,11 @@ VMIntConstantEntry JVMCIVMStructs::localHotSpotVMIntConstants[] = { GENERATE_VM_INT_CONSTANT_WITH_VALUE_ENTRY, GENERATE_PREPROCESSOR_VM_INT_CONSTANT_ENTRY) #endif +#if INCLUDE_ZGC + VM_INT_CONSTANTS_JVMCI_ZGC(GENERATE_VM_INT_CONSTANT_ENTRY, + GENERATE_VM_INT_CONSTANT_WITH_VALUE_ENTRY, + GENERATE_PREPROCESSOR_VM_INT_CONSTANT_ENTRY) +#endif #ifdef VM_INT_CPU_FEATURE_CONSTANTS VM_INT_CPU_FEATURE_CONSTANTS #endif @@ -994,10 +1067,12 @@ VMLongConstantEntry JVMCIVMStructs::localHotSpotVMLongConstants[] = { VMAddressEntry JVMCIVMStructs::localHotSpotVMAddresses[] = { VM_ADDRESSES(GENERATE_VM_ADDRESS_ENTRY, GENERATE_PREPROCESSOR_VM_ADDRESS_ENTRY, - GENERATE_VM_FUNCTION_ENTRY) + GENERATE_VM_FUNCTION_ENTRY, + GENERATE_VM_FUNCTION_WITH_VALUE_ENTRY) VM_ADDRESSES_OS(GENERATE_VM_ADDRESS_ENTRY, GENERATE_PREPROCESSOR_VM_ADDRESS_ENTRY, - GENERATE_VM_FUNCTION_ENTRY) + GENERATE_VM_FUNCTION_ENTRY, + GENERATE_VM_FUNCTION_WITH_VALUE_ENTRY) GENERATE_VM_ADDRESS_LAST_ENTRY() }; From 4b4a483b6fe7a6fcfdfe6f68faac29099a64c982 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore <coleenp@openjdk.org> Date: Thu, 20 Jun 2024 19:03:50 +0000 Subject: [PATCH 131/471] 8330699: Obsolete -XX:+UseEmptySlotsInSupers Reviewed-by: shade, fparain, dholmes --- .../share/classfile/fieldLayoutBuilder.cpp | 18 +---- src/hotspot/share/runtime/arguments.cpp | 2 +- src/hotspot/share/runtime/globals.hpp | 4 - .../runtime/FieldLayout/OldLayoutCheck.java | 79 ------------------- 4 files changed, 3 insertions(+), 100 deletions(-) delete mode 100644 test/hotspot/jtreg/runtime/FieldLayout/OldLayoutCheck.java diff --git a/src/hotspot/share/classfile/fieldLayoutBuilder.cpp b/src/hotspot/share/classfile/fieldLayoutBuilder.cpp index c77016d74aae1..f9353465ca7c4 100644 --- a/src/hotspot/share/classfile/fieldLayoutBuilder.cpp +++ b/src/hotspot/share/classfile/fieldLayoutBuilder.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -137,7 +137,7 @@ void FieldLayout::initialize_instance_layout(const InstanceKlass* super_klass) { } else { bool has_fields = reconstruct_layout(super_klass); fill_holes(super_klass); - if ((UseEmptySlotsInSupers && !super_klass->has_contended_annotations()) || !has_fields) { + if (!super_klass->has_contended_annotations() || !has_fields) { _start = _blocks; // start allocating fields from the first empty block } else { _start = _last; // append fields at the end of the reconstructed layout @@ -364,20 +364,6 @@ void FieldLayout::fill_holes(const InstanceKlass* super_klass) { b = p; } - if (!UseEmptySlotsInSupers) { - // Add an empty slots to align fields of the subclass on a heapOopSize boundary - // in order to emulate the behavior of the previous algorithm - int align = (b->offset() + b->size()) % heapOopSize; - if (align != 0) { - int sz = heapOopSize - align; - LayoutRawBlock* p = new LayoutRawBlock(LayoutRawBlock::EMPTY, sz); - p->set_offset(b->offset() + b->size()); - b->set_next_block(p); - p->set_prev_block(b); - b = p; - } - } - LayoutRawBlock* last = new LayoutRawBlock(LayoutRawBlock::EMPTY, INT_MAX); last->set_offset(b->offset() + b->size()); assert(last->offset() > 0, "Sanity check"); diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index a56e1fcb9988a..0949e9e2aacac 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -505,7 +505,6 @@ static SpecialFlag const special_jvm_flags[] = { { "DontYieldALot", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "PreserveAllAnnotations", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "UseNotificationThread", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, - { "UseEmptySlotsInSupers", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, @@ -513,6 +512,7 @@ static SpecialFlag const special_jvm_flags[] = { { "MetaspaceReclaimPolicy", JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::undefined() }, + { "UseEmptySlotsInSupers", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "OldSize", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, #if defined(X86) { "UseRTMLocking", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp index 6f66a3495955b..b8b9c846bb4d1 100644 --- a/src/hotspot/share/runtime/globals.hpp +++ b/src/hotspot/share/runtime/globals.hpp @@ -1948,10 +1948,6 @@ const int ObjectAlignmentInBytes = 8; product(bool, UseFastUnorderedTimeStamps, false, EXPERIMENTAL, \ "Use platform unstable time where supported for timestamps only") \ \ - product(bool, UseEmptySlotsInSupers, true, \ - "(Deprecated) Allow allocating fields in empty slots of " \ - "super-classes") \ - \ product(bool, DeoptimizeNMethodBarriersALot, false, DIAGNOSTIC, \ "Make nmethod barriers deoptimise a lot.") \ \ diff --git a/test/hotspot/jtreg/runtime/FieldLayout/OldLayoutCheck.java b/test/hotspot/jtreg/runtime/FieldLayout/OldLayoutCheck.java deleted file mode 100644 index a68b0a9efafce..0000000000000 --- a/test/hotspot/jtreg/runtime/FieldLayout/OldLayoutCheck.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 8239014 - * @summary -XX:-UseEmptySlotsInSupers sometime fails to reproduce the layout of the old code - * @library /test/lib - * @modules java.base/jdk.internal.misc - * java.management - * @requires vm.bits == "64" & vm.opt.final.UseCompressedOops == true & vm.gc != "Z" - * @run main/othervm -XX:+UseCompressedClassPointers -XX:-UseEmptySlotsInSupers OldLayoutCheck - */ - -/* - * @test - * @requires vm.bits == "32" - * @library /test/lib - * @modules java.base/jdk.internal.misc - * java.management - * @run main/othervm -XX:-UseEmptySlotsInSupers OldLayoutCheck - */ - -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Comparator; -import jdk.internal.misc.Unsafe; - -import jdk.test.lib.Asserts; -import jdk.test.lib.Platform; - -public class OldLayoutCheck { - - static class LIClass { - public long l; - public int i; - } - - // 32-bit VMs: @0: 8 byte header, @8: long field, @16: int field - // 64-bit VMs: @0: 12 byte header, @12: int field, @16: long field - static final long INT_OFFSET = Platform.is64bit() ? 12L : 16L; - static final long LONG_OFFSET = Platform.is64bit() ? 16L : 8L; - - static public void main(String[] args) { - Unsafe unsafe = Unsafe.getUnsafe(); - Class c = LIClass.class; - Field[] fields = c.getFields(); - for (int i = 0; i < fields.length; i++) { - long offset = unsafe.objectFieldOffset(fields[i]); - if (fields[i].getType() == int.class) { - Asserts.assertEquals(offset, INT_OFFSET, "Misplaced int field"); - } else if (fields[i].getType() == long.class) { - Asserts.assertEquals(offset, LONG_OFFSET, "Misplaced long field"); - } else { - Asserts.fail("Unexpected field type"); - } - } - } -} From e5de26ddf0550da9e6d074d5b9ab4a943170adca Mon Sep 17 00:00:00 2001 From: Jatin Bhateja <jbhateja@openjdk.org> Date: Thu, 20 Jun 2024 23:35:15 +0000 Subject: [PATCH 132/471] 8329032: C2 compiler register allocation support for APX EGPRs Reviewed-by: kvn, sviswanathan --- src/hotspot/cpu/x86/assembler_x86.cpp | 257 +++++++++++++----- src/hotspot/cpu/x86/assembler_x86.hpp | 22 +- src/hotspot/cpu/x86/c1_Defs_x86.hpp | 2 +- src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp | 4 +- src/hotspot/cpu/x86/c1_Runtime1_x86.cpp | 12 +- .../x86/gc/shared/barrierSetAssembler_x86.cpp | 19 ++ .../cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp | 19 ++ src/hotspot/cpu/x86/globals_x86.hpp | 2 - .../cpu/x86/jvmciCodeInstaller_x86.cpp | 7 +- src/hotspot/cpu/x86/macroAssembler_x86.cpp | 47 ++++ src/hotspot/cpu/x86/macroAssembler_x86.hpp | 5 + src/hotspot/cpu/x86/methodHandles_x86.cpp | 5 +- src/hotspot/cpu/x86/nativeInst_x86.cpp | 32 ++- src/hotspot/cpu/x86/nativeInst_x86.hpp | 78 ++++-- src/hotspot/cpu/x86/register_x86.cpp | 4 +- src/hotspot/cpu/x86/register_x86.hpp | 30 +- src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp | 102 ++++++- src/hotspot/cpu/x86/upcallLinker_x86_64.cpp | 12 +- src/hotspot/cpu/x86/vm_version_x86.cpp | 20 +- src/hotspot/cpu/x86/vm_version_x86.hpp | 2 +- src/hotspot/cpu/x86/vmreg_x86.hpp | 3 +- src/hotspot/cpu/x86/x86_64.ad | 121 ++++++++- src/hotspot/os/windows/os_windows.cpp | 2 +- src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp | 2 +- src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp | 2 +- .../share/classes/jdk/vm/ci/amd64/AMD64.java | 111 +++++--- 26 files changed, 737 insertions(+), 185 deletions(-) diff --git a/src/hotspot/cpu/x86/assembler_x86.cpp b/src/hotspot/cpu/x86/assembler_x86.cpp index b02cca92cd484..001ff472f40bb 100644 --- a/src/hotspot/cpu/x86/assembler_x86.cpp +++ b/src/hotspot/cpu/x86/assembler_x86.cpp @@ -842,7 +842,7 @@ address Assembler::locate_operand(address inst, WhichOperand which) { case REX2: NOT_LP64(assert(false, "64bit prefixes")); - if ((0xFF & *ip++) & REXBIT_W) { + if ((0xFF & *ip++) & REX2BIT_W) { is_64bit = true; } goto again_after_prefix; @@ -899,7 +899,7 @@ address Assembler::locate_operand(address inst, WhichOperand which) { case REX2: NOT_LP64(assert(false, "64bit prefix found")); - if ((0xFF & *ip++) & REXBIT_W) { + if ((0xFF & *ip++) & REX2BIT_W) { is_64bit = true; } goto again_after_size_prefix2; @@ -4498,7 +4498,7 @@ void Assembler::ud2() { void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) { assert(VM_Version::supports_sse4_2(), ""); - assert(!needs_eevex(src.base(), src.index()), "does not support extended gprs"); + assert(!needs_eevex(src.base(), src.index()), "does not support extended gprs as BASE or INDEX of address operand"); InstructionMark im(this); InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false); simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes); @@ -5893,6 +5893,71 @@ void Assembler::evpunpckhqdq(XMMRegister dst, KRegister mask, XMMRegister src1, emit_int16(0x6D, (0xC0 | encode)); } +#ifdef _LP64 +void Assembler::push2(Register src1, Register src2, bool with_ppx) { + assert(VM_Version::supports_apx_f(), "requires APX"); + InstructionAttr attributes(0, /* rex_w */ with_ppx, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false); + /* EVEX.BASE */ + int src_enc = src1->encoding(); + /* EVEX.VVVV */ + int nds_enc = src2->encoding(); + + bool vex_b = (src_enc & 8) == 8; + bool evex_v = (nds_enc >= 16); + bool evex_b = (src_enc >= 16); + + // EVEX.ND = 1; + attributes.set_extended_context(); + attributes.set_is_evex_instruction(); + set_attributes(&attributes); + + evex_prefix(0, vex_b, 0, 0, evex_b, evex_v, false /*eevex_x*/, nds_enc, VEX_SIMD_NONE, /* map4 */ VEX_OPCODE_0F_3C); + emit_int16(0xFF, (0xC0 | (0x6 << 3) | (src_enc & 7))); +} + +void Assembler::pop2(Register src1, Register src2, bool with_ppx) { + assert(VM_Version::supports_apx_f(), "requires APX"); + InstructionAttr attributes(0, /* rex_w */ with_ppx, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false); + /* EVEX.BASE */ + int src_enc = src1->encoding(); + /* EVEX.VVVV */ + int nds_enc = src2->encoding(); + + bool vex_b = (src_enc & 8) == 8; + bool evex_v = (nds_enc >= 16); + bool evex_b = (src_enc >= 16); + + // EVEX.ND = 1; + attributes.set_extended_context(); + attributes.set_is_evex_instruction(); + set_attributes(&attributes); + + evex_prefix(0, vex_b, 0, 0, evex_b, evex_v, false /*eevex_x*/, nds_enc, VEX_SIMD_NONE, /* map4 */ VEX_OPCODE_0F_3C); + emit_int16(0x8F, (0xC0 | (src_enc & 7))); +} + +void Assembler::push2p(Register src1, Register src2) { + push2(src1, src2, true); +} + +void Assembler::pop2p(Register src1, Register src2) { + pop2(src1, src2, true); +} + +void Assembler::pushp(Register src) { + assert(VM_Version::supports_apx_f(), "requires APX"); + int encode = prefixq_and_encode_rex2(src->encoding()); + emit_int8(0x50 | encode); +} + +void Assembler::popp(Register dst) { + assert(VM_Version::supports_apx_f(), "requires APX"); + int encode = prefixq_and_encode_rex2(dst->encoding()); + emit_int8((unsigned char)0x58 | encode); +} +#endif //_LP64 + + void Assembler::push(int32_t imm32) { // in 64bits we push 64bits onto the stack but only // take a 32bit immediate @@ -7207,6 +7272,7 @@ void Assembler::vroundpd(XMMRegister dst, XMMRegister src, int32_t rmode, int ve void Assembler::vroundpd(XMMRegister dst, Address src, int32_t rmode, int vector_len) { assert(VM_Version::supports_avx(), ""); + assert(!needs_eevex(src.base(), src.index()), "does not support extended gprs as BASE or INDEX of address operand"); InstructionMark im(this); InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false); vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes); @@ -11011,6 +11077,7 @@ void Assembler::evpbroadcastq(XMMRegister dst, Register src, int vector_len) { void Assembler::vpgatherdd(XMMRegister dst, Address src, XMMRegister mask, int vector_len) { assert(VM_Version::supports_avx2(), ""); + assert(!needs_eevex(src.base()), "does not support extended gprs as BASE of address operand"); assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, ""); assert(dst != xnoreg, "sanity"); assert(src.isxmmindex(),"expected to be xmm index"); @@ -11024,6 +11091,7 @@ void Assembler::vpgatherdd(XMMRegister dst, Address src, XMMRegister mask, int v void Assembler::vpgatherdq(XMMRegister dst, Address src, XMMRegister mask, int vector_len) { assert(VM_Version::supports_avx2(), ""); + assert(!needs_eevex(src.base()), "does not support extended gprs as BASE of address operand"); assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, ""); assert(dst != xnoreg, "sanity"); assert(src.isxmmindex(),"expected to be xmm index"); @@ -11037,6 +11105,7 @@ void Assembler::vpgatherdq(XMMRegister dst, Address src, XMMRegister mask, int v void Assembler::vgatherdpd(XMMRegister dst, Address src, XMMRegister mask, int vector_len) { assert(VM_Version::supports_avx2(), ""); + assert(!needs_eevex(src.base()), "does not support extended gprs as BASE of address operand"); assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, ""); assert(dst != xnoreg, "sanity"); assert(src.isxmmindex(),"expected to be xmm index"); @@ -11050,6 +11119,7 @@ void Assembler::vgatherdpd(XMMRegister dst, Address src, XMMRegister mask, int v void Assembler::vgatherdps(XMMRegister dst, Address src, XMMRegister mask, int vector_len) { assert(VM_Version::supports_avx2(), ""); + assert(!needs_eevex(src.base()), "does not support extended gprs as BASE of address operand"); assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, ""); assert(dst != xnoreg, "sanity"); assert(src.isxmmindex(),"expected to be xmm index"); @@ -11808,7 +11878,6 @@ void Assembler::evex_prefix(bool vex_r, bool vex_b, bool vex_x, bool evex_r, boo _attributes->get_embedded_opmask_register_specifier() != 0) { byte4 |= (_attributes->is_clear_context() ? EVEX_Z : 0); } - emit_int32(EVEX_4bytes, byte2, byte3, byte4); } @@ -12921,14 +12990,14 @@ void Assembler::emit_data64(jlong data, int Assembler::get_base_prefix_bits(int enc) { int bits = 0; if (enc & 16) bits |= REX2BIT_B4; - if (enc & 8) bits |= REXBIT_B; + if (enc & 8) bits |= REX2BIT_B; return bits; } int Assembler::get_index_prefix_bits(int enc) { int bits = 0; if (enc & 16) bits |= REX2BIT_X4; - if (enc & 8) bits |= REXBIT_X; + if (enc & 8) bits |= REX2BIT_X; return bits; } @@ -12943,7 +13012,7 @@ int Assembler::get_index_prefix_bits(Register index) { int Assembler::get_reg_prefix_bits(int enc) { int bits = 0; if (enc & 16) bits |= REX2BIT_R4; - if (enc & 8) bits |= REXBIT_R; + if (enc & 8) bits |= REX2BIT_R; return bits; } @@ -13181,6 +13250,15 @@ bool Assembler::prefix_is_rex2(int prefix) { return (prefix & 0xFF00) == WREX2; } +int Assembler::get_prefixq_rex2(Address adr, bool is_map1) { + assert(UseAPX, "APX features not enabled"); + int bits = REX2BIT_W; + if (is_map1) bits |= REX2BIT_M0; + bits |= get_base_prefix_bits(adr.base()); + bits |= get_index_prefix_bits(adr.index()); + return WREX2 | bits; +} + int Assembler::get_prefixq(Address adr, bool is_map1) { if (adr.base_needs_rex2() || adr.index_needs_rex2()) { return get_prefixq_rex2(adr, is_map1); @@ -13190,15 +13268,6 @@ int Assembler::get_prefixq(Address adr, bool is_map1) { return is_map1 ? (((int16_t)prfx) << 8) | 0x0F : (int16_t)prfx; } -int Assembler::get_prefixq_rex2(Address adr, bool is_map1) { - assert(UseAPX, "APX features not enabled"); - int bits = REXBIT_W; - if (is_map1) bits |= REX2BIT_M0; - bits |= get_base_prefix_bits(adr.base()); - bits |= get_index_prefix_bits(adr.index()); - return WREX2 | bits; -} - int Assembler::get_prefixq(Address adr, Register src, bool is_map1) { if (adr.base_needs_rex2() || adr.index_needs_rex2() || src->encoding() >= 16) { return get_prefixq_rex2(adr, src, is_map1); @@ -13243,7 +13312,7 @@ int Assembler::get_prefixq(Address adr, Register src, bool is_map1) { int Assembler::get_prefixq_rex2(Address adr, Register src, bool is_map1) { assert(UseAPX, "APX features not enabled"); - int bits = REXBIT_W; + int bits = REX2BIT_W; if (is_map1) bits |= REX2BIT_M0; bits |= get_base_prefix_bits(adr.base()); bits |= get_index_prefix_bits(adr.index()); @@ -13306,7 +13375,7 @@ void Assembler::prefixq(Address adr, XMMRegister src) { } void Assembler::prefixq_rex2(Address adr, XMMRegister src) { - int bits = REXBIT_W; + int bits = REX2BIT_W; bits |= get_base_prefix_bits(adr.base()); bits |= get_index_prefix_bits(adr.index()); bits |= get_reg_prefix_bits(src->encoding()); @@ -13329,7 +13398,7 @@ int Assembler::prefixq_and_encode(int reg_enc, bool is_map1) { int Assembler::prefixq_and_encode_rex2(int reg_enc, bool is_map1) { - prefix16(WREX2 | REXBIT_W | (is_map1 ? REX2BIT_M0: 0) | get_base_prefix_bits(reg_enc)); + prefix16(WREX2 | REX2BIT_W | (is_map1 ? REX2BIT_M0: 0) | get_base_prefix_bits(reg_enc)); return reg_enc & 0x7; } @@ -13358,7 +13427,7 @@ int Assembler::prefixq_and_encode(int dst_enc, int src_enc, bool is_map1) { } int Assembler::prefixq_and_encode_rex2(int dst_enc, int src_enc, bool is_map1) { - int init_bits = REXBIT_W | (is_map1 ? REX2BIT_M0 : 0); + int init_bits = REX2BIT_W | (is_map1 ? REX2BIT_M0 : 0); return prefix_and_encode_rex2(dst_enc, src_enc, init_bits); } @@ -14168,7 +14237,7 @@ void Assembler::precompute_instructions() { ResourceMark rm; // Make a temporary buffer big enough for the routines we're capturing - int size = 256; + int size = UseAPX ? 512 : 256; char* tmp_code = NEW_RESOURCE_ARRAY(char, size); CodeBuffer buffer((address)tmp_code, size); MacroAssembler masm(&buffer); @@ -14212,31 +14281,6 @@ static void emit_copy(CodeSection* code_section, u_char* src, int src_len) { code_section->set_end(end + src_len); } -void Assembler::popa() { // 64bit - emit_copy(code_section(), popa_code, popa_len); -} - -void Assembler::popa_uncached() { // 64bit - movq(r15, Address(rsp, 0)); - movq(r14, Address(rsp, wordSize)); - movq(r13, Address(rsp, 2 * wordSize)); - movq(r12, Address(rsp, 3 * wordSize)); - movq(r11, Address(rsp, 4 * wordSize)); - movq(r10, Address(rsp, 5 * wordSize)); - movq(r9, Address(rsp, 6 * wordSize)); - movq(r8, Address(rsp, 7 * wordSize)); - movq(rdi, Address(rsp, 8 * wordSize)); - movq(rsi, Address(rsp, 9 * wordSize)); - movq(rbp, Address(rsp, 10 * wordSize)); - // Skip rsp as it is restored automatically to the value - // before the corresponding pusha when popa is done. - movq(rbx, Address(rsp, 12 * wordSize)); - movq(rdx, Address(rsp, 13 * wordSize)); - movq(rcx, Address(rsp, 14 * wordSize)); - movq(rax, Address(rsp, 15 * wordSize)); - - addq(rsp, 16 * wordSize); -} // Does not actually store the value of rsp on the stack. // The slot for rsp just contains an arbitrary value. @@ -14247,26 +14291,107 @@ void Assembler::pusha() { // 64bit // Does not actually store the value of rsp on the stack. // The slot for rsp just contains an arbitrary value. void Assembler::pusha_uncached() { // 64bit - subq(rsp, 16 * wordSize); - - movq(Address(rsp, 15 * wordSize), rax); - movq(Address(rsp, 14 * wordSize), rcx); - movq(Address(rsp, 13 * wordSize), rdx); - movq(Address(rsp, 12 * wordSize), rbx); - // Skip rsp as the value is normally not used. There are a few places where - // the original value of rsp needs to be known but that can be computed - // from the value of rsp immediately after pusha (rsp + 16 * wordSize). - movq(Address(rsp, 10 * wordSize), rbp); - movq(Address(rsp, 9 * wordSize), rsi); - movq(Address(rsp, 8 * wordSize), rdi); - movq(Address(rsp, 7 * wordSize), r8); - movq(Address(rsp, 6 * wordSize), r9); - movq(Address(rsp, 5 * wordSize), r10); - movq(Address(rsp, 4 * wordSize), r11); - movq(Address(rsp, 3 * wordSize), r12); - movq(Address(rsp, 2 * wordSize), r13); - movq(Address(rsp, wordSize), r14); - movq(Address(rsp, 0), r15); + if (UseAPX) { + // Data being pushed by PUSH2 must be 16B-aligned on the stack, for this push rax upfront + // and use it as a temporary register for stack alignment. + pushp(rax); + // Move original stack pointer to RAX and align stack pointer to 16B boundary. + movq(rax, rsp); + andq(rsp, -(StackAlignmentInBytes)); + // Push pair of original stack pointer along with remaining registers + // at 16B aligned boundary. + push2p(rax, r31); + push2p(r30, r29); + push2p(r28, r27); + push2p(r26, r25); + push2p(r24, r23); + push2p(r22, r21); + push2p(r20, r19); + push2p(r18, r17); + push2p(r16, r15); + push2p(r14, r13); + push2p(r12, r11); + push2p(r10, r9); + push2p(r8, rdi); + push2p(rsi, rbp); + push2p(rbx, rdx); + // To maintain 16 byte alignment after rcx is pushed. + subq(rsp, 8); + pushp(rcx); + } else { + subq(rsp, 16 * wordSize); + movq(Address(rsp, 15 * wordSize), rax); + movq(Address(rsp, 14 * wordSize), rcx); + movq(Address(rsp, 13 * wordSize), rdx); + movq(Address(rsp, 12 * wordSize), rbx); + // Skip rsp as the value is normally not used. There are a few places where + // the original value of rsp needs to be known but that can be computed + // from the value of rsp immediately after pusha (rsp + 16 * wordSize). + // FIXME: For APX any such direct access should also consider EGPR size + // during address compution. + movq(Address(rsp, 10 * wordSize), rbp); + movq(Address(rsp, 9 * wordSize), rsi); + movq(Address(rsp, 8 * wordSize), rdi); + movq(Address(rsp, 7 * wordSize), r8); + movq(Address(rsp, 6 * wordSize), r9); + movq(Address(rsp, 5 * wordSize), r10); + movq(Address(rsp, 4 * wordSize), r11); + movq(Address(rsp, 3 * wordSize), r12); + movq(Address(rsp, 2 * wordSize), r13); + movq(Address(rsp, wordSize), r14); + movq(Address(rsp, 0), r15); + } +} + +void Assembler::popa() { // 64bit + emit_copy(code_section(), popa_code, popa_len); +} + +void Assembler::popa_uncached() { // 64bit + if (UseAPX) { + popp(rcx); + addq(rsp, 8); + // Data being popped by POP2 must be 16B-aligned on the stack. + pop2p(rdx, rbx); + pop2p(rbp, rsi); + pop2p(rdi, r8); + pop2p(r9, r10); + pop2p(r11, r12); + pop2p(r13, r14); + pop2p(r15, r16); + pop2p(r17, r18); + pop2p(r19, r20); + pop2p(r21, r22); + pop2p(r23, r24); + pop2p(r25, r26); + pop2p(r27, r28); + pop2p(r29, r30); + // Popped value in RAX holds original unaligned stack pointer. + pop2p(r31, rax); + // Reinstantiate original stack pointer. + movq(rsp, rax); + popp(rax); + } else { + movq(r15, Address(rsp, 0)); + movq(r14, Address(rsp, wordSize)); + movq(r13, Address(rsp, 2 * wordSize)); + movq(r12, Address(rsp, 3 * wordSize)); + movq(r11, Address(rsp, 4 * wordSize)); + movq(r10, Address(rsp, 5 * wordSize)); + movq(r9, Address(rsp, 6 * wordSize)); + movq(r8, Address(rsp, 7 * wordSize)); + movq(rdi, Address(rsp, 8 * wordSize)); + movq(rsi, Address(rsp, 9 * wordSize)); + movq(rbp, Address(rsp, 10 * wordSize)); + // Skip rsp as it is restored automatically to the value + // before the corresponding pusha when popa is done. + movq(rbx, Address(rsp, 12 * wordSize)); + movq(rdx, Address(rsp, 13 * wordSize)); + movq(rcx, Address(rsp, 14 * wordSize)); + movq(rax, Address(rsp, 15 * wordSize)); + + addq(rsp, 16 * wordSize); + } } void Assembler::vzeroupper() { diff --git a/src/hotspot/cpu/x86/assembler_x86.hpp b/src/hotspot/cpu/x86/assembler_x86.hpp index 41a639248286e..28457b7005b34 100644 --- a/src/hotspot/cpu/x86/assembler_x86.hpp +++ b/src/hotspot/cpu/x86/assembler_x86.hpp @@ -530,14 +530,16 @@ class Assembler : public AbstractAssembler { }; enum PrefixBits { - REXBIT_B = 0x01, - REXBIT_X = 0x02, - REXBIT_R = 0x04, - REXBIT_W = 0x08, + REX2BIT_B = 0x01, + REX2BIT_X = 0x02, + REX2BIT_R = 0x04, + REX2BIT_W = 0x08, REX2BIT_B4 = 0x10, REX2BIT_X4 = 0x20, REX2BIT_R4 = 0x40, - REX2BIT_M0 = 0x80 + REX2BIT_M0 = 0x80, + REX2BIT_WB = 0x09, + REX2BIT_WB4 = 0x18, }; enum VexPrefix { @@ -1017,6 +1019,15 @@ class Assembler : public AbstractAssembler { void pusha_uncached(); void popa_uncached(); + + // APX ISA extensions for register save/restore optimizations. + void push2(Register src1, Register src2, bool with_ppx = false); + void pop2(Register src1, Register src2, bool with_ppx = false); + void push2p(Register src1, Register src2); + void pop2p(Register src1, Register src2); + void pushp(Register src); + void popp(Register src); + #endif void vzeroupper_uncached(); void decq(Register dst); @@ -3070,7 +3081,6 @@ class InstructionAttr { } void set_extended_context(void) { _is_extended_context = true; } - }; #endif // CPU_X86_ASSEMBLER_X86_HPP diff --git a/src/hotspot/cpu/x86/c1_Defs_x86.hpp b/src/hotspot/cpu/x86/c1_Defs_x86.hpp index 28da99cdf2764..e7ec63f83a778 100644 --- a/src/hotspot/cpu/x86/c1_Defs_x86.hpp +++ b/src/hotspot/cpu/x86/c1_Defs_x86.hpp @@ -39,7 +39,7 @@ enum { // registers enum { - pd_nof_cpu_regs_frame_map = Register::number_of_registers, // number of registers used during code emission + pd_nof_cpu_regs_frame_map = NOT_LP64(8) LP64_ONLY(16), // number of registers used during code emission pd_nof_fpu_regs_frame_map = FloatRegister::number_of_registers, // number of registers used during code emission pd_nof_xmm_regs_frame_map = XMMRegister::number_of_registers, // number of registers used during code emission diff --git a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp index 978708d03e66b..e2fde10b98d86 100644 --- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp @@ -2836,7 +2836,7 @@ void LIR_Assembler::align_call(LIR_Code code) { offset += NativeCall::displacement_offset; break; case lir_icvirtual_call: - offset += NativeCall::displacement_offset + NativeMovConstReg::instruction_size; + offset += NativeCall::displacement_offset + NativeMovConstReg::instruction_size_rex; break; default: ShouldNotReachHere(); } @@ -2873,7 +2873,7 @@ void LIR_Assembler::emit_static_call_stub() { int start = __ offset(); // make sure that the displacement word of the call ends up word aligned - __ align(BytesPerWord, __ offset() + NativeMovConstReg::instruction_size + NativeCall::displacement_offset); + __ align(BytesPerWord, __ offset() + NativeMovConstReg::instruction_size_rex + NativeCall::displacement_offset); __ relocate(static_stub_Relocation::spec(call_pc)); __ mov_metadata(rbx, (Metadata*)nullptr); // must be set to -1 at code generation time diff --git a/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp b/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp index 2c24c0c2cfb17..dc051127feaec 100644 --- a/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp +++ b/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp @@ -420,7 +420,12 @@ static OopMap* generate_oop_map(StubAssembler* sasm, int num_rt_args, void C1_MacroAssembler::save_live_registers_no_oop_map(bool save_fpu_registers) { __ block_comment("save_live_registers"); - __ pusha(); // integer registers + // Push CPU state in multiple of 16 bytes +#ifdef _LP64 + __ save_legacy_gprs(); +#else + __ pusha(); +#endif // assert(float_regs_as_doubles_off % 2 == 0, "misaligned offset"); // assert(xmm_regs_as_doubles_off % 2 == 0, "misaligned offset"); @@ -560,7 +565,12 @@ void C1_MacroAssembler::restore_live_registers(bool restore_fpu_registers) { __ block_comment("restore_live_registers"); restore_fpu(this, restore_fpu_registers); +#ifdef _LP64 + __ restore_legacy_gprs(); +#else __ popa(); +#endif + } diff --git a/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp b/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp index b71b5a2ab47ef..64ad743067476 100644 --- a/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp @@ -583,6 +583,25 @@ void SaveLiveRegisters::initialize(BarrierStubC2* stub) { caller_saved.Insert(OptoReg::as_OptoReg(r10->as_VMReg())); caller_saved.Insert(OptoReg::as_OptoReg(r11->as_VMReg())); + if (UseAPX) { + caller_saved.Insert(OptoReg::as_OptoReg(r16->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r17->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r18->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r19->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r20->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r21->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r22->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r23->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r24->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r25->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r26->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r27->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r28->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r29->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r30->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r31->as_VMReg())); + } + int gp_spill_size = 0; int opmask_spill_size = 0; int xmm_spill_size = 0; diff --git a/src/hotspot/cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp b/src/hotspot/cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp index 4805b21308442..a7dc34b17b1f6 100644 --- a/src/hotspot/cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp @@ -484,6 +484,25 @@ class XSaveLiveRegisters { caller_saved.Insert(OptoReg::as_OptoReg(r11->as_VMReg())); caller_saved.Remove(OptoReg::as_OptoReg(stub->ref()->as_VMReg())); + if (UseAPX) { + caller_saved.Insert(OptoReg::as_OptoReg(r16->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r17->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r18->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r19->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r20->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r21->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r22->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r23->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r24->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r25->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r26->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r27->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r28->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r29->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r30->as_VMReg())); + caller_saved.Insert(OptoReg::as_OptoReg(r31->as_VMReg())); + } + // Create mask of live registers RegMask live = stub->live(); if (stub->tmp() != noreg) { diff --git a/src/hotspot/cpu/x86/globals_x86.hpp b/src/hotspot/cpu/x86/globals_x86.hpp index 03fd26195c0ad..54888a9f849d9 100644 --- a/src/hotspot/cpu/x86/globals_x86.hpp +++ b/src/hotspot/cpu/x86/globals_x86.hpp @@ -115,7 +115,6 @@ define_pd_global(intx, InitArrayShortSize, 8*BytesPerLong); "Highest supported AVX instructions set on x86/x64") \ range(0, 3) \ \ - \ product(bool, UseAPX, false, EXPERIMENTAL, \ "Use Intel Advanced Performance Extensions") \ \ @@ -192,7 +191,6 @@ define_pd_global(intx, InitArrayShortSize, 8*BytesPerLong); product(bool, IntelJccErratumMitigation, true, DIAGNOSTIC, \ "Turn off JVM mitigations related to Intel micro code " \ "mitigations for the Intel JCC erratum") \ - \ // end of ARCH_FLAGS #endif // CPU_X86_GLOBALS_X86_HPP diff --git a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp index 94708d4224379..21095692d19dc 100644 --- a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp +++ b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp @@ -49,12 +49,17 @@ jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMC return (pc_offset + NativeCall::instruction_size); } else if (inst->is_mov_literal64()) { // mov+call instruction pair - jint offset = pc_offset + NativeMovConstReg::instruction_size; + jint offset = pc_offset + ((NativeMovConstReg*)inst)->instruction_size(); u_char* call = (u_char*) (_instructions->start() + offset); if (call[0] == Assembler::REX_B) { offset += 1; /* prefix byte for extended register R8-R15 */ call++; } + if (call[0] == Assembler::REX2) { + offset += 2; /* prefix byte for APX extended GPR register R16-R31 */ + call+=2; + } + // Register indirect call. assert(call[0] == 0xFF, "expected call"); offset += 2; /* opcode byte + modrm byte */ return (offset); diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.cpp b/src/hotspot/cpu/x86/macroAssembler_x86.cpp index 851b89a0a060f..64142a6aee5d6 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp @@ -4087,6 +4087,11 @@ RegSet MacroAssembler::call_clobbered_gp_registers() { regs += RegSet::range(r8, r11); #else regs += RegSet::of(rax, rcx, rdx); +#endif +#ifdef _LP64 + if (UseAPX) { + regs += RegSet::range(r16, as_Register(Register::number_of_registers - 1)); + } #endif return regs; } @@ -10379,3 +10384,45 @@ void MacroAssembler::lightweight_unlock(Register obj, Register reg_rax, Register bind(unlocked); } + +#ifdef _LP64 +// Saves legacy GPRs state on stack. +void MacroAssembler::save_legacy_gprs() { + subq(rsp, 16 * wordSize); + movq(Address(rsp, 15 * wordSize), rax); + movq(Address(rsp, 14 * wordSize), rcx); + movq(Address(rsp, 13 * wordSize), rdx); + movq(Address(rsp, 12 * wordSize), rbx); + movq(Address(rsp, 10 * wordSize), rbp); + movq(Address(rsp, 9 * wordSize), rsi); + movq(Address(rsp, 8 * wordSize), rdi); + movq(Address(rsp, 7 * wordSize), r8); + movq(Address(rsp, 6 * wordSize), r9); + movq(Address(rsp, 5 * wordSize), r10); + movq(Address(rsp, 4 * wordSize), r11); + movq(Address(rsp, 3 * wordSize), r12); + movq(Address(rsp, 2 * wordSize), r13); + movq(Address(rsp, wordSize), r14); + movq(Address(rsp, 0), r15); +} + +// Resotres back legacy GPRs state from stack. +void MacroAssembler::restore_legacy_gprs() { + movq(r15, Address(rsp, 0)); + movq(r14, Address(rsp, wordSize)); + movq(r13, Address(rsp, 2 * wordSize)); + movq(r12, Address(rsp, 3 * wordSize)); + movq(r11, Address(rsp, 4 * wordSize)); + movq(r10, Address(rsp, 5 * wordSize)); + movq(r9, Address(rsp, 6 * wordSize)); + movq(r8, Address(rsp, 7 * wordSize)); + movq(rdi, Address(rsp, 8 * wordSize)); + movq(rsi, Address(rsp, 9 * wordSize)); + movq(rbp, Address(rsp, 10 * wordSize)); + movq(rbx, Address(rsp, 12 * wordSize)); + movq(rdx, Address(rsp, 13 * wordSize)); + movq(rcx, Address(rsp, 14 * wordSize)); + movq(rax, Address(rsp, 15 * wordSize)); + addq(rsp, 16 * wordSize); +} +#endif diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.hpp b/src/hotspot/cpu/x86/macroAssembler_x86.hpp index 492ea99e04536..2ecd2bbe96d49 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.hpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.hpp @@ -2150,6 +2150,11 @@ class MacroAssembler: public Assembler { void lightweight_lock(Register obj, Register reg_rax, Register thread, Register tmp, Label& slow); void lightweight_unlock(Register obj, Register reg_rax, Register thread, Register tmp, Label& slow); + +#ifdef _LP64 + void save_legacy_gprs(); + void restore_legacy_gprs(); +#endif }; /** diff --git a/src/hotspot/cpu/x86/methodHandles_x86.cpp b/src/hotspot/cpu/x86/methodHandles_x86.cpp index 16973816f7bf9..de897d71facef 100644 --- a/src/hotspot/cpu/x86/methodHandles_x86.cpp +++ b/src/hotspot/cpu/x86/methodHandles_x86.cpp @@ -536,10 +536,11 @@ void trace_method_handle_stub(const char* adaptername, Register r = as_Register(i); // The registers are stored in reverse order on the stack (by pusha). #ifdef AMD64 - assert(Register::number_of_registers == 16, "sanity"); + int num_regs = UseAPX ? 32 : 16; + assert(Register::available_gp_registers() == num_regs, "sanity"); if (r == rsp) { // rsp is actually not stored by pusha(), compute the old rsp from saved_regs (rsp after pusha): saved_regs + 16 = old rsp - ls.print("%3s=" PTR_FORMAT, r->name(), (intptr_t)(&saved_regs[16])); + ls.print("%3s=" PTR_FORMAT, r->name(), (intptr_t)(&saved_regs[num_regs])); } else { ls.print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]); } diff --git a/src/hotspot/cpu/x86/nativeInst_x86.cpp b/src/hotspot/cpu/x86/nativeInst_x86.cpp index 0426c0f51741d..395c3219809de 100644 --- a/src/hotspot/cpu/x86/nativeInst_x86.cpp +++ b/src/hotspot/cpu/x86/nativeInst_x86.cpp @@ -160,8 +160,13 @@ void NativeCall::set_destination_mt_safe(address dest) { void NativeMovConstReg::verify() { #ifdef AMD64 // make sure code pattern is actually a mov reg64, imm64 instruction - if ((ubyte_at(0) != Assembler::REX_W && ubyte_at(0) != Assembler::REX_WB) || - (ubyte_at(1) & (0xff ^ register_mask)) != 0xB8) { + bool valid_rex_prefix = ubyte_at(0) == Assembler::REX_W || ubyte_at(0) == Assembler::REX_WB; + bool valid_rex2_prefix = ubyte_at(0) == Assembler::REX2 && + (ubyte_at(1) == Assembler::REX2BIT_W || + ubyte_at(1) == Assembler::REX2BIT_WB || + ubyte_at(1) == Assembler::REX2BIT_WB4); + int opcode = has_rex2_prefix() ? ubyte_at(2) : ubyte_at(1); + if ((!valid_rex_prefix || !valid_rex2_prefix) && (opcode & (0xff ^ register_mask)) != 0xB8) { print(); fatal("not a REX.W[B] mov reg64, imm64"); } @@ -208,6 +213,11 @@ int NativeMovRegMem::instruction_start() const { instr_0 = ubyte_at(off); } + if (instr_0 == instruction_REX2_prefix) { + off+=2; + instr_0 = ubyte_at(off); + } + if (instr_0 == instruction_code_xor) { off += 2; instr_0 = ubyte_at(off); @@ -226,29 +236,39 @@ int NativeMovRegMem::instruction_start() const { instr_0 = ubyte_at(off); } + if (instr_0 == instruction_REX2_prefix) { + off+=2; + instr_0 = ubyte_at(off); + } + if ( instr_0 >= instruction_prefix_wide_lo && // 0x40 instr_0 <= instruction_prefix_wide_hi) { // 0x4f off++; instr_0 = ubyte_at(off); } - + // Extended prefixes can only follow REX prefixes, + // REX2 is directly followed by main opcode. if (instr_0 == instruction_extended_prefix ) { // 0x0f off++; } + // Offset of instruction opcode. return off; } +// Format [REX/REX2] [OPCODE] [ModRM] [SIB] [IMM/DISP32] int NativeMovRegMem::patch_offset() const { int off = data_offset + instruction_start(); u_char mod_rm = *(u_char*)(instruction_address() + 1); // nnnn(r12|rsp) isn't coded as simple mod/rm since that is // the encoding to use an SIB byte. Which will have the nnnn // field off by one byte + // ModRM Byte Format = Mod[2] REG[3] RM[3] if ((mod_rm & 7) == 0x4) { off++; } + // Displacement offset. return off; } @@ -294,12 +314,6 @@ void NativeMovRegMem::print() { void NativeLoadAddress::verify() { // make sure code pattern is actually a mov [reg+offset], reg instruction u_char test_byte = *(u_char*)instruction_address(); -#ifdef _LP64 - if ( (test_byte == instruction_prefix_wide || - test_byte == instruction_prefix_wide_extended) ) { - test_byte = *(u_char*)(instruction_address() + 1); - } -#endif // _LP64 if ( ! ((test_byte == lea_instruction_code) LP64_ONLY(|| (test_byte == mov64_instruction_code) ))) { fatal ("not a lea reg, [reg+offs] instruction"); diff --git a/src/hotspot/cpu/x86/nativeInst_x86.hpp b/src/hotspot/cpu/x86/nativeInst_x86.hpp index 3a30047294429..d02387aa9ffbb 100644 --- a/src/hotspot/cpu/x86/nativeInst_x86.hpp +++ b/src/hotspot/cpu/x86/nativeInst_x86.hpp @@ -90,6 +90,7 @@ class NativeInstruction { void wrote(int offset); public: + bool has_rex2_prefix() const { return ubyte_at(0) == Assembler::REX2; } inline friend NativeInstruction* nativeInstruction_at(address address); }; @@ -178,19 +179,28 @@ inline NativeCall* nativeCall_before(address return_address) { return call; } +// Call with target address in a general purpose register(indirect absolute addressing). +// Encoding : FF /2 CALL r/m32 +// Primary Opcode: FF +// Opcode Extension(part of ModRM.REG): /2 +// Operand ModRM.RM = r/m32 class NativeCallReg: public NativeInstruction { public: enum Intel_specific_constants { instruction_code = 0xFF, instruction_offset = 0, return_address_offset_norex = 2, - return_address_offset_rex = 3 + return_address_offset_rex = 3, + return_address_offset_rex2 = 4 }; int next_instruction_offset() const { if (ubyte_at(0) == NativeCallReg::instruction_code) { return return_address_offset_norex; + } else if (has_rex2_prefix()) { + return return_address_offset_rex2; } else { + assert((ubyte_at(0) & 0xF0) == Assembler::REX, ""); return return_address_offset_rex; } } @@ -198,28 +208,38 @@ class NativeCallReg: public NativeInstruction { // An interface for accessing/manipulating native mov reg, imm32 instructions. // (used to manipulate inlined 32bit data dll calls, etc.) +// Instruction format for implied addressing mode immediate operand move to register instruction: +// [REX/REX2] [OPCODE] [IMM32] class NativeMovConstReg: public NativeInstruction { #ifdef AMD64 static const bool has_rex = true; static const int rex_size = 1; + static const int rex2_size = 2; #else static const bool has_rex = false; static const int rex_size = 0; + static const int rex2_size = 0; #endif // AMD64 public: enum Intel_specific_constants { - instruction_code = 0xB8, - instruction_size = 1 + rex_size + wordSize, - instruction_offset = 0, - data_offset = 1 + rex_size, - next_instruction_offset = instruction_size, - register_mask = 0x07 + instruction_code = 0xB8, + instruction_offset = 0, + instruction_size_rex = 1 + rex_size + wordSize, + instruction_size_rex2 = 1 + rex2_size + wordSize, + data_offset_rex = 1 + rex_size, + data_offset_rex2 = 1 + rex2_size, + next_instruction_offset_rex = instruction_size_rex, + next_instruction_offset_rex2 = instruction_size_rex2, + register_mask = 0x07 }; + int instruction_size() const { return has_rex2_prefix() ? instruction_size_rex2 : instruction_size_rex; } + int next_inst_offset() const { return has_rex2_prefix() ? next_instruction_offset_rex2 : next_instruction_offset_rex; } + int data_byte_offset() const { return has_rex2_prefix() ? data_offset_rex2 : data_offset_rex;} address instruction_address() const { return addr_at(instruction_offset); } - address next_instruction_address() const { return addr_at(next_instruction_offset); } - intptr_t data() const { return ptr_at(data_offset); } - void set_data(intptr_t x) { set_ptr_at(data_offset, x); } + address next_instruction_address() const { return addr_at(next_inst_offset()); } + intptr_t data() const { return ptr_at(data_byte_offset()); } + void set_data(intptr_t x) { set_ptr_at(data_byte_offset(), x); } void verify(); void print(); @@ -238,7 +258,10 @@ inline NativeMovConstReg* nativeMovConstReg_at(address address) { } inline NativeMovConstReg* nativeMovConstReg_before(address address) { - NativeMovConstReg* test = (NativeMovConstReg*)(address - NativeMovConstReg::instruction_size - NativeMovConstReg::instruction_offset); + int instruction_size = ((NativeInstruction*)(address))->has_rex2_prefix() ? + NativeMovConstReg::instruction_size_rex2 : + NativeMovConstReg::instruction_size_rex; + NativeMovConstReg* test = (NativeMovConstReg*)(address - instruction_size - NativeMovConstReg::instruction_offset); #ifdef ASSERT test->verify(); #endif @@ -279,35 +302,47 @@ class NativeMovRegMem: public NativeInstruction { instruction_prefix_wide_hi = Assembler::REX_WRXB, instruction_code_xor = 0x33, instruction_extended_prefix = 0x0F, + + // Legacy encoding MAP1 instructions promotable to REX2 encoding. instruction_code_mem2reg_movslq = 0x63, instruction_code_mem2reg_movzxb = 0xB6, instruction_code_mem2reg_movsxb = 0xBE, instruction_code_mem2reg_movzxw = 0xB7, instruction_code_mem2reg_movsxw = 0xBF, instruction_operandsize_prefix = 0x66, + + // Legacy encoding MAP0 instructions promotable to REX2 encoding. instruction_code_reg2mem = 0x89, instruction_code_mem2reg = 0x8b, instruction_code_reg2memb = 0x88, instruction_code_mem2regb = 0x8a, + instruction_code_lea = 0x8d, + instruction_code_float_s = 0xd9, instruction_code_float_d = 0xdd, instruction_code_long_volatile = 0xdf, + + // VEX/EVEX/Legacy encodeded MAP1 instructions promotable to REX2 encoding. instruction_code_xmm_ss_prefix = 0xf3, instruction_code_xmm_sd_prefix = 0xf2, + instruction_code_xmm_code = 0x0f, + + // Address operand load/store/ldp are promotable to REX2 to accomodate + // extended SIB encoding. instruction_code_xmm_load = 0x10, instruction_code_xmm_store = 0x11, instruction_code_xmm_lpd = 0x12, - instruction_code_lea = 0x8d, - instruction_VEX_prefix_2bytes = Assembler::VEX_2bytes, instruction_VEX_prefix_3bytes = Assembler::VEX_3bytes, instruction_EVEX_prefix_4bytes = Assembler::EVEX_4bytes, + instruction_REX2_prefix = Assembler::REX2, instruction_offset = 0, data_offset = 2, - next_instruction_offset = 4 + next_instruction_offset_rex = 4, + next_instruction_offset_rex2 = 5 }; // helper @@ -438,7 +473,8 @@ inline NativeJump* nativeJump_at(address address) { return jump; } -// Handles all kinds of jump on Intel. Long/far, conditional/unconditional +// Handles all kinds of jump on Intel. Long/far, conditional/unconditional with relative offsets +// barring register indirect jumps. class NativeGeneralJump: public NativeInstruction { public: enum Intel_specific_constants { @@ -538,7 +574,7 @@ inline bool NativeInstruction::is_cond_jump() { return (int_at(0) & 0xF0FF) = inline bool NativeInstruction::is_safepoint_poll() { #ifdef AMD64 const bool has_rex_prefix = ubyte_at(0) == NativeTstRegMem::instruction_rex_b_prefix; - const int test_offset = has_rex_prefix ? 1 : 0; + const int test_offset = has_rex2_prefix() ? 2 : (has_rex_prefix ? 1 : 0); #else const int test_offset = 0; #endif @@ -549,8 +585,14 @@ inline bool NativeInstruction::is_safepoint_poll() { inline bool NativeInstruction::is_mov_literal64() { #ifdef AMD64 - return ((ubyte_at(0) == Assembler::REX_W || ubyte_at(0) == Assembler::REX_WB) && - (ubyte_at(1) & (0xff ^ NativeMovConstReg::register_mask)) == 0xB8); + bool valid_rex_prefix = ubyte_at(0) == Assembler::REX_W || ubyte_at(0) == Assembler::REX_WB; + bool valid_rex2_prefix = ubyte_at(0) == Assembler::REX2 && + (ubyte_at(1) == Assembler::REX2BIT_W || + ubyte_at(1) == Assembler::REX2BIT_WB || + ubyte_at(1) == Assembler::REX2BIT_WB4); + + int opcode = has_rex2_prefix() ? ubyte_at(2) : ubyte_at(1); + return ((valid_rex_prefix || valid_rex2_prefix) && (opcode & (0xff ^ NativeMovConstReg::register_mask)) == 0xB8); #else return false; #endif // AMD64 diff --git a/src/hotspot/cpu/x86/register_x86.cpp b/src/hotspot/cpu/x86/register_x86.cpp index 2aae4a795e3c0..bb26ab6605123 100644 --- a/src/hotspot/cpu/x86/register_x86.cpp +++ b/src/hotspot/cpu/x86/register_x86.cpp @@ -35,7 +35,9 @@ const char * Register::RegisterImpl::name() const { static const char *const names[number_of_registers] = { #ifdef _LP64 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", + "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" #else "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi" #endif // _LP64 diff --git a/src/hotspot/cpu/x86/register_x86.hpp b/src/hotspot/cpu/x86/register_x86.hpp index 5449f0d97241a..6844fdc248d36 100644 --- a/src/hotspot/cpu/x86/register_x86.hpp +++ b/src/hotspot/cpu/x86/register_x86.hpp @@ -45,8 +45,8 @@ class Register { inline friend constexpr Register as_Register(int encoding); enum { - number_of_registers = LP64_ONLY( 16 ) NOT_LP64( 8 ), - number_of_byte_registers = LP64_ONLY( 16 ) NOT_LP64( 4 ), + number_of_registers = LP64_ONLY( 32 ) NOT_LP64( 8 ), + number_of_byte_registers = LP64_ONLY( 32 ) NOT_LP64( 4 ), max_slots_per_register = LP64_ONLY( 2 ) NOT_LP64( 1 ) }; @@ -76,6 +76,16 @@ class Register { int operator!=(const Register r) const { return _encoding != r._encoding; } constexpr const RegisterImpl* operator->() const { return RegisterImpl::first() + _encoding; } + + // Actually available GP registers for use, depending on actual CPU capabilities and flags. + static int available_gp_registers() { +#ifdef _LP64 + if (!UseAPX) { + return number_of_registers / 2; + } +#endif // _LP64 + return number_of_registers; + } }; extern const Register::RegisterImpl all_RegisterImpls[Register::number_of_registers + 1] INTERNAL_VISIBILITY; @@ -115,6 +125,22 @@ constexpr Register r12 = as_Register(12); constexpr Register r13 = as_Register(13); constexpr Register r14 = as_Register(14); constexpr Register r15 = as_Register(15); +constexpr Register r16 = as_Register(16); +constexpr Register r17 = as_Register(17); +constexpr Register r18 = as_Register(18); +constexpr Register r19 = as_Register(19); +constexpr Register r20 = as_Register(20); +constexpr Register r21 = as_Register(21); +constexpr Register r22 = as_Register(22); +constexpr Register r23 = as_Register(23); +constexpr Register r24 = as_Register(24); +constexpr Register r25 = as_Register(25); +constexpr Register r26 = as_Register(26); +constexpr Register r27 = as_Register(27); +constexpr Register r28 = as_Register(28); +constexpr Register r29 = as_Register(29); +constexpr Register r30 = as_Register(30); +constexpr Register r31 = as_Register(31); #endif // _LP64 diff --git a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp index ac7baeaf74ff5..4029e486c9cdf 100644 --- a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp @@ -95,6 +95,7 @@ class RegisterSaver { // units because compiler frame slots are jints. #define XSAVE_AREA_BEGIN 160 #define XSAVE_AREA_YMM_BEGIN 576 +#define XSAVE_AREA_EGPRS 960 #define XSAVE_AREA_OPMASK_BEGIN 1088 #define XSAVE_AREA_ZMM_BEGIN 1152 #define XSAVE_AREA_UPPERBANK 1664 @@ -104,8 +105,8 @@ class RegisterSaver { #define DEF_OPMASK_OFFS(regnum) opmask ## regnum ## _off = opmask_off + (regnum)*8/BytesPerInt, opmask ## regnum ## H_off #define DEF_ZMM_UPPER_OFFS(regnum) zmm ## regnum ## _off = zmm_upper_off + (regnum-16)*64/BytesPerInt, zmm ## regnum ## H_off enum layout { - fpu_state_off = frame::arg_reg_save_area_bytes/BytesPerInt, // fxsave save area - xmm_off = fpu_state_off + XSAVE_AREA_BEGIN/BytesPerInt, // offset in fxsave save area + fpu_state_off = frame::arg_reg_save_area_bytes/BytesPerInt, // fxsave save area + xmm_off = fpu_state_off + XSAVE_AREA_BEGIN/BytesPerInt, // offset in fxsave save area DEF_XMM_OFFS(0), DEF_XMM_OFFS(1), // 2..15 are implied in range usage @@ -113,7 +114,24 @@ class RegisterSaver { DEF_YMM_OFFS(0), DEF_YMM_OFFS(1), // 2..15 are implied in range usage - opmask_off = xmm_off + (XSAVE_AREA_OPMASK_BEGIN - XSAVE_AREA_BEGIN)/BytesPerInt, + r31_off = xmm_off + (XSAVE_AREA_EGPRS - XSAVE_AREA_BEGIN)/BytesPerInt, + r31H_off, + r30_off, r30H_off, + r29_off, r29H_off, + r28_off, r28H_off, + r27_off, r27H_off, + r26_off, r26H_off, + r25_off, r25H_off, + r24_off, r24H_off, + r23_off, r23H_off, + r22_off, r22H_off, + r21_off, r21H_off, + r20_off, r20H_off, + r19_off, r19H_off, + r18_off, r18H_off, + r17_off, r17H_off, + r16_off, r16H_off, + opmask_off = xmm_off + (XSAVE_AREA_OPMASK_BEGIN - XSAVE_AREA_BEGIN)/BytesPerInt, DEF_OPMASK_OFFS(0), DEF_OPMASK_OFFS(1), // 2..7 are implied in range usage @@ -199,7 +217,13 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_ // to be under the return like a normal enter. __ enter(); // rsp becomes 16-byte aligned here - __ push_CPU_state(); // Push a multiple of 16 bytes + __ pushf(); + // Make sure rsp stays 16-byte aligned + __ subq(rsp, 8); + // Push CPU state in multiple of 16 bytes + __ save_legacy_gprs(); + __ push_FPU_state(); + // push cpu state handles this on EVEX enabled targets if (save_wide_vectors) { @@ -247,6 +271,17 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_ #endif } } + +#if COMPILER2_OR_JVMCI + if (UseAPX) { + int base_addr = XSAVE_AREA_EGPRS; + off = 0; + for(int n = 16; n < Register::number_of_registers; n++) { + __ movq(Address(rsp, base_addr+(off++*8)), as_Register(n)); + } + } +#endif + __ vzeroupper(); if (frame::arg_reg_save_area_bytes != 0) { // Allocate argument register save area @@ -279,6 +314,25 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_ map->set_callee_saved(STACK_OFFSET( r13_off ), r13->as_VMReg()); map->set_callee_saved(STACK_OFFSET( r14_off ), r14->as_VMReg()); map->set_callee_saved(STACK_OFFSET( r15_off ), r15->as_VMReg()); + + if (UseAPX) { + map->set_callee_saved(STACK_OFFSET( r16_off ), r16->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r17_off ), r17->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r18_off ), r18->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r19_off ), r19->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r20_off ), r20->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r21_off ), r21->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r22_off ), r22->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r23_off ), r23->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r24_off ), r24->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r25_off ), r25->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r26_off ), r26->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r27_off ), r27->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r28_off ), r28->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r29_off ), r29->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r30_off ), r30->as_VMReg()); + map->set_callee_saved(STACK_OFFSET( r31_off ), r31->as_VMReg()); + } // For both AVX and EVEX we will use the legacy FXSAVE area for xmm0..xmm15, // on EVEX enabled targets, we get it included in the xsave area off = xmm0_off; @@ -339,6 +393,24 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_ map->set_callee_saved(STACK_OFFSET( r13H_off ), r13->as_VMReg()->next()); map->set_callee_saved(STACK_OFFSET( r14H_off ), r14->as_VMReg()->next()); map->set_callee_saved(STACK_OFFSET( r15H_off ), r15->as_VMReg()->next()); + if (UseAPX) { + map->set_callee_saved(STACK_OFFSET( r16H_off ), r16->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r17H_off ), r17->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r18H_off ), r18->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r19H_off ), r19->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r20H_off ), r20->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r21H_off ), r21->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r22H_off ), r22->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r23H_off ), r23->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r24H_off ), r24->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r25H_off ), r25->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r26H_off ), r26->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r27H_off ), r27->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r28H_off ), r28->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r29H_off ), r29->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r30H_off ), r30->as_VMReg()->next()); + map->set_callee_saved(STACK_OFFSET( r31H_off ), r31->as_VMReg()->next()); + } // For both AVX and EVEX we will use the legacy FXSAVE area for xmm0..xmm15, // on EVEX enabled targets, we get it included in the xsave area off = xmm0H_off; @@ -428,8 +500,21 @@ void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_wi } } +#if COMPILER2_OR_JVMCI + if (UseAPX) { + int base_addr = XSAVE_AREA_EGPRS; + int off = 0; + for (int n = 16; n < Register::number_of_registers; n++) { + __ movq(as_Register(n), Address(rsp, base_addr+(off++*8))); + } + } +#endif + // Recover CPU state - __ pop_CPU_state(); + __ pop_FPU_state(); + __ restore_legacy_gprs(); + __ addq(rsp, 8); + __ popf(); // Get the rbp described implicitly by the calling convention (no oopMap) __ pop(rbp); } @@ -2543,6 +2628,9 @@ void SharedRuntime::generate_deopt_blob() { if (UseAVX > 2) { pad += 1024; } + if (UseAPX) { + pad += 1024; + } #if INCLUDE_JVMCI if (EnableJVMCI) { pad += 512; // Increase the buffer size when compiling for JVMCI @@ -3091,7 +3179,7 @@ SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_t OopMap* map; // Allocate space for the code. Setup code generation tools. - CodeBuffer buffer("handler_blob", 2048, 1024); + CodeBuffer buffer("handler_blob", 2348, 1024); MacroAssembler* masm = new MacroAssembler(&buffer); address start = __ pc(); @@ -3247,7 +3335,7 @@ RuntimeStub* SharedRuntime::generate_resolve_blob(address destination, const cha // allocate space for the code ResourceMark rm; - CodeBuffer buffer(name, 1200, 512); + CodeBuffer buffer(name, 1552, 512); MacroAssembler* masm = new MacroAssembler(&buffer); int frame_size_in_words; diff --git a/src/hotspot/cpu/x86/upcallLinker_x86_64.cpp b/src/hotspot/cpu/x86/upcallLinker_x86_64.cpp index 7b9d49dd46140..82179f9022e92 100644 --- a/src/hotspot/cpu/x86/upcallLinker_x86_64.cpp +++ b/src/hotspot/cpu/x86/upcallLinker_x86_64.cpp @@ -40,13 +40,17 @@ #define __ _masm-> static bool is_valid_XMM(XMMRegister reg) { - return reg->is_valid() && (UseAVX >= 3 || (reg->encoding() < 16)); // why is this not covered by is_valid()? + return reg->is_valid() && (reg->encoding() < (UseAVX >= 3 ? 32 : 16)); // why is this not covered by is_valid()? +} + +static bool is_valid_gp(Register reg) { + return reg->is_valid() && (reg->encoding() < (UseAPX ? 32 : 16)); } // for callee saved regs, according to the caller's ABI static int compute_reg_save_area_size(const ABIDescriptor& abi) { int size = 0; - for (Register reg = as_Register(0); reg->is_valid(); reg = reg->successor()) { + for (Register reg = as_Register(0); is_valid_gp(reg); reg = reg->successor()) { if (reg == rbp || reg == rsp) continue; // saved/restored by prologue/epilogue if (!abi.is_volatile_reg(reg)) { size += 8; // bytes @@ -84,7 +88,7 @@ static void preserve_callee_saved_registers(MacroAssembler* _masm, const ABIDesc int offset = reg_save_area_offset; __ block_comment("{ preserve_callee_saved_regs "); - for (Register reg = as_Register(0); reg->is_valid(); reg = reg->successor()) { + for (Register reg = as_Register(0); is_valid_gp(reg); reg = reg->successor()) { if (reg == rbp || reg == rsp) continue; // saved/restored by prologue/epilogue if (!abi.is_volatile_reg(reg)) { __ movptr(Address(rsp, offset), reg); @@ -134,7 +138,7 @@ static void restore_callee_saved_registers(MacroAssembler* _masm, const ABIDescr int offset = reg_save_area_offset; __ block_comment("{ restore_callee_saved_regs "); - for (Register reg = as_Register(0); reg->is_valid(); reg = reg->successor()) { + for (Register reg = as_Register(0); is_valid_gp(reg); reg = reg->successor()) { if (reg == rbp || reg == rsp) continue; // saved/restored by prologue/epilogue if (!abi.is_volatile_reg(reg)) { __ movptr(reg, Address(rsp, offset)); diff --git a/src/hotspot/cpu/x86/vm_version_x86.cpp b/src/hotspot/cpu/x86/vm_version_x86.cpp index 103a7726276c7..02e147743cb1d 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.cpp +++ b/src/hotspot/cpu/x86/vm_version_x86.cpp @@ -108,6 +108,7 @@ class VM_Version_StubGenerator: public StubCodeGenerator { VM_Version_StubGenerator(CodeBuffer *c) : StubCodeGenerator(c) {} +#if defined(_LP64) address clear_apx_test_state() { # define __ _masm-> address start = __ pc(); @@ -115,7 +116,6 @@ class VM_Version_StubGenerator: public StubCodeGenerator { // handling guarantees that preserved register values post signal handling were // re-instantiated by operating system and not because they were not modified externally. - /* FIXME Uncomment following code after OS enablement of bool save_apx = UseAPX; VM_Version::set_apx_cpuFeatures(); UseAPX = true; @@ -124,10 +124,10 @@ class VM_Version_StubGenerator: public StubCodeGenerator { __ mov64(r31, 0L); UseAPX = save_apx; VM_Version::clean_cpuFeatures(); - */ __ ret(0); return start; } +#endif address generate_get_cpu_info() { // Flags to test CPU type. @@ -419,7 +419,7 @@ class VM_Version_StubGenerator: public StubCodeGenerator { __ movl(Address(rsi, 8), rcx); __ movl(Address(rsi,12), rdx); -#ifndef PRODUCT +#if defined(_LP64) // // Check if OS has enabled XGETBV instruction to access XCR0 // (OSXSAVE feature flag) and CPU supports APX @@ -437,26 +437,22 @@ class VM_Version_StubGenerator: public StubCodeGenerator { __ cmpl(rax, 0x80000); __ jcc(Assembler::notEqual, vector_save_restore); - /* FIXME: Uncomment while integrating JDK-8329032 bool save_apx = UseAPX; VM_Version::set_apx_cpuFeatures(); UseAPX = true; __ mov64(r16, VM_Version::egpr_test_value()); __ mov64(r31, VM_Version::egpr_test_value()); - */ __ xorl(rsi, rsi); VM_Version::set_cpuinfo_segv_addr_apx(__ pc()); // Generate SEGV __ movl(rax, Address(rsi, 0)); VM_Version::set_cpuinfo_cont_addr_apx(__ pc()); - /* FIXME: Uncomment after integration of JDK-8329032 __ lea(rsi, Address(rbp, in_bytes(VM_Version::apx_save_offset()))); __ movq(Address(rsi, 0), r16); __ movq(Address(rsi, 8), r31); UseAPX = save_apx; - */ #endif __ bind(vector_save_restore); // @@ -2170,9 +2166,11 @@ int VM_Version::avx3_threshold() { FLAG_IS_DEFAULT(AVX3Threshold)) ? 0 : AVX3Threshold; } +#if defined(_LP64) void VM_Version::clear_apx_test_state() { clear_apx_test_state_stub(); } +#endif static bool _vm_version_initialized = false; @@ -2191,8 +2189,10 @@ void VM_Version::initialize() { detect_virt_stub = CAST_TO_FN_PTR(detect_virt_stub_t, g.generate_detect_virt()); +#if defined(_LP64) clear_apx_test_state_stub = CAST_TO_FN_PTR(clear_apx_test_state_t, g.clear_apx_test_state()); +#endif get_processor_features(); LP64_ONLY(Assembler::precompute_instructions();) @@ -3183,11 +3183,17 @@ bool VM_Version::os_supports_apx_egprs() { if (!supports_apx_f()) { return false; } + // Enable APX support for product builds after + // completion of planned features listed in JDK-8329030. +#if !defined(PRODUCT) if (_cpuid_info.apx_save[0] != egpr_test_value() || _cpuid_info.apx_save[1] != egpr_test_value()) { return false; } return true; +#else + return false; +#endif } uint VM_Version::cores_per_cpu() { diff --git a/src/hotspot/cpu/x86/vm_version_x86.hpp b/src/hotspot/cpu/x86/vm_version_x86.hpp index dc5fb960060bd..d58b5a9c09967 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.hpp +++ b/src/hotspot/cpu/x86/vm_version_x86.hpp @@ -635,7 +635,7 @@ class VM_Version : public Abstract_VM_Version { static void set_cpuinfo_cont_addr_apx(address pc) { _cpuinfo_cont_addr_apx = pc; } static address cpuinfo_cont_addr_apx() { return _cpuinfo_cont_addr_apx; } - static void clear_apx_test_state(); + LP64_ONLY(static void clear_apx_test_state()); static void clean_cpuFeatures() { _features = 0; } static void set_avx_cpuFeatures() { _features = (CPU_SSE | CPU_SSE2 | CPU_AVX | CPU_VZEROUPPER ); } diff --git a/src/hotspot/cpu/x86/vmreg_x86.hpp b/src/hotspot/cpu/x86/vmreg_x86.hpp index fcf288fe2ed38..7d73eadeb0464 100644 --- a/src/hotspot/cpu/x86/vmreg_x86.hpp +++ b/src/hotspot/cpu/x86/vmreg_x86.hpp @@ -28,7 +28,8 @@ #include "register_x86.hpp" inline bool is_Register() { - return (unsigned int) value() < (unsigned int) ConcreteRegisterImpl::max_gpr; + int uarch_max_gpr = Register::max_slots_per_register * Register::available_gp_registers(); + return (unsigned int) value() < (unsigned int) uarch_max_gpr; } inline bool is_FloatRegister() { diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad index 34eb990340178..1490cfa60b34f 100644 --- a/src/hotspot/cpu/x86/x86_64.ad +++ b/src/hotspot/cpu/x86/x86_64.ad @@ -128,6 +128,53 @@ reg_def R14_H(SOC, SOE, Op_RegI, 14, r14->as_VMReg()->next()); reg_def R15 (SOC, SOE, Op_RegI, 15, r15->as_VMReg()); reg_def R15_H(SOC, SOE, Op_RegI, 15, r15->as_VMReg()->next()); +reg_def R16 (SOC, SOC, Op_RegI, 16, r16->as_VMReg()); +reg_def R16_H(SOC, SOC, Op_RegI, 16, r16->as_VMReg()->next()); + +reg_def R17 (SOC, SOC, Op_RegI, 17, r17->as_VMReg()); +reg_def R17_H(SOC, SOC, Op_RegI, 17, r17->as_VMReg()->next()); + +reg_def R18 (SOC, SOC, Op_RegI, 18, r18->as_VMReg()); +reg_def R18_H(SOC, SOC, Op_RegI, 18, r18->as_VMReg()->next()); + +reg_def R19 (SOC, SOC, Op_RegI, 19, r19->as_VMReg()); +reg_def R19_H(SOC, SOC, Op_RegI, 19, r19->as_VMReg()->next()); + +reg_def R20 (SOC, SOC, Op_RegI, 20, r20->as_VMReg()); +reg_def R20_H(SOC, SOC, Op_RegI, 20, r20->as_VMReg()->next()); + +reg_def R21 (SOC, SOC, Op_RegI, 21, r21->as_VMReg()); +reg_def R21_H(SOC, SOC, Op_RegI, 21, r21->as_VMReg()->next()); + +reg_def R22 (SOC, SOC, Op_RegI, 22, r22->as_VMReg()); +reg_def R22_H(SOC, SOC, Op_RegI, 22, r22->as_VMReg()->next()); + +reg_def R23 (SOC, SOC, Op_RegI, 23, r23->as_VMReg()); +reg_def R23_H(SOC, SOC, Op_RegI, 23, r23->as_VMReg()->next()); + +reg_def R24 (SOC, SOC, Op_RegI, 24, r24->as_VMReg()); +reg_def R24_H(SOC, SOC, Op_RegI, 24, r24->as_VMReg()->next()); + +reg_def R25 (SOC, SOC, Op_RegI, 25, r25->as_VMReg()); +reg_def R25_H(SOC, SOC, Op_RegI, 25, r25->as_VMReg()->next()); + +reg_def R26 (SOC, SOC, Op_RegI, 26, r26->as_VMReg()); +reg_def R26_H(SOC, SOC, Op_RegI, 26, r26->as_VMReg()->next()); + +reg_def R27 (SOC, SOC, Op_RegI, 27, r27->as_VMReg()); +reg_def R27_H(SOC, SOC, Op_RegI, 27, r27->as_VMReg()->next()); + +reg_def R28 (SOC, SOC, Op_RegI, 28, r28->as_VMReg()); +reg_def R28_H(SOC, SOC, Op_RegI, 28, r28->as_VMReg()->next()); + +reg_def R29 (SOC, SOC, Op_RegI, 29, r29->as_VMReg()); +reg_def R29_H(SOC, SOC, Op_RegI, 29, r29->as_VMReg()->next()); + +reg_def R30 (SOC, SOC, Op_RegI, 30, r30->as_VMReg()); +reg_def R30_H(SOC, SOC, Op_RegI, 30, r30->as_VMReg()->next()); + +reg_def R31 (SOC, SOC, Op_RegI, 31, r31->as_VMReg()); +reg_def R31_H(SOC, SOC, Op_RegI, 31, r31->as_VMReg()->next()); // Floating Point Registers @@ -154,6 +201,22 @@ alloc_class chunk0(R10, R10_H, R13, R13_H, R14, R14_H, R15, R15_H, + R16, R16_H, + R17, R17_H, + R18, R18_H, + R19, R19_H, + R20, R20_H, + R21, R21_H, + R22, R22_H, + R23, R23_H, + R24, R24_H, + R25, R25_H, + R26, R26_H, + R27, R27_H, + R28, R28_H, + R29, R29_H, + R30, R30_H, + R31, R31_H, RSP, RSP_H); @@ -167,7 +230,7 @@ alloc_class chunk0(R10, R10_H, // Empty register class. reg_class no_reg(); -// Class for all pointer/long registers +// Class for all pointer/long registers including APX extended GPRs. reg_class all_reg(RAX, RAX_H, RDX, RDX_H, RBP, RBP_H, @@ -183,9 +246,25 @@ reg_class all_reg(RAX, RAX_H, R12, R12_H, R13, R13_H, R14, R14_H, - R15, R15_H); - -// Class for all int registers + R15, R15_H, + R16, R16_H, + R17, R17_H, + R18, R18_H, + R19, R19_H, + R20, R20_H, + R21, R21_H, + R22, R22_H, + R23, R23_H, + R24, R24_H, + R25, R25_H, + R26, R26_H, + R27, R27_H, + R28, R28_H, + R29, R29_H, + R30, R30_H, + R31, R31_H); + +// Class for all int registers including APX extended GPRs. reg_class all_int_reg(RAX RDX, RBP, @@ -199,7 +278,23 @@ reg_class all_int_reg(RAX R11, R12, R13, - R14); + R14, + R16, + R17, + R18, + R19, + R20, + R21, + R22, + R23, + R24, + R25, + R26, + R27, + R28, + R29, + R30, + R31); // Class for all pointer registers reg_class any_reg %{ @@ -386,6 +481,8 @@ static bool need_r12_heapbase() { } void reg_mask_init() { + constexpr Register egprs[] = {r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30, r31}; + // _ALL_REG_mask is generated by adlc from the all_reg register class below. // We derive a number of subsets from it. _ANY_REG_mask = _ALL_REG_mask; @@ -404,6 +501,12 @@ void reg_mask_init() { _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next())); _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg())); _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg()->next())); + if (!UseAPX) { + for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { + _PTR_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); + _PTR_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg()->next())); + } + } _STACK_OR_PTR_REG_mask = _PTR_REG_mask; _STACK_OR_PTR_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); @@ -420,6 +523,7 @@ void reg_mask_init() { _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg())); _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next())); + _LONG_REG_mask = _PTR_REG_mask; _STACK_OR_LONG_REG_mask = _LONG_REG_mask; _STACK_OR_LONG_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); @@ -441,6 +545,12 @@ void reg_mask_init() { _LONG_NO_RBP_R13_REG_mask.Remove(OptoReg::as_OptoReg(r13->as_VMReg()->next())); _INT_REG_mask = _ALL_INT_REG_mask; + if (!UseAPX) { + for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { + _INT_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); + } + } + if (PreserveFramePointer) { _INT_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); } @@ -12320,7 +12430,6 @@ instruct safePoint_poll_tls(rFlagsReg cr, rRegP poll) format %{ "testl rax, [$poll]\t" "# Safepoint: poll for GC" %} ins_cost(125); - size(4); /* setting an explicit size will cause debug builds to assert if size is incorrect */ ins_encode %{ __ relocate(relocInfo::poll_type); address pre_pc = __ pc(); diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index 49f05fe94b3f5..096b52a60e2af 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -2758,7 +2758,7 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { return Handle_Exception(exceptionInfo, VM_Version::cpuinfo_cont_addr()); } -#ifndef PRODUCT +#if !defined(PRODUCT) && defined(_LP64) if ((exception_code == EXCEPTION_ACCESS_VIOLATION) && VM_Version::is_cpuinfo_segv_addr_apx(pc)) { // Verify that OS save/restore APX registers. diff --git a/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp b/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp index 17f256eadb78a..437274a2cb126 100644 --- a/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp +++ b/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp @@ -416,7 +416,7 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, stub = VM_Version::cpuinfo_cont_addr(); } -#ifndef PRODUCT +#if !defined(PRODUCT) && defined(_LP64) if ((sig == SIGSEGV || sig == SIGBUS) && VM_Version::is_cpuinfo_segv_addr_apx(pc)) { // Verify that OS save/restore APX registers. stub = VM_Version::cpuinfo_cont_addr_apx(); diff --git a/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp b/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp index 35e9321a2a7af..78988dd4fd005 100644 --- a/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp +++ b/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp @@ -248,7 +248,7 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, stub = VM_Version::cpuinfo_cont_addr(); } -#ifndef PRODUCT +#if !defined(PRODUCT) && defined(_LP64) if ((sig == SIGSEGV) && VM_Version::is_cpuinfo_segv_addr_apx(pc)) { // Verify that OS save/restore APX registers. stub = VM_Version::cpuinfo_cont_addr_apx(); diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java index c76ec64278ada..9f3fc0cdbd6a9 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java @@ -66,49 +66,68 @@ public class AMD64 extends Architecture { public static final Register r14 = new Register(14, 14, "r14", CPU); public static final Register r15 = new Register(15, 15, "r15", CPU); + public static final Register r16 = new Register(16, 16, "r16", CPU); + public static final Register r17 = new Register(17, 17, "r17", CPU); + public static final Register r18 = new Register(18, 18, "r18", CPU); + public static final Register r19 = new Register(19, 19, "r19", CPU); + public static final Register r20 = new Register(20, 20, "r20", CPU); + public static final Register r21 = new Register(21, 21, "r21", CPU); + public static final Register r22 = new Register(22, 22, "r22", CPU); + public static final Register r23 = new Register(23, 23, "r23", CPU); + public static final Register r24 = new Register(24, 24, "r24", CPU); + public static final Register r25 = new Register(25, 25, "r25", CPU); + public static final Register r26 = new Register(26, 26, "r26", CPU); + public static final Register r27 = new Register(27, 27, "r27", CPU); + public static final Register r28 = new Register(28, 28, "r28", CPU); + public static final Register r29 = new Register(29, 29, "r29", CPU); + public static final Register r30 = new Register(30, 30, "r30", CPU); + public static final Register r31 = new Register(31, 31, "r31", CPU); + public static final Register[] cpuRegisters = { rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, - r8, r9, r10, r11, r12, r13, r14, r15 + r8, r9, r10, r11, r12, r13, r14, r15, + r16, r17, r18, r19, r20, r21, r22, r23, + r24, r25, r26, r27, r28, r29, r30, r31 }; public static final RegisterCategory XMM = new RegisterCategory("XMM"); // XMM registers - public static final Register xmm0 = new Register(16, 0, "xmm0", XMM); - public static final Register xmm1 = new Register(17, 1, "xmm1", XMM); - public static final Register xmm2 = new Register(18, 2, "xmm2", XMM); - public static final Register xmm3 = new Register(19, 3, "xmm3", XMM); - public static final Register xmm4 = new Register(20, 4, "xmm4", XMM); - public static final Register xmm5 = new Register(21, 5, "xmm5", XMM); - public static final Register xmm6 = new Register(22, 6, "xmm6", XMM); - public static final Register xmm7 = new Register(23, 7, "xmm7", XMM); - - public static final Register xmm8 = new Register(24, 8, "xmm8", XMM); - public static final Register xmm9 = new Register(25, 9, "xmm9", XMM); - public static final Register xmm10 = new Register(26, 10, "xmm10", XMM); - public static final Register xmm11 = new Register(27, 11, "xmm11", XMM); - public static final Register xmm12 = new Register(28, 12, "xmm12", XMM); - public static final Register xmm13 = new Register(29, 13, "xmm13", XMM); - public static final Register xmm14 = new Register(30, 14, "xmm14", XMM); - public static final Register xmm15 = new Register(31, 15, "xmm15", XMM); - - public static final Register xmm16 = new Register(32, 16, "xmm16", XMM); - public static final Register xmm17 = new Register(33, 17, "xmm17", XMM); - public static final Register xmm18 = new Register(34, 18, "xmm18", XMM); - public static final Register xmm19 = new Register(35, 19, "xmm19", XMM); - public static final Register xmm20 = new Register(36, 20, "xmm20", XMM); - public static final Register xmm21 = new Register(37, 21, "xmm21", XMM); - public static final Register xmm22 = new Register(38, 22, "xmm22", XMM); - public static final Register xmm23 = new Register(39, 23, "xmm23", XMM); - - public static final Register xmm24 = new Register(40, 24, "xmm24", XMM); - public static final Register xmm25 = new Register(41, 25, "xmm25", XMM); - public static final Register xmm26 = new Register(42, 26, "xmm26", XMM); - public static final Register xmm27 = new Register(43, 27, "xmm27", XMM); - public static final Register xmm28 = new Register(44, 28, "xmm28", XMM); - public static final Register xmm29 = new Register(45, 29, "xmm29", XMM); - public static final Register xmm30 = new Register(46, 30, "xmm30", XMM); - public static final Register xmm31 = new Register(47, 31, "xmm31", XMM); + public static final Register xmm0 = new Register(32, 0, "xmm0", XMM); + public static final Register xmm1 = new Register(33, 1, "xmm1", XMM); + public static final Register xmm2 = new Register(34, 2, "xmm2", XMM); + public static final Register xmm3 = new Register(35, 3, "xmm3", XMM); + public static final Register xmm4 = new Register(36, 4, "xmm4", XMM); + public static final Register xmm5 = new Register(37, 5, "xmm5", XMM); + public static final Register xmm6 = new Register(38, 6, "xmm6", XMM); + public static final Register xmm7 = new Register(39, 7, "xmm7", XMM); + + public static final Register xmm8 = new Register(40, 8, "xmm8", XMM); + public static final Register xmm9 = new Register(41, 9, "xmm9", XMM); + public static final Register xmm10 = new Register(42, 10, "xmm10", XMM); + public static final Register xmm11 = new Register(43, 11, "xmm11", XMM); + public static final Register xmm12 = new Register(44, 12, "xmm12", XMM); + public static final Register xmm13 = new Register(45, 13, "xmm13", XMM); + public static final Register xmm14 = new Register(46, 14, "xmm14", XMM); + public static final Register xmm15 = new Register(47, 15, "xmm15", XMM); + + public static final Register xmm16 = new Register(48, 16, "xmm16", XMM); + public static final Register xmm17 = new Register(49, 17, "xmm17", XMM); + public static final Register xmm18 = new Register(50, 18, "xmm18", XMM); + public static final Register xmm19 = new Register(51, 19, "xmm19", XMM); + public static final Register xmm20 = new Register(52, 20, "xmm20", XMM); + public static final Register xmm21 = new Register(53, 21, "xmm21", XMM); + public static final Register xmm22 = new Register(54, 22, "xmm22", XMM); + public static final Register xmm23 = new Register(55, 23, "xmm23", XMM); + + public static final Register xmm24 = new Register(56, 24, "xmm24", XMM); + public static final Register xmm25 = new Register(57, 25, "xmm25", XMM); + public static final Register xmm26 = new Register(58, 26, "xmm26", XMM); + public static final Register xmm27 = new Register(59, 27, "xmm27", XMM); + public static final Register xmm28 = new Register(60, 28, "xmm28", XMM); + public static final Register xmm29 = new Register(61, 29, "xmm29", XMM); + public static final Register xmm30 = new Register(62, 30, "xmm30", XMM); + public static final Register xmm31 = new Register(63, 31, "xmm31", XMM); public static final Register[] xmmRegistersSSE = { xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, @@ -124,14 +143,14 @@ public class AMD64 extends Architecture { public static final RegisterCategory MASK = new RegisterCategory("MASK", false); - public static final Register k0 = new Register(48, 0, "k0", MASK); - public static final Register k1 = new Register(49, 1, "k1", MASK); - public static final Register k2 = new Register(50, 2, "k2", MASK); - public static final Register k3 = new Register(51, 3, "k3", MASK); - public static final Register k4 = new Register(52, 4, "k4", MASK); - public static final Register k5 = new Register(53, 5, "k5", MASK); - public static final Register k6 = new Register(54, 6, "k6", MASK); - public static final Register k7 = new Register(55, 7, "k7", MASK); + public static final Register k0 = new Register(64, 0, "k0", MASK); + public static final Register k1 = new Register(65, 1, "k1", MASK); + public static final Register k2 = new Register(66, 2, "k2", MASK); + public static final Register k3 = new Register(67, 3, "k3", MASK); + public static final Register k4 = new Register(68, 4, "k4", MASK); + public static final Register k5 = new Register(69, 5, "k5", MASK); + public static final Register k6 = new Register(70, 6, "k6", MASK); + public static final Register k7 = new Register(71, 7, "k7", MASK); public static final RegisterArray valueRegistersSSE = new RegisterArray( rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, @@ -143,6 +162,8 @@ public class AMD64 extends Architecture { public static final RegisterArray valueRegistersAVX512 = new RegisterArray( rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15, + r16, r17, r18, r19, r20, r21, r22, r23, + r24, r25, r26, r27, r28, r29, r30, r31, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23, @@ -153,7 +174,7 @@ public class AMD64 extends Architecture { /** * Register used to construct an instruction-relative address. */ - public static final Register rip = new Register(56, -1, "rip", SPECIAL); + public static final Register rip = new Register(72, -1, "rip", SPECIAL); public static final RegisterArray allRegisters = new RegisterArray( rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, From 880e458a1072589ae199cc9204dcce9eab0f4eaa Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov <kvn@openjdk.org> Date: Fri, 21 Jun 2024 00:24:55 +0000 Subject: [PATCH 133/471] 8333819: Move embedded external addresses from relocation info into separate global table Reviewed-by: dlong --- src/hotspot/share/code/nmethod.cpp | 1 + src/hotspot/share/code/nmethod.hpp | 1 + src/hotspot/share/code/oopRecorder.cpp | 46 ++++++++++++++++++++++- src/hotspot/share/code/oopRecorder.hpp | 27 ++++++++++--- src/hotspot/share/code/relocInfo.cpp | 20 ++-------- src/hotspot/share/runtime/init.cpp | 4 +- src/hotspot/share/runtime/mutexLocker.cpp | 5 +++ src/hotspot/share/runtime/mutexLocker.hpp | 2 + 8 files changed, 82 insertions(+), 24 deletions(-) diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index 7f91f69c9e38b..2f4999dc4e366 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -3996,6 +3996,7 @@ void nmethod::print_statistics() { DebugInformationRecorder::print_statistics(); pc_nmethod_stats.print_pc_stats(); Dependencies::print_statistics(); + ExternalsRecorder::print_statistics(); if (xtty != nullptr) xtty->tail("statistics"); } diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp index e3ac422ca7093..ee0fe00433149 100644 --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -705,6 +705,7 @@ class nmethod : public CodeBlob { void copy_values(GrowableArray<jobject>* oops); void copy_values(GrowableArray<Metadata*>* metadata); + void copy_values(GrowableArray<address>* metadata) {} // Nothing to do // Relocation support private: diff --git a/src/hotspot/share/code/oopRecorder.cpp b/src/hotspot/share/code/oopRecorder.cpp index bfcb4bad47597..b8ecc1eccc0d1 100644 --- a/src/hotspot/share/code/oopRecorder.cpp +++ b/src/hotspot/share/code/oopRecorder.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,7 @@ #include "memory/allocation.inline.hpp" #include "oops/oop.inline.hpp" #include "runtime/jniHandles.inline.hpp" +#include "runtime/mutexLocker.hpp" #include "utilities/copy.hpp" #ifdef ASSERT @@ -211,3 +212,46 @@ OopRecorder::OopRecorder(Arena* arena, bool deduplicate): _oops(arena), _metadat _object_lookup = nullptr; } } + +// Explicitly instantiate +template class ValueRecorder<address>; + +ExternalsRecorder* ExternalsRecorder::_recorder = nullptr; + +ExternalsRecorder::ExternalsRecorder(): _arena(mtCode), _externals(&_arena) {} + +void ExternalsRecorder_init() { + ExternalsRecorder::initialize(); +} + +void ExternalsRecorder::initialize() { + // After Mutex and before CodeCache are initialized + assert(_recorder == nullptr, "should initialize only once"); + _recorder = new ExternalsRecorder(); +} + +int ExternalsRecorder::find_index(address adr) { + MutexLocker ml(ExternalsRecorder_lock, Mutex::_no_safepoint_check_flag); + assert(_recorder != nullptr, "sanity"); + return _recorder->_externals.find_index(adr); +} + +address ExternalsRecorder::at(int index) { + // find_index() may resize array by reallocating it and freeing old, + // we need loock here to make sure we not accessing to old freed array. + MutexLocker ml(ExternalsRecorder_lock, Mutex::_no_safepoint_check_flag); + assert(_recorder != nullptr, "sanity"); + return _recorder->_externals.at(index); +} + +int ExternalsRecorder::count() { + MutexLocker ml(ExternalsRecorder_lock, Mutex::_no_safepoint_check_flag); + assert(_recorder != nullptr, "sanity"); + return _recorder->_externals.count(); +} + +#ifndef PRODUCT +void ExternalsRecorder::print_statistics() { + tty->print_cr("External addresses table: %d entries", count()); +} +#endif diff --git a/src/hotspot/share/code/oopRecorder.hpp b/src/hotspot/share/code/oopRecorder.hpp index 41d2c0da5914d..7eded5410e334 100644 --- a/src/hotspot/share/code/oopRecorder.hpp +++ b/src/hotspot/share/code/oopRecorder.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -133,10 +133,10 @@ template <class T> class ValueRecorder : public StackObj { enum { null_index = 0, first_index = 1, index_cache_threshold = 20 }; GrowableArray<T>* _handles; // ordered list (first is always nullptr) - GrowableArray<int>* _no_finds; // all unfindable indexes; usually empty + GrowableArray<int>* _no_finds; // all unfindable indexes; usually empty IndexCache<T>* _indexes; // map: handle -> its probable index - Arena* _arena; - bool _complete; + Arena* _arena; + bool _complete; #ifdef ASSERT static int _find_index_calls, _hit_indexes, _missed_indexes; @@ -186,7 +186,7 @@ class OopRecorder : public ResourceObj { int allocate_oop_index(jobject h) { return _oops.allocate_index(h); } - virtual int find_index(jobject h) { + int find_index(jobject h) { return _object_lookup != nullptr ? _object_lookup->find_index(h, this) : _oops.find_index(h); } jobject oop_at(int index) { @@ -203,7 +203,7 @@ class OopRecorder : public ResourceObj { int allocate_metadata_index(Metadata* oop) { return _metadata.allocate_index(oop); } - virtual int find_index(Metadata* h) { + int find_index(Metadata* h) { return _metadata.find_index(h); } Metadata* metadata_at(int index) { @@ -243,5 +243,20 @@ class OopRecorder : public ResourceObj { #endif }; +// Class is used to record and retrive external addresses +// for Relocation info in compiled code and stubs. +class ExternalsRecorder : public CHeapObj<mtCode> { + private: + Arena _arena; + ValueRecorder<address> _externals; + static ExternalsRecorder* _recorder; + ExternalsRecorder(); + public: + static void initialize(); + static int find_index(address adr); + static address at(int index); + static int count(); + static void print_statistics() PRODUCT_RETURN; +}; #endif // SHARE_CODE_OOPRECORDER_HPP diff --git a/src/hotspot/share/code/relocInfo.cpp b/src/hotspot/share/code/relocInfo.cpp index 5527436413cee..3b19b63f24469 100644 --- a/src/hotspot/share/code/relocInfo.cpp +++ b/src/hotspot/share/code/relocInfo.cpp @@ -454,27 +454,15 @@ void trampoline_stub_Relocation::unpack_data() { void external_word_Relocation::pack_data_to(CodeSection* dest) { short* p = (short*) dest->locs_end(); -#ifndef _LP64 - p = pack_1_int_to(p, (int32_t) (intptr_t)_target); -#else - jlong t = (jlong) _target; - int32_t lo = low(t); - int32_t hi = high(t); - p = pack_2_ints_to(p, lo, hi); -#endif /* _LP64 */ + int index = ExternalsRecorder::find_index(_target); + p = pack_1_int_to(p, index); dest->set_locs_end((relocInfo*) p); } void external_word_Relocation::unpack_data() { -#ifndef _LP64 - _target = (address) (intptr_t)unpack_1_int(); -#else - jint lo, hi; - unpack_2_ints(lo, hi); - jlong t = jlong_from(hi, lo);; - _target = (address) t; -#endif /* _LP64 */ + int index = unpack_1_int(); + _target = ExternalsRecorder::at(index); } diff --git a/src/hotspot/share/runtime/init.cpp b/src/hotspot/share/runtime/init.cpp index d37ae99b41886..368f4e62c7692 100644 --- a/src/hotspot/share/runtime/init.cpp +++ b/src/hotspot/share/runtime/init.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,6 +57,7 @@ void mutex_init(); void universe_oopstorage_init(); void perfMemory_init(); void SuspendibleThreadSet_init(); +void ExternalsRecorder_init(); // After mutex_init() and before CodeCache_init // Initialization done by Java thread in init_globals() void management_init(); @@ -107,6 +108,7 @@ void vm_init_globals() { universe_oopstorage_init(); perfMemory_init(); SuspendibleThreadSet_init(); + ExternalsRecorder_init(); // After mutex_init() and before CodeCache_init } diff --git a/src/hotspot/share/runtime/mutexLocker.cpp b/src/hotspot/share/runtime/mutexLocker.cpp index 2587375c52e68..add47738db0bc 100644 --- a/src/hotspot/share/runtime/mutexLocker.cpp +++ b/src/hotspot/share/runtime/mutexLocker.cpp @@ -123,6 +123,8 @@ Monitor* JfrThreadSampler_lock = nullptr; Mutex* CodeHeapStateAnalytics_lock = nullptr; +Mutex* ExternalsRecorder_lock = nullptr; + Monitor* ContinuationRelativize_lock = nullptr; Mutex* Metaspace_lock = nullptr; @@ -328,6 +330,9 @@ void mutex_init() { MUTEX_DEFL(CodeCache_lock , PaddedMonitor, VtableStubs_lock); MUTEX_DEFL(NMethodState_lock , PaddedMutex , CodeCache_lock); + // tty_lock is held when printing nmethod and its relocations which use this lock. + MUTEX_DEFL(ExternalsRecorder_lock , PaddedMutex , tty_lock); + MUTEX_DEFL(Threads_lock , PaddedMonitor, CompileThread_lock, true); MUTEX_DEFL(Compile_lock , PaddedMutex , MethodCompileQueue_lock); MUTEX_DEFL(Heap_lock , PaddedMonitor, AdapterHandlerLibrary_lock); diff --git a/src/hotspot/share/runtime/mutexLocker.hpp b/src/hotspot/share/runtime/mutexLocker.hpp index 91310364b8f0b..160e6c97db07f 100644 --- a/src/hotspot/share/runtime/mutexLocker.hpp +++ b/src/hotspot/share/runtime/mutexLocker.hpp @@ -142,6 +142,8 @@ extern Mutex* ClassLoaderDataGraph_lock; // protects CLDG list, needed f extern Mutex* CodeHeapStateAnalytics_lock; // lock print functions against concurrent analyze functions. // Only used locally in PrintCodeCacheLayout processing. +extern Mutex* ExternalsRecorder_lock; // used to guard access to the external addresses table + extern Monitor* ContinuationRelativize_lock; #if INCLUDE_JVMCI From 6a5cb0b2c49cb390ce8b87fd977ee79572df90fc Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Fri, 21 Jun 2024 07:04:26 +0000 Subject: [PATCH 134/471] 8334567: [test] runtime/os/TestTracePageSizes move ppc handling Reviewed-by: stuefe, lucy --- .../jtreg/runtime/os/TestTracePageSizes.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/test/hotspot/jtreg/runtime/os/TestTracePageSizes.java b/test/hotspot/jtreg/runtime/os/TestTracePageSizes.java index a94d9af4c27a5..e6fe18dce302a 100644 --- a/test/hotspot/jtreg/runtime/os/TestTracePageSizes.java +++ b/test/hotspot/jtreg/runtime/os/TestTracePageSizes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ * @library /test/lib * @build jdk.test.lib.Platform * @requires os.family == "linux" + * @requires os.arch != "ppc64le" * @run main/othervm -XX:+AlwaysPreTouch -Xlog:pagesize:ps-%p.log TestTracePageSizes */ @@ -51,6 +52,7 @@ * @library /test/lib * @build jdk.test.lib.Platform * @requires os.family == "linux" + * @requires os.arch != "ppc64le" * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:-SegmentedCodeCache TestTracePageSizes * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:-SegmentedCodeCache -XX:+UseLargePages TestTracePageSizes @@ -63,6 +65,7 @@ * @library /test/lib * @build jdk.test.lib.Platform * @requires os.family == "linux" + * @requires os.arch != "ppc64le" * @requires vm.gc.G1 * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseG1GC TestTracePageSizes * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseG1GC -XX:+UseLargePages TestTracePageSizes @@ -75,6 +78,7 @@ * @library /test/lib * @build jdk.test.lib.Platform * @requires os.family == "linux" + * @requires os.arch != "ppc64le" * @requires vm.gc.Parallel * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseParallelGC TestTracePageSizes * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseParallelGC -XX:+UseLargePages TestTracePageSizes @@ -87,6 +91,7 @@ * @library /test/lib * @build jdk.test.lib.Platform * @requires os.family == "linux" + * @requires os.arch != "ppc64le" * @requires vm.gc.Serial * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseSerialGC TestTracePageSizes * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseSerialGC -XX:+UseLargePages TestTracePageSizes @@ -261,12 +266,6 @@ public static void main(String args[]) throws Exception { throw new SkippedException("Kernel older than 3.8 - skipping this test."); } - // For similar reasons, we skip the test on ppc platforms, since there the smaps - // format may follow a different logic. - if (Platform.isPPC()) { - throw new SkippedException("PPC - skipping this test."); - } - // Parse /proc/self/smaps to compare with values logged in the VM. parseSmaps(); From bdd96604ae55ba0cd3cd3363e2ba44205d8aa3aa Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Fri, 21 Jun 2024 07:36:02 +0000 Subject: [PATCH 135/471] 8323196: jdk/jfr/api/consumer/filestream/TestOrdered.java failed with "Events are not ordered! Reuse = false" Reviewed-by: mgronlun --- .../api/consumer/filestream/TestOrdered.java | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java b/test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java index 8edb74b847ae1..58f23350dd07e 100644 --- a/test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java +++ b/test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import jdk.jfr.Event; @@ -143,28 +144,43 @@ private static void printTimestamp(Instant timestamp) { } private static Path makeUnorderedRecording() throws Exception { - CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1); - - try (Recording r = new Recording()) { - r.start(); - List<Emitter> emitters = new ArrayList<>(); - for (int i = 0; i < THREAD_COUNT; i++) { - Emitter e = new Emitter(barrier); - e.start(); - emitters.add(e); - } - // Thread buffers should now have one event each - barrier.await(); - // Add another event to each thread buffer, so - // events are bound to come out of order when they - // are flushed - for (Emitter e : emitters) { - e.join(); + while (true) { + CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1); + try (Recording r = new Recording()) { + r.start(); + List<Emitter> emitters = new ArrayList<>(); + for (int i = 0; i < THREAD_COUNT; i++) { + Emitter e = new Emitter(barrier); + e.start(); + emitters.add(e); + } + // Thread buffers should now have one event each + barrier.await(); + // Add another event to each thread buffer, so + // events are bound to come out of order when they + // are flushed + for (Emitter e : emitters) { + e.join(); + } + r.stop(); + Path p = Utils.createTempFile("recording", ".jfr"); + r.dump(p); + // Order is only guaranteed within a segment. + int segments = countSegments(p); + if (segments < 2) { + return p; + } + System.out.println("File contains more than one segment (" + segments + "). Retrying."); } - r.stop(); - Path p = Utils.createTempFile("recording", ".jfr"); - r.dump(p); - return p; + } + } + + private static int countSegments(Path file) throws Exception { + AtomicInteger segments = new AtomicInteger(); + try (EventStream es = EventStream.openFile(file)) { + es.onFlush(segments::incrementAndGet); + es.start(); + return segments.get(); } } } From ed149062d0e8407710f083aa85d28d27c4a45ecc Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Fri, 21 Jun 2024 08:38:42 +0000 Subject: [PATCH 136/471] 8333361: ubsan,test : libHeapMonitorTest.cpp:518:9: runtime error: null pointer passed as argument 2, which is declared to never be null Reviewed-by: asteiner, lucy, amenkov --- .../serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp b/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp index 035aaef827e34..b70f4834f23d2 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp @@ -515,7 +515,9 @@ static void event_storage_augment_storage(EventStorage* storage) { ObjectTrace** new_objects = reinterpret_cast<ObjectTrace**>(malloc(new_max * sizeof(*new_objects))); int current_count = storage->live_object_count; - memcpy(new_objects, storage->live_objects, current_count * sizeof(*new_objects)); + if (storage->live_objects != nullptr) { + memcpy(new_objects, storage->live_objects, current_count * sizeof(*new_objects)); + } free(storage->live_objects); storage->live_objects = new_objects; storage->live_object_size = new_max; From d2bebffb1fd26fae4526afd33a818ee776b7102e Mon Sep 17 00:00:00 2001 From: Daniel Fuchs <dfuchs@openjdk.org> Date: Fri, 21 Jun 2024 09:43:49 +0000 Subject: [PATCH 137/471] 8327370: (ch) sun.nio.ch.Poller.register throws AssertionError Co-authored-by: Alan Bateman <alanb@openjdk.org> Reviewed-by: alanb, jpai, djelinski --- src/java.base/share/classes/sun/nio/ch/Poller.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/sun/nio/ch/Poller.java b/src/java.base/share/classes/sun/nio/ch/Poller.java index a24b0cf924a23..9d3a0e7d32c76 100644 --- a/src/java.base/share/classes/sun/nio/ch/Poller.java +++ b/src/java.base/share/classes/sun/nio/ch/Poller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -190,7 +190,12 @@ private void poll(int fdVal, long nanos, BooleanSupplier supplier) throws IOExce private void register(int fdVal) throws IOException { Thread previous = map.put(fdVal, Thread.currentThread()); assert previous == null; - implRegister(fdVal); + try { + implRegister(fdVal); + } catch (Throwable t) { + map.remove(fdVal); + throw t; + } } /** From 711e7238196a4ef9211ed4cca15c7c1d774df019 Mon Sep 17 00:00:00 2001 From: Tejesh R <tr@openjdk.org> Date: Fri, 21 Jun 2024 10:36:05 +0000 Subject: [PATCH 138/471] 6967482: TAB-key does not work in JTables after selecting details-view in JFileChooser 8166352: FilePane.createDetailsView() removes JTable TAB, SHIFT-TAB functionality Reviewed-by: achung, prr --- .../share/classes/sun/swing/FilePane.java | 7 - .../swing/JFileChooser/TABTestONFCExit.java | 167 ++++++++++++++++++ 2 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 test/jdk/javax/swing/JFileChooser/TABTestONFCExit.java diff --git a/src/java.desktop/share/classes/sun/swing/FilePane.java b/src/java.desktop/share/classes/sun/swing/FilePane.java index ffefbb60416bd..e97dcb3b88185 100644 --- a/src/java.desktop/share/classes/sun/swing/FilePane.java +++ b/src/java.desktop/share/classes/sun/swing/FilePane.java @@ -1317,13 +1317,6 @@ public void tableChanged(TableModelEvent e) { detailsTable.addFocusListener(repaintListener); } - // TAB/SHIFT-TAB should transfer focus and ENTER should select an item. - // We don't want them to navigate within the table - ActionMap am = SwingUtilities.getUIActionMap(detailsTable); - am.remove("selectNextRowCell"); - am.remove("selectPreviousRowCell"); - am.remove("selectNextColumnCell"); - am.remove("selectPreviousColumnCell"); detailsTable.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null); detailsTable.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, diff --git a/test/jdk/javax/swing/JFileChooser/TABTestONFCExit.java b/test/jdk/javax/swing/JFileChooser/TABTestONFCExit.java new file mode 100644 index 0000000000000..16fcc9d12080b --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/TABTestONFCExit.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Container; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Point; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JTable; +import javax.swing.JToggleButton; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; +import javax.swing.UIManager; +import javax.swing.table.DefaultTableModel; + +import java.util.function.Predicate; + +/* + * @test + * @bug 6967482 + * @key headful + * @summary Test to check if TAB is working on JTable after JFileChooser is + * closed + * @run main TABTestONFCExit + */ + +public class TABTestONFCExit { + private static JTable table; + private static JFileChooser fc; + private static JFrame frame; + private static Robot robot; + private static volatile Point loc; + private static volatile Rectangle rect; + private static volatile int selectedColumnBeforeTabPress; + private static volatile int selectedColumnAfterTabPress; + + public static void main(String[] args) throws Exception { + robot = new Robot(); + robot.setAutoDelay(50); + UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); + try { + SwingUtilities.invokeAndWait(TABTestONFCExit::initialize); + robot.waitForIdle(); + robot.delay(100); + + SwingUtilities.invokeAndWait(TABTestONFCExit::clickDetails); + robot.waitForIdle(); + robot.delay(100); + + SwingUtilities.invokeAndWait(() -> { + loc = table.getLocationOnScreen(); + rect = table.getCellRect(0, 0, true); + }); + + onClick(loc, rect); + + SwingUtilities.invokeAndWait(() -> + selectedColumnBeforeTabPress = table.getSelectedColumn()); + + robot.keyPress(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_TAB); + robot.waitForIdle(); + robot.delay(100); + + SwingUtilities.invokeAndWait(() -> + selectedColumnAfterTabPress = table.getSelectedColumn()); + robot.waitForIdle(); + robot.delay(100); + + if (selectedColumnAfterTabPress == selectedColumnBeforeTabPress) { + throw new RuntimeException("TAB failed to move cell!"); + } + System.out.println("Test Passed" ); + + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static void onClick(Point loc, Rectangle cellRect) { + robot.mouseMove(loc.x + cellRect.x + cellRect.width / 2, + loc.y + cellRect.y + cellRect.height / 2); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + robot.delay(100); + } + + private static void initialize() { + frame = new JFrame("Tab Test"); + fc = new JFileChooser(); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + frame.add(getJTable(), BorderLayout.NORTH); + frame.add(fc, BorderLayout.SOUTH); + frame.pack(); + frame.setVisible(true); + } + + private static JTable getJTable() { + if (table == null) { + table = new JTable(); + table.setModel(new DefaultTableModel(5, 5)); + } + return table; + } + private static void clickDetails() { + AbstractButton details = findDetailsButton(fc); + if (details == null) { + throw new Error("Couldn't find 'Details' button in JFileChooser"); + } + details.doClick(); + } + + private static AbstractButton findDetailsButton(final Container container) { + Component result = findComponent(container, + c -> c instanceof JToggleButton button + && "Details".equals(button.getToolTipText())); + return (AbstractButton) result; + } + + private static Component findComponent(final Container container, + final Predicate<Component> predicate) { + for (Component child : container.getComponents()) { + if (predicate.test(child)) { + return child; + } + if (child instanceof Container cont && cont.getComponentCount() > 0) { + Component result = findComponent(cont, predicate); + if (result != null) { + return result; + } + } + } + return null; + } +} From 08ace27da1d9cd215c77471eabf41417ff6282d2 Mon Sep 17 00:00:00 2001 From: Archie Cobbs <acobbs@openjdk.org> Date: Fri, 21 Jun 2024 10:44:51 +0000 Subject: [PATCH 139/471] 8332314: Add window size configuration option to JavaShellToolBuilder interface Reviewed-by: jlahoda --- .../jshell/tool/ConsoleIOContext.java | 12 +++++------ .../jdk/internal/jshell/tool/JShellTool.java | 8 ++++++-- .../jshell/tool/JShellToolBuilder.java | 16 +++++++++++++-- .../jdk/jshell/tool/JavaShellToolBuilder.java | 20 ++++++++++++++++++- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java index 2812dc19695da..a2b1ca0d2d058 100644 --- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java +++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -121,7 +121,7 @@ class ConsoleIOContext extends IOContext { String prefix = ""; ConsoleIOContext(JShellTool repl, InputStream cmdin, PrintStream cmdout, - boolean interactive) throws Exception { + boolean interactive, Size size) throws Exception { this.repl = repl; Map<String, Object> variables = new HashMap<>(); this.input = new StopDetectingInputStream(() -> repl.stop(), @@ -143,7 +143,6 @@ public int readBuffered(byte[] b) throws IOException { terminal = new TestTerminal(nonBlockingInput, cmdout); enableHighlighter = Boolean.getBoolean("test.enable.highlighter"); } else { - Size size = null; terminal = new ProgrammaticInTerminal(nonBlockingInput, cmdout, interactive, size); if (!interactive) { @@ -1312,6 +1311,7 @@ private History getHistory() { private static class ProgrammaticInTerminal extends LineDisciplineTerminal { + protected static final int DEFAULT_WIDTH = 80; protected static final int DEFAULT_HEIGHT = 24; private final NonBlockingReader inputReader; @@ -1320,9 +1320,9 @@ private static class ProgrammaticInTerminal extends LineDisciplineTerminal { public ProgrammaticInTerminal(InputStream input, OutputStream output, boolean interactive, Size size) throws Exception { this(input, output, interactive ? "ansi" : "dumb", - size != null ? size : new Size(80, DEFAULT_HEIGHT), + size != null ? size : new Size(DEFAULT_WIDTH, DEFAULT_HEIGHT), size != null ? size - : interactive ? new Size(80, DEFAULT_HEIGHT) + : interactive ? new Size(DEFAULT_WIDTH, DEFAULT_HEIGHT) : new Size(Integer.MAX_VALUE - 1, DEFAULT_HEIGHT)); } @@ -1366,7 +1366,7 @@ private static Size computeSize() { } catch (Throwable ex) { // ignore } - return new Size(80, h); + return new Size(DEFAULT_WIDTH, h); } public TestTerminal(InputStream input, OutputStream output) throws Exception { this(input, output, computeSize()); diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java index 0e9b3bf8bfb00..2d06ffc529d45 100644 --- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java +++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java @@ -80,6 +80,7 @@ import jdk.internal.jshell.debug.InternalDebugControl; import jdk.internal.jshell.tool.IOContext.InputInterruptedException; +import jdk.internal.org.jline.terminal.Size; import jdk.jshell.DeclarationSnippet; import jdk.jshell.Diag; import jdk.jshell.EvalException; @@ -166,6 +167,7 @@ public class JShellTool implements MessageHandler { final Map<String, String> envvars; final Locale locale; final boolean interactiveTerminal; + final Size windowSize; final Feedback feedback = new Feedback(); @@ -181,12 +183,13 @@ public class JShellTool implements MessageHandler { * @param prefs persistence implementation to use * @param envvars environment variable mapping to use * @param locale locale to use + * @param windowSize window size hint, or null */ JShellTool(InputStream cmdin, PrintStream cmdout, PrintStream cmderr, PrintStream console, InputStream userin, PrintStream userout, PrintStream usererr, PersistentStorage prefs, Map<String, String> envvars, Locale locale, - boolean interactiveTerminal) { + boolean interactiveTerminal, Size windowSize) { this.cmdin = cmdin; this.cmdout = cmdout; this.cmderr = cmderr; @@ -203,6 +206,7 @@ public int read() throws IOException { this.envvars = envvars; this.locale = locale; this.interactiveTerminal = interactiveTerminal; + this.windowSize = windowSize; } private ResourceBundle versionRB = null; @@ -998,7 +1002,7 @@ public void run() { }; Runtime.getRuntime().addShutdownHook(shutdownHook); // execute from user input - try (IOContext in = new ConsoleIOContext(this, cmdin, console, interactiveTerminal)) { + try (IOContext in = new ConsoleIOContext(this, cmdin, console, interactiveTerminal, windowSize)) { int indent; try { String indentValue = indent(); diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellToolBuilder.java b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellToolBuilder.java index 52e042d365a02..8c787a6c294d8 100644 --- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellToolBuilder.java +++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellToolBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,7 @@ import java.util.Set; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; +import jdk.internal.org.jline.terminal.Size; import jdk.jshell.tool.JavaShellToolBuilder; /** @@ -53,6 +54,7 @@ public class JShellToolBuilder implements JavaShellToolBuilder { private Locale locale = Locale.getDefault(); private boolean interactiveTerminal; private boolean capturePrompt = false; + private Size windowSize = null; /** * Set the input channels. @@ -215,6 +217,16 @@ public JavaShellToolBuilder interactiveTerminal(boolean terminal) { return this; } + @Override + public JavaShellToolBuilder windowSize(int columns, int rows) { + if (columns <= 0) + throw new IllegalArgumentException("columns = " + columns); + if (rows <= 0) + throw new IllegalArgumentException("rows = " + rows); + this.windowSize = new Size(columns, rows); + return this; + } + /** * Create a tool instance for testing. Not in JavaShellToolBuilder. * @@ -228,7 +240,7 @@ public JShellTool rawTool() { vars = System.getenv(); } JShellTool sh = new JShellTool(cmdIn, cmdOut, cmdErr, console, userIn, - userOut, userErr, prefs, vars, locale, interactiveTerminal); + userOut, userErr, prefs, vars, locale, interactiveTerminal, windowSize); sh.testPrompt = capturePrompt; return sh; } diff --git a/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java b/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java index c4b4bf66b336a..06dd4d8ce1c62 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -209,6 +209,24 @@ default JavaShellToolBuilder interactiveTerminal(boolean terminal) { return this; } + /** + * Provide a hint of the display window's dimensions when using an interactive terminal. + * + * <p> + * When the input stream for this Java Shell is {@code System.in}, this setting is ignored. + * + * @implSpec Implementations may choose to ignore this method. The default implementation + * of this method returns {@code this}. + * + * @param columns number of displayed columns + * @param rows number of displayed rows + * @return the {@code JavaShellToolBuilder} instance + * @since 24 + */ + default JavaShellToolBuilder windowSize(int columns, int rows) { + return this; + } + /** * Run an instance of the Java shell tool as configured by the other methods * in this interface. This call is not destructive, more than one call of From dbf5a9a4006020ddebcce89692ce8826b6b2db46 Mon Sep 17 00:00:00 2001 From: Doug Simon <dnsimon@openjdk.org> Date: Fri, 21 Jun 2024 13:43:03 +0000 Subject: [PATCH 140/471] 8334706: [JVMCI] APX registers incorrectly exposed on AMD64 Reviewed-by: yzheng, never --- .../share/classes/jdk/vm/ci/amd64/AMD64.java | 9 ++++----- .../share/classes/jdk/vm/ci/code/Architecture.java | 8 ++++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java index 9f3fc0cdbd6a9..83401fed62033 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java @@ -83,11 +83,10 @@ public class AMD64 extends Architecture { public static final Register r30 = new Register(30, 30, "r30", CPU); public static final Register r31 = new Register(31, 31, "r31", CPU); + // The set of common CPU registers available on all x64 platforms. public static final Register[] cpuRegisters = { rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, - r8, r9, r10, r11, r12, r13, r14, r15, - r16, r17, r18, r19, r20, r21, r22, r23, - r24, r25, r26, r27, r28, r29, r30, r31 + r8, r9, r10, r11, r12, r13, r14, r15 }; public static final RegisterCategory XMM = new RegisterCategory("XMM"); @@ -162,8 +161,6 @@ public class AMD64 extends Architecture { public static final RegisterArray valueRegistersAVX512 = new RegisterArray( rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15, - r16, r17, r18, r19, r20, r21, r22, r23, - r24, r25, r26, r27, r28, r29, r30, r31, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23, @@ -179,6 +176,8 @@ public class AMD64 extends Architecture { public static final RegisterArray allRegisters = new RegisterArray( rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15, + r16, r17, r18, r19, r20, r21, r22, r23, + r24, r25, r26, r27, r28, r29, r30, r31, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23, diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java index 0b00628aceaf3..f14855cd6b995 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java @@ -26,6 +26,7 @@ import java.util.Set; import jdk.vm.ci.code.Register.RegisterCategory; +import jdk.vm.ci.common.JVMCIError; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.PlatformKind; @@ -81,6 +82,13 @@ public abstract class Architecture { protected Architecture(String name, PlatformKind wordKind, ByteOrder byteOrder, boolean unalignedMemoryAccess, RegisterArray registers, int implicitMemoryBarriers, int nativeCallDisplacementOffset, int returnAddressSize) { + // registers is expected to mention all registers in order of their encoding. + for (int i = 0; i < registers.size(); ++i) { + if (registers.get(i).number != i) { + Register reg = registers.get(i); + throw new JVMCIError("%s: %d != %d", reg, reg.number, i); + } + } this.name = name; this.registers = registers; this.wordKind = wordKind; From 9f8de221d7f0186718411ab3f5217e3883237e84 Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Fri, 21 Jun 2024 13:51:06 +0000 Subject: [PATCH 141/471] 8327793: Deprecate jstatd for removal Reviewed-by: alanb, cjplummer --- src/jdk.jstatd/share/classes/module-info.java | 3 ++- src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java | 4 +++- test/jdk/sun/tools/jstatd/JstatdTest.java | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/jdk.jstatd/share/classes/module-info.java b/src/jdk.jstatd/share/classes/module-info.java index ade59da4248cd..e9a9521ac73fc 100644 --- a/src/jdk.jstatd/share/classes/module-info.java +++ b/src/jdk.jstatd/share/classes/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,7 @@ * @moduleGraph * @since 9 */ +@Deprecated(since="24", forRemoval=true) module jdk.jstatd { requires java.rmi; requires jdk.internal.jvmstat; diff --git a/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java b/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java index 5dc7f1fa2fbce..cfd1212a67aba 100644 --- a/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java +++ b/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,6 +80,8 @@ public static void main(String[] args) { int rmiPort = 0; int argc = 0; + System.err.println("WARNING: jstatd is deprecated and will be removed in a future release."); + for ( ; (argc < args.length) && (args[argc].startsWith("-")); argc++) { String arg = args[argc]; diff --git a/test/jdk/sun/tools/jstatd/JstatdTest.java b/test/jdk/sun/tools/jstatd/JstatdTest.java index b2ac3804f6805..5041bc40d7510 100644 --- a/test/jdk/sun/tools/jstatd/JstatdTest.java +++ b/test/jdk/sun/tools/jstatd/JstatdTest.java @@ -356,7 +356,7 @@ private void runTest(boolean useShortSyntax) throws Throwable { OutputAnalyzer output = jstatdThread.getOutput(); List<String> stdout = output.asLinesWithoutVMWarnings(); output.reportDiagnosticSummary(); - assertEquals(stdout.size(), 1, "Output should contain one line"); + assertEquals(stdout.size(), 2, "Output should contain two lines"); // includes deprecation warning assertTrue(stdout.get(0).startsWith("jstatd started"), "List should start with 'jstatd started'"); assertNotEquals(output.getExitValue(), 0, "jstatd process exited with unexpected exit code"); From 75bea280b9adb6dac9fefafbb3f4b212f100fbb5 Mon Sep 17 00:00:00 2001 From: Ferenc Rakoczi <ferenc.r.rakoczi@oracle.com> Date: Fri, 21 Jun 2024 14:16:23 +0000 Subject: [PATCH 142/471] 8333867: SHA3 performance can be improved Reviewed-by: kvn, valeriep --- src/hotspot/share/opto/library_call.cpp | 4 +- .../sun/security/provider/DigestBase.java | 4 +- .../classes/sun/security/provider/SHA3.java | 105 ++++++++---------- 3 files changed, 51 insertions(+), 62 deletions(-) diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp index b3253a817a408..596e637652dfb 100644 --- a/src/hotspot/share/opto/library_call.cpp +++ b/src/hotspot/share/opto/library_call.cpp @@ -7681,7 +7681,7 @@ bool LibraryCallKit::inline_digestBase_implCompress(vmIntrinsics::ID id) { break; case vmIntrinsics::_sha3_implCompress: assert(UseSHA3Intrinsics, "need SHA3 instruction support"); - state = get_state_from_digest_object(digestBase_obj, T_BYTE); + state = get_state_from_digest_object(digestBase_obj, T_LONG); stubAddr = StubRoutines::sha3_implCompress(); stubName = "sha3_implCompress"; block_size = get_block_size_from_digest_object(digestBase_obj); @@ -7781,7 +7781,7 @@ bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) { klass_digestBase_name = "sun/security/provider/SHA3"; stub_name = "sha3_implCompressMB"; stub_addr = StubRoutines::sha3_implCompressMB(); - elem_type = T_BYTE; + elem_type = T_LONG; } break; default: diff --git a/src/java.base/share/classes/sun/security/provider/DigestBase.java b/src/java.base/share/classes/sun/security/provider/DigestBase.java index dbe59396ac0b6..2aaf0a2fac6fd 100644 --- a/src/java.base/share/classes/sun/security/provider/DigestBase.java +++ b/src/java.base/share/classes/sun/security/provider/DigestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ abstract class DigestBase extends MessageDigestSpi implements Cloneable { private final int digestLength; // size of the input to the compression function in bytes - private final int blockSize; + protected final int blockSize; // buffer to store partial blocks, blockSize bytes large // Subclasses should not access this array directly except possibly in their // implDigest() method. See MD5.java as an example. diff --git a/src/java.base/share/classes/sun/security/provider/SHA3.java b/src/java.base/share/classes/sun/security/provider/SHA3.java index 2b8bf8afbedaf..eaccf2a88e922 100644 --- a/src/java.base/share/classes/sun/security/provider/SHA3.java +++ b/src/java.base/share/classes/sun/security/provider/SHA3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,14 @@ package sun.security.provider; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; import java.security.ProviderException; import java.util.Arrays; import java.util.Objects; import jdk.internal.vm.annotation.IntrinsicCandidate; -import static sun.security.provider.ByteArrayAccess.b2lLittle; -import static sun.security.provider.ByteArrayAccess.l2bLittle; /** * This class implements the Secure Hash Algorithm SHA-3 developed by @@ -48,7 +49,7 @@ abstract class SHA3 extends DigestBase { private static final int WIDTH = 200; // in bytes, e.g. 1600 bits - private static final int DM = 5; // dimension of lanes + private static final int DM = 5; // dimension of state matrix private static final int NR = 24; // number of rounds @@ -65,8 +66,11 @@ abstract class SHA3 extends DigestBase { }; private final byte suffix; - private byte[] state = new byte[WIDTH]; - private long[] lanes = new long[DM*DM]; + private long[] state = new long[DM*DM]; + + static final VarHandle asLittleEndian + = MethodHandles.byteArrayViewVarHandle(long[].class, + ByteOrder.LITTLE_ENDIAN).withInvokeExactBehavior(); /** * Creates a new SHA-3 object. @@ -91,10 +95,12 @@ void implCompress(byte[] b, int ofs) { @IntrinsicCandidate private void implCompress0(byte[] b, int ofs) { - for (int i = 0; i < buffer.length; i++) { - state[i] ^= b[ofs++]; - } - keccak(); + for (int i = 0; i < blockSize / 8; i++) { + state[i] ^= (long) asLittleEndian.get(b, ofs); + ofs += 8; + } + + keccak(); } /** @@ -102,29 +108,43 @@ private void implCompress0(byte[] b, int ofs) { * DigestBase calls implReset() when necessary. */ void implDigest(byte[] out, int ofs) { + byte[] byteState = new byte[8]; int numOfPadding = - setPaddingBytes(suffix, buffer, (int)(bytesProcessed % buffer.length)); + setPaddingBytes(suffix, buffer, (int)(bytesProcessed % blockSize)); if (numOfPadding < 1) { throw new ProviderException("Incorrect pad size: " + numOfPadding); } implCompress(buffer, 0); - int availableBytes = buffer.length; + int availableBytes = blockSize; // i.e. buffer.length int numBytes = engineGetDigestLength(); while (numBytes > availableBytes) { - System.arraycopy(state, 0, out, ofs, availableBytes); + for (int i = 0; i < availableBytes / 8 ; i++) { + asLittleEndian.set(out, ofs, state[i]); + ofs += 8; + } numBytes -= availableBytes; - ofs += availableBytes; keccak(); } - System.arraycopy(state, 0, out, ofs, numBytes); + int numLongs = (numBytes + 7) / 8; + + for (int i = 0; i < numLongs - 1; i++) { + asLittleEndian.set(out, ofs, state[i]); + ofs += 8; + } + if (numBytes == numLongs * 8) { + asLittleEndian.set(out, ofs, state[numLongs - 1]); + } else { + asLittleEndian.set(byteState, 0, state[numLongs - 1]); + System.arraycopy(byteState, 0, + out, ofs, numBytes - (numLongs - 1) * 8); + } } /** * Resets the internal state to start a new hash. */ void implReset() { - Arrays.fill(state, (byte)0); - Arrays.fill(lanes, 0L); + Arrays.fill(state, 0L); } /** @@ -144,46 +164,19 @@ private static int setPaddingBytes(byte suffix, byte[] in, int len) { return (in.length - len); } - /** - * Utility function for transforming the specified byte array 's' - * into array of lanes 'm' as defined in section 3.1.2. - */ - private static void bytes2Lanes(byte[] s, long[] m) { - int sOfs = 0; - // Conversion traverses along x-axis before y-axis - for (int y = 0; y < DM; y++, sOfs += 40) { - b2lLittle(s, sOfs, m, DM*y, 40); - } - } - - /** - * Utility function for transforming the specified array of - * lanes 'm' into a byte array 's' as defined in section 3.1.3. - */ - private static void lanes2Bytes(long[] m, byte[] s) { - int sOfs = 0; - // Conversion traverses along x-axis before y-axis - for (int y = 0; y < DM; y++, sOfs += 40) { - l2bLittle(m, DM*y, s, sOfs, 40); - } - } - /** * The function Keccak as defined in section 5.2 with * rate r = 1600 and capacity c. */ private void keccak() { - // convert the 200-byte state into 25 lanes - bytes2Lanes(state, lanes); - long a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12; long a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24; // move data into local variables - a0 = lanes[0]; a1 = lanes[1]; a2 = lanes[2]; a3 = lanes[3]; a4 = lanes[4]; - a5 = lanes[5]; a6 = lanes[6]; a7 = lanes[7]; a8 = lanes[8]; a9 = lanes[9]; - a10 = lanes[10]; a11 = lanes[11]; a12 = lanes[12]; a13 = lanes[13]; a14 = lanes[14]; - a15 = lanes[15]; a16 = lanes[16]; a17 = lanes[17]; a18 = lanes[18]; a19 = lanes[19]; - a20 = lanes[20]; a21 = lanes[21]; a22 = lanes[22]; a23 = lanes[23]; a24 = lanes[24]; + a0 = state[0]; a1 = state[1]; a2 = state[2]; a3 = state[3]; a4 = state[4]; + a5 = state[5]; a6 = state[6]; a7 = state[7]; a8 = state[8]; a9 = state[9]; + a10 = state[10]; a11 = state[11]; a12 = state[12]; a13 = state[13]; a14 = state[14]; + a15 = state[15]; a16 = state[16]; a17 = state[17]; a18 = state[18]; a19 = state[19]; + a20 = state[20]; a21 = state[21]; a22 = state[22]; a23 = state[23]; a24 = state[24]; // process the lanes through step mappings for (int ir = 0; ir < NR; ir++) { @@ -287,20 +280,16 @@ private void keccak() { a0 ^= RC_CONSTANTS[ir]; } - lanes[0] = a0; lanes[1] = a1; lanes[2] = a2; lanes[3] = a3; lanes[4] = a4; - lanes[5] = a5; lanes[6] = a6; lanes[7] = a7; lanes[8] = a8; lanes[9] = a9; - lanes[10] = a10; lanes[11] = a11; lanes[12] = a12; lanes[13] = a13; lanes[14] = a14; - lanes[15] = a15; lanes[16] = a16; lanes[17] = a17; lanes[18] = a18; lanes[19] = a19; - lanes[20] = a20; lanes[21] = a21; lanes[22] = a22; lanes[23] = a23; lanes[24] = a24; - - // convert the resulting 25 lanes back into 200-byte state - lanes2Bytes(lanes, state); + state[0] = a0; state[1] = a1; state[2] = a2; state[3] = a3; state[4] = a4; + state[5] = a5; state[6] = a6; state[7] = a7; state[8] = a8; state[9] = a9; + state[10] = a10; state[11] = a11; state[12] = a12; state[13] = a13; state[14] = a14; + state[15] = a15; state[16] = a16; state[17] = a17; state[18] = a18; state[19] = a19; + state[20] = a20; state[21] = a21; state[22] = a22; state[23] = a23; state[24] = a24; } public Object clone() throws CloneNotSupportedException { SHA3 copy = (SHA3) super.clone(); copy.state = copy.state.clone(); - copy.lanes = new long[DM*DM]; return copy; } From c41293a70834a79c79e859ebcdb8869884ac87dc Mon Sep 17 00:00:00 2001 From: Jie Fu <jiefu@openjdk.org> Date: Fri, 21 Jun 2024 14:23:38 +0000 Subject: [PATCH 143/471] 8334695: Fix build failure without zgc after JDK-8333300 Reviewed-by: dnsimon, chagedorn --- src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp | 4 +++- src/hotspot/share/jvmci/jvmciCompilerToVM.hpp | 4 +++- src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp | 4 +++- src/hotspot/share/jvmci/vmStructs_jvmci.cpp | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp index 21095692d19dc..8eff2590bfcea 100644 --- a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp +++ b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -220,6 +220,7 @@ bool CodeInstaller::pd_relocate(address pc, jint mark) { // see comment above for POLL_FAR _instructions->relocate(pc, relocInfo::poll_return_type, Assembler::imm_operand); return true; +#if INCLUDE_ZGC case Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL: _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadGoodBeforeShl); return true; @@ -241,6 +242,7 @@ bool CodeInstaller::pd_relocate(address pc, jint mark) { case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV: _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterMov); return true; +#endif default: return false; } diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp index b7ae365c1936d..2208813f170d6 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -104,7 +104,9 @@ class CompilerToVM { static int sizeof_narrowKlass; static int sizeof_arrayOopDesc; static int sizeof_BasicLock; +#if INCLUDE_ZGC static int sizeof_ZStoreBarrierEntry; +#endif static address dsin; static address dcos; diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp index 220667ad2ced0..8595ac193fb8b 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -123,7 +123,9 @@ int CompilerToVM::Data::sizeof_ConstantPool = sizeof(ConstantPool); int CompilerToVM::Data::sizeof_narrowKlass = sizeof(narrowKlass); int CompilerToVM::Data::sizeof_arrayOopDesc = sizeof(arrayOopDesc); int CompilerToVM::Data::sizeof_BasicLock = sizeof(BasicLock); +#if INCLUDE_ZGC int CompilerToVM::Data::sizeof_ZStoreBarrierEntry = sizeof(ZStoreBarrierEntry); +#endif address CompilerToVM::Data::dsin; address CompilerToVM::Data::dcos; diff --git a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp index 73bac7bd0909c..fea308503cf71 100644 --- a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp +++ b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp @@ -121,7 +121,7 @@ static_field(CompilerToVM::Data, sizeof_narrowKlass, int) \ static_field(CompilerToVM::Data, sizeof_arrayOopDesc, int) \ static_field(CompilerToVM::Data, sizeof_BasicLock, int) \ - static_field(CompilerToVM::Data, sizeof_ZStoreBarrierEntry, int) \ + ZGC_ONLY(static_field(CompilerToVM::Data, sizeof_ZStoreBarrierEntry, int)) \ \ static_field(CompilerToVM::Data, dsin, address) \ static_field(CompilerToVM::Data, dcos, address) \ From 93d98027649615afeeeb6a9510230d9655a74a8f Mon Sep 17 00:00:00 2001 From: SendaoYan <syan@openjdk.org> Date: Fri, 21 Jun 2024 15:48:38 +0000 Subject: [PATCH 144/471] 8334715: [riscv] Mixed use of tab and whitespace in riscv.ad Reviewed-by: chagedorn, amitkumar --- src/hotspot/cpu/riscv/riscv.ad | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 533b548c88109..798caee7375d8 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -242,7 +242,7 @@ reg_def V0_H ( SOC, SOC, Op_VecA, 0, v0->as_VMReg()->next() ); reg_def V0_J ( SOC, SOC, Op_VecA, 0, v0->as_VMReg()->next(2) ); reg_def V0_K ( SOC, SOC, Op_VecA, 0, v0->as_VMReg()->next(3) ); -reg_def V1 ( SOC, SOC, Op_VecA, 1, v1->as_VMReg() ); +reg_def V1 ( SOC, SOC, Op_VecA, 1, v1->as_VMReg() ); reg_def V1_H ( SOC, SOC, Op_VecA, 1, v1->as_VMReg()->next() ); reg_def V1_J ( SOC, SOC, Op_VecA, 1, v1->as_VMReg()->next(2) ); reg_def V1_K ( SOC, SOC, Op_VecA, 1, v1->as_VMReg()->next(3) ); @@ -262,7 +262,7 @@ reg_def V4_H ( SOC, SOC, Op_VecA, 4, v4->as_VMReg()->next() ); reg_def V4_J ( SOC, SOC, Op_VecA, 4, v4->as_VMReg()->next(2) ); reg_def V4_K ( SOC, SOC, Op_VecA, 4, v4->as_VMReg()->next(3) ); -reg_def V5 ( SOC, SOC, Op_VecA, 5, v5->as_VMReg() ); +reg_def V5 ( SOC, SOC, Op_VecA, 5, v5->as_VMReg() ); reg_def V5_H ( SOC, SOC, Op_VecA, 5, v5->as_VMReg()->next() ); reg_def V5_J ( SOC, SOC, Op_VecA, 5, v5->as_VMReg()->next(2) ); reg_def V5_K ( SOC, SOC, Op_VecA, 5, v5->as_VMReg()->next(3) ); @@ -272,7 +272,7 @@ reg_def V6_H ( SOC, SOC, Op_VecA, 6, v6->as_VMReg()->next() ); reg_def V6_J ( SOC, SOC, Op_VecA, 6, v6->as_VMReg()->next(2) ); reg_def V6_K ( SOC, SOC, Op_VecA, 6, v6->as_VMReg()->next(3) ); -reg_def V7 ( SOC, SOC, Op_VecA, 7, v7->as_VMReg() ); +reg_def V7 ( SOC, SOC, Op_VecA, 7, v7->as_VMReg() ); reg_def V7_H ( SOC, SOC, Op_VecA, 7, v7->as_VMReg()->next() ); reg_def V7_J ( SOC, SOC, Op_VecA, 7, v7->as_VMReg()->next(2) ); reg_def V7_K ( SOC, SOC, Op_VecA, 7, v7->as_VMReg()->next(3) ); From 8e1d2b091c9a311d98a0b886a803fb18d4405d8a Mon Sep 17 00:00:00 2001 From: Rajan Halade <rhalade@openjdk.org> Date: Fri, 21 Jun 2024 16:37:57 +0000 Subject: [PATCH 145/471] 8334441: Mark tests in jdk_security_infra group as manual Reviewed-by: clanger, mullan --- test/jdk/ProblemList.txt | 2 - test/jdk/TEST.groups | 5 +- .../certification/CAInterop.java | 268 +++++++++--------- .../certification/CertignaCA.java | 6 +- .../certification/DTrustCA.java | 6 +- .../certification/DigicertCSRootG5.java | 6 +- .../certification/EmSignRootG2CA.java | 6 +- .../certification/HaricaCA.java | 6 +- .../certification/LuxTrustCA.java | 6 +- .../javax/net/ssl/HttpsURLConnectionTest.java | 2 +- 10 files changed, 158 insertions(+), 155 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 4ea08fa2bbc18..546f95b0054b1 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -620,8 +620,6 @@ javax/net/ssl/SSLSession/CertMsgCheck.java 8326705 generic- sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183,8333317 generic-all -security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java#teliasonerarootcav1 8333640 generic-all - ############################################################################ # jdk_sound diff --git a/test/jdk/TEST.groups b/test/jdk/TEST.groups index fa868699aab38..0a8d27484652a 100644 --- a/test/jdk/TEST.groups +++ b/test/jdk/TEST.groups @@ -251,6 +251,8 @@ jdk_security = \ :jdk_security3 \ :jdk_security4 +# Tests in this group are manual as they depend on external infra +# and may fail with external reasons, for instance - change in CA test portal. jdk_security_infra = \ security/infra @@ -618,6 +620,7 @@ jdk_core_manual_no_input = \ javax/xml/jaxp/datatype/8033980/GregorianCalAndDurSerDataUtil.java jdk_security_manual_no_input = \ + :jdk_security_infra \ com/sun/crypto/provider/Cipher/DES/PerformanceTest.java \ com/sun/crypto/provider/Cipher/AEAD/GCMIncrementByte4.java \ com/sun/crypto/provider/Cipher/AEAD/GCMIncrementDirect4.java \ @@ -661,4 +664,4 @@ jdk_containers_extended = \ jdk_core_no_security = \ :jdk_core \ - -:jdk_security \ No newline at end of file + -:jdk_security diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java index 9f071bc145087..889926077a9fe 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java @@ -27,12 +27,12 @@ * @summary Interoperability tests with Actalis CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp * CAInterop actalisauthenticationrootca OCSP - * @run main/othervm/timeout=180 -Djava.security.debug=certpath,ocsp + * @run main/othervm/manual/timeout=180 -Djava.security.debug=certpath,ocsp * -Dcom.sun.security.ocsp.useget=false * CAInterop actalisauthenticationrootca OCSP - * @run main/othervm/timeout=180 -Djava.security.debug=certpath,ocsp + * @run main/othervm/manual/timeout=180 -Djava.security.debug=certpath,ocsp * CAInterop actalisauthenticationrootca CRL */ @@ -42,9 +42,9 @@ * @summary Interoperability tests with Amazon's CA1 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop amazonrootca1 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca1 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop amazonrootca1 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop amazonrootca1 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca1 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop amazonrootca1 CRL */ /* @@ -53,9 +53,9 @@ * @summary Interoperability tests with Amazon's CA2 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop amazonrootca2 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca2 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop amazonrootca2 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop amazonrootca2 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca2 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop amazonrootca2 CRL */ /* @@ -64,9 +64,9 @@ * @summary Interoperability tests with Amazon's CA3 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop amazonrootca3 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca3 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop amazonrootca3 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop amazonrootca3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop amazonrootca3 CRL */ /* @@ -75,9 +75,9 @@ * @summary Interoperability tests with Amazon's CA4 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop amazonrootca4 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca4 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop amazonrootca4 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop amazonrootca4 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca4 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop amazonrootca4 CRL */ /* @@ -86,9 +86,9 @@ * @summary Interoperability tests with Buypass Class 2 CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop buypassclass2ca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop buypassclass2ca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop buypassclass2ca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop buypassclass2ca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop buypassclass2ca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop buypassclass2ca CRL */ /* @@ -97,9 +97,9 @@ * @summary Interoperability tests with Buypass Class 3 CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop buypassclass3ca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop buypassclass3ca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop buypassclass3ca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop buypassclass3ca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop buypassclass3ca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop buypassclass3ca CRL */ /* @@ -108,9 +108,9 @@ * @summary Interoperability tests with Comodo RSA CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop comodorsaca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop comodorsaca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop comodorsaca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop comodorsaca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop comodorsaca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop comodorsaca CRL */ /* @@ -119,9 +119,9 @@ * @summary Interoperability tests with Comodo ECC CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop comodoeccca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop comodoeccca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop comodoeccca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop comodoeccca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop comodoeccca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop comodoeccca CRL */ /* @@ -130,9 +130,9 @@ * @summary Interoperability tests with Comodo userTrust RSA CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop usertrustrsaca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop usertrustrsaca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop usertrustrsaca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop usertrustrsaca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop usertrustrsaca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop usertrustrsaca CRL */ /* @@ -141,9 +141,9 @@ * @summary Interoperability tests with Comodo userTrust ECC CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop usertrusteccca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop usertrusteccca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop usertrusteccca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop usertrusteccca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop usertrusteccca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop usertrusteccca CRL */ /* @@ -152,8 +152,8 @@ * @summary Interoperability tests with Let's Encrypt ISRG Root X1 CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop letsencryptisrgx1 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop letsencryptisrgx1 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop letsencryptisrgx1 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop letsencryptisrgx1 DEFAULT */ /* @@ -162,8 +162,8 @@ * @summary Interoperability tests with Let's Encrypt ISRG Root X2 CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop letsencryptisrgx2 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop letsencryptisrgx2 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop letsencryptisrgx2 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop letsencryptisrgx2 DEFAULT */ /* @@ -172,9 +172,9 @@ * @summary Interoperability tests with GlobalSign R6 CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop globalsignrootcar6 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsignrootcar6 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop globalsignrootcar6 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop globalsignrootcar6 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsignrootcar6 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop globalsignrootcar6 CRL */ /* @@ -183,9 +183,9 @@ * @summary Interoperability tests with Entrust CAs * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop entrustrootcaec1 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop entrustrootcaec1 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop entrustrootcaec1 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop entrustrootcaec1 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop entrustrootcaec1 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop entrustrootcaec1 CRL */ /* @@ -194,9 +194,9 @@ * @summary Interoperability tests with Entrust CAs * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop entrustrootcag4 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop entrustrootcag4 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop entrustrootcag4 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop entrustrootcag4 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop entrustrootcag4 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop entrustrootcag4 CRL */ /* @@ -205,9 +205,9 @@ * @summary Interoperability tests with GoDaddy CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop godaddyrootg2ca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop godaddyrootg2ca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop godaddyrootg2ca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop godaddyrootg2ca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop godaddyrootg2ca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop godaddyrootg2ca CRL */ /* @@ -216,9 +216,9 @@ * @summary Interoperability tests with Starfield CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop starfieldrootg2ca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop starfieldrootg2ca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop starfieldrootg2ca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop starfieldrootg2ca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop starfieldrootg2ca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop starfieldrootg2ca CRL */ /* @@ -227,8 +227,8 @@ * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop globalsigneccrootcar4 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsigneccrootcar4 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop globalsigneccrootcar4 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsigneccrootcar4 DEFAULT */ /* @@ -237,8 +237,8 @@ * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop gtsrootcar1 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootcar1 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop gtsrootcar1 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootcar1 DEFAULT */ /* @@ -247,8 +247,8 @@ * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop gtsrootcar2 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootcar2 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop gtsrootcar2 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootcar2 DEFAULT */ /* @@ -257,8 +257,8 @@ * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop gtsrootecccar3 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootecccar3 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop gtsrootecccar3 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootecccar3 DEFAULT */ /* @@ -267,8 +267,8 @@ * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootecccar4 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop gtsrootecccar4 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootecccar4 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop gtsrootecccar4 DEFAULT */ /* @@ -277,9 +277,9 @@ * @summary Interoperability tests with Microsoft TLS root CAs * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop microsoftecc2017 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop microsoftecc2017 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop microsoftecc2017 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop microsoftecc2017 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop microsoftecc2017 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop microsoftecc2017 CRL */ /* @@ -288,9 +288,9 @@ * @summary Interoperability tests with Microsoft TLS root CAs * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop microsoftrsa2017 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop microsoftrsa2017 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop microsoftrsa2017 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop microsoftrsa2017 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop microsoftrsa2017 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop microsoftrsa2017 CRL */ /* @@ -299,9 +299,9 @@ * @summary Interoperability tests with QuoVadis Root CA1 G3 CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca1g3 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca1g3 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop quovadisrootca1g3 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca1g3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca1g3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop quovadisrootca1g3 CRL */ /* @@ -310,9 +310,9 @@ * @summary Interoperability tests with QuoVadis Root CA2 G3 CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca2g3 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca2g3 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop quovadisrootca2g3 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca2g3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca2g3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop quovadisrootca2g3 CRL */ /* @@ -321,9 +321,9 @@ * @summary Interoperability tests with QuoVadis Root CA3 G3 CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca3g3 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca3g3 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop quovadisrootca3g3 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca3g3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca3g3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop quovadisrootca3g3 CRL */ /* @@ -332,9 +332,9 @@ * @summary Interoperability tests with DigiCert TLS ECC P384 Root G5 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop digicerttlseccrootg5 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop digicerttlseccrootg5 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop digicerttlseccrootg5 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop digicerttlseccrootg5 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop digicerttlseccrootg5 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop digicerttlseccrootg5 CRL */ /* @@ -343,9 +343,9 @@ * @summary Interoperability tests with DigiCert TLS RSA4096 Root G5 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop digicerttlsrsarootg5 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop digicerttlsrsarootg5 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop digicerttlsrsarootg5 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop digicerttlsrsarootg5 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop digicerttlsrsarootg5 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop digicerttlsrsarootg5 CRL */ /* @@ -354,9 +354,9 @@ * @summary Interoperability tests with SSL.com's RSA CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop sslrootrsaca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrootrsaca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop sslrootrsaca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop sslrootrsaca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrootrsaca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop sslrootrsaca CRL */ /* @@ -365,9 +365,9 @@ * @summary Interoperability tests with SSL.com's EV RSA CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop sslrootevrsaca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrootevrsaca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop sslrootevrsaca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop sslrootevrsaca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrootevrsaca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop sslrootevrsaca CRL */ /* @@ -376,9 +376,9 @@ * @summary Interoperability tests with SSL.com's ECC CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop sslrooteccca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrooteccca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop sslrooteccca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop sslrooteccca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrooteccca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop sslrooteccca CRL */ /* @@ -387,9 +387,9 @@ * @summary Interoperability tests with TeliaSonera Root CA v1 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop teliasonerarootcav1 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop teliasonerarootcav1 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop teliasonerarootcav1 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop teliasonerarootcav1 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop teliasonerarootcav1 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop teliasonerarootcav1 CRL */ /* @@ -398,9 +398,9 @@ * @summary Interoperability tests with TWCA Global Root CA from TAIWAN-CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop twcaglobalrootca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop twcaglobalrootca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop twcaglobalrootca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop twcaglobalrootca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop twcaglobalrootca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop twcaglobalrootca CRL */ /* @@ -409,9 +409,9 @@ * @summary Interoperability tests with Certigna Root CAs from Dhimyotis * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop certignarootca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certignarootca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop certignarootca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop certignarootca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certignarootca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop certignarootca CRL */ /* @@ -420,9 +420,9 @@ * @summary Interoperability tests with AffirmTrust Commercial CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop affirmtrustcommercialca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustcommercialca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop affirmtrustcommercialca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop affirmtrustcommercialca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustcommercialca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop affirmtrustcommercialca CRL */ /* @@ -431,9 +431,9 @@ * @summary Interoperability tests with AffirmTrust Networking CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop affirmtrustnetworkingca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustnetworkingca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop affirmtrustnetworkingca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop affirmtrustnetworkingca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustnetworkingca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop affirmtrustnetworkingca CRL */ /* @@ -442,9 +442,9 @@ * @summary Interoperability tests with AffirmTrust Premium CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop affirmtrustpremiumca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustpremiumca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop affirmtrustpremiumca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop affirmtrustpremiumca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustpremiumca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop affirmtrustpremiumca CRL */ /* @@ -453,9 +453,9 @@ * @summary Interoperability tests with AffirmTrust Premium ECC CA * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop affirmtrustpremiumeccca OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustpremiumeccca OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop affirmtrustpremiumeccca CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop affirmtrustpremiumeccca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustpremiumeccca OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop affirmtrustpremiumeccca CRL */ /* @@ -464,9 +464,9 @@ * @summary Interoperability tests with Telia Root CA V2 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop teliarootcav2 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop teliarootcav2 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop teliarootcav2 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop teliarootcav2 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop teliarootcav2 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop teliarootcav2 CRL */ /* @@ -475,9 +475,9 @@ * @summary Interoperability tests with eMudhra Root CA G1 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop emsignrootcag1 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop emsignrootcag1 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop emsignrootcag1 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop emsignrootcag1 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop emsignrootcag1 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop emsignrootcag1 CRL */ /* @@ -486,9 +486,9 @@ * @summary Interoperability tests with eMudhra ECC Root CA G3 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop emsigneccrootcag3 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop emsigneccrootcag3 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop emsigneccrootcag3 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop emsigneccrootcag3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop emsigneccrootcag3 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop emsigneccrootcag3 CRL */ /* @@ -497,8 +497,8 @@ * @summary Interoperability tests with Certainly Root R1 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop certainlyrootr1 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certainlyrootr1 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop certainlyrootr1 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certainlyrootr1 DEFAULT */ /* @@ -507,8 +507,8 @@ * @summary Interoperability tests with Certainly Root E1 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop certainlyroote1 DEFAULT - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certainlyroote1 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop certainlyroote1 DEFAULT + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certainlyroote1 DEFAULT */ /* @@ -517,9 +517,9 @@ * @summary Interoperability tests with GlobalSign Root R46 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop globalsignr46 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsignr46 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop globalsignr46 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop globalsignr46 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsignr46 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop globalsignr46 CRL */ /* @@ -528,13 +528,15 @@ * @summary Interoperability tests with GlobalSign Root E46 * @library /test/lib * @build jtreg.SkippedException ValidatePathWithURL CAInterop - * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop globalsigne46 OCSP - * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsigne46 OCSP - * @run main/othervm -Djava.security.debug=certpath CAInterop globalsigne46 CRL + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop globalsigne46 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsigne46 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CAInterop globalsigne46 CRL */ /** - * Collection of certificate validation tests for interoperability with external CAs + * Collection of certificate validation tests for interoperability with external CAs. + * These tests are marked as manual as they depend on external infrastructure and may fail + * with external reasons, for instance - change in CA test portal. */ public class CAInterop { diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CertignaCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CertignaCA.java index f1dd2d6229a47..eb09d56a14e56 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CertignaCA.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CertignaCA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,8 @@ * @bug 8245654 8256895 * @summary Interoperability tests with Certigna Root CAs from Dhimyotis * @build ValidatePathWithParams - * @run main/othervm -Djava.security.debug=certpath CertignaCA OCSP - * @run main/othervm -Djava.security.debug=certpath CertignaCA CRL + * @run main/othervm/manual -Djava.security.debug=certpath CertignaCA OCSP + * @run main/othervm/manual -Djava.security.debug=certpath CertignaCA CRL */ public class CertignaCA { // Owner: CN=Certigna Services CA, OID.2.5.4.97=NTRFR-48146308100036, diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DTrustCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DTrustCA.java index 152e77907bb30..13a2e8044dac7 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DTrustCA.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DTrustCA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,8 +27,8 @@ * @summary Interoperability tests with "D-Trust Root Class 3 CA 2 2009" and * "D-Trust Root Class 3 CA 2 EV 2009" CAs * @build ValidatePathWithParams - * @run main/othervm -Djava.security.debug=certpath DTrustCA OCSP - * @run main/othervm -Djava.security.debug=certpath DTrustCA CRL + * @run main/othervm/manual -Djava.security.debug=certpath DTrustCA OCSP + * @run main/othervm/manual -Djava.security.debug=certpath DTrustCA CRL */ public class DTrustCA { diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DigicertCSRootG5.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DigicertCSRootG5.java index 30ad81b1755c8..4b45bb857ba45 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DigicertCSRootG5.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DigicertCSRootG5.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,8 @@ * @bug 8318759 * @summary Interoperability tests with Digicert CS Root G5 certificates * @build ValidatePathWithParams - * @run main/othervm -Djava.security.debug=ocsp,certpath DigicertCSRootG5 OCSP - * @run main/othervm -Djava.security.debug=certpath DigicertCSRootG5 CRL + * @run main/othervm/manual -Djava.security.debug=ocsp,certpath DigicertCSRootG5 OCSP + * @run main/othervm/manual -Djava.security.debug=certpath DigicertCSRootG5 CRL */ public class DigicertCSRootG5 { diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/EmSignRootG2CA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/EmSignRootG2CA.java index 8f5df9cce755b..14e48a6e78fb1 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/EmSignRootG2CA.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/EmSignRootG2CA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,8 @@ * @bug 8319187 * @summary Interoperability tests with eMudhra emSign Root CA G2 CS root * @build ValidatePathWithParams - * @run main/othervm -Djava.security.debug=certpath EmSignRootG2CA OCSP - * @run main/othervm -Djava.security.debug=certpath EmSignRootG2CA CRL + * @run main/othervm/manual -Djava.security.debug=certpath EmSignRootG2CA OCSP + * @run main/othervm/manual -Djava.security.debug=certpath EmSignRootG2CA CRL */ public class EmSignRootG2CA { diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/HaricaCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/HaricaCA.java index 247502e6e6cfe..744e9b6bf34ed 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/HaricaCA.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/HaricaCA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,8 @@ * @bug 8256421 * @summary Interoperability tests with Harica CAs * @build ValidatePathWithParams - * @run main/othervm -Djava.security.debug=certpath HaricaCA OCSP - * @run main/othervm -Djava.security.debug=certpath HaricaCA CRL + * @run main/othervm/manual -Djava.security.debug=certpath HaricaCA OCSP + * @run main/othervm/manual -Djava.security.debug=certpath HaricaCA CRL */ /* diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java index 469501c70c2f6..3e9631848c247 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,8 @@ * @bug 8232019 8256895 * @summary Interoperability tests with LuxTrust Global Root 2 CA * @build ValidatePathWithParams - * @run main/othervm -Djava.security.debug=certpath LuxTrustCA OCSP - * @run main/othervm -Djava.security.debug=certpath LuxTrustCA CRL + * @run main/othervm/manual -Djava.security.debug=certpath LuxTrustCA OCSP + * @run main/othervm/manual -Djava.security.debug=certpath LuxTrustCA CRL */ /* diff --git a/test/jdk/security/infra/javax/net/ssl/HttpsURLConnectionTest.java b/test/jdk/security/infra/javax/net/ssl/HttpsURLConnectionTest.java index 7aeb67e842d5b..7e08d6cd4fefe 100644 --- a/test/jdk/security/infra/javax/net/ssl/HttpsURLConnectionTest.java +++ b/test/jdk/security/infra/javax/net/ssl/HttpsURLConnectionTest.java @@ -28,7 +28,7 @@ * KEYCHAINSTORE-ROOT trust store * @library /test/lib * @requires os.family == "mac" - * @run main/othervm HttpsURLConnectionTest https://github.com KeychainStore-Root + * @run main/othervm/manual HttpsURLConnectionTest https://github.com KeychainStore-Root */ import java.io.*; import java.net.*; From 689cee3d0950e15e88a1f6738bfded00655dca9c Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan <psadhukhan@openjdk.org> Date: Fri, 21 Jun 2024 18:02:57 +0000 Subject: [PATCH 146/471] 8334509: Cancelling PageDialog does not return the same PageFormat object Reviewed-by: aivanov, prr --- .../native/libawt/windows/awt_PrintJob.cpp | 16 ++--- .../PrinterJob/PageDialogCancelTest.java | 58 +++++++++++++++++++ 2 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java diff --git a/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp b/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp index c761533621870..9f126bded9418 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp +++ b/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp @@ -522,6 +522,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) AwtComponent *awtParent = (parent != NULL) ? (AwtComponent *)JNI_GET_PDATA(parent) : NULL; HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL; + jboolean doIt = JNI_FALSE; PAGESETUPDLG setup; memset(&setup, 0, sizeof(setup)); @@ -577,7 +578,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) */ if ((setup.hDevMode == NULL) && (setup.hDevNames == NULL)) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } } else { int measure = PSD_INTHOUSANDTHSOFINCHES; @@ -605,7 +606,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) pageFormatToSetup(env, self, page, &setup, AwtPrintControl::getPrintDC(env, self)); if (env->ExceptionCheck()) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } setup.lpfnPageSetupHook = reinterpret_cast<LPPAGESETUPHOOK>(pageDlgHook); @@ -619,7 +620,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) jobject paper = getPaper(env, page); if (paper == NULL) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } int units = setup.Flags & PSD_INTHOUSANDTHSOFINCHES ? MM_HIENGLISH : @@ -661,7 +662,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) setPaperValues(env, paper, &paperSize, &margins, units); if (env->ExceptionCheck()) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } /* * Put the updated Paper instance and the orientation into @@ -670,7 +671,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) setPaper(env, page, paper); if (env->ExceptionCheck()) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } setPageFormatOrientation(env, page, orientation); if (env->ExceptionCheck()) { @@ -684,12 +685,13 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) jboolean err = setPrintPaperSize(env, self, devmode->dmPaperSize); if (err) { CLEANUP_SHOW; - return JNI_FALSE; + return doIt; } } } ::GlobalUnlock(setup.hDevMode); } + doIt = JNI_TRUE; } AwtDialog::CheckUninstallModalHook(); @@ -708,7 +710,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) CLEANUP_SHOW; - return JNI_TRUE; + return doIt; CATCH_BAD_ALLOC_RET(0); } diff --git a/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java b/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java new file mode 100644 index 0000000000000..f9ce1b7c196a0 --- /dev/null +++ b/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8334366 + * @key headful printer + * @summary Verifies original pageobject is returned unmodified + * on cancelling pagedialog + * @requires (os.family == "windows") + * @run main PageDialogCancelTest + */ + +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.awt.print.PageFormat; +import java.awt.print.PrinterJob; + +public class PageDialogCancelTest { + + public static void main(String[] args) throws Exception { + PrinterJob pj = PrinterJob.getPrinterJob(); + PageFormat oldFormat = new PageFormat(); + Robot robot = new Robot(); + Thread t1 = new Thread(() -> { + robot.delay(2000); + robot.keyPress(KeyEvent.VK_ESCAPE); + robot.keyRelease(KeyEvent.VK_ESCAPE); + robot.waitForIdle(); + }); + t1.start(); + PageFormat newFormat = pj.pageDialog(oldFormat); + if (!newFormat.equals(oldFormat)) { + throw new RuntimeException("Original PageFormat not returned on cancelling PageDialog"); + } + } +} + From 1ff5acdafff1ccd3e64c70eebbfbff75e0d783eb Mon Sep 17 00:00:00 2001 From: Nizar Benalla <nbenalla@openjdk.org> Date: Fri, 21 Jun 2024 20:13:26 +0000 Subject: [PATCH 147/471] 8332099: since-checker - Add @ since to package-info in jdk.jsobject Reviewed-by: prr --- .../share/classes/netscape/javascript/package-info.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java b/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java index d3770732bc001..fcc97132a5074 100644 --- a/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java +++ b/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,8 @@ * The classes in this package were initially specified by Netscape, and are the * de facto standard mechanism for calling JavaScript from the Java runtime. * </p> + * + * @since 1.5 */ package netscape.javascript; From 7e55ed3b106ed08956d2d38b7c99fb81704667c9 Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Fri, 21 Jun 2024 22:38:38 +0000 Subject: [PATCH 148/471] 8333748: javap crash - Fatal error: Unmatched bit position 0x2 for location CLASS Reviewed-by: asotona --- .../com/sun/tools/javap/AttributeWriter.java | 4 +- .../com/sun/tools/javap/BasicWriter.java | 42 +++++- .../com/sun/tools/javap/ClassWriter.java | 70 ++-------- .../tools/javap/UndefinedAccessFlagTest.java | 128 ++++++++++++++++++ 4 files changed, 184 insertions(+), 60 deletions(-) create mode 100644 test/langtools/tools/javap/UndefinedAccessFlagTest.java diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java b/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java index 839ac2fd041b7..3b9336c499d9c 100644 --- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -208,7 +208,7 @@ public void write(Attribute<?> a, CodeAttribute lr) { indent(+1); first = false; } - for (var flag : info.flags()) { + for (var flag : maskToAccessFlagsReportUnknown(access_flags, AccessFlag.Location.INNER_CLASS)) { if (flag.sourceModifier() && (flag != AccessFlag.ABSTRACT || !info.has(AccessFlag.INTERFACE))) { print(Modifier.toString(flag.mask()) + " "); diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java b/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java index 8629957f907fd..64eecf920829a 100644 --- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,12 @@ package com.sun.tools.javap; import java.io.PrintWriter; +import java.lang.classfile.AccessFlags; +import java.lang.reflect.AccessFlag; +import java.lang.reflect.Modifier; +import java.util.EnumMap; +import java.util.Map; +import java.util.Set; import java.util.function.Supplier; /* @@ -38,6 +44,26 @@ * deletion without notice.</b> */ public class BasicWriter { + private static final Map<AccessFlag.Location, Integer> LOCATION_MASKS; + + static { + var map = new EnumMap<AccessFlag.Location, Integer>(AccessFlag.Location.class); + for (var loc : AccessFlag.Location.values()) { + map.put(loc, 0); + } + + for (var flag : AccessFlag.values()) { + for (var loc : flag.locations()) { + map.compute(loc, (_, v) -> v | flag.mask()); + } + } + + // Peculiarities from AccessFlag.maskToAccessFlag + map.compute(AccessFlag.Location.METHOD, (_, v) -> v | Modifier.STRICT); + + LOCATION_MASKS = map; + } + protected BasicWriter(Context context) { lineWriter = LineWriter.instance(context); out = context.get(PrintWriter.class); @@ -46,6 +72,20 @@ protected BasicWriter(Context context) { throw new AssertionError(); } + protected Set<AccessFlag> flagsReportUnknown(AccessFlags flags) { + return maskToAccessFlagsReportUnknown(flags.flagsMask(), flags.location()); + } + + protected Set<AccessFlag> maskToAccessFlagsReportUnknown(int mask, AccessFlag.Location location) { + try { + return AccessFlag.maskToAccessFlags(mask, location); + } catch (IllegalArgumentException ex) { + mask &= LOCATION_MASKS.get(location); + report("Access Flags: " + ex.getMessage()); + return AccessFlag.maskToAccessFlags(mask, location); + } + } + protected void print(String s) { lineWriter.print(s); } diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java index edf3d803af321..2483e99e49ad9 100644 --- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java @@ -417,7 +417,7 @@ protected void writeField(FieldModel f) { return; var flags = AccessFlags.ofField(f.flags().flagsMask()); - writeModifiers(flags.flags().stream().filter(fl -> fl.sourceModifier()) + writeModifiers(flagsReportUnknown(flags).stream().filter(fl -> fl.sourceModifier()) .map(fl -> Modifier.toString(fl.mask())).toList()); print(() -> sigPrinter.print( f.findAttribute(Attributes.signature()) @@ -446,7 +446,7 @@ protected void writeField(FieldModel f) { if (options.verbose) writeList(String.format("flags: (0x%04x) ", flags.flagsMask()), - flags.flags().stream().map(fl -> "ACC_" + fl.name()).toList(), + flagsReportUnknown(flags).stream().map(fl -> "ACC_" + fl.name()).toList(), "\n"); if (options.showAllAttrs) { @@ -478,7 +478,7 @@ protected void writeMethod(MethodModel m) { int flags = m.flags().flagsMask(); var modifiers = new ArrayList<String>(); - for (var f : AccessFlags.ofMethod(flags).flags()) + for (var f : flagsReportUnknown(m.flags())) if (f.sourceModifier()) modifiers.add(Modifier.toString(f.mask())); String name = "???"; @@ -561,7 +561,7 @@ protected void writeMethod(MethodModel m) { StringBuilder sb = new StringBuilder(); String sep = ""; sb.append(String.format("flags: (0x%04x) ", flags)); - for (var f : AccessFlags.ofMethod(flags).flags()) { + for (var f : flagsReportUnknown(m.flags())) { sb.append(sep).append("ACC_").append(f.name()); sep = ", "; } @@ -794,17 +794,9 @@ else switch (c) { } } - private static Set<String> getClassModifiers(int mask) { - return getModifiers(AccessFlags.ofClass((mask & ACC_INTERFACE) != 0 - ? mask & ~ACC_ABSTRACT : mask).flags()); - } - - private static Set<String> getMethodModifiers(int mask) { - return getModifiers(AccessFlags.ofMethod(mask).flags()); - } - - private static Set<String> getFieldModifiers(int mask) { - return getModifiers(AccessFlags.ofField(mask).flags()); + private Set<String> getClassModifiers(int mask) { + return getModifiers(flagsReportUnknown(AccessFlags.ofClass((mask & ACC_INTERFACE) != 0 + ? mask & ~ACC_ABSTRACT : mask))); } private static Set<String> getModifiers(Set<java.lang.reflect.AccessFlag> flags) { @@ -814,16 +806,16 @@ private static Set<String> getModifiers(Set<java.lang.reflect.AccessFlag> flags) return s; } - private static Set<String> getClassFlags(int mask) { - return getFlags(mask, AccessFlags.ofClass(mask).flags()); + private Set<String> getClassFlags(int mask) { + return getFlags(mask, flagsReportUnknown(AccessFlags.ofClass(mask))); } - private static Set<String> getMethodFlags(int mask) { - return getFlags(mask, AccessFlags.ofMethod(mask).flags()); + private Set<String> getMethodFlags(int mask) { + return getFlags(mask, flagsReportUnknown(AccessFlags.ofMethod(mask))); } - private static Set<String> getFieldFlags(int mask) { - return getFlags(mask, AccessFlags.ofField(mask).flags()); + private Set<String> getFieldFlags(int mask) { + return getFlags(mask, flagsReportUnknown(AccessFlags.ofField(mask))); } private static Set<String> getFlags(int mask, Set<java.lang.reflect.AccessFlag> flags) { @@ -840,42 +832,6 @@ private static Set<String> getFlags(int mask, Set<java.lang.reflect.AccessFlag> return s; } - public static enum AccessFlag { - ACC_PUBLIC (ClassFile.ACC_PUBLIC, "public", true, true, true, true ), - ACC_PRIVATE (ClassFile.ACC_PRIVATE, "private", false, true, true, true ), - ACC_PROTECTED (ClassFile.ACC_PROTECTED, "protected", false, true, true, true ), - ACC_STATIC (ClassFile.ACC_STATIC, "static", false, true, true, true ), - ACC_FINAL (ClassFile.ACC_FINAL, "final", true, true, true, true ), - ACC_SUPER (ClassFile.ACC_SUPER, null, true, false, false, false), - ACC_SYNCHRONIZED(ClassFile.ACC_SYNCHRONIZED, "synchronized", false, false, false, true ), - ACC_VOLATILE (ClassFile.ACC_VOLATILE, "volatile", false, false, true, false), - ACC_BRIDGE (ClassFile.ACC_BRIDGE, null, false, false, false, true ), - ACC_TRANSIENT (ClassFile.ACC_TRANSIENT, "transient", false, false, true, false), - ACC_VARARGS (ClassFile.ACC_VARARGS, null, false, false, false, true ), - ACC_NATIVE (ClassFile.ACC_NATIVE, "native", false, false, false, true ), - ACC_INTERFACE (ClassFile.ACC_INTERFACE, null, true, true, false, false), - ACC_ABSTRACT (ClassFile.ACC_ABSTRACT, "abstract", true, true, false, true ), - ACC_STRICT (ClassFile.ACC_STRICT, "strictfp", false, false, false, true ), - ACC_SYNTHETIC (ClassFile.ACC_SYNTHETIC, null, true, true, true, true ), - ACC_ANNOTATION (ClassFile.ACC_ANNOTATION, null, true, true, false, false), - ACC_ENUM (ClassFile.ACC_ENUM, null, true, true, true, false), - ACC_MODULE (ClassFile.ACC_MODULE, null, true, false, false, false); - - public final int flag; - public final String modifier; - public final boolean isClass, isInnerClass, isField, isMethod; - - AccessFlag(int flag, String modifier, boolean isClass, - boolean isInnerClass, boolean isField, boolean isMethod) { - this.flag = flag; - this.modifier = modifier; - this.isClass = isClass; - this.isInnerClass = isInnerClass; - this.isField = isField; - this.isMethod = isMethod; - } - } - private final Options options; private final AttributeWriter attrWriter; private final CodeWriter codeWriter; diff --git a/test/langtools/tools/javap/UndefinedAccessFlagTest.java b/test/langtools/tools/javap/UndefinedAccessFlagTest.java new file mode 100644 index 0000000000000..bb531fa369c16 --- /dev/null +++ b/test/langtools/tools/javap/UndefinedAccessFlagTest.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test 8333748 + * @summary javap should not fail if reserved access flag bits are set to 1 + * @library /tools/lib + * @modules jdk.jdeps/com.sun.tools.javap + * @enablePreview + * @run junit UndefinedAccessFlagTest + */ + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import toolbox.JavapTask; +import toolbox.Task; +import toolbox.ToolBox; + +import java.lang.classfile.AccessFlags; +import java.lang.classfile.ClassModel; +import java.lang.classfile.FieldModel; +import java.lang.classfile.MethodModel; +import java.lang.classfile.attribute.InnerClassInfo; +import java.lang.classfile.attribute.InnerClassesAttribute; +import java.nio.file.Files; +import java.nio.file.Path; + +import static java.lang.classfile.ClassFile.*; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class UndefinedAccessFlagTest { + + final ToolBox toolBox = new ToolBox(); + + enum TestLocation { + NONE(false), CLASS, FIELD, METHOD, INNER_CLASS(false); + + final boolean fails; + TestLocation() { this(true); } + TestLocation(boolean fails) { this.fails = fails; } + } + + @ParameterizedTest + @EnumSource(TestLocation.class) + void test(TestLocation location) throws Throwable { + var cf = of(); + ClassModel cm; + try (var is = UndefinedAccessFlagTest.class.getResourceAsStream( + "/UndefinedAccessFlagTest$SampleInnerClass.class" + )) { + cm = cf.parse(is.readAllBytes()); + } + var bytes = cf.transform(cm, (cb, ce) -> { + switch (ce) { + case AccessFlags flags when location == TestLocation.CLASS -> cb + .withFlags(flags.flagsMask() | ACC_PRIVATE); + case FieldModel f when location == TestLocation.FIELD -> cb + .transformField(f, (fb, fe) -> { + if (fe instanceof AccessFlags flags) { + fb.withFlags(flags.flagsMask() | ACC_SYNCHRONIZED); + } else { + fb.with(fe); + } + }); + case MethodModel m when location == TestLocation.METHOD -> cb + .transformMethod(m, (mb, me) -> { + if (me instanceof AccessFlags flags) { + mb.withFlags(flags.flagsMask() | ACC_INTERFACE); + } else { + mb.with(me); + } + }); + case InnerClassesAttribute attr when location == TestLocation.INNER_CLASS -> cb + .with(InnerClassesAttribute.of(attr.classes().stream() + .map(ic -> InnerClassInfo.of(ic.innerClass(), ic.outerClass(), ic.innerName(), ic.flagsMask() | 0x0020)) + .toList())); + default -> cb.with(ce); + } + }); + + Files.write(Path.of("transformed.class"), bytes); + + var lines = new JavapTask(toolBox) + .classes("transformed.class") + .options("-c", "-p", "-v") + .run(location.fails ? Task.Expect.FAIL : Task.Expect.SUCCESS) + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + + // No termination when access flag error happens + assertTrue(lines.stream().anyMatch(l -> l.contains("java.lang.String field;"))); + assertTrue(lines.stream().anyMatch(l -> l.contains("UndefinedAccessFlagTest$SampleInnerClass();"))); + assertTrue(lines.stream().anyMatch(l -> l.contains("void method();"))); + assertTrue(lines.stream().anyMatch(l -> l.contains("SampleInnerClass=class UndefinedAccessFlagTest$SampleInnerClass of class UndefinedAccessFlagTest"))); + + // Remove non-error lines + assertTrue(lines.removeIf(st -> !st.startsWith("Error:"))); + // Desired locations has errors + assertTrue(location == TestLocation.NONE || !lines.isEmpty()); + // Access Flag errors only + assertTrue(lines.stream().allMatch(l -> l.contains("Access Flags:")), () -> String.join("\n", lines)); + } + + static class SampleInnerClass { + String field; + void method() {} + } +} From 72ca7bafcd49a98c1fe09da72e4e47683f052e9d Mon Sep 17 00:00:00 2001 From: Hannes Greule <hgreule@openjdk.org> Date: Sat, 22 Jun 2024 12:16:50 +0000 Subject: [PATCH 149/471] 8334708: FFM: two javadoc problems Reviewed-by: mcimadamore --- src/java.base/share/classes/java/lang/foreign/Linker.java | 2 +- src/java.base/share/classes/java/lang/foreign/MemoryLayout.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/lang/foreign/Linker.java b/src/java.base/share/classes/java/lang/foreign/Linker.java index 545a83984f867..fd6e820d01662 100644 --- a/src/java.base/share/classes/java/lang/foreign/Linker.java +++ b/src/java.base/share/classes/java/lang/foreign/Linker.java @@ -222,7 +222,7 @@ * <pre> * MemoryLayout.structLayout( * ValueLayout.JAVA_INT.withName("x"), - * MemoryLayout.paddingLayout(32), + * MemoryLayout.paddingLayout(4), * ValueLayout.JAVA_LONG.withName("y") * ); * </pre> diff --git a/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java b/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java index 372b10aab1389..989fc134a2628 100644 --- a/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java +++ b/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java @@ -369,7 +369,7 @@ * int size = ... * MemorySegment points = ... * for (int i = 0 ; i < size ; i++) { - * ... POINT_ARR_X.get(segment, 0L, (long)i) ... + * ... POINT_ARR_X.get(points, 0L, (long)i) ... * } * } * From 652784c803863f40ee3d81695a19e705365cb800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Sj=C3=B6len?= <jsjolen@openjdk.org> Date: Sun, 23 Jun 2024 08:19:28 +0000 Subject: [PATCH 150/471] 8334392: Switch RNG in NMT's treap Reviewed-by: stuefe, azafari, gziemski --- src/hotspot/share/nmt/nmtTreap.hpp | 24 +++++++++++------------ test/hotspot/gtest/nmt/test_nmt_treap.cpp | 12 ++++++++---- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/hotspot/share/nmt/nmtTreap.hpp b/src/hotspot/share/nmt/nmtTreap.hpp index 97a5cddcb81ed..99c8655525c95 100644 --- a/src/hotspot/share/nmt/nmtTreap.hpp +++ b/src/hotspot/share/nmt/nmtTreap.hpp @@ -25,13 +25,12 @@ #ifndef SHARE_NMT_NMTTREAP_HPP #define SHARE_NMT_NMTTREAP_HPP -#include "memory/allocation.hpp" #include "runtime/os.hpp" #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/growableArray.hpp" #include "utilities/macros.hpp" -#include <stdint.h> +#include "utilities/powerOfTwo.hpp" // A Treap is a self-balanced binary tree where each node is equipped with a // priority. It adds the invariant that the priority of a parent P is strictly larger @@ -84,16 +83,16 @@ class Treap { private: ALLOCATOR _allocator; TreapNode* _root; + + // A random number + static constexpr const uint64_t _initial_seed = 0xC8DD2114AE0543A3; uint64_t _prng_seed; int _node_count; uint64_t prng_next() { - // Taken directly off of JFRPrng - static const constexpr uint64_t PrngMult = 0x5DEECE66DLL; - static const constexpr uint64_t PrngAdd = 0xB; - static const constexpr uint64_t PrngModPower = 48; - static const constexpr uint64_t PrngModMask = (static_cast<uint64_t>(1) << PrngModPower) - 1; - _prng_seed = (PrngMult * _prng_seed + PrngAdd) & PrngModMask; + uint64_t first_half = os::next_random(_prng_seed); + uint64_t second_half = os::next_random(_prng_seed >> 32); + _prng_seed = first_half | (second_half << 32); return _prng_seed; } @@ -173,9 +172,9 @@ class Treap { #ifdef ASSERT void verify_self() { // A balanced binary search tree should have a depth on the order of log(N). - // We take the ceiling of log_2(N + 1) * 2.5 as our maximum bound. + // We take the ceiling of log_2(N + 1) * 3 as our maximum bound. // For comparison, a RB-tree has a proven max depth of log_2(N + 1) * 2. - const int expected_maximum_depth = ceil((log(this->_node_count+1) / log(2)) * 2.5); + const int expected_maximum_depth = ceil(log2i(this->_node_count+1) * 3); // Find the maximum depth through DFS and ensure that the priority invariant holds. int maximum_depth_found = 0; @@ -225,11 +224,10 @@ class Treap { public: NONCOPYABLE(Treap); - Treap(uint64_t seed = static_cast<uint64_t>(os::random()) - | (static_cast<uint64_t>(os::random()) << 32)) + Treap() : _allocator(), _root(nullptr), - _prng_seed(seed), + _prng_seed(_initial_seed), _node_count(0) {} ~Treap() { diff --git a/test/hotspot/gtest/nmt/test_nmt_treap.cpp b/test/hotspot/gtest/nmt/test_nmt_treap.cpp index 9cd7f36aad6a7..3c98029d28f58 100644 --- a/test/hotspot/gtest/nmt/test_nmt_treap.cpp +++ b/test/hotspot/gtest/nmt/test_nmt_treap.cpp @@ -300,7 +300,9 @@ TEST_VM_F(TreapTest, VerifyItThroughStressTest) { } else { treap.remove(i); } - verify_it(treap); + if (i % 100 == 0) { + verify_it(treap); + } } for (int i = 0; i < ten_thousand; i++) { int r = os::random(); @@ -309,14 +311,16 @@ TEST_VM_F(TreapTest, VerifyItThroughStressTest) { } else { treap.remove(i); } - verify_it(treap); + if (i % 100 == 0) { + verify_it(treap); + } } } { // Make a very large treap and verify at the end struct Nothing {}; TreapCHeap<int, Nothing, Cmp> treap; - constexpr const int five_million = 5000000; - for (int i = 0; i < five_million; i++) { + constexpr const int one_hundred_thousand = 100000; + for (int i = 0; i < one_hundred_thousand; i++) { treap.upsert(i, Nothing()); } verify_it(treap); From eb110bdc6e8bcb87b9b8b24ac66eb9b4c57106fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Sj=C3=B6len?= <jsjolen@openjdk.org> Date: Sun, 23 Jun 2024 12:33:38 +0000 Subject: [PATCH 151/471] 8334180: NMT gtests introduced with 8312132 should be labeled as NMT Reviewed-by: gziemski, stuefe --- src/hotspot/share/nmt/memoryFileTracker.hpp | 4 ++-- src/hotspot/share/nmt/nmtTreap.hpp | 4 ++-- src/hotspot/share/nmt/vmatree.hpp | 2 +- .../gtest/nmt/test_nmt_memoryfiletracker.cpp | 4 ++-- .../gtest/nmt/test_nmt_nativecallstackstorage.cpp | 6 +++--- test/hotspot/gtest/nmt/test_nmt_treap.cpp | 14 +++++++------- test/hotspot/gtest/nmt/test_vmatree.cpp | 12 ++++++------ 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/hotspot/share/nmt/memoryFileTracker.hpp b/src/hotspot/share/nmt/memoryFileTracker.hpp index f662893af0a6b..432b6f9d99e1e 100644 --- a/src/hotspot/share/nmt/memoryFileTracker.hpp +++ b/src/hotspot/share/nmt/memoryFileTracker.hpp @@ -40,7 +40,7 @@ // storage with its own memory space separate from the process. // A typical example of such a file is a memory mapped file. class MemoryFileTracker { - friend class MemoryFileTrackerTest; + friend class NMTMemoryFileTrackerTest; // Provide caching of stacks. NativeCallStackStorage _stack_storage; @@ -48,7 +48,7 @@ class MemoryFileTracker { public: class MemoryFile : public CHeapObj<mtNMT> { friend MemoryFileTracker; - friend class MemoryFileTrackerTest; + friend class NMTMemoryFileTrackerTest; const char* _descriptive_name; VirtualMemorySnapshot _summary; VMATree _tree; diff --git a/src/hotspot/share/nmt/nmtTreap.hpp b/src/hotspot/share/nmt/nmtTreap.hpp index 99c8655525c95..700634974393a 100644 --- a/src/hotspot/share/nmt/nmtTreap.hpp +++ b/src/hotspot/share/nmt/nmtTreap.hpp @@ -52,8 +52,8 @@ template<typename K, typename V, typename COMPARATOR, typename ALLOCATOR> class Treap { - friend class VMATreeTest; - friend class TreapTest; + friend class NMTVMATreeTest; + friend class NMTTreapTest; public: class TreapNode { friend Treap; diff --git a/src/hotspot/share/nmt/vmatree.hpp b/src/hotspot/share/nmt/vmatree.hpp index b8946b3b8c155..a93c282f4d272 100644 --- a/src/hotspot/share/nmt/vmatree.hpp +++ b/src/hotspot/share/nmt/vmatree.hpp @@ -38,7 +38,7 @@ // or from committed memory of a certain MEMFLAGS to committed memory of a different MEMFLAGS. // The set of points is stored in a balanced binary tree for efficient querying and updating. class VMATree { - friend class VMATreeTest; + friend class NMTVMATreeTest; // A position in memory. public: using position = size_t; diff --git a/test/hotspot/gtest/nmt/test_nmt_memoryfiletracker.cpp b/test/hotspot/gtest/nmt/test_nmt_memoryfiletracker.cpp index 018b9c49d544e..d32c8192f2cd0 100644 --- a/test/hotspot/gtest/nmt/test_nmt_memoryfiletracker.cpp +++ b/test/hotspot/gtest/nmt/test_nmt_memoryfiletracker.cpp @@ -27,7 +27,7 @@ #include "nmt/memTracker.hpp" #include "unittest.hpp" -class MemoryFileTrackerTest : public testing::Test { +class NMTMemoryFileTrackerTest : public testing::Test { public: size_t sz(int x) { return (size_t) x; } void basics() { @@ -48,6 +48,6 @@ class MemoryFileTrackerTest : public testing::Test { }; }; -TEST_VM_F(MemoryFileTrackerTest, Basics) { +TEST_VM_F(NMTMemoryFileTrackerTest, Basics) { this->basics(); } diff --git a/test/hotspot/gtest/nmt/test_nmt_nativecallstackstorage.cpp b/test/hotspot/gtest/nmt/test_nmt_nativecallstackstorage.cpp index 92c2dde210415..71e924b7b9dc7 100644 --- a/test/hotspot/gtest/nmt/test_nmt_nativecallstackstorage.cpp +++ b/test/hotspot/gtest/nmt/test_nmt_nativecallstackstorage.cpp @@ -29,9 +29,9 @@ using NCSS = NativeCallStackStorage; -class NativeCallStackStorageTest : public testing::Test {}; +class NMTNativeCallStackStorageTest : public testing::Test {}; -TEST_VM_F(NativeCallStackStorageTest, DoNotStoreStackIfNotDetailed) { +TEST_VM_F(NMTNativeCallStackStorageTest, DoNotStoreStackIfNotDetailed) { NativeCallStack ncs{}; NCSS ncss(false); NCSS::StackIndex si = ncss.push(ncs); @@ -40,7 +40,7 @@ TEST_VM_F(NativeCallStackStorageTest, DoNotStoreStackIfNotDetailed) { EXPECT_TRUE(ncs_received.is_empty()); } -TEST_VM_F(NativeCallStackStorageTest, CollisionsReceiveDifferentIndexes) { +TEST_VM_F(NMTNativeCallStackStorageTest, CollisionsReceiveDifferentIndexes) { constexpr const int nr_of_stacks = 10; NativeCallStack ncs_arr[nr_of_stacks]; for (int i = 0; i < nr_of_stacks; i++) { diff --git a/test/hotspot/gtest/nmt/test_nmt_treap.cpp b/test/hotspot/gtest/nmt/test_nmt_treap.cpp index 3c98029d28f58..6e04cfce1a82d 100644 --- a/test/hotspot/gtest/nmt/test_nmt_treap.cpp +++ b/test/hotspot/gtest/nmt/test_nmt_treap.cpp @@ -28,7 +28,7 @@ #include "runtime/os.hpp" #include "unittest.hpp" -class TreapTest : public testing::Test { +class NMTTreapTest : public testing::Test { public: struct Cmp { static int cmp(int a, int b) { @@ -147,15 +147,15 @@ class TreapTest : public testing::Test { } }; -TEST_VM_F(TreapTest, InsertingDuplicatesResultsInOneValue) { +TEST_VM_F(NMTTreapTest, InsertingDuplicatesResultsInOneValue) { this->inserting_duplicates_results_in_one_value(); } -TEST_VM_F(TreapTest, TreapOughtNotLeak) { +TEST_VM_F(NMTTreapTest, TreapOughtNotLeak) { this->treap_ought_not_leak(); } -TEST_VM_F(TreapTest, TestVisitors) { +TEST_VM_F(NMTTreapTest, TestVisitors) { { // Tests with 'default' ordering (ascending) TreapCHeap<int, int, Cmp> treap; using Node = TreapCHeap<int, int, Cmp>::TreapNode; @@ -259,11 +259,11 @@ TEST_VM_F(TreapTest, TestVisitors) { } } -TEST_VM_F(TreapTest, TestFind) { +TEST_VM_F(NMTTreapTest, TestFind) { test_find(); } -TEST_VM_F(TreapTest, TestClosestLeq) { +TEST_VM_F(NMTTreapTest, TestClosestLeq) { using Node = TreapCHeap<int, int, Cmp>::TreapNode; { TreapCHeap<int, int, Cmp> treap; @@ -289,7 +289,7 @@ TEST_VM_F(TreapTest, TestClosestLeq) { #ifdef ASSERT -TEST_VM_F(TreapTest, VerifyItThroughStressTest) { +TEST_VM_F(NMTTreapTest, VerifyItThroughStressTest) { { // Repeatedly verify a treap of moderate size TreapCHeap<int, int, Cmp> treap; constexpr const int ten_thousand = 10000; diff --git a/test/hotspot/gtest/nmt/test_vmatree.cpp b/test/hotspot/gtest/nmt/test_vmatree.cpp index 17eb61352cd0f..1c1bc31b5b498 100644 --- a/test/hotspot/gtest/nmt/test_vmatree.cpp +++ b/test/hotspot/gtest/nmt/test_vmatree.cpp @@ -34,14 +34,14 @@ using Tree = VMATree; using Node = Tree::TreapNode; using NCS = NativeCallStackStorage; -class VMATreeTest : public testing::Test { +class NMTVMATreeTest : public testing::Test { public: NCS ncs; constexpr static const int si_len = 2; NCS::StackIndex si[si_len]; NativeCallStack stacks[si_len]; - VMATreeTest() : ncs(true) { + NMTVMATreeTest() : ncs(true) { stacks[0] = make_stack(0xA); stacks[1] = make_stack(0xB); si[0] = ncs.push(stacks[0]); @@ -172,7 +172,7 @@ class VMATreeTest : public testing::Test { -TEST_VM_F(VMATreeTest, OverlappingReservationsResultInTwoNodes) { +TEST_VM_F(NMTVMATreeTest, OverlappingReservationsResultInTwoNodes) { VMATree::RegionData rd{si[0], mtTest}; Tree tree; for (int i = 99; i >= 0; i--) { @@ -182,7 +182,7 @@ TEST_VM_F(VMATreeTest, OverlappingReservationsResultInTwoNodes) { } // Low-level tests inspecting the state of the tree. -TEST_VM_F(VMATreeTest, LowLevel) { +TEST_VM_F(NMTVMATreeTest, LowLevel) { adjacent_2_nodes(VMATree::empty_regiondata); remove_all_leaves_empty_tree(VMATree::empty_regiondata); commit_middle(VMATree::empty_regiondata); @@ -268,7 +268,7 @@ TEST_VM_F(VMATreeTest, LowLevel) { } // Tests for summary accounting -TEST_VM_F(VMATreeTest, SummaryAccounting) { +TEST_VM_F(NMTVMATreeTest, SummaryAccounting) { { // Fully enclosed re-reserving works correctly. Tree::RegionData rd(NCS::StackIndex(), mtTest); Tree::RegionData rd2(NCS::StackIndex(), mtNMT); @@ -416,7 +416,7 @@ struct SimpleVMATracker : public CHeapObj<mtTest> { constexpr const size_t SimpleVMATracker::num_pages; -TEST_VM_F(VMATreeTest, TestConsistencyWithSimpleTracker) { +TEST_VM_F(NMTVMATreeTest, TestConsistencyWithSimpleTracker) { // In this test we use ASSERT macros from gtest instead of EXPECT // as any error will propagate and become larger as the test progresses. SimpleVMATracker* tr = new SimpleVMATracker(); From 7baddc202a9ab2b85401aa05f827678b514ebf55 Mon Sep 17 00:00:00 2001 From: SendaoYan <syan@openjdk.org> Date: Sun, 23 Jun 2024 18:00:28 +0000 Subject: [PATCH 152/471] 8334339: Test java/nio/file/attribute/BasicFileAttributeView/CreationTime.java fails on alinux3 Reviewed-by: alanb --- .../BasicFileAttributeView/CreationTime.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/test/jdk/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java b/test/jdk/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java index 1898f584bcd63..ad85da7ae63b1 100644 --- a/test/jdk/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java +++ b/test/jdk/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,15 +21,24 @@ * questions. */ -/* @test - * @bug 8011536 8151430 8316304 +/* @test id=tmp + * @bug 8011536 8151430 8316304 8334339 * @summary Basic test for creationTime attribute on platforms/file systems - * that support it. + * that support it, tests using /tmp directory. * @library ../.. /test/lib * @build jdk.test.lib.Platform * @run main CreationTime */ +/* @test id=cwd + * @summary Basic test for creationTime attribute on platforms/file systems + * that support it, tests using the test scratch directory, the test + * scratch directory maybe at diff disk partition to /tmp on linux. + * @library ../.. /test/lib + * @build jdk.test.lib.Platform + * @run main CreationTime . + */ + import java.lang.foreign.Linker; import java.nio.file.Path; import java.nio.file.Files; @@ -38,6 +47,7 @@ import java.io.IOException; import jdk.test.lib.Platform; +import jtreg.SkippedException; public class CreationTime { @@ -68,8 +78,14 @@ static void test(Path top) throws IOException { FileTime creationTime = creationTime(file); Instant now = Instant.now(); if (Math.abs(creationTime.toMillis()-now.toEpochMilli()) > 10000L) { - err.println("File creation time reported as: " + creationTime); - throw new RuntimeException("Expected to be close to: " + now); + System.out.println("creationTime.toMillis() == " + creationTime.toMillis()); + // If the file system doesn't support birth time, then skip this test + if (creationTime.toMillis() == 0) { + throw new SkippedException("birth time not support for: " + file); + } else { + err.println("File creation time reported as: " + creationTime); + throw new RuntimeException("Expected to be close to: " + now); + } } /** @@ -95,7 +111,7 @@ static void test(Path top) throws IOException { // Creation time updates are not supported on Linux supportsCreationTimeWrite = false; } - System.out.println("supportsCreationTimeRead == " + supportsCreationTimeRead); + System.out.println(top + " supportsCreationTimeRead == " + supportsCreationTimeRead); /** * If the creation-time attribute is supported then change the file's @@ -127,7 +143,12 @@ static void test(Path top) throws IOException { public static void main(String[] args) throws IOException { // create temporary directory to run tests - Path dir = TestUtil.createTemporaryDirectory(); + Path dir; + if (args.length == 0) { + dir = TestUtil.createTemporaryDirectory(); + } else { + dir = TestUtil.createTemporaryDirectory(args[0]); + } try { test(dir); } finally { From a4582a8957d604b50249e1f59679393966456a14 Mon Sep 17 00:00:00 2001 From: Zhao Song <zsong@openjdk.org> Date: Mon, 24 Jun 2024 05:15:32 +0000 Subject: [PATCH 153/471] 8334166: Enable binary check Reviewed-by: kcr, ihse, prr, erikj --- .jcheck/conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.jcheck/conf b/.jcheck/conf index ecc41e341d926..f666ff69d5ee3 100644 --- a/.jcheck/conf +++ b/.jcheck/conf @@ -5,7 +5,7 @@ version=24 [checks] error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists -warning=issuestitle +warning=issuestitle,binary [repository] tags=(?:jdk-(?:[1-9]([0-9]*)(?:\.(?:0|[1-9][0-9]*)){0,4})(?:\+(?:(?:[0-9]+))|(?:-ga)))|(?:jdk[4-9](?:u\d{1,3})?-(?:(?:b\d{2,3})|(?:ga)))|(?:hs\d\d(?:\.\d{1,2})?-b\d\d) From 863b2a991df9204560c4680fc10dd0f68b260217 Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas <aboldtch@openjdk.org> Date: Mon, 24 Jun 2024 06:06:45 +0000 Subject: [PATCH 154/471] 8329994: Zap alignment padding bits for ArrayOops in non-release builds Reviewed-by: ayang, sjohanss --- src/hotspot/share/gc/shared/memAllocator.cpp | 15 +++++++++++++++ src/hotspot/share/gc/shared/memAllocator.hpp | 1 + src/hotspot/share/gc/z/zObjArrayAllocator.cpp | 2 ++ 3 files changed, 18 insertions(+) diff --git a/src/hotspot/share/gc/shared/memAllocator.cpp b/src/hotspot/share/gc/shared/memAllocator.cpp index 156b55c104621..318ab00188b3d 100644 --- a/src/hotspot/share/gc/shared/memAllocator.cpp +++ b/src/hotspot/share/gc/shared/memAllocator.cpp @@ -388,6 +388,7 @@ oop ObjArrayAllocator::initialize(HeapWord* mem) const { assert(_length >= 0, "length should be non-negative"); if (_do_zero) { mem_clear(mem); + mem_zap_start_padding(mem); mem_zap_end_padding(mem); } arrayOopDesc::set_length(mem, _length); @@ -395,6 +396,20 @@ oop ObjArrayAllocator::initialize(HeapWord* mem) const { } #ifndef PRODUCT +void ObjArrayAllocator::mem_zap_start_padding(HeapWord* mem) const { + const BasicType element_type = ArrayKlass::cast(_klass)->element_type(); + const size_t base_offset_in_bytes = arrayOopDesc::base_offset_in_bytes(element_type); + const size_t header_size_in_bytes = arrayOopDesc::header_size_in_bytes(); + + const address base = reinterpret_cast<address>(mem) + base_offset_in_bytes; + const address header_end = reinterpret_cast<address>(mem) + header_size_in_bytes; + + if (header_end < base) { + const size_t padding_in_bytes = base - header_end; + Copy::fill_to_bytes(header_end, padding_in_bytes, heapPaddingByteVal); + } +} + void ObjArrayAllocator::mem_zap_end_padding(HeapWord* mem) const { const size_t length_in_bytes = static_cast<size_t>(_length) << ArrayKlass::cast(_klass)->log2_element_size(); const BasicType element_type = ArrayKlass::cast(_klass)->element_type(); diff --git a/src/hotspot/share/gc/shared/memAllocator.hpp b/src/hotspot/share/gc/shared/memAllocator.hpp index a0450af4450ec..ec67616adbaaf 100644 --- a/src/hotspot/share/gc/shared/memAllocator.hpp +++ b/src/hotspot/share/gc/shared/memAllocator.hpp @@ -94,6 +94,7 @@ class ObjArrayAllocator: public MemAllocator { const int _length; const bool _do_zero; + void mem_zap_start_padding(HeapWord* mem) const PRODUCT_RETURN; void mem_zap_end_padding(HeapWord* mem) const PRODUCT_RETURN; public: diff --git a/src/hotspot/share/gc/z/zObjArrayAllocator.cpp b/src/hotspot/share/gc/z/zObjArrayAllocator.cpp index 1b2f3804e3d24..ad19f273dcf0f 100644 --- a/src/hotspot/share/gc/z/zObjArrayAllocator.cpp +++ b/src/hotspot/share/gc/z/zObjArrayAllocator.cpp @@ -139,6 +139,8 @@ oop ZObjArrayAllocator::initialize(HeapWord* mem) const { return true; }; + mem_zap_start_padding(mem); + if (!initialize_memory()) { // Re-color with 11 remset bits if we got intercepted by a GC safepoint const bool result = initialize_memory(); From 13dce296fc3924b269757ce1279c57afe18faeeb Mon Sep 17 00:00:00 2001 From: Richard Reingruber <rrich@openjdk.org> Date: Mon, 24 Jun 2024 06:33:39 +0000 Subject: [PATCH 155/471] 8334560: [PPC64]: postalloc_expand_java_dynamic_call_sched does not copy all fields Reviewed-by: mbaesken, mdoerr --- src/hotspot/cpu/ppc/ppc.ad | 1 + test/jdk/com/sun/jdi/EATests.java | 91 +++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index 8917b344e54cb..38485da958132 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -3429,6 +3429,7 @@ encode %{ call->_oop_map = _oop_map; call->_jvms = _jvms; call->_jvmadj = _jvmadj; + call->_has_ea_local_in_scope = _has_ea_local_in_scope; call->_in_rms = _in_rms; call->_nesting = _nesting; call->_override_symbolic_info = _override_symbolic_info; diff --git a/test/jdk/com/sun/jdi/EATests.java b/test/jdk/com/sun/jdi/EATests.java index cd80d01a07f11..7285948165989 100644 --- a/test/jdk/com/sun/jdi/EATests.java +++ b/test/jdk/com/sun/jdi/EATests.java @@ -289,6 +289,7 @@ public static void main(String[] args) { // Relocking test cases new EARelockingSimpleTarget() .run(); new EARelockingSimpleWithAccessInOtherThreadTarget() .run(); + new EARelockingSimpleWithAccessInOtherThread_02_DynamicCall_Target() .run(); new EARelockingRecursiveTarget() .run(); new EARelockingNestedInflatedTarget() .run(); new EARelockingNestedInflated_02Target() .run(); @@ -413,6 +414,7 @@ protected void runTests() throws Exception { // Relocking test cases new EARelockingSimple() .run(this); new EARelockingSimpleWithAccessInOtherThread() .run(this); + new EARelockingSimpleWithAccessInOtherThread_02_DynamicCall() .run(this); new EARelockingRecursive() .run(this); new EARelockingNestedInflated() .run(this); new EARelockingNestedInflated_02() .run(this); @@ -1851,6 +1853,95 @@ public int getExpectedIResult() { ///////////////////////////////////////////////////////////////////////////// +// The debugger reads and publishes an object with eliminated locking to an instance field. +// A 2nd thread in the debuggee finds it there and changes its state using a synchronized method. +// Without eager relocking the accesses are unsynchronized which can be observed. +// This is a variant of EARelockingSimpleWithAccessInOtherThread with a dynamic call (not devirtualized). +class EARelockingSimpleWithAccessInOtherThread_02_DynamicCall extends EATestCaseBaseDebugger { + + public void runTestCase() throws Exception { + BreakpointEvent bpe = resumeTo(TARGET_TESTCASE_BASE_NAME, "dontinline_brkpt", "()V"); + printStack(bpe.thread()); + String l1ClassName = EARelockingSimpleWithAccessInOtherThread_02_DynamicCall_Target.SyncCounter.class.getName(); + ObjectReference ctr = getLocalRef(bpe.thread().frame(2), l1ClassName, "l1"); + setField(testCase, "sharedCounter", ctr); + terminateEndlessLoop(); + } +} + +class EARelockingSimpleWithAccessInOtherThread_02_DynamicCall_Target extends EATestCaseBaseTarget { + + public static final BrkPtDispatchA[] disp = + {new BrkPtDispatchA(), new BrkPtDispatchB(), new BrkPtDispatchC(), new BrkPtDispatchD()}; + + public static class BrkPtDispatchA { + public EATestCaseBaseTarget testCase; + public void dontinline_brkpt() { testCase.dontinline_brkpt(); } + } + + public static class BrkPtDispatchB extends BrkPtDispatchA { + @Override + public void dontinline_brkpt() { testCase.dontinline_brkpt(); } + } + + public static class BrkPtDispatchC extends BrkPtDispatchA { + @Override + public void dontinline_brkpt() { testCase.dontinline_brkpt(); } + } + + public static class BrkPtDispatchD extends BrkPtDispatchA { + @Override + public void dontinline_brkpt() { + testCase.dontinline_brkpt(); + } + } + + public static class SyncCounter { + private int val; + public synchronized int inc() { return val++; } + } + + public volatile SyncCounter sharedCounter; + + @Override + public void setUp() { + super.setUp(); + testMethodDepth = 2; + for (BrkPtDispatchA d : disp) { + d.testCase = this; + } + doLoop = true; + new Thread(() -> { + while (doLoop) { + SyncCounter ctr = sharedCounter; + if (ctr != null) { + ctr.inc(); + } + } + }).start(); + } + + public int dispCount; + public void dontinline_testMethod() { + SyncCounter l1 = new SyncCounter(); + synchronized (l1) { // Eliminated locking + l1.inc(); + // Use different types for the subsequent call to prevent devirtualization. + BrkPtDispatchA d = disp[(dispCount++) & 3]; + d.dontinline_brkpt(); // Dynamic call. Debugger publishes l1 to sharedCounter. + iResult = l1.inc(); // Changes by the 2nd thread will be observed if l1 + // was not relocked before passing it to the debugger. + } + } + + @Override + public int getExpectedIResult() { + return 1; + } +} + +///////////////////////////////////////////////////////////////////////////// + // Test recursive locking class EARelockingRecursiveTarget extends EATestCaseBaseTarget { From edf7f055ee010a2c19bce26c15726d5b58e2e832 Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Mon, 24 Jun 2024 07:14:57 +0000 Subject: [PATCH 156/471] 8334083: C2 SuperWord: TestCompatibleUseDefTypeSize.java fails with -XX:+AlignVector after JDK-8325155 Reviewed-by: chagedorn, kvn --- .../loopopts/superword/TestCompatibleUseDefTypeSize.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestCompatibleUseDefTypeSize.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestCompatibleUseDefTypeSize.java index e1aa91369d473..43580f4dee246 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestCompatibleUseDefTypeSize.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestCompatibleUseDefTypeSize.java @@ -359,6 +359,7 @@ static Object[] test2(byte[] src, char[] dst) { IRNode.ADD_VI, "> 0", IRNode.STORE_VECTOR, "> 0"}, applyIfPlatform = {"64-bit", "true"}, + applyIf = {"AlignVector", "false"}, // a[i] and a[i+1] cannot both be aligned. applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}) // Used to not vectorize because of "alignment boundaries". // Assume 64 byte vector width: @@ -376,6 +377,7 @@ static Object[] test3(int[] a, int[] b) { IRNode.ADD_VI, "> 0", IRNode.STORE_VECTOR, "> 0"}, applyIfPlatform = {"64-bit", "true"}, + applyIf = {"AlignVector", "false"}, // a[i] and a[i+1] cannot both be aligned. applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"}) // same as test3, but hand-unrolled static Object[] test4(int[] a, int[] b) { From 05a63d80b9c1e312512c707ccf6b255c16a9edf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Sj=C3=B6len?= <jsjolen@openjdk.org> Date: Mon, 24 Jun 2024 07:51:01 +0000 Subject: [PATCH 157/471] 8334489: Add function os::used_memory Reviewed-by: eosterlund, dholmes, stuefe --- src/hotspot/share/runtime/os.cpp | 17 +++++++++++++++++ src/hotspot/share/runtime/os.hpp | 1 + 2 files changed, 18 insertions(+) diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp index bdf93e1d3b403..9860251fc3308 100644 --- a/src/hotspot/share/runtime/os.cpp +++ b/src/hotspot/share/runtime/os.cpp @@ -78,6 +78,10 @@ #include "utilities/macros.hpp" #include "utilities/powerOfTwo.hpp" +#ifdef LINUX +#include "osContainer_linux.hpp" +#endif + #ifndef _WINDOWS # include <poll.h> #endif @@ -2064,6 +2068,19 @@ static void assert_nonempty_range(const char* addr, size_t bytes) { p2i(addr), p2i(addr) + bytes); } +julong os::used_memory() { +#ifdef LINUX + if (OSContainer::is_containerized()) { + jlong mem_usage = OSContainer::memory_usage_in_bytes(); + if (mem_usage > 0) { + return mem_usage; + } + } +#endif + return os::physical_memory() - os::available_memory(); +} + + bool os::commit_memory(char* addr, size_t bytes, bool executable) { assert_nonempty_range(addr, bytes); bool res = pd_commit_memory(addr, bytes, executable); diff --git a/src/hotspot/share/runtime/os.hpp b/src/hotspot/share/runtime/os.hpp index ce7a07d4c43a0..f3f44ddb2e659 100644 --- a/src/hotspot/share/runtime/os.hpp +++ b/src/hotspot/share/runtime/os.hpp @@ -336,6 +336,7 @@ class os: AllStatic { // than "free" memory (`MemFree` in `/proc/meminfo`) because Linux can free memory // aggressively (e.g. clear caches) so that it becomes available. static julong available_memory(); + static julong used_memory(); static julong free_memory(); static jlong total_swap_space(); From 05ff3185edd25b381a97f6879f496e97b62dddc2 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev <shade@openjdk.org> Date: Mon, 24 Jun 2024 08:46:10 +0000 Subject: [PATCH 158/471] 8334594: Generational ZGC: Deadlock after OopMap rewrites in 8331572 Reviewed-by: stefank, eosterlund, coleenp, zgu --- src/hotspot/share/gc/shared/gcVMOperations.cpp | 2 +- .../share/gc/shenandoah/shenandoahVMOperations.cpp | 2 +- src/hotspot/share/gc/x/xDriver.cpp | 2 +- src/hotspot/share/gc/z/zGeneration.cpp | 2 +- src/hotspot/share/interpreter/oopMapCache.cpp | 9 ++++++--- src/hotspot/share/interpreter/oopMapCache.hpp | 4 ++-- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/gc/shared/gcVMOperations.cpp b/src/hotspot/share/gc/shared/gcVMOperations.cpp index 4cf1a4ccbafd0..4cc75f4745991 100644 --- a/src/hotspot/share/gc/shared/gcVMOperations.cpp +++ b/src/hotspot/share/gc/shared/gcVMOperations.cpp @@ -132,7 +132,7 @@ bool VM_GC_Operation::doit_prologue() { void VM_GC_Operation::doit_epilogue() { // GC thread root traversal likely used OopMapCache a lot, which // might have created lots of old entries. Trigger the cleanup now. - OopMapCache::trigger_cleanup(); + OopMapCache::try_trigger_cleanup(); if (Universe::has_reference_pending_list()) { Heap_lock->notify_all(); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp index af221550c69ab..9d2782502fefc 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp @@ -44,7 +44,7 @@ void VM_ShenandoahOperation::doit_epilogue() { assert(!ShenandoahHeap::heap()->has_gc_state_changed(), "GC State was not synchronized to java threads."); // GC thread root traversal likely used OopMapCache a lot, which // might have created lots of old entries. Trigger the cleanup now. - OopMapCache::trigger_cleanup(); + OopMapCache::try_trigger_cleanup(); } bool VM_ShenandoahReferenceOperation::doit_prologue() { diff --git a/src/hotspot/share/gc/x/xDriver.cpp b/src/hotspot/share/gc/x/xDriver.cpp index c477f4a135c32..3e6fd03134e12 100644 --- a/src/hotspot/share/gc/x/xDriver.cpp +++ b/src/hotspot/share/gc/x/xDriver.cpp @@ -134,7 +134,7 @@ class VM_XOperation : public VM_Operation { // GC thread root traversal likely used OopMapCache a lot, which // might have created lots of old entries. Trigger the cleanup now. - OopMapCache::trigger_cleanup(); + OopMapCache::try_trigger_cleanup(); } bool gc_locked() const { diff --git a/src/hotspot/share/gc/z/zGeneration.cpp b/src/hotspot/share/gc/z/zGeneration.cpp index 5c3afa9db8cc6..be86550d32171 100644 --- a/src/hotspot/share/gc/z/zGeneration.cpp +++ b/src/hotspot/share/gc/z/zGeneration.cpp @@ -456,7 +456,7 @@ class VM_ZOperation : public VM_Operation { // GC thread root traversal likely used OopMapCache a lot, which // might have created lots of old entries. Trigger the cleanup now. - OopMapCache::trigger_cleanup(); + OopMapCache::try_trigger_cleanup(); } bool success() const { diff --git a/src/hotspot/share/interpreter/oopMapCache.cpp b/src/hotspot/share/interpreter/oopMapCache.cpp index cae0efae9b26d..7b60e4869e368 100644 --- a/src/hotspot/share/interpreter/oopMapCache.cpp +++ b/src/hotspot/share/interpreter/oopMapCache.cpp @@ -592,10 +592,13 @@ bool OopMapCache::has_cleanup_work() { return Atomic::load(&_old_entries) != nullptr; } -void OopMapCache::trigger_cleanup() { - if (has_cleanup_work()) { - MutexLocker ml(Service_lock, Mutex::_no_safepoint_check_flag); +void OopMapCache::try_trigger_cleanup() { + // See we can take the lock for the notification without blocking. + // This allows triggering the cleanup from GC paths, that can hold + // the service lock for e.g. oop iteration in service thread. + if (has_cleanup_work() && Service_lock->try_lock_without_rank_check()) { Service_lock->notify_all(); + Service_lock->unlock(); } } diff --git a/src/hotspot/share/interpreter/oopMapCache.hpp b/src/hotspot/share/interpreter/oopMapCache.hpp index 3c124631377ef..46c85f6e87985 100644 --- a/src/hotspot/share/interpreter/oopMapCache.hpp +++ b/src/hotspot/share/interpreter/oopMapCache.hpp @@ -183,8 +183,8 @@ class OopMapCache : public CHeapObj<mtClass> { // Check if we need to clean up old entries static bool has_cleanup_work(); - // Request cleanup if work is needed - static void trigger_cleanup(); + // Request cleanup if work is needed and notification is currently possible + static void try_trigger_cleanup(); // Clean up the old entries static void cleanup(); From ca5a438e5a4612c66f70c70a9d425eca0e49e84d Mon Sep 17 00:00:00 2001 From: Christian Hagedorn <chagedorn@openjdk.org> Date: Mon, 24 Jun 2024 08:58:02 +0000 Subject: [PATCH 159/471] 8334571: Extract control dependency rewiring out of PhaseIdealLoop::dominated_by() into separate method Reviewed-by: roland, kvn --- src/hotspot/share/opto/loopPredicate.cpp | 52 ++++++++++++++---------- src/hotspot/share/opto/loopnode.hpp | 4 +- src/hotspot/share/opto/loopopts.cpp | 39 ++++++++++-------- 3 files changed, 56 insertions(+), 39 deletions(-) diff --git a/src/hotspot/share/opto/loopPredicate.cpp b/src/hotspot/share/opto/loopPredicate.cpp index bccc01a86ddb0..998d3a27178e1 100644 --- a/src/hotspot/share/opto/loopPredicate.cpp +++ b/src/hotspot/share/opto/loopPredicate.cpp @@ -1152,7 +1152,6 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod ParsePredicateSuccessProj* parse_predicate_proj, CountedLoopNode* cl, ConNode* zero, Invariance& invar, Deoptimization::DeoptReason reason) { // Following are changed to nonnull when a predicate can be hoisted - IfProjNode* new_predicate_proj = nullptr; IfNode* iff = if_success_proj->in(0)->as_If(); Node* test = iff->in(1); if (!test->is_Bool()) { //Conv2B, ... @@ -1163,10 +1162,9 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod if (invar.is_invariant(bol)) { C->print_method(PHASE_BEFORE_LOOP_PREDICATION_IC, 4, iff); // Invariant test - new_predicate_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, - reason, - iff->Opcode()); - Node* ctrl = new_predicate_proj->in(0)->as_If()->in(0); + IfProjNode* hoisted_check_predicate_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, + iff->Opcode()); + Node* ctrl = hoisted_check_predicate_proj->in(0)->as_If()->in(0); BoolNode* hoisted_check_predicate_bool = invar.clone(bol, ctrl)->as_Bool(); // Negate test if necessary (Parse Predicates always have IfTrue as success projection and IfFalse as uncommon trap) @@ -1177,11 +1175,16 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod register_new_node(hoisted_check_predicate_bool, ctrl); negated = true; } - IfNode* new_predicate_iff = new_predicate_proj->in(0)->as_If(); + IfNode* new_predicate_iff = hoisted_check_predicate_proj->in(0)->as_If(); _igvn.hash_delete(new_predicate_iff); new_predicate_iff->set_req(1, hoisted_check_predicate_bool); - C->print_method(PHASE_AFTER_LOOP_PREDICATION_IC, 4, new_predicate_proj->in(0)); + invar.map_ctrl(if_success_proj, hoisted_check_predicate_proj); // Mark hoisted check as invariant + + // Eliminate the old If in the loop body. + dominated_by(hoisted_check_predicate_proj, iff, negated); + + C->print_method(PHASE_AFTER_LOOP_PREDICATION_IC, 4, hoisted_check_predicate_proj->in(0)); #ifndef PRODUCT if (TraceLoopPredicate) { @@ -1193,10 +1196,10 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod } #endif } else if (cl != nullptr && loop->is_range_check_if(if_success_proj, this, invar DEBUG_ONLY(COMMA parse_predicate_proj))) { - range_check_predicate = true; C->print_method(PHASE_BEFORE_LOOP_PREDICATION_RC, 4, iff); // Range check for counted loops assert(if_success_proj->is_IfTrue(), "trap must be on false projection for a range check"); + IfTrueNode* hoisted_check_proj = if_success_proj->as_IfTrue(); const Node* cmp = bol->in(1)->as_Cmp(); Node* idx = cmp->in(1); assert(!invar.is_invariant(idx), "index is variant"); @@ -1265,10 +1268,18 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod // Fall through into rest of the cleanup code which will move any dependent nodes to the skeleton predicates of the // upper bound test. We always need to create skeleton predicates in order to properly remove dead loops when later // splitting the predicated loop into (unreachable) sub-loops (i.e. done by unrolling, peeling, pre/main/post etc.). - new_predicate_proj = add_template_assertion_predicate(iff, loop, if_success_proj, parse_predicate_proj, upper_bound_proj, scale, - offset, init, limit, stride, rng, overflow, reason); + IfTrueNode* template_assertion_predicate_proj = + add_template_assertion_predicate(iff, loop, hoisted_check_proj, parse_predicate_proj, upper_bound_proj, scale, + offset, init, limit, stride, rng, overflow, reason); + + // Eliminate the old range check in the loop body. + // When a range check is eliminated, data dependent nodes (Load and range check CastII nodes) are now dependent on 2 + // Hoisted Check Predicates (one for the start of the loop, one for the end) but we can only keep track of one control + // dependency: pin the data dependent nodes. + eliminate_hoisted_range_check(hoisted_check_proj, template_assertion_predicate_proj); + invar.map_ctrl(hoisted_check_proj, template_assertion_predicate_proj); // Mark hoisted check as invariant - C->print_method(PHASE_AFTER_LOOP_PREDICATION_RC, 4, new_predicate_proj->in(0)); + C->print_method(PHASE_AFTER_LOOP_PREDICATION_RC, 4, template_assertion_predicate_proj->in(0)); #ifndef PRODUCT if (TraceLoopOpts && !TraceLoopPredicate) { @@ -1281,24 +1292,21 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod // with uncommon trap. return false; } - assert(new_predicate_proj != nullptr, "sanity"); - // Success - attach condition (new_predicate_bol) to predicate if - invar.map_ctrl(if_success_proj, new_predicate_proj); // so that invariance test can be appropriate - - // Eliminate the old If in the loop body - // If a range check is eliminated, data dependent nodes (Load and range check CastII nodes) are now dependent on 2 - // Hoisted Check Predicates (one for the start of the loop, one for the end) but we can only keep track of one control - // dependency: pin the data dependent nodes. - dominated_by(new_predicate_proj, iff, if_success_proj->_con != new_predicate_proj->_con, range_check_predicate); C->set_major_progress(); return true; } +void PhaseIdealLoop::eliminate_hoisted_range_check(IfTrueNode* hoisted_check_proj, + IfTrueNode* template_assertion_predicate_proj) { + _igvn.replace_input_of(hoisted_check_proj->in(0), 1, _igvn.intcon(1)); + rewire_safe_outputs_to_dominator(hoisted_check_proj, template_assertion_predicate_proj, true); +} + // Each newly created Hoisted Check Predicate is accompanied by two Template Assertion Predicates. Later, we initialize // them by making a copy of them when splitting a loop into sub loops. The Assertion Predicates ensure that dead sub // loops are removed properly. -IfProjNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealLoopTree* loop, IfProjNode* if_proj, +IfTrueNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealLoopTree* loop, IfProjNode* if_proj, ParsePredicateSuccessProj* parse_predicate_proj, IfProjNode* upper_bound_proj, const int scale, Node* offset, Node* init, Node* limit, const jint stride, @@ -1312,7 +1320,7 @@ IfProjNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealL Node* opaque_bol = new Opaque4Node(C, bol, _igvn.intcon(1)); // This will go away once loop opts are over C->add_template_assertion_predicate_opaq(opaque_bol); register_new_node(opaque_bol, upper_bound_proj); - IfProjNode* new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode()); + IfTrueNode* new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode()); _igvn.replace_input_of(new_proj->in(0), 1, opaque_bol); assert(opaque_init->outcnt() > 0, "should be used"); diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp index 8d9d4b3e0e543..17145c825a420 100644 --- a/src/hotspot/share/opto/loopnode.hpp +++ b/src/hotspot/share/opto/loopnode.hpp @@ -1377,10 +1377,11 @@ class PhaseIdealLoop : public PhaseTransform { void loop_predication_follow_branches(Node *c, IdealLoopTree *loop, float loop_trip_cnt, PathFrequency& pf, Node_Stack& stack, VectorSet& seen, Node_List& if_proj_list); - IfProjNode* add_template_assertion_predicate(IfNode* iff, IdealLoopTree* loop, IfProjNode* if_proj, + IfTrueNode* add_template_assertion_predicate(IfNode* iff, IdealLoopTree* loop, IfProjNode* if_proj, ParsePredicateSuccessProj* parse_predicate_proj, IfProjNode* upper_bound_proj, int scale, Node* offset, Node* init, Node* limit, jint stride, Node* rng, bool& overflow, Deoptimization::DeoptReason reason); + void eliminate_hoisted_range_check(IfTrueNode* hoisted_check_proj, IfTrueNode* template_assertion_predicate_proj); Node* add_range_check_elimination_assertion_predicate(IdealLoopTree* loop, Node* predicate_proj, int scale_con, Node* offset, Node* limit, int stride_con, Node* value, bool is_template); @@ -1535,6 +1536,7 @@ class PhaseIdealLoop : public PhaseTransform { // Mark an IfNode as being dominated by a prior test, // without actually altering the CFG (and hence IDOM info). void dominated_by(IfProjNode* prevdom, IfNode* iff, bool flip = false, bool pin_array_access_nodes = false); + void rewire_safe_outputs_to_dominator(Node* source, Node* dominator, bool pin_array_access_nodes); // Split Node 'n' through merge point RegionNode* split_thru_region(Node* n, RegionNode* region); diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp index 23b2edce6549a..182947e552e88 100644 --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -340,24 +340,31 @@ void PhaseIdealLoop::dominated_by(IfProjNode* prevdom, IfNode* iff, bool flip, b // I can assume this path reaches an infinite loop. In this case it's not // important to optimize the data Nodes - either the whole compilation will // be tossed or this path (and all data Nodes) will go dead. - if (iff->outcnt() != 2) return; + if (iff->outcnt() != 2) { + return; + } // Make control-dependent data Nodes on the live path (path that will remain // once the dominated IF is removed) become control-dependent on the // dominating projection. Node* dp = iff->proj_out_or_null(pop == Op_IfTrue); - if (dp == nullptr) + if (dp == nullptr) { return; + } + + rewire_safe_outputs_to_dominator(dp, prevdom, pin_array_access_nodes); +} - IdealLoopTree* old_loop = get_loop(dp); +void PhaseIdealLoop::rewire_safe_outputs_to_dominator(Node* source, Node* dominator, const bool pin_array_access_nodes) { + IdealLoopTree* old_loop = get_loop(source); - for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) { - Node* cd = dp->fast_out(i); // Control-dependent node + for (DUIterator_Fast imax, i = source->fast_outs(imax); i < imax; i++) { + Node* out = source->fast_out(i); // Control-dependent node // Do not rewire Div and Mod nodes which could have a zero divisor to avoid skipping their zero check. - if (cd->depends_only_on_test() && _igvn.no_dependent_zero_check(cd)) { - assert(cd->in(0) == dp, ""); - _igvn.replace_input_of(cd, 0, prevdom); + if (out->depends_only_on_test() && _igvn.no_dependent_zero_check(out)) { + assert(out->in(0) == source, "must be control dependent on source"); + _igvn.replace_input_of(out, 0, dominator); if (pin_array_access_nodes) { // Because of Loop Predication, Loads and range check Cast nodes that are control dependent on this range // check (that is about to be removed) now depend on multiple dominating Hoisted Check Predicates. After the @@ -365,21 +372,21 @@ void PhaseIdealLoop::dominated_by(IfProjNode* prevdom, IfNode* iff, bool flip, b // in the graph. To ensure that these Loads/Casts do not float above any of the dominating checks (even when the // lowest dominating check is later replaced by yet another dominating check), we need to pin them at the lowest // dominating check. - Node* clone = cd->pin_array_access_node(); + Node* clone = out->pin_array_access_node(); if (clone != nullptr) { - clone = _igvn.register_new_node_with_optimizer(clone, cd); - _igvn.replace_node(cd, clone); - cd = clone; + clone = _igvn.register_new_node_with_optimizer(clone, out); + _igvn.replace_node(out, clone); + out = clone; } } - set_early_ctrl(cd, false); - IdealLoopTree* new_loop = get_loop(get_ctrl(cd)); + set_early_ctrl(out, false); + IdealLoopTree* new_loop = get_loop(get_ctrl(out)); if (old_loop != new_loop) { if (!old_loop->_child) { - old_loop->_body.yank(cd); + old_loop->_body.yank(out); } if (!new_loop->_child) { - new_loop->_body.push(cd); + new_loop->_body.push(out); } } --i; From 9d4a4bd2c2a4bd16bbc80b602b15b448c52220f6 Mon Sep 17 00:00:00 2001 From: Matthew Donovan <mdonovan@openjdk.org> Date: Mon, 24 Jun 2024 11:15:33 +0000 Subject: [PATCH 160/471] 8324841: PKCS11 tests still skip execution Reviewed-by: valeriep --- test/jdk/sun/security/pkcs11/PKCS11Test.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/sun/security/pkcs11/PKCS11Test.java b/test/jdk/sun/security/pkcs11/PKCS11Test.java index ffd1c42fd88f4..2810040e376a6 100644 --- a/test/jdk/sun/security/pkcs11/PKCS11Test.java +++ b/test/jdk/sun/security/pkcs11/PKCS11Test.java @@ -791,8 +791,8 @@ private static Path findNSSLibrary(Path path, Path libraryName) throws IOExcepti (tp, attr) -> tp.getFileName().equals(libraryName))) { return files.findAny() - .orElseThrow(() -> new SkippedException( - "NSS library \"" + libraryName + "\" was not found in " + path)); + .orElseThrow(() -> + new RuntimeException("NSS library \"" + libraryName + "\" was not found in " + path)); } } From 2e64d15144be03388104c762816c1ba629da9639 Mon Sep 17 00:00:00 2001 From: Lutz Schmidt <lucy@openjdk.org> Date: Mon, 24 Jun 2024 11:27:18 +0000 Subject: [PATCH 161/471] 8334564: VM startup: fatal error: FLAG_SET_ERGO cannot be used to set an invalid value for NonNMethodCodeHeapSize Reviewed-by: mdoerr, kvn, stuefe --- src/hotspot/share/code/codeCache.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/hotspot/share/code/codeCache.cpp b/src/hotspot/share/code/codeCache.cpp index 20583ce492ddd..36656515942c3 100644 --- a/src/hotspot/share/code/codeCache.cpp +++ b/src/hotspot/share/code/codeCache.cpp @@ -227,6 +227,11 @@ void CodeCache::initialize_heaps() { if (!non_nmethod.set) { non_nmethod.size += compiler_buffer_size; + // Further down, just before FLAG_SET_ERGO(), all segment sizes are + // aligned down to the next lower multiple of min_size. For large page + // sizes, this may result in (non_nmethod.size == 0) which is not acceptable. + // Therefore, force non_nmethod.size to at least min_size. + non_nmethod.size = MAX2(non_nmethod.size, min_size); } if (!profiled.set && !non_profiled.set) { From 5ac2149b7bde947886533bf5996d977bb8ec66f1 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore <coleenp@openjdk.org> Date: Mon, 24 Jun 2024 12:37:53 +0000 Subject: [PATCH 162/471] 8334299: Deprecate LockingMode option, along with LM_LEGACY and LM_MONITOR Reviewed-by: stuefe, dholmes --- src/hotspot/share/runtime/arguments.cpp | 1 + src/hotspot/share/runtime/globals.hpp | 6 +++--- .../jtreg/runtime/CommandLine/VMDeprecatedOptions.java | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 0949e9e2aacac..f428403fa3002 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -505,6 +505,7 @@ static SpecialFlag const special_jvm_flags[] = { { "DontYieldALot", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "PreserveAllAnnotations", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, { "UseNotificationThread", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) }, + { "LockingMode", JDK_Version::jdk(24), JDK_Version::jdk(26), JDK_Version::jdk(27) }, // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp index b8b9c846bb4d1..e4eb8d3e9e90c 100644 --- a/src/hotspot/share/runtime/globals.hpp +++ b/src/hotspot/share/runtime/globals.hpp @@ -1957,9 +1957,9 @@ const int ObjectAlignmentInBytes = 8; "fence. Add cleanliness checks.") \ \ product(int, LockingMode, LM_LIGHTWEIGHT, \ - "Select locking mode: " \ - "0: monitors only (LM_MONITOR), " \ - "1: monitors & legacy stack-locking (LM_LEGACY), " \ + "(Deprecated) Select locking mode: " \ + "0: (Deprecated) monitors only (LM_MONITOR), " \ + "1: (Deprecated) monitors & legacy stack-locking (LM_LEGACY), " \ "2: monitors & new lightweight locking (LM_LIGHTWEIGHT, default)") \ range(0, 2) \ \ diff --git a/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java b/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java index 7904b01495fc7..4e6252ae20510 100644 --- a/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java +++ b/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java @@ -58,6 +58,7 @@ public class VMDeprecatedOptions { // deprecated non-alias flags: {"AllowRedefinitionToAddDeleteMethods", "true"}, {"ZGenerational", "false"}, + {"LockingMode", "1"}, // deprecated alias flags (see also aliased_jvm_flags): {"CreateMinidumpOnCrash", "false"} From e825ccfe6652577e4e828e8e4dfe19be0ea77813 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga <rtoyonag@redhat.com> Date: Mon, 24 Jun 2024 13:33:20 +0000 Subject: [PATCH 163/471] 8332362: Implement os::committed_in_range for MacOS and AIX Reviewed-by: stuefe --- src/hotspot/os/linux/os_linux.cpp | 75 --------------- src/hotspot/os/posix/os_posix.cpp | 91 +++++++++++++++++++ src/hotspot/share/runtime/os.cpp | 7 -- .../runtime/test_committed_virtualmemory.cpp | 43 +++++++++ .../Thread/TestAlwaysPreTouchStacks.java | 39 ++++++-- 5 files changed, 166 insertions(+), 89 deletions(-) diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp index 52866a44b26c6..87150365ed576 100644 --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -3525,81 +3525,6 @@ static address get_stack_commited_bottom(address bottom, size_t size) { return nbot; } -bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) { - int mincore_return_value; - const size_t stripe = 1024; // query this many pages each time - unsigned char vec[stripe + 1]; - // set a guard - vec[stripe] = 'X'; - - const size_t page_sz = os::vm_page_size(); - uintx pages = size / page_sz; - - assert(is_aligned(start, page_sz), "Start address must be page aligned"); - assert(is_aligned(size, page_sz), "Size must be page aligned"); - - committed_start = nullptr; - - int loops = checked_cast<int>((pages + stripe - 1) / stripe); - int committed_pages = 0; - address loop_base = start; - bool found_range = false; - - for (int index = 0; index < loops && !found_range; index ++) { - assert(pages > 0, "Nothing to do"); - uintx pages_to_query = (pages >= stripe) ? stripe : pages; - pages -= pages_to_query; - - // Get stable read - while ((mincore_return_value = mincore(loop_base, pages_to_query * page_sz, vec)) == -1 && errno == EAGAIN); - - // During shutdown, some memory goes away without properly notifying NMT, - // E.g. ConcurrentGCThread/WatcherThread can exit without deleting thread object. - // Bailout and return as not committed for now. - if (mincore_return_value == -1 && errno == ENOMEM) { - return false; - } - - // If mincore is not supported. - if (mincore_return_value == -1 && errno == ENOSYS) { - return false; - } - - assert(vec[stripe] == 'X', "overflow guard"); - assert(mincore_return_value == 0, "Range must be valid"); - // Process this stripe - for (uintx vecIdx = 0; vecIdx < pages_to_query; vecIdx ++) { - if ((vec[vecIdx] & 0x01) == 0) { // not committed - // End of current contiguous region - if (committed_start != nullptr) { - found_range = true; - break; - } - } else { // committed - // Start of region - if (committed_start == nullptr) { - committed_start = loop_base + page_sz * vecIdx; - } - committed_pages ++; - } - } - - loop_base += pages_to_query * page_sz; - } - - if (committed_start != nullptr) { - assert(committed_pages > 0, "Must have committed region"); - assert(committed_pages <= int(size / page_sz), "Can not commit more than it has"); - assert(committed_start >= start && committed_start < start + size, "Out of range"); - committed_size = page_sz * committed_pages; - return true; - } else { - assert(committed_pages == 0, "Should not have committed region"); - return false; - } -} - - // Linux uses a growable mapping for the stack, and if the mapping for // the stack guard pages is not removed when we detach a thread the // stack cannot grow beyond the pages where the stack guard was diff --git a/src/hotspot/os/posix/os_posix.cpp b/src/hotspot/os/posix/os_posix.cpp index 1e7473eea1dc1..26bff6c8bd4e6 100644 --- a/src/hotspot/os/posix/os_posix.cpp +++ b/src/hotspot/os/posix/os_posix.cpp @@ -93,6 +93,9 @@ #define MAP_ANONYMOUS MAP_ANON #endif +/* Input/Output types for mincore(2) */ +typedef LINUX_ONLY(unsigned) char mincore_vec_t; + static jlong initial_time_count = 0; static int clock_tics_per_sec = 100; @@ -146,6 +149,94 @@ void os::check_dump_limit(char* buffer, size_t bufferSize) { VMError::record_coredump_status(buffer, success); } +bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) { + +#ifdef _AIX + committed_start = start; + committed_size = size; + return true; +#else + + int mincore_return_value; + constexpr size_t stripe = 1024; // query this many pages each time + mincore_vec_t vec [stripe + 1]; + + // set a guard + DEBUG_ONLY(vec[stripe] = 'X'); + + size_t page_sz = os::vm_page_size(); + uintx pages = size / page_sz; + + assert(is_aligned(start, page_sz), "Start address must be page aligned"); + assert(is_aligned(size, page_sz), "Size must be page aligned"); + + committed_start = nullptr; + + int loops = checked_cast<int>((pages + stripe - 1) / stripe); + int committed_pages = 0; + address loop_base = start; + bool found_range = false; + + for (int index = 0; index < loops && !found_range; index ++) { + assert(pages > 0, "Nothing to do"); + uintx pages_to_query = (pages >= stripe) ? stripe : pages; + pages -= pages_to_query; + + // Get stable read + int fail_count = 0; + while ((mincore_return_value = mincore(loop_base, pages_to_query * page_sz, vec)) == -1 && errno == EAGAIN){ + if (++fail_count == 1000){ + return false; + } + } + + // During shutdown, some memory goes away without properly notifying NMT, + // E.g. ConcurrentGCThread/WatcherThread can exit without deleting thread object. + // Bailout and return as not committed for now. + if (mincore_return_value == -1 && errno == ENOMEM) { + return false; + } + + // If mincore is not supported. + if (mincore_return_value == -1 && errno == ENOSYS) { + return false; + } + + assert(vec[stripe] == 'X', "overflow guard"); + assert(mincore_return_value == 0, "Range must be valid"); + // Process this stripe + for (uintx vecIdx = 0; vecIdx < pages_to_query; vecIdx ++) { + if ((vec[vecIdx] & 0x01) == 0) { // not committed + // End of current contiguous region + if (committed_start != nullptr) { + found_range = true; + break; + } + } else { // committed + // Start of region + if (committed_start == nullptr) { + committed_start = loop_base + page_sz * vecIdx; + } + committed_pages ++; + } + } + + loop_base += pages_to_query * page_sz; + } + + if (committed_start != nullptr) { + assert(committed_pages > 0, "Must have committed region"); + assert(committed_pages <= int(size / page_sz), "Can not commit more than it has"); + assert(committed_start >= start && committed_start < start + size, "Out of range"); + committed_size = page_sz * committed_pages; + return true; + } else { + assert(committed_pages == 0, "Should not have committed region"); + return false; + } +#endif +} + int os::get_native_stack(address* stack, int frames, int toSkip) { int frame_idx = 0; int num_of_frames; // number of frames captured diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp index 9860251fc3308..97bf33fbaaa7c 100644 --- a/src/hotspot/share/runtime/os.cpp +++ b/src/hotspot/share/runtime/os.cpp @@ -276,13 +276,6 @@ bool os::dll_build_name(char* buffer, size_t size, const char* fname) { return (n != -1); } -#if !defined(LINUX) && !defined(_WINDOWS) -bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) { - committed_start = start; - committed_size = size; - return true; -} -#endif // Helper for dll_locate_lib. // Pass buffer and printbuffer as we already printed the path to buffer diff --git a/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp b/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp index d4959cfa00854..2ffef1e211fdd 100644 --- a/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp +++ b/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp @@ -196,6 +196,42 @@ class CommittedVirtualMemoryTest { os::release_memory(base, size); } + + static void test_committed_in_range(size_t num_pages, size_t pages_to_touch) { + bool result; + size_t committed_size; + address committed_start; + size_t index; + + const size_t page_sz = os::vm_page_size(); + const size_t size = num_pages * page_sz; + + char* base = os::reserve_memory(size, !ExecMem, mtTest); + ASSERT_NE(base, (char*)nullptr); + + result = os::commit_memory(base, size, !ExecMem); + ASSERT_TRUE(result); + + result = os::committed_in_range((address)base, size, committed_start, committed_size); + ASSERT_FALSE(result); + + // Touch pages + for (index = 0; index < pages_to_touch; index ++) { + base[index * page_sz] = 'a'; + } + + result = os::committed_in_range((address)base, size, committed_start, committed_size); + ASSERT_TRUE(result); + ASSERT_EQ(pages_to_touch * page_sz, committed_size); + ASSERT_EQ(committed_start, (address)base); + + os::uncommit_memory(base, size, false); + + result = os::committed_in_range((address)base, size, committed_start, committed_size); + ASSERT_FALSE(result); + + os::release_memory(base, size); + } }; TEST_VM(CommittedVirtualMemoryTracker, test_committed_virtualmemory_region) { @@ -214,3 +250,10 @@ TEST_VM(CommittedVirtualMemoryTracker, test_committed_virtualmemory_region) { } } + +#if !defined(_WINDOWS) && !defined(_AIX) +TEST_VM(CommittedVirtualMemory, test_committed_in_range){ + CommittedVirtualMemoryTest::test_committed_in_range(1024, 1024); + CommittedVirtualMemoryTest::test_committed_in_range(2, 1); +} +#endif diff --git a/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java b/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java index b12eff0cf8454..f16e0ff9da4fd 100644 --- a/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java +++ b/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2022 SAP SE. All rights reserved. - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,14 +32,27 @@ import java.util.regex.Pattern; import java.util.concurrent.CyclicBarrier; +import static jdk.test.lib.Platform.isLinux; +import static jdk.test.lib.Platform.isWindows; + /* - * @test + * @test id=preTouch * @summary Test AlwaysPreTouchThreadStacks * @requires os.family != "aix" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management - * @run driver TestAlwaysPreTouchStacks + * @run driver TestAlwaysPreTouchStacks preTouch + */ + +/* + * @test id=noPreTouch + * @summary Test that only touched committed memory is reported as thread stack usage. + * @requires os.family != "aix" + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver TestAlwaysPreTouchStacks noPreTouch */ public class TestAlwaysPreTouchStacks { @@ -90,12 +103,22 @@ public static void main(String[] args) throws Exception { // should show up with fully - or almost fully - committed thread stacks. } else { + boolean preTouch; + if (args.length == 1 && args[0].equals("noPreTouch")){ + preTouch = false; + } else if (args.length == 1 && args[0].equals("preTouch")){ + preTouch = true; + } else { + throw new RuntimeException("Invalid test input. Must be 'preTouch' or 'noPreTouch'."); + } ArrayList<String> vmArgs = new ArrayList<>(); Collections.addAll(vmArgs, "-XX:+UnlockDiagnosticVMOptions", "-Xmx100M", - "-XX:+AlwaysPreTouchStacks", "-XX:NativeMemoryTracking=summary", "-XX:+PrintNMTStatistics"); + if (preTouch){ + vmArgs.add("-XX:+AlwaysPreTouchStacks"); + } if (System.getProperty("os.name").contains("Linux")) { vmArgs.add("-XX:-UseMadvPopulateWrite"); } @@ -110,8 +133,8 @@ public static void main(String[] args) throws Exception { output.shouldContain("Alive: " + i); } - // We want to see, in the final NMT printout, a committed thread stack size very close to reserved - // stack size. Like this: + // If using -XX:+AlwaysPreTouchStacks, we want to see, in the final NMT printout, + // a committed thread stack size very close to reserved stack size. Like this: // - Thread (reserved=10332400KB, committed=10284360KB) // (thread #10021) // (stack: reserved=10301560KB, committed=10253520KB) <<<< @@ -135,8 +158,10 @@ public static void main(String[] args) throws Exception { // as thread stack. But without pre-touching, the thread stacks would be committed to about 1/5th // of their reserved size. Requiring them to be committed for over 3/4th shows that pretouch is // really working. - if ((double)committed < ((double)reserved * 0.75)) { + if (preTouch && (double)committed < ((double)reserved * 0.75)) { throw new RuntimeException("Expected a higher ratio between stack committed and reserved."); + } else if (!preTouch && (double)committed > ((double)reserved * 0.50)){ + throw new RuntimeException("Expected a lower ratio between stack committed and reserved."); } // Added sanity tests: we expect our test threads to be still alive when NMT prints its final // report, so their stacks should dominate the NMT-reported total stack size. From b2930c5aeedf911ec893734181c1af0573e222f4 Mon Sep 17 00:00:00 2001 From: Adam Sotona <asotona@openjdk.org> Date: Mon, 24 Jun 2024 13:34:29 +0000 Subject: [PATCH 164/471] 8334040: jdk/classfile/CorpusTest.java timed out Reviewed-by: alanb --- test/jdk/jdk/classfile/CorpusTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/test/jdk/jdk/classfile/CorpusTest.java b/test/jdk/jdk/classfile/CorpusTest.java index 21e275a837d84..64db67e6d8eb0 100644 --- a/test/jdk/jdk/classfile/CorpusTest.java +++ b/test/jdk/jdk/classfile/CorpusTest.java @@ -117,7 +117,7 @@ public void writeBody(BufWriter b) { static Path[] corpus() throws IOException, URISyntaxException { splitTableAttributes("testdata/Pattern2.class", "testdata/Pattern2-split.class"); return Stream.of( - Files.walk(JRT.getPath("modules/java.base/java")), + Files.walk(JRT.getPath("modules/java.base/java/util")), Files.walk(JRT.getPath("modules"), 2).filter(p -> p.endsWith("module-info.class")), Files.walk(Paths.get(URI.create(CorpusTest.class.getResource("CorpusTest.class").toString())).getParent())) .flatMap(p -> p) @@ -140,6 +140,7 @@ void testNullAdaptations(Path path) throws Exception { for (Transforms.NoOpTransform m : Transforms.NoOpTransform.values()) { if (m == Transforms.NoOpTransform.ARRAYCOPY || m == Transforms.NoOpTransform.SHARED_3_NO_STACKMAP + || m == Transforms.NoOpTransform.CLASS_REMAPPER || m.name().startsWith("ASM")) continue; @@ -190,12 +191,8 @@ void testNullAdaptations(Path path) throws Exception { .collect(joining("\n")); fail(String.format("Errors in testNullAdapt: %s", msg)); } - } - @ParameterizedTest - @MethodSource("corpus") - void testReadAndTransform(Path path) throws IOException { - byte[] bytes = Files.readAllBytes(path); + // test read and transform var cc = ClassFile.of(); var classModel = cc.parse(bytes); assertEqualsDeep(ClassRecord.ofClassModel(classModel), ClassRecord.ofStreamingElements(classModel), From 55c796946158aab1d019a57b77a33441d7b13065 Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Mon, 24 Jun 2024 14:36:50 +0000 Subject: [PATCH 165/471] 8334765: JFR: Log chunk waste Reviewed-by: mgronlun --- .../internal/consumer/filter/ChunkWriter.java | 29 ++++++++++++++++++- test/jdk/jdk/jfr/jvm/TestWaste.java | 4 +-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/filter/ChunkWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/filter/ChunkWriter.java index 8c22432512a1a..d38a5872adedb 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/filter/ChunkWriter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/filter/ChunkWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,8 @@ import java.nio.file.Path; import java.util.ArrayDeque; import java.util.Deque; +import java.util.Map; +import java.util.HashMap; import java.util.function.Predicate; import jdk.jfr.consumer.RecordedEvent; @@ -56,6 +58,7 @@ public final class ChunkWriter implements Closeable { private final RecordingInput input; private final RecordingOutput output; private final Predicate<RecordedEvent> filter; + private final Map<String, Long> waste = new HashMap<>(); private long chunkStartPosition; private boolean chunkComplete; @@ -178,6 +181,16 @@ public void endChunk(ChunkHeader header) throws IOException { pools = new LongMap<>(); chunkComplete = true; lastCheckpoint = 0; + if (Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.DEBUG)) { + // Log largest waste first + waste.entrySet().stream() + .sorted((a, b) -> b.getValue().compareTo(a.getValue())) + .forEach(entry -> { + String msg = "Total chunk waste by " + entry.getKey() + ": " + entry.getValue() + " bytes."; + Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.DEBUG, msg); + }); + } + waste.clear(); } private void writeMetadataEvent(ChunkHeader header) throws IOException { @@ -216,6 +229,20 @@ private void write(CheckpointEvent event, long delta) throws IOException { } } } + if (Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.DEBUG)) { + for (CheckpointPool pool : event.getPools()) { + for (PoolEntry pe : pool.getEntries()) { + if (!pe.isTouched()) { + String name = pe.getType().getName(); + long amount = pe.getEndPosition() - pe.getStartPosition(); + waste.merge(pe.getType().getName(), amount, Long::sum); + String msg = "Unreferenced constant ID " + pe.getId() + + " of type "+ name + " using " + amount + " bytes."; + Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, msg); + } + } + } + } long endPosition = output.position(); long size = endPosition - startPosition; output.position(startPosition); diff --git a/test/jdk/jdk/jfr/jvm/TestWaste.java b/test/jdk/jdk/jfr/jvm/TestWaste.java index 0cc1010765eb6..afa2dda4ee12c 100644 --- a/test/jdk/jdk/jfr/jvm/TestWaste.java +++ b/test/jdk/jdk/jfr/jvm/TestWaste.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,7 +47,7 @@ * @requires vm.hasJFR * @library /test/lib /test/jdk * @modules jdk.jfr/jdk.jfr.internal.test - * @run main/othervm -XX:TLABSize=2k jdk.jfr.jvm.TestWaste + * @run main/othervm -Xlog:jfr+system+parser=debug -XX:TLABSize=2k jdk.jfr.jvm.TestWaste */ public class TestWaste { static List<Object> list = new LinkedList<>(); From 71a692ab435fdeea4ce8f8db7a55dd735c7c5016 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva <matsaave@openjdk.org> Date: Mon, 24 Jun 2024 18:05:50 +0000 Subject: [PATCH 166/471] 8321033: Avoid casting Array to GrowableArray Reviewed-by: kbarrett, iklam, ccheung --- src/hotspot/share/classfile/moduleEntry.cpp | 33 +++++++++++---------- src/hotspot/share/classfile/moduleEntry.hpp | 23 +++++++++++++- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/hotspot/share/classfile/moduleEntry.cpp b/src/hotspot/share/classfile/moduleEntry.cpp index 78478d282c57d..e7f05bedb292a 100644 --- a/src/hotspot/share/classfile/moduleEntry.cpp +++ b/src/hotspot/share/classfile/moduleEntry.cpp @@ -149,7 +149,7 @@ bool ModuleEntry::can_read(ModuleEntry* m) const { if (!has_reads_list()) { return false; } else { - return _reads->contains(m); + return reads()->contains(m); } } @@ -164,9 +164,10 @@ void ModuleEntry::add_read(ModuleEntry* m) { if (m == nullptr) { set_can_read_all_unnamed(); } else { - if (_reads == nullptr) { + if (reads() == nullptr) { // Lazily create a module's reads list - _reads = new (mtModule) GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, mtModule); + GrowableArray<ModuleEntry*>* new_reads = new (mtModule) GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, mtModule); + set_reads(new_reads); } // Determine, based on this newly established read edge to module m, @@ -174,7 +175,7 @@ void ModuleEntry::add_read(ModuleEntry* m) { set_read_walk_required(m->loader_data()); // Establish readability to module m - _reads->append_if_missing(m); + reads()->append_if_missing(m); } } @@ -208,7 +209,7 @@ void ModuleEntry::set_is_open(bool is_open) { // module will return false. bool ModuleEntry::has_reads_list() const { assert_locked_or_safepoint(Module_lock); - return ((_reads != nullptr) && !_reads->is_empty()); + return ((reads() != nullptr) && !reads()->is_empty()); } // Purge dead module entries out of reads list. @@ -227,12 +228,12 @@ void ModuleEntry::purge_reads() { } // Go backwards because this removes entries that are dead. - int len = _reads->length(); + int len = reads()->length(); for (int idx = len - 1; idx >= 0; idx--) { - ModuleEntry* module_idx = _reads->at(idx); + ModuleEntry* module_idx = reads()->at(idx); ClassLoaderData* cld_idx = module_idx->loader_data(); if (cld_idx->is_unloading()) { - _reads->delete_at(idx); + reads()->delete_at(idx); } else { // Update the need to walk this module's reads based on live modules set_read_walk_required(cld_idx); @@ -246,15 +247,15 @@ void ModuleEntry::module_reads_do(ModuleClosure* f) { assert(f != nullptr, "invariant"); if (has_reads_list()) { - int reads_len = _reads->length(); - for (int i = 0; i < reads_len; ++i) { - f->do_module(_reads->at(i)); + int reads_len = reads()->length(); + for (ModuleEntry* m : *reads()) { + f->do_module(m); } } } void ModuleEntry::delete_reads() { - delete _reads; + delete reads(); _reads = nullptr; } @@ -272,7 +273,8 @@ ModuleEntry::ModuleEntry(Handle module_handle, _has_default_read_edges(false), _must_walk_reads(false), _is_open(is_open), - _is_patched(false) { + _is_patched(false) + DEBUG_ONLY(COMMA _reads_is_archived(false)) { // Initialize fields specific to a ModuleEntry if (_name == nullptr) { @@ -466,7 +468,7 @@ void ModuleEntry::iterate_symbols(MetaspaceClosure* closure) { } void ModuleEntry::init_as_archived_entry() { - Array<ModuleEntry*>* archived_reads = write_growable_array(_reads); + set_archived_reads(write_growable_array(reads())); _loader_data = nullptr; // re-init at runtime _shared_path_index = FileMapInfo::get_module_shared_path_index(_location); @@ -474,7 +476,6 @@ void ModuleEntry::init_as_archived_entry() { _name = ArchiveBuilder::get_buffered_symbol(_name); ArchivePtrMarker::mark_pointer((address*)&_name); } - _reads = (GrowableArray<ModuleEntry*>*)archived_reads; if (_version != nullptr) { _version = ArchiveBuilder::get_buffered_symbol(_version); } @@ -515,7 +516,7 @@ void ModuleEntry::verify_archived_module_entries() { void ModuleEntry::load_from_archive(ClassLoaderData* loader_data) { assert(CDSConfig::is_using_archive(), "runtime only"); set_loader_data(loader_data); - _reads = restore_growable_array((Array<ModuleEntry*>*)_reads); + set_reads(restore_growable_array(archived_reads())); JFR_ONLY(INIT_ID(this);) } diff --git a/src/hotspot/share/classfile/moduleEntry.hpp b/src/hotspot/share/classfile/moduleEntry.hpp index 62a0ba2a0b739..48adc41eddc71 100644 --- a/src/hotspot/share/classfile/moduleEntry.hpp +++ b/src/hotspot/share/classfile/moduleEntry.hpp @@ -68,7 +68,11 @@ class ModuleEntry : public CHeapObj<mtModule> { // for shared classes from this module Symbol* _name; // name of this module ClassLoaderData* _loader_data; - GrowableArray<ModuleEntry*>* _reads; // list of modules that are readable by this module + + union { + GrowableArray<ModuleEntry*>* _reads; // list of modules that are readable by this module + Array<ModuleEntry*>* _archived_reads; // List of readable modules stored in the CDS archive + }; Symbol* _version; // module version number Symbol* _location; // module location CDS_ONLY(int _shared_path_index;) // >=0 if classes in this module are in CDS archive @@ -77,6 +81,7 @@ class ModuleEntry : public CHeapObj<mtModule> { bool _must_walk_reads; // walk module's reads list at GC safepoints to purge out dead modules bool _is_open; // whether the packages in the module are all unqualifiedly exported bool _is_patched; // whether the module is patched via --patch-module + DEBUG_ONLY(bool _reads_is_archived); CDS_JAVA_HEAP_ONLY(int _archived_module_index;) JFR_ONLY(DEFINE_TRACE_ID_FIELD;) @@ -115,6 +120,22 @@ class ModuleEntry : public CHeapObj<mtModule> { bool can_read(ModuleEntry* m) const; bool has_reads_list() const; + GrowableArray<ModuleEntry*>* reads() const { + assert(!_reads_is_archived, "sanity"); + return _reads; + } + void set_reads(GrowableArray<ModuleEntry*>* r) { + _reads = r; + DEBUG_ONLY(_reads_is_archived = false); + } + Array<ModuleEntry*>* archived_reads() const { + assert(_reads_is_archived, "sanity"); + return _archived_reads; + } + void set_archived_reads(Array<ModuleEntry*>* r) { + _archived_reads = r; + DEBUG_ONLY(_reads_is_archived = true); + } void add_read(ModuleEntry* m); void set_read_walk_required(ClassLoaderData* m_loader_data); From 4b153e5e051c01ad8d0c3ff335352918c2970fe6 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva <matsaave@openjdk.org> Date: Mon, 24 Jun 2024 18:19:03 +0000 Subject: [PATCH 167/471] 8306580: Propagate CDS dumping errors instead of directly exiting the VM Reviewed-by: iklam, ccheung --- src/hotspot/share/cds/archiveBuilder.cpp | 7 -- src/hotspot/share/cds/archiveBuilder.hpp | 3 - src/hotspot/share/cds/filemap.cpp | 5 +- src/hotspot/share/cds/metaspaceShared.cpp | 97 +++++++++++-------- src/hotspot/share/cds/metaspaceShared.hpp | 9 +- src/hotspot/share/runtime/threads.cpp | 2 +- .../jtreg/runtime/cds/StaticWritingError.java | 52 ++++++++++ 7 files changed, 119 insertions(+), 56 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/cds/StaticWritingError.java diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp index 72e45a7998ce9..a87a3ff042dec 100644 --- a/src/hotspot/share/cds/archiveBuilder.cpp +++ b/src/hotspot/share/cds/archiveBuilder.cpp @@ -1412,10 +1412,3 @@ void ArchiveBuilder::report_out_of_space(const char* name, size_t needed_bytes) log_error(cds)("Unable to allocate from '%s' region: Please reduce the number of shared classes.", name); MetaspaceShared::unrecoverable_writing_error(); } - - -#ifndef PRODUCT -void ArchiveBuilder::assert_is_vm_thread() { - assert(Thread::current()->is_VM_thread(), "ArchiveBuilder should be used only inside the VMThread"); -} -#endif diff --git a/src/hotspot/share/cds/archiveBuilder.hpp b/src/hotspot/share/cds/archiveBuilder.hpp index ad0302137f55e..c17090ee53d8f 100644 --- a/src/hotspot/share/cds/archiveBuilder.hpp +++ b/src/hotspot/share/cds/archiveBuilder.hpp @@ -343,8 +343,6 @@ class ArchiveBuilder : public StackObj { return to_offset_u4(offset); } - static void assert_is_vm_thread() PRODUCT_RETURN; - public: ArchiveBuilder(); ~ArchiveBuilder(); @@ -432,7 +430,6 @@ class ArchiveBuilder : public StackObj { } static ArchiveBuilder* current() { - assert_is_vm_thread(); assert(_current != nullptr, "ArchiveBuilder must be active"); return _current; } diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index 5b352b54e4b50..96c826fb67e82 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -1406,7 +1406,8 @@ void FileMapInfo::open_for_write() { if (fd < 0) { log_error(cds)("Unable to create shared archive file %s: (%s).", _full_path, os::strerror(errno)); - MetaspaceShared::unrecoverable_writing_error(); + MetaspaceShared::writing_error(); + return; } _fd = fd; _file_open = true; @@ -1659,7 +1660,7 @@ void FileMapInfo::write_bytes(const void* buffer, size_t nbytes) { // If the shared archive is corrupted, close it and remove it. close(); remove(_full_path); - MetaspaceShared::unrecoverable_writing_error("Unable to write to shared archive file."); + MetaspaceShared::writing_error("Unable to write to shared archive file."); } _file_offset += nbytes; } diff --git a/src/hotspot/share/cds/metaspaceShared.cpp b/src/hotspot/share/cds/metaspaceShared.cpp index 30b240b27ca81..a5061fef567e3 100644 --- a/src/hotspot/share/cds/metaspaceShared.cpp +++ b/src/hotspot/share/cds/metaspaceShared.cpp @@ -444,6 +444,8 @@ void MetaspaceShared::rewrite_nofast_bytecodes_and_calculate_fingerprints(Thread class VM_PopulateDumpSharedSpace : public VM_Operation { private: ArchiveHeapInfo _heap_info; + FileMapInfo* _map_info; + StaticArchiveBuilder& _builder; void dump_java_heap_objects(GrowableArray<Klass*>* klasses) NOT_CDS_JAVA_HEAP_RETURN; void dump_shared_symbol_table(GrowableArray<Symbol*>* symbols) { @@ -454,11 +456,14 @@ class VM_PopulateDumpSharedSpace : public VM_Operation { public: - VM_PopulateDumpSharedSpace() : VM_Operation(), _heap_info() {} + VM_PopulateDumpSharedSpace(StaticArchiveBuilder& b) : + VM_Operation(), _heap_info(), _map_info(nullptr), _builder(b) {} bool skip_operation() const { return false; } VMOp_Type type() const { return VMOp_PopulateDumpSharedSpace; } + ArchiveHeapInfo* heap_info() { return &_heap_info; } + FileMapInfo* map_info() const { return _map_info; } void doit(); // outline because gdb sucks bool allow_nested_vm_operations() const { return true; } }; // class VM_PopulateDumpSharedSpace @@ -515,22 +520,21 @@ void VM_PopulateDumpSharedSpace::doit() { MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag); SystemDictionaryShared::check_excluded_classes(); - StaticArchiveBuilder builder; - builder.gather_source_objs(); - builder.reserve_buffer(); + _builder.gather_source_objs(); + _builder.reserve_buffer(); - CppVtables::dumptime_init(&builder); + CppVtables::dumptime_init(&_builder); - builder.sort_metadata_objs(); - builder.dump_rw_metadata(); - builder.dump_ro_metadata(); - builder.relocate_metaspaceobj_embedded_pointers(); + _builder.sort_metadata_objs(); + _builder.dump_rw_metadata(); + _builder.dump_ro_metadata(); + _builder.relocate_metaspaceobj_embedded_pointers(); - dump_java_heap_objects(builder.klasses()); - dump_shared_symbol_table(builder.symbols()); + dump_java_heap_objects(_builder.klasses()); + dump_shared_symbol_table(_builder.symbols()); log_info(cds)("Make classes shareable"); - builder.make_klasses_shareable(); + _builder.make_klasses_shareable(); char* serialized_data = dump_read_only_tables(); @@ -540,28 +544,13 @@ void VM_PopulateDumpSharedSpace::doit() { // We don't want to write these addresses into the archive. CppVtables::zero_archived_vtables(); - // relocate the data so that it can be mapped to MetaspaceShared::requested_base_address() - // without runtime relocation. - builder.relocate_to_requested(); - // Write the archive file const char* static_archive = CDSConfig::static_archive_path(); assert(static_archive != nullptr, "SharedArchiveFile not set?"); - FileMapInfo* mapinfo = new FileMapInfo(static_archive, true); - mapinfo->populate_header(MetaspaceShared::core_region_alignment()); - mapinfo->set_serialized_data(serialized_data); - mapinfo->set_cloned_vtables(CppVtables::vtables_serialized_base()); - mapinfo->open_for_write(); - builder.write_archive(mapinfo, &_heap_info); - - if (PrintSystemDictionaryAtExit) { - SystemDictionary::print(); - } - - if (AllowArchivingWithJavaAgent) { - log_warning(cds)("This archive was created with AllowArchivingWithJavaAgent. It should be used " - "for testing purposes only and should not be used in a production environment"); - } + _map_info = new FileMapInfo(static_archive, true); + _map_info->populate_header(MetaspaceShared::core_region_alignment()); + _map_info->set_serialized_data(serialized_data); + _map_info->set_cloned_vtables(CppVtables::vtables_serialized_base()); } class CollectCLDClosure : public CLDClosure { @@ -663,21 +652,19 @@ void MetaspaceShared::prepare_for_dumping() { // Preload classes from a list, populate the shared spaces and dump to a // file. -void MetaspaceShared::preload_and_dump() { - EXCEPTION_MARK; +void MetaspaceShared::preload_and_dump(TRAPS) { ResourceMark rm(THREAD); - preload_and_dump_impl(THREAD); + StaticArchiveBuilder builder; + preload_and_dump_impl(builder, THREAD); if (HAS_PENDING_EXCEPTION) { if (PENDING_EXCEPTION->is_a(vmClasses::OutOfMemoryError_klass())) { log_error(cds)("Out of memory. Please run with a larger Java heap, current MaxHeapSize = " SIZE_FORMAT "M", MaxHeapSize/M); - CLEAR_PENDING_EXCEPTION; - MetaspaceShared::unrecoverable_writing_error(); + MetaspaceShared::writing_error(); } else { log_error(cds)("%s: %s", PENDING_EXCEPTION->klass()->external_name(), java_lang_String::as_utf8_string(java_lang_Throwable::message(PENDING_EXCEPTION))); - CLEAR_PENDING_EXCEPTION; - MetaspaceShared::unrecoverable_writing_error("VM exits due to exception, use -Xlog:cds,exceptions=trace for detail"); + MetaspaceShared::writing_error("Unexpected exception, use -Xlog:cds,exceptions=trace for detail"); } } } @@ -768,7 +755,7 @@ void MetaspaceShared::preload_classes(TRAPS) { log_info(cds)("Loading classes to share: done."); } -void MetaspaceShared::preload_and_dump_impl(TRAPS) { +void MetaspaceShared::preload_and_dump_impl(StaticArchiveBuilder& builder, TRAPS) { preload_classes(CHECK); if (SharedArchiveConfigFile) { @@ -805,8 +792,30 @@ void MetaspaceShared::preload_and_dump_impl(TRAPS) { } #endif - VM_PopulateDumpSharedSpace op; + VM_PopulateDumpSharedSpace op(builder); VMThread::execute(&op); + + if (!write_static_archive(&builder, op.map_info(), op.heap_info())) { + THROW_MSG(vmSymbols::java_io_IOException(), "Encountered error while dumping"); + } +} + +bool MetaspaceShared::write_static_archive(ArchiveBuilder* builder, FileMapInfo* map_info, ArchiveHeapInfo* heap_info) { + // relocate the data so that it can be mapped to MetaspaceShared::requested_base_address() + // without runtime relocation. + builder->relocate_to_requested(); + + map_info->open_for_write(); + if (!map_info->is_open()) { + return false; + } + builder->write_archive(map_info, heap_info); + + if (AllowArchivingWithJavaAgent) { + log_warning(cds)("This archive was created with AllowArchivingWithJavaAgent. It should be used " + "for testing purposes only and should not be used in a production environment"); + } + return true; } // Returns true if the class's status has changed. @@ -916,11 +925,17 @@ void MetaspaceShared::unrecoverable_loading_error(const char* message) { // This function is called when the JVM is unable to write the specified CDS archive due to an // unrecoverable error. void MetaspaceShared::unrecoverable_writing_error(const char* message) { + writing_error(message); + vm_direct_exit(1); +} + +// This function is called when the JVM is unable to write the specified CDS archive due to a +// an error. The error will be propagated +void MetaspaceShared::writing_error(const char* message) { log_error(cds)("An error has occurred while writing the shared archive file."); if (message != nullptr) { log_error(cds)("%s", message); } - vm_direct_exit(1); } void MetaspaceShared::initialize_runtime_shared_and_meta_spaces() { diff --git a/src/hotspot/share/cds/metaspaceShared.hpp b/src/hotspot/share/cds/metaspaceShared.hpp index 1fb6ae8814210..f26af21676a83 100644 --- a/src/hotspot/share/cds/metaspaceShared.hpp +++ b/src/hotspot/share/cds/metaspaceShared.hpp @@ -31,9 +31,12 @@ #include "oops/oop.hpp" #include "utilities/macros.hpp" +class ArchiveBuilder; +class ArchiveHeapInfo; class FileMapInfo; class outputStream; class SerializeClosure; +class StaticArchiveBuilder; template<class E> class GrowableArray; @@ -66,13 +69,13 @@ class MetaspaceShared : AllStatic { }; static void prepare_for_dumping() NOT_CDS_RETURN; - static void preload_and_dump() NOT_CDS_RETURN; + static void preload_and_dump(TRAPS) NOT_CDS_RETURN; #ifdef _LP64 static void adjust_heap_sizes_for_dumping() NOT_CDS_JAVA_HEAP_RETURN; #endif private: - static void preload_and_dump_impl(TRAPS) NOT_CDS_RETURN; + static void preload_and_dump_impl(StaticArchiveBuilder& builder, TRAPS) NOT_CDS_RETURN; static void preload_classes(TRAPS) NOT_CDS_RETURN; public: @@ -105,6 +108,7 @@ class MetaspaceShared : AllStatic { static void unrecoverable_loading_error(const char* message = nullptr); static void unrecoverable_writing_error(const char* message = nullptr); + static void writing_error(const char* message = nullptr); static void serialize(SerializeClosure* sc) NOT_CDS_RETURN; @@ -166,6 +170,7 @@ class MetaspaceShared : AllStatic { private: static void read_extra_data(JavaThread* current, const char* filename) NOT_CDS_RETURN; + static bool write_static_archive(ArchiveBuilder* builder, FileMapInfo* map_info, ArchiveHeapInfo* heap_info); static FileMapInfo* open_static_archive(); static FileMapInfo* open_dynamic_archive(); // use_requested_addr: If true (default), attempt to map at the address the diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index 9800f85dfe44a..ea18ff3a00686 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -818,7 +818,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { #endif if (CDSConfig::is_dumping_static_archive()) { - MetaspaceShared::preload_and_dump(); + MetaspaceShared::preload_and_dump(CHECK_JNI_ERR); } if (log_is_enabled(Info, perf, class, link)) { diff --git a/test/hotspot/jtreg/runtime/cds/StaticWritingError.java b/test/hotspot/jtreg/runtime/cds/StaticWritingError.java new file mode 100644 index 0000000000000..1bb3e7e721d94 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/StaticWritingError.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8306580 + * @summary Test the writing error when archive file cannot be created + * @requires vm.cds + * @library /test/lib + * @run driver StaticWritingError + */ + +import java.io.File; +import jdk.test.lib.cds.CDSOptions; +import jdk.test.lib.cds.CDSTestUtils; +import jdk.test.lib.process.OutputAnalyzer; + +public class StaticWritingError { + public static void main(String[] args) throws Exception { + String directoryName = "nosuchdir"; + String archiveName = "staticWritingError.jsa"; + + // Perform static dump and attempt to write archive in unwritable directory + CDSOptions opts = (new CDSOptions()) + .addPrefix("-Xlog:cds") + .setArchiveName(directoryName + File.separator + archiveName); + OutputAnalyzer out = CDSTestUtils.createArchive(opts); + out.shouldHaveExitValue(1); + out.shouldContain("Unable to create shared archive file"); + out.shouldContain("Encountered error while dumping"); + } +} From 3a26bbcebc2f7d11b172f2b16192a3adefeb8111 Mon Sep 17 00:00:00 2001 From: Alisen Chung <achung@openjdk.org> Date: Tue, 25 Jun 2024 02:19:57 +0000 Subject: [PATCH 168/471] 8185429: [macos] After a modal dialog is closed, no window becomes active Reviewed-by: tr, dnguyen, serb --- .../macosx/classes/sun/lwawt/macosx/CPlatformWindow.java | 8 +++++++- test/jdk/ProblemList.txt | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java index 1be76db3acdf2..1bf77f5ee69b1 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,6 +64,7 @@ import sun.awt.AWTAccessor.ComponentAccessor; import sun.awt.AWTAccessor.WindowAccessor; import sun.java2d.SurfaceData; +import sun.lwawt.LWKeyboardFocusManagerPeer; import sun.lwawt.LWLightweightFramePeer; import sun.lwawt.LWToolkit; import sun.lwawt.LWWindowPeer; @@ -1056,6 +1057,11 @@ public void setModalBlocked(boolean blocked) { } execute(ptr -> nativeSetEnabled(ptr, !blocked)); + + Window currFocus = LWKeyboardFocusManagerPeer.getInstance().getCurrentFocusedWindow(); + if (!blocked && (target == currFocus)) { + requestWindowFocus(); + } checkBlockingAndOrder(); } diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 546f95b0054b1..b3fb31dc789da 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -781,7 +781,6 @@ java/awt/Modal/PrintDialogsTest/PrintDialogsTest.java 8068378 generic-all java/awt/event/MouseEvent/AltGraphModifierTest/AltGraphModifierTest.java 8162380 generic-all java/awt/image/VolatileImage/VolatileImageConfigurationTest.java 8171069 macosx-all,linux-all java/awt/Modal/InvisibleParentTest/InvisibleParentTest.java 8172245 linux-all -java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.java 8185429 macosx-all java/awt/Frame/FrameStateTest/FrameStateTest.java 8203920 macosx-all,linux-all java/awt/print/PrinterJob/ScaledText/ScaledText.java 8231226 macosx-all java/awt/font/TextLayout/TestJustification.java 8250791 macosx-all From e527e1c32fcc7b2560cec540bcde930075ac284a Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan <psadhukhan@openjdk.org> Date: Tue, 25 Jun 2024 03:26:18 +0000 Subject: [PATCH 169/471] 8334580: Deprecate no-arg constructor BasicSliderUI() for removal Reviewed-by: kcr, aivanov, iris, prr --- .../share/classes/javax/swing/plaf/basic/BasicSliderUI.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java index 7b94bedea0dcd..ad5cb9c9ab9d8 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java @@ -150,7 +150,10 @@ public class BasicSliderUI extends SliderUI{ /** * Constructs a {@code BasicSliderUI}. + * @deprecated This constructor was exposed erroneously and will be removed in a future release. + * Use {@link #BasicSliderUI(JSlider)} instead. */ + @Deprecated(since = "23", forRemoval = true) public BasicSliderUI() {} /** From 974dca80df71c5cbe492d1e8ca5cee76bcc79358 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Tue, 25 Jun 2024 05:06:33 +0000 Subject: [PATCH 170/471] 8334223: Make Arena MEMFLAGs immutable Reviewed-by: jsjolen, azafari, gziemski --- src/hotspot/share/compiler/compilerThread.cpp | 7 ++----- src/hotspot/share/memory/arena.cpp | 16 ++++++---------- src/hotspot/share/memory/arena.hpp | 13 +++++++------ src/hotspot/share/memory/resourceArea.cpp | 13 +------------ src/hotspot/share/memory/resourceArea.hpp | 8 ++------ src/hotspot/share/prims/jni.cpp | 6 +++--- src/hotspot/share/runtime/handles.hpp | 4 ++-- src/hotspot/share/runtime/javaThread.cpp | 16 +++++++--------- src/hotspot/share/runtime/javaThread.hpp | 8 +++++--- src/hotspot/share/runtime/javaThread.inline.hpp | 2 +- src/hotspot/share/runtime/thread.cpp | 6 +++--- src/hotspot/share/runtime/thread.hpp | 4 ++-- 12 files changed, 41 insertions(+), 62 deletions(-) diff --git a/src/hotspot/share/compiler/compilerThread.cpp b/src/hotspot/share/compiler/compilerThread.cpp index 47e3f5a6f499b..e212200a47c65 100644 --- a/src/hotspot/share/compiler/compilerThread.cpp +++ b/src/hotspot/share/compiler/compilerThread.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,7 @@ // Create a CompilerThread CompilerThread::CompilerThread(CompileQueue* queue, CompilerCounters* counters) - : JavaThread(&CompilerThread::thread_entry) { + : JavaThread(&CompilerThread::thread_entry, 0, mtCompiler) { _env = nullptr; _log = nullptr; _task = nullptr; @@ -43,9 +43,6 @@ CompilerThread::CompilerThread(CompileQueue* queue, _compiler = nullptr; _arena_stat = CompilationMemoryStatistic::enabled() ? new ArenaStatCounter : nullptr; - // Compiler uses resource area for compilation, let's bias it to mtCompiler - resource_area()->bias_to(mtCompiler); - #ifndef PRODUCT _ideal_graph_printer = nullptr; #endif diff --git a/src/hotspot/share/memory/arena.cpp b/src/hotspot/share/memory/arena.cpp index 6faffe0d20b9c..0399c6922e38d 100644 --- a/src/hotspot/share/memory/arena.cpp +++ b/src/hotspot/share/memory/arena.cpp @@ -209,7 +209,12 @@ void Chunk::next_chop(Chunk* k) { k->_next = nullptr; } -Arena::Arena(MEMFLAGS flag, Tag tag, size_t init_size) : _flags(flag), _tag(tag), _size_in_bytes(0) { +Arena::Arena(MEMFLAGS flag, Tag tag, size_t init_size) : + _flags(flag), _tag(tag), + _size_in_bytes(0), + _first(nullptr), _chunk(nullptr), + _hwm(nullptr), _max(nullptr) +{ init_size = ARENA_ALIGN(init_size); _chunk = ChunkPool::allocate_chunk(init_size, AllocFailStrategy::EXIT_OOM); _first = _chunk; @@ -219,15 +224,6 @@ Arena::Arena(MEMFLAGS flag, Tag tag, size_t init_size) : _flags(flag), _tag(tag) set_size_in_bytes(init_size); } -Arena::Arena(MEMFLAGS flag, Tag tag) : _flags(flag), _tag(tag), _size_in_bytes(0) { - _chunk = ChunkPool::allocate_chunk(Chunk::init_size, AllocFailStrategy::EXIT_OOM); - _first = _chunk; - _hwm = _chunk->bottom(); // Save the cached hwm, max - _max = _chunk->top(); - MemTracker::record_new_arena(flag); - set_size_in_bytes(Chunk::init_size); -} - Arena::~Arena() { destruct_contents(); MemTracker::record_arena_free(_flags); diff --git a/src/hotspot/share/memory/arena.hpp b/src/hotspot/share/memory/arena.hpp index ed441eca85182..1ca8a78782541 100644 --- a/src/hotspot/share/memory/arena.hpp +++ b/src/hotspot/share/memory/arena.hpp @@ -94,21 +94,23 @@ class Arena : public CHeapObjBase { tag_node // C2 Node arena }; +private: + const MEMFLAGS _flags; // Memory tracking flags + const Tag _tag; + size_t _size_in_bytes; // Size of arena (used for native memory tracking) + protected: friend class HandleMark; friend class NoHandleMark; friend class VMStructs; - MEMFLAGS _flags; // Memory tracking flags - const Tag _tag; - uint32_t _init_size; Chunk* _first; // First chunk Chunk* _chunk; // current chunk char* _hwm; // High water mark char* _max; // and max in current chunk + // Get a new Chunk of at least size x void* grow(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM); - size_t _size_in_bytes; // Size of arena (used for native memory tracking) void* internal_amalloc(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) { assert(is_aligned(x, BytesPerWord), "misaligned size"); @@ -124,8 +126,7 @@ class Arena : public CHeapObjBase { public: // Start the chunk_pool cleaner task static void start_chunk_pool_cleaner_task(); - Arena(MEMFLAGS memflag, Tag tag = Tag::tag_other); - Arena(MEMFLAGS memflag, Tag tag, size_t init_size); + Arena(MEMFLAGS memflag, Tag tag = Tag::tag_other, size_t init_size = Chunk::init_size); ~Arena(); void destruct_contents(); char* hwm() const { return _hwm; } diff --git a/src/hotspot/share/memory/resourceArea.cpp b/src/hotspot/share/memory/resourceArea.cpp index 409460709e464..d5a7513ba19d2 100644 --- a/src/hotspot/share/memory/resourceArea.cpp +++ b/src/hotspot/share/memory/resourceArea.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,17 +30,6 @@ #include "runtime/javaThread.hpp" #include "utilities/vmError.hpp" -void ResourceArea::bias_to(MEMFLAGS new_flags) { - if (new_flags != _flags) { - size_t size = size_in_bytes(); - MemTracker::record_arena_size_change(-ssize_t(size), _flags); - MemTracker::record_arena_free(_flags); - MemTracker::record_new_arena(new_flags); - MemTracker::record_arena_size_change(ssize_t(size), new_flags); - _flags = new_flags; - } -} - #ifdef ASSERT ResourceMark::ResourceMark(ResourceArea* area, Thread* thread) : diff --git a/src/hotspot/share/memory/resourceArea.hpp b/src/hotspot/share/memory/resourceArea.hpp index ba294e33effbb..5fd376068c5b3 100644 --- a/src/hotspot/share/memory/resourceArea.hpp +++ b/src/hotspot/share/memory/resourceArea.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,10 +60,6 @@ class ResourceArea: public Arena { char* allocate_bytes(size_t size, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM); - // Bias this resource area to specific memory type - // (by default, ResourceArea is tagged as mtThread, per-thread general purpose storage) - void bias_to(MEMFLAGS flags); - DEBUG_ONLY(int nesting() const { return _nesting; }) // Capture the state of a ResourceArea needed by a ResourceMark for @@ -81,7 +77,7 @@ class ResourceArea: public Arena { _chunk(area->_chunk), _hwm(area->_hwm), _max(area->_max), - _size_in_bytes(area->_size_in_bytes) + _size_in_bytes(area->size_in_bytes()) DEBUG_ONLY(COMMA _nesting(area->_nesting)) {} }; diff --git a/src/hotspot/share/prims/jni.cpp b/src/hotspot/share/prims/jni.cpp index b6a4443a8c763..ae040d661380e 100644 --- a/src/hotspot/share/prims/jni.cpp +++ b/src/hotspot/share/prims/jni.cpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012 Red Hat, Inc. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024 Red Hat, Inc. * Copyright (c) 2021, Azul Systems, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -3775,7 +3775,7 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae // Create a thread and mark it as attaching so it will be skipped by the // ThreadsListEnumerator - see CR 6404306 - JavaThread* thread = new JavaThread(true); + JavaThread* thread = JavaThread::create_attaching_thread(); // Set correct safepoint info. The thread is going to call into Java when // initializing the Java level thread object. Hence, the correct state must diff --git a/src/hotspot/share/runtime/handles.hpp b/src/hotspot/share/runtime/handles.hpp index 7865d32bef20d..39e59cc1ef0ef 100644 --- a/src/hotspot/share/runtime/handles.hpp +++ b/src/hotspot/share/runtime/handles.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -187,7 +187,7 @@ class HandleArea: public Arena { HandleArea* _prev; // link to outer (older) area public: // Constructor - HandleArea(HandleArea* prev) : Arena(mtThread, Tag::tag_ha, Chunk::tiny_size) { + HandleArea(MEMFLAGS flags, HandleArea* prev) : Arena(flags, Tag::tag_ha, Chunk::tiny_size) { debug_only(_handle_mark_nesting = 0); debug_only(_no_handle_mark_nesting = 0); _prev = prev; diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp index 70bb47c213ca5..a3eef07ba0ac9 100644 --- a/src/hotspot/share/runtime/javaThread.cpp +++ b/src/hotspot/share/runtime/javaThread.cpp @@ -409,9 +409,9 @@ void JavaThread::check_for_valid_safepoint_state() { // A JavaThread is a normal Java thread -JavaThread::JavaThread() : +JavaThread::JavaThread(MEMFLAGS flags) : + Thread(flags), // Initialize fields - _on_thread_list(false), DEBUG_ONLY(_java_call_counter(0) COMMA) _entry_point(nullptr), @@ -525,13 +525,12 @@ JavaThread::JavaThread() : assert(deferred_card_mark().is_empty(), "Default MemRegion ctor"); } -JavaThread::JavaThread(bool is_attaching_via_jni) : JavaThread() { - if (is_attaching_via_jni) { - _jni_attach_state = _attaching_via_jni; - } +JavaThread* JavaThread::create_attaching_thread() { + JavaThread* jt = new JavaThread(); + jt->_jni_attach_state = _attaching_via_jni; + return jt; } - // interrupt support void JavaThread::interrupt() { @@ -634,8 +633,7 @@ void JavaThread::block_if_vm_exited() { } } -JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : JavaThread() { - _jni_attach_state = _not_attaching_via_jni; +JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz, MEMFLAGS flags) : JavaThread(flags) { set_entry_point(entry_point); // Create the native thread itself. // %note runtime_23 diff --git a/src/hotspot/share/runtime/javaThread.hpp b/src/hotspot/share/runtime/javaThread.hpp index 2541aaded00a3..755a8268864dd 100644 --- a/src/hotspot/share/runtime/javaThread.hpp +++ b/src/hotspot/share/runtime/javaThread.hpp @@ -478,11 +478,13 @@ class JavaThread: public Thread { public: // Constructor - JavaThread(); // delegating constructor - JavaThread(bool is_attaching_via_jni); // for main thread and JNI attached threads - JavaThread(ThreadFunction entry_point, size_t stack_size = 0); + JavaThread(MEMFLAGS flags = mtThread); // delegating constructor + JavaThread(ThreadFunction entry_point, size_t stack_size = 0, MEMFLAGS flags = mtThread); ~JavaThread(); + // Factory method to create a new JavaThread whose attach state is "is attaching" + static JavaThread* create_attaching_thread(); + #ifdef ASSERT // verify this JavaThread hasn't be published in the Threads::list yet void verify_not_published(); diff --git a/src/hotspot/share/runtime/javaThread.inline.hpp b/src/hotspot/share/runtime/javaThread.inline.hpp index 7b1ad7e17e1cd..a51a30ae577c1 100644 --- a/src/hotspot/share/runtime/javaThread.inline.hpp +++ b/src/hotspot/share/runtime/javaThread.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021, Azul Systems, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp index d98fcf6f664a2..e72077adabf3b 100644 --- a/src/hotspot/share/runtime/thread.cpp +++ b/src/hotspot/share/runtime/thread.cpp @@ -64,7 +64,7 @@ THREAD_LOCAL Thread* Thread::_thr_current = nullptr; DEBUG_ONLY(Thread* Thread::_starting_thread = nullptr;) -Thread::Thread() { +Thread::Thread(MEMFLAGS flags) { DEBUG_ONLY(_run_state = PRE_CALL_RUN;) @@ -78,9 +78,9 @@ Thread::Thread() { // allocated data structures set_osthread(nullptr); - set_resource_area(new (mtThread)ResourceArea()); + set_resource_area(new (flags) ResourceArea(flags)); DEBUG_ONLY(_current_resource_mark = nullptr;) - set_handle_area(new (mtThread) HandleArea(nullptr)); + set_handle_area(new (flags) HandleArea(flags, nullptr)); set_metadata_handles(new (mtClass) GrowableArray<Metadata*>(30, mtClass)); set_last_handle_mark(nullptr); DEBUG_ONLY(_missed_ic_stub_refill_verifier = nullptr); diff --git a/src/hotspot/share/runtime/thread.hpp b/src/hotspot/share/runtime/thread.hpp index 44c845986f375..e9fee4d113aaa 100644 --- a/src/hotspot/share/runtime/thread.hpp +++ b/src/hotspot/share/runtime/thread.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021, Azul Systems, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -277,7 +277,7 @@ class Thread: public ThreadShadow { // is waiting to lock public: // Constructor - Thread(); + Thread(MEMFLAGS flag = mtThread); virtual ~Thread() = 0; // Thread is abstract. // Manage Thread::current() From c30e040342c69a213bdff321fdcb0d27ff740489 Mon Sep 17 00:00:00 2001 From: Neethu Prasad <neethp@amazon.com> Date: Tue, 25 Jun 2024 07:08:07 +0000 Subject: [PATCH 171/471] 8331911: Reconsider locking for recently disarmed nmethods Reviewed-by: shade, eosterlund --- src/hotspot/share/code/nmethod.cpp | 6 ++---- src/hotspot/share/gc/shared/barrierSetNMethod.cpp | 9 +++++++++ src/hotspot/share/gc/x/xBarrierSetNMethod.cpp | 10 ++++++++-- src/hotspot/share/gc/z/zBarrierSetNMethod.cpp | 11 +++++++++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index 2f4999dc4e366..ea56ee6129812 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -844,10 +844,8 @@ void nmethod::run_nmethod_entry_barrier() { // By calling this nmethod entry barrier, it plays along and acts // like any other nmethod found on the stack of a thread (fewer surprises). nmethod* nm = this; - if (bs_nm->is_armed(nm)) { - bool alive = bs_nm->nmethod_entry_barrier(nm); - assert(alive, "should be alive"); - } + bool alive = bs_nm->nmethod_entry_barrier(nm); + assert(alive, "should be alive"); } } diff --git a/src/hotspot/share/gc/shared/barrierSetNMethod.cpp b/src/hotspot/share/gc/shared/barrierSetNMethod.cpp index 548e6b671eff0..79e3f47ed57bd 100644 --- a/src/hotspot/share/gc/shared/barrierSetNMethod.cpp +++ b/src/hotspot/share/gc/shared/barrierSetNMethod.cpp @@ -100,6 +100,12 @@ bool BarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) { virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); } }; + if (!is_armed(nm)) { + // Some other thread got here first and healed the oops + // and disarmed the nmethod. No need to continue. + return true; + } + // If the nmethod is the only thing pointing to the oops, and we are using a // SATB GC, then it is important that this code marks them live. // Also, with concurrent GC, it is possible that frames in continuation stack @@ -172,6 +178,9 @@ int BarrierSetNMethod::nmethod_stub_entry_barrier(address* return_address_ptr) { nmethod* nm = cb->as_nmethod(); BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod(); + // Check for disarmed method here to avoid going into DeoptimizeNMethodBarriersALot code + // too often. nmethod_entry_barrier checks for disarmed status itself, + // but we have no visibility into whether the barrier acted or not. if (!bs_nm->is_armed(nm)) { return 0; } diff --git a/src/hotspot/share/gc/x/xBarrierSetNMethod.cpp b/src/hotspot/share/gc/x/xBarrierSetNMethod.cpp index 002d6bc00c5d7..3dc76463028b8 100644 --- a/src/hotspot/share/gc/x/xBarrierSetNMethod.cpp +++ b/src/hotspot/share/gc/x/xBarrierSetNMethod.cpp @@ -32,12 +32,18 @@ #include "runtime/threadWXSetters.inline.hpp" bool XBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) { + if (!is_armed(nm)) { + // Some other thread got here first and healed the oops + // and disarmed the nmethod. No need to continue. + return true; + } + XLocker<XReentrantLock> locker(XNMethod::lock_for_nmethod(nm)); log_trace(nmethod, barrier)("Entered critical zone for %p", nm); if (!is_armed(nm)) { - // Some other thread got here first and healed the oops - // and disarmed the nmethod. + // Some other thread managed to complete while we were + // waiting for lock. No need to continue. return true; } diff --git a/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp b/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp index 2c58b0155648a..b8ecc3eddd3cd 100644 --- a/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp +++ b/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp @@ -37,6 +37,13 @@ #include "runtime/threadWXSetters.inline.hpp" bool ZBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) { + if (!is_armed(nm)) { + log_develop_trace(gc, nmethod)("nmethod: " PTR_FORMAT " visited by entry (disarmed before lock)", p2i(nm)); + // Some other thread got here first and healed the oops + // and disarmed the nmethod. No need to continue. + return true; + } + ZLocker<ZReentrantLock> locker(ZNMethod::lock_for_nmethod(nm)); log_trace(nmethod, barrier)("Entered critical zone for %p", nm); @@ -44,8 +51,8 @@ bool ZBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) { if (!is_armed(nm)) { log_develop_trace(gc, nmethod)("nmethod: " PTR_FORMAT " visited by entry (disarmed)", p2i(nm)); - // Some other thread got here first and healed the oops - // and disarmed the nmethod. + // Some other thread managed to complete while we were + // waiting for lock. No need to continue. return true; } From baafa662a2f0706e4275a4fe0459ee6759369858 Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Tue, 25 Jun 2024 09:12:09 +0000 Subject: [PATCH 172/471] 8334287: Man page update for jstatd deprecation Reviewed-by: alanb --- src/jdk.jstatd/share/man/jstatd.1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/jdk.jstatd/share/man/jstatd.1 b/src/jdk.jstatd/share/man/jstatd.1 index 4bd90104624b1..f5d2f347b4530 100644 --- a/src/jdk.jstatd/share/man/jstatd.1 +++ b/src/jdk.jstatd/share/man/jstatd.1 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. +.\" Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. .\" .\" This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,9 @@ jstatd - monitor the creation and termination of instrumented Java HotSpot VMs .SH SYNOPSIS .PP -\f[B]Note:\f[R] This command is experimental and unsupported. +\f[B]WARNING:\f[R] This command is experimental, unsupported, and +deprecated. +It will be removed in a future release. .PP \f[V]jstatd\f[R] [\f[I]options\f[R]] .TP From 75a2afacc8f5fdec53350b1cb66076cdfeae12f0 Mon Sep 17 00:00:00 2001 From: Sean Mullan <mullan@openjdk.org> Date: Tue, 25 Jun 2024 12:21:46 +0000 Subject: [PATCH 173/471] 8248981: Specify list of standard message digest and mgf algorithms for RSASSA-PSS signature Reviewed-by: valeriep --- .../java/security/spec/ECGenParameterSpec.java | 6 +++--- .../java/security/spec/NamedParameterSpec.java | 14 +++++++------- .../java/security/spec/PSSParameterSpec.java | 17 ++++++++++++++--- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/java.base/share/classes/java/security/spec/ECGenParameterSpec.java b/src/java.base/share/classes/java/security/spec/ECGenParameterSpec.java index 522c7ff73310e..4d506726c9f66 100644 --- a/src/java.base/share/classes/java/security/spec/ECGenParameterSpec.java +++ b/src/java.base/share/classes/java/security/spec/ECGenParameterSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,9 +45,9 @@ public class ECGenParameterSpec extends NamedParameterSpec { * of the provider whose implementation will be used. * * @param stdName the standard name of the to-be-generated EC - * domain parameters. See the ParameterSpec Names section in the + * domain parameters. See the ECGenParameterSpec section in the * <a href= - * "{@docRoot}/../specs/security/standard-names.html#parameterspec-names"> + * "{@docRoot}/../specs/security/standard-names.html#ecgenparameterspec"> * Java Security Standard Algorithm Names Specification</a> for * information about standard names. * @throws NullPointerException if {@code stdName} is null. diff --git a/src/java.base/share/classes/java/security/spec/NamedParameterSpec.java b/src/java.base/share/classes/java/security/spec/NamedParameterSpec.java index ab716d54c3017..296d353449bbc 100644 --- a/src/java.base/share/classes/java/security/spec/NamedParameterSpec.java +++ b/src/java.base/share/classes/java/security/spec/NamedParameterSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,10 +30,10 @@ * This class is used to specify any algorithm parameters that are determined * by a standard name. This class also holds constants for standard parameter * set names. The names of these constants exactly match the corresponding - * parameter set name. For example, NamedParameterSpec.X25519 represents the - * parameter set identified by the string "X25519". These strings are defined - * in the <a href= - * "{@docRoot}/../specs/security/standard-names.html#parameterspec-names"> + * parameter set name. For example, {@code NamedParameterSpec.X25519} + * represents the parameter set identified by the string "X25519". These + * strings are defined in the <a href= + * "{@docRoot}/../specs/security/standard-names.html#namedparameterspec"> * Java Security Standard Algorithm Names Specification</a>. * * @since 11 @@ -77,9 +77,9 @@ public class NamedParameterSpec implements AlgorithmParameterSpec { * of the provider whose implementation will be used. * * @param stdName the standard name of the algorithm parameters. See the - * ParameterSpec Names section in the + * NamedParameterSpec section in the * <a href= - * "{@docRoot}/../specs/security/standard-names.html#parameterspec-names"> + * "{@docRoot}/../specs/security/standard-names.html#namedparameterspec"> * Java Security Standard Algorithm Names Specification</a> for * information about standard names. * diff --git a/src/java.base/share/classes/java/security/spec/PSSParameterSpec.java b/src/java.base/share/classes/java/security/spec/PSSParameterSpec.java index d6f051995998f..5c77089f1ca23 100644 --- a/src/java.base/share/classes/java/security/spec/PSSParameterSpec.java +++ b/src/java.base/share/classes/java/security/spec/PSSParameterSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -118,8 +118,19 @@ public class PSSParameterSpec implements AlgorithmParameterSpec { * mask generation function, parameters for mask generation * function, salt length, and trailer field values. * - * @param mdName the algorithm name of the hash function - * @param mgfName the algorithm name of the mask generation function + * @param mdName the algorithm name of the hash function. See the + * PSSParameterSpec section of the + * <a href= + * "{@docRoot}/../specs/security/standard-names.html#pssparameterspec"> + * Java Security Standard Algorithm Names Specification</a> + * for information about standard names for the hash function. + * @param mgfName the algorithm name of the mask generation function. + * See the PSSParameterSpec section of the + * <a href= + * "{@docRoot}/../specs/security/standard-names.html#pssparameterspec"> + * Java Security Standard Algorithm Names Specification</a> + * for information about standard names for the mask generation + * function. * @param mgfSpec the parameters for the mask generation function. * If null is specified, null will be returned by * getMGFParameters(). From cae94b268d633b0557a54e3b21eff60d7f0edc2d Mon Sep 17 00:00:00 2001 From: Hamlin Li <mli@openjdk.org> Date: Tue, 25 Jun 2024 14:06:03 +0000 Subject: [PATCH 174/471] 8334397: RISC-V: verify perf of ReverseBytesS/US Reviewed-by: fyang, luhenry --- src/hotspot/cpu/riscv/riscv.ad | 31 +------- src/hotspot/cpu/riscv/riscv_b.ad | 4 +- .../openjdk/bench/java/lang/Characters.java | 24 +++++++ .../org/openjdk/bench/java/lang/Shorts.java | 70 +++++++++++++++++++ 4 files changed, 98 insertions(+), 31 deletions(-) create mode 100644 test/micro/org/openjdk/bench/java/lang/Shorts.java diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 798caee7375d8..4ed449032d6e9 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1916,6 +1916,8 @@ bool Matcher::match_rule_supported(int opcode) { case Op_ReverseBytesI: case Op_ReverseBytesL: + case Op_ReverseBytesS: + case Op_ReverseBytesUS: case Op_RotateRight: case Op_RotateLeft: case Op_CountLeadingZerosI: @@ -7866,35 +7868,6 @@ instruct xorL_reg_imm(iRegLNoSp dst, iRegL src1, immLAdd src2) %{ ins_pipe(ialu_reg_imm); %} -// ============================================================================ -// BSWAP Instructions - -instruct bytes_reverse_unsigned_short(iRegINoSp dst, iRegIorL2I src) %{ - match(Set dst (ReverseBytesUS src)); - - ins_cost(ALU_COST * 5); - format %{ "revb_h_h_u $dst, $src\t#@bytes_reverse_unsigned_short" %} - - ins_encode %{ - __ revb_h_h_u(as_Register($dst$$reg), as_Register($src$$reg)); - %} - - ins_pipe(pipe_class_default); -%} - -instruct bytes_reverse_short(iRegINoSp dst, iRegIorL2I src) %{ - match(Set dst (ReverseBytesS src)); - - ins_cost(ALU_COST * 5); - format %{ "revb_h_h $dst, $src\t#@bytes_reverse_short" %} - - ins_encode %{ - __ revb_h_h(as_Register($dst$$reg), as_Register($src$$reg)); - %} - - ins_pipe(pipe_class_default); -%} - // ============================================================================ // MemBar Instruction diff --git a/src/hotspot/cpu/riscv/riscv_b.ad b/src/hotspot/cpu/riscv/riscv_b.ad index 9e78159d24fce..92e616a3063e1 100644 --- a/src/hotspot/cpu/riscv/riscv_b.ad +++ b/src/hotspot/cpu/riscv/riscv_b.ad @@ -206,13 +206,13 @@ instruct bytes_reverse_long_b(iRegLNoSp dst, iRegL src) %{ %} instruct bytes_reverse_unsigned_short_b(iRegINoSp dst, iRegIorL2I src) %{ - predicate(UseZbb); match(Set dst (ReverseBytesUS src)); ins_cost(ALU_COST * 2); format %{ "revb_h_h_u $dst, $src\t#@bytes_reverse_unsigned_short_b" %} ins_encode %{ + assert(UseZbb, "must be"); __ revb_h_h_u(as_Register($dst$$reg), as_Register($src$$reg)); %} @@ -220,13 +220,13 @@ instruct bytes_reverse_unsigned_short_b(iRegINoSp dst, iRegIorL2I src) %{ %} instruct bytes_reverse_short_b(iRegINoSp dst, iRegIorL2I src) %{ - predicate(UseZbb); match(Set dst (ReverseBytesS src)); ins_cost(ALU_COST * 2); format %{ "revb_h_h $dst, $src\t#@bytes_reverse_short_b" %} ins_encode %{ + assert(UseZbb, "must be"); __ revb_h_h(as_Register($dst$$reg), as_Register($src$$reg)); %} diff --git a/test/micro/org/openjdk/bench/java/lang/Characters.java b/test/micro/org/openjdk/bench/java/lang/Characters.java index 246b4f5ccc88e..eb12ad744573a 100644 --- a/test/micro/org/openjdk/bench/java/lang/Characters.java +++ b/test/micro/org/openjdk/bench/java/lang/Characters.java @@ -35,6 +35,7 @@ import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; +import java.util.Random; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.AverageTime) @@ -48,6 +49,29 @@ public class Characters { @Param({"9", "65", "97", "223", "430"}) private int codePoint; + @Param("500") + private int size; + + private char[] chars; + private char[] res; + + @Setup + public void setup() { + Random r = new Random(0); + chars = new char[size]; + res = new char[size]; + for (int i = 0; i < size; i++) { + chars[i] = (char)r.nextInt(Character.MAX_VALUE + 1); + } + } + + @Benchmark + public void reverseBytes() { + for (int i = 0; i < size; i++) { + res[i] = Character.reverseBytes(chars[i]); + } + } + @Benchmark public boolean isDigit() { return Character.isDigit(codePoint); diff --git a/test/micro/org/openjdk/bench/java/lang/Shorts.java b/test/micro/org/openjdk/bench/java/lang/Shorts.java new file mode 100644 index 0000000000000..b11d07db8e0de --- /dev/null +++ b/test/micro/org/openjdk/bench/java/lang/Shorts.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.bench.java.lang; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +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.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Thread) +@Warmup(iterations = 5, time = 1) +@Measurement(iterations = 5, time = 1) +@Fork(3) +public class Shorts { + + @Param("500") + private int size; + + private short[] shorts; + private short[] res; + + @Setup + public void setup() { + Random r = new Random(0); + shorts = new short[size]; + res = new short[size]; + for (int i = 0; i < size; i++) { + shorts[i] = (short)(r.nextInt(Character.MAX_VALUE + 1) + Short.MIN_VALUE); + } + } + + @Benchmark + public void reverseBytes() { + for (int i = 0; i < size; i++) { + res[i] = Short.reverseBytes(shorts[i]); + } + } +} From 6c6793307d4734409016943ae584726ac30d667e Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva <matsaave@openjdk.org> Date: Tue, 25 Jun 2024 14:07:32 +0000 Subject: [PATCH 175/471] 8334899: Test runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java failed after JDK-8306580 Reviewed-by: iklam, dholmes --- .../appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java b/test/hotspot/jtreg/runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java index 9238a832addcf..3bc7a4427f4c5 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java @@ -69,7 +69,7 @@ public static void main(String[] args) throws Throwable { "-Dtest.with.exception=true", gcLog).shouldNotHaveExitValue(0) .shouldContain("Preload Warning: Cannot find jdk/internal/math/FDBigInteger") - .shouldContain("VM exits due to exception, use -Xlog:cds,exceptions=trace for detail"); + .shouldContain("Unexpected exception, use -Xlog:cds,exceptions=trace for detail"); // 2. Test with OOM System.out.println("2. OOM during dump"); From 57f8b91e558e5b9ff9c2000b8f74e3a1988ead2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Sj=C3=B6len?= <jsjolen@openjdk.org> Date: Tue, 25 Jun 2024 14:37:38 +0000 Subject: [PATCH 176/471] 8333658: NMT: Use an allocator with 4-byte pointers to save memory in NativeCallStackStorage Reviewed-by: stuefe, azafari --- src/hotspot/share/nmt/arrayWithFreeList.hpp | 106 ++++++++++++ .../share/nmt/nmtNativeCallStackStorage.cpp | 60 +++++++ .../share/nmt/nmtNativeCallStackStorage.hpp | 71 +++----- .../gtest/nmt/test_arrayWithFreeList.cpp | 153 ++++++++++++++++++ 4 files changed, 339 insertions(+), 51 deletions(-) create mode 100644 src/hotspot/share/nmt/arrayWithFreeList.hpp create mode 100644 src/hotspot/share/nmt/nmtNativeCallStackStorage.cpp create mode 100644 test/hotspot/gtest/nmt/test_arrayWithFreeList.cpp diff --git a/src/hotspot/share/nmt/arrayWithFreeList.hpp b/src/hotspot/share/nmt/arrayWithFreeList.hpp new file mode 100644 index 0000000000000..90c348bbf7ccc --- /dev/null +++ b/src/hotspot/share/nmt/arrayWithFreeList.hpp @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + + */ + +#ifndef SHARE_NMT_ARRAYWITHFREELIST_HPP +#define SHARE_NMT_ARRAYWITHFREELIST_HPP + +#include "utilities/growableArray.hpp" +#include <type_traits> + +// A flat array of elements E, backed by C-heap, growing on-demand. It allows for +// returning arbitrary elements and keeps them in a freelist. Elements can be uniquely +// identified via array index. +template<typename E, MEMFLAGS flag> +class ArrayWithFreeList { + + // An E must be trivially copyable and destructible, but it may be constructed + // however it likes. + constexpr void static_assert_E_satisfies_type_requirements() const { + static_assert(std::is_trivially_copyable<E>::value && std::is_trivially_destructible<E>::value, "must be"); + } + +public: + using I = int32_t; + static constexpr const I nil = -1; + +private: + // A free list allocator element is either a link to the next free space + // or an actual element. + union BackingElement { + I link; + E e; + }; + + GrowableArrayCHeap<BackingElement, flag> _backing_storage; + I _free_start; + + bool is_in_bounds(I i) { + return i >= 0 && i < _backing_storage.length(); + } + +public: + NONCOPYABLE(ArrayWithFreeList<E COMMA flag>); + + ArrayWithFreeList(int initial_capacity = 8) + : _backing_storage(initial_capacity), + _free_start(nil) {} + + template<typename... Args> + I allocate(Args... args) { + static_assert_E_satisfies_type_requirements(); + BackingElement* be; + I i; + if (_free_start != nil) { + // Must point to already existing index + be = &_backing_storage.at(_free_start); + i = _free_start; + _free_start = be->link; + } else { + // There are no free elements, allocate a new one. + i = _backing_storage.append(BackingElement()); + be = _backing_storage.adr_at(i); + } + + ::new (be) E{args...}; + return i; + } + + void deallocate(I i) { + static_assert_E_satisfies_type_requirements(); + assert(i == nil || is_in_bounds(i), "out of bounds free"); + if (i == nil) return; + BackingElement& be_freed = _backing_storage.at(i); + be_freed.link = _free_start; + _free_start = i; + } + + E& at(I i) { + static_assert_E_satisfies_type_requirements(); + assert(i != nil, "null pointer dereference"); + assert(is_in_bounds(i), "out of bounds dereference"); + return _backing_storage.at(i).e; + } +}; + +#endif // SHARE_NMT_ARRAYWITHFREELIST_HPP diff --git a/src/hotspot/share/nmt/nmtNativeCallStackStorage.cpp b/src/hotspot/share/nmt/nmtNativeCallStackStorage.cpp new file mode 100644 index 0000000000000..fd7a67a358e87 --- /dev/null +++ b/src/hotspot/share/nmt/nmtNativeCallStackStorage.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "memory/allocation.hpp" +#include "nmt/nmtNativeCallStackStorage.hpp" + +NativeCallStackStorage::StackIndex NativeCallStackStorage::put(const NativeCallStack& value) { + int bucket = value.calculate_hash() % _table_size; + TableEntryIndex link = _table[bucket]; + while (link != TableEntryStorage::nil) { + TableEntry& l = _entry_storage.at(link); + if (value.equals(get(l.stack))) { + return l.stack; + } + link = l.next; + } + int idx = _stacks.append(value); + StackIndex si{idx}; + TableEntryIndex new_link = _entry_storage.allocate(_table[bucket], si); + _table[bucket] = new_link; + return si; +} +NativeCallStackStorage::NativeCallStackStorage(bool is_detailed_mode, int table_size) + : _table_size(table_size), + _table(nullptr), + _stacks(), + _is_detailed_mode(is_detailed_mode), + _fake_stack() { + if (_is_detailed_mode) { + _table = NEW_C_HEAP_ARRAY(TableEntryIndex, _table_size, mtNMT); + for (int i = 0; i < _table_size; i++) { + _table[i] = TableEntryStorage::nil; + } + } +} +NativeCallStackStorage::~NativeCallStackStorage() { + FREE_C_HEAP_ARRAY(LinkPtr, _table); +} diff --git a/src/hotspot/share/nmt/nmtNativeCallStackStorage.hpp b/src/hotspot/share/nmt/nmtNativeCallStackStorage.hpp index 5f05e0c9304d6..1b09002028e53 100644 --- a/src/hotspot/share/nmt/nmtNativeCallStackStorage.hpp +++ b/src/hotspot/share/nmt/nmtNativeCallStackStorage.hpp @@ -25,8 +25,7 @@ #ifndef SHARE_NMT_NMTNATIVECALLSTACKSTORAGE_HPP #define SHARE_NMT_NMTNATIVECALLSTACKSTORAGE_HPP -#include "memory/allocation.hpp" -#include "memory/arena.hpp" +#include "nmt/arrayWithFreeList.hpp" #include "utilities/growableArray.hpp" #include "utilities/nativeCallStack.hpp" @@ -40,64 +39,41 @@ // - Have fast comparisons // - Have constant time access // We achieve this by using a closed hashtable for finding previously existing NCS:s and referring to them by an index that's smaller than a pointer. -class NativeCallStackStorage : public CHeapObj<mtNMT> { +class NativeCallStackStorage : public CHeapObjBase { public: struct StackIndex { friend NativeCallStackStorage; - - private: - static constexpr const int32_t _invalid = -1; - int32_t _stack_index; - StackIndex(int32_t stack_index) - : _stack_index(stack_index) { - } - public: + static constexpr const int32_t invalid = -1; static bool equals(const StackIndex& a, const StackIndex& b) { return a._stack_index == b._stack_index; } bool is_invalid() { - return _stack_index == _invalid; - } - - StackIndex() - : _stack_index(_invalid) { + return _stack_index == invalid; } }; private: - struct Link : public ArenaObj { - Link* next; + struct TableEntry; + using TableEntryStorage = ArrayWithFreeList<TableEntry, mtNMT>; + using TableEntryIndex = typename TableEntryStorage::I; + + TableEntryStorage _entry_storage; + + struct TableEntry { + TableEntryIndex next; StackIndex stack; - Link(Link* next, StackIndex v) - : next(next), - stack(v) { - } }; - StackIndex put(const NativeCallStack& value) { - int bucket = value.calculate_hash() % _table_size; - Link* link = _table[bucket]; - while (link != nullptr) { - if (value.equals(get(link->stack))) { - return link->stack; - } - link = link->next; - } - int idx = _stacks.append(value); - Link* new_link = new (&_arena) Link(_table[bucket], StackIndex(idx)); - _table[bucket] = new_link; - return new_link->stack; - } - // For storage of the Links - Arena _arena; + StackIndex put(const NativeCallStack& value); + // Pick a prime number of buckets. // 4099 gives a 50% probability of collisions at 76 stacks (as per birthday problem). static const constexpr int default_table_size = 4099; - int _table_size; - Link** _table; + const int _table_size; + TableEntryIndex* _table; GrowableArrayCHeap<NativeCallStack, mtNMT> _stacks; const bool _is_detailed_mode; @@ -107,7 +83,7 @@ class NativeCallStackStorage : public CHeapObj<mtNMT> { StackIndex push(const NativeCallStack& stack) { // Not in detailed mode, so not tracking stacks. if (!_is_detailed_mode) { - return StackIndex(); + return StackIndex{StackIndex::invalid}; } return put(stack); } @@ -119,16 +95,9 @@ class NativeCallStackStorage : public CHeapObj<mtNMT> { return _stacks.at(si._stack_index); } - NativeCallStackStorage(bool is_detailed_mode, int table_size = default_table_size) - : _arena(mtNMT), _table_size(table_size), _table(nullptr), _stacks(), - _is_detailed_mode(is_detailed_mode), _fake_stack() { - if (_is_detailed_mode) { - _table = NEW_ARENA_ARRAY(&_arena, Link*, _table_size); - for (int i = 0; i < _table_size; i++) { - _table[i] = nullptr; - } - } - } + NativeCallStackStorage(bool is_detailed_mode, int table_size = default_table_size); + + ~NativeCallStackStorage(); }; #endif // SHARE_NMT_NMTNATIVECALLSTACKSTORAGE_HPP diff --git a/test/hotspot/gtest/nmt/test_arrayWithFreeList.cpp b/test/hotspot/gtest/nmt/test_arrayWithFreeList.cpp new file mode 100644 index 0000000000000..a2110e9e22e87 --- /dev/null +++ b/test/hotspot/gtest/nmt/test_arrayWithFreeList.cpp @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + + */ + +#include "precompiled.hpp" +#include "unittest.hpp" +#include "nmt/arrayWithFreeList.hpp" + +using A = ArrayWithFreeList<int, mtTest>; + +class ArrayWithFreeListTest : public testing::Test { +}; + +// A linked list which sets the allocator itself +template<typename E> +struct LL { + struct Node; + using NodeAllocator = ArrayWithFreeList<Node, mtTest>; + using NodePtr = typename NodeAllocator::I; + NodeAllocator alloc; + struct Node { + E e; + NodePtr next; + }; + + NodePtr start; + LL() + : start{NodeAllocator::nil} { + } + + void push(E e) { + NodePtr new_element = alloc.allocate(e, NodeAllocator::nil); + NodePtr& current = start; + if (current == NodeAllocator::nil) { + current = new_element; + return; + } + alloc.at(new_element).next = current; + current = new_element; + }; + + E pop() { + assert(start != NodeAllocator::nil, "must be"); + Node& n = alloc.at(start); + E e = n.e; + NodePtr next_start = n.next; + alloc.deallocate(start); + start = next_start; + return e; + } +}; + +// A linked list which is capable of having multiple different allocators. This is done through higher-kinded types. +// That's a very fancy word that means that a templated type like Foo<E> can be passed around like only Foo at first +// and then be 'applied' to some E. Think of it like passing around a lambda or function pointer, but on a template level, +// where Foo is a function that can be called on some type with the return type being Foo<E>. +template<typename E, template<typename, MEMFLAGS> class Allocator> +struct LL2 { + struct Node; + using NodeAllocator = Allocator<Node, mtTest>; + using NodePtr = typename NodeAllocator::I; + NodeAllocator alloc; + struct Node { + E e; + NodePtr next; + }; + + NodePtr start; + LL2() + : start(NodeAllocator::nil) { + } + + void push(E e) { + NodePtr new_element = alloc.allocate(e, NodeAllocator::nil); + NodePtr& current = start; + if (current == NodeAllocator::nil) { + current = new_element; + return; + } + alloc.at(new_element).next = current; + current = new_element; + }; + + E pop() { + assert(start != NodeAllocator::nil, "must be"); + Node& n = alloc.at(start); + E e = n.e; + NodePtr next_start = n.next; + alloc.deallocate(start); + start = next_start; + return e; + } +}; + +template<typename List> +void test_with_list(List& list) { + list.push(1); + list.push(2); + EXPECT_EQ(2, list.pop()); + EXPECT_EQ(1, list.pop()); +} + +TEST_VM_F(ArrayWithFreeListTest, TestLinkedLists) { + { + LL<int> list; + test_with_list(list); + } + { + LL2<int, ArrayWithFreeList> list; + test_with_list(list); + } +} + +TEST_VM_F(ArrayWithFreeListTest, FreeingShouldReuseMemory) { + A alloc; + A::I i = alloc.allocate(1); + int* x = &alloc.at(i); + alloc.deallocate(i); + i = alloc.allocate(1); + int* y = &alloc.at(i); + EXPECT_EQ(x, y); +} + +TEST_VM_F(ArrayWithFreeListTest, FreeingInTheMiddleWorks) { + A alloc; + A::I i0 = alloc.allocate(0); + A::I i1 = alloc.allocate(0); + A::I i2 = alloc.allocate(0); + int* p1 = &alloc.at(i1); + alloc.deallocate(i1); + A::I i3 = alloc.allocate(0); + EXPECT_EQ(p1, &alloc.at(i3)); +} From 9c89f0861c1b6d25e1a7c3ac1add9a168d807788 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov <kvn@openjdk.org> Date: Tue, 25 Jun 2024 16:04:03 +0000 Subject: [PATCH 177/471] 8334421: assert(!oldbox->is_unbalanced()) failed: this should not be called for unbalanced region Reviewed-by: vlivanov, thartmann --- src/hotspot/share/opto/callnode.cpp | 20 ++ src/hotspot/share/opto/callnode.hpp | 4 + src/hotspot/share/opto/escape.cpp | 5 +- src/hotspot/share/opto/locknode.hpp | 6 +- src/hotspot/share/opto/macro.cpp | 2 +- ...oarsenedAndNotEscapedLocksElimination.java | 205 ++++++++++++++++++ 6 files changed, 236 insertions(+), 6 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/locks/TestCoarsenedAndNotEscapedLocksElimination.java diff --git a/src/hotspot/share/opto/callnode.cpp b/src/hotspot/share/opto/callnode.cpp index 98837e5e046ad..6ac3d6e4c611c 100644 --- a/src/hotspot/share/opto/callnode.cpp +++ b/src/hotspot/share/opto/callnode.cpp @@ -1950,6 +1950,22 @@ bool AbstractLockNode::find_unlocks_for_region(const RegionNode* region, LockNod } +// Check that all locks/unlocks associated with object come from balanced regions. +bool AbstractLockNode::is_balanced() { + Node* obj = obj_node(); + for (uint j = 0; j < obj->outcnt(); j++) { + Node* n = obj->raw_out(j); + if (n->is_AbstractLock() && + n->as_AbstractLock()->obj_node()->eqv_uncast(obj)) { + BoxLockNode* n_box = n->as_AbstractLock()->box_node()->as_BoxLock(); + if (n_box->is_unbalanced()) { + return false; + } + } + } + return true; +} + const char* AbstractLockNode::_kind_names[] = {"Regular", "NonEscObj", "Coarsened", "Nested"}; const char * AbstractLockNode::kind_as_string() const { @@ -2056,6 +2072,8 @@ Node *LockNode::Ideal(PhaseGVN *phase, bool can_reshape) { int unlocks = 0; if (Verbose) { tty->print_cr("=== Locks coarsening ==="); + tty->print("Obj: "); + obj_node()->dump(); } for (int i = 0; i < lock_ops.length(); i++) { AbstractLockNode* lock = lock_ops.at(i); @@ -2064,6 +2082,8 @@ Node *LockNode::Ideal(PhaseGVN *phase, bool can_reshape) { else unlocks++; if (Verbose) { + tty->print("Box %d: ", i); + box_node()->dump(); tty->print(" %d: ", i); lock->dump(); } diff --git a/src/hotspot/share/opto/callnode.hpp b/src/hotspot/share/opto/callnode.hpp index efa84850bb236..818640a6f6575 100644 --- a/src/hotspot/share/opto/callnode.hpp +++ b/src/hotspot/share/opto/callnode.hpp @@ -1154,6 +1154,10 @@ class AbstractLockNode: public CallNode { void set_coarsened() { _kind = Coarsened; set_eliminated_lock_counter(); } void set_nested() { _kind = Nested; set_eliminated_lock_counter(); } + // Check that all locks/unlocks associated with object come from balanced regions. + // They can become unbalanced after coarsening optimization or on OSR entry. + bool is_balanced(); + // locking does not modify its arguments virtual bool may_modify(const TypeOopPtr* t_oop, PhaseValues* phase){ return false; } diff --git a/src/hotspot/share/opto/escape.cpp b/src/hotspot/share/opto/escape.cpp index 8a80392d5c786..1338bb3c90901 100644 --- a/src/hotspot/share/opto/escape.cpp +++ b/src/hotspot/share/opto/escape.cpp @@ -3502,12 +3502,11 @@ bool ConnectionGraph::not_global_escape(Node *n) { // and locked code region (identified by BoxLockNode) is balanced: // all compiled code paths have corresponding Lock/Unlock pairs. bool ConnectionGraph::can_eliminate_lock(AbstractLockNode* alock) { - BoxLockNode* box = alock->box_node()->as_BoxLock(); - if (!box->is_unbalanced() && not_global_escape(alock->obj_node())) { + if (alock->is_balanced() && not_global_escape(alock->obj_node())) { if (EliminateNestedLocks) { // We can mark whole locking region as Local only when only // one object is used for locking. - box->set_local(); + alock->box_node()->as_BoxLock()->set_local(); } return true; } diff --git a/src/hotspot/share/opto/locknode.hpp b/src/hotspot/share/opto/locknode.hpp index 0a7e4bd4905c7..229dcb73292c1 100644 --- a/src/hotspot/share/opto/locknode.hpp +++ b/src/hotspot/share/opto/locknode.hpp @@ -44,7 +44,7 @@ class BoxLockNode : public Node { Eliminated // All lock/unlock in region were eliminated } _kind; -#ifdef ASSERT +#ifndef PRODUCT const char* _kind_name[6] = { "Regular", "Local", @@ -122,7 +122,9 @@ class BoxLockNode : public Node { #ifndef PRODUCT virtual void format( PhaseRegAlloc *, outputStream *st ) const; - virtual void dump_spec(outputStream *st) const { st->print(" Lock %d",_slot); } + virtual void dump_spec(outputStream *st) const { + st->print(" Lock slot: %d, Kind: %s", _slot, _kind_name[(int)_kind]); + } #endif }; diff --git a/src/hotspot/share/opto/macro.cpp b/src/hotspot/share/opto/macro.cpp index 21dfacf9fe1ce..de804457a262d 100644 --- a/src/hotspot/share/opto/macro.cpp +++ b/src/hotspot/share/opto/macro.cpp @@ -2045,7 +2045,7 @@ void PhaseMacroExpand::mark_eliminated_box(Node* box, Node* obj) { //-----------------------mark_eliminated_locking_nodes----------------------- void PhaseMacroExpand::mark_eliminated_locking_nodes(AbstractLockNode *alock) { - if (alock->box_node()->as_BoxLock()->is_unbalanced()) { + if (!alock->is_balanced()) { return; // Can't do any more elimination for this locking region } if (EliminateNestedLocks) { diff --git a/test/hotspot/jtreg/compiler/locks/TestCoarsenedAndNotEscapedLocksElimination.java b/test/hotspot/jtreg/compiler/locks/TestCoarsenedAndNotEscapedLocksElimination.java new file mode 100644 index 0000000000000..4b20ddc0033e1 --- /dev/null +++ b/test/hotspot/jtreg/compiler/locks/TestCoarsenedAndNotEscapedLocksElimination.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8334421 + * @summary C2 incorrectly marks not-escaped locks for elimination after + * coarsened locks were eliminated and created unbalanced regions. + * @requires vm.compMode != "Xint" + * @run main/othervm -XX:-TieredCompilation TestCoarsenedAndNotEscapedLocksElimination + * @run main TestCoarsenedAndNotEscapedLocksElimination + */ + +import java.util.Vector; + +class TestVector extends Vector<Object> { + + TestVector() { + super(); + } + + TestVector(int initialCapacity) { + super(initialCapacity); + } + + TestVector(int initialCapacity, int capacityIncrement) { + super(initialCapacity, capacityIncrement); + } + + Object[] getElementData () { + return elementData; // access protected field + } +} + +public class TestCoarsenedAndNotEscapedLocksElimination { + + public static void main(String[] strArr) { + TestCoarsenedAndNotEscapedLocksElimination tc = new TestCoarsenedAndNotEscapedLocksElimination(); + String result = null; + for (int i = 0; i < 12000; ++i) { + result = tc.test(); + if (result != null) break; + } + System.out.println(result == null? "passed" : result); + } + + int [][] vector_types = { + {-1, -1}, + {0, -1}, + {1, -1}, + {2, -1}, + {1025, -1}, + {0, -2}, + {1, -2}, + {2, -2}, + {1025, -2}, + {0, 0}, + {1, 0}, + {2, 0}, + {1025, 0}, + {0, 1}, + {1, 1}, + {2, 1}, + {1025, 1}, + {0, 1025 }, + {1, 1025 }, + {2, 1025 }, + {1025, 1025 } + }; + + Object [] elems = { + null, + new Object(), + new Vector(), + new Object[0] + }; + + int cntr = 0, mode = 0; + + void reset() { + cntr = 0; + mode = 0; + } + + TestVector nextVector() { + if (cntr == vector_types.length) { + return null; + } else { + TestVector vect; + if (vector_types[cntr][0] < 0) { + vect = new TestVector(); + } else if (vector_types[cntr][1] == -2) { + vect = new TestVector(vector_types[cntr][0]); + } else { + vect = new TestVector(vector_types[cntr][0], vector_types[cntr][1]); + } + if (mode == 1) { + vect.addElement(null); + vect.addElement(new Object()); + vect.addElement(new Vector()); + vect.addElement(new Object[0]); + } else if (mode == 2) { + int cap = vect.capacity(); + vect.addElement(null); + for (int i = 0; i < cap; i++) { + vect.addElement(new Object()); + } + } + if (++mode == 3) { + mode = 0; + cntr++; + } + return vect; + } + } + + public String test() { + reset(); + TestVector vect = (TestVector)nextVector(); + while (vect != null) { + Object [] backup_array = new Object[vect.size()]; + System.arraycopy(vect.getElementData(),0,backup_array,0,vect.size()); + + int old_size = vect.size(); + vect.setSize(vect.size()); + if (vect.size() != old_size) { + return "Vector: "+vect+" size changed after setSize(size())"; + } + for (int i = 0; i < vect.size(); i++) { + if (vect.elementAt(i) != backup_array[i]) { + return "Vector: "+vect+" : "+i+"th element changed after setSize(size())"; + } + } + + old_size = vect.size(); + vect.setSize(vect.size()*2); + if (vect.size() != old_size*2) { + return "Vector: "+vect+" size incorrectly changed after setSize(size()*2)"; + } + for (int i = 0; i < old_size; i++) { + if (vect.elementAt(i) != backup_array[i]) { + return "Vector: "+vect+" : "+i+"th element changed after setSize(size()*2)"; + } + } + for (int i = old_size; i < old_size*2; i++) { + if (vect.elementAt(i) != null) { + return "Vector: "+vect+" : "+i+"th element not null after setSize(size()*2)"; + } + } + + old_size = vect.size(); + int old_cap = vect.capacity(); + vect.setSize(vect.capacity()+1); + if (vect.size() != old_cap+1) { + return "Vector: "+vect+" size incorrectly changed after setSize(capacity()+1)"; + } + for (int i = 0; i < old_size && i < backup_array.length; i++) { + if (vect.elementAt(i) != backup_array[i]) { + return "Vector: "+vect+" : "+i+"th element changed after setSize(capacity()+1)"; + } + } + for (int i = old_size; i < old_cap + 1; i++) { + if (vect.elementAt(i) != null) { + return "Vector: "+vect+" : "+i+"th element not null after setSize(capacity()+1)"; + } + } + + old_size = vect.size(); + vect.setSize(vect.size()/2); + if (vect.size() != old_size/2) { + return "Vector: "+vect+" size incorrectly changed after setSize(size()/2)"; + } + for (int i = 0; i < old_size/2 && i < backup_array.length; i++) { + if (vect.elementAt(i) != backup_array[i]) { + return "Vector: "+vect+" : "+i+"th element changed after setSize(size()/2)"; + } + } + + vect = nextVector(); + } + return null; + } + +} + From 7429c37e63ffd50884d91d8f583d409633bfb04d Mon Sep 17 00:00:00 2001 From: Ioi Lam <iklam@openjdk.org> Date: Tue, 25 Jun 2024 16:44:41 +0000 Subject: [PATCH 178/471] 8334598: Default classlist in JDK is not deterministic after JDK-8293980 Reviewed-by: ccheung, dholmes, stuefe, erikj --- make/GenerateLinkOptData.gmk | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/make/GenerateLinkOptData.gmk b/make/GenerateLinkOptData.gmk index 5052e4c0358c8..b6989042d6aed 100644 --- a/make/GenerateLinkOptData.gmk +++ b/make/GenerateLinkOptData.gmk @@ -62,14 +62,14 @@ ifeq ($(EXTERNAL_BUILDJDK), true) INTERIM_IMAGE_DIR := $(BUILD_JDK) endif -# These are needed for deterministic classlist: +# To make the classlist deterministic: # - The classlist can be influenced by locale. Always set it to en/US. -# - Run with -Xint, as the compiler can speculatively resolve constant pool entries. -# - ForkJoinPool parallelism can cause constant pool resolution to be non-deterministic. +# - Concurrency in the core libraries can cause constant pool resolution +# to be non-deterministic. Since the benefits of resolved CP references in the +# default classlist is minimal, let's filter out the '@cp' lines until we can +# find a proper solution. CLASSLIST_FILE_VM_OPTS = \ - -Duser.language=en -Duser.country=US \ - -Xint \ - -Djava.util.concurrent.ForkJoinPool.common.parallelism=0 + -Duser.language=en -Duser.country=US # Save the stderr output of the command and print it along with stdout in case # something goes wrong. @@ -101,9 +101,10 @@ $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXECUTABLE_SUFFIX) $(CLASSLIST exit $$exitcode \ ) $(GREP) -v HelloClasslist $@.raw.2 > $@.raw.3 + $(GREP) -v @cp $@.raw.3 > $@.raw.4 $(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java \ -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \ - build.tools.classlist.SortClasslist $@.raw.3 > $@ + build.tools.classlist.SortClasslist $@.raw.4 > $@ # The jli trace is created by the same recipe as classlist. By declaring these # dependencies, make will correctly rebuild both jli trace and classlist From 933eababf2b79586a911082af36fdcc41763c7b9 Mon Sep 17 00:00:00 2001 From: Quan Anh Mai <qamai@openjdk.org> Date: Tue, 25 Jun 2024 17:10:20 +0000 Subject: [PATCH 179/471] 8334629: [BACKOUT] PhaseIdealLoop::conditional_move is too conservative Reviewed-by: epeter, thartmann, jkarthikeyan --- src/hotspot/share/opto/loopopts.cpp | 19 ++++-- test/hotspot/jtreg/ProblemList.txt | 1 + .../org/openjdk/bench/vm/compiler/CMove.java | 59 ------------------- 3 files changed, 14 insertions(+), 65 deletions(-) delete mode 100644 test/micro/org/openjdk/bench/vm/compiler/CMove.java diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp index 182947e552e88..ba0ce344122af 100644 --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -802,18 +802,25 @@ Node *PhaseIdealLoop::conditional_move( Node *region ) { // Avoid duplicated float compare. if (phis > 1 && (cmp_op == Op_CmpF || cmp_op == Op_CmpD)) return nullptr; - // Ignore cost if CMOVE can be moved outside the loop. - if (used_inside_loop && cost >= ConditionalMoveLimit) { - return nullptr; + float infrequent_prob = PROB_UNLIKELY_MAG(3); + // Ignore cost and blocks frequency if CMOVE can be moved outside the loop. + if (used_inside_loop) { + if (cost >= ConditionalMoveLimit) return nullptr; // Too much goo + + // BlockLayoutByFrequency optimization moves infrequent branch + // from hot path. No point in CMOV'ing in such case (110 is used + // instead of 100 to take into account not exactness of float value). + if (BlockLayoutByFrequency) { + infrequent_prob = MAX2(infrequent_prob, (float)BlockLayoutMinDiamondPercentage/110.0f); + } } // Check for highly predictable branch. No point in CMOV'ing if // we are going to predict accurately all the time. - constexpr float infrequent_prob = PROB_UNLIKELY_MAG(2); if (C->use_cmove() && (cmp_op == Op_CmpF || cmp_op == Op_CmpD)) { //keep going - } else if (iff->_prob < infrequent_prob || iff->_prob > (1.0f - infrequent_prob)) { + } else if (iff->_prob < infrequent_prob || + iff->_prob > (1.0f - infrequent_prob)) return nullptr; - } // -------------- // Now replace all Phis with CMOV's diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 469a410e31d8e..254e621bfdd47 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -53,6 +53,7 @@ compiler/loopopts/TestUnreachableInnerLoop.java 8288981 linux-s390x compiler/c2/Test8004741.java 8235801 generic-all compiler/c2/irTests/TestDuplicateBackedge.java 8318904 generic-all +compiler/c2/irTests/TestIfMinMax.java 8334816 generic-all compiler/codecache/jmx/PoolsIndependenceTest.java 8264632 macosx-all compiler/codecache/CheckLargePages.java 8332654 linux-x64 diff --git a/test/micro/org/openjdk/bench/vm/compiler/CMove.java b/test/micro/org/openjdk/bench/vm/compiler/CMove.java deleted file mode 100644 index 0f92a681c727d..0000000000000 --- a/test/micro/org/openjdk/bench/vm/compiler/CMove.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.openjdk.bench.vm.compiler; - -import java.util.concurrent.TimeUnit; -import java.util.random.RandomGeneratorFactory; -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Blackhole; - -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.MICROSECONDS) -@State(Scope.Thread) -@Warmup(iterations = 5, time = 1) -@Measurement(iterations = 5, time = 1) -@Fork(value = 1) -public class CMove { - static final int SIZE = 1000000; - - @Param({"0.003", "0.006", "0.01", "0.02", "0.03", "0.06", "0.1", "0.2", "0.3", "0.6"}) - double freq; - - boolean[] conds; - - @Setup(Level.Iteration) - public void setup() { - var r = RandomGeneratorFactory.getDefault().create(1); - conds = new boolean[SIZE]; - for (int i = 0; i < SIZE; i++) { - conds[i] = r.nextDouble() < freq; - } - } - - @Benchmark - public void run(Blackhole bh) { - for (int i = 0; i < conds.length; i++) { - bh.consume(conds[i] ? 2 : 1); - } - } -} \ No newline at end of file From f8bf470b773884911290fa6ce059f7cc13686186 Mon Sep 17 00:00:00 2001 From: Yude Lin <yude.lyd@alibaba-inc.com> Date: Tue, 25 Jun 2024 18:19:42 +0000 Subject: [PATCH 180/471] 8334810: Redo: Un-ProblemList LocaleProvidersRun and CalendarDataRegression 8268379: java/util/Locale/LocaleProvidersRun.java and sun/util/locale/provider/CalendarDataRegression.java timed out Reviewed-by: naoto, jlu --- test/jdk/ProblemList.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index b3fb31dc789da..2bf83e8ea81e0 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -717,9 +717,6 @@ com/sun/jdi/InvokeHangTest.java 8218463 linux-al # jdk_util -java/util/Locale/LocaleProvidersRun.java 8268379 macosx-x64 -sun/util/locale/provider/CalendarDataRegression.java 8268379 macosx-x64 - ############################################################################ # jdk_instrument From 861aefcafacdc21459ef966307f52568e327fd49 Mon Sep 17 00:00:00 2001 From: Justin Lu <jlu@openjdk.org> Date: Tue, 25 Jun 2024 19:05:01 +0000 Subject: [PATCH 181/471] 8334418: Update IANA Language Subtag Registry to Version 2024-06-14 Reviewed-by: lancea, iris, srl, naoto --- .../share/data/lsrdata/language-subtag-registry.txt | 6 +++++- test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/data/lsrdata/language-subtag-registry.txt b/src/java.base/share/data/lsrdata/language-subtag-registry.txt index 512134311e485..3079d77ed8b14 100644 --- a/src/java.base/share/data/lsrdata/language-subtag-registry.txt +++ b/src/java.base/share/data/lsrdata/language-subtag-registry.txt @@ -1,4 +1,4 @@ -File-Date: 2024-05-16 +File-Date: 2024-06-14 %% Type: language Subtag: aa @@ -48009,7 +48009,9 @@ Type: variant Subtag: laukika Description: Classical Sanskrit Added: 2010-07-28 +Deprecated: 2024-06-08 Prefix: sa +Comments: Preferred tag is cls %% Type: variant Subtag: lemosin @@ -48385,9 +48387,11 @@ Type: variant Subtag: vaidika Description: Vedic Sanskrit Added: 2010-07-28 +Deprecated: 2024-06-08 Prefix: sa Comments: The most ancient dialect of Sanskrit used in verse and prose composed until about the 4th century B.C.E. +Comments: Preferred tag is vsn %% Type: variant Subtag: valbadia diff --git a/test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java b/test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java index 184e007becd9d..cb3d4dde914ba 100644 --- a/test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java +++ b/test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java @@ -25,9 +25,9 @@ * @test * @bug 8025703 8040211 8191404 8203872 8222980 8225435 8241082 8242010 8247432 * 8258795 8267038 8287180 8302512 8304761 8306031 8308021 8313702 8318322 - * 8327631 8332424 + * 8327631 8332424 8334418 * @summary Checks the IANA language subtag registry data update - * (LSR Revision: 2024-05-16) with Locale and Locale.LanguageRange + * (LSR Revision: 2024-06-14) with Locale and Locale.LanguageRange * class methods. * @run main LanguageSubtagRegistryTest */ From 86b0cf259fb3cbe3a1973151148e5d36c6a99d91 Mon Sep 17 00:00:00 2001 From: Justin Lu <jlu@openjdk.org> Date: Tue, 25 Jun 2024 19:05:22 +0000 Subject: [PATCH 182/471] 8334653: ISO 4217 Amendment 177 Update Reviewed-by: naoto --- .../sun/util/resources/CurrencyNames.properties | 4 +++- .../share/data/currency/CurrencyData.properties | 10 +++++----- test/jdk/java/util/Currency/CheckDataVersion.java | 4 ++-- test/jdk/java/util/Currency/CurrencyTest.java | 6 +++--- .../Currency/{tablea1.txt => ISO4217-list-one.txt} | 8 ++++---- test/jdk/java/util/Currency/ValidateISO4217.java | 11 ++++++----- 6 files changed, 23 insertions(+), 20 deletions(-) rename test/jdk/java/util/Currency/{tablea1.txt => ISO4217-list-one.txt} (97%) diff --git a/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties b/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties index 3cbbf15ed0252..7e6acccf6e5a9 100644 --- a/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties +++ b/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -287,6 +287,7 @@ ZAR=ZAR ZMK=ZMK ZMW=ZMW ZWD=ZWD +ZWG=ZWG ZWL=ZWL ZWN=ZWN ZWR=ZWR @@ -512,5 +513,6 @@ yum=Yugoslavian New Dinar (1994-2002) zar=South African Rand zmk=Zambian Kwacha zwd=Zimbabwean Dollar (1980-2008) +zwg=Zimbabwe Gold zwl=Zimbabwean Dollar (2009) zwr=Zimbabwean Dollar (2008) diff --git a/src/java.base/share/data/currency/CurrencyData.properties b/src/java.base/share/data/currency/CurrencyData.properties index 1661b4cccbaa4..5a28abccd00d2 100644 --- a/src/java.base/share/data/currency/CurrencyData.properties +++ b/src/java.base/share/data/currency/CurrencyData.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,7 @@ formatVersion=3 # Version of the currency code information in this class. # It is a serial number that accompanies with each amendment. -dataVersion=176 +dataVersion=177 # List of all valid ISO 4217 currency codes. # To ensure compatibility, do not remove codes. @@ -56,8 +56,8 @@ all=ADP020-AED784-AFA004-AFN971-ALL008-AMD051-ANG532-AOA973-ARS032-ATS040-AUD036 TPE626-TRL792-TRY949-TTD780-TWD901-TZS834-UAH980-UGX800-USD840-USN997-USS998-UYI940-\ UYU858-UZS860-VEB862-VED926-VEF937-VES928-VND704-VUV548-WST882-XAF950-XAG961-XAU959-XBA955-\ XBB956-XBC957-XBD958-XCD951-XCG532-XDR960-XFO000-XFU000-XOF952-XPD964-XPF953-\ - XPT962-XSU994-XTS963-XUA965-XXX999-YER886-YUM891-ZAR710-ZMK894-ZMW967-ZWD716-ZWL932-\ - ZWN942-ZWR935 + XPT962-XSU994-XTS963-XUA965-XXX999-YER886-YUM891-ZAR710-ZMK894-ZMW967-ZWD716-ZWG924-\ + ZWL932-ZWN942-ZWR935 # Mappings from ISO 3166 country codes to ISO 4217 currency codes. @@ -582,7 +582,7 @@ YE=YER # ZAMBIA ZM=ZMW # ZIMBABWE -ZW=ZWL +ZW=ZWG # List of currencies with non-2digit decimals for minor units, diff --git a/test/jdk/java/util/Currency/CheckDataVersion.java b/test/jdk/java/util/Currency/CheckDataVersion.java index ba18677dbbe06..303603c5b85e2 100644 --- a/test/jdk/java/util/Currency/CheckDataVersion.java +++ b/test/jdk/java/util/Currency/CheckDataVersion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,7 @@ import java.util.Currency; class CheckDataVersion { - static final String datafile = "tablea1.txt"; + static final String datafile = "ISO4217-list-one.txt"; static final String FILEVERSIONKEY = "FILEVERSION="; static final String DATAVERSIONKEY = "DATAVERSION="; static String fileVersion; diff --git a/test/jdk/java/util/Currency/CurrencyTest.java b/test/jdk/java/util/Currency/CurrencyTest.java index 495de30e821f4..c8dfb5013bd52 100644 --- a/test/jdk/java/util/Currency/CurrencyTest.java +++ b/test/jdk/java/util/Currency/CurrencyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ * @test * @bug 4290801 4692419 4693631 5101540 5104960 6296410 6336600 6371531 * 6488442 7036905 8008577 8039317 8074350 8074351 8150324 8167143 - * 8264792 + * 8264792 8334653 * @summary Basic tests for Currency class. * @modules java.base/java.util:open * jdk.localedata @@ -59,7 +59,7 @@ public class CurrencyTest { - // 'tablea1.txt' should be up-to-date before testing + // 'ISO4217-list-one.txt' should be up-to-date before testing @Test public void dataVersionTest() { CheckDataVersion.check(); diff --git a/test/jdk/java/util/Currency/tablea1.txt b/test/jdk/java/util/Currency/ISO4217-list-one.txt similarity index 97% rename from test/jdk/java/util/Currency/tablea1.txt rename to test/jdk/java/util/Currency/ISO4217-list-one.txt index 6e85de5e6d2b7..1912b5cc7dbb9 100644 --- a/test/jdk/java/util/Currency/tablea1.txt +++ b/test/jdk/java/util/Currency/ISO4217-list-one.txt @@ -1,12 +1,12 @@ # # -# Amendments up until ISO 4217 AMENDMENT NUMBER 176 -# (As of 06 December 2023) +# Amendments up until ISO 4217 AMENDMENT NUMBER 177 +# (As of 20 June 2024) # # Version FILEVERSION=3 -DATAVERSION=176 +DATAVERSION=177 # ISO 4217 currency data AF AFN 971 2 @@ -276,7 +276,7 @@ WF XPF 953 0 EH MAD 504 2 YE YER 886 2 ZM ZMW 967 2 -ZW ZWL 932 2 +ZW ZWG 924 2 #XAU XAU 959 #XBA XBA 955 #XBB XBB 956 diff --git a/test/jdk/java/util/Currency/ValidateISO4217.java b/test/jdk/java/util/Currency/ValidateISO4217.java index 53788c899b342..cd6e4f41a9f06 100644 --- a/test/jdk/java/util/Currency/ValidateISO4217.java +++ b/test/jdk/java/util/Currency/ValidateISO4217.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ * @test * @bug 4691089 4819436 4942982 5104960 6544471 6627549 7066203 7195759 * 8039317 8074350 8074351 8145952 8187946 8193552 8202026 8204269 - * 8208746 8209775 8264792 8274658 8283277 8296239 8321480 + * 8208746 8209775 8264792 8274658 8283277 8296239 8321480 8334653 * @summary Validate ISO 4217 data for Currency class. * @modules java.base/java.util:open * jdk.localedata @@ -60,7 +60,8 @@ /** * This class tests the latest ISO 4217 data and Java's currency data which is - * based on ISO 4217. The golden-data file (ISO 4217 data) 'tablea1.txt' has the following + * based on ISO 4217. The golden-data file, 'ISO4217-list-one.txt', based on the + * “List one: Currency, fund and precious metal codes” has the following * format: <Country code>\t<Currency code>\t<Numeric code>\t<Minor unit>[\t<Cutover Date>\t<new Currency code>\t<new Numeric code>\t<new Minor unit>] * The Cutover Date is given in SimpleDateFormat's 'yyyy-MM-dd-HH-mm-ss' format in the GMT time zone. */ @@ -68,7 +69,7 @@ public class ValidateISO4217 { // Input golden-data file private static final File dataFile = new File(System.getProperty( - "test.src", "."), "tablea1.txt"); + "test.src", "."), "ISO4217-list-one.txt"); // Code statuses private static final byte UNDEFINED = 0; private static final byte DEFINED = 1; @@ -89,7 +90,7 @@ public class ValidateISO4217 { + "DEM-EEK-ESP-FIM-FRF-GHC-GRD-GWP-HRK-IEP-ITL-LTL-LUF-LVL-MGF-MRO-MTL-MXV-MZM-NLG-" + "PTE-ROL-RUR-SDD-SIT-SLL-SKK-SRG-STD-TMM-TPE-TRL-VEF-UYI-USN-USS-VEB-VED-" + "XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-XPT-XSU-XTS-XUA-XXX-" - + "YUM-ZMK-ZWD-ZWN-ZWR"; + + "YUM-ZMK-ZWD-ZWL-ZWN-ZWR"; private static final String[][] extraCodes = { /* Defined in ISO 4217 list, but don't have code and minor unit info. */ {"AQ", "", "", "0"}, // Antarctica From b3bf31a0a08da679ec2fd21613243fb17b1135a9 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore <coleenp@openjdk.org> Date: Tue, 25 Jun 2024 19:50:58 +0000 Subject: [PATCH 183/471] 8333542: Breakpoint in parallel code does not work Co-authored-by: Chris Plummer <cjplummer@openjdk.org> Reviewed-by: dholmes, vlivanov --- src/hotspot/share/classfile/javaClasses.cpp | 26 +++ src/hotspot/share/classfile/javaClasses.hpp | 8 +- src/hotspot/share/classfile/vmSymbols.hpp | 1 + .../share/interpreter/linkResolver.cpp | 2 +- src/hotspot/share/oops/cpCache.cpp | 45 +++- src/hotspot/share/oops/instanceKlass.cpp | 209 ++++++++---------- src/hotspot/share/oops/instanceKlass.hpp | 64 +++--- src/hotspot/share/runtime/sharedRuntime.cpp | 2 +- src/hotspot/share/runtime/synchronizer.cpp | 10 + src/hotspot/share/runtime/synchronizer.hpp | 6 + src/hotspot/share/runtime/vframe.cpp | 5 +- src/hotspot/share/runtime/vmStructs.cpp | 2 +- src/hotspot/share/services/heapDumper.cpp | 16 ++ .../sun/jvm/hotspot/oops/InstanceKlass.java | 5 - .../TestThreadDumpClassInitMonitor.java | 7 +- .../com/sun/jdi/BreakpointOnClassPrepare.java | 156 +++++++++++++ 16 files changed, 387 insertions(+), 177 deletions(-) create mode 100644 test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp index 5a3fe239324ea..4d3aac1598e01 100644 --- a/src/hotspot/share/classfile/javaClasses.cpp +++ b/src/hotspot/share/classfile/javaClasses.cpp @@ -788,6 +788,7 @@ int java_lang_Class::_class_loader_offset; int java_lang_Class::_module_offset; int java_lang_Class::_protection_domain_offset; int java_lang_Class::_component_mirror_offset; +int java_lang_Class::_init_lock_offset; int java_lang_Class::_signers_offset; int java_lang_Class::_name_offset; int java_lang_Class::_source_file_offset; @@ -911,6 +912,12 @@ void java_lang_Class::initialize_mirror_fields(Klass* k, Handle protection_domain, Handle classData, TRAPS) { + // Allocate a simple java object for a lock. + // This needs to be a java object because during class initialization + // it can be held across a java call. + typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK); + set_init_lock(mirror(), r); + // Set protection domain also set_protection_domain(mirror(), protection_domain()); @@ -1132,6 +1139,10 @@ bool java_lang_Class::restore_archived_mirror(Klass *k, if (!k->is_array_klass()) { // - local static final fields with initial values were initialized at dump time + // create the init_lock + typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false)); + set_init_lock(mirror(), r); + if (protection_domain.not_null()) { set_protection_domain(mirror(), protection_domain()); } @@ -1196,6 +1207,15 @@ oop java_lang_Class::component_mirror(oop java_class) { return java_class->obj_field(_component_mirror_offset); } +oop java_lang_Class::init_lock(oop java_class) { + assert(_init_lock_offset != 0, "must be set"); + return java_class->obj_field(_init_lock_offset); +} +void java_lang_Class::set_init_lock(oop java_class, oop init_lock) { + assert(_init_lock_offset != 0, "must be set"); + java_class->obj_field_put(_init_lock_offset, init_lock); +} + objArrayOop java_lang_Class::signers(oop java_class) { assert(_signers_offset != 0, "must be set"); return (objArrayOop)java_class->obj_field(_signers_offset); @@ -1415,12 +1435,18 @@ void java_lang_Class::compute_offsets() { InstanceKlass* k = vmClasses::Class_klass(); CLASS_FIELDS_DO(FIELD_COMPUTE_OFFSET); + // Init lock is a C union with component_mirror. Only instanceKlass mirrors have + // init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops + // GC treats them the same. + _init_lock_offset = _component_mirror_offset; + CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); } #if INCLUDE_CDS void java_lang_Class::serialize_offsets(SerializeClosure* f) { f->do_bool(&_offsets_computed); + f->do_u4((u4*)&_init_lock_offset); CLASS_FIELDS_DO(FIELD_SERIALIZE_OFFSET); diff --git a/src/hotspot/share/classfile/javaClasses.hpp b/src/hotspot/share/classfile/javaClasses.hpp index e3bb453ae0ae4..90095545110d1 100644 --- a/src/hotspot/share/classfile/javaClasses.hpp +++ b/src/hotspot/share/classfile/javaClasses.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -226,6 +226,7 @@ class java_lang_Class : AllStatic { static int _static_oop_field_count_offset; static int _protection_domain_offset; + static int _init_lock_offset; static int _signers_offset; static int _class_loader_offset; static int _module_offset; @@ -240,6 +241,7 @@ class java_lang_Class : AllStatic { static GrowableArray<Klass*>* _fixup_mirror_list; static GrowableArray<Klass*>* _fixup_module_field_list; + static void set_init_lock(oop java_class, oop init_lock); static void set_protection_domain(oop java_class, oop protection_domain); static void set_class_loader(oop java_class, oop class_loader); static void set_component_mirror(oop java_class, oop comp_mirror); @@ -292,6 +294,10 @@ class java_lang_Class : AllStatic { // Support for embedded per-class oops static oop protection_domain(oop java_class); + static oop init_lock(oop java_class); + static void clear_init_lock(oop java_class) { + set_init_lock(java_class, nullptr); + } static oop component_mirror(oop java_class); static objArrayOop signers(oop java_class); static void set_signers(oop java_class, objArrayOop signers); diff --git a/src/hotspot/share/classfile/vmSymbols.hpp b/src/hotspot/share/classfile/vmSymbols.hpp index 39340243bc4b8..8d1ae20eac07c 100644 --- a/src/hotspot/share/classfile/vmSymbols.hpp +++ b/src/hotspot/share/classfile/vmSymbols.hpp @@ -557,6 +557,7 @@ class SerializeClosure; template(bool_array_signature, "[Z") \ template(byte_array_signature, "[B") \ template(char_array_signature, "[C") \ + template(int_array_signature, "[I") \ template(runnable_signature, "Ljava/lang/Runnable;") \ template(continuation_signature, "Ljdk/internal/vm/Continuation;") \ template(continuationscope_signature, "Ljdk/internal/vm/ContinuationScope;") \ diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp index 1fe715f975712..2c7decfa714a2 100644 --- a/src/hotspot/share/interpreter/linkResolver.cpp +++ b/src/hotspot/share/interpreter/linkResolver.cpp @@ -1824,7 +1824,7 @@ void LinkResolver::resolve_invokedynamic(CallInfo& result, const constantPoolHan // the interpreter or runtime performs a serialized check of // the relevant ResolvedIndyEntry::method field. This is done by the caller // of this method, via CPC::set_dynamic_call, which uses - // a lock to do the final serialization of updates + // an ObjectLocker to do the final serialization of updates // to ResolvedIndyEntry state, including method. // Log dynamic info to CDS classlist. diff --git a/src/hotspot/share/oops/cpCache.cpp b/src/hotspot/share/oops/cpCache.cpp index c16ba3b76f77a..95c3b8edaf5e1 100644 --- a/src/hotspot/share/oops/cpCache.cpp +++ b/src/hotspot/share/oops/cpCache.cpp @@ -56,6 +56,7 @@ #include "runtime/atomic.hpp" #include "runtime/handles.inline.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/vm_version.hpp" #include "utilities/macros.hpp" @@ -174,7 +175,7 @@ void ConstantPoolCache::set_direct_or_vtable_call(Bytecodes::Code invoke_code, } if (invoke_code == Bytecodes::_invokestatic) { assert(method->method_holder()->is_initialized() || - method->method_holder()->is_init_thread(JavaThread::current()), + method->method_holder()->is_reentrant_initialization(JavaThread::current()), "invalid class initialization state for invoke_static"); if (!VM_Version::supports_fast_class_init_checks() && method->needs_clinit_barrier()) { @@ -269,11 +270,20 @@ ResolvedMethodEntry* ConstantPoolCache::set_method_handle(int method_index, cons // A losing writer waits on the lock until the winner writes the method and leaves // the lock, so that when the losing writer returns, he can use the linked // cache entry. + // Lock fields to write Bytecodes::Code invoke_code = Bytecodes::_invokehandle; - MutexLocker ml(constant_pool()->pool_holder()->init_monitor()); - ResolvedMethodEntry* method_entry = resolved_method_entry_at(method_index); + JavaThread* current = JavaThread::current(); + objArrayHandle resolved_references(current, constant_pool()->resolved_references()); + // Use the resolved_references() lock for this cpCache entry. + // resolved_references are created for all classes with Invokedynamic, MethodHandle + // or MethodType constant pool cache entries. + assert(resolved_references() != nullptr, + "a resolved_references array should have been created for this class"); + ObjectLocker ol(resolved_references, current); + + ResolvedMethodEntry* method_entry = resolved_method_entry_at(method_index); if (method_entry->is_resolved(invoke_code)) { return method_entry; } @@ -311,7 +321,6 @@ ResolvedMethodEntry* ConstantPoolCache::set_method_handle(int method_index, cons // Store appendix, if any. if (has_appendix) { const int appendix_index = method_entry->resolved_references_index(); - objArrayOop resolved_references = constant_pool()->resolved_references(); assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob"); assert(resolved_references->obj_at(appendix_index) == nullptr, "init just once"); resolved_references->obj_at_put(appendix_index, appendix()); @@ -587,7 +596,14 @@ bool ConstantPoolCache::save_and_throw_indy_exc( assert(PENDING_EXCEPTION->is_a(vmClasses::LinkageError_klass()), "No LinkageError exception"); - MutexLocker ml(THREAD, cpool->pool_holder()->init_monitor()); + // Use the resolved_references() lock for this cpCache entry. + // resolved_references are created for all classes with Invokedynamic, MethodHandle + // or MethodType constant pool cache entries. + JavaThread* current = THREAD; + objArrayHandle resolved_references(current, cpool->resolved_references()); + assert(resolved_references() != nullptr, + "a resolved_references array should have been created for this class"); + ObjectLocker ol(resolved_references, current); // if the indy_info is resolved or the indy_resolution_failed flag is set then another // thread either succeeded in resolving the method or got a LinkageError @@ -610,11 +626,21 @@ bool ConstantPoolCache::save_and_throw_indy_exc( oop ConstantPoolCache::set_dynamic_call(const CallInfo &call_info, int index) { ResourceMark rm; - MutexLocker ml(constant_pool()->pool_holder()->init_monitor()); + + // Use the resolved_references() lock for this cpCache entry. + // resolved_references are created for all classes with Invokedynamic, MethodHandle + // or MethodType constant pool cache entries. + JavaThread* current = JavaThread::current(); + constantPoolHandle cp(current, constant_pool()); + + objArrayHandle resolved_references(current, cp->resolved_references()); + assert(resolved_references() != nullptr, + "a resolved_references array should have been created for this class"); + ObjectLocker ol(resolved_references, current); assert(index >= 0, "Indy index must be positive at this point"); if (resolved_indy_entry_at(index)->method() != nullptr) { - return constant_pool()->resolved_reference_from_indy(index); + return cp->resolved_reference_from_indy(index); } if (resolved_indy_entry_at(index)->resolution_failed()) { @@ -622,9 +648,7 @@ oop ConstantPoolCache::set_dynamic_call(const CallInfo &call_info, int index) { // resolution. Ignore our success and throw their exception. guarantee(index >= 0, "Invalid indy index"); int encoded_index = ResolutionErrorTable::encode_indy_index(index); - JavaThread* THREAD = JavaThread::current(); // For exception macros. - constantPoolHandle cp(THREAD, constant_pool()); - ConstantPool::throw_resolution_error(cp, encoded_index, THREAD); + ConstantPool::throw_resolution_error(cp, encoded_index, current); return nullptr; } @@ -648,7 +672,6 @@ oop ConstantPoolCache::set_dynamic_call(const CallInfo &call_info, int index) { if (has_appendix) { const int appendix_index = resolved_indy_entry_at(index)->resolved_references_index(); - objArrayOop resolved_references = constant_pool()->resolved_references(); assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob"); assert(resolved_references->obj_at(appendix_index) == nullptr, "init just once"); resolved_references->obj_at_put(appendix_index, appendix()); diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index 8a716c8f9f6a2..328c2edbb9fb5 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -86,6 +86,7 @@ #include "runtime/orderAccess.hpp" #include "runtime/os.inline.hpp" #include "runtime/reflection.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/threads.hpp" #include "services/classLoadingService.hpp" #include "services/finalizerService.hpp" @@ -497,9 +498,6 @@ Array<int>* InstanceKlass::create_new_default_vtable_indices(int len, TRAPS) { return vtable_indices; } -static Monitor* create_init_monitor(const char* name) { - return new Monitor(Mutex::safepoint, name); -} InstanceKlass::InstanceKlass() { assert(CDSConfig::is_dumping_static_archive() || CDSConfig::is_using_archive(), "only for CDS"); @@ -517,7 +515,6 @@ InstanceKlass::InstanceKlass(const ClassFileParser& parser, KlassKind kind, Refe _nest_host_index(0), _init_state(allocated), _reference_type(reference_type), - _init_monitor(create_init_monitor("InstanceKlassInitMonitor_lock")), _init_thread(nullptr) { set_vtable_length(parser.vtable_size()); @@ -745,6 +742,28 @@ objArrayOop InstanceKlass::signers() const { return java_lang_Class::signers(java_mirror()); } +oop InstanceKlass::init_lock() const { + // return the init lock from the mirror + oop lock = java_lang_Class::init_lock(java_mirror()); + // Prevent reordering with any access of initialization state + OrderAccess::loadload(); + assert(lock != nullptr || !is_not_initialized(), // initialized or in_error state + "only fully initialized state can have a null lock"); + return lock; +} + +// Set the initialization lock to null so the object can be GC'ed. Any racing +// threads to get this lock will see a null lock and will not lock. +// That's okay because they all check for initialized state after getting +// the lock and return. +void InstanceKlass::fence_and_clear_init_lock() { + // make sure previous stores are all done, notably the init_state. + OrderAccess::storestore(); + java_lang_Class::clear_init_lock(java_mirror()); + assert(!is_not_initialized(), "class must be initialized now"); +} + + // See "The Virtual Machine Specification" section 2.16.5 for a detailed explanation of the class initialization // process. The step comments refers to the procedure described in that section. // Note: implementation moved to static method to expose the this pointer. @@ -772,49 +791,6 @@ void InstanceKlass::link_class(TRAPS) { } } -void InstanceKlass::check_link_state_and_wait(JavaThread* current) { - MonitorLocker ml(current, _init_monitor); - - bool debug_logging_enabled = log_is_enabled(Debug, class, init); - - // Another thread is linking this class, wait. - while (is_being_linked() && !is_init_thread(current)) { - if (debug_logging_enabled) { - ResourceMark rm(current); - log_debug(class, init)("Thread \"%s\" waiting for linking of %s by thread \"%s\"", - current->name(), external_name(), init_thread_name()); - } - ml.wait(); - } - - // This thread is recursively linking this class, continue - if (is_being_linked() && is_init_thread(current)) { - if (debug_logging_enabled) { - ResourceMark rm(current); - log_debug(class, init)("Thread \"%s\" recursively linking %s", - current->name(), external_name()); - } - return; - } - - // If this class wasn't linked already, set state to being_linked - if (!is_linked()) { - if (debug_logging_enabled) { - ResourceMark rm(current); - log_debug(class, init)("Thread \"%s\" linking %s", - current->name(), external_name()); - } - set_init_state(being_linked); - set_init_thread(current); - } else { - if (debug_logging_enabled) { - ResourceMark rm(current); - log_debug(class, init)("Thread \"%s\" found %s already linked", - current->name(), external_name()); - } - } -} - // Called to verify that a class can link during initialization, without // throwing a VerifyError. bool InstanceKlass::link_class_or_fail(TRAPS) { @@ -893,8 +869,9 @@ bool InstanceKlass::link_class_impl(TRAPS) { // verification & rewriting { - LockLinkState init_lock(this, jt); - + HandleMark hm(THREAD); + Handle h_init_lock(THREAD, init_lock()); + ObjectLocker ol(h_init_lock, jt); // rewritten will have been set if loader constraint error found // on an earlier link attempt // don't verify or rewrite if already rewritten @@ -952,7 +929,21 @@ bool InstanceKlass::link_class_impl(TRAPS) { // In case itable verification is ever added. // itable().verify(tty, true); #endif - set_initialization_state_and_notify(linked, THREAD); + if (UseVtableBasedCHA && Universe::is_fully_initialized()) { + DeoptimizationScope deopt_scope; + { + // Now mark all code that assumes the class is not linked. + // Set state under the Compile_lock also. + MutexLocker ml(THREAD, Compile_lock); + + set_init_state(linked); + CodeCache::mark_dependents_on(&deopt_scope, this); + } + // Perform the deopt handshake outside Compile_lock. + deopt_scope.deoptimize_marked(); + } else { + set_init_state(linked); + } if (JvmtiExport::should_post_class_prepare()) { JvmtiExport::post_class_prepare(THREAD, this); } @@ -1084,7 +1075,6 @@ void InstanceKlass::initialize_impl(TRAPS) { DTRACE_CLASSINIT_PROBE(required, -1); bool wait = false; - bool throw_error = false; JavaThread* jt = THREAD; @@ -1093,24 +1083,27 @@ void InstanceKlass::initialize_impl(TRAPS) { // refer to the JVM book page 47 for description of steps // Step 1 { - MonitorLocker ml(jt, _init_monitor); + Handle h_init_lock(THREAD, init_lock()); + ObjectLocker ol(h_init_lock, jt); // Step 2 - while (is_being_initialized() && !is_init_thread(jt)) { + // If we were to use wait() instead of waitInterruptibly() then + // we might end up throwing IE from link/symbol resolution sites + // that aren't expected to throw. This would wreak havoc. See 6320309. + while (is_being_initialized() && !is_reentrant_initialization(jt)) { if (debug_logging_enabled) { ResourceMark rm(jt); log_debug(class, init)("Thread \"%s\" waiting for initialization of %s by thread \"%s\"", jt->name(), external_name(), init_thread_name()); } - wait = true; jt->set_class_to_be_initialized(this); - ml.wait(); + ol.wait_uninterruptibly(jt); jt->set_class_to_be_initialized(nullptr); } // Step 3 - if (is_being_initialized() && is_init_thread(jt)) { + if (is_being_initialized() && is_reentrant_initialization(jt)) { if (debug_logging_enabled) { ResourceMark rm(jt); log_debug(class, init)("Thread \"%s\" recursively initializing %s", @@ -1138,7 +1131,19 @@ void InstanceKlass::initialize_impl(TRAPS) { log_debug(class, init)("Thread \"%s\" found %s is in error state", jt->name(), external_name()); } - throw_error = true; + + DTRACE_CLASSINIT_PROBE_WAIT(erroneous, -1, wait); + ResourceMark rm(THREAD); + Handle cause(THREAD, get_initialization_error(THREAD)); + + stringStream ss; + ss.print("Could not initialize class %s", external_name()); + if (cause.is_null()) { + THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), ss.as_string()); + } else { + THROW_MSG_CAUSE(vmSymbols::java_lang_NoClassDefFoundError(), + ss.as_string(), cause); + } } else { // Step 6 @@ -1152,22 +1157,6 @@ void InstanceKlass::initialize_impl(TRAPS) { } } - // Throw error outside lock - if (throw_error) { - DTRACE_CLASSINIT_PROBE_WAIT(erroneous, -1, wait); - ResourceMark rm(THREAD); - Handle cause(THREAD, get_initialization_error(THREAD)); - - stringStream ss; - ss.print("Could not initialize class %s", external_name()); - if (cause.is_null()) { - THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), ss.as_string()); - } else { - THROW_MSG_CAUSE(vmSymbols::java_lang_NoClassDefFoundError(), - ss.as_string(), cause); - } - } - // Step 7 // Next, if C is a class rather than an interface, initialize it's super class and super // interfaces. @@ -1225,7 +1214,7 @@ void InstanceKlass::initialize_impl(TRAPS) { // Step 9 if (!HAS_PENDING_EXCEPTION) { - set_initialization_state_and_notify(fully_initialized, THREAD); + set_initialization_state_and_notify(fully_initialized, CHECK); debug_only(vtable().verify(tty, true);) } else { @@ -1258,43 +1247,26 @@ void InstanceKlass::initialize_impl(TRAPS) { } -void InstanceKlass::set_initialization_state_and_notify(ClassState state, JavaThread* current) { - MonitorLocker ml(current, _init_monitor); - - if (state == linked && UseVtableBasedCHA && Universe::is_fully_initialized()) { - DeoptimizationScope deopt_scope; - { - // Now mark all code that assumes the class is not linked. - // Set state under the Compile_lock also. - MutexLocker ml(current, Compile_lock); - - set_init_thread(nullptr); // reset _init_thread before changing _init_state - set_init_state(state); - - CodeCache::mark_dependents_on(&deopt_scope, this); - } - // Perform the deopt handshake outside Compile_lock. - deopt_scope.deoptimize_marked(); +void InstanceKlass::set_initialization_state_and_notify(ClassState state, TRAPS) { + Handle h_init_lock(THREAD, init_lock()); + if (h_init_lock() != nullptr) { + ObjectLocker ol(h_init_lock, THREAD); + set_init_thread(nullptr); // reset _init_thread before changing _init_state + set_init_state(state); + fence_and_clear_init_lock(); + ol.notify_all(CHECK); } else { + assert(h_init_lock() != nullptr, "The initialization state should never be set twice"); set_init_thread(nullptr); // reset _init_thread before changing _init_state set_init_state(state); } - ml.notify_all(); } // Update hierarchy. This is done before the new klass has been added to the SystemDictionary. The Compile_lock // is grabbed, to ensure that the compiler is not using the class hierarchy. -void InstanceKlass::add_to_hierarchy(JavaThread* current) { +void InstanceKlass::add_to_hierarchy_impl(JavaThread* current) { assert(!SafepointSynchronize::is_at_safepoint(), "must NOT be at safepoint"); - // In case we are not using CHA based vtables we need to make sure the loaded - // deopt is completed before anyone links this class. - // Linking is done with _init_monitor held, by loading and deopting with it - // held we make sure the deopt is completed before linking. - if (!UseVtableBasedCHA) { - init_monitor()->lock(); - } - DeoptimizationScope deopt_scope; { MutexLocker ml(current, Compile_lock); @@ -1316,12 +1288,26 @@ void InstanceKlass::add_to_hierarchy(JavaThread* current) { } // Perform the deopt handshake outside Compile_lock. deopt_scope.deoptimize_marked(); +} - if (!UseVtableBasedCHA) { - init_monitor()->unlock(); +void InstanceKlass::add_to_hierarchy(JavaThread* current) { + + if (UseVtableBasedCHA || !Universe::is_fully_initialized()) { + add_to_hierarchy_impl(current); + } else { + // In case we are not using CHA based vtables we need to make sure the loaded + // deopt is completed before anyone links this class. + // Linking is done with init_lock held, by loading and deopting with it + // held we make sure the deopt is completed before linking. + Handle h_init_lock(current, init_lock()); + ObjectLocker ol(h_init_lock, current); + add_to_hierarchy_impl(current); + + // This doesn't need a notify because the wait is only on the class initialization path. } } + InstanceKlass* InstanceKlass::implementor() const { InstanceKlass* volatile* ik = adr_implementor(); if (ik == nullptr) { @@ -2590,7 +2576,6 @@ void InstanceKlass::remove_unshareable_info() { _nest_host = nullptr; init_shared_package_entry(); _dep_context_last_cleaned = 0; - _init_monitor = nullptr; remove_unshareable_flags(); } @@ -2694,9 +2679,6 @@ void InstanceKlass::restore_unshareable_info(ClassLoaderData* loader_data, Handl if (DiagnoseSyncOnValueBasedClasses && has_value_based_class_annotation()) { set_is_value_based(); } - - // restore the monitor - _init_monitor = create_init_monitor("InstanceKlassInitMonitorRestored_lock"); } // Check if a class or any of its supertypes has a version older than 50. @@ -2792,9 +2774,6 @@ void InstanceKlass::release_C_heap_structures(bool release_sub_metadata) { methods_do(method_release_C_heap_structures); } - // Destroy the init_monitor - delete _init_monitor; - // Deallocate oop map cache if (_oop_map_cache != nullptr) { delete _oop_map_cache; @@ -3486,7 +3465,7 @@ nmethod* InstanceKlass::lookup_osr_nmethod(const Method* m, int bci, int comp_le #define BULLET " - " static const char* state_names[] = { - "allocated", "loaded", "being_linked", "linked", "being_initialized", "fully_initialized", "initialization_error" + "allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error" }; static void print_vtable(intptr_t* start, int len, outputStream* st) { @@ -4136,17 +4115,13 @@ void JNIid::verify(Klass* holder) { } void InstanceKlass::set_init_state(ClassState state) { - if (state > loaded) { - assert_lock_strong(_init_monitor); - } #ifdef ASSERT bool good_state = is_shared() ? (_init_state <= state) : (_init_state < state); - bool link_failed = _init_state == being_linked && state == loaded; - assert(good_state || state == allocated || link_failed, "illegal state transition"); + assert(good_state || state == allocated, "illegal state transition"); #endif assert(_init_thread == nullptr, "should be cleared before state change"); - Atomic::store(&_init_state, state); + _init_state = state; } #if INCLUDE_JVMTI diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp index 27c97e38b62c2..fe281f9514805 100644 --- a/src/hotspot/share/oops/instanceKlass.hpp +++ b/src/hotspot/share/oops/instanceKlass.hpp @@ -152,7 +152,6 @@ class InstanceKlass: public Klass { enum ClassState : u1 { allocated, // allocated (but not yet linked) loaded, // loaded and inserted in class hierarchy (but not linked yet) - being_linked, // currently running verifier and rewriter linked, // successfully linked/verified (but not initialized yet) being_initialized, // currently running class initializer fully_initialized, // initialized (successful final state) @@ -226,14 +225,20 @@ class InstanceKlass: public Klass { volatile u2 _idnum_allocated_count; // JNI/JVMTI: increments with the addition of methods, old ids don't change + // _is_marked_dependent can be set concurrently, thus cannot be part of the + // _misc_flags. + bool _is_marked_dependent; // used for marking during flushing and deoptimization + + // Class states are defined as ClassState (see above). + // Place the _init_state here to utilize the unused 2-byte after + // _idnum_allocated_count. volatile ClassState _init_state; // state of class - u1 _reference_type; // reference type + u1 _reference_type; // reference type // State is set either at parse time or while executing, atomically to not disturb other state InstanceKlassFlags _misc_flags; - Monitor* _init_monitor; // mutual exclusion to _init_state and _init_thread. JavaThread* volatile _init_thread; // Pointer to current thread doing initialization (to handle recursive initialization) OopMapCache* volatile _oop_map_cache; // OopMapCache for all methods in the klass (allocated lazily) @@ -497,41 +502,23 @@ class InstanceKlass: public Klass { TRAPS); JavaThread* init_thread() { return Atomic::load(&_init_thread); } - // We can safely access the name as long as we hold the _init_monitor. const char* init_thread_name() { - assert(_init_monitor->owned_by_self(), "Must hold _init_monitor here"); return init_thread()->name_raw(); } public: // initialization state - bool is_loaded() const { return init_state() >= loaded; } - bool is_linked() const { return init_state() >= linked; } - bool is_being_linked() const { return init_state() == being_linked; } - bool is_initialized() const { return init_state() == fully_initialized; } - bool is_not_initialized() const { return init_state() < being_initialized; } - bool is_being_initialized() const { return init_state() == being_initialized; } - bool is_in_error_state() const { return init_state() == initialization_error; } - bool is_init_thread(JavaThread *thread) { return thread == init_thread(); } - ClassState init_state() const { return Atomic::load(&_init_state); } + bool is_loaded() const { return _init_state >= loaded; } + bool is_linked() const { return _init_state >= linked; } + bool is_initialized() const { return _init_state == fully_initialized; } + bool is_not_initialized() const { return _init_state < being_initialized; } + bool is_being_initialized() const { return _init_state == being_initialized; } + bool is_in_error_state() const { return _init_state == initialization_error; } + bool is_reentrant_initialization(Thread *thread) { return thread == _init_thread; } + ClassState init_state() const { return _init_state; } const char* init_state_name() const; bool is_rewritten() const { return _misc_flags.rewritten(); } - class LockLinkState : public StackObj { - InstanceKlass* _ik; - JavaThread* _current; - public: - LockLinkState(InstanceKlass* ik, JavaThread* current) : _ik(ik), _current(current) { - ik->check_link_state_and_wait(current); - } - ~LockLinkState() { - if (!_ik->is_linked()) { - // Reset to loaded if linking failed. - _ik->set_initialization_state_and_notify(loaded, _current); - } - } - }; - // is this a sealed class bool is_sealed() const; @@ -829,7 +816,7 @@ class InstanceKlass: public Klass { // initialization void call_class_initializer(TRAPS); - void set_initialization_state_and_notify(ClassState state, JavaThread* current); + void set_initialization_state_and_notify(ClassState state, TRAPS); // OopMapCache support OopMapCache* oop_map_cache() { return _oop_map_cache; } @@ -841,6 +828,10 @@ class InstanceKlass: public Klass { void set_jni_ids(JNIid* ids) { _jni_ids = ids; } JNIid* jni_id_for(int offset); + private: + void add_to_hierarchy_impl(JavaThread* current); + + public: // maintenance of deoptimization dependencies inline DependencyContext dependencies(); void mark_dependent_nmethods(DeoptimizationScope* deopt_scope, KlassDepChange& changes); @@ -1055,7 +1046,7 @@ class InstanceKlass: public Klass { public: u2 idnum_allocated_count() const { return _idnum_allocated_count; } - private: +private: // initialization state void set_init_state(ClassState state); void set_rewritten() { _misc_flags.set_rewritten(true); } @@ -1072,6 +1063,12 @@ class InstanceKlass: public Klass { jmethodID update_jmethod_id(jmethodID* jmeths, Method* method, int idnum); public: + // Lock for (1) initialization; (2) access to the ConstantPool of this class. + // Must be one per class and it has to be a VM internal object so java code + // cannot lock it (like the mirror). + // It has to be an object not a Mutex because it's held through java calls. + oop init_lock() const; + // Returns the array class for the n'th dimension virtual ArrayKlass* array_klass(int n, TRAPS); virtual ArrayKlass* array_klass_or_null(int n); @@ -1081,10 +1078,9 @@ class InstanceKlass: public Klass { virtual ArrayKlass* array_klass_or_null(); static void clean_initialization_error_table(); - - Monitor* init_monitor() const { return _init_monitor; } private: - void check_link_state_and_wait(JavaThread* current); + void fence_and_clear_init_lock(); + bool link_class_impl (TRAPS); bool verify_code (TRAPS); void initialize_impl (TRAPS); diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp index f794a15ac070b..0e6d367586b9d 100644 --- a/src/hotspot/share/runtime/sharedRuntime.cpp +++ b/src/hotspot/share/runtime/sharedRuntime.cpp @@ -1336,7 +1336,7 @@ methodHandle SharedRuntime::resolve_helper(bool is_virtual, bool is_optimized, T if (invoke_code == Bytecodes::_invokestatic) { assert(callee_method->method_holder()->is_initialized() || - callee_method->method_holder()->is_init_thread(current), + callee_method->method_holder()->is_reentrant_initialization(current), "invalid class initialization state for invoke_static"); if (!VM_Version::supports_fast_class_init_checks() && callee_method->needs_clinit_barrier()) { // In order to keep class initialization check, do not patch call diff --git a/src/hotspot/share/runtime/synchronizer.cpp b/src/hotspot/share/runtime/synchronizer.cpp index 27b4163238aa9..047f6703b545c 100644 --- a/src/hotspot/share/runtime/synchronizer.cpp +++ b/src/hotspot/share/runtime/synchronizer.cpp @@ -821,6 +821,16 @@ int ObjectSynchronizer::wait(Handle obj, jlong millis, TRAPS) { return ret_code; } +void ObjectSynchronizer::waitUninterruptibly(Handle obj, jlong millis, TRAPS) { + if (millis < 0) { + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative"); + } + ObjectSynchronizer::inflate(THREAD, + obj(), + inflate_cause_wait)->wait(millis, false, THREAD); +} + + void ObjectSynchronizer::notify(Handle obj, TRAPS) { JavaThread* current = THREAD; diff --git a/src/hotspot/share/runtime/synchronizer.hpp b/src/hotspot/share/runtime/synchronizer.hpp index 786defcbca4de..7406af678e0e7 100644 --- a/src/hotspot/share/runtime/synchronizer.hpp +++ b/src/hotspot/share/runtime/synchronizer.hpp @@ -119,6 +119,11 @@ class ObjectSynchronizer : AllStatic { static bool quick_notify(oopDesc* obj, JavaThread* current, bool All); static bool quick_enter(oop obj, JavaThread* current, BasicLock* Lock); + // Special internal-use-only method for use by JVM infrastructure + // that needs to wait() on a java-level object but that can't risk + // throwing unexpected InterruptedExecutionExceptions. + static void waitUninterruptibly(Handle obj, jlong Millis, TRAPS); + // Inflate light weight monitor to heavy weight monitor static ObjectMonitor* inflate(Thread* current, oop obj, const InflateCause cause); // Used to inflate a monitor as if it was done from the thread JavaThread. @@ -225,6 +230,7 @@ class ObjectLocker : public StackObj { // Monitor behavior void wait(TRAPS) { ObjectSynchronizer::wait(_obj, 0, CHECK); } // wait forever + void wait_uninterruptibly(TRAPS) { ObjectSynchronizer::waitUninterruptibly(_obj, 0, CHECK); } // wait forever void notify_all(TRAPS) { ObjectSynchronizer::notifyall(_obj, CHECK); } }; diff --git a/src/hotspot/share/runtime/vframe.cpp b/src/hotspot/share/runtime/vframe.cpp index ccb90c427b05a..be2e275bf7fc3 100644 --- a/src/hotspot/share/runtime/vframe.cpp +++ b/src/hotspot/share/runtime/vframe.cpp @@ -205,8 +205,9 @@ void javaVFrame::print_lock_info_on(outputStream* st, int frame_count) { Klass* k = obj->klass(); st->print_cr("\t- %s <" INTPTR_FORMAT "> (a %s)", "parking to wait for ", p2i(obj), k->external_name()); } - else if (thread()->osthread()->get_state() == CONDVAR_WAIT) { - // We are waiting on the native class initialization monitor. + else if (thread()->osthread()->get_state() == OBJECT_WAIT) { + // We are waiting on an Object monitor but Object.wait() isn't the + // top-frame, so we should be waiting on a Class initialization monitor. InstanceKlass* k = thread()->class_to_be_initialized(); if (k != nullptr) { st->print_cr("\t- waiting on the Class initialization monitor for %s", k->external_name()); diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index 8ff766af128b7..4b6381bd05ebd 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -246,6 +246,7 @@ nonstatic_field(InstanceKlass, _nonstatic_oop_map_size, int) \ volatile_nonstatic_field(InstanceKlass, _init_state, InstanceKlass::ClassState) \ volatile_nonstatic_field(InstanceKlass, _init_thread, JavaThread*) \ + nonstatic_field(InstanceKlass, _is_marked_dependent, bool) \ nonstatic_field(InstanceKlass, _itable_len, int) \ nonstatic_field(InstanceKlass, _nest_host_index, u2) \ nonstatic_field(InstanceKlass, _reference_type, u1) \ @@ -2163,7 +2164,6 @@ \ declare_constant(InstanceKlass::allocated) \ declare_constant(InstanceKlass::loaded) \ - declare_constant(InstanceKlass::being_linked) \ declare_constant(InstanceKlass::linked) \ declare_constant(InstanceKlass::being_initialized) \ declare_constant(InstanceKlass::fully_initialized) \ diff --git a/src/hotspot/share/services/heapDumper.cpp b/src/hotspot/share/services/heapDumper.cpp index 6f113cfca95ca..5b3749381a01b 100644 --- a/src/hotspot/share/services/heapDumper.cpp +++ b/src/hotspot/share/services/heapDumper.cpp @@ -1089,6 +1089,14 @@ u4 DumperSupport::get_static_fields_size(InstanceKlass* ik, u2& field_count) { } } + // Also provide a pointer to the init_lock if present, so there aren't unreferenced int[0] + // arrays. + oop init_lock = ik->init_lock(); + if (init_lock != nullptr) { + field_count++; + size += sizeof(address); + } + // We write the value itself plus a name and a one byte type tag per field. return checked_cast<u4>(size + field_count * (sizeof(address) + 1)); } @@ -1126,6 +1134,14 @@ void DumperSupport::dump_static_fields(AbstractDumpWriter* writer, Klass* k) { prev = prev->previous_versions(); } } + + // Add init lock to the end if the class is not yet initialized + oop init_lock = ik->init_lock(); + if (init_lock != nullptr) { + writer->write_symbolID(vmSymbols::init_lock_name()); // name + writer->write_u1(sig2tag(vmSymbols::int_array_signature())); // type + writer->write_objectID(init_lock); + } } // dump the raw values of the instance fields of the given object diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java index b13171745bba3..0f05b15af7636 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java @@ -57,7 +57,6 @@ public void update(Observable o, Object data) { // ClassState constants private static int CLASS_STATE_ALLOCATED; private static int CLASS_STATE_LOADED; - private static int CLASS_STATE_BEING_LINKED; private static int CLASS_STATE_LINKED; private static int CLASS_STATE_BEING_INITIALIZED; private static int CLASS_STATE_FULLY_INITIALIZED; @@ -101,7 +100,6 @@ private static synchronized void initialize(TypeDataBase db) throws WrongTypeExc // read ClassState constants CLASS_STATE_ALLOCATED = db.lookupIntConstant("InstanceKlass::allocated").intValue(); CLASS_STATE_LOADED = db.lookupIntConstant("InstanceKlass::loaded").intValue(); - CLASS_STATE_BEING_LINKED = db.lookupIntConstant("InstanceKlass::being_linked").intValue(); CLASS_STATE_LINKED = db.lookupIntConstant("InstanceKlass::linked").intValue(); CLASS_STATE_BEING_INITIALIZED = db.lookupIntConstant("InstanceKlass::being_initialized").intValue(); CLASS_STATE_FULLY_INITIALIZED = db.lookupIntConstant("InstanceKlass::fully_initialized").intValue(); @@ -158,7 +156,6 @@ public InstanceKlass(Address addr) { public static class ClassState { public static final ClassState ALLOCATED = new ClassState("allocated"); public static final ClassState LOADED = new ClassState("loaded"); - public static final ClassState BEING_LINKED = new ClassState("beingLinked"); public static final ClassState LINKED = new ClassState("linked"); public static final ClassState BEING_INITIALIZED = new ClassState("beingInitialized"); public static final ClassState FULLY_INITIALIZED = new ClassState("fullyInitialized"); @@ -182,8 +179,6 @@ public ClassState getInitState() { return ClassState.ALLOCATED; } else if (state == CLASS_STATE_LOADED) { return ClassState.LOADED; - } else if (state == CLASS_STATE_BEING_LINKED) { - return ClassState.BEING_LINKED; } else if (state == CLASS_STATE_LINKED) { return ClassState.LINKED; } else if (state == CLASS_STATE_BEING_INITIALIZED) { diff --git a/test/hotspot/jtreg/runtime/Thread/TestThreadDumpClassInitMonitor.java b/test/hotspot/jtreg/runtime/Thread/TestThreadDumpClassInitMonitor.java index 0154f43244e94..6260088fa3337 100644 --- a/test/hotspot/jtreg/runtime/Thread/TestThreadDumpClassInitMonitor.java +++ b/test/hotspot/jtreg/runtime/Thread/TestThreadDumpClassInitMonitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,8 +60,7 @@ public class TestThreadDumpClassInitMonitor { */ final static String TEST_THREAD = "TestThread"; final static String TEST_THREAD_ENTRY = "\"" + TEST_THREAD; - // final static String IN_OBJECT_WAIT = "in Object.wait()"; - final static String IN_CONVAR_WAIT = "waiting on condition"; + final static String IN_OBJECT_WAIT = "in Object.wait()"; final static String THREAD_STATE = "java.lang.Thread.State: RUNNABLE"; final static String THREAD_INFO = "Thread:"; // the details are not important final static String JAVATHREAD_STATE = "JavaThread state: _thread_blocked"; @@ -140,7 +139,7 @@ public static void main(String[] args) throws Throwable { continue; } foundLines++; - if (!line.contains(IN_CONVAR_WAIT)) { + if (!line.contains(IN_OBJECT_WAIT)) { throw new Error("Unexpected initial stack line: " + line); } continue; diff --git a/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java b/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java new file mode 100644 index 0000000000000..f4f1427e39b24 --- /dev/null +++ b/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8333542 + * @summary Missed breakpoint due to JVM not blocking other threads while + * delivering a ClassPrepareEvent. + * + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g BreakpointOnClassPrepare.java + * @run driver BreakpointOnClassPrepare SUSPEND_NONE + * @run driver BreakpointOnClassPrepare SUSPEND_EVENT_THREAD + * @run driver BreakpointOnClassPrepare SUSPEND_ALL + */ + +import com.sun.jdi.*; +import com.sun.jdi.event.*; +import com.sun.jdi.request.*; + +import java.util.*; + +// The debuggee spawns 50 threads that call LoadedClass.foo(). The debugger enables +// ClassPrepareEvent for LoadedClass, and sets a breakpoint on LoadedClass.foo() when +// the ClassPrepareEvent arrives. The debugger expects 50 breakpoints to be hit. +// This verifies that the thread that causes the generation of the ClassPrepareEvent +// has properly blocked all other threads from executing LoadedClass.foo() until the +// ClassPrepareEvent has been delivered. + +class LoadedClass { + static void foo(int k) { + System.out.println("HIT = " + k); // set breakpoint here + } +} + +class BreakpointOnClassPrepareTarg { + public static void main(String[] args) throws InterruptedException { + System.out.println("Start"); + Thread threads[] = new Thread[BreakpointOnClassPrepare.NUM_BREAKPOINTS]; + for (int i = 0; i < BreakpointOnClassPrepare.NUM_BREAKPOINTS; i++) { + int k = i; + Thread t = DebuggeeWrapper.newThread(() -> { + System.out.println("k = " + k); + LoadedClass.foo(k); + }); + threads[i] = t; + t.setDaemon(true); + t.setName("MyThread-" + k); + t.start(); + } + + for (int i = 0; i < BreakpointOnClassPrepare.NUM_BREAKPOINTS; i++) { + try { + Thread t = threads[i]; + t.join(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + System.out.println("Finish"); + } +} + + /********** test program **********/ + +public class BreakpointOnClassPrepare extends TestScaffold { + ClassType targetClass; + ThreadReference mainThread; + + BreakpointOnClassPrepare(String args[]) { + super(args); + } + + public static void main(String[] args) throws Exception { + new BreakpointOnClassPrepare(args).startTests(); + } + + /********** event handlers **********/ + + static final int NUM_BREAKPOINTS = 50; + int bkptCount; + BreakpointRequest bkptRequest; + + public void breakpointReached(BreakpointEvent event) { + bkptCount++; + System.out.println("Got BreakpointEvent: " + bkptCount + " for thread " + event.thread()); + } + + public void vmDisconnected(VMDisconnectEvent event) { + println("Got VMDisconnectEvent"); + } + + /********** test core **********/ + + protected void runTests() throws Exception { + /* Determine which suspend policy to use. */ + int policy; + if (args.length != 1) { + throw new RuntimeException("Invalid number of args: " + args.length); + } + String policyString = args[0]; + if (policyString.equals("SUSPEND_NONE")) { + policy = EventRequest.SUSPEND_NONE; + } else if (policyString.equals("SUSPEND_ALL")) { + policy = EventRequest.SUSPEND_ALL; + } else if (policyString.equals("SUSPEND_EVENT_THREAD")) { + policy = EventRequest.SUSPEND_EVENT_THREAD; + } else { + throw new RuntimeException("Invalid suspend policy: " + policyString); + } + + /* Stop when the target is loaded. */ + BreakpointEvent bpe = startToMain("BreakpointOnClassPrepareTarg"); + + /* Stop when "LoadedClass" is loaded. */ + EventRequestManager erm = vm().eventRequestManager(); + ClassPrepareEvent cpe = resumeToPrepareOf("LoadedClass"); + println("Got ClassPrepareEvent: " + cpe); + + /* Set a breakpoint for each time LoadedClass.foo() is called. */ + ClassType loadedClass = (ClassType)cpe.referenceType() ; + Location loc1 = findMethodLocation(loadedClass, "foo", "(I)V", 1); + bkptRequest = erm.createBreakpointRequest(loc1); + bkptRequest.setSuspendPolicy(policy); + bkptRequest.enable(); + + listenUntilVMDisconnect(); + + if (!testFailed && bkptCount == NUM_BREAKPOINTS) { + println("BreakpointOnClassPrepare: passed"); + } else { + throw new Exception("BreakpointOnClassPrepare: failed. bkptCount == " + bkptCount); + } + } +} From f101e153cee68750fcf1f12da10e29806875b522 Mon Sep 17 00:00:00 2001 From: Volodymyr Paprotski <volodymyr.paprotski@intel.com> Date: Tue, 25 Jun 2024 22:31:39 +0000 Subject: [PATCH 184/471] 8333583: Crypto-XDH.generateSecret regression after JDK-8329538 Reviewed-by: sviswanathan, kvn, ascarpino --- .../classes/build/tools/intpoly/FieldGen.java | 10 +- .../x86/stubGenerator_x86_64_poly_mont.cpp | 1 - src/hotspot/share/classfile/vmIntrinsics.hpp | 4 +- src/hotspot/share/opto/library_call.cpp | 2 - src/hotspot/share/opto/runtime.cpp | 6 +- .../util/math/intpoly/IntegerPolynomial.java | 24 ++-- .../math/intpoly/IntegerPolynomial1305.java | 6 +- .../intpoly/IntegerPolynomialModBinP.java | 6 +- .../MontgomeryIntegerPolynomialP256.java | 104 +++++++++--------- 9 files changed, 73 insertions(+), 90 deletions(-) diff --git a/make/jdk/src/classes/build/tools/intpoly/FieldGen.java b/make/jdk/src/classes/build/tools/intpoly/FieldGen.java index 234f5cfce0d26..2bf8c5c0b2001 100644 --- a/make/jdk/src/classes/build/tools/intpoly/FieldGen.java +++ b/make/jdk/src/classes/build/tools/intpoly/FieldGen.java @@ -778,7 +778,7 @@ private String generate(FieldParams params) throws IOException { result.appendLine("}"); result.appendLine("@Override"); - result.appendLine("protected int mult(long[] a, long[] b, long[] r) {"); + result.appendLine("protected void mult(long[] a, long[] b, long[] r) {"); result.incrIndent(); for (int i = 0; i < 2 * params.getNumLimbs() - 1; i++) { result.appendIndent(); @@ -804,9 +804,6 @@ private String generate(FieldParams params) throws IOException { } } result.append(");\n"); - result.appendIndent(); - result.append("return 0;"); - result.appendLine(); result.decrIndent(); result.appendLine("}"); @@ -836,7 +833,7 @@ private String generate(FieldParams params) throws IOException { // } // } result.appendLine("@Override"); - result.appendLine("protected int square(long[] a, long[] r) {"); + result.appendLine("protected void square(long[] a, long[] r) {"); result.incrIndent(); for (int i = 0; i < 2 * params.getNumLimbs() - 1; i++) { result.appendIndent(); @@ -877,9 +874,6 @@ private String generate(FieldParams params) throws IOException { } } result.append(");\n"); - result.appendIndent(); - result.append("return 0;"); - result.appendLine(); result.decrIndent(); result.appendLine("}"); diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64_poly_mont.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_64_poly_mont.cpp index 25ee68072492c..4e909afbacc70 100644 --- a/src/hotspot/cpu/x86/stubGenerator_x86_64_poly_mont.cpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64_poly_mont.cpp @@ -249,7 +249,6 @@ address StubGenerator::generate_intpoly_montgomeryMult_P256() { const Register tmp = r9; montgomeryMultiply(aLimbs, bLimbs, rLimbs, tmp, _masm); - __ mov64(rax, 0x1); // Return 1 (Fig. 5, Step 6 [1] skipped in montgomeryMultiply) __ leave(); __ ret(0); diff --git a/src/hotspot/share/classfile/vmIntrinsics.hpp b/src/hotspot/share/classfile/vmIntrinsics.hpp index b8d8c40cc47a4..7a5c2ee47bb52 100644 --- a/src/hotspot/share/classfile/vmIntrinsics.hpp +++ b/src/hotspot/share/classfile/vmIntrinsics.hpp @@ -529,8 +529,8 @@ class methodHandle; /* support for sun.security.util.math.intpoly.MontgomeryIntegerPolynomialP256 */ \ do_class(sun_security_util_math_intpoly_MontgomeryIntegerPolynomialP256, "sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256") \ do_intrinsic(_intpoly_montgomeryMult_P256, sun_security_util_math_intpoly_MontgomeryIntegerPolynomialP256, intPolyMult_name, intPolyMult_signature, F_R) \ - do_name(intPolyMult_name, "mult") \ - do_signature(intPolyMult_signature, "([J[J[J)I") \ + do_name(intPolyMult_name, "multImpl") \ + do_signature(intPolyMult_signature, "([J[J[J)V") \ \ do_class(sun_security_util_math_intpoly_IntegerPolynomial, "sun/security/util/math/intpoly/IntegerPolynomial") \ do_intrinsic(_intpoly_assign, sun_security_util_math_intpoly_IntegerPolynomial, intPolyAssign_name, intPolyAssign_signature, F_S) \ diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp index 596e637652dfb..0148d985bc59b 100644 --- a/src/hotspot/share/opto/library_call.cpp +++ b/src/hotspot/share/opto/library_call.cpp @@ -7580,8 +7580,6 @@ bool LibraryCallKit::inline_intpoly_montgomeryMult_P256() { OptoRuntime::intpoly_montgomeryMult_P256_Type(), stubAddr, stubName, TypePtr::BOTTOM, a_start, b_start, r_start); - Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms)); - set_result(result); return true; } diff --git a/src/hotspot/share/opto/runtime.cpp b/src/hotspot/share/opto/runtime.cpp index 2953a1f7b726a..465404bb4693f 100644 --- a/src/hotspot/share/opto/runtime.cpp +++ b/src/hotspot/share/opto/runtime.cpp @@ -1435,8 +1435,8 @@ const TypeFunc* OptoRuntime::intpoly_montgomeryMult_P256_Type() { // result type needed fields = TypeTuple::fields(1); - fields[TypeFunc::Parms + 0] = TypeInt::INT; // carry bits in output - const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+1, fields); + fields[TypeFunc::Parms + 0] = nullptr; // void + const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields); return TypeFunc::make(domain, range); } @@ -1455,7 +1455,7 @@ const TypeFunc* OptoRuntime::intpoly_assign_Type() { // result type needed fields = TypeTuple::fields(1); - fields[TypeFunc::Parms + 0] = NULL; // void + fields[TypeFunc::Parms + 0] = nullptr; // void const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields); return TypeFunc::make(domain, range); } diff --git a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java index bb8d727ba982b..404c0dbd46966 100644 --- a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java +++ b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java @@ -90,12 +90,11 @@ public abstract sealed class IntegerPolynomial implements IntegerFieldModuloP * store the result in an IntegerPolynomial representation in a. Requires * that a.length == numLimbs. */ - protected int multByInt(long[] a, long b) { + protected void multByInt(long[] a, long b) { for (int i = 0; i < a.length; i++) { a[i] *= b; } reduce(a); - return 0; } /** @@ -104,7 +103,7 @@ protected int multByInt(long[] a, long b) { * a.length == b.length == r.length == numLimbs. It is allowed for a and r * to be the same array. */ - protected abstract int mult(long[] a, long[] b, long[] r); + protected abstract void mult(long[] a, long[] b, long[] r); /** * Multiply an IntegerPolynomial representation (a) with itself and store @@ -112,7 +111,7 @@ protected int multByInt(long[] a, long b) { * a.length == r.length == numLimbs. It is allowed for a and r * to be the same array. */ - protected abstract int square(long[] a, long[] r); + protected abstract void square(long[] a, long[] r); IntegerPolynomial(int bitsPerLimb, int numLimbs, @@ -622,8 +621,8 @@ public ImmutableElement multiply(IntegerModuloP genB) { } long[] newLimbs = new long[limbs.length]; - int numAdds = mult(limbs, b.limbs, newLimbs); - return new ImmutableElement(newLimbs, numAdds); + mult(limbs, b.limbs, newLimbs); + return new ImmutableElement(newLimbs, 0); } @Override @@ -635,8 +634,8 @@ public ImmutableElement square() { } long[] newLimbs = new long[limbs.length]; - int numAdds = IntegerPolynomial.this.square(limbs, newLimbs); - return new ImmutableElement(newLimbs, numAdds); + IntegerPolynomial.this.square(limbs, newLimbs); + return new ImmutableElement(newLimbs, 0); } public void addModPowerTwo(IntegerModuloP arg, byte[] result) { @@ -751,7 +750,8 @@ public MutableElement setProduct(IntegerModuloP genB) { b.numAdds = 0; } - numAdds = mult(limbs, b.limbs, limbs); + mult(limbs, b.limbs, limbs); + numAdds = 0; return this; } @@ -764,7 +764,8 @@ public MutableElement setProduct(SmallValue v) { } int value = ((Limb)v).value; - numAdds += multByInt(limbs, value); + multByInt(limbs, value); + numAdds = 0; return this; } @@ -824,7 +825,8 @@ public MutableElement setSquare() { numAdds = 0; } - numAdds = IntegerPolynomial.this.square(limbs, limbs); + IntegerPolynomial.this.square(limbs, limbs); + numAdds = 0; return this; } diff --git a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial1305.java b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial1305.java index 706651330d389..c4cd6b9da7d2e 100644 --- a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial1305.java +++ b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial1305.java @@ -50,7 +50,7 @@ private IntegerPolynomial1305() { super(BITS_PER_LIMB, NUM_LIMBS, 1, MODULUS); } - protected int mult(long[] a, long[] b, long[] r) { + protected void mult(long[] a, long[] b, long[] r) { // Use grade-school multiplication into primitives to avoid the // temporary array allocation. This is equivalent to the following @@ -73,7 +73,6 @@ protected int mult(long[] a, long[] b, long[] r) { long c8 = (a[4] * b[4]); carryReduce(r, c0, c1, c2, c3, c4, c5, c6, c7, c8); - return 0; } private void carryReduce(long[] r, long c0, long c1, long c2, long c3, @@ -100,7 +99,7 @@ private void carryReduce(long[] r, long c0, long c1, long c2, long c3, } @Override - protected int square(long[] a, long[] r) { + protected void square(long[] a, long[] r) { // Use grade-school multiplication with a simple squaring optimization. // Multiply into primitives to avoid the temporary array allocation. // This is equivalent to the following code: @@ -123,7 +122,6 @@ protected int square(long[] a, long[] r) { long c8 = (a[4] * a[4]); carryReduce(r, c0, c1, c2, c3, c4, c5, c6, c7, c8); - return 0; } @Override diff --git a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomialModBinP.java b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomialModBinP.java index e57316ed964f6..3e9b191ddcee3 100644 --- a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomialModBinP.java +++ b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomialModBinP.java @@ -131,12 +131,11 @@ private void multOnly(long[] a, long[] b, long[] c) { } @Override - protected int mult(long[] a, long[] b, long[] r) { + protected void mult(long[] a, long[] b, long[] r) { long[] c = new long[2 * numLimbs]; multOnly(a, b, c); carryReduce(c, r); - return 0; } private void modReduceInBits(long[] limbs, int index, int bits, long x) { @@ -189,7 +188,7 @@ protected void reduce(long[] a) { } @Override - protected int square(long[] a, long[] r) { + protected void square(long[] a, long[] r) { long[] c = new long[2 * numLimbs]; for (int i = 0; i < numLimbs; i++) { @@ -200,7 +199,6 @@ protected int square(long[] a, long[] r) { } carryReduce(c, r); - return 0; } /** diff --git a/src/java.base/share/classes/sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256.java b/src/java.base/share/classes/sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256.java index 3a84b5f508802..e50890bd976e7 100644 --- a/src/java.base/share/classes/sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256.java +++ b/src/java.base/share/classes/sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256.java @@ -31,6 +31,7 @@ import sun.security.util.math.IntegerFieldModuloP; import java.math.BigInteger; import jdk.internal.vm.annotation.IntrinsicCandidate; +import jdk.internal.vm.annotation.ForceInline; // Reference: // - [1] Shay Gueron and Vlad Krasnov "Fast Prime Field Elliptic Curve @@ -103,8 +104,8 @@ public ImmutableElement getElement(BigInteger v) { setLimbsValuePositive(v, vLimbs); // Convert to Montgomery domain - int numAdds = mult(vLimbs, h, montLimbs); - return new ImmutableElement(montLimbs, numAdds); + mult(vLimbs, h, montLimbs); + return new ImmutableElement(montLimbs, 0); } @Override @@ -114,24 +115,6 @@ public SmallValue getSmallValue(int value) { return super.getSmallValue(value); } - /* - * This function is used by IntegerPolynomial.setProduct(SmallValue v) to - * multiply by a small constant (i.e. (int) 1,2,3,4). Instead of doing a - * montgomery conversion followed by a montgomery multiplication, just use - * the spare top (64-BITS_PER_LIMB) bits to multiply by a constant. (See [1] - * Section 4 ) - * - * Will return an unreduced value - */ - @Override - protected int multByInt(long[] a, long b) { - assert (b < (1 << BITS_PER_LIMB)); - for (int i = 0; i < a.length; i++) { - a[i] *= b; - } - return (int) (b - 1); - } - @Override public ImmutableIntegerModuloP fromMontgomery(ImmutableIntegerModuloP n) { assert n.getField() == MontgomeryIntegerPolynomialP256.ONE; @@ -163,10 +146,11 @@ private void halfLimbs(long[] a, long[] r) { } @Override - protected int square(long[] a, long[] r) { - return mult(a, a, r); + protected void square(long[] a, long[] r) { + mult(a, a, r); } + /** * Unrolled Word-by-Word Montgomery Multiplication r = a * b * 2^-260 (mod P) * @@ -174,8 +158,15 @@ protected int square(long[] a, long[] r) { * for a Montgomery Friendly modulus p". Note: Step 6. Skipped; Instead use * numAdds to reuse existing overflow logic. */ + @Override + protected void mult(long[] a, long[] b, long[] r) { + multImpl(a, b, r); + reducePositive(r); + } + + @ForceInline @IntrinsicCandidate - protected int mult(long[] a, long[] b, long[] r) { + private void multImpl(long[] a, long[] b, long[] r) { long aa0 = a[0]; long aa1 = a[1]; long aa2 = a[2]; @@ -408,36 +399,16 @@ protected int mult(long[] a, long[] b, long[] r) { d4 += n4 & LIMB_MASK; c5 += d1 + dd0 + (d0 >>> BITS_PER_LIMB); - c6 += d2 + dd1 + (c5 >>> BITS_PER_LIMB); - c7 += d3 + dd2 + (c6 >>> BITS_PER_LIMB); - c8 += d4 + dd3 + (c7 >>> BITS_PER_LIMB); - c9 = dd4 + (c8 >>> BITS_PER_LIMB); - - c5 &= LIMB_MASK; - c6 &= LIMB_MASK; - c7 &= LIMB_MASK; - c8 &= LIMB_MASK; - - // At this point, the result could overflow by one modulus. - c0 = c5 - modulus[0]; - c1 = c6 - modulus[1] + (c0 >> BITS_PER_LIMB); - c0 &= LIMB_MASK; - c2 = c7 - modulus[2] + (c1 >> BITS_PER_LIMB); - c1 &= LIMB_MASK; - c3 = c8 - modulus[3] + (c2 >> BITS_PER_LIMB); - c2 &= LIMB_MASK; - c4 = c9 - modulus[4] + (c3 >> BITS_PER_LIMB); - c3 &= LIMB_MASK; - - long mask = c4 >> BITS_PER_LIMB; // Signed shift! - - r[0] = ((c5 & mask) | (c0 & ~mask)); - r[1] = ((c6 & mask) | (c1 & ~mask)); - r[2] = ((c7 & mask) | (c2 & ~mask)); - r[3] = ((c8 & mask) | (c3 & ~mask)); - r[4] = ((c9 & mask) | (c4 & ~mask)); - - return 0; + c6 += d2 + dd1; + c7 += d3 + dd2; + c8 += d4 + dd3; + c9 = dd4; + + r[0] = c5; + r[1] = c6; + r[2] = c7; + r[3] = c8; + r[4] = c9; } @Override @@ -516,8 +487,8 @@ public ImmutableElement getElement(byte[] v, int offset, int length, super.encode(v, offset, length, highByte, vLimbs); // Convert to Montgomery domain - int numAdds = mult(vLimbs, h, montLimbs); - return new ImmutableElement(montLimbs, numAdds); + mult(vLimbs, h, montLimbs); + return new ImmutableElement(montLimbs, 0); } /* @@ -556,4 +527,27 @@ protected void reduceIn(long[] limbs, long v, int i) { limbs[i - 5] += (v << 4) & LIMB_MASK; limbs[i - 4] += v >> 48; } + + // Used when limbs a could overflow by one modulus. + @ForceInline + protected void reducePositive(long[] a) { + long aa0 = a[0]; + long aa1 = a[1] + (aa0>>BITS_PER_LIMB); + long aa2 = a[2] + (aa1>>BITS_PER_LIMB); + long aa3 = a[3] + (aa2>>BITS_PER_LIMB); + long aa4 = a[4] + (aa3>>BITS_PER_LIMB); + + long c0 = a[0] - modulus[0]; + long c1 = a[1] - modulus[1] + (c0 >> BITS_PER_LIMB); + long c2 = a[2] - modulus[2] + (c1 >> BITS_PER_LIMB); + long c3 = a[3] - modulus[3] + (c2 >> BITS_PER_LIMB); + long c4 = a[4] - modulus[4] + (c3 >> BITS_PER_LIMB); + long mask = c4 >> BITS_PER_LIMB; // Signed shift! + + a[0] = ((aa0 & mask) | (c0 & ~mask)) & LIMB_MASK; + a[1] = ((aa1 & mask) | (c1 & ~mask)) & LIMB_MASK; + a[2] = ((aa2 & mask) | (c2 & ~mask)) & LIMB_MASK; + a[3] = ((aa3 & mask) | (c3 & ~mask)) & LIMB_MASK; + a[4] = ((aa4 & mask) | (c4 & ~mask)); + } } From c66f785fb685d5c378fb4c4cdebdef29c01d321b Mon Sep 17 00:00:00 2001 From: Gui Cao <gcao@openjdk.org> Date: Wed, 26 Jun 2024 00:59:49 +0000 Subject: [PATCH 185/471] 8334505: RISC-V: Several tests fail when MaxVectorSize does not match VM_Version::_initial_vector_length Reviewed-by: fyang --- src/hotspot/cpu/riscv/vm_version_riscv.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.cpp b/src/hotspot/cpu/riscv/vm_version_riscv.cpp index 995e8b722485d..b9467bb2245da 100644 --- a/src/hotspot/cpu/riscv/vm_version_riscv.cpp +++ b/src/hotspot/cpu/riscv/vm_version_riscv.cpp @@ -327,15 +327,11 @@ void VM_Version::c2_initialize() { FLAG_SET_DEFAULT(MaxVectorSize, 0); FLAG_SET_DEFAULT(UseRVVForBigIntegerShiftIntrinsics, false); } else { - if (FLAG_IS_DEFAULT(MaxVectorSize)) { - MaxVectorSize = _initial_vector_length; - } else if (!is_power_of_2(MaxVectorSize)) { - vm_exit_during_initialization(err_msg("Unsupported MaxVectorSize: %d, must be a power of 2", (int)MaxVectorSize)); - } else if (MaxVectorSize > _initial_vector_length) { - warning("Current system only supports max RVV vector length %d. Set MaxVectorSize to %d", - _initial_vector_length, _initial_vector_length); - MaxVectorSize = _initial_vector_length; + if (!FLAG_IS_DEFAULT(MaxVectorSize) && MaxVectorSize != _initial_vector_length) { + warning("Current system does not support RVV vector length for MaxVectorSize %d. Set MaxVectorSize to %d", + (int)MaxVectorSize, _initial_vector_length); } + MaxVectorSize = _initial_vector_length; if (MaxVectorSize < 16) { warning("RVV does not support vector length less than 16 bytes. Disabling RVV."); UseRVV = false; From 25c3845be270462388ee5e7330cc7315e5c738df Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Wed, 26 Jun 2024 05:15:36 +0000 Subject: [PATCH 186/471] 8333133: Simplify QuickSort::sort Reviewed-by: shade, dholmes --- src/hotspot/share/classfile/moduleEntry.cpp | 2 +- src/hotspot/share/classfile/packageEntry.cpp | 3 +- .../compiler/compilationMemoryStatistic.cpp | 2 +- src/hotspot/share/gc/g1/g1CollectionSet.cpp | 2 +- src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp | 3 +- .../shenandoahAdaptiveHeuristics.cpp | 2 +- src/hotspot/share/logging/logSelection.cpp | 2 +- src/hotspot/share/oops/method.cpp | 2 +- src/hotspot/share/utilities/quickSort.hpp | 66 ++++++----------- .../gtest/gc/shared/test_oopStorage.cpp | 2 +- .../gtest/utilities/test_quicksort.cpp | 72 +------------------ 11 files changed, 33 insertions(+), 125 deletions(-) diff --git a/src/hotspot/share/classfile/moduleEntry.cpp b/src/hotspot/share/classfile/moduleEntry.cpp index e7f05bedb292a..6c60d60d21192 100644 --- a/src/hotspot/share/classfile/moduleEntry.cpp +++ b/src/hotspot/share/classfile/moduleEntry.cpp @@ -568,7 +568,7 @@ Array<ModuleEntry*>* ModuleEntryTable::allocate_archived_entries() { if (n > 1) { // Always allocate in the same order to produce deterministic archive. - QuickSort::sort(archived_modules->data(), n, (_sort_Fn)compare_module_by_name, true); + QuickSort::sort(archived_modules->data(), n, compare_module_by_name); } for (int i = 0; i < n; i++) { archived_modules->at_put(i, archived_modules->at(i)->allocate_archived_entry()); diff --git a/src/hotspot/share/classfile/packageEntry.cpp b/src/hotspot/share/classfile/packageEntry.cpp index c6236e51c0a02..052960e1735dd 100644 --- a/src/hotspot/share/classfile/packageEntry.cpp +++ b/src/hotspot/share/classfile/packageEntry.cpp @@ -300,7 +300,8 @@ Array<PackageEntry*>* PackageEntryTable::allocate_archived_entries() { _table.iterate_all(grab); if (n > 1) { - QuickSort::sort(archived_packages->data(), n, (_sort_Fn)compare_package_by_name, true); + // Always allocate in the same order to produce deterministic archive. + QuickSort::sort(archived_packages->data(), n, compare_package_by_name); } for (int i = 0; i < n; i++) { archived_packages->at_put(i, archived_packages->at(i)->allocate_archived_entry()); diff --git a/src/hotspot/share/compiler/compilationMemoryStatistic.cpp b/src/hotspot/share/compiler/compilationMemoryStatistic.cpp index 196a11fd06537..07d8ec41598d9 100644 --- a/src/hotspot/share/compiler/compilationMemoryStatistic.cpp +++ b/src/hotspot/share/compiler/compilationMemoryStatistic.cpp @@ -604,7 +604,7 @@ void CompilationMemoryStatistic::print_all_by_size(outputStream* st, bool human_ st->print_cr("(%d/%d)", num, _the_table->number_of_entries()); } if (num > 0) { - QuickSort::sort(filtered, num, diff_entries_by_size, false); + QuickSort::sort(filtered, num, diff_entries_by_size); // Now print. Has to happen under lock protection too, since entries may be changed. for (int i = 0; i < num; i ++) { filtered[i]->print_on(st, human_readable); diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.cpp b/src/hotspot/share/gc/g1/g1CollectionSet.cpp index a70d003ab53e5..5da8f26b3310b 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSet.cpp +++ b/src/hotspot/share/gc/g1/g1CollectionSet.cpp @@ -383,7 +383,7 @@ void G1CollectionSet::finalize_old_part(double time_remaining_ms) { double non_young_end_time_sec = os::elapsedTime(); phase_times()->record_non_young_cset_choice_time_ms((non_young_end_time_sec - non_young_start_time_sec) * 1000.0); - QuickSort::sort(_collection_set_regions, _collection_set_cur_length, compare_region_idx, true); + QuickSort::sort(_collection_set_regions, _collection_set_cur_length, compare_region_idx); } void G1CollectionSet::move_candidates_to_collection_set(G1CollectionCandidateRegionList* regions) { diff --git a/src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp b/src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp index 67059b6ec1c47..cc23e0dabe579 100644 --- a/src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp +++ b/src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp @@ -359,8 +359,7 @@ class G1RefineBufferedCards : public StackObj { void sort_cards(size_t start_index) { QuickSort::sort(&_node_buffer[start_index], _node_buffer_capacity - start_index, - compare_cards, - false); + compare_cards); } // Returns the index to the first clean card in the buffer. diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp index 6dc57139f45e5..331e98b1e85bf 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp @@ -97,7 +97,7 @@ void ShenandoahAdaptiveHeuristics::choose_collection_set_from_regiondata(Shenand byte_size_in_proper_unit(min_garbage), proper_unit_for_byte_size(min_garbage)); // Better select garbage-first regions - QuickSort::sort<RegionData>(data, (int)size, compare_by_garbage, false); + QuickSort::sort(data, size, compare_by_garbage); size_t cur_cset = 0; size_t cur_garbage = 0; diff --git a/src/hotspot/share/logging/logSelection.cpp b/src/hotspot/share/logging/logSelection.cpp index 16c6c6f63ca40..aea5719b36d4f 100644 --- a/src/hotspot/share/logging/logSelection.cpp +++ b/src/hotspot/share/logging/logSelection.cpp @@ -322,7 +322,7 @@ void LogSelection::suggest_similar_matching(outputStream* out) const { // Sort found suggestions to suggest the best one first SimilarityComparator sc(*this); - QuickSort::sort(suggestions, nsuggestions, sc, false); + QuickSort::sort(suggestions, nsuggestions, sc); out->print("Did you mean any of the following?"); for (size_t i = 0; i < nsuggestions; i++) { diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp index 525ec284c086a..e5ba0d610314b 100644 --- a/src/hotspot/share/oops/method.cpp +++ b/src/hotspot/share/oops/method.cpp @@ -1733,7 +1733,7 @@ void Method::sort_methods(Array<Method*>* methods, bool set_idnums, method_compa } { NoSafepointVerifier nsv; - QuickSort::sort(methods->data(), length, func, /*idempotent=*/false); + QuickSort::sort(methods->data(), length, func); } // Reset method ordering if (set_idnums) { diff --git a/src/hotspot/share/utilities/quickSort.hpp b/src/hotspot/share/utilities/quickSort.hpp index 7134463f38762..e434a59da3501 100644 --- a/src/hotspot/share/utilities/quickSort.hpp +++ b/src/hotspot/share/utilities/quickSort.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,25 +26,23 @@ #define SHARE_UTILITIES_QUICKSORT_HPP #include "memory/allStatic.hpp" -#include "runtime/globals.hpp" #include "utilities/debug.hpp" +#include "utilities/globalDefinitions.hpp" class QuickSort : AllStatic { private: template<class T> - static void swap(T* array, size_t x, size_t y) { - T tmp = array[x]; - array[x] = array[y]; - array[y] = tmp; + static void swap_elements(T* array, size_t x, size_t y) { + swap(array[x], array[y]); } // As pivot we use the median of the first, last and middle elements. - // We swap in these three values at the right place in the array. This - // means that this method not only returns the index of the pivot - // element. It also alters the array so that: + // We swap these three values as needed so that // array[first] <= array[middle] <= array[last] - // A side effect of this is that arrays of length <= 3 are sorted. + // As a result, the first and last elements are placed in the proper + // partition, and arrays of length <= 3 are sorted. + // The middle index is returned, designating that element as the pivot. template<class T, class C> static size_t find_pivot(T* array, size_t length, C comparator) { assert(length > 1, "length of array must be > 0"); @@ -53,20 +51,20 @@ class QuickSort : AllStatic { size_t last_index = length - 1; if (comparator(array[0], array[middle_index]) > 0) { - swap(array, 0, middle_index); + swap_elements(array, 0, middle_index); } if (comparator(array[0], array[last_index]) > 0) { - swap(array, 0, last_index); + swap_elements(array, 0, last_index); } if (comparator(array[middle_index], array[last_index]) > 0) { - swap(array, middle_index, last_index); + swap_elements(array, middle_index, last_index); } // Now the value in the middle of the array is the median - // of the fist, last and middle values. Use this as pivot. + // of the first, last and middle values. Use this as pivot. return middle_index; } - template<bool idempotent, class T, class C> + template<class T, class C> static size_t partition(T* array, size_t pivot, size_t length, C comparator) { size_t left_index = 0; size_t right_index = length - 1; @@ -74,27 +72,22 @@ class QuickSort : AllStatic { for ( ; true; ++left_index, --right_index) { for ( ; comparator(array[left_index], pivot_val) < 0; ++left_index) { - assert(left_index < length, "reached end of partition"); + assert(left_index < (length - 1), "reached end of partition"); } for ( ; comparator(array[right_index], pivot_val) > 0; --right_index) { assert(right_index > 0, "reached start of partition"); } - if (left_index < right_index) { - if (!idempotent || comparator(array[left_index], array[right_index]) != 0) { - swap(array, left_index, right_index); - } + swap_elements(array, left_index, right_index); } else { return right_index; } } - - ShouldNotReachHere(); - return 0; } - template<bool idempotent, class T, class C> - static void inner_sort(T* array, size_t length, C comparator) { + public: + template<class T, class C> + static void sort(T* array, size_t length, C comparator) { if (length < 2) { return; } @@ -103,28 +96,11 @@ class QuickSort : AllStatic { // arrays up to length 3 will be sorted after finding the pivot return; } - size_t split = partition<idempotent>(array, pivot, length, comparator); + size_t split = partition(array, pivot, length, comparator); size_t first_part_length = split + 1; - inner_sort<idempotent>(array, first_part_length, comparator); - inner_sort<idempotent>(&array[first_part_length], length - first_part_length, comparator); - } - - public: - // The idempotent parameter prevents the sort from - // reordering a previous valid sort by not swapping - // fields that compare as equal. This requires extra - // calls to the comparator, so the performance - // impact depends on the comparator. - template<class T, class C> - static void sort(T* array, size_t length, C comparator, bool idempotent) { - // Switch "idempotent" from function parameter to template parameter - if (idempotent) { - inner_sort<true>(array, length, comparator); - } else { - inner_sort<false>(array, length, comparator); - } + sort(array, first_part_length, comparator); + sort(&array[first_part_length], length - first_part_length, comparator); } }; - #endif // SHARE_UTILITIES_QUICKSORT_HPP diff --git a/test/hotspot/gtest/gc/shared/test_oopStorage.cpp b/test/hotspot/gtest/gc/shared/test_oopStorage.cpp index 6758c61325a26..a4ac2fee66ba4 100644 --- a/test/hotspot/gtest/gc/shared/test_oopStorage.cpp +++ b/test/hotspot/gtest/gc/shared/test_oopStorage.cpp @@ -461,7 +461,7 @@ class OopStorageTestBlockRelease : public OopStorageTestWithAllocation { *to_release[i] = nullptr; } if (sorted) { - QuickSort::sort(to_release, nrelease, PointerCompare(), false); + QuickSort::sort(to_release, nrelease, PointerCompare()); } storage().release(to_release, nrelease); diff --git a/test/hotspot/gtest/utilities/test_quicksort.cpp b/test/hotspot/gtest/utilities/test_quicksort.cpp index 2ce18486e3e2e..14614110493ba 100644 --- a/test/hotspot/gtest/utilities/test_quicksort.cpp +++ b/test/hotspot/gtest/utilities/test_quicksort.cpp @@ -48,23 +48,11 @@ static bool compare_arrays(int* actual, int* expected, size_t length) { } template <class C> -static bool sort_and_compare(int* arrayToSort, int* expectedResult, size_t length, C comparator, bool idempotent = false) { - QuickSort::sort(arrayToSort, length, comparator, idempotent); +static bool sort_and_compare(int* arrayToSort, int* expectedResult, size_t length, C comparator) { + QuickSort::sort(arrayToSort, length, comparator); return compare_arrays(arrayToSort, expectedResult, length); } -static int test_even_odd_comparator(int a, int b) { - bool a_is_odd = ((a % 2) == 1); - bool b_is_odd = ((b % 2) == 1); - if (a_is_odd == b_is_odd) { - return 0; - } - if (a_is_odd) { - return -1; - } - return 1; -} - extern "C" { static int test_stdlib_comparator(const void* a, const void* b) { int ai = *(int*)a; @@ -126,50 +114,6 @@ TEST(QuickSort, quicksort) { int expected_array[] = {6,7,8,8,9,9,11,11,13,21,22,24,24,25,27,27,28,31,32,39,40,40,40,41,44,46,51,55,56,59,64,64,65,69,71,74,75,75,76,78,81,82}; EXPECT_TRUE(sort_and_compare(test_array, expected_array, 42, test_comparator)); } - { - int test_array[] = {2,8,1,4}; - int expected_array[] = {1,4,2,8}; - EXPECT_TRUE(sort_and_compare(test_array, expected_array, 4, test_even_odd_comparator)); - } -} - -TEST(QuickSort, idempotent) { - { - // An array of lenght 3 is only sorted by find_pivot. Make sure that it is idempotent. - int test_array[] = {1, 4, 8}; - int expected_array[] = {1, 4, 8}; - EXPECT_TRUE(sort_and_compare(test_array, expected_array, 3, test_even_odd_comparator, true)); - } - { - int test_array[] = {1, 7, 9, 4, 8, 2}; - int expected_array[] = {1, 7, 9, 4, 8, 2}; - EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true)); - } - { - int test_array[] = {1, 9, 7, 4, 2, 8}; - int expected_array[] = {1, 9, 7, 4, 2, 8}; - EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true)); - } - { - int test_array[] = {7, 9, 1, 2, 8, 4}; - int expected_array[] = {7, 9, 1, 2, 8, 4}; - EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true)); - } - { - int test_array[] = {7, 1, 9, 2, 4, 8}; - int expected_array[] = {7, 1, 9, 2, 4, 8}; - EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true)); - } - { - int test_array[] = {9, 1, 7, 4, 8, 2}; - int expected_array[] = {9, 1, 7, 4, 8, 2}; - EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true)); - } - { - int test_array[] = {9, 7, 1, 4, 2, 8}; - int expected_array[] = {9, 7, 1, 4, 2, 8}; - EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true)); - } } TEST(QuickSort, random) { @@ -186,18 +130,6 @@ TEST(QuickSort, random) { // Compare sorting to stdlib::qsort() qsort(expected_array, length, sizeof(int), test_stdlib_comparator); EXPECT_TRUE(sort_and_compare(test_array, expected_array, length, test_comparator)); - - // Make sure sorting is idempotent. - // Both test_array and expected_array are sorted by the test_comparator. - // Now sort them once with the test_even_odd_comparator. Then sort the - // test_array one more time with test_even_odd_comparator and verify that - // it is idempotent. - QuickSort::sort(expected_array, length, test_even_odd_comparator, true); - QuickSort::sort(test_array, length, test_even_odd_comparator, true); - EXPECT_TRUE(compare_arrays(test_array, expected_array, length)); - QuickSort::sort(test_array, length, test_even_odd_comparator, true); - EXPECT_TRUE(compare_arrays(test_array, expected_array, length)); - FREE_C_HEAP_ARRAY(int, test_array); FREE_C_HEAP_ARRAY(int, expected_array); } From a5f401f3a8534a64cf3c27c2ef67f17860de6d6b Mon Sep 17 00:00:00 2001 From: Christian Hagedorn <chagedorn@openjdk.org> Date: Wed, 26 Jun 2024 07:09:50 +0000 Subject: [PATCH 187/471] 8334650: Add debug information about whether an Assertion Predicate is for the init or last value Reviewed-by: roland, kvn --- src/hotspot/share/opto/cfgnode.hpp | 37 ++++++++++++++------- src/hotspot/share/opto/ifnode.cpp | 42 +++++++++++++++++++++--- src/hotspot/share/opto/loopPredicate.cpp | 15 ++++++--- src/hotspot/share/opto/loopTransform.cpp | 17 +++++----- src/hotspot/share/opto/loopnode.hpp | 13 ++++---- src/hotspot/share/opto/predicates.hpp | 9 +++++ 6 files changed, 97 insertions(+), 36 deletions(-) diff --git a/src/hotspot/share/opto/cfgnode.hpp b/src/hotspot/share/opto/cfgnode.hpp index de37f4cdd65ca..32ac8c0162f22 100644 --- a/src/hotspot/share/opto/cfgnode.hpp +++ b/src/hotspot/share/opto/cfgnode.hpp @@ -57,6 +57,7 @@ class JProjNode; class JumpProjNode; class SCMemProjNode; class PhaseIdealLoop; +enum class AssertionPredicateType; // The success projection of a Parse Predicate is always an IfTrueNode and the uncommon projection an IfFalseNode typedef IfTrueNode ParsePredicateSuccessProj; @@ -318,11 +319,23 @@ class MultiBranchNode : public MultiNode { //------------------------------IfNode----------------------------------------- // Output selected Control, based on a boolean test class IfNode : public MultiBranchNode { + public: + float _prob; // Probability of true path being taken. + float _fcnt; // Frequency counter + + private: + NOT_PRODUCT(AssertionPredicateType _assertion_predicate_type;) + + void init_node(Node* control, Node* bol) { + init_class_id(Class_If); + init_req(0, control); + init_req(1, bol); + } + // Size is bigger to hold the probability field. However, _prob does not // change the semantics so it does not appear in the hash & cmp functions. virtual uint size_of() const { return sizeof(*this); } -private: // Helper methods for fold_compares bool cmpi_folds(PhaseIterGVN* igvn, bool fold_ne = false); bool is_ctrl_folds(Node* ctrl, PhaseIterGVN* igvn); @@ -413,14 +426,8 @@ class IfNode : public MultiBranchNode { // Magic manifest probabilities such as 0.83, 0.7, ... can be found in // gen_subtype_check() and catch_inline_exceptions(). - float _prob; // Probability of true path being taken. - float _fcnt; // Frequency counter - IfNode( Node *control, Node *b, float p, float fcnt ) - : MultiBranchNode(2), _prob(p), _fcnt(fcnt) { - init_class_id(Class_If); - init_req(0,control); - init_req(1,b); - } + IfNode(Node* control, Node* bol, float p, float fcnt); + NOT_PRODUCT(IfNode(Node* control, Node* bol, float p, float fcnt, AssertionPredicateType assertion_predicate_type);) static IfNode* make_with_same_profile(IfNode* if_node_profile, Node* ctrl, BoolNode* bol); @@ -450,13 +457,19 @@ class IfNode : public MultiBranchNode { class RangeCheckNode : public IfNode { private: - int is_range_check(Node* &range, Node* &index, jint &offset); + int is_range_check(Node*& range, Node*& index, jint& offset); public: - RangeCheckNode(Node* control, Node *b, float p, float fcnt) - : IfNode(control, b, p, fcnt) { + RangeCheckNode(Node* control, Node* bol, float p, float fcnt) : IfNode(control, bol, p, fcnt) { + init_class_id(Class_RangeCheck); + } + +#ifndef PRODUCT + RangeCheckNode(Node* control, Node* bol, float p, float fcnt, AssertionPredicateType assertion_predicate_type) + : IfNode(control, bol, p, fcnt, assertion_predicate_type) { init_class_id(Class_RangeCheck); } +#endif // NOT PRODUCT virtual int Opcode() const; virtual Node* Ideal(PhaseGVN *phase, bool can_reshape); diff --git a/src/hotspot/share/opto/ifnode.cpp b/src/hotspot/share/opto/ifnode.cpp index 9760be95ddde9..a5722c45a5e6a 100644 --- a/src/hotspot/share/opto/ifnode.cpp +++ b/src/hotspot/share/opto/ifnode.cpp @@ -47,6 +47,24 @@ extern uint explicit_null_checks_elided; #endif +IfNode::IfNode(Node* control, Node* bol, float p, float fcnt) + : MultiBranchNode(2), + _prob(p), + _fcnt(fcnt) + NOT_PRODUCT(COMMA _assertion_predicate_type(AssertionPredicateType::None)) { + init_node(control, bol); +} + +#ifndef PRODUCT +IfNode::IfNode(Node* control, Node* bol, float p, float fcnt, AssertionPredicateType assertion_predicate_type) + : MultiBranchNode(2), + _prob(p), + _fcnt(fcnt), + _assertion_predicate_type(assertion_predicate_type) { + init_node(control, bol); +} +#endif // NOT_PRODUCT + //============================================================================= //------------------------------Value------------------------------------------ // Return a tuple for whichever arm of the IF is reachable @@ -1822,11 +1840,23 @@ void IfProjNode::pin_array_access_nodes(PhaseIterGVN* igvn) { } #ifndef PRODUCT -//------------------------------dump_spec-------------------------------------- -void IfNode::dump_spec(outputStream *st) const { - st->print("P=%f, C=%f",_prob,_fcnt); +void IfNode::dump_spec(outputStream* st) const { + switch (_assertion_predicate_type) { + case AssertionPredicateType::Init_value: + st->print("#Init Value Assertion Predicate "); + break; + case AssertionPredicateType::Last_value: + st->print("#Last Value Assertion Predicate "); + break; + case AssertionPredicateType::None: + // No Assertion Predicate + break; + default: + fatal("Unknown Assertion Predicate type"); + } + st->print("P=%f, C=%f", _prob, _fcnt); } -#endif +#endif // NOT PRODUCT //------------------------------idealize_test---------------------------------- // Try to canonicalize tests better. Peek at the Cmp/Bool/If sequence and @@ -2181,6 +2211,8 @@ void ParsePredicateNode::dump_spec(outputStream* st) const { default: fatal("unknown kind"); } + if (_useless) { + st->print("#useless "); + } } - #endif // NOT PRODUCT diff --git a/src/hotspot/share/opto/loopPredicate.cpp b/src/hotspot/share/opto/loopPredicate.cpp index 998d3a27178e1..f8d3fa0b6d91d 100644 --- a/src/hotspot/share/opto/loopPredicate.cpp +++ b/src/hotspot/share/opto/loopPredicate.cpp @@ -101,7 +101,8 @@ void PhaseIdealLoop::register_control(Node* n, IdealLoopTree *loop, Node* pred, // is an IfTrue projection. This code is also used to clone predicates to cloned loops. IfTrueNode* PhaseIdealLoop::create_new_if_for_predicate(ParsePredicateSuccessProj* parse_predicate_success_proj, Node* new_entry, const Deoptimization::DeoptReason reason, - const int opcode, const bool rewire_uncommon_proj_phi_inputs) { + const int opcode, const bool rewire_uncommon_proj_phi_inputs + NOT_PRODUCT (COMMA AssertionPredicateType assertion_predicate_type)) { assert(parse_predicate_success_proj->is_uncommon_trap_if_pattern(reason), "must be a uct if pattern!"); ParsePredicateNode* parse_predicate = parse_predicate_success_proj->in(0)->as_ParsePredicate(); ParsePredicateUncommonProj* uncommon_proj = parse_predicate->uncommon_proj(); @@ -143,10 +144,12 @@ IfTrueNode* PhaseIdealLoop::create_new_if_for_predicate(ParsePredicateSuccessPro IfNode* new_iff = nullptr; switch (opcode) { case Op_If: - new_iff = new IfNode(entry, parse_predicate->in(1), parse_predicate->_prob, parse_predicate->_fcnt); + new_iff = new IfNode(entry, parse_predicate->in(1), parse_predicate->_prob, parse_predicate->_fcnt + NOT_PRODUCT(COMMA assertion_predicate_type)); break; case Op_RangeCheck: - new_iff = new RangeCheckNode(entry, parse_predicate->in(1), parse_predicate->_prob, parse_predicate->_fcnt); + new_iff = new RangeCheckNode(entry, parse_predicate->in(1), parse_predicate->_prob, parse_predicate->_fcnt + NOT_PRODUCT(COMMA assertion_predicate_type)); break; case Op_ParsePredicate: new_iff = new ParsePredicateNode(entry, reason, &_igvn); @@ -1320,7 +1323,8 @@ IfTrueNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealL Node* opaque_bol = new Opaque4Node(C, bol, _igvn.intcon(1)); // This will go away once loop opts are over C->add_template_assertion_predicate_opaq(opaque_bol); register_new_node(opaque_bol, upper_bound_proj); - IfTrueNode* new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode()); + IfTrueNode* new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode(), + false NOT_PRODUCT(COMMA AssertionPredicateType::Init_value)); _igvn.replace_input_of(new_proj->in(0), 1, opaque_bol); assert(opaque_init->outcnt() > 0, "should be used"); @@ -1345,7 +1349,8 @@ IfTrueNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealL opaque_bol = new Opaque4Node(C, bol, _igvn.intcon(1)); C->add_template_assertion_predicate_opaq(opaque_bol); register_new_node(opaque_bol, new_proj); - new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode()); + new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode(), + false NOT_PRODUCT(COMMA AssertionPredicateType::Last_value)); _igvn.replace_input_of(new_proj->in(0), 1, opaque_bol); assert(max_value->outcnt() > 0, "should be used"); assert(assertion_predicate_has_loop_opaque_node(new_proj->in(0)->as_If()), "unexpected"); diff --git a/src/hotspot/share/opto/loopTransform.cpp b/src/hotspot/share/opto/loopTransform.cpp index a02690778a019..1b29d31ba68f7 100644 --- a/src/hotspot/share/opto/loopTransform.cpp +++ b/src/hotspot/share/opto/loopTransform.cpp @@ -2769,10 +2769,9 @@ bool PhaseIdealLoop::is_scaled_iv_plus_extra_offset(Node* exp1, Node* offset3, N // Same as PhaseIdealLoop::duplicate_predicates() but for range checks // eliminated by iteration splitting. -Node* PhaseIdealLoop::add_range_check_elimination_assertion_predicate(IdealLoopTree* loop, Node* ctrl, - const int scale_con, Node* offset, Node* limit, - jint stride_con, Node* value, - const bool is_template) { +Node* PhaseIdealLoop::add_range_check_elimination_assertion_predicate( + IdealLoopTree* loop, Node* ctrl, const int scale_con, Node* offset, Node* limit, jint stride_con, Node* value, + const bool is_template NOT_PRODUCT(COMMA AssertionPredicateType assertion_predicate_type)) { bool overflow = false; BoolNode* bol = rc_predicate(ctrl, scale_con, offset, value, nullptr, stride_con, limit, (stride_con > 0) != (scale_con > 0), overflow); @@ -2993,8 +2992,9 @@ void PhaseIdealLoop::do_range_check(IdealLoopTree *loop, Node_List &old_new) { // Add two Template Assertion Predicates to create new Initialized Assertion Predicates from when either // unrolling or splitting this main-loop further. - loop_entry = add_range_check_elimination_assertion_predicate(loop, loop_entry, scale_con, int_offset, - int_limit, stride_con, opaque_init, true); + loop_entry = add_range_check_elimination_assertion_predicate( + loop, loop_entry, scale_con, int_offset, int_limit, stride_con, opaque_init, true + NOT_PRODUCT(COMMA AssertionPredicateType::Init_value)); assert(assertion_predicate_has_loop_opaque_node(loop_entry->in(0)->as_If()), "unexpected"); Node* opaque_stride = new OpaqueLoopStrideNode(C, cl->stride()); @@ -3006,8 +3006,9 @@ void PhaseIdealLoop::do_range_check(IdealLoopTree *loop, Node_List &old_new) { // init + (current stride - initial stride) is within the loop so narrow its type by leveraging the type of the iv Phi max_value = new CastIINode(max_value, loop->_head->as_CountedLoop()->phi()->bottom_type()); register_new_node(max_value, loop_entry); - loop_entry = add_range_check_elimination_assertion_predicate(loop, loop_entry, scale_con, int_offset, - int_limit, stride_con, max_value, true); + loop_entry = add_range_check_elimination_assertion_predicate( + loop, loop_entry, scale_con, int_offset, int_limit, stride_con, max_value, true + NOT_PRODUCT(COMMA AssertionPredicateType::Last_value)); assert(assertion_predicate_has_loop_opaque_node(loop_entry->in(0)->as_If()), "unexpected"); } else { diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp index 17145c825a420..79faf9c931dd2 100644 --- a/src/hotspot/share/opto/loopnode.hpp +++ b/src/hotspot/share/opto/loopnode.hpp @@ -1339,9 +1339,10 @@ class PhaseIdealLoop : public PhaseTransform { bool* p_short_scale, int depth); // Create a new if above the uncommon_trap_if_pattern for the predicate to be promoted - IfTrueNode* create_new_if_for_predicate(ParsePredicateSuccessProj* parse_predicate_proj, Node* new_entry, - Deoptimization::DeoptReason reason, int opcode, - bool rewire_uncommon_proj_phi_inputs = false); + IfTrueNode* create_new_if_for_predicate( + ParsePredicateSuccessProj* parse_predicate_proj, Node* new_entry, Deoptimization::DeoptReason reason, int opcode, + bool rewire_uncommon_proj_phi_inputs = false + NOT_PRODUCT (COMMA AssertionPredicateType assertion_predicate_type = AssertionPredicateType::None)); private: // Helper functions for create_new_if_for_predicate() @@ -1382,9 +1383,9 @@ class PhaseIdealLoop : public PhaseTransform { IfProjNode* upper_bound_proj, int scale, Node* offset, Node* init, Node* limit, jint stride, Node* rng, bool& overflow, Deoptimization::DeoptReason reason); void eliminate_hoisted_range_check(IfTrueNode* hoisted_check_proj, IfTrueNode* template_assertion_predicate_proj); - Node* add_range_check_elimination_assertion_predicate(IdealLoopTree* loop, Node* predicate_proj, int scale_con, - Node* offset, Node* limit, int stride_con, Node* value, - bool is_template); + Node* add_range_check_elimination_assertion_predicate( + IdealLoopTree* loop, Node* predicate_proj, int scale_con, Node* offset, Node* limit, int stride_con, Node* value, + bool is_template NOT_PRODUCT(COMMA AssertionPredicateType assertion_predicate_type = AssertionPredicateType::None)); // Helper function to collect predicate for eliminating the useless ones void eliminate_useless_predicates(); diff --git a/src/hotspot/share/opto/predicates.hpp b/src/hotspot/share/opto/predicates.hpp index 9cac98eb9936f..08aa64f03e583 100644 --- a/src/hotspot/share/opto/predicates.hpp +++ b/src/hotspot/share/opto/predicates.hpp @@ -193,6 +193,15 @@ * Main Loop Head */ +#ifndef PRODUCT +// Assertion Predicates are either emitted to check the initial value of a range check in the first iteration or the last +// value of a range check in the last iteration of a loop. +enum class AssertionPredicateType { + None, // Not an Assertion Predicate + Init_value, + Last_value +}; +#endif // NOT PRODUCT // Class to represent Assertion Predicates with a HaltNode instead of an UCT (i.e. either an Initialized Assertion // Predicate or a Template Assertion Predicate created after the initial one at Loop Predication). From b88af94269640a160fbacf25618f3a00756464aa Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Wed, 26 Jun 2024 07:40:35 +0000 Subject: [PATCH 188/471] 8269870: PS: Membar in PSPromotionManager::copy_unmarked_to_survivor_space could be relaxed Co-authored-by: Hamlin Li <mli@openjdk.org> Reviewed-by: mli, kbarrett, tschatzl --- .../gc/parallel/psPromotionManager.inline.hpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp index eb27e9776ed9b..f01d1a852997c 100644 --- a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp +++ b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp @@ -148,10 +148,6 @@ inline oop PSPromotionManager::copy_to_survivor_space(oop o) { if (!m.is_forwarded()) { return copy_unmarked_to_survivor_space<promote_immediately>(o, m); } else { - // Ensure any loads from the forwardee follow all changes that precede - // the release-cmpxchg that performed the forwarding, possibly in some - // other thread. - OrderAccess::acquire(); // Return the already installed forwardee. return m.forwardee(); } @@ -258,8 +254,11 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o, ContinuationGCSupport::transform_stack_chunk(new_obj); // Now we have to CAS in the header. - // Make copy visible to threads reading the forwardee. - oop forwardee = o->forward_to_atomic(new_obj, test_mark, memory_order_release); + // Because the forwarding is done with memory_order_relaxed there is no + // ordering with the above copy. Clients that get the forwardee must not + // examine its contents without other synchronization, since the contents + // may not be up to date for them. + oop forwardee = o->forward_to_atomic(new_obj, test_mark, memory_order_relaxed); if (forwardee == nullptr) { // forwardee is null when forwarding is successful // We won any races, we "own" this object. assert(new_obj == o->forwardee(), "Sanity"); @@ -295,9 +294,6 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o, return new_obj; } else { // We lost, someone else "owns" this object. - // Ensure loads from the forwardee follow all changes that preceded the - // release-cmpxchg that performed the forwarding in another thread. - OrderAccess::acquire(); assert(o->is_forwarded(), "Object must be forwarded if the cas failed."); assert(o->forwardee() == forwardee, "invariant"); From e1390056c9dbf0a02a131864ebee23435e997852 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Wed, 26 Jun 2024 08:44:17 +0000 Subject: [PATCH 189/471] 8333994: NMT: call stacks should show source information Reviewed-by: jsjolen, gziemski --- src/hotspot/share/nmt/memReporter.cpp | 10 +-- src/hotspot/share/nmt/memReporter.hpp | 10 ++- .../share/nmt/nativeCallStackPrinter.cpp | 55 ++++++++++++++ .../share/nmt/nativeCallStackPrinter.hpp | 51 +++++++++++++ .../share/nmt/virtualMemoryTracker.cpp | 6 +- .../share/utilities/nativeCallStack.cpp | 76 ++++++++++--------- .../share/utilities/nativeCallStack.hpp | 2 + .../NMT/CheckForProperDetailStackTrace.java | 34 ++++----- 8 files changed, 181 insertions(+), 63 deletions(-) create mode 100644 src/hotspot/share/nmt/nativeCallStackPrinter.cpp create mode 100644 src/hotspot/share/nmt/nativeCallStackPrinter.hpp diff --git a/src/hotspot/share/nmt/memReporter.cpp b/src/hotspot/share/nmt/memReporter.cpp index bd2f38acdd0a0..b09cf7ae2bdbc 100644 --- a/src/hotspot/share/nmt/memReporter.cpp +++ b/src/hotspot/share/nmt/memReporter.cpp @@ -337,7 +337,7 @@ int MemDetailReporter::report_malloc_sites() { continue; } const NativeCallStack* stack = malloc_site->call_stack(); - stack->print_on(out); + _stackprinter.print_stack(stack); MEMFLAGS flag = malloc_site->flag(); assert(NMTUtil::flag_is_valid(flag) && flag != mtNone, "Must have a valid memory type"); @@ -374,7 +374,7 @@ int MemDetailReporter::report_virtual_memory_allocation_sites() { continue; } const NativeCallStack* stack = virtual_memory_site->call_stack(); - stack->print_on(out); + _stackprinter.print_stack(stack); INDENT_BY(29, out->print("("); print_total(virtual_memory_site->reserved(), virtual_memory_site->committed()); @@ -428,7 +428,7 @@ void MemDetailReporter::report_virtual_memory_region(const ReservedMemoryRegion* out->cr(); } else { out->print_cr(" from"); - INDENT_BY(4, stack->print_on(out);) + INDENT_BY(4, _stackprinter.print_stack(stack);) } if (all_committed) { @@ -869,7 +869,7 @@ void MemDetailDiffReporter::diff_malloc_site(const NativeCallStack* stack, size_ return; } - stack->print_on(out); + _stackprinter.print_stack(stack); INDENT_BY(28, out->print("("); print_malloc_diff(current_size, current_count, early_size, early_count, flags); @@ -904,7 +904,7 @@ void MemDetailDiffReporter::diff_virtual_memory_site(const NativeCallStack* stac return; } - stack->print_on(out); + _stackprinter.print_stack(stack); INDENT_BY(28, out->print("(mmap: "); print_virtual_memory_diff(current_reserved, current_committed, early_reserved, early_committed); diff --git a/src/hotspot/share/nmt/memReporter.hpp b/src/hotspot/share/nmt/memReporter.hpp index c10a99795080a..095c05509391b 100644 --- a/src/hotspot/share/nmt/memReporter.hpp +++ b/src/hotspot/share/nmt/memReporter.hpp @@ -28,8 +28,10 @@ #include "memory/metaspace.hpp" #include "nmt/mallocTracker.hpp" #include "nmt/memBaseline.hpp" +#include "nmt/nativeCallStackPrinter.hpp" #include "nmt/nmtCommon.hpp" #include "nmt/virtualMemoryTracker.hpp" +#include "utilities/nativeCallStack.hpp" /* * Base class that provides helpers @@ -149,11 +151,11 @@ class MemSummaryReporter : public MemReporterBase { class MemDetailReporter : public MemSummaryReporter { private: MemBaseline& _baseline; - + NativeCallStackPrinter _stackprinter; public: MemDetailReporter(MemBaseline& baseline, outputStream* output, size_t scale = default_scale) : MemSummaryReporter(baseline, output, scale), - _baseline(baseline) { } + _baseline(baseline), _stackprinter(output) { } // Generate detail report. // The report contains summary and detail sections. @@ -229,10 +231,12 @@ class MemSummaryDiffReporter : public MemReporterBase { * both baselines have to be detail baseline. */ class MemDetailDiffReporter : public MemSummaryDiffReporter { + NativeCallStackPrinter _stackprinter; public: MemDetailDiffReporter(MemBaseline& early_baseline, MemBaseline& current_baseline, outputStream* output, size_t scale = default_scale) : - MemSummaryDiffReporter(early_baseline, current_baseline, output, scale) { } + MemSummaryDiffReporter(early_baseline, current_baseline, output, scale), + _stackprinter(output) { } // Generate detail comparison report virtual void report_diff(); diff --git a/src/hotspot/share/nmt/nativeCallStackPrinter.cpp b/src/hotspot/share/nmt/nativeCallStackPrinter.cpp new file mode 100644 index 0000000000000..70031698a7d80 --- /dev/null +++ b/src/hotspot/share/nmt/nativeCallStackPrinter.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. All rights reserved. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "logging/log.hpp" +#include "nmt/nativeCallStackPrinter.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/nativeCallStack.hpp" +#include "utilities/ostream.hpp" + +NativeCallStackPrinter::NativeCallStackPrinter(outputStream* out) : + _text_storage(mtNMT, Arena::Tag::tag_other, 128 * K), _out(out) +{} + +void NativeCallStackPrinter::print_stack(const NativeCallStack* stack) const { + for (int i = 0; i < NMT_TrackingStackDepth; i++) { + const address pc = stack->get_frame(i); + if (pc == nullptr) { + break; + } + bool created = false; + const char** cached_frame_text = _cache.put_if_absent(pc, &created); + if (created) { + stringStream ss(4 * K); + stack->print_frame(&ss, pc); + const size_t len = ss.size(); + char* store = NEW_ARENA_ARRAY(&_text_storage, char, len + 1); + memcpy(store, ss.base(), len + 1); + (*cached_frame_text) = store; + } + _out->print_raw_cr(*cached_frame_text); + } +} diff --git a/src/hotspot/share/nmt/nativeCallStackPrinter.hpp b/src/hotspot/share/nmt/nativeCallStackPrinter.hpp new file mode 100644 index 0000000000000..deebb338626eb --- /dev/null +++ b/src/hotspot/share/nmt/nativeCallStackPrinter.hpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. All rights reserved. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_NMT_NATIVECALLSTACKPRINTER_HPP +#define SHARE_NMT_NATIVECALLSTACKPRINTER_HPP + +#include "memory/arena.hpp" +#include "nmt/memflags.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/resourceHash.hpp" + +class outputStream; +class NativeCallStack; + +// This is a text cache for NativeCallStack frames by PC. When printing tons of +// NativeCallStack instances (e.g. during NMT detail reports), printing through +// this printer speeds up frame description resolution by quite a bit. +class NativeCallStackPrinter { + // Cache-related data are mutable to be able to use NativeCallStackPrinter as + // inline member in classes with const printing methods. + mutable Arena _text_storage; + mutable ResourceHashtable<address, const char*, 293, AnyObj::C_HEAP, mtNMT> _cache; + outputStream* const _out; +public: + NativeCallStackPrinter(outputStream* out); + void print_stack(const NativeCallStack* stack) const; +}; + +#endif // SHARE_NMT_NATIVECALLSTACKPRINTER_HPP diff --git a/src/hotspot/share/nmt/virtualMemoryTracker.cpp b/src/hotspot/share/nmt/virtualMemoryTracker.cpp index 46d7e4b644f9b..d25f3689a4268 100644 --- a/src/hotspot/share/nmt/virtualMemoryTracker.cpp +++ b/src/hotspot/share/nmt/virtualMemoryTracker.cpp @@ -26,6 +26,7 @@ #include "memory/metaspaceStats.hpp" #include "memory/metaspaceUtils.hpp" #include "nmt/memTracker.hpp" +#include "nmt/nativeCallStackPrinter.hpp" #include "nmt/threadStackTracker.hpp" #include "nmt/virtualMemoryTracker.hpp" #include "runtime/os.hpp" @@ -679,16 +680,17 @@ class PrintRegionWalker : public VirtualMemoryWalker { private: const address _p; outputStream* _st; + NativeCallStackPrinter _stackprinter; public: PrintRegionWalker(const void* p, outputStream* st) : - _p((address)p), _st(st) { } + _p((address)p), _st(st), _stackprinter(st) { } bool do_allocation_site(const ReservedMemoryRegion* rgn) { if (rgn->contain_address(_p)) { _st->print_cr(PTR_FORMAT " in mmap'd memory region [" PTR_FORMAT " - " PTR_FORMAT "], tag %s", p2i(_p), p2i(rgn->base()), p2i(rgn->base() + rgn->size()), NMTUtil::flag_to_enum_name(rgn->flag())); if (MemTracker::tracking_level() == NMT_detail) { - rgn->call_stack()->print_on(_st); + _stackprinter.print_stack(rgn->call_stack()); _st->cr(); } return false; diff --git a/src/hotspot/share/utilities/nativeCallStack.cpp b/src/hotspot/share/utilities/nativeCallStack.cpp index 873f3856b74e8..cc4796f54d393 100644 --- a/src/hotspot/share/utilities/nativeCallStack.cpp +++ b/src/hotspot/share/utilities/nativeCallStack.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,44 +72,48 @@ int NativeCallStack::frames() const { } // Decode and print this call path -void NativeCallStack::print_on(outputStream* out) const { - DEBUG_ONLY(assert_not_fake();) - address pc; + +void NativeCallStack::print_frame(outputStream* out, address pc) const { char buf[1024]; int offset; - if (is_empty()) { - out->print("[BOOTSTRAP]"); - } else { - for (int frame = 0; frame < NMT_TrackingStackDepth; frame ++) { - pc = get_frame(frame); - if (pc == nullptr) break; - out->print("[" PTR_FORMAT "]", p2i(pc)); - // Print function and library; shorten library name to just its last component - // for brevity, and omit it completely for libjvm.so - bool function_printed = false; - if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) { - out->print("%s+0x%x", buf, offset); - function_printed = true; - } - if ((!function_printed || !os::address_is_in_vm(pc)) && - os::dll_address_to_library_name(pc, buf, sizeof(buf), &offset)) { - const char* libname = strrchr(buf, os::file_separator()[0]); - if (libname != nullptr) { - libname++; - } else { - libname = buf; - } - out->print(" in %s", libname); - if (!function_printed) { - out->print("+0x%x", offset); - } + int line; + const bool pc_in_VM = os::address_is_in_vm(pc); + out->print("[" PTR_FORMAT "]", p2i(pc)); + // Print function and library; shorten library name to just its last component + // for brevity, and omit it completely for libjvm.so + bool function_printed = false; + if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) { + out->print("%s+0x%x", buf, offset); + function_printed = true; + if (Decoder::get_source_info(pc, buf, sizeof(buf), &line, false)) { + // For intra-vm functions, we omit the full path + const char* s = buf; + if (pc_in_VM) { + s = strrchr(s, os::file_separator()[0]); + s = (s != nullptr) ? s + 1 : buf; } - - // Note: we deliberately omit printing source information here. NativeCallStack::print_on() - // can be called thousands of times as part of NMT detail reporting, and source printing - // can slow down reporting by a factor of 5 or more depending on platform (see JDK-8296931). - - out->cr(); + out->print(" (%s:%d)", s, line); + } + } + if ((!function_printed || !pc_in_VM) && + os::dll_address_to_library_name(pc, buf, sizeof(buf), &offset)) { + const char* libname = strrchr(buf, os::file_separator()[0]); + if (libname != nullptr) { + libname++; + } else { + libname = buf; + } + out->print(" in %s", libname); + if (!function_printed) { + out->print("+0x%x", offset); } } } + +void NativeCallStack::print_on(outputStream* out) const { + DEBUG_ONLY(assert_not_fake();) + for (int i = 0; i < NMT_TrackingStackDepth && _stack[i] != nullptr; i++) { + print_frame(out, _stack[i]); + } + out->cr(); +} diff --git a/src/hotspot/share/utilities/nativeCallStack.hpp b/src/hotspot/share/utilities/nativeCallStack.hpp index 6c04169146e87..3ab72d67eca30 100644 --- a/src/hotspot/share/utilities/nativeCallStack.hpp +++ b/src/hotspot/share/utilities/nativeCallStack.hpp @@ -28,6 +28,7 @@ #include "memory/allocation.hpp" #include "nmt/nmtCommon.hpp" #include "utilities/ostream.hpp" +#include "utilities/resourceHash.hpp" /* * This class represents a native call path (does not include Java frame) @@ -123,6 +124,7 @@ class NativeCallStack : public StackObj { return (unsigned int)hash; } + void print_frame(outputStream* out, address pc) const; void print_on(outputStream* out) const; }; diff --git a/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java b/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java index 411676b1b6393..049d70702665e 100644 --- a/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java +++ b/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,6 +58,8 @@ public class CheckForProperDetailStackTrace { private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); private static final Path MODS_DIR = Paths.get(TEST_CLASSES, "mods"); + private static final boolean expectSourceInformation = Platform.isLinux() || Platform.isWindows(); + /* The stack trace we look for by default. Note that :: has been replaced by .* to make sure it matches even if the symbol is not unmangled. */ @@ -121,29 +123,27 @@ public static void main(String args[]) throws Exception { // It's ok for ARM not to have symbols, because it does not support NMT detail // when targeting thumb2. It's also ok for Windows not to have symbols, because // they are only available if the symbols file is included with the build. - if (Platform.isWindows() || Platform.isARM()) { - return; // we are done + if (!Platform.isWindows() && !Platform.isARM()) { + output.reportDiagnosticSummary(); + throw new RuntimeException("Expected symbol missing from output: " + expectedSymbol); } - output.reportDiagnosticSummary(); - throw new RuntimeException("Expected symbol missing from output: " + expectedSymbol); } // Make sure the expected NMT detail stack trace is found System.out.println("Looking for a stack matching:"); - if (okToHaveAllocateHeap) { - System.out.print(stackTraceAllocateHeap); - if (stackTraceMatches(stackTraceAllocateHeap, output)) { - return; - } - } else { - System.out.print(stackTraceDefault); - if (stackTraceMatches(stackTraceDefault, output)) { - return; + String toMatch = okToHaveAllocateHeap ? stackTraceAllocateHeap : stackTraceDefault; + if (!stackTraceMatches(toMatch, output)) { + output.reportDiagnosticSummary(); + throw new RuntimeException("Expected stack trace missing from output"); + } + + System.out.println("Looking for source information:"); + if (expectSourceInformation) { + if (!stackTraceMatches(".*moduleEntry.cpp.*", output)) { + output.reportDiagnosticSummary(); + throw new RuntimeException("Expected source information missing from output"); } } - // Failed to match so dump all the output - output.reportDiagnosticSummary(); - throw new RuntimeException("Expected stack trace missing from output"); } public static boolean stackTraceMatches(String stackTrace, OutputAnalyzer output) { From 7f6804ceb63568d72e825d45b02d08f314c9b0fc Mon Sep 17 00:00:00 2001 From: Adam Sotona <asotona@openjdk.org> Date: Wed, 26 Jun 2024 09:09:13 +0000 Subject: [PATCH 190/471] 8334872: BigEndian: java/lang/invoke/condy Tests failing since JDK-8294960 Reviewed-by: redestad --- .../java/lang/invoke/ClassSpecializer.java | 386 ++++++++++-------- 1 file changed, 206 insertions(+), 180 deletions(-) diff --git a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java index cca05a906ff08..1df3b3c662825 100644 --- a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java +++ b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java @@ -31,6 +31,7 @@ import java.lang.constant.ClassDesc; import java.lang.constant.MethodTypeDesc; import java.lang.invoke.LambdaForm.BasicType; +import java.lang.invoke.InnerClassLambdaMetafactory.MethodBody; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -39,6 +40,7 @@ import java.util.List; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; import java.util.function.Function; import jdk.internal.constant.MethodTypeDescImpl; @@ -66,6 +68,8 @@ abstract class ClassSpecializer<T,K,S extends ClassSpecializer<T,K,S>.SpeciesDat private static final ClassDesc CD_LambdaForm = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm;"); private static final ClassDesc CD_BoundMethodHandle = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/BoundMethodHandle;"); + private static final Consumer<FieldBuilder> STATIC_FIELD_FLAGS = new InnerClassLambdaMetafactory.FieldFlags(ACC_STATIC); + private static final Consumer<FieldBuilder> FINAL_FIELD_FLAGS = new InnerClassLambdaMetafactory.FieldFlags(ACC_FINAL); private final Class<T> topClass; private final Class<K> keyType; @@ -613,198 +617,220 @@ Class<? extends T> generateConcreteSpeciesCode(String className, ClassSpecialize byte[] generateConcreteSpeciesCodeFile(String className0, ClassSpecializer<T,K,S>.SpeciesData speciesData) { final ClassDesc classDesc = ClassDesc.of(className0); final ClassDesc superClassDesc = classDesc(speciesData.deriveSuperClass()); - return ClassFile.of().build(classDesc, clb -> { - clb.withFlags(ACC_FINAL | ACC_SUPER) - .withSuperclass(superClassDesc) - .with(SourceFileAttribute.of(classDesc.displayName())) - - // emit static types and BMH_SPECIES fields - .withField(sdFieldName, CD_SPECIES_DATA, ACC_STATIC); - - // handy holder for dealing with groups of typed values (ctor arguments and fields) - class Var { - final int index; - final String name; - final Class<?> type; - final ClassDesc desc; - final BasicType basicType; - final int slotIndex; - Var(int index, int slotIndex) { - this.index = index; - this.slotIndex = slotIndex; - name = null; type = null; desc = null; - basicType = BasicType.V_TYPE; - } - Var(String name, Class<?> type, Var prev) { - int slotIndex = prev.nextSlotIndex(); - int index = prev.nextIndex(); - if (name == null) name = "x"; - if (name.endsWith("#")) - name = name.substring(0, name.length()-1) + index; - assert(!type.equals(void.class)); - this.index = index; - this.name = name; - this.type = type; - this.desc = classDesc(type); - this.basicType = BasicType.basicType(type); - this.slotIndex = slotIndex; - } - Var lastOf(List<Var> vars) { - int n = vars.size(); - return (n == 0 ? this : vars.get(n-1)); - } - <X> List<Var> fromTypes(List<X> types) { - Var prev = this; - ArrayList<Var> result = new ArrayList<>(types.size()); - int i = 0; - for (X x : types) { - String vn = name; - Class<?> vt; - if (x instanceof Class<?> cl) { - vt = cl; - // make the names friendlier if debugging - assert((vn = vn + "_" + (i++)) != null); - } else { - @SuppressWarnings("unchecked") - Var v = (Var) x; - vn = v.name; - vt = v.type; + return ClassFile.of().build(classDesc, new Consumer<ClassBuilder>() { + @Override + public void accept(ClassBuilder clb) { + clb.withFlags(ACC_FINAL | ACC_SUPER) + .withSuperclass(superClassDesc) + .with(SourceFileAttribute.of(classDesc.displayName())) + + // emit static types and BMH_SPECIES fields + .withField(sdFieldName, CD_SPECIES_DATA, STATIC_FIELD_FLAGS); + + // handy holder for dealing with groups of typed values (ctor arguments and fields) + class Var { + final int index; + final String name; + final Class<?> type; + final ClassDesc desc; + final BasicType basicType; + final int slotIndex; + Var(int index, int slotIndex) { + this.index = index; + this.slotIndex = slotIndex; + name = null; type = null; desc = null; + basicType = BasicType.V_TYPE; + } + Var(String name, Class<?> type, Var prev) { + int slotIndex = prev.nextSlotIndex(); + int index = prev.nextIndex(); + if (name == null) name = "x"; + if (name.endsWith("#")) + name = name.substring(0, name.length()-1) + index; + assert(!type.equals(void.class)); + this.index = index; + this.name = name; + this.type = type; + this.desc = classDesc(type); + this.basicType = BasicType.basicType(type); + this.slotIndex = slotIndex; + } + Var lastOf(List<Var> vars) { + int n = vars.size(); + return (n == 0 ? this : vars.get(n-1)); + } + <X> List<Var> fromTypes(List<X> types) { + Var prev = this; + ArrayList<Var> result = new ArrayList<>(types.size()); + int i = 0; + for (X x : types) { + String vn = name; + Class<?> vt; + if (x instanceof Class<?> cl) { + vt = cl; + // make the names friendlier if debugging + assert((vn = vn + "_" + (i++)) != null); + } else { + @SuppressWarnings("unchecked") + Var v = (Var) x; + vn = v.name; + vt = v.type; + } + prev = new Var(vn, vt, prev); + result.add(prev); } - prev = new Var(vn, vt, prev); - result.add(prev); + return result; } - return result; - } - - int slotSize() { return basicType.basicTypeSlots(); } - int nextIndex() { return index + (slotSize() == 0 ? 0 : 1); } - int nextSlotIndex() { return slotIndex >= 0 ? slotIndex + slotSize() : slotIndex; } - boolean isInHeap() { return slotIndex < 0; } - void emitLoadInstruction(CodeBuilder cob) { - cob.loadLocal(basicType.btKind, slotIndex); - } - } - - final Var NO_THIS = new Var(0, 0), - AFTER_THIS = new Var(0, 1), - IN_HEAP = new Var(0, -1); - - // figure out the field types - final List<Class<?>> fieldTypes = speciesData.fieldTypes(); - final List<Var> fields = new ArrayList<>(fieldTypes.size()); - { - Var nextF = IN_HEAP; - for (Class<?> ft : fieldTypes) { - String fn = chooseFieldName(ft, nextF.nextIndex()); - nextF = new Var(fn, ft, nextF); - fields.add(nextF); - } - } - - // emit bound argument fields - for (Var field : fields) { - clb.withField(field.name, field.desc, ACC_FINAL); - } - - // emit implementation of speciesData() - clb.withMethodBody(SPECIES_DATA_NAME, MTD_SPECIES_DATA, (SPECIES_DATA_MODS & ACC_PPP) | ACC_FINAL, - cob -> cob.getstatic(classDesc, sdFieldName, CD_SPECIES_DATA) - .areturn()); - // figure out the constructor arguments - MethodType superCtorType = ClassSpecializer.this.baseConstructorType(); - MethodType thisCtorType = superCtorType.appendParameterTypes(fieldTypes); - - // emit constructor - clb.withMethodBody(INIT_NAME, methodDesc(thisCtorType), ACC_PRIVATE, cob -> { - cob.aload(0); // this - - final List<Var> ctorArgs = AFTER_THIS.fromTypes(superCtorType.parameterList()); - for (Var ca : ctorArgs) { - ca.emitLoadInstruction(cob); + int slotSize() { return basicType.basicTypeSlots(); } + int nextIndex() { return index + (slotSize() == 0 ? 0 : 1); } + int nextSlotIndex() { return slotIndex >= 0 ? slotIndex + slotSize() : slotIndex; } + boolean isInHeap() { return slotIndex < 0; } + void emitLoadInstruction(CodeBuilder cob) { + cob.loadLocal(basicType.btKind, slotIndex); + } } - // super(ca...) - cob.invokespecial(superClassDesc, INIT_NAME, methodDesc(superCtorType)); - - // store down fields - Var lastFV = AFTER_THIS.lastOf(ctorArgs); - for (Var f : fields) { - // this.argL1 = argL1 - cob.aload(0); // this - lastFV = new Var(f.name, f.type, lastFV); - lastFV.emitLoadInstruction(cob); - cob.putfield(classDesc, f.name, f.desc); + final Var NO_THIS = new Var(0, 0), + AFTER_THIS = new Var(0, 1), + IN_HEAP = new Var(0, -1); + + // figure out the field types + final List<Class<?>> fieldTypes = speciesData.fieldTypes(); + final List<Var> fields = new ArrayList<>(fieldTypes.size()); + { + Var nextF = IN_HEAP; + for (Class<?> ft : fieldTypes) { + String fn = chooseFieldName(ft, nextF.nextIndex()); + nextF = new Var(fn, ft, nextF); + fields.add(nextF); + } } - cob.return_(); - }); - - // emit make() ...factory method wrapping constructor - MethodType ftryType = thisCtorType.changeReturnType(topClass()); - clb.withMethodBody("make", methodDesc(ftryType), ACC_STATIC, cob -> { - // make instance - cob.new_(classDesc) - .dup(); - // load factory method arguments: ctarg... and arg... - for (Var v : NO_THIS.fromTypes(ftryType.parameterList())) { - v.emitLoadInstruction(cob); + // emit bound argument fields + for (Var field : fields) { + clb.withField(field.name, field.desc, FINAL_FIELD_FLAGS); } - // finally, invoke the constructor and return - cob.invokespecial(classDesc, INIT_NAME, methodDesc(thisCtorType)) - .areturn(); - }); - - // For each transform, emit the customized override of the transform method. - // This method mixes together some incoming arguments (from the transform's - // static type signature) with the field types themselves, and passes - // the resulting mish-mosh of values to a method handle produced by - // the species itself. (Typically this method handle is the factory - // method of this species or a related one.) - for (int i = 0; i < TRANSFORM_NAMES.size(); i++) { - final int whichtm = i; - final String TNAME = TRANSFORM_NAMES.get(whichtm); - final MethodType TTYPE = TRANSFORM_TYPES.get(whichtm); - final int TMODS = TRANSFORM_MODS.get(whichtm); - clb.withMethod(TNAME, methodDesc(TTYPE), (TMODS & ACC_PPP) | ACC_FINAL, mb -> { - mb.with(ExceptionsAttribute.ofSymbols(CD_Throwable)) - .withCode(cob -> { - // return a call to the corresponding "transform helper", something like this: - // MY_SPECIES.transformHelper(whichtm).invokeBasic(ctarg, ..., argL0, ..., xarg) - cob.getstatic(classDesc, sdFieldName, CD_SPECIES_DATA) - .loadConstant(whichtm) - .invokevirtual(CD_SPECIES_DATA, "transformHelper", MTD_TRANFORM_HELPER); - - List<Var> targs = AFTER_THIS.fromTypes(TTYPE.parameterList()); - List<Var> tfields = new ArrayList<>(fields); - // mix them up and load them for the transform helper: - List<Var> helperArgs = speciesData.deriveTransformHelperArguments(transformMethods.get(whichtm), whichtm, targs, tfields); - ClassDesc[] helperTypes = new ClassDesc[helperArgs.size()]; - for (int hi = 0; hi < helperTypes.length; hi++) { - Var ha = helperArgs.get(hi); - helperTypes[hi] = ha.basicType.basicTypeWrapper().basicClassDescriptor(); - if (ha.isInHeap()) { - assert(tfields.contains(ha)); - cob.aload(0); - cob.getfield(classDesc, ha.name, ha.desc); - } else { - assert(targs.contains(ha)); - ha.emitLoadInstruction(cob); + // emit implementation of speciesData() + clb.withMethod(SPECIES_DATA_NAME, MTD_SPECIES_DATA, (SPECIES_DATA_MODS & ACC_PPP) | ACC_FINAL, + new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + cob.getstatic(classDesc, sdFieldName, CD_SPECIES_DATA) + .areturn(); } - } - - // jump into the helper (which is probably a factory method) - final Class<?> rtype = TTYPE.returnType(); - if (!rtype.isPrimitive()) { - cob.invokevirtual(CD_MethodHandle, "invokeBasic", MethodTypeDescImpl.ofValidated(CD_Object, helperTypes)) - .checkcast(classDesc(rtype)) - .areturn(); - } else { - throw newInternalError("NYI: transform of type "+rtype); + })); + + // figure out the constructor arguments + MethodType superCtorType = ClassSpecializer.this.baseConstructorType(); + MethodType thisCtorType = superCtorType.appendParameterTypes(fieldTypes); + + // emit constructor + clb.withMethod(INIT_NAME, methodDesc(thisCtorType), ACC_PRIVATE, + new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + cob.aload(0); // this + + final List<Var> ctorArgs = AFTER_THIS.fromTypes(superCtorType.parameterList()); + for (Var ca : ctorArgs) { + ca.emitLoadInstruction(cob); + } + + // super(ca...) + cob.invokespecial(superClassDesc, INIT_NAME, methodDesc(superCtorType)); + + // store down fields + Var lastFV = AFTER_THIS.lastOf(ctorArgs); + for (Var f : fields) { + // this.argL1 = argL1 + cob.aload(0); // this + lastFV = new Var(f.name, f.type, lastFV); + lastFV.emitLoadInstruction(cob); + cob.putfield(classDesc, f.name, f.desc); + } + + cob.return_(); + } + })); + + // emit make() ...factory method wrapping constructor + MethodType ftryType = thisCtorType.changeReturnType(topClass()); + clb.withMethod("make", methodDesc(ftryType), ACC_STATIC, + new MethodBody(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + // make instance + cob.new_(classDesc) + .dup(); + // load factory method arguments: ctarg... and arg... + for (Var v : NO_THIS.fromTypes(ftryType.parameterList())) { + v.emitLoadInstruction(cob); + } + + // finally, invoke the constructor and return + cob.invokespecial(classDesc, INIT_NAME, methodDesc(thisCtorType)) + .areturn(); + } + })); + + // For each transform, emit the customized override of the transform method. + // This method mixes together some incoming arguments (from the transform's + // static type signature) with the field types themselves, and passes + // the resulting mish-mosh of values to a method handle produced by + // the species itself. (Typically this method handle is the factory + // method of this species or a related one.) + for (int i = 0; i < TRANSFORM_NAMES.size(); i++) { + final int whichtm = i; + final String TNAME = TRANSFORM_NAMES.get(whichtm); + final MethodType TTYPE = TRANSFORM_TYPES.get(whichtm); + final int TMODS = TRANSFORM_MODS.get(whichtm); + clb.withMethod(TNAME, methodDesc(TTYPE), (TMODS & ACC_PPP) | ACC_FINAL, new Consumer<MethodBuilder>() { + @Override + public void accept(MethodBuilder mb) { + mb.with(ExceptionsAttribute.ofSymbols(CD_Throwable)) + .withCode(new Consumer<CodeBuilder>() { + @Override + public void accept(CodeBuilder cob) { + // return a call to the corresponding "transform helper", something like this: + // MY_SPECIES.transformHelper(whichtm).invokeBasic(ctarg, ..., argL0, ..., xarg) + cob.getstatic(classDesc, sdFieldName, CD_SPECIES_DATA) + .loadConstant(whichtm) + .invokevirtual(CD_SPECIES_DATA, "transformHelper", MTD_TRANFORM_HELPER); + + List<Var> targs = AFTER_THIS.fromTypes(TTYPE.parameterList()); + List<Var> tfields = new ArrayList<>(fields); + // mix them up and load them for the transform helper: + List<Var> helperArgs = speciesData.deriveTransformHelperArguments(transformMethods.get(whichtm), whichtm, targs, tfields); + ClassDesc[] helperTypes = new ClassDesc[helperArgs.size()]; + for (int hi = 0; hi < helperTypes.length; hi++) { + Var ha = helperArgs.get(hi); + helperTypes[hi] = ha.basicType.basicTypeWrapper().basicClassDescriptor(); + if (ha.isInHeap()) { + assert(tfields.contains(ha)); + cob.aload(0); + cob.getfield(classDesc, ha.name, ha.desc); + } else { + assert(targs.contains(ha)); + ha.emitLoadInstruction(cob); + } + } + + // jump into the helper (which is probably a factory method) + final Class<?> rtype = TTYPE.returnType(); + if (!rtype.isPrimitive()) { + cob.invokevirtual(CD_MethodHandle, "invokeBasic", MethodTypeDescImpl.ofValidated(CD_Object, helperTypes)) + .checkcast(classDesc(rtype)) + .areturn(); + } else { + throw newInternalError("NYI: transform of type "+rtype); + } + } + }); } }); - }); + } } }); } From 4ce8822b6c53b8bd72713f1bfaf6673b91aabea4 Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore <mcimadamore@openjdk.org> Date: Wed, 26 Jun 2024 09:12:02 +0000 Subject: [PATCH 191/471] 8334037: Local class creation in lambda in pre-construction context crashes javac 8333313: NullPointerException in lambda instantiating an inner local class in prologue 8333766: Stack overflow with anonymous class in super() parameter 8334679: Wrong bug number in regression test for JDK-8334252 Co-authored-by: Archie Cobbs <acobbs@openjdk.org> Reviewed-by: jlahoda, vromero --- .../sun/tools/javac/comp/CompileStates.java | 4 +- .../sun/tools/javac/comp/LambdaToMethod.java | 675 +----------------- .../com/sun/tools/javac/comp/Lower.java | 480 +++++++++++-- .../sun/tools/javac/main/JavaCompiler.java | 18 +- .../com/sun/tools/javac/tree/JCTree.java | 1 + .../com/sun/tools/javac/tree/TreeInfo.java | 2 + .../javac/SuperInit/AnonSuperLambdaCrash.java | 42 ++ .../javac/SuperInit/EarlyLocalTest1.java | 43 ++ .../javac/SuperInit/EarlyLocalTest4.java | 47 ++ .../javac/SuperInit/EarlyLocalTest5.java | 49 ++ .../javac/SuperInit/EarlyLocalTest6.java | 48 ++ .../javac/SuperInit/EarlyLocalTest7.java | 44 ++ .../SuperInit/LambdaLocalEarlyCrash.java | 57 ++ .../javac/SuperInit/LambdaOuterCapture.java | 2 +- .../javac/lambda/T8129740/Universe.java.out | 32 +- 15 files changed, 793 insertions(+), 751 deletions(-) create mode 100644 test/langtools/tools/javac/SuperInit/AnonSuperLambdaCrash.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyLocalTest1.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyLocalTest4.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyLocalTest5.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyLocalTest6.java create mode 100644 test/langtools/tools/javac/SuperInit/EarlyLocalTest7.java create mode 100644 test/langtools/tools/javac/SuperInit/LambdaLocalEarlyCrash.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/CompileStates.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/CompileStates.java index b044f956fdf58..cbeedfcbadebb 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/CompileStates.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/CompileStates.java @@ -60,8 +60,8 @@ public enum CompileState { FLOW(5), TRANSTYPES(6), TRANSPATTERNS(7), - UNLAMBDA(8), - LOWER(9), + LOWER(8), + UNLAMBDA(9), GENERATE(10); CompileState(int value) { diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java index 7e5dcee0e8d67..66d499f54fede 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -40,20 +40,15 @@ import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.DynamicMethodSymbol; import com.sun.tools.javac.code.Symbol.MethodSymbol; -import com.sun.tools.javac.code.Symbol.TypeSymbol; import com.sun.tools.javac.code.Symbol.VarSymbol; import com.sun.tools.javac.code.Symtab; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.MethodType; -import com.sun.tools.javac.code.Type.TypeVar; import com.sun.tools.javac.code.Types; import com.sun.tools.javac.comp.LambdaToMethod.LambdaAnalyzerPreprocessor.*; -import com.sun.tools.javac.comp.Lower.BasicFreeVarCollector; import com.sun.tools.javac.resources.CompilerProperties.Notes; -import com.sun.tools.javac.jvm.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; -import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import java.util.EnumMap; import java.util.HashMap; @@ -72,7 +67,6 @@ import static com.sun.tools.javac.tree.JCTree.Tag.*; import javax.lang.model.element.ElementKind; -import javax.lang.model.type.TypeKind; import com.sun.tools.javac.main.Option; @@ -126,9 +120,6 @@ public class LambdaToMethod extends TreeTranslator { /** deduplicate lambda implementation methods */ private final boolean deduplicateLambdas; - /** lambda proxy is a dynamic nestmate */ - private final boolean nestmateLambdas; - /** Flag for alternate metafactories indicating the lambda object is intended to be serializable */ public static final int FLAG_SERIALIZABLE = 1 << 0; @@ -175,7 +166,6 @@ private LambdaToMethod(Context context) { debugLinesOrVars = lineDebugInfo || varDebugInfo; verboseDeduplication = options.isSet("debug.dumpLambdaToMethodDeduplication"); deduplicateLambdas = options.getBoolean("deduplicateLambdas", true); - nestmateLambdas = Target.instance(context).runtimeUseNestAccess(); } // </editor-fold> @@ -284,6 +274,7 @@ public JCTree translateTopLevelClass(Env<AttrContext> env, JCTree cdef, TreeMake this.attrEnv = env; this.context = null; this.contextMap = new HashMap<>(); + cdef = analyzer.analyzeAndPreprocessClass((JCClassDecl) cdef); return translate(cdef); } // </editor-fold> @@ -297,10 +288,6 @@ public JCTree translateTopLevelClass(Env<AttrContext> env, JCTree cdef, TreeMake */ @Override public void visitClassDef(JCClassDecl tree) { - if (tree.sym.owner.kind == PCK) { - //analyze class - tree = analyzer.analyzeAndPreprocessClass(tree); - } KlassInfo prevKlassInfo = kInfo; try { kInfo = new KlassInfo(tree); @@ -418,9 +405,7 @@ public void visitLambda(JCLambda tree) { ListBuffer<JCExpression> syntheticInits = new ListBuffer<>(); - if (localContext.methodReferenceReceiver != null) { - syntheticInits.append(localContext.methodReferenceReceiver); - } else if (!sym.isStatic()) { + if (!sym.isStatic()) { syntheticInits.append(makeThis( sym.owner.enclClass().asType(), localContext.owner.enclClass())); @@ -433,11 +418,6 @@ public void visitLambda(JCLambda tree) { syntheticInits.append(captured_local); } } - // add captured outer this instances (used only when `this' capture itself is illegal) - for (Symbol fv : localContext.getSymbolMap(CAPTURED_OUTER_THIS).keySet()) { - JCExpression captured_local = make.QualThis(fv.type); - syntheticInits.append(captured_local); - } //then, determine the arguments to the indy call List<JCExpression> indy_args = translate(syntheticInits.toList(), localContext.prev); @@ -553,54 +533,6 @@ public void visitIdent(JCIdent tree) { } } - /** - * Translate qualified `this' references within a lambda to the mapped identifier - * @param tree - */ - @Override - public void visitSelect(JCFieldAccess tree) { - if (context == null || !analyzer.lambdaFieldAccessFilter(tree)) { - super.visitSelect(tree); - } else { - int prevPos = make.pos; - try { - make.at(tree); - - LambdaTranslationContext lambdaContext = (LambdaTranslationContext) context; - JCTree ltree = lambdaContext.translate(tree); - if (ltree != null) { - result = ltree; - } else { - super.visitSelect(tree); - } - } finally { - make.at(prevPos); - } - } - } - - /** - * Translate instance creation expressions with implicit enclosing instances - * @param tree - */ - @Override - public void visitNewClass(JCNewClass tree) { - if (context == null || !analyzer.lambdaNewClassFilter(context, tree)) { - super.visitNewClass(tree); - } else { - int prevPos = make.pos; - try { - make.at(tree); - - LambdaTranslationContext lambdaContext = (LambdaTranslationContext) context; - tree = lambdaContext.translate(tree); - super.visitNewClass(tree); - } finally { - make.at(prevPos); - } - } - } - @Override public void visitVarDef(JCVariableDecl tree) { LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context; @@ -725,7 +657,7 @@ private JCMethodDecl makeDeserializeMethod(Symbol kSym) { deser.sym = kInfo.deserMethodSym; deser.type = kInfo.deserMethodSym.type; //System.err.printf("DESER: '%s'\n", deser); - return deser; + return lower.translateMethod(attrEnv, deser, make); } /** Make an attributed class instance creation expression. @@ -857,245 +789,8 @@ private VarSymbol makeSyntheticVar(long flags, Name name, Type type, Symbol owne return new VarSymbol(flags | SYNTHETIC, name, type, owner); } - /** - * Set varargsElement field on a given tree (must be either a new class tree - * or a method call tree) - */ - private void setVarargsIfNeeded(JCTree tree, Type varargsElement) { - if (varargsElement != null) { - switch (tree.getTag()) { - case APPLY: ((JCMethodInvocation)tree).varargsElement = varargsElement; break; - case NEWCLASS: ((JCNewClass)tree).varargsElement = varargsElement; break; - case TYPECAST: setVarargsIfNeeded(((JCTypeCast) tree).expr, varargsElement); break; - default: throw new AssertionError(); - } - } - } - - /** - * Convert method/constructor arguments by inserting appropriate cast - * as required by type-erasure - this is needed when bridging a lambda/method - * reference, as the bridged signature might require downcast to be compatible - * with the generated signature. - */ - private List<JCExpression> convertArgs(Symbol meth, List<JCExpression> args, Type varargsElement) { - Assert.check(meth.kind == MTH); - List<Type> formals = types.erasure(meth.type).getParameterTypes(); - if (varargsElement != null) { - Assert.check((meth.flags() & VARARGS) != 0); - } - return transTypes.translateArgs(args, formals, varargsElement, attrEnv); - } - // </editor-fold> - /** - * Converts a method reference which cannot be used directly into a lambda - */ - private class MemberReferenceToLambda { - - private final JCMemberReference tree; - private final ReferenceTranslationContext localContext; - private final Symbol owner; - private final ListBuffer<JCExpression> args = new ListBuffer<>(); - private final ListBuffer<JCVariableDecl> params = new ListBuffer<>(); - - private JCExpression receiverExpression = null; - - MemberReferenceToLambda(JCMemberReference tree, ReferenceTranslationContext localContext, Symbol owner) { - this.tree = tree; - this.localContext = localContext; - this.owner = owner; - } - - JCLambda lambda() { - int prevPos = make.pos; - try { - make.at(tree); - - //body generation - this can be either a method call or a - //new instance creation expression, depending on the member reference kind - VarSymbol rcvr = addParametersReturnReceiver(); - JCExpression expr = (tree.getMode() == ReferenceMode.INVOKE) - ? expressionInvoke(rcvr) - : expressionNew(); - - JCLambda slam = make.Lambda(params.toList(), expr); - slam.target = tree.target; - slam.type = tree.type; - slam.pos = tree.pos; - return slam; - } finally { - make.at(prevPos); - } - } - - /** - * Generate the parameter list for the converted member reference. - * - * @return The receiver variable symbol, if any - */ - VarSymbol addParametersReturnReceiver() { - Type samDesc = localContext.bridgedRefSig(); - List<Type> samPTypes = samDesc.getParameterTypes(); - List<Type> descPTypes = tree.getDescriptorType(types).getParameterTypes(); - - // Determine the receiver, if any - VarSymbol rcvr; - switch (tree.kind) { - case BOUND: - // The receiver is explicit in the method reference - rcvr = addParameter("rec$", tree.getQualifierExpression().type, false); - receiverExpression = attr.makeNullCheck(tree.getQualifierExpression()); - break; - case UNBOUND: - // The receiver is the first parameter, extract it and - // adjust the SAM and unerased type lists accordingly - rcvr = addParameter("rec$", samDesc.getParameterTypes().head, false); - samPTypes = samPTypes.tail; - descPTypes = descPTypes.tail; - break; - default: - rcvr = null; - break; - } - List<Type> implPTypes = tree.sym.type.getParameterTypes(); - int implSize = implPTypes.size(); - int samSize = samPTypes.size(); - // Last parameter to copy from referenced method, exclude final var args - int last = localContext.needsVarArgsConversion() ? implSize - 1 : implSize; - - // Failsafe -- assure match-up - boolean checkForIntersection = tree.varargsElement != null || implSize == descPTypes.size(); - - // Use parameter types of the implementation method unless the unerased - // SAM parameter type is an intersection type, in that case use the - // erased SAM parameter type so that the supertype relationship - // the implementation method parameters is not obscured. - // Note: in this loop, the lists implPTypes, samPTypes, and descPTypes - // are used as pointers to the current parameter type information - // and are thus not usable afterwards. - for (int i = 0; implPTypes.nonEmpty() && i < last; ++i) { - // By default use the implementation method parameter type - Type parmType = implPTypes.head; - if (checkForIntersection) { - if (descPTypes.head.getKind() == TypeKind.INTERSECTION) { - parmType = samPTypes.head; - } - // If the unerased parameter type is a type variable whose - // bound is an intersection (eg. <T extends A & B>) then - // use the SAM parameter type - if (descPTypes.head.getKind() == TypeKind.TYPEVAR) { - TypeVar tv = (TypeVar) descPTypes.head; - if (tv.getUpperBound().getKind() == TypeKind.INTERSECTION) { - parmType = samPTypes.head; - } - } - } - addParameter("x$" + i, parmType, true); - - // Advance to the next parameter - implPTypes = implPTypes.tail; - samPTypes = samPTypes.tail; - descPTypes = descPTypes.tail; - } - // Flatten out the var args - for (int i = last; i < samSize; ++i) { - addParameter("xva$" + i, tree.varargsElement, true); - } - - return rcvr; - } - - JCExpression getReceiverExpression() { - return receiverExpression; - } - - private JCExpression makeReceiver(VarSymbol rcvr) { - if (rcvr == null) return null; - JCExpression rcvrExpr = make.Ident(rcvr); - boolean protAccess = - isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, owner); - Type rcvrType = tree.ownerAccessible && !protAccess ? tree.sym.enclClass().type - : tree.expr.type; - if (rcvrType == syms.arrayClass.type) { - // Map the receiver type to the actually type, not just "array" - rcvrType = tree.getQualifierExpression().type; - } - if (!rcvr.type.tsym.isSubClass(rcvrType.tsym, types)) { - rcvrExpr = make.TypeCast(make.Type(rcvrType), rcvrExpr).setType(rcvrType); - } - return rcvrExpr; - } - - /** - * determine the receiver of the method call - the receiver can - * be a type qualifier, the synthetic receiver parameter or 'super'. - */ - private JCExpression expressionInvoke(VarSymbol rcvr) { - JCExpression qualifier = - (rcvr != null) ? - makeReceiver(rcvr) : - tree.getQualifierExpression(); - - //create the qualifier expression - JCFieldAccess select = make.Select(qualifier, tree.sym.name); - select.sym = tree.sym; - select.type = tree.sym.erasure(types); - - //create the method call expression - JCExpression apply = make.Apply(List.nil(), select, - convertArgs(tree.sym, args.toList(), tree.varargsElement)). - setType(tree.sym.erasure(types).getReturnType()); - - apply = transTypes.coerce(attrEnv, apply, - types.erasure(localContext.tree.referentType.getReturnType())); - - setVarargsIfNeeded(apply, tree.varargsElement); - return apply; - } - - /** - * Lambda body to use for a 'new'. - */ - private JCExpression expressionNew() { - if (tree.kind == ReferenceKind.ARRAY_CTOR) { - //create the array creation expression - JCNewArray newArr = make.NewArray( - make.Type(types.elemtype(tree.getQualifierExpression().type)), - List.of(make.Ident(params.first())), - null); - newArr.type = tree.getQualifierExpression().type; - return newArr; - } else { - //create the instance creation expression - //note that method reference syntax does not allow an explicit - //enclosing class (so the enclosing class is null) - // but this may need to be patched up later with the proxy for the outer this - JCNewClass newClass = make.NewClass(null, - List.nil(), - make.Type(tree.getQualifierExpression().type), - convertArgs(tree.sym, args.toList(), tree.varargsElement), - null); - newClass.constructor = tree.sym; - newClass.constructorType = tree.sym.erasure(types); - newClass.type = tree.getQualifierExpression().type; - setVarargsIfNeeded(newClass, tree.varargsElement); - return newClass; - } - } - - private VarSymbol addParameter(String name, Type p, boolean genArg) { - VarSymbol vsym = new VarSymbol(PARAMETER | SYNTHETIC, names.fromString(name), p, owner); - vsym.pos = tree.pos; - params.append(make.VarDef(vsym, null)); - if (genArg) { - args.append(make.Ident(vsym)); - } - return vsym; - } - } - private MethodType typeToMethodType(Type mt) { Type type = types.erasure(mt); return new MethodType(type.getParameterTypes(), @@ -1238,11 +933,6 @@ class LambdaAnalyzerPreprocessor extends TreeTranslator { */ private int lambdaCount = 0; - /** - * List of types undergoing construction, i.e., in an early construction context. - */ - private List<ClassSymbol> typesUnderConstruction; - /** * keep the count of lambda expression defined in given context (used to * generate unambiguous names for serializable lambdas) @@ -1273,30 +963,10 @@ int getIndex(StringBuilder buf) { private JCClassDecl analyzeAndPreprocessClass(JCClassDecl tree) { frameStack = List.nil(); - typesUnderConstruction = List.nil(); localClassDefs = new HashMap<>(); return translate(tree); } - @Override - public void visitApply(JCMethodInvocation tree) { - super.visitApply(tree); - if (TreeInfo.isConstructorCall(tree)) { - Assert.check(typesUnderConstruction.head == currentClass()); - typesUnderConstruction = typesUnderConstruction.tail; // end of early construction context - } - } - // where - private ClassSymbol currentClass() { - for (Frame frame : frameStack) { - if (frame.tree.hasTag(JCTree.Tag.CLASSDEF)) { - JCClassDecl cdef = (JCClassDecl) frame.tree; - return cdef.sym; - } - } - return null; - } - @Override public void visitBlock(JCBlock tree) { List<Frame> prevStack = frameStack; @@ -1329,21 +999,6 @@ public void visitClassDef(JCClassDecl tree) { } if (directlyEnclosingLambda() != null) { tree.sym.owner = owner(); - if (tree.sym.hasOuterInstance()) { - //if a class is defined within a lambda, the lambda must capture - //its enclosing instance (if any) - TranslationContext<?> localContext = context(); - final TypeSymbol outerInstanceSymbol = tree.sym.type.getEnclosingType().tsym; - while (localContext != null && !localContext.owner.isStatic()) { - if (localContext.tree.hasTag(LAMBDA)) { - JCTree block = capturedDecl(localContext.depth, outerInstanceSymbol); - if (block == null) break; - ((LambdaTranslationContext)localContext) - .addSymbol(outerInstanceSymbol, CAPTURED_THIS); - } - localContext = localContext.prev; - } - } } frameStack = frameStack.prepend(new Frame(tree)); super.visitClassDef(tree); @@ -1398,16 +1053,7 @@ public void visitIdent(JCIdent tree) { @Override public void visitLambda(JCLambda tree) { - analyzeLambda(tree, "lambda.stat"); - } - - private void analyzeLambda(JCLambda tree, JCExpression methodReferenceReceiver) { - // Translation of the receiver expression must occur first - JCExpression rcvr = translate(methodReferenceReceiver); - LambdaTranslationContext context = analyzeLambda(tree, "mref.stat.1"); - if (rcvr != null) { - context.methodReferenceReceiver = rcvr; - } + analyzeLambda(tree, tree.wasMethodReference ? "mref.stat.1" : "lambda.stat"); } private LambdaTranslationContext analyzeLambda(JCLambda tree, String statKey) { @@ -1434,85 +1080,14 @@ private LambdaTranslationContext analyzeLambda(JCLambda tree, String statKey) { @Override public void visitMethodDef(JCMethodDecl tree) { - List<ClassSymbol> prevTypesUnderConstruction = typesUnderConstruction; List<Frame> prevStack = frameStack; try { - if (TreeInfo.isConstructor(tree)) // start early construction context (Object() notwithstanding) - typesUnderConstruction = typesUnderConstruction.prepend(currentClass()); frameStack = frameStack.prepend(new Frame(tree)); super.visitMethodDef(tree); - } finally { - frameStack = prevStack; - typesUnderConstruction = prevTypesUnderConstruction; - } - } - - @Override - public void visitNewClass(JCNewClass tree) { - TypeSymbol def = tree.type.tsym; - boolean inReferencedClass = currentlyInClass(def); - boolean isLocal = def.isDirectlyOrIndirectlyLocal(); - if ((inReferencedClass && isLocal || lambdaNewClassFilter(context(), tree))) { - TranslationContext<?> localContext = context(); - final TypeSymbol outerInstanceSymbol = tree.type.getEnclosingType().tsym; - while (localContext != null && !localContext.owner.isStatic()) { - if (localContext.tree.hasTag(LAMBDA)) { - if (outerInstanceSymbol != null) { - JCTree block = capturedDecl(localContext.depth, outerInstanceSymbol); - if (block == null) break; - } - ((LambdaTranslationContext)localContext) - .addSymbol(outerInstanceSymbol, CAPTURED_THIS); - } - localContext = localContext.prev; - } } - super.visitNewClass(tree); - if (context() != null && !inReferencedClass && isLocal) { - LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context(); - captureLocalClassDefs(def, lambdaContext); - } - } - //where - void captureLocalClassDefs(Symbol csym, final LambdaTranslationContext lambdaContext) { - JCClassDecl localCDef = localClassDefs.get(csym); - if (localCDef != null && lambdaContext.freeVarProcessedLocalClasses.add(csym)) { - BasicFreeVarCollector fvc = lower.new BasicFreeVarCollector() { - @Override - void addFreeVars(ClassSymbol c) { - captureLocalClassDefs(c, lambdaContext); - } - @Override - void visitSymbol(Symbol sym) { - if (sym.kind == VAR && - sym.owner.kind == MTH && - ((VarSymbol)sym).getConstValue() == null) { - TranslationContext<?> localContext = context(); - while (localContext != null) { - if (localContext.tree.getTag() == LAMBDA) { - JCTree block = capturedDecl(localContext.depth, sym); - if (block == null) break; - ((LambdaTranslationContext)localContext).addSymbol(sym, CAPTURED_VAR); - } - localContext = localContext.prev; - } - } - } - }; - fvc.scan(localCDef); - } - } - //where - boolean currentlyInClass(Symbol csym) { - for (Frame frame : frameStack) { - if (frame.tree.hasTag(JCTree.Tag.CLASSDEF)) { - JCClassDecl cdef = (JCClassDecl) frame.tree; - if (cdef.sym == csym) { - return true; - } - } + finally { + frameStack = prevStack; } - return false; } /** @@ -1531,15 +1106,9 @@ boolean currentlyInClass(Symbol csym) { public void visitReference(JCMemberReference tree) { ReferenceTranslationContext rcontext = new ReferenceTranslationContext(tree); contextMap.put(tree, rcontext); - if (rcontext.needsConversionToLambda()) { - // Convert to a lambda, and process as such - MemberReferenceToLambda conv = new MemberReferenceToLambda(tree, rcontext, owner()); - analyzeLambda(conv.lambda(), conv.getReceiverExpression()); - } else { - super.visitReference(tree); - if (dumpLambdaToMethodStats) { - log.note(tree, Notes.MrefStat(rcontext.needsAltMetafactory(), null)); - } + super.visitReference(tree); + if (dumpLambdaToMethodStats) { + log.note(tree, Notes.MrefStat(rcontext.needsAltMetafactory(), null)); } } @@ -1773,42 +1342,6 @@ private boolean lambdaIdentSymbolFilter(Symbol sym) { && sym.name != names.init; } - /** - * This is used to filter out those select nodes that need to be adjusted - * when translating away lambda expressions - at the moment, this is the - * set of nodes that select `this' (qualified this) - */ - private boolean lambdaFieldAccessFilter(JCFieldAccess fAccess) { - return (context instanceof LambdaTranslationContext lambdaContext) - && !fAccess.sym.isStatic() - && fAccess.name == names._this - && (fAccess.sym.owner.kind == TYP) - && !lambdaContext.translatedSymbols.get(CAPTURED_OUTER_THIS).isEmpty(); - } - - /** - * This is used to filter out those new class expressions that need to - * be qualified with an enclosing tree - */ - private boolean lambdaNewClassFilter(TranslationContext<?> context, JCNewClass tree) { - if (context != null - && tree.encl == null - && tree.def == null - && !tree.type.getEnclosingType().hasTag(NONE)) { - Type encl = tree.type.getEnclosingType(); - Type current = context.owner.enclClass().type; - while (!current.hasTag(NONE)) { - if (current.tsym.isSubClass(encl.tsym, types)) { - return true; - } - current = current.getEnclosingType(); - } - return false; - } else { - return false; - } - } - private class Frame { final JCTree tree; List<Symbol> locals; @@ -1918,18 +1451,6 @@ class LambdaTranslationContext extends TranslationContext<JCLambda> { List<JCVariableDecl> syntheticParams; - /** - * to prevent recursion, track local classes processed - */ - final Set<Symbol> freeVarProcessedLocalClasses; - - /** - * For method references converted to lambdas. The method - * reference receiver expression. Must be treated like a captured - * variable. - */ - JCExpression methodReferenceReceiver; - LambdaTranslationContext(JCLambda tree) { super(tree); Frame frame = frameStack.head; @@ -1960,13 +1481,10 @@ public MethodSymbol originalEnclosingMethod() { } translatedSymbols = new EnumMap<>(LambdaSymbolKind.class); - translatedSymbols.put(PARAM, new LinkedHashMap<Symbol, Symbol>()); - translatedSymbols.put(LOCAL_VAR, new LinkedHashMap<Symbol, Symbol>()); - translatedSymbols.put(CAPTURED_VAR, new LinkedHashMap<Symbol, Symbol>()); - translatedSymbols.put(CAPTURED_THIS, new LinkedHashMap<Symbol, Symbol>()); - translatedSymbols.put(CAPTURED_OUTER_THIS, new LinkedHashMap<Symbol, Symbol>()); - - freeVarProcessedLocalClasses = new HashSet<>(); + translatedSymbols.put(PARAM, new LinkedHashMap<>()); + translatedSymbols.put(LOCAL_VAR, new LinkedHashMap<>()); + translatedSymbols.put(CAPTURED_VAR, new LinkedHashMap<>()); + translatedSymbols.put(CAPTURED_THIS, new LinkedHashMap<>()); } /** @@ -2066,16 +1584,6 @@ public Symbol baseSymbol() { } }; break; - case CAPTURED_OUTER_THIS: - Name name = names.fromString(sym.flatName().toString().replace('.', '$') + names.dollarThis); - ret = new VarSymbol(SYNTHETIC | FINAL | PARAMETER, name, types.erasure(sym.type), translatedSym) { - @Override - public Symbol baseSymbol() { - //keep mapping with original captured symbol - return sym; - } - }; - break; case LOCAL_VAR: ret = new VarSymbol(sym.flags() & FINAL, sym.name, sym.type, translatedSym) { @Override @@ -2114,14 +1622,6 @@ public Symbol baseSymbol() { } void addSymbol(Symbol sym, LambdaSymbolKind skind) { - if (skind == CAPTURED_THIS && sym != null && sym.kind == TYP && !typesUnderConstruction.isEmpty()) { - ClassSymbol currentClass = currentClass(); - if (currentClass != null && typesUnderConstruction.contains(currentClass)) { - // reference must be to enclosing outer instance, mutate capture kind. - Assert.check(sym != currentClass); // should have been caught right in Attr - skind = CAPTURED_OUTER_THIS; - } - } Map<Symbol, Symbol> transMap = getSymbolMap(skind); if (!transMap.containsKey(sym)) { transMap.put(sym, translate(sym, skind)); @@ -2145,54 +1645,11 @@ JCTree translate(JCIdent lambdaIdent) { return t; } break; - case CAPTURED_OUTER_THIS: - Optional<Symbol> proxy = m.keySet().stream() - .filter(out -> lambdaIdent.sym.isMemberOf(out.type.tsym, types)) - .reduce((a, b) -> a.isEnclosedBy((ClassSymbol)b) ? a : b); - if (proxy.isPresent()) { - // Transform outer instance variable references anchoring them to the captured synthetic. - Symbol tSym = m.get(proxy.get()); - JCExpression t = make.Ident(tSym).setType(lambdaIdent.sym.owner.type); - t = make.Select(t, lambdaIdent.name); - t.setType(lambdaIdent.type); - TreeInfo.setSymbol(t, lambdaIdent.sym); - return t; - } - break; } } return null; } - /* Translate away qualified this expressions, anchoring them to synthetic parameters that - capture the qualified this handle. `fieldAccess' is guaranteed to one such. - */ - public JCTree translate(JCFieldAccess fieldAccess) { - Assert.check(fieldAccess.name == names._this); - Map<Symbol, Symbol> m = translatedSymbols.get(LambdaSymbolKind.CAPTURED_OUTER_THIS); - if (m.containsKey(fieldAccess.sym.owner)) { - Symbol tSym = m.get(fieldAccess.sym.owner); - JCExpression t = make.Ident(tSym).setType(fieldAccess.sym.owner.type); - return t; - } - return null; - } - - /* Translate away naked new instance creation expressions with implicit enclosing instances, - anchoring them to synthetic parameters that stand proxy for the qualified outer this handle. - */ - public JCNewClass translate(JCNewClass newClass) { - Assert.check(newClass.clazz.type.tsym.hasOuterInstance() && newClass.encl == null); - Map<Symbol, Symbol> m = translatedSymbols.get(LambdaSymbolKind.CAPTURED_OUTER_THIS); - final Type enclosingType = newClass.clazz.type.getEnclosingType(); - if (m.containsKey(enclosingType.tsym)) { - Symbol tSym = m.get(enclosingType.tsym); - JCExpression encl = make.Ident(tSym).setType(enclosingType); - newClass.encl = encl; - } - return newClass; - } - /** * The translatedSym is not complete/accurate until the analysis is * finished. Once the analysis is finished, the translatedSym is @@ -2230,10 +1687,6 @@ void complete() { params.append(make.VarDef((VarSymbol) thisSym, null)); parameterSymbols.append((VarSymbol) thisSym); } - for (Symbol thisSym : getSymbolMap(CAPTURED_OUTER_THIS).values()) { - params.append(make.VarDef((VarSymbol) thisSym, null)); - parameterSymbols.append((VarSymbol) thisSym); - } for (Symbol thisSym : getSymbolMap(PARAM).values()) { params.append(make.VarDef((VarSymbol) thisSym, null)); parameterSymbols.append((VarSymbol) thisSym); @@ -2259,102 +1712,12 @@ Type generatedLambdaSig() { } /** - * This class retains all the useful information about a method reference; - * the contents of this class are filled by the LambdaAnalyzer visitor, - * and the used by the main translation routines in order to adjust method - * references (i.e. in case a bridge is needed) + * Simple subclass modelling the translation context of a method reference. */ final class ReferenceTranslationContext extends TranslationContext<JCMemberReference> { - final boolean isSuper; - ReferenceTranslationContext(JCMemberReference tree) { super(tree); - this.isSuper = tree.hasKind(ReferenceKind.SUPER); - } - - boolean needsVarArgsConversion() { - return tree.varargsElement != null; - } - - /** - * @return Is this an array operation like clone() - */ - boolean isArrayOp() { - return tree.sym.owner == syms.arrayClass; - } - - boolean receiverAccessible() { - //hack needed to workaround 292 bug (7087658) - //when 292 issue is fixed we should remove this and change the backend - //code to always generate a method handle to an accessible method - return tree.ownerAccessible; - } - - /** - * This method should be called only when target release <= 14 - * where LambdaMetaFactory does not spin nestmate classes. - * - * This method should be removed when --release 14 is not supported. - */ - boolean isPrivateInOtherClass() { - assert !nestmateLambdas; - return (tree.sym.flags() & PRIVATE) != 0 && - !types.isSameType( - types.erasure(tree.sym.enclClass().asType()), - types.erasure(owner.enclClass().asType())); - } - - /** - * Erasure destroys the implementation parameter subtype - * relationship for intersection types. - * Have similar problems for union types too. - */ - boolean interfaceParameterIsIntersectionOrUnionType() { - List<Type> tl = tree.getDescriptorType(types).getParameterTypes(); - for (; tl.nonEmpty(); tl = tl.tail) { - Type pt = tl.head; - if (isIntersectionOrUnionType(pt)) - return true; - } - return false; - } - - boolean isIntersectionOrUnionType(Type t) { - switch (t.getKind()) { - case INTERSECTION: - case UNION: - return true; - case TYPEVAR: - TypeVar tv = (TypeVar) t; - return isIntersectionOrUnionType(tv.getUpperBound()); - } - return false; - } - - /** - * Does this reference need to be converted to a lambda - * (i.e. var args need to be expanded or "super" is used) - */ - final boolean needsConversionToLambda() { - return interfaceParameterIsIntersectionOrUnionType() || - isSuper || - needsVarArgsConversion() || - isArrayOp() || - (!nestmateLambdas && isPrivateInOtherClass()) || - isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, owner) || - !receiverAccessible() || - (tree.getMode() == ReferenceMode.NEW && - tree.kind != ReferenceKind.ARRAY_CTOR && - (tree.sym.owner.isDirectlyOrIndirectlyLocal() || tree.sym.owner.isInner())); - } - - Type generatedRefSig() { - return types.erasure(tree.sym.type); - } - - Type bridgedRefSig() { - return types.erasure(types.findDescriptorSymbol(tree.target.tsym).type); } } } @@ -2368,14 +1731,12 @@ enum LambdaSymbolKind { PARAM, // original to translated lambda parameters LOCAL_VAR, // original to translated lambda locals CAPTURED_VAR, // variables in enclosing scope to translated synthetic parameters - CAPTURED_THIS, // class symbols to translated synthetic parameters (for captured member access) - CAPTURED_OUTER_THIS; // used when `this' capture is illegal, but outer this capture is legit (JDK-8129740) + CAPTURED_THIS; // class symbols to translated synthetic parameters (for captured member access) boolean propagateAnnotations() { switch (this) { case CAPTURED_VAR: case CAPTURED_THIS: - case CAPTURED_OUTER_THIS: return false; default: return true; @@ -2417,12 +1778,6 @@ private String classSig(Type type) { } } - private boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage(Symbol targetReference, - Symbol currentClass) { - return ((targetReference.flags() & PROTECTED) != 0 && - targetReference.packge() != currentClass.packge()); - } - /** * Signature Generation */ diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java index da0e3f9c747ac..7ab38e86366be 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java @@ -28,6 +28,8 @@ import java.util.*; import java.util.stream.Collectors; +import com.sun.source.tree.LambdaExpressionTree.BodyKind; +import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Kinds.KindSelector; import com.sun.tools.javac.code.Scope.WriteableScope; @@ -35,7 +37,9 @@ import com.sun.tools.javac.jvm.PoolConstant.LoadableConstant; import com.sun.tools.javac.main.Option.PkgInfo; import com.sun.tools.javac.resources.CompilerProperties.Fragments; +import com.sun.tools.javac.resources.CompilerProperties.Notes; import com.sun.tools.javac.tree.*; +import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.List; @@ -62,6 +66,9 @@ import com.sun.tools.javac.tree.JCTree.JCExpressionStatement; import static com.sun.tools.javac.tree.JCTree.JCOperatorExpression.OperandPos.LEFT; import com.sun.tools.javac.tree.JCTree.JCSwitchExpression; + +import javax.lang.model.type.TypeKind; + import static com.sun.tools.javac.tree.JCTree.Tag.*; /** This pass translates away some syntactic sugar: inner classes, @@ -103,6 +110,7 @@ public static Lower instance(Context context) { private final boolean optimizeOuterThis; private final boolean useMatchException; private final HashMap<TypePairs, String> typePairToName; + private int variableIndex = 0; @SuppressWarnings("this-escape") protected Lower(Context context) { @@ -170,6 +178,11 @@ protected Lower(Context context) { */ Map<Symbol,Symbol> actualSymbols; + /** + * The current expected return type. + */ + Type currentRestype; + /** The current method definition. */ JCMethodDecl currentMethodDef; @@ -186,12 +199,6 @@ protected Lower(Context context) { */ JCTree outermostMemberDef; - /** A map from local variable symbols to their translation (as per LambdaToMethod). - * This is required when a capturing local class is created from a lambda (in which - * case the captured symbols should be replaced with the translated lambda symbols). - */ - Map<Symbol, Symbol> lambdaTranslationMap = null; - /** A navigator class for assembling a mapping from local class symbols * to class definition trees. * There is only one case; all other cases simply traverse down the tree. @@ -1233,14 +1240,10 @@ JCExpression access(Symbol sym, JCExpression tree, JCExpression enclOp, boolean make.at(tree.pos); return makeLit(sym.type, cv); } - if (lambdaTranslationMap != null && lambdaTranslationMap.get(sym) != null) { - return make.at(tree.pos).Ident(lambdaTranslationMap.get(sym)); - } else { - // Otherwise replace the variable by its proxy. - sym = proxies.get(sym); - Assert.check(sym != null && (sym.flags_field & FINAL) != 0); - tree = make.at(tree.pos).Ident(sym); - } + // Otherwise replace the variable by its proxy. + sym = proxies.get(sym); + Assert.check(sym != null && (sym.flags_field & FINAL) != 0); + tree = make.at(tree.pos).Ident(sym); } JCExpression base = (tree.hasTag(SELECT)) ? ((JCFieldAccess) tree).selected : null; switch (sym.kind) { @@ -1325,14 +1328,6 @@ JCExpression access(Symbol sym, JCExpression tree, JCExpression enclOp, boolean accessBase(tree.pos(), sym), sym).setType(tree.type); } } - } else if (sym.owner.kind == MTH && lambdaTranslationMap != null) { - //sym is a local variable - check the lambda translation map to - //see if sym has been translated to something else in the current - //scope (by LambdaToMethod) - Symbol translatedSym = lambdaTranslationMap.get(sym.baseSymbol()); - if (translatedSym != null) { - tree = make.at(tree.pos).Ident(translatedSym); - } } } return tree; @@ -2779,15 +2774,21 @@ public void visitMethodDef(JCMethodDecl tree) { syms.methodClass); } + Type prevRestype = currentRestype; JCMethodDecl prevMethodDef = currentMethodDef; MethodSymbol prevMethodSym = currentMethodSym; + int prevVariableIndex = variableIndex; try { + currentRestype = types.erasure(tree.type.getReturnType()); currentMethodDef = tree; currentMethodSym = tree.sym; + variableIndex = 0; visitMethodDefInternal(tree); } finally { + currentRestype = prevRestype; currentMethodDef = prevMethodDef; currentMethodSym = prevMethodSym; + variableIndex = prevVariableIndex; } } @@ -2866,16 +2867,7 @@ private void visitMethodDefInternal(JCMethodDecl tree) { outerThisStack = prevOuterThisStack; } else { - Map<Symbol, Symbol> prevLambdaTranslationMap = - lambdaTranslationMap; - try { - lambdaTranslationMap = (tree.sym.flags() & SYNTHETIC) != 0 && - tree.sym.name.startsWith(names.lambda) ? - makeTranslationMap(tree) : null; - super.visitMethodDef(tree); - } finally { - lambdaTranslationMap = prevLambdaTranslationMap; - } + super.visitMethodDef(tree); } if (tree.name == names.init && ((tree.sym.flags_field & Flags.COMPACT_RECORD_CONSTRUCTOR) != 0 || (tree.sym.flags_field & (GENERATEDCONSTR | RECORD)) == (GENERATEDCONSTR | RECORD))) { @@ -2901,17 +2893,6 @@ private void visitMethodDefInternal(JCMethodDecl tree) { } result = tree; } - //where - private Map<Symbol, Symbol> makeTranslationMap(JCMethodDecl tree) { - Map<Symbol, Symbol> translationMap = new HashMap<>(); - for (JCVariableDecl vd : tree.params) { - Symbol p = vd.sym; - if (p != p.baseSymbol()) { - translationMap.put(p.baseSymbol(), p); - } - } - return translationMap; - } public void visitTypeCast(JCTypeCast tree) { tree.clazz = translate(tree.clazz); @@ -2973,7 +2954,7 @@ public void visitTypeTest(JCInstanceOf tree) { // preserving the side effects of the value VarSymbol dollar_s = new VarSymbol(FINAL | SYNTHETIC, - names.fromString("tmp" + tree.pos + this.target.syntheticNameChar()), + names.fromString("tmp" + variableIndex++ + this.target.syntheticNameChar()), types.erasure(tree.expr.type), currentMethodSym); JCStatement var = make.at(tree.pos()) @@ -3132,13 +3113,7 @@ public void visitNewClass(JCNewClass tree) { // If we have an anonymous class, create its flat version, rather // than the class or interface following new. if (tree.def != null) { - Map<Symbol, Symbol> prevLambdaTranslationMap = lambdaTranslationMap; - try { - lambdaTranslationMap = null; - translate(tree.def); - } finally { - lambdaTranslationMap = prevLambdaTranslationMap; - } + translate(tree.def); tree.clazz = access(make_at(tree.clazz.pos()).Ident(tree.def.sym)); tree.def = null; @@ -3358,6 +3333,9 @@ public void visitApply(JCMethodInvocation tree) { return; } } + if (tree.args.stream().anyMatch(c -> c == null)) { + throw new AssertionError("Whooops before: " + tree); + } result = tree; } @@ -3845,6 +3823,7 @@ private void visitIterableForeachLoop(JCEnhancedForLoop tree) { public void visitVarDef(JCVariableDecl tree) { MethodSymbol oldMethodSym = currentMethodSym; + int prevVariableIndex = variableIndex; tree.mods = translate(tree.mods); tree.vartype = translate(tree.vartype); if (currentMethodSym == null) { @@ -3854,9 +3833,13 @@ public void visitVarDef(JCVariableDecl tree) { names.empty, null, currentClass); } - if (tree.init != null) tree.init = translate(tree.init, tree.type); - result = tree; - currentMethodSym = oldMethodSym; + try { + if (tree.init != null) tree.init = translate(tree.init, tree.type); + result = tree; + } finally { + currentMethodSym = oldMethodSym; + variableIndex = prevVariableIndex; + } } public void visitBlock(JCBlock tree) { @@ -3868,8 +3851,14 @@ public void visitBlock(JCBlock tree) { names.empty, null, currentClass); } - super.visitBlock(tree); - currentMethodSym = oldMethodSym; + int prevVariableIndex = variableIndex; + try { + variableIndex = 0; + super.visitBlock(tree); + } finally { + currentMethodSym = oldMethodSym; + variableIndex = prevVariableIndex; + } } public void visitDoLoop(JCDoWhileLoop tree) { @@ -3896,11 +3885,355 @@ public void visitForLoop(JCForLoop tree) { public void visitReturn(JCReturn tree) { if (tree.expr != null) tree.expr = translate(tree.expr, - types.erasure(currentMethodDef - .restype.type)); + currentRestype); result = tree; } + @Override + public void visitLambda(JCLambda tree) { + Type prevRestype = currentRestype; + try { + currentRestype = types.erasure(tree.getDescriptorType(types)).getReturnType(); + tree.body = tree.getBodyKind() == BodyKind.EXPRESSION ? + translate((JCExpression) tree.body, currentRestype) : + translate(tree.body); + } finally { + currentRestype = prevRestype; + } + result = tree; + } + + @Override + public void visitReference(JCMemberReference tree) { + if (needsConversionToLambda(tree)) { + // Convert to a lambda, and process as such + MemberReferenceToLambda conv = new MemberReferenceToLambda(tree); + result = translate(conv.lambda()); + } else { + super.visitReference(tree); + } + } + // where + boolean needsVarArgsConversion(JCMemberReference tree) { + return tree.varargsElement != null; + } + + /** + * @return Is this an array operation like clone() + */ + boolean isArrayOp(JCMemberReference tree) { + return tree.sym.owner == syms.arrayClass; + } + + boolean receiverAccessible(JCMemberReference tree) { + //hack needed to workaround 292 bug (7087658) + //when 292 issue is fixed we should remove this and change the backend + //code to always generate a method handle to an accessible method + return tree.ownerAccessible; + } + + /** + * Erasure destroys the implementation parameter subtype + * relationship for intersection types. + * Have similar problems for union types too. + */ + boolean interfaceParameterIsIntersectionOrUnionType(JCMemberReference tree) { + List<Type> tl = tree.getDescriptorType(types).getParameterTypes(); + for (; tl.nonEmpty(); tl = tl.tail) { + Type pt = tl.head; + if (isIntersectionOrUnionType(pt)) + return true; + } + return false; + } + + boolean isIntersectionOrUnionType(Type t) { + switch (t.getKind()) { + case INTERSECTION: + case UNION: + return true; + case TYPEVAR: + TypeVar tv = (TypeVar) t; + return isIntersectionOrUnionType(tv.getUpperBound()); + } + return false; + } + + private boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage(Symbol targetReference, + Symbol currentClass) { + return ((targetReference.flags() & PROTECTED) != 0 && + targetReference.packge() != currentClass.packge()); + } + + /** + * This method should be called only when target release <= 14 + * where LambdaMetaFactory does not spin nestmate classes. + * + * This method should be removed when --release 14 is not supported. + */ + boolean isPrivateInOtherClass(JCMemberReference tree) { + assert !target.runtimeUseNestAccess(); + return (tree.sym.flags() & PRIVATE) != 0 && + !types.isSameType( + types.erasure(tree.sym.enclClass().asType()), + types.erasure(currentClass.asType())); + } + + /** + * Does this reference need to be converted to a lambda + * (i.e. var args need to be expanded or "super" is used) + */ + boolean needsConversionToLambda(JCMemberReference tree) { + return interfaceParameterIsIntersectionOrUnionType(tree) || + tree.hasKind(ReferenceKind.SUPER) || + needsVarArgsConversion(tree) || + isArrayOp(tree) || + (!target.runtimeUseNestAccess() && isPrivateInOtherClass(tree)) || + isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, currentClass) || + !receiverAccessible(tree) || + (tree.getMode() == ReferenceMode.NEW && + tree.kind != ReferenceKind.ARRAY_CTOR && + (tree.sym.owner.isDirectlyOrIndirectlyLocal() || tree.sym.owner.isInner())); + } + + /** + * Converts a method reference which cannot be used directly into a lambda + */ + private class MemberReferenceToLambda { + + private final JCMemberReference tree; + private final ListBuffer<JCExpression> args = new ListBuffer<>(); + private final ListBuffer<JCVariableDecl> params = new ListBuffer<>(); + private final MethodSymbol owner = new MethodSymbol(0, names.empty, Type.noType, currentClass); + + private JCExpression receiverExpression = null; + + MemberReferenceToLambda(JCMemberReference tree) { + this.tree = tree; + } + + JCExpression lambda() { + int prevPos = make.pos; + try { + make.at(tree); + + //body generation - this can be either a method call or a + //new instance creation expression, depending on the member reference kind + VarSymbol rcvr = addParametersReturnReceiver(); + JCExpression expr = (tree.getMode() == ReferenceMode.INVOKE) + ? expressionInvoke(rcvr) + : expressionNew(); + + JCLambda slam = make.Lambda(params.toList(), expr); + slam.target = tree.target; + slam.type = tree.type; + slam.pos = tree.pos; + slam.wasMethodReference = true; + if (receiverExpression != null) { + // use a let expression so that the receiver expression is evaluated eagerly + return make.at(tree.pos).LetExpr( + make.VarDef(rcvr, translate(receiverExpression)), slam).setType(tree.type); + } else { + return slam; + } + } finally { + make.at(prevPos); + } + } + + /** + * Generate the parameter list for the converted member reference. + * + * @return The receiver variable symbol, if any + */ + VarSymbol addParametersReturnReceiver() { + Type samDesc = types.erasure(types.findDescriptorSymbol(tree.target.tsym).type); + List<Type> samPTypes = samDesc.getParameterTypes(); + List<Type> descPTypes = tree.getDescriptorType(types).getParameterTypes(); + + // Determine the receiver, if any + VarSymbol rcvr; + switch (tree.kind) { + case BOUND: + // The receiver is explicit in the method reference + rcvr = new VarSymbol(SYNTHETIC, names.fromString("rec$"), tree.getQualifierExpression().type, owner); + rcvr.pos = tree.pos; + receiverExpression = attr.makeNullCheck(tree.getQualifierExpression()); + break; + case UNBOUND: + // The receiver is the first parameter, extract it and + // adjust the SAM and unerased type lists accordingly + rcvr = addParameter("rec$", samDesc.getParameterTypes().head, false); + samPTypes = samPTypes.tail; + descPTypes = descPTypes.tail; + break; + default: + rcvr = null; + break; + } + List<Type> implPTypes = tree.sym.type.getParameterTypes(); + int implSize = implPTypes.size(); + int samSize = samPTypes.size(); + // Last parameter to copy from referenced method, exclude final var args + int last = needsVarArgsConversion(tree) ? implSize - 1 : implSize; + + // Failsafe -- assure match-up + boolean checkForIntersection = tree.varargsElement != null || implSize == descPTypes.size(); + + // Use parameter types of the implementation method unless the unerased + // SAM parameter type is an intersection type, in that case use the + // erased SAM parameter type so that the supertype relationship + // the implementation method parameters is not obscured. + // Note: in this loop, the lists implPTypes, samPTypes, and descPTypes + // are used as pointers to the current parameter type information + // and are thus not usable afterwards. + for (int i = 0; implPTypes.nonEmpty() && i < last; ++i) { + // By default use the implementation method parameter type + Type parmType = implPTypes.head; + if (checkForIntersection) { + if (descPTypes.head.getKind() == TypeKind.INTERSECTION) { + parmType = samPTypes.head; + } + // If the unerased parameter type is a type variable whose + // bound is an intersection (eg. <T extends A & B>) then + // use the SAM parameter type + if (descPTypes.head.getKind() == TypeKind.TYPEVAR) { + TypeVar tv = (TypeVar) descPTypes.head; + if (tv.getUpperBound().getKind() == TypeKind.INTERSECTION) { + parmType = samPTypes.head; + } + } + } + addParameter("x$" + i, parmType, true); + + // Advance to the next parameter + implPTypes = implPTypes.tail; + samPTypes = samPTypes.tail; + descPTypes = descPTypes.tail; + } + // Flatten out the var args + for (int i = last; i < samSize; ++i) { + addParameter("xva$" + i, tree.varargsElement, true); + } + + return rcvr; + } + + private JCExpression makeReceiver(VarSymbol rcvr) { + if (rcvr == null) return null; + JCExpression rcvrExpr = make.Ident(rcvr); + boolean protAccess = + isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, currentClass); + Type rcvrType = tree.ownerAccessible && !protAccess ? tree.sym.enclClass().type + : tree.expr.type; + if (rcvrType == syms.arrayClass.type) { + // Map the receiver type to the actually type, not just "array" + rcvrType = tree.getQualifierExpression().type; + } + if (!rcvr.type.tsym.isSubClass(rcvrType.tsym, types)) { + rcvrExpr = make.TypeCast(make.Type(rcvrType), rcvrExpr).setType(rcvrType); + } + return rcvrExpr; + } + + /** + * determine the receiver of the method call - the receiver can + * be a type qualifier, the synthetic receiver parameter or 'super'. + */ + private JCExpression expressionInvoke(VarSymbol rcvr) { + JCExpression qualifier = + (rcvr != null) ? + makeReceiver(rcvr) : + tree.getQualifierExpression(); + + //create the qualifier expression + JCFieldAccess select = make.Select(qualifier, tree.sym.name); + select.sym = tree.sym; + select.type = tree.sym.erasure(types); + + //create the method call expression + JCExpression apply = make.Apply(List.nil(), select, + convertArgs(tree.sym, args.toList(), tree.varargsElement)). + setType(tree.sym.erasure(types).getReturnType()); + + apply = transTypes.coerce(attrEnv, apply, + types.erasure(tree.referentType.getReturnType())); + + setVarargsIfNeeded(apply, tree.varargsElement); + return apply; + } + + /** + * Lambda body to use for a 'new'. + */ + private JCExpression expressionNew() { + if (tree.kind == ReferenceKind.ARRAY_CTOR) { + //create the array creation expression + JCNewArray newArr = make.NewArray( + make.Type(types.elemtype(tree.getQualifierExpression().type)), + List.of(make.Ident(params.first())), + null); + newArr.type = tree.getQualifierExpression().type; + return newArr; + } else { + //create the instance creation expression + //note that method reference syntax does not allow an explicit + //enclosing class (so the enclosing class is null) + // but this may need to be patched up later with the proxy for the outer this + JCNewClass newClass = make.NewClass(null, + List.nil(), + make.Type(tree.getQualifierExpression().type), + convertArgs(tree.sym, args.toList(), tree.varargsElement), + null); + newClass.constructor = tree.sym; + newClass.constructorType = tree.sym.erasure(types); + newClass.type = tree.getQualifierExpression().type; + setVarargsIfNeeded(newClass, tree.varargsElement); + return newClass; + } + } + + private VarSymbol addParameter(String name, Type p, boolean genArg) { + VarSymbol vsym = new VarSymbol(PARAMETER | SYNTHETIC, names.fromString(name), p, owner); + vsym.pos = tree.pos; + params.append(make.VarDef(vsym, null)); + if (genArg) { + args.append(make.Ident(vsym)); + } + return vsym; + } + } + + /** + * Convert method/constructor arguments by inserting appropriate cast + * as required by type-erasure - this is needed when bridging a lambda/method + * reference, as the bridged signature might require downcast to be compatible + * with the generated signature. + */ + private List<JCExpression> convertArgs(Symbol meth, List<JCExpression> args, Type varargsElement) { + Assert.check(meth.kind == MTH); + List<Type> formals = types.erasure(meth.type).getParameterTypes(); + if (varargsElement != null) { + Assert.check((meth.flags() & VARARGS) != 0); + } + return transTypes.translateArgs(args, formals, varargsElement, attrEnv); + } + + /** + * Set varargsElement field on a given tree (must be either a new class tree + * or a method call tree) + */ + private void setVarargsIfNeeded(JCTree tree, Type varargsElement) { + if (varargsElement != null) { + switch (tree.getTag()) { + case APPLY: ((JCMethodInvocation)tree).varargsElement = varargsElement; break; + case NEWCLASS: ((JCNewClass)tree).varargsElement = varargsElement; break; + case TYPECAST: setVarargsIfNeeded(((JCTypeCast) tree).expr, varargsElement); break; + default: throw new AssertionError(); + } + } + } + public void visitSwitch(JCSwitch tree) { List<JCCase> cases = tree.patternSwitch ? addDefaultIfNeeded(tree.patternSwitch, tree.wasEnumSelector, @@ -4018,7 +4351,7 @@ public JCTree visitEnumSwitch(JCTree tree, JCExpression selector, List<JCCase> c //switch ($selector != null ? $mapVar[$selector.ordinal()] : -1) {...} //replacing case null with case -1: VarSymbol dollar_s = new VarSymbol(FINAL|SYNTHETIC, - names.fromString("s" + tree.pos + this.target.syntheticNameChar()), + names.fromString("s" + variableIndex++ + this.target.syntheticNameChar()), selector.type, currentMethodSym); JCStatement var = make.at(tree.pos()).VarDef(dollar_s, selector).setType(dollar_s.type); @@ -4175,13 +4508,13 @@ public JCTree visitStringSwitch(JCTree tree, JCExpression selector, List<JCCase> */ VarSymbol dollar_s = new VarSymbol(FINAL|SYNTHETIC, - names.fromString("s" + tree.pos + target.syntheticNameChar()), + names.fromString("s" + variableIndex++ + target.syntheticNameChar()), syms.stringType, currentMethodSym); stmtList.append(make.at(tree.pos()).VarDef(dollar_s, selector).setType(dollar_s.type)); VarSymbol dollar_tmp = new VarSymbol(SYNTHETIC, - names.fromString("tmp" + tree.pos + target.syntheticNameChar()), + names.fromString("tmp" + variableIndex++ + target.syntheticNameChar()), syms.intType, currentMethodSym); JCVariableDecl dollar_tmp_def = @@ -4323,7 +4656,7 @@ private JCTree visitBoxedPrimitiveSwitch(JCTree tree, JCExpression selector, Lis while (constants.contains(replacementValue)) replacementValue++; VarSymbol dollar_s = new VarSymbol(FINAL|SYNTHETIC, - names.fromString("s" + tree.pos + this.target.syntheticNameChar()), + names.fromString("s" + variableIndex++ + this.target.syntheticNameChar()), selector.type, currentMethodSym); JCStatement var = make.at(tree.pos()).VarDef(dollar_s, selector).setType(dollar_s.type); @@ -4381,7 +4714,7 @@ public void visitSelect(JCFieldAccess tree) { TreeInfo.name(tree.selected) == names._super && !types.isDirectSuperInterface(((JCFieldAccess)tree.selected).selected.type.tsym, currentClass); tree.selected = translate(tree.selected); - if (tree.name == names._class) { + if (tree.name == names._class && tree.selected.type.isPrimitiveOrVoid()) { result = classOf(tree.selected); } else if (tree.name == names._super && @@ -4457,6 +4790,7 @@ public List<JCTree> translateTopLevelClass(Env<AttrContext> env, JCTree cdef, Tr this.make = make; endPosTable = env.toplevel.endPositions; currentClass = null; + currentRestype = null; currentMethodDef = null; outermostClassDef = (cdef.hasTag(CLASSDEF)) ? (JCClassDecl)cdef : null; outermostMemberDef = null; @@ -4486,6 +4820,7 @@ public List<JCTree> translateTopLevelClass(Env<AttrContext> env, JCTree cdef, Tr this.make = null; endPosTable = null; currentClass = null; + currentRestype = null; currentMethodDef = null; outermostClassDef = null; outermostMemberDef = null; @@ -4505,4 +4840,23 @@ public List<JCTree> translateTopLevelClass(Env<AttrContext> env, JCTree cdef, Tr } return translated.toList(); } + + // needed for the lambda deserialization method, which is expressed as a big switch on strings + public JCMethodDecl translateMethod(Env<AttrContext> env, JCMethodDecl methodDecl, TreeMaker make) { + try { + this.attrEnv = env; + this.make = make; + this.currentClass = methodDecl.sym.enclClass(); + proxies = new HashMap<>(); + return translate(methodDecl); + } finally { + this.attrEnv = null; + this.make = null; + this.currentClass = null; + // the two fields below are set when visiting the method + this.currentMethodSym = null; + this.currentMethodDef = null; + this.proxies = null; + } + } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java index a12271c790419..9600e4f6e4ff9 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -1618,14 +1618,6 @@ public void visitSwitchExpression(JCSwitchExpression tree) { compileStates.put(env, CompileState.TRANSPATTERNS); - if (scanner.hasLambdas) { - if (shouldStop(CompileState.UNLAMBDA)) - return; - - env.tree = LambdaToMethod.instance(context).translateTopLevelClass(env, env.tree, localMake); - compileStates.put(env, CompileState.UNLAMBDA); - } - if (shouldStop(CompileState.LOWER)) return; @@ -1647,6 +1639,16 @@ public void visitSwitchExpression(JCSwitchExpression tree) { if (shouldStop(CompileState.LOWER)) return; + if (scanner.hasLambdas) { + if (shouldStop(CompileState.UNLAMBDA)) + return; + + for (JCTree def : cdefs) { + LambdaToMethod.instance(context).translateTopLevelClass(env, def, localMake); + } + compileStates.put(env, CompileState.UNLAMBDA); + } + //generate code for each class for (List<JCTree> l = cdefs; l.nonEmpty(); l = l.tail) { JCClassDecl cdef = (JCClassDecl)l.head; diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java index 5af482516b4e6..6f3b8b5d8aaca 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java @@ -2013,6 +2013,7 @@ public enum ParameterKind { public JCTree body; public boolean canCompleteNormally = true; public ParameterKind paramKind; + public boolean wasMethodReference; public JCLambda(List<JCVariableDecl> params, JCTree body) { diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java index f2edd5c97e9e7..5e3b043fb1187 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java @@ -344,11 +344,13 @@ public void visitExec(JCExpressionStatement stat) { @Override public void visitClassDef(JCClassDecl tree) { // don't descend any further + result = tree; } @Override public void visitLambda(JCLambda tree) { // don't descend any further + result = tree; } } diff --git a/test/langtools/tools/javac/SuperInit/AnonSuperLambdaCrash.java b/test/langtools/tools/javac/SuperInit/AnonSuperLambdaCrash.java new file mode 100644 index 0000000000000..3ca895194f184 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/AnonSuperLambdaCrash.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8333766 + * @summary Test for compiler crash when anonymous class created in early lambda + */ + +public class AnonSuperLambdaCrash { + class Inner { + Inner() { + this(() -> new Object() { { AnonSuperLambdaCrash.this.hashCode(); } }); + } + Inner(Runnable r) { + r.run(); + } + } + + public static void main(String[] args) { + new AnonSuperLambdaCrash().new Inner(); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest1.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest1.java new file mode 100644 index 0000000000000..5d9060da83c26 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest1.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8333313 + * @summary Verify references to local classes declared in early construction contexts + * @enablePreview + */ +public class EarlyLocalTest1 { + + class Test { + Test() { + class InnerLocal { } + Runnable r = () -> new InnerLocal(); + r.run(); + super(); + } + } + + public static void main(String[] args) { + new EarlyLocalTest1().new Test(); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest4.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest4.java new file mode 100644 index 0000000000000..cce6092f60696 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest4.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8333313 + * @summary Verify references to local classes declared in early construction contexts + * @enablePreview + */ +public class EarlyLocalTest4 { + + class Test { + Test() { + class InnerLocal { } + Runnable r = new Runnable() { + public void run() { + new InnerLocal(); + } + }; + r.run(); + super(); + } + } + + public static void main(String[] args) { + new EarlyLocalTest4().new Test(); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest5.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest5.java new file mode 100644 index 0000000000000..6858e068af839 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest5.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8333313 + * @summary Verify references to local classes declared in early construction contexts + * @enablePreview + */ +import java.util.concurrent.atomic.AtomicReference; + +public class EarlyLocalTest5 { + + int y; + + class Test extends AtomicReference<Runnable> { + Test(int x) { + class Foo implements Runnable { + public void run() { + System.out.println(x + y); + } + } + super(new Foo()); + } + } + + public static void main(String[] args) { + new EarlyLocalTest5().new Test(42); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest6.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest6.java new file mode 100644 index 0000000000000..742496a48d547 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest6.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8333313 + * @summary Verify references to local classes declared in early construction contexts + * @enablePreview + */ +import java.util.concurrent.atomic.AtomicReference; + +public class EarlyLocalTest6 { + + int y; + + class Test extends AtomicReference<Runnable> { + Test(int x) { + super(new Runnable() { + public void run() { + System.out.println(x + y); + } + }); + } + } + + public static void main(String[] args) { + new EarlyLocalTest6().new Test(42); + } +} diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest7.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest7.java new file mode 100644 index 0000000000000..1ce63bc04ba6c --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest7.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8333313 + * @summary Verify references to local classes declared in early construction contexts + * @enablePreview + */ +import java.util.concurrent.atomic.AtomicReference; + +public class EarlyLocalTest7 { + + int y; + + class Test extends AtomicReference<Runnable> { + Test(int x) { + super(() -> System.out.println(x + y)); + } + } + + public static void main(String[] args) { + new EarlyLocalTest7().new Test(42); + } +} diff --git a/test/langtools/tools/javac/SuperInit/LambdaLocalEarlyCrash.java b/test/langtools/tools/javac/SuperInit/LambdaLocalEarlyCrash.java new file mode 100644 index 0000000000000..660e7d19f4e01 --- /dev/null +++ b/test/langtools/tools/javac/SuperInit/LambdaLocalEarlyCrash.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8334037 + * @summary Test for compiler crash when local class created in early lambda + * @enablePreview + */ + +public class LambdaLocalEarlyCrash { + interface A { } + + class Inner { + Inner() { + this(() -> { + class Local { + void g() { + m(); + } + } + new Local().g(); // error + }); + } + + Inner(Runnable tr) { + tr.run(); + } + } + + void m() { + System.out.println("Hello"); + } + + public static void main(String[] args) { + new LambdaLocalEarlyCrash().new Inner(); + } +} diff --git a/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java b/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java index 092e2916c69d5..261b23dc298f8 100644 --- a/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java +++ b/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java @@ -22,7 +22,7 @@ */ /* * @test - * @bug 8194743 + * @bug 8334252 * @summary Test lambda declared in early construction context * @enablePreview */ diff --git a/test/langtools/tools/javac/lambda/T8129740/Universe.java.out b/test/langtools/tools/javac/lambda/T8129740/Universe.java.out index 1d8c0e290c29e..919eb14c3c912 100644 --- a/test/langtools/tools/javac/lambda/T8129740/Universe.java.out +++ b/test/langtools/tools/javac/lambda/T8129740/Universe.java.out @@ -69,29 +69,27 @@ class Universe { } Planet(String name, int moonsCount) { - this(name, moonsCount, java.lang.invoke.LambdaMetafactory.metafactory(name, Universe.Galaxy.this, Universe.Galaxy.SolarSystem.this)); + this(name, moonsCount, ()->{ + String n = name; + StringBuffer buf = new StringBuffer(); + buf.append("This planet belongs to the galaxy " + Galaxy.this.name + " with " + starsCount + " stars\n"); + buf.append("This planet belongs to the galaxy " + Universe.Galaxy.this.name + " with " + starsCount() + " stars\n"); + buf.append("This planet belongs to the galaxy " + Galaxy.this.name() + " with " + starsCount() + " stars\n"); + buf.append("This planet belongs to the galaxy " + Universe.Galaxy.this.name() + " with " + (Universe.Galaxy.this).starsCount() + " stars\n"); + buf.append("This planet belongs to the solar system " + SolarSystem.this.name + " with " + planetsCount + " planets\n"); + buf.append("This planet belongs to the solar system " + Galaxy.SolarSystem.this.name + " with " + planetsCount() + " planets\n"); + buf.append("This planet belongs to the solar system " + (SolarSystem.this).name + " with " + planetsCount + " planets\n"); + buf.append("This planet belongs to the solar system " + Universe.Galaxy.SolarSystem.this.name + " with " + Universe.Galaxy.SolarSystem.this.planetsCount + " planets\n"); + buf.append("This planet belongs to the solar system " + Universe.Galaxy.SolarSystem.this.name.toLowerCase().toUpperCase() + " with " + Universe.Galaxy.SolarSystem.this.planetsCount + " planets\n"); + buf.append("This planet belongs to the solar system " + copy(Universe.Galaxy.SolarSystem.this).name.toLowerCase().toUpperCase() + " with " + Universe.Galaxy.SolarSystem.this.planetsCount + " planets\n"); + if (!buf.toString().equals(output)) throw new AssertionError("Unexpected value\n" + buf); + }); } static final String output = "This planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system SUN with 9 planets\nThis planet belongs to the solar system SUN with 9 planets\n"; public String toString() { return "Planet " + name + " with " + moonsCount + " moon(s)"; } - - /*synthetic*/ private static void lambda$new$0(/*synthetic*/ final String name, /*synthetic*/ final Universe.Galaxy Universe$Galaxy$this, /*synthetic*/ final Universe.Galaxy.SolarSystem Universe$Galaxy$SolarSystem$this) { - String n = name; - StringBuffer buf = new StringBuffer(); - buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name + " with " + Universe$Galaxy$this.starsCount + " stars\n"); - buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name + " with " + Universe$Galaxy$this.starsCount() + " stars\n"); - buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name() + " with " + Universe$Galaxy$this.starsCount() + " stars\n"); - buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name() + " with " + (Universe$Galaxy$this).starsCount() + " stars\n"); - buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n"); - buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount() + " planets\n"); - buf.append("This planet belongs to the solar system " + (Universe$Galaxy$SolarSystem$this).name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n"); - buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n"); - buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name.toLowerCase().toUpperCase() + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n"); - buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.copy(Universe$Galaxy$SolarSystem$this).name.toLowerCase().toUpperCase() + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n"); - if (!buf.toString().equals(output)) throw new AssertionError("Unexpected value\n" + buf); - } } } } From 741a0f39dd1fffc1caaa8d69bfe3662dad830452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= <hannesw@openjdk.org> Date: Wed, 26 Jun 2024 09:37:22 +0000 Subject: [PATCH 192/471] 8334241: Adjust API docs side bar dimensions Reviewed-by: jjg --- .../internal/doclets/formats/html/resources/stylesheet.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css index 8086e0d88b3ce..4e37588f6cda5 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css @@ -348,7 +348,7 @@ body.class-declaration-page .details h3 { flex-direction: row; } .main-grid main { - flex: 2.6 1 0; + flex: 3 1 0; min-width: 240px } .main-grid nav.toc { From f23295ec1dde58d239a2625c9b1645534a2bb625 Mon Sep 17 00:00:00 2001 From: Daniel Fuchs <dfuchs@openjdk.org> Date: Wed, 26 Jun 2024 10:09:05 +0000 Subject: [PATCH 193/471] 8334600: TEST java/net/MulticastSocket/IPMulticastIF.java fails on linux-aarch64 Reviewed-by: alanb --- .../net/MulticastSocket/IPMulticastIF.java | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/test/jdk/java/net/MulticastSocket/IPMulticastIF.java b/test/jdk/java/net/MulticastSocket/IPMulticastIF.java index 566e3603fa645..3909f6d627678 100644 --- a/test/jdk/java/net/MulticastSocket/IPMulticastIF.java +++ b/test/jdk/java/net/MulticastSocket/IPMulticastIF.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,9 +63,25 @@ public Object[][] positive() throws Exception { InetAddress.getLoopbackAddress()); List<Object[]> list = new ArrayList<>(); NetworkConfiguration nc = NetworkConfiguration.probe(); + // retains only network interface whose bound addresses match addrs.stream().forEach(a -> nc.multicastInterfaces(true) - .map(nif -> new Object[] { new InetSocketAddress(a, 0), nif }) - .forEach(list::add) ); + .filter(nif -> nif.inetAddresses().toList().contains(a)) + .map(nif -> new Object[] { new InetSocketAddress(a, 0), nif }) + .forEach(list::add) ); + // any network interface should work with the wildcard address + nc.multicastInterfaces(true) + .map(nif -> new Object[] {new InetSocketAddress(0), nif}) + .forEach(list::add); + return list.stream().toArray(Object[][]::new); + } + + @DataProvider(name = "interfaces") + public Object[][] interfaces() throws Exception { + List<Object[]> list = new ArrayList<>(); + NetworkConfiguration nc = NetworkConfiguration.probe(); + nc.multicastInterfaces(true) + .map(nif -> new Object[] {nif}) + .forEach(list::add); return list.stream().toArray(Object[][]::new); } @@ -82,8 +98,8 @@ public void testSetGetInterfaceBound(InetSocketAddress bindAddr, NetworkInterfac } } - @Test(dataProvider = "scenarios") - public void testSetGetInterfaceUnbound(InetSocketAddress ignore, NetworkInterface nif) + @Test(dataProvider = "interfaces") + public void testSetGetInterfaceUnbound(NetworkInterface nif) throws Exception { out.println(format("\n\n--- testSetGetInterfaceUnbound nif=[%s]", nif)); @@ -106,8 +122,8 @@ public void testSetGetOptionBound(InetSocketAddress bindAddr, NetworkInterface n } } - @Test(dataProvider = "scenarios") - public void testSetGetOptionUnbound(InetSocketAddress ignore, NetworkInterface nif) + @Test(dataProvider = "interfaces") + public void testSetGetOptionUnbound(NetworkInterface nif) throws Exception { out.println(format("\n\n--- testSetGetOptionUnbound nif=[%s]", nif)); @@ -139,8 +155,8 @@ public void testGetInterfaceBound(InetSocketAddress bindAddr) } @Test - public void testGettInterfaceUnbound() throws Exception { - out.println("\n\n--- testGettInterfaceUnbound "); + public void testGetInterfaceUnbound() throws Exception { + out.println("\n\n--- testGetInterfaceUnbound "); try (MulticastSocket ms = new MulticastSocket()) { assertPlaceHolder(ms.getNetworkInterface()); } From b2ac7259c96f154ba0ca54fd47b37caaa8c8647b Mon Sep 17 00:00:00 2001 From: Kangcheng Xu <kxu@openjdk.org> Date: Wed, 26 Jun 2024 13:19:34 +0000 Subject: [PATCH 194/471] 8327380: Add tests for Shenandoah barrier expansion optimization Reviewed-by: roland, shade --- .../TestShenandoahBarrierExpansion.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 test/hotspot/jtreg/compiler/gcbarriers/TestShenandoahBarrierExpansion.java diff --git a/test/hotspot/jtreg/compiler/gcbarriers/TestShenandoahBarrierExpansion.java b/test/hotspot/jtreg/compiler/gcbarriers/TestShenandoahBarrierExpansion.java new file mode 100644 index 0000000000000..84a34695092dd --- /dev/null +++ b/test/hotspot/jtreg/compiler/gcbarriers/TestShenandoahBarrierExpansion.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2024 Red Hat and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package compiler.gcbarriers; + +import compiler.lib.ir_framework.CompilePhase; +import compiler.lib.ir_framework.DontInline; +import compiler.lib.ir_framework.IR; +import compiler.lib.ir_framework.IRNode; +import compiler.lib.ir_framework.Test; +import compiler.lib.ir_framework.TestFramework; + +/** + * @test + * @bug 8231569 + * @summary Test that Shenandoah barriers are expanded correctly + * @library /test/lib / + * @requires vm.gc.Shenandoah + * @run main compiler.gcbarriers.TestShenandoahBarrierExpansion + */ +public class TestShenandoahBarrierExpansion { + public static void main(String[] args) { + TestFramework test = new TestFramework(TestShenandoahBarrierExpansion.class); + test.addFlags("-XX:+UseShenandoahGC"); + test.start(); + } + + private static Object staticField; + @Test + @IR(failOn = IRNode.IF, phase = CompilePhase.AFTER_PARSING) + @IR(counts = { IRNode.IF, "2" }, phase = CompilePhase.BARRIER_EXPANSION) + public Object testLoadFieldObject() { + return staticField; + } + + private static A staticField2 = new A(); + @Test + @IR(counts = { IRNode.IF, "1" }, phase = CompilePhase.AFTER_PARSING) + @IR(counts = { IRNode.IF, "3" }, phase = CompilePhase.BARRIER_EXPANSION) + private static int testLoadObjectFieldWithNullCheck() { + return staticField2.intField; + } + + private static A staticField3 = new A(); + @Test + @IR(counts = { IRNode.IF, "2" }, phase = CompilePhase.AFTER_PARSING) + @IR(counts = { IRNode.IF, "6" }, phase = CompilePhase.BARRIER_EXPANSION) + private static int testLoadTwoObjectFieldsWithNullCheck() { + return staticField2.intField + staticField3.intField; + } + + @Test + @IR(failOn = IRNode.IF, phase = CompilePhase.AFTER_PARSING) + @IR(counts = { IRNode.IF, "3" }, phase = CompilePhase.BARRIER_EXPANSION) + private static void testLoadTwoFieldObjectAndEscape() { + final A field2 = staticField2; + final A field3 = staticField3; + notInlined(field2, field3); + } + + @DontInline + private static void notInlined(A field2, A field3) { + // noop + } + + private static class A { + public int intField; + } +} From efb905e57ab7a5299952419fa9961316541056c2 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Wed, 26 Jun 2024 13:37:58 +0000 Subject: [PATCH 195/471] 8334618: ubsan: support setting additional ubsan check options Reviewed-by: stuefe, lucy --- make/autoconf/jdk-options.m4 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/make/autoconf/jdk-options.m4 b/make/autoconf/jdk-options.m4 index b5c679d2a8ef9..0dca5d133131f 100644 --- a/make/autoconf/jdk-options.m4 +++ b/make/autoconf/jdk-options.m4 @@ -496,9 +496,15 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_LEAK_SANITIZER], # AC_DEFUN_ONCE([JDKOPT_SETUP_UNDEFINED_BEHAVIOR_SANITIZER], [ + UTIL_ARG_WITH(NAME: additional-ubsan-checks, TYPE: string, + DEFAULT: [], + DESC: [Customizes the ubsan checks], + OPTIONAL: true) + # GCC reports lots of likely false positives for stringop-truncation and format-overflow. # Silence them for now. - UBSAN_CHECKS="-fsanitize=undefined -fsanitize=float-divide-by-zero -fno-sanitize=shift-base -fno-sanitize=alignment" + UBSAN_CHECKS="-fsanitize=undefined -fsanitize=float-divide-by-zero -fno-sanitize=shift-base -fno-sanitize=alignment \ + $ADDITIONAL_UBSAN_CHECKS" UBSAN_CFLAGS="$UBSAN_CHECKS -Wno-stringop-truncation -Wno-format-overflow -fno-omit-frame-pointer -DUNDEFINED_BEHAVIOR_SANITIZER" UBSAN_LDFLAGS="$UBSAN_CHECKS" UTIL_ARG_ENABLE(NAME: ubsan, DEFAULT: false, RESULT: UBSAN_ENABLED, From 4ffc5e60776353b03e9a557c39148e378b1690e2 Mon Sep 17 00:00:00 2001 From: Anthony Scarpino <ascarpino@openjdk.org> Date: Wed, 26 Jun 2024 13:58:22 +0000 Subject: [PATCH 196/471] 8326705: Test CertMsgCheck.java fails to find alert certificate_required Reviewed-by: ssahoo, rhalade --- test/jdk/ProblemList.txt | 1 - .../net/ssl/SSLSession/CertMsgCheck.java | 29 +++++++++++-------- test/jdk/javax/net/ssl/templates/TLSBase.java | 24 ++++++++------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 2bf83e8ea81e0..790b3de0f969c 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -616,7 +616,6 @@ com/sun/security/sasl/gsskerb/ConfSecurityLayer.java 8039280 generic- com/sun/security/sasl/gsskerb/NoSecurityLayer.java 8039280 generic-all sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.java 8039280 generic-all sun/security/provider/PolicyParser/PrincipalExpansionError.java 8039280 generic-all -javax/net/ssl/SSLSession/CertMsgCheck.java 8326705 generic-all sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183,8333317 generic-all diff --git a/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java b/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java index 37c252bc6f090..498c17672b213 100644 --- a/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java +++ b/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java @@ -40,20 +40,25 @@ public static void main(String[] args) throws Exception { // Initial client session TLSBase.Client client1 = new TLSBase.Client(true, false); - if (server.getSession(client1).getSessionContext() == null) { - for (Exception e : server.getExceptionList()) { - System.out.println("Looking at " + e.getClass() + " " + - e.getMessage()); - if (e.getMessage().contains(args[0])) { - System.out.println("Found correct exception: " + args[0] + + + server.getSession(client1).getSessionContext(); + server.done(); + + var eList = server.getExceptionList(); + System.out.println("Exception list size is " + eList.size()); + + for (Exception e : eList) { + System.out.println("Looking at " + e.getClass() + " " + + e.getMessage()); + if (e.getMessage().contains(args[0])) { + System.out.println("Found correct exception: " + args[0] + " in " + e.getMessage()); - return; - } else { - System.out.println("No \"" + args[0] + "\" found."); - } + return; + } else { + System.out.println("No \"" + args[0] + "\" found."); } - - throw new Exception("Failed to find expected alert: " + args[0]); } + + throw new Exception("Failed to find expected alert: " + args[0]); } } diff --git a/test/jdk/javax/net/ssl/templates/TLSBase.java b/test/jdk/javax/net/ssl/templates/TLSBase.java index 812aea09fea11..5c95253e6f024 100644 --- a/test/jdk/javax/net/ssl/templates/TLSBase.java +++ b/test/jdk/javax/net/ssl/templates/TLSBase.java @@ -97,8 +97,8 @@ public void write(SSLSocket sock, byte[] data) throws Exception { private static KeyManager[] getKeyManager(boolean empty) throws Exception { FileInputStream fis = null; if (!empty) { - fis = new FileInputStream(System.getProperty("test.src", "./") + "/" + pathToStores + - "/" + keyStoreFile); + fis = new FileInputStream(System.getProperty("test.src", "./") + + "/" + pathToStores + "/" + keyStoreFile); } // Load the keystore char[] pwd = passwd.toCharArray(); @@ -113,8 +113,8 @@ private static KeyManager[] getKeyManager(boolean empty) throws Exception { private static TrustManager[] getTrustManager(boolean empty) throws Exception { FileInputStream fis = null; if (!empty) { - fis = new FileInputStream(System.getProperty("test.src", "./") + "/" + pathToStores + - "/" + trustStoreFile); + fis = new FileInputStream(System.getProperty("test.src", "./") + + "/" + pathToStores + "/" + trustStoreFile); } // Load the keystore KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); @@ -148,7 +148,6 @@ static class Server extends TLSBase { // Clients sockets are kept in a hash table with the port as the key. ConcurrentHashMap<Integer, SSLSocket> clientMap = new ConcurrentHashMap<>(); - boolean exit = false; Thread t; List<Exception> exceptionList = new ArrayList<>(); @@ -157,13 +156,14 @@ static class Server extends TLSBase { name = "server"; try { sslContext = SSLContext.getInstance("TLS"); - sslContext.init(TLSBase.getKeyManager(builder.km), TLSBase.getTrustManager(builder.tm), null); + sslContext.init(TLSBase.getKeyManager(builder.km), + TLSBase.getTrustManager(builder.tm), null); fac = sslContext.getServerSocketFactory(); ssock = (SSLServerSocket) fac.createServerSocket(0); ssock.setNeedClientAuth(builder.clientauth); serverPort = ssock.getLocalPort(); } catch (Exception e) { - System.err.println(e.getMessage()); + System.err.println("Failure during server initialization"); e.printStackTrace(); } @@ -178,6 +178,7 @@ static class Server extends TLSBase { try { write(c, read(c)); } catch (Exception e) { + System.out.println("Caught " + e.getMessage()); e.printStackTrace(); exceptionList.add(e); } @@ -203,13 +204,14 @@ static class Server extends TLSBase { name = "server"; try { sslContext = SSLContext.getInstance("TLS"); - sslContext.init(TLSBase.getKeyManager(km), TLSBase.getTrustManager(tm), null); + sslContext.init(TLSBase.getKeyManager(km), + TLSBase.getTrustManager(tm), null); fac = sslContext.getServerSocketFactory(); ssock = (SSLServerSocket) fac.createServerSocket(0); ssock.setNeedClientAuth(true); serverPort = ssock.getLocalPort(); } catch (Exception e) { - System.err.println(e.getMessage()); + System.err.println("Failure during server initialization"); e.printStackTrace(); } @@ -224,7 +226,9 @@ static class Server extends TLSBase { try { write(c, read(c)); } catch (Exception e) { + System.out.println("Caught " + e.getMessage()); e.printStackTrace(); + exceptionList.add(e); } } } catch (Exception ex) { @@ -239,7 +243,7 @@ static class Server extends TLSBase { // test or the test will never end. void done() { try { - t.interrupt(); + t.join(5000); ssock.close(); } catch (Exception e) { System.err.println(e.getMessage()); From 8374d16504503c7441346c99045736b7ac72233f Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Wed, 26 Jun 2024 14:12:44 +0000 Subject: [PATCH 197/471] 8335006: C2 SuperWord: add JMH benchmark VectorLoadToStoreForwarding.java Reviewed-by: shade, kvn, sviswanathan --- .../compiler/VectorLoadToStoreForwarding.java | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 test/micro/org/openjdk/bench/vm/compiler/VectorLoadToStoreForwarding.java diff --git a/test/micro/org/openjdk/bench/vm/compiler/VectorLoadToStoreForwarding.java b/test/micro/org/openjdk/bench/vm/compiler/VectorLoadToStoreForwarding.java new file mode 100644 index 0000000000000..efbf99c6ce5e1 --- /dev/null +++ b/test/micro/org/openjdk/bench/vm/compiler/VectorLoadToStoreForwarding.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.bench.vm.compiler; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.*; + +import java.util.concurrent.TimeUnit; +import java.util.Random; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Thread) +@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS) +@Fork(value = 1) +public abstract class VectorLoadToStoreForwarding { + @Param({"2048"}) + public int SIZE; + + private int[] aI; + + @Param("0") + private int seed; + private Random r = new Random(seed); + + @Setup + public void init() { + aI = new int[SIZE]; + + for (int i = 0; i < SIZE; i++) { + aI[i] = r.nextInt(); + } + } + + @Benchmark + public void benchmark_00() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 0] + 1; + } + } + + @Benchmark + public void benchmark_01() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 1] + 1; + } + } + + @Benchmark + public void benchmark_02() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 2] + 1; + } + } + + @Benchmark + public void benchmark_03() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 3] + 1; + } + } + + @Benchmark + public void benchmark_04() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 4] + 1; + } + } + + @Benchmark + public void benchmark_05() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 5] + 1; + } + } + + @Benchmark + public void benchmark_06() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 6] + 1; + } + } + + @Benchmark + public void benchmark_07() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 7] + 1; + } + } + + @Benchmark + public void benchmark_08() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 8] + 1; + } + } + + @Benchmark + public void benchmark_09() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 9] + 1; + } + } + + @Benchmark + public void benchmark_10() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 10] + 1; + } + } + + @Benchmark + public void benchmark_11() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 11] + 1; + } + } + + @Benchmark + public void benchmark_12() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 12] + 1; + } + } + + @Benchmark + public void benchmark_13() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 13] + 1; + } + } + + @Benchmark + public void benchmark_14() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 14] + 1; + } + } + + @Benchmark + public void benchmark_15() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 15] + 1; + } + } + + @Benchmark + public void benchmark_16() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 16] + 1; + } + } + + @Benchmark + public void benchmark_17() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 17] + 1; + } + } + + @Benchmark + public void benchmark_18() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 18] + 1; + } + } + + @Benchmark + public void benchmark_19() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 19] + 1; + } + } + + @Benchmark + public void benchmark_20() { + for (int i = 20; i < SIZE; i++) { + aI[i] = aI[i - 20] + 1; + } + } + + @Fork(value = 1, jvmArgsPrepend = { + "-XX:+UseSuperWord" + }) + public static class VectorLoadToStoreForwardingSuperWord extends VectorLoadToStoreForwarding {} + + @Fork(value = 1, jvmArgsPrepend = { + "-XX:-UseSuperWord" + }) + public static class VectorLoadToStoreForwardingNoSuperWord extends VectorLoadToStoreForwarding {} +} From 8591eff78dbc9770b8d0a16e05040ac35c99881a Mon Sep 17 00:00:00 2001 From: Nizar Benalla <nbenalla@openjdk.org> Date: Wed, 26 Jun 2024 14:39:21 +0000 Subject: [PATCH 198/471] 8332103: since-checker - Add missing @ since tags to java.desktop Reviewed-by: tr, aivanov --- .../share/classes/java/awt/geom/Path2D.java | 8 +++++++- .../share/classes/java/beans/package-info.java | 4 +++- .../classes/javax/swing/DefaultComboBoxModel.java | 6 +++++- .../share/classes/javax/swing/DefaultListModel.java | 6 +++++- .../share/classes/javax/swing/JSlider.java | 10 +++++++++- .../share/classes/javax/swing/package-info.java | 4 +++- .../classes/javax/swing/plaf/basic/BasicSliderUI.java | 2 ++ .../classes/javax/swing/plaf/synth/package-info.java | 4 +++- .../classes/javax/swing/text/DefaultEditorKit.java | 6 +++++- 9 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/java.desktop/share/classes/java/awt/geom/Path2D.java b/src/java.desktop/share/classes/java/awt/geom/Path2D.java index ad91b44911e4f..8b14846b117ad 100644 --- a/src/java.desktop/share/classes/java/awt/geom/Path2D.java +++ b/src/java.desktop/share/classes/java/awt/geom/Path2D.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -292,6 +292,9 @@ public Float(Shape s, AffineTransform at) { } } + /** + * @since 10 + */ @Override public final void trimToSize() { // trim arrays: @@ -1178,6 +1181,9 @@ public Double(Shape s, AffineTransform at) { } } + /** + * @since 10 + */ @Override public final void trimToSize() { // trim arrays: diff --git a/src/java.desktop/share/classes/java/beans/package-info.java b/src/java.desktop/share/classes/java/beans/package-info.java index fefe400e6bf4d..dfa226f7014d5 100644 --- a/src/java.desktop/share/classes/java/beans/package-info.java +++ b/src/java.desktop/share/classes/java/beans/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,5 +108,7 @@ * Long-Term Persistence</a>, an article in * <em>The Swing Connection</em>.</li> * </ul> + * + * @since 1.1 */ package java.beans; diff --git a/src/java.desktop/share/classes/javax/swing/DefaultComboBoxModel.java b/src/java.desktop/share/classes/javax/swing/DefaultComboBoxModel.java index 382eba1946fda..e2257abf704a2 100644 --- a/src/java.desktop/share/classes/javax/swing/DefaultComboBoxModel.java +++ b/src/java.desktop/share/classes/javax/swing/DefaultComboBoxModel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -183,6 +183,8 @@ public void removeAllElements() { * * @param c the collection which contains the elements to add * @throws NullPointerException if {@code c} is null + * + * @since 11 */ public void addAll(Collection<? extends E> c) { if (c.isEmpty()) { @@ -205,6 +207,8 @@ public void addAll(Collection<? extends E> c) { * @throws ArrayIndexOutOfBoundsException if {@code index} does not * fall within the range of number of elements currently held * @throws NullPointerException if {@code c} is null + * + * @since 11 */ public void addAll(int index, Collection<? extends E> c) { if (index < 0 || index > getSize()) { diff --git a/src/java.desktop/share/classes/javax/swing/DefaultListModel.java b/src/java.desktop/share/classes/javax/swing/DefaultListModel.java index 9d519927b6774..c66f0f0f7b274 100644 --- a/src/java.desktop/share/classes/javax/swing/DefaultListModel.java +++ b/src/java.desktop/share/classes/javax/swing/DefaultListModel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -530,6 +530,8 @@ public void removeRange(int fromIndex, int toIndex) { * * @param c the collection which contains the elements to add * @throws NullPointerException if {@code c} is null + * + * @since 11 */ public void addAll(Collection<? extends E> c) { if (c.isEmpty()) { @@ -552,6 +554,8 @@ public void addAll(Collection<? extends E> c) { * @throws ArrayIndexOutOfBoundsException if {@code index} does not * fall within the range of number of elements currently held * @throws NullPointerException if {@code c} is null + * + * @since 11 */ public void addAll(int index, Collection<? extends E> c) { if (index < 0 || index > getSize()) { diff --git a/src/java.desktop/share/classes/javax/swing/JSlider.java b/src/java.desktop/share/classes/javax/swing/JSlider.java index a9c9cbe887b7e..a61f7fe851b86 100644 --- a/src/java.desktop/share/classes/javax/swing/JSlider.java +++ b/src/java.desktop/share/classes/javax/swing/JSlider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1461,6 +1461,8 @@ public AccessibleStateSet getAccessibleStateSet() { * * @param e a {@code ChangeEvent} object. Must not be {@code null} * @throws NullPointerException if the parameter is {@code null} + * + * @since 16 */ public void stateChanged(ChangeEvent e) { if (e == null) { @@ -1561,6 +1563,8 @@ public AccessibleAction getAccessibleAction() { * which decrements the slider value * * @return the zero-based number of Actions in this object + * + * @since 17 */ public int getAccessibleActionCount() { return 2; @@ -1572,6 +1576,8 @@ public int getAccessibleActionCount() { * @param i zero-based index of the actions * @return a String description of the action * @see #getAccessibleActionCount + * + * @since 17 */ public String getAccessibleActionDescription(int i) { if (i == 0) { @@ -1590,6 +1596,8 @@ public String getAccessibleActionDescription(int i) { * action (index 1) is AccessibleAction.DECREMENT. * @return true if the action was performed, otherwise false * @see #getAccessibleActionCount + * + * @since 17 */ public boolean doAccessibleAction(int i) { if (i < 0 || i > 1) { diff --git a/src/java.desktop/share/classes/javax/swing/package-info.java b/src/java.desktop/share/classes/javax/swing/package-info.java index 95be24d606fad..3723c5a66e969 100644 --- a/src/java.desktop/share/classes/javax/swing/package-info.java +++ b/src/java.desktop/share/classes/javax/swing/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -149,5 +149,7 @@ * </ul> * * @serial exclude + * + * @since 1.2 */ package javax.swing; diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java index ad5cb9c9ab9d8..f945f7eac63ad 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java @@ -150,6 +150,8 @@ public class BasicSliderUI extends SliderUI{ /** * Constructs a {@code BasicSliderUI}. + * + * @since 16 * @deprecated This constructor was exposed erroneously and will be removed in a future release. * Use {@link #BasicSliderUI(JSlider)} instead. */ diff --git a/src/java.desktop/share/classes/javax/swing/plaf/synth/package-info.java b/src/java.desktop/share/classes/javax/swing/plaf/synth/package-info.java index 41cb23989151e..10b03fa83d71e 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/synth/package-info.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -139,5 +139,7 @@ * <bind style="style" type="region" key="Table"/> * <bind style="style" type="region" key="List"/> * }</pre> + * + * @since 1.5 */ package javax.swing.plaf.synth; diff --git a/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java b/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java index b71d30656db68..33fe7300df918 100644 --- a/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java +++ b/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -648,6 +648,8 @@ public void write(Writer out, Document doc, int pos, int len) * beginning of the previous line if the caret is * already at the beginning of the line. * @see #getActions + * + * @since 20 */ public static final String beginLineUpAction = "caret-begin-line-and-up"; @@ -657,6 +659,8 @@ public void write(Writer out, Document doc, int pos, int len) * end of the next line if the caret is already * at the end of the line. * @see #getActions + * + * @since 20 */ public static final String endLineDownAction = "caret-end-line-and-down"; From 5883a20b822bb8acb719076e4f7abee8403061cb Mon Sep 17 00:00:00 2001 From: Claes Redestad <redestad@openjdk.org> Date: Wed, 26 Jun 2024 14:46:17 +0000 Subject: [PATCH 199/471] 8334437: De-duplicate ProxyMethod list creation Reviewed-by: asotona, liach --- .../classes/java/lang/reflect/ProxyGenerator.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java index 6c82a6ecb6f61..2e56d03c6ad89 100644 --- a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java +++ b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java @@ -508,8 +508,7 @@ private void addProxyMethod(Method m, Class<?> fromClass) { Class<?>[] exceptionTypes = m.getSharedExceptionTypes(); String sig = m.toShortSignature(); - List<ProxyMethod> sigmethods = proxyMethods.computeIfAbsent(sig, - _ -> new ArrayList<>(3)); + List<ProxyMethod> sigmethods = proxyMethodsFor(sig); for (ProxyMethod pm : sigmethods) { if (returnType == pm.returnType) { /* @@ -531,16 +530,17 @@ private void addProxyMethod(Method m, Class<?> fromClass) { exceptionTypes, fromClass, "m" + proxyMethodCount++)); } + private List<ProxyMethod> proxyMethodsFor(String sig) { + return proxyMethods.computeIfAbsent(sig, _ -> new ArrayList<>(3)); + } + /** * Add an existing ProxyMethod (hashcode, equals, toString). * * @param pm an existing ProxyMethod */ private void addProxyMethod(ProxyMethod pm) { - String sig = pm.shortSignature; - List<ProxyMethod> sigmethods = proxyMethods.computeIfAbsent(sig, - _ -> new ArrayList<>(3)); - sigmethods.add(pm); + proxyMethodsFor(pm.shortSignature).add(pm); } /** From b5d589623c174757e946011495f771718318f1cc Mon Sep 17 00:00:00 2001 From: Sonia Zaldana Calles <szaldana@openjdk.org> Date: Wed, 26 Jun 2024 16:20:15 +0000 Subject: [PATCH 200/471] 8335108: Build error after JDK-8333658 due to class templates Reviewed-by: jwaters, jsjolen --- src/hotspot/share/nmt/arrayWithFreeList.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/nmt/arrayWithFreeList.hpp b/src/hotspot/share/nmt/arrayWithFreeList.hpp index 90c348bbf7ccc..13aa1045fe7cb 100644 --- a/src/hotspot/share/nmt/arrayWithFreeList.hpp +++ b/src/hotspot/share/nmt/arrayWithFreeList.hpp @@ -60,7 +60,7 @@ class ArrayWithFreeList { } public: - NONCOPYABLE(ArrayWithFreeList<E COMMA flag>); + NONCOPYABLE(ArrayWithFreeList); ArrayWithFreeList(int initial_capacity = 8) : _backing_storage(initial_capacity), From bffc8484c32ad6c3205f7cebe4e262a2dc9de57e Mon Sep 17 00:00:00 2001 From: Justin Lu <jlu@openjdk.org> Date: Wed, 26 Jun 2024 17:10:09 +0000 Subject: [PATCH 201/471] 8333755: NumberFormat integer only parsing breaks when format has suffix Reviewed-by: naoto --- .../java/text/CompactNumberFormat.java | 24 +--- .../classes/java/text/DecimalFormat.java | 80 +++++++---- .../share/classes/java/text/NumberFormat.java | 9 +- .../Format/NumberFormat/BigDecimalParse.java | 28 ++-- .../Format/NumberFormat/StrictParseTest.java | 131 +++++++++++++----- 5 files changed, 170 insertions(+), 102 deletions(-) diff --git a/src/java.base/share/classes/java/text/CompactNumberFormat.java b/src/java.base/share/classes/java/text/CompactNumberFormat.java index cb1a9546b12cd..25fd9923b064a 100644 --- a/src/java.base/share/classes/java/text/CompactNumberFormat.java +++ b/src/java.base/share/classes/java/text/CompactNumberFormat.java @@ -1724,7 +1724,7 @@ public Number parse(String text, ParsePosition pos) { // Call DecimalFormat.subparseNumber() method to parse the // number part of the input text position = decimalFormat.subparseNumber(text, position, - digitList, false, false, status); + digitList, false, false, status).fullPos(); if (position == -1) { // Unable to parse the number successfully @@ -1732,26 +1732,6 @@ public Number parse(String text, ParsePosition pos) { pos.errorIndex = oldStart; return null; } - - // If parse integer only is true and the parsing is broken at - // decimal point, then pass/ignore all digits and move pointer - // at the start of suffix, to process the suffix part - if (isParseIntegerOnly() && position < text.length() - && text.charAt(position) == symbols.getDecimalSeparator()) { - position++; // Pass decimal character - for (; position < text.length(); ++position) { - char ch = text.charAt(position); - int digit = ch - symbols.getZeroDigit(); - if (digit < 0 || digit > 9) { - digit = Character.digit(ch, 10); - // Parse all digit characters - if (!(digit >= 0 && digit <= 9)) { - break; - } - } - } - } - // Number parsed successfully; match prefix and // suffix to obtain multiplier pos.index = position; @@ -2372,6 +2352,8 @@ public void setGroupingUsed(boolean newValue) { * parsed as the value {@code 1234000} (1234 (integer part) * 1000 * (thousand)) and the fractional part would be skipped. * The exact format accepted by the parse operation is locale dependent. + * @implSpec This implementation does not set the {@code ParsePosition} index + * to the position of the decimal symbol, but rather the end of the string. * * @return {@code true} if compact numbers should be parsed as integers * only; {@code false} otherwise diff --git a/src/java.base/share/classes/java/text/DecimalFormat.java b/src/java.base/share/classes/java/text/DecimalFormat.java index f575e86eced6a..1f249888a28f5 100644 --- a/src/java.base/share/classes/java/text/DecimalFormat.java +++ b/src/java.base/share/classes/java/text/DecimalFormat.java @@ -2150,10 +2150,7 @@ private void append(StringBuffer result, String string, * #getGroupingSize()} is not adhered to * <li> {@link #isGroupingUsed()} returns {@code false}, and the grouping * symbol is found - * <li> {@link #isParseIntegerOnly()} returns {@code true}, and the decimal - * separator is found - * <li> {@link #isGroupingUsed()} returns {@code true} and {@link - * #isParseIntegerOnly()} returns {@code false}, and the grouping + * <li> {@link #isGroupingUsed()} returns {@code true} and the grouping * symbol occurs after the decimal separator * <li> Any other characters are found, that are not the expected symbols, * and are not digits that occur within the numerical portion @@ -2379,7 +2376,8 @@ private final boolean subparse(String text, ParsePosition parsePosition, // position will serve as new index when success, otherwise it will // serve as errorIndex when failure - position = subparseNumber(text, position, digits, true, isExponent, status); + NumericPosition pos = subparseNumber(text, position, digits, true, isExponent, status); + position = pos.fullPos; // First character after the prefix was un-parseable, should // fail regardless if lenient or strict. @@ -2422,9 +2420,15 @@ private final boolean subparse(String text, ParsePosition parsePosition, return false; } - // No failures, thus increment the index by the suffix - parsePosition.index = position + - (gotPositive ? positiveSuffix.length() : negativeSuffix.length()); + // When parsing integer only, index should be int pos + // If intPos is 0, the entire value was integer + if (isParseIntegerOnly() && pos.intPos > 0) { + parsePosition.index = pos.intPos; + } else { + // increment the index by the suffix + parsePosition.index = position + + (gotPositive ? positiveSuffix.length() : negativeSuffix.length()); + } } else { parsePosition.index = position; } @@ -2437,6 +2441,19 @@ private final boolean subparse(String text, ParsePosition parsePosition, return true; } + /** + * NumericPosition is a helper record class that stores two indices of interest. + * {@code fullPos} is either the first unparseable character or -1 in case + * of no valid number parsed. {@code intPos} reflects the position of + * a parsed decimal symbol, if one exists. When parsing with {@code isParseIntegerOnly()}, + * {@code fullPos} is used to match the suffix, and reset the {@code ParsePosition} + * index to {@code intPos}. + * + * @param fullPos an index that reflects the full traversal of the numerical String + * @param intPos an index that reflects the position of a parsed decimal symbol. + */ + record NumericPosition(int fullPos, int intPos) {} + /** * Parses a number from the given {@code text}. The text is parsed * beginning at {@code position}, until an unparseable character is seen. @@ -2449,14 +2466,15 @@ private final boolean subparse(String text, ParsePosition parsePosition, * @param status upon return contains boolean status flags indicating * whether the value is infinite and whether it is * positive - * @return returns the position of the first unparseable character or - * -1 in case of no valid number parsed + * @return returns a {@code NumericPosition} that stores both a full + * traversal index, and an int only index. */ - int subparseNumber(String text, int position, - DigitList digits, boolean checkExponent, - boolean isExponent, boolean[] status) { + NumericPosition subparseNumber(String text, int position, + DigitList digits, boolean checkExponent, + boolean isExponent, boolean[] status) { // process digits or Inf, find decimal position status[STATUS_INFINITE] = false; + int intIndex = 0; if (!isExponent && text.regionMatches(position, symbols.getInfinity(), 0, symbols.getInfinity().length())) { position += symbols.getInfinity().length(); @@ -2516,7 +2534,7 @@ int subparseNumber(String text, int position, if (parseStrict && isGroupingUsed() && position == startPos + groupingSize && prevSeparatorIndex == -groupingSize && !sawDecimal && digit >= 0 && digit <= 9) { - return position; + return new NumericPosition(position, intIndex); } if (digit == 0) { @@ -2538,37 +2556,44 @@ int subparseNumber(String text, int position, --digits.decimalAt; } else { ++digitCount; - digits.append((char)(digit + '0')); + if (!sawDecimal || !isParseIntegerOnly()) { + digits.append((char)(digit + '0')); + } } } else if (digit > 0 && digit <= 9) { // [sic] digit==0 handled above sawDigit = true; ++digitCount; - digits.append((char)(digit + '0')); + if (!sawDecimal || !isParseIntegerOnly()) { + digits.append((char) (digit + '0')); + } // Cancel out backup setting (see grouping handler below) backup = -1; } else if (!isExponent && ch == decimal) { // Check grouping size on decimal separator if (parseStrict && isGroupingViolation(position, prevSeparatorIndex)) { - return groupingViolationIndex(position, prevSeparatorIndex); + return new NumericPosition( + groupingViolationIndex(position, prevSeparatorIndex), intIndex); } // If we're only parsing integers, or if we ALREADY saw the // decimal, then don't parse this one. - if (isParseIntegerOnly() || sawDecimal) { + if (sawDecimal) { break; } + intIndex = position; digits.decimalAt = digitCount; // Not digits.count! sawDecimal = true; } else if (!isExponent && ch == grouping && isGroupingUsed()) { if (parseStrict) { // text should not start with grouping when strict if (position == startPos) { - return startPos; + return new NumericPosition(startPos, intIndex); } // when strict, fail if grouping occurs after decimal OR // current group violates grouping size if (sawDecimal || (isGroupingViolation(position, prevSeparatorIndex))) { - return groupingViolationIndex(position, prevSeparatorIndex); + return new NumericPosition( + groupingViolationIndex(position, prevSeparatorIndex), intIndex); } prevSeparatorIndex = position; // track previous } else { @@ -2621,7 +2646,8 @@ int subparseNumber(String text, int position, // "1,234%" and "1,234" both end with pos = 5, since '%' breaks // the loop before incrementing position. In both cases, check // should be done at pos = 4 - return groupingViolationIndex(position - 1, prevSeparatorIndex); + return new NumericPosition( + groupingViolationIndex(position - 1, prevSeparatorIndex), intIndex); } } @@ -2636,8 +2662,9 @@ int subparseNumber(String text, int position, digits.decimalAt = digitCount; // Not digits.count! } - // Adjust for exponent, if any - if (exponent != 0) { + // If parsing integer only, adjust exponent if it occurs + // in integer portion, otherwise ignore it + if (!sawDecimal || !isParseIntegerOnly()) { digits.decimalAt = shiftDecimalAt(digits.decimalAt, exponent); } @@ -2646,10 +2673,10 @@ int subparseNumber(String text, int position, // parse "$" with pattern "$#0.00". (return index 0 and error // index 1). if (!sawDigit && digitCount == 0) { - return -1; + return new NumericPosition(-1, intIndex); } } - return position; + return new NumericPosition(position, intIndex); } // Calculate the final decimal position based off the exponent value @@ -2917,7 +2944,8 @@ public int getMultiplier () { * have '{@code U+2030}'. * * <P>Example: with multiplier 100, 1.23 is formatted as "123", and - * "123" is parsed into 1.23. + * "123" is parsed into 1.23. If {@code isParseIntegerOnly()} returns {@code true}, + * "123" is parsed into 1. * * @param newValue the new multiplier * @see #getMultiplier diff --git a/src/java.base/share/classes/java/text/NumberFormat.java b/src/java.base/share/classes/java/text/NumberFormat.java index 0409efc2da08a..28f116042e9da 100644 --- a/src/java.base/share/classes/java/text/NumberFormat.java +++ b/src/java.base/share/classes/java/text/NumberFormat.java @@ -468,12 +468,11 @@ public Number parse(String source) throws ParseException { } /** - * Returns true if this format will parse numbers as integers only. + * Returns {@code true} if this format will parse numbers as integers only. + * The {@code ParsePosition} index will be set to the position of the decimal + * symbol. The exact format accepted by the parse operation is locale dependent. * For example in the English locale, with ParseIntegerOnly true, the - * string "1234." would be parsed as the integer value 1234 and parsing - * would stop at the "." character. Of course, the exact format accepted - * by the parse operation is locale dependent and determined by sub-classes - * of NumberFormat. + * string "123.45" would be parsed as the integer value 123. * * @return {@code true} if numbers should be parsed as integers only; * {@code false} otherwise diff --git a/test/jdk/java/text/Format/NumberFormat/BigDecimalParse.java b/test/jdk/java/text/Format/NumberFormat/BigDecimalParse.java index 771ae761a3aba..1d8168cd0544a 100644 --- a/test/jdk/java/text/Format/NumberFormat/BigDecimalParse.java +++ b/test/jdk/java/text/Format/NumberFormat/BigDecimalParse.java @@ -23,14 +23,18 @@ /* * @test - * @bug 4018937 8008577 8174269 + * @bug 4018937 8008577 8174269 8333755 * @summary Confirm that methods which are newly added to support BigDecimal and BigInteger work as expected. * @run junit/othervm BigDecimalParse */ import java.math.BigDecimal; -import java.text.*; -import java.util.*; +import java.text.DecimalFormat; +import java.text.Format; +import java.text.MessageFormat; +import java.text.NumberFormat; +import java.text.ParsePosition; +import java.util.Locale; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeAll; @@ -543,23 +547,23 @@ public void test_Parse_in_MessageFormat_NotParseIntegerOnly() { static final int[][] parsePosition2 = { // {errorIndex, index} /* * Should keep in mind that the expected result is different from - * DecimalFormat.parse() for some cases. + * DecimalFormat.parse() for some cases. This is because parsing integer + * only will return a successful parse for the subformat, but since the index + * returned is not equal to the length, at the MessageFormat level, this + * will be interpreted as a failed parse, and so the DecimalFormat index + * should be reflected as the MessageFormat errorIndex. */ {28, 0}, // parsing stopped at '.' {29, 0}, // parsing stopped at '.' {29, 0}, // parsing stopped at '.' - {2, 0}, // parsing stopped at '(' because cannot find ')' - {2, 0}, // parsing stopped at the first numeric - // because cannot find '%' - {2, 0}, // parsing stopped at the first numeric - // because cannot find '%' + {30, 0}, // parsing stopped at '.' + {31, 0}, // parsing stopped at '.' + {32, 0}, // parsing stopped at '.' {28, 0}, // parsing stopped at '.' {29, 0}, // parsing stopped at '.' - {-1, 57}, {-1, 58}, {-1, 59}, {-1, 61}, {56, 0}, // parsing stopped at '.' - // because cannot find '%' - {2, 0}, // parsing stopped at '(' because cannot find ')' + {57, 0}, // parsing stopped at '.' {-1, 60}, {-1, 61}, {28, 0}, // parsing stopped at '.' {-1, 88}, diff --git a/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java b/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java index d62a867e573be..333bc1b050637 100644 --- a/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java +++ b/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8327640 8331485 + * @bug 8327640 8331485 8333755 * @summary Test suite for NumberFormat parsing with strict leniency * @run junit/othervm -Duser.language=en -Duser.country=US StrictParseTest * @run junit/othervm -Duser.language=ja -Duser.country=JP StrictParseTest @@ -34,6 +34,7 @@ * @run junit/othervm -Duser.language=ar -Duser.country=AR StrictParseTest */ +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import org.junit.jupiter.params.ParameterizedTest; @@ -72,17 +73,18 @@ public class StrictParseTest { private static final CompactNumberFormat cmpctFmt = (CompactNumberFormat) NumberFormat.getCompactNumberInstance(Locale.getDefault(), NumberFormat.Style.SHORT); - - - // All NumberFormats should parse strictly - static { - dFmt.setStrict(true); - pFmt.setStrict(true); - cFmt.setStrict(true); - cmpctFmt.setStrict(true); - // To effectively test strict compactNumberFormat parsing - cmpctFmt.setParseIntegerOnly(false); - cmpctFmt.setGroupingUsed(true); + private static final NumberFormat[] FORMATS = new NumberFormat[]{dFmt, cFmt, pFmt, cmpctFmt}; + + // Restore defaults before runs + @BeforeEach + void beforeEach() { + for (NumberFormat fmt : FORMATS) { + fmt.setStrict(true); + fmt.setParseIntegerOnly(false); + fmt.setGroupingUsed(true); + } + // Grouping Size is not defined at NumberFormat level + // Compact needs to manually init grouping size cmpctFmt.setGroupingSize(3); } @@ -114,6 +116,20 @@ public void uniqueCaseNumberFormatTest() { failParse(nonLocalizedDFmt, "a123456,7890b", 6); } + + // 8333755: Check that parsing with integer only against a suffix value works + @Test // Non-localized, run once + @EnabledIfSystemProperty(named = "user.language", matches = "en") + public void integerOnlyParseWithSuffixTest() { + // Some pattern with a suffix + DecimalFormat fmt = new DecimalFormat("0.00b"); + fmt.setParseIntegerOnly(true); + assertEquals(5d, successParse(fmt, "5.55b", 1)); + assertEquals(5d, successParse(fmt, "5b", 2)); + assertEquals(5555d, successParse(fmt, "5,555.55b", 5)); + assertEquals(5d, successParse(fmt, "5.55E55b", 1)); + } + @Test // Non-localized, only run once @EnabledIfSystemProperty(named = "user.language", matches = "en") public void badExponentParseNumberFormatTest() { @@ -170,24 +186,30 @@ public void numFmtStrictGroupingNotUsed(String toParse) { } else { successParse(dFmt, toParse); } - dFmt.setGroupingUsed(true); } - // Exception should be thrown if decimal separator occurs anywhere - // Don't pass badParseStrings for same reason as previous method. + // 8333755: Parsing behavior should follow normal strict behavior + // However the index returned, should be before decimal point + // and the value parsed equal to the integer portion @ParameterizedTest - @MethodSource({"validParseStrings", "integerOnlyParseStrings"}) - public void numFmtStrictIntegerOnlyUsed(String toParse) { - // When integer only is true, if a decimal separator is found, - // a failure should occur + @MethodSource("validIntegerOnlyParseStrings") + public void numFmtStrictIntegerOnlyUsedTest(String toParse, Number expVal) { dFmt.setParseIntegerOnly(true); - int failIndex = toParse.indexOf(dfs.getDecimalSeparator()); - if (failIndex > -1) { - failParse(dFmt, toParse, failIndex); + int expectedIndex = toParse.indexOf(dfs.getDecimalSeparator()); + if (expectedIndex > -1) { + assertEquals(successParse(dFmt, toParse, expectedIndex), expVal); } else { - successParse(dFmt, toParse); + assertEquals(successParse(dFmt, toParse), expVal); } - dFmt.setParseIntegerOnly(false); + } + + // 8333755: Parsing behavior should follow normal strict behavior + // when it comes to failures. + @ParameterizedTest + @MethodSource("badParseStrings") + public void numFmtStrictIntegerOnlyUsedFailTest(String toParse, int expectedErrorIndex) { + dFmt.setParseIntegerOnly(true); + failParse(dFmt, toParse, expectedErrorIndex); } // ---- CurrencyFormat tests ---- @@ -270,6 +292,18 @@ public void compactFmtEdgeParseTest() { failParse(cnf, "c1bb", 2); } + @ParameterizedTest + @MethodSource({"validIntegerOnlyParseStrings", "compactValidIntegerOnlyParseStrings"}) + @EnabledIfSystemProperty(named = "user.language", matches = "en") + public void compactFmtSuccessParseIntOnlyTest(String toParse, double expectedValue) { + // compact does not accept exponents + if (toParse.indexOf('E') > -1) { + return; + } + cmpctFmt.setParseIntegerOnly(true); + assertEquals(expectedValue, successParse(cmpctFmt, toParse, toParse.length())); + } + // Ensure that on failure, the original index of the PP remains the same @Test public void parsePositionIndexTest() { @@ -279,7 +313,13 @@ public void parsePositionIndexTest() { // ---- Helper test methods ---- // Should parse entire String successfully, and return correctly parsed value. - private double successParse(NumberFormat fmt, String toParse) { + private Number successParse(NumberFormat fmt, String toParse) { + return successParse(fmt, toParse, toParse.length()); + } + + // Overloaded method that allows for an expected ParsePosition index value + // that is not the string length. + private Number successParse(NumberFormat fmt, String toParse, int expectedIndex) { // For Strings that don't have grouping separators, we test them with // grouping off so that they do not fail under the expectation that // grouping symbols should occur @@ -292,7 +332,7 @@ private double successParse(NumberFormat fmt, String toParse) { assertDoesNotThrow(() -> fmt.parse(toParse, pp)); assertEquals(-1, pp.getErrorIndex(), "ParsePosition ErrorIndex is not in correct location"); - assertEquals(toParse.length(), pp.getIndex(), + assertEquals(expectedIndex, pp.getIndex(), "ParsePosition Index is not in correct location"); fmt.setGroupingUsed(true); return parsedValue.doubleValue(); @@ -388,7 +428,9 @@ private static Stream<Arguments> badParseStrings() { Arguments.of("1.a", 2), Arguments.of(".22a", 3), Arguments.of(".1a1", 2), - Arguments.of("1,234,a", 5)) + Arguments.of("1,234,a", 5), + // Double decimal + Arguments.of("1,234..5", 5)) .map(args -> Arguments.of( localizeText(String.valueOf(args.get()[0])), args.get()[1])); } @@ -397,6 +439,8 @@ private static Stream<Arguments> badParseStrings() { // Given as Arguments<String, expectedParsedNumber> private static Stream<Arguments> validParseStrings() { return Stream.of( + Arguments.of("1,234.55", 1234.55d), + Arguments.of("1,234.5", 1234.5d), Arguments.of("1,234.00", 1234d), Arguments.of("1,234.0", 1234d), Arguments.of("1,234.", 1234d), @@ -414,17 +458,19 @@ private static Stream<Arguments> validParseStrings() { localizeText(String.valueOf(args.get()[0])), args.get()[1])); } - // Separate test data set for integer only. Can not use "badParseStrings", as - // there is test data where the failure may occur from some other issue, - // not related to grouping - private static Stream<Arguments> integerOnlyParseStrings() { + // Separate test data set for integer only. + // Valid parse strings, that would parse successfully for integer/non-integer parse + private static Stream<Arguments> validIntegerOnlyParseStrings() { return Stream.of( - Arguments.of("234.a"), - Arguments.of("234.a1"), - Arguments.of("234.1"), - Arguments.of("234.1a"), - Arguments.of("234.")) - .map(args -> Arguments.of(localizeText(String.valueOf(args.get()[0])))); + Arguments.of("234", 234d), + Arguments.of("234.", 234d), + Arguments.of("234.1", 234d), + Arguments.of("1,234.1", 1234d), + Arguments.of("234.12345", 234d), + Arguments.of("234.543E23", 234d), + Arguments.of("234,000.55E22", 234000d), + Arguments.of("234E22", 234E22)) + .map(args -> Arguments.of(localizeText(String.valueOf(args.get()[0])), args.get()[1])); } // Separate test data set for no grouping. Can not use "badParseStrings", as @@ -514,6 +560,12 @@ private static Stream<Arguments> compactValidParseStrings() { ); } + private static Stream<Arguments> compactValidIntegerOnlyParseStrings() { + return validIntegerOnlyParseStrings().map(args -> Arguments.of( + args.get()[0] + "K", (double) args.get()[1] * 1000) + ); + } + // Replace the grouping and decimal separators with localized variants // Used during localization of data private static String localizeText(String text) { @@ -526,7 +578,10 @@ private static String localizeText(String text) { sb.append(dfs.getGroupingSeparator()); } else if (c == '.') { sb.append(dfs.getDecimalSeparator()); - } else if (c == '0') { + } else if (c == 'E') { + sb.append(dfs.getExponentSeparator()); + } + else if (c == '0') { sb.append(dfs.getZeroDigit()); } else { sb.append(c); From 817edcb697cbb8c608c9292cdc4b99db4f5844dc Mon Sep 17 00:00:00 2001 From: Xiaolong Peng <xpeng@openjdk.org> Date: Wed, 26 Jun 2024 19:25:37 +0000 Subject: [PATCH 202/471] 8331411: Shenandoah: Reconsider spinning duration in ShenandoahLock Reviewed-by: shade, kdnilsen, wkemper --- .../share/gc/shenandoah/shenandoahLock.cpp | 49 +++++++++++-------- .../share/gc/shenandoah/shenandoahLock.hpp | 12 +++-- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp b/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp index 349f5415cdc0b..6fc74c53e6390 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp @@ -32,40 +32,49 @@ #include "runtime/javaThread.hpp" #include "runtime/os.inline.hpp" -// These are inline variants of Thread::SpinAcquire with optional blocking in VM. - -class ShenandoahNoBlockOp : public StackObj { -public: - ShenandoahNoBlockOp(JavaThread* java_thread) { - assert(java_thread == nullptr, "Should not pass anything"); - } -}; - void ShenandoahLock::contended_lock(bool allow_block_for_safepoint) { Thread* thread = Thread::current(); if (allow_block_for_safepoint && thread->is_Java_thread()) { - contended_lock_internal<ThreadBlockInVM>(JavaThread::cast(thread)); + contended_lock_internal<true>(JavaThread::cast(thread)); } else { - contended_lock_internal<ShenandoahNoBlockOp>(nullptr); + contended_lock_internal<false>(nullptr); } } -template<typename BlockOp> +template<bool ALLOW_BLOCK> void ShenandoahLock::contended_lock_internal(JavaThread* java_thread) { - int ctr = 0; - int yields = 0; + assert(!ALLOW_BLOCK || java_thread != nullptr, "Must have a Java thread when allowing block."); + // Spin this much on multi-processor, do not spin on multi-processor. + int ctr = os::is_MP() ? 0xFF : 0; + // Apply TTAS to avoid more expensive CAS calls if the lock is still held by other thread. while (Atomic::load(&_state) == locked || Atomic::cmpxchg(&_state, unlocked, locked) != unlocked) { - if ((++ctr & 0xFFF) == 0) { - BlockOp block(java_thread); - if (yields > 5) { - os::naked_short_sleep(1); + if (ctr > 0 && !SafepointSynchronize::is_synchronizing()) { + // Lightly contended, spin a little if no safepoint is pending. + SpinPause(); + ctr--; + } else if (ALLOW_BLOCK) { + ThreadBlockInVM block(java_thread); + if (SafepointSynchronize::is_synchronizing()) { + // If safepoint is pending, we want to block and allow safepoint to proceed. + // Normally, TBIVM above would block us in its destructor. + // + // But that blocking only happens when TBIVM knows the thread poll is armed. + // There is a window between announcing a safepoint and arming the thread poll + // during which trying to continuously enter TBIVM is counter-productive. + // Under high contention, we may end up going in circles thousands of times. + // To avoid it, we wait here until local poll is armed and then proceed + // to TBVIM exit for blocking. We do not SpinPause, but yield to let + // VM thread to arm the poll sooner. + while (SafepointSynchronize::is_synchronizing() && + !SafepointMechanism::local_poll_armed(java_thread)) { + os::naked_yield(); + } } else { os::naked_yield(); - yields++; } } else { - SpinPause(); + os::naked_yield(); } } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp b/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp index 4412680bc8ce6..4d7eefd460c46 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp @@ -37,20 +37,22 @@ class ShenandoahLock { shenandoah_padding(0); volatile LockState _state; shenandoah_padding(1); - volatile Thread* _owner; + Thread* volatile _owner; shenandoah_padding(2); - template<typename BlockOp> + template<bool ALLOW_BLOCK> void contended_lock_internal(JavaThread* java_thread); - public: ShenandoahLock() : _state(unlocked), _owner(nullptr) {}; void lock(bool allow_block_for_safepoint) { assert(Atomic::load(&_owner) != Thread::current(), "reentrant locking attempt, would deadlock"); - // Try to lock fast, or dive into contended lock handling. - if (Atomic::cmpxchg(&_state, unlocked, locked) != unlocked) { + if ((allow_block_for_safepoint && SafepointSynchronize::is_synchronizing()) || + (Atomic::cmpxchg(&_state, unlocked, locked) != unlocked)) { + // 1. Java thread, and there is a pending safepoint. Dive into contended locking + // immediately without trying anything else, and block. + // 2. Fast lock fails, dive into contended lock handling. contended_lock(allow_block_for_safepoint); } From 4ebb77120af5a4ccbfde63b24cb50e05a3161f16 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu <zgu@openjdk.org> Date: Wed, 26 Jun 2024 20:24:29 +0000 Subject: [PATCH 203/471] 8334769: Shenandoah: Move CodeCache_lock close to its use in ShenandoahConcurrentNMethodIterator Reviewed-by: shade, wkemper, kdnilsen --- src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp | 5 +---- src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp | 5 +---- src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp | 5 +++-- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp index 960927ee787a2..e61dca2bdbf6d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp @@ -1,4 +1,5 @@ /* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, 2022, Red Hat, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -102,12 +103,10 @@ class ShenandoahDisarmNMethodsTask : public WorkerTask { WorkerTask("Shenandoah Disarm NMethods"), _iterator(ShenandoahCodeRoots::table()) { assert(SafepointSynchronize::is_at_safepoint(), "Only at a safepoint"); - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _iterator.nmethods_do_begin(); } ~ShenandoahDisarmNMethodsTask() { - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _iterator.nmethods_do_end(); } @@ -177,12 +176,10 @@ class ShenandoahUnlinkTask : public WorkerTask { WorkerTask("Shenandoah Unlink NMethods"), _cl(unloading_occurred), _iterator(ShenandoahCodeRoots::table()) { - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _iterator.nmethods_do_begin(); } ~ShenandoahUnlinkTask() { - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _iterator.nmethods_do_end(); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp index a6b01d04a4756..44ccac467fe85 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp @@ -1,4 +1,5 @@ /* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021, 2022, Red Hat, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -771,14 +772,12 @@ class ShenandoahConcurrentWeakRootsEvacUpdateTask : public WorkerTask { _nmethod_itr(ShenandoahCodeRoots::table()), _phase(phase) { if (ShenandoahHeap::heap()->unload_classes()) { - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _nmethod_itr.nmethods_do_begin(); } } ~ShenandoahConcurrentWeakRootsEvacUpdateTask() { if (ShenandoahHeap::heap()->unload_classes()) { - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _nmethod_itr.nmethods_do_end(); } // Notify runtime data structures of potentially dead oops @@ -884,14 +883,12 @@ class ShenandoahConcurrentRootsEvacUpdateTask : public WorkerTask { _cld_roots(phase, ShenandoahHeap::heap()->workers()->active_workers(), false /*heap iteration*/), _nmethod_itr(ShenandoahCodeRoots::table()) { if (!ShenandoahHeap::heap()->unload_classes()) { - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _nmethod_itr.nmethods_do_begin(); } } ~ShenandoahConcurrentRootsEvacUpdateTask() { if (!ShenandoahHeap::heap()->unload_classes()) { - MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _nmethod_itr.nmethods_do_end(); } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp b/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp index f874f2a324944..54efd658eafdf 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp @@ -1,4 +1,5 @@ /* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2019, 2022, Red Hat, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -478,7 +479,7 @@ ShenandoahConcurrentNMethodIterator::ShenandoahConcurrentNMethodIterator(Shenand } void ShenandoahConcurrentNMethodIterator::nmethods_do_begin() { - assert(CodeCache_lock->owned_by_self(), "Lock must be held"); + MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _table_snapshot = _table->snapshot_for_iteration(); } @@ -488,7 +489,7 @@ void ShenandoahConcurrentNMethodIterator::nmethods_do(NMethodClosure* cl) { } void ShenandoahConcurrentNMethodIterator::nmethods_do_end() { - assert(CodeCache_lock->owned_by_self(), "Lock must be held"); + MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); _table->finish_iteration(_table_snapshot); CodeCache_lock->notify_all(); } From 07bc523df85fde81bf736fedac62874d3cb11ee3 Mon Sep 17 00:00:00 2001 From: Anthony Scarpino <ascarpino@openjdk.org> Date: Wed, 26 Jun 2024 22:28:33 +0000 Subject: [PATCH 204/471] 8334670: SSLSocketOutputRecord buffer miscalculation Reviewed-by: djelinski, ssahoo --- .../classes/sun/security/ssl/SSLSocketOutputRecord.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java b/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java index 3b0473d4eb0ce..a7809754ed039 100644 --- a/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java +++ b/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -168,12 +168,12 @@ void encodeHandshake(byte[] source, for (int limit = (offset + length); offset < limit;) { - int remains = (limit - offset) + (count - position); - int fragLen = Math.min(fragLimit, remains); + int remains = (limit - offset); + int fragLen = Math.min(fragLimit - count + position, remains); // use the buf of ByteArrayOutputStream write(source, offset, fragLen); - if (remains < fragLimit) { + if (remains < fragLen) { return; } From 3796fdfcedc2b2202b72cca062218f840960414c Mon Sep 17 00:00:00 2001 From: Hannes Greule <hgreule@openjdk.org> Date: Wed, 26 Jun 2024 23:17:32 +0000 Subject: [PATCH 205/471] 8328536: javac - crash on unknown type referenced in yield statement Co-authored-by: Jan Lahoda <jlahoda@openjdk.org> Reviewed-by: jlahoda --- .../com/sun/tools/javac/comp/Attr.java | 7 +++-- test/langtools/jdk/jshell/ToolSimpleTest.java | 9 +++++- .../generics/diamond/7188968/T7188968.out | 7 ++++- .../tools/javac/lambda/MethodReference23.out | 2 +- .../MethodRefToInnerWithoutOuter.out | 2 +- .../tools/javac/recovery/AttrRecovery.java | 31 +++++++++++++++++++ 6 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index 08c37fc5aa4ba..f58319496e968 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -4646,9 +4646,6 @@ Type checkIdInternal(JCTree tree, Type pt, Env<AttrContext> env, ResultInfo resultInfo) { - if (pt.isErroneous()) { - return types.createErrorType(site); - } Type owntype; // The computed type of this identifier occurrence. switch (sym.kind) { case TYP: @@ -4757,6 +4754,10 @@ else if (ownOuter.hasTag(CLASS) && site != ownOuter) { chk.checkPreview(tree.pos(), env.info.scope.owner, sym); } + if (pt.isErroneous()) { + owntype = types.createErrorType(owntype); + } + // If symbol is a variable, check that its type and // kind are compatible with the prototype and protokind. return check(tree, owntype, sym.kind.toSelector(), resultInfo); diff --git a/test/langtools/jdk/jshell/ToolSimpleTest.java b/test/langtools/jdk/jshell/ToolSimpleTest.java index 222acb5291c75..60d4f36952103 100644 --- a/test/langtools/jdk/jshell/ToolSimpleTest.java +++ b/test/langtools/jdk/jshell/ToolSimpleTest.java @@ -27,7 +27,7 @@ * 8167128 8154513 8170015 8170368 8172102 8172103 8165405 8173073 8173848 * 8174041 8173916 8174028 8174262 8174797 8177079 8180508 8177466 8172154 * 8192979 8191842 8198573 8198801 8210596 8210959 8215099 8199623 8236715 - * 8239536 8247456 8246774 8238173 8292625 8306560 + * 8239536 8247456 8246774 8238173 8292625 8306560 8328536 * @summary Simple jshell tool tests * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -964,6 +964,13 @@ public void testSwitchStatementExpressionDisambiguation() { ); } + @Test + public void testSwitchExpressionYieldUnknownType() { + test(a -> assertCommandOutputContains(a, + "I m(I i, int x) { return switch (x) { default -> i; }; } ", + "created method m(I,int), however, it cannot be referenced until class I is declared")); + } + @Test public void testSelfReference() { test( diff --git a/test/langtools/tools/javac/generics/diamond/7188968/T7188968.out b/test/langtools/tools/javac/generics/diamond/7188968/T7188968.out index 83b7b8b671d94..efceb84c8c7fb 100644 --- a/test/langtools/tools/javac/generics/diamond/7188968/T7188968.out +++ b/test/langtools/tools/javac/generics/diamond/7188968/T7188968.out @@ -1,7 +1,12 @@ T7188968.java:20:20: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null) +T7188968.java:20:9: compiler.warn.unchecked.call.mbr.of.raw.type: T7188968.Foo(java.util.List<X>,java.lang.Object), T7188968.Foo T7188968.java:21:20: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null) T7188968.java:21:29: compiler.warn.unchecked.call.mbr.of.raw.type: T7188968.Foo(java.util.List<X>,java.lang.Object), T7188968.Foo T7188968.java:22:22: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null) +T7188968.java:22:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.util.List<X>,java.lang.Object, java.util.List,unknown, kindname.class, T7188968.Foo +T7188968.java:22:19: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.util.List, java.util.List<X> T7188968.java:23:24: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null) +T7188968.java:23:20: compiler.warn.unchecked.meth.invocation.applied: kindname.method, makeFoo, java.util.List<Z>,java.lang.Object, java.util.List,unknown, kindname.class, T7188968.Foo +T7188968.java:23:21: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.util.List, java.util.List<Z> 4 errors -1 warning +6 warnings diff --git a/test/langtools/tools/javac/lambda/MethodReference23.out b/test/langtools/tools/javac/lambda/MethodReference23.out index f81c0a6745e4c..456a002bd99af 100644 --- a/test/langtools/tools/javac/lambda/MethodReference23.out +++ b/test/langtools/tools/javac/lambda/MethodReference23.out @@ -1,5 +1,5 @@ MethodReference23.java:52:19: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, MethodReference23, MethodReference23) -MethodReference23.java:53:16: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, , MethodReference23) +MethodReference23.java:53:16: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, MethodReference23, MethodReference23) MethodReference23.java:57:19: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, , MethodReference23) MethodReference23.java:58:16: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, , MethodReference23) MethodReference23.java:72:9: compiler.err.ref.ambiguous: call3, kindname.method, call3(MethodReference23.SAM21), MethodReference23, kindname.method, call3(MethodReference23.SAM22), MethodReference23 diff --git a/test/langtools/tools/javac/lambda/methodReference/MethodRefToInnerWithoutOuter.out b/test/langtools/tools/javac/lambda/methodReference/MethodRefToInnerWithoutOuter.out index bafb5d1a19359..03b3d33836905 100644 --- a/test/langtools/tools/javac/lambda/methodReference/MethodRefToInnerWithoutOuter.out +++ b/test/langtools/tools/javac/lambda/methodReference/MethodRefToInnerWithoutOuter.out @@ -1,2 +1,2 @@ -MethodRefToInnerWithoutOuter.java:22:31: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: TestString, , MethodRefToInnerBase) +MethodRefToInnerWithoutOuter.java:22:31: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: TestString, java.lang.String, MethodRefToInnerBase) 1 error diff --git a/test/langtools/tools/javac/recovery/AttrRecovery.java b/test/langtools/tools/javac/recovery/AttrRecovery.java index 01cf665be1337..629cef45c6270 100644 --- a/test/langtools/tools/javac/recovery/AttrRecovery.java +++ b/test/langtools/tools/javac/recovery/AttrRecovery.java @@ -203,4 +203,35 @@ public interface FI { } } + @Test + public void testErroneousTarget() throws Exception { + String code = """ + public class C { + public Undefined g(Undefined u) { + return switch (0) { + default -> u; + }; + } + } + """; + Path curPath = Path.of("."); + List<String> actual = new JavacTask(tb) + .options("-XDrawDiagnostics") + .sources(code) + .outdir(curPath) + .run(Expect.FAIL, 1) + .writeAll() + .getOutputLines(OutputKind.DIRECT); + + List<String> expected = List.of( + "C.java:2:24: compiler.err.cant.resolve.location: kindname.class, Undefined, , , (compiler.misc.location: kindname.class, C, null)", + "C.java:2:12: compiler.err.cant.resolve.location: kindname.class, Undefined, , , (compiler.misc.location: kindname.class, C, null)", + "2 errors" + ); + + if (!Objects.equals(actual, expected)) { + error("Expected: " + expected + ", but got: " + actual); + } + } + } From 6682305ee21cf595ec953d95bea594734a2982a8 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov <kvn@openjdk.org> Date: Thu, 27 Jun 2024 03:34:04 +0000 Subject: [PATCH 206/471] 8334779: Test compiler/c1/CanonicalizeArrayLength.java is timing out Reviewed-by: thartmann, dlong --- src/hotspot/cpu/x86/macroAssembler_x86.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.cpp b/src/hotspot/cpu/x86/macroAssembler_x86.cpp index 64142a6aee5d6..affd18f937ca8 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp @@ -5142,7 +5142,7 @@ void MacroAssembler::_verify_oop(Register reg, const char* s, const char* file, ss.print("verify_oop: %s: %s (%s:%d)", reg->name(), s, file, line); b = code_string(ss.as_string()); } - ExternalAddress buffer((address) b); + AddressLiteral buffer((address) b, external_word_Relocation::spec_for_immediate()); pushptr(buffer.addr(), rscratch1); // call indirectly to solve generation ordering problem @@ -5212,7 +5212,7 @@ void MacroAssembler::_verify_oop_addr(Address addr, const char* s, const char* f ss.print("verify_oop_addr: %s (%s:%d)", s, file, line); b = code_string(ss.as_string()); } - ExternalAddress buffer((address) b); + AddressLiteral buffer((address) b, external_word_Relocation::spec_for_immediate()); pushptr(buffer.addr(), rscratch1); // call indirectly to solve generation ordering problem From 9bb675f89dd1eeec423ca96cb3f96d29f5de477c Mon Sep 17 00:00:00 2001 From: Jaikiran Pai <jpai@openjdk.org> Date: Thu, 27 Jun 2024 04:38:32 +0000 Subject: [PATCH 207/471] 8334719: (se) Deferred close of SelectableChannel may result in a Selector doing the final close before concurrent I/O on channel has completed Co-authored-by: Alan Bateman <alanb@openjdk.org> Reviewed-by: alanb, dfuchs --- .../sun/nio/ch/DatagramChannelImpl.java | 5 + .../sun/nio/ch/ServerSocketChannelImpl.java | 3 + .../classes/sun/nio/ch/SocketChannelImpl.java | 5 + .../classes/sun/nio/ch/SinkChannelImpl.java | 3 + .../classes/sun/nio/ch/SourceChannelImpl.java | 3 + .../DeferredClose/DeferredCloseTest.java | 484 ++++++++++++++++++ .../java.base/java/net/InetSocketAddress.java | 202 ++++++++ 7 files changed, 705 insertions(+) create mode 100644 test/jdk/java/nio/channels/Selector/DeferredClose/DeferredCloseTest.java create mode 100644 test/jdk/java/nio/channels/Selector/DeferredClose/java.base/java/net/InetSocketAddress.java diff --git a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java index 31823cfbb871a..5c06ac7d9be02 100644 --- a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java @@ -1945,6 +1945,11 @@ protected void implCloseSelectableChannel() throws IOException { @Override public void kill() { + // wait for any read/write operations to complete before trying to close + readLock.lock(); + readLock.unlock(); + writeLock.lock(); + writeLock.unlock(); synchronized (stateLock) { if (state == ST_CLOSING) { tryFinishClose(); diff --git a/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java index c6ddad2a05c23..0bd72bacf0b08 100644 --- a/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java @@ -654,6 +654,9 @@ protected void implCloseSelectableChannel() throws IOException { @Override public void kill() { + // wait for any accept operation to complete before trying to close + acceptLock.lock(); + acceptLock.unlock(); synchronized (stateLock) { if (state == ST_CLOSING) { tryFinishClose(); diff --git a/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java index f23a0aa015297..ebbf55acd9711 100644 --- a/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java @@ -1216,6 +1216,11 @@ protected void implCloseSelectableChannel() throws IOException { @Override public void kill() { + // wait for any read/write operations to complete before trying to close + readLock.lock(); + readLock.unlock(); + writeLock.lock(); + writeLock.unlock(); synchronized (stateLock) { if (state == ST_CLOSING) { tryFinishClose(); diff --git a/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java b/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java index 491e0104765e8..bc15d8d156b8f 100644 --- a/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java +++ b/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java @@ -201,6 +201,9 @@ protected void implCloseSelectableChannel() throws IOException { @Override public void kill() { + // wait for any write operation to complete before trying to close + writeLock.lock(); + writeLock.unlock(); synchronized (stateLock) { if (state == ST_CLOSING) { tryFinishClose(); diff --git a/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java b/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java index 102041dd29490..2990d35b51695 100644 --- a/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java +++ b/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java @@ -200,6 +200,9 @@ protected void implCloseSelectableChannel() throws IOException { } @Override public void kill() { + // wait for any read operation to complete before trying to close + readLock.lock(); + readLock.unlock(); synchronized (stateLock) { assert !isOpen(); if (state == ST_CLOSING) { diff --git a/test/jdk/java/nio/channels/Selector/DeferredClose/DeferredCloseTest.java b/test/jdk/java/nio/channels/Selector/DeferredClose/DeferredCloseTest.java new file mode 100644 index 0000000000000..42dd7d42f568f --- /dev/null +++ b/test/jdk/java/nio/channels/Selector/DeferredClose/DeferredCloseTest.java @@ -0,0 +1,484 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.ClosedSelectorException; +import java.nio.channels.DatagramChannel; +import java.nio.channels.Pipe; +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.time.Instant; +import java.util.Objects; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.function.Function; +import java.util.stream.Stream; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/* + * @test + * @bug 8334719 + * @summary verifies that if a registered channel has in-progress operations, then + * the Selector during its deferred close implementation won't prematurely release + * the channel's resources + * + * @comment we use a patched java.net.InetSocketAddress to allow the test to intentionally + * craft some delays at specific locations in the implementation of InetSocketAddress + * to trigger race conditions + * @compile/module=java.base java/net/InetSocketAddress.java + * @run junit/othervm DeferredCloseTest + */ +public class DeferredCloseTest { + + private static final int NUM_ITERATIONS = 10; + private static final InetSocketAddress BIND_ADDR = new InetSocketAddress( + InetAddress.getLoopbackAddress(), 0); + + @BeforeAll + public static void beforeAll() throws Exception { + // configure our patched java.net.InetSocketAddress implementation + // to introduce delay in certain methods which get invoked + // internally from the DC.send() implementation + InetSocketAddress.enableDelay(); + } + + @AfterAll + public static void afterAll() throws Exception { + // delays in patched InetSocketAddress are no longer needed + InetSocketAddress.disableDelay(); + } + + private static Stream<Arguments> dcOperations() { + return Stream.of( + Arguments.of( + // repeatedly do DC.send() till there's a ClosedChannelException + "DC.send()", + null, + (Function<DatagramChannel, Void>) (dc) -> { + ByteBuffer bb = ByteBuffer.allocate(100); + try { + // We send to ourselves. Target, content and + // receipt of the Datagram isn't of importance + // in this test. + SocketAddress target = dc.getLocalAddress(); + System.out.println("DC: " + dc + " sending to " + target); + while (true) { + bb.clear(); + dc.send(bb, target); + } + } catch (ClosedChannelException _) { + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + } + ), + Arguments.of( + // repeatedly do DC.receive() till there's a ClosedChannelException + "DC.receive()", + (Function<DatagramChannel, Void>) (dc) -> { + try { + SocketAddress target = dc.getLocalAddress(); + ByteBuffer sendBB = ByteBuffer.allocate(100); + // first send() a few datagrams so that subsequent + // receive() does receive them and thus triggers + // the potential race with the deferred close + for (int i = 0; i < 5; i++) { + sendBB.clear(); + dc.send(sendBB, target); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + }, + (Function<DatagramChannel, Void>) (dc) -> { + try { + ByteBuffer rcvBB = ByteBuffer.allocate(10); + while (true) { + rcvBB.clear(); + dc.receive(rcvBB); + } + } catch (ClosedChannelException _) { + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + } + ) + ); + } + + /** + * Runs the test for DatagramChannel. + * + * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch) + */ + @ParameterizedTest + @MethodSource("dcOperations") + public void testDatagramChannel(String opName, Function<DatagramChannel, Void> preOp, + Function<DatagramChannel, Void> dcOperation) + throws Exception { + try (ExecutorService executor = Executors.newFixedThreadPool(2)) { + for (int i = 1; i <= NUM_ITERATIONS; i++) { + System.out.format("%s DatagramChannel - %d of %d ...%n", + Instant.now(), i, NUM_ITERATIONS); + try (Selector sel = Selector.open(); + DatagramChannel dc = DatagramChannel.open()) { + // create a non-blocking bound DatagramChannel + dc.bind(BIND_ADDR); + dc.configureBlocking(false); + // register the DatagramChannel with a selector + // (doesn't matter the interestOps) + SelectionKey key = dc.register(sel, SelectionKey.OP_READ); + if (preOp != null) { + preOp.apply(dc); + } + CountDownLatch opStartLatch = new CountDownLatch(1); + runTest(executor, key, () -> { + // notify that we will now start operation on the DC + opStartLatch.countDown(); + return dcOperation.apply(dc); + }, opStartLatch); + } + } + } + } + + + private static Stream<Arguments> scOperations() { + return Stream.of( + Arguments.of( + // repeatedly do SC.write() till there's a ClosedChannelException + "SC.write()", (Function<SocketChannel, Void>) (sc) -> { + ByteBuffer bb = ByteBuffer.allocate(100); + try { + System.out.println("SC: " + sc + " writing"); + while (true) { + bb.clear(); + sc.write(bb); + } + } catch (ClosedChannelException _) { + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + return null; + } + ), + Arguments.of( + // repeatedly do SC.read() till there's a ClosedChannelException + "SC.read()", (Function<SocketChannel, Void>) (sc) -> { + ByteBuffer bb = ByteBuffer.allocate(100); + try { + System.out.println("SC: " + sc + " reading"); + while (true) { + bb.clear(); + sc.read(bb); + } + } catch (ClosedChannelException _) { + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + return null; + } + ) + ); + } + + /** + * Runs the test for SocketChannel + * + * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch) + */ + @ParameterizedTest + @MethodSource("scOperations") + public void testSocketChannel(String opName, Function<SocketChannel, Void> scOperation) + throws Exception { + try (ExecutorService executor = Executors.newFixedThreadPool(3)) { + for (int i = 1; i <= NUM_ITERATIONS; i++) { + System.out.format("%s SocketChannel - %d of %d ...%n", + Instant.now(), i, NUM_ITERATIONS); + try (Selector sel = Selector.open(); + SocketChannel sc = SocketChannel.open()) { + // create and bind a SocketChannel + sc.bind(BIND_ADDR); + // stay in blocking mode till the SocketChannel is connected + sc.configureBlocking(true); + Future<SocketChannel> acceptedChannel; + SocketChannel conn; + // create a remote server and connect to it + try (ServerSocketChannel server = ServerSocketChannel.open()) { + server.bind(BIND_ADDR); + SocketAddress remoteAddr = server.getLocalAddress(); + acceptedChannel = executor.submit(new ConnAcceptor(server)); + System.out.println("connecting to " + remoteAddr); + sc.connect(remoteAddr); + conn = acceptedChannel.get(); + } + try (conn) { + // switch to non-blocking + sc.configureBlocking(false); + System.out.println("switched to non-blocking: " + sc); + // register the SocketChannel with a selector + // (doesn't matter the interestOps) + SelectionKey key = sc.register(sel, SelectionKey.OP_READ); + CountDownLatch opStartLatch = new CountDownLatch(1); + runTest(executor, key, () -> { + // notify that we will now start operation on the SC + opStartLatch.countDown(); + return scOperation.apply(sc); + }, opStartLatch); + } + } + } + } + } + + /** + * Runs the test for ServerSocketChannel + * + * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch) + */ + @Test + public void testServerSocketChannel() throws Exception { + try (ExecutorService executor = Executors.newFixedThreadPool(2)) { + for (int i = 1; i <= NUM_ITERATIONS; i++) { + System.out.format("%s ServerSocketChannel - %d of %d ...%n", + Instant.now(), i, NUM_ITERATIONS); + try (Selector sel = Selector.open(); + ServerSocketChannel ssc = ServerSocketChannel.open()) { + // create and bind a ServerSocketChannel + ssc.bind(BIND_ADDR); + ssc.configureBlocking(false); + // register the ServerSocketChannel with a selector + SelectionKey key = ssc.register(sel, SelectionKey.OP_ACCEPT); + CountDownLatch opStartLatch = new CountDownLatch(1); + runTest(executor, key, () -> { + // notify that we will now start accept()ing + opStartLatch.countDown(); + // repeatedly do SSC.accept() till there's a ClosedChannelException + try { + while (true) { + ssc.accept(); + } + } catch (ClosedChannelException _) { + } + return null; + }, opStartLatch); + } + } + } + } + + /** + * Runs the test for SinkChannel + * + * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch) + */ + @Test + public void testSinkChannel() throws Exception { + try (ExecutorService executor = Executors.newFixedThreadPool(2)) { + for (int i = 1; i <= NUM_ITERATIONS; i++) { + System.out.format("%s SinkChannel - %d of %d ...%n", + Instant.now(), i, NUM_ITERATIONS); + Pipe pipe = Pipe.open(); + try (Selector sel = Selector.open(); + Pipe.SinkChannel sink = pipe.sink()) { + sink.configureBlocking(false); + SelectionKey key = sink.register(sel, SelectionKey.OP_WRITE); + CountDownLatch opStartLatch = new CountDownLatch(1); + runTest(executor, key, () -> { + // notify that we will now start write()ing + opStartLatch.countDown(); + // repeatedly do SC.write() till there's a ClosedChannelException + ByteBuffer bb = ByteBuffer.allocate(100); + try { + while (true) { + bb.clear(); + sink.write(bb); + } + } catch (ClosedChannelException _) { + } + return null; + }, opStartLatch); + } + } + } + } + + /** + * Runs the test for SourceChannel + * + * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch) + */ + @Test + public void testSourceChannel() throws Exception { + try (ExecutorService executor = Executors.newFixedThreadPool(2)) { + for (int i = 1; i <= NUM_ITERATIONS; i++) { + System.out.format("%s SourceChannel - %d of %d ...%n", + Instant.now(), i, NUM_ITERATIONS); + Pipe pipe = Pipe.open(); + try (Selector sel = Selector.open(); + Pipe.SourceChannel source = pipe.source()) { + source.configureBlocking(false); + SelectionKey key = source.register(sel, SelectionKey.OP_READ); + CountDownLatch opStartLatch = new CountDownLatch(1); + runTest(executor, key, () -> { + // notify that we will now start read()ing + opStartLatch.countDown(); + // repeatedly do SC.read() till there's a ClosedChannelException + ByteBuffer bb = ByteBuffer.allocate(100); + try { + while (true) { + bb.clear(); + source.read(bb); + } + } catch (ClosedChannelException _) { + } + return null; + }, opStartLatch); + } + } + } + } + + /** + * SelectableChannel implementations internally have a deferred close implementation. When a + * channel is registered with a Selector and close() is invoked on the channel from a certain + * thread, then the implementation of close() defers the actual close if the channel has + * in-progress operations (for example, read/write/send/receive and such) in some other thread. + * A subsequent operation through the Selector (like Selector.select()) then completes the + * deferred close (waiting for any in-progress operations to complete). This test method + * verifies that the deferred close implementation doesn't prematurely close and release + * the resources used by the channel, while there are in-progress operations. + * <p> + * Launches 2 threads, T1 and T2. When T1 and T2 are in progress, this method closes the + * channel that is registered with the Selector. + * T1 is running the channelOperation (which keeps running operations on the channel). + * T2 is running a task which keeps invoking Selector.select(), until the channel is closed. + * When T2 notices that the channel is closed, it cancels the selectionKey and then + * invokes one last Selector.select() operation to finish the deferred close of the channel. + */ + private static void runTest(ExecutorService executor, SelectionKey selectionKey, + Callable<Void> channelOperation, CountDownLatch chanOpStartLatch) + throws Exception { + + SelectableChannel channel = selectionKey.channel(); + assertFalse(channel.isBlocking(), "channel isn't non-blocking: " + channel); + selectionKey.selector().selectNow(); + // run the channel operations + Future<?> channelOpResult = executor.submit(channelOperation); + CountDownLatch selectorTaskStartLatch = new CountDownLatch(1); + // run the Selector.select() task + Future<?> selectorTaskResult = executor.submit( + new SelectorTask(selectionKey, selectorTaskStartLatch)); + // await for the channel operation task and the selector task to start + chanOpStartLatch.await(); + selectorTaskStartLatch.await(); + // close the channel while it's still registered with the Selector, + // so that the close is deferred by the channel implementations. + System.out.println("closing channel: " + channel); + assertTrue(channel.isOpen(), "channel already closed: " + channel); + assertTrue(channel.isRegistered(), "channel isn't registered: " + channel); + channel.close(); + // wait for the operation on the channel and the selector task to complete + channelOpResult.get(); + selectorTaskResult.get(); + } + + /* + * Keeps invoking Selector.select() until the channel is closed, after which + * it cancels the SelectionKey and does one last Selector.select() to finish + * the deferred close. + */ + private static final class SelectorTask implements Callable<Void> { + private final SelectionKey selectionKey; + private final CountDownLatch startedLatch; + + private SelectorTask(SelectionKey selectionKey, CountDownLatch startedLatch) { + this.selectionKey = Objects.requireNonNull(selectionKey); + this.startedLatch = startedLatch; + } + + @Override + public Void call() throws Exception { + try { + Selector selector = selectionKey.selector(); + SelectableChannel channel = selectionKey.channel(); + // notify that the task has started + startedLatch.countDown(); + while (true) { + selector.select(10); + if (!channel.isOpen()) { + // the channel is (defer) closed, cancel the registration and then + // issue a select() so that the Selector finishes the deferred + // close of the channel. + System.out.println("channel: " + channel + " isn't open," + + " now cancelling key: " + selectionKey); + selectionKey.cancel(); + System.out.println("initiating select after key cancelled: " + selectionKey); + selector.select(5); + break; + } + } + } catch (ClosedSelectorException _) { + } + return null; + } + } + + private static final class ConnAcceptor implements Callable<SocketChannel> { + private final ServerSocketChannel serverSocketChannel; + + private ConnAcceptor(ServerSocketChannel serverSocketChannel) { + this.serverSocketChannel = serverSocketChannel; + } + + @Override + public SocketChannel call() throws Exception { + SocketChannel accepted = serverSocketChannel.accept(); + System.out.println("Accepted connection: " + accepted); + return accepted; + } + } +} diff --git a/test/jdk/java/nio/channels/Selector/DeferredClose/java.base/java/net/InetSocketAddress.java b/test/jdk/java/nio/channels/Selector/DeferredClose/java.base/java/net/InetSocketAddress.java new file mode 100644 index 0000000000000..5994e9268a12f --- /dev/null +++ b/test/jdk/java/nio/channels/Selector/DeferredClose/java.base/java/net/InetSocketAddress.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.net; + + +import java.util.Locale; + +// Patched implementation only meant to be used in certain tests +public class InetSocketAddress extends SocketAddress { + + @java.io.Serial + private static final long serialVersionUID = 5076001401234631237L; + + private static boolean enableDelay; + + static { + System.out.println("patched InetSocketAddress class in use"); + } + + private final String hostname; + private final InetAddress addr; + private final int port; + + public InetSocketAddress(int port) { + this(InetAddress.anyLocalAddress(), port); + } + + public InetSocketAddress(InetAddress addr, int port) { + this(null, + addr == null ? InetAddress.anyLocalAddress() : addr, + checkPort(port)); + } + + public InetSocketAddress(String hostname, int port) { + checkHost(hostname); + InetAddress addr = null; + String host = null; + try { + addr = InetAddress.getByName(hostname); + } catch (UnknownHostException e) { + host = hostname; + } + this.hostname = host; + this.addr = addr; + this.port = checkPort(port); + } + + public static InetSocketAddress createUnresolved(String host, int port) { + return new InetSocketAddress(checkHost(host), null, checkPort(port)); + } + + public static void enableDelay() { + enableDelay = true; + } + + public static void disableDelay() { + enableDelay = false; + } + + private InetSocketAddress(String hostname, InetAddress addr, int port) { + this.hostname = hostname; + this.addr = addr; + this.port = port; + if (enableDelay) { + doDelay(); + } + } + + /** + * Gets the port number. + * + * @return the port number. + */ + public final int getPort() { + if (enableDelay) { + doDelay(); + } + return this.port; + } + + /** + * Gets the {@code InetAddress}. + * + * @return the InetAddress or {@code null} if it is unresolved. + */ + public final InetAddress getAddress() { + return this.addr; + } + + public final String getHostName() { + if (hostname != null) { + return hostname; + } + if (addr != null) { + return addr.getHostName(); + } + return null; + } + + public final String getHostString() { + if (hostname != null) { + return hostname; + } + if (addr != null) { + if (addr.holder().getHostName() != null) { + return addr.holder().getHostName(); + } else { + return addr.getHostAddress(); + } + } + return null; + } + + public final boolean isUnresolved() { + return addr == null; + } + + @Override + public String toString() { + String formatted; + if (isUnresolved()) { + formatted = hostname + "/<unresolved>"; + } else { + formatted = addr.toString(); + if (addr instanceof Inet6Address) { + int i = formatted.lastIndexOf("/"); + formatted = formatted.substring(0, i + 1) + + "[" + formatted.substring(i + 1) + "]"; + } + } + return formatted + ":" + port; + } + + @Override + public final boolean equals(Object other) { + if (!(other instanceof InetSocketAddress that)) { + return false; + } + boolean sameIP; + if (addr != null) { + sameIP = addr.equals(that.addr); + } else if (hostname != null) { + sameIP = (that.addr == null) && + hostname.equalsIgnoreCase(that.hostname); + } else { + sameIP = (that.addr == null) && (that.hostname == null); + } + return sameIP && (port == that.port); + } + + @Override + public final int hashCode() { + if (addr != null) { + return addr.hashCode() + port; + } + if (hostname != null) { + return hostname.toLowerCase(Locale.ROOT).hashCode() + port; + } + return port; + } + + private static int checkPort(int port) { + if (port < 0 || port > 0xFFFF) + throw new IllegalArgumentException("port out of range:" + port); + return port; + } + + private static String checkHost(String hostname) { + if (hostname == null) + throw new IllegalArgumentException("hostname can't be null"); + return hostname; + } + + private static void doDelay() { + System.out.println("intentional delay injected in InetSocketAddress"); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } +} From 9d20b58f40275002afa0348d94d5592a26894e88 Mon Sep 17 00:00:00 2001 From: Shaojin Wen <shaojin.wensj@alibaba-inc.com> Date: Thu, 27 Jun 2024 05:13:30 +0000 Subject: [PATCH 208/471] 8334328: Reduce object allocation for FloatToDecimal and DoubleToDecimal Reviewed-by: redestad, rgiulietti --- .../java/lang/AbstractStringBuilder.java | 19 +- .../jdk/internal/math/DoubleToDecimal.java | 256 ++++++------------ .../jdk/internal/math/FloatToDecimal.java | 241 ++++++----------- .../classes/jdk/internal/math/ToDecimal.java | 163 +++++++++++ .../bench/java/lang/StringBuilders.java | 71 ++++- 5 files changed, 401 insertions(+), 349 deletions(-) create mode 100644 src/java.base/share/classes/jdk/internal/math/ToDecimal.java diff --git a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java index 187e041e6745a..7e5056a539b8c 100644 --- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java +++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -885,13 +885,10 @@ public AbstractStringBuilder append(long l) { * @return a reference to this object. */ public AbstractStringBuilder append(float f) { - try { - FloatToDecimal.appendTo(f, this); - } catch (IOException e) { - throw new AssertionError(e); - } + ensureCapacityInternal(count + FloatToDecimal.MAX_CHARS); + FloatToDecimal toDecimal = isLatin1() ? FloatToDecimal.LATIN1 : FloatToDecimal.UTF16; + count = toDecimal.putDecimal(value, count, f); return this; - } /** @@ -907,11 +904,9 @@ public AbstractStringBuilder append(float f) { * @return a reference to this object. */ public AbstractStringBuilder append(double d) { - try { - DoubleToDecimal.appendTo(d, this); - } catch (IOException e) { - throw new AssertionError(e); - } + ensureCapacityInternal(count + DoubleToDecimal.MAX_CHARS); + DoubleToDecimal toDecimal = isLatin1() ? DoubleToDecimal.LATIN1 : DoubleToDecimal.UTF16; + count = toDecimal.putDecimal(value, count, d); return this; } diff --git a/src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java b/src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java index e3472d559b2c1..441137db4862b 100644 --- a/src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java +++ b/src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Alibaba Group Holding Limited. 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 @@ -32,10 +33,24 @@ import static java.lang.Math.multiplyHigh; import static jdk.internal.math.MathUtils.*; +import sun.nio.cs.ISO_8859_1; + /** * This class exposes a method to render a {@code double} as a string. */ -public final class DoubleToDecimal { +public final class DoubleToDecimal extends ToDecimal { + /** + * Use LATIN1 encoding to process the in-out byte[] str + * + */ + public static final DoubleToDecimal LATIN1 = new DoubleToDecimal(true); + + /** + * Use UTF16 encoding to process the in-out byte[] str + * + */ + public static final DoubleToDecimal UTF16 = new DoubleToDecimal(false); + /* * For full details about this code see the following references: * @@ -91,16 +106,6 @@ public final class DoubleToDecimal { /* Used in rop() */ private static final long MASK_63 = (1L << 63) - 1; - /* Used for left-to-tight digit extraction */ - private static final int MASK_28 = (1 << 28) - 1; - - private static final int NON_SPECIAL = 0; - private static final int PLUS_ZERO = 1; - private static final int MINUS_ZERO = 2; - private static final int PLUS_INF = 3; - private static final int MINUS_INF = 4; - private static final int NAN = 5; - /* * Room for the longer of the forms * -ddddd.dddddddddddd H + 2 characters @@ -110,13 +115,8 @@ public final class DoubleToDecimal { */ public static final int MAX_CHARS = H + 7; - private final byte[] bytes; - - /* Index into bytes of rightmost valid character */ - private int index; - - private DoubleToDecimal(boolean noChars) { - bytes = noChars ? null : new byte[MAX_CHARS]; + private DoubleToDecimal(boolean latin1) { + super(latin1); } /** @@ -128,7 +128,14 @@ private DoubleToDecimal(boolean noChars) { * @see Double#toString(double) */ public static String toString(double v) { - return new DoubleToDecimal(false).toDecimalString(v); + byte[] str = new byte[MAX_CHARS]; + int pair = LATIN1.toDecimal(str, 0, v, null); + int type = pair & 0xFF00; + if (type == NON_SPECIAL) { + int size = pair & 0xFF; + return new String(str, 0, size, ISO_8859_1.INSTANCE); + } + return special(type); } /** @@ -149,71 +156,42 @@ public static String toString(double v) { * @param fd the object that will carry <i>f</i>, <i>e</i>, and <i>n</i>. */ public static void split(double v, FormattedFPDecimal fd) { - new DoubleToDecimal(true).toDecimal(v, fd); + byte[] str = new byte[MAX_CHARS]; + LATIN1.toDecimal(str, 0, v, fd); } /** - * Appends the rendering of the {@code v} to {@code app}. + * Appends the rendering of the {@code v} to {@code str}. * * <p>The outcome is the same as if {@code v} were first * {@link #toString(double) rendered} and the resulting string were then - * {@link Appendable#append(CharSequence) appended} to {@code app}. * - * @param v the {@code double} whose rendering is appended. - * @param app the {@link Appendable} to append to. + * @param str the String byte array to append to + * @param index the index into str + * @param v the {@code double} whose rendering is into str. * @throws IOException If an I/O error occurs */ - public static Appendable appendTo(double v, Appendable app) - throws IOException { - return new DoubleToDecimal(false).appendDecimalTo(v, app); - } + public int putDecimal(byte[] str, int index, double v) { + assert 0 <= index && index <= length(str) - MAX_CHARS : "Trusted caller missed bounds check"; - private String toDecimalString(double v) { - return switch (toDecimal(v, null)) { - case NON_SPECIAL -> charsToString(); - case PLUS_ZERO -> "0.0"; - case MINUS_ZERO -> "-0.0"; - case PLUS_INF -> "Infinity"; - case MINUS_INF -> "-Infinity"; - default -> "NaN"; - }; - } - - private Appendable appendDecimalTo(double v, Appendable app) - throws IOException { - switch (toDecimal(v, null)) { - case NON_SPECIAL: - char[] chars = new char[index + 1]; - for (int i = 0; i < chars.length; ++i) { - chars[i] = (char) bytes[i]; - } - if (app instanceof StringBuilder builder) { - return builder.append(chars); - } - if (app instanceof StringBuffer buffer) { - return buffer.append(chars); - } - for (char c : chars) { - app.append(c); - } - return app; - case PLUS_ZERO: return app.append("0.0"); - case MINUS_ZERO: return app.append("-0.0"); - case PLUS_INF: return app.append("Infinity"); - case MINUS_INF: return app.append("-Infinity"); - default: return app.append("NaN"); + int pair = toDecimal(str, index, v, null); + int type = pair & 0xFF00; + if (type == NON_SPECIAL) { + return index + (pair & 0xFF); } + return putSpecial(str, index, type); } /* - * Returns + * Returns size in the lower byte, type in the high byte, where type is * PLUS_ZERO iff v is 0.0 * MINUS_ZERO iff v is -0.0 * PLUS_INF iff v is POSITIVE_INFINITY * MINUS_INF iff v is NEGATIVE_INFINITY * NAN iff v is NaN + * otherwise NON_SPECIAL */ - private int toDecimal(double v, FormattedFPDecimal fd) { + private int toDecimal(byte[] str, int index, double v, FormattedFPDecimal fd) { /* * For full details see references [2] and [1]. * @@ -227,13 +205,13 @@ private int toDecimal(double v, FormattedFPDecimal fd) { long t = bits & T_MASK; int bq = (int) (bits >>> P - 1) & BQ_MASK; if (bq < BQ_MASK) { - index = -1; + int start = index; if (bits < 0) { /* - * fd != null implies bytes == null and bits >= 0 + * fd != null implies str == null and bits >= 0 * Thus, when fd != null, control never reaches here. */ - append('-'); + index = putChar(str, index, '-'); } if (bq != 0) { /* normal value. Here mq = -q */ @@ -243,16 +221,16 @@ private int toDecimal(double v, FormattedFPDecimal fd) { if (0 < mq & mq < P) { long f = c >> mq; if (f << mq == c) { - return toChars(f, 0, fd); + return toChars(str, index, f, 0, fd) - start; } } - return toDecimal(-mq, c, 0, fd); + return toDecimal(str, index, -mq, c, 0, fd) - start; } if (t != 0) { /* subnormal value */ - return t < C_TINY - ? toDecimal(Q_MIN, 10 * t, -1, fd) - : toDecimal(Q_MIN, t, 0, fd); + return (t < C_TINY + ? toDecimal(str, index, Q_MIN, 10 * t, -1, fd) + : toDecimal(str, index, Q_MIN, t, 0, fd)) - start; } return bits == 0 ? PLUS_ZERO : MINUS_ZERO; } @@ -262,7 +240,7 @@ private int toDecimal(double v, FormattedFPDecimal fd) { return bits > 0 ? PLUS_INF : MINUS_INF; } - private int toDecimal(int q, long c, int dk, FormattedFPDecimal fd) { + private int toDecimal(byte[] str, int index, int q, long c, int dk, FormattedFPDecimal fd) { /* * The skeleton corresponds to figure 7 of [1]. * The efficient computations are those summarized in figure 9. @@ -327,7 +305,7 @@ private int toDecimal(int q, long c, int dk, FormattedFPDecimal fd) { boolean upin = vbl + out <= sp10 << 2; boolean wpin = (tp10 << 2) + out <= vbr; if (upin != wpin) { - return toChars(upin ? sp10 : tp10, k, fd); + return toChars(str, index, upin ? sp10 : tp10, k, fd); } } @@ -342,14 +320,14 @@ private int toDecimal(int q, long c, int dk, FormattedFPDecimal fd) { boolean win = (t << 2) + out <= vbr; if (uin != win) { /* Exactly one of u or w lies in Rv */ - return toChars(uin ? s : t, k + dk, fd); + return toChars(str, index, uin ? s : t, k + dk, fd); } /* * Both u and w lie in Rv: determine the one closest to v. * See section 9.3 of [1]. */ long cmp = vb - (s + t << 1); - return toChars(cmp < 0 || cmp == 0 && (s & 0x1) == 0 ? s : t, k + dk, fd); + return toChars(str, index, cmp < 0 || cmp == 0 && (s & 0x1) == 0 ? s : t, k + dk, fd); } /* @@ -368,7 +346,7 @@ private static long rop(long g1, long g0, long cp) { /* * Formats the decimal f 10^e. */ - private int toChars(long f, int e, FormattedFPDecimal fd) { + private int toChars(byte[] str, int index, long f, int e, FormattedFPDecimal fd) { /* * For details not discussed here see section 10 of [1]. * @@ -381,7 +359,7 @@ private int toChars(long f, int e, FormattedFPDecimal fd) { } if (fd != null) { fd.set(f, e, len); - return NON_SPECIAL; + return index; } /* @@ -413,115 +391,74 @@ private int toChars(long f, int e, FormattedFPDecimal fd) { int m = (int) (hm - 100_000_000 * h); if (0 < e && e <= 7) { - return toChars1(h, m, l, e); + return toChars1(str, index, h, m, l, e); } if (-3 < e && e <= 0) { - return toChars2(h, m, l, e); + return toChars2(str, index, h, m, l, e); } - return toChars3(h, m, l, e); + return toChars3(str, index, h, m, l, e); } - private int toChars1(int h, int m, int l, int e) { + private int toChars1(byte[] str, int index, int h, int m, int l, int e) { /* * 0 < e <= 7: plain format without leading zeroes. * Left-to-right digits extraction: * algorithm 1 in [3], with b = 10, k = 8, n = 28. */ - appendDigit(h); + index = putDigit(str, index, h); int y = y(m); int t; int i = 1; for (; i < e; ++i) { t = 10 * y; - appendDigit(t >>> 28); + index = putDigit(str, index, t >>> 28); y = t & MASK_28; } - append('.'); + index = putChar(str, index, '.'); for (; i <= 8; ++i) { t = 10 * y; - appendDigit(t >>> 28); + index = putDigit(str, index, t >>> 28); y = t & MASK_28; } - lowDigits(l); - return NON_SPECIAL; + return lowDigits(str, index, l); } - private int toChars2(int h, int m, int l, int e) { + private int toChars2(byte[] str, int index, int h, int m, int l, int e) { /* -3 < e <= 0: plain format with leading zeroes */ - appendDigit(0); - append('.'); + index = putDigit(str, index, 0); + index = putChar(str, index, '.'); for (; e < 0; ++e) { - appendDigit(0); + index = putDigit(str, index, 0); } - appendDigit(h); - append8Digits(m); - lowDigits(l); - return NON_SPECIAL; + index = putDigit(str, index, h); + index = put8Digits(str, index, m); + return lowDigits(str, index, l); } - private int toChars3(int h, int m, int l, int e) { + private int toChars3(byte[] str, int index, int h, int m, int l, int e) { /* -3 >= e | e > 7: computerized scientific notation */ - appendDigit(h); - append('.'); - append8Digits(m); - lowDigits(l); - exponent(e - 1); - return NON_SPECIAL; + index = putDigit(str, index, h); + index = putChar(str, index, '.'); + index = put8Digits(str, index, m); + index = lowDigits(str, index, l); + return exponent(str, index, e - 1); } - private void lowDigits(int l) { + private int lowDigits(byte[] str, int index, int l) { if (l != 0) { - append8Digits(l); + index = put8Digits(str, index, l); } - removeTrailingZeroes(); + return removeTrailingZeroes(str, index); } - private void append8Digits(int m) { - /* - * Left-to-right digits extraction: - * algorithm 1 in [3], with b = 10, k = 8, n = 28. - */ - int y = y(m); - for (int i = 0; i < 8; ++i) { - int t = 10 * y; - appendDigit(t >>> 28); - y = t & MASK_28; - } - } - - private void removeTrailingZeroes() { - while (bytes[index] == '0') { - --index; - } - /* ... but do not remove the one directly to the right of '.' */ - if (bytes[index] == '.') { - ++index; - } - } - - private int y(int a) { - /* - * Algorithm 1 in [3] needs computation of - * floor((a + 1) 2^n / b^k) - 1 - * with a < 10^8, b = 10, k = 8, n = 28. - * Noting that - * (a + 1) 2^n <= 10^8 2^28 < 10^17 - * For n = 17, m = 8 the table in section 10 of [1] leads to: - */ - return (int) (multiplyHigh( - (long) (a + 1) << 28, - 193_428_131_138_340_668L) >>> 20) - 1; - } - - private void exponent(int e) { - append('E'); + private int exponent(byte[] str, int index, int e) { + index = putChar(str, index, 'E'); if (e < 0) { - append('-'); + index = putChar(str, index, '-'); e = -e; } if (e < 10) { - appendDigit(e); - return; + return putDigit(str, index, e); } int d; if (e >= 100) { @@ -530,7 +467,7 @@ private void exponent(int e) { * floor(e / 100) = floor(1_311 e / 2^17) */ d = e * 1_311 >>> 17; - appendDigit(d); + index = putDigit(str, index, d); e -= 100 * d; } /* @@ -538,22 +475,7 @@ private void exponent(int e) { * floor(e / 10) = floor(103 e / 2^10) */ d = e * 103 >>> 10; - appendDigit(d); - appendDigit(e - 10 * d); - } - - private void append(int c) { - bytes[++index] = (byte) c; + index = putDigit(str, index, d); + return putDigit(str, index, e - 10 * d); } - - private void appendDigit(int d) { - bytes[++index] = (byte) ('0' + d); - } - - /* Using the deprecated constructor enhances performance */ - @SuppressWarnings("deprecation") - private String charsToString() { - return new String(bytes, 0, 0, index + 1); - } - } diff --git a/src/java.base/share/classes/jdk/internal/math/FloatToDecimal.java b/src/java.base/share/classes/jdk/internal/math/FloatToDecimal.java index 56382767f754c..1ca68a000d965 100644 --- a/src/java.base/share/classes/jdk/internal/math/FloatToDecimal.java +++ b/src/java.base/share/classes/jdk/internal/math/FloatToDecimal.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Alibaba Group Holding Limited. 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 @@ -32,10 +33,24 @@ import static java.lang.Math.multiplyHigh; import static jdk.internal.math.MathUtils.*; +import sun.nio.cs.ISO_8859_1; + /** * This class exposes a method to render a {@code float} as a string. */ -public final class FloatToDecimal { +public final class FloatToDecimal extends ToDecimal { + /** + * Use LATIN1 encoding to process the in-out byte[] str + * + */ + public static final FloatToDecimal LATIN1 = new FloatToDecimal(true); + + /** + * Use UTF16 encoding to process the in-out byte[] str + * + */ + public static final FloatToDecimal UTF16 = new FloatToDecimal(false); + /* * For full details about this code see the following references: * @@ -91,16 +106,6 @@ public final class FloatToDecimal { /* Used in rop() */ private static final long MASK_32 = (1L << 32) - 1; - /* Used for left-to-tight digit extraction */ - private static final int MASK_28 = (1 << 28) - 1; - - private static final int NON_SPECIAL = 0; - private static final int PLUS_ZERO = 1; - private static final int MINUS_ZERO = 2; - private static final int PLUS_INF = 3; - private static final int MINUS_INF = 4; - private static final int NAN = 5; - /* * Room for the longer of the forms * -ddddd.dddd H + 2 characters @@ -110,12 +115,8 @@ public final class FloatToDecimal { */ public static final int MAX_CHARS = H + 6; - private final byte[] bytes = new byte[MAX_CHARS]; - - /* Index into bytes of rightmost valid character */ - private int index; - - private FloatToDecimal() { + private FloatToDecimal(boolean latin1) { + super(latin1); } /** @@ -127,71 +128,49 @@ private FloatToDecimal() { * @see Float#toString(float) */ public static String toString(float v) { - return new FloatToDecimal().toDecimalString(v); + byte[] str = new byte[MAX_CHARS]; + int pair = LATIN1.toDecimal(str, 0, v); + int type = pair & 0xFF00; + if (type == NON_SPECIAL) { + int size = pair & 0xFF; + return new String(str, 0, size, ISO_8859_1.INSTANCE); + } + return special(type); } /** - * Appends the rendering of the {@code v} to {@code app}. + * Appends the rendering of the {@code v} to {@code str}. * * <p>The outcome is the same as if {@code v} were first - * {@link #toString(float) rendered} and the resulting string were then - * {@link Appendable#append(CharSequence) appended} to {@code app}. + * {@link #toString(double) rendered} and the resulting string were then * - * @param v the {@code float} whose rendering is appended. - * @param app the {@link Appendable} to append to. + * @param str the String byte array to append to + * @param index the index into str + * @param v the {@code float} whose rendering is into str. * @throws IOException If an I/O error occurs */ - public static Appendable appendTo(float v, Appendable app) - throws IOException { - return new FloatToDecimal().appendDecimalTo(v, app); - } + public int putDecimal(byte[] str, int index, float v) { + assert 0 <= index && index <= length(str) - MAX_CHARS : "Trusted caller missed bounds check"; - private String toDecimalString(float v) { - return switch (toDecimal(v)) { - case NON_SPECIAL -> charsToString(); - case PLUS_ZERO -> "0.0"; - case MINUS_ZERO -> "-0.0"; - case PLUS_INF -> "Infinity"; - case MINUS_INF -> "-Infinity"; - default -> "NaN"; - }; - } - - private Appendable appendDecimalTo(float v, Appendable app) - throws IOException { - switch (toDecimal(v)) { - case NON_SPECIAL: - char[] chars = new char[index + 1]; - for (int i = 0; i < chars.length; ++i) { - chars[i] = (char) bytes[i]; - } - if (app instanceof StringBuilder builder) { - return builder.append(chars); - } - if (app instanceof StringBuffer buffer) { - return buffer.append(chars); - } - for (char c : chars) { - app.append(c); - } - return app; - case PLUS_ZERO: return app.append("0.0"); - case MINUS_ZERO: return app.append("-0.0"); - case PLUS_INF: return app.append("Infinity"); - case MINUS_INF: return app.append("-Infinity"); - default: return app.append("NaN"); + int pair = toDecimal(str, index, v); + int type = pair & 0xFF00; + if (type == NON_SPECIAL) { + return index + (pair & 0xFF); } + return putSpecial(str, index, type); } /* * Returns + * Combine type and size, the first byte is size, the second byte is type + * * PLUS_ZERO iff v is 0.0 * MINUS_ZERO iff v is -0.0 * PLUS_INF iff v is POSITIVE_INFINITY * MINUS_INF iff v is NEGATIVE_INFINITY * NAN iff v is NaN */ - private int toDecimal(float v) { + private int toDecimal(byte[] str, int index, float v) { /* * For full details see references [2] and [1]. * @@ -205,9 +184,9 @@ private int toDecimal(float v) { int t = bits & T_MASK; int bq = (bits >>> P - 1) & BQ_MASK; if (bq < BQ_MASK) { - index = -1; + int start = index; if (bits < 0) { - append('-'); + index = putChar(str, index, '-'); } if (bq != 0) { /* normal value. Here mq = -q */ @@ -217,16 +196,16 @@ private int toDecimal(float v) { if (0 < mq & mq < P) { int f = c >> mq; if (f << mq == c) { - return toChars(f, 0); + return toChars(str, index, f, 0) - start; } } - return toDecimal(-mq, c, 0); + return toDecimal(str, index, -mq, c, 0) - start; } if (t != 0) { /* subnormal value */ - return t < C_TINY - ? toDecimal(Q_MIN, 10 * t, -1) - : toDecimal(Q_MIN, t, 0); + return (t < C_TINY + ? toDecimal(str, index, Q_MIN, 10 * t, -1) + : toDecimal(str, index, Q_MIN, t, 0)) - start; } return bits == 0 ? PLUS_ZERO : MINUS_ZERO; } @@ -236,7 +215,7 @@ private int toDecimal(float v) { return bits > 0 ? PLUS_INF : MINUS_INF; } - private int toDecimal(int q, int c, int dk) { + private int toDecimal(byte[] str, int index, int q, int c, int dk) { /* * The skeleton corresponds to figure 7 of [1]. * The efficient computations are those summarized in figure 9. @@ -300,7 +279,7 @@ private int toDecimal(int q, int c, int dk) { boolean upin = vbl + out <= sp10 << 2; boolean wpin = (tp10 << 2) + out <= vbr; if (upin != wpin) { - return toChars(upin ? sp10 : tp10, k); + return toChars(str, index, upin ? sp10 : tp10, k); } } @@ -315,14 +294,14 @@ private int toDecimal(int q, int c, int dk) { boolean win = (t << 2) + out <= vbr; if (uin != win) { /* Exactly one of u or w lies in Rv */ - return toChars(uin ? s : t, k + dk); + return toChars(str, index, uin ? s : t, k + dk); } /* * Both u and w lie in Rv: determine the one closest to v. * See section 9.3 of [1]. */ int cmp = vb - (s + t << 1); - return toChars(cmp < 0 || cmp == 0 && (s & 0x1) == 0 ? s : t, k + dk); + return toChars(str, index, cmp < 0 || cmp == 0 && (s & 0x1) == 0 ? s : t, k + dk); } /* @@ -338,7 +317,7 @@ private static int rop(long g, long cp) { /* * Formats the decimal f 10^e. */ - private int toChars(int f, int e) { + private int toChars(byte[] str, int index, int f, int e) { /* * For details not discussed here see section 10 of [1]. * @@ -373,130 +352,74 @@ private int toChars(int f, int e) { int l = f - 100_000_000 * h; if (0 < e && e <= 7) { - return toChars1(h, l, e); + return toChars1(str, index, h, l, e); } if (-3 < e && e <= 0) { - return toChars2(h, l, e); + return toChars2(str, index, h, l, e); } - return toChars3(h, l, e); + return toChars3(str, index, h, l, e); } - private int toChars1(int h, int l, int e) { + private int toChars1(byte[] str, int index, int h, int l, int e) { /* * 0 < e <= 7: plain format without leading zeroes. * Left-to-right digits extraction: * algorithm 1 in [3], with b = 10, k = 8, n = 28. */ - appendDigit(h); + index = putDigit(str, index, h); int y = y(l); int t; int i = 1; for (; i < e; ++i) { t = 10 * y; - appendDigit(t >>> 28); + index = putDigit(str, index, t >>> 28); y = t & MASK_28; } - append('.'); + index = putChar(str, index, '.'); for (; i <= 8; ++i) { t = 10 * y; - appendDigit(t >>> 28); + index = putDigit(str, index, t >>> 28); y = t & MASK_28; } - removeTrailingZeroes(); - return NON_SPECIAL; + return removeTrailingZeroes(str, index); } - private int toChars2(int h, int l, int e) { + private int toChars2(byte[] str, int index, int h, int l, int e) { /* -3 < e <= 0: plain format with leading zeroes */ - appendDigit(0); - append('.'); + index = putDigit(str, index, 0); + index = putChar(str, index, '.'); for (; e < 0; ++e) { - appendDigit(0); + index = putDigit(str, index, 0); } - appendDigit(h); - append8Digits(l); - removeTrailingZeroes(); - return NON_SPECIAL; + index = putDigit(str, index, h); + index = put8Digits(str, index, l); + return removeTrailingZeroes(str, index); } - private int toChars3(int h, int l, int e) { + private int toChars3(byte[] str, int index, int h, int l, int e) { /* -3 >= e | e > 7: computerized scientific notation */ - appendDigit(h); - append('.'); - append8Digits(l); - removeTrailingZeroes(); - exponent(e - 1); - return NON_SPECIAL; + index = putDigit(str, index, h); + index = putChar(str, index, '.'); + index = put8Digits(str, index, l); + index = removeTrailingZeroes(str, index); + return exponent(str, index, e - 1); } - private void append8Digits(int m) { - /* - * Left-to-right digits extraction: - * algorithm 1 in [3], with b = 10, k = 8, n = 28. - */ - int y = y(m); - for (int i = 0; i < 8; ++i) { - int t = 10 * y; - appendDigit(t >>> 28); - y = t & MASK_28; - } - } - - private void removeTrailingZeroes() { - while (bytes[index] == '0') { - --index; - } - /* ... but do not remove the one directly to the right of '.' */ - if (bytes[index] == '.') { - ++index; - } - } - - private int y(int a) { - /* - * Algorithm 1 in [3] needs computation of - * floor((a + 1) 2^n / b^k) - 1 - * with a < 10^8, b = 10, k = 8, n = 28. - * Noting that - * (a + 1) 2^n <= 10^8 2^28 < 10^17 - * For n = 17, m = 8 the table in section 10 of [1] leads to: - */ - return (int) (multiplyHigh( - (long) (a + 1) << 28, - 193_428_131_138_340_668L) >>> 20) - 1; - } - - private void exponent(int e) { - append('E'); + private int exponent(byte[] str, int index, int e) { + index = putChar(str, index, 'E'); if (e < 0) { - append('-'); + index = putChar(str, index, '-'); e = -e; } if (e < 10) { - appendDigit(e); - return; + return putDigit(str, index, e); } /* * For n = 2, m = 1 the table in section 10 of [1] shows * floor(e / 10) = floor(103 e / 2^10) */ int d = e * 103 >>> 10; - appendDigit(d); - appendDigit(e - 10 * d); - } - - private void append(int c) { - bytes[++index] = (byte) c; + index = putDigit(str, index, d); + return putDigit(str, index, e - 10 * d); } - - private void appendDigit(int d) { - bytes[++index] = (byte) ('0' + d); - } - - /* Using the deprecated constructor enhances performance */ - @SuppressWarnings("deprecation") - private String charsToString() { - return new String(bytes, 0, 0, index + 1); - } - } diff --git a/src/java.base/share/classes/jdk/internal/math/ToDecimal.java b/src/java.base/share/classes/jdk/internal/math/ToDecimal.java new file mode 100644 index 0000000000000..45d4da25323c4 --- /dev/null +++ b/src/java.base/share/classes/jdk/internal/math/ToDecimal.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Alibaba Group Holding Limited. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.math; + +import jdk.internal.access.JavaLangAccess; +import jdk.internal.access.SharedSecrets; + +import static java.lang.Math.multiplyHigh; + +abstract sealed class ToDecimal permits DoubleToDecimal, FloatToDecimal { + private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess(); + + /* Used for left-to-tight digit extraction */ + static final int MASK_28 = (1 << 28) - 1; + + static final int NON_SPECIAL = 0 << 8; + static final int PLUS_ZERO = 1 << 8; + static final int MINUS_ZERO = 2 << 8; + static final int PLUS_INF = 3 << 8; + static final int MINUS_INF = 4 << 8; + static final int NAN = 5 << 8; + + /** + * The identifier of the encoding used to encode the bytes. If latin1 is true, the encoding is LATIN1, false is UTF16 + * + */ + private final boolean latin1; + + ToDecimal(boolean latin1) { + this.latin1 = latin1; + } + + final int putChar(byte[] str, int index, int c) { + if (latin1) { + str[index] = (byte) c; + } else { + JLA.putCharUTF16(str, index, (char) c); + } + return index + 1; + } + + final int putDigit(byte[] str, int index, int d) { + return putChar(str, index, (byte) ('0' + d)); + } + + final int put8Digits(byte[] str, int index, int m) { + /* + * Left-to-right digits extraction: + * algorithm 1 in [3], with b = 10, k = 8, n = 28. + */ + if (latin1) { + put8DigitsLatin1(str, index, m); + } else { + put8DigitsUTF16 (str, index, m); + } + return index + 8; + } + + private static void put8DigitsLatin1(byte[] str, int index, int m) { + int y = y(m); + for (int i = 0; i < 8; ++i) { + int t = 10 * y; + str[index + i] = (byte) ('0' + (t >>> 28)); + y = t & MASK_28; + } + } + + private static void put8DigitsUTF16(byte[] str, int index, int m) { + int y = y(m); + for (int i = 0; i < 8; ++i) { + int t = 10 * y; + JLA.putCharUTF16(str, index + i, '0' + (t >>> 28)); + y = t & MASK_28; + } + } + + static int y(int a) { + /* + * Algorithm 1 in [3] needs computation of + * floor((a + 1) 2^n / b^k) - 1 + * with a < 10^8, b = 10, k = 8, n = 28. + * Noting that + * (a + 1) 2^n <= 10^8 2^28 < 10^17 + * For n = 17, m = 8 the table in section 10 of [1] leads to: + */ + return (int) (multiplyHigh( + (long) (a + 1) << 28, + 193_428_131_138_340_668L) >>> 20) - 1; + } + + final int removeTrailingZeroes(byte[] str, int index) { + if (latin1) { + while (str[index - 1] == '0') { + --index; + } + /* ... but do not remove the one directly to the right of '.' */ + if (str[index - 1] == '.') { + ++index; + } + } else { + while (JLA.getUTF16Char(str, index - 1) == '0') { + --index; + } + /* ... but do not remove the one directly to the right of '.' */ + if (JLA.getUTF16Char(str, index - 1) == '.') { + ++index; + } + } + return index; + } + + @SuppressWarnings("deprecation") + final int putSpecial(byte[] str, int index, int type) { + String s = special(type); + int length = s.length(); + if (latin1) { + s.getBytes(0, length, str, index); + } else { + for (int i = 0; i < length; ++i) { + putChar(str, index + i, s.charAt(i)); + } + } + return index + length; + } + + final int length(byte[] str) { + return str.length >> (latin1 ? 0 : 1); + } + + static String special(int type) { + return switch (type) { + case PLUS_ZERO -> "0.0"; + case MINUS_ZERO -> "-0.0"; + case PLUS_INF -> "Infinity"; + case MINUS_INF -> "-Infinity"; + default -> "NaN"; + }; + } +} diff --git a/test/micro/org/openjdk/bench/java/lang/StringBuilders.java b/test/micro/org/openjdk/bench/java/lang/StringBuilders.java index 29827b7f03a2f..e7579d72ecb84 100644 --- a/test/micro/org/openjdk/bench/java/lang/StringBuilders.java +++ b/test/micro/org/openjdk/bench/java/lang/StringBuilders.java @@ -241,17 +241,66 @@ public String toStringCharWithBool8() { @Benchmark - public String toStringCharWithFloat8() { - StringBuilder result = new StringBuilder(); - result.append(113.110F); - result.append(156456.36435637F); - result.append(65436434.64632F); - result.append(42654634.64540F); - result.append(63464351.64537F); - result.append(634564.645711F); - result.append(64547.64311F); - result.append(4763456341.64531F); - return result.toString(); + public int appendWithFloat8Latin1() { + StringBuilder buf = sbLatin1; + buf.setLength(0); + buf.append(113.110F); + buf.append(156456.36435637F); + buf.append(65436434.64632F); + buf.append(42654634.64540F); + buf.append(63464351.64537F); + buf.append(634564.645711F); + buf.append(64547.64311F); + buf.append(4763456341.64531F); + return buf.length(); + } + + + @Benchmark + public int appendWithFloat8Utf16() { + StringBuilder buf = sbUtf16; + buf.setLength(0); + buf.append(113.110F); + buf.append(156456.36435637F); + buf.append(65436434.64632F); + buf.append(42654634.64540F); + buf.append(63464351.64537F); + buf.append(634564.645711F); + buf.append(64547.64311F); + buf.append(4763456341.64531F); + return buf.length(); + } + + + @Benchmark + public int appendWithDouble8Latin1() { + StringBuilder buf = sbLatin1; + buf.setLength(0); + buf.append(0.3005216476500575D); + buf.append(0.39727691577802204D); + buf.append(0.9869700323149287D); + buf.append(42654634.645403256D); + buf.append(63464351.645371353D); + buf.append(634564.645711246D); + buf.append(64547.6431172363D); + buf.append(4763456341.64531675D); + return buf.length(); + } + + + @Benchmark + public int appendWithDouble8Utf16() { + StringBuilder buf = sbUtf16; + buf.setLength(0); + buf.append(0.3005216476500575D); + buf.append(0.39727691577802204D); + buf.append(0.9869700323149287D); + buf.append(42654634.645403256D); + buf.append(63464351.645371353D); + buf.append(634564.645711246D); + buf.append(64547.6431172363D); + buf.append(4763456341.64531675D); + return buf.length(); } @Benchmark From 0fc5b2711fbdde972c40bfef2977dd9d70e09581 Mon Sep 17 00:00:00 2001 From: Nizar Benalla <nbenalla@openjdk.org> Date: Thu, 27 Jun 2024 06:22:17 +0000 Subject: [PATCH 209/471] 8332014: since-checker - Fix @ since tags in jdk.jshell Reviewed-by: jlahoda --- src/jdk.jshell/share/classes/jdk/jshell/Snippet.java | 2 +- .../share/classes/jdk/jshell/SourceCodeAnalysis.java | 4 +++- .../share/classes/jdk/jshell/tool/JavaShellToolBuilder.java | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java index a86ea2a863d43..b0f20a84ec67a 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java @@ -249,8 +249,8 @@ public enum SubKind { * A record declaration. * A {@code SubKind} of {@link Kind#TYPE_DECL}. * @jls 8.10 Record Types - * @since 14 * + * @since 17 */ RECORD_SUBKIND(Kind.TYPE_DECL), diff --git a/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java b/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java index 7a78c04f5a860..99bfd870f37c3 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -158,6 +158,8 @@ public abstract class SourceCodeAnalysis { * @param input The input String to convert * @return usually a singleton list of Snippet, but may be empty or multiple * @throws IllegalStateException if the {@code JShell} instance is closed. + * + * @since 10 */ public abstract List<Snippet> sourceToSnippets(String input); diff --git a/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java b/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java index 06dd4d8ce1c62..e28a6cefb6afd 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java @@ -250,6 +250,8 @@ default JavaShellToolBuilder windowSize(int columns, int rows) { * @throws Exception an unexpected fatal exception * @return the exit status with which the tool explicitly exited (if any), * otherwise 0 for success or 1 for failure + * + * @since 10 */ default int start(String... arguments) throws Exception { run(arguments); From 46b817b7499e74ba8812d38bcce93147ebf93b25 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Thu, 27 Jun 2024 06:53:03 +0000 Subject: [PATCH 210/471] 8333363: ubsan: instanceKlass.cpp: runtime error: member call on null pointer of type 'struct AnnotationArray' Reviewed-by: coleenp, stefank --- src/hotspot/share/oops/instanceKlass.cpp | 35 +++++++----------------- src/hotspot/share/oops/metadata.hpp | 9 ++++++ 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index 328c2edbb9fb5..aa8f47f62df2f 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -3539,9 +3539,7 @@ void InstanceKlass::print_on(outputStream* st) const { } } } - if (default_vtable_indices() != nullptr) { - st->print(BULLET"default vtable indices: "); default_vtable_indices()->print_value_on(st); st->cr(); - } + print_on_maybe_null(st, BULLET"default vtable indices: ", default_vtable_indices()); st->print(BULLET"local interfaces: "); local_interfaces()->print_value_on(st); st->cr(); st->print(BULLET"trans. interfaces: "); transitive_interfaces()->print_value_on(st); st->cr(); @@ -3568,25 +3566,18 @@ void InstanceKlass::print_on(outputStream* st) const { } } st->print(BULLET"constants: "); constants()->print_value_on(st); st->cr(); - if (class_loader_data() != nullptr) { - st->print(BULLET"class loader data: "); - class_loader_data()->print_value_on(st); - st->cr(); - } - if (source_file_name() != nullptr) { - st->print(BULLET"source file: "); - source_file_name()->print_value_on(st); - st->cr(); - } + + print_on_maybe_null(st, BULLET"class loader data: ", class_loader_data()); + print_on_maybe_null(st, BULLET"source file: ", source_file_name()); if (source_debug_extension() != nullptr) { st->print(BULLET"source debug extension: "); st->print("%s", source_debug_extension()); st->cr(); } - st->print(BULLET"class annotations: "); class_annotations()->print_value_on(st); st->cr(); - st->print(BULLET"class type annotations: "); class_type_annotations()->print_value_on(st); st->cr(); - st->print(BULLET"field annotations: "); fields_annotations()->print_value_on(st); st->cr(); - st->print(BULLET"field type annotations: "); fields_type_annotations()->print_value_on(st); st->cr(); + print_on_maybe_null(st, BULLET"class annotations: ", class_annotations()); + print_on_maybe_null(st, BULLET"class type annotations: ", class_type_annotations()); + print_on_maybe_null(st, BULLET"field annotations: ", fields_annotations()); + print_on_maybe_null(st, BULLET"field type annotations: ", fields_type_annotations()); { bool have_pv = false; // previous versions are linked together through the InstanceKlass @@ -3601,16 +3592,10 @@ void InstanceKlass::print_on(outputStream* st) const { if (have_pv) st->cr(); } - if (generic_signature() != nullptr) { - st->print(BULLET"generic signature: "); - generic_signature()->print_value_on(st); - st->cr(); - } + print_on_maybe_null(st, BULLET"generic signature: ", generic_signature()); st->print(BULLET"inner classes: "); inner_classes()->print_value_on(st); st->cr(); st->print(BULLET"nest members: "); nest_members()->print_value_on(st); st->cr(); - if (record_components() != nullptr) { - st->print(BULLET"record components: "); record_components()->print_value_on(st); st->cr(); - } + print_on_maybe_null(st, BULLET"record components: ", record_components()); st->print(BULLET"permitted subclasses: "); permitted_subclasses()->print_value_on(st); st->cr(); if (java_mirror() != nullptr) { st->print(BULLET"java mirror: "); diff --git a/src/hotspot/share/oops/metadata.hpp b/src/hotspot/share/oops/metadata.hpp index c118ade8586e1..f5aee34c80da7 100644 --- a/src/hotspot/share/oops/metadata.hpp +++ b/src/hotspot/share/oops/metadata.hpp @@ -76,4 +76,13 @@ class Metadata : public MetaspaceObj { static void mark_on_stack(Metadata* m) { m->set_on_stack(true); } }; +template <typename M> +static void print_on_maybe_null(outputStream* st, const char* str, const M* m) { + if (nullptr != m) { + st->print_raw(str); + m->print_value_on(st); + st->cr(); + } +} + #endif // SHARE_OOPS_METADATA_HPP From f3b69da55a1ec4857fff1537a80ab1fefee93dac Mon Sep 17 00:00:00 2001 From: Evemose <124714317+Evemose@users.noreply.github.com> Date: Thu, 27 Jun 2024 07:45:18 +0000 Subject: [PATCH 211/471] 8335136: Underscore as parameter name in one-parameter functional types fails to compile Reviewed-by: jlahoda --- .../sun/tools/javac/parser/JavacParser.java | 2 +- .../ExpressionSwitchUnderscoreAfterYield.java | 136 ++++++++++++++++++ 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 test/langtools/tools/javac/switchexpr/ExpressionSwitchUnderscoreAfterYield.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index ce484e14b0553..ef2d71831dc59 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -2920,7 +2920,7 @@ List<JCStatement> blockStatement() { case PLUS: case SUB: case STRINGLITERAL: case CHARLITERAL: case STRINGFRAGMENT: case INTLITERAL: case LONGLITERAL: case FLOATLITERAL: case DOUBLELITERAL: - case NULL: case IDENTIFIER: case TRUE: case FALSE: + case NULL: case IDENTIFIER: case UNDERSCORE: case TRUE: case FALSE: case NEW: case SWITCH: case THIS: case SUPER: case BYTE, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE, VOID, BOOLEAN: isYieldStatement = true; diff --git a/test/langtools/tools/javac/switchexpr/ExpressionSwitchUnderscoreAfterYield.java b/test/langtools/tools/javac/switchexpr/ExpressionSwitchUnderscoreAfterYield.java new file mode 100644 index 0000000000000..14f609cc71e1b --- /dev/null +++ b/test/langtools/tools/javac/switchexpr/ExpressionSwitchUnderscoreAfterYield.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8335136 + * @summary Underscore as parameter name in one-parameter functional types fails to compile in yield statement if not enclosed in parentheses + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @build toolbox.JavacTask toolbox.ToolBox toolbox.Task + * @run main ExpressionSwitchUnderscoreAfterYield + */ + +import toolbox.*; + +import java.nio.file.Path; +import java.util.List; + +public class ExpressionSwitchUnderscoreAfterYield extends TestRunner { + + private final ToolBox tb = new ToolBox(); + + private final Path ROOT = Path.of("."); + + public ExpressionSwitchUnderscoreAfterYield() { + super(System.err); + } + + public static void main(String[] args) throws Exception { + new ExpressionSwitchUnderscoreAfterYield().runTests(); + } + + protected void runTests() throws Exception { + runTests(f -> { + if (f.getName().endsWith("_ShouldFailToCompile")) { + return new Object[]{ + List.of( + FailParams.UNDERSCORE_YIELDED, + FailParams.ASSIGNMENT_TO_UNDERSCORE_IN_YIELD + ) + }; + } + return new Object[0]; + }); + } + + @Test + public void testUnderscoreAsParameterNameInLambda_ShouldCompileFine() throws Exception { + var code = """ + import java.util.function.*; + \s + public class Test { + public static void main(String[] args) { + Consumer<Object> result = switch (1) { + case 1 -> { + yield _ -> {}; + } + default -> null; + }; + } + } + """; + tb.writeJavaFiles(ROOT, code); + new toolbox.JavacTask(tb) + .files(tb.findJavaFiles(ROOT)) + .run(Task.Expect.SUCCESS); + } + + public record FailParams(String code, List<String> expectedDiagnosticMessage) { + public static FailParams UNDERSCORE_YIELDED = new FailParams( + """ + public class Test { + public static void main(String[] args) { + Object result = switch (1) { + case 1 -> { + yield _; + } + default -> null; + }; + } + } + """, + List.of("Test.java:5:23: compiler.err.use.of.underscore.not.allowed.non.variable", "1 error") + ); + + public static FailParams ASSIGNMENT_TO_UNDERSCORE_IN_YIELD = new FailParams( + """ + public class Test { + public static void main(String[] args) { + Object result = switch (1) { + case 1 -> { + yield _ = 1; + } + default -> null; + }; + } + } + """, + List.of("Test.java:5:23: compiler.err.use.of.underscore.not.allowed.non.variable", "1 error") + ); + } + + @Test + public void testUnderscoreAsParameterNameInLambda_ShouldFailToCompile(List<FailParams> params) throws Exception { + for (var param : params) { + tb.writeJavaFiles(ROOT, param.code); + Task.Result result = new JavacTask(tb) + .options("-XDrawDiagnostics") + .files(tb.findJavaFiles(ROOT)) + .run(Task.Expect.FAIL); + tb.checkEqual(param.expectedDiagnosticMessage, result.getOutputLines(Task.OutputKind.DIRECT)); + } + } + +} From 37e7698c29b8673b904945d397f0698ccd16d27b Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Thu, 27 Jun 2024 07:54:35 +0000 Subject: [PATCH 212/471] 8335154: jcmd VM.classes -verbose=false does not set verbose to false Reviewed-by: dholmes, stuefe --- src/hotspot/share/services/diagnosticCommand.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/services/diagnosticCommand.cpp b/src/hotspot/share/services/diagnosticCommand.cpp index faabe74a2ff0b..4b8eae8a4138e 100644 --- a/src/hotspot/share/services/diagnosticCommand.cpp +++ b/src/hotspot/share/services/diagnosticCommand.cpp @@ -992,7 +992,7 @@ class VM_PrintClasses : public VM_Operation { }; void ClassesDCmd::execute(DCmdSource source, TRAPS) { - VM_PrintClasses vmop(output(), _verbose.is_set()); + VM_PrintClasses vmop(output(), _verbose.value()); VMThread::execute(&vmop); } From 79a23017fc7154738c375fbb12a997525c3bf9e7 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Thu, 27 Jun 2024 10:23:55 +0000 Subject: [PATCH 213/471] 8322859: Parallel: Move transform_stack_chunk Reviewed-by: stefank, tschatzl --- src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp index f01d1a852997c..390dea4976d19 100644 --- a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp +++ b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp @@ -249,10 +249,6 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o, // Copy obj Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(o), cast_from_oop<HeapWord*>(new_obj), new_obj_size); - // Parallel GC claims with a release - so other threads might access this object - // after claiming and they should see the "completed" object. - ContinuationGCSupport::transform_stack_chunk(new_obj); - // Now we have to CAS in the header. // Because the forwarding is done with memory_order_relaxed there is no // ordering with the above copy. Clients that get the forwardee must not @@ -271,6 +267,8 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o, assert(young_space()->contains(new_obj), "Attempt to push non-promoted obj"); } + ContinuationGCSupport::transform_stack_chunk(new_obj); + // Do the size comparison first with new_obj_size, which we // already have. Hopefully, only a few objects are larger than // _min_array_size_for_chunking, and most of them will be arrays. From 50dd962b0d0fe36634d96dbbd9d94fbc34d9ff7f Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Thu, 27 Jun 2024 12:56:26 +0000 Subject: [PATCH 214/471] 8335007: Inline OopMapCache table Reviewed-by: stefank, coleenp, shade --- src/hotspot/share/interpreter/oopMapCache.cpp | 20 ++++++++----------- src/hotspot/share/interpreter/oopMapCache.hpp | 9 ++++----- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/hotspot/share/interpreter/oopMapCache.cpp b/src/hotspot/share/interpreter/oopMapCache.cpp index 7b60e4869e368..a10f8c439eaa4 100644 --- a/src/hotspot/share/interpreter/oopMapCache.cpp +++ b/src/hotspot/share/interpreter/oopMapCache.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -445,29 +445,25 @@ inline unsigned int OopMapCache::hash_value_for(const methodHandle& method, int OopMapCacheEntry* volatile OopMapCache::_old_entries = nullptr; OopMapCache::OopMapCache() { - _array = NEW_C_HEAP_ARRAY(OopMapCacheEntry*, _size, mtClass); - for(int i = 0; i < _size; i++) _array[i] = nullptr; + for(int i = 0; i < size; i++) _array[i] = nullptr; } OopMapCache::~OopMapCache() { - assert(_array != nullptr, "sanity check"); // Deallocate oop maps that are allocated out-of-line flush(); - // Deallocate array - FREE_C_HEAP_ARRAY(OopMapCacheEntry*, _array); } OopMapCacheEntry* OopMapCache::entry_at(int i) const { - return Atomic::load_acquire(&(_array[i % _size])); + return Atomic::load_acquire(&(_array[i % size])); } bool OopMapCache::put_at(int i, OopMapCacheEntry* entry, OopMapCacheEntry* old) { - return Atomic::cmpxchg(&_array[i % _size], old, entry) == old; + return Atomic::cmpxchg(&_array[i % size], old, entry) == old; } void OopMapCache::flush() { - for (int i = 0; i < _size; i++) { + for (int i = 0; i < size; i++) { OopMapCacheEntry* entry = _array[i]; if (entry != nullptr) { _array[i] = nullptr; // no barrier, only called in OopMapCache destructor @@ -478,7 +474,7 @@ void OopMapCache::flush() { void OopMapCache::flush_obsolete_entries() { assert(SafepointSynchronize::is_at_safepoint(), "called by RedefineClasses in a safepoint"); - for (int i = 0; i < _size; i++) { + for (int i = 0; i < size; i++) { OopMapCacheEntry* entry = _array[i]; if (entry != nullptr && !entry->is_empty() && entry->method()->is_old()) { // Cache entry is occupied by an old redefined method and we don't want @@ -513,7 +509,7 @@ void OopMapCache::lookup(const methodHandle& method, // Need a critical section to avoid race against concurrent reclamation. { GlobalCounter::CriticalSection cs(Thread::current()); - for (int i = 0; i < _probe_depth; i++) { + for (int i = 0; i < probe_depth; i++) { OopMapCacheEntry *entry = entry_at(probe + i); if (entry != nullptr && !entry->is_empty() && entry->match(method, bci)) { entry_for->resource_copy(entry); @@ -542,7 +538,7 @@ void OopMapCache::lookup(const methodHandle& method, } // First search for an empty slot - for (int i = 0; i < _probe_depth; i++) { + for (int i = 0; i < probe_depth; i++) { OopMapCacheEntry* entry = entry_at(probe + i); if (entry == nullptr) { if (put_at(probe + i, tmp, nullptr)) { diff --git a/src/hotspot/share/interpreter/oopMapCache.hpp b/src/hotspot/share/interpreter/oopMapCache.hpp index 46c85f6e87985..a3f5c395f589a 100644 --- a/src/hotspot/share/interpreter/oopMapCache.hpp +++ b/src/hotspot/share/interpreter/oopMapCache.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -152,11 +152,10 @@ class InterpreterOopMap: ResourceObj { class OopMapCache : public CHeapObj<mtClass> { static OopMapCacheEntry* volatile _old_entries; private: - enum { _size = 32, // Use fixed size for now - _probe_depth = 3 // probe depth in case of collisions - }; + static constexpr int size = 32; // Use fixed size for now + static constexpr int probe_depth = 3; // probe depth in case of collisions - OopMapCacheEntry* volatile * _array; + OopMapCacheEntry* volatile _array[size]; unsigned int hash_value_for(const methodHandle& method, int bci) const; OopMapCacheEntry* entry_at(int i) const; From 6b961acb87c29027f2158c6b7a764f1276a0bf52 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Thu, 27 Jun 2024 13:03:21 +0000 Subject: [PATCH 215/471] 8333786: Serial: Remove SerialHeap::_incremental_collection_failed Reviewed-by: tschatzl, iwalulya --- .../share/gc/serial/defNewGeneration.cpp | 86 +------------------ .../share/gc/serial/defNewGeneration.hpp | 1 - src/hotspot/share/gc/serial/serialHeap.cpp | 4 +- src/hotspot/share/gc/serial/serialHeap.hpp | 29 ------- 4 files changed, 2 insertions(+), 118 deletions(-) diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index be104dce571b9..b66681170c63c 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -578,33 +578,6 @@ HeapWord* DefNewGeneration::block_start(const void* p) const { return block_start_const(to(), p); } -// The last collection bailed out, we are running out of heap space, -// so we try to allocate the from-space, too. -HeapWord* DefNewGeneration::allocate_from_space(size_t size) { - bool should_try_alloc = should_allocate_from_space() || GCLocker::is_active_and_needs_gc(); - - // If the Heap_lock is not locked by this thread, this will be called - // again later with the Heap_lock held. - bool do_alloc = should_try_alloc && (Heap_lock->owned_by_self() || (SafepointSynchronize::is_at_safepoint() && Thread::current()->is_VM_thread())); - - HeapWord* result = nullptr; - if (do_alloc) { - result = from()->allocate(size); - } - - log_trace(gc, alloc)("DefNewGeneration::allocate_from_space(" SIZE_FORMAT "): will_fail: %s heap_lock: %s free: " SIZE_FORMAT "%s%s returns %s", - size, - SerialHeap::heap()->incremental_collection_will_fail(false /* don't consult_young */) ? - "true" : "false", - Heap_lock->is_locked() ? "locked" : "unlocked", - from()->free(), - should_try_alloc ? "" : " should_allocate_from_space: NOT", - do_alloc ? " Heap_lock is not owned by self" : "", - result == nullptr ? "null" : "object"); - - return result; -} - HeapWord* DefNewGeneration::expand_and_allocate(size_t size, bool is_tlab) { // We don't attempt to expand the young generation (but perhaps we should.) return allocate(size, is_tlab); @@ -707,21 +680,12 @@ bool DefNewGeneration::collect(bool clear_all_soft_refs) { assert(to()->is_empty(), "to space should be empty now"); adjust_desired_tenuring_threshold(); - - assert(!heap->incremental_collection_failed(), "Should be clear"); } else { assert(_promo_failure_scan_stack.is_empty(), "post condition"); _promo_failure_scan_stack.clear(true); // Clear cached segments. remove_forwarding_pointers(); log_info(gc, promotion)("Promotion failed"); - // Add to-space to the list of space to compact - // when a promotion failure has occurred. In that - // case there can be live objects in to-space - // as a result of a partial evacuation of eden - // and from-space. - swap_spaces(); // For uniformity wrt ParNewGeneration. - heap->set_incremental_collection_failed(); _gc_tracer->report_promotion_failed(_promotion_failed_info); @@ -883,51 +847,10 @@ bool DefNewGeneration::collection_attempt_is_safe() { } void DefNewGeneration::gc_epilogue(bool full) { - DEBUG_ONLY(static bool seen_incremental_collection_failed = false;) - assert(!GCLocker::is_active(), "We should not be executing here"); - // Check if the heap is approaching full after a collection has - // been done. Generally the young generation is empty at - // a minimum at the end of a collection. If it is not, then - // the heap is approaching full. - SerialHeap* gch = SerialHeap::heap(); - if (full) { - DEBUG_ONLY(seen_incremental_collection_failed = false;) - if (!collection_attempt_is_safe() && !_eden_space->is_empty()) { - log_trace(gc)("DefNewEpilogue: cause(%s), full, not safe, set_failed, set_alloc_from, clear_seen", - GCCause::to_string(gch->gc_cause())); - gch->set_incremental_collection_failed(); // Slight lie: a full gc left us in that state - set_should_allocate_from_space(); // we seem to be running out of space - } else { - log_trace(gc)("DefNewEpilogue: cause(%s), full, safe, clear_failed, clear_alloc_from, clear_seen", - GCCause::to_string(gch->gc_cause())); - gch->clear_incremental_collection_failed(); // We just did a full collection - clear_should_allocate_from_space(); // if set - } - } else { -#ifdef ASSERT - // It is possible that incremental_collection_failed() == true - // here, because an attempted scavenge did not succeed. The policy - // is normally expected to cause a full collection which should - // clear that condition, so we should not be here twice in a row - // with incremental_collection_failed() == true without having done - // a full collection in between. - if (!seen_incremental_collection_failed && - gch->incremental_collection_failed()) { - log_trace(gc)("DefNewEpilogue: cause(%s), not full, not_seen_failed, failed, set_seen_failed", - GCCause::to_string(gch->gc_cause())); - seen_incremental_collection_failed = true; - } else if (seen_incremental_collection_failed) { - log_trace(gc)("DefNewEpilogue: cause(%s), not full, seen_failed, will_clear_seen_failed", - GCCause::to_string(gch->gc_cause())); - seen_incremental_collection_failed = false; - } -#endif // ASSERT - } - // update the generation and space performance counters update_counters(); - gch->counters()->update_counters(); + SerialHeap::heap()->counters()->update_counters(); } void DefNewGeneration::update_counters() { @@ -967,13 +890,6 @@ HeapWord* DefNewGeneration::allocate(size_t word_size, bool is_tlab) { // Note that since DefNewGeneration supports lock-free allocation, we // have to use it here, as well. HeapWord* result = eden()->par_allocate(word_size); - if (result == nullptr) { - // If the eden is full and the last collection bailed out, we are running - // out of heap space, and we try to allocate the from-space, too. - // allocate_from_space can't be inlined because that would introduce a - // circular dependency at compile time. - result = allocate_from_space(word_size); - } return result; } diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp index baf565e28629b..0cf2545421f72 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.hpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp @@ -225,7 +225,6 @@ class DefNewGeneration: public Generation { } HeapWord* allocate(size_t word_size, bool is_tlab); - HeapWord* allocate_from_space(size_t word_size); HeapWord* par_allocate(size_t word_size, bool is_tlab); diff --git a/src/hotspot/share/gc/serial/serialHeap.cpp b/src/hotspot/share/gc/serial/serialHeap.cpp index 8dd8a9c0e6766..c1fdc1eba1a32 100644 --- a/src/hotspot/share/gc/serial/serialHeap.cpp +++ b/src/hotspot/share/gc/serial/serialHeap.cpp @@ -92,7 +92,6 @@ SerialHeap::SerialHeap() : _old_gen(nullptr), _rem_set(nullptr), _gc_policy_counters(new GCPolicyCounters("Copy:MSC", 2, 2)), - _incremental_collection_failed(false), _young_manager(nullptr), _old_manager(nullptr), _eden_pool(nullptr), @@ -287,8 +286,7 @@ size_t SerialHeap::max_capacity() const { bool SerialHeap::should_try_older_generation_allocation(size_t word_size) const { size_t young_capacity = _young_gen->capacity_before_gc(); return (word_size > heap_word_size(young_capacity)) - || GCLocker::is_active_and_needs_gc() - || incremental_collection_failed(); + || GCLocker::is_active_and_needs_gc(); } HeapWord* SerialHeap::expand_heap_and_allocate(size_t size, bool is_tlab) { diff --git a/src/hotspot/share/gc/serial/serialHeap.hpp b/src/hotspot/share/gc/serial/serialHeap.hpp index 0817c6e9eb37d..14e0d737c1a4e 100644 --- a/src/hotspot/share/gc/serial/serialHeap.hpp +++ b/src/hotspot/share/gc/serial/serialHeap.hpp @@ -91,11 +91,6 @@ class SerialHeap : public CollectedHeap { GCPolicyCounters* _gc_policy_counters; - // Indicates that the most recent previous incremental collection failed. - // The flag is cleared when an action is taken that might clear the - // condition that caused that incremental collection to fail. - bool _incremental_collection_failed; - bool do_young_collection(bool clear_soft_refs); // Reserve aligned space for the heap as needed by the contained generations. @@ -255,29 +250,6 @@ class SerialHeap : public CollectedHeap { // in other generations, it should call this method. void save_marks(); - // Returns true if an incremental collection is likely to fail. - // We optionally consult the young gen, if asked to do so; - // otherwise we base our answer on whether the previous incremental - // collection attempt failed with no corrective action as of yet. - bool incremental_collection_will_fail(bool consult_young) { - // The first disjunct remembers if an incremental collection failed, even - // when we thought (second disjunct) that it would not. - return incremental_collection_failed() || - (consult_young && !_young_gen->collection_attempt_is_safe()); - } - - // If a generation bails out of an incremental collection, - // it sets this flag. - bool incremental_collection_failed() const { - return _incremental_collection_failed; - } - void set_incremental_collection_failed() { - _incremental_collection_failed = true; - } - void clear_incremental_collection_failed() { - _incremental_collection_failed = false; - } - private: // Return true if an allocation should be attempted in the older generation // if it fails in the younger generation. Return false, otherwise. @@ -289,7 +261,6 @@ class SerialHeap : public CollectedHeap { HeapWord* mem_allocate_work(size_t size, bool is_tlab); -private: MemoryPool* _eden_pool; MemoryPool* _survivor_pool; MemoryPool* _old_pool; From d5375c7db658de491c1f5bad053040d21b82941e Mon Sep 17 00:00:00 2001 From: Sonia Zaldana Calles <szaldana@openjdk.org> Date: Thu, 27 Jun 2024 13:22:04 +0000 Subject: [PATCH 216/471] 8333308: javap --system handling doesn't work on internal class names Reviewed-by: liach, stuefe --- src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java b/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java index d8fa59c2dd0e7..b797ef73522c2 100644 --- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java @@ -867,7 +867,7 @@ private JavaFileObject getClassFileObject(String className) throws IOException { if (moduleLocation != null) { fo = fileManager.getJavaFileForInput(moduleLocation, className, JavaFileObject.Kind.CLASS); } else { - if (className.indexOf('.') > 0) { + if (className.indexOf('.') > 0 || className.indexOf('/') > 0) { //search for classes with a named package in the JDK modules specifed by --system option first try { for (Set<Location> locations: fileManager.listLocationsForModules(StandardLocation.SYSTEM_MODULES)) { From 5909d54147355dd7da5786ff39ead4c15816705c Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas <aboldtch@openjdk.org> Date: Thu, 27 Jun 2024 14:21:34 +0000 Subject: [PATCH 217/471] 8326820: Metadata artificially kept alive Reviewed-by: eosterlund, stefank, coleenp --- .../share/classfile/classLoaderDataGraph.cpp | 83 ++++++++++--------- .../share/classfile/classLoaderDataGraph.hpp | 13 ++- .../share/classfile/classLoaderStats.cpp | 2 +- .../share/classfile/systemDictionary.hpp | 2 +- src/hotspot/share/prims/jvmtiEnvBase.cpp | 2 +- .../share/prims/jvmtiGetLoadedClasses.cpp | 2 +- 6 files changed, 55 insertions(+), 49 deletions(-) diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp index 2046286651eae..adec6dbdeeeaa 100644 --- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp +++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp @@ -241,9 +241,14 @@ LockedClassesDo::~LockedClassesDo() { // Iterating over the CLDG needs to be locked because -// unloading can remove entries concurrently soon. -template <bool keep_alive = true> -class ClassLoaderDataGraphIteratorBase : public StackObj { +// unloading can remove entries concurrently. +// This iterator does not keep the CLD alive. +// Any CLD OopHandles (modules, mirrors, resolved refs) +// resolved must be treated as no keepalive. And requires +// that its CLD's holder is kept alive if they escape the +// caller's safepoint or ClassLoaderDataGraph_lock +// critical section. +class ClassLoaderDataGraph::ClassLoaderDataGraphIterator : public StackObj { ClassLoaderData* _next; Thread* _thread; HandleMark _hm; // clean up handles when this is done. @@ -251,12 +256,8 @@ class ClassLoaderDataGraphIteratorBase : public StackObj { // unless verifying at a safepoint. public: - ClassLoaderDataGraphIteratorBase() : _next(ClassLoaderDataGraph::_head), _thread(Thread::current()), _hm(_thread) { - if (keep_alive) { - assert_locked_or_safepoint(ClassLoaderDataGraph_lock); - } else { - assert_at_safepoint(); - } + ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head), _thread(Thread::current()), _hm(_thread) { + assert_locked_or_safepoint(ClassLoaderDataGraph_lock); } ClassLoaderData* get_next() { @@ -266,10 +267,6 @@ class ClassLoaderDataGraphIteratorBase : public StackObj { cld = cld->next(); } if (cld != nullptr) { - if (keep_alive) { - // Keep cld that is being returned alive. - Handle(_thread, cld->holder()); - } _next = cld->next(); } else { _next = nullptr; @@ -278,9 +275,6 @@ class ClassLoaderDataGraphIteratorBase : public StackObj { } }; -using ClassLoaderDataGraphIterator = ClassLoaderDataGraphIteratorBase<true /* keep_alive */>; -using ClassLoaderDataGraphIteratorNoKeepAlive = ClassLoaderDataGraphIteratorBase<false /* keep_alive */>; - void ClassLoaderDataGraph::loaded_cld_do(CLDClosure* cl) { ClassLoaderDataGraphIterator iter; while (ClassLoaderData* cld = iter.get_next()) { @@ -288,13 +282,6 @@ void ClassLoaderDataGraph::loaded_cld_do(CLDClosure* cl) { } } -void ClassLoaderDataGraph::loaded_cld_do_no_keepalive(CLDClosure* cl) { - ClassLoaderDataGraphIteratorNoKeepAlive iter; - while (ClassLoaderData* cld = iter.get_next()) { - cl->do_cld(cld); - } -} - // These functions assume that the caller has locked the ClassLoaderDataGraph_lock // if they are not calling the function from a safepoint. void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) { @@ -318,6 +305,16 @@ void ClassLoaderDataGraph::methods_do(void f(Method*)) { } } +void ClassLoaderDataGraph::modules_do_keepalive(void f(ModuleEntry*)) { + assert_locked_or_safepoint(Module_lock); + ClassLoaderDataGraphIterator iter; + while (ClassLoaderData* cld = iter.get_next()) { + // Keep the holder alive. + (void)cld->holder(); + cld->modules_do(f); + } +} + void ClassLoaderDataGraph::modules_do(void f(ModuleEntry*)) { assert_locked_or_safepoint(Module_lock); ClassLoaderDataGraphIterator iter; @@ -334,9 +331,11 @@ void ClassLoaderDataGraph::packages_do(void f(PackageEntry*)) { } } -void ClassLoaderDataGraph::loaded_classes_do(KlassClosure* klass_closure) { +void ClassLoaderDataGraph::loaded_classes_do_keepalive(KlassClosure* klass_closure) { ClassLoaderDataGraphIterator iter; while (ClassLoaderData* cld = iter.get_next()) { + // Keep the holder alive. + (void)cld->holder(); cld->loaded_classes_do(klass_closure); } } @@ -346,7 +345,7 @@ void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) { } void ClassLoaderDataGraph::verify_dictionary() { - ClassLoaderDataGraphIteratorNoKeepAlive iter; + ClassLoaderDataGraphIterator iter; while (ClassLoaderData* cld = iter.get_next()) { if (cld->dictionary() != nullptr) { cld->dictionary()->verify(); @@ -354,26 +353,28 @@ void ClassLoaderDataGraph::verify_dictionary() { } } -#define FOR_ALL_DICTIONARY(X) ClassLoaderDataGraphIterator iter; \ - while (ClassLoaderData* X = iter.get_next()) \ - if (X->dictionary() != nullptr) - void ClassLoaderDataGraph::print_dictionary(outputStream* st) { - FOR_ALL_DICTIONARY(cld) { - st->print("Dictionary for "); - cld->print_value_on(st); - st->cr(); - cld->dictionary()->print_on(st); - st->cr(); + ClassLoaderDataGraphIterator iter; + while (ClassLoaderData *cld = iter.get_next()) { + if (cld->dictionary() != nullptr) { + st->print("Dictionary for "); + cld->print_value_on(st); + st->cr(); + cld->dictionary()->print_on(st); + st->cr(); + } } } void ClassLoaderDataGraph::print_table_statistics(outputStream* st) { - FOR_ALL_DICTIONARY(cld) { - ResourceMark rm; // loader_name_and_id - stringStream tempst; - tempst.print("System Dictionary for %s class loader", cld->loader_name_and_id()); - cld->dictionary()->print_table_statistics(st, tempst.freeze()); + ClassLoaderDataGraphIterator iter; + while (ClassLoaderData *cld = iter.get_next()) { + if (cld->dictionary() != nullptr) { + ResourceMark rm; // loader_name_and_id + stringStream tempst; + tempst.print("System Dictionary for %s class loader", cld->loader_name_and_id()); + cld->dictionary()->print_table_statistics(st, tempst.freeze()); + } } } @@ -550,7 +551,7 @@ Klass* ClassLoaderDataGraphKlassIteratorAtomic::next_klass() { } void ClassLoaderDataGraph::verify() { - ClassLoaderDataGraphIteratorNoKeepAlive iter; + ClassLoaderDataGraphIterator iter; while (ClassLoaderData* cld = iter.get_next()) { cld->verify(); } diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.hpp b/src/hotspot/share/classfile/classLoaderDataGraph.hpp index 3de2c10850e1a..a79c6e21089e5 100644 --- a/src/hotspot/share/classfile/classLoaderDataGraph.hpp +++ b/src/hotspot/share/classfile/classLoaderDataGraph.hpp @@ -37,10 +37,10 @@ class ClassLoaderDataGraph : public AllStatic { friend class ClassLoaderDataGraphMetaspaceIterator; friend class ClassLoaderDataGraphKlassIteratorAtomic; friend class ClassLoaderDataGraphKlassIteratorStatic; - template <bool keep_alive> - friend class ClassLoaderDataGraphIteratorBase; friend class VMStructs; private: + class ClassLoaderDataGraphIterator; + // All CLDs (except unlinked CLDs) can be reached by walking _head->_next->... static ClassLoaderData* volatile _head; @@ -71,8 +71,12 @@ class ClassLoaderDataGraph : public AllStatic { static void roots_cld_do(CLDClosure* strong, CLDClosure* weak); static void always_strong_cld_do(CLDClosure* cl); // Iteration through CLDG not by GC. + // All the do suffixed functions do not keep the CLD alive. Any CLD OopHandles + // (modules, mirrors, resolved refs) resolved must be treated as no keepalive. + // And requires that its CLD's holder is kept alive if they escape the + // caller's safepoint or ClassLoaderDataGraph_lock critical section. + // The do_keepalive suffixed functions will keep all CLDs alive. static void loaded_cld_do(CLDClosure* cl); - static void loaded_cld_do_no_keepalive(CLDClosure* cl); // klass do // Walking classes through the ClassLoaderDataGraph include array classes. It also includes // classes that are allocated but not loaded, classes that have errors, and scratch classes @@ -81,9 +85,10 @@ class ClassLoaderDataGraph : public AllStatic { static void classes_do(KlassClosure* klass_closure); static void classes_do(void f(Klass* const)); static void methods_do(void f(Method*)); + static void modules_do_keepalive(void f(ModuleEntry*)); static void modules_do(void f(ModuleEntry*)); static void packages_do(void f(PackageEntry*)); - static void loaded_classes_do(KlassClosure* klass_closure); + static void loaded_classes_do_keepalive(KlassClosure* klass_closure); static void classes_unloading_do(void f(Klass* const)); static bool do_unloading(); diff --git a/src/hotspot/share/classfile/classLoaderStats.cpp b/src/hotspot/share/classfile/classLoaderStats.cpp index f09d99681375c..6bb49c3a85377 100644 --- a/src/hotspot/share/classfile/classLoaderStats.cpp +++ b/src/hotspot/share/classfile/classLoaderStats.cpp @@ -165,7 +165,7 @@ void ClassLoaderStatsClosure::addEmptyParents(oop cl) { void ClassLoaderStatsVMOperation::doit() { ClassLoaderStatsClosure clsc (_out); - ClassLoaderDataGraph::loaded_cld_do_no_keepalive(&clsc); + ClassLoaderDataGraph::loaded_cld_do(&clsc); clsc.print(); } diff --git a/src/hotspot/share/classfile/systemDictionary.hpp b/src/hotspot/share/classfile/systemDictionary.hpp index 9f65cb593d39a..6355de9c4ceb5 100644 --- a/src/hotspot/share/classfile/systemDictionary.hpp +++ b/src/hotspot/share/classfile/systemDictionary.hpp @@ -177,7 +177,7 @@ class SystemDictionary : AllStatic { static void classes_do(MetaspaceClosure* it); // Iterate over all methods in all klasses - + // Will not keep metadata alive. See ClassLoaderDataGraph::methods_do. static void methods_do(void f(Method*)); // Garbage collection support diff --git a/src/hotspot/share/prims/jvmtiEnvBase.cpp b/src/hotspot/share/prims/jvmtiEnvBase.cpp index dc02e8e5cf0ee..1a6aec4e438f6 100644 --- a/src/hotspot/share/prims/jvmtiEnvBase.cpp +++ b/src/hotspot/share/prims/jvmtiEnvBase.cpp @@ -2339,7 +2339,7 @@ JvmtiModuleClosure::get_all_modules(JvmtiEnv* env, jint* module_count_ptr, jobje } // Iterate over all the modules loaded to the system. - ClassLoaderDataGraph::modules_do(&do_module); + ClassLoaderDataGraph::modules_do_keepalive(&do_module); jint len = _tbl->length(); guarantee(len > 0, "at least one module must be present"); diff --git a/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp b/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp index 8d6a0736afeb9..c2e970bae7310 100644 --- a/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp +++ b/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp @@ -105,7 +105,7 @@ JvmtiGetLoadedClasses::getLoadedClasses(JvmtiEnv *env, jint* classCountPtr, jcla // Iterate through all classes in ClassLoaderDataGraph // and collect them using the LoadedClassesClosure MutexLocker mcld(ClassLoaderDataGraph_lock); - ClassLoaderDataGraph::loaded_classes_do(&closure); + ClassLoaderDataGraph::loaded_classes_do_keepalive(&closure); } return closure.get_result(env, classCountPtr, classesPtr); From 4ab7e98c79a1a0b7aba1ca74a8316820c906e70e Mon Sep 17 00:00:00 2001 From: Francisco Ferrari Bihurriet <fferrari@openjdk.org> Date: Thu, 27 Jun 2024 15:07:00 +0000 Subject: [PATCH 218/471] 8330842: Support AES CBC with Ciphertext Stealing (CTS) in SunPKCS11 Co-authored-by: Francisco Ferrari Bihurriet <fferrari@openjdk.org> Co-authored-by: Martin Balao <mbalao@openjdk.org> Reviewed-by: valeriep --- .../classes/sun/security/pkcs11/Config.java | 22 ++ .../sun/security/pkcs11/P11Cipher.java | 318 +++++++++++++++--- .../sun/security/pkcs11/SunPKCS11.java | 17 +- .../classes/sun/security/pkcs11/Token.java | 19 +- .../TestCipherTextStealingMultipart.java | 255 ++++++++++++++ .../pkcs11/Cipher/TestSymmCiphers.java | 41 +-- .../pkcs11/Cipher/TestSymmCiphersNoPad.java | 17 +- 7 files changed, 597 insertions(+), 92 deletions(-) create mode 100644 test/jdk/sun/security/pkcs11/Cipher/TestCipherTextStealingMultipart.java diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Config.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Config.java index 20726bb8d4721..18ccda542a002 100644 --- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Config.java +++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Config.java @@ -164,6 +164,11 @@ public List<String> run() { // Secmod.Module.getProvider() method. private String functionList = null; + // CTS mode variant used by the token, as described in Addendum to NIST + // Special Publication 800-38A, "Recommendation for Block Cipher Modes + // of Operation: Three Variants of Ciphertext Stealing for CBC Mode". + private Token.CTSVariant ctsVariant = null; + // whether to use NSS secmod mode. Implicitly set if nssLibraryDirectory, // nssSecmodDirectory, or nssModule is specified. private boolean nssUseSecmod; @@ -321,6 +326,10 @@ String getFunctionList() { return functionList; } + Token.CTSVariant getCTSVariant() { + return ctsVariant; + } + boolean getNssUseSecmod() { return nssUseSecmod; } @@ -472,6 +481,8 @@ private void parse() throws IOException { allowSingleThreadedModules = parseBooleanEntry(st.sval); case "functionList"-> functionList = parseStringEntry(st.sval); + case "cipherTextStealingVariant"-> + ctsVariant = parseEnumEntry(Token.CTSVariant.class, st.sval); case "nssUseSecmod"-> nssUseSecmod = parseBooleanEntry(st.sval); case "nssLibraryDirectory"-> { @@ -627,6 +638,17 @@ private int parseIntegerEntry(String keyword) throws IOException { return value; } + private <E extends Enum<E>> E parseEnumEntry(Class<E> enumClass, + String keyword) throws IOException { + String value = parseStringEntry(keyword); + try { + return Enum.valueOf(enumClass, value); + } catch (IllegalArgumentException ignored) { + throw excToken(keyword + " must be one of " + + Arrays.toString(enumClass.getEnumConstants()) + ", read:"); + } + } + private boolean parseBoolean() throws IOException { String val = parseWord(); return switch (val) { diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java index c65c2185a3eea..faf1aa9237f26 100644 --- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java +++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,7 @@ * Cipher implementation class. This class currently supports * DES, DESede, AES, ARCFOUR, and Blowfish. * - * This class is designed to support ECB, CBC, CTR with NoPadding + * This class is designed to support ECB, CBC, CTR, CTS with NoPadding * and ECB, CBC with PKCS5Padding. It will use its own padding impl * if the native mechanism does not support padding. * @@ -60,17 +60,9 @@ final class P11Cipher extends CipherSpi { private static final JavaNioAccess NIO_ACCESS = SharedSecrets.getJavaNioAccess(); - // mode constant for ECB mode - private static final int MODE_ECB = 3; - // mode constant for CBC mode - private static final int MODE_CBC = 4; - // mode constant for CTR mode - private static final int MODE_CTR = 5; - - // padding constant for NoPadding - private static final int PAD_NONE = 5; - // padding constant for PKCS5Padding - private static final int PAD_PKCS5 = 6; + // mode and padding constants + private enum Mode {ECB /* or stream ciphers */, CBC, CTR, CTS} + private enum Pad {NONE, PKCS5} private static interface Padding { // ENC: format the specified buffer with padding bytes and return the @@ -146,14 +138,14 @@ public int unpad(byte[] paddedData, int len) // flag indicating encrypt or decrypt mode private boolean encrypt; - // mode, one of MODE_* above (MODE_ECB for stream ciphers) - private int blockMode; + // mode, Mode.ECB for stream ciphers + private final Mode blockMode; // block size, 0 for stream ciphers private final int blockSize; - // padding type, on of PAD_* above (PAD_NONE for stream ciphers) - private int paddingType; + // padding type, Pad.NONE for stream ciphers + private Pad paddingType; // when the padding is requested but unsupported by the native mechanism, // we use the following to do padding and necessary data buffering. @@ -163,7 +155,7 @@ public int unpad(byte[] paddedData, int len) private byte[] padBuffer; private int padBufferLen; - // original IV, if in MODE_CBC or MODE_CTR + // original IV, if in Mode.CBC, Mode.CTR or Mode.CTS private byte[] iv; // number of bytes buffered internally by the native mechanism and padBuffer @@ -208,8 +200,7 @@ public int unpad(byte[] paddedData, int len) blockSize = 8; } } - this.blockMode = - (algoParts.length > 1 ? parseMode(algoParts[1]) : MODE_ECB); + blockMode = algoParts.length > 1 ? parseMode(algoParts[1]) : Mode.ECB; String defPadding = (blockSize == 0 ? "NoPadding" : "PKCS5Padding"); String paddingStr = (algoParts.length > 2 ? algoParts[2] : defPadding); @@ -227,20 +218,19 @@ protected void engineSetMode(String mode) throws NoSuchAlgorithmException { throw new NoSuchAlgorithmException("Unsupported mode " + mode); } - private int parseMode(String mode) throws NoSuchAlgorithmException { + private Mode parseMode(String mode) throws NoSuchAlgorithmException { mode = mode.toUpperCase(Locale.ENGLISH); - return switch (mode) { - case "ECB" -> MODE_ECB; - case "CBC" -> { - if (blockSize == 0) { - throw new NoSuchAlgorithmException - ("CBC mode not supported with stream ciphers"); - } - yield MODE_CBC; - } - case "CTR" -> MODE_CTR; - default -> throw new NoSuchAlgorithmException("Unsupported mode " + mode); - }; + Mode result; + try { + result = Mode.valueOf(mode); + } catch (IllegalArgumentException ignored) { + throw new NoSuchAlgorithmException("Unsupported mode " + mode); + } + if (blockSize == 0 && result != Mode.ECB) { + throw new NoSuchAlgorithmException( + result + " mode not supported with stream ciphers"); + } + return result; } // see JCE spec @@ -250,13 +240,22 @@ protected void engineSetPadding(String padding) padBuffer = null; padding = padding.toUpperCase(Locale.ENGLISH); if (padding.equals("NOPADDING")) { - paddingType = PAD_NONE; + paddingType = Pad.NONE; + if (blockMode == Mode.CTS) { + // Buffer at least two blocks (where the last one may be + // partial). When using NSS, buffer one more block to avoid + // NSS Bug 1823875: "AES CTS decryption does not update + // its own context's IV on full blocks input" + // https://bugzilla.mozilla.org/show_bug.cgi?id=1823875#c2 + int bufferedBlocks = P11Util.isNSS(token) ? 3 : 2; + padBuffer = new byte[bufferedBlocks * blockSize]; + } } else if (padding.equals("PKCS5PADDING")) { - if (this.blockMode == MODE_CTR) { - throw new NoSuchPaddingException - ("PKCS#5 padding not supported with CTR mode"); + if (blockMode == Mode.CTR || blockMode == Mode.CTS) { + throw new NoSuchPaddingException("PKCS#5 padding not " + + "supported with " + blockMode + " mode"); } - paddingType = PAD_PKCS5; + paddingType = Pad.PKCS5; if (mechanism != CKM_DES_CBC_PAD && mechanism != CKM_DES3_CBC_PAD && mechanism != CKM_AES_CBC_PAD) { // no native padding support; use our own padding impl @@ -371,7 +370,7 @@ private void implInit(int opmode, Key key, byte[] iv, // should never happen; checked by Cipher.init() throw new AssertionError("Unknown mode: " + opmode); }; - if (blockMode == MODE_ECB) { // ECB or stream cipher + if (blockMode == Mode.ECB) { // ECB or stream cipher if (iv != null) { if (blockSize == 0) { throw new InvalidAlgorithmParameterException @@ -381,14 +380,12 @@ private void implInit(int opmode, Key key, byte[] iv, ("IV not used in ECB mode"); } } - } else { // MODE_CBC or MODE_CTR + } else { // Mode.CBC, Mode.CTR or Mode.CTS if (iv == null) { if (!encrypt) { - String exMsg = - (blockMode == MODE_CBC ? - "IV must be specified for decryption in CBC mode" : - "IV must be specified for decryption in CTR mode"); - throw new InvalidAlgorithmParameterException(exMsg); + throw new InvalidAlgorithmParameterException( + "IV must be specified for decryption in " + + blockMode + " mode"); } // generate random IV if (random == null) { @@ -433,6 +430,9 @@ private void reset(boolean doCancel) { session = token.releaseSession(session); bytesBuffered = 0; padBufferLen = 0; + if (padBuffer != null) { + Arrays.fill(padBuffer, (byte) 0); + } } } @@ -487,7 +487,7 @@ private void initialize() throws PKCS11Exception { if (session == null) { session = token.getOpSession(); } - CK_MECHANISM mechParams = (blockMode == MODE_CTR ? + CK_MECHANISM mechParams = (blockMode == Mode.CTR ? new CK_MECHANISM(mechanism, new CK_AES_CTR_PARAMS(iv)) : new CK_MECHANISM(mechanism, iv)); if (encrypt) { @@ -512,7 +512,9 @@ private int updateLength(int inLen) { } int result = inLen + bytesBuffered; - if (blockSize != 0 && blockMode != MODE_CTR) { + if (blockMode == Mode.CTS) { + result -= getCTSMustBeBuffered(result); + } else if (blockSize != 0 && blockMode != Mode.CTR) { // minus the number of bytes in the last incomplete block. result -= (result & (blockSize - 1)); } @@ -526,7 +528,7 @@ private int doFinalLength(int inLen) { } int result = inLen + bytesBuffered; - if (blockSize != 0 && encrypt && paddingType != PAD_NONE) { + if (blockSize != 0 && encrypt && paddingType != Pad.NONE) { // add the number of bytes to make the last block complete. result += (blockSize - (result & (blockSize - 1))); } @@ -604,7 +606,56 @@ private int implUpdate(byte[] in, int inOfs, int inLen, ensureInitialized(); int k = 0; int newPadBufferLen = 0; - if (paddingObj != null && (!encrypt || reqBlockUpdates)) { + if (blockMode == Mode.CTS) { + // decide how to split the total data (totalInLen) between + // the token (dataForP11Update) and padBuffer + // (newPadBufferLen) + int totalInLen = padBufferLen + inLen; + newPadBufferLen = getCTSMustBeBuffered(totalInLen); + int dataForP11Update = totalInLen - newPadBufferLen; + if (dataForP11Update > 0 && padBufferLen > 0) { + // there is data for the token and part of it is in + // padBuffer + int flushFromPadBuffer; + int fillLen = getBytesToCompleteBlock(padBufferLen); + if (dataForP11Update >= padBufferLen + fillLen) { + // flush the whole padBuffer + if (fillLen > 0) { + // complete the last padBuffer block from the + // input + bufferInputBytes(in, inOfs, fillLen); + inOfs += fillLen; + inLen -= fillLen; + } + flushFromPadBuffer = padBufferLen; + } else { + // There is not enough input data available to + // complete the padBuffer to a multiple of block + // size. Flush part of the padBuffer (up to a + // multiple of blockSize) now. Shift the remaining + // padBuffer data and buffer more up to completing + // newPadBufferLen later. + flushFromPadBuffer = dataForP11Update; + } + if (encrypt) { + k = token.p11.C_EncryptUpdate(session.id(), + 0, padBuffer, 0, flushFromPadBuffer, + 0, out, outOfs, outLen); + } else { + k = token.p11.C_DecryptUpdate(session.id(), + 0, padBuffer, 0, flushFromPadBuffer, + 0, out, outOfs, outLen); + } + padBufferLen -= flushFromPadBuffer; + if (padBufferLen > 0) { + // shift remaining data to the padBuffer start + System.arraycopy(padBuffer, flushFromPadBuffer, + padBuffer, 0, padBufferLen); + } + } + newPadBufferLen -= padBufferLen; + inLen -= newPadBufferLen; + } else if (paddingObj != null && (!encrypt || reqBlockUpdates)) { if (padBufferLen != 0) { if (padBufferLen != padBuffer.length) { int bufCapacity = padBuffer.length - padBufferLen; @@ -649,7 +700,8 @@ private int implUpdate(byte[] in, int inOfs, int inLen, } } // update 'padBuffer' if using our own padding impl. - if (paddingObj != null && newPadBufferLen > 0) { + if ((blockMode == Mode.CTS || paddingObj != null) && + newPadBufferLen > 0) { bufferInputBytes(in, inOfs + inLen, newPadBufferLen); } bytesBuffered += (inLen - k); @@ -715,7 +767,56 @@ private int implUpdate(ByteBuffer inBuffer, ByteBuffer outBuffer) int k = 0; int newPadBufferLen = 0; - if (paddingObj != null && (!encrypt || reqBlockUpdates)) { + if (blockMode == Mode.CTS) { + // decide how to split the total data (totalInLen) between + // the token (dataForP11Update) and padBuffer + // (newPadBufferLen) + int totalInLen = padBufferLen + inLen; + newPadBufferLen = getCTSMustBeBuffered(totalInLen); + int dataForP11Update = totalInLen - newPadBufferLen; + if (dataForP11Update > 0 && padBufferLen > 0) { + // there is data for the token and part of it is in + // padBuffer + int flushFromPadBuffer; + int fillLen = getBytesToCompleteBlock(padBufferLen); + if (dataForP11Update >= padBufferLen + fillLen) { + // flush the whole padBuffer + if (fillLen > 0) { + // complete the last padBuffer block from the + // input + bufferInputBytes(inBuffer, fillLen); + inOfs += fillLen; + inLen -= fillLen; + } + flushFromPadBuffer = padBufferLen; + } else { + // There is not enough input data available to + // complete the padBuffer to a multiple of block + // size. Flush part of the padBuffer (up to a + // multiple of blockSize) now. Shift the remaining + // padBuffer data and buffer more up to completing + // newPadBufferLen later. + flushFromPadBuffer = dataForP11Update; + } + if (encrypt) { + k = token.p11.C_EncryptUpdate(session.id(), + 0, padBuffer, 0, flushFromPadBuffer, + outAddr, outArray, outOfs, outLen); + } else { + k = token.p11.C_DecryptUpdate(session.id(), + 0, padBuffer, 0, flushFromPadBuffer, + outAddr, outArray, outOfs, outLen); + } + padBufferLen -= flushFromPadBuffer; + if (padBufferLen > 0) { + // shift remaining data to the padBuffer start + System.arraycopy(padBuffer, flushFromPadBuffer, + padBuffer, 0, padBufferLen); + } + } + newPadBufferLen -= padBufferLen; + inLen -= newPadBufferLen; + } else if (paddingObj != null && (!encrypt || reqBlockUpdates)) { if (padBufferLen != 0) { if (padBufferLen != padBuffer.length) { int bufCapacity = padBuffer.length - padBufferLen; @@ -768,7 +869,8 @@ private int implUpdate(ByteBuffer inBuffer, ByteBuffer outBuffer) } } // update 'padBuffer' if using our own padding impl. - if (paddingObj != null && newPadBufferLen > 0) { + if ((blockMode == Mode.CTS || paddingObj != null) && + newPadBufferLen > 0) { bufferInputBytes(inBuffer, newPadBufferLen); } bytesBuffered += (inLen - k); @@ -830,6 +932,10 @@ private int implDoFinal(byte[] out, int outOfs, int outLen) k += token.p11.C_EncryptUpdate(session.id(), 0, padBuffer, 0, startOff + actualPadLen, 0, out, outOfs + k, outLen - k); + } else if (blockMode == Mode.CTS) { + k = token.p11.C_EncryptUpdate(session.id(), + 0, padBuffer, 0, padBufferLen, + 0, out, outOfs, outLen); } // Some implementations such as the NSS Software Token do not // cancel the operation upon a C_EncryptUpdate failure (as @@ -839,6 +945,9 @@ private int implDoFinal(byte[] out, int outOfs, int outLen) doCancel = false; k += token.p11.C_EncryptFinal(session.id(), 0, out, (outOfs + k), (outLen - k)); + if (blockMode == Mode.CTS) { + convertCTSVariant(null, out, outOfs + k); + } } else { // Special handling to match SunJCE provider behavior if (bytesBuffered == 0 && padBufferLen == 0) { @@ -863,8 +972,16 @@ private int implDoFinal(byte[] out, int outOfs, int outLen) k -= actualPadLen; System.arraycopy(padBuffer, 0, out, outOfs, k); } else { + if (blockMode == Mode.CTS) { + convertCTSVariant(null, padBuffer, padBufferLen); + k = token.p11.C_DecryptUpdate(session.id(), + 0, padBuffer, 0, padBufferLen, + 0, out, outOfs, outLen); + outOfs += k; + outLen -= k; + } doCancel = false; - k = token.p11.C_DecryptFinal(session.id(), 0, out, outOfs, + k += token.p11.C_DecryptFinal(session.id(), 0, out, outOfs, outLen); } } @@ -928,6 +1045,10 @@ private int implDoFinal(ByteBuffer outBuffer) k += token.p11.C_EncryptUpdate(session.id(), 0, padBuffer, 0, startOff + actualPadLen, outAddr, outArray, outOfs + k, outLen - k); + } else if (blockMode == Mode.CTS) { + k = token.p11.C_EncryptUpdate(session.id(), + 0, padBuffer, 0, padBufferLen, + outAddr, outArray, outOfs, outLen); } // Some implementations such as the NSS Software Token do not // cancel the operation upon a C_EncryptUpdate failure (as @@ -937,12 +1058,14 @@ private int implDoFinal(ByteBuffer outBuffer) doCancel = false; k += token.p11.C_EncryptFinal(session.id(), outAddr, outArray, (outOfs + k), (outLen - k)); + if (blockMode == Mode.CTS) { + convertCTSVariant(outBuffer, outArray, outOfs + k); + } } else { // Special handling to match SunJCE provider behavior if (bytesBuffered == 0 && padBufferLen == 0) { return 0; } - if (paddingObj != null) { if (padBufferLen != 0) { k = token.p11.C_DecryptUpdate(session.id(), @@ -964,8 +1087,16 @@ private int implDoFinal(ByteBuffer outBuffer) outArray = padBuffer; outOfs = 0; } else { + if (blockMode == Mode.CTS) { + convertCTSVariant(null, padBuffer, padBufferLen); + k = token.p11.C_DecryptUpdate(session.id(), + 0, padBuffer, 0, padBufferLen, + outAddr, outArray, outOfs, outLen); + outOfs += k; + outLen -= k; + } doCancel = false; - k = token.p11.C_DecryptFinal(session.id(), + k += token.p11.C_DecryptFinal(session.id(), outAddr, outArray, outOfs, outLen); } } @@ -988,6 +1119,83 @@ private int implDoFinal(ByteBuffer outBuffer) } } + private int getBytesToCompleteBlock(int availableBytes) { + int partBlock = availableBytes & (blockSize - 1); + return partBlock == 0 ? 0 : blockSize - partBlock; + } + + private int getCTSMustBeBuffered(int availableBytes) { + return Math.min(availableBytes, + padBuffer.length - getBytesToCompleteBlock(availableBytes)); + } + + /** + * The ciphertext ordering for the three variants can be depicted as + * follows, where 'p' is the penultimate block (which may be partial + * or full), and 'f' the full final block: + * + * 'p' is a partial block 'p' is a full block + * ------------------------ --------------------- + * CS1 (NIST) | .... pp ffff | .... pppp ffff + * CS2 (Schneier) | .... ffff pp | .... pppp ffff + * CS3 (Kerberos) | .... ffff pp | .... ffff pppp + * + * After encryption, we get the ciphertext from the token formatted as + * specified in the SunPKCS11 'cipherTextStealingVariant' configuration + * property. Conversely, before decryption, the ciphertext has to be passed + * to the token according to the previous formatting. This method converts + * the ciphertext between the format used by the token and the one used by + * SunJCE's "AES/CTS/NoPadding" implementation (CS3 as described by RFC + * 2040, section 8). + */ + private void convertCTSVariant(ByteBuffer ciphertextBuf, + byte[] ciphertextArr, int ciphertextEnd) { + if (padBufferLen == blockSize) { + // No reordering needed for a single block + return; + } + assert token.ctsVariant != null : "CTS algorithms should not be " + + "registered if the CTS variant of the token is unknown"; + if (token.ctsVariant == Token.CTSVariant.CS3) { + // Already CS3 + return; + } + int pad = padBufferLen % blockSize; + if (token.ctsVariant == Token.CTSVariant.CS2 && pad != 0) { + // CS2 and 'p' is a partial block, equal to CS3 + return; + } + if (ciphertextArr != null) { + ciphertextBuf = ByteBuffer.wrap(ciphertextArr); + } + if (ciphertextBuf != null) { + // No assumptions should be made about the current ciphertextBuf + // position. Additionally, if ciphertextBuf was not created here, + // the position should not be altered. To ensure this, use offsets + // to read and write bytes from the last two blocks (i.e. absolute + // ByteBuffer operations). Other blocks should not be modified. + pad = pad == 0 ? blockSize : pad; + if (encrypt) { + // .... pp[pp] ffff -> .... ffff pp[pp] + swapLastTwoBlocks(ciphertextBuf, ciphertextEnd, pad, blockSize); + } else { + // .... ffff pp[pp] -> .... pp[pp] ffff + swapLastTwoBlocks(ciphertextBuf, ciphertextEnd, blockSize, pad); + } + } + } + + private static void swapLastTwoBlocks(ByteBuffer ciphertextBuf, + int ciphertextEnd, int prevBlockLen, int lastBlockLen) { + // .... prevBlock lastBlock -> .... lastBlock prevBlock + int prevBlockStart = ciphertextEnd - prevBlockLen - lastBlockLen; + byte[] prevBlockBackup = new byte[prevBlockLen]; + ciphertextBuf.get(prevBlockStart, prevBlockBackup); + ciphertextBuf.put(prevBlockStart, ciphertextBuf, + ciphertextEnd - lastBlockLen, lastBlockLen); + ciphertextBuf.put(ciphertextEnd - prevBlockLen, prevBlockBackup); + } + private void handleException(PKCS11Exception e) throws ShortBufferException, IllegalBlockSizeException { if (e.match(CKR_BUFFER_TOO_SMALL)) { diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java index 07aaa1037ea54..4d10584fa09ba 100644 --- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java +++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java @@ -860,6 +860,15 @@ private static void register(Descriptor d) { dA(CIP, "AES_256/KWP/NoPadding", P11KeyWrapCipher, m(CKM_AES_KEY_WRAP_KWP)); + d(CIP, "AES/CTS/NoPadding", P11Cipher, + m(CKM_AES_CTS)); + d(CIP, "AES_128/CTS/NoPadding", P11Cipher, + m(CKM_AES_CTS)); + d(CIP, "AES_192/CTS/NoPadding", P11Cipher, + m(CKM_AES_CTS)); + d(CIP, "AES_256/CTS/NoPadding", P11Cipher, + m(CKM_AES_CTS)); + d(CIP, "AES/GCM/NoPadding", P11AEADCipher, m(CKM_AES_GCM)); dA(CIP, "AES_128/GCM/NoPadding", P11AEADCipher, @@ -1290,7 +1299,13 @@ private void initToken(CK_SLOT_INFO slotInfo) throws PKCS11Exception { } continue; } - + if (longMech == CKM_AES_CTS && token.ctsVariant == null) { + if (showInfo) { + System.out.println("DISABLED due to an unspecified " + + "cipherTextStealingVariant in configuration"); + } + continue; + } if (brokenMechanisms.contains(longMech)) { if (showInfo) { System.out.println("DISABLED due to known issue with NSS"); diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Token.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Token.java index a6f5f0a8764bb..b9937b7f0b1ed 100644 --- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Token.java +++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Token.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,6 +47,7 @@ * @since 1.5 */ final class Token implements Serializable { + public enum CTSVariant {CS1, CS2, CS3} // need to be serializable to allow SecureRandom to be serialized @Serial @@ -65,6 +66,8 @@ final class Token implements Serializable { @SuppressWarnings("serial") // Type of field is not Serializable final Config config; + final transient CTSVariant ctsVariant; + @SuppressWarnings("serial") // Type of field is not Serializable final CK_TOKEN_INFO tokenInfo; @@ -146,6 +149,7 @@ final class Token implements Serializable { config = provider.config; tokenInfo = p11.C_GetTokenInfo(provider.slotID); writeProtected = (tokenInfo.flags & CKF_WRITE_PROTECTED) != 0; + ctsVariant = getCTSVariant(); // create session manager and open a test session SessionManager sessionManager; try { @@ -412,6 +416,19 @@ CK_MECHANISM_INFO getMechanismInfo(long mechanism) throws PKCS11Exception { return result; } + private CTSVariant getCTSVariant() { + CTSVariant ctsVariant = config.getCTSVariant(); + if (ctsVariant != null) { + return ctsVariant; + } + // 'cipherTextStealingVariant' needs an explicit value for the + // CKM_AES_CTS mechanism to be enabled. In the case of NSS we know + // that this value is 'CS1', so we can set it for the user. See: + // https://bugzilla.mozilla.org/show_bug.cgi?id=373108#c7 + // https://github.com/nss-dev/nss/blob/NSS_3_99_RTM/lib/freebl/cts.c#L65 + return P11Util.isNSS(this) ? CTSVariant.CS1 : null; + } + private synchronized byte[] getTokenId() { if (tokenId == null) { SecureRandom random = JCAUtil.getSecureRandom(); diff --git a/test/jdk/sun/security/pkcs11/Cipher/TestCipherTextStealingMultipart.java b/test/jdk/sun/security/pkcs11/Cipher/TestCipherTextStealingMultipart.java new file mode 100644 index 0000000000000..87eeb2519f692 --- /dev/null +++ b/test/jdk/sun/security/pkcs11/Cipher/TestCipherTextStealingMultipart.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. + * + * 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 javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.security.Provider; +import java.util.Arrays; +import java.util.HexFormat; +import java.util.stream.IntStream; + +/* + * @test + * @bug 8330842 + * @summary test AES CTS multipart operations with SunPKCS11 + * @library /test/lib .. + * @run main/othervm/timeout=120 TestCipherTextStealingMultipart + */ + +public class TestCipherTextStealingMultipart extends PKCS11Test { + private static final String LF = System.lineSeparator(); + private static final String ALGORITHM = "AES/CTS/NoPadding"; + private static final int BLOCK_SIZE = 16; + private static final Key KEY = + new SecretKeySpec("AbCdEfGhIjKlMnOp".getBytes(), "AES"); + private static final IvParameterSpec IV = + new IvParameterSpec("1234567890aBcDeF".getBytes()); + + private static final StringBuilder chunksDesc = new StringBuilder(); + private static Provider sunPKCS11; + private static Cipher sunJCECipher; + + private static byte[][] generateChunks(int totalLength, int[] chunkSizes) { + chunksDesc.setLength(0); + chunksDesc.append("Testing with ").append(totalLength) + .append(" bytes distributed in ").append(chunkSizes.length) + .append(" multipart updates:").append(LF); + int byteIdx = 0; + byte[][] plaintextChunks = new byte[chunkSizes.length][]; + for (int chunkIdx = 0; chunkIdx < chunkSizes.length; chunkIdx++) { + byte[] chunk = new byte[chunkSizes[chunkIdx]]; + for (int i = 0; i < chunk.length; i++) { + chunk[i] = (byte) ('A' + byteIdx++ / BLOCK_SIZE); + } + chunksDesc.append(" ").append(repr(chunk)).append(LF); + plaintextChunks[chunkIdx] = chunk; + } + return plaintextChunks; + } + + private static byte[] computeExpected(byte[] jointPlaintext) + throws Exception { + byte[] ciphertext = sunJCECipher.doFinal(jointPlaintext); + if (ciphertext.length != jointPlaintext.length) { + throw new Exception("In CTS mode, ciphertext and plaintext should" + + " have the same length. However, SunJCE's CTS cipher " + + "returned a ciphertext of " + ciphertext.length + " bytes" + + " and plaintext has " + jointPlaintext.length + " bytes."); + } + return ciphertext; + } + + private static byte[] join(byte[][] inputChunks, int totalLength) { + ByteBuffer outputBuf = ByteBuffer.allocate(totalLength); + for (byte[] inputChunk : inputChunks) { + outputBuf.put(inputChunk); + } + return outputBuf.array(); + } + + private static byte[][] split(byte[] input, int[] chunkSizes) { + ByteBuffer inputBuf = ByteBuffer.wrap(input); + byte[][] outputChunks = new byte[chunkSizes.length][]; + for (int chunkIdx = 0; chunkIdx < chunkSizes.length; chunkIdx++) { + byte[] chunk = new byte[chunkSizes[chunkIdx]]; + inputBuf.get(chunk); + outputChunks[chunkIdx] = chunk; + } + return outputChunks; + } + + private enum CheckType {CIPHERTEXT, PLAINTEXT} + + private enum OutputType {BYTE_ARRAY, DIRECT_BYTE_BUFFER} + + private static void check(CheckType checkType, OutputType outputType, + byte[] expected, ByteBuffer actualBuf) throws Exception { + byte[] actual; + if (actualBuf.hasArray()) { + actual = actualBuf.array(); + } else { + actual = new byte[actualBuf.position()]; + actualBuf.position(0).get(actual); + } + if (!Arrays.equals(actual, expected)) { + throw new Exception("After " + switch (checkType) { + case CIPHERTEXT -> "encrypting"; + case PLAINTEXT -> "decrypting"; + } + " into a " + switch (outputType) { + case BYTE_ARRAY -> "byte[]"; + case DIRECT_BYTE_BUFFER -> "direct ByteBuffer"; + } + ", " + checkType.name().toLowerCase() + "s don't match:" + LF + + " Expected: " + repr(expected) + LF + + " Actual: " + repr(actual)); + } + } + + private static ByteBuffer encryptOrDecryptMultipart(int operation, + OutputType outputType, byte[][] inputChunks, int totalLength) + throws Exception { + Cipher cipher = Cipher.getInstance(ALGORITHM, sunPKCS11); + cipher.init(operation, KEY, IV); + ByteBuffer output = null; + int outOfs = 1; + switch (outputType) { + case BYTE_ARRAY -> { + output = ByteBuffer.allocate(totalLength); + for (byte[] inputChunk : inputChunks) { + output.put(cipher.update(inputChunk)); + } + // Check that the output array offset does not affect the + // penultimate block length calculation. + byte[] tmpOut = new byte[cipher.getOutputSize(0) + outOfs]; + cipher.doFinal(tmpOut, outOfs); + output.put(tmpOut, outOfs, tmpOut.length - outOfs); + } + case DIRECT_BYTE_BUFFER -> { + output = ByteBuffer.allocateDirect(totalLength); + for (byte[] inputChunk : inputChunks) { + cipher.update(ByteBuffer.wrap(inputChunk), output); + } + // Check that the output array offset does not affect the + // penultimate block length calculation. + ByteBuffer tmpOut = ByteBuffer.allocateDirect( + cipher.getOutputSize(0) + outOfs); + tmpOut.position(outOfs); + cipher.doFinal(ByteBuffer.allocate(0), tmpOut); + tmpOut.position(outOfs); + output.put(tmpOut); + } + } + return output; + } + + private static void doMultipart(int... chunkSizes) throws Exception { + int totalLength = IntStream.of(chunkSizes).sum(); + byte[][] plaintextChunks = generateChunks(totalLength, chunkSizes); + byte[] jointPlaintext = join(plaintextChunks, totalLength); + byte[] expectedCiphertext = computeExpected(jointPlaintext); + byte[][] ciphertextChunks = split(expectedCiphertext, chunkSizes); + + for (OutputType outputType : OutputType.values()) { + // Encryption test + check(CheckType.CIPHERTEXT, outputType, expectedCiphertext, + encryptOrDecryptMultipart(Cipher.ENCRYPT_MODE, outputType, + plaintextChunks, totalLength)); + // Decryption test + check(CheckType.PLAINTEXT, outputType, jointPlaintext, + encryptOrDecryptMultipart(Cipher.DECRYPT_MODE, outputType, + ciphertextChunks, totalLength)); + } + } + + private static String repr(byte[] data) { + if (data == null) { + return "<null>"; + } + if (data.length == 0) { + return "<empty []>"; + } + String lenRepr = " (" + data.length + " bytes)"; + for (byte b : data) { + if (b < 32 || b > 126) { + return HexFormat.ofDelimiter(":").formatHex(data) + lenRepr; + } + } + return new String(data, StandardCharsets.US_ASCII) + lenRepr; + } + + private static void initialize() throws Exception { + sunJCECipher = Cipher.getInstance(ALGORITHM, "SunJCE"); + sunJCECipher.init(Cipher.ENCRYPT_MODE, KEY, IV); + } + + public static void main(String[] args) throws Exception { + initialize(); + main(new TestCipherTextStealingMultipart(), args); + } + + @Override + public void main(Provider p) throws Exception { + sunPKCS11 = p; + try { + // Test relevant combinations for 2, 3, and 4 update operations + int aesBSize = 16; + int[] points = new int[]{1, aesBSize - 1, aesBSize, aesBSize + 1}; + for (int size1 : points) { + for (int size2 : points) { + if (size1 + size2 >= aesBSize) { + doMultipart(size1, size2); + } + for (int size3 : points) { + if (size1 + size2 + size3 >= aesBSize) { + doMultipart(size1, size2, size3); + } + for (int size4 : points) { + if (size1 + size2 + size3 + size4 >= aesBSize) { + doMultipart(size1, size2, size3, size4); + } + } + } + } + } + doMultipart(17, 17, 17, 17, 17); + doMultipart(4, 2, 7, 1, 6, 12); + doMultipart(2, 15, 21, 26, 31, 26, 5, 30); + doMultipart(7, 12, 26, 8, 15, 2, 17, 16, 21, 2, 32, 29); + doMultipart(6, 7, 6, 1, 5, 16, 14, 1, 10, 16, 17, 8, 1, 13, 12); + doMultipart(16, 125, 19, 32, 32, 16, 17, + 31, 19, 13, 16, 16, 32, 16, 16); + doMultipart(5, 30, 11, 9, 6, 14, 20, 6, + 5, 18, 31, 33, 15, 29, 7, 9); + doMultipart(105, 8, 21, 27, 30, 101, 15, 20, + 23, 33, 26, 6, 8, 2, 13, 17); + } catch (Exception e) { + System.out.print(chunksDesc); + throw e; + } + System.out.println("TEST PASS - OK"); + } +} diff --git a/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java b/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java index 2127256b5ec07..e0a7d53e1c1a6 100644 --- a/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java +++ b/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 4898461 6604496 + * @bug 4898461 6604496 8330842 * @summary basic test for symmetric ciphers with padding * @author Valerie Peng * @library /test/lib .. @@ -80,10 +80,11 @@ private static class CI { // class for holding Cipher Information new CI("DESede", "DESede", 408), new CI("AES", "AES", 128), - new CI("AES/CTR/NoPadding", "AES", 3200) + new CI("AES/CTR/NoPadding", "AES", 3200), + new CI("AES/CTS/NoPadding", "AES", 3200), }; - private static StringBuffer debugBuf = new StringBuffer(); + private static final StringBuffer debugBuf = new StringBuffer(); @Override public void main(Provider p) throws Exception { @@ -128,10 +129,7 @@ public void main(Provider p) throws Exception { } } catch (Exception ex) { // print out debug info when exception is encountered - if (debugBuf != null) { - System.out.println(debugBuf.toString()); - debugBuf = new StringBuffer(); - } + System.out.println(debugBuf); throw ex; } } @@ -171,8 +169,7 @@ private static void test(Cipher cipher, int mode, SecretKey key, } byte[] testOut1 = baos.toByteArray(); endTime = System.nanoTime(); - perfOut("stream InBuf + stream OutBuf: " + - (endTime - startTime)); + perfOut("stream InBuf + stream OutBuf", endTime - startTime); match(testOut1, answer); // test#2: Non-direct Buffer in + non-direct Buffer out @@ -184,8 +181,7 @@ private static void test(Cipher cipher, int mode, SecretKey key, cipher.update(inBuf, outBuf); cipher.doFinal(inBuf, outBuf); endTime = System.nanoTime(); - perfOut("non-direct InBuf + non-direct OutBuf: " + - (endTime - startTime)); + perfOut("non-direct InBuf + non-direct OutBuf", endTime - startTime); match(outBuf, answer); // test#3: Direct Buffer in + direc Buffer out @@ -197,8 +193,7 @@ private static void test(Cipher cipher, int mode, SecretKey key, cipher.update(inDirectBuf, outDirectBuf); cipher.doFinal(inDirectBuf, outDirectBuf); endTime = System.nanoTime(); - perfOut("direct InBuf + direct OutBuf: " + - (endTime - startTime)); + perfOut("direct InBuf + direct OutBuf", endTime - startTime); //debugOut("(post) inputBuf: " + inDirectBuf + "\n"); //debugOut("(post) outputBuf: " + outDirectBuf + "\n"); @@ -215,8 +210,7 @@ private static void test(Cipher cipher, int mode, SecretKey key, cipher.update(inDirectBuf, outBuf); cipher.doFinal(inDirectBuf, outBuf); endTime = System.nanoTime(); - perfOut("direct InBuf + non-direct OutBuf: " + - (endTime - startTime)); + perfOut("direct InBuf + non-direct OutBuf", endTime - startTime); match(outBuf, answer); // test#5: Non-direct Buffer in + direct Buffer out @@ -231,26 +225,21 @@ private static void test(Cipher cipher, int mode, SecretKey key, cipher.update(inBuf, outDirectBuf); cipher.doFinal(inBuf, outDirectBuf); endTime = System.nanoTime(); - perfOut("non-direct InBuf + direct OutBuf: " + - (endTime - startTime)); + perfOut("non-direct InBuf + direct OutBuf", endTime - startTime); //debugOut("(post) inputBuf: " + inBuf + "\n"); //debugOut("(post) outputBuf: " + outDirectBuf + "\n"); match(outDirectBuf, answer); - debugBuf = null; + debugBuf.setLength(0); } - private static void perfOut(String msg) { - if (debugBuf != null) { - debugBuf.append("PERF>" + msg); - } + private static void perfOut(String msg, long elapsed) { + debugOut("PERF> " + msg + ", elapsed: " + elapsed + " ns\n"); } private static void debugOut(String msg) { - if (debugBuf != null) { - debugBuf.append(msg); - } + debugBuf.append(msg); } private static void match(byte[] b1, byte[] b2) throws Exception { diff --git a/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java b/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java index 8f53cda2f6ba4..2288a5699fb34 100644 --- a/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java +++ b/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 4898484 6604496 8001284 + * @bug 4898484 6604496 8001284 8330842 * @summary basic test for symmetric ciphers with no padding * @author Valerie Peng * @library /test/lib .. @@ -68,10 +68,12 @@ private static class CI { // class for holding Cipher Information new CI("AES/CBC/NoPadding", "AES", 4800), new CI("Blowfish/CBC/NoPadding", "Blowfish", 24), new CI("AES/CTR/NoPadding", "AES", 1600), - new CI("AES/CTR/NoPadding", "AES", 65) + new CI("AES/CTR/NoPadding", "AES", 65), + new CI("AES/CTS/NoPadding", "AES", 1600), + new CI("AES/CTS/NoPadding", "AES", 65), }; - private static StringBuffer debugBuf; + private static final StringBuffer debugBuf = new StringBuffer(); @Override public void main(Provider p) throws Exception { @@ -111,9 +113,7 @@ public void main(Provider p) throws Exception { } } catch (Exception ex) { // print out debug info when exception is encountered - if (debugBuf != null) { - System.out.println(debugBuf.toString()); - } + System.out.println(debugBuf); throw ex; } } @@ -122,7 +122,6 @@ private static void test(Cipher cipher, int mode, SecretKey key, AlgorithmParameters params, byte[] in, byte[] answer) throws Exception { // test setup - debugBuf = new StringBuffer(); cipher.init(mode, key, params); int outLen = cipher.getOutputSize(in.length); debugBuf.append("Estimated output size = " + outLen + "\n"); @@ -214,7 +213,7 @@ private static void test(Cipher cipher, int mode, SecretKey key, } match(outBuf, answer); - debugBuf = null; + debugBuf.setLength(0); } private static void match(byte[] b1, byte[] b2) throws Exception { From b6ffb442acb4a222f017868433eff213d9b84ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jeli=C5=84ski?= <djelinski@openjdk.org> Date: Thu, 27 Jun 2024 15:14:36 +0000 Subject: [PATCH 219/471] 8335135: HttpURLConnection#HttpInputStream does not throw IOException when response is truncated Reviewed-by: dfuchs --- .../classes/sun/net/www/MeteredStream.java | 5 +- .../java/net/Authenticator/BasicTest4.java | 4 +- .../URLConnection/TruncatedFixedResponse.java | 112 ++++++++++++++++++ ...liveStreamCloseWithWrongContentLength.java | 4 +- 4 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 test/jdk/java/net/URLConnection/TruncatedFixedResponse.java diff --git a/src/java.base/share/classes/sun/net/www/MeteredStream.java b/src/java.base/share/classes/sun/net/www/MeteredStream.java index d12389416fcbd..eaa93bba56c4a 100644 --- a/src/java.base/share/classes/sun/net/www/MeteredStream.java +++ b/src/java.base/share/classes/sun/net/www/MeteredStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,6 +54,9 @@ private final void justRead(long n) throws IOException { assert isLockHeldByCurrentThread(); if (n == -1) { + if (expected > count) { + throw new IOException("Premature EOF"); + } /* * don't close automatically when mark is set and is valid; diff --git a/test/jdk/java/net/Authenticator/BasicTest4.java b/test/jdk/java/net/Authenticator/BasicTest4.java index 0146651ba6a37..becfdb351abf9 100644 --- a/test/jdk/java/net/Authenticator/BasicTest4.java +++ b/test/jdk/java/net/Authenticator/BasicTest4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -151,7 +151,7 @@ public void run () { System.out.println ("checkfor returned " + success); readAll (s); os = s.getOutputStream(); - os.write (reply2.getBytes()); + os.write ((reply2+"HelloAgain").getBytes()); s.close (); if (success) diff --git a/test/jdk/java/net/URLConnection/TruncatedFixedResponse.java b/test/jdk/java/net/URLConnection/TruncatedFixedResponse.java new file mode 100644 index 0000000000000..89d801999309a --- /dev/null +++ b/test/jdk/java/net/URLConnection/TruncatedFixedResponse.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8335135 + * @library /test/lib + * @summary Check that reading from inputStream throws an IOException + * if the fixed response stream is closed before reading all bytes. + */ + +import jdk.test.lib.net.URIBuilder; + +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.URL; + +public class TruncatedFixedResponse implements Runnable { + + ServerSocket ss; + + /* + * Our "http" server to return a truncated fixed response + */ + public void run() { + try { + Socket s = ss.accept(); + + BufferedReader in = new BufferedReader( + new InputStreamReader(s.getInputStream())); + while (true) { + String req = in.readLine(); + if (req.isEmpty()) { + break; + } + } + PrintStream out = new PrintStream( + new BufferedOutputStream(s.getOutputStream())); + + /* send the header */ + out.print("HTTP/1.1 200\r\n"); + out.print("Content-Length: 100\r\n"); + out.print("Content-Type: text/html\r\n"); + out.print("\r\n"); + out.print("Some content, but too short"); + out.close(); + s.close(); + ss.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + TruncatedFixedResponse() throws Exception { + /* start the server */ + ss = new ServerSocket(); + ss.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + new Thread(this).start(); + + /* establish http connection to server */ + URL url = URIBuilder.newBuilder() + .scheme("http") + .loopback() + .port(ss.getLocalPort()) + .path("/foo") + .toURL(); + HttpURLConnection http = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); + + try (InputStream in = http.getInputStream()) { + while (in.read() != -1) { + // discard response + } + throw new AssertionError("Expected IOException was not thrown"); + } catch (IOException ex) { + System.out.println("Got expected exception: " + ex); + } + } + + public static void main(String args[]) throws Exception { + new TruncatedFixedResponse(); + } +} diff --git a/test/jdk/sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java b/test/jdk/sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java index 32796985a8b4d..e859d671a6740 100644 --- a/test/jdk/sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java +++ b/test/jdk/sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -173,7 +173,7 @@ public static void main (String[] args) throws Exception { c=is.read(); System.out.println("client reads: "+c); } catch (IOException ioe) { - is.read (); + System.out.println("client got expected exception: "+ioe); break; } } From 0e6b0cbaaa0d5272f60ee4fe09cf5e247e68c2a8 Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Thu, 27 Jun 2024 15:38:06 +0000 Subject: [PATCH 220/471] 8334886: jdk/jfr/api/recording/time/TestTimeMultiple.java failed with RuntimeException: getStopTime() > afterStop Reviewed-by: mgronlun --- src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp | 2 -- src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java | 1 - 2 files changed, 3 deletions(-) diff --git a/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp b/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp index b88ba06bdf799..a35b046e56c92 100644 --- a/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp @@ -47,8 +47,6 @@ jlong JfrChunk::nanos_now() { const jlong now = seconds * 1000000000 + nanos; if (now > last) { last = now; - } else { - ++last; } return last; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java index 345d2fdcc8dfb..114052ecea250 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java @@ -103,7 +103,6 @@ static long nanosToTicks(long nanos) { static long getChunkStartNanos() { long nanos = JVM.getChunkStartNanos(); - // JVM::getChunkStartNanos() may return a bumped timestamp, +1 ns or +2 ns. // Spin here to give Instant.now() a chance to catch up. awaitUniqueTimestamp(); return nanos; From 9d986a013d01a5bcc0942bcc490258038291c22c Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov <kvn@openjdk.org> Date: Thu, 27 Jun 2024 16:06:35 +0000 Subject: [PATCH 221/471] 8335220: C2: Missing check for Opaque4 node in EscapeAnalysis Reviewed-by: chagedorn, cslucas --- src/hotspot/share/opto/escape.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/opto/escape.cpp b/src/hotspot/share/opto/escape.cpp index 1338bb3c90901..2ca722148b61e 100644 --- a/src/hotspot/share/opto/escape.cpp +++ b/src/hotspot/share/opto/escape.cpp @@ -574,18 +574,23 @@ bool ConnectionGraph::can_reduce_check_users(Node* n, uint nesting) const { // CmpP/N used by the If controlling the cast. if (use->in(0)->is_IfTrue() || use->in(0)->is_IfFalse()) { Node* iff = use->in(0)->in(0); - if (iff->Opcode() == Op_If && iff->in(1)->is_Bool() && iff->in(1)->in(1)->is_Cmp()) { + // We may have Opaque4 node between If and Bool nodes. + // Bail out in such case - we need to preserve Opaque4 for correct + // processing predicates after loop opts. + bool can_reduce = (iff->Opcode() == Op_If) && iff->in(1)->is_Bool() && iff->in(1)->in(1)->is_Cmp(); + if (can_reduce) { Node* iff_cmp = iff->in(1)->in(1); int opc = iff_cmp->Opcode(); - if ((opc == Op_CmpP || opc == Op_CmpN) && !can_reduce_cmp(n, iff_cmp)) { + can_reduce = (opc == Op_CmpP || opc == Op_CmpN) && can_reduce_cmp(n, iff_cmp); + } + if (!can_reduce) { #ifndef PRODUCT - if (TraceReduceAllocationMerges) { - tty->print_cr("Can NOT reduce Phi %d on invocation %d. CastPP %d doesn't have simple control.", n->_idx, _invocation, use->_idx); - n->dump(5); - } -#endif - return false; + if (TraceReduceAllocationMerges) { + tty->print_cr("Can NOT reduce Phi %d on invocation %d. CastPP %d doesn't have simple control.", n->_idx, _invocation, use->_idx); + n->dump(5); } +#endif + return false; } } } @@ -651,7 +656,12 @@ Node* ConnectionGraph::specialize_cmp(Node* base, Node* curr_ctrl) { if (curr_ctrl == nullptr || curr_ctrl->is_Region()) { con = _igvn->zerocon(t->basic_type()); } else { - Node* curr_cmp = curr_ctrl->in(0)->in(1)->in(1); // true/false -> if -> bool -> cmp + // can_reduce_check_users() verified graph: true/false -> if -> bool -> cmp + assert(curr_ctrl->in(0)->Opcode() == Op_If, "unexpected node %s", curr_ctrl->in(0)->Name()); + Node* bol = curr_ctrl->in(0)->in(1); + assert(bol->is_Bool(), "unexpected node %s", bol->Name()); + Node* curr_cmp = bol->in(1); + assert(curr_cmp->Opcode() == Op_CmpP || curr_cmp->Opcode() == Op_CmpN, "unexpected node %s", curr_cmp->Name()); con = curr_cmp->in(1)->is_Con() ? curr_cmp->in(1) : curr_cmp->in(2); } From 243bae7dc0c3e71c02ffed9e1ee7d436af11d3b9 Mon Sep 17 00:00:00 2001 From: Vladimir Ivanov <vlivanov@openjdk.org> Date: Thu, 27 Jun 2024 18:25:16 +0000 Subject: [PATCH 222/471] 8304693: Remove -XX:-UseVtableBasedCHA Reviewed-by: kvn, coleenp, dholmes --- src/hotspot/share/ci/ciMethod.cpp | 15 +-- src/hotspot/share/code/dependencies.cpp | 10 +- src/hotspot/share/oops/instanceKlass.cpp | 21 +--- src/hotspot/share/oops/instanceKlass.hpp | 3 - src/hotspot/share/runtime/arguments.cpp | 1 + src/hotspot/share/runtime/globals.hpp | 3 - .../compiler/cha/AbstractRootMethod.java | 2 +- .../jtreg/compiler/cha/DefaultRootMethod.java | 2 +- .../cha/StrengthReduceInterfaceCall.java | 2 +- .../invocationOldCHATests.java | 117 ------------------ test/jtreg-ext/requires/VMProps.java | 1 - 11 files changed, 12 insertions(+), 165 deletions(-) delete mode 100644 test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java diff --git a/src/hotspot/share/ci/ciMethod.cpp b/src/hotspot/share/ci/ciMethod.cpp index aac2a553cda31..844ef0a0c03da 100644 --- a/src/hotspot/share/ci/ciMethod.cpp +++ b/src/hotspot/share/ci/ciMethod.cpp @@ -718,17 +718,10 @@ ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller, { MutexLocker locker(Compile_lock); InstanceKlass* context = actual_recv->get_instanceKlass(); - if (UseVtableBasedCHA) { - target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context, - root_m->get_Method(), - callee_holder->get_Klass(), - this->get_Method())); - } else { - if (root_m->is_abstract()) { - return nullptr; // not supported - } - target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context, root_m->get_Method())); - } + target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context, + root_m->get_Method(), + callee_holder->get_Klass(), + this->get_Method())); assert(target() == nullptr || !target()->is_abstract(), "not allowed"); // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods. } diff --git a/src/hotspot/share/code/dependencies.cpp b/src/hotspot/share/code/dependencies.cpp index 26e53ed90275c..7d3b744313f12 100644 --- a/src/hotspot/share/code/dependencies.cpp +++ b/src/hotspot/share/code/dependencies.cpp @@ -113,11 +113,7 @@ void Dependencies::assert_unique_concrete_method(ciKlass* ctxk, ciMethod* uniqm) void Dependencies::assert_unique_concrete_method(ciKlass* ctxk, ciMethod* uniqm, ciKlass* resolved_klass, ciMethod* resolved_method) { check_ctxk(ctxk); check_unique_method(ctxk, uniqm); - if (UseVtableBasedCHA) { - assert_common_4(unique_concrete_method_4, ctxk, uniqm, resolved_klass, resolved_method); - } else { - assert_common_2(unique_concrete_method_2, ctxk, uniqm); - } + assert_common_4(unique_concrete_method_4, ctxk, uniqm, resolved_klass, resolved_method); } void Dependencies::assert_unique_implementor(ciInstanceKlass* ctxk, ciInstanceKlass* uniqk) { @@ -1474,7 +1470,6 @@ class LinkedConcreteMethodFinder : public AbstractClassHierarchyWalker { // Optionally, a method which was previously determined as a unique target (uniqm) is added as a participant // to enable dependency spot-checking and speed up the search. LinkedConcreteMethodFinder(InstanceKlass* resolved_klass, Method* resolved_method, Method* uniqm = nullptr) : AbstractClassHierarchyWalker(nullptr) { - assert(UseVtableBasedCHA, "required"); assert(resolved_klass->is_linked(), "required"); assert(resolved_method->method_holder()->is_linked(), "required"); assert(!resolved_method->can_be_statically_bound(), "no vtable index available"); @@ -1948,7 +1943,6 @@ Klass* Dependencies::check_unique_concrete_method(InstanceKlass* ctxk, Klass* resolved_klass, Method* resolved_method, KlassDepChange* changes) { - assert(UseVtableBasedCHA, "required"); assert(!ctxk->is_interface() || ctxk == resolved_klass, "sanity"); assert(!resolved_method->can_be_statically_bound() || resolved_method == uniqm, "sanity"); assert(resolved_klass->is_subtype_of(resolved_method->method_holder()), "sanity"); @@ -2129,7 +2123,7 @@ Klass* Dependencies::DepStream::check_klass_dependency(KlassDepChange* changes) Dependencies::check_valid_dependency_type(type()); if (changes != nullptr) { - if (UseVtableBasedCHA && changes->is_klass_init_change()) { + if (changes->is_klass_init_change()) { return check_klass_init_dependency(changes->as_klass_init_change()); } else { return check_new_klass_dependency(changes->as_new_klass_change()); diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index aa8f47f62df2f..9c40bc1cee811 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -929,7 +929,7 @@ bool InstanceKlass::link_class_impl(TRAPS) { // In case itable verification is ever added. // itable().verify(tty, true); #endif - if (UseVtableBasedCHA && Universe::is_fully_initialized()) { + if (Universe::is_fully_initialized()) { DeoptimizationScope deopt_scope; { // Now mark all code that assumes the class is not linked. @@ -1264,7 +1264,7 @@ void InstanceKlass::set_initialization_state_and_notify(ClassState state, TRAPS) // Update hierarchy. This is done before the new klass has been added to the SystemDictionary. The Compile_lock // is grabbed, to ensure that the compiler is not using the class hierarchy. -void InstanceKlass::add_to_hierarchy_impl(JavaThread* current) { +void InstanceKlass::add_to_hierarchy(JavaThread* current) { assert(!SafepointSynchronize::is_at_safepoint(), "must NOT be at safepoint"); DeoptimizationScope deopt_scope; @@ -1290,23 +1290,6 @@ void InstanceKlass::add_to_hierarchy_impl(JavaThread* current) { deopt_scope.deoptimize_marked(); } -void InstanceKlass::add_to_hierarchy(JavaThread* current) { - - if (UseVtableBasedCHA || !Universe::is_fully_initialized()) { - add_to_hierarchy_impl(current); - } else { - // In case we are not using CHA based vtables we need to make sure the loaded - // deopt is completed before anyone links this class. - // Linking is done with init_lock held, by loading and deopting with it - // held we make sure the deopt is completed before linking. - Handle h_init_lock(current, init_lock()); - ObjectLocker ol(h_init_lock, current); - add_to_hierarchy_impl(current); - - // This doesn't need a notify because the wait is only on the class initialization path. - } -} - InstanceKlass* InstanceKlass::implementor() const { InstanceKlass* volatile* ik = adr_implementor(); diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp index fe281f9514805..6e5d4ac8e7feb 100644 --- a/src/hotspot/share/oops/instanceKlass.hpp +++ b/src/hotspot/share/oops/instanceKlass.hpp @@ -828,9 +828,6 @@ class InstanceKlass: public Klass { void set_jni_ids(JNIid* ids) { _jni_ids = ids; } JNIid* jni_id_for(int offset); - private: - void add_to_hierarchy_impl(JavaThread* current); - public: // maintenance of deoptimization dependencies inline DependencyContext dependencies(); diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index f428403fa3002..d353c5a162ae3 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -522,6 +522,7 @@ static SpecialFlag const special_jvm_flags[] = { #endif // X86 { "HeapFirstMaximumCompactionCount", JDK_Version::undefined(), JDK_Version::jdk(24), JDK_Version::jdk(25) }, + { "UseVtableBasedCHA", JDK_Version::undefined(), JDK_Version::jdk(24), JDK_Version::jdk(25) }, #ifdef ASSERT { "DummyObsoleteTestFlag", JDK_Version::undefined(), JDK_Version::jdk(18), JDK_Version::undefined() }, #endif diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp index e4eb8d3e9e90c..468e9bd880086 100644 --- a/src/hotspot/share/runtime/globals.hpp +++ b/src/hotspot/share/runtime/globals.hpp @@ -968,9 +968,6 @@ const int ObjectAlignmentInBytes = 8; develop(bool, UseCHA, true, \ "Enable CHA") \ \ - product(bool, UseVtableBasedCHA, true, DIAGNOSTIC, \ - "Use vtable information during CHA") \ - \ product(bool, UseTypeProfile, true, \ "Check interpreter profile for historically monomorphic calls") \ \ diff --git a/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java b/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java index 57f41dece806d..6f173fefe1ebf 100644 --- a/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java +++ b/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java @@ -23,7 +23,7 @@ /* * @test - * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true + * @requires !vm.graal.enabled * @modules java.base/jdk.internal.org.objectweb.asm * java.base/jdk.internal.misc * java.base/jdk.internal.vm.annotation diff --git a/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java b/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java index ee2dda744e697..1b72399069e3e 100644 --- a/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java +++ b/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java @@ -23,7 +23,7 @@ /* * @test - * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true + * @requires !vm.graal.enabled * @modules java.base/jdk.internal.org.objectweb.asm * java.base/jdk.internal.misc * java.base/jdk.internal.vm.annotation diff --git a/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java b/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java index 736fa242bdcdd..068da4100bd69 100644 --- a/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java +++ b/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java @@ -23,7 +23,7 @@ /* * @test - * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true + * @requires !vm.graal.enabled * @modules java.base/jdk.internal.org.objectweb.asm * java.base/jdk.internal.misc * java.base/jdk.internal.vm.annotation diff --git a/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java b/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java deleted file mode 100644 index 415cd105ee9ad..0000000000000 --- a/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * @test id=special - * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA) - * @requires vm.flagless - * @library /test/lib - * @modules java.base/jdk.internal.org.objectweb.asm - * java.base/jdk.internal.misc - * @compile invokespecial/Checker.java invokespecial/ClassGenerator.java invokespecial/Generator.java - * - * @run driver/timeout=1800 invocationOldCHATests special - */ - -/* - * @test id=virtual - * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA) - * @requires vm.flagless - * @library /test/lib - * @modules java.base/jdk.internal.org.objectweb.asm - * java.base/jdk.internal.misc - * @compile invokevirtual/Checker.java invokevirtual/ClassGenerator.java invokevirtual/Generator.java - * - * @run driver/timeout=1800 invocationOldCHATests virtual - */ - -/* - * @test id=interface - * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA) - * @requires vm.flagless - * @library /test/lib - * @modules java.base/jdk.internal.org.objectweb.asm - * java.base/jdk.internal.misc - * @compile invokeinterface/Checker.java invokeinterface/ClassGenerator.java invokeinterface/Generator.java - * - * @run driver/timeout=1800 invocationOldCHATests interface - */ - -import jdk.test.lib.process.ProcessTools; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.compiler.InMemoryJavaCompiler; - -public class invocationOldCHATests { - - public static void runTest(String whichTests, String classFileVersion) throws Throwable { - System.out.println("\nOld CHA invocation tests, Tests: " + whichTests + - ", class file version: " + classFileVersion); - ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-Xmx128M", - "-Xcomp", "-XX:+UnlockDiagnosticVMOptions", "-XX:-UseVtableBasedCHA", - "--add-exports", "java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED", - whichTests, "--classfile_version=" + classFileVersion); - OutputAnalyzer output = new OutputAnalyzer(pb.start()); - try { - output.shouldContain("EXECUTION STATUS: PASSED"); - output.shouldHaveExitValue(0); - } catch (Throwable e) { - System.out.println( - "\nNote that an entry such as 'B.m/C.m' in the failure chart means that" + - " the test case failed because method B.m was invoked but the test " + - "expected method C.m to be invoked. Similarly, a result such as 'AME/C.m'" + - " means that an AbstractMethodError exception was thrown but the test" + - " case expected method C.m to be invoked."); - System.out.println( - "\nAlso note that passing --dump to invoke*.Generator will" + - " dump the generated classes (for debugging purposes).\n"); - - throw e; - } - } - - public static void main(String args[]) throws Throwable { - if (args.length < 1) { - throw new IllegalArgumentException("Should provide the test name"); - } - String testName = args[0]; - - // Get current major class file version and test with it. - byte klassbuf[] = InMemoryJavaCompiler.compile("blah", "public class blah { }"); - int major_version = klassbuf[6] << 8 | klassbuf[7]; - - switch (testName) { - case "special": - runTest("invokespecial.Generator", String.valueOf(major_version)); - break; - case "virtual": - runTest("invokevirtual.Generator", String.valueOf(major_version)); - break; - case "interface": - runTest("invokeinterface.Generator", String.valueOf(major_version)); - break; - default: - throw new IllegalArgumentException("Unknown test name: " + testName); - } - } -} diff --git a/test/jtreg-ext/requires/VMProps.java b/test/jtreg-ext/requires/VMProps.java index e37646ac6d1c5..49cc6e1431114 100644 --- a/test/jtreg-ext/requires/VMProps.java +++ b/test/jtreg-ext/requires/VMProps.java @@ -386,7 +386,6 @@ protected void vmOptFinalFlags(SafeMap map) { vmOptFinalFlag(map, "EliminateAllocations"); vmOptFinalFlag(map, "UseCompressedOops"); vmOptFinalFlag(map, "UseVectorizedMismatchIntrinsic"); - vmOptFinalFlag(map, "UseVtableBasedCHA"); vmOptFinalFlag(map, "ZGenerational"); } From c35e58a5adf06e25a3b482e2be384af95a84f11a Mon Sep 17 00:00:00 2001 From: Ioi Lam <iklam@openjdk.org> Date: Thu, 27 Jun 2024 20:10:13 +0000 Subject: [PATCH 223/471] 8309634: Resolve CONSTANT_MethodRef at CDS dump time Reviewed-by: matsaave, ccheung --- src/hotspot/share/cds/classListParser.cpp | 2 + src/hotspot/share/cds/classListWriter.cpp | 21 +++- src/hotspot/share/cds/classPrelinker.cpp | 18 ++- src/hotspot/share/cds/dumpAllocStats.cpp | 4 + src/hotspot/share/cds/dumpAllocStats.hpp | 12 ++ .../share/interpreter/interpreterRuntime.cpp | 36 +++++- .../share/interpreter/interpreterRuntime.hpp | 7 +- .../share/interpreter/linkResolver.cpp | 104 +++++++++++++----- .../share/interpreter/linkResolver.hpp | 10 +- src/hotspot/share/oops/cpCache.cpp | 95 +++++++++++++++- src/hotspot/share/oops/cpCache.hpp | 4 +- .../share/oops/resolvedMethodEntry.hpp | 25 +++++ .../resolvedConstants/ResolvedConstants.java | 52 ++++++++- 13 files changed, 348 insertions(+), 42 deletions(-) diff --git a/src/hotspot/share/cds/classListParser.cpp b/src/hotspot/share/cds/classListParser.cpp index 9ee5f25aa8918..b2695ac2e7873 100644 --- a/src/hotspot/share/cds/classListParser.cpp +++ b/src/hotspot/share/cds/classListParser.cpp @@ -830,6 +830,8 @@ void ClassListParser::parse_constant_pool_tag() { // ignore break; case JVM_CONSTANT_Fieldref: + case JVM_CONSTANT_Methodref: + case JVM_CONSTANT_InterfaceMethodref: preresolve_fmi = true; break; break; diff --git a/src/hotspot/share/cds/classListWriter.cpp b/src/hotspot/share/cds/classListWriter.cpp index 97f0bc3476e55..78cd092445b70 100644 --- a/src/hotspot/share/cds/classListWriter.cpp +++ b/src/hotspot/share/cds/classListWriter.cpp @@ -258,15 +258,26 @@ void ClassListWriter::write_resolved_constants_for(InstanceKlass* ik) { if (field_entries != nullptr) { for (int i = 0; i < field_entries->length(); i++) { ResolvedFieldEntry* rfe = field_entries->adr_at(i); - if (rfe->is_resolved(Bytecodes::_getstatic) || - rfe->is_resolved(Bytecodes::_putstatic) || - rfe->is_resolved(Bytecodes::_getfield) || + if (rfe->is_resolved(Bytecodes::_getfield) || rfe->is_resolved(Bytecodes::_putfield)) { list.at_put(rfe->constant_pool_index(), true); print = true; } } } + + Array<ResolvedMethodEntry>* method_entries = cp->cache()->resolved_method_entries(); + if (method_entries != nullptr) { + for (int i = 0; i < method_entries->length(); i++) { + ResolvedMethodEntry* rme = method_entries->adr_at(i); + if (rme->is_resolved(Bytecodes::_invokevirtual) || + rme->is_resolved(Bytecodes::_invokespecial) || + rme->is_resolved(Bytecodes::_invokeinterface)) { + list.at_put(rme->constant_pool_index(), true); + print = true; + } + } + } } if (print) { @@ -276,7 +287,9 @@ void ClassListWriter::write_resolved_constants_for(InstanceKlass* ik) { if (list.at(i)) { constantTag cp_tag = cp->tag_at(i).value(); assert(cp_tag.value() == JVM_CONSTANT_Class || - cp_tag.value() == JVM_CONSTANT_Fieldref, "sanity"); + cp_tag.value() == JVM_CONSTANT_Fieldref || + cp_tag.value() == JVM_CONSTANT_Methodref|| + cp_tag.value() == JVM_CONSTANT_InterfaceMethodref, "sanity"); stream->print(" %d", i); } } diff --git a/src/hotspot/share/cds/classPrelinker.cpp b/src/hotspot/share/cds/classPrelinker.cpp index 223d3937f9354..6b866bac9958d 100644 --- a/src/hotspot/share/cds/classPrelinker.cpp +++ b/src/hotspot/share/cds/classPrelinker.cpp @@ -89,7 +89,9 @@ bool ClassPrelinker::is_resolution_deterministic(ConstantPool* cp, int cp_index) // currently archive only CP entries that are already resolved. Klass* resolved_klass = cp->resolved_klass_at(cp_index); return resolved_klass != nullptr && is_class_resolution_deterministic(cp->pool_holder(), resolved_klass); - } else if (cp->tag_at(cp_index).is_field()) { + } else if (cp->tag_at(cp_index).is_field() || + cp->tag_at(cp_index).is_method() || + cp->tag_at(cp_index).is_interface_method()) { int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); if (!cp->tag_at(klass_cp_index).is_klass()) { // Not yet resolved @@ -263,6 +265,14 @@ void ClassPrelinker::preresolve_field_and_method_cp_entries(JavaThread* current, CLEAR_PENDING_EXCEPTION; // just ignore } break; + case Bytecodes::_invokespecial: + case Bytecodes::_invokevirtual: + case Bytecodes::_invokeinterface: + maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD); + if (HAS_PENDING_EXCEPTION) { + CLEAR_PENDING_EXCEPTION; // just ignore + } + break; default: break; } @@ -301,6 +311,12 @@ void ClassPrelinker::maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m, Bytecod InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, false /*initialize_holder*/, CHECK); break; + case Bytecodes::_invokevirtual: + case Bytecodes::_invokespecial: + case Bytecodes::_invokeinterface: + InterpreterRuntime::cds_resolve_invoke(bc, raw_index, cp, CHECK); + break; + default: ShouldNotReachHere(); } diff --git a/src/hotspot/share/cds/dumpAllocStats.cpp b/src/hotspot/share/cds/dumpAllocStats.cpp index 30ef1597063b1..a1dac41e32271 100644 --- a/src/hotspot/share/cds/dumpAllocStats.cpp +++ b/src/hotspot/share/cds/dumpAllocStats.cpp @@ -110,4 +110,8 @@ void DumpAllocStats::print_stats(int ro_all, int rw_all) { _num_field_cp_entries, _num_field_cp_entries_archived, percent_of(_num_field_cp_entries_archived, _num_field_cp_entries), _num_field_cp_entries_reverted); + msg.info("Method CP entries = %6d, archived = %6d (%5.1f%%), reverted = %6d", + _num_method_cp_entries, _num_method_cp_entries_archived, + percent_of(_num_method_cp_entries_archived, _num_method_cp_entries), + _num_method_cp_entries_reverted); } diff --git a/src/hotspot/share/cds/dumpAllocStats.hpp b/src/hotspot/share/cds/dumpAllocStats.hpp index 424a98aa73838..0332be7312088 100644 --- a/src/hotspot/share/cds/dumpAllocStats.hpp +++ b/src/hotspot/share/cds/dumpAllocStats.hpp @@ -71,6 +71,9 @@ class DumpAllocStats : public StackObj { int _num_klass_cp_entries; int _num_klass_cp_entries_archived; int _num_klass_cp_entries_reverted; + int _num_method_cp_entries; + int _num_method_cp_entries_archived; + int _num_method_cp_entries_reverted; public: enum { RO = 0, RW = 1 }; @@ -84,6 +87,9 @@ class DumpAllocStats : public StackObj { _num_klass_cp_entries = 0; _num_klass_cp_entries_archived = 0; _num_klass_cp_entries_reverted = 0; + _num_method_cp_entries = 0; + _num_method_cp_entries_archived = 0; + _num_method_cp_entries_reverted = 0; }; CompactHashtableStats* symbol_stats() { return &_symbol_stats; } @@ -122,6 +128,12 @@ class DumpAllocStats : public StackObj { _num_klass_cp_entries_reverted += reverted ? 1 : 0; } + void record_method_cp_entry(bool archived, bool reverted) { + _num_method_cp_entries ++; + _num_method_cp_entries_archived += archived ? 1 : 0; + _num_method_cp_entries_reverted += reverted ? 1 : 0; + } + void print_stats(int ro_all, int rw_all); }; diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp index fb779b039f49a..4f2eae023f68d 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.cpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp @@ -832,7 +832,6 @@ void InterpreterRuntime::resolve_invoke(JavaThread* current, Bytecodes::Code byt // resolve method CallInfo info; constantPoolHandle pool(current, last_frame.method()->constants()); - ConstantPoolCache* cache = pool->cache(); methodHandle resolved_method; @@ -857,10 +856,18 @@ void InterpreterRuntime::resolve_invoke(JavaThread* current, Bytecodes::Code byt resolved_method = methodHandle(current, info.resolved_method()); } // end JvmtiHideSingleStepping + update_invoke_cp_cache_entry(info, bytecode, resolved_method, pool, method_index); +} + +void InterpreterRuntime::update_invoke_cp_cache_entry(CallInfo& info, Bytecodes::Code bytecode, + methodHandle& resolved_method, + constantPoolHandle& pool, + int method_index) { // Don't allow safepoints until the method is cached. NoSafepointVerifier nsv; // check if link resolution caused cpCache to be updated + ConstantPoolCache* cache = pool->cache(); if (cache->resolved_method_entry_at(method_index)->is_resolved(bytecode)) return; #ifdef ASSERT @@ -912,6 +919,33 @@ void InterpreterRuntime::resolve_invoke(JavaThread* current, Bytecodes::Code byt } } +void InterpreterRuntime::cds_resolve_invoke(Bytecodes::Code bytecode, int method_index, + constantPoolHandle& pool, TRAPS) { + LinkInfo link_info(pool, method_index, bytecode, CHECK); + + if (!link_info.resolved_klass()->is_instance_klass() || InstanceKlass::cast(link_info.resolved_klass())->is_linked()) { + CallInfo call_info; + switch (bytecode) { + case Bytecodes::_invokevirtual: LinkResolver::cds_resolve_virtual_call (call_info, link_info, CHECK); break; + case Bytecodes::_invokeinterface: LinkResolver::cds_resolve_interface_call(call_info, link_info, CHECK); break; + case Bytecodes::_invokespecial: LinkResolver::cds_resolve_special_call (call_info, link_info, CHECK); break; + + default: fatal("Unimplemented: %s", Bytecodes::name(bytecode)); + } + methodHandle resolved_method(THREAD, call_info.resolved_method()); + guarantee(resolved_method->method_holder()->is_linked(), ""); + update_invoke_cp_cache_entry(call_info, bytecode, resolved_method, pool, method_index); + } else { + // FIXME: why a shared class is not linked yet? + // Can't link it here since there are no guarantees it'll be prelinked on the next run. + ResourceMark rm; + InstanceKlass* resolved_iklass = InstanceKlass::cast(link_info.resolved_klass()); + log_info(cds, resolve)("Not resolved: class not linked: %s %s %s", + resolved_iklass->is_shared() ? "is_shared" : "", + resolved_iklass->init_state_name(), + resolved_iklass->external_name()); + } +} // First time execution: Resolve symbols, create a permanent MethodType object. void InterpreterRuntime::resolve_invokehandle(JavaThread* current) { diff --git a/src/hotspot/share/interpreter/interpreterRuntime.hpp b/src/hotspot/share/interpreter/interpreterRuntime.hpp index 3a8db1363df5b..61041694fc643 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.hpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.hpp @@ -92,9 +92,11 @@ class InterpreterRuntime: AllStatic { static void resolve_from_cache(JavaThread* current, Bytecodes::Code bytecode); - // Used by ClassListParser. + // Used by ClassPrelinker static void resolve_get_put(Bytecodes::Code bytecode, int field_index, methodHandle& m, constantPoolHandle& pool, bool initialize_holder, TRAPS); + static void cds_resolve_invoke(Bytecodes::Code bytecode, int method_index, + constantPoolHandle& pool, TRAPS); private: // Statics & fields @@ -105,6 +107,9 @@ class InterpreterRuntime: AllStatic { static void resolve_invokehandle (JavaThread* current); static void resolve_invokedynamic(JavaThread* current); + static void update_invoke_cp_cache_entry(CallInfo& info, Bytecodes::Code bytecode, + methodHandle& resolved_method, + constantPoolHandle& pool, int method_index); public: // Synchronization static void monitorenter(JavaThread* current, BasicObjectLock* elem); diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp index 2c7decfa714a2..cadc3e8a2e802 100644 --- a/src/hotspot/share/interpreter/linkResolver.cpp +++ b/src/hotspot/share/interpreter/linkResolver.cpp @@ -142,7 +142,9 @@ void CallInfo::set_common(Klass* resolved_klass, CallKind kind, int index, TRAPS) { - assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond"); + if (selected_method.not_null()) { + assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond"); + } _resolved_klass = resolved_klass; _resolved_method = resolved_method; _selected_method = selected_method; @@ -151,7 +153,9 @@ void CallInfo::set_common(Klass* resolved_klass, _resolved_appendix = Handle(); DEBUG_ONLY(verify()); // verify before making side effects - CompilationPolicy::compile_if_required(selected_method, THREAD); + if (selected_method.not_null()) { + CompilationPolicy::compile_if_required(selected_method, THREAD); + } } // utility query for unreflecting a method @@ -1152,6 +1156,10 @@ void LinkResolver::resolve_special_call(CallInfo& result, runtime_resolve_special_method(result, link_info, methodHandle(THREAD, resolved_method), recv, CHECK); } +void LinkResolver::cds_resolve_special_call(CallInfo& result, const LinkInfo& link_info, TRAPS) { + resolve_special_call(result, Handle(), link_info, CHECK); +} + // throws linktime exceptions Method* LinkResolver::linktime_resolve_special_method(const LinkInfo& link_info, TRAPS) { @@ -1333,7 +1341,17 @@ void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, Klass* re runtime_resolve_virtual_method(result, methodHandle(THREAD, resolved_method), link_info.resolved_klass(), recv, receiver_klass, - check_null_and_abstract, CHECK); + check_null_and_abstract, + /*is_abstract_interpretation*/ false, CHECK); +} + +void LinkResolver::cds_resolve_virtual_call(CallInfo& result, const LinkInfo& link_info, TRAPS) { + Method* resolved_method = linktime_resolve_virtual_method(link_info, CHECK); + runtime_resolve_virtual_method(result, methodHandle(THREAD, resolved_method), + link_info.resolved_klass(), + Handle(), nullptr, + /*check_null_and_abstract*/ false, + /*is_abstract_interpretation*/ true, CHECK); } // throws linktime exceptions @@ -1385,7 +1403,11 @@ void LinkResolver::runtime_resolve_virtual_method(CallInfo& result, Handle recv, Klass* recv_klass, bool check_null_and_abstract, + bool is_abstract_interpretation, TRAPS) { + // is_abstract_interpretation is true IFF CDS is resolving method references without + // running any actual bytecode. Therefore, we don't have an actual recv/recv_klass, so + // we cannot check the actual selected_method (which is not needed by CDS anyway). // setup default return values int vtable_index = Method::invalid_vtable_index; @@ -1406,7 +1428,9 @@ void LinkResolver::runtime_resolve_virtual_method(CallInfo& result, vtable_index = vtable_index_of_interface_method(resolved_klass, resolved_method); assert(vtable_index >= 0 , "we should have valid vtable index at this point"); - selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index)); + if (!is_abstract_interpretation) { + selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index)); + } } else { // at this point we are sure that resolved_method is virtual and not // a default or miranda method; therefore, it must have a valid vtable index. @@ -1420,31 +1444,40 @@ void LinkResolver::runtime_resolve_virtual_method(CallInfo& result, // resolved method, and it can never be changed by an override. if (vtable_index == Method::nonvirtual_vtable_index) { assert(resolved_method->can_be_statically_bound(), "cannot override this method"); - selected_method = resolved_method; + if (!is_abstract_interpretation) { + selected_method = resolved_method; + } } else { - selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index)); + if (!is_abstract_interpretation) { + selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index)); + } } } - // check if method exists - if (selected_method.is_null()) { - throw_abstract_method_error(resolved_method, recv_klass, CHECK); - } + if (!is_abstract_interpretation) { + // check if method exists + if (selected_method.is_null()) { + throw_abstract_method_error(resolved_method, recv_klass, CHECK); + } - // check if abstract - if (check_null_and_abstract && selected_method->is_abstract()) { - // Pass arguments for generating a verbose error message. - throw_abstract_method_error(resolved_method, selected_method, recv_klass, CHECK); - } + // check if abstract + if (check_null_and_abstract && selected_method->is_abstract()) { + // Pass arguments for generating a verbose error message. + throw_abstract_method_error(resolved_method, selected_method, recv_klass, CHECK); + } - if (log_develop_is_enabled(Trace, vtables)) { - trace_method_resolution("invokevirtual selected method: receiver-class:", - recv_klass, resolved_klass, selected_method(), - false, vtable_index); + if (log_develop_is_enabled(Trace, vtables)) { + trace_method_resolution("invokevirtual selected method: receiver-class:", + recv_klass, resolved_klass, selected_method(), + false, vtable_index); + } } + // setup result result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK); - JFR_ONLY(Jfr::on_resolution(result, CHECK);) + if (selected_method.not_null()) { + JFR_ONLY(Jfr::on_resolution(result, CHECK);) + } } void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass* recv_klass, @@ -1454,7 +1487,16 @@ void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass* Method* resolved_method = linktime_resolve_interface_method(link_info, CHECK); methodHandle mh(THREAD, resolved_method); runtime_resolve_interface_method(result, mh, link_info.resolved_klass(), - recv, recv_klass, check_null_and_abstract, CHECK); + recv, recv_klass, check_null_and_abstract, + /*is_abstract_interpretation*/ false, CHECK); +} + +void LinkResolver::cds_resolve_interface_call(CallInfo& result, const LinkInfo& link_info, TRAPS) { + Method* resolved_method = linktime_resolve_interface_method(link_info, CHECK); + runtime_resolve_interface_method(result, methodHandle(THREAD, resolved_method), link_info.resolved_klass(), + Handle(), nullptr, + /*check_null_and_abstract*/ false, + /*is_abstract_interpretation*/ true, CHECK); } Method* LinkResolver::linktime_resolve_interface_method(const LinkInfo& link_info, @@ -1473,7 +1515,9 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result, Klass* resolved_klass, Handle recv, Klass* recv_klass, - bool check_null_and_abstract, TRAPS) { + bool check_null_and_abstract, + bool is_abstract_interpretation, TRAPS) { + // is_abstract_interpretation -- see comments in runtime_resolve_virtual_method() // check if receiver exists if (check_null_and_abstract && recv.is_null()) { @@ -1481,7 +1525,7 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result, } // check if receiver klass implements the resolved interface - if (!recv_klass->is_subtype_of(resolved_klass)) { + if (!is_abstract_interpretation && !recv_klass->is_subtype_of(resolved_klass)) { ResourceMark rm(THREAD); char buf[200]; jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s", @@ -1490,10 +1534,14 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result, THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); } - methodHandle selected_method = resolved_method; + methodHandle selected_method; + + if (!is_abstract_interpretation) { + selected_method = resolved_method; + } // resolve the method in the receiver class, unless it is private - if (!resolved_method()->is_private()) { + if (!is_abstract_interpretation && !resolved_method()->is_private()) { // do lookup based on receiver klass // This search must match the linktime preparation search for itable initialization // to correctly enforce loader constraints for interface method inheritance. @@ -1539,7 +1587,7 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result, if (resolved_method->has_vtable_index()) { int vtable_index = resolved_method->vtable_index(); log_develop_trace(itables)(" -- vtable index: %d", vtable_index); - assert(vtable_index == selected_method->vtable_index(), "sanity check"); + assert(is_abstract_interpretation || vtable_index == selected_method->vtable_index(), "sanity check"); result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK); } else if (resolved_method->has_itable_index()) { int itable_index = resolved_method()->itable_index(); @@ -1556,7 +1604,9 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result, // This sets up the nonvirtual form of "virtual" call (as needed for final and private methods) result.set_virtual(resolved_klass, resolved_method, resolved_method, index, CHECK); } - JFR_ONLY(Jfr::on_resolution(result, CHECK);) + if (!is_abstract_interpretation) { + JFR_ONLY(Jfr::on_resolution(result, CHECK);) + } } diff --git a/src/hotspot/share/interpreter/linkResolver.hpp b/src/hotspot/share/interpreter/linkResolver.hpp index 80f5d23005241..340c7d412d599 100644 --- a/src/hotspot/share/interpreter/linkResolver.hpp +++ b/src/hotspot/share/interpreter/linkResolver.hpp @@ -242,13 +242,15 @@ class LinkResolver: AllStatic { Klass* resolved_klass, Handle recv, Klass* recv_klass, - bool check_null_and_abstract, TRAPS); + bool check_null_and_abstract, + bool is_abstract_interpretation, TRAPS); static void runtime_resolve_interface_method (CallInfo& result, const methodHandle& resolved_method, Klass* resolved_klass, Handle recv, Klass* recv_klass, - bool check_null_and_abstract, TRAPS); + bool check_null_and_abstract, + bool is_abstract_interpretation, TRAPS); static bool resolve_previously_linked_invokehandle(CallInfo& result, const LinkInfo& link_info, @@ -325,6 +327,10 @@ class LinkResolver: AllStatic { static void resolve_dynamic_call (CallInfo& result, BootstrapInfo& bootstrap_specifier, TRAPS); + static void cds_resolve_virtual_call (CallInfo& result, const LinkInfo& link_info, TRAPS); + static void cds_resolve_interface_call(CallInfo& result, const LinkInfo& link_info, TRAPS); + static void cds_resolve_special_call (CallInfo& result, const LinkInfo& link_info, TRAPS); + // same as above for compile-time resolution; but returns null handle instead of throwing // an exception on error also, does not initialize klass (i.e., no side effects) static Method* resolve_virtual_call_or_null(Klass* receiver_klass, diff --git a/src/hotspot/share/oops/cpCache.cpp b/src/hotspot/share/oops/cpCache.cpp index 95c3b8edaf5e1..817a35959f348 100644 --- a/src/hotspot/share/oops/cpCache.cpp +++ b/src/hotspot/share/oops/cpCache.cpp @@ -46,6 +46,7 @@ #include "oops/compressedOops.hpp" #include "oops/constantPool.inline.hpp" #include "oops/cpCache.inline.hpp" +#include "oops/method.inline.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/resolvedFieldEntry.hpp" @@ -408,9 +409,7 @@ void ConstantPoolCache::remove_unshareable_info() { remove_resolved_field_entries_if_non_deterministic(); } if (_resolved_method_entries != nullptr) { - for (int i = 0; i < _resolved_method_entries->length(); i++) { - resolved_method_entry_at(i)->remove_unshareable_info(); - } + remove_resolved_method_entries_if_non_deterministic(); } } @@ -448,6 +447,96 @@ void ConstantPoolCache::remove_resolved_field_entries_if_non_deterministic() { ArchiveBuilder::alloc_stats()->record_field_cp_entry(archived, resolved && !archived); } } + +void ConstantPoolCache::remove_resolved_method_entries_if_non_deterministic() { + ConstantPool* cp = constant_pool(); + ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(cp); + for (int i = 0; i < _resolved_method_entries->length(); i++) { + ResolvedMethodEntry* rme = _resolved_method_entries->adr_at(i); + int cp_index = rme->constant_pool_index(); + bool archived = false; + bool resolved = rme->is_resolved(Bytecodes::_invokevirtual) || + rme->is_resolved(Bytecodes::_invokespecial) || + rme->is_resolved(Bytecodes::_invokeinterface); + + // Just for safety -- this should not happen, but do not archive if we ever see this. + resolved &= !(rme->is_resolved(Bytecodes::_invokehandle) || + rme->is_resolved(Bytecodes::_invokestatic)); + + if (resolved && can_archive_resolved_method(rme)) { + rme->mark_and_relocate(src_cp); + archived = true; + } else { + rme->remove_unshareable_info(); + } + if (resolved) { + LogStreamHandle(Trace, cds, resolve) log; + if (log.is_enabled()) { + ResourceMark rm; + int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); + Symbol* klass_name = cp->klass_name_at(klass_cp_index); + Symbol* name = cp->uncached_name_ref_at(cp_index); + Symbol* signature = cp->uncached_signature_ref_at(cp_index); + log.print("%s%s method CP entry [%3d]: %s %s.%s:%s", + (archived ? "archived" : "reverted"), + (rme->is_resolved(Bytecodes::_invokeinterface) ? " interface" : ""), + cp_index, + cp->pool_holder()->name()->as_C_string(), + klass_name->as_C_string(), name->as_C_string(), signature->as_C_string()); + if (archived) { + Klass* resolved_klass = cp->resolved_klass_at(klass_cp_index); + log.print(" => %s%s", + resolved_klass->name()->as_C_string(), + (rme->is_resolved(Bytecodes::_invokestatic) ? " *** static" : "")); + } + } + ArchiveBuilder::alloc_stats()->record_method_cp_entry(archived, resolved && !archived); + } + } +} + +bool ConstantPoolCache::can_archive_resolved_method(ResolvedMethodEntry* method_entry) { + InstanceKlass* pool_holder = constant_pool()->pool_holder(); + if (!(pool_holder->is_shared_boot_class() || pool_holder->is_shared_platform_class() || + pool_holder->is_shared_app_class())) { + // Archiving resolved cp entries for classes from non-builtin loaders + // is not yet supported. + return false; + } + + if (CDSConfig::is_dumping_dynamic_archive()) { + // InstanceKlass::methods() has been resorted. We need to + // update the vtable_index in method_entry (not implemented) + return false; + } + + if (!method_entry->is_resolved(Bytecodes::_invokevirtual)) { + if (method_entry->method() == nullptr) { + return false; + } + if (method_entry->method()->is_continuation_native_intrinsic()) { + return false; // FIXME: corresponding stub is generated on demand during method resolution (see LinkResolver::resolve_static_call). + } + } + + int cp_index = method_entry->constant_pool_index(); + ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(constant_pool()); + assert(src_cp->tag_at(cp_index).is_method() || src_cp->tag_at(cp_index).is_interface_method(), "sanity"); + + if (!ClassPrelinker::is_resolution_deterministic(src_cp, cp_index)) { + return false; + } + + if (method_entry->is_resolved(Bytecodes::_invokeinterface) || + method_entry->is_resolved(Bytecodes::_invokevirtual) || + method_entry->is_resolved(Bytecodes::_invokespecial)) { + return true; + } else { + // invokestatic and invokehandle are not supported yet. + return false; + } + +} #endif // INCLUDE_CDS void ConstantPoolCache::deallocate_contents(ClassLoaderData* data) { diff --git a/src/hotspot/share/oops/cpCache.hpp b/src/hotspot/share/oops/cpCache.hpp index 1f91b194623eb..c741201c8332d 100644 --- a/src/hotspot/share/oops/cpCache.hpp +++ b/src/hotspot/share/oops/cpCache.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -224,6 +224,8 @@ class ConstantPoolCache: public MetaspaceObj { #if INCLUDE_CDS void remove_resolved_field_entries_if_non_deterministic(); + void remove_resolved_method_entries_if_non_deterministic(); + bool can_archive_resolved_method(ResolvedMethodEntry* method_entry); #endif // RedefineClasses support diff --git a/src/hotspot/share/oops/resolvedMethodEntry.hpp b/src/hotspot/share/oops/resolvedMethodEntry.hpp index e84452236006a..8f49608127fbe 100644 --- a/src/hotspot/share/oops/resolvedMethodEntry.hpp +++ b/src/hotspot/share/oops/resolvedMethodEntry.hpp @@ -82,6 +82,21 @@ class ResolvedMethodEntry { bool _has_table_index; #endif + void copy_from(const ResolvedMethodEntry& other) { + _method = other._method; + _entry_specific = other._entry_specific; + _cpool_index = other._cpool_index; + _number_of_parameters = other._number_of_parameters; + _tos_state = other._tos_state; + _flags = other._flags; + _bytecode1 = other._bytecode1; + _bytecode2 = other._bytecode2; +#ifdef ASSERT + _has_interface_klass = other._has_interface_klass; + _has_table_index = other._has_table_index; +#endif + } + // Constructors public: ResolvedMethodEntry(u2 cpi) : @@ -99,6 +114,16 @@ class ResolvedMethodEntry { ResolvedMethodEntry() : ResolvedMethodEntry(0) {} + ResolvedMethodEntry(const ResolvedMethodEntry& other) { + copy_from(other); + } + + ResolvedMethodEntry& operator=(const ResolvedMethodEntry& other) { + copy_from(other); + return *this; + } + + // Bit shift to get flags enum { is_vfinal_shift = 0, diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java index 96744b546a8d4..474fa65d6ea08 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java @@ -54,6 +54,8 @@ public static void main(String[] args) throws Exception { "-cp", appJar, "-Xlog:cds+resolve=trace"); CDSTestUtils.createArchiveAndCheck(opts) + // Class References --- + // Always resolve reference when a class references itself .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsApp app => ResolvedConstantsApp app") @@ -70,6 +72,8 @@ public static void main(String[] args) throws Exception { // class yet (i.e., there's no initiaited class entry for System in the app loader's dictionary) .shouldMatch("cds,resolve.*reverted klass.* ResolvedConstantsApp .*java/lang/System") + // Field References --- + // Always resolve references to fields in the current class or super class(es) .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsBar => ResolvedConstantsBar.b:I") .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsBar => ResolvedConstantsBar.a:I") @@ -80,11 +84,45 @@ public static void main(String[] args) throws Exception { .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsFoo ResolvedConstantsBar.a:I") .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsFoo ResolvedConstantsBar.b:I") - // Do not resolve field references to unrelated classes .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsApp ResolvedConstantsBar.a:I") .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsApp ResolvedConstantsBar.b:I") + // Method References --- + + // Should resolve references to own constructor + .shouldMatch("cds,resolve.*archived method .* ResolvedConstantsApp ResolvedConstantsApp.<init>:") + // Should resolve references to super constructor + .shouldMatch("cds,resolve.*archived method .* ResolvedConstantsApp java/lang/Object.<init>:") + + // Should resolve interface methods in VM classes + .shouldMatch("cds,resolve.*archived interface method .* ResolvedConstantsApp java/lang/Runnable.run:") + + // Should resolve references to own non-static method (private or public) + .shouldMatch("archived method.*: ResolvedConstantsBar ResolvedConstantsBar.doBar:") + .shouldMatch("archived method.*: ResolvedConstantsApp ResolvedConstantsApp.privateInstanceCall:") + .shouldMatch("archived method.*: ResolvedConstantsApp ResolvedConstantsApp.publicInstanceCall:") + + // Should not resolve references to static method + .shouldNotMatch(" archived method CP entry.*: ResolvedConstantsApp ResolvedConstantsApp.staticCall:") + + // Should resolve references to method in super type + .shouldMatch(" archived method CP entry.*: ResolvedConstantsBar ResolvedConstantsFoo.doBar:") + + // App class cannot resolve references to methods in boot classes: + // When the app class loader tries to resolve a class X that's normally loaded by + // the boot loader, it's possible for the app class loader to get a different copy of + // X (by using MethodHandles.Lookup.defineClass(), etc). Therefore, let's be on + // the side of safety and revert all such references. + // + // This will be addressed in JDK-8315737. + .shouldMatch("reverted method.*: ResolvedConstantsApp java/io/PrintStream.println:") + .shouldMatch("reverted method.*: ResolvedConstantsBar java/lang/Class.getName:") + + // Should not resolve methods in unrelated classes. + .shouldMatch("reverted method.*: ResolvedConstantsApp ResolvedConstantsBar.doit:") + + // End --- ; } } @@ -92,7 +130,11 @@ public static void main(String[] args) throws Exception { class ResolvedConstantsApp implements Runnable { public static void main(String args[]) { System.out.println("Hello ResolvedConstantsApp"); - Object a = new ResolvedConstantsApp(); + ResolvedConstantsApp app = new ResolvedConstantsApp(); + ResolvedConstantsApp.staticCall(); + app.privateInstanceCall(); + app.publicInstanceCall(); + Object a = app; ((Runnable)a).run(); ResolvedConstantsFoo foo = new ResolvedConstantsFoo(); @@ -101,6 +143,10 @@ public static void main(String args[]) { bar.b ++; bar.doit(); } + private static void staticCall() {} + private void privateInstanceCall() {} + public void publicInstanceCall() {} + public void run() {} } @@ -124,5 +170,7 @@ void doit() { System.out.println("b = " + b); doBar(this); + + ((ResolvedConstantsFoo)this).doBar(this); } } From 3b1ca986427d3a69c9e167b9b4c07d1b83bc264d Mon Sep 17 00:00:00 2001 From: Vladimir Petko <vpetko@openjdk.org> Date: Thu, 27 Jun 2024 20:27:51 +0000 Subject: [PATCH 224/471] 8334895: OpenJDK fails to configure on linux aarch64 when CDS is disabled after JDK-8331942 Reviewed-by: erikj --- make/autoconf/jdk-options.m4 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/make/autoconf/jdk-options.m4 b/make/autoconf/jdk-options.m4 index 0dca5d133131f..54ead5ec1d760 100644 --- a/make/autoconf/jdk-options.m4 +++ b/make/autoconf/jdk-options.m4 @@ -197,9 +197,8 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_OPTIONS], # three different page sizes: 4K, 64K, and if run on Mac m1 hardware, 16K. COMPATIBLE_CDS_ALIGNMENT_DEFAULT=false if test "x$OPENJDK_TARGET_OS" = "xlinux" && test "x$OPENJDK_TARGET_CPU" = "xaarch64"; then - COMPATIBLE_CDS_ALIGNMENT_DEFAULT=true + COMPATIBLE_CDS_ALIGNMENT_DEFAULT=auto fi - AC_SUBST(COMPATIBLE_CDS_ALIGNMENT_DEFAULT) # Compress jars COMPRESS_JARS=false @@ -672,7 +671,7 @@ AC_DEFUN([JDKOPT_ENABLE_DISABLE_COMPATIBLE_CDS_ALIGNMENT], UTIL_ARG_ENABLE(NAME: compatible-cds-alignment, DEFAULT: $COMPATIBLE_CDS_ALIGNMENT_DEFAULT, RESULT: ENABLE_COMPATIBLE_CDS_ALIGNMENT, DESC: [enable use alternative compatible cds core region alignment], - DEFAULT_DESC: [disabled], + DEFAULT_DESC: [disabled except on linux-aarch64], CHECKING_MSG: [if compatible cds region alignment enabled], CHECK_AVAILABLE: [ AC_MSG_CHECKING([if CDS archive is available]) From 4e8cbf884ab1eee9c3110712ab62edc706e948ba Mon Sep 17 00:00:00 2001 From: Chris Plummer <cjplummer@openjdk.org> Date: Thu, 27 Jun 2024 22:20:14 +0000 Subject: [PATCH 225/471] 8335134: Test com/sun/jdi/BreakpointOnClassPrepare.java timeout Reviewed-by: kevinw, coleenp --- test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java b/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java index f4f1427e39b24..deffffc0fa85a 100644 --- a/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java +++ b/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java @@ -104,7 +104,15 @@ public static void main(String[] args) throws Exception { public void breakpointReached(BreakpointEvent event) { bkptCount++; - System.out.println("Got BreakpointEvent: " + bkptCount + " for thread " + event.thread()); + String threadInfo; + try { + threadInfo = event.thread().toString(); + } catch (ObjectCollectedException e) { + // It's possible the Thread already terminated and was collected + // if the SUSPEND_NONE policy was used. + threadInfo = "(thread collected)"; + } + System.out.println("Got BreakpointEvent: " + bkptCount + " for thread " + threadInfo); } public void vmDisconnected(VMDisconnectEvent event) { From cd46c87dc916b2b74067accf80c62df1792f74cf Mon Sep 17 00:00:00 2001 From: Gui Cao <gcao@openjdk.org> Date: Fri, 28 Jun 2024 01:44:14 +0000 Subject: [PATCH 226/471] 8334843: RISC-V: Fix wraparound checking for r_array_index in lookup_secondary_supers_table_slow_path Reviewed-by: fyang --- src/hotspot/cpu/riscv/macroAssembler_riscv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index e889c26e5f419..0e6a9099265ce 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -3799,7 +3799,7 @@ void MacroAssembler::lookup_secondary_supers_table_slow_path(Register r_super_kl // Check for wraparound. Label skip; - bge(r_array_length, r_array_index, skip); + blt(r_array_index, r_array_length, skip); mv(r_array_index, zr); bind(skip); From b4df380f1a4587247a843fe28ae041265f7cfc29 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil <jkratochvil@openjdk.org> Date: Fri, 28 Jun 2024 03:07:09 +0000 Subject: [PATCH 227/471] 8334763: --enable-asan: assert(_thread->is_in_live_stack((address)this)) failed: not on stack? Reviewed-by: kbarrett, stuefe, erikj --- make/autoconf/jdk-options.m4 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/make/autoconf/jdk-options.m4 b/make/autoconf/jdk-options.m4 index 54ead5ec1d760..76e95127f7393 100644 --- a/make/autoconf/jdk-options.m4 +++ b/make/autoconf/jdk-options.m4 @@ -437,12 +437,23 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_ADDRESS_SANITIZER], # It's harmless to be suppressed in clang as well. ASAN_CFLAGS="-fsanitize=address -Wno-stringop-truncation -fno-omit-frame-pointer -fno-common -DADDRESS_SANITIZER" ASAN_LDFLAGS="-fsanitize=address" + # detect_stack_use_after_return causes ASAN to offload stack-local + # variables to c-heap and therefore breaks assumptions in hotspot + # that rely on data (e.g. Marks) living in thread stacks. + if test "x$TOOLCHAIN_TYPE" = "xgcc"; then + ASAN_CFLAGS="$ASAN_CFLAGS --param asan-use-after-return=0" + fi + if test "x$TOOLCHAIN_TYPE" = "xclang"; then + ASAN_CFLAGS="$ASAN_CFLAGS -fsanitize-address-use-after-return=never" + fi elif test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then # -Oy- is equivalent to -fno-omit-frame-pointer in GCC/Clang. ASAN_CFLAGS="-fsanitize=address -Oy- -DADDRESS_SANITIZER" # MSVC produces a warning if you pass -fsanitize=address to the linker. It also complains $ if -DEBUG is not passed to the linker when building with ASan. ASAN_LDFLAGS="-debug" + # -fsanitize-address-use-after-return is off by default in MS Visual Studio 22 (19.37.32824). + # cl : Command line warning D9002 : ignoring unknown option '-fno-sanitize-address-use-after-return' fi JVM_CFLAGS="$JVM_CFLAGS $ASAN_CFLAGS" JVM_LDFLAGS="$JVM_LDFLAGS $ASAN_LDFLAGS" From 308a81238362c39f5b18e2ae8444c96420ef297a Mon Sep 17 00:00:00 2001 From: Evgeny Nikitin <enikitin@openjdk.org> Date: Fri, 28 Jun 2024 04:42:33 +0000 Subject: [PATCH 228/471] 8334645: Un-problemlist vmTestbase/nsk/sysdict/vm/stress/chain/chain007/chain007.java Reviewed-by: thartmann, lmesnik --- test/hotspot/jtreg/ProblemList-generational-zgc.txt | 2 -- test/hotspot/jtreg/ProblemList-zgc.txt | 2 -- 2 files changed, 4 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList-generational-zgc.txt b/test/hotspot/jtreg/ProblemList-generational-zgc.txt index 4d5e985c0a677..db8182641ac54 100644 --- a/test/hotspot/jtreg/ProblemList-generational-zgc.txt +++ b/test/hotspot/jtreg/ProblemList-generational-zgc.txt @@ -115,5 +115,3 @@ serviceability/sa/sadebugd/RunCommandOnServerTest.java 8307393 generic- serviceability/sa/sadebugd/SADebugDTest.java 8307393 generic-all vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java 8289582 windows-x64 - -vmTestbase/nsk/sysdict/vm/stress/chain/chain007/chain007.java 8298991 linux-x64 diff --git a/test/hotspot/jtreg/ProblemList-zgc.txt b/test/hotspot/jtreg/ProblemList-zgc.txt index d7d600aad490c..1afe56c99f8af 100644 --- a/test/hotspot/jtreg/ProblemList-zgc.txt +++ b/test/hotspot/jtreg/ProblemList-zgc.txt @@ -46,5 +46,3 @@ serviceability/sa/TestSysProps.java 8302055 generic- serviceability/sa/TestHeapDumpForInvokeDynamic.java 8315646 generic-all vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java 8289582 windows-x64 - -vmTestbase/nsk/sysdict/vm/stress/chain/chain007/chain007.java 8298991 linux-x64 From c47a0e005e54551e42ee1ae33d7169417a5f86d4 Mon Sep 17 00:00:00 2001 From: Xiaolong Peng <xpeng@openjdk.org> Date: Fri, 28 Jun 2024 06:19:37 +0000 Subject: [PATCH 229/471] 8334147: Shenandoah: Avoid taking lock for disabled free set logging Reviewed-by: shade, ysr --- .../gc/shenandoah/shenandoahConcurrentGC.cpp | 5 +---- .../gc/shenandoah/shenandoahControlThread.cpp | 22 +++++++------------ .../share/gc/shenandoah/shenandoahFreeSet.cpp | 10 +++++++++ .../share/gc/shenandoah/shenandoahFreeSet.hpp | 6 ++++- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp index 44ccac467fe85..aea0af2457500 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp @@ -153,10 +153,7 @@ bool ShenandoahConcurrentGC::collect(GCCause::Cause cause) { // the space. This would be the last action if there is nothing to evacuate. entry_cleanup_early(); - { - ShenandoahHeapLocker locker(heap->lock()); - heap->free_set()->log_status(); - } + heap->free_set()->log_status_under_lock(); // Perform concurrent class unloading if (heap->unload_classes() && diff --git a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp index 4f71135084465..e538ca024678f 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp @@ -147,10 +147,7 @@ void ShenandoahControlThread::run_service() { heap->set_forced_counters_update(true); // If GC was requested, we better dump freeset data for performance debugging - { - ShenandoahHeapLocker locker(heap->lock()); - heap->free_set()->log_status(); - } + heap->free_set()->log_status_under_lock(); switch (mode) { case concurrent_normal: @@ -178,18 +175,15 @@ void ShenandoahControlThread::run_service() { // Report current free set state at the end of cycle, whether // it is a normal completion, or the abort. - { - ShenandoahHeapLocker locker(heap->lock()); - heap->free_set()->log_status(); + heap->free_set()->log_status_under_lock(); - // Notify Universe about new heap usage. This has implications for - // global soft refs policy, and we better report it every time heap - // usage goes down. - heap->update_capacity_and_used_at_gc(); + // Notify Universe about new heap usage. This has implications for + // global soft refs policy, and we better report it every time heap + // usage goes down. + heap->update_capacity_and_used_at_gc(); - // Signal that we have completed a visit to all live objects. - heap->record_whole_heap_examined_timestamp(); - } + // Signal that we have completed a visit to all live objects. + heap->record_whole_heap_examined_timestamp(); // Disable forced counters update, and update counters one more time // to capture the state at the end of GC session. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp index c11d7e814e4e0..258dfe17b736e 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp @@ -1130,6 +1130,16 @@ void ShenandoahFreeSet::reserve_regions(size_t to_reserve) { } } +void ShenandoahFreeSet::log_status_under_lock() { + // Must not be heap locked, it acquires heap lock only when log is enabled + shenandoah_assert_not_heaplocked(); + if (LogTarget(Info, gc, free)::is_enabled() + DEBUG_ONLY(|| LogTarget(Debug, gc, free)::is_enabled())) { + ShenandoahHeapLocker locker(_heap->lock()); + log_status(); + } +} + void ShenandoahFreeSet::log_status() { shenandoah_assert_heaplocked(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp index e2852e5548cf3..e4789d48f802e 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp @@ -318,6 +318,9 @@ class ShenandoahFreeSet : public CHeapObj<mtGC> { void finish_rebuild(size_t cset_regions); + // log status, assuming lock has already been acquired by the caller. + void log_status(); + public: ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions); @@ -340,7 +343,8 @@ class ShenandoahFreeSet : public CHeapObj<mtGC> { void move_regions_from_collector_to_mutator(size_t cset_regions); void recycle_trash(); - void log_status(); + // Acquire heap lock and log status, assuming heap lock is not acquired by the caller. + void log_status_under_lock(); inline size_t capacity() const { return _partitions.capacity_of(ShenandoahFreeSetPartitionId::Mutator); } inline size_t used() const { return _partitions.used_by(ShenandoahFreeSetPartitionId::Mutator); } From d457609f700bbb1fed233f1a04501c995852e5ac Mon Sep 17 00:00:00 2001 From: Amit Kumar <amitkumar@openjdk.org> Date: Fri, 28 Jun 2024 06:43:32 +0000 Subject: [PATCH 230/471] 8319947: Recursive lightweight locking: s390x implementation Reviewed-by: aboldtch, lucy --- .../cpu/s390/c1_MacroAssembler_s390.cpp | 14 +- .../cpu/s390/c2_MacroAssembler_s390.cpp | 13 +- .../cpu/s390/c2_MacroAssembler_s390.hpp | 8 +- src/hotspot/cpu/s390/interp_masm_s390.cpp | 28 +- src/hotspot/cpu/s390/macroAssembler_s390.cpp | 493 +++++++++++++++--- src/hotspot/cpu/s390/macroAssembler_s390.hpp | 6 +- src/hotspot/cpu/s390/s390.ad | 34 ++ src/hotspot/cpu/s390/sharedRuntime_s390.cpp | 18 +- src/hotspot/cpu/s390/vm_version_s390.hpp | 2 + 9 files changed, 489 insertions(+), 127 deletions(-) diff --git a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp index c35b092329781..13b080678217f 100644 --- a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp @@ -67,9 +67,6 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox verify_oop(Roop, FILE_AND_LINE); - // Load object header. - z_lg(Rmark, Address(Roop, hdr_offset)); - // Save object being locked into the BasicObjectLock... z_stg(Roop, Address(Rbox, BasicObjectLock::obj_offset())); @@ -85,6 +82,10 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox lightweight_lock(Roop, Rmark, tmp, slow_case); } else if (LockingMode == LM_LEGACY) { NearLabel done; + + // Load object header. + z_lg(Rmark, Address(Roop, hdr_offset)); + // and mark it as unlocked. z_oill(Rmark, markWord::unlocked_value); // Save unlocked object header into the displaced header location on the stack. @@ -141,12 +142,7 @@ void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rb verify_oop(Roop, FILE_AND_LINE); if (LockingMode == LM_LIGHTWEIGHT) { - const Register tmp = Z_R1_scratch; - z_lg(Rmark, Address(Roop, hdr_offset)); - z_lgr(tmp, Rmark); - z_nill(tmp, markWord::monitor_value); - branch_optimized(Assembler::bcondNotZero, slow_case); - lightweight_unlock(Roop, Rmark, tmp, slow_case); + lightweight_unlock(Roop, Rmark, Z_R1_scratch, slow_case); } else if (LockingMode == LM_LEGACY) { // Test if object header is pointing to the displaced header, and if so, restore // the displaced header in the object. If the object header is not pointing to diff --git a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp index 62c1bd943b69f..3641d82dabea9 100644 --- a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2017, 2022 SAP SE. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024 SAP SE. 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 @@ -33,6 +33,15 @@ #define BLOCK_COMMENT(str) block_comment(str) #define BIND(label) bind(label); BLOCK_COMMENT(#label ":") +void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Register temp1, Register temp2) { + compiler_fast_lock_lightweight_object(obj, temp1, temp2); +} + + +void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, Register temp1, Register temp2) { + compiler_fast_unlock_lightweight_object(obj, temp1, temp2); +} + //------------------------------------------------------ // Special String Intrinsics. Implementation //------------------------------------------------------ diff --git a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp index a502e41ee08ee..aecb483f0a611 100644 --- a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp +++ b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2017, 2022 SAP SE. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,10 @@ // C2_MacroAssembler contains high-level macros for C2 public: + // Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in s390.ad file. + void fast_lock_lightweight(Register obj, Register box, Register temp1, Register temp2); + void fast_unlock_lightweight(Register obj, Register box, Register temp1, Register temp2); + //------------------------------------------- // Special String Intrinsics Implementation. //------------------------------------------- diff --git a/src/hotspot/cpu/s390/interp_masm_s390.cpp b/src/hotspot/cpu/s390/interp_masm_s390.cpp index bc7996c270fa0..14bb98cea6ac3 100644 --- a/src/hotspot/cpu/s390/interp_masm_s390.cpp +++ b/src/hotspot/cpu/s390/interp_masm_s390.cpp @@ -1005,9 +1005,6 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) { // markWord header = obj->mark().set_unlocked(); - // Load markWord from object into header. - z_lg(header, hdr_offset, object); - if (DiagnoseSyncOnValueBasedClasses != 0) { load_klass(tmp, object); testbit(Address(tmp, Klass::access_flags_offset()), exact_log2(JVM_ACC_IS_VALUE_BASED_CLASS)); @@ -1015,9 +1012,12 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) { } if (LockingMode == LM_LIGHTWEIGHT) { - lightweight_lock(object, /* mark word */ header, tmp, slow_case); + lightweight_lock(object, header, tmp, slow_case); } else if (LockingMode == LM_LEGACY) { + // Load markWord from object into header. + z_lg(header, hdr_offset, object); + // Set header to be (markWord of object | UNLOCK_VALUE). // This will not change anything if it was unlocked before. z_oill(header, markWord::unlocked_value); @@ -1153,26 +1153,8 @@ void InterpreterMacroAssembler::unlock_object(Register monitor, Register object) // If we still have a lightweight lock, unlock the object and be done. if (LockingMode == LM_LIGHTWEIGHT) { - // Check for non-symmetric locking. This is allowed by the spec and the interpreter - // must handle it. - - Register tmp = current_header; - - // First check for lock-stack underflow. - z_lgf(tmp, Address(Z_thread, JavaThread::lock_stack_top_offset())); - compareU32_and_branch(tmp, (unsigned)LockStack::start_offset(), Assembler::bcondNotHigh, slow_case); - - // Then check if the top of the lock-stack matches the unlocked object. - z_aghi(tmp, -oopSize); - z_lg(tmp, Address(Z_thread, tmp)); - compare64_and_branch(tmp, object, Assembler::bcondNotEqual, slow_case); - - z_lg(header, Address(object, hdr_offset)); - z_lgr(tmp, header); - z_nill(tmp, markWord::monitor_value); - z_brne(slow_case); - lightweight_unlock(object, header, tmp, slow_case); + lightweight_unlock(object, header, current_header, slow_case); z_bru(done); } else { diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.cpp b/src/hotspot/cpu/s390/macroAssembler_s390.cpp index 275f4a8d832e3..66d6f25f0fd4a 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp @@ -3190,16 +3190,20 @@ void MacroAssembler::increment_counter_eq(address counter_address, Register tmp1 bind(l); } +// "The box" is the space on the stack where we copy the object mark. void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Register temp1, Register temp2) { + + assert(LockingMode != LM_LIGHTWEIGHT, "uses fast_lock_lightweight"); + assert_different_registers(oop, box, temp1, temp2); + Register displacedHeader = temp1; - Register currentHeader = temp1; - Register temp = temp2; + Register currentHeader = temp1; + Register temp = temp2; + NearLabel done, object_has_monitor; const int hdr_offset = oopDesc::mark_offset_in_bytes(); - assert_different_registers(temp1, temp2, oop, box); - BLOCK_COMMENT("compiler_fast_lock_object {"); // Load markWord from oop into mark. @@ -3207,8 +3211,10 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis if (DiagnoseSyncOnValueBasedClasses != 0) { load_klass(temp, oop); - testbit(Address(temp, Klass::access_flags_offset()), exact_log2(JVM_ACC_IS_VALUE_BASED_CLASS)); - z_btrue(done); + z_l(temp, Address(temp, Klass::access_flags_offset())); + assert((JVM_ACC_IS_VALUE_BASED_CLASS & 0xFFFF) == 0, "or change following instruction"); + z_nilh(temp, JVM_ACC_IS_VALUE_BASED_CLASS >> 16); + z_brne(done); } // Handle existing monitor. @@ -3222,7 +3228,8 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis // From loading the markWord, we know that oop != nullptr z_ltgr(oop, oop); z_bru(done); - } else if (LockingMode == LM_LEGACY) { + } else { + assert(LockingMode == LM_LEGACY, "must be"); // Set mark to markWord | markWord::unlocked_value. z_oill(displacedHeader, markWord::unlocked_value); @@ -3251,10 +3258,6 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis z_stg(currentHeader/*==0 or not 0*/, BasicLock::displaced_header_offset_in_bytes(), box); - z_bru(done); - } else { - assert(LockingMode == LM_LIGHTWEIGHT, "must be"); - lightweight_lock(oop, displacedHeader, temp, done); z_bru(done); } @@ -3270,10 +3273,9 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis // Otherwise, register zero is filled with the current owner. z_lghi(zero, 0); z_csg(zero, Z_thread, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner), monitor_tagged); - if (LockingMode != LM_LIGHTWEIGHT) { - // Store a non-null value into the box. - z_stg(box, BasicLock::displaced_header_offset_in_bytes(), box); - } + + // Store a non-null value into the box. + z_stg(box, BasicLock::displaced_header_offset_in_bytes(), box); z_bre(done); // acquired the lock for the first time. @@ -3295,14 +3297,16 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis } void MacroAssembler::compiler_fast_unlock_object(Register oop, Register box, Register temp1, Register temp2) { + + assert(LockingMode != LM_LIGHTWEIGHT, "uses fast_unlock_lightweight"); + assert_different_registers(oop, box, temp1, temp2); + Register displacedHeader = temp1; - Register currentHeader = temp2; - Register temp = temp1; + Register currentHeader = temp2; + Register temp = temp1; const int hdr_offset = oopDesc::mark_offset_in_bytes(); - assert_different_registers(temp1, temp2, oop, box); - Label done, object_has_monitor, not_recursive; BLOCK_COMMENT("compiler_fast_unlock_object {"); @@ -3326,18 +3330,14 @@ void MacroAssembler::compiler_fast_unlock_object(Register oop, Register box, Reg // Set NE to indicate 'failure' -> take slow-path z_ltgr(oop, oop); z_bru(done); - } else if (LockingMode == LM_LEGACY) { + } else { + assert(LockingMode == LM_LEGACY, "must be"); // Check if it is still a lightweight lock, this is true if we see // the stack address of the basicLock in the markWord of the object // copy box to currentHeader such that csg does not kill it. z_lgr(currentHeader, box); z_csg(currentHeader, displacedHeader, hdr_offset, oop); z_bru(done); // csg sets CR as desired. - } else { - assert(LockingMode == LM_LIGHTWEIGHT, "must be"); - - lightweight_unlock(oop, currentHeader, displacedHeader, done); - z_bru(done); } // In case of LM_LIGHTWEIGHT, we may reach here with (temp & ObjectMonitor::ANONYMOUS_OWNER) != 0. @@ -5705,103 +5705,426 @@ SkipIfEqual::~SkipIfEqual() { } // Implements lightweight-locking. -// Branches to slow upon failure to lock the object. -// Falls through upon success. -// // - obj: the object to be locked, contents preserved. -// - hdr: the header, already loaded from obj, contents destroyed. +// - temp1, temp2: temporary registers, contents destroyed. // Note: make sure Z_R1 is not manipulated here when C2 compiler is in play -void MacroAssembler::lightweight_lock(Register obj, Register hdr, Register temp, Label& slow_case) { +void MacroAssembler::lightweight_lock(Register obj, Register temp1, Register temp2, Label& slow) { assert(LockingMode == LM_LIGHTWEIGHT, "only used with new lightweight locking"); - assert_different_registers(obj, hdr, temp); + assert_different_registers(obj, temp1, temp2); + + Label push; + const Register top = temp1; + const Register mark = temp2; + const int mark_offset = oopDesc::mark_offset_in_bytes(); + const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset(); + + // Preload the markWord. It is important that this is the first + // instruction emitted as it is part of C1's null check semantics. + z_lg(mark, Address(obj, mark_offset)); + // First we need to check if the lock-stack has room for pushing the object reference. - z_lgf(temp, Address(Z_thread, JavaThread::lock_stack_top_offset())); + z_lgf(top, Address(Z_thread, ls_top_offset)); - compareU32_and_branch(temp, (unsigned)LockStack::end_offset()-1, bcondHigh, slow_case); + compareU32_and_branch(top, (unsigned)LockStack::end_offset(), bcondNotLow, slow); - // attempting a lightweight_lock - // Load (object->mark() | 1) into hdr - z_oill(hdr, markWord::unlocked_value); + // The underflow check is elided. The recursive check will always fail + // when the lock stack is empty because of the _bad_oop_sentinel field. - z_lgr(temp, hdr); + // Check for recursion: + z_aghi(top, -oopSize); + z_cg(obj, Address(Z_thread, top)); + z_bre(push); - // Clear lock-bits from hdr (locked state) - z_xilf(temp, markWord::unlocked_value); + // Check header for monitor (0b10). + z_tmll(mark, markWord::monitor_value); + branch_optimized(bcondNotAllZero, slow); - z_csg(hdr, temp, oopDesc::mark_offset_in_bytes(), obj); - branch_optimized(Assembler::bcondNotEqual, slow_case); + { // Try to lock. Transition lock bits 0b01 => 0b00 + const Register locked_obj = top; + z_oill(mark, markWord::unlocked_value); + z_lgr(locked_obj, mark); + // Clear lock-bits from locked_obj (locked state) + z_xilf(locked_obj, markWord::unlocked_value); + z_csg(mark, locked_obj, mark_offset, obj); + branch_optimized(Assembler::bcondNotEqual, slow); + } - // After successful lock, push object on lock-stack - z_lgf(temp, Address(Z_thread, JavaThread::lock_stack_top_offset())); - z_stg(obj, Address(Z_thread, temp)); - z_ahi(temp, oopSize); - z_st(temp, Address(Z_thread, JavaThread::lock_stack_top_offset())); + bind(push); - // as locking was successful, set CC to EQ - z_cr(temp, temp); + // After successful lock, push object on lock-stack + z_lgf(top, Address(Z_thread, ls_top_offset)); + z_stg(obj, Address(Z_thread, top)); + z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize); } // Implements lightweight-unlocking. -// Branches to slow upon failure. -// Falls through upon success. -// // - obj: the object to be unlocked -// - hdr: the (pre-loaded) header of the object, will be destroyed +// - temp1, temp2: temporary registers, will be destroyed // - Z_R1_scratch: will be killed in case of Interpreter & C1 Compiler -void MacroAssembler::lightweight_unlock(Register obj, Register hdr, Register tmp, Label& slow) { +void MacroAssembler::lightweight_unlock(Register obj, Register temp1, Register temp2, Label& slow) { assert(LockingMode == LM_LIGHTWEIGHT, "only used with new lightweight locking"); - assert_different_registers(obj, hdr, tmp); + assert_different_registers(obj, temp1, temp2); + + Label unlocked, push_and_slow; + const Register mark = temp1; + const Register top = temp2; + const int mark_offset = oopDesc::mark_offset_in_bytes(); + const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset(); #ifdef ASSERT - { - // Check that hdr is lightweight-locked. - Label hdr_ok; - z_lgr(tmp, hdr); - z_nill(tmp, markWord::lock_mask_in_place); - z_bre(hdr_ok); - stop("Header is not lightweight-locked"); - bind(hdr_ok); - } { // The following checks rely on the fact that LockStack is only ever modified by // its owning thread, even if the lock got inflated concurrently; removal of LockStack // entries after inflation will happen delayed in that case. // Check for lock-stack underflow. - Label stack_ok; - z_lgf(tmp, Address(Z_thread, JavaThread::lock_stack_top_offset())); - compareU32_and_branch(tmp, (unsigned)LockStack::start_offset(), Assembler::bcondHigh, stack_ok); + NearLabel stack_ok; + z_lgf(top, Address(Z_thread, ls_top_offset)); + compareU32_and_branch(top, (unsigned)LockStack::start_offset(), bcondNotLow, stack_ok); stop("Lock-stack underflow"); bind(stack_ok); } - { - // Check if the top of the lock-stack matches the unlocked object. - Label tos_ok; - z_aghi(tmp, -oopSize); - z_lg(tmp, Address(Z_thread, tmp)); - compare64_and_branch(tmp, obj, Assembler::bcondEqual, tos_ok); - stop("Top of lock-stack does not match the unlocked object"); - bind(tos_ok); +#endif // ASSERT + + // Check if obj is top of lock-stack. + z_lgf(top, Address(Z_thread, ls_top_offset)); + z_aghi(top, -oopSize); + z_cg(obj, Address(Z_thread, top)); + branch_optimized(bcondNotEqual, slow); + + // pop object from lock-stack +#ifdef ASSERT + const Register temp_top = temp1; // mark is not yet loaded, but be careful + z_agrk(temp_top, top, Z_thread); + z_xc(0, oopSize-1, temp_top, 0, temp_top); // wipe out lock-stack entry +#endif // ASSERT + z_alsi(in_bytes(ls_top_offset), Z_thread, -oopSize); // pop object + + // The underflow check is elided. The recursive check will always fail + // when the lock stack is empty because of the _bad_oop_sentinel field. + + // Check if recursive. (this is a check for the 2nd object on the stack) + z_aghi(top, -oopSize); + z_cg(obj, Address(Z_thread, top)); + branch_optimized(bcondEqual, unlocked); + + // Not recursive. Check header for monitor (0b10). + z_lg(mark, Address(obj, mark_offset)); + z_tmll(mark, markWord::monitor_value); + z_brnaz(push_and_slow); + +#ifdef ASSERT + // Check header not unlocked (0b01). + NearLabel not_unlocked; + z_tmll(mark, markWord::unlocked_value); + z_braz(not_unlocked); + stop("lightweight_unlock already unlocked"); + bind(not_unlocked); +#endif // ASSERT + + { // Try to unlock. Transition lock bits 0b00 => 0b01 + Register unlocked_obj = top; + z_lgr(unlocked_obj, mark); + z_oill(unlocked_obj, markWord::unlocked_value); + z_csg(mark, unlocked_obj, mark_offset, obj); + branch_optimized(Assembler::bcondEqual, unlocked); + } + + bind(push_and_slow); + + // Restore lock-stack and handle the unlock in runtime. + z_lgf(top, Address(Z_thread, ls_top_offset)); + DEBUG_ONLY(z_stg(obj, Address(Z_thread, top));) + z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize); + // set CC to NE + z_ltgr(obj, obj); // object shouldn't be null at this point + branch_optimized(bcondAlways, slow); + + bind(unlocked); +} + +void MacroAssembler::compiler_fast_lock_lightweight_object(Register obj, Register tmp1, Register tmp2) { + assert_different_registers(obj, tmp1, tmp2); + + // Handle inflated monitor. + NearLabel inflated; + // Finish fast lock successfully. MUST reach to with flag == NE + NearLabel locked; + // Finish fast lock unsuccessfully. MUST branch to with flag == EQ + NearLabel slow_path; + + if (DiagnoseSyncOnValueBasedClasses != 0) { + load_klass(tmp1, obj); + z_l(tmp1, Address(tmp1, Klass::access_flags_offset())); + assert((JVM_ACC_IS_VALUE_BASED_CLASS & 0xFFFF) == 0, "or change following instruction"); + z_nilh(tmp1, JVM_ACC_IS_VALUE_BASED_CLASS >> 16); + z_brne(slow_path); + } + + const Register mark = tmp1; + const int mark_offset = oopDesc::mark_offset_in_bytes(); + const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset(); + + BLOCK_COMMENT("compiler_fast_lightweight_locking {"); + { // lightweight locking + + // Push lock to the lock stack and finish successfully. MUST reach to with flag == EQ + NearLabel push; + + const Register top = tmp2; + + // Check if lock-stack is full. + z_lgf(top, Address(Z_thread, ls_top_offset)); + compareU32_and_branch(top, (unsigned) LockStack::end_offset() - 1, bcondHigh, slow_path); + + // The underflow check is elided. The recursive check will always fail + // when the lock stack is empty because of the _bad_oop_sentinel field. + + // Check if recursive. + z_aghi(top, -oopSize); + z_cg(obj, Address(Z_thread, top)); + z_bre(push); + + // Check for monitor (0b10) + z_lg(mark, Address(obj, mark_offset)); + z_tmll(mark, markWord::monitor_value); + z_brnaz(inflated); + + // not inflated + + { // Try to lock. Transition lock bits 0b01 => 0b00 + assert(mark_offset == 0, "required to avoid a lea"); + const Register locked_obj = top; + z_oill(mark, markWord::unlocked_value); + z_lgr(locked_obj, mark); + // Clear lock-bits from locked_obj (locked state) + z_xilf(locked_obj, markWord::unlocked_value); + z_csg(mark, locked_obj, mark_offset, obj); + branch_optimized(Assembler::bcondNotEqual, slow_path); + } + + bind(push); + + // After successful lock, push object on lock-stack. + z_lgf(top, Address(Z_thread, ls_top_offset)); + z_stg(obj, Address(Z_thread, top)); + z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize); + + z_cgr(obj, obj); // set the CC to EQ, as it could be changed by alsi + z_bru(locked); + } + BLOCK_COMMENT("} compiler_fast_lightweight_locking"); + + BLOCK_COMMENT("handle_inflated_monitor_lightweight_locking {"); + { // Handle inflated monitor. + bind(inflated); + + // mark contains the tagged ObjectMonitor*. + const Register tagged_monitor = mark; + const Register zero = tmp2; + + // Try to CAS m->owner from null to current thread. + // If m->owner is null, then csg succeeds and sets m->owner=THREAD and CR=EQ. + // Otherwise, register zero is filled with the current owner. + z_lghi(zero, 0); + z_csg(zero, Z_thread, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner), tagged_monitor); + z_bre(locked); + + // Check if recursive. + z_cgr(Z_thread, zero); // zero contains the owner from z_csg instruction + z_brne(slow_path); + + // Recursive + z_agsi(Address(tagged_monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(recursions)), 1ll); + z_cgr(zero, zero); + // z_bru(locked); + // Uncomment above line in the future, for now jump address is right next to us. } + BLOCK_COMMENT("} handle_inflated_monitor_lightweight_locking"); + + bind(locked); + +#ifdef ASSERT + // Check that locked label is reached with flag == EQ. + NearLabel flag_correct; + z_bre(flag_correct); + stop("CC is not set to EQ, it should be - lock"); +#endif // ASSERT + + bind(slow_path); + +#ifdef ASSERT + // Check that slow_path label is reached with flag == NE. + z_brne(flag_correct); + stop("CC is not set to NE, it should be - lock"); + bind(flag_correct); #endif // ASSERT - z_lgr(tmp, hdr); - z_oill(tmp, markWord::unlocked_value); - z_csg(hdr, tmp, oopDesc::mark_offset_in_bytes(), obj); - branch_optimized(Assembler::bcondNotEqual, slow); + // C2 uses the value of flag (NE vs EQ) to determine the continuation. +} + +void MacroAssembler::compiler_fast_unlock_lightweight_object(Register obj, Register tmp1, Register tmp2) { + assert_different_registers(obj, tmp1, tmp2); - // After successful unlock, pop object from lock-stack + // Handle inflated monitor. + NearLabel inflated, inflated_load_monitor; + // Finish fast unlock successfully. MUST reach to with flag == EQ. + NearLabel unlocked; + // Finish fast unlock unsuccessfully. MUST branch to with flag == NE. + NearLabel slow_path; + + const Register mark = tmp1; + const Register top = tmp2; + const int mark_offset = oopDesc::mark_offset_in_bytes(); + const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset(); + + BLOCK_COMMENT("compiler_fast_lightweight_unlock {"); + { // Lightweight Unlock + + // Check if obj is top of lock-stack. + z_lgf(top, Address(Z_thread, ls_top_offset)); + + z_aghi(top, -oopSize); + z_cg(obj, Address(Z_thread, top)); + branch_optimized(bcondNotEqual, inflated_load_monitor); + + // Pop lock-stack. #ifdef ASSERT - z_lgf(tmp, Address(Z_thread, JavaThread::lock_stack_top_offset())); - z_aghi(tmp, -oopSize); - z_agr(tmp, Z_thread); - z_xc(0, oopSize-1, tmp, 0, tmp); // wipe out lock-stack entry + const Register temp_top = tmp1; // let's not kill top here, we can use for recursive check + z_agrk(temp_top, top, Z_thread); + z_xc(0, oopSize-1, temp_top, 0, temp_top); // wipe out lock-stack entry #endif - z_alsi(in_bytes(JavaThread::lock_stack_top_offset()), Z_thread, -oopSize); // pop object - z_cr(tmp, tmp); // set CC to EQ + z_alsi(in_bytes(ls_top_offset), Z_thread, -oopSize); // pop object + + // The underflow check is elided. The recursive check will always fail + // when the lock stack is empty because of the _bad_oop_sentinel field. + + // Check if recursive. + z_aghi(top, -oopSize); + z_cg(obj, Address(Z_thread, top)); + z_bre(unlocked); + + // Not recursive + + // Check for monitor (0b10). + z_lg(mark, Address(obj, mark_offset)); + z_tmll(mark, markWord::monitor_value); + z_brnaz(inflated); + +#ifdef ASSERT + // Check header not unlocked (0b01). + NearLabel not_unlocked; + z_tmll(mark, markWord::unlocked_value); + z_braz(not_unlocked); + stop("lightweight_unlock already unlocked"); + bind(not_unlocked); +#endif // ASSERT + + { // Try to unlock. Transition lock bits 0b00 => 0b01 + Register unlocked_obj = top; + z_lgr(unlocked_obj, mark); + z_oill(unlocked_obj, markWord::unlocked_value); + z_csg(mark, unlocked_obj, mark_offset, obj); + branch_optimized(Assembler::bcondEqual, unlocked); + } + + // Restore lock-stack and handle the unlock in runtime. + z_lgf(top, Address(Z_thread, ls_top_offset)); + DEBUG_ONLY(z_stg(obj, Address(Z_thread, top));) + z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize); + // set CC to NE + z_ltgr(obj, obj); // object is not null here + z_bru(slow_path); + } + BLOCK_COMMENT("} compiler_fast_lightweight_unlock"); + + { // Handle inflated monitor. + + bind(inflated_load_monitor); + + z_lg(mark, Address(obj, mark_offset)); + +#ifdef ASSERT + z_tmll(mark, markWord::monitor_value); + z_brnaz(inflated); + stop("Fast Unlock not monitor"); +#endif // ASSERT + + bind(inflated); + +#ifdef ASSERT + NearLabel check_done, loop; + z_lgf(top, Address(Z_thread, ls_top_offset)); + bind(loop); + z_aghi(top, -oopSize); + compareU32_and_branch(top, in_bytes(JavaThread::lock_stack_base_offset()), + bcondLow, check_done); + z_cg(obj, Address(Z_thread, top)); + z_brne(loop); + stop("Fast Unlock lock on stack"); + bind(check_done); +#endif // ASSERT + + // mark contains the tagged ObjectMonitor*. + const Register monitor = mark; + + NearLabel not_recursive; + const Register recursions = tmp2; + + // Check if recursive. + load_and_test_long(recursions, Address(monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(recursions))); + z_bre(not_recursive); // if 0 then jump, it's not recursive locking + + // Recursive unlock + z_agsi(Address(monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(recursions)), -1ll); + z_cgr(monitor, monitor); // set the CC to EQUAL + z_bru(unlocked); + + bind(not_recursive); + + NearLabel not_ok; + // Check if the entry lists are empty. + load_and_test_long(tmp2, Address(monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(EntryList))); + z_brne(not_ok); + load_and_test_long(tmp2, Address(monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(cxq))); + z_brne(not_ok); + + z_release(); + z_stg(tmp2 /*=0*/, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner), monitor); + + z_bru(unlocked); // CC = EQ here + + bind(not_ok); + + // The owner may be anonymous, and we removed the last obj entry in + // the lock-stack. This loses the information about the owner. + // Write the thread to the owner field so the runtime knows the owner. + z_stg(Z_thread, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner), monitor); + z_bru(slow_path); // CC = NE here + } + + bind(unlocked); + +#ifdef ASSERT + // Check that unlocked label is reached with flag == EQ. + NearLabel flag_correct; + z_bre(flag_correct); + stop("CC is not set to EQ, it should be - unlock"); +#endif // ASSERT + + bind(slow_path); + +#ifdef ASSERT + // Check that slow_path label is reached with flag == NE. + z_brne(flag_correct); + stop("CC is not set to NE, it should be - unlock"); + bind(flag_correct); +#endif // ASSERT + + // C2 uses the value of flag (NE vs EQ) to determine the continuation. } void MacroAssembler::pop_count_int(Register r_dst, Register r_src, Register r_tmp) { diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.hpp b/src/hotspot/cpu/s390/macroAssembler_s390.hpp index 9f45542dd65cf..684741d79db2f 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.hpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.hpp @@ -727,8 +727,10 @@ class MacroAssembler: public Assembler { void compiler_fast_lock_object(Register oop, Register box, Register temp1, Register temp2); void compiler_fast_unlock_object(Register oop, Register box, Register temp1, Register temp2); - void lightweight_lock(Register obj, Register hdr, Register tmp, Label& slow); - void lightweight_unlock(Register obj, Register hdr, Register tmp, Label& slow); + void lightweight_lock(Register obj, Register tmp1, Register tmp2, Label& slow); + void lightweight_unlock(Register obj, Register tmp1, Register tmp2, Label& slow); + void compiler_fast_lock_lightweight_object(Register obj, Register tmp1, Register tmp2); + void compiler_fast_unlock_lightweight_object(Register obj, Register tmp1, Register tmp2); void resolve_jobject(Register value, Register tmp1, Register tmp2); diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad index 56cf494d27e0a..0fe3840b9b53c 100644 --- a/src/hotspot/cpu/s390/s390.ad +++ b/src/hotspot/cpu/s390/s390.ad @@ -9579,6 +9579,7 @@ instruct partialSubtypeCheck_vs_zero(flagsReg pcc, rarg2RegP sub, rarg3RegP supe // inlined locking and unlocking instruct cmpFastLock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{ + predicate(LockingMode != LM_LIGHTWEIGHT); match(Set pcc (FastLock oop box)); effect(TEMP tmp1, TEMP tmp2); ins_cost(100); @@ -9589,6 +9590,7 @@ instruct cmpFastLock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRe %} instruct cmpFastUnlock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{ + predicate(LockingMode != LM_LIGHTWEIGHT); match(Set pcc (FastUnlock oop box)); effect(TEMP tmp1, TEMP tmp2); ins_cost(100); @@ -9598,6 +9600,38 @@ instruct cmpFastUnlock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, i ins_pipe(pipe_class_dummy); %} +instruct cmpFastLockLightweight(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{ + predicate(LockingMode == LM_LIGHTWEIGHT); + match(Set pcc (FastLock oop box)); + effect(TEMP tmp1, TEMP tmp2); + ins_cost(100); + // TODO: s390 port size(VARIABLE_SIZE); + format %{ "FASTLOCK $oop, $box; KILL Z_ARG4, Z_ARG5" %} + ins_encode %{ + __ fast_lock_lightweight($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register); + // If locking was successful, cc should indicate 'EQ'. + // The compiler generates a branch to the runtime call to + // _complete_monitor_locking_Java for the case where cc is 'NE'. + %} + ins_pipe(pipe_class_dummy); +%} + +instruct cmpFastUnlockLightweight(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{ + predicate(LockingMode == LM_LIGHTWEIGHT); + match(Set pcc (FastUnlock oop box)); + effect(TEMP tmp1, TEMP tmp2); + ins_cost(100); + // TODO: s390 port size(FIXED_SIZE); + format %{ "FASTUNLOCK $oop, $box; KILL Z_ARG4, Z_ARG5" %} + ins_encode %{ + __ fast_unlock_lightweight($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register); + // If unlocking was successful, cc should indicate 'EQ'. + // The compiler generates a branch to the runtime call to + // _complete_monitor_unlocking_Java for the case where cc is 'NE'. + %} + ins_pipe(pipe_class_dummy); +%} + instruct inlineCallClearArrayConst(SSlenDW cnt, iRegP_N2P base, Universe dummy, flagsReg cr) %{ match(Set dummy (ClearArray cnt base)); effect(KILL cr); diff --git a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp index 87cf9cb600cb4..0ee88345282b7 100644 --- a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp +++ b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp @@ -1711,8 +1711,13 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, __ add2reg(r_box, lock_offset, Z_SP); // Try fastpath for locking. - // Fast_lock kills r_temp_1, r_temp_2. - __ compiler_fast_lock_object(r_oop, r_box, r_tmp1, r_tmp2); + if (LockingMode == LM_LIGHTWEIGHT) { + // Fast_lock kills r_temp_1, r_temp_2. + __ compiler_fast_lock_lightweight_object(r_oop, r_tmp1, r_tmp2); + } else { + // Fast_lock kills r_temp_1, r_temp_2. + __ compiler_fast_lock_object(r_oop, r_box, r_tmp1, r_tmp2); + } __ z_bre(done); //------------------------------------------------------------------------- @@ -1910,8 +1915,13 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, __ add2reg(r_box, lock_offset, Z_SP); // Try fastpath for unlocking. - // Fast_unlock kills r_tmp1, r_tmp2. - __ compiler_fast_unlock_object(r_oop, r_box, r_tmp1, r_tmp2); + if (LockingMode == LM_LIGHTWEIGHT) { + // Fast_unlock kills r_tmp1, r_tmp2. + __ compiler_fast_unlock_lightweight_object(r_oop, r_tmp1, r_tmp2); + } else { + // Fast_unlock kills r_tmp1, r_tmp2. + __ compiler_fast_unlock_object(r_oop, r_box, r_tmp1, r_tmp2); + } __ z_bre(done); // Slow path for unlocking. diff --git a/src/hotspot/cpu/s390/vm_version_s390.hpp b/src/hotspot/cpu/s390/vm_version_s390.hpp index 7ac60a10ae7f8..4f963c4e4851a 100644 --- a/src/hotspot/cpu/s390/vm_version_s390.hpp +++ b/src/hotspot/cpu/s390/vm_version_s390.hpp @@ -413,6 +413,8 @@ class VM_Version: public Abstract_VM_Version { // s390 supports fast class initialization checks static bool supports_fast_class_init_checks() { return true; } + constexpr static bool supports_recursive_lightweight_locking() { return true; } + // CPU feature query functions static const char* get_model_string() { return _model_string; } static bool has_StoreFacilityListExtended() { return (_features[0] & StoreFacilityListExtendedMask) == StoreFacilityListExtendedMask; } From 3b3a19e907c7267f03c0b07312b929b7b4b6d200 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Fri, 28 Jun 2024 08:27:07 +0000 Subject: [PATCH 231/471] 8335314: Problem list compiler/uncommontrap/DeoptReallocFailure.java Reviewed-by: chagedorn --- test/hotspot/jtreg/ProblemList.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 254e621bfdd47..febde61c4fda1 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -70,6 +70,8 @@ compiler/startup/StartupOutput.java 8326615 generic-x64 compiler/codecache/CodeCacheFullCountTest.java 8332954 generic-all +compiler/uncommontrap/DeoptReallocFailure.java 8335308 windows-x64 + ############################################################################# # :hotspot_gc From 6f4ddc2f6bf0dd9a626a76d0f5e56a54c6cf6b65 Mon Sep 17 00:00:00 2001 From: Christian Hagedorn <chagedorn@openjdk.org> Date: Fri, 28 Jun 2024 09:23:48 +0000 Subject: [PATCH 232/471] 8335142: compiler/c1/TestTraceLinearScanLevel.java occasionally times out with -Xcomp Reviewed-by: thartmann, kvn --- test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java b/test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java index 2e4ec32869dc9..46a294388e6c9 100644 --- a/test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java +++ b/test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java @@ -26,8 +26,8 @@ * @bug 8251093 * @summary Sanity check the flag TraceLinearScanLevel with the highest level in a silent HelloWorld program. * - * @requires vm.debug == true & vm.compiler1.enabled - * @run main/othervm -XX:TraceLinearScanLevel=4 compiler.c1.TestTraceLinearScanLevel + * @requires vm.debug == true & vm.compiler1.enabled & vm.compMode != "Xcomp" + * @run main/othervm -Xbatch -XX:TraceLinearScanLevel=4 compiler.c1.TestTraceLinearScanLevel */ package compiler.c1; From 99d2bbf767ac33e1a021c90ba12d95ef37ea4816 Mon Sep 17 00:00:00 2001 From: Jan Lahoda <jlahoda@openjdk.org> Date: Fri, 28 Jun 2024 09:31:14 +0000 Subject: [PATCH 233/471] 8334433: jshell.exe runs an executable test.exe on startup Reviewed-by: jpai --- .../jdk/internal/org/jline/utils/OSUtils.java | 2 +- .../jshell/tool/ConsoleIOContext.java | 7 +- .../jdk/jshell/TerminalNoExecTest.java | 96 +++++++++++++++++++ 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 test/langtools/jdk/jshell/TerminalNoExecTest.java diff --git a/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java b/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java index 344d081c12486..7fdfb9a028fc9 100644 --- a/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java +++ b/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java @@ -63,7 +63,7 @@ private static boolean isExecutable(File f) { String sttyfopt = null; String infocmp = null; String test = null; - String path = System.getenv("PATH"); + String path = "/usr/bin" + File.pathSeparator + "/bin";//was: System.getenv("PATH"); if (path != null) { String[] paths = path.split(File.pathSeparator); for (String p : paths) { diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java index a2b1ca0d2d058..f4ca58d6af438 100644 --- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java +++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java @@ -154,7 +154,12 @@ public int readBuffered(byte[] b) throws IOException { setupReader = setupReader.andThen(r -> r.option(Option.DISABLE_HIGHLIGHTER, !enableHighlighter)); input.setInputStream(cmdin); } else { - terminal = TerminalBuilder.builder().inputStreamWrapper(in -> { + //on platforms which are known to be fully supported by + //the FFMTerminalProvider, do not permit the ExecTerminalProvider: + boolean allowExecTerminal = !OSUtils.IS_WINDOWS && + !OSUtils.IS_LINUX && + !OSUtils.IS_OSX; + terminal = TerminalBuilder.builder().exec(allowExecTerminal).inputStreamWrapper(in -> { input.setInputStream(in); return nonBlockingInput; }).nativeSignals(false).build(); diff --git a/test/langtools/jdk/jshell/TerminalNoExecTest.java b/test/langtools/jdk/jshell/TerminalNoExecTest.java new file mode 100644 index 0000000000000..3d76157fd26f0 --- /dev/null +++ b/test/langtools/jdk/jshell/TerminalNoExecTest.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8334433 + * @summary Verify that when running JShell on platforms that support FFMTerminalProvider, + * no new processes are spawned. + * @requires os.family == "windows" | os.family == "mac" | os.family == "linux" + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.compiler/com.sun.tools.javac.util + * @build toolbox.ToolBox toolbox.JavaTask TerminalNoExecTest + * @run main TerminalNoExecTest + */ + +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import jdk.jfr.consumer.RecordingStream; +import jdk.jshell.tool.JavaShellToolBuilder; + +import toolbox.ToolBox; + +public class TerminalNoExecTest { + + public static void main(String... args) throws Exception { + if (args.length > 0) { + AtomicBoolean spawnedNewProcess = new AtomicBoolean(); + try (var rs = new RecordingStream()) { + rs.enable("jdk.ProcessStart").withoutThreshold(); + rs.onEvent(evt -> { + System.err.println("evt: " + evt); + spawnedNewProcess.set(true); + }); + rs.startAsync(); + JavaShellToolBuilder.builder().run("--execution=local", "--no-startup"); + rs.stop(); + } + if (spawnedNewProcess.get()) { + System.err.println("Spawned a new process!"); + System.exit(1); + } + System.exit(0); + } else { + Path testScript = Paths.get("do-exit"); + try (Writer w = Files.newBufferedWriter(testScript)) { + w.append("/exit\n"); + } + + ToolBox tb = new ToolBox(); + Process target = + new ProcessBuilder(tb.getJDKTool("java").toString(), + "-classpath", System.getProperty("java.class.path"), + TerminalNoExecTest.class.getName(), + "run-test") + .redirectError(ProcessBuilder.Redirect.INHERIT) + .redirectOutput(ProcessBuilder.Redirect.INHERIT) + .redirectInput(testScript.toFile()) + .start(); + + target.waitFor(); + + int exitCode = target.exitValue(); + + if (exitCode != 0) { + throw new AssertionError("Incorrect exit value, expected 0, got: " + exitCode); + } + } + } + +} From c798316bc4cb33fd902f926030d8a0b6870d661a Mon Sep 17 00:00:00 2001 From: SendaoYan <syan@openjdk.org> Date: Fri, 28 Jun 2024 09:38:18 +0000 Subject: [PATCH 234/471] 8269657: Test java/nio/channels/DatagramChannel/Loopback.java failed: Unexpected message Reviewed-by: dfuchs --- .../nio/channels/DatagramChannel/Loopback.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/jdk/java/nio/channels/DatagramChannel/Loopback.java b/test/jdk/java/nio/channels/DatagramChannel/Loopback.java index a61a4d0b17721..5562378b83f1d 100644 --- a/test/jdk/java/nio/channels/DatagramChannel/Loopback.java +++ b/test/jdk/java/nio/channels/DatagramChannel/Loopback.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -118,7 +118,8 @@ static void test(ProtocolFamily family, InetAddress group, NetworkInterface ni) // send datagram to multicast group System.out.format("send %s -> %s%n", dc.getLocalAddress(), target); - ByteBuffer src = ByteBuffer.wrap("hello".getBytes("UTF-8")); + String str = "hello " + System.nanoTime(); + ByteBuffer src = ByteBuffer.wrap(str.getBytes("UTF-8")); dc.send(src, target); // receive datagram sent to multicast group @@ -142,6 +143,7 @@ static void test(ProtocolFamily family, InetAddress group, NetworkInterface ni) System.out.format("send %s -> %s%n", dc.getLocalAddress(), target); src.clear(); dc.send(src, target); + src.flip(); // test that we don't receive the datagram sent to multicast group dc.configureBlocking(false); @@ -157,10 +159,16 @@ static void test(ProtocolFamily family, InetAddress group, NetworkInterface ni) } else { sel.selectedKeys().clear(); SocketAddress sender = dc.receive(dst); + if (src.mismatch(dst) != -1) { + System.out.println("src: " + src + "not equal to dst: " + dst); + dst.clear(); + continue; + } if (sender != null) { System.out.format("received %s from %s%n", dst, sender); senderPort = ((InetSocketAddress) sender).getPort(); - assertTrue(senderPort != localPort, "Unexpected message"); + assertTrue(senderPort != localPort, + "Unexpected message: localPort=" + localPort); } } } From 8ec378a6c8a460dd0727df800419b3cf45d3c57a Mon Sep 17 00:00:00 2001 From: Daniel Fuchs <dfuchs@openjdk.org> Date: Fri, 28 Jun 2024 11:03:29 +0000 Subject: [PATCH 235/471] 8277949: (dc) java/nio/channels/DatagramChannel/AdaptorBasic.java failed in timeout Reviewed-by: jpai --- .../DatagramChannel/AdaptorBasic.java | 40 ++++++++++++++++--- test/jdk/java/nio/channels/TestServers.java | 31 ++++++++++++-- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/test/jdk/java/nio/channels/DatagramChannel/AdaptorBasic.java b/test/jdk/java/nio/channels/DatagramChannel/AdaptorBasic.java index 4ac5d4b3c8885..504b648dcb6dc 100644 --- a/test/jdk/java/nio/channels/DatagramChannel/AdaptorBasic.java +++ b/test/jdk/java/nio/channels/DatagramChannel/AdaptorBasic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,8 @@ import java.util.*; import java.lang.reflect.Field; +import jdk.test.lib.Platform; + public class AdaptorBasic { @@ -69,6 +71,8 @@ static void test(DatagramSocket ds, InetSocketAddress dst, boolean shouldTimeout for (;;) { try { ds.receive(ip); + // weed off stray datagrams + if (ip.getPort() != dst.getPort()) continue; } catch (SocketTimeoutException x) { if (shouldTimeout) { out.println("Receive timed out, as expected"); @@ -111,12 +115,36 @@ static void test(InetSocketAddress dst, // Original ds = new DatagramSocket(); } else { - DatagramChannel dc = DatagramChannel.open(); - ds = dc.socket(); - ds.bind(new InetSocketAddress(0)); + int attempts = 0; + DatagramChannel toclose = null; + while (true) { + DatagramChannel dc = DatagramChannel.open(); + ds = dc.socket(); + if (Platform.isOSX() && dst.getAddress().isLoopbackAddress()) { + // avoid binding to the wildcard on macOS if possible, in order to limit + // potential port conflict issues + ds.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); + } else { + ds.bind(new InetSocketAddress(0)); + } + // on some systems it may be possible to bind two sockets + // to the same port if one of them is bound to the wildcard, + // if that happens, try again... + if (ds.getLocalPort() == dst.getPort()) { + if (toclose != null) toclose.close(); + toclose = dc; + if (++attempts == 10) { + throw new AssertionError("Couldn't allocate port for client socket"); + } + continue; + } + if (toclose != null) toclose.close(); + break; + } } - out.println("socket: " + ds); + out.println("socket: " + ds + " bound to src: " + + ds.getLocalSocketAddress() + ", dst: " + dst); if (connect) { ds.connect(dst); out.println("connect: " + ds); @@ -141,7 +169,7 @@ static void test(InetSocketAddress dst, public static void main(String[] args) throws Exception { // need an UDP echo server try (TestServers.UdpEchoServer echoServer - = TestServers.UdpEchoServer.startNewServer(100)) { + = TestServers.UdpEchoServer.startNewServer(100, InetAddress.getLoopbackAddress())) { final InetSocketAddress address = new InetSocketAddress(echoServer.getAddress(), echoServer.getPort()); diff --git a/test/jdk/java/nio/channels/TestServers.java b/test/jdk/java/nio/channels/TestServers.java index e2c4151195dcf..4f459c439f573 100644 --- a/test/jdk/java/nio/channels/TestServers.java +++ b/test/jdk/java/nio/channels/TestServers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -497,6 +497,7 @@ static abstract class AbstractUdpServer extends AbstractServer implements Runnable, Closeable { protected final long linger; // #of ms to wait before responding + protected final InetAddress bindAddress; //local address to bind to; can be null. private Thread acceptThread; // thread waiting for packets private DatagramSocket serverSocket; // the server socket private boolean started = false; // whether the server is started @@ -509,7 +510,20 @@ static abstract class AbstractUdpServer extends AbstractServer * responding to requests. */ protected AbstractUdpServer(long linger) { + this(linger, null); + } + + /** + * Creates a new abstract UDP server. + * + * @param linger the amount of time the server should wait before + * responding to requests. + * @param bindAddress the address to bind to. If {@code null}, will + * bind to InetAddress.getLocalHost(); + */ + protected AbstractUdpServer(long linger, InetAddress bindAddress) { this.linger = linger; + this.bindAddress = bindAddress; } /** @@ -574,8 +588,9 @@ public final synchronized void start() throws IOException { if (started) { return; } + InetAddress lh = bindAddress == null ? InetAddress.getLocalHost() : bindAddress; final DatagramSocket socket = - newDatagramSocket(0, InetAddress.getLocalHost()); + newDatagramSocket(0, lh); serverSocket = socket; acceptThread = new Thread(this); acceptThread.setDaemon(true); @@ -759,7 +774,11 @@ public UdpEchoServer() { } public UdpEchoServer(long linger) { - super(linger); + this(linger, null); + } + + public UdpEchoServer(long linger, InetAddress bindAddress) { + super(linger, bindAddress); } @Override @@ -795,7 +814,11 @@ public static UdpEchoServer startNewServer() throws IOException { } public static UdpEchoServer startNewServer(long linger) throws IOException { - final UdpEchoServer echoServer = new UdpEchoServer(linger); + return startNewServer(0, InetAddress.getLocalHost()); + } + + public static UdpEchoServer startNewServer(long linger, InetAddress bindAddress) throws IOException { + final UdpEchoServer echoServer = new UdpEchoServer(linger, bindAddress); echoServer.start(); return echoServer; } From 49eb00da8dc66cff3ca430f06ab21357ee6180ef Mon Sep 17 00:00:00 2001 From: Daniel Fuchs <dfuchs@openjdk.org> Date: Fri, 28 Jun 2024 11:13:11 +0000 Subject: [PATCH 236/471] 8299813: java/nio/channels/DatagramChannel/Disconnect.java fails with jtreg test timeout due to lost datagram Reviewed-by: aefimov --- .../channels/DatagramChannel/Disconnect.java | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/test/jdk/java/nio/channels/DatagramChannel/Disconnect.java b/test/jdk/java/nio/channels/DatagramChannel/Disconnect.java index 1ba742b655241..cdc5882fefd9d 100644 --- a/test/jdk/java/nio/channels/DatagramChannel/Disconnect.java +++ b/test/jdk/java/nio/channels/DatagramChannel/Disconnect.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,7 @@ import java.nio.*; import java.nio.channels.*; import java.io.IOException; + import jdk.test.lib.net.IPSupport; public class Disconnect { @@ -42,43 +43,61 @@ public static void main(String[] args) throws IOException { // test with default protocol family try (DatagramChannel dc = DatagramChannel.open()) { - test(dc); - test(dc); + InetAddress lo = InetAddress.getLoopbackAddress(); + System.out.println("Testing with default family and " + lo); + test(dc, lo); + test(dc, lo); } if (IPSupport.hasIPv4()) { // test with IPv4 only try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)) { - test(dc); - test(dc); + InetAddress lo4 = InetAddress.ofLiteral("127.0.0.1"); + System.out.println("Testing with INET family and " + lo4); + test(dc, lo4); + test(dc, lo4); } } if (IPSupport.hasIPv6()) { // test with IPv6 only try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET6)) { - test(dc); - test(dc); + InetAddress lo6 = InetAddress.ofLiteral("::1"); + System.out.println("Testing with INET6 family and " + lo6); + test(dc, lo6); + test(dc, lo6); } } } + static int getLocalPort(DatagramChannel ch) throws IOException { + return ((InetSocketAddress) ch.getLocalAddress()).getPort(); + } + /** * Connect DatagramChannel to a server, write a datagram and disconnect. Invoke * a second or subsequent time with the same DatagramChannel instance to check * that disconnect works as expected. */ - static void test(DatagramChannel dc) throws IOException { + static void test(DatagramChannel dc, InetAddress lo) throws IOException { try (DatagramChannel server = DatagramChannel.open()) { - server.bind(new InetSocketAddress(0)); + server.bind(new InetSocketAddress(lo, 0)); - InetAddress lh = InetAddress.getLocalHost(); - dc.connect(new InetSocketAddress(lh, server.socket().getLocalPort())); + SocketAddress dcbound = dc.getLocalAddress(); + dc.connect(new InetSocketAddress(lo, server.socket().getLocalPort())); + System.out.println("dc bound to " + dcbound + " and connected from " + + dc.getLocalAddress() + " to " + dc.getRemoteAddress()); dc.write(ByteBuffer.wrap("hello".getBytes())); - ByteBuffer bb = ByteBuffer.allocate(100); - server.receive(bb); + if (getLocalPort(dc) != getLocalPort(server)) { + ByteBuffer bb = ByteBuffer.allocate(100); + server.receive(bb); + } else { + // some systems may allow dc and server to bind to the same port. + // when that happen the datagram may never be received + System.out.println("Server and clients are bound to the same port: skipping receive"); + } dc.disconnect(); From f4d8c005b35ce34c96027b7f3abb7a307bca3f4c Mon Sep 17 00:00:00 2001 From: Fernando Guallini <fguallini@openjdk.org> Date: Fri, 28 Jun 2024 12:45:26 +0000 Subject: [PATCH 237/471] 8334562: Automate com/sun/security/auth/callback/TextCallbackHandler/Default.java test Reviewed-by: weijun --- test/jdk/ProblemList.txt | 1 - test/jdk/TEST.groups | 1 - .../callback/TextCallbackHandler/Default.java | 55 +++-- .../testlibrary/HumanInputStream.java | 192 ++++++++++++++++++ .../security/tools/keytool/KeyToolTest.java | 173 +--------------- 5 files changed, 231 insertions(+), 191 deletions(-) create mode 100644 test/jdk/java/security/testlibrary/HumanInputStream.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 790b3de0f969c..20dfcef539de3 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -609,7 +609,6 @@ sun/security/smartcardio/TestMultiplePresent.java 8039280 generic- sun/security/smartcardio/TestPresent.java 8039280 generic-all sun/security/smartcardio/TestTransmit.java 8039280 generic-all com/sun/crypto/provider/Cipher/DES/PerformanceTest.java 8039280 generic-all -com/sun/security/auth/callback/TextCallbackHandler/Default.java 8039280 generic-all com/sun/security/auth/callback/TextCallbackHandler/Password.java 8039280 generic-all com/sun/security/sasl/gsskerb/AuthOnly.java 8039280 generic-all com/sun/security/sasl/gsskerb/ConfSecurityLayer.java 8039280 generic-all diff --git a/test/jdk/TEST.groups b/test/jdk/TEST.groups index 0a8d27484652a..6a5be3736e859 100644 --- a/test/jdk/TEST.groups +++ b/test/jdk/TEST.groups @@ -624,7 +624,6 @@ jdk_security_manual_no_input = \ com/sun/crypto/provider/Cipher/DES/PerformanceTest.java \ com/sun/crypto/provider/Cipher/AEAD/GCMIncrementByte4.java \ com/sun/crypto/provider/Cipher/AEAD/GCMIncrementDirect4.java \ - com/sun/security/auth/callback/TextCallbackHandler/Default.java \ com/sun/security/auth/callback/TextCallbackHandler/Password.java \ com/sun/security/sasl/gsskerb/AuthOnly.java \ com/sun/security/sasl/gsskerb/ConfSecurityLayer.java \ diff --git a/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java b/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java index 606a1ad5e0e1a..1fb3350c8f7ea 100644 --- a/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java +++ b/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,31 +23,48 @@ /* * @test + * @library /test/lib /java/security/testlibrary * @bug 4470717 * @summary fix default handling and other misc - * @run main/manual Default + * @run main/othervm Default */ import com.sun.security.auth.callback.TextCallbackHandler; +import jdk.test.lib.Asserts; + import javax.security.auth.callback.*; +import java.io.*; public class Default { - public static void main(String args[]) throws Exception { - TextCallbackHandler h = new TextCallbackHandler(); - NameCallback nc = new NameCallback("Name: ", "charlie"); - ConfirmationCallback cc = new ConfirmationCallback - ("Correct?", - ConfirmationCallback.INFORMATION, - ConfirmationCallback.YES_NO_OPTION, - ConfirmationCallback.NO); - - Callback[] callbacks = { nc, cc }; - h.handle(callbacks); - - if (cc.getSelectedIndex() == ConfirmationCallback.YES) { - System.out.println("yes"); - } else { - System.out.println("no"); + public static void main(String args[]) throws Exception { + InputStream in = System.in; + PrintStream err = System.err; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final String defaultName = "charlie"; + final String simulatedInput = "-1\n-1\n"; + HumanInputStream humanInputStream = new HumanInputStream(simulatedInput); + + try (PrintStream prints = new PrintStream(baos)) { + System.setIn(humanInputStream); + System.setErr(prints); + NameCallback nameCallback = new NameCallback("Name: ", defaultName); + ConfirmationCallback confirmationCallback = new ConfirmationCallback( + "Correct?", + ConfirmationCallback.INFORMATION, + ConfirmationCallback.YES_NO_OPTION, + ConfirmationCallback.NO); + new TextCallbackHandler().handle(new Callback[]{nameCallback, confirmationCallback}); + + Asserts.assertEquals(nameCallback.getDefaultName(), defaultName); + Asserts.assertEquals(confirmationCallback.getSelectedIndex(), ConfirmationCallback.NO); + + } finally { + System.setIn(in); + System.setErr(err); } - } + + // check that the default name and confirmation were visible in the output + Asserts.assertTrue(baos.toString().contains(String.format("Name: [%s]", defaultName))); + Asserts.assertTrue(baos.toString().contains("1. No [default]")); + } } diff --git a/test/jdk/java/security/testlibrary/HumanInputStream.java b/test/jdk/java/security/testlibrary/HumanInputStream.java new file mode 100644 index 0000000000000..50e5dd0bcc8c4 --- /dev/null +++ b/test/jdk/java/security/testlibrary/HumanInputStream.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * HumanInputStream tries to act like a human sitting in front of a computer + * terminal typing on the keyboard while a program is running. + * <p> + * The program may call InputStream.read() and BufferedReader.readLine() in + * various places. a call to B.readLine() will try to buffer as much input as + * possible. Thus, a trivial InputStream will find it impossible to feed + * anything to I.read() after a B.readLine() call. + * <p> + * This is why HumanInputStream was created, which will only send a single line + * to B.readLine(), no more, no less, and the next I.read() can have a chance + * to read the exact character right after "\n". + * + */ + +public class HumanInputStream extends InputStream { + byte[] src; + int pos; + int length; + boolean inLine; + int stopIt; + + public HumanInputStream(String input) { + src = input.getBytes(); + pos = 0; + length = src.length; + stopIt = 0; + inLine = false; + } + + // the trick: when called through read(byte[], int, int), + // return -1 twice after "\n" + + @Override public int read() throws IOException { + int re; + if(pos < length) { + re = src[pos]; + if(inLine) { + if(stopIt > 0) { + stopIt--; + re = -1; + } else { + if(re == '\n') { + stopIt = 2; + } + pos++; + } + } else { + pos++; + } + } else { + re = -1; //throws new IOException("NO MORE TO READ"); + } + return re; + } + @Override public int read(byte[] buffer, int offset, int len) { + inLine = true; + try { + return super.read(buffer, offset, len); + } catch(Exception e) { + throw new RuntimeException("HumanInputStream error"); + } finally { + inLine = false; + } + } + @Override public int available() { + if (pos < length) return 1; + return 0; + } + + // test part + static void assertTrue(boolean bool) { + if (!bool) + throw new RuntimeException(); + } + + public static void test() throws Exception { + class Tester { + HumanInputStream is; + BufferedReader reader; + Tester(String s) { + is = new HumanInputStream(s); + reader = new BufferedReader(new InputStreamReader(is)); + } + + // three kinds of test method + // 1. read byte by byte from InputStream + void testStreamReadOnce(int expection) throws Exception { + assertTrue(is.read() == expection); + } + void testStreamReadMany(String expectation) throws Exception { + char[] keys = expectation.toCharArray(); + for (char key : keys) { + assertTrue(is.read() == key); + } + } + // 2. read a line with a newly created Reader + void testReaderReadline(String expectation) throws Exception { + String s = new BufferedReader(new InputStreamReader(is)).readLine(); + if(s == null) assertTrue(expectation == null); + else assertTrue(s.equals(expectation)); + } + // 3. read a line with the old Reader + void testReaderReadline2(String expectation) throws Exception { + String s = reader.readLine(); + if(s == null) assertTrue(expectation == null); + else assertTrue(s.equals(expectation)); + } + } + + Tester test; + + test = new Tester("111\n222\n\n444\n\n"); + test.testReaderReadline("111"); + test.testReaderReadline("222"); + test.testReaderReadline(""); + test.testReaderReadline("444"); + test.testReaderReadline(""); + test.testReaderReadline(null); + + test = new Tester("111\n222\n\n444\n\n"); + test.testReaderReadline2("111"); + test.testReaderReadline2("222"); + test.testReaderReadline2(""); + test.testReaderReadline2("444"); + test.testReaderReadline2(""); + test.testReaderReadline2(null); + + test = new Tester("111\n222\n\n444\n\n"); + test.testReaderReadline2("111"); + test.testReaderReadline("222"); + test.testReaderReadline2(""); + test.testReaderReadline2("444"); + test.testReaderReadline(""); + test.testReaderReadline2(null); + + test = new Tester("1\n2"); + test.testStreamReadMany("1\n2"); + test.testStreamReadOnce(-1); + + test = new Tester("12\n234"); + test.testStreamReadOnce('1'); + test.testReaderReadline("2"); + test.testStreamReadOnce('2'); + test.testReaderReadline2("34"); + test.testReaderReadline2(null); + + test = new Tester("changeit\n"); + test.testStreamReadMany("changeit\n"); + test.testReaderReadline(null); + + test = new Tester("changeit\nName\nCountry\nYes\n"); + test.testStreamReadMany("changeit\n"); + test.testReaderReadline("Name"); + test.testReaderReadline("Country"); + test.testReaderReadline("Yes"); + test.testReaderReadline(null); + + test = new Tester("Me\nHere\n"); + test.testReaderReadline2("Me"); + test.testReaderReadline2("Here"); + } +} diff --git a/test/jdk/sun/security/tools/keytool/KeyToolTest.java b/test/jdk/sun/security/tools/keytool/KeyToolTest.java index b17f7b7d999e6..7b5f4d5556eee 100644 --- a/test/jdk/sun/security/tools/keytool/KeyToolTest.java +++ b/test/jdk/sun/security/tools/keytool/KeyToolTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ /* * @test + * @library /java/security/testlibrary * @bug 6251120 8231950 8242151 * @summary Testing keytool * @@ -1865,172 +1866,4 @@ class TestException extends Exception { public TestException(String e) { super(e); } -} - -/** - * HumanInputStream tries to act like a human sitting in front of a computer - * terminal typing on the keyboard while the keytool program is running. - * - * keytool has called InputStream.read() and BufferedReader.readLine() in - * various places. a call to B.readLine() will try to buffer as much input as - * possible. Thus, a trivial InputStream will find it impossible to feed - * anything to I.read() after a B.readLine() call. - * - * This is why i create HumanInputStream, which will only send a single line - * to B.readLine(), no more, no less, and the next I.read() can have a chance - * to read the exact character right after "\n". - * - * I don't know why HumanInputStream works. - */ -class HumanInputStream extends InputStream { - byte[] src; - int pos; - int length; - boolean inLine; - int stopIt; - - public HumanInputStream(String input) { - src = input.getBytes(); - pos = 0; - length = src.length; - stopIt = 0; - inLine = false; - } - - // the trick: when called through read(byte[], int, int), - // return -1 twice after "\n" - - @Override public int read() throws IOException { - int re; - if(pos < length) { - re = src[pos]; - if(inLine) { - if(stopIt > 0) { - stopIt--; - re = -1; - } else { - if(re == '\n') { - stopIt = 2; - } - pos++; - } - } else { - pos++; - } - } else { - re = -1;//throw new IOException("NO MORE TO READ"); - } - //if (re < 32) System.err.printf("[%02d]", re); - //else System.err.printf("[%c]", (char)re); - return re; - } - @Override public int read(byte[] buffer, int offset, int len) { - inLine = true; - try { - int re = super.read(buffer, offset, len); - return re; - } catch(Exception e) { - throw new RuntimeException("HumanInputStream error"); - } finally { - inLine = false; - } - } - @Override public int available() { - if(pos < length) return 1; - return 0; - } - - // test part - static void assertTrue(boolean bool) { - if(!bool) - throw new RuntimeException(); - } - - public static void test() throws Exception { - - class Tester { - HumanInputStream is; - BufferedReader reader; - Tester(String s) { - is = new HumanInputStream(s); - reader = new BufferedReader(new InputStreamReader(is)); - } - - // three kinds of test method - // 1. read byte by byte from InputStream - void testStreamReadOnce(int expection) throws Exception { - assertTrue(is.read() == expection); - } - void testStreamReadMany(String expection) throws Exception { - char[] keys = expection.toCharArray(); - for(int i=0; i<keys.length; i++) { - assertTrue(is.read() == keys[i]); - } - } - // 2. read a line with a newly created Reader - void testReaderReadline(String expection) throws Exception { - String s = new BufferedReader(new InputStreamReader(is)).readLine(); - if(s == null) assertTrue(expection == null); - else assertTrue(s.equals(expection)); - } - // 3. read a line with the old Reader - void testReaderReadline2(String expection) throws Exception { - String s = reader.readLine(); - if(s == null) assertTrue(expection == null); - else assertTrue(s.equals(expection)); - } - } - - Tester test; - - test = new Tester("111\n222\n\n444\n\n"); - test.testReaderReadline("111"); - test.testReaderReadline("222"); - test.testReaderReadline(""); - test.testReaderReadline("444"); - test.testReaderReadline(""); - test.testReaderReadline(null); - - test = new Tester("111\n222\n\n444\n\n"); - test.testReaderReadline2("111"); - test.testReaderReadline2("222"); - test.testReaderReadline2(""); - test.testReaderReadline2("444"); - test.testReaderReadline2(""); - test.testReaderReadline2(null); - - test = new Tester("111\n222\n\n444\n\n"); - test.testReaderReadline2("111"); - test.testReaderReadline("222"); - test.testReaderReadline2(""); - test.testReaderReadline2("444"); - test.testReaderReadline(""); - test.testReaderReadline2(null); - - test = new Tester("1\n2"); - test.testStreamReadMany("1\n2"); - test.testStreamReadOnce(-1); - - test = new Tester("12\n234"); - test.testStreamReadOnce('1'); - test.testReaderReadline("2"); - test.testStreamReadOnce('2'); - test.testReaderReadline2("34"); - test.testReaderReadline2(null); - - test = new Tester("changeit\n"); - test.testStreamReadMany("changeit\n"); - test.testReaderReadline(null); - - test = new Tester("changeit\nName\nCountry\nYes\n"); - test.testStreamReadMany("changeit\n"); - test.testReaderReadline("Name"); - test.testReaderReadline("Country"); - test.testReaderReadline("Yes"); - test.testReaderReadline(null); - - test = new Tester("Me\nHere\n"); - test.testReaderReadline2("Me"); - test.testReaderReadline2("Here"); - } -} +} \ No newline at end of file From 486aa11e74d0772ba84c2adc3c62fc1fcbf52604 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Fri, 28 Jun 2024 13:28:53 +0000 Subject: [PATCH 238/471] 8335237: ubsan: vtableStubs.hpp is_vtable_stub exclude from ubsan checks Reviewed-by: mdoerr, clanger --- src/hotspot/share/code/vtableStubs.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/code/vtableStubs.hpp b/src/hotspot/share/code/vtableStubs.hpp index 3993e1e72d5cf..426753ef00813 100644 --- a/src/hotspot/share/code/vtableStubs.hpp +++ b/src/hotspot/share/code/vtableStubs.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ #include "asm/macroAssembler.hpp" #include "code/vmreg.hpp" #include "memory/allStatic.hpp" +#include "sanitizers/ub.hpp" #include "utilities/checkedCast.hpp" // A VtableStub holds an individual code stub for a pair (vtable index, #args) for either itables or vtables @@ -173,6 +174,9 @@ class VtableStub { public: // Query bool is_itable_stub() { return !_is_vtable_stub; } + // We reinterpret arbitrary memory as VtableStub. This does not cause failures because the lookup/equality + // check will reject false objects. Disabling UBSan is a temporary workaround until JDK-8331725 is fixed. + ATTRIBUTE_NO_UBSAN bool is_vtable_stub() { return _is_vtable_stub; } bool is_abstract_method_error(address epc) { return epc == code_begin()+_ame_offset; } bool is_null_pointer_exception(address epc) { return epc == code_begin()+_npe_offset; } From 45c4eaa5600016d3da5ca769b2519df53835e4f7 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev <shade@openjdk.org> Date: Fri, 28 Jun 2024 16:26:34 +0000 Subject: [PATCH 239/471] 8335274: SwitchBootstraps.ResolvedEnumLabels.resolvedEnum should be final Reviewed-by: liach, jlahoda --- .../share/classes/java/lang/runtime/SwitchBootstraps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java b/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java index 3eecd2ab42f9c..24ee48c1f4735 100644 --- a/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java +++ b/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java @@ -358,7 +358,7 @@ private static final class ResolvedEnumLabels implements BiPredicate<Integer, Ob private final MethodHandles.Lookup lookup; private final EnumDesc<?>[] enumDescs; @Stable - private Object[] resolvedEnum; + private final Object[] resolvedEnum; public ResolvedEnumLabels(MethodHandles.Lookup lookup, EnumDesc<?>[] enumDescs) { this.lookup = lookup; From 79a3554e1da604627b3a010dc269c1bd914c79d3 Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Fri, 28 Jun 2024 19:01:36 +0000 Subject: [PATCH 240/471] 8335124: com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java failed with CPU time out of expected range Reviewed-by: phh, cjplummer --- .../com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/jdk/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java b/test/jdk/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java index 83e37f0b475de..6b0302aafbf9e 100644 --- a/test/jdk/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java +++ b/test/jdk/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java @@ -75,7 +75,6 @@ public static void main(String[] argv) // threads block after doing some computation waitUntilThreadBlocked(); - long times[] = mbean.getThreadCpuTime(ids); long userTimes[] = mbean.getThreadUserTime(ids); @@ -222,6 +221,8 @@ private static void waitUntilThreadBlocked() } } } + // Account for threads using CPU for a few millis after their WAITING state is visible: + goSleep(500); } public static void doit() { From 3e23e9c535e0ed1d7517a836d4703c7fb3e917e4 Mon Sep 17 00:00:00 2001 From: Fernando Guallini <fguallini@openjdk.org> Date: Fri, 28 Jun 2024 19:17:24 +0000 Subject: [PATCH 241/471] 8335344: test/jdk/sun/security/tools/keytool/NssTest.java fails to compile Reviewed-by: weijun --- test/jdk/sun/security/tools/keytool/NssTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/sun/security/tools/keytool/NssTest.java b/test/jdk/sun/security/tools/keytool/NssTest.java index db5d124015308..1ed2d4c3f391c 100644 --- a/test/jdk/sun/security/tools/keytool/NssTest.java +++ b/test/jdk/sun/security/tools/keytool/NssTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ /* * @test * @summary It tests (almost) all keytool behaviors with NSS. - * @library /test/lib /test/jdk/sun/security/pkcs11 + * @library /test/lib /test/jdk/sun/security/pkcs11 /java/security/testlibrary * @modules java.base/sun.security.tools.keytool * java.base/sun.security.util * java.base/sun.security.x509 From 166f9d9ac099fa971805511b32e1cae5c6c108e0 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov <kvn@openjdk.org> Date: Fri, 28 Jun 2024 19:36:00 +0000 Subject: [PATCH 242/471] 8335221: Some C2 intrinsics incorrectly assume that type argument is compile-time constant Reviewed-by: roland, chagedorn --- src/hotspot/share/opto/library_call.cpp | 104 +++++++++++++++--------- src/hotspot/share/opto/library_call.hpp | 1 + 2 files changed, 67 insertions(+), 38 deletions(-) diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp index 0148d985bc59b..ebe9258f99b60 100644 --- a/src/hotspot/share/opto/library_call.cpp +++ b/src/hotspot/share/opto/library_call.cpp @@ -5489,42 +5489,72 @@ void LibraryCallKit::create_new_uncommon_trap(CallStaticJavaNode* uncommon_trap_ uncommon_trap_call->set_req(0, top()); // not used anymore, kill it } +// Common checks for array sorting intrinsics arguments. +// Returns `true` if checks passed. +bool LibraryCallKit::check_array_sort_arguments(Node* elementType, Node* obj, BasicType& bt) { + // check address of the class + if (elementType == nullptr || elementType->is_top()) { + return false; // dead path + } + const TypeInstPtr* elem_klass = gvn().type(elementType)->isa_instptr(); + if (elem_klass == nullptr) { + return false; // dead path + } + // java_mirror_type() returns non-null for compile-time Class constants only + ciType* elem_type = elem_klass->java_mirror_type(); + if (elem_type == nullptr) { + return false; + } + bt = elem_type->basic_type(); + // Disable the intrinsic if the CPU does not support SIMD sort + if (!Matcher::supports_simd_sort(bt)) { + return false; + } + // check address of the array + if (obj == nullptr || obj->is_top()) { + return false; // dead path + } + const TypeAryPtr* obj_t = _gvn.type(obj)->isa_aryptr(); + if (obj_t == nullptr || obj_t->elem() == Type::BOTTOM) { + return false; // failed input validation + } + return true; +} + //------------------------------inline_array_partition----------------------- bool LibraryCallKit::inline_array_partition() { + address stubAddr = StubRoutines::select_array_partition_function(); + if (stubAddr == nullptr) { + return false; // Intrinsic's stub is not implemented on this platform + } + assert(callee()->signature()->size() == 9, "arrayPartition has 8 parameters (one long)"); - Node* elementType = null_check(argument(0)); + // no receiver because it is a static method + Node* elementType = argument(0); Node* obj = argument(1); - Node* offset = argument(2); + Node* offset = argument(2); // long Node* fromIndex = argument(4); Node* toIndex = argument(5); Node* indexPivot1 = argument(6); Node* indexPivot2 = argument(7); + // PartitionOperation: argument(8) is ignored Node* pivotIndices = nullptr; + BasicType bt = T_ILLEGAL; + if (!check_array_sort_arguments(elementType, obj, bt)) { + return false; + } + null_check(obj); + // If obj is dead, only null-path is taken. + if (stopped()) { + return true; + } // Set the original stack and the reexecute bit for the interpreter to reexecute // the bytecode that invokes DualPivotQuicksort.partition() if deoptimization happens. { PreserveReexecuteState preexecs(this); jvms()->set_should_reexecute(true); - const TypeInstPtr* elem_klass = gvn().type(elementType)->isa_instptr(); - ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type(); - BasicType bt = elem_type->basic_type(); - // Disable the intrinsic if the CPU does not support SIMD sort - if (!Matcher::supports_simd_sort(bt)) { - return false; - } - address stubAddr = nullptr; - stubAddr = StubRoutines::select_array_partition_function(); - // stub not loaded - if (stubAddr == nullptr) { - return false; - } - // get the address of the array - const TypeAryPtr* obj_t = _gvn.type(obj)->isa_aryptr(); - if (obj_t == nullptr || obj_t->elem() == Type::BOTTOM ) { - return false; // failed input validation - } Node* obj_adr = make_unsafe_address(obj, offset); // create the pivotIndices array of type int and size = 2 @@ -5557,31 +5587,29 @@ bool LibraryCallKit::inline_array_partition() { //------------------------------inline_array_sort----------------------- bool LibraryCallKit::inline_array_sort() { + address stubAddr = StubRoutines::select_arraysort_function(); + if (stubAddr == nullptr) { + return false; // Intrinsic's stub is not implemented on this platform + } + assert(callee()->signature()->size() == 7, "arraySort has 6 parameters (one long)"); - Node* elementType = null_check(argument(0)); + // no receiver because it is a static method + Node* elementType = argument(0); Node* obj = argument(1); - Node* offset = argument(2); + Node* offset = argument(2); // long Node* fromIndex = argument(4); Node* toIndex = argument(5); + // SortOperation: argument(6) is ignored - const TypeInstPtr* elem_klass = gvn().type(elementType)->isa_instptr(); - ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type(); - BasicType bt = elem_type->basic_type(); - // Disable the intrinsic if the CPU does not support SIMD sort - if (!Matcher::supports_simd_sort(bt)) { - return false; - } - address stubAddr = nullptr; - stubAddr = StubRoutines::select_arraysort_function(); - //stub not loaded - if (stubAddr == nullptr) { + BasicType bt = T_ILLEGAL; + + if (!check_array_sort_arguments(elementType, obj, bt)) { return false; } - - // get address of the array - const TypeAryPtr* obj_t = _gvn.type(obj)->isa_aryptr(); - if (obj_t == nullptr || obj_t->elem() == Type::BOTTOM ) { - return false; // failed input validation + null_check(obj); + // If obj is dead, only null-path is taken. + if (stopped()) { + return true; } Node* obj_adr = make_unsafe_address(obj, offset); diff --git a/src/hotspot/share/opto/library_call.hpp b/src/hotspot/share/opto/library_call.hpp index 941282ce2e744..313e8c39544c6 100644 --- a/src/hotspot/share/opto/library_call.hpp +++ b/src/hotspot/share/opto/library_call.hpp @@ -279,6 +279,7 @@ class LibraryCallKit : public GraphKit { JVMState* arraycopy_restore_alloc_state(AllocateArrayNode* alloc, int& saved_reexecute_sp); void arraycopy_move_allocation_here(AllocateArrayNode* alloc, Node* dest, JVMState* saved_jvms_before_guards, int saved_reexecute_sp, uint new_idx); + bool check_array_sort_arguments(Node* elementType, Node* obj, BasicType& bt); bool inline_array_sort(); bool inline_array_partition(); typedef enum { LS_get_add, LS_get_set, LS_cmp_swap, LS_cmp_swap_weak, LS_cmp_exchange } LoadStoreKind; From 5d866bf17d96bd0f0e4545d7eee5912eda2e3a94 Mon Sep 17 00:00:00 2001 From: Shaojin Wen <shaojin.wensj@alibaba-inc.com> Date: Fri, 28 Jun 2024 22:27:34 +0000 Subject: [PATCH 243/471] 8335252: Reduce size of j.u.Formatter.Conversion#isValid Reviewed-by: redestad --- src/java.base/share/classes/java/util/Formatter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/Formatter.java b/src/java.base/share/classes/java/util/Formatter.java index a7d95ee5780c8..41b9540001c83 100644 --- a/src/java.base/share/classes/java/util/Formatter.java +++ b/src/java.base/share/classes/java/util/Formatter.java @@ -4967,9 +4967,9 @@ static boolean isValid(char c) { DECIMAL_FLOAT, HEXADECIMAL_FLOAT, HEXADECIMAL_FLOAT_UPPER, - LINE_SEPARATOR, - PERCENT_SIGN -> true; - default -> false; + LINE_SEPARATOR -> true; + // Don't put PERCENT_SIGN inside switch, as that will make the method size exceed 325 and cannot be inlined. + default -> c == PERCENT_SIGN; }; } From 8350b1daedae8ef5785a7165e664b1d3149b18b7 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Sat, 29 Jun 2024 05:04:47 +0000 Subject: [PATCH 244/471] 8335294: Fix simple -Wzero-as-null-pointer-constant warnings in gc code Reviewed-by: tschatzl, coleenp, jwaters --- .../gc/x/xPhysicalMemoryBacking_linux.cpp | 6 +++--- .../gc/z/zPhysicalMemoryBacking_linux.cpp | 6 +++--- .../share/gc/parallel/parMarkBitMap.cpp | 4 ++-- .../share/gc/parallel/parallelScavengeHeap.cpp | 2 +- .../share/gc/parallel/psParallelCompact.cpp | 6 +++--- src/hotspot/share/gc/z/zPage.inline.hpp | 3 +-- .../gc/gctests/nativeGC01/libnativeGC01.cpp | 6 +++--- .../gc/gctests/nativeGC02/libnativeGC02.cpp | 8 ++++---- .../gc/gctests/nativeGC03/libnativeGC03.cpp | 2 +- .../gc/gctests/nativeGC05/libnativeGC05.cpp | 18 +++++++++--------- 10 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/hotspot/os/linux/gc/x/xPhysicalMemoryBacking_linux.cpp b/src/hotspot/os/linux/gc/x/xPhysicalMemoryBacking_linux.cpp index 5db59741a5864..35625f613d349 100644 --- a/src/hotspot/os/linux/gc/x/xPhysicalMemoryBacking_linux.cpp +++ b/src/hotspot/os/linux/gc/x/xPhysicalMemoryBacking_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -389,7 +389,7 @@ XErrno XPhysicalMemoryBacking::fallocate_compat_mmap_hugetlbfs(size_t offset, si // On hugetlbfs, mapping a file segment will fail immediately, without // the need to touch the mapped pages first, if there aren't enough huge // pages available to back the mapping. - void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset); + void* const addr = mmap(nullptr, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset); if (addr == MAP_FAILED) { // Failed return errno; @@ -439,7 +439,7 @@ static bool safe_touch_mapping(void* addr, size_t length, size_t page_size) { XErrno XPhysicalMemoryBacking::fallocate_compat_mmap_tmpfs(size_t offset, size_t length) const { // On tmpfs, we need to touch the mapped pages to figure out // if there are enough pages available to back the mapping. - void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset); + void* const addr = mmap(nullptr, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset); if (addr == MAP_FAILED) { // Failed return errno; diff --git a/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp b/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp index 76f9d90cd7198..b80124cc34e43 100644 --- a/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp +++ b/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -391,7 +391,7 @@ ZErrno ZPhysicalMemoryBacking::fallocate_compat_mmap_hugetlbfs(zoffset offset, s // On hugetlbfs, mapping a file segment will fail immediately, without // the need to touch the mapped pages first, if there aren't enough huge // pages available to back the mapping. - void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, untype(offset)); + void* const addr = mmap(nullptr, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, untype(offset)); if (addr == MAP_FAILED) { // Failed return errno; @@ -441,7 +441,7 @@ static bool safe_touch_mapping(void* addr, size_t length, size_t page_size) { ZErrno ZPhysicalMemoryBacking::fallocate_compat_mmap_tmpfs(zoffset offset, size_t length) const { // On tmpfs, we need to touch the mapped pages to figure out // if there are enough pages available to back the mapping. - void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, untype(offset)); + void* const addr = mmap(nullptr, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, untype(offset)); if (addr == MAP_FAILED) { // Failed return errno; diff --git a/src/hotspot/share/gc/parallel/parMarkBitMap.cpp b/src/hotspot/share/gc/parallel/parMarkBitMap.cpp index 434b719aa13ee..658c3ef106fa0 100644 --- a/src/hotspot/share/gc/parallel/parMarkBitMap.cpp +++ b/src/hotspot/share/gc/parallel/parMarkBitMap.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,7 +62,7 @@ ParMarkBitMap::initialize(MemRegion covered_region) return true; } - _heap_start = 0; + _heap_start = nullptr; _heap_size = 0; if (_virtual_space != nullptr) { delete _virtual_space; diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp index 2984cedafe196..665b14bb1eabf 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp @@ -661,7 +661,7 @@ HeapWord* ParallelScavengeHeap::block_start(const void* addr) const { "addr should be in allocated part of old gen"); return old_gen()->start_array()->object_start((HeapWord*)addr); } - return 0; + return nullptr; } bool ParallelScavengeHeap::block_is_obj(const HeapWord* addr) const { diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index 6c08503438423..b4fe706d1e410 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -237,7 +237,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size) MemTracker::record_virtual_memory_type((address)rs.base(), mtGC); PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz); - if (vspace != 0) { + if (vspace != nullptr) { if (vspace->expand_by(_reserved_byte_size)) { return vspace; } @@ -246,7 +246,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size) rs.release(); } - return 0; + return nullptr; } bool ParallelCompactData::initialize_region_data(size_t heap_size) @@ -255,7 +255,7 @@ bool ParallelCompactData::initialize_region_data(size_t heap_size) const size_t count = heap_size >> Log2RegionSize; _region_vspace = create_vspace(count, sizeof(RegionData)); - if (_region_vspace != 0) { + if (_region_vspace != nullptr) { _region_data = (RegionData*)_region_vspace->reserved_low_addr(); _region_count = count; return true; diff --git a/src/hotspot/share/gc/z/zPage.inline.hpp b/src/hotspot/share/gc/z/zPage.inline.hpp index ff5fe0bbd6c87..0b4ee28ba7d0a 100644 --- a/src/hotspot/share/gc/z/zPage.inline.hpp +++ b/src/hotspot/share/gc/z/zPage.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,7 +65,6 @@ inline const char* ZPage::type_to_string() const { default: fatal("Unexpected page type"); - return 0; } } diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC01/libnativeGC01.cpp b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC01/libnativeGC01.cpp index 63aed51a89764..efd1fd3fa3ab4 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC01/libnativeGC01.cpp +++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC01/libnativeGC01.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,7 @@ Java_gc_gctests_nativeGC01_nativeGC01_nativeMethod01 */ cls = env->GetObjectClass(obj); mid = env->GetMethodID(cls, "callbackGC", "()V"); - if (mid == 0) { + if (mid == nullptr) { printf("couldnt locate method callbackGC()"); return -1; } @@ -56,7 +56,7 @@ Java_gc_gctests_nativeGC01_nativeGC01_nativeMethod01 clss = env->GetObjectClass(linked_list); mid2 = env->GetMethodID(clss, "getLength", "()I"); - if (mid2 == 0) { + if (mid2 == nullptr) { printf("couldnt locate method getLength()"); return -1; } diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC02/libnativeGC02.cpp b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC02/libnativeGC02.cpp index e6db8cf618460..eec3fa3e8e865 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC02/libnativeGC02.cpp +++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC02/libnativeGC02.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ Java_gc_gctests_nativeGC02_nativeGC02_nativeMethod02 clss = env->GetObjectClass(obj); fid = env->GetFieldID(clss, "cl", "Lnsk/share/gc/CircularLinkedList;"); - if (fid == 0) { + if (fid == nullptr) { printf("could not locate field - cl\n"); return -1; } @@ -53,7 +53,7 @@ Java_gc_gctests_nativeGC02_nativeGC02_nativeMethod02 cls = env->GetObjectClass(obj); mid = env->GetMethodID(cls, "callbackGC", "()V"); - if (mid == 0) { + if (mid == nullptr) { printf("couldnt locate method callbackGC()\n"); return -1; } @@ -66,7 +66,7 @@ Java_gc_gctests_nativeGC02_nativeGC02_nativeMethod02 clss = env->GetObjectClass(linked_list); mid2 = env->GetMethodID(clss, "getLength", "(Lnsk/share/gc/CircularLinkedList;)I"); - if (mid2 == 0) { + if (mid2 == nullptr) { printf("couldnt locate method getLength(CircularLinkedList)\n"); return -1; } diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC03/libnativeGC03.cpp b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC03/libnativeGC03.cpp index 2c97863db5a9f..e3f54ec86ec50 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC03/libnativeGC03.cpp +++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC03/libnativeGC03.cpp @@ -46,7 +46,7 @@ Java_gc_gctests_nativeGC03_nativeGC03_nativeMethod03 clss = env->GetObjectClass(obj); mid = env->GetMethodID(clss, "fillArray", "()V"); - if (mid == 0) { + if (mid == nullptr) { return; } env->CallVoidMethod(obj, mid); diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC05/libnativeGC05.cpp b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC05/libnativeGC05.cpp index 4bfaeda1f0606..a796cf938bbe6 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC05/libnativeGC05.cpp +++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC05/libnativeGC05.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,8 +28,8 @@ extern "C" { JNIEXPORT void JNICALL Java_gc_gctests_nativeGC05_nativeGC05_kickOffRefillers (JNIEnv *env, jobject obj, jobject matrix, jobject stack) { - jclass matrixClass, stackClass, pairClass = 0; - jmethodID stack_pop_mid, stack_empty_mid, matrix_repopulate_mid, pair_geti_mid = 0, pair_getj_mid = 0; + jclass matrixClass, stackClass, pairClass = nullptr; + jmethodID stack_pop_mid, stack_empty_mid, matrix_repopulate_mid, pair_geti_mid = nullptr, pair_getj_mid = nullptr; jobject pair; jint i, j; jboolean b; @@ -40,18 +40,18 @@ Java_gc_gctests_nativeGC05_nativeGC05_kickOffRefillers /* GetMethodID's for the pop() and Repopulate() methods */ stack_pop_mid = env->GetMethodID(stackClass, "pop", "()Ljava/lang/Object;"); - if (stack_pop_mid == 0) { + if (stack_pop_mid == nullptr) { printf("could not get a methodID for Stack::pop()\n"); return; } stack_empty_mid = env->GetMethodID(stackClass, "empty", "()Z"); - if (stack_empty_mid == 0) { + if (stack_empty_mid == nullptr) { printf("could not get a methodID for Stack::empty()\n"); return; } matrix_repopulate_mid = env->GetMethodID(matrixClass, "repopulate", "(II)V"); - if (matrix_repopulate_mid == 0) { + if (matrix_repopulate_mid == nullptr) { printf("could not get a methodID for Matrix::repopulate(int, int)\n"); return; } @@ -62,15 +62,15 @@ Java_gc_gctests_nativeGC05_nativeGC05_kickOffRefillers /** pair = stack.pop() */ pair = env->CallObjectMethod(stack, stack_pop_mid); - if (pairClass == 0) { + if (pairClass == nullptr) { pairClass = env->GetObjectClass(pair); pair_geti_mid = env->GetMethodID(pairClass, "getI", "()I"); - if (pair_geti_mid == 0) { + if (pair_geti_mid == nullptr) { printf("could not get a methodID for IndexPair::getI()\n"); return; } pair_getj_mid = env->GetMethodID(pairClass, "getJ", "()I"); - if (pair_getj_mid == 0) { + if (pair_getj_mid == nullptr) { printf("could not get a methodID for IndexPair::getJ()\n"); return; } From bb18498d71dddf49db9bdfac886aed9ae123651d Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Sat, 29 Jun 2024 08:19:33 +0000 Subject: [PATCH 245/471] 8335349: jcmd VM.classloaders "fold" option should be optional Reviewed-by: cjplummer, stuefe --- src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp b/src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp index f89090fbb5c06..8a8113db4036d 100644 --- a/src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp +++ b/src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -39,7 +39,7 @@ ClassLoaderHierarchyDCmd::ClassLoaderHierarchyDCmd(outputStream* output, bool he : DCmdWithParser(output, heap), _show_classes("show-classes", "Print loaded classes.", "BOOLEAN", false, "false"), _verbose("verbose", "Print detailed information.", "BOOLEAN", false, "false"), - _fold("fold", "Show loaders of the same name and class as one.", "BOOLEAN", true, "true") { + _fold("fold", "Show loaders of the same name and class as one.", "BOOLEAN", false, "true") { _dcmdparser.add_dcmd_option(&_show_classes); _dcmdparser.add_dcmd_option(&_verbose); _dcmdparser.add_dcmd_option(&_fold); From d9bcf061450ebfb7fe02b5a50c855db1d9178e5d Mon Sep 17 00:00:00 2001 From: Zhengyu Gu <zgu@openjdk.org> Date: Sat, 29 Jun 2024 20:40:51 +0000 Subject: [PATCH 246/471] 8335217: Fix memory ordering in ClassLoaderData::ChunkedHandleList Reviewed-by: dholmes, stefank, eosterlund --- src/hotspot/share/classfile/classLoaderData.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp index 16837da9cf260..de4490e73f326 100644 --- a/src/hotspot/share/classfile/classLoaderData.cpp +++ b/src/hotspot/share/classfile/classLoaderData.cpp @@ -202,9 +202,9 @@ OopHandle ClassLoaderData::ChunkedHandleList::add(oop o) { int ClassLoaderData::ChunkedHandleList::count() const { int count = 0; - Chunk* chunk = _head; + Chunk* chunk = Atomic::load_acquire(&_head); while (chunk != nullptr) { - count += chunk->_size; + count += Atomic::load(&chunk->_size); chunk = chunk->_next; } return count; @@ -258,9 +258,9 @@ bool ClassLoaderData::ChunkedHandleList::contains(oop p) { #ifndef PRODUCT bool ClassLoaderData::ChunkedHandleList::owner_of(oop* oop_handle) { - Chunk* chunk = _head; + Chunk* chunk = Atomic::load_acquire(&_head); while (chunk != nullptr) { - if (&(chunk->_data[0]) <= oop_handle && oop_handle < &(chunk->_data[chunk->_size])) { + if (&(chunk->_data[0]) <= oop_handle && oop_handle < &(chunk->_data[Atomic::load(&chunk->_size)])) { return true; } chunk = chunk->_next; From 53242cdf9ef17c502ebd541e84370e7c158639c1 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Mon, 1 Jul 2024 06:37:09 +0000 Subject: [PATCH 247/471] 8335283: Build failure due to 'no_sanitize' attribute directive ignored Reviewed-by: shade, tschatzl, kbarrett, jwaters --- src/hotspot/share/sanitizers/ub.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hotspot/share/sanitizers/ub.hpp b/src/hotspot/share/sanitizers/ub.hpp index 23e8ef4576c9f..66cd014c35cd4 100644 --- a/src/hotspot/share/sanitizers/ub.hpp +++ b/src/hotspot/share/sanitizers/ub.hpp @@ -32,9 +32,11 @@ // following function or method. // Useful if the function or method is known to do something special or even 'dangerous', for // example causing desired signals/crashes. +#ifdef UNDEFINED_BEHAVIOR_SANITIZER #if defined(__clang__) || defined(__GNUC__) #define ATTRIBUTE_NO_UBSAN __attribute__((no_sanitize("undefined"))) #endif +#endif #ifndef ATTRIBUTE_NO_UBSAN #define ATTRIBUTE_NO_UBSAN From c7e9ebb4cfff56b7a977eb2942f563f96b3336bd Mon Sep 17 00:00:00 2001 From: Suchismith Roy <sroy@openjdk.org> Date: Mon, 1 Jul 2024 08:07:42 +0000 Subject: [PATCH 248/471] 8331732: [PPC64] Unify and optimize code which converts != 0 to 1 Reviewed-by: mdoerr, amitkumar --- src/hotspot/cpu/ppc/assembler_ppc.hpp | 7 +++-- src/hotspot/cpu/ppc/assembler_ppc.inline.hpp | 9 +++++-- src/hotspot/cpu/ppc/macroAssembler_ppc.cpp | 9 ++----- src/hotspot/cpu/ppc/macroAssembler_ppc.hpp | 2 ++ .../cpu/ppc/macroAssembler_ppc.inline.hpp | 27 +++++++++++++++++-- src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp | 6 +---- .../ppc/templateInterpreterGenerator_ppc.cpp | 4 +-- 7 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/hotspot/cpu/ppc/assembler_ppc.hpp b/src/hotspot/cpu/ppc/assembler_ppc.hpp index 61a5d6425eec6..d18574f50a949 100644 --- a/src/hotspot/cpu/ppc/assembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/assembler_ppc.hpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2023 SAP SE. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024 SAP SE. 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 @@ -350,6 +350,7 @@ class Assembler : public AbstractAssembler { SETBC_OPCODE = (31u << OPCODE_SHIFT | 384u << 1), SETNBC_OPCODE = (31u << OPCODE_SHIFT | 448u << 1), + SETBCR_OPCODE = (31u << OPCODE_SHIFT | 416u << 1), // condition register logic instructions CRAND_OPCODE = (19u << OPCODE_SHIFT | 257u << 1), @@ -1780,6 +1781,8 @@ class Assembler : public AbstractAssembler { inline void setbc( Register d, ConditionRegister cr, Condition cc); inline void setnbc(Register d, int biint); inline void setnbc(Register d, ConditionRegister cr, Condition cc); + inline void setbcr(Register d, int biint); + inline void setbcr(Register d, ConditionRegister cr, Condition cc); // Special purpose registers // Exception Register diff --git a/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp b/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp index d78dec964cbb0..98c8b629844c9 100644 --- a/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp +++ b/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2020 SAP SE. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024 SAP SE. 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 @@ -419,6 +419,11 @@ inline void Assembler::setnbc(Register d, int biint) inline void Assembler::setnbc(Register d, ConditionRegister cr, Condition cc) { setnbc(d, bi0(cr, cc)); } +inline void Assembler::setbcr(Register d, int biint) + { emit_int32(SETBCR_OPCODE | rt(d) | bi(biint)); } +inline void Assembler::setbcr(Register d, ConditionRegister cr, Condition cc) { + setbcr(d, bi0(cr, cc)); +} // Special purpose registers // Exception Register diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp index 0527cb306b274..f9e584a1e6b57 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp @@ -2383,10 +2383,7 @@ void MacroAssembler::verify_secondary_supers_table(Register r_sub_klass, addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes()); // convert !=0 to 1 - neg(R0, result); - orr(result, result, R0); - srdi(result, result, 63); - + normalize_bool(result, R0, true); const Register linear_result = r_array_index; // reuse li(linear_result, 1); cmpdi(CCR0, r_array_length, 0); @@ -2395,9 +2392,7 @@ void MacroAssembler::verify_secondary_supers_table(Register r_sub_klass, bind(failure); // convert !=0 to 1 - neg(R0, linear_result); - orr(linear_result, linear_result, R0); - srdi(linear_result, linear_result, 63); + normalize_bool(linear_result, R0, true); cmpd(CCR0, result, linear_result); beq(CCR0, passed); diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp index 4f2ff708a46a3..15b5e26f8f634 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp @@ -178,6 +178,8 @@ class MacroAssembler: public Assembler { void inline set_cmp3(Register dst); // set dst to (treat_unordered_like_less ? -1 : +1) void inline set_cmpu3(Register dst, bool treat_unordered_like_less); + // Branch-free implementation to convert !=0 to 1. + void inline normalize_bool(Register dst, Register temp = R0, bool is_64bit = false); inline void pd_patch_instruction(address branch, address target, const char* file, int line); NOT_PRODUCT(static void pd_print_patched_instruction(address branch);) diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp index f81d49684c992..e9c6fd38f4593 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2021 SAP SE. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024 SAP SE. 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 @@ -264,6 +264,29 @@ inline void MacroAssembler::set_cmpu3(Register dst, bool treat_unordered_like_le set_cmp3(dst); } +// Branch-free implementation to convert !=0 to 1 +// Set register dst to 1 if dst is non-zero. Uses setbcr instruction on Power10. +inline void MacroAssembler::normalize_bool(Register dst, Register temp, bool is_64bit) { + + if (VM_Version::has_brw()) { + if (is_64bit) { + cmpdi(CCR0, dst, 0); + } else { + cmpwi(CCR0, dst, 0); + } + setbcr(dst, CCR0, Assembler::equal); + } else { + assert_different_registers(temp, dst); + neg(temp, dst); + orr(temp, dst, temp); + if (is_64bit) { + srdi(dst, temp, 63); + } else { + srwi(dst, temp, 31); + } + } +} + // Convenience bc_far versions inline void MacroAssembler::blt_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs1, bi0(crx, less), L, optimize); } inline void MacroAssembler::bgt_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs1, bi0(crx, greater), L, optimize); } diff --git a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp index 14aa768e3ff18..9b5a86bc45bfd 100644 --- a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp +++ b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp @@ -2472,11 +2472,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, case T_ARRAY: break; case T_BOOLEAN: { // 0 -> false(0); !0 -> true(1) - Label skip_modify; - __ cmpwi(CCR0, R3_RET, 0); - __ beq(CCR0, skip_modify); - __ li(R3_RET, 1); - __ bind(skip_modify); + __ normalize_bool(R3_RET); break; } case T_BYTE: { // sign extension diff --git a/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp b/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp index c4eaf0493e337..4caae20025309 100644 --- a/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp +++ b/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp @@ -372,9 +372,7 @@ address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type switch (type) { case T_BOOLEAN: // convert !=0 to 1 - __ neg(R0, R3_RET); - __ orr(R0, R3_RET, R0); - __ srwi(R3_RET, R0, 31); + __ normalize_bool(R3_RET); break; case T_BYTE: // sign extend 8 bits From 71e3798bf67cddef37a8b4e377c4bf21dbd01567 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Mon, 1 Jul 2024 08:12:20 +0000 Subject: [PATCH 249/471] 8335308: compiler/uncommontrap/DeoptReallocFailure.java times out with SerialGC on Windows Reviewed-by: kvn, thartmann, chagedorn --- test/hotspot/jtreg/ProblemList.txt | 2 -- .../jtreg/compiler/uncommontrap/DeoptReallocFailure.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index febde61c4fda1..254e621bfdd47 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -70,8 +70,6 @@ compiler/startup/StartupOutput.java 8326615 generic-x64 compiler/codecache/CodeCacheFullCountTest.java 8332954 generic-all -compiler/uncommontrap/DeoptReallocFailure.java 8335308 windows-x64 - ############################################################################# # :hotspot_gc diff --git a/test/hotspot/jtreg/compiler/uncommontrap/DeoptReallocFailure.java b/test/hotspot/jtreg/compiler/uncommontrap/DeoptReallocFailure.java index 949a3ecb5c29f..96c79864b52e7 100644 --- a/test/hotspot/jtreg/compiler/uncommontrap/DeoptReallocFailure.java +++ b/test/hotspot/jtreg/compiler/uncommontrap/DeoptReallocFailure.java @@ -63,7 +63,7 @@ public static synchronized long test() { NoEscape[] noEscape = new NoEscape[45]; noEscape[0] = new NoEscape(); for (int i=0;i<1024*256;i++) { - root.array[i]= new Object[45]; + root.array[i]= new Object[4500]; } return noEscape[0].f1; } From 0a6ffa57954ddf4f92205205a5a1bada813d127a Mon Sep 17 00:00:00 2001 From: Severin Gehwolf <sgehwolf@openjdk.org> Date: Mon, 1 Jul 2024 08:47:29 +0000 Subject: [PATCH 250/471] 8261242: [Linux] OSContainer::is_containerized() returns true when run outside a container Reviewed-by: stuefe, iklam --- .../os/linux/cgroupSubsystem_linux.cpp | 119 +++++++++++++++--- .../os/linux/cgroupSubsystem_linux.hpp | 7 +- .../os/linux/cgroupV1Subsystem_linux.cpp | 11 ++ .../os/linux/cgroupV1Subsystem_linux.hpp | 8 +- .../os/linux/cgroupV2Subsystem_linux.cpp | 4 + .../os/linux/cgroupV2Subsystem_linux.hpp | 6 +- src/hotspot/os/linux/osContainer_linux.cpp | 39 +++++- src/hotspot/share/include/jvm.h | 3 + src/hotspot/share/prims/jvm.cpp | 12 ++ .../jdk/internal/platform/CgroupMetrics.java | 6 + .../internal/platform/CgroupSubsystem.java | 5 + .../linux/native/libjava/CgroupMetrics.c | 6 + .../jdk/internal/platform/Metrics.java | 17 +++ .../classes/sun/launcher/LauncherHelper.java | 4 + .../runtime/test_cgroupSubsystem_linux.cpp | 9 +- test/hotspot/jtreg/ProblemList.txt | 1 - ...{PlainRead.java => TestContainerized.java} | 42 +------ .../platform/cgroup/TestSystemSettings.java | 45 +++++++ .../lib/containers/cgroup/MetricsTester.java | 10 ++ 19 files changed, 290 insertions(+), 64 deletions(-) rename test/hotspot/jtreg/containers/cgroup/{PlainRead.java => TestContainerized.java} (54%) create mode 100644 test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java diff --git a/src/hotspot/os/linux/cgroupSubsystem_linux.cpp b/src/hotspot/os/linux/cgroupSubsystem_linux.cpp index 560589c3602c4..0dbd6ffd52be7 100644 --- a/src/hotspot/os/linux/cgroupSubsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupSubsystem_linux.cpp @@ -63,7 +63,9 @@ CgroupSubsystem* CgroupSubsystemFactory::create() { // Construct the subsystem, free resources and return // Note: any index in cg_infos will do as the path is the same for // all controllers. - CgroupController* unified = new CgroupV2Controller(cg_infos[MEMORY_IDX]._mount_path, cg_infos[MEMORY_IDX]._cgroup_path); + CgroupController* unified = new CgroupV2Controller(cg_infos[MEMORY_IDX]._mount_path, + cg_infos[MEMORY_IDX]._cgroup_path, + cg_infos[MEMORY_IDX]._read_only); log_debug(os, container)("Detected cgroups v2 unified hierarchy"); cleanup(cg_infos); return new CgroupV2Subsystem(unified); @@ -100,19 +102,19 @@ CgroupSubsystem* CgroupSubsystemFactory::create() { CgroupInfo info = cg_infos[i]; if (info._data_complete) { // pids controller might have incomplete data if (strcmp(info._name, "memory") == 0) { - memory = new CgroupV1MemoryController(info._root_mount_path, info._mount_path); + memory = new CgroupV1MemoryController(info._root_mount_path, info._mount_path, info._read_only); memory->set_subsystem_path(info._cgroup_path); } else if (strcmp(info._name, "cpuset") == 0) { - cpuset = new CgroupV1Controller(info._root_mount_path, info._mount_path); + cpuset = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only); cpuset->set_subsystem_path(info._cgroup_path); } else if (strcmp(info._name, "cpu") == 0) { - cpu = new CgroupV1Controller(info._root_mount_path, info._mount_path); + cpu = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only); cpu->set_subsystem_path(info._cgroup_path); } else if (strcmp(info._name, "cpuacct") == 0) { - cpuacct = new CgroupV1Controller(info._root_mount_path, info._mount_path); + cpuacct = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only); cpuacct->set_subsystem_path(info._cgroup_path); } else if (strcmp(info._name, "pids") == 0) { - pids = new CgroupV1Controller(info._root_mount_path, info._mount_path); + pids = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only); pids->set_subsystem_path(info._cgroup_path); } } else { @@ -127,7 +129,8 @@ void CgroupSubsystemFactory::set_controller_paths(CgroupInfo* cg_infos, int controller, const char* name, char* mount_path, - char* root_path) { + char* root_path, + bool read_only) { if (cg_infos[controller]._mount_path != nullptr) { // On some systems duplicate controllers get mounted in addition to // the main cgroup controllers most likely under /sys/fs/cgroup. In that @@ -139,6 +142,7 @@ void CgroupSubsystemFactory::set_controller_paths(CgroupInfo* cg_infos, os::free(cg_infos[controller]._root_mount_path); cg_infos[controller]._mount_path = os::strdup(mount_path); cg_infos[controller]._root_mount_path = os::strdup(root_path); + cg_infos[controller]._read_only = read_only; } else { log_debug(os, container)("Duplicate %s controllers detected. Picking %s, skipping %s.", name, cg_infos[controller]._mount_path, mount_path); @@ -146,9 +150,66 @@ void CgroupSubsystemFactory::set_controller_paths(CgroupInfo* cg_infos, } else { cg_infos[controller]._mount_path = os::strdup(mount_path); cg_infos[controller]._root_mount_path = os::strdup(root_path); + cg_infos[controller]._read_only = read_only; } } +/* + * Determine whether or not the mount options, which are comma separated, + * contain the 'ro' string. + */ +static bool find_ro_opt(char* mount_opts) { + char* token; + char* mo_ptr = mount_opts; + // mount options are comma-separated (man proc). + while ((token = strsep(&mo_ptr, ",")) != NULL) { + if (strcmp(token, "ro") == 0) { + return true; + } + } + return false; +} + +/* + * Read values of a /proc/self/mountinfo line into variables. For cgroups v1 + * super options are needed. On cgroups v2 super options are not used. + * + * The scanning of a single mountinfo line entry is as follows: + * + * 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue + * (1) (2) (3):(4) (5) (6) (7) (8) (9) (10) (11) (12) + * + * The numbers in parentheses are labels for the descriptions below: + * + * (1) mount ID: matched with '%*d' and discarded + * (2) parent ID: matched with '%*d' and discarded + * (3) major: ---,---> major, minor separated by ':'. matched with '%*d:%*d' and discarded + * (4) minor: ---' + * (5) root: matched with '%s' and captured in 'tmproot'. Must be non-empty. + * (6) mount point: matched with '%s' and captured in 'tmpmount'. Must be non-empty. + * (7) mount options: matched with '%s' and captured in 'mount_opts'. Must be non-empty. + * (8) optional fields: ---,---> matched with '%*[^-]-'. Anything not a hyphen, followed by a hyphen + * (9) separator: ---' and discarded. Note: The discarded match is space characters if there + * are no optionals. Otherwise it includes the optional fields as well. + * (10) filesystem type: matched with '%s' and captured in 'tmp_fs_type' + * (11) mount source: matched with '%*s' and discarded + * (12) super options: matched with '%s' and captured in 'tmpcgroups' + */ +static inline bool match_mount_info_line(char* line, + char* tmproot, + char* tmpmount, + char* mount_opts, + char* tmp_fs_type, + char* tmpcgroups) { + return sscanf(line, + "%*d %*d %*d:%*d %s %s %s%*[^-]- %s %*s %s", + tmproot, + tmpmount, + mount_opts, + tmp_fs_type, + tmpcgroups) == 5; +} + bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos, const char* proc_cgroups, const char* proc_self_cgroup, @@ -318,26 +379,40 @@ bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos, char tmproot[MAXPATHLEN+1]; char tmpmount[MAXPATHLEN+1]; char tmpcgroups[MAXPATHLEN+1]; + char mount_opts[MAXPATHLEN+1]; char *cptr = tmpcgroups; char *token; - // Cgroup v2 relevant info. We only look for the _mount_path iff is_cgroupsV2 so - // as to avoid memory stomping of the _mount_path pointer later on in the cgroup v1 - // block in the hybrid case. - if (is_cgroupsV2 && sscanf(p, "%*d %*d %*d:%*d %s %s %*[^-]- %s %*s %*s", tmproot, tmpmount, tmp_fs_type) == 3) { + /* Cgroup v2 relevant info. We only look for the _mount_path iff is_cgroupsV2 so + * as to avoid memory stomping of the _mount_path pointer later on in the cgroup v1 + * block in the hybrid case. + * + * We collect the read only mount option in the cgroup infos so as to have that + * info ready when determining is_containerized(). + */ + if (is_cgroupsV2 && match_mount_info_line(p, + tmproot, + tmpmount, + mount_opts, + tmp_fs_type, + tmpcgroups /* unused */)) { // we likely have an early match return (e.g. cgroup fs match), be sure we have cgroup2 as fstype if (strcmp("cgroup2", tmp_fs_type) == 0) { cgroupv2_mount_point_found = true; any_cgroup_mounts_found = true; + // For unified we only have a single line with cgroup2 fs type. + // Therefore use that option for all CG info structs. + bool ro_option = find_ro_opt(mount_opts); for (int i = 0; i < CG_INFO_LENGTH; i++) { - set_controller_paths(cg_infos, i, "(cg2, unified)", tmpmount, tmproot); + set_controller_paths(cg_infos, i, "(cg2, unified)", tmpmount, tmproot, ro_option); } } } /* Cgroup v1 relevant info * - * Find the cgroup mount point for memory, cpuset, cpu, cpuacct, pids + * Find the cgroup mount point for memory, cpuset, cpu, cpuacct, pids. For each controller + * determine whether or not they show up as mounted read only or not. * * Example for docker: * 219 214 0:29 /docker/7208cebd00fa5f2e342b1094f7bed87fa25661471a4637118e65f1c995be8a34 /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,memory @@ -346,8 +421,9 @@ bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos, * 34 28 0:29 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,memory * * 44 31 0:39 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:23 - cgroup cgroup rw,pids + * */ - if (sscanf(p, "%*d %*d %*d:%*d %s %s %*[^-]- %s %*s %s", tmproot, tmpmount, tmp_fs_type, tmpcgroups) == 4) { + if (match_mount_info_line(p, tmproot, tmpmount, mount_opts, tmp_fs_type, tmpcgroups)) { if (strcmp("cgroup", tmp_fs_type) != 0) { // Skip cgroup2 fs lines on hybrid or unified hierarchy. continue; @@ -355,23 +431,28 @@ bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos, while ((token = strsep(&cptr, ",")) != nullptr) { if (strcmp(token, "memory") == 0) { any_cgroup_mounts_found = true; - set_controller_paths(cg_infos, MEMORY_IDX, token, tmpmount, tmproot); + bool ro_option = find_ro_opt(mount_opts); + set_controller_paths(cg_infos, MEMORY_IDX, token, tmpmount, tmproot, ro_option); cg_infos[MEMORY_IDX]._data_complete = true; } else if (strcmp(token, "cpuset") == 0) { any_cgroup_mounts_found = true; - set_controller_paths(cg_infos, CPUSET_IDX, token, tmpmount, tmproot); + bool ro_option = find_ro_opt(mount_opts); + set_controller_paths(cg_infos, CPUSET_IDX, token, tmpmount, tmproot, ro_option); cg_infos[CPUSET_IDX]._data_complete = true; } else if (strcmp(token, "cpu") == 0) { any_cgroup_mounts_found = true; - set_controller_paths(cg_infos, CPU_IDX, token, tmpmount, tmproot); + bool ro_option = find_ro_opt(mount_opts); + set_controller_paths(cg_infos, CPU_IDX, token, tmpmount, tmproot, ro_option); cg_infos[CPU_IDX]._data_complete = true; } else if (strcmp(token, "cpuacct") == 0) { any_cgroup_mounts_found = true; - set_controller_paths(cg_infos, CPUACCT_IDX, token, tmpmount, tmproot); + bool ro_option = find_ro_opt(mount_opts); + set_controller_paths(cg_infos, CPUACCT_IDX, token, tmpmount, tmproot, ro_option); cg_infos[CPUACCT_IDX]._data_complete = true; } else if (strcmp(token, "pids") == 0) { any_cgroup_mounts_found = true; - set_controller_paths(cg_infos, PIDS_IDX, token, tmpmount, tmproot); + bool ro_option = find_ro_opt(mount_opts); + set_controller_paths(cg_infos, PIDS_IDX, token, tmpmount, tmproot, ro_option); cg_infos[PIDS_IDX]._data_complete = true; } } diff --git a/src/hotspot/os/linux/cgroupSubsystem_linux.hpp b/src/hotspot/os/linux/cgroupSubsystem_linux.hpp index 6c17ff4508d55..00419c77570ae 100644 --- a/src/hotspot/os/linux/cgroupSubsystem_linux.hpp +++ b/src/hotspot/os/linux/cgroupSubsystem_linux.hpp @@ -105,6 +105,7 @@ class CgroupController: public CHeapObj<mtInternal> { public: virtual char* subsystem_path() = 0; + virtual bool is_read_only() = 0; /* Read a numerical value as unsigned long * @@ -211,6 +212,7 @@ class CgroupSubsystem: public CHeapObj<mtInternal> { virtual jlong memory_max_usage_in_bytes() = 0; virtual jlong rss_usage_in_bytes() = 0; virtual jlong cache_usage_in_bytes() = 0; + virtual bool is_containerized() = 0; virtual char * cpu_cpuset_cpus() = 0; virtual char * cpu_cpuset_memory_nodes() = 0; @@ -233,6 +235,7 @@ class CgroupInfo : public StackObj { char* _name; int _hierarchy_id; bool _enabled; + bool _read_only; // whether or not the mount path is mounted read-only bool _data_complete; // indicating cgroup v1 data is complete for this controller char* _cgroup_path; // cgroup controller path from /proc/self/cgroup char* _root_mount_path; // root mount path from /proc/self/mountinfo. Unused for cgroup v2 @@ -243,6 +246,7 @@ class CgroupInfo : public StackObj { _name = nullptr; _hierarchy_id = -1; _enabled = false; + _read_only = false; _data_complete = false; _cgroup_path = nullptr; _root_mount_path = nullptr; @@ -274,7 +278,8 @@ class CgroupSubsystemFactory: AllStatic { int controller, const char* name, char* mount_path, - char* root_path); + char* root_path, + bool read_only); // Determine the cgroup type (version 1 or version 2), given // relevant paths to files. Sets 'flags' accordingly. static bool determine_type(CgroupInfo* cg_infos, diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp index 72adaa23b8132..3f6ae813810f2 100644 --- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp @@ -215,6 +215,17 @@ jlong CgroupV1Subsystem::memory_soft_limit_in_bytes() { } } +bool CgroupV1Subsystem::is_containerized() { + // containerized iff all required controllers are mounted + // read-only. See OSContainer::is_containerized() for + // the full logic. + // + return _memory->controller()->is_read_only() && + _cpu->controller()->is_read_only() && + _cpuacct->is_read_only() && + _cpuset->is_read_only(); +} + /* memory_usage_in_bytes * * Return the amount of used memory for this process. diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp index 254b17de0ba8c..2b67678c2e8da 100644 --- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp +++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp @@ -36,19 +36,22 @@ class CgroupV1Controller: public CgroupController { /* mountinfo contents */ char *_root; char *_mount_point; + bool _read_only; /* Constructed subsystem directory */ char *_path; public: - CgroupV1Controller(char *root, char *mountpoint) { + CgroupV1Controller(char *root, char *mountpoint, bool ro) { _root = os::strdup(root); _mount_point = os::strdup(mountpoint); _path = nullptr; + _read_only = ro; } virtual void set_subsystem_path(char *cgroup_path); char *subsystem_path() { return _path; } + bool is_read_only() { return _read_only; } }; class CgroupV1MemoryController: public CgroupV1Controller { @@ -65,7 +68,7 @@ class CgroupV1MemoryController: public CgroupV1Controller { void set_hierarchical(bool value) { _uses_mem_hierarchy = value; } public: - CgroupV1MemoryController(char *root, char *mountpoint) : CgroupV1Controller(root, mountpoint) { + CgroupV1MemoryController(char *root, char *mountpoint, bool ro) : CgroupV1Controller(root, mountpoint, ro) { _uses_mem_hierarchy = false; } @@ -97,6 +100,7 @@ class CgroupV1Subsystem: public CgroupSubsystem { jlong pids_max(); jlong pids_current(); + bool is_containerized(); void print_version_specific_info(outputStream* st); diff --git a/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp index 1ba7c1e69d5b3..1f97b0212395c 100644 --- a/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp @@ -94,6 +94,10 @@ int CgroupV2Subsystem::cpu_quota() { return limit; } +bool CgroupV2Subsystem::is_containerized() { + return _unified->is_read_only(); +} + char* CgroupV2Subsystem::cpu_cpuset_cpus() { char cpus[1024]; CONTAINER_READ_STRING_CHECKED(_unified, "/cpuset.cpus", "cpuset.cpus", cpus, 1024); diff --git a/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp b/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp index a004c8f75b984..8e06466a138a5 100644 --- a/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp +++ b/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp @@ -33,19 +33,22 @@ class CgroupV2Controller: public CgroupController { char *_mount_path; /* The cgroup path for the controller */ char *_cgroup_path; + bool _read_only; /* Constructed full path to the subsystem directory */ char *_path; static char* construct_path(char* mount_path, char *cgroup_path); public: - CgroupV2Controller(char * mount_path, char *cgroup_path) { + CgroupV2Controller(char * mount_path, char *cgroup_path, bool ro) { _mount_path = mount_path; _cgroup_path = os::strdup(cgroup_path); _path = construct_path(mount_path, cgroup_path); + _read_only = ro; } char *subsystem_path() { return _path; } + bool is_read_only() { return _read_only; } }; class CgroupV2Subsystem: public CgroupSubsystem { @@ -83,6 +86,7 @@ class CgroupV2Subsystem: public CgroupSubsystem { jlong pids_max(); jlong pids_current(); + bool is_containerized(); void print_version_specific_info(outputStream* st); const char * container_type() { diff --git a/src/hotspot/os/linux/osContainer_linux.cpp b/src/hotspot/os/linux/osContainer_linux.cpp index fdb138c864faa..25e8eb464108d 100644 --- a/src/hotspot/os/linux/osContainer_linux.cpp +++ b/src/hotspot/os/linux/osContainer_linux.cpp @@ -58,8 +58,43 @@ void OSContainer::init() { if (cgroup_subsystem == nullptr) { return; // Required subsystem files not found or other error } - - _is_containerized = true; + /* + * In order to avoid a false positive on is_containerized() on + * Linux systems outside a container *and* to ensure compatibility + * with in-container usage, we detemine is_containerized() by two + * steps: + * 1.) Determine if all the cgroup controllers are mounted read only. + * If yes, is_containerized() == true. Otherwise, do the fallback + * in 2.) + * 2.) Query for memory and cpu limits. If any limit is set, we set + * is_containerized() == true. + * + * Step 1.) covers the basic in container use-cases. Step 2.) ensures + * that limits enforced by other means (e.g. systemd slice) are properly + * detected. + */ + const char *reason; + bool any_mem_cpu_limit_present = false; + bool controllers_read_only = cgroup_subsystem->is_containerized(); + if (controllers_read_only) { + // in-container case + reason = " because all controllers are mounted read-only (container case)"; + } else { + // We can be in one of two cases: + // 1.) On a physical Linux system without any limit + // 2.) On a physical Linux system with a limit enforced by other means (like systemd slice) + any_mem_cpu_limit_present = cgroup_subsystem->memory_limit_in_bytes() > 0 || + os::Linux::active_processor_count() != cgroup_subsystem->active_processor_count(); + if (any_mem_cpu_limit_present) { + reason = " because either a cpu or a memory limit is present"; + } else { + reason = " because no cpu or memory limit is present"; + } + } + _is_containerized = controllers_read_only || any_mem_cpu_limit_present; + log_debug(os, container)("OSContainer::init: is_containerized() = %s%s", + _is_containerized ? "true" : "false", + reason); } const char * OSContainer::container_type() { diff --git a/src/hotspot/share/include/jvm.h b/src/hotspot/share/include/jvm.h index 99cdac3aec5bf..0aad9160ae8b5 100644 --- a/src/hotspot/share/include/jvm.h +++ b/src/hotspot/share/include/jvm.h @@ -150,6 +150,9 @@ JVM_ActiveProcessorCount(void); JNIEXPORT jboolean JNICALL JVM_IsUseContainerSupport(void); +JNIEXPORT jboolean JNICALL +JVM_IsContainerized(void); + JNIEXPORT void * JNICALL JVM_LoadZipLibrary(); diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp index 9588f32e6b376..d55c8a6be656d 100644 --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -113,6 +113,9 @@ #if INCLUDE_MANAGEMENT #include "services/finalizerService.hpp" #endif +#ifdef LINUX +#include "osContainer_linux.hpp" +#endif #include <errno.h> @@ -496,6 +499,15 @@ JVM_LEAF(jboolean, JVM_IsUseContainerSupport(void)) return JNI_FALSE; JVM_END +JVM_LEAF(jboolean, JVM_IsContainerized(void)) +#ifdef LINUX + if (OSContainer::is_containerized()) { + return JNI_TRUE; + } +#endif + return JNI_FALSE; +JVM_END + // java.lang.Throwable ////////////////////////////////////////////////////// JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver)) diff --git a/src/java.base/linux/classes/jdk/internal/platform/CgroupMetrics.java b/src/java.base/linux/classes/jdk/internal/platform/CgroupMetrics.java index 8797711bf4b91..af551a07b1e71 100644 --- a/src/java.base/linux/classes/jdk/internal/platform/CgroupMetrics.java +++ b/src/java.base/linux/classes/jdk/internal/platform/CgroupMetrics.java @@ -35,6 +35,11 @@ public class CgroupMetrics implements Metrics { this.subsystem = Objects.requireNonNull(subsystem); } + @Override + public boolean isContainerized() { + return isContainerized0(); + } + @Override public String getProvider() { return subsystem.getProvider(); @@ -194,6 +199,7 @@ public static Metrics getInstance() { } private static native boolean isUseContainerSupport(); + private static native boolean isContainerized0(); private static native long getTotalMemorySize0(); private static native long getTotalSwapSize0(); diff --git a/src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystem.java b/src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystem.java index 952de13e9f25b..7df86d03ff4e3 100644 --- a/src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystem.java +++ b/src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystem.java @@ -31,6 +31,11 @@ */ public interface CgroupSubsystem extends Metrics { + + default boolean isContainerized() { + return false; // This default impl is never used + } + /** * Returned for metrics of type long if the underlying implementation * has determined that no limit is being imposed. diff --git a/src/java.base/linux/native/libjava/CgroupMetrics.c b/src/java.base/linux/native/libjava/CgroupMetrics.c index a5e41167bc319..e2f98633459be 100644 --- a/src/java.base/linux/native/libjava/CgroupMetrics.c +++ b/src/java.base/linux/native/libjava/CgroupMetrics.c @@ -36,6 +36,12 @@ Java_jdk_internal_platform_CgroupMetrics_isUseContainerSupport(JNIEnv *env, jcla return JVM_IsUseContainerSupport(); } +JNIEXPORT jboolean JNICALL +Java_jdk_internal_platform_CgroupMetrics_isContainerized0(JNIEnv *env, jclass ignored) +{ + return JVM_IsContainerized(); +} + JNIEXPORT jlong JNICALL Java_jdk_internal_platform_CgroupMetrics_getTotalMemorySize0 (JNIEnv *env, jclass ignored) diff --git a/src/java.base/share/classes/jdk/internal/platform/Metrics.java b/src/java.base/share/classes/jdk/internal/platform/Metrics.java index 50523d137ef5d..07d60f7f9fe88 100644 --- a/src/java.base/share/classes/jdk/internal/platform/Metrics.java +++ b/src/java.base/share/classes/jdk/internal/platform/Metrics.java @@ -71,6 +71,23 @@ public static Metrics systemMetrics() { */ public String getProvider(); + /** + * Determines whether or not the underlying system + * has useful metrics (a.k.a. is containerized). + * + * @implNote + * Note that Metrics on some systems aren't useful. + * For example on a regular Linux system with cgroups + * present, with no limits enforced and not running in + * a container, Metric aren't useful. This can be used + * in order to determine if the system is containerized. + * + * @return true when the JVM runs in containerized mode. + * false otherwise. + * + */ + public boolean isContainerized(); + /* *************************************************************** * CPU Accounting Subsystem diff --git a/src/java.base/share/classes/sun/launcher/LauncherHelper.java b/src/java.base/share/classes/sun/launcher/LauncherHelper.java index 601155260273a..ccb82c84c92e4 100644 --- a/src/java.base/share/classes/sun/launcher/LauncherHelper.java +++ b/src/java.base/share/classes/sun/launcher/LauncherHelper.java @@ -370,6 +370,10 @@ private static void printSystemMetrics() { final long longRetvalNotSupported = -2; ostream.println(INDENT + "Provider: " + c.getProvider()); + if (!c.isContainerized()) { + ostream.println(INDENT + "System not containerized."); + return; + } ostream.println(INDENT + "Effective CPU Count: " + c.getEffectiveCpuCount()); ostream.println(formatCpuVal(c.getCpuPeriod(), INDENT + "CPU Period: ", longRetvalNotSupported)); ostream.println(formatCpuVal(c.getCpuQuota(), INDENT + "CPU Quota: ", longRetvalNotSupported)); diff --git a/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp b/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp index aa1d2a19b28ec..0f054a3bd7293 100644 --- a/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp +++ b/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp @@ -78,6 +78,9 @@ class TestController : public CgroupController { char* subsystem_path() override { return _path; }; + bool is_read_only() override { + return true; // doesn't matter + } }; static void fill_file(const char* path, const char* content) { @@ -436,7 +439,8 @@ TEST(cgroupTest, set_cgroupv1_subsystem_path) { &container_engine }; for (int i = 0; i < length; i++) { CgroupV1Controller* ctrl = new CgroupV1Controller( (char*)testCases[i]->root_path, - (char*)testCases[i]->mount_path); + (char*)testCases[i]->mount_path, + true /* read-only mount */); ctrl->set_subsystem_path((char*)testCases[i]->cgroup_path); ASSERT_STREQ(testCases[i]->expected_path, ctrl->subsystem_path()); } @@ -460,7 +464,8 @@ TEST(cgroupTest, set_cgroupv2_subsystem_path) { &sub_path }; for (int i = 0; i < length; i++) { CgroupV2Controller* ctrl = new CgroupV2Controller( (char*)testCases[i]->mount_path, - (char*)testCases[i]->cgroup_path); + (char*)testCases[i]->cgroup_path, + true /* read-only mount */); ASSERT_STREQ(testCases[i]->expected_path, ctrl->subsystem_path()); } } diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 254e621bfdd47..0f574f7168a0c 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -113,7 +113,6 @@ runtime/ClassInitErrors/TestStackOverflowDuringInit.java 8334545 generic-all applications/jcstress/copy.java 8229852 linux-all -containers/cgroup/PlainRead.java 8333967,8261242 linux-all containers/docker/TestJcmd.java 8278102 linux-all containers/docker/TestMemoryAwareness.java 8303470 linux-all containers/docker/TestJFREvents.java 8327723 linux-x64 diff --git a/test/hotspot/jtreg/containers/cgroup/PlainRead.java b/test/hotspot/jtreg/containers/cgroup/TestContainerized.java similarity index 54% rename from test/hotspot/jtreg/containers/cgroup/PlainRead.java rename to test/hotspot/jtreg/containers/cgroup/TestContainerized.java index 21eccd79835d4..52cf5451a8d5c 100644 --- a/test/hotspot/jtreg/containers/cgroup/PlainRead.java +++ b/test/hotspot/jtreg/containers/cgroup/TestContainerized.java @@ -22,57 +22,27 @@ */ /* - * @test PlainRead + * @test + * @bug 8261242 * @key cgroups * @requires os.family == "linux" * @requires vm.flagless * @library /testlibrary /test/lib * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI PlainRead + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestContainerized */ import jdk.test.lib.process.ProcessTools; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.Platform; import jdk.test.whitebox.WhiteBox; -public class PlainRead { - - static public void match(OutputAnalyzer oa, String what, String value) { - oa.shouldMatch("^.*" + what + " *" + value + ".*$"); - } - - static public void noMatch(OutputAnalyzer oa, String what, String value) { - oa.shouldNotMatch("^.*" + what + " *" + value + ".*$"); - } - - static final String good_value = "(\\d+|-1|-2|Unlimited)"; - static final String bad_value = "(failed)"; - - static final String[] variables = {"Memory Limit is:", "CPU Quota is:", "CPU Period is:", "active_processor_count:"}; - - static public void isContainer(OutputAnalyzer oa) { - for (String v: variables) { - match(oa, v, good_value); - } - for (String v: variables) { - noMatch(oa, v, bad_value); - } - } - - static public void isNotContainer(OutputAnalyzer oa) { - oa.shouldMatch("^.*Can't open /proc/self/mountinfo.*$"); - } +public class TestContainerized { public static void main(String[] args) throws Exception { WhiteBox wb = WhiteBox.getWhiteBox(); - ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-Xlog:os+container=trace", "-version"); - OutputAnalyzer output = new OutputAnalyzer(pb.start()); - if (wb.isContainerized()) { - System.out.println("Inside a cgroup, testing..."); - isContainer(output); + throw new RuntimeException("Test failed! Expected not containerized on plain Linux."); } + System.out.println("Plain linux, no limits. Passed!"); } } diff --git a/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java b/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java new file mode 100644 index 0000000000000..8d9279e1603c1 --- /dev/null +++ b/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @key cgroups + * @requires os.family == "linux" + * @requires vm.flagless + * @library /test/lib + * @build TestSystemSettings + * @run main/othervm TestSystemSettings + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestSystemSettings { + + public static void main(String[] args) throws Exception { + ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XshowSettings:system", "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + + output.shouldContain("System not containerized."); + } +} diff --git a/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java b/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java index a6eff3d237aa4..0b29d288cd92d 100644 --- a/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java +++ b/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java @@ -69,6 +69,16 @@ private void testAll(Metrics m, boolean inContainer) throws Exception { tester.testMemoryUsage(); } tester.testMisc(); + testContainerized(m, inContainer); + } + + private void testContainerized(Metrics m, boolean inContainer) { + if (m.isContainerized() != inContainer) { + throw new RuntimeException("containerized test failed. " + + "Expected isContainerized()==" + inContainer + + " but got '" + m.isContainerized() + "'"); + } + System.out.println("testContainerized() PASSED!"); } public static void main(String[] args) throws Exception { From 747e1e47f576b0ca3ac97d1deea87418e67ff2d1 Mon Sep 17 00:00:00 2001 From: Evgeny Nikitin <enikitin@openjdk.org> Date: Mon, 1 Jul 2024 10:21:31 +0000 Subject: [PATCH 251/471] 8334295: CTW: update modules Reviewed-by: shade, thartmann --- .../applications/ctw/modules/generate.bash | 4 +- .../ctw/modules/jdk_incubator_vector.java | 38 +++++++++++++++++++ .../ctw/modules/jdk_internal_md.java | 38 +++++++++++++++++++ .../ctw/modules/jdk_jpackage.java | 38 +++++++++++++++++++ .../ctw/modules/jdk_nio_mapmode.java | 38 +++++++++++++++++++ 5 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 test/hotspot/jtreg/applications/ctw/modules/jdk_incubator_vector.java create mode 100644 test/hotspot/jtreg/applications/ctw/modules/jdk_internal_md.java create mode 100644 test/hotspot/jtreg/applications/ctw/modules/jdk_jpackage.java create mode 100644 test/hotspot/jtreg/applications/ctw/modules/jdk_nio_mapmode.java diff --git a/test/hotspot/jtreg/applications/ctw/modules/generate.bash b/test/hotspot/jtreg/applications/ctw/modules/generate.bash index 56e191e7af184..935503484b9c0 100644 --- a/test/hotspot/jtreg/applications/ctw/modules/generate.bash +++ b/test/hotspot/jtreg/applications/ctw/modules/generate.bash @@ -1,6 +1,6 @@ #!/bin/bash # -# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,7 @@ do echo creating $file for $module... cat > $file <<EOF /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_incubator_vector.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_incubator_vector.java new file mode 100644 index 0000000000000..4a9335447780d --- /dev/null +++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_incubator_vector.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary run CTW for all classes from jdk.incubator.vector module + * + * @library /test/lib / /testlibrary/ctw/src + * @modules java.base/jdk.internal.access + * java.base/jdk.internal.jimage + * java.base/jdk.internal.misc + * java.base/jdk.internal.reflect + * @modules jdk.incubator.vector + * + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run driver/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.incubator.vector + */ diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_internal_md.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_internal_md.java new file mode 100644 index 0000000000000..21c6afe3c7647 --- /dev/null +++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_internal_md.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary run CTW for all classes from jdk.internal.md module + * + * @library /test/lib / /testlibrary/ctw/src + * @modules java.base/jdk.internal.access + * java.base/jdk.internal.jimage + * java.base/jdk.internal.misc + * java.base/jdk.internal.reflect + * @modules jdk.internal.md + * + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run driver/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.internal.md + */ diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_jpackage.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_jpackage.java new file mode 100644 index 0000000000000..a8fd34323c131 --- /dev/null +++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_jpackage.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary run CTW for all classes from jdk.jpackage module + * + * @library /test/lib / /testlibrary/ctw/src + * @modules java.base/jdk.internal.access + * java.base/jdk.internal.jimage + * java.base/jdk.internal.misc + * java.base/jdk.internal.reflect + * @modules jdk.jpackage + * + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run driver/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.jpackage + */ diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_nio_mapmode.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_nio_mapmode.java new file mode 100644 index 0000000000000..a43d2d7aab617 --- /dev/null +++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_nio_mapmode.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary run CTW for all classes from jdk.nio.mapmode module + * + * @library /test/lib / /testlibrary/ctw/src + * @modules java.base/jdk.internal.access + * java.base/jdk.internal.jimage + * java.base/jdk.internal.misc + * java.base/jdk.internal.reflect + * @modules jdk.nio.mapmode + * + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run driver/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.nio.mapmode + */ From 3ca2bcd402042791d7460dd79ee16a3f88436b3e Mon Sep 17 00:00:00 2001 From: Adam Sotona <asotona@openjdk.org> Date: Mon, 1 Jul 2024 11:51:13 +0000 Subject: [PATCH 252/471] 8335060: ClassCastException after JDK-8294960 Reviewed-by: liach, jpai --- .../invoke/TypeConvertingMethodAdapter.java | 16 +- .../java/lang/invoke/TypeConvertingTest.java | 798 ++++++++++++++++++ 2 files changed, 806 insertions(+), 8 deletions(-) create mode 100644 test/jdk/java/lang/invoke/TypeConvertingTest.java diff --git a/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java b/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java index e35271dc8b42c..7a1419f03b109 100644 --- a/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java +++ b/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java @@ -69,14 +69,14 @@ private static MethodRefEntry unbox(ClassDesc owner, String methodName, ClassDes } private static TypeKind primitiveTypeKindFromClass(Class<?> type) { - if (type == int.class) return TypeKind.IntType; - if (type == long.class) return TypeKind.LongType; - if (type == boolean.class) return TypeKind.BooleanType; - if (type == short.class) return TypeKind.ShortType; - if (type == byte.class) return TypeKind.ByteType; - if (type == char.class) return TypeKind.CharType; - if (type == float.class) return TypeKind.FloatType; - if (type == double.class) return TypeKind.DoubleType; + if (type == Integer.class) return TypeKind.IntType; + if (type == Long.class) return TypeKind.LongType; + if (type == Boolean.class) return TypeKind.BooleanType; + if (type == Short.class) return TypeKind.ShortType; + if (type == Byte.class) return TypeKind.ByteType; + if (type == Character.class) return TypeKind.CharType; + if (type == Float.class) return TypeKind.FloatType; + if (type == Double.class) return TypeKind.DoubleType; return null; } diff --git a/test/jdk/java/lang/invoke/TypeConvertingTest.java b/test/jdk/java/lang/invoke/TypeConvertingTest.java new file mode 100644 index 0000000000000..1df6e007880d1 --- /dev/null +++ b/test/jdk/java/lang/invoke/TypeConvertingTest.java @@ -0,0 +1,798 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +/* @test + * @bug 8335060 + * @summary unit tests of TypeConvertingMethodAdapter + * @run junit TypeConvertingTest + */ +public class TypeConvertingTest { + + static void smallBooleanC(boolean b) { + assertTrue(b); + } + + static void bigBooleanC(Boolean b) { + assertTrue(b); + } + + static void smallByteC(byte b) { + assertEquals(1, b); + } + + static void bigByteC(Byte b) { + assertEquals((byte)1, b); + } + + static void smallShortC(short s) { + assertEquals(1, s); + } + + static void bigShortC(Short s) { + assertEquals((short)1, s); + } + + static void smallCharC(char c) { + assertEquals(1, c); + } + + static void bigCharC(Character c) { + assertEquals((char)1, c); + } + + static void smallIntC(int i) { + assertEquals(1, i); + } + + static void bigIntC(Integer i) { + assertEquals(1, i); + } + + static void smallLongC(long l) { + assertEquals(1, l); + } + + static void bigLongC(Long l) { + assertEquals(1, l); + } + + static void smallFloatC(float f) { + assertEquals(1.0f, f); + } + + static void bigFloatC(Float f) { + assertEquals(1.0f, f); + } + + static void smallDoubleC(double d) { + assertEquals(1.0, d); + } + + static void bigDoubleC(Double d) { + assertEquals(1.0, d); + } + + static void numberC(Number n) { + assertEquals(1, n.intValue()); + } + + + static boolean smallBooleanS() {return true;} + + static Boolean bigBooleanS() {return true;} + + static byte smallByteS() {return 1;} + + static Byte bigByteS() {return 1;} + + static short smallShortS() {return 1;} + + static Short bigShortS() {return 1;} + + static char smallCharS() {return 1;} + + static Character bigCharS() {return 1;} + + static int smallIntS() {return 1;} + + static Integer bigIntS() {return 1;} + + static long smallLongS() {return 1;} + + static Long bigLongS() {return 1l;} + + static float smallFloatS() {return 1;} + + static Float bigFloatS() {return 1f;} + + static double smallDoubleS() {return 1;} + + static Double bigDoubleS() {return 1d;} + + static Number numberS() {return 1;} + + + interface GenericC<T> { + void m(T t); + } + + interface SmallBooleanC { + void m(boolean b); + } + + interface BigBooleanC { + void m(Boolean b); + } + + interface SmallByteC { + void m(byte b); + } + + interface BigByteC { + void m(Byte b); + } + + interface SmallShortC { + void m(short s); + } + + interface BigShortC { + void m(Short s); + } + + interface SmallCharC { + void m(char c); + } + + interface BigCharC { + void m(Character c); + } + + interface SmallIntC { + void m(int i); + } + + interface BigIntC { + void m(Integer i); + } + + interface SmallLongC { + void m(long l); + } + + interface BigLongC { + void m(Long l); + } + + interface SmallFloatC { + void m(float f); + } + + interface BigFloatC { + void m(Float f); + } + + interface SmallDoubleC { + void m(double d); + } + + interface BigDoubleC { + void m(Double d); + } + + interface BigNumberC { + void m(Number n); + } + + + interface GenericS<T> { + T m(); + } + + interface SmallBooleanS { + boolean m(); + } + + interface BigBooleanS { + Boolean m(); + } + + interface SmallByteS { + byte m(); + } + + interface BigByteS { + Byte m(); + } + + interface SmallShortS { + short m(); + } + + interface BigShortS { + Short m(); + } + + interface SmallCharS { + char m(); + } + + interface BigCharS { + Character m(); + } + + interface SmallIntS { + int m(); + } + + interface BigIntS { + Integer m(); + } + + interface SmallLongS { + long m(); + } + + interface BigLongS { + Long m(); + } + + interface SmallFloatS { + float m(); + } + + interface BigFloatS { + Float m(); + } + + interface SmallDoubleS { + double m(); + } + + interface BigDoubleS { + Double m(); + } + + interface BigNumberS { + Number m(); + } + + + static void testGenericBoolean(GenericC<Boolean> t) { + t.m(true); + } + + static void testGenericByte(GenericC<Byte> t) { + t.m((byte)1); + } + + static void testGenericShort(GenericC<Short> t) { + t.m((short)1); + } + + static void testGenericChar(GenericC<Character> t) { + t.m((char)1); + } + + static void testGenericInt(GenericC<Integer> t) { + t.m(1); + } + + static void testGenericLong(GenericC<Long> t) { + t.m(1l); + } + + static void testGenericFloat(GenericC<Float> t) { + t.m(1.0f); + } + + static void testGenericDouble(GenericC<Double> t) { + t.m(1.0d); + } + + static void testGenericNumber(GenericC<Number> t) { + t.m(1); + } + + static void testSmallBoolean(SmallBooleanC t) { + t.m(true); + } + + static void testSmallByte(SmallByteC t) { + t.m((byte)1); + } + + static void testSmallShort(SmallShortC t) { + t.m((short)1); + } + + static void testSmallChar(SmallCharC t) { + t.m((char)1); + } + + static void testSmallInt(SmallIntC t) { + t.m(1); + } + + static void testSmallLong(SmallLongC t) { + t.m(1l); + } + + static void testSmallFloat(SmallFloatC t) { + t.m(1.0f); + } + + static void testSmallDouble(SmallDoubleC t) { + t.m(1.0d); + } + + static void testBigBoolean(BigBooleanC t) { + t.m(true); + } + + static void testBigByte(BigByteC t) { + t.m((byte)1); + } + + static void testBigShort(BigShortC t) { + t.m((short)1); + } + + static void testBigChar(BigCharC t) { + t.m((char)1); + } + + static void testBigInt(BigIntC t) { + t.m(1); + } + + static void testBigLong(BigLongC t) { + t.m(1l); + } + + static void testBigFloat(BigFloatC t) { + t.m(1.0f); + } + + static void testBigDouble(BigDoubleC t) { + t.m(1.0d); + } + + static void testBigNumber(BigNumberC t) { + t.m(1); + } + + + static void testGenericBoolean(GenericS<Boolean> t) { + assertEquals(true, t.m()); + } + + static void testGenericByte(GenericS<Byte> t) { + assertEquals((byte)1, t.m()); + } + + static void testGenericShort(GenericS<Short> t) { + assertEquals((short)1, t.m()); + } + + static void testGenericChar(GenericS<Character> t) { + assertEquals((char)1, t.m()); + } + + static void testGenericInt(GenericS<Integer> t) { + assertEquals(1, t.m()); + } + + static void testGenericLong(GenericS<Long> t) { + assertEquals(1, t.m()); + } + + static void testGenericFloat(GenericS<Float> t) { + assertEquals(1.0f, t.m()); + } + + static void testGenericDouble(GenericS<Double> t) { + assertEquals(1.0d, t.m()); + } + + static void testGenericNumber(GenericS<Number> t) { + assertEquals(1, t.m().intValue()); + } + + static void testSmallBoolean(SmallBooleanS t) { + assertEquals(true, t.m()); + } + + static void testSmallByte(SmallByteS t) { + assertEquals(1, t.m()); + } + + static void testSmallShort(SmallShortS t) { + assertEquals(1, t.m()); + } + + static void testSmallChar(SmallCharS t) { + assertEquals(1, t.m()); + } + + static void testSmallInt(SmallIntS t) { + assertEquals(1, t.m()); + } + + static void testSmallLong(SmallLongS t) { + assertEquals(1, t.m()); + } + + static void testSmallFloat(SmallFloatS t) { + assertEquals(1.0f, t.m()); + } + + static void testSmallDouble(SmallDoubleS t) { + assertEquals(1.0d, t.m()); + } + + static void testBigBoolean(BigBooleanS t) { + assertEquals(true, t.m()); + } + + static void testBigByte(BigByteS t) { + assertEquals((byte)1, t.m()); + } + + static void testBigShort(BigShortS t) { + assertEquals((short)1, t.m()); + } + + static void testBigChar(BigCharS t) { + assertEquals((char)1, t.m()); + } + + static void testBigInt(BigIntS t) { + assertEquals(1, t.m()); + } + + static void testBigLong(BigLongS t) { + assertEquals(1, t.m()); + } + + static void testBigFloat(BigFloatS t) { + assertEquals(1.0f, t.m()); + } + + static void testBigDouble(BigDoubleS t) { + assertEquals(1.0f, t.m()); + } + + static void testBigNumber(BigNumberS t) { + assertEquals(1, t.m().intValue()); + } + + + @Test + void testGenericBoolean() { + testGenericBoolean(TypeConvertingTest::smallBooleanC); + testGenericBoolean(TypeConvertingTest::bigBooleanC); + + testGenericBoolean(TypeConvertingTest::smallBooleanS); + testGenericBoolean(TypeConvertingTest::bigBooleanS); + } + + @Test + void testGenericByte() { + testGenericByte(TypeConvertingTest::smallByteC); + testGenericByte(TypeConvertingTest::bigByteC); + testGenericByte(TypeConvertingTest::smallShortC); + testGenericByte(TypeConvertingTest::smallIntC); + testGenericByte(TypeConvertingTest::smallLongC); + testGenericByte(TypeConvertingTest::smallFloatC); + testGenericByte(TypeConvertingTest::smallDoubleC); + testGenericByte(TypeConvertingTest::numberC); + + testGenericByte(TypeConvertingTest::smallByteS); + testGenericByte(TypeConvertingTest::bigByteS); + } + + @Test + void testGenericShort() { + testGenericShort(TypeConvertingTest::smallShortC); + testGenericShort(TypeConvertingTest::bigShortC); + testGenericShort(TypeConvertingTest::smallIntC); + testGenericShort(TypeConvertingTest::smallLongC); + testGenericShort(TypeConvertingTest::smallFloatC); + testGenericShort(TypeConvertingTest::smallDoubleC); + testGenericShort(TypeConvertingTest::numberC); + + testGenericShort(TypeConvertingTest::smallShortS); + testGenericShort(TypeConvertingTest::bigShortS); + } + + @Test + void testGenericChar() { + testGenericChar(TypeConvertingTest::smallCharC); + testGenericChar(TypeConvertingTest::bigCharC); + testGenericChar(TypeConvertingTest::smallIntC); + testGenericChar(TypeConvertingTest::smallLongC); + testGenericChar(TypeConvertingTest::smallFloatC); + testGenericChar(TypeConvertingTest::smallDoubleC); + + testGenericChar(TypeConvertingTest::smallCharS); + testGenericChar(TypeConvertingTest::bigCharS); + } + + @Test + void testGenericInt() { + testGenericInt(TypeConvertingTest::smallIntC); + testGenericInt(TypeConvertingTest::bigIntC); + testGenericInt(TypeConvertingTest::smallLongC); + testGenericInt(TypeConvertingTest::smallFloatC); + testGenericInt(TypeConvertingTest::smallDoubleC); + testGenericInt(TypeConvertingTest::numberC); + + testGenericInt(TypeConvertingTest::smallIntS); + testGenericInt(TypeConvertingTest::bigIntS); + } + + @Test + void testGenericLong() { + testGenericLong(TypeConvertingTest::smallLongC); + testGenericLong(TypeConvertingTest::bigLongC); + testGenericLong(TypeConvertingTest::smallFloatC); + testGenericLong(TypeConvertingTest::smallDoubleC); + testGenericLong(TypeConvertingTest::numberC); + + testGenericLong(TypeConvertingTest::smallLongS); + testGenericLong(TypeConvertingTest::bigLongS); + } + + @Test + void testGenericFloat() { + testGenericFloat(TypeConvertingTest::smallFloatC); + testGenericFloat(TypeConvertingTest::bigFloatC); + testGenericFloat(TypeConvertingTest::smallDoubleC); + testGenericFloat(TypeConvertingTest::numberC); + + testGenericFloat(TypeConvertingTest::smallFloatS); + testGenericFloat(TypeConvertingTest::bigFloatS); + } + + @Test + void testGenericDouble() { + testGenericDouble(TypeConvertingTest::smallDoubleC); + testGenericDouble(TypeConvertingTest::bigDoubleC); + testGenericDouble(TypeConvertingTest::numberC); + + testGenericDouble(TypeConvertingTest::smallDoubleS); + testGenericDouble(TypeConvertingTest::bigDoubleS); + } + + @Test + void testGenericNumber() { + testGenericNumber(TypeConvertingTest::numberC); + + testGenericNumber(TypeConvertingTest::numberS); + } + + @Test + void testSmallBoolean() { + testSmallBoolean(TypeConvertingTest::smallBooleanC); + testSmallBoolean(TypeConvertingTest::bigBooleanC); + + testSmallBoolean(TypeConvertingTest::smallBooleanS); + testSmallBoolean(TypeConvertingTest::bigBooleanS); + } + + @Test + void testSmallByte() { + testSmallByte(TypeConvertingTest::smallByteC); + testSmallByte(TypeConvertingTest::bigByteC); + testSmallByte(TypeConvertingTest::smallShortC); + testSmallByte(TypeConvertingTest::smallIntC); + testSmallByte(TypeConvertingTest::smallLongC); + testSmallByte(TypeConvertingTest::smallFloatC); + testSmallByte(TypeConvertingTest::smallDoubleC); + testSmallByte(TypeConvertingTest::numberC); + + testSmallByte(TypeConvertingTest::smallByteS); + testSmallByte(TypeConvertingTest::bigByteS); + } + + @Test + void testSmallShort() { + testSmallShort(TypeConvertingTest::smallShortC); + testSmallShort(TypeConvertingTest::bigShortC); + testSmallShort(TypeConvertingTest::smallIntC); + testSmallShort(TypeConvertingTest::smallLongC); + testSmallShort(TypeConvertingTest::smallFloatC); + testSmallShort(TypeConvertingTest::smallDoubleC); + testSmallShort(TypeConvertingTest::numberC); + + testSmallShort(TypeConvertingTest::smallShortS); + testSmallShort(TypeConvertingTest::bigShortS); + } + + @Test + void testSmallChar() { + testSmallChar(TypeConvertingTest::smallCharC); + testSmallChar(TypeConvertingTest::bigCharC); + testSmallChar(TypeConvertingTest::smallIntC); + testSmallChar(TypeConvertingTest::smallLongC); + testSmallChar(TypeConvertingTest::smallFloatC); + testSmallChar(TypeConvertingTest::smallDoubleC); + + testSmallChar(TypeConvertingTest::smallCharS); + testSmallChar(TypeConvertingTest::bigCharS); + } + + @Test + void testSmallInt() { + testSmallInt(TypeConvertingTest::smallIntC); + testSmallInt(TypeConvertingTest::bigIntC); + testSmallInt(TypeConvertingTest::smallLongC); + testSmallInt(TypeConvertingTest::smallFloatC); + testSmallInt(TypeConvertingTest::smallDoubleC); + testSmallInt(TypeConvertingTest::numberC); + + testSmallInt(TypeConvertingTest::smallIntS); + testSmallInt(TypeConvertingTest::bigIntS); + } + + @Test + void testSmallLong() { + testSmallLong(TypeConvertingTest::smallLongC); + testSmallLong(TypeConvertingTest::bigLongC); + testSmallLong(TypeConvertingTest::smallFloatC); + testSmallLong(TypeConvertingTest::smallDoubleC); + testSmallLong(TypeConvertingTest::numberC); + + testSmallLong(TypeConvertingTest::smallLongS); + testSmallLong(TypeConvertingTest::bigLongS); + } + + @Test + void testSmallFloat() { + testSmallFloat(TypeConvertingTest::smallFloatC); + testSmallFloat(TypeConvertingTest::bigFloatC); + testSmallFloat(TypeConvertingTest::smallDoubleC); + testSmallFloat(TypeConvertingTest::numberC); + + testSmallFloat(TypeConvertingTest::smallFloatS); + testSmallFloat(TypeConvertingTest::bigFloatS); + } + + @Test + void testSmallDouble() { + testSmallDouble(TypeConvertingTest::smallDoubleC); + testSmallDouble(TypeConvertingTest::bigDoubleC); + testSmallDouble(TypeConvertingTest::numberC); + + testSmallDouble(TypeConvertingTest::smallDoubleS); + testSmallDouble(TypeConvertingTest::bigDoubleS); + } + + @Test + void testBigBoolean() { + testBigBoolean(TypeConvertingTest::smallBooleanC); + testBigBoolean(TypeConvertingTest::bigBooleanC); + + testBigBoolean(TypeConvertingTest::smallBooleanS); + testBigBoolean(TypeConvertingTest::bigBooleanS); + } + + @Test + void testBigByte() { + testBigByte(TypeConvertingTest::smallByteC); + testBigByte(TypeConvertingTest::bigByteC); + testBigByte(TypeConvertingTest::smallShortC); + testBigByte(TypeConvertingTest::smallIntC); + testBigByte(TypeConvertingTest::smallLongC); + testBigByte(TypeConvertingTest::smallFloatC); + testBigByte(TypeConvertingTest::smallDoubleC); + testBigByte(TypeConvertingTest::numberC); + + testBigByte(TypeConvertingTest::smallByteS); + testBigByte(TypeConvertingTest::bigByteS); + } + + @Test + void testBigShort() { + testBigShort(TypeConvertingTest::smallShortC); + testBigShort(TypeConvertingTest::bigShortC); + testBigShort(TypeConvertingTest::smallIntC); + testBigShort(TypeConvertingTest::smallLongC); + testBigShort(TypeConvertingTest::smallFloatC); + testBigShort(TypeConvertingTest::smallDoubleC); + testBigShort(TypeConvertingTest::numberC); + + testBigShort(TypeConvertingTest::smallShortS); + testBigShort(TypeConvertingTest::bigShortS); + } + + @Test + void testBigChar() { + testBigChar(TypeConvertingTest::smallCharC); + testBigChar(TypeConvertingTest::bigCharC); + testBigChar(TypeConvertingTest::smallIntC); + testBigChar(TypeConvertingTest::smallLongC); + testBigChar(TypeConvertingTest::smallFloatC); + testBigChar(TypeConvertingTest::smallDoubleC); + + testBigChar(TypeConvertingTest::smallCharS); + testBigChar(TypeConvertingTest::bigCharS); + } + + @Test + void testBigInt() { + testBigInt(TypeConvertingTest::smallIntC); + testBigInt(TypeConvertingTest::bigIntC); + testBigInt(TypeConvertingTest::smallLongC); + testBigInt(TypeConvertingTest::smallFloatC); + testBigInt(TypeConvertingTest::smallDoubleC); + testBigInt(TypeConvertingTest::numberC); + + testBigInt(TypeConvertingTest::smallIntS); + testBigInt(TypeConvertingTest::bigIntS); + } + + @Test + void testBigLong() { + testBigLong(TypeConvertingTest::smallLongC); + testBigLong(TypeConvertingTest::bigLongC); + testBigLong(TypeConvertingTest::smallFloatC); + testBigLong(TypeConvertingTest::smallDoubleC); + testBigLong(TypeConvertingTest::numberC); + + testBigLong(TypeConvertingTest::smallLongS); + testBigLong(TypeConvertingTest::bigLongS); + } + + @Test + void testBigFloat() { + testBigFloat(TypeConvertingTest::smallFloatC); + testBigFloat(TypeConvertingTest::bigFloatC); + testBigFloat(TypeConvertingTest::smallDoubleC); + testBigFloat(TypeConvertingTest::numberC); + + testBigFloat(TypeConvertingTest::smallFloatS); + testBigFloat(TypeConvertingTest::bigFloatS); + } + + @Test + void testBigDouble() { + testBigDouble(TypeConvertingTest::smallDoubleC); + testBigDouble(TypeConvertingTest::bigDoubleC); + testBigDouble(TypeConvertingTest::numberC); + + testBigDouble(TypeConvertingTest::smallDoubleS); + testBigDouble(TypeConvertingTest::bigDoubleS); + } + + @Test + void testBigNumber() { + testBigNumber(TypeConvertingTest::numberC); + + testBigNumber(TypeConvertingTest::numberS); + } +} From 2f4f6cc34c10c5519c74abbce8d1715013b50d5d Mon Sep 17 00:00:00 2001 From: Arseny Bochkarev <arseny.bochkarev@syntacore.com> Date: Mon, 1 Jul 2024 12:19:49 +0000 Subject: [PATCH 253/471] 8317721: RISC-V: Implement CRC32 intrinsic Reviewed-by: vkempik, rehn --- .../cpu/riscv/c1_LIRAssembler_riscv.cpp | 17 +- .../cpu/riscv/c1_LIRGenerator_riscv.cpp | 74 +++++- .../cpu/riscv/macroAssembler_riscv.cpp | 169 +++++++++++++ .../cpu/riscv/macroAssembler_riscv.hpp | 10 + src/hotspot/cpu/riscv/stubGenerator_riscv.cpp | 52 ++++ src/hotspot/cpu/riscv/stubRoutines_riscv.cpp | 222 ++++++++++++++++++ src/hotspot/cpu/riscv/stubRoutines_riscv.hpp | 3 + src/hotspot/cpu/riscv/vm_version_riscv.cpp | 10 +- 8 files changed, 553 insertions(+), 4 deletions(-) diff --git a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp index 9804eee61ffee..b2489268611b7 100644 --- a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp @@ -1607,7 +1607,22 @@ void LIR_Assembler::monitor_address(int monitor_no, LIR_Opr dst) { __ la(dst->as_register(), frame_map()->address_for_monitor_lock(monitor_no)); } -void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) { Unimplemented(); } +void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) { + assert(op->crc()->is_single_cpu(), "crc must be register"); + assert(op->val()->is_single_cpu(), "byte value must be register"); + assert(op->result_opr()->is_single_cpu(), "result must be register"); + Register crc = op->crc()->as_register(); + Register val = op->val()->as_register(); + Register res = op->result_opr()->as_register(); + + assert_different_registers(val, crc, res); + __ la(res, ExternalAddress(StubRoutines::crc_table_addr())); + + __ notr(crc, crc); // ~crc + __ zero_extend(crc, crc, 32); + __ update_byte_crc32(crc, val, res); + __ notr(res, crc); // ~crc +} void LIR_Assembler::check_conflict(ciKlass* exact_klass, intptr_t current_klass, Register tmp, Label &next, Label &none, diff --git a/src/hotspot/cpu/riscv/c1_LIRGenerator_riscv.cpp b/src/hotspot/cpu/riscv/c1_LIRGenerator_riscv.cpp index 8017c0fc802d5..409e8dc0a0d95 100644 --- a/src/hotspot/cpu/riscv/c1_LIRGenerator_riscv.cpp +++ b/src/hotspot/cpu/riscv/c1_LIRGenerator_riscv.cpp @@ -781,7 +781,79 @@ void LIRGenerator::do_ArrayCopy(Intrinsic* x) { } void LIRGenerator::do_update_CRC32(Intrinsic* x) { - ShouldNotReachHere(); + assert(UseCRC32Intrinsics, "why are we here?"); + // Make all state_for calls early since they can emit code + LIR_Opr result = rlock_result(x); + switch (x->id()) { + case vmIntrinsics::_updateCRC32: { + LIRItem crc(x->argument_at(0), this); + LIRItem val(x->argument_at(1), this); + // val is destroyed by update_crc32 + val.set_destroys_register(); + crc.load_item(); + val.load_item(); + __ update_crc32(crc.result(), val.result(), result); + break; + } + case vmIntrinsics::_updateBytesCRC32: + case vmIntrinsics::_updateByteBufferCRC32: { + bool is_updateBytes = (x->id() == vmIntrinsics::_updateBytesCRC32); + + LIRItem crc(x->argument_at(0), this); + LIRItem buf(x->argument_at(1), this); + LIRItem off(x->argument_at(2), this); + LIRItem len(x->argument_at(3), this); + buf.load_item(); + off.load_nonconstant(); + + LIR_Opr index = off.result(); + int offset = is_updateBytes ? arrayOopDesc::base_offset_in_bytes(T_BYTE) : 0; + if (off.result()->is_constant()) { + index = LIR_OprFact::illegalOpr; + offset += off.result()->as_jint(); + } + LIR_Opr base_op = buf.result(); + + if (index->is_valid()) { + LIR_Opr tmp = new_register(T_LONG); + __ convert(Bytecodes::_i2l, index, tmp); + index = tmp; + } + + if (offset) { + LIR_Opr tmp = new_pointer_register(); + __ add(base_op, LIR_OprFact::intConst(offset), tmp); + base_op = tmp; + offset = 0; + } + + LIR_Address* a = new LIR_Address(base_op, + index, + offset, + T_BYTE); + BasicTypeList signature(3); + signature.append(T_INT); + signature.append(T_ADDRESS); + signature.append(T_INT); + CallingConvention* cc = frame_map()->c_calling_convention(&signature); + const LIR_Opr result_reg = result_register_for(x->type()); + + LIR_Opr addr = new_pointer_register(); + __ leal(LIR_OprFact::address(a), addr); + + crc.load_item_force(cc->at(0)); + __ move(addr, cc->at(1)); + len.load_item_force(cc->at(2)); + + __ call_runtime_leaf(StubRoutines::updateBytesCRC32(), getThreadTemp(), result_reg, cc->args()); + __ move(result_reg, result); + + break; + } + default: { + ShouldNotReachHere(); + } + } } void LIRGenerator::do_update_CRC32C(Intrinsic* x) { diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index 0e6a9099265ce..b707b20f6692a 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -1428,6 +1428,175 @@ int MacroAssembler::pop_fp(unsigned int bitset, Register stack) { return count; } +static const int64_t right_32_bits = right_n_bits(32); +static const int64_t right_8_bits = right_n_bits(8); + +/** + * Emits code to update CRC-32 with a byte value according to constants in table + * + * @param [in,out]crc Register containing the crc. + * @param [in]val Register containing the byte to fold into the CRC. + * @param [in]table Register containing the table of crc constants. + * + * uint32_t crc; + * val = crc_table[(val ^ crc) & 0xFF]; + * crc = val ^ (crc >> 8); + * + */ +void MacroAssembler::update_byte_crc32(Register crc, Register val, Register table) { + assert_different_registers(crc, val, table); + + xorr(val, val, crc); + andi(val, val, right_8_bits); + shadd(val, val, table, val, 2); + lwu(val, Address(val)); + srli(crc, crc, 8); + xorr(crc, val, crc); +} + +/** + * Emits code to update CRC-32 with a 32-bit value according to tables 0 to 3 + * + * @param [in,out]crc Register containing the crc. + * @param [in]v Register containing the 32-bit to fold into the CRC. + * @param [in]table0 Register containing table 0 of crc constants. + * @param [in]table1 Register containing table 1 of crc constants. + * @param [in]table2 Register containing table 2 of crc constants. + * @param [in]table3 Register containing table 3 of crc constants. + * + * uint32_t crc; + * v = crc ^ v + * crc = table3[v&0xff]^table2[(v>>8)&0xff]^table1[(v>>16)&0xff]^table0[v>>24] + * + */ +void MacroAssembler::update_word_crc32(Register crc, Register v, Register tmp1, Register tmp2, Register tmp3, + Register table0, Register table1, Register table2, Register table3, bool upper) { + assert_different_registers(crc, v, tmp1, tmp2, tmp3, table0, table1, table2, table3); + + if (upper) + srli(v, v, 32); + xorr(v, v, crc); + + andi(tmp1, v, right_8_bits); + shadd(tmp1, tmp1, table3, tmp2, 2); + lwu(crc, Address(tmp1)); + + slli(tmp1, v, 16); + slli(tmp3, v, 8); + + srliw(tmp1, tmp1, 24); + srliw(tmp3, tmp3, 24); + + shadd(tmp1, tmp1, table2, tmp1, 2); + lwu(tmp2, Address(tmp1)); + + shadd(tmp3, tmp3, table1, tmp3, 2); + xorr(crc, crc, tmp2); + + lwu(tmp2, Address(tmp3)); + if (upper) { + tmp1 = v; + srli(tmp1, v, 24); + } + else + srliw(tmp1, v, 24); + + // no need to clear bits other than lowest two + shadd(tmp1, tmp1, table0, tmp1, 2); + xorr(crc, crc, tmp2); + lwu(tmp2, Address(tmp1)); + xorr(crc, crc, tmp2); +} + +/** + * @param crc register containing existing CRC (32-bit) + * @param buf register pointing to input byte buffer (byte*) + * @param len register containing number of bytes + * @param table register that will contain address of CRC table + * @param tmp scratch registers + */ +void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len, + Register table0, Register table1, Register table2, Register table3, + Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register tmp6) { + assert_different_registers(crc, buf, len, table0, table1, table2, table3, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6); + Label L_by16_loop, L_unroll_loop, L_unroll_loop_entry, L_by4, L_by4_loop, L_by1, L_by1_loop, L_exit; + + const int64_t unroll = 16; + const int64_t unroll_words = unroll*wordSize; + mv(tmp5, right_32_bits); + subw(len, len, unroll_words); + andn(crc, tmp5, crc); + + const ExternalAddress table_addr = StubRoutines::crc_table_addr(); + la(table0, table_addr); + add(table1, table0, 1*256*sizeof(juint), tmp1); + add(table2, table0, 2*256*sizeof(juint), tmp1); + add(table3, table2, 1*256*sizeof(juint), tmp1); + + bge(len, zr, L_unroll_loop_entry); + addiw(len, len, unroll_words-4); + bge(len, zr, L_by4_loop); + addiw(len, len, 4); + bgt(len, zr, L_by1_loop); + j(L_exit); + + align(CodeEntryAlignment); + bind(L_unroll_loop_entry); + const Register buf_end = tmp3; + add(buf_end, buf, len); // buf_end will be used as endpoint for loop below + andi(len, len, unroll_words-1); // len = (len % unroll_words) + sub(len, len, unroll_words); // Length after all iterations + bind(L_unroll_loop); + for (int i = 0; i < unroll; i++) { + ld(tmp1, Address(buf, i*wordSize)); + update_word_crc32(crc, tmp1, tmp2, tmp4, tmp6, table0, table1, table2, table3, false); + update_word_crc32(crc, tmp1, tmp2, tmp4, tmp6, table0, table1, table2, table3, true); + } + + addi(buf, buf, unroll_words); + ble(buf, buf_end, L_unroll_loop); + addiw(len, len, unroll_words-4); + bge(len, zr, L_by4_loop); + addiw(len, len, 4); + bgt(len, zr, L_by1_loop); + j(L_exit); + + bind(L_by4_loop); + lwu(tmp1, Address(buf)); + update_word_crc32(crc, tmp1, tmp2, tmp4, tmp6, table0, table1, table2, table3, false); + subw(len, len, 4); + addi(buf, buf, 4); + bge(len, zr, L_by4_loop); + addiw(len, len, 4); + ble(len, zr, L_exit); + + bind(L_by1_loop); + subw(len, len, 1); + lwu(tmp1, Address(buf)); + andi(tmp2, tmp1, right_8_bits); + update_byte_crc32(crc, tmp2, table0); + ble(len, zr, L_exit); + + subw(len, len, 1); + srli(tmp2, tmp1, 8); + andi(tmp2, tmp2, right_8_bits); + update_byte_crc32(crc, tmp2, table0); + ble(len, zr, L_exit); + + subw(len, len, 1); + srli(tmp2, tmp1, 16); + andi(tmp2, tmp2, right_8_bits); + update_byte_crc32(crc, tmp2, table0); + ble(len, zr, L_exit); + + srli(tmp2, tmp1, 24); + andi(tmp2, tmp2, right_8_bits); + update_byte_crc32(crc, tmp2, table0); + + bind(L_exit); + andn(crc, tmp5, crc); +} + #ifdef COMPILER2 // Push vector registers in the bitset supplied. // Return the number of words pushed diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp index 4373ebada146a..ddd3c48a93e10 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp @@ -1288,6 +1288,15 @@ class MacroAssembler: public Assembler { void compute_match_mask(Register src, Register pattern, Register match_mask, Register mask1, Register mask2); + // CRC32 code for java.util.zip.CRC32::updateBytes() intrinsic. + void kernel_crc32(Register crc, Register buf, Register len, + Register table0, Register table1, Register table2, Register table3, + Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register tmp6); + void update_word_crc32(Register crc, Register v, Register tmp1, Register tmp2, Register tmp3, + Register table0, Register table1, Register table2, Register table3, + bool upper); + void update_byte_crc32(Register crc, Register val, Register table); + #ifdef COMPILER2 void mul_add(Register out, Register in, Register offset, Register len, Register k, Register tmp); @@ -1317,6 +1326,7 @@ class MacroAssembler: public Assembler { Register z, Register tmp0, Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register tmp6, Register product_hi); + #endif void inflate_lo32(Register Rd, Register Rs, Register tmp1 = t0, Register tmp2 = t1); diff --git a/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp b/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp index 3a34e87c14006..61c7a8668f55a 100644 --- a/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp +++ b/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp @@ -5313,6 +5313,52 @@ static const int64_t right_3_bits = right_n_bits(3); #endif // COMPILER2 + /** + * Arguments: + * + * Inputs: + * c_rarg0 - int crc + * c_rarg1 - byte* buf + * c_rarg2 - int length + * + * Output: + * c_rarg0 - int crc result + */ + address generate_updateBytesCRC32() { + assert(UseCRC32Intrinsics, "what are we doing here?"); + + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "updateBytesCRC32"); + + address start = __ pc(); + + const Register crc = c_rarg0; // crc + const Register buf = c_rarg1; // source java byte array address + const Register len = c_rarg2; // length + const Register table0 = c_rarg3; // crc_table address + const Register table1 = c_rarg4; + const Register table2 = c_rarg5; + const Register table3 = c_rarg6; + + const Register tmp1 = c_rarg7; + const Register tmp2 = t2; + const Register tmp3 = x28; // t3 + const Register tmp4 = x29; // t4 + const Register tmp5 = x30; // t5 + const Register tmp6 = x31; // t6 + + BLOCK_COMMENT("Entry:"); + __ enter(); // required for proper stackwalking of RuntimeStub frame + + __ kernel_crc32(crc, buf, len, table0, table1, table2, + table3, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6); + + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(); + + return start; + } + #if INCLUDE_JFR static void jfr_prologue(address the_pc, MacroAssembler* _masm, Register thread) { @@ -5559,6 +5605,12 @@ static const int64_t right_3_bits = right_n_bits(3); generate_throw_exception("delayed StackOverflowError throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_delayed_StackOverflowError)); + + if (UseCRC32Intrinsics) { + // set table address before stub generation which use it + StubRoutines::_crc_table_adr = (address)StubRoutines::riscv::_crc_table; + StubRoutines::_updateBytesCRC32 = generate_updateBytesCRC32(); + } } void generate_continuation_stubs() { diff --git a/src/hotspot/cpu/riscv/stubRoutines_riscv.cpp b/src/hotspot/cpu/riscv/stubRoutines_riscv.cpp index 39068a9a026ac..05bdeaf757078 100644 --- a/src/hotspot/cpu/riscv/stubRoutines_riscv.cpp +++ b/src/hotspot/cpu/riscv/stubRoutines_riscv.cpp @@ -55,3 +55,225 @@ address StubRoutines::riscv::_string_indexof_linear_ul = nullptr; address StubRoutines::riscv::_large_byte_array_inflate = nullptr; bool StubRoutines::riscv::_completed = false; + +/** + * crc_table[] from jdk/src/java.base/share/native/libzip/zlib/crc32.h + */ +ATTRIBUTE_ALIGNED(4096) juint StubRoutines::riscv::_crc_table[] = +{ + // Table 0 + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL, + + // Table 1 + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL, + + // Table 2 + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL, + + // Table 3 + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL, +}; diff --git a/src/hotspot/cpu/riscv/stubRoutines_riscv.hpp b/src/hotspot/cpu/riscv/stubRoutines_riscv.hpp index 90a7e0967b240..46b5461d7770f 100644 --- a/src/hotspot/cpu/riscv/stubRoutines_riscv.hpp +++ b/src/hotspot/cpu/riscv/stubRoutines_riscv.hpp @@ -153,6 +153,9 @@ class riscv { static void set_completed() { _completed = true; } + +private: + static juint _crc_table[]; }; #endif // CPU_RISCV_STUBROUTINES_RISCV_HPP diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.cpp b/src/hotspot/cpu/riscv/vm_version_riscv.cpp index b9467bb2245da..b7517bc3f3f0c 100644 --- a/src/hotspot/cpu/riscv/vm_version_riscv.cpp +++ b/src/hotspot/cpu/riscv/vm_version_riscv.cpp @@ -131,8 +131,14 @@ void VM_Version::initialize() { FLAG_SET_DEFAULT(UseAESCTRIntrinsics, false); } - if (UseCRC32Intrinsics) { - warning("CRC32 intrinsics are not available on this CPU."); + if (UseZba) { + if (FLAG_IS_DEFAULT(UseCRC32Intrinsics)) { + FLAG_SET_DEFAULT(UseCRC32Intrinsics, true); + } + } else { + if (!FLAG_IS_DEFAULT(UseCRC32Intrinsics)) { + warning("CRC32 intrinsic requires Zba instructions (not available on this CPU)"); + } FLAG_SET_DEFAULT(UseCRC32Intrinsics, false); } From ee4720a75d815c84039055902c88b360737a1f9c Mon Sep 17 00:00:00 2001 From: Leonid Mesnik <lmesnik@openjdk.org> Date: Mon, 1 Jul 2024 20:38:55 +0000 Subject: [PATCH 254/471] 8333306: gc/arguments/TestParallelGCErgo.java fails when largepage are enabled Reviewed-by: ayang, zgu --- test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java b/test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java index a84ebc5fe5cc6..63c51c25149e6 100644 --- a/test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java +++ b/test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java @@ -27,6 +27,7 @@ * @test TestParallelGCErgo * @bug 8272364 * @requires vm.gc.Parallel + * @requires vm.opt.UseLargePages == null | !vm.opt.UseLargePages * @summary Verify ParallelGC minimum young and old ergonomics are setup correctly * @modules java.base/jdk.internal.misc * @library /test/lib From 5fe07b36d9eb296661692d903ed0b9b5afefba0f Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan <psadhukhan@openjdk.org> Date: Tue, 2 Jul 2024 03:39:43 +0000 Subject: [PATCH 255/471] 5021949: JSplitPane setEnabled(false) shouldn't be partially functional Reviewed-by: abhiscxk, achung, aivanov --- .../share/classes/javax/swing/JSplitPane.java | 14 ++- .../plaf/basic/BasicSplitPaneDivider.java | 16 +++ .../JSplitPane/TestSplitPaneEnableTest.java | 109 ++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 test/jdk/javax/swing/JSplitPane/TestSplitPaneEnableTest.java diff --git a/src/java.desktop/share/classes/javax/swing/JSplitPane.java b/src/java.desktop/share/classes/javax/swing/JSplitPane.java index 14f62565d400d..7d4482af07ea8 100644 --- a/src/java.desktop/share/classes/javax/swing/JSplitPane.java +++ b/src/java.desktop/share/classes/javax/swing/JSplitPane.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,7 @@ import javax.accessibility.AccessibleStateSet; import javax.accessibility.AccessibleValue; import javax.swing.plaf.SplitPaneUI; +import javax.swing.plaf.basic.BasicSplitPaneUI; /** * <code>JSplitPane</code> is used to divide two (and only two) @@ -361,6 +362,17 @@ public JSplitPane(int newOrientation, } + /** + * {@inheritDoc} + * @param enabled {@inheritDoc} + */ + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + if (this.getUI() instanceof BasicSplitPaneUI) { + ((BasicSplitPaneUI)(this.getUI())).getDivider().setEnabled(enabled); + } + } /** * Sets the L&F object that renders this component. diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneDivider.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneDivider.java index 3018de4fd9352..188e675388776 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneDivider.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneDivider.java @@ -360,6 +360,20 @@ else if (e.getPropertyName() == JSplitPane. } } + /** + * {@inheritDoc} + * @param enabled {@inheritDoc} + */ + @Override + public void setEnabled(boolean enabled) { + if (splitPane.isOneTouchExpandable() && + rightButton != null && + leftButton != null) { + + rightButton.setEnabled(enabled); + leftButton.setEnabled(enabled); + } + } /** * Paints the divider. @@ -472,6 +486,7 @@ public boolean isFocusTraversable() { b.setFocusPainted(false); b.setBorderPainted(false); b.setRequestFocusEnabled(false); + b.setEnabled(splitPane.isEnabled()); return b; } @@ -529,6 +544,7 @@ public boolean isFocusTraversable() { b.setFocusPainted(false); b.setBorderPainted(false); b.setRequestFocusEnabled(false); + b.setEnabled(splitPane.isEnabled()); return b; } diff --git a/test/jdk/javax/swing/JSplitPane/TestSplitPaneEnableTest.java b/test/jdk/javax/swing/JSplitPane/TestSplitPaneEnableTest.java new file mode 100644 index 0000000000000..0172e4b524297 --- /dev/null +++ b/test/jdk/javax/swing/JSplitPane/TestSplitPaneEnableTest.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 5021949 + * @summary Verifies JSplitPane setEnabled(false) disables one touch expandable clicks + * @run main TestSplitPaneEnableTest + */ + +import java.awt.Point; +import java.awt.event.InputEvent; +import javax.swing.JButton; +import javax.swing.JSplitPane; +import javax.swing.plaf.basic.BasicSplitPaneDivider; +import javax.swing.plaf.basic.BasicSplitPaneUI; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class TestSplitPaneEnableTest { + private static JButton leftOneTouchButton; + private static JButton rightOneTouchButton; + + private static void setLookAndFeel(UIManager.LookAndFeelInfo laf) { + try { + UIManager.setLookAndFeel(laf.getClassName()); + } catch (UnsupportedLookAndFeelException ignored) { + System.out.println("Unsupported LAF: " + laf.getClassName()); + } catch (ClassNotFoundException | InstantiationException + | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) throws Exception { + for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) { + if (laf.getClassName().toLowerCase().contains("gtk")) { + continue; + } + System.out.println("Testing LAF : " + laf.getClassName()); + + SwingUtilities.invokeAndWait(() -> { + setLookAndFeel(laf); + JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, + new JButton("Left"), new JButton("Right")); + jsp.setUI(new TestSplitPaneUI()); + jsp.setOneTouchExpandable(true); + jsp.setEnabled(false); + if (leftOneTouchButton.isEnabled()) { + throw new RuntimeException("leftButton is enabled for disabled JSplitPane"); + } + if (rightOneTouchButton.isEnabled()) { + throw new RuntimeException("rightButton is enabled for disabled JSplitPane"); + } + + }); + } + } + + static class TestSplitPaneUI extends BasicSplitPaneUI { + + public TestSplitPaneUI() { + super(); + } + + public BasicSplitPaneDivider createDefaultDivider() { + return new TestSplitPaneDivider(this); + } + } + + static class TestSplitPaneDivider extends BasicSplitPaneDivider { + + public TestSplitPaneDivider(BasicSplitPaneUI ui) { + super(ui); + } + + protected JButton createLeftOneTouchButton() { + leftOneTouchButton = super.createLeftOneTouchButton(); + return leftOneTouchButton; + } + + protected JButton createRightOneTouchButton() { + rightOneTouchButton = super.createRightOneTouchButton(); + return rightOneTouchButton; + } + } +} + From 318d9acadf305f9d7d0cd8bb54b41506dd9914a8 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Tue, 2 Jul 2024 05:56:21 +0000 Subject: [PATCH 256/471] 8335369: Fix -Wzero-as-null-pointer-constant warnings in ImmutableOopMapBuilder Reviewed-by: kvn, jwaters --- src/hotspot/share/compiler/oopMap.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/share/compiler/oopMap.hpp b/src/hotspot/share/compiler/oopMap.hpp index 80832cdacd4cb..634fb8b0bfae7 100644 --- a/src/hotspot/share/compiler/oopMap.hpp +++ b/src/hotspot/share/compiler/oopMap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -411,7 +411,7 @@ class ImmutableOopMapBuilder { Mapping() : _kind(OOPMAP_UNKNOWN), _offset(-1), _size(-1), _map(nullptr) {} - void set(kind_t kind, int offset, int size, const OopMap* map = 0, const OopMap* other = 0) { + void set(kind_t kind, int offset, int size, const OopMap* map, const OopMap* other = nullptr) { _kind = kind; _offset = offset; _size = size; From 9046d7aee3082b6cbf79876efc1c508cb893caad Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Tue, 2 Jul 2024 08:20:26 +0000 Subject: [PATCH 257/471] 8335390: C2 MergeStores: wrong result with Unsafe Reviewed-by: thartmann, chagedorn, kvn --- src/hotspot/share/opto/memnode.cpp | 7 +- .../jtreg/compiler/c2/TestMergeStores.java | 5 +- .../c2/TestMergeStoresUnsafeArrayPointer.java | 132 ++++++++++++++++++ 3 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/c2/TestMergeStoresUnsafeArrayPointer.java diff --git a/src/hotspot/share/opto/memnode.cpp b/src/hotspot/share/opto/memnode.cpp index d0b6c59637f13..ad3a948793fa1 100644 --- a/src/hotspot/share/opto/memnode.cpp +++ b/src/hotspot/share/opto/memnode.cpp @@ -2984,6 +2984,9 @@ StoreNode* MergePrimitiveArrayStores::run() { type2aelembytes(bt) != _store->memory_size()) { return nullptr; } + if (_store->is_unsafe_access()) { + return nullptr; + } // The _store must be the "last" store in a chain. If we find a use we could merge with // then that use or a store further down is the "last" store. @@ -3017,11 +3020,13 @@ bool MergePrimitiveArrayStores::is_compatible_store(const StoreNode* other_store int opc = _store->Opcode(); assert(opc == Op_StoreB || opc == Op_StoreC || opc == Op_StoreI, "precondition"); assert(_store->adr_type()->isa_aryptr() != nullptr, "must be array store"); + assert(!_store->is_unsafe_access(), "no unsafe accesses"); if (other_store == nullptr || _store->Opcode() != other_store->Opcode() || other_store->adr_type() == nullptr || - other_store->adr_type()->isa_aryptr() == nullptr) { + other_store->adr_type()->isa_aryptr() == nullptr || + other_store->is_unsafe_access()) { return false; } diff --git a/test/hotspot/jtreg/compiler/c2/TestMergeStores.java b/test/hotspot/jtreg/compiler/c2/TestMergeStores.java index 0e86045618b9a..a94004d8e26c3 100644 --- a/test/hotspot/jtreg/compiler/c2/TestMergeStores.java +++ b/test/hotspot/jtreg/compiler/c2/TestMergeStores.java @@ -611,8 +611,9 @@ static Object[] test1e(byte[] a) { } @Test - @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"}, - applyIf = {"UseUnalignedAccesses", "true"}) + // Disabled by JDK-8335390, to be enabled again by JDK-8335392. + // @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"}, + // applyIf = {"UseUnalignedAccesses", "true"}) static Object[] test1f(byte[] a) { UNSAFE.putByte(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET + 0, (byte)0xbe); UNSAFE.putByte(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET + 1, (byte)0xba); diff --git a/test/hotspot/jtreg/compiler/c2/TestMergeStoresUnsafeArrayPointer.java b/test/hotspot/jtreg/compiler/c2/TestMergeStoresUnsafeArrayPointer.java new file mode 100644 index 0000000000000..dbfdfe6895766 --- /dev/null +++ b/test/hotspot/jtreg/compiler/c2/TestMergeStoresUnsafeArrayPointer.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8335390 + * @summary Test merge stores for some Unsafe store address patterns. + * @modules java.base/jdk.internal.misc + * @requires vm.bits == 64 + * @requires os.maxMemory > 8G + * @run main/othervm -XX:CompileCommand=compileonly,compiler.c2.TestMergeStoresUnsafeArrayPointer::test* + * -Xbatch + * -Xmx8g + * compiler.c2.TestMergeStoresUnsafeArrayPointer + * @run main/othervm -Xmx8g + * compiler.c2.TestMergeStoresUnsafeArrayPointer + */ + +package compiler.c2; +import jdk.internal.misc.Unsafe; + +public class TestMergeStoresUnsafeArrayPointer { + static final Unsafe UNSAFE = Unsafe.getUnsafe(); + + // We allocate a big int array of length: + static final int SIZE = (1 << 30) + 100; + + // This gives us a memory region of 4x as many bytes: + static final long BYTE_SIZE = 4L * SIZE; // = 1L << 32 + 400L + + // We set an "anchor" in the middle of this memory region, in bytes: + static final long ANCHOR = BYTE_SIZE / 2; + + static int four = 4; + + public static void main(String[] args) { + System.out.println("Allocate big array of SIZE = " + SIZE); + int[] big = new int[SIZE]; + + // Each test is executed a few times, so that we can see the difference between + // interpreter and compiler. + int errors = 0; + + long val = 0; + System.out.println("test1"); + for (int i = 0; i < 100_000; i++) { + testClear(big); + test1(big, ANCHOR); + long sum = testSum(big); + if (i == 0) { + val = sum; + } else { + if (sum != val) { + System.out.println("ERROR: test1 had wrong value: " + val + " != " + sum); + errors++; + break; + } + } + } + + val = 0; + System.out.println("test2"); + for (int i = 0; i < 100_000; i++) { + testClear(big); + test2(big, ANCHOR); + long sum = testSum(big); + if (i == 0) { + val = sum; + } else { + if (sum != val) { + System.out.println("ERROR: test2 had wrong value: " + val + " != " + sum); + errors++; + break; + } + } + } + + if (errors > 0) { + throw new RuntimeException("ERRORS: " + errors); + } + System.out.println("PASSED"); + } + + // Only clear and sum over relevant parts of array to make the test fast. + static void testClear(int[] a) { + for (int j = 0 ; j < 100; j++) { a[j] = j; } + for (int j = a.length/2 - 100; j < a.length/2 + 100; j++) { a[j] = j; } + for (int j = a.length - 100; j < a.length + 0; j++) { a[j] = j; } + } + + static long testSum(int[] a) { + long sum = 0; + for (int j = 0 ; j < 100; j++) { sum += a[j]; } + for (int j = a.length/2 - 100; j < a.length/2 + 100; j++) { sum += a[j]; } + for (int j = a.length - 100; j < a.length + 0; j++) { sum += a[j]; } + return sum; + } + + // Reference: expected to merge. + static void test1(int[] a, long anchor) { + long base = UNSAFE.ARRAY_INT_BASE_OFFSET + anchor; + UNSAFE.putInt(a, base + 0, 0x42424242); + UNSAFE.putInt(a, base + 4, 0x66666666); + } + + // Test: if MergeStores is applied this can lead to wrong results + static void test2(int[] a, long anchor) { + long base = UNSAFE.ARRAY_INT_BASE_OFFSET + ANCHOR; + UNSAFE.putInt(a, base + 0 + (long)(four + Integer.MAX_VALUE), 0x42424242); + UNSAFE.putInt(a, base + Integer.MAX_VALUE + (long)(four + 4 ), 0x66666666); + } +} From 4060b35b1d00fccbec4b20353063f77c43ecc686 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Tue, 2 Jul 2024 08:58:20 +0000 Subject: [PATCH 258/471] 8335298: Fix -Wzero-as-null-pointer-constant warning in G1CardSetContainers Reviewed-by: iwalulya, ayang --- .../share/gc/g1/g1CardSetContainers.hpp | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1CardSetContainers.hpp b/src/hotspot/share/gc/g1/g1CardSetContainers.hpp index 43e6c8a3bf7eb..84e6e3e9274a3 100644 --- a/src/hotspot/share/gc/g1/g1CardSetContainers.hpp +++ b/src/hotspot/share/gc/g1/g1CardSetContainers.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -86,12 +86,22 @@ class G1CardSetInlinePtr : public StackObj { uint find(uint const card_idx, uint const bits_per_card, uint start_at, uint num_cards); + static ContainerPtr empty_card_set() { + // Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114573 + // gcc issues -Wzero-as-null-pointer-constant here, even though + // ContainerInlinePtr is a *non-literal* constant 0. We cast a non-const + // copy, and let the compiler's constant propagation optimize into + // equivalent code. + static_assert(G1CardSet::ContainerInlinePtr == 0, "unnecessary warning dodge"); + auto value = G1CardSet::ContainerInlinePtr; + return reinterpret_cast<ContainerPtr>(value); + } + public: - G1CardSetInlinePtr() : _value_addr(nullptr), _value((ContainerPtr)G1CardSet::ContainerInlinePtr) { } + G1CardSetInlinePtr() : G1CardSetInlinePtr(empty_card_set()) {} - G1CardSetInlinePtr(ContainerPtr value) : _value_addr(nullptr), _value(value) { - assert(G1CardSet::container_type(_value) == G1CardSet::ContainerInlinePtr, "Value " PTR_FORMAT " is not a valid G1CardSetInlinePtr.", p2i(_value)); - } + explicit G1CardSetInlinePtr(ContainerPtr value) : + G1CardSetInlinePtr(nullptr, value) {} G1CardSetInlinePtr(ContainerPtr volatile* value_addr, ContainerPtr value) : _value_addr(value_addr), _value(value) { assert(G1CardSet::container_type(_value) == G1CardSet::ContainerInlinePtr, "Value " PTR_FORMAT " is not a valid G1CardSetInlinePtr.", p2i(_value)); From a537e87d2d2c6bff63f63bb436e3e919740221ce Mon Sep 17 00:00:00 2001 From: Daniel Fuchs <dfuchs@openjdk.org> Date: Tue, 2 Jul 2024 11:50:21 +0000 Subject: [PATCH 259/471] 8335530: Java file extension missing in AuthenticatorTest Reviewed-by: cstein, jpai --- ...thenticatorTest => AuthenticatorTest.java} | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) rename test/jdk/com/sun/net/httpserver/{AuthenticatorTest => AuthenticatorTest.java} (75%) diff --git a/test/jdk/com/sun/net/httpserver/AuthenticatorTest b/test/jdk/com/sun/net/httpserver/AuthenticatorTest.java similarity index 75% rename from test/jdk/com/sun/net/httpserver/AuthenticatorTest rename to test/jdk/com/sun/net/httpserver/AuthenticatorTest.java index 1fe7f3830356f..1456af618faf6 100644 --- a/test/jdk/com/sun/net/httpserver/AuthenticatorTest +++ b/test/jdk/com/sun/net/httpserver/AuthenticatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,36 +25,36 @@ * @test * @bug 8251496 * @summary Tests for methods in Authenticator - * @run testng/othervm AuthenticatorTest + * @run junit AuthenticatorTest */ import com.sun.net.httpserver.Authenticator; -import com.sun.net.httpserver.BasicAuthenticator; import com.sun.net.httpserver.HttpPrincipal; -import org.testng.annotations.Test; -import static org.testng.Assert.assertEquals; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class AuthenticatorTest { @Test public void testFailure() { var failureResult = new Authenticator.Failure(666); - assertEquals(failureResult.getResponseCode(), 666); + assertEquals(666, failureResult.getResponseCode()); } @Test public void testRetry() { var retryResult = new Authenticator.Retry(333); - assertEquals(retryResult.getResponseCode(), 333); + assertEquals(333, retryResult.getResponseCode()); } @Test - public void TestSuccess() { + public void testSuccess() { var principal = new HttpPrincipal("test", "123"); var successResult = new Authenticator.Success(principal); - assertEquals(successResult.getPrincipal(), principal); - assertEquals("test", principal.getName()); + assertEquals(principal, successResult.getPrincipal()); + assertEquals("test", principal.getUsername()); assertEquals("123", principal.getRealm()); } } From dd74e7f8c1570ed34c89f4aca184f5668e4471db Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Tue, 2 Jul 2024 12:15:02 +0000 Subject: [PATCH 260/471] 8335147: Serial: Refactor TenuredGeneration::promote Reviewed-by: tschatzl, iwalulya --- .../share/gc/serial/defNewGeneration.cpp | 20 +++++++++---------- .../share/gc/serial/tenuredGeneration.cpp | 10 ++-------- .../share/gc/serial/tenuredGeneration.hpp | 5 ++--- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index b66681170c63c..593977030cbf1 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -768,25 +768,25 @@ oop DefNewGeneration::copy_to_survivor_space(oop old) { bool new_obj_is_tenured = false; // Otherwise try allocating obj tenured if (obj == nullptr) { - obj = _old_gen->promote(old, s); + obj = _old_gen->allocate_for_promotion(old, s); if (obj == nullptr) { handle_promotion_failure(old); return old; } - ContinuationGCSupport::transform_stack_chunk(obj); - new_obj_is_tenured = true; - } else { - // Prefetch beyond obj - const intx interval = PrefetchCopyIntervalInBytes; - Prefetch::write(obj, interval); + } + + // Prefetch beyond obj + const intx interval = PrefetchCopyIntervalInBytes; + Prefetch::write(obj, interval); - // Copy obj - Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(old), cast_from_oop<HeapWord*>(obj), s); + // Copy obj + Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(old), cast_from_oop<HeapWord*>(obj), s); - ContinuationGCSupport::transform_stack_chunk(obj); + ContinuationGCSupport::transform_stack_chunk(obj); + if (!new_obj_is_tenured) { // Increment age if obj still in new generation obj->incr_age(); age_table()->add(obj, s); diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.cpp b/src/hotspot/share/gc/serial/tenuredGeneration.cpp index 1cddce2dc514e..f1389b48557f8 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.cpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.cpp @@ -387,7 +387,7 @@ bool TenuredGeneration::promotion_attempt_is_safe(size_t max_promotion_in_bytes) return res; } -oop TenuredGeneration::promote(oop obj, size_t obj_size) { +oop TenuredGeneration::allocate_for_promotion(oop obj, size_t obj_size) { assert(obj_size == obj->size(), "bad obj_size passed in"); #ifndef PRODUCT @@ -401,15 +401,9 @@ oop TenuredGeneration::promote(oop obj, size_t obj_size) { if (result == nullptr) { // Promotion of obj into gen failed. Try to expand and allocate. result = expand_and_allocate(obj_size, false); - if (result == nullptr) { - return nullptr; - } } - // Copy to new location. - Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(obj), result, obj_size); - oop new_obj = cast_to_oop<HeapWord*>(result); - return new_obj; + return cast_to_oop<HeapWord*>(result); } HeapWord* diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.hpp b/src/hotspot/share/gc/serial/tenuredGeneration.hpp index dc2730eaf419d..bcb2d668213e8 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.hpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.hpp @@ -163,12 +163,11 @@ class TenuredGeneration: public Generation { bool promotion_attempt_is_safe(size_t max_promoted_in_bytes) const; // "obj" is the address of an object in young-gen. Allocate space for "obj" - // in the old-gen, and copy "obj" into the newly allocated space, if - // possible, returning the result (or null if the allocation failed). + // in the old-gen, returning the result (or null if the allocation failed). // // The "obj_size" argument is just obj->size(), passed along so the caller can // avoid repeating the virtual call to retrieve it. - oop promote(oop obj, size_t obj_size); + oop allocate_for_promotion(oop obj, size_t obj_size); virtual void verify(); virtual void print_on(outputStream* st) const; From 685e5878b823fa5e3ae88ffd76de6507d6057af2 Mon Sep 17 00:00:00 2001 From: Jasmine Karthikeyan <jkarthikeyan@openjdk.org> Date: Tue, 2 Jul 2024 14:36:29 +0000 Subject: [PATCH 261/471] 8334816: compiler/c2/irTests/TestIfMinMax.java fails after 8334629 Reviewed-by: thartmann, chagedorn --- test/hotspot/jtreg/ProblemList.txt | 1 - .../compiler/c2/irTests/TestIfMinMax.java | 24 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 0f574f7168a0c..2d1311e3ac127 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -53,7 +53,6 @@ compiler/loopopts/TestUnreachableInnerLoop.java 8288981 linux-s390x compiler/c2/Test8004741.java 8235801 generic-all compiler/c2/irTests/TestDuplicateBackedge.java 8318904 generic-all -compiler/c2/irTests/TestIfMinMax.java 8334816 generic-all compiler/codecache/jmx/PoolsIndependenceTest.java 8264632 macosx-all compiler/codecache/CheckLargePages.java 8332654 linux-x64 diff --git a/test/hotspot/jtreg/compiler/c2/irTests/TestIfMinMax.java b/test/hotspot/jtreg/compiler/c2/irTests/TestIfMinMax.java index de0b41e73ea86..41402036aea0e 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/TestIfMinMax.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/TestIfMinMax.java @@ -181,19 +181,19 @@ static Object[] setupIntArrays() { int[] a = new int[512]; int[] b = new int[512]; - // Fill from 1 to 50 - for (int i = 0; i < 50; i++) { + // Fill from 1 to 125 + for (int i = 0; i < 125; i++) { a[i] = i + 1; b[i] = 1; } - // Fill from -1 to -50 - for (int i = 50; i < 100; i++) { - a[i] = -(i - 49); + // Fill from -1 to -125 + for (int i = 125; i < 250; i++) { + a[i] = -(i - 124); b[i] = 1; } - for (int i = 100; i < 512; i++) { + for (int i = 250; i < 512; i++) { a[i] = RANDOM.nextInt(); b[i] = 1; } @@ -206,19 +206,19 @@ static Object[] setupLongArrays() { long[] a = new long[512]; long[] b = new long[512]; - // Fill from 1 to 50 - for (int i = 0; i < 50; i++) { + // Fill from 1 to 125 + for (int i = 0; i < 125; i++) { a[i] = i + 1; b[i] = 1; } - // Fill from -1 to -50 - for (int i = 50; i < 100; i++) { - a[i] = -(i - 49); + // Fill from -1 to -125 + for (int i = 125; i < 250; i++) { + a[i] = -(i - 124); b[i] = 1; } - for (int i = 100; i < 512; i++) { + for (int i = 250; i < 512; i++) { a[i] = RANDOM.nextLong(); b[i] = 1; } From 153b12b9df87fdf8122cae3bf7f13078f55f7101 Mon Sep 17 00:00:00 2001 From: Severin Gehwolf <sgehwolf@openjdk.org> Date: Tue, 2 Jul 2024 15:38:54 +0000 Subject: [PATCH 262/471] 8331560: Refactor Hotspot container detection code so that subsystem delegates to controllers Reviewed-by: jsjolen, stuefe --- .../os/linux/cgroupSubsystem_linux.cpp | 123 ++++++++------- .../os/linux/cgroupSubsystem_linux.hpp | 59 +++++--- src/hotspot/os/linux/cgroupUtil_linux.cpp | 48 ++++++ src/hotspot/os/linux/cgroupUtil_linux.hpp | 37 +++++ .../os/linux/cgroupV1Subsystem_linux.cpp | 141 ++++++++++-------- .../os/linux/cgroupV1Subsystem_linux.hpp | 120 +++++++++------ .../os/linux/cgroupV2Subsystem_linux.cpp | 133 ++++++++++------- .../os/linux/cgroupV2Subsystem_linux.hpp | 114 +++++++++----- 8 files changed, 511 insertions(+), 264 deletions(-) create mode 100644 src/hotspot/os/linux/cgroupUtil_linux.cpp create mode 100644 src/hotspot/os/linux/cgroupUtil_linux.hpp diff --git a/src/hotspot/os/linux/cgroupSubsystem_linux.cpp b/src/hotspot/os/linux/cgroupSubsystem_linux.cpp index 0dbd6ffd52be7..1da0e44dbf48e 100644 --- a/src/hotspot/os/linux/cgroupSubsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupSubsystem_linux.cpp @@ -28,6 +28,7 @@ #include "cgroupSubsystem_linux.hpp" #include "cgroupV1Subsystem_linux.hpp" #include "cgroupV2Subsystem_linux.hpp" +#include "cgroupUtil_linux.hpp" #include "logging/log.hpp" #include "memory/allocation.hpp" #include "os_linux.hpp" @@ -41,7 +42,7 @@ static const char* cg_controller_name[] = { "cpu", "cpuset", "cpuacct", "memory" CgroupSubsystem* CgroupSubsystemFactory::create() { CgroupV1MemoryController* memory = nullptr; CgroupV1Controller* cpuset = nullptr; - CgroupV1Controller* cpu = nullptr; + CgroupV1CpuController* cpu = nullptr; CgroupV1Controller* cpuacct = nullptr; CgroupV1Controller* pids = nullptr; CgroupInfo cg_infos[CG_INFO_LENGTH]; @@ -61,14 +62,18 @@ CgroupSubsystem* CgroupSubsystemFactory::create() { if (is_cgroup_v2(&cg_type_flags)) { // Cgroups v2 case, we have all the info we need. // Construct the subsystem, free resources and return - // Note: any index in cg_infos will do as the path is the same for - // all controllers. - CgroupController* unified = new CgroupV2Controller(cg_infos[MEMORY_IDX]._mount_path, - cg_infos[MEMORY_IDX]._cgroup_path, - cg_infos[MEMORY_IDX]._read_only); + // Note: We use the memory for non-cpu non-memory controller look-ups. + // Perhaps we ought to have separate controllers for all. + CgroupV2Controller mem_other = CgroupV2Controller(cg_infos[MEMORY_IDX]._mount_path, + cg_infos[MEMORY_IDX]._cgroup_path, + cg_infos[MEMORY_IDX]._read_only); + CgroupV2MemoryController* memory = new CgroupV2MemoryController(mem_other); + CgroupV2CpuController* cpu = new CgroupV2CpuController(CgroupV2Controller(cg_infos[CPU_IDX]._mount_path, + cg_infos[CPU_IDX]._cgroup_path, + cg_infos[CPU_IDX]._read_only)); log_debug(os, container)("Detected cgroups v2 unified hierarchy"); cleanup(cg_infos); - return new CgroupV2Subsystem(unified); + return new CgroupV2Subsystem(memory, cpu, mem_other); } /* @@ -102,13 +107,13 @@ CgroupSubsystem* CgroupSubsystemFactory::create() { CgroupInfo info = cg_infos[i]; if (info._data_complete) { // pids controller might have incomplete data if (strcmp(info._name, "memory") == 0) { - memory = new CgroupV1MemoryController(info._root_mount_path, info._mount_path, info._read_only); + memory = new CgroupV1MemoryController(CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only)); memory->set_subsystem_path(info._cgroup_path); } else if (strcmp(info._name, "cpuset") == 0) { cpuset = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only); cpuset->set_subsystem_path(info._cgroup_path); } else if (strcmp(info._name, "cpu") == 0) { - cpu = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only); + cpu = new CgroupV1CpuController(CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only)); cpu->set_subsystem_path(info._cgroup_path); } else if (strcmp(info._name, "cpuacct") == 0) { cpuacct = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only); @@ -556,13 +561,13 @@ void CgroupSubsystemFactory::cleanup(CgroupInfo* cg_infos) { */ int CgroupSubsystem::active_processor_count() { int quota_count = 0; - int cpu_count, limit_count; + int cpu_count; int result; // We use a cache with a timeout to avoid performing expensive // computations in the event this function is called frequently. // [See 8227006]. - CachingCgroupController* contrl = cpu_controller(); + CachingCgroupController<CgroupCpuController>* contrl = cpu_controller(); CachedMetric* cpu_limit = contrl->metrics_cache(); if (!cpu_limit->should_check_metric()) { int val = (int)cpu_limit->value(); @@ -570,23 +575,8 @@ int CgroupSubsystem::active_processor_count() { return val; } - cpu_count = limit_count = os::Linux::active_processor_count(); - int quota = cpu_quota(); - int period = cpu_period(); - - if (quota > -1 && period > 0) { - quota_count = ceilf((float)quota / (float)period); - log_trace(os, container)("CPU Quota count based on quota/period: %d", quota_count); - } - - // Use quotas - if (quota_count != 0) { - limit_count = quota_count; - } - - result = MIN2(cpu_count, limit_count); - log_trace(os, container)("OSContainer::active_processor_count: %d", result); - + cpu_count = os::Linux::active_processor_count(); + result = CgroupUtil::processor_count(contrl->controller(), cpu_count); // Update cached metric to avoid re-reading container settings too often cpu_limit->set_value(result, OSCONTAINER_CACHE_TIMEOUT); @@ -603,35 +593,14 @@ int CgroupSubsystem::active_processor_count() { * OSCONTAINER_ERROR for not supported */ jlong CgroupSubsystem::memory_limit_in_bytes() { - CachingCgroupController* contrl = memory_controller(); + CachingCgroupController<CgroupMemoryController>* contrl = memory_controller(); CachedMetric* memory_limit = contrl->metrics_cache(); if (!memory_limit->should_check_metric()) { return memory_limit->value(); } jlong phys_mem = os::Linux::physical_memory(); log_trace(os, container)("total physical memory: " JLONG_FORMAT, phys_mem); - jlong mem_limit = read_memory_limit_in_bytes(); - - if (mem_limit <= 0 || mem_limit >= phys_mem) { - jlong read_mem_limit = mem_limit; - const char *reason; - if (mem_limit >= phys_mem) { - // Exceeding physical memory is treated as unlimited. Cg v1's implementation - // of read_memory_limit_in_bytes() caps this at phys_mem since Cg v1 has no - // value to represent 'max'. Cg v2 may return a value >= phys_mem if e.g. the - // container engine was started with a memory flag exceeding it. - reason = "ignored"; - mem_limit = -1; - } else if (OSCONTAINER_ERROR == mem_limit) { - reason = "failed"; - } else { - assert(mem_limit == -1, "Expected unlimited"); - reason = "unlimited"; - } - log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", using host value " JLONG_FORMAT, - reason, read_mem_limit, phys_mem); - } - + jlong mem_limit = contrl->controller()->read_memory_limit_in_bytes(phys_mem); // Update cached metric to avoid re-reading container settings too often memory_limit->set_value(mem_limit, OSCONTAINER_CACHE_TIMEOUT); return mem_limit; @@ -796,3 +765,55 @@ jlong CgroupController::limit_from_str(char* limit_str) { } return (jlong)limit; } + +// CgroupSubsystem implementations + +jlong CgroupSubsystem::memory_and_swap_limit_in_bytes() { + julong phys_mem = os::Linux::physical_memory(); + julong host_swap = os::Linux::host_swap(); + return memory_controller()->controller()->memory_and_swap_limit_in_bytes(phys_mem, host_swap); +} + +jlong CgroupSubsystem::memory_and_swap_usage_in_bytes() { + julong phys_mem = os::Linux::physical_memory(); + julong host_swap = os::Linux::host_swap(); + return memory_controller()->controller()->memory_and_swap_usage_in_bytes(phys_mem, host_swap); +} + +jlong CgroupSubsystem::memory_soft_limit_in_bytes() { + julong phys_mem = os::Linux::physical_memory(); + return memory_controller()->controller()->memory_soft_limit_in_bytes(phys_mem); +} + +jlong CgroupSubsystem::memory_usage_in_bytes() { + return memory_controller()->controller()->memory_usage_in_bytes(); +} + +jlong CgroupSubsystem::memory_max_usage_in_bytes() { + return memory_controller()->controller()->memory_max_usage_in_bytes(); +} + +jlong CgroupSubsystem::rss_usage_in_bytes() { + return memory_controller()->controller()->rss_usage_in_bytes(); +} + +jlong CgroupSubsystem::cache_usage_in_bytes() { + return memory_controller()->controller()->cache_usage_in_bytes(); +} + +int CgroupSubsystem::cpu_quota() { + return cpu_controller()->controller()->cpu_quota(); +} + +int CgroupSubsystem::cpu_period() { + return cpu_controller()->controller()->cpu_period(); +} + +int CgroupSubsystem::cpu_shares() { + return cpu_controller()->controller()->cpu_shares(); +} + +void CgroupSubsystem::print_version_specific_info(outputStream* st) { + julong phys_mem = os::Linux::physical_memory(); + memory_controller()->controller()->print_version_specific_info(st, phys_mem); +} diff --git a/src/hotspot/os/linux/cgroupSubsystem_linux.hpp b/src/hotspot/os/linux/cgroupSubsystem_linux.hpp index 00419c77570ae..4d5fa5d487900 100644 --- a/src/hotspot/os/linux/cgroupSubsystem_linux.hpp +++ b/src/hotspot/os/linux/cgroupSubsystem_linux.hpp @@ -180,48 +180,73 @@ class CachedMetric : public CHeapObj<mtInternal>{ } }; +template <class T> class CachingCgroupController : public CHeapObj<mtInternal> { private: - CgroupController* _controller; + T* _controller; CachedMetric* _metrics_cache; public: - CachingCgroupController(CgroupController* cont) { + CachingCgroupController(T* cont) { _controller = cont; _metrics_cache = new CachedMetric(); } CachedMetric* metrics_cache() { return _metrics_cache; } - CgroupController* controller() { return _controller; } + T* controller() { return _controller; } }; -class CgroupSubsystem: public CHeapObj<mtInternal> { +// Pure virtual class representing version agnostic CPU controllers +class CgroupCpuController: public CHeapObj<mtInternal> { public: - jlong memory_limit_in_bytes(); - int active_processor_count(); - virtual int cpu_quota() = 0; virtual int cpu_period() = 0; virtual int cpu_shares() = 0; - virtual jlong pids_max() = 0; - virtual jlong pids_current() = 0; + virtual bool is_read_only() = 0; +}; + +// Pure virtual class representing version agnostic memory controllers +class CgroupMemoryController: public CHeapObj<mtInternal> { + public: + virtual jlong read_memory_limit_in_bytes(julong upper_bound) = 0; virtual jlong memory_usage_in_bytes() = 0; - virtual jlong memory_and_swap_limit_in_bytes() = 0; - virtual jlong memory_and_swap_usage_in_bytes() = 0; - virtual jlong memory_soft_limit_in_bytes() = 0; + virtual jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) = 0; + virtual jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) = 0; + virtual jlong memory_soft_limit_in_bytes(julong upper_bound) = 0; virtual jlong memory_max_usage_in_bytes() = 0; virtual jlong rss_usage_in_bytes() = 0; virtual jlong cache_usage_in_bytes() = 0; + virtual void print_version_specific_info(outputStream* st, julong host_mem) = 0; + virtual bool is_read_only() = 0; +}; + +class CgroupSubsystem: public CHeapObj<mtInternal> { + public: + jlong memory_limit_in_bytes(); + int active_processor_count(); + + virtual jlong pids_max() = 0; + virtual jlong pids_current() = 0; virtual bool is_containerized() = 0; virtual char * cpu_cpuset_cpus() = 0; virtual char * cpu_cpuset_memory_nodes() = 0; - virtual jlong read_memory_limit_in_bytes() = 0; virtual const char * container_type() = 0; - virtual CachingCgroupController* memory_controller() = 0; - virtual CachingCgroupController* cpu_controller() = 0; - - virtual void print_version_specific_info(outputStream* st) = 0; + virtual CachingCgroupController<CgroupMemoryController>* memory_controller() = 0; + virtual CachingCgroupController<CgroupCpuController>* cpu_controller() = 0; + + int cpu_quota(); + int cpu_period(); + int cpu_shares(); + + jlong memory_usage_in_bytes(); + jlong memory_and_swap_limit_in_bytes(); + jlong memory_and_swap_usage_in_bytes(); + jlong memory_soft_limit_in_bytes(); + jlong memory_max_usage_in_bytes(); + jlong rss_usage_in_bytes(); + jlong cache_usage_in_bytes(); + void print_version_specific_info(outputStream* st); }; // Utility class for storing info retrieved from /proc/cgroups, diff --git a/src/hotspot/os/linux/cgroupUtil_linux.cpp b/src/hotspot/os/linux/cgroupUtil_linux.cpp new file mode 100644 index 0000000000000..24046991905ee --- /dev/null +++ b/src/hotspot/os/linux/cgroupUtil_linux.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "cgroupUtil_linux.hpp" + +int CgroupUtil::processor_count(CgroupCpuController* cpu_ctrl, int host_cpus) { + assert(host_cpus > 0, "physical host cpus must be positive"); + int limit_count = host_cpus; + int quota = cpu_ctrl->cpu_quota(); + int period = cpu_ctrl->cpu_period(); + int quota_count = 0; + int result = 0; + + if (quota > -1 && period > 0) { + quota_count = ceilf((float)quota / (float)period); + log_trace(os, container)("CPU Quota count based on quota/period: %d", quota_count); + } + + // Use quotas + if (quota_count != 0) { + limit_count = quota_count; + } + + result = MIN2(host_cpus, limit_count); + log_trace(os, container)("OSContainer::active_processor_count: %d", result); + return result; +} diff --git a/src/hotspot/os/linux/cgroupUtil_linux.hpp b/src/hotspot/os/linux/cgroupUtil_linux.hpp new file mode 100644 index 0000000000000..fdcc4806c3b93 --- /dev/null +++ b/src/hotspot/os/linux/cgroupUtil_linux.hpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. + * 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 CGROUP_UTIL_LINUX_HPP +#define CGROUP_UTIL_LINUX_HPP + +#include "utilities/globalDefinitions.hpp" +#include "cgroupSubsystem_linux.hpp" + +class CgroupUtil: AllStatic { + + public: + static int processor_count(CgroupCpuController* cpu, int host_cpus); +}; + +#endif // CGROUP_UTIL_LINUX_HPP diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp index 3f6ae813810f2..d7f9918afdad8 100644 --- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp @@ -26,6 +26,7 @@ #include <math.h> #include <errno.h> #include "cgroupV1Subsystem_linux.hpp" +#include "cgroupUtil_linux.hpp" #include "logging/log.hpp" #include "memory/allocation.hpp" #include "runtime/globals.hpp" @@ -76,42 +77,62 @@ void CgroupV1Controller::set_subsystem_path(char *cgroup_path) { */ jlong CgroupV1MemoryController::uses_mem_hierarchy() { julong use_hierarchy; - CONTAINER_READ_NUMBER_CHECKED(this, "/memory.use_hierarchy", "Use Hierarchy", use_hierarchy); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.use_hierarchy", "Use Hierarchy", use_hierarchy); return (jlong)use_hierarchy; } void CgroupV1MemoryController::set_subsystem_path(char *cgroup_path) { - CgroupV1Controller::set_subsystem_path(cgroup_path); + reader()->set_subsystem_path(cgroup_path); jlong hierarchy = uses_mem_hierarchy(); if (hierarchy > 0) { set_hierarchical(true); } } -jlong CgroupV1Subsystem::read_memory_limit_in_bytes() { +static inline +void verbose_log(julong read_mem_limit, julong host_mem) { + if (log_is_enabled(Debug, os, container)) { + jlong mem_limit = (jlong)read_mem_limit; // account for negative values + if (mem_limit < 0 || read_mem_limit >= host_mem) { + const char *reason; + if (mem_limit == OSCONTAINER_ERROR) { + reason = "failed"; + } else if (mem_limit == -1) { + reason = "unlimited"; + } else { + assert(read_mem_limit >= host_mem, "Expected read value exceeding host_mem"); + // Exceeding physical memory is treated as unlimited. This implementation + // caps it at host_mem since Cg v1 has no value to represent 'max'. + reason = "ignored"; + } + log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", using host value " JLONG_FORMAT, + reason, mem_limit, host_mem); + } + } +} + +jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong phys_mem) { julong memlimit; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.limit_in_bytes", "Memory Limit", memlimit); - if (memlimit >= os::Linux::physical_memory()) { + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.limit_in_bytes", "Memory Limit", memlimit); + if (memlimit >= phys_mem) { log_trace(os, container)("Non-Hierarchical Memory Limit is: Unlimited"); - CgroupV1MemoryController* mem_controller = reinterpret_cast<CgroupV1MemoryController*>(_memory->controller()); - if (mem_controller->is_hierarchical()) { + if (is_hierarchical()) { julong hier_memlimit; - bool is_ok = _memory->controller()->read_numerical_key_value("/memory.stat", - "hierarchical_memory_limit", - &hier_memlimit); + bool is_ok = reader()->read_numerical_key_value("/memory.stat", "hierarchical_memory_limit", &hier_memlimit); if (!is_ok) { return OSCONTAINER_ERROR; } log_trace(os, container)("Hierarchical Memory Limit is: " JULONG_FORMAT, hier_memlimit); - if (hier_memlimit >= os::Linux::physical_memory()) { - log_trace(os, container)("Hierarchical Memory Limit is: Unlimited"); - } else { + if (hier_memlimit < phys_mem) { + verbose_log(hier_memlimit, phys_mem); return (jlong)hier_memlimit; } + log_trace(os, container)("Hierarchical Memory Limit is: Unlimited"); } + verbose_log(memlimit, phys_mem); return (jlong)-1; - } - else { + } else { + verbose_log(memlimit, phys_mem); return (jlong)memlimit; } } @@ -128,20 +149,17 @@ jlong CgroupV1Subsystem::read_memory_limit_in_bytes() { * * -1 if there isn't any limit in place (note: includes values which exceed a physical * upper bound) */ -jlong CgroupV1Subsystem::read_mem_swap() { - julong host_total_memsw; +jlong CgroupV1MemoryController::read_mem_swap(julong host_total_memsw) { julong hier_memswlimit; julong memswlimit; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit); - host_total_memsw = os::Linux::host_swap() + os::Linux::physical_memory(); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit); if (memswlimit >= host_total_memsw) { log_trace(os, container)("Non-Hierarchical Memory and Swap Limit is: Unlimited"); - CgroupV1MemoryController* mem_controller = reinterpret_cast<CgroupV1MemoryController*>(_memory->controller()); - if (mem_controller->is_hierarchical()) { + if (is_hierarchical()) { const char* matchline = "hierarchical_memsw_limit"; - bool is_ok = _memory->controller()->read_numerical_key_value("/memory.stat", - matchline, - &hier_memswlimit); + bool is_ok = reader()->read_numerical_key_value("/memory.stat", + matchline, + &hier_memswlimit); if (!is_ok) { return OSCONTAINER_ERROR; } @@ -158,8 +176,8 @@ jlong CgroupV1Subsystem::read_mem_swap() { } } -jlong CgroupV1Subsystem::memory_and_swap_limit_in_bytes() { - jlong memory_swap = read_mem_swap(); +jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) { + jlong memory_swap = read_mem_swap(host_mem + host_swap); if (memory_swap == -1) { return memory_swap; } @@ -168,7 +186,7 @@ jlong CgroupV1Subsystem::memory_and_swap_limit_in_bytes() { // supported. jlong swappiness = read_mem_swappiness(); if (swappiness == 0 || memory_swap == OSCONTAINER_ERROR) { - jlong memlimit = read_memory_limit_in_bytes(); + jlong memlimit = read_memory_limit_in_bytes(host_mem); if (memory_swap == OSCONTAINER_ERROR) { log_trace(os, container)("Memory and Swap Limit has been reset to " JLONG_FORMAT " because swap is not supported", memlimit); } else { @@ -186,28 +204,28 @@ jlong memory_swap_usage_impl(CgroupController* ctrl) { return (jlong)memory_swap_usage; } -jlong CgroupV1Subsystem::memory_and_swap_usage_in_bytes() { - jlong memory_sw_limit = memory_and_swap_limit_in_bytes(); - jlong memory_limit = CgroupSubsystem::memory_limit_in_bytes(); +jlong CgroupV1MemoryController::memory_and_swap_usage_in_bytes(julong phys_mem, julong host_swap) { + jlong memory_sw_limit = memory_and_swap_limit_in_bytes(phys_mem, host_swap); + jlong memory_limit = read_memory_limit_in_bytes(phys_mem); if (memory_sw_limit > 0 && memory_limit > 0) { jlong delta_swap = memory_sw_limit - memory_limit; if (delta_swap > 0) { - return memory_swap_usage_impl(_memory->controller()); + return memory_swap_usage_impl(reader()); } } return memory_usage_in_bytes(); } -jlong CgroupV1Subsystem::read_mem_swappiness() { +jlong CgroupV1MemoryController::read_mem_swappiness() { julong swappiness; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.swappiness", "Swappiness", swappiness); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.swappiness", "Swappiness", swappiness); return (jlong)swappiness; } -jlong CgroupV1Subsystem::memory_soft_limit_in_bytes() { +jlong CgroupV1MemoryController::memory_soft_limit_in_bytes(julong phys_mem) { julong memsoftlimit; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.soft_limit_in_bytes", "Memory Soft Limit", memsoftlimit); - if (memsoftlimit >= os::Linux::physical_memory()) { + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.soft_limit_in_bytes", "Memory Soft Limit", memsoftlimit); + if (memsoftlimit >= phys_mem) { log_trace(os, container)("Memory Soft Limit is: Unlimited"); return (jlong)-1; } else { @@ -235,9 +253,9 @@ bool CgroupV1Subsystem::is_containerized() { * -1 for unlimited * OSCONTAINER_ERROR for not supported */ -jlong CgroupV1Subsystem::memory_usage_in_bytes() { +jlong CgroupV1MemoryController::memory_usage_in_bytes() { julong memusage; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.usage_in_bytes", "Memory Usage", memusage); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.usage_in_bytes", "Memory Usage", memusage); return (jlong)memusage; } @@ -249,17 +267,15 @@ jlong CgroupV1Subsystem::memory_usage_in_bytes() { * max memory usage in bytes or * OSCONTAINER_ERROR for not supported */ -jlong CgroupV1Subsystem::memory_max_usage_in_bytes() { +jlong CgroupV1MemoryController::memory_max_usage_in_bytes() { julong memmaxusage; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.max_usage_in_bytes", "Maximum Memory Usage", memmaxusage); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.max_usage_in_bytes", "Maximum Memory Usage", memmaxusage); return (jlong)memmaxusage; } -jlong CgroupV1Subsystem::rss_usage_in_bytes() { +jlong CgroupV1MemoryController::rss_usage_in_bytes() { julong rss; - bool is_ok = _memory->controller()->read_numerical_key_value("/memory.stat", - "rss", - &rss); + bool is_ok = reader()->read_numerical_key_value("/memory.stat", "rss", &rss); if (!is_ok) { return OSCONTAINER_ERROR; } @@ -267,11 +283,9 @@ jlong CgroupV1Subsystem::rss_usage_in_bytes() { return (jlong)rss; } -jlong CgroupV1Subsystem::cache_usage_in_bytes() { +jlong CgroupV1MemoryController::cache_usage_in_bytes() { julong cache; - bool is_ok = _memory->controller()->read_numerical_key_value("/memory.stat", - "cache", - &cache); + bool is_ok = reader()->read_numerical_key_value("/memory.stat", "cache", &cache); if (!is_ok) { return OSCONTAINER_ERROR; } @@ -279,30 +293,30 @@ jlong CgroupV1Subsystem::cache_usage_in_bytes() { return cache; } -jlong CgroupV1Subsystem::kernel_memory_usage_in_bytes() { +jlong CgroupV1MemoryController::kernel_memory_usage_in_bytes() { julong kmem_usage; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.kmem.usage_in_bytes", "Kernel Memory Usage", kmem_usage); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.kmem.usage_in_bytes", "Kernel Memory Usage", kmem_usage); return (jlong)kmem_usage; } -jlong CgroupV1Subsystem::kernel_memory_limit_in_bytes() { +jlong CgroupV1MemoryController::kernel_memory_limit_in_bytes(julong phys_mem) { julong kmem_limit; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.kmem.limit_in_bytes", "Kernel Memory Limit", kmem_limit); - if (kmem_limit >= os::Linux::physical_memory()) { + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.kmem.limit_in_bytes", "Kernel Memory Limit", kmem_limit); + if (kmem_limit >= phys_mem) { return (jlong)-1; } return (jlong)kmem_limit; } -jlong CgroupV1Subsystem::kernel_memory_max_usage_in_bytes() { +jlong CgroupV1MemoryController::kernel_memory_max_usage_in_bytes() { julong kmem_max_usage; - CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.kmem.max_usage_in_bytes", "Maximum Kernel Memory Usage", kmem_max_usage); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.kmem.max_usage_in_bytes", "Maximum Kernel Memory Usage", kmem_max_usage); return (jlong)kmem_max_usage; } -void CgroupV1Subsystem::print_version_specific_info(outputStream* st) { +void CgroupV1MemoryController::print_version_specific_info(outputStream* st, julong phys_mem) { jlong kmem_usage = kernel_memory_usage_in_bytes(); - jlong kmem_limit = kernel_memory_limit_in_bytes(); + jlong kmem_limit = kernel_memory_limit_in_bytes(phys_mem); jlong kmem_max_usage = kernel_memory_max_usage_in_bytes(); OSContainer::print_container_helper(st, kmem_usage, "kernel_memory_usage_in_bytes"); @@ -332,10 +346,9 @@ char* CgroupV1Subsystem::cpu_cpuset_memory_nodes() { * -1 for no quota * OSCONTAINER_ERROR for not supported */ -int CgroupV1Subsystem::cpu_quota() { +int CgroupV1CpuController::cpu_quota() { julong quota; - bool is_ok = _cpu->controller()-> - read_number("/cpu.cfs_quota_us", "a); + bool is_ok = reader()->read_number("/cpu.cfs_quota_us", "a); if (!is_ok) { log_trace(os, container)("CPU Quota failed: %d", OSCONTAINER_ERROR); return OSCONTAINER_ERROR; @@ -347,9 +360,9 @@ int CgroupV1Subsystem::cpu_quota() { return quota_int; } -int CgroupV1Subsystem::cpu_period() { +int CgroupV1CpuController::cpu_period() { julong period; - CONTAINER_READ_NUMBER_CHECKED(_cpu->controller(), "/cpu.cfs_period_us", "CPU Period", period); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/cpu.cfs_period_us", "CPU Period", period); return (int)period; } @@ -363,9 +376,9 @@ int CgroupV1Subsystem::cpu_period() { * -1 for no share setup * OSCONTAINER_ERROR for not supported */ -int CgroupV1Subsystem::cpu_shares() { +int CgroupV1CpuController::cpu_shares() { julong shares; - CONTAINER_READ_NUMBER_CHECKED(_cpu->controller(), "/cpu.shares", "CPU Shares", shares); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/cpu.shares", "CPU Shares", shares); int shares_int = (int)shares; // Convert 1024 to no shares setup if (shares_int == 1024) return -1; diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp index 2b67678c2e8da..251fbde85f0bb 100644 --- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp +++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp @@ -34,31 +34,60 @@ class CgroupV1Controller: public CgroupController { private: /* mountinfo contents */ - char *_root; - char *_mount_point; + char* _root; + char* _mount_point; bool _read_only; /* Constructed subsystem directory */ - char *_path; + char* _path; public: - CgroupV1Controller(char *root, char *mountpoint, bool ro) { - _root = os::strdup(root); - _mount_point = os::strdup(mountpoint); - _path = nullptr; - _read_only = ro; + CgroupV1Controller(char *root, + char *mountpoint, + bool ro) : _root(os::strdup(root)), + _mount_point(os::strdup(mountpoint)), + _read_only(ro), + _path(nullptr) { + } + // Shallow copy constructor + CgroupV1Controller(const CgroupV1Controller& o) : _root(o._root), + _mount_point(o._mount_point), + _read_only(o._read_only), + _path(o._path) { + } + ~CgroupV1Controller() { + // At least one subsystem controller exists with paths to malloc'd path + // names } - virtual void set_subsystem_path(char *cgroup_path); - char *subsystem_path() { return _path; } + void set_subsystem_path(char *cgroup_path); + char *subsystem_path() override { return _path; } bool is_read_only() { return _read_only; } }; -class CgroupV1MemoryController: public CgroupV1Controller { +class CgroupV1MemoryController final : public CgroupMemoryController { + private: + CgroupV1Controller _reader; + CgroupV1Controller* reader() { return &_reader; } public: bool is_hierarchical() { return _uses_mem_hierarchy; } void set_subsystem_path(char *cgroup_path); + jlong read_memory_limit_in_bytes(julong upper_bound) override; + jlong memory_usage_in_bytes() override; + jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) override; + jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) override; + jlong memory_soft_limit_in_bytes(julong upper_bound) override; + jlong memory_max_usage_in_bytes() override; + jlong rss_usage_in_bytes() override; + jlong cache_usage_in_bytes() override; + jlong kernel_memory_usage_in_bytes(); + jlong kernel_memory_limit_in_bytes(julong host_mem); + jlong kernel_memory_max_usage_in_bytes(); + void print_version_specific_info(outputStream* st, julong host_mem) override; + bool is_read_only() override { + return reader()->is_read_only(); + } private: /* Some container runtimes set limits via cgroup * hierarchy. If set to true consider also memory.stat @@ -66,26 +95,41 @@ class CgroupV1MemoryController: public CgroupV1Controller { bool _uses_mem_hierarchy; jlong uses_mem_hierarchy(); void set_hierarchical(bool value) { _uses_mem_hierarchy = value; } + jlong read_mem_swappiness(); + jlong read_mem_swap(julong host_total_memsw); public: - CgroupV1MemoryController(char *root, char *mountpoint, bool ro) : CgroupV1Controller(root, mountpoint, ro) { - _uses_mem_hierarchy = false; + CgroupV1MemoryController(const CgroupV1Controller& reader) + : _reader(reader), + _uses_mem_hierarchy(false) { } }; -class CgroupV1Subsystem: public CgroupSubsystem { +class CgroupV1CpuController final : public CgroupCpuController { + + private: + CgroupV1Controller _reader; + CgroupV1Controller* reader() { return &_reader; } + public: + int cpu_quota() override; + int cpu_period() override; + int cpu_shares() override; + void set_subsystem_path(char *cgroup_path) { + reader()->set_subsystem_path(cgroup_path); + } + bool is_read_only() override { + return reader()->is_read_only(); + } public: - jlong read_memory_limit_in_bytes(); - jlong memory_and_swap_limit_in_bytes(); - jlong memory_and_swap_usage_in_bytes(); - jlong memory_soft_limit_in_bytes(); - jlong memory_usage_in_bytes(); - jlong memory_max_usage_in_bytes(); - jlong rss_usage_in_bytes(); - jlong cache_usage_in_bytes(); + CgroupV1CpuController(const CgroupV1Controller& reader) : _reader(reader) { + } +}; + +class CgroupV1Subsystem: public CgroupSubsystem { + public: jlong kernel_memory_usage_in_bytes(); jlong kernel_memory_limit_in_bytes(); jlong kernel_memory_max_usage_in_bytes(); @@ -93,45 +137,35 @@ class CgroupV1Subsystem: public CgroupSubsystem { char * cpu_cpuset_cpus(); char * cpu_cpuset_memory_nodes(); - int cpu_quota(); - int cpu_period(); - - int cpu_shares(); - jlong pids_max(); jlong pids_current(); bool is_containerized(); - void print_version_specific_info(outputStream* st); - const char * container_type() { return "cgroupv1"; } - CachingCgroupController * memory_controller() { return _memory; } - CachingCgroupController * cpu_controller() { return _cpu; } + CachingCgroupController<CgroupMemoryController>* memory_controller() { return _memory; } + CachingCgroupController<CgroupCpuController>* cpu_controller() { return _cpu; } private: /* controllers */ - CachingCgroupController* _memory = nullptr; + CachingCgroupController<CgroupMemoryController>* _memory = nullptr; CgroupV1Controller* _cpuset = nullptr; - CachingCgroupController* _cpu = nullptr; + CachingCgroupController<CgroupCpuController>* _cpu = nullptr; CgroupV1Controller* _cpuacct = nullptr; CgroupV1Controller* _pids = nullptr; - jlong read_mem_swappiness(); - jlong read_mem_swap(); - public: CgroupV1Subsystem(CgroupV1Controller* cpuset, - CgroupV1Controller* cpu, + CgroupV1CpuController* cpu, CgroupV1Controller* cpuacct, CgroupV1Controller* pids, - CgroupV1MemoryController* memory) { - _cpuset = cpuset; - _cpu = new CachingCgroupController(cpu); - _cpuacct = cpuacct; - _pids = pids; - _memory = new CachingCgroupController(memory); + CgroupV1MemoryController* memory) : + _memory(new CachingCgroupController<CgroupMemoryController>(memory)), + _cpuset(cpuset), + _cpu(new CachingCgroupController<CgroupCpuController>(cpu)), + _cpuacct(cpuacct), + _pids(pids) { } }; diff --git a/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp index 1f97b0212395c..8f7e12d095474 100644 --- a/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp @@ -23,6 +23,7 @@ */ #include "cgroupV2Subsystem_linux.hpp" +#include "cgroupUtil_linux.hpp" /* cpu_shares * @@ -34,9 +35,9 @@ * -1 for no share setup * OSCONTAINER_ERROR for not supported */ -int CgroupV2Subsystem::cpu_shares() { +int CgroupV2CpuController::cpu_shares() { julong shares; - CONTAINER_READ_NUMBER_CHECKED(_unified, "/cpu.weight", "Raw value for CPU Shares", shares); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/cpu.weight", "Raw value for CPU Shares", shares); int shares_int = (int)shares; // Convert default value of 100 to no shares setup if (shares_int == 100) { @@ -83,9 +84,9 @@ int CgroupV2Subsystem::cpu_shares() { * -1 for no quota * OSCONTAINER_ERROR for not supported */ -int CgroupV2Subsystem::cpu_quota() { +int CgroupV2CpuController::cpu_quota() { jlong quota_val; - bool is_ok = _unified->read_numerical_tuple_value("/cpu.max", true /* use_first */, "a_val); + bool is_ok = reader()->read_numerical_tuple_value("/cpu.max", true /* use_first */, "a_val); if (!is_ok) { return OSCONTAINER_ERROR; } @@ -95,24 +96,26 @@ int CgroupV2Subsystem::cpu_quota() { } bool CgroupV2Subsystem::is_containerized() { - return _unified->is_read_only(); + return _unified.is_read_only() && + _memory->controller()->is_read_only() && + _cpu->controller()->is_read_only(); } char* CgroupV2Subsystem::cpu_cpuset_cpus() { char cpus[1024]; - CONTAINER_READ_STRING_CHECKED(_unified, "/cpuset.cpus", "cpuset.cpus", cpus, 1024); + CONTAINER_READ_STRING_CHECKED(unified(), "/cpuset.cpus", "cpuset.cpus", cpus, 1024); return os::strdup(cpus); } char* CgroupV2Subsystem::cpu_cpuset_memory_nodes() { char mems[1024]; - CONTAINER_READ_STRING_CHECKED(_unified, "/cpuset.mems", "cpuset.mems", mems, 1024); + CONTAINER_READ_STRING_CHECKED(unified(), "/cpuset.mems", "cpuset.mems", mems, 1024); return os::strdup(mems); } -int CgroupV2Subsystem::cpu_period() { +int CgroupV2CpuController::cpu_period() { jlong period_val; - bool is_ok = _unified->read_numerical_tuple_value("/cpu.max", false /* use_first */, &period_val); + bool is_ok = reader()->read_numerical_tuple_value("/cpu.max", false /* use_first */, &period_val); if (!is_ok) { log_trace(os, container)("CPU Period failed: %d", OSCONTAINER_ERROR); return OSCONTAINER_ERROR; @@ -131,28 +134,27 @@ int CgroupV2Subsystem::cpu_period() { * -1 for unlimited * OSCONTAINER_ERROR for not supported */ -jlong CgroupV2Subsystem::memory_usage_in_bytes() { +jlong CgroupV2MemoryController::memory_usage_in_bytes() { julong memusage; - CONTAINER_READ_NUMBER_CHECKED(_unified, "/memory.current", "Memory Usage", memusage); + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.current", "Memory Usage", memusage); return (jlong)memusage; } -jlong CgroupV2Subsystem::memory_soft_limit_in_bytes() { +jlong CgroupV2MemoryController::memory_soft_limit_in_bytes(julong phys_mem) { jlong mem_soft_limit; - CONTAINER_READ_NUMBER_CHECKED_MAX(_unified, "/memory.low", "Memory Soft Limit", mem_soft_limit); + CONTAINER_READ_NUMBER_CHECKED_MAX(reader(), "/memory.low", "Memory Soft Limit", mem_soft_limit); return mem_soft_limit; } -jlong CgroupV2Subsystem::memory_max_usage_in_bytes() { +jlong CgroupV2MemoryController::memory_max_usage_in_bytes() { // Log this string at trace level so as to make tests happy. log_trace(os, container)("Maximum Memory Usage is not supported."); return OSCONTAINER_ERROR; // not supported } -jlong CgroupV2Subsystem::rss_usage_in_bytes() { +jlong CgroupV2MemoryController::rss_usage_in_bytes() { julong rss; - bool is_ok = _memory->controller()-> - read_numerical_key_value("/memory.stat", "anon", &rss); + bool is_ok = reader()->read_numerical_key_value("/memory.stat", "anon", &rss); if (!is_ok) { return OSCONTAINER_ERROR; } @@ -160,10 +162,9 @@ jlong CgroupV2Subsystem::rss_usage_in_bytes() { return (jlong)rss; } -jlong CgroupV2Subsystem::cache_usage_in_bytes() { +jlong CgroupV2MemoryController::cache_usage_in_bytes() { julong cache; - bool is_ok = _memory->controller()-> - read_numerical_key_value("/memory.stat", "file", &cache); + bool is_ok = reader()->read_numerical_key_value("/memory.stat", "file", &cache); if (!is_ok) { return OSCONTAINER_ERROR; } @@ -176,18 +177,19 @@ jlong CgroupV2Subsystem::cache_usage_in_bytes() { // respectively. In order to properly report a cgroup v1 like // compound value we need to sum the two values. Setting a swap limit // without also setting a memory limit is not allowed. -jlong CgroupV2Subsystem::memory_and_swap_limit_in_bytes() { +jlong CgroupV2MemoryController::memory_and_swap_limit_in_bytes(julong phys_mem, + julong host_swap /* unused in cg v2 */) { jlong swap_limit; - bool is_ok = _memory->controller()->read_number_handle_max("/memory.swap.max", &swap_limit); + bool is_ok = reader()->read_number_handle_max("/memory.swap.max", &swap_limit); if (!is_ok) { // Some container tests rely on this trace logging to happen. log_trace(os, container)("Swap Limit failed: %d", OSCONTAINER_ERROR); // swap disabled at kernel level, treat it as no swap - return read_memory_limit_in_bytes(); + return read_memory_limit_in_bytes(phys_mem); } log_trace(os, container)("Swap Limit is: " JLONG_FORMAT, swap_limit); if (swap_limit >= 0) { - jlong memory_limit = read_memory_limit_in_bytes(); + jlong memory_limit = read_memory_limit_in_bytes(phys_mem); assert(memory_limit >= 0, "swap limit without memory limit?"); return memory_limit + swap_limit; } @@ -195,29 +197,31 @@ jlong CgroupV2Subsystem::memory_and_swap_limit_in_bytes() { return swap_limit; } -jlong CgroupV2Subsystem::memory_and_swap_usage_in_bytes() { - jlong memory_usage = memory_usage_in_bytes(); - if (memory_usage >= 0) { - jlong swap_current = mem_swp_current_val(); - return memory_usage + (swap_current >= 0 ? swap_current : 0); - } - return memory_usage; // not supported or unlimited case +// memory.swap.current : total amount of swap currently used by the cgroup and its descendants +static +jlong memory_swap_current_value(CgroupV2Controller* ctrl) { + julong swap_current; + CONTAINER_READ_NUMBER_CHECKED(ctrl, "/memory.swap.current", "Swap currently used", swap_current); + return (jlong)swap_current; } -jlong CgroupV2Subsystem::mem_swp_limit_val() { - jlong swap_limit; - CONTAINER_READ_NUMBER_CHECKED_MAX(_unified, "/memory.swap.max", "Swap Limit", swap_limit); - return swap_limit; +jlong CgroupV2MemoryController::memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) { + jlong memory_usage = memory_usage_in_bytes(); + if (memory_usage >= 0) { + jlong swap_current = memory_swap_current_value(reader()); + return memory_usage + (swap_current >= 0 ? swap_current : 0); + } + return memory_usage; // not supported or unlimited case } -// memory.swap.current : total amount of swap currently used by the cgroup and its descendants -jlong CgroupV2Subsystem::mem_swp_current_val() { - julong swap_current; - CONTAINER_READ_NUMBER_CHECKED(_unified, "/memory.swap.current", "Swap currently used", swap_current); - return (jlong)swap_current; +static +jlong memory_limit_value(CgroupV2Controller* ctrl) { + jlong memory_limit; + CONTAINER_READ_NUMBER_CHECKED_MAX(ctrl, "/memory.max", "Memory Limit", memory_limit); + return memory_limit; } -/* memory_limit_in_bytes +/* read_memory_limit_in_bytes * * Return the limit of available memory for this process. * @@ -225,15 +229,44 @@ jlong CgroupV2Subsystem::mem_swp_current_val() { * memory limit in bytes or * -1 for unlimited, OSCONTAINER_ERROR for an error */ -jlong CgroupV2Subsystem::read_memory_limit_in_bytes() { - jlong memory_limit; - CONTAINER_READ_NUMBER_CHECKED_MAX(_unified, "/memory.max", "Memory Limit", memory_limit); - return memory_limit; +jlong CgroupV2MemoryController::read_memory_limit_in_bytes(julong phys_mem) { + jlong limit = memory_limit_value(reader()); + if (log_is_enabled(Trace, os, container)) { + if (limit == -1) { + log_trace(os, container)("Memory Limit is: Unlimited"); + } else { + log_trace(os, container)("Memory Limit is: " JLONG_FORMAT, limit); + } + } + if (log_is_enabled(Debug, os, container)) { + julong read_limit = (julong)limit; // avoid signed/unsigned compare + if (limit < 0 || read_limit >= phys_mem) { + const char* reason; + if (limit == -1) { + reason = "unlimited"; + } else if (limit == OSCONTAINER_ERROR) { + reason = "failed"; + } else { + assert(read_limit >= phys_mem, "Expected mem limit to exceed host memory"); + reason = "ignored"; + } + log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", using host value " JLONG_FORMAT, + reason, limit, phys_mem); + } + } + return limit; +} + +static +jlong memory_swap_limit_value(CgroupV2Controller* ctrl) { + jlong swap_limit; + CONTAINER_READ_NUMBER_CHECKED_MAX(ctrl, "/memory.swap.max", "Swap Limit", swap_limit); + return swap_limit; } -void CgroupV2Subsystem::print_version_specific_info(outputStream* st) { - jlong swap_current = mem_swp_current_val(); - jlong swap_limit = mem_swp_limit_val(); +void CgroupV2MemoryController::print_version_specific_info(outputStream* st, julong phys_mem) { + jlong swap_current = memory_swap_current_value(reader()); + jlong swap_limit = memory_swap_limit_value(reader()); OSContainer::print_container_helper(st, swap_current, "memory_swap_current_in_bytes"); OSContainer::print_container_helper(st, swap_limit, "memory_swap_max_limit_in_bytes"); @@ -259,7 +292,7 @@ char* CgroupV2Controller::construct_path(char* mount_path, char *cgroup_path) { */ jlong CgroupV2Subsystem::pids_max() { jlong pids_max; - CONTAINER_READ_NUMBER_CHECKED_MAX(_unified, "/pids.max", "Maximum number of tasks", pids_max); + CONTAINER_READ_NUMBER_CHECKED_MAX(unified(), "/pids.max", "Maximum number of tasks", pids_max); return pids_max; } @@ -273,6 +306,6 @@ jlong CgroupV2Subsystem::pids_max() { */ jlong CgroupV2Subsystem::pids_current() { julong pids_current; - CONTAINER_READ_NUMBER_CHECKED(_unified, "/pids.current", "Current number of tasks", pids_current); + CONTAINER_READ_NUMBER_CHECKED(unified(), "/pids.current", "Current number of tasks", pids_current); return pids_current; } diff --git a/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp b/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp index 8e06466a138a5..02774fb70aec8 100644 --- a/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp +++ b/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp @@ -40,60 +40,96 @@ class CgroupV2Controller: public CgroupController { static char* construct_path(char* mount_path, char *cgroup_path); public: - CgroupV2Controller(char * mount_path, char *cgroup_path, bool ro) { - _mount_path = mount_path; - _cgroup_path = os::strdup(cgroup_path); - _path = construct_path(mount_path, cgroup_path); - _read_only = ro; + CgroupV2Controller(char* mount_path, + char *cgroup_path, + bool ro) : _mount_path(os::strdup(mount_path)), + _cgroup_path(os::strdup(cgroup_path)), + _read_only(ro), + _path(construct_path(mount_path, cgroup_path)) { + } + // Shallow copy constructor + CgroupV2Controller(const CgroupV2Controller& o) : + _mount_path(o._mount_path), + _cgroup_path(o._cgroup_path), + _read_only(o._read_only), + _path(o._path) { + } + ~CgroupV2Controller() { + // At least one controller exists with references to the paths } - char *subsystem_path() { return _path; } - bool is_read_only() { return _read_only; } + char *subsystem_path() override { return _path; } + bool is_read_only() override { return _read_only; } +}; + +class CgroupV2CpuController: public CgroupCpuController { + private: + CgroupV2Controller _reader; + CgroupV2Controller* reader() { return &_reader; } + public: + CgroupV2CpuController(const CgroupV2Controller& reader) : _reader(reader) { + } + int cpu_quota() override; + int cpu_period() override; + int cpu_shares() override; + bool is_read_only() override { + return reader()->is_read_only(); + } +}; + +class CgroupV2MemoryController final: public CgroupMemoryController { + private: + CgroupV2Controller _reader; + CgroupV2Controller* reader() { return &_reader; } + public: + CgroupV2MemoryController(const CgroupV2Controller& reader) : _reader(reader) { + } + + jlong read_memory_limit_in_bytes(julong upper_bound) override; + jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swp) override; + jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swp) override; + jlong memory_soft_limit_in_bytes(julong upper_bound) override; + jlong memory_usage_in_bytes() override; + jlong memory_max_usage_in_bytes() override; + jlong rss_usage_in_bytes() override; + jlong cache_usage_in_bytes() override; + void print_version_specific_info(outputStream* st, julong host_mem) override; + bool is_read_only() override { + return reader()->is_read_only(); + } }; class CgroupV2Subsystem: public CgroupSubsystem { private: /* One unified controller */ - CgroupController* _unified = nullptr; + CgroupV2Controller _unified; /* Caching wrappers for cpu/memory metrics */ - CachingCgroupController* _memory = nullptr; - CachingCgroupController* _cpu = nullptr; + CachingCgroupController<CgroupMemoryController>* _memory = nullptr; + CachingCgroupController<CgroupCpuController>* _cpu = nullptr; - jlong mem_swp_limit_val(); - jlong mem_swp_current_val(); + CgroupV2Controller* unified() { return &_unified; } public: - CgroupV2Subsystem(CgroupController * unified) { - _unified = unified; - _memory = new CachingCgroupController(unified); - _cpu = new CachingCgroupController(unified); + CgroupV2Subsystem(CgroupV2MemoryController* memory, + CgroupV2CpuController* cpu, + CgroupV2Controller unified) : + _unified(unified), + _memory(new CachingCgroupController<CgroupMemoryController>(memory)), + _cpu(new CachingCgroupController<CgroupCpuController>(cpu)) { } - jlong read_memory_limit_in_bytes(); - int cpu_quota(); - int cpu_period(); - int cpu_shares(); - jlong memory_and_swap_limit_in_bytes(); - jlong memory_and_swap_usage_in_bytes(); - jlong memory_soft_limit_in_bytes(); - jlong memory_usage_in_bytes(); - jlong memory_max_usage_in_bytes(); - jlong rss_usage_in_bytes(); - jlong cache_usage_in_bytes(); - - char * cpu_cpuset_cpus(); - char * cpu_cpuset_memory_nodes(); - jlong pids_max(); - jlong pids_current(); - - bool is_containerized(); - void print_version_specific_info(outputStream* st); - - const char * container_type() { + char * cpu_cpuset_cpus() override; + char * cpu_cpuset_memory_nodes() override; + jlong pids_max() override; + jlong pids_current() override; + + bool is_containerized() override; + + const char * container_type() override { return "cgroupv2"; } - CachingCgroupController * memory_controller() { return _memory; } - CachingCgroupController * cpu_controller() { return _cpu; } + CachingCgroupController<CgroupMemoryController>* memory_controller() { return _memory; } + CachingCgroupController<CgroupCpuController>* cpu_controller() { return _cpu; } }; #endif // CGROUP_V2_SUBSYSTEM_LINUX_HPP From a3479576c9b3e557cdc04e0984da6350e985dcc9 Mon Sep 17 00:00:00 2001 From: Chris Plummer <cjplummer@openjdk.org> Date: Tue, 2 Jul 2024 18:13:50 +0000 Subject: [PATCH 263/471] 8335291: Problem list all SA core file tests on macosx-aarch64 due to JDK-8318754 Reviewed-by: kevinw, amenkov --- test/hotspot/jtreg/ProblemList.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 2d1311e3ac127..c55790de5ca58 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -129,13 +129,13 @@ serviceability/jvmti/vthread/GetSetLocalTest/GetSetLocalTest.java 8286836 generi serviceability/jvmti/vthread/CarrierThreadEventNotification/CarrierThreadEventNotification.java 8333681 generic-all serviceability/dcmd/gc/RunFinalizationTest.java 8227120 generic-all -serviceability/sa/ClhsdbCDSCore.java 8267433 macosx-x64 -serviceability/sa/ClhsdbFindPC.java#xcomp-core 8267433 macosx-x64 -serviceability/sa/ClhsdbFindPC.java#no-xcomp-core 8267433 macosx-x64 -serviceability/sa/ClhsdbPmap.java#core 8267433 macosx-x64 -serviceability/sa/ClhsdbPstack.java#core 8267433 macosx-x64 -serviceability/sa/TestJmapCore.java 8267433 macosx-x64 -serviceability/sa/TestJmapCoreMetaspace.java 8267433 macosx-x64 +serviceability/sa/ClhsdbCDSCore.java 8267433,8318754 macosx-x64,macosx-aarch64 +serviceability/sa/ClhsdbFindPC.java#xcomp-core 8267433,8318754 macosx-x64,macosx-aarch64 +serviceability/sa/ClhsdbFindPC.java#no-xcomp-core 8267433,8318754 macosx-x64,macosx-aarch64 +serviceability/sa/ClhsdbPmap.java#core 8267433,8318754 macosx-x64,macosx-aarch64 +serviceability/sa/ClhsdbPstack.java#core 8267433,8318754 macosx-x64,macosx-aarch64 +serviceability/sa/TestJmapCore.java 8267433,8318754 macosx-x64,macosx-aarch64 +serviceability/sa/TestJmapCoreMetaspace.java 8267433,8318754 macosx-x64,macosx-aarch64 serviceability/attach/ConcAttachTest.java 8290043 linux-all From 27982c8f5dad0e2d080846f803055c84bac9fddd Mon Sep 17 00:00:00 2001 From: Viktor Klang <vklang@openjdk.org> Date: Tue, 2 Jul 2024 20:27:52 +0000 Subject: [PATCH 264/471] 8327854: Test java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java failed with RuntimeException Reviewed-by: psandoz --- .../openjdk/tests/java/util/stream/WhileOpStatefulTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java index c980e17d05f9c..07348841b1e4a 100644 --- a/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java +++ b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java @@ -256,7 +256,7 @@ private void testWhileMulti(Map<String, Supplier<Stream<Integer>>> sources, EXECUTION_TIME_LIMIT); return s.peek(e -> { if (!isWithinExecutionPeriod.getAsBoolean()) { - throw new RuntimeException(); + throw new RuntimeException("Execution time limit exceeded!"); } }); }); @@ -266,7 +266,7 @@ private void testWhileMulti(Map<String, Supplier<Stream<Integer>>> sources, return s.parallel() .peek(e -> { if (!isWithinExecutionPeriod.getAsBoolean()) { - throw new RuntimeException(); + throw new RuntimeException("Execution time limit exceeded!"); } }); }); From 1ef34c183315b70ddc27c177a2867e30132609f5 Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Tue, 2 Jul 2024 23:15:31 +0000 Subject: [PATCH 265/471] 8335475: ClassBuilder incorrectly calculates max_locals in some cases Reviewed-by: asotona --- .../classfile/impl/StackMapGenerator.java | 2 +- test/jdk/jdk/classfile/StackMapsTest.java | 34 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java b/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java index 0f1f6fb69de26..5b103a21f8a73 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java @@ -1046,7 +1046,7 @@ private void setLocalRawInternal(int index, Type type) { void setLocalsFromArg(String name, MethodTypeDesc methodDesc, boolean isStatic, Type thisKlass) { int localsSize = 0; // Pre-emptively create a locals array that encompass all parameter slots - checkLocal(methodDesc.parameterCount() + (isStatic ? 0 : -1)); + checkLocal(methodDesc.parameterCount() + (isStatic ? -1 : 0)); if (!isStatic) { localsSize++; if (OBJECT_INITIALIZER_NAME.equals(name) && !CD_Object.equals(thisKlass.sym)) { diff --git a/test/jdk/jdk/classfile/StackMapsTest.java b/test/jdk/jdk/classfile/StackMapsTest.java index b3df31291bcf0..f72c237aa8ff3 100644 --- a/test/jdk/jdk/classfile/StackMapsTest.java +++ b/test/jdk/jdk/classfile/StackMapsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * @test * @summary Testing Classfile stack maps generator. - * @bug 8305990 8320222 8320618 + * @bug 8305990 8320222 8320618 8335475 * @build testdata.* * @run junit StackMapsTest */ @@ -36,6 +36,10 @@ import java.nio.file.FileSystems; import java.nio.file.Files; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import static java.lang.constant.ConstantDescs.MTD_void; import static org.junit.jupiter.api.Assertions.*; import static helpers.TestUtil.assertEmpty; import static java.lang.classfile.ClassFile.ACC_STATIC; @@ -238,7 +242,7 @@ void testClassVersions() throws Exception { @Test void testInvalidAALOADStack() { ClassFile.of().build(ClassDesc.of("Test"), clb - -> clb.withMethodBody("test", ConstantDescs.MTD_void, 0, cob + -> clb.withMethodBody("test", MTD_void, 0, cob -> cob.bipush(10) .anewarray(ConstantDescs.CD_Object) .lconst_1() //long on stack caused NPE, see 8320618 @@ -312,4 +316,28 @@ void testInvalidStack() throws Exception { cb.pop(); }))); } + + @ParameterizedTest + @EnumSource(ClassFile.StackMapsOption.class) + void testEmptyCounters(ClassFile.StackMapsOption option) { + var cf = ClassFile.of(option); + var bytes = cf.build(ClassDesc.of("Test"), clb -> clb + .withMethodBody("a", MTD_void, ACC_STATIC, CodeBuilder::return_) + .withMethodBody("b", MTD_void, 0, CodeBuilder::return_) + ); + + var cm = ClassFile.of().parse(bytes); + for (var method : cm.methods()) { + var name = method.methodName(); + var code = method.code().orElseThrow(); + if (name.equalsString("a")) { + assertEquals(0, code.maxLocals()); // static method + assertEquals(0, code.maxStack()); + } else { + assertTrue(name.equalsString("b")); + assertEquals(1, code.maxLocals()); // instance method + assertEquals(0, code.maxStack()); + } + } + } } From f187c92befbe63e23b11eb0401e5095c44c24389 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Wed, 3 Jul 2024 02:19:54 +0000 Subject: [PATCH 266/471] 8335370: Fix -Wzero-as-null-pointer-constant warning in jvmti_common.hpp Reviewed-by: jwaters, amenkov, sspitsyn --- test/lib/jdk/test/lib/jvmti/jvmti_common.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp b/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp index 693baf98d1fa5..f16b9fefb99ec 100644 --- a/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp +++ b/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp @@ -239,7 +239,7 @@ print_method(jvmtiEnv *jvmti, JNIEnv* jni, jmethodID method, jint depth) { check_jvmti_status(jni, err, "print_method: error in JVMTI GetMethodName"); LOG("%2d: %s: %s%s\n", depth, cname, mname, msign); - fflush(0); + fflush(nullptr); deallocate(jvmti, jni, (void*)cname); deallocate(jvmti, jni, (void*)mname); deallocate(jvmti, jni, (void*)msign); From 3a2d426489ead9672512e0c5a6862284a54734ba Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Wed, 3 Jul 2024 02:42:06 +0000 Subject: [PATCH 267/471] 8334726: Remove accidentally exposed individual methods from Class-File API Reviewed-by: asotona --- .../lang/classfile/attribute/ModuleAttribute.java | 12 +++--------- .../lang/classfile/components/CodeRelabeler.java | 10 +--------- .../classfile/constantpool/ConstantPoolBuilder.java | 10 +--------- .../internal/classfile/impl/CodeRelabelerImpl.java | 3 +-- .../classfile/impl/ModuleAttributeBuilderImpl.java | 3 +-- .../internal/classfile/impl/SplitConstantPool.java | 1 - .../classfile/impl/TemporaryConstantPool.java | 5 ----- 7 files changed, 7 insertions(+), 37 deletions(-) diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/ModuleAttribute.java b/src/java.base/share/classes/java/lang/classfile/attribute/ModuleAttribute.java index 721719d285129..9a4c58478addb 100644 --- a/src/java.base/share/classes/java/lang/classfile/attribute/ModuleAttribute.java +++ b/src/java.base/share/classes/java/lang/classfile/attribute/ModuleAttribute.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -153,7 +153,7 @@ static ModuleAttribute of(ModuleDesc moduleName, Consumer<ModuleAttributeBuilder> attrHandler) { var mb = new ModuleAttributeBuilderImpl(moduleName); attrHandler.accept(mb); - return mb.build(); + return mb.build(); } /** @@ -166,7 +166,7 @@ static ModuleAttribute of(ModuleEntry moduleName, Consumer<ModuleAttributeBuilder> attrHandler) { var mb = new ModuleAttributeBuilderImpl(moduleName); attrHandler.accept(mb); - return mb.build(); + return mb.build(); } /** @@ -319,11 +319,5 @@ default ModuleAttributeBuilder opens(PackageDesc pkge, Collection<AccessFlag> op * @return this builder */ ModuleAttributeBuilder provides(ModuleProvideInfo provides); - - /** - * Builds module attribute. - * @return the module attribute - */ - ModuleAttribute build(); } } diff --git a/src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java b/src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java index a0ef4d4de9c5a..ca5ad90389c5c 100644 --- a/src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java +++ b/src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,12 +74,4 @@ static CodeRelabeler of(Map<Label, Label> map) { static CodeRelabeler of(BiFunction<Label, CodeBuilder, Label> mapFunction) { return new CodeRelabelerImpl(mapFunction); } - - /** - * Access method to internal re-labeling function. - * @param label source label - * @param codeBuilder builder to create new labels - * @return target label - */ - Label relabel(Label label, CodeBuilder codeBuilder); } diff --git a/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java b/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java index db388c1c73b62..a43e6f102ed72 100644 --- a/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java +++ b/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -92,14 +92,6 @@ static ConstantPoolBuilder of() { */ boolean canWriteDirect(ConstantPool constantPool); - /** - * Writes associated bootstrap method entries to the specified writer - * - * @param buf the writer - * @return false when no bootstrap method entry has been written - */ - boolean writeBootstrapMethods(BufWriter buf); - /** * {@return A {@link Utf8Entry} describing the provided {@linkplain String}} * If a UTF8 entry in the pool already describes this string, it is returned; diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java index f191cbf3c1f04..e60a906e189fc 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,6 @@ public record CodeRelabelerImpl(BiFunction<Label, CodeBuilder, Label> mapFunction) implements CodeRelabeler { - @Override public Label relabel(Label label, CodeBuilder cob) { return mapFunction.apply(label, cob); } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ModuleAttributeBuilderImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ModuleAttributeBuilderImpl.java index 1aad47cfd86c2..873b32e4ad649 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ModuleAttributeBuilderImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ModuleAttributeBuilderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,6 @@ public ModuleAttributeBuilderImpl(ModuleDesc moduleName) { this(TemporaryConstantPool.INSTANCE.moduleEntry(TemporaryConstantPool.INSTANCE.utf8Entry(moduleName.name()))); } - @Override public ModuleAttribute build() { return new UnboundAttribute.UnboundModuleAttribute(moduleEntry, moduleFlags, moduleVersion, requires, exports, opens, uses, provides); diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java b/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java index b034328fdcc55..6c5a8a266c0d1 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java @@ -135,7 +135,6 @@ public boolean canWriteDirect(ConstantPool other) { return this == other || parent == other; } - @Override public boolean writeBootstrapMethods(BufWriter buf) { if (bsmSize == 0) return false; diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/TemporaryConstantPool.java b/src/java.base/share/classes/jdk/internal/classfile/impl/TemporaryConstantPool.java index 7b15489ace703..e5f7d9cca799f 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/TemporaryConstantPool.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/TemporaryConstantPool.java @@ -190,11 +190,6 @@ public boolean canWriteDirect(ConstantPool constantPool) { return false; } - @Override - public boolean writeBootstrapMethods(BufWriter buf) { - throw new UnsupportedOperationException(); - } - @Override public void writeTo(BufWriter buf) { throw new UnsupportedOperationException(); From 8a664a4c359deefd7237f3672b62d7d8c1ffb453 Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Wed, 3 Jul 2024 02:43:41 +0000 Subject: [PATCH 268/471] 8334734: Remove specialized readXxxEntry methods from ClassReader Reviewed-by: asotona --- .../java/lang/classfile/ClassReader.java | 75 ------------------- .../classfile/impl/AbstractInstruction.java | 8 +- .../classfile/impl/AnnotationReader.java | 13 ++-- .../classfile/impl/BoundAttribute.java | 41 +++++----- .../impl/BoundRecordComponentInfo.java | 6 +- .../internal/classfile/impl/ClassImpl.java | 2 +- .../classfile/impl/ClassReaderImpl.java | 69 +++++------------ .../internal/classfile/impl/FieldImpl.java | 6 +- .../internal/classfile/impl/MethodImpl.java | 6 +- 9 files changed, 58 insertions(+), 168 deletions(-) diff --git a/src/java.base/share/classes/java/lang/classfile/ClassReader.java b/src/java.base/share/classes/java/lang/classfile/ClassReader.java index 7b181180c6fc9..ef4a36729e679 100644 --- a/src/java.base/share/classes/java/lang/classfile/ClassReader.java +++ b/src/java.base/share/classes/java/lang/classfile/ClassReader.java @@ -27,10 +27,6 @@ import java.lang.classfile.constantpool.ClassEntry; import java.lang.classfile.constantpool.ConstantPool; import java.lang.classfile.constantpool.ConstantPoolException; -import java.lang.classfile.constantpool.MethodHandleEntry; -import java.lang.classfile.constantpool.ModuleEntry; -import java.lang.classfile.constantpool.NameAndTypeEntry; -import java.lang.classfile.constantpool.PackageEntry; import java.lang.classfile.constantpool.PoolEntry; import java.lang.classfile.constantpool.Utf8Entry; import jdk.internal.classfile.impl.ClassReaderImpl; @@ -130,77 +126,6 @@ public sealed interface ClassReader extends ConstantPool */ <T extends PoolEntry> T readEntryOrNull(int offset, Class<T> cls); - /** - * {@return the UTF8 entry whose index is given at the specified - * offset within the classfile} - * @param offset the offset of the index within the classfile - * @throws ConstantPoolException if the index is out of range of the - * constant pool size, or zero, or the index does not correspond to - * a UTF8 entry - */ - Utf8Entry readUtf8Entry(int offset); - - /** - * {@return the UTF8 entry whose index is given at the specified - * offset within the classfile, or null if the index at the specified - * offset is zero} - * @param offset the offset of the index within the classfile - * @throws ConstantPoolException if the index is out of range of the - * constant pool size, or the index does not correspond to - * a UTF8 entry - */ - Utf8Entry readUtf8EntryOrNull(int offset); - - /** - * {@return the module entry whose index is given at the specified - * offset within the classfile} - * @param offset the offset of the index within the classfile - * @throws ConstantPoolException if the index is out of range of the - * constant pool size, or zero, or the index does not correspond to - * a module entry - */ - ModuleEntry readModuleEntry(int offset); - - /** - * {@return the package entry whose index is given at the specified - * offset within the classfile} - * @param offset the offset of the index within the classfile - * @throws ConstantPoolException if the index is out of range of the - * constant pool size, or zero, or the index does not correspond to - * a package entry - */ - PackageEntry readPackageEntry(int offset); - - /** - * {@return the class entry whose index is given at the specified - * offset within the classfile} - * @param offset the offset of the index within the classfile - * @throws ConstantPoolException if the index is out of range of the - * constant pool size, or zero, or the index does not correspond to - * a class entry - */ - ClassEntry readClassEntry(int offset); - - /** - * {@return the name-and-type entry whose index is given at the specified - * offset within the classfile} - * @param offset the offset of the index within the classfile - * @throws ConstantPoolException if the index is out of range of the - * constant pool size, or zero, or the index does not correspond to - * a name-and-type entry - */ - NameAndTypeEntry readNameAndTypeEntry(int offset); - - /** - * {@return the method handle entry whose index is given at the specified - * offset within the classfile} - * @param offset the offset of the index within the classfile - * @throws ConstantPoolException if the index is out of range of the - * constant pool size, or zero, or the index does not correspond to - * a method handle entry - */ - MethodHandleEntry readMethodHandleEntry(int offset); - /** * {@return the unsigned byte at the specified offset within the classfile} * @param offset the offset within the classfile diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractInstruction.java b/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractInstruction.java index 0e528cd01fd87..48e1f0990b2ee 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractInstruction.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractInstruction.java @@ -529,7 +529,7 @@ public static final class BoundNewObjectInstruction @Override public ClassEntry className() { if (classEntry == null) - classEntry = code.classReader.readClassEntry(pos + 1); + classEntry = code.classReader.readEntry(pos + 1, ClassEntry.class); return classEntry; } @@ -576,7 +576,7 @@ public BoundNewReferenceArrayInstruction(Opcode op, CodeImpl code, int pos) { @Override public ClassEntry componentType() { - return code.classReader.readClassEntry(pos + 1); + return code.classReader.readEntry(pos + 1, ClassEntry.class); } @Override @@ -607,7 +607,7 @@ public int dimensions() { @Override public ClassEntry arrayType() { - return code.classReader.readClassEntry(pos + 1); + return code.classReader.readEntry(pos + 1, ClassEntry.class); } @Override @@ -636,7 +636,7 @@ public BoundTypeCheckInstruction(Opcode op, CodeImpl code, int pos) { @Override public ClassEntry type() { if (typeEntry == null) - typeEntry = code.classReader.readClassEntry(pos + 1); + typeEntry = code.classReader.readEntry(pos + 1, ClassEntry.class); return typeEntry; } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/AnnotationReader.java b/src/java.base/share/classes/jdk/internal/classfile/impl/AnnotationReader.java index c082878abd4b1..7b5920b3e7853 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/AnnotationReader.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/AnnotationReader.java @@ -66,9 +66,10 @@ public static AnnotationValue readElementValue(ClassReader classReader, int p) { case AEV_LONG -> new AnnotationImpl.OfLongImpl(classReader.readEntry(p, LongEntry.class)); case AEV_SHORT -> new AnnotationImpl.OfShortImpl(classReader.readEntry(p, IntegerEntry.class)); case AEV_BOOLEAN -> new AnnotationImpl.OfBooleanImpl(classReader.readEntry(p, IntegerEntry.class)); - case AEV_STRING -> new AnnotationImpl.OfStringImpl(classReader.readUtf8Entry(p)); - case AEV_ENUM -> new AnnotationImpl.OfEnumImpl(classReader.readUtf8Entry(p), classReader.readUtf8Entry(p + 2)); - case AEV_CLASS -> new AnnotationImpl.OfClassImpl(classReader.readUtf8Entry(p)); + case AEV_STRING -> new AnnotationImpl.OfStringImpl(classReader.readEntry(p, Utf8Entry.class)); + case AEV_ENUM -> new AnnotationImpl.OfEnumImpl(classReader.readEntry(p, Utf8Entry.class), + classReader.readEntry(p + 2, Utf8Entry.class)); + case AEV_CLASS -> new AnnotationImpl.OfClassImpl(classReader.readEntry(p, Utf8Entry.class)); case AEV_ANNOTATION -> new AnnotationImpl.OfAnnotationImpl(readAnnotation(classReader, p)); case AEV_ARRAY -> { int numValues = classReader.readU2(p); @@ -127,7 +128,7 @@ private static int skipElementValue(ClassReader classReader, int p) { } private static Annotation readAnnotation(ClassReader classReader, int p) { - Utf8Entry annotationClass = classReader.entryByIndex(classReader.readU2(p), Utf8Entry.class); + Utf8Entry annotationClass = classReader.readEntry(p, Utf8Entry.class); p += 2; List<AnnotationElement> elems = readAnnotationElementValuePairs(classReader, p); return new AnnotationImpl(annotationClass, elems); @@ -150,7 +151,7 @@ private static List<AnnotationElement> readAnnotationElementValuePairs(ClassRead p += 2; var annotationElements = new Object[numElementValuePairs]; for (int i = 0; i < numElementValuePairs; ++i) { - Utf8Entry elementName = classReader.readUtf8Entry(p); + Utf8Entry elementName = classReader.readEntry(p, Utf8Entry.class); p += 2; AnnotationValue value = readElementValue(classReader, p); annotationElements[i] = new AnnotationImpl.AnnotationElementImpl(elementName, value); @@ -239,7 +240,7 @@ private static TypeAnnotation readTypeAnnotation(ClassReader classReader, int p, }; } // the annotation info for this annotation - Utf8Entry type = classReader.readUtf8Entry(p); + Utf8Entry type = classReader.readEntry(p, Utf8Entry.class); p += 2; return TypeAnnotation.of(targetInfo, List.of(typePath), type, readAnnotationElementValuePairs(classReader, p)); diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java index 45e0c092c3e0a..21a01becec2d4 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java @@ -135,7 +135,7 @@ public static List<Attribute<?>> readAttributes(AttributedElement enclosing, Cla int cfLen = reader.classfileLength(); var apo = ((ClassReaderImpl)reader).context().attributesProcessingOption(); for (int i = 0; i < size; ++i) { - Utf8Entry name = reader.readUtf8Entry(p); + Utf8Entry name = reader.readEntry(p, Utf8Entry.class); int len = reader.readInt(p + 2); p += 6; if (len < 0 || len > cfLen - p) { @@ -347,7 +347,7 @@ public List<MethodParameterInfo> parameters() { int p = payloadStart + 1; int pEnd = p + (cnt * 4); for (int i = 0; p < pEnd; p += 4, i++) { - Utf8Entry name = classReader.readUtf8EntryOrNull(p); + Utf8Entry name = classReader.readEntryOrNull(p, Utf8Entry.class); int accessFlags = classReader.readU2(p + 2); elements[i] = MethodParameterInfo.of(Optional.ofNullable(name), accessFlags); } @@ -367,7 +367,7 @@ public BoundModuleHashesAttribute(ClassReader cf, AttributeMapper<ModuleHashesAt @Override public Utf8Entry algorithm() { - return classReader.readUtf8Entry(payloadStart); + return classReader.readEntry(payloadStart, Utf8Entry.class); } @Override @@ -378,7 +378,7 @@ public List<ModuleHashInfo> hashes() { int p = payloadStart + 4; //System.err.printf("%5d: ModuleHashesAttr alg = %s, cnt = %d%n", pos, algorithm(), cnt); for (int i = 0; i < cnt; ++i) { - ModuleEntry module = classReader.readModuleEntry(p); + ModuleEntry module = classReader.readEntry(p, ModuleEntry.class); int hashLength = classReader.readU2(p + 2); //System.err.printf("%5d: [%d] module = %s, hashLength = %d%n", p, i, module, hashLength); p += 4; @@ -430,7 +430,7 @@ public BoundSignatureAttribute(ClassReader cf, AttributeMapper<SignatureAttribut @Override public Utf8Entry signature() { - return classReader.readUtf8Entry(payloadStart); + return classReader.readEntry(payloadStart, Utf8Entry.class); } } @@ -442,7 +442,7 @@ public BoundSourceFileAttribute(ClassReader cf, AttributeMapper<SourceFileAttrib @Override public Utf8Entry sourceFile() { - return classReader.readUtf8Entry(payloadStart); + return classReader.readEntry(payloadStart, Utf8Entry.class); } } @@ -454,7 +454,7 @@ public BoundModuleMainClassAttribute(ClassReader cf, AttributeMapper<ModuleMainC @Override public ClassEntry mainClass() { - return classReader.readClassEntry(payloadStart); + return classReader.readEntry(payloadStart, ClassEntry.class); } } @@ -466,7 +466,7 @@ public BoundNestHostAttribute(ClassReader cf, AttributeMapper<NestHostAttribute> @Override public ClassEntry nestHost() { - return classReader.readClassEntry(payloadStart); + return classReader.readEntry(payloadStart, ClassEntry.class); } } @@ -498,7 +498,7 @@ public BoundModuleTargetAttribute(ClassReader cf, AttributeMapper<ModuleTargetAt @Override public Utf8Entry targetPlatform() { - return classReader.readUtf8Entry(payloadStart); + return classReader.readEntry(payloadStart, Utf8Entry.class); } } @@ -510,7 +510,7 @@ public BoundCompilationIDAttribute(ClassReader cf, AttributeMapper<CompilationID @Override public Utf8Entry compilationId() { - return classReader.readUtf8Entry(payloadStart); + return classReader.readEntry(payloadStart, Utf8Entry.class); } } @@ -522,7 +522,7 @@ public BoundSourceIDAttribute(ClassReader cf, AttributeMapper<SourceIDAttribute> @Override public Utf8Entry sourceId() { - return classReader.readUtf8Entry(payloadStart); + return classReader.readEntry(payloadStart, Utf8Entry.class); } } @@ -569,7 +569,7 @@ public BoundModuleAttribute(ClassReader cf, AttributeMapper<ModuleAttribute> map @Override public ModuleEntry moduleName() { - return classReader.readModuleEntry(payloadStart); + return classReader.readEntry(payloadStart, ModuleEntry.class); } @Override @@ -579,7 +579,7 @@ public int moduleFlagsMask() { @Override public Optional<Utf8Entry> moduleVersion() { - return Optional.ofNullable(classReader.readUtf8EntryOrNull(payloadStart + 4)); + return Optional.ofNullable(classReader.readEntryOrNull(payloadStart + 4, Utf8Entry.class)); } @Override @@ -630,7 +630,7 @@ private void structure() { ModuleRequireInfo[] elements = new ModuleRequireInfo[cnt]; int end = p + (cnt * 6); for (int i = 0; p < end; p += 6, i++) { - elements[i] = ModuleRequireInfo.of(classReader.readModuleEntry(p), + elements[i] = ModuleRequireInfo.of(classReader.readEntry(p, ModuleEntry.class), classReader.readU2(p + 2), classReader.readEntryOrNull(p + 4, Utf8Entry.class)); } @@ -642,7 +642,7 @@ private void structure() { p += 2; ModuleExportInfo[] elements = new ModuleExportInfo[cnt]; for (int i = 0; i < cnt; i++) { - PackageEntry pe = classReader.readPackageEntry(p); + PackageEntry pe = classReader.readEntry(p, PackageEntry.class); int exportFlags = classReader.readU2(p + 2); p += 4; List<ModuleEntry> exportsTo = readEntryList(p); @@ -657,7 +657,7 @@ private void structure() { p += 2; ModuleOpenInfo[] elements = new ModuleOpenInfo[cnt]; for (int i = 0; i < cnt; i++) { - PackageEntry po = classReader.readPackageEntry(p); + PackageEntry po = classReader.readEntry(p, PackageEntry.class); int opensFlags = classReader.readU2(p + 2); p += 4; List<ModuleEntry> opensTo = readEntryList(p); @@ -675,7 +675,7 @@ private void structure() { ModuleProvideInfo[] elements = new ModuleProvideInfo[cnt]; provides = new ArrayList<>(cnt); for (int i = 0; i < cnt; i++) { - ClassEntry c = classReader.readClassEntry(p); + ClassEntry c = classReader.readEntry(p, ClassEntry.class); p += 2; List<ClassEntry> providesWith = readEntryList(p); p += 2 + providesWith.size() * 2; @@ -743,8 +743,7 @@ public List<BootstrapMethodEntry> bootstrapMethods() { BootstrapMethodEntry[] bs = new BootstrapMethodEntry[size]; int p = payloadStart + 2; for (int i = 0; i < size; ++i) { - final AbstractPoolEntry.MethodHandleEntryImpl handle - = (AbstractPoolEntry.MethodHandleEntryImpl) classReader.readMethodHandleEntry(p); + final var handle = classReader.readEntry(p, AbstractPoolEntry.MethodHandleEntryImpl.class); final List<LoadableConstantEntry> args = readEntryList(p + 2); p += 4 + args.size() * 2; int hash = BootstrapMethodEntryImpl.computeHashCode(handle, args); @@ -771,7 +770,7 @@ public List<InnerClassInfo> classes() { int p = payloadStart + 2; InnerClassInfo[] elements = new InnerClassInfo[cnt]; for (int i = 0; i < cnt; i++) { - ClassEntry innerClass = classReader.readClassEntry(p); + ClassEntry innerClass = classReader.readEntry(p, ClassEntry.class); var outerClass = classReader.readEntryOrNull(p + 2, ClassEntry.class); var innerName = classReader.readEntryOrNull(p + 4, Utf8Entry.class); int flags = classReader.readU2(p + 6); @@ -792,7 +791,7 @@ public BoundEnclosingMethodAttribute(ClassReader cf, AttributeMapper<EnclosingMe @Override public ClassEntry enclosingClass() { - return classReader.readClassEntry(payloadStart); + return classReader.readEntry(payloadStart, ClassEntry.class); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundRecordComponentInfo.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundRecordComponentInfo.java index d2e0dc07378a6..fd96b245af19b 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundRecordComponentInfo.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundRecordComponentInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,12 +46,12 @@ public BoundRecordComponentInfo(ClassReader reader, int startPos) { @Override public Utf8Entry name() { - return reader.readUtf8Entry(startPos); + return reader.readEntry(startPos, Utf8Entry.class); } @Override public Utf8Entry descriptor() { - return reader.readUtf8Entry(startPos + 2); + return reader.readEntry(startPos + 2, Utf8Entry.class); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassImpl.java index 35075cb774a55..907a5cc535152 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassImpl.java @@ -137,7 +137,7 @@ public List<ClassEntry> interfaces() { pos += 2; var arr = new Object[cnt]; for (int i = 0; i < cnt; ++i) { - arr[i] = reader.readClassEntry(pos); + arr[i] = reader.readEntry(pos, ClassEntry.class); pos += 2; } this.interfaces = SharedSecrets.getJavaUtilCollectionAccess().listFromTrustedArray(arr); diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassReaderImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassReaderImpl.java index b8a262ce41c40..25d4e2e68e8e8 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassReaderImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassReaderImpl.java @@ -151,7 +151,7 @@ public int flags() { @Override public ClassEntry thisClassEntry() { if (thisClass == null) { - thisClass = readClassEntry(thisClassPos); + thisClass = readEntry(thisClassPos, ClassEntry.class); } return thisClass; } @@ -395,23 +395,23 @@ public <T extends PoolEntry> T entryByIndex(int index, Class<T> cls) { case TAG_FLOAT -> new AbstractPoolEntry.FloatEntryImpl(this, index, readFloat(q)); case TAG_LONG -> new AbstractPoolEntry.LongEntryImpl(this, index, readLong(q)); case TAG_DOUBLE -> new AbstractPoolEntry.DoubleEntryImpl(this, index, readDouble(q)); - case TAG_CLASS -> new AbstractPoolEntry.ClassEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q)); - case TAG_STRING -> new AbstractPoolEntry.StringEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q)); - case TAG_FIELDREF -> new AbstractPoolEntry.FieldRefEntryImpl(this, index, (AbstractPoolEntry.ClassEntryImpl) readClassEntry(q), - (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2)); - case TAG_METHODREF -> new AbstractPoolEntry.MethodRefEntryImpl(this, index, (AbstractPoolEntry.ClassEntryImpl) readClassEntry(q), - (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2)); - case TAG_INTERFACEMETHODREF -> new AbstractPoolEntry.InterfaceMethodRefEntryImpl(this, index, (AbstractPoolEntry.ClassEntryImpl) readClassEntry(q), - (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2)); - case TAG_NAMEANDTYPE -> new AbstractPoolEntry.NameAndTypeEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q), - (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q + 2)); + case TAG_CLASS -> new AbstractPoolEntry.ClassEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class)); + case TAG_STRING -> new AbstractPoolEntry.StringEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class)); + case TAG_FIELDREF -> new AbstractPoolEntry.FieldRefEntryImpl(this, index, readEntry(q, AbstractPoolEntry.ClassEntryImpl.class), + readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class)); + case TAG_METHODREF -> new AbstractPoolEntry.MethodRefEntryImpl(this, index, readEntry(q, AbstractPoolEntry.ClassEntryImpl.class), + readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class)); + case TAG_INTERFACEMETHODREF -> new AbstractPoolEntry.InterfaceMethodRefEntryImpl(this, index, readEntry(q, AbstractPoolEntry.ClassEntryImpl.class), + readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class)); + case TAG_NAMEANDTYPE -> new AbstractPoolEntry.NameAndTypeEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class), + readEntry(q + 2, AbstractPoolEntry.Utf8EntryImpl.class)); case TAG_METHODHANDLE -> new AbstractPoolEntry.MethodHandleEntryImpl(this, index, readU1(q), readEntry(q + 1, AbstractPoolEntry.AbstractMemberRefEntry.class)); - case TAG_METHODTYPE -> new AbstractPoolEntry.MethodTypeEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q)); - case TAG_CONSTANTDYNAMIC -> new AbstractPoolEntry.ConstantDynamicEntryImpl(this, index, readU2(q), (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2)); - case TAG_INVOKEDYNAMIC -> new AbstractPoolEntry.InvokeDynamicEntryImpl(this, index, readU2(q), (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2)); - case TAG_MODULE -> new AbstractPoolEntry.ModuleEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q)); - case TAG_PACKAGE -> new AbstractPoolEntry.PackageEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q)); + case TAG_METHODTYPE -> new AbstractPoolEntry.MethodTypeEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class)); + case TAG_CONSTANTDYNAMIC -> new AbstractPoolEntry.ConstantDynamicEntryImpl(this, index, readU2(q), readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class)); + case TAG_INVOKEDYNAMIC -> new AbstractPoolEntry.InvokeDynamicEntryImpl(this, index, readU2(q), readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class)); + case TAG_MODULE -> new AbstractPoolEntry.ModuleEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class)); + case TAG_PACKAGE -> new AbstractPoolEntry.PackageEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class)); default -> throw new ConstantPoolException( "Bad tag (" + tag + ") at index (" + index + ") position (" + offset + ")"); }; @@ -428,7 +428,7 @@ public int skipAttributeHolder(int offset) { int len = readInt(p + 2); p += 6; if (len < 0 || len > classfileLength - p) { - throw new IllegalArgumentException("attribute " + readUtf8Entry(p - 6).stringValue() + " too big to handle"); + throw new IllegalArgumentException("attribute " + readEntry(p - 6, Utf8Entry.class).stringValue() + " too big to handle"); } p += len; } @@ -465,41 +465,6 @@ public <T extends PoolEntry> T readEntryOrNull(int offset, Class<T> cls) { return entryByIndex(index, cls); } - @Override - public Utf8Entry readUtf8Entry(int pos) { - return readEntry(pos, Utf8Entry.class); - } - - @Override - public Utf8Entry readUtf8EntryOrNull(int pos) { - return readEntryOrNull(pos, Utf8Entry.class); - } - - @Override - public ModuleEntry readModuleEntry(int pos) { - return readEntry(pos, ModuleEntry.class); - } - - @Override - public PackageEntry readPackageEntry(int pos) { - return readEntry(pos, PackageEntry.class); - } - - @Override - public ClassEntry readClassEntry(int pos) { - return readEntry(pos, ClassEntry.class); - } - - @Override - public NameAndTypeEntry readNameAndTypeEntry(int pos) { - return readEntry(pos, NameAndTypeEntry.class); - } - - @Override - public MethodHandleEntry readMethodHandleEntry(int pos) { - return readEntry(pos, MethodHandleEntry.class); - } - @Override public boolean compare(BufWriter bufWriter, int bufWriterOffset, diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/FieldImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/FieldImpl.java index 6645ddb9396ab..fb072ae563868 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/FieldImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/FieldImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,12 +61,12 @@ public Optional<ClassModel> parent() { @Override public Utf8Entry fieldName() { - return reader.readUtf8Entry(startPos + 2); + return reader.readEntry(startPos + 2, Utf8Entry.class); } @Override public Utf8Entry fieldType() { - return reader.readUtf8Entry(startPos + 4); + return reader.readEntry(startPos + 4, Utf8Entry.class); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java index 9a96e586c5501..3bc811634ee18 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,12 +64,12 @@ public Optional<ClassModel> parent() { @Override public Utf8Entry methodName() { - return reader.readUtf8Entry(startPos + 2); + return reader.readEntry(startPos + 2, Utf8Entry.class); } @Override public Utf8Entry methodType() { - return reader.readUtf8Entry(startPos + 4); + return reader.readEntry(startPos + 4, Utf8Entry.class); } @Override From f7af4504a804711d93208b763b3e41eafcf61735 Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Wed, 3 Jul 2024 02:49:43 +0000 Subject: [PATCH 269/471] 8335110: Fix instruction name and API spec inconsistencies in CodeBuilder Reviewed-by: asotona --- .../java/lang/classfile/CodeBuilder.java | 114 +++++++++++++++++- .../classfile/attribute/CodeAttribute.java | 6 +- .../java/lang/runtime/SwitchBootstraps.java | 2 +- .../internal/classfile/impl/LabelImpl.java | 2 +- .../jfr/internal/EventInstrumentation.java | 8 +- .../helpers/RebuildingTransformation.java | 4 +- 6 files changed, 120 insertions(+), 16 deletions(-) diff --git a/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java b/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java index e954be079fa54..cffa560bef305 100644 --- a/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java +++ b/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -97,6 +97,27 @@ * #with(ClassFileElement)} or concretely by calling the various {@code withXxx} * methods. * + * <h2>Instruction Factories</h2> + * {@code CodeBuilder} provides convenience methods to create instructions (See + * JVMS {@jvms 6.5} Instructions) by their mnemonic, taking necessary operands. + * <ul> + * <li>Instructions that encode their operands in their opcode, such as {@code + * aload_<n>}, share their factories with their generic version like {@link + * #aload aload}. Note that some constant instructions, such as {@link #iconst_1 + * iconst_1}, do not have generic versions, and thus have their own factories. + * <li>Instructions that accept wide operands, such as {@code ldc2_w} or {@code + * wide}, share their factories with their regular version like {@link #ldc}. Note + * that {@link #goto_w goto_w} has its own factory to avoid {@linkplain + * ClassFile.ShortJumpsOption short jumps}. + * <li>The {@code goto}, {@code instanceof}, {@code new}, and {@code return} + * instructions' factories are named {@link #goto_ goto_}, {@link #instanceOf + * instanceOf}, {@link #new_ new_}, and {@link #return_() return_} respectively, + * due to clashes with keywords in the Java programming language. + * <li>Factories are not provided for instructions {@code jsr}, {@code jsr_w}, + * {@code ret}, and {@code wide ret}, which cannot appear in class files with + * major version {@value ClassFile#JAVA_7_VERSION} or higher. (JVMS {@jvms 4.9.1}) + * </ul> + * * @see CodeTransform * * @since 22 @@ -130,7 +151,7 @@ public sealed interface CodeBuilder /** * {@return the local variable slot associated with the receiver}. * - * @throws IllegalStateException if this is not a static method + * @throws IllegalStateException if this is a static method */ int receiverSlot(); @@ -699,7 +720,7 @@ default CodeBuilder lineNumber(int line) { * @return this builder */ default CodeBuilder exceptionCatch(Label start, Label end, Label handler, ClassEntry catchType) { - return with(ExceptionCatch.of(handler, start, end, Optional.of(catchType))); + return with(ExceptionCatch.of(handler, start, end, Optional.ofNullable(catchType))); } /** @@ -837,6 +858,10 @@ default CodeBuilder aastore() { /** * Generate an instruction to load a reference from a local variable + * + * <p>This may also generate {@code aload_<N>} and + * {@code wide aload} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -881,6 +906,10 @@ default CodeBuilder arraylength() { /** * Generate an instruction to store a reference into a local variable + * + * <p>This may also generate {@code astore_<N>} and + * {@code wide astore} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -1046,6 +1075,10 @@ default CodeBuilder ddiv() { /** * Generate an instruction to load a double from a local variable + * + * <p>This may also generate {@code dload_<N>} and + * {@code wide dload} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -1087,6 +1120,10 @@ default CodeBuilder dreturn() { /** * Generate an instruction to store a double into a local variable + * + * <p>This may also generate {@code dstore_<N>} and + * {@code wide dstore} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -1250,6 +1287,10 @@ default CodeBuilder fdiv() { /** * Generate an instruction to load a float from a local variable + * + * <p>This may also generate {@code fload_<N>} and + * {@code wide fload} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -1291,6 +1332,10 @@ default CodeBuilder freturn() { /** * Generate an instruction to store a float into a local variable + * + * <p>This may also generate {@code fstore_<N>} and + * {@code wide fstore} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -1350,6 +1395,15 @@ default CodeBuilder getstatic(ClassDesc owner, String name, ClassDesc type) { /** * Generate an instruction to branch always + * + * <p>This may also generate {@code goto_w} instructions if the {@link + * ClassFile.ShortJumpsOption#FIX_SHORT_JUMPS FIX_SHORT_JUMPS} option + * is set. + * + * @apiNote The instruction's name is {@code goto}, which coincides with a + * reserved keyword of the Java programming language, thus this method is + * named with an extra {@code _} suffix instead. + * * @param target the branch target * @return this builder */ @@ -1587,7 +1641,7 @@ default CodeBuilder if_icmpne(Label target) { * @param target the branch target * @return this builder */ - default CodeBuilder if_nonnull(Label target) { + default CodeBuilder ifnonnull(Label target) { return branch(Opcode.IFNONNULL, target); } @@ -1596,7 +1650,7 @@ default CodeBuilder if_nonnull(Label target) { * @param target the branch target * @return this builder */ - default CodeBuilder if_null(Label target) { + default CodeBuilder ifnull(Label target) { return branch(Opcode.IFNULL, target); } @@ -1666,6 +1720,10 @@ default CodeBuilder iinc(int slot, int val) { /** * Generate an instruction to load an int from a local variable + * + * <p>This may also generate {@code iload_<N>} and + * {@code wide iload} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -1691,6 +1749,11 @@ default CodeBuilder ineg() { /** * Generate an instruction to determine if an object is of the given type + * + * @apiNote The instruction's name is {@code instanceof}, which coincides with a + * reserved keyword of the Java programming language, thus this method is + * named with camel case instead. + * * @param target the target type * @return this builder * @since 23 @@ -1701,6 +1764,11 @@ default CodeBuilder instanceOf(ClassEntry target) { /** * Generate an instruction to determine if an object is of the given type + * + * @apiNote The instruction's name is {@code instanceof}, which coincides with a + * reserved keyword of the Java programming language, thus this method is + * named with camel case instead. + * * @param target the target type * @return this builder * @throws IllegalArgumentException if {@code target} represents a primitive type @@ -1910,6 +1978,10 @@ default CodeBuilder ishr() { /** * Generate an instruction to store an int into a local variable + * + * <p>This may also generate {@code istore_<N>} and + * {@code wide istore} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -2033,6 +2105,12 @@ default CodeBuilder lconst_1() { /** * Generate an instruction pushing an item from the run-time constant pool onto the operand stack + * + * <p>This may also generate {@code ldc_w} and {@code ldc2_w} instructions. + * + * @apiNote {@link #loadConstant(ConstantDesc) loadConstant} generates more optimal instructions + * and should be used for general constants if an {@code ldc} instruction is not strictly required. + * * @param value the constant value * @return this builder */ @@ -2042,6 +2120,9 @@ default CodeBuilder ldc(ConstantDesc value) { /** * Generate an instruction pushing an item from the run-time constant pool onto the operand stack + * + * <p>This may also generate {@code ldc_w} and {@code ldc2_w} instructions. + * * @param entry the constant value * @return this builder */ @@ -2062,6 +2143,10 @@ default CodeBuilder ldiv() { /** * Generate an instruction to load a long from a local variable + * + * <p>This may also generate {@code lload_<N>} and + * {@code wide lload} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -2127,6 +2212,10 @@ default CodeBuilder lshr() { /** * Generate an instruction to store a long into a local variable + * + * <p>This may also generate {@code lstore_<N>} and + * {@code wide lstore} instructions. + * * @param slot the local variable slot * @return this builder */ @@ -2197,6 +2286,11 @@ default CodeBuilder multianewarray(ClassDesc array, int dims) { /** * Generate an instruction to create a new object + * + * @apiNote The instruction's name is {@code new}, which coincides with a + * reserved keyword of the Java programming language, thus this method is + * named with an extra {@code _} suffix instead. + * * @param clazz the new class type * @return this builder */ @@ -2206,6 +2300,11 @@ default CodeBuilder new_(ClassEntry clazz) { /** * Generate an instruction to create a new object + * + * @apiNote The instruction's name is {@code new}, which coincides with a + * reserved keyword of the Java programming language, thus this method is + * named with an extra {@code _} suffix instead. + * * @param clazz the new class type * @return this builder * @throws IllegalArgumentException if {@code clazz} represents a primitive type @@ -2283,6 +2382,11 @@ default CodeBuilder putstatic(ClassDesc owner, String name, ClassDesc type) { /** * Generate an instruction to return void from the method + * + * @apiNote The instruction's name is {@code return}, which coincides with a + * reserved keyword of the Java programming language, thus this method is + * named with an extra {@code _} suffix instead. + * * @return this builder */ default CodeBuilder return_() { diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java b/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java index 1a57cf4f37f95..02cbcee810f64 100644 --- a/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java +++ b/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,9 +58,9 @@ public sealed interface CodeAttribute extends Attribute<CodeAttribute>, CodeMode byte[] codeArray(); /** - * {@return the position of the {@code Label} in the {@code codeArray} - * or -1 if the {@code Label} does not point to the {@code codeArray}} + * {@return the position of the {@code label} in the {@link #codeArray codeArray}} * @param label a marker for a position within this {@code CodeAttribute} + * @throws IllegalArgumentException if the {@code label} is not from this attribute */ int labelToBci(Label label); } diff --git a/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java b/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java index 24ee48c1f4735..ccb33a0e4dbd1 100644 --- a/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java +++ b/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java @@ -422,7 +422,7 @@ private static Consumer<CodeBuilder> generateTypeSwitchSkeleton(Class<?> selecto cb.pop(); cb.aload(SELECTOR_OBJ); Label nonNullLabel = cb.newLabel(); - cb.if_nonnull(nonNullLabel); + cb.ifnonnull(nonNullLabel); cb.iconst_m1(); cb.ireturn(); cb.labelBinding(nonNullLabel); diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/LabelImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/LabelImpl.java index b316c5a6dd176..2aaf5f033c0b6 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/LabelImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/LabelImpl.java @@ -51,7 +51,7 @@ public final class LabelImpl private final LabelContext labelContext; private int bci; - public LabelImpl(LabelContext labelContext, int bci) { + public LabelImpl(LabelContext labelContext, int bci) { this.labelContext = Objects.requireNonNull(labelContext); this.bci = bci; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java index cf7e162a42e43..d8f5e689ca18c 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java @@ -461,7 +461,7 @@ private void makeInstrumented() { catchAllHandler.dup(); // stack: [ex] [EW] [EW] Label rethrow = catchAllHandler.newLabel(); - catchAllHandler.if_null(rethrow); + catchAllHandler.ifnull(rethrow); // stack: [ex] [EW] catchAllHandler.dup(); // stack: [ex] [EW] [EW] @@ -486,7 +486,7 @@ private void makeInstrumented() { Label fail = codeBuilder.newLabel(); if (guardEventConfiguration) { getEventConfiguration(codeBuilder); - codeBuilder.if_null(fail); + codeBuilder.ifnull(fail); } // if (!eventConfiguration.shouldCommit(duration) goto fail; getEventConfiguration(codeBuilder); @@ -525,7 +525,7 @@ private void makeInstrumented() { if (guardEventConfiguration) { // if (eventConfiguration == null) goto fail; getEventConfiguration(codeBuilder); - codeBuilder.if_null(fail); + codeBuilder.ifnull(fail); } // return eventConfiguration.shouldCommit(duration); getEventConfiguration(codeBuilder); @@ -738,7 +738,7 @@ private void updateEnabledMethod(MethodDesc method) { Label nullLabel = codeBuilder.newLabel(); if (guardEventConfiguration) { getEventConfiguration(codeBuilder); - codeBuilder.if_null(nullLabel); + codeBuilder.ifnull(nullLabel); } getEventConfiguration(codeBuilder); invokevirtual(codeBuilder, TYPE_EVENT_CONFIGURATION, METHOD_IS_ENABLED); diff --git a/test/jdk/jdk/classfile/helpers/RebuildingTransformation.java b/test/jdk/jdk/classfile/helpers/RebuildingTransformation.java index 0c9b771c3ef62..7905a79fd40bf 100644 --- a/test/jdk/jdk/classfile/helpers/RebuildingTransformation.java +++ b/test/jdk/jdk/classfile/helpers/RebuildingTransformation.java @@ -257,8 +257,8 @@ public void accept(CodeBuilder cob, CodeElement coe) { case IF_ICMPLE -> cob.if_icmple(target); case IF_ICMPLT -> cob.if_icmplt(target); case IF_ICMPNE -> cob.if_icmpne(target); - case IFNONNULL -> cob.if_nonnull(target); - case IFNULL -> cob.if_null(target); + case IFNONNULL -> cob.ifnonnull(target); + case IFNULL -> cob.ifnull(target); case IFEQ -> cob.ifeq(target); case IFGE -> cob.ifge(target); case IFGT -> cob.ifgt(target); From f9b4ea13e693da268c9aee27dee49f9c7f798bb1 Mon Sep 17 00:00:00 2001 From: Xiaolong Peng <xpeng@openjdk.org> Date: Wed, 3 Jul 2024 02:56:17 +0000 Subject: [PATCH 270/471] 8334220: Optimize Klass layout after JDK-8180450 Reviewed-by: coleenp, stuefe, dholmes --- src/hotspot/share/oops/klass.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hotspot/share/oops/klass.hpp b/src/hotspot/share/oops/klass.hpp index 2923235e2f3d2..6ec6ac889be71 100644 --- a/src/hotspot/share/oops/klass.hpp +++ b/src/hotspot/share/oops/klass.hpp @@ -159,11 +159,6 @@ class Klass : public Metadata { // Provide access the corresponding instance java.lang.ClassLoader. ClassLoaderData* _class_loader_data; - // Bitmap and hash code used by hashed secondary supers. - uintx _bitmap; - uint8_t _hash_slot; - - static uint8_t compute_hash_slot(Symbol* s); int _vtable_len; // vtable length. This field may be read very often when we // have lots of itable dispatches (e.g., lambdas and streams). @@ -173,6 +168,10 @@ class Klass : public Metadata { JFR_ONLY(DEFINE_TRACE_ID_FIELD;) + // Bitmap and hash code used by hashed secondary supers. + uintx _bitmap; + uint8_t _hash_slot; + private: // This is an index into FileMapHeader::_shared_path_table[], to // associate this class with the JAR file where it's loaded from during @@ -392,6 +391,7 @@ class Klass : public Metadata { void set_next_sibling(Klass* s); private: + static uint8_t compute_hash_slot(Symbol* s); static void hash_insert(Klass* klass, GrowableArray<Klass*>* secondaries, uintx& bitmap); static uintx hash_secondary_supers(Array<Klass*>* secondaries, bool rewrite); From fac74b118f5fda4ec297e46238d34ce5b9be1e21 Mon Sep 17 00:00:00 2001 From: Xiaolong Peng <xpeng@openjdk.org> Date: Wed, 3 Jul 2024 03:01:06 +0000 Subject: [PATCH 271/471] 8334229: Optimize InterpreterOopMap layout Reviewed-by: coleenp, dholmes --- src/hotspot/share/interpreter/oopMapCache.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hotspot/share/interpreter/oopMapCache.hpp b/src/hotspot/share/interpreter/oopMapCache.hpp index a3f5c395f589a..7037b2c7d1fcf 100644 --- a/src/hotspot/share/interpreter/oopMapCache.hpp +++ b/src/hotspot/share/interpreter/oopMapCache.hpp @@ -83,21 +83,21 @@ class InterpreterOopMap: ResourceObj { private: Method* _method; // the method for which the mask is valid - unsigned short _bci; // the bci for which the mask is valid int _mask_size; // the mask size in bits (USHRT_MAX if invalid) int _expression_stack_size; // the size of the expression stack in slots + unsigned short _bci; // the bci for which the mask is valid protected: +#ifdef ASSERT + bool _resource_allocate_bit_mask; +#endif + int _num_oops; intptr_t _bit_mask[N]; // the bit mask if // mask_size <= small_mask_limit, // ptr to bit mask otherwise // "protected" so that sub classes can // access it without using trickery in // method bit_mask(). - int _num_oops; -#ifdef ASSERT - bool _resource_allocate_bit_mask; -#endif // access methods Method* method() const { return _method; } From d51141e5fc84f9f933e78d0eb25af86e41798ad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eirik=20Bj=C3=B8rsn=C3=B8s?= <eirbjo@openjdk.org> Date: Wed, 3 Jul 2024 04:36:32 +0000 Subject: [PATCH 272/471] 8321274: Rename ZipEntry.extraAttributes to ZipEntry.externalFileAttributes Reviewed-by: lancea, jpai --- .../share/classes/java/util/zip/ZipEntry.java | 4 +-- .../share/classes/java/util/zip/ZipFile.java | 10 +++---- .../java/util/zip/ZipOutputStream.java | 4 +-- .../access/JavaUtilZipFileAccess.java | 6 ++--- .../jdk/security/jarsigner/JarSigner.java | 16 +++++------- .../sun/security/tools/jarsigner/Main.java | 14 +++++----- .../security/tools/jarsigner/Resources.java | 4 +-- .../tools/jarsigner/Resources_de.java | 4 +-- .../tools/jarsigner/Resources_ja.java | 4 +-- .../tools/jarsigner/Resources_zh_CN.java | 4 +-- .../classes/jdk/nio/zipfs/ZipFileSystem.java | 26 +++++++++---------- .../security/tools/jarsigner/SymLinkTest.java | 12 ++++----- 12 files changed, 52 insertions(+), 56 deletions(-) diff --git a/src/java.base/share/classes/java/util/zip/ZipEntry.java b/src/java.base/share/classes/java/util/zip/ZipEntry.java index 85bd6155fa817..d97760d950ab3 100644 --- a/src/java.base/share/classes/java/util/zip/ZipEntry.java +++ b/src/java.base/share/classes/java/util/zip/ZipEntry.java @@ -59,7 +59,7 @@ public class ZipEntry implements ZipConstants, Cloneable { int flag = 0; // general purpose flag byte[] extra; // optional extra field data for entry String comment; // optional comment string for entry - int extraAttributes = -1; // e.g. POSIX permissions, sym links. + int externalFileAttributes = -1; // File type, setuid, setgid, sticky, POSIX permissions /** * Compression method for uncompressed entries. */ @@ -134,7 +134,7 @@ public ZipEntry(ZipEntry e) { flag = e.flag; extra = e.extra; comment = e.comment; - extraAttributes = e.extraAttributes; + externalFileAttributes = e.externalFileAttributes; } /** diff --git a/src/java.base/share/classes/java/util/zip/ZipFile.java b/src/java.base/share/classes/java/util/zip/ZipFile.java index 4f4c410a83e9d..da8ab730873f2 100644 --- a/src/java.base/share/classes/java/util/zip/ZipFile.java +++ b/src/java.base/share/classes/java/util/zip/ZipFile.java @@ -697,7 +697,7 @@ private ZipEntry getZipEntry(String name, int pos) { e.method = CENHOW(cen, pos); if (CENVEM_FA(cen, pos) == FILE_ATTRIBUTES_UNIX) { // read all bits in this field, including sym link attributes - e.extraAttributes = CENATX_PERMS(cen, pos) & 0xFFFF; + e.externalFileAttributes = CENATX_PERMS(cen, pos) & 0xFFFF; } if (elen != 0) { @@ -1165,12 +1165,12 @@ public Stream<String> entryNameStream(ZipFile zip) { return zip.entryNameStream(); } @Override - public int getExtraAttributes(ZipEntry ze) { - return ze.extraAttributes; + public int getExternalFileAttributes(ZipEntry ze) { + return ze.externalFileAttributes; } @Override - public void setExtraAttributes(ZipEntry ze, int extraAttrs) { - ze.extraAttributes = extraAttrs; + public void setExternalFileAttributes(ZipEntry ze, int externalFileAttributes) { + ze.externalFileAttributes = externalFileAttributes; } } diff --git a/src/java.base/share/classes/java/util/zip/ZipOutputStream.java b/src/java.base/share/classes/java/util/zip/ZipOutputStream.java index e1d403558600e..231e6629a54ae 100644 --- a/src/java.base/share/classes/java/util/zip/ZipOutputStream.java +++ b/src/java.base/share/classes/java/util/zip/ZipOutputStream.java @@ -541,7 +541,7 @@ private void writeEXT(ZipEntry e) throws IOException { * to a version value. */ private int versionMadeBy(ZipEntry e, int version) { - return (e.extraAttributes < 0) ? version : + return (e.externalFileAttributes < 0) ? version : VERSION_MADE_BY_BASE_UNIX | (version & 0xff); } @@ -637,7 +637,7 @@ private void writeCEN(XEntry xentry) throws IOException { writeShort(0); // starting disk number writeShort(0); // internal file attributes (unused) // extra file attributes, used for storing posix permissions etc. - writeInt(e.extraAttributes > 0 ? e.extraAttributes << 16 : 0); + writeInt(e.externalFileAttributes > 0 ? e.externalFileAttributes << 16 : 0); writeInt(offset); // relative offset of local header writeBytes(nameBytes, 0, nameBytes.length); diff --git a/src/java.base/share/classes/jdk/internal/access/JavaUtilZipFileAccess.java b/src/java.base/share/classes/jdk/internal/access/JavaUtilZipFileAccess.java index 3728a6c70d410..2c9d904005d80 100644 --- a/src/java.base/share/classes/jdk/internal/access/JavaUtilZipFileAccess.java +++ b/src/java.base/share/classes/jdk/internal/access/JavaUtilZipFileAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,7 @@ public interface JavaUtilZipFileAccess { public Enumeration<JarEntry> entries(ZipFile zip); public Stream<JarEntry> stream(ZipFile zip); public Stream<String> entryNameStream(ZipFile zip); - public void setExtraAttributes(ZipEntry ze, int extraAttrs); - public int getExtraAttributes(ZipEntry ze); + public void setExternalFileAttributes(ZipEntry ze, int externalFileAttributes); + public int getExternalFileAttributes(ZipEntry ze); } diff --git a/src/jdk.jartool/share/classes/jdk/security/jarsigner/JarSigner.java b/src/jdk.jartool/share/classes/jdk/security/jarsigner/JarSigner.java index 5dbaf6041ee25..3ff0f2663a223 100644 --- a/src/jdk.jartool/share/classes/jdk/security/jarsigner/JarSigner.java +++ b/src/jdk.jartool/share/classes/jdk/security/jarsigner/JarSigner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,6 @@ import sun.security.pkcs.PKCS9Attribute; import sun.security.pkcs.PKCS9Attributes; import sun.security.timestamp.HttpTimestamper; -import sun.security.tools.PathList; import sun.security.util.Event; import sun.security.util.ManifestDigester; import sun.security.util.SignatureFileVerifier; @@ -39,11 +38,8 @@ import sun.security.x509.AlgorithmId; import java.io.*; -import java.lang.reflect.InvocationTargetException; import java.net.SocketTimeoutException; import java.net.URI; -import java.net.URL; -import java.net.URLClassLoader; import java.security.*; import java.security.cert.CertPath; import java.security.cert.Certificate; @@ -492,7 +488,7 @@ public JarSigner build() { private final String tSADigestAlg; private final boolean sectionsonly; // do not "sign" the whole manifest private final boolean internalsf; // include the .SF inside the PKCS7 block - private boolean extraAttrsDetected; + private boolean externalFileAttributesDetected; private JarSigner(JarSigner.Builder builder) { @@ -936,12 +932,12 @@ private void writeEntry(ZipFile zf, ZipOutputStream os, ZipEntry ze) ze2.setTime(ze.getTime()); ze2.setComment(ze.getComment()); ze2.setExtra(ze.getExtra()); - int extraAttrs = JUZFA.getExtraAttributes(ze); - if (!extraAttrsDetected && extraAttrs != -1) { - extraAttrsDetected = true; + int externalFileAttributes = JUZFA.getExternalFileAttributes(ze); + if (!externalFileAttributesDetected && externalFileAttributes != -1) { + externalFileAttributesDetected = true; Event.report(Event.ReporterCategory.ZIPFILEATTRS, "detected"); } - JUZFA.setExtraAttributes(ze2, extraAttrs); + JUZFA.setExternalFileAttributes(ze2, externalFileAttributes); if (ze.getMethod() == ZipEntry.STORED) { ze2.setSize(ze.getSize()); ze2.setCrc(ze.getCrc()); diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java index e011145632dfa..78a03a4332d47 100644 --- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java +++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -118,7 +118,7 @@ public class Main { private static final Set<CryptoPrimitive> SIG_PRIMITIVE_SET = Collections .unmodifiableSet(EnumSet.of(CryptoPrimitive.SIGNATURE)); - private static boolean extraAttrsDetected; + private static boolean externalFileAttributesDetected; static final String VERSION = "1.0"; @@ -823,8 +823,8 @@ void verifyJar(String jarName) JarEntry je = e.nextElement(); String name = je.getName(); - if (!extraAttrsDetected && JUZFA.getExtraAttributes(je) != -1) { - extraAttrsDetected = true; + if (!externalFileAttributesDetected && JUZFA.getExternalFileAttributes(je) != -1) { + externalFileAttributesDetected = true; } hasSignature |= signatureRelated(name) && SignatureFileVerifier.isBlockOrSF(name); @@ -1311,8 +1311,8 @@ private void displayMessagesAndResult(boolean isSigning) { } } - if (extraAttrsDetected) { - warnings.add(rb.getString("extra.attributes.detected")); + if (externalFileAttributesDetected) { + warnings.add(rb.getString("external.file.attributes.detected")); } if ((strict) && (!errors.isEmpty())) { @@ -1946,7 +1946,7 @@ void signJar(String jarName, String alias) try { Event.setReportListener(Event.ReporterCategory.ZIPFILEATTRS, - (t, o) -> extraAttrsDetected = true); + (t, o) -> externalFileAttributesDetected = true); builder.build().sign(zipFile, fos); } catch (JarSignerException e) { failedCause = e.getCause(); diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java index d982f618600f3..6a86b72ad1b10 100644 --- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java +++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -178,7 +178,7 @@ public class Resources extends java.util.ListResourceBundle { {"key.bit.disabled", "%d-bit key (disabled)"}, {"key.bit.eccurve.disabled", "%1$d-bit %2$s key (disabled)"}, {"unknown.size", "unknown size"}, - {"extra.attributes.detected", "POSIX file permission and/or symlink attributes detected. These attributes are ignored when signing and are not protected by the signature."}, + {"external.file.attributes.detected", "POSIX file permission and/or symlink attributes detected. These attributes are ignored when signing and are not protected by the signature."}, {"jarsigner.", "jarsigner: "}, {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.", diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_de.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_de.java index 06c8a901cd264..b11c491be1492 100644 --- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_de.java +++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_de.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -178,7 +178,7 @@ public class Resources_de extends java.util.ListResourceBundle { {"key.bit.disabled", "%d-Bit-Schl\u00FCssel (deaktiviert)"}, {"key.bit.eccurve.disabled", "%1$d-Bit-%2$s-Schl\u00FCssel (deaktiviert)"}, {"unknown.size", "unbekannte Gr\u00F6\u00DFe"}, - {"extra.attributes.detected", "POSIX-Dateiberechtigung und/oder Symlink-Attribute erkannt. Diese Attribute werden bei der Signatur ignoriert und sind nicht durch die Signatur gesch\u00FCtzt."}, + {"external.file.attributes.detected", "POSIX-Dateiberechtigung und/oder Symlink-Attribute erkannt. Diese Attribute werden bei der Signatur ignoriert und sind nicht durch die Signatur gesch\u00FCtzt."}, {"jarsigner.", "jarsigner: "}, {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.", diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_ja.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_ja.java index 1d8e7c54a3c29..3754d864ce107 100644 --- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_ja.java +++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_ja.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -178,7 +178,7 @@ public class Resources_ja extends java.util.ListResourceBundle { {"key.bit.disabled", "%d\u30D3\u30C3\u30C8\u30FB\u30AD\u30FC (\u7121\u52B9)"}, {"key.bit.eccurve.disabled", "%1$d\u30D3\u30C3\u30C8%2$s\u30AD\u30FC(\u7121\u52B9)"}, {"unknown.size", "\u4E0D\u660E\u30B5\u30A4\u30BA"}, - {"extra.attributes.detected", "POSIX\u30D5\u30A1\u30A4\u30EB\u6A29\u9650\u307E\u305F\u306Fsymlink(\u3042\u308B\u3044\u306F\u305D\u306E\u4E21\u65B9)\u306E\u5C5E\u6027\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002\u7F72\u540D\u4E2D\u306F\u3053\u308C\u3089\u306E\u5C5E\u6027\u306F\u7121\u8996\u3055\u308C\u3001\u7F72\u540D\u306B\u3088\u3063\u3066\u4FDD\u8B77\u3055\u308C\u307E\u305B\u3093\u3002"}, + {"external.file.attributes.detected", "POSIX\u30D5\u30A1\u30A4\u30EB\u6A29\u9650\u307E\u305F\u306Fsymlink(\u3042\u308B\u3044\u306F\u305D\u306E\u4E21\u65B9)\u306E\u5C5E\u6027\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002\u7F72\u540D\u4E2D\u306F\u3053\u308C\u3089\u306E\u5C5E\u6027\u306F\u7121\u8996\u3055\u308C\u3001\u7F72\u540D\u306B\u3088\u3063\u3066\u4FDD\u8B77\u3055\u308C\u307E\u305B\u3093\u3002"}, {"jarsigner.", "jarsigner: "}, {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.", diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java index 2b4059ea877c5..9e76346fca278 100644 --- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java +++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -178,7 +178,7 @@ public class Resources_zh_CN extends java.util.ListResourceBundle { {"key.bit.disabled", "%d \u4F4D\u5BC6\u94A5\uFF08\u7981\u7528\uFF09"}, {"key.bit.eccurve.disabled", "%1$d \u4F4D %2$s \u5BC6\u94A5\uFF08\u7981\u7528\uFF09"}, {"unknown.size", "\u672A\u77E5\u5927\u5C0F"}, - {"extra.attributes.detected", "\u68C0\u6D4B\u5230 POSIX \u6587\u4EF6\u6743\u9650\u548C/\u6216 symlink \u5C5E\u6027\u3002\u8FD9\u4E9B\u5C5E\u6027\u5728\u8FDB\u884C\u7B7E\u540D\u65F6\u4F1A\u88AB\u5FFD\u7565\uFF0C\u4E0D\u53D7\u8BE5\u7B7E\u540D\u7684\u4FDD\u62A4\u3002"}, + {"external.file.attributes.detected", "\u68C0\u6D4B\u5230 POSIX \u6587\u4EF6\u6743\u9650\u548C/\u6216 symlink \u5C5E\u6027\u3002\u8FD9\u4E9B\u5C5E\u6027\u5728\u8FDB\u884C\u7B7E\u540D\u65F6\u4F1A\u88AB\u5FFD\u7565\uFF0C\u4E0D\u53D7\u8BE5\u7B7E\u540D\u7684\u4FDD\u62A4\u3002"}, {"jarsigner.", "jarsigner: "}, {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.", diff --git a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java index cecb8b86a2dc8..5e5b665790f96 100644 --- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java +++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java @@ -645,12 +645,12 @@ void setPermissions(byte[] path, Set<PosixFilePermission> perms) throws IOExcept e.type = Entry.COPY; // copy e } if (perms == null) { - e.posixPerms = -1; - } else if (e.posixPerms == -1) { - e.posixPerms = ZipUtils.permsToFlags(perms); + e.externalFileAttributes = -1; + } else if (e.externalFileAttributes == -1) { + e.externalFileAttributes = ZipUtils.permsToFlags(perms); } else { - e.posixPerms = ZipUtils.permsToFlags(perms) | - (e.posixPerms & 0xFE00); // Preserve unrelated bits + e.externalFileAttributes = ZipUtils.permsToFlags(perms) | + (e.externalFileAttributes & 0xFE00); // Preserve unrelated bits } update(e); } finally { @@ -2887,7 +2887,7 @@ static class Entry extends IndexNode implements ZipFileAttributes { // entry attributes int version; int flag; - int posixPerms = -1; // posix permissions + int externalFileAttributes = -1; // file type, setuid, setgid, sticky, posix permissions int method = -1; // compression method long mtime = -1; // last modification time (in DOS time) long atime = -1; // last access time @@ -2923,7 +2923,7 @@ static class Entry extends IndexNode implements ZipFileAttributes { for (FileAttribute<?> attr : attrs) { String attrName = attr.name(); if (attrName.equals("posix:permissions")) { - posixPerms = ZipUtils.permsToFlags((Set<PosixFilePermission>)attr.value()); + externalFileAttributes = ZipUtils.permsToFlags((Set<PosixFilePermission>)attr.value()); } } } @@ -2958,7 +2958,7 @@ static class Entry extends IndexNode implements ZipFileAttributes { */ this.locoff = e.locoff; this.comment = e.comment; - this.posixPerms = e.posixPerms; + this.externalFileAttributes = e.externalFileAttributes; this.type = type; } @@ -2988,7 +2988,7 @@ else if (method == METHOD_STORED) * to a version value. */ private int versionMadeBy(int version) { - return (posixPerms < 0) ? version : + return (externalFileAttributes < 0) ? version : VERSION_MADE_BY_BASE_UNIX | (version & 0xff); } @@ -3015,7 +3015,7 @@ private void readCEN(ZipFileSystem zipfs, IndexNode inode) throws IOException { attrsEx = CENATX(cen, pos); */ if (CENVEM_FA(cen, pos) == FILE_ATTRIBUTES_UNIX) { - posixPerms = (CENATX_PERMS(cen, pos) & 0xFFFF); // 16 bits for file type, setuid, setgid, sticky + perms + externalFileAttributes = (CENATX_PERMS(cen, pos) & 0xFFFF); // 16 bits for file type, setuid, setgid, sticky + perms } locoff = CENOFF(cen, pos); pos += CENHDR; @@ -3105,7 +3105,7 @@ private int writeCEN(OutputStream os) throws IOException { } writeShort(os, 0); // starting disk number writeShort(os, 0); // internal file attributes (unused) - writeInt(os, posixPerms > 0 ? posixPerms << 16 : 0); // external file + writeInt(os, externalFileAttributes > 0 ? externalFileAttributes << 16 : 0); // external file // attributes, used for storing posix // permissions writeInt(os, locoff0); // relative offset of local header @@ -3528,10 +3528,10 @@ public byte[] comment() { @Override public Optional<Set<PosixFilePermission>> storedPermissions() { Set<PosixFilePermission> perms = null; - if (posixPerms != -1) { + if (externalFileAttributes != -1) { perms = HashSet.newHashSet(PosixFilePermission.values().length); for (PosixFilePermission perm : PosixFilePermission.values()) { - if ((posixPerms & ZipUtils.permToFlag(perm)) != 0) { + if ((externalFileAttributes & ZipUtils.permToFlag(perm)) != 0) { perms.add(perm); } } diff --git a/test/jdk/sun/security/tools/jarsigner/SymLinkTest.java b/test/jdk/sun/security/tools/jarsigner/SymLinkTest.java index c96eeeeb74d0d..db9811d4ec349 100644 --- a/test/jdk/sun/security/tools/jarsigner/SymLinkTest.java +++ b/test/jdk/sun/security/tools/jarsigner/SymLinkTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ public static void main(String[] args) throws Exception { Files.write(Path.of(ZIPFILENAME), ZIPBYTES); // check attributes before signing - verifyExtraAttrs(ZIPFILENAME); + verifyExternalFileAttributes(ZIPFILENAME); // generate key for signing SecurityTools.keytool( @@ -82,7 +82,7 @@ public static void main(String[] args) throws Exception { .shouldContain(WARNING_MSG); // recheck attributes after signing - verifyExtraAttrs(ZIPFILENAME); + verifyExternalFileAttributes(ZIPFILENAME); // verify zip file - expect warning SecurityTools.jarsigner( @@ -95,8 +95,8 @@ public static void main(String[] args) throws Exception { .shouldContain(WARNING_MSG); } - private static void verifyExtraAttrs(String zipFileName) throws IOException { - // the 16 bit extra attributes value should equal 0xa1ff - look for that pattern. + private static void verifyExternalFileAttributes(String zipFileName) throws IOException { + // the 16 bit 'external file attributes' value should equal 0xa1ff - look for that pattern. // Such values can be read from zip file via 'unzip -Z -l -v <zipfile>' try (FileInputStream fis = new FileInputStream(ZIPFILENAME)) { byte[] b = fis.readAllBytes(); @@ -107,7 +107,7 @@ private static void verifyExtraAttrs(String zipFileName) throws IOException { return; } } - throw new RuntimeException("extra attribute value not detected"); + throw new RuntimeException("external file attribute value not detected"); } } From 0db9bc57de07f8f1d0bf657621cb1b8fd7b01211 Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Wed, 3 Jul 2024 05:03:56 +0000 Subject: [PATCH 273/471] 8335290: Rename ClassFile::transform to ClassFile::transformClass Reviewed-by: asotona --- .../share/classes/java/lang/Module.java | 6 +-- .../java/lang/classfile/ClassFile.java | 15 ++++---- .../lang/classfile/ClassFileTransform.java | 2 +- .../classfile/components/ClassRemapper.java | 2 +- .../snippet-files/PackageSnippets.java | 8 ++-- .../snippet-files/PackageSnippets.java | 6 +-- .../classfile/impl/ClassFileImpl.java | 2 +- .../internal/module/ModuleInfoExtender.java | 2 +- .../StripJavaDebugAttributesPlugin.java | 2 +- .../internal/plugins/VersionPropsPlugin.java | 2 +- .../execution/LocalExecutionControl.java | 2 +- .../records/BadCanonicalCtrTest.java | 6 +-- .../records/ProhibitedMethods.java | 4 +- .../records/SerialPersistentFieldsTest.java | 4 +- .../lang/ModuleTests/AnnotationsTest.java | 4 +- .../lang/instrument/asmlib/Instrumentor.java | 4 +- .../java/lang/invoke/8022701/BogoLoader.java | 4 +- .../accessProtectedSuper/BogoLoader.java | 4 +- test/jdk/jdk/classfile/AdaptCodeTest.java | 8 ++-- .../AdvancedTransformationsTest.java | 6 +-- test/jdk/jdk/classfile/BSMTest.java | 4 +- test/jdk/jdk/classfile/ClassBuildingTest.java | 4 +- .../jdk/classfile/ClassHierarchyInfoTest.java | 4 +- test/jdk/jdk/classfile/CorpusTest.java | 6 +-- .../DiscontinuedInstructionsTest.java | 10 ++--- test/jdk/jdk/classfile/LvtTest.java | 4 +- .../jdk/classfile/MassAdaptCopyCodeTest.java | 4 +- .../MassAdaptCopyPrimitiveMatchCodeTest.java | 4 +- test/jdk/jdk/classfile/OptionsTest.java | 6 +-- test/jdk/jdk/classfile/ShortJumpsFixTest.java | 18 ++++----- test/jdk/jdk/classfile/StackMapsTest.java | 4 +- .../jdk/classfile/TestRecordComponent.java | 8 ++-- test/jdk/jdk/classfile/TransformTests.java | 14 +++---- test/jdk/jdk/classfile/VerifierSelfTest.java | 4 +- .../examples/AnnotationsExamples.java | 12 +++--- .../classfile/examples/ExampleGallery.java | 38 +++++++++---------- .../ExperimentalTransformExamples.java | 4 +- .../classfile/examples/TransformExamples.java | 12 +++--- .../jdk/jdk/classfile/helpers/Transforms.java | 10 ++--- .../jdk/jfr/event/io/TestInstrumentation.java | 2 +- .../javaagent/TestEventInstrumentation.java | 2 +- .../separate/ClassToInterfaceConverter.java | 4 +- .../tools/javac/MethodParametersTest.java | 6 +-- .../classreader/8171132/BadConstantValue.java | 3 +- .../javac/classreader/BadMethodParameter.java | 3 +- .../javac/defaultMethods/BadClassfile.java | 4 +- .../javac/launcher/SourceLauncherTest.java | 2 +- .../tools/javac/modules/IncubatingTest.java | 4 +- .../tools/javac/modules/JavaBaseTest.java | 4 +- .../tools/javac/modules/OpenModulesTest.java | 4 +- .../createsymbols/CreateSymbolsTestImpl.java | 4 +- .../processing/model/element/TestOrigin.java | 4 +- .../tools/javap/UndefinedAccessFlagTest.java | 2 +- .../bench/jdk/classfile/AdHocAdapt.java | 4 +- .../jdk/classfile/ClassfileBenchmark.java | 8 ++-- .../bench/jdk/classfile/ParseOptions.java | 8 ++-- .../jdk/classfile/RebuildMethodBodies.java | 4 +- .../bench/jdk/classfile/Transforms.java | 10 ++--- 58 files changed, 171 insertions(+), 174 deletions(-) diff --git a/src/java.base/share/classes/java/lang/Module.java b/src/java.base/share/classes/java/lang/Module.java index 82dae27efa039..d7a7081861834 100644 --- a/src/java.base/share/classes/java/lang/Module.java +++ b/src/java.base/share/classes/java/lang/Module.java @@ -54,13 +54,9 @@ import java.util.stream.Stream; import java.lang.classfile.AccessFlags; import java.lang.classfile.Attribute; -import java.lang.classfile.ClassModel; -import java.lang.classfile.ClassTransform; import java.lang.classfile.ClassFile; -import java.lang.classfile.attribute.ModuleAttribute; import java.lang.classfile.attribute.RuntimeVisibleAnnotationsAttribute; -import jdk.internal.javac.PreviewFeature; import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.loader.BootLoader; import jdk.internal.loader.ClassLoaders; @@ -1588,7 +1584,7 @@ private Class<?> loadModuleInfoClass() { private Class<?> loadModuleInfoClass(InputStream in) throws IOException { final String MODULE_INFO = "module-info"; var cc = ClassFile.of(ClassFile.ConstantPoolSharingOption.NEW_POOL); - byte[] bytes = cc.transform(cc.parse(in.readAllBytes()), (clb, cle) -> { + byte[] bytes = cc.transformClass(cc.parse(in.readAllBytes()), (clb, cle) -> { switch (cle) { case AccessFlags af -> clb.withFlags(AccessFlag.INTERFACE, AccessFlag.ABSTRACT, AccessFlag.SYNTHETIC); diff --git a/src/java.base/share/classes/java/lang/classfile/ClassFile.java b/src/java.base/share/classes/java/lang/classfile/ClassFile.java index 1997ffb487ce0..08745f7e1bafc 100644 --- a/src/java.base/share/classes/java/lang/classfile/ClassFile.java +++ b/src/java.base/share/classes/java/lang/classfile/ClassFile.java @@ -32,7 +32,6 @@ import java.util.function.Function; import java.lang.classfile.attribute.ModuleAttribute; -import java.lang.classfile.attribute.UnknownAttribute; import java.lang.classfile.constantpool.ClassEntry; import java.lang.classfile.constantpool.ConstantPoolBuilder; import java.lang.classfile.constantpool.Utf8Entry; @@ -435,15 +434,15 @@ default void buildModuleTo(Path path, * This method behaves as if: * {@snippet lang=java : * this.build(model.thisClass(), ConstantPoolBuilder.of(model), - * b -> b.transform(model, transform)); + * clb -> clb.transform(model, transform)); * } * * @param model the class model to transform * @param transform the transform * @return the bytes of the new class */ - default byte[] transform(ClassModel model, ClassTransform transform) { - return transform(model, model.thisClass(), transform); + default byte[] transformClass(ClassModel model, ClassTransform transform) { + return transformClass(model, model.thisClass(), transform); } /** @@ -458,8 +457,8 @@ default byte[] transform(ClassModel model, ClassTransform transform) { * @param transform the transform * @return the bytes of the new class */ - default byte[] transform(ClassModel model, ClassDesc newClassName, ClassTransform transform) { - return transform(model, TemporaryConstantPool.INSTANCE.classEntry(newClassName), transform); + default byte[] transformClass(ClassModel model, ClassDesc newClassName, ClassTransform transform) { + return transformClass(model, TemporaryConstantPool.INSTANCE.classEntry(newClassName), transform); } /** @@ -473,7 +472,7 @@ default byte[] transform(ClassModel model, ClassDesc newClassName, ClassTransfor * This method behaves as if: * {@snippet lang=java : * this.build(newClassName, ConstantPoolBuilder.of(model), - * b -> b.transform(model, transform)); + * clb -> clb.transform(model, transform)); * } * * @param model the class model to transform @@ -481,7 +480,7 @@ default byte[] transform(ClassModel model, ClassDesc newClassName, ClassTransfor * @param transform the transform * @return the bytes of the new class */ - byte[] transform(ClassModel model, ClassEntry newClassName, ClassTransform transform); + byte[] transformClass(ClassModel model, ClassEntry newClassName, ClassTransform transform); /** * Verify a classfile. Any verification errors found will be returned. diff --git a/src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java b/src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java index 677478ec650a4..f67da06a36de0 100644 --- a/src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java +++ b/src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java @@ -33,7 +33,7 @@ /** * A transformation on streams of elements. Transforms are used during * transformation of classfile entities; a transform is provided to a method like - * {@link ClassFile#transform(ClassModel, ClassTransform)}, and the elements of the class, + * {@link ClassFile#transformClass(ClassModel, ClassTransform)}, and the elements of the class, * along with a builder, are presented to the transform. * * <p>The subtypes of {@linkplain diff --git a/src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java b/src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java index c69806b18c4c0..d3ae180dde573 100644 --- a/src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java +++ b/src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java @@ -107,6 +107,6 @@ static ClassRemapper of(Function<ClassDesc, ClassDesc> mapFunction) { * @return re-mapped class file bytes */ default byte[] remapClass(ClassFile context, ClassModel clm) { - return context.transform(clm, map(clm.thisClass().asSymbol()), this); + return context.transformClass(clm, map(clm.thisClass().asSymbol()), this); } } diff --git a/src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java b/src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java index f96be4e0cdf01..b53e921381333 100644 --- a/src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java +++ b/src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java @@ -130,7 +130,7 @@ void allPackageRemap(ClassModel... allMyClasses) { void codeLocalsShifting(ClassModel classModel) { // @start region="codeLocalsShifting" - byte[] newBytes = ClassFile.of().transform( + byte[] newBytes = ClassFile.of().transformClass( classModel, (classBuilder, classElement) -> { if (classElement instanceof MethodModel method) @@ -145,7 +145,7 @@ void codeLocalsShifting(ClassModel classModel) { void codeRelabeling(ClassModel classModel) { // @start region="codeRelabeling" - byte[] newBytes = ClassFile.of().transform( + byte[] newBytes = ClassFile.of().transformClass( classModel, ClassTransform.transformingMethodBodies( CodeTransform.ofStateful(CodeRelabeler::of))); @@ -160,7 +160,7 @@ byte[] classInstrumentation(ClassModel target, ClassModel instrumentor, Predicat var targetFieldNames = target.fields().stream().map(f -> f.fieldName().stringValue()).collect(Collectors.toSet()); var targetMethods = target.methods().stream().map(m -> m.methodName().stringValue() + m.methodType().stringValue()).collect(Collectors.toSet()); var instrumentorClassRemapper = ClassRemapper.of(Map.of(instrumentor.thisClass().asSymbol(), target.thisClass().asSymbol())); - return ClassFile.of().transform(target, + return ClassFile.of().transformClass(target, ClassTransform.transformingMethods( instrumentedMethodsFilter, (mb, me) -> { @@ -191,7 +191,7 @@ byte[] classInstrumentation(ClassModel target, ClassModel instrumentor, Predicat //inlined target locals must be shifted based on the actual instrumentor locals codeBuilder.block(inlinedBlockBuilder -> inlinedBlockBuilder - .transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol()) + .transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol()) .andThen(CodeRelabeler.of()) .andThen((innerBuilder, shiftedTargetCode) -> { //returns must be replaced with jump to the end of the inlined method diff --git a/src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java b/src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java index 5073e108465ad..b80c1c8328411 100644 --- a/src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java +++ b/src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java @@ -195,7 +195,7 @@ void stripDebugMethods2(byte[] bytes) { builder.with(element); }; var cc = ClassFile.of(); - byte[] newBytes = cc.transform(cc.parse(bytes), ct); + byte[] newBytes = cc.transformClass(cc.parse(bytes), ct); // @end } @@ -346,7 +346,7 @@ void fooToBarUnrolled(ClassModel classModel) { void codeRelabeling(ClassModel classModel) { // @start region="codeRelabeling" - byte[] newBytes = ClassFile.of().transform(classModel, + byte[] newBytes = ClassFile.of().transformClass(classModel, ClassTransform.transformingMethodBodies( CodeTransform.ofStateful(CodeRelabeler::of))); // @end @@ -360,7 +360,7 @@ byte[] classInstrumentation(ClassModel target, ClassModel instrumentor, Predicat var targetFieldNames = target.fields().stream().map(f -> f.fieldName().stringValue()).collect(Collectors.toSet()); var targetMethods = target.methods().stream().map(m -> m.methodName().stringValue() + m.methodType().stringValue()).collect(Collectors.toSet()); var instrumentorClassRemapper = ClassRemapper.of(Map.of(instrumentor.thisClass().asSymbol(), target.thisClass().asSymbol())); - return ClassFile.of().transform(target, + return ClassFile.of().transformClass(target, ClassTransform.transformingMethods( instrumentedMethodsFilter, (mb, me) -> { diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassFileImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassFileImpl.java index 8bffbd6de4f5d..e4408d6c7b27d 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassFileImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassFileImpl.java @@ -115,7 +115,7 @@ public byte[] build(ClassEntry thisClassEntry, } @Override - public byte[] transform(ClassModel model, ClassEntry newClassName, ClassTransform transform) { + public byte[] transformClass(ClassModel model, ClassEntry newClassName, ClassTransform transform) { ConstantPoolBuilder constantPool = constantPoolSharingOption() == ConstantPoolSharingOption.SHARED_POOL ? ConstantPoolBuilder.of(model) : ConstantPoolBuilder.of(); diff --git a/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java b/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java index c9d3fd0adb60e..6bc32d54a3063 100644 --- a/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java +++ b/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java @@ -153,7 +153,7 @@ public byte[] toByteArray() throws IOException { var cc = ClassFile.of(); var cm = cc.parse(in.readAllBytes()); Version v = ModuleInfoExtender.this.version; - return cc.transform(cm, ClassTransform.endHandler(clb -> { + return cc.transformClass(cm, ClassTransform.endHandler(clb -> { // ModuleMainClass attribute if (mainClass != null) { clb.with(ModuleMainClassAttribute.of(ClassDesc.of(mainClass))); diff --git a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java index 536c5100cd845..bbf2bfacd007c 100644 --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java @@ -67,7 +67,7 @@ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { var clm = newClassReader(path, resource, ClassFile.DebugElementsOption.DROP_DEBUG, ClassFile.LineNumbersOption.DROP_LINE_NUMBERS); - byte[] content = ClassFile.of().transform(clm, ClassTransform + byte[] content = ClassFile.of().transformClass(clm, ClassTransform .dropping(cle -> cle instanceof SourceFileAttribute || cle instanceof SourceDebugExtensionAttribute) .andThen(ClassTransform.transformingMethods(MethodTransform diff --git a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java index 973fa4d126851..f9a5463609a9f 100644 --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java @@ -101,7 +101,7 @@ public void configure(Map<String, String> config) { @SuppressWarnings("deprecation") private byte[] redefine(String path, byte[] classFile) { - return ClassFile.of().transform(newClassReader(path, classFile), + return ClassFile.of().transformClass(newClassReader(path, classFile), ClassTransform.transformingMethodBodies( mm -> mm.methodName().equalsString("<clinit>"), new CodeTransform() { diff --git a/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java b/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java index a89c91d3667e8..3076c0fa76dce 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java @@ -89,7 +89,7 @@ public void load(ClassBytecodes[] cbcs) private static byte[] instrument(byte[] classFile) { var cc = ClassFile.of(); - return cc.transform(cc.parse(classFile), + return cc.transformClass(cc.parse(classFile), ClassTransform.transformingMethodBodies((cob, coe) -> { if (coe instanceof BranchInstruction) cob.invokestatic(CD_Cancel, "stopCheck", ConstantDescs.MTD_void); diff --git a/test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java b/test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java index ca31213b28f57..c9b757a7b5136 100644 --- a/test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java +++ b/test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -207,7 +207,7 @@ protected Class<?> resolveClass(ObjectStreamClass desc) */ static byte[] removeConstructor(byte[] classBytes) { var cf = ClassFile.of(); - return cf.transform(cf.parse(classBytes), ClassTransform.dropping(ce -> + return cf.transformClass(cf.parse(classBytes), ClassTransform.dropping(ce -> ce instanceof MethodModel mm && mm.methodName().equalsString(INIT_NAME))); } @@ -217,7 +217,7 @@ static byte[] removeConstructor(byte[] classBytes) { */ static byte[] modifyConstructor(byte[] classBytes) { var cf = ClassFile.of(); - return cf.transform(cf.parse(classBytes), ClassTransform.dropping(ce -> + return cf.transformClass(cf.parse(classBytes), ClassTransform.dropping(ce -> ce instanceof MethodModel mm && mm.methodName().equalsString(INIT_NAME)) .andThen(ClassTransform.endHandler(clb -> clb.withMethodBody(INIT_NAME, MethodTypeDesc.of(CD_void, CD_Object), ACC_PUBLIC, cob -> { diff --git a/test/jdk/java/io/Serializable/records/ProhibitedMethods.java b/test/jdk/java/io/Serializable/records/ProhibitedMethods.java index 53252aaf5586c..3a66e46f83b82 100644 --- a/test/jdk/java/io/Serializable/records/ProhibitedMethods.java +++ b/test/jdk/java/io/Serializable/records/ProhibitedMethods.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -243,7 +243,7 @@ static byte[] addReadObjectNoData(byte[] classBytes) { static byte[] addMethod(byte[] classBytes, String name, MethodTypeDesc desc) { var cf = ClassFile.of(); - return cf.transform(cf.parse(classBytes), ClassTransform.endHandler(clb -> { + return cf.transformClass(cf.parse(classBytes), ClassTransform.endHandler(clb -> { clb.withMethodBody(name, desc, ACC_PRIVATE, cob -> { cob.loadConstant(name + " should not be invoked"); cob.invokestatic(Assert.class.describeConstable().orElseThrow(), "fail", diff --git a/test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java b/test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java index 4ff15aa84d48e..12a5fe8c40264 100644 --- a/test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java +++ b/test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -231,7 +231,7 @@ static byte[] addSerialPersistentFields(byte[] classBytes, ObjectStreamField[] spf) { var cf = ClassFile.of(); var model = cf.parse(classBytes); - return cf.transform(model, new SerialPersistentFieldsVisitor(model.thisClass().asSymbol(), spf)); + return cf.transformClass(model, new SerialPersistentFieldsVisitor(model.thisClass().asSymbol(), spf)); } /** A visitor that adds a serialPersistentFields field, and assigns it in clinit. */ diff --git a/test/jdk/java/lang/ModuleTests/AnnotationsTest.java b/test/jdk/java/lang/ModuleTests/AnnotationsTest.java index 60487584273c4..1fffe710ce570 100644 --- a/test/jdk/java/lang/ModuleTests/AnnotationsTest.java +++ b/test/jdk/java/lang/ModuleTests/AnnotationsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -148,7 +148,7 @@ public void testWithModuleInfoResourceXXXX() throws IOException { static byte[] addDeprecated(byte[] bytes, boolean forRemoval, String since) { var cf = ClassFile.of(); var oldModel = cf.parse(bytes); - return cf.transform(oldModel, new ClassTransform() { + return cf.transformClass(oldModel, new ClassTransform() { boolean rvaaFound = false; @Override diff --git a/test/jdk/java/lang/instrument/asmlib/Instrumentor.java b/test/jdk/java/lang/instrument/asmlib/Instrumentor.java index 29f2740a874cf..77893ed8a11b6 100644 --- a/test/jdk/java/lang/instrument/asmlib/Instrumentor.java +++ b/test/jdk/java/lang/instrument/asmlib/Instrumentor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -148,7 +148,7 @@ public void atEnd(ClassBuilder builder) { } public synchronized byte[] apply() { - var bytes = ClassFile.of().transform(model, transform); + var bytes = ClassFile.of().transformClass(model, transform); return dirty.get() ? bytes : null; } diff --git a/test/jdk/java/lang/invoke/8022701/BogoLoader.java b/test/jdk/java/lang/invoke/8022701/BogoLoader.java index ac06718b42a55..e497c169c3aa0 100644 --- a/test/jdk/java/lang/invoke/8022701/BogoLoader.java +++ b/test/jdk/java/lang/invoke/8022701/BogoLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -123,7 +123,7 @@ protected Class<?> loadClass(String name, boolean resolve) System.err.println("Replacing class " + name); } var cf = ClassFile.of(); - classData = cf.transform(cf.parse(classData), replaced.get(name)); + classData = cf.transformClass(cf.parse(classData), replaced.get(name)); } clazz = defineClass(name, classData, 0, classData.length); } catch (java.io.EOFException ioe) { diff --git a/test/jdk/java/lang/invoke/accessProtectedSuper/BogoLoader.java b/test/jdk/java/lang/invoke/accessProtectedSuper/BogoLoader.java index 0f14995992820..9ed6422f01534 100644 --- a/test/jdk/java/lang/invoke/accessProtectedSuper/BogoLoader.java +++ b/test/jdk/java/lang/invoke/accessProtectedSuper/BogoLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -125,7 +125,7 @@ protected Class<?> loadClass(String name, boolean resolve) System.err.println("Replacing class " + name); } var cf = ClassFile.of(); - classData = cf.transform(cf.parse(classData), replaced.get(name)); + classData = cf.transformClass(cf.parse(classData), replaced.get(name)); } clazz = defineClass(name, classData, 0, classData.length); } catch (java.io.EOFException ioe) { diff --git a/test/jdk/jdk/classfile/AdaptCodeTest.java b/test/jdk/jdk/classfile/AdaptCodeTest.java index 2a75cd7e02069..2b9dff588190a 100644 --- a/test/jdk/jdk/classfile/AdaptCodeTest.java +++ b/test/jdk/jdk/classfile/AdaptCodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ void testNullAdaptIterator() throws Exception { var cc = ClassFile.of(); ClassModel cm = cc.parse(testClassPath); for (ClassTransform t : Transforms.noops) { - byte[] newBytes = cc.transform(cm, t); + byte[] newBytes = cc.transformClass(cm, t); String result = (String) new ByteArrayClassLoader(AdaptCodeTest.class.getClassLoader(), testClassName, newBytes) .getMethod(testClassName, "many") @@ -79,7 +79,7 @@ void testNullAdaptIterator2(String path) throws Exception { var cc = ClassFile.of(); ClassModel cm = cc.parse(fs.getPath(path)); for (ClassTransform t : Transforms.noops) { - byte[] newBytes = cc.transform(cm, t); + byte[] newBytes = cc.transformClass(cm, t); } } @@ -101,7 +101,7 @@ void testSevenOfThirteenIterator() throws Exception { } }); - byte[] newBytes = cc.transform(cm, transform); + byte[] newBytes = cc.transformClass(cm, transform); // Files.write(Path.of("foo.class"), newBytes); String result = (String) new ByteArrayClassLoader(AdaptCodeTest.class.getClassLoader(), testClassName, newBytes) diff --git a/test/jdk/jdk/classfile/AdvancedTransformationsTest.java b/test/jdk/jdk/classfile/AdvancedTransformationsTest.java index 88792eedcf15f..6c7194271a477 100644 --- a/test/jdk/jdk/classfile/AdvancedTransformationsTest.java +++ b/test/jdk/jdk/classfile/AdvancedTransformationsTest.java @@ -77,7 +77,7 @@ void testShiftLocals() throws Exception { try (var in = StackMapGenerator.class.getResourceAsStream("StackMapGenerator.class")) { var cc = ClassFile.of(); var clm = cc.parse(in.readAllBytes()); - cc.verify(cc.transform(clm, (clb, cle) -> { + cc.verify(cc.transformClass(clm, (clb, cle) -> { if (cle instanceof MethodModel mm) { clb.transformMethod(mm, (mb, me) -> { if (me instanceof CodeModel com) { @@ -303,7 +303,7 @@ private static byte[] instrument(ClassModel target, ClassModel instrumentor, Pre var targetFieldNames = target.fields().stream().map(f -> f.fieldName().stringValue()).collect(Collectors.toSet()); var targetMethods = target.methods().stream().map(m -> m.methodName().stringValue() + m.methodType().stringValue()).collect(Collectors.toSet()); var instrumentorClassRemapper = ClassRemapper.of(Map.of(instrumentor.thisClass().asSymbol(), target.thisClass().asSymbol())); - return ClassFile.of().transform(target, + return ClassFile.of().transformClass(target, ClassTransform.transformingMethods( instrumentedMethodsFilter, (mb, me) -> { @@ -334,7 +334,7 @@ private static byte[] instrument(ClassModel target, ClassModel instrumentor, Pre //inlined target locals must be shifted based on the actual instrumentor locals codeBuilder.block(inlinedBlockBuilder -> inlinedBlockBuilder - .transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol()) + .transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol()) .andThen(CodeRelabeler.of()) .andThen((innerBuilder, shiftedTargetCode) -> { //returns must be replaced with jump to the end of the inlined method diff --git a/test/jdk/jdk/classfile/BSMTest.java b/test/jdk/jdk/classfile/BSMTest.java index 927549f021069..d0cc87d749373 100644 --- a/test/jdk/jdk/classfile/BSMTest.java +++ b/test/jdk/jdk/classfile/BSMTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ public class BSMTest { void testSevenOfThirteenIterator() throws Exception { var cc = ClassFile.of(); ClassModel cm = cc.parse(testClassPath); - byte[] newBytes = cc.transform(cm, (cb, ce) -> { + byte[] newBytes = cc.transformClass(cm, (cb, ce) -> { if (ce instanceof MethodModel mm) { cb.transformMethod(mm, (mb, me) -> { if (me instanceof CodeModel xm) { diff --git a/test/jdk/jdk/classfile/ClassBuildingTest.java b/test/jdk/jdk/classfile/ClassBuildingTest.java index 83c794ae87997..bf6380ae8feb0 100644 --- a/test/jdk/jdk/classfile/ClassBuildingTest.java +++ b/test/jdk/jdk/classfile/ClassBuildingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ public void test() throws Throwable { transform = transform.andThen(ClassTransform.transformingMethods(MethodTransform.dropping(me -> me instanceof SignatureAttribute))); - MethodHandles.lookup().defineClass(cc.transform(cm, transform)); + MethodHandles.lookup().defineClass(cc.transformClass(cm, transform)); } } diff --git a/test/jdk/jdk/classfile/ClassHierarchyInfoTest.java b/test/jdk/jdk/classfile/ClassHierarchyInfoTest.java index b8eadeda5e12b..4065f1d5e2f9e 100644 --- a/test/jdk/jdk/classfile/ClassHierarchyInfoTest.java +++ b/test/jdk/jdk/classfile/ClassHierarchyInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -122,7 +122,7 @@ void transformAndVerify(ClassHierarchyResolver res) throws Exception { void transformAndVerifySingle(ClassHierarchyResolver res) throws Exception { Path path = FileSystems.getFileSystem(URI.create("jrt:/")).getPath("modules/java.base/java/util/HashMap.class"); var classModel = ClassFile.of().parse(path); - byte[] newBytes = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(res)).transform(classModel, + byte[] newBytes = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(res)).transformClass(classModel, (clb, cle) -> { if (cle instanceof MethodModel mm) { clb.transformMethod(mm, (mb, me) -> { diff --git a/test/jdk/jdk/classfile/CorpusTest.java b/test/jdk/jdk/classfile/CorpusTest.java index 64db67e6d8eb0..67a2ebabb31d2 100644 --- a/test/jdk/jdk/classfile/CorpusTest.java +++ b/test/jdk/jdk/classfile/CorpusTest.java @@ -79,7 +79,7 @@ class CorpusTest { static void splitTableAttributes(String sourceClassFile, String targetClassFile) throws IOException, URISyntaxException { var root = Paths.get(URI.create(CorpusTest.class.getResource("CorpusTest.class").toString())).getParent(); var cc = ClassFile.of(); - Files.write(root.resolve(targetClassFile), cc.transform(cc.parse(root.resolve(sourceClassFile)), ClassTransform.transformingMethodBodies((cob, coe) -> { + Files.write(root.resolve(targetClassFile), cc.transformClass(cc.parse(root.resolve(sourceClassFile)), ClassTransform.transformingMethodBodies((cob, coe) -> { var dcob = (DirectCodeBuilder)cob; var curPc = dcob.curPc(); switch (coe) { @@ -147,7 +147,7 @@ void testNullAdaptations(Path path) throws Exception { try { byte[] transformed = m.shared && m.classTransform != null ? ClassFile.of(ClassFile.StackMapsOption.DROP_STACK_MAPS) - .transform(ClassFile.of().parse(bytes), m.classTransform) + .transformClass(ClassFile.of().parse(bytes), m.classTransform) : m.transform.apply(bytes); Map<Integer, Integer> newDups = findDups(transformed); oldRecord = m.classRecord(bytes); @@ -210,7 +210,7 @@ void testNullAdaptations(Path path) throws Exception { //testing maxStack and maxLocals are calculated identically by StackMapGenerator and StackCounter byte[] noStackMaps = ClassFile.of(ClassFile.StackMapsOption.DROP_STACK_MAPS) - .transform(newModel, + .transformClass(newModel, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)); var noStackModel = cc.parse(noStackMaps); var itStack = newModel.methods().iterator(); diff --git a/test/jdk/jdk/classfile/DiscontinuedInstructionsTest.java b/test/jdk/jdk/classfile/DiscontinuedInstructionsTest.java index be7e425c694dd..9070f0b1d4513 100644 --- a/test/jdk/jdk/classfile/DiscontinuedInstructionsTest.java +++ b/test/jdk/jdk/classfile/DiscontinuedInstructionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,7 +74,7 @@ void testJsrAndRetProcessing() throws Exception { .invoke(null, list); assertEquals(list, List.of("Hello", "World")); - bytes = cc.transform(cc.parse(bytes), ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)); + bytes = cc.transformClass(cc.parse(bytes), ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)); new ByteArrayClassLoader(DiscontinuedInstructionsTest.class.getClassLoader(), testClass, bytes) .getMethod(testClass, testMethod) @@ -84,17 +84,17 @@ void testJsrAndRetProcessing() throws Exception { var clm = cc.parse(bytes); //test failover stack map generation - cc.transform(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL) + cc.transformClass(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL) .andThen(ClassTransform.endHandler(clb -> clb.withVersion(JAVA_6_VERSION, 0)))); //test failure of stack map generation for Java 7 assertThrows(IllegalArgumentException.class, () -> - cc.transform(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL) + cc.transformClass(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL) .andThen(ClassTransform.endHandler(clb -> clb.withVersion(JAVA_7_VERSION, 0))))); //test failure of stack map generation when enforced to generate assertThrows(IllegalArgumentException.class, () -> ClassFile.of(ClassFile.StackMapsOption.GENERATE_STACK_MAPS) - .transform(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL))); + .transformClass(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL))); } } diff --git a/test/jdk/jdk/classfile/LvtTest.java b/test/jdk/jdk/classfile/LvtTest.java index 7c60d75823af4..7fb289cc175d0 100644 --- a/test/jdk/jdk/classfile/LvtTest.java +++ b/test/jdk/jdk/classfile/LvtTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,7 +108,7 @@ void buildLVTEntries() throws Exception { ClassModel c = cc.parse(fileBytes); // Compare transformed model and original with CodeBuilder filter - byte[] newClass = cc.transform(c, Transforms.threeLevelNoop); + byte[] newClass = cc.transformClass(c, Transforms.threeLevelNoop); ClassRecord orig = ClassRecord.ofClassModel(cc.parse(fileBytes), ClassRecord.CompatibilityFilter.By_ClassBuilder); ClassRecord transformed = ClassRecord.ofClassModel(cc.parse(newClass), ClassRecord.CompatibilityFilter.By_ClassBuilder); ClassRecord.assertEqualsDeep(transformed, orig); diff --git a/test/jdk/jdk/classfile/MassAdaptCopyCodeTest.java b/test/jdk/jdk/classfile/MassAdaptCopyCodeTest.java index 423ea91802aa3..067bce8b75fb3 100644 --- a/test/jdk/jdk/classfile/MassAdaptCopyCodeTest.java +++ b/test/jdk/jdk/classfile/MassAdaptCopyCodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,7 +80,7 @@ void copy(String name, byte[] bytes) throws Exception { } public byte[] adaptCopy(ClassModel cm) { - return ClassFile.of().transform(cm, (cb, ce) -> { + return ClassFile.of().transformClass(cm, (cb, ce) -> { if (ce instanceof MethodModel mm) { cb.transformMethod(mm, (mb, me) -> { if (me instanceof CodeModel xm) { diff --git a/test/jdk/jdk/classfile/MassAdaptCopyPrimitiveMatchCodeTest.java b/test/jdk/jdk/classfile/MassAdaptCopyPrimitiveMatchCodeTest.java index 0ac9de70472ca..67e20be0ad3ee 100644 --- a/test/jdk/jdk/classfile/MassAdaptCopyPrimitiveMatchCodeTest.java +++ b/test/jdk/jdk/classfile/MassAdaptCopyPrimitiveMatchCodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,7 +99,7 @@ void copy(String name, byte[] bytes) throws Exception { Map<String, byte[]> m2b = new HashMap<>(); Map<String, CodeAttribute> m2c = new HashMap<>(); byte[] resultBytes = - cc.transform(cm, (cb, e) -> { + cc.transformClass(cm, (cb, e) -> { if (e instanceof MethodModel mm) { Optional<CodeModel> code = mm.code(); if (code.isPresent()) { diff --git a/test/jdk/jdk/classfile/OptionsTest.java b/test/jdk/jdk/classfile/OptionsTest.java index eecc2d7a3853e..10e3855b06085 100644 --- a/test/jdk/jdk/classfile/OptionsTest.java +++ b/test/jdk/jdk/classfile/OptionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,7 +62,7 @@ static Path[] corpus() throws IOException, URISyntaxException { @MethodSource("corpus") void testAttributesProcessingOptionOnTransform(Path path) throws Exception { testNoUnstable(path, ClassFile.of().parse( - ClassFile.of(ClassFile.AttributesProcessingOption.DROP_UNSTABLE_ATRIBUTES).transform( + ClassFile.of(ClassFile.AttributesProcessingOption.DROP_UNSTABLE_ATRIBUTES).transformClass( ClassFile.of().parse(path), ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)))); } @@ -108,7 +108,7 @@ void testUnknownAttribute() throws Exception { //test drop unknown at transform assertTrue(ClassFile.of().parse( - ClassFile.of(ClassFile.AttributesProcessingOption.DROP_UNKNOWN_ATTRIBUTES).transform( + ClassFile.of(ClassFile.AttributesProcessingOption.DROP_UNKNOWN_ATTRIBUTES).transformClass( ClassFile.of().parse(classBytes), ClassTransform.ACCEPT_ALL)).attributes().isEmpty()); } diff --git a/test/jdk/jdk/classfile/ShortJumpsFixTest.java b/test/jdk/jdk/classfile/ShortJumpsFixTest.java index a259795b5519d..63e9f0bf90452 100644 --- a/test/jdk/jdk/classfile/ShortJumpsFixTest.java +++ b/test/jdk/jdk/classfile/ShortJumpsFixTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -136,7 +136,7 @@ void testFailBackJumpsDirectGen(Sample sample) throws Exception { @MethodSource("provideFwd") void testFixFwdJumpsTransform(Sample sample) throws Exception { assertFixed(sample, - CC_Fixed_Jumps.transform( + CC_Fixed_Jumps.transformClass( generateFwd(CC_No_Stack_No_Patch, sample, false), overflow())); } @@ -145,7 +145,7 @@ void testFixFwdJumpsTransform(Sample sample) throws Exception { @MethodSource("provideBack") void testFixBackJumpsTransform(Sample sample) throws Exception { assertFixed(sample, - CC_Fixed_Jumps.transform( + CC_Fixed_Jumps.transformClass( generateBack(CC_No_Stack_No_Patch, sample, false), overflow())); } @@ -154,7 +154,7 @@ void testFixBackJumpsTransform(Sample sample) throws Exception { @MethodSource("provideFwd") void testFailFwdJumpsTransform(Sample sample) throws Exception { assertThrows(IllegalArgumentException.class, () -> - CC_Not_Fixed_Jumps.transform( + CC_Not_Fixed_Jumps.transformClass( generateFwd(CC_No_Stack_No_Patch, sample, false), overflow())); } @@ -163,7 +163,7 @@ void testFailFwdJumpsTransform(Sample sample) throws Exception { @MethodSource("provideBack") void testFailBackJumpsTransform(Sample sample) throws Exception { assertThrows(IllegalArgumentException.class, () -> - CC_Not_Fixed_Jumps.transform( + CC_Not_Fixed_Jumps.transformClass( generateBack(CC_No_Stack_No_Patch, sample, false), overflow())); } @@ -172,7 +172,7 @@ void testFailBackJumpsTransform(Sample sample) throws Exception { @MethodSource("provideFwd") void testFixFwdJumpsChainedTransform(Sample sample) throws Exception { assertFixed(sample, - CC_Fixed_Jumps.transform( + CC_Fixed_Jumps.transformClass( generateFwd(CC_No_Stack_No_Patch, sample, false), ClassTransform.ACCEPT_ALL.andThen(overflow()))); //involve BufferedCodeBuilder here } @@ -181,7 +181,7 @@ void testFixFwdJumpsChainedTransform(Sample sample) throws Exception { @MethodSource("provideBack") void testFixBackJumpsChainedTransform(Sample sample) throws Exception { assertFixed(sample, - CC_Fixed_Jumps.transform( + CC_Fixed_Jumps.transformClass( generateBack(CC_No_Stack_No_Patch, sample, false), ClassTransform.ACCEPT_ALL.andThen(overflow()))); //involve BufferedCodeBuilder here } @@ -190,7 +190,7 @@ void testFixBackJumpsChainedTransform(Sample sample) throws Exception { @MethodSource("provideFwd") void testFailFwdJumpsChainedTransform(Sample sample) throws Exception { assertThrows(IllegalArgumentException.class, () -> - CC_Not_Fixed_Jumps.transform( + CC_Not_Fixed_Jumps.transformClass( generateFwd(CC_No_Stack_No_Patch, sample, false), ClassTransform.ACCEPT_ALL.andThen(overflow()))); //involve BufferedCodeBuilder here } @@ -199,7 +199,7 @@ void testFailFwdJumpsChainedTransform(Sample sample) throws Exception { @MethodSource("provideBack") void testFailBackJumpsChainedTransform(Sample sample) throws Exception { assertThrows(IllegalArgumentException.class, () -> - CC_Not_Fixed_Jumps.transform( + CC_Not_Fixed_Jumps.transformClass( generateBack(CC_No_Stack_No_Patch, sample, false), ClassTransform.ACCEPT_ALL.andThen(overflow()))); //involve BufferedCodeBuilder here } diff --git a/test/jdk/jdk/classfile/StackMapsTest.java b/test/jdk/jdk/classfile/StackMapsTest.java index f72c237aa8ff3..137f5bac48613 100644 --- a/test/jdk/jdk/classfile/StackMapsTest.java +++ b/test/jdk/jdk/classfile/StackMapsTest.java @@ -225,7 +225,7 @@ void testClassVersions() throws Exception { var actualVersion = cc.parse(StackMapsTest.class.getResourceAsStream("/testdata/Pattern1.class").readAllBytes()); //test transformation to class version 49 with removal of StackMapTable attributes - var version49 = cc.parse(cc.transform( + var version49 = cc.parse(cc.transformClass( actualVersion, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL) .andThen(ClassTransform.endHandler(clb -> clb.withVersion(49, 0))))); @@ -233,7 +233,7 @@ void testClassVersions() throws Exception { .walk().anyMatch(n -> n.name().equals("stack map frames"))); //test transformation to class version 50 with re-generation of StackMapTable attributes - assertEmpty(cc.verify(cc.transform( + assertEmpty(cc.verify(cc.transformClass( version49, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL) .andThen(ClassTransform.endHandler(clb -> clb.withVersion(50, 0)))))); diff --git a/test/jdk/jdk/classfile/TestRecordComponent.java b/test/jdk/jdk/classfile/TestRecordComponent.java index 95d56ffae8d08..b39029154a022 100644 --- a/test/jdk/jdk/classfile/TestRecordComponent.java +++ b/test/jdk/jdk/classfile/TestRecordComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,7 +65,7 @@ void testAdapt() throws Exception { } else cb.with(ce); }; - ClassModel newModel = cc.parse(cc.transform(cm, xform)); + ClassModel newModel = cc.parse(cc.transformClass(cm, xform)); ClassRecord.assertEquals(newModel, cm); } @@ -74,7 +74,7 @@ void testPassThrough() throws Exception { var cc = ClassFile.of(); ClassModel cm = cc.parse(Files.readAllBytes(testClassPath)); ClassTransform xform = (cb, ce) -> cb.with(ce); - ClassModel newModel = cc.parse(cc.transform(cm, xform)); + ClassModel newModel = cc.parse(cc.transformClass(cm, xform)); ClassRecord.assertEquals(newModel, cm); } @@ -92,7 +92,7 @@ void testChagne() throws Exception { else cb.with(ce); }; - ClassModel newModel = cc.parse(cc.transform(cm, xform)); + ClassModel newModel = cc.parse(cc.transformClass(cm, xform)); RecordAttribute ra = newModel.findAttribute(Attributes.record()).orElseThrow(); assertEquals(ra.components().size(), 2, "Should have two components"); assertEquals(ra.components().get(0).name().stringValue(), "fooXYZ"); diff --git a/test/jdk/jdk/classfile/TransformTests.java b/test/jdk/jdk/classfile/TransformTests.java index 13abca0ec5240..1df7b73bda56a 100644 --- a/test/jdk/jdk/classfile/TransformTests.java +++ b/test/jdk/jdk/classfile/TransformTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -97,8 +97,8 @@ void testSingleTransform() throws Exception { ClassModel cm = cc.parse(bytes); assertEquals(invoke(bytes), "foo"); - assertEquals(invoke(cc.transform(cm, transformCode(foo2foo))), "foo"); - assertEquals(invoke(cc.transform(cm, transformCode(foo2bar))), "bar"); + assertEquals(invoke(cc.transformClass(cm, transformCode(foo2foo))), "foo"); + assertEquals(invoke(cc.transformClass(cm, transformCode(foo2bar))), "bar"); } @Test @@ -110,7 +110,7 @@ void testSeq2() throws Exception { assertEquals(invoke(bytes), "foo"); ClassTransform transform = transformCode(foo2bar.andThen(bar2baz)); - assertEquals(invoke(cc.transform(cm, transform)), "baz"); + assertEquals(invoke(cc.transformClass(cm, transform)), "baz"); } @Test @@ -121,9 +121,9 @@ void testSeqN() throws Exception { ClassModel cm = cc.parse(bytes); assertEquals(invoke(bytes), "foo"); - assertEquals(invoke(cc.transform(cm, transformCode(foo2bar.andThen(bar2baz).andThen(baz2foo)))), "foo"); - assertEquals(invoke(cc.transform(cm, transformCode(foo2bar.andThen(bar2baz).andThen(baz2quux)))), "quux"); - assertEquals(invoke(cc.transform(cm, transformCode(foo2foo.andThen(foo2bar).andThen(bar2baz)))), "baz"); + assertEquals(invoke(cc.transformClass(cm, transformCode(foo2bar.andThen(bar2baz).andThen(baz2foo)))), "foo"); + assertEquals(invoke(cc.transformClass(cm, transformCode(foo2bar.andThen(bar2baz).andThen(baz2quux)))), "quux"); + assertEquals(invoke(cc.transformClass(cm, transformCode(foo2foo.andThen(foo2bar).andThen(bar2baz)))), "baz"); } public static class TestClass { diff --git a/test/jdk/jdk/classfile/VerifierSelfTest.java b/test/jdk/jdk/classfile/VerifierSelfTest.java index ef1bc3cab30ec..529edbf2b7961 100644 --- a/test/jdk/jdk/classfile/VerifierSelfTest.java +++ b/test/jdk/jdk/classfile/VerifierSelfTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,7 +74,7 @@ void testFailed() throws IOException { var cc = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of( className -> ClassHierarchyResolver.ClassHierarchyInfo.ofClass(null))); var classModel = cc.parse(path); - byte[] brokenClassBytes = cc.transform(classModel, + byte[] brokenClassBytes = cc.transformClass(classModel, (clb, cle) -> { if (cle instanceof MethodModel mm) { clb.transformMethod(mm, (mb, me) -> { diff --git a/test/jdk/jdk/classfile/examples/AnnotationsExamples.java b/test/jdk/jdk/classfile/examples/AnnotationsExamples.java index 846645d93a941..a43ab72556e9f 100644 --- a/test/jdk/jdk/classfile/examples/AnnotationsExamples.java +++ b/test/jdk/jdk/classfile/examples/AnnotationsExamples.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,7 +47,7 @@ public class AnnotationsExamples { public byte[] addAnno(ClassModel m) { // @@@ Not correct List<Annotation> annos = List.of(Annotation.of(ClassDesc.of("java.lang.FunctionalInterface"))); - return ClassFile.of().transform(m, ClassTransform.endHandler(cb -> cb.with(RuntimeVisibleAnnotationsAttribute.of(annos)))); + return ClassFile.of().transformClass(m, ClassTransform.endHandler(cb -> cb.with(RuntimeVisibleAnnotationsAttribute.of(annos)))); } /** @@ -75,7 +75,7 @@ public void swapAnnotation(ClassModel m) { var cc = ClassFile.of(); for (Annotation ann : a.annotations()) { if (ann.className().stringValue().equals("Ljava/lang/annotation/Documented;")) { - m2 = cc.parse(cc.transform(m, SWAP_ANNO_TRANSFORM)); + m2 = cc.parse(cc.transformClass(m, SWAP_ANNO_TRANSFORM)); } } } @@ -119,7 +119,7 @@ public void addAnnotation(ClassModel m) { var cc = ClassFile.of(); for (Annotation ann : a.annotations()) { if (ann.className().stringValue().equals("Ljava/lang/FunctionalInterface;")) { - m2 = cc.parse(cc.transform(m, (cb, ce) -> { + m2 = cc.parse(cc.transformClass(m, (cb, ce) -> { if (ce instanceof RuntimeVisibleAnnotationsAttribute ra) { var oldAnnos = ra.annotations(); List<Annotation> newAnnos = new ArrayList<>(oldAnnos.size() + 1); @@ -145,7 +145,7 @@ public void addAnnotation(ClassModel m) { } public byte[] viaEndHandlerClassBuilderEdition(ClassModel m) { - return ClassFile.of().transform(m, ClassTransform.ofStateful(() -> new ClassTransform() { + return ClassFile.of().transformClass(m, ClassTransform.ofStateful(() -> new ClassTransform() { boolean found = false; @Override @@ -172,7 +172,7 @@ public void atEnd(ClassBuilder builder) { } public byte[] viaEndHandlerClassTransformEdition(ClassModel m) { - return ClassFile.of().transform(m, ClassTransform.ofStateful(() -> new ClassTransform() { + return ClassFile.of().transformClass(m, ClassTransform.ofStateful(() -> new ClassTransform() { boolean found = false; @Override diff --git a/test/jdk/jdk/classfile/examples/ExampleGallery.java b/test/jdk/jdk/classfile/examples/ExampleGallery.java index 736725eeebe84..7de4a78ffbf86 100644 --- a/test/jdk/jdk/classfile/examples/ExampleGallery.java +++ b/test/jdk/jdk/classfile/examples/ExampleGallery.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,7 +62,7 @@ */ public class ExampleGallery { public byte[] changeClassVersion(ClassModel cm) { - return ClassFile.of().transform(cm, (cb, ce) -> { + return ClassFile.of().transformClass(cm, (cb, ce) -> { switch (ce) { case ClassFileVersion cv -> cb.withVersion(57, 0); default -> cb.with(ce); @@ -71,7 +71,7 @@ public byte[] changeClassVersion(ClassModel cm) { } public byte[] incrementClassVersion(ClassModel cm) { - return ClassFile.of().transform(cm, (cb, ce) -> { + return ClassFile.of().transformClass(cm, (cb, ce) -> { switch (ce) { case ClassFileVersion cv -> cb.withVersion(cv.majorVersion() + 1, 0); default -> cb.with(ce); @@ -80,7 +80,7 @@ public byte[] incrementClassVersion(ClassModel cm) { } public byte[] changeSuperclass(ClassModel cm, ClassDesc superclass) { - return ClassFile.of().transform(cm, (cb, ce) -> { + return ClassFile.of().transformClass(cm, (cb, ce) -> { switch (ce) { case Superclass sc -> cb.withSuperclass(superclass); default -> cb.with(ce); @@ -89,11 +89,11 @@ public byte[] changeSuperclass(ClassModel cm, ClassDesc superclass) { } public byte[] overrideSuperclass(ClassModel cm, ClassDesc superclass) { - return ClassFile.of().transform(cm, ClassTransform.endHandler(cb -> cb.withSuperclass(superclass))); + return ClassFile.of().transformClass(cm, ClassTransform.endHandler(cb -> cb.withSuperclass(superclass))); } public byte[] removeInterface(ClassModel cm, String internalName) { - return ClassFile.of().transform(cm, (cb, ce) -> { + return ClassFile.of().transformClass(cm, (cb, ce) -> { switch (ce) { case Interfaces i -> cb.withInterfaces(i.interfaces().stream() .filter(e -> !e.asInternalName().equals(internalName)) @@ -104,7 +104,7 @@ public byte[] removeInterface(ClassModel cm, String internalName) { } public byte[] addInterface(ClassModel cm, ClassDesc newIntf) { - return ClassFile.of().transform(cm, ClassTransform.ofStateful(() -> new ClassTransform() { + return ClassFile.of().transformClass(cm, ClassTransform.ofStateful(() -> new ClassTransform() { boolean seen = false; @Override @@ -133,7 +133,7 @@ public void atEnd(ClassBuilder builder) { } public byte[] addInterface1(ClassModel cm, ClassDesc newIntf) { - return ClassFile.of().transform(cm, ClassTransform.ofStateful(() -> new ClassTransform() { + return ClassFile.of().transformClass(cm, ClassTransform.ofStateful(() -> new ClassTransform() { Interfaces interfaces; @Override @@ -160,11 +160,11 @@ public void atEnd(ClassBuilder builder) { } public byte[] removeSignature(ClassModel cm) { - return ClassFile.of().transform(cm, ClassTransform.dropping(e -> e instanceof SignatureAttribute)); + return ClassFile.of().transformClass(cm, ClassTransform.dropping(e -> e instanceof SignatureAttribute)); } public byte[] changeSignature(ClassModel cm) { - return ClassFile.of().transform(cm, (cb, ce) -> { + return ClassFile.of().transformClass(cm, (cb, ce) -> { switch (ce) { case SignatureAttribute sa -> { String result = sa.signature().stringValue(); @@ -176,7 +176,7 @@ public byte[] changeSignature(ClassModel cm) { } public byte[] setSignature(ClassModel cm) { - return ClassFile.of().transform(cm, ClassTransform.dropping(e -> e instanceof SignatureAttribute) + return ClassFile.of().transformClass(cm, ClassTransform.dropping(e -> e instanceof SignatureAttribute) .andThen(ClassTransform.endHandler(b -> b.with(SignatureAttribute.of( ClassSignature.of( ClassTypeSig.of(ClassDesc.of("impl.Fox"), @@ -187,16 +187,16 @@ public byte[] setSignature(ClassModel cm) { // @@@ strip annos (class, all) public byte[] stripFields(ClassModel cm, Predicate<String> filter) { - return ClassFile.of().transform(cm, ClassTransform.dropping(e -> e instanceof FieldModel fm + return ClassFile.of().transformClass(cm, ClassTransform.dropping(e -> e instanceof FieldModel fm && filter.test(fm.fieldName().stringValue()))); } public byte[] addField(ClassModel cm) { - return ClassFile.of().transform(cm, ClassTransform.endHandler(cb -> cb.withField("cool", ClassDesc.ofDescriptor("(I)D"), ClassFile.ACC_PUBLIC))); + return ClassFile.of().transformClass(cm, ClassTransform.endHandler(cb -> cb.withField("cool", ClassDesc.ofDescriptor("(I)D"), ClassFile.ACC_PUBLIC))); } public byte[] changeFieldSig(ClassModel cm) { - return ClassFile.of().transform(cm, ClassTransform.transformingFields((fb, fe) -> { + return ClassFile.of().transformClass(cm, ClassTransform.transformingFields((fb, fe) -> { if (fe instanceof SignatureAttribute sa) fb.with(SignatureAttribute.of(Signature.parseFrom(sa.signature().stringValue().replace("this/", "that/")))); else @@ -205,7 +205,7 @@ public byte[] changeFieldSig(ClassModel cm) { } public byte[] changeFieldFlags(ClassModel cm) { - return ClassFile.of().transform(cm, ClassTransform.transformingFields((fb, fe) -> { + return ClassFile.of().transformClass(cm, ClassTransform.transformingFields((fb, fe) -> { switch (fe) { case AccessFlags a -> fb.with(AccessFlags.ofField(a.flagsMask() & ~ClassFile.ACC_PUBLIC & ~ClassFile.ACC_PROTECTED)); default -> fb.with(fe); @@ -214,7 +214,7 @@ public byte[] changeFieldFlags(ClassModel cm) { } public byte[] addException(ClassModel cm, ClassDesc ex) { - return ClassFile.of().transform(cm, ClassTransform.transformingMethods( + return ClassFile.of().transformClass(cm, ClassTransform.transformingMethods( MethodTransform.ofStateful(() -> new MethodTransform() { ExceptionsAttribute attr; @@ -258,11 +258,11 @@ public void accept(CodeBuilder codeB, CodeElement codeE) { } }); - return ClassFile.of().transform(cm, ClassTransform.transformingMethodBodies(transform)); + return ClassFile.of().transformClass(cm, ClassTransform.transformingMethodBodies(transform)); } public byte[] addInstrumentationBeforeInvoke(ClassModel cm) { - return ClassFile.of().transform(cm, ClassTransform.transformingMethodBodies((codeB, codeE) -> { + return ClassFile.of().transformClass(cm, ClassTransform.transformingMethodBodies((codeB, codeE) -> { switch (codeE) { case InvokeInstruction i -> { codeB.nop(); @@ -274,7 +274,7 @@ public byte[] addInstrumentationBeforeInvoke(ClassModel cm) { } public byte[] replaceIntegerConstant(ClassModel cm) { - return ClassFile.of().transform(cm, ClassTransform.transformingMethodBodies((codeB, codeE) -> { + return ClassFile.of().transformClass(cm, ClassTransform.transformingMethodBodies((codeB, codeE) -> { switch (codeE) { case ConstantInstruction ci -> { if (ci.constantValue() instanceof Integer i) codeB.loadConstant(i + 1); diff --git a/test/jdk/jdk/classfile/examples/ExperimentalTransformExamples.java b/test/jdk/jdk/classfile/examples/ExperimentalTransformExamples.java index d66cc6737daf1..c0bfceff16f47 100644 --- a/test/jdk/jdk/classfile/examples/ExperimentalTransformExamples.java +++ b/test/jdk/jdk/classfile/examples/ExperimentalTransformExamples.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ public class ExperimentalTransformExamples { }; public byte[] deleteAnnotations(ClassModel cm) { - return ClassFile.of().transform(cm, (cb, ce) -> { + return ClassFile.of().transformClass(cm, (cb, ce) -> { switch (ce) { case MethodModel m -> cb.transformMethod(m, dropMethodAnnos); case FieldModel f -> cb.transformField(f, dropFieldAnnos); diff --git a/test/jdk/jdk/classfile/examples/TransformExamples.java b/test/jdk/jdk/classfile/examples/TransformExamples.java index 97dfcd8a58582..2473e024e70ab 100644 --- a/test/jdk/jdk/classfile/examples/TransformExamples.java +++ b/test/jdk/jdk/classfile/examples/TransformExamples.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,18 +38,18 @@ */ public class TransformExamples { public byte[] noop(ClassModel cm) { - return ClassFile.of().transform(cm, ClassTransform.ACCEPT_ALL); + return ClassFile.of().transformClass(cm, ClassTransform.ACCEPT_ALL); } public byte[] deleteAllMethods(ClassModel cm) { - return ClassFile.of().transform(cm, (b, e) -> { + return ClassFile.of().transformClass(cm, (b, e) -> { if (!(e instanceof MethodModel)) b.with(e); }); } public byte[] deleteFieldsWithDollarInName(ClassModel cm) { - return ClassFile.of().transform(cm, (b, e) -> + return ClassFile.of().transformClass(cm, (b, e) -> { if (!(e instanceof FieldModel fm && fm.fieldName().stringValue().contains("$"))) b.with(e); @@ -57,14 +57,14 @@ public byte[] deleteFieldsWithDollarInName(ClassModel cm) { } public byte[] deleteAttributes(ClassModel cm) { - return ClassFile.of().transform(cm, (b, e) -> { + return ClassFile.of().transformClass(cm, (b, e) -> { if (!(e instanceof Attribute)) b.with(e); }); } public byte[] keepMethodsAndFields(ClassModel cm) { - return ClassFile.of().transform(cm, (b, e) -> { + return ClassFile.of().transformClass(cm, (b, e) -> { if (e instanceof MethodModel || e instanceof FieldModel) b.with(e); }); diff --git a/test/jdk/jdk/classfile/helpers/Transforms.java b/test/jdk/jdk/classfile/helpers/Transforms.java index 64b4836d50ad5..0b44c5a22aa48 100644 --- a/test/jdk/jdk/classfile/helpers/Transforms.java +++ b/test/jdk/jdk/classfile/helpers/Transforms.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -187,7 +187,7 @@ public enum NoOpTransform { shared ? options : Stream.concat(Stream.of(options), Stream.of(ClassFile.ConstantPoolSharingOption.NEW_POOL)).toArray(ClassFile.Option[]::new)); - this.transform = bytes -> cc.transform(cc.parse(bytes), classTransform); + this.transform = bytes -> cc.transformClass(cc.parse(bytes), classTransform); } public Optional<ClassRecord> classRecord(byte[] bytes) throws IOException { @@ -212,7 +212,7 @@ public enum InjectNopTransform { NOP_SHARED(bytes -> { var cc = ClassFile.of(); ClassModel cm = cc.parse(bytes); - return cc.transform(cm, (cb, ce) -> { + return cc.transformClass(cm, (cb, ce) -> { if (ce instanceof MethodModel mm) { cb.transformMethod(mm, (mb, me) -> { if (me instanceof CodeModel xm) { @@ -253,7 +253,7 @@ public enum SimpleTransform { HIGH_SHARED_ADD_FIELD(bytes -> { var cc = ClassFile.of(); ClassModel cm = cc.parse(bytes); - return cc.transform(cm, new ClassTransform() { + return cc.transformClass(cm, new ClassTransform() { @Override public void accept(ClassBuilder builder, ClassElement element) { builder.with(element); @@ -291,7 +291,7 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str HIGH_SHARED_DEL_METHOD(bytes -> { var cc = ClassFile.of(); ClassModel cm = cc.parse(bytes); - return cc.transform(cm, (builder, element) -> { + return cc.transformClass(cm, (builder, element) -> { if (!(element instanceof MethodModel mm)) builder.with(element); }); diff --git a/test/jdk/jdk/jfr/event/io/TestInstrumentation.java b/test/jdk/jdk/jfr/event/io/TestInstrumentation.java index 5f3885f31bf49..daa3d0162d4ce 100644 --- a/test/jdk/jdk/jfr/event/io/TestInstrumentation.java +++ b/test/jdk/jdk/jfr/event/io/TestInstrumentation.java @@ -317,7 +317,7 @@ public byte[] transform( instrClassesDone.add(target); var cf = ClassFile.of(); - return cf.transform(cf.parse(bytes), (clb, ce) -> { + return cf.transformClass(cf.parse(bytes), (clb, ce) -> { MethodKey key; if (ce instanceof MethodModel mm && instrMethodKeys.contains(key = new MethodKey( target, mm.methodName().stringValue(), mm.methodTypeSymbol()))) { diff --git a/test/jdk/jdk/jfr/javaagent/TestEventInstrumentation.java b/test/jdk/jdk/jfr/javaagent/TestEventInstrumentation.java index 8a8415dc524c0..049a1172d0c72 100644 --- a/test/jdk/jdk/jfr/javaagent/TestEventInstrumentation.java +++ b/test/jdk/jdk/jfr/javaagent/TestEventInstrumentation.java @@ -116,7 +116,7 @@ public byte[] transform(ClassLoader classLoader, String className, } var cf = ClassFile.of(); - result = cf.transform(cf.parse(bytes), (clb, ce) -> { + result = cf.transformClass(cf.parse(bytes), (clb, ce) -> { if (ce instanceof MethodModel mm && mm.methodName().equalsString(INIT_NAME)) { clb.transformMethod(mm, MethodTransform.transformingCode(new CodeTransform() { @Override diff --git a/test/jdk/jdk/lambda/separate/ClassToInterfaceConverter.java b/test/jdk/jdk/lambda/separate/ClassToInterfaceConverter.java index 26c1790128140..7bf9b19390e08 100644 --- a/test/jdk/jdk/lambda/separate/ClassToInterfaceConverter.java +++ b/test/jdk/jdk/lambda/separate/ClassToInterfaceConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,7 @@ private byte[] convertToInterface(ClassModel classModel) { } }; - return ClassFile.of().transform(classModel, + return ClassFile.of().transformClass(classModel, ClassTransform.dropping(ce -> ce instanceof MethodModel mm && mm.methodName().equalsString(INIT_NAME)) .andThen(ClassTransform.transformingMethodBodies(ct)) .andThen(ClassTransform.endHandler(b -> b.withFlags(ACC_INTERFACE | ACC_ABSTRACT | ACC_PUBLIC))) diff --git a/test/langtools/tools/javac/MethodParametersTest.java b/test/langtools/tools/javac/MethodParametersTest.java index 8ce73671d1fd6..a4d55525e60c5 100644 --- a/test/langtools/tools/javac/MethodParametersTest.java +++ b/test/langtools/tools/javac/MethodParametersTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -184,7 +184,7 @@ void modifyBaz(boolean flip) throws Exception { // Alter the MethodParameters attribute, changing the name of // the parameter from i to baz. - byte[] bazBytes = ClassFile.of().transform(baz, ClassTransform.transformingMethods((methodBuilder, methodElement) -> { + byte[] bazBytes = ClassFile.of().transformClass(baz, ClassTransform.transformingMethods((methodBuilder, methodElement) -> { if (methodElement instanceof MethodParametersAttribute a) { List<MethodParameterInfo> newParameterInfos = new ArrayList<>(); for (MethodParameterInfo info : a.parameters()) { @@ -200,7 +200,7 @@ void modifyBaz(boolean flip) throws Exception { // Flip the code and method attributes(). This is for checking // that order doesn't matter. if (flip) { - bazBytes = ClassFile.of().transform(baz, ClassTransform.transformingMethods((methodBuilder, methodElement) -> { + bazBytes = ClassFile.of().transformClass(baz, ClassTransform.transformingMethods((methodBuilder, methodElement) -> { if (methodElement instanceof MethodParametersAttribute) { methodBuilder.with(cattr); } else if (methodElement instanceof CodeAttribute){ diff --git a/test/langtools/tools/javac/classreader/8171132/BadConstantValue.java b/test/langtools/tools/javac/classreader/8171132/BadConstantValue.java index b4230c461c1a4..a44adbf6d9e71 100644 --- a/test/langtools/tools/javac/classreader/8171132/BadConstantValue.java +++ b/test/langtools/tools/javac/classreader/8171132/BadConstantValue.java @@ -1,5 +1,6 @@ /* * Copyright 2016 Google, Inc. All rights reserved. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -184,7 +185,7 @@ private static void swapConstantValues(File file) throws Exception { ClassModel cf = ClassFile.of().parse(file.toPath()); FieldModel a = cf.fields().getFirst(); FieldModel b = cf.fields().get(1); - byte[] Bytes = ClassFile.of().transform(cf, ClassTransform + byte[] Bytes = ClassFile.of().transformClass(cf, ClassTransform .dropping(ce -> ce instanceof ClassFileVersion || ce instanceof FieldModel) .andThen(ClassTransform.endHandler(classBuilder -> classBuilder .withField(b.fieldName(), b.fieldType(), fieldBuilder -> { diff --git a/test/langtools/tools/javac/classreader/BadMethodParameter.java b/test/langtools/tools/javac/classreader/BadMethodParameter.java index b37a196e2ed90..cddd3f2495630 100644 --- a/test/langtools/tools/javac/classreader/BadMethodParameter.java +++ b/test/langtools/tools/javac/classreader/BadMethodParameter.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2023, Alphabet LLC. All rights reserved. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -148,7 +149,7 @@ private static void transform(Path path) throws IOException { }; ClassTransform classTransform = ClassTransform.transformingMethods(methodTransform); - bytes = cf.transform(classModel, classTransform); + bytes = cf.transformClass(classModel, classTransform); Files.write(path, bytes); } } diff --git a/test/langtools/tools/javac/defaultMethods/BadClassfile.java b/test/langtools/tools/javac/defaultMethods/BadClassfile.java index 366692f17e3c4..589b65bcf66e5 100644 --- a/test/langtools/tools/javac/defaultMethods/BadClassfile.java +++ b/test/langtools/tools/javac/defaultMethods/BadClassfile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ public static void main(String... args) throws Exception { private static void test(String classname, String expected) throws Exception { File classfile = new File(System.getProperty("test.classes", "."), classname + ".class"); ClassModel cf = ClassFile.of().parse(classfile.toPath()); - ClassFile.of().transform(cf, ClassTransform.dropping(ce -> ce instanceof ClassFileVersion) + ClassFile.of().transformClass(cf, ClassTransform.dropping(ce -> ce instanceof ClassFileVersion) .andThen(ClassTransform.endHandler(classBuilder -> classBuilder.withVersion(Target.JDK1_7.majorVersion, Target.JDK1_7.minorVersion)))); JavaCompiler c = ToolProvider.getSystemJavaCompiler(); JavacTaskImpl task = (JavacTaskImpl) c.getTask(null, null, null, Arrays.asList("-classpath", System.getProperty("test.classes", ".")), null, null); diff --git a/test/langtools/tools/javac/launcher/SourceLauncherTest.java b/test/langtools/tools/javac/launcher/SourceLauncherTest.java index 5f558d421ff0f..5e70e84482d32 100644 --- a/test/langtools/tools/javac/launcher/SourceLauncherTest.java +++ b/test/langtools/tools/javac/launcher/SourceLauncherTest.java @@ -743,7 +743,7 @@ public void testNoDuplicateIncubatorWarning(Path base) throws Exception { private static void markModuleAsIncubator(Path moduleInfoFile) throws Exception { ClassModel cf = ClassFile.of().parse(moduleInfoFile); ModuleResolutionAttribute newAttr = ModuleResolutionAttribute.of(WARN_INCUBATING); - byte[] newBytes = ClassFile.of().transform(cf, + byte[] newBytes = ClassFile.of().transformClass(cf, ClassTransform.endHandler(classBuilder -> classBuilder.with(newAttr))); try (OutputStream out = Files.newOutputStream(moduleInfoFile)) { out.write(newBytes); diff --git a/test/langtools/tools/javac/modules/IncubatingTest.java b/test/langtools/tools/javac/modules/IncubatingTest.java index 776023db5e521..ce9d372a2f669 100644 --- a/test/langtools/tools/javac/modules/IncubatingTest.java +++ b/test/langtools/tools/javac/modules/IncubatingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -266,7 +266,7 @@ private void copyJavaBase(Path targetDir) throws IOException { private void addModuleResolutionAttribute(Path classfile, int resolution_flags) throws Exception { ClassModel cm = ClassFile.of().parse(classfile); ModuleResolutionAttribute modRAttr = ModuleResolutionAttribute.of(resolution_flags); - byte[] newBytes = ClassFile.of().transform(cm, ClassTransform.dropping(ce -> ce instanceof ModuleResolutionAttribute). + byte[] newBytes = ClassFile.of().transformClass(cm, ClassTransform.dropping(ce -> ce instanceof ModuleResolutionAttribute). andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(modRAttr)))); try (OutputStream out = Files.newOutputStream(classfile)) { out.write(newBytes); diff --git a/test/langtools/tools/javac/modules/JavaBaseTest.java b/test/langtools/tools/javac/modules/JavaBaseTest.java index 188bc4801e5cb..6d9f574705d0d 100644 --- a/test/langtools/tools/javac/modules/JavaBaseTest.java +++ b/test/langtools/tools/javac/modules/JavaBaseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -237,7 +237,7 @@ void createClass(Path base, List<String> mods, String target) throws Exception { modAttr1.provides()); Path modInfo = base.resolve("test-modules").resolve("module-info.class"); Files.createDirectories(modInfo.getParent()); - byte[] newBytes = ClassFile.of().transform(cm1, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute). + byte[] newBytes = ClassFile.of().transformClass(cm1, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute). andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(modAttr2)))); try (OutputStream out = Files.newOutputStream(modInfo)) { out.write(newBytes); diff --git a/test/langtools/tools/javac/modules/OpenModulesTest.java b/test/langtools/tools/javac/modules/OpenModulesTest.java index e21601031e73c..f2bf1d00cc760 100644 --- a/test/langtools/tools/javac/modules/OpenModulesTest.java +++ b/test/langtools/tools/javac/modules/OpenModulesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -243,7 +243,7 @@ public void testNonZeroOpensInOpen(Path base) throws Exception { module.uses(), module.provides()); - byte[] newBytes = ClassFile.of().transform(cm, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute). + byte[] newBytes = ClassFile.of().transformClass(cm, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute). andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(newModule)))); try (OutputStream out = Files.newOutputStream(miClass)) { out.write(newBytes); diff --git a/test/langtools/tools/javac/platform/createsymbols/CreateSymbolsTestImpl.java b/test/langtools/tools/javac/platform/createsymbols/CreateSymbolsTestImpl.java index 3a4fd85e54ecb..c66cd08852a21 100644 --- a/test/langtools/tools/javac/platform/createsymbols/CreateSymbolsTestImpl.java +++ b/test/langtools/tools/javac/platform/createsymbols/CreateSymbolsTestImpl.java @@ -1070,7 +1070,7 @@ void testModuleMainClass() throws Exception { try { Path moduleInfo = classesDir.resolve("module-info.class"); byte[] newClassData = - cf.transform(cf.parse(moduleInfo), + cf.transformClass(cf.parse(moduleInfo), (builder, element) -> { builder.with(element); if (element instanceof ModuleAttribute) { @@ -1179,7 +1179,7 @@ void compileAndPack(Path output, Path outputFile, } ClassFile cf = ClassFile.of(); ClassModel cm = cf.parse(moduleInfo); - byte[] newData = cf.transform(cm, (builder, element) -> { + byte[] newData = cf.transformClass(cm, (builder, element) -> { builder.with(element); if (element instanceof ModuleAttribute) { builder.with(ModulePackagesAttribute.ofNames(packages.stream() diff --git a/test/langtools/tools/javac/processing/model/element/TestOrigin.java b/test/langtools/tools/javac/processing/model/element/TestOrigin.java index 1fae5374bea33..dee13cbbeb2e4 100644 --- a/test/langtools/tools/javac/processing/model/element/TestOrigin.java +++ b/test/langtools/tools/javac/processing/model/element/TestOrigin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -302,7 +302,7 @@ public void testModuleDirectives(Path base) throws Exception { newOpens, module.uses(), module.provides()); - byte[] newClassFileBytes = ClassFile.of().transform(cf, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute) + byte[] newClassFileBytes = ClassFile.of().transformClass(cf, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute) .andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(newModule)))); try (OutputStream out = Files.newOutputStream(moduleInfo)) { out.write(newClassFileBytes); diff --git a/test/langtools/tools/javap/UndefinedAccessFlagTest.java b/test/langtools/tools/javap/UndefinedAccessFlagTest.java index bb531fa369c16..822c9e20f3533 100644 --- a/test/langtools/tools/javap/UndefinedAccessFlagTest.java +++ b/test/langtools/tools/javap/UndefinedAccessFlagTest.java @@ -70,7 +70,7 @@ void test(TestLocation location) throws Throwable { )) { cm = cf.parse(is.readAllBytes()); } - var bytes = cf.transform(cm, (cb, ce) -> { + var bytes = cf.transformClass(cm, (cb, ce) -> { switch (ce) { case AccessFlags flags when location == TestLocation.CLASS -> cb .withFlags(flags.flagsMask() | ACC_PRIVATE); diff --git a/test/micro/org/openjdk/bench/jdk/classfile/AdHocAdapt.java b/test/micro/org/openjdk/bench/jdk/classfile/AdHocAdapt.java index 99ef450851e9c..c74956755b04d 100644 --- a/test/micro/org/openjdk/bench/jdk/classfile/AdHocAdapt.java +++ b/test/micro/org/openjdk/bench/jdk/classfile/AdHocAdapt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,6 +57,6 @@ public enum X { public void transform(Blackhole bh) { var cc = ClassFile.of(); for (byte[] bytes : classes) - bh.consume(cc.transform(cc.parse(bytes), transform.transform)); + bh.consume(cc.transformClass(cc.parse(bytes), transform.transform)); } } diff --git a/test/micro/org/openjdk/bench/jdk/classfile/ClassfileBenchmark.java b/test/micro/org/openjdk/bench/jdk/classfile/ClassfileBenchmark.java index 05dd4b1758351..c07eff075c959 100644 --- a/test/micro/org/openjdk/bench/jdk/classfile/ClassfileBenchmark.java +++ b/test/micro/org/openjdk/bench/jdk/classfile/ClassfileBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,18 +99,18 @@ private static void consume(CompoundElement<?> parent) { @Benchmark @BenchmarkMode(Mode.Throughput) public void transformWithSharedCP(Blackhole bh) { - bh.consume(sharedCP.transform(benchModel, threeLevelNoop)); + bh.consume(sharedCP.transformClass(benchModel, threeLevelNoop)); } @Benchmark @BenchmarkMode(Mode.Throughput) public void transformWithNewCP(Blackhole bh) { - bh.consume(newCP.transform(benchModel, threeLevelNoop)); + bh.consume(newCP.transformClass(benchModel, threeLevelNoop)); } @Benchmark @BenchmarkMode(Mode.Throughput) public void transformWithAddedNOP(Blackhole bh) { - bh.consume(sharedCP.transform(benchModel, addNOP)); + bh.consume(sharedCP.transformClass(benchModel, addNOP)); } } diff --git a/test/micro/org/openjdk/bench/jdk/classfile/ParseOptions.java b/test/micro/org/openjdk/bench/jdk/classfile/ParseOptions.java index ed5e0f150acdc..29c555c4a6081 100644 --- a/test/micro/org/openjdk/bench/jdk/classfile/ParseOptions.java +++ b/test/micro/org/openjdk/bench/jdk/classfile/ParseOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,7 @@ public void transformNoDebug(Blackhole bh) { var cc = ClassFile.of(ClassFile.DebugElementsOption.DROP_DEBUG); for (byte[] aClass : classes) { ClassModel cm = cc.parse(aClass); - bh.consume(cc.transform(cm, threeLevelNoop)); + bh.consume(cc.transformClass(cm, threeLevelNoop)); } } @@ -52,7 +52,7 @@ public void transformNoStackmap(Blackhole bh) { var cc = ClassFile.of(ClassFile.StackMapsOption.DROP_STACK_MAPS); for (byte[] aClass : classes) { ClassModel cm = cc.parse(aClass); - bh.consume(cc.transform(cm, threeLevelNoop)); + bh.consume(cc.transformClass(cm, threeLevelNoop)); } } @@ -62,7 +62,7 @@ public void transformNoLineNumbers(Blackhole bh) { var cc = ClassFile.of(ClassFile.LineNumbersOption.DROP_LINE_NUMBERS); for (byte[] aClass : classes) { ClassModel cm = cc.parse(aClass); - bh.consume(cc.transform(cm, threeLevelNoop)); + bh.consume(cc.transformClass(cm, threeLevelNoop)); } } } diff --git a/test/micro/org/openjdk/bench/jdk/classfile/RebuildMethodBodies.java b/test/micro/org/openjdk/bench/jdk/classfile/RebuildMethodBodies.java index d5e77c1a2a7e7..07deec0ae489a 100644 --- a/test/micro/org/openjdk/bench/jdk/classfile/RebuildMethodBodies.java +++ b/test/micro/org/openjdk/bench/jdk/classfile/RebuildMethodBodies.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,7 +88,7 @@ public void unshared() { } private static void transform(ClassFile cc, ClassModel clm) { - cc.transform(clm, ClassTransform.transformingMethodBodies((cob, coe) -> { + cc.transformClass(clm, ClassTransform.transformingMethodBodies((cob, coe) -> { switch (coe) { case FieldInstruction i -> cob.fieldAccess(i.opcode(), i.owner().asSymbol(), i.name().stringValue(), i.typeSymbol()); diff --git a/test/micro/org/openjdk/bench/jdk/classfile/Transforms.java b/test/micro/org/openjdk/bench/jdk/classfile/Transforms.java index def55b5f20c40..d49897dc9c2a0 100644 --- a/test/micro/org/openjdk/bench/jdk/classfile/Transforms.java +++ b/test/micro/org/openjdk/bench/jdk/classfile/Transforms.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -184,7 +184,7 @@ public enum NoOpTransform { shared ? options : Stream.concat(Stream.of(options), Stream.of(ClassFile.ConstantPoolSharingOption.NEW_POOL)).toArray(ClassFile.Option[]::new)); - this.transform = bytes -> cc.transform(cc.parse(bytes), classTransform); + this.transform = bytes -> cc.transformClass(cc.parse(bytes), classTransform); } } @@ -198,7 +198,7 @@ public enum InjectNopTransform { NOP_SHARED(bytes -> { var cc = ClassFile.of(); ClassModel cm = cc.parse(bytes); - return cc.transform(cm, (cb, ce) -> { + return cc.transformClass(cm, (cb, ce) -> { if (ce instanceof MethodModel mm) { cb.transformMethod(mm, (mb, me) -> { if (me instanceof CodeModel xm) { @@ -239,7 +239,7 @@ public enum SimpleTransform { HIGH_SHARED_ADD_FIELD(bytes -> { var cc = ClassFile.of(); ClassModel cm = cc.parse(bytes); - return cc.transform(cm, new ClassTransform() { + return cc.transformClass(cm, new ClassTransform() { @Override public void accept(ClassBuilder builder, ClassElement element) { builder.with(element); @@ -277,7 +277,7 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str HIGH_SHARED_DEL_METHOD(bytes -> { var cc = ClassFile.of(); ClassModel cm = cc.parse(bytes); - return cc.transform(cm, (builder, element) -> { + return cc.transformClass(cm, (builder, element) -> { if (!(element instanceof MethodModel mm)) builder.with(element); }); From 7bc8f9c150cbf457edf6144adba734ecd5ca5a0f Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Wed, 3 Jul 2024 05:55:28 +0000 Subject: [PATCH 274/471] 8335589: Fix -Wzero-as-null-pointer-constant warnings in IdealLoopTree ctor Reviewed-by: thartmann --- src/hotspot/share/opto/loopnode.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp index 79faf9c931dd2..448c29b6976bb 100644 --- a/src/hotspot/share/opto/loopnode.hpp +++ b/src/hotspot/share/opto/loopnode.hpp @@ -607,7 +607,7 @@ class IdealLoopTree : public ResourceObj { bool _allow_optimizations; // Allow loop optimizations IdealLoopTree( PhaseIdealLoop* phase, Node *head, Node *tail ) - : _parent(0), _next(0), _child(0), + : _parent(nullptr), _next(nullptr), _child(nullptr), _head(head), _tail(tail), _phase(phase), _local_loop_unroll_limit(0), _local_loop_unroll_factor(0), From f3f90dc11a5cbc146a5ef8a73eadf4168373838d Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Wed, 3 Jul 2024 05:57:49 +0000 Subject: [PATCH 275/471] 8335592: Fix -Wzero-as-null-pointer-constant warnings in RootNode ctor Reviewed-by: thartmann --- src/hotspot/share/opto/rootnode.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/share/opto/rootnode.hpp b/src/hotspot/share/opto/rootnode.hpp index 40e812023c197..3838578b4dbbf 100644 --- a/src/hotspot/share/opto/rootnode.hpp +++ b/src/hotspot/share/opto/rootnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ // procedure start. class RootNode : public LoopNode { public: - RootNode( ) : LoopNode(0,0) { + RootNode( ) : LoopNode(nullptr, nullptr) { init_class_id(Class_Root); del_req(2); del_req(1); From 77a7078b82fd0cb3cfa13685072f04fdef33758b Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Wed, 3 Jul 2024 06:00:20 +0000 Subject: [PATCH 276/471] 8335593: Fix -Wzero-as-null-pointer-constant warning in Type_Array ctor Reviewed-by: thartmann --- src/hotspot/share/opto/phaseX.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/share/opto/phaseX.hpp b/src/hotspot/share/opto/phaseX.hpp index 0025f4dca4695..7843bd39aeaab 100644 --- a/src/hotspot/share/opto/phaseX.hpp +++ b/src/hotspot/share/opto/phaseX.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -125,7 +125,7 @@ class Type_Array : public AnyObj { const Type **_types; void grow( uint i ); // Grow array node to fit public: - Type_Array(Arena *a) : _a(a), _max(0), _types(0) {} + Type_Array(Arena *a) : _a(a), _max(0), _types(nullptr) {} const Type *operator[] ( uint i ) const // Lookup, or null for not mapped { return (i<_max) ? _types[i] : (Type*)nullptr; } const Type *fast_lookup(uint i) const{assert(i<_max,"oob");return _types[i];} From 4d2f73764bcd5ff62fbdb9d406d4180ae09613ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C3=B6=20Barany?= <gbarany@openjdk.org> Date: Wed, 3 Jul 2024 08:08:22 +0000 Subject: [PATCH 277/471] 8335357: Delete HotSpotJDKReflection.oopSizeOffset Reviewed-by: dnsimon --- .../classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java index 21c6fb3dc0e58..6ee925cd3a7b0 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,9 +108,6 @@ boolean equals(HotSpotObjectConstantImpl a, HotSpotObjectConstantImpl b) { return resolveObject(a) == resolveObject(b) && a.isCompressed() == b.isCompressed(); } - // This field is being kept around for compatibility with libgraal - @SuppressWarnings("unused") private long oopSizeOffset; - @Override ResolvedJavaMethod.Parameter[] getParameters(HotSpotResolvedJavaMethodImpl javaMethod) { java.lang.reflect.Parameter[] javaParameters = getMethod(javaMethod).getParameters(); From 6c84e9c8cb71aac103901c0d92fe6ae51aabff15 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Wed, 3 Jul 2024 08:42:43 +0000 Subject: [PATCH 278/471] 8335544: Serial: Remove unused _should_allocate_from_space Reviewed-by: iwalulya --- src/hotspot/share/gc/serial/defNewGeneration.cpp | 1 - src/hotspot/share/gc/serial/defNewGeneration.hpp | 12 ------------ 2 files changed, 13 deletions(-) diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index 593977030cbf1..7729ea71f027b 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -229,7 +229,6 @@ DefNewGeneration::DefNewGeneration(ReservedSpace rs, _promotion_failed(false), _preserved_marks_set(false /* in_c_heap */), _promo_failure_drain_in_progress(false), - _should_allocate_from_space(false), _string_dedup_requests() { MemRegion cmr((HeapWord*)_virtual_space.low(), diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp index 0cf2545421f72..d0af3114b303e 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.hpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp @@ -119,18 +119,6 @@ class DefNewGeneration: public Generation { size_t _max_eden_size; size_t _max_survivor_size; - // Allocation support - bool _should_allocate_from_space; - bool should_allocate_from_space() const { - return _should_allocate_from_space; - } - void clear_should_allocate_from_space() { - _should_allocate_from_space = false; - } - void set_should_allocate_from_space() { - _should_allocate_from_space = true; - } - // Tenuring void adjust_desired_tenuring_threshold(); From c06b75ff88babf57bdcd0919ea177ff363fd858b Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Wed, 3 Jul 2024 11:12:08 +0000 Subject: [PATCH 279/471] 8335591: Fix -Wzero-as-null-pointer-constant warnings in ConcurrentHashTable Reviewed-by: chagedorn --- .../share/utilities/concurrentHashTable.inline.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/utilities/concurrentHashTable.inline.hpp b/src/hotspot/share/utilities/concurrentHashTable.inline.hpp index a83b6dd8a58d0..78c7e148bbb3c 100644 --- a/src/hotspot/share/utilities/concurrentHashTable.inline.hpp +++ b/src/hotspot/share/utilities/concurrentHashTable.inline.hpp @@ -318,7 +318,7 @@ inline bool ConcurrentHashTable<CONFIG, F>:: } else { return false; } - _invisible_epoch = 0; + _invisible_epoch = nullptr; _resize_lock_owner = locker; return true; } @@ -345,14 +345,14 @@ inline void ConcurrentHashTable<CONFIG, F>:: } } while(true); _resize_lock_owner = locker; - _invisible_epoch = 0; + _invisible_epoch = nullptr; } template <typename CONFIG, MEMFLAGS F> inline void ConcurrentHashTable<CONFIG, F>:: unlock_resize_lock(Thread* locker) { - _invisible_epoch = 0; + _invisible_epoch = nullptr; assert(locker == _resize_lock_owner, "Not unlocked by locker."); _resize_lock_owner = nullptr; _resize_lock->unlock(); @@ -1016,7 +1016,7 @@ ConcurrentHashTable(size_t log2size, size_t log2size_limit, size_t grow_hint, bo : _context(context), _new_table(nullptr), _log2_size_limit(log2size_limit), _log2_start_size(log2size), _grow_hint(grow_hint), _size_limit_reached(false), _resize_lock_owner(nullptr), - _invisible_epoch(0) + _invisible_epoch(nullptr) { if (enable_statistics) { _stats_rate = new TableRateStatistics(); From 350f9c1947b0eab3ee233516ceefca1e25de9583 Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Wed, 3 Jul 2024 11:36:14 +0000 Subject: [PATCH 280/471] 8322812: Manpage for jcmd is missing JFR.view command Reviewed-by: kevinw, mgronlun --- src/jdk.jcmd/share/man/jcmd.1 | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/jdk.jcmd/share/man/jcmd.1 b/src/jdk.jcmd/share/man/jcmd.1 index 2befaf5a94993..1a8aefde06e8b 100644 --- a/src/jdk.jcmd/share/man/jcmd.1 +++ b/src/jdk.jcmd/share/man/jcmd.1 @@ -681,6 +681,55 @@ If no path is provided, the data from the recording is discarded. value) .RE .TP +\f[V]JFR.view\f[R] [\f[I]options\f[R]] +Display event data in predefined views. +.RS +.PP +Impact: Medium +.PP +\f[B]Note:\f[R] +.PP +The \f[I]options\f[R] must be specified using either \f[I]key\f[R] or +\f[I]key\f[R]\f[V]=\f[R]\f[I]value\f[R] syntax. +If no parameters are entered, then a list of available views are +displayed. +.PP +\f[I]options\f[R]: +.IP \[bu] 2 +\f[V]cell-height\f[R]: (Optional) Maximum number of rows in a table +cell. +(INT, default value depends on the view) +.IP \[bu] 2 +\f[V]maxage\f[R]: (Optional) Length of time for the view to span. +(INT followed by \[aq]s\[aq] for seconds \[aq]m\[aq] for minutes or +\[aq]h\[aq] for hours, default value is 10m) +.IP \[bu] 2 +\f[V]maxsize\f[R]: (Optional) Maximum size for the view to span in bytes +if one of the following suffixes is not used: \[aq]m\[aq] or \[aq]M\[aq] +for megabytes OR \[aq]g\[aq] or \[aq]G\[aq] for gigabytes. +(STRING, default value is 32MB) +.IP \[bu] 2 +\f[V]truncate\f[R]: (Optional) Maximum number of rows in a table cell. +(INT, default value depends on the view) +.IP \[bu] 2 +\f[V]verbose\f[R]: (Optional) Displays the query that makes up the view. +(BOOLEAN, default value is false) +.IP \[bu] 2 +\f[V]width\f[R]: (Optional) The width of the view in characters. +(INT, default value depends on the view) +.PP +\f[I]arguments\f[R]: +.IP \[bu] 2 +\f[V]view\f[R]: Name of the view or event type to display. +Use \f[V]help JFR.view\f[R] to see a list of available views. +(STRING, no default value) +.PP +The view parameter can be an event type name. +Use \f[V]JFR.view types\f[R] to see a list. +To display all views, use \f[V]JFR.view all-views\f[R]. +To display all events, use \f[V]JFR.view all-events\f[R]. +.RE +.TP \f[V]JVMTI.agent_load\f[R] [\f[I]arguments\f[R]] Loads JVMTI native agent. .RS From 6db4c6a772df856fc3099c32a5b2c102a30d360c Mon Sep 17 00:00:00 2001 From: Qizheng Xing <qxing@openjdk.org> Date: Wed, 3 Jul 2024 12:12:00 +0000 Subject: [PATCH 281/471] 8335536: Fix assertion failure in IdealGraphPrinter when append is true Reviewed-by: thartmann, chagedorn, tholenstein --- src/hotspot/share/opto/idealGraphPrinter.cpp | 30 +++++++++++++------- src/hotspot/share/opto/idealGraphPrinter.hpp | 3 +- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/hotspot/share/opto/idealGraphPrinter.cpp b/src/hotspot/share/opto/idealGraphPrinter.cpp index 8a9da980893b0..4b813252ff9cf 100644 --- a/src/hotspot/share/opto/idealGraphPrinter.cpp +++ b/src/hotspot/share/opto/idealGraphPrinter.cpp @@ -143,21 +143,24 @@ void IdealGraphPrinter::init(const char* file_name, bool use_multiple_files, boo _depth = 0; _current_method = nullptr; _network_stream = nullptr; + _append = append; if (file_name != nullptr) { - init_file_stream(file_name, use_multiple_files, append); + init_file_stream(file_name, use_multiple_files); } else { init_network_stream(); } _xml = new (mtCompiler) xmlStream(_output); - if (!append) { + if (!_append) { head(TOP_ELEMENT); } } // Destructor, close file or network stream IdealGraphPrinter::~IdealGraphPrinter() { - tail(TOP_ELEMENT); + if (!_append) { + tail(TOP_ELEMENT); + } // tty->print_cr("Walk time: %d", (int)_walk_time.milliseconds()); // tty->print_cr("Output time: %d", (int)_output_time.milliseconds()); @@ -860,10 +863,10 @@ void IdealGraphPrinter::print(const char *name, Node *node) { _xml->flush(); } -void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multiple_files, bool append) { +void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multiple_files) { ThreadCritical tc; if (use_multiple_files && _file_count != 0) { - assert(!append, "append should only be used for debugging with a single file"); + assert(!_append, "append should only be used for debugging with a single file"); ResourceMark rm; stringStream st; const char* dot = strrchr(file_name, '.'); @@ -875,10 +878,10 @@ void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multipl } _output = new (mtCompiler) fileStream(st.as_string(), "w"); } else { - _output = new (mtCompiler) fileStream(file_name, append ? "a" : "w"); + _output = new (mtCompiler) fileStream(file_name, _append ? "a" : "w"); } if (use_multiple_files) { - assert(!append, "append should only be used for debugging with a single file"); + assert(!_append, "append should only be used for debugging with a single file"); _file_count++; } } @@ -909,9 +912,16 @@ void IdealGraphPrinter::update_compiled_method(ciMethod* current_method) { assert(C != nullptr, "must already be set"); if (current_method != _current_method) { // If a different method, end the old and begin with the new one. - end_method(); - _current_method = nullptr; - begin_method(); + if (_append) { + // Do not call `end_method` if we are appending, just update `_current_method`, + // because `begin_method` is not called in the constructor in append mode. + _current_method = current_method; + } else { + // End the old method and begin a new one. + // Don't worry about `_current_method`, `end_method` will clear it. + end_method(); + begin_method(); + } } } diff --git a/src/hotspot/share/opto/idealGraphPrinter.hpp b/src/hotspot/share/opto/idealGraphPrinter.hpp index 11b0b6e5ea169..65d7f4b547384 100644 --- a/src/hotspot/share/opto/idealGraphPrinter.hpp +++ b/src/hotspot/share/opto/idealGraphPrinter.hpp @@ -96,6 +96,7 @@ class IdealGraphPrinter : public CHeapObj<mtCompiler> { bool _traverse_outs; Compile *C; double _max_freq; + bool _append; void print_method(ciMethod* method, int bci, InlineTree* tree); void print_inline_tree(InlineTree* tree); @@ -118,7 +119,7 @@ class IdealGraphPrinter : public CHeapObj<mtCompiler> { void head(const char *name); void text(const char *s); void init(const char* file_name, bool use_multiple_files, bool append); - void init_file_stream(const char* file_name, bool use_multiple_files, bool append); + void init_file_stream(const char* file_name, bool use_multiple_files); void init_network_stream(); IdealGraphPrinter(); ~IdealGraphPrinter(); From 5866b16dbca3f63770c8792d204dabdf49b59839 Mon Sep 17 00:00:00 2001 From: Feilong Jiang <fjiang@openjdk.org> Date: Wed, 3 Jul 2024 12:12:12 +0000 Subject: [PATCH 282/471] 8335411: RISC-V: Optimize encode_heap_oop when oop is not null Reviewed-by: fyang, rehn --- .../cpu/riscv/macroAssembler_riscv.cpp | 47 ++++++++++++++++++- .../cpu/riscv/macroAssembler_riscv.hpp | 4 +- src/hotspot/cpu/riscv/riscv.ad | 14 +++++- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index b707b20f6692a..a04c02bbc45bd 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -1,7 +1,7 @@ /* * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved. - * Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020, 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 @@ -2664,6 +2664,51 @@ void MacroAssembler::encode_heap_oop(Register d, Register s) { } } +void MacroAssembler::encode_heap_oop_not_null(Register r) { +#ifdef ASSERT + if (CheckCompressedOops) { + Label ok; + bnez(r, ok); + stop("null oop passed to encode_heap_oop_not_null"); + bind(ok); + } +#endif + verify_oop_msg(r, "broken oop in encode_heap_oop_not_null"); + if (CompressedOops::base() != nullptr) { + sub(r, r, xheapbase); + } + if (CompressedOops::shift() != 0) { + assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong"); + srli(r, r, LogMinObjAlignmentInBytes); + } +} + +void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) { +#ifdef ASSERT + if (CheckCompressedOops) { + Label ok; + bnez(src, ok); + stop("null oop passed to encode_heap_oop_not_null2"); + bind(ok); + } +#endif + verify_oop_msg(src, "broken oop in encode_heap_oop_not_null2"); + + Register data = src; + if (CompressedOops::base() != nullptr) { + sub(dst, src, xheapbase); + data = dst; + } + if (CompressedOops::shift() != 0) { + assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong"); + srli(dst, data, LogMinObjAlignmentInBytes); + data = dst; + } + if (data == src) { + mv(dst, src); + } +} + void MacroAssembler::load_klass(Register dst, Register src, Register tmp) { assert_different_registers(dst, tmp); assert_different_registers(src, tmp); diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp index ddd3c48a93e10..ea2b9229eab47 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp @@ -1,7 +1,7 @@ /* * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved. - * Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020, 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 @@ -206,6 +206,8 @@ class MacroAssembler: public Assembler { void decode_heap_oop_not_null(Register dst, Register src); void decode_heap_oop(Register d, Register s); void decode_heap_oop(Register r) { decode_heap_oop(r, r); } + void encode_heap_oop_not_null(Register r); + void encode_heap_oop_not_null(Register dst, Register src); void encode_heap_oop(Register d, Register s); void encode_heap_oop(Register r) { encode_heap_oop(r, r); }; void load_heap_oop(Register dst, Address src, Register tmp1, diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 4ed449032d6e9..e2a1fcf621fab 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1,7 +1,7 @@ // // Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. // Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved. -// Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved. +// Copyright (c) 2020, 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 @@ -8404,6 +8404,7 @@ instruct round_float_reg(iRegINoSp dst, fRegF src, fRegF ftmp) %{ // Convert oop pointer into compressed form instruct encodeHeapOop(iRegNNoSp dst, iRegP src) %{ + predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); match(Set dst (EncodeP src)); ins_cost(ALU_COST); format %{ "encode_heap_oop $dst, $src\t#@encodeHeapOop" %} @@ -8415,6 +8416,17 @@ instruct encodeHeapOop(iRegNNoSp dst, iRegP src) %{ ins_pipe(pipe_class_default); %} +instruct encodeHeapOop_not_null(iRegNNoSp dst, iRegP src) %{ + predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull); + match(Set dst (EncodeP src)); + ins_cost(ALU_COST); + format %{ "encode_heap_oop_not_null $dst, $src\t#@encodeHeapOop_not_null" %} + ins_encode %{ + __ encode_heap_oop_not_null($dst$$Register, $src$$Register); + %} + ins_pipe(pipe_class_default); +%} + instruct decodeHeapOop(iRegPNoSp dst, iRegN src) %{ predicate(n->bottom_type()->is_ptr()->ptr() != TypePtr::NotNull && n->bottom_type()->is_ptr()->ptr() != TypePtr::Constant); From 6923a5114b2a9f02f0d6f0fefc21141ac3b9322a Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Wed, 3 Jul 2024 12:57:26 +0000 Subject: [PATCH 283/471] 8335607: Serial: Remove unused collection_attempt_is_safe Reviewed-by: tschatzl --- src/hotspot/share/gc/serial/defNewGeneration.cpp | 11 ----------- src/hotspot/share/gc/serial/defNewGeneration.hpp | 7 ------- 2 files changed, 18 deletions(-) diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index 7729ea71f027b..acf7e23910367 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -834,17 +834,6 @@ void DefNewGeneration::reset_scratch() { } } -bool DefNewGeneration::collection_attempt_is_safe() { - if (!to()->is_empty()) { - log_trace(gc)(":: to is not empty ::"); - return false; - } - if (_old_gen == nullptr) { - _old_gen = SerialHeap::heap()->old_gen(); - } - return _old_gen->promotion_attempt_is_safe(used()); -} - void DefNewGeneration::gc_epilogue(bool full) { assert(!GCLocker::is_active(), "We should not be executing here"); // update the generation and space performance counters diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp index d0af3114b303e..5c8dd08e40b82 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.hpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp @@ -228,13 +228,6 @@ class DefNewGeneration: public Generation { // GC support void compute_new_size(); - // Returns true if the collection is likely to be safely - // completed. Even if this method returns true, a collection - // may not be guaranteed to succeed, and the system should be - // able to safely unwind and recover from that failure, albeit - // at some additional cost. - bool collection_attempt_is_safe(); - bool collect(bool clear_all_soft_refs); HeapWord* expand_and_allocate(size_t size, bool is_tlab); From 5a8af2b8b93672de9b3a3e73e6984506980da932 Mon Sep 17 00:00:00 2001 From: Arseny Bochkarev <arseny.bochkarev@syntacore.com> Date: Wed, 3 Jul 2024 14:09:59 +0000 Subject: [PATCH 284/471] 8335615: Clean up left-overs from 8317721 Reviewed-by: fyang --- src/hotspot/cpu/riscv/macroAssembler_riscv.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index a04c02bbc45bd..b3ae5fbcdd02b 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -1494,10 +1494,9 @@ void MacroAssembler::update_word_crc32(Register crc, Register v, Register tmp1, xorr(crc, crc, tmp2); lwu(tmp2, Address(tmp3)); - if (upper) { - tmp1 = v; + // It is more optimal to use 'srli' instead of 'srliw' for case when it is not necessary to clean upper bits + if (upper) srli(tmp1, v, 24); - } else srliw(tmp1, v, 24); From cf4f2b53d6174a808f8b45f0bb848efd5bd91c3c Mon Sep 17 00:00:00 2001 From: Ivan Walulya <iwalulya@openjdk.org> Date: Wed, 3 Jul 2024 15:12:40 +0000 Subject: [PATCH 285/471] 8332517: G1: Refactor G1AllocRegion Reviewed-by: tschatzl, ayang --- src/hotspot/share/gc/g1/g1AllocRegion.cpp | 46 +++++------ src/hotspot/share/gc/g1/g1AllocRegion.hpp | 56 +++++-------- .../share/gc/g1/g1AllocRegion.inline.hpp | 38 +++------ src/hotspot/share/gc/g1/g1Allocator.cpp | 2 +- src/hotspot/share/gc/g1/g1HeapRegion.hpp | 22 +++-- .../share/gc/g1/g1HeapRegion.inline.hpp | 82 ++++++++----------- 6 files changed, 99 insertions(+), 147 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1AllocRegion.cpp b/src/hotspot/share/gc/g1/g1AllocRegion.cpp index a205cf71ee673..c4ab81cda8fc4 100644 --- a/src/hotspot/share/gc/g1/g1AllocRegion.cpp +++ b/src/hotspot/share/gc/g1/g1AllocRegion.cpp @@ -100,16 +100,13 @@ size_t G1AllocRegion::retire_internal(G1HeapRegion* alloc_region, bool fill_up) // it will never be empty. size_t waste = 0; assert_alloc_region(!alloc_region->is_empty(), - "the alloc region should never be empty"); + "the alloc region should never be empty"); if (fill_up) { waste = fill_up_remaining_space(alloc_region); } - assert_alloc_region(alloc_region->used() >= _used_bytes_before, "invariant"); - size_t allocated_bytes = alloc_region->used() - _used_bytes_before; - retire_region(alloc_region, allocated_bytes); - _used_bytes_before = 0; + retire_region(alloc_region); return waste; } @@ -132,15 +129,14 @@ size_t G1AllocRegion::retire(bool fill_up) { HeapWord* G1AllocRegion::new_alloc_region_and_allocate(size_t word_size) { assert_alloc_region(_alloc_region == _dummy_region, "pre-condition"); - assert_alloc_region(_used_bytes_before == 0, "pre-condition"); trace("attempting region allocation"); G1HeapRegion* new_alloc_region = allocate_new_region(word_size); if (new_alloc_region != nullptr) { new_alloc_region->reset_pre_dummy_top(); - // Need to do this before the allocation - _used_bytes_before = new_alloc_region->used(); - HeapWord* result = allocate(new_alloc_region, word_size); + + assert(new_alloc_region->is_empty(), "new regions should be empty"); + HeapWord* result = new_alloc_region->allocate(word_size); assert_alloc_region(result != nullptr, "the allocation should succeeded"); OrderAccess::storestore(); @@ -159,7 +155,7 @@ HeapWord* G1AllocRegion::new_alloc_region_and_allocate(size_t word_size) { void G1AllocRegion::init() { trace("initializing"); - assert_alloc_region(_alloc_region == nullptr && _used_bytes_before == 0, "pre-condition"); + assert_alloc_region(_alloc_region == nullptr, "pre-condition"); assert_alloc_region(_dummy_region != nullptr, "should have been set"); _alloc_region = _dummy_region; _count = 0; @@ -168,16 +164,9 @@ void G1AllocRegion::init() { void G1AllocRegion::set(G1HeapRegion* alloc_region) { trace("setting"); - // We explicitly check that the region is not empty to make sure we - // maintain the "the alloc region cannot be empty" invariant. - assert_alloc_region(alloc_region != nullptr && !alloc_region->is_empty(), "pre-condition"); - assert_alloc_region(_alloc_region == _dummy_region && - _used_bytes_before == 0 && _count == 0, - "pre-condition"); + assert_alloc_region(_alloc_region == _dummy_region && _count == 0, "pre-condition"); - _used_bytes_before = alloc_region->used(); - _alloc_region = alloc_region; - _count += 1; + update_alloc_region(alloc_region); trace("set"); } @@ -237,7 +226,7 @@ void G1AllocRegion::trace(const char* str, size_t min_word_size, size_t desired_ if (detailed_info) { if (result != nullptr) { out->print(" min " SIZE_FORMAT " desired " SIZE_FORMAT " actual " SIZE_FORMAT " " PTR_FORMAT, - min_word_size, desired_word_size, actual_word_size, p2i(result)); + min_word_size, desired_word_size, actual_word_size, p2i(result)); } else if (min_word_size != 0) { out->print(" min " SIZE_FORMAT " desired " SIZE_FORMAT, min_word_size, desired_word_size); } @@ -252,7 +241,6 @@ G1AllocRegion::G1AllocRegion(const char* name, uint node_index) : _alloc_region(nullptr), _count(0), - _used_bytes_before(0), _name(name), _node_index(node_index) { } @@ -261,9 +249,8 @@ G1HeapRegion* MutatorAllocRegion::allocate_new_region(size_t word_size) { return _g1h->new_mutator_alloc_region(word_size, _node_index); } -void MutatorAllocRegion::retire_region(G1HeapRegion* alloc_region, - size_t allocated_bytes) { - _g1h->retire_mutator_alloc_region(alloc_region, allocated_bytes); +void MutatorAllocRegion::retire_region(G1HeapRegion* alloc_region) { + _g1h->retire_mutator_alloc_region(alloc_region, alloc_region->used()); } void MutatorAllocRegion::init() { @@ -346,9 +333,11 @@ G1HeapRegion* G1GCAllocRegion::allocate_new_region(size_t word_size) { return _g1h->new_gc_alloc_region(word_size, _purpose, _node_index); } -void G1GCAllocRegion::retire_region(G1HeapRegion* alloc_region, - size_t allocated_bytes) { +void G1GCAllocRegion::retire_region(G1HeapRegion* alloc_region) { + assert(alloc_region->used() >= _used_bytes_before, "invariant"); + size_t allocated_bytes = alloc_region->used() - _used_bytes_before; _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes, _purpose); + _used_bytes_before = 0; } size_t G1GCAllocRegion::retire(bool fill_up) { @@ -360,3 +349,8 @@ size_t G1GCAllocRegion::retire(bool fill_up) { } return end_waste; } + +void G1GCAllocRegion::reuse(G1HeapRegion* alloc_region) { + _used_bytes_before = alloc_region->used(); + set(alloc_region); +} diff --git a/src/hotspot/share/gc/g1/g1AllocRegion.hpp b/src/hotspot/share/gc/g1/g1AllocRegion.hpp index a8903fd54f148..391ded283885f 100644 --- a/src/hotspot/share/gc/g1/g1AllocRegion.hpp +++ b/src/hotspot/share/gc/g1/g1AllocRegion.hpp @@ -63,11 +63,6 @@ class G1AllocRegion : public CHeapObj<mtGC> { // distinct regions this object can used during an active interval. uint _count; - // When we set up a new active region we save its used bytes in this - // field so that, when we retire it, we can calculate how much space - // we allocated in it. - size_t _used_bytes_before; - // Useful for debugging and tracing. const char* _name; @@ -94,24 +89,14 @@ class G1AllocRegion : public CHeapObj<mtGC> { // The memory node index this allocation region belongs to. uint _node_index; + void set(G1HeapRegion* alloc_region); + // Reset the alloc region to point the dummy region. void reset_alloc_region(); - // Perform a non-MT-safe allocation out of the given region. - inline HeapWord* allocate(G1HeapRegion* alloc_region, - size_t word_size); - // Perform a MT-safe allocation out of the given region. inline HeapWord* par_allocate(G1HeapRegion* alloc_region, size_t word_size); - // Perform a MT-safe allocation out of the given region, with the given - // minimum and desired size. Returns the actual size allocated (between - // minimum and desired size) in actual_word_size if the allocation has been - // successful. - inline HeapWord* par_allocate(G1HeapRegion* alloc_region, - size_t min_word_size, - size_t desired_word_size, - size_t* actual_word_size); // Ensure that the region passed as a parameter has been filled up // so that no one else can allocate out of it any more. @@ -131,8 +116,7 @@ class G1AllocRegion : public CHeapObj<mtGC> { static G1CollectedHeap* _g1h; virtual G1HeapRegion* allocate_new_region(size_t word_size) = 0; - virtual void retire_region(G1HeapRegion* alloc_region, - size_t allocated_bytes) = 0; + virtual void retire_region(G1HeapRegion* alloc_region) = 0; G1AllocRegion(const char* name, bool bot_updates, uint node_index); @@ -173,12 +157,6 @@ class G1AllocRegion : public CHeapObj<mtGC> { // Should be called before we start using this object. virtual void init(); - // This can be used to set the active region to a specific - // region. (Use Example: we try to retain the last old GC alloc - // region that we've used during a GC and we can use set() to - // re-instate it at the beginning of the next GC.) - void set(G1HeapRegion* alloc_region); - // Should be called when we want to release the active region which // is returned after it's been retired. virtual G1HeapRegion* release(); @@ -205,10 +183,9 @@ class MutatorAllocRegion : public G1AllocRegion { // in it and the free size in the currently retained region, if any. bool should_retain(G1HeapRegion* region); protected: - virtual G1HeapRegion* allocate_new_region(size_t word_size); - virtual void retire_region(G1HeapRegion* alloc_region, size_t allocated_bytes); - virtual size_t retire(bool fill_up); - + G1HeapRegion* allocate_new_region(size_t word_size) override; + void retire_region(G1HeapRegion* alloc_region) override; + size_t retire(bool fill_up) override; public: MutatorAllocRegion(uint node_index) : G1AllocRegion("Mutator Alloc Region", false /* bot_updates */, node_index), @@ -231,27 +208,36 @@ class MutatorAllocRegion : public G1AllocRegion { // This specialization of release() makes sure that the retained alloc // region is retired and set to null. - virtual G1HeapRegion* release(); + G1HeapRegion* release() override; - virtual void init(); + void init() override; }; // Common base class for allocation regions used during GC. class G1GCAllocRegion : public G1AllocRegion { + // When we set up a new active region we save its used bytes in this + // field so that, when we retire it, we can calculate how much space + // we allocated in it. + size_t _used_bytes_before; protected: G1EvacStats* _stats; G1HeapRegionAttr::region_type_t _purpose; - virtual G1HeapRegion* allocate_new_region(size_t word_size); - virtual void retire_region(G1HeapRegion* alloc_region, size_t allocated_bytes); + G1HeapRegion* allocate_new_region(size_t word_size) override; + void retire_region(G1HeapRegion* alloc_region) override; - virtual size_t retire(bool fill_up); + size_t retire(bool fill_up) override; G1GCAllocRegion(const char* name, bool bot_updates, G1EvacStats* stats, G1HeapRegionAttr::region_type_t purpose, uint node_index = G1NUMA::AnyNodeIndex) - : G1AllocRegion(name, bot_updates, node_index), _stats(stats), _purpose(purpose) { + : G1AllocRegion(name, bot_updates, node_index), _used_bytes_before(0), _stats(stats), _purpose(purpose) { assert(stats != nullptr, "Must pass non-null PLAB statistics"); } +public: + // This can be used to reuse a specific region. (Use Example: we try to retain the + // last old GC alloc region that we've used during a GC and we can use reuse() to + // re-instate it at the beginning of the next GC.) + void reuse(G1HeapRegion* alloc_region); }; class SurvivorGCAllocRegion : public G1GCAllocRegion { diff --git a/src/hotspot/share/gc/g1/g1AllocRegion.inline.hpp b/src/hotspot/share/gc/g1/g1AllocRegion.inline.hpp index ba4f1a12628d0..457a83f42857c 100644 --- a/src/hotspot/share/gc/g1/g1AllocRegion.inline.hpp +++ b/src/hotspot/share/gc/g1/g1AllocRegion.inline.hpp @@ -31,9 +31,9 @@ #define assert_alloc_region(p, message) \ do { \ - assert((p), "[%s] %s c: %u r: " PTR_FORMAT " u: " SIZE_FORMAT, \ - _name, (message), _count, p2i(_alloc_region), \ - _used_bytes_before); \ + assert((p), "[%s] %s c: %u r: " PTR_FORMAT, \ + _name, (message), _count, p2i(_alloc_region) \ + ); \ } while (0) @@ -41,41 +41,27 @@ inline void G1AllocRegion::reset_alloc_region() { _alloc_region = _dummy_region; } -inline HeapWord* G1AllocRegion::allocate(G1HeapRegion* alloc_region, - size_t word_size) { - assert(alloc_region != nullptr, "pre-condition"); - - return alloc_region->allocate(word_size); -} - inline HeapWord* G1AllocRegion::par_allocate(G1HeapRegion* alloc_region, size_t word_size) { - size_t temp; - return par_allocate(alloc_region, word_size, word_size, &temp); -} - -inline HeapWord* G1AllocRegion::par_allocate(G1HeapRegion* alloc_region, - size_t min_word_size, - size_t desired_word_size, - size_t* actual_word_size) { assert(alloc_region != nullptr, "pre-condition"); assert(!alloc_region->is_empty(), "pre-condition"); - - return alloc_region->par_allocate(min_word_size, desired_word_size, actual_word_size); + size_t temp; + return alloc_region->par_allocate(word_size, word_size, &temp); } inline HeapWord* G1AllocRegion::attempt_allocation(size_t min_word_size, size_t desired_word_size, size_t* actual_word_size) { G1HeapRegion* alloc_region = _alloc_region; - assert_alloc_region(alloc_region != nullptr, "not initialized properly"); + assert_alloc_region(alloc_region != nullptr && !alloc_region->is_empty(), "not initialized properly"); + + HeapWord* result = alloc_region->par_allocate(min_word_size, desired_word_size, actual_word_size); - HeapWord* result = par_allocate(alloc_region, min_word_size, desired_word_size, actual_word_size); if (result != nullptr) { trace("alloc", min_word_size, desired_word_size, *actual_word_size, result); - return result; + } else { + trace("alloc failed", min_word_size, desired_word_size); } - trace("alloc failed", min_word_size, desired_word_size); - return nullptr; + return result; } inline HeapWord* G1AllocRegion::attempt_allocation_locked(size_t word_size) { @@ -112,7 +98,7 @@ inline HeapWord* MutatorAllocRegion::attempt_retained_allocation(size_t min_word size_t desired_word_size, size_t* actual_word_size) { if (_retained_alloc_region != nullptr) { - HeapWord* result = par_allocate(_retained_alloc_region, min_word_size, desired_word_size, actual_word_size); + HeapWord* result = _retained_alloc_region->par_allocate(min_word_size, desired_word_size, actual_word_size); if (result != nullptr) { trace("alloc retained", min_word_size, desired_word_size, *actual_word_size, result); return result; diff --git a/src/hotspot/share/gc/g1/g1Allocator.cpp b/src/hotspot/share/gc/g1/g1Allocator.cpp index 05c64287ec0eb..29ce8e26bbbc6 100644 --- a/src/hotspot/share/gc/g1/g1Allocator.cpp +++ b/src/hotspot/share/gc/g1/g1Allocator.cpp @@ -118,7 +118,7 @@ void G1Allocator::reuse_retained_old_region(G1EvacInfo* evacuation_info, // we allocate to in the region sets. We'll re-add it later, when // it's retired again. _g1h->old_set_remove(retained_region); - old->set(retained_region); + old->reuse(retained_region); G1HeapRegionPrinter::reuse(retained_region); evacuation_info->set_alloc_regions_used_before(retained_region->used()); } diff --git a/src/hotspot/share/gc/g1/g1HeapRegion.hpp b/src/hotspot/share/gc/g1/g1HeapRegion.hpp index dc2c71bcbb450..67d6556203cad 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegion.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegion.hpp @@ -127,18 +127,6 @@ class G1HeapRegion : public CHeapObj<mtGC> { void mangle_unused_area() PRODUCT_RETURN; - // Try to allocate at least min_word_size and up to desired_size from this region. - // Returns null if not possible, otherwise sets actual_word_size to the amount of - // space allocated. - // This version assumes that all allocation requests to this G1HeapRegion are properly - // synchronized. - inline HeapWord* allocate_impl(size_t min_word_size, size_t desired_word_size, size_t* actual_word_size); - // Try to allocate at least min_word_size and up to desired_size from this G1HeapRegion. - // Returns null if not possible, otherwise sets actual_word_size to the amount of - // space allocated. - // This version synchronizes with other calls to par_allocate_impl(). - inline HeapWord* par_allocate_impl(size_t min_word_size, size_t desired_word_size, size_t* actual_word_size); - inline HeapWord* advance_to_block_containing_addr(const void* addr, HeapWord* const pb, HeapWord* first_block) const; @@ -163,8 +151,18 @@ class G1HeapRegion : public CHeapObj<mtGC> { // All allocations are done without updating the BOT. The BOT // needs to be kept in sync for old generation regions and // this is done by explicit updates when crossing thresholds. + + // Try to allocate at least min_word_size and up to desired_size from this HeapRegion. + // Returns null if not possible, otherwise sets actual_word_size to the amount of + // space allocated. + // This version synchronizes with other calls to par_allocate(). inline HeapWord* par_allocate(size_t min_word_size, size_t desired_word_size, size_t* word_size); inline HeapWord* allocate(size_t word_size); + // Try to allocate at least min_word_size and up to desired_size from this region. + // Returns null if not possible, otherwise sets actual_word_size to the amount of + // space allocated. + // This version assumes that all allocation requests to this HeapRegion are properly + // synchronized. inline HeapWord* allocate(size_t min_word_size, size_t desired_word_size, size_t* actual_size); // Full GC support methods. diff --git a/src/hotspot/share/gc/g1/g1HeapRegion.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegion.inline.hpp index 8e5e594b5cac2..f31c5fb553e29 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegion.inline.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegion.inline.hpp @@ -42,47 +42,6 @@ #include "utilities/align.hpp" #include "utilities/globalDefinitions.hpp" -inline HeapWord* G1HeapRegion::allocate_impl(size_t min_word_size, - size_t desired_word_size, - size_t* actual_size) { - HeapWord* obj = top(); - size_t available = pointer_delta(end(), obj); - size_t want_to_allocate = MIN2(available, desired_word_size); - if (want_to_allocate >= min_word_size) { - HeapWord* new_top = obj + want_to_allocate; - set_top(new_top); - assert(is_object_aligned(obj) && is_object_aligned(new_top), "checking alignment"); - *actual_size = want_to_allocate; - return obj; - } else { - return nullptr; - } -} - -inline HeapWord* G1HeapRegion::par_allocate_impl(size_t min_word_size, - size_t desired_word_size, - size_t* actual_size) { - do { - HeapWord* obj = top(); - size_t available = pointer_delta(end(), obj); - size_t want_to_allocate = MIN2(available, desired_word_size); - if (want_to_allocate >= min_word_size) { - HeapWord* new_top = obj + want_to_allocate; - HeapWord* result = Atomic::cmpxchg(&_top, obj, new_top); - // result can be one of two: - // the old top value: the exchange succeeded - // otherwise: the new value of the top is returned. - if (result == obj) { - assert(is_object_aligned(obj) && is_object_aligned(new_top), "checking alignment"); - *actual_size = want_to_allocate; - return obj; - } - } else { - return nullptr; - } - } while (true); -} - inline HeapWord* G1HeapRegion::block_start(const void* addr) const { return block_start(addr, parsable_bottom_acquire()); } @@ -225,9 +184,27 @@ inline void G1HeapRegion::apply_to_marked_objects(G1CMBitMap* bitmap, ApplyToMar } inline HeapWord* G1HeapRegion::par_allocate(size_t min_word_size, - size_t desired_word_size, - size_t* actual_word_size) { - return par_allocate_impl(min_word_size, desired_word_size, actual_word_size); + size_t desired_word_size, + size_t* actual_word_size) { + do { + HeapWord* obj = top(); + size_t available = pointer_delta(end(), obj); + size_t want_to_allocate = MIN2(available, desired_word_size); + if (want_to_allocate >= min_word_size) { + HeapWord* new_top = obj + want_to_allocate; + HeapWord* result = Atomic::cmpxchg(&_top, obj, new_top); + // result can be one of two: + // the old top value: the exchange succeeded + // otherwise: the new value of the top is returned. + if (result == obj) { + assert(is_object_aligned(obj) && is_object_aligned(new_top), "checking alignment"); + *actual_word_size = want_to_allocate; + return obj; + } + } else { + return nullptr; + } + } while (true); } inline HeapWord* G1HeapRegion::allocate(size_t word_size) { @@ -236,9 +213,20 @@ inline HeapWord* G1HeapRegion::allocate(size_t word_size) { } inline HeapWord* G1HeapRegion::allocate(size_t min_word_size, - size_t desired_word_size, - size_t* actual_word_size) { - return allocate_impl(min_word_size, desired_word_size, actual_word_size); + size_t desired_word_size, + size_t* actual_word_size) { + HeapWord* obj = top(); + size_t available = pointer_delta(end(), obj); + size_t want_to_allocate = MIN2(available, desired_word_size); + if (want_to_allocate >= min_word_size) { + HeapWord* new_top = obj + want_to_allocate; + set_top(new_top); + assert(is_object_aligned(obj) && is_object_aligned(new_top), "checking alignment"); + *actual_word_size = want_to_allocate; + return obj; + } else { + return nullptr; + } } inline void G1HeapRegion::update_bot() { From 19a8a2baa9e749c7527ff526b2794826f0cdebb3 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Wed, 3 Jul 2024 15:42:47 +0000 Subject: [PATCH 286/471] 8335618: Serial: Remove unused definitions in SerialHeap Reviewed-by: iwalulya --- src/hotspot/share/gc/serial/defNewGeneration.hpp | 1 - src/hotspot/share/gc/serial/serialHeap.hpp | 7 ------- 2 files changed, 8 deletions(-) diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp index 5c8dd08e40b82..a7ee555902a25 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.hpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp @@ -43,7 +43,6 @@ class CSpaceCounters; class OldGenScanClosure; class YoungGenScanClosure; class DefNewTracer; -class ScanWeakRefClosure; class SerialHeap; class STWGCTimer; diff --git a/src/hotspot/share/gc/serial/serialHeap.hpp b/src/hotspot/share/gc/serial/serialHeap.hpp index 14e0d737c1a4e..750bb322b2ac4 100644 --- a/src/hotspot/share/gc/serial/serialHeap.hpp +++ b/src/hotspot/share/gc/serial/serialHeap.hpp @@ -72,14 +72,8 @@ class SerialHeap : public CollectedHeap { friend class HeapInspection; friend class GCCauseSetter; friend class VMStructs; -public: friend class VM_PopulateDumpSharedSpace; - enum GenerationType { - YoungGen, - OldGen - }; - private: DefNewGeneration* _young_gen; TenuredGeneration* _old_gen; @@ -124,7 +118,6 @@ class SerialHeap : public CollectedHeap { // Does operations required after initialization has been done. void post_initialize() override; - bool is_young_gen(const Generation* gen) const { return gen == _young_gen; } bool is_in_reserved(const void* addr) const { return _reserved.contains(addr); } // Performance Counter support From 8aaec37ace102b55ee1387cfd1967ec3ab662083 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Wed, 3 Jul 2024 16:08:34 +0000 Subject: [PATCH 287/471] 8322475: Extend printing for System.map Reviewed-by: sgehwolf, jsjolen --- src/hotspot/os/linux/memMapPrinter_linux.cpp | 183 ++++++++++++++---- src/hotspot/os/linux/procMapsParser.cpp | 125 ++++++++++++ src/hotspot/os/linux/procMapsParser.hpp | 91 +++++++++ src/hotspot/share/nmt/memMapPrinter.cpp | 115 ++++------- src/hotspot/share/nmt/memMapPrinter.hpp | 33 +--- src/hotspot/share/runtime/java.cpp | 2 +- src/hotspot/share/services/attachListener.cpp | 8 +- .../share/services/diagnosticCommand.cpp | 14 +- .../share/services/diagnosticCommand.hpp | 13 +- src/hotspot/share/utilities/ostream.cpp | 7 +- src/hotspot/share/utilities/ostream.hpp | 2 +- .../dcmd/vm/SystemDumpMapTest.java | 23 ++- .../serviceability/dcmd/vm/SystemMapTest.java | 29 +-- .../dcmd/vm/SystemMapTestBase.java | 67 +++++++ 14 files changed, 513 insertions(+), 199 deletions(-) create mode 100644 src/hotspot/os/linux/procMapsParser.cpp create mode 100644 src/hotspot/os/linux/procMapsParser.hpp create mode 100644 test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java diff --git a/src/hotspot/os/linux/memMapPrinter_linux.cpp b/src/hotspot/os/linux/memMapPrinter_linux.cpp index 05d520f69539a..0b696b9914efe 100644 --- a/src/hotspot/os/linux/memMapPrinter_linux.cpp +++ b/src/hotspot/os/linux/memMapPrinter_linux.cpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2023, Red Hat, Inc. and/or its affiliates. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Red Hat, Inc. and/or its affiliates. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,60 +25,165 @@ #include "precompiled.hpp" -#include "runtime/os.hpp" #include "nmt/memMapPrinter.hpp" +#include "procMapsParser.hpp" +#include "runtime/os.hpp" +#include "utilities/align.hpp" #include "utilities/globalDefinitions.hpp" +#include "utilities/powerOfTwo.hpp" + #include <limits.h> -struct ProcMapsInfo { - void* from = 0; - void* to = 0; - char prot[20 + 1]; - char offset[20 + 1]; - char dev[20 + 1]; - char inode[20 + 1]; - char filename[1024 + 1]; - - bool scan_proc_maps_line(const char* line) { - prot[0] = offset[0] = dev[0] = inode[0] = filename[0] = '\0'; - const int items_read = ::sscanf(line, "%p-%p %20s %20s %20s %20s %1024s", - &from, &to, prot, offset, dev, inode, filename); - return items_read >= 2; // need at least from and to +class ProcSmapsSummary { + unsigned _num_mappings; + size_t _vsize; // combined virtual size + size_t _rss; // combined resident set size + size_t _committed; // combined committed size + size_t _shared; // combined shared size + size_t _swapped_out; // combined amount of swapped-out memory + size_t _hugetlb; // combined amount of memory backed by explicit huge pages + size_t _thp; // combined amount of memory backed by THPs +public: + ProcSmapsSummary() : _num_mappings(0), _vsize(0), _rss(0), _committed(0), _shared(0), + _swapped_out(0), _hugetlb(0), _thp(0) {} + void add_mapping(const ProcSmapsInfo& info) { + _num_mappings++; + _vsize += info.vsize(); + _rss += info.rss; + _committed += info.nr ? 0 : info.vsize(); + _shared += info.sh ? info.vsize() : 0; + _swapped_out += info.swap; + _hugetlb += info.private_hugetlb + info.shared_hugetlb; + _thp += info.anonhugepages; + } + + void print_on(const MappingPrintSession& session) const { + outputStream* st = session.out(); + st->print_cr("Number of mappings: %u", _num_mappings); + st->print_cr(" vsize: %zu (" PROPERFMT ")", _vsize, PROPERFMTARGS(_vsize)); + st->print_cr(" rss: %zu (" PROPERFMT ")", _rss, PROPERFMTARGS(_rss)); + st->print_cr(" committed: %zu (" PROPERFMT ")", _committed, PROPERFMTARGS(_committed)); + st->print_cr(" shared: %zu (" PROPERFMT ")", _shared, PROPERFMTARGS(_shared)); + st->print_cr(" swapped out: %zu (" PROPERFMT ")", _swapped_out, PROPERFMTARGS(_swapped_out)); + st->print_cr(" using thp: %zu (" PROPERFMT ")", _thp, PROPERFMTARGS(_thp)); + st->print_cr(" hugetlb: %zu (" PROPERFMT ")", _hugetlb, PROPERFMTARGS(_hugetlb)); } }; -class LinuxMappingPrintInformation : public MappingPrintInformation { - const ProcMapsInfo _info; +class ProcSmapsPrinter { + const MappingPrintSession& _session; public: + ProcSmapsPrinter(const MappingPrintSession& session) : + _session(session) + {} - LinuxMappingPrintInformation(const void* from, const void* to, const ProcMapsInfo* info) : - MappingPrintInformation(from, to), _info(*info) {} + void print_single_mapping(const ProcSmapsInfo& info) const { + outputStream* st = _session.out(); +#define INDENT_BY(n) \ + if (st->fill_to(n) == 0) { \ + st->print(" "); \ + } + st->print(PTR_FORMAT "-" PTR_FORMAT, p2i(info.from), p2i(info.to)); + INDENT_BY(38); + st->print("%12zu", info.vsize()); + INDENT_BY(51); + st->print("%s", info.prot); + INDENT_BY(56); + st->print("%12zu", info.rss); + INDENT_BY(69); + st->print("%12zu", info.private_hugetlb); + INDENT_BY(82); + st->print(EXACTFMT, EXACTFMTARGS(info.kernelpagesize)); + { + INDENT_BY(87); + int num_printed = 0; +#define PRINTIF(cond, s) \ + if (cond) { \ + st->print("%s%s", (num_printed > 0 ? "," : ""), s); \ + num_printed++; \ + } + PRINTIF(info.sh, "shrd"); + PRINTIF(!info.nr, "com"); + PRINTIF(info.swap > 0, "swap"); + PRINTIF(info.ht, "huge"); + PRINTIF(info.anonhugepages > 0, "thp"); + PRINTIF(info.hg, "thpad"); + PRINTIF(info.nh, "nothp"); + if (num_printed == 0) { + st->print("-"); + } +#undef PRINTIF + } + INDENT_BY(104); + if (!_session.print_nmt_info_for_region(info.from, info.to)) { + st->print("-"); + } + INDENT_BY(142); + st->print_raw(info.filename[0] == '\0' ? "-" : info.filename); + #undef INDENT_BY + st->cr(); + } - void print_OS_specific_details(outputStream* st) const override { - st->print("%s %s ", _info.prot, _info.offset); + void print_legend() const { + outputStream* st = _session.out(); + st->print_cr("from, to, vsize: address range and size"); + st->print_cr("prot: protection"); + st->print_cr("rss: resident set size"); + st->print_cr("hugetlb: size of private hugetlb pages"); + st->print_cr("pgsz: page size"); + st->print_cr("notes: mapping information (detail mode only)"); + st->print_cr(" shrd: mapping is shared"); + st->print_cr(" com: mapping committed (swap space reserved)"); + st->print_cr(" swap: mapping partly or completely swapped out"); + st->print_cr(" thp: mapping uses THP"); + st->print_cr(" thpad: mapping is THP-madvised"); + st->print_cr(" nothp: mapping is forbidden to use THP"); + st->print_cr(" huge: mapping uses hugetlb pages"); + st->print_cr("vm info: VM information (requires NMT)"); + { + streamIndentor si(st, 16); + _session.print_nmt_flag_legend(); + } + st->print_cr("file: file mapped, if mapping is not anonymous"); } - const char* filename() const override { return _info.filename; } + void print_header() const { + outputStream* st = _session.out(); + // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 + // 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 + // 0x0000000414000000-0x0000000453000000 123456789012 rw-p 123456789012 123456789012 16g thp,thpadv STACK-340754-Monitor-Deflation-Thread /shared/tmp.txt + st->print_cr("from to vsize prot rss hugetlb pgsz notes info file"); + st->print_cr("========================================================================================================================================================================"); + } }; -void MemMapPrinter::pd_print_header(outputStream* st) { - st->print_cr("size prot offset What"); -} - -void MemMapPrinter::pd_iterate_all_mappings(MappingPrintClosure& closure) { - FILE* f = os::fopen("/proc/self/maps", "r"); +void MemMapPrinter::pd_print_all_mappings(const MappingPrintSession& session) { + constexpr char filename[] = "/proc/self/smaps"; + FILE* f = os::fopen(filename, "r"); if (f == nullptr) { + session.out()->print_cr("Cannot open %s", filename); return; } - constexpr size_t linesize = sizeof(ProcMapsInfo); - char line[linesize]; - while (fgets(line, sizeof(line), f) == line) { - line[sizeof(line) - 1] = '\0'; - ProcMapsInfo info; - if (info.scan_proc_maps_line(line)) { - LinuxMappingPrintInformation mapinfo(info.from, info.to, &info); - closure.do_it(&mapinfo); - } + + ProcSmapsPrinter printer(session); + ProcSmapsSummary summary; + + outputStream* const st = session.out(); + + printer.print_legend(); + st->cr(); + printer.print_header(); + + ProcSmapsInfo info; + ProcSmapsParser parser(f); + while (parser.parse_next(info)) { + printer.print_single_mapping(info); + summary.add_mapping(info); } + st->cr(); + + summary.print_on(session); + st->cr(); + ::fclose(f); } diff --git a/src/hotspot/os/linux/procMapsParser.cpp b/src/hotspot/os/linux/procMapsParser.cpp new file mode 100644 index 0000000000000..6dfd49a0596e3 --- /dev/null +++ b/src/hotspot/os/linux/procMapsParser.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. and/or its affiliates. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" + +#include "procMapsParser.hpp" +#include "runtime/os.hpp" +#include "utilities/globalDefinitions.hpp" + +static bool is_lowercase_hex(char c) { + return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'); +} + +static size_t max_mapping_line_len() { + return 100 + // everything but the file name + os::vm_page_size() // the file name (kernel limits /proc/pid/cmdline to one page + ; +} + +ProcSmapsParser::ProcSmapsParser(FILE* f) : + _f(f), _linelen(max_mapping_line_len()), _line(nullptr) { + assert(_f != nullptr, "Invalid file handle given"); + _line = NEW_C_HEAP_ARRAY(char, max_mapping_line_len(), mtInternal); + _line[0] = '\0'; +} + +ProcSmapsParser::~ProcSmapsParser() { + FREE_C_HEAP_ARRAY(char, _line); +} + +bool ProcSmapsParser::read_line() { + _line[0] = '\0'; + return ::fgets(_line, _linelen, _f) != nullptr; +} + +bool ProcSmapsParser::is_header_line() { + // e.g. ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] + return is_lowercase_hex(_line[0]); // All non-header lines in /proc/pid/smaps start with upper-case letters. +} + +void ProcSmapsParser::scan_header_line(ProcSmapsInfo& out) { + const int items_read = ::sscanf(_line, "%p-%p %20s %*s %*s %*s %1024s", + &out.from, &out.to, out.prot, out.filename); + assert(items_read >= 2, "Expected header_line"); +} + +void ProcSmapsParser::scan_additional_line(ProcSmapsInfo& out) { +#define SCAN(key, var) \ + if (::sscanf(_line, key ": %zu kB", &var) == 1) { \ + var *= K; \ + return; \ + } + SCAN("KernelPageSize", out.kernelpagesize); + SCAN("Rss", out.rss); + SCAN("AnonHugePages", out.anonhugepages); + SCAN("Private_Hugetlb", out.private_hugetlb); + SCAN("Shared_Hugetlb", out.shared_hugetlb); + SCAN("Swap", out.swap); + int i = 0; +#undef SCAN + // scan some flags too + if (strncmp(_line, "VmFlags:", 8) == 0) { +#define SCAN(flag) { out.flag = (::strstr(_line + 8, " " #flag) != nullptr); } + SCAN(rd); + SCAN(wr); + SCAN(ex); + SCAN(nr); + SCAN(sh); + SCAN(hg); + SCAN(ht); + SCAN(nh); +#undef SCAN + } +} + +// Starts or continues parsing. Returns true on success, +// false on EOF or on error. +bool ProcSmapsParser::parse_next(ProcSmapsInfo& out) { + + // Information about a single mapping reaches across several lines. + out.reset(); + + // Read header line, unless we already read it + if (_line[0] == '\0') { + if (!read_line()) { + return false; + } + } + assert(is_header_line(), "Not a header line: \"%s\".", _line); + scan_header_line(out); + + // Now read until we encounter the next header line or EOF or an error. + bool ok = false, stop = false; + do { + ok = read_line(); + stop = !ok || is_header_line(); + if (!stop) { + scan_additional_line(out); + } + } while (!stop); + + return ok; +} diff --git a/src/hotspot/os/linux/procMapsParser.hpp b/src/hotspot/os/linux/procMapsParser.hpp new file mode 100644 index 0000000000000..0971c4fb084f9 --- /dev/null +++ b/src/hotspot/os/linux/procMapsParser.hpp @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2024, Red Hat, Inc. and/or its affiliates. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef OS_LINUX_PROCMAPSPARSER_HPP +#define OS_LINUX_PROCMAPSPARSER_HPP + +#include "utilities/globalDefinitions.hpp" + +// This header exposes two simple parsers for /proc/pid/maps and +// /proc/pid/smaps. +// +// Usage: +// +// FILE* f = fopen(...) +// ProcSMapsParser parser(f); +// ProcSMapsInfo info; +// while (parser.parse_next(info)) { ... } + +struct ProcSmapsInfo { + void* from; + void* to; + char prot[20 + 1]; + char filename[1024 + 1]; + size_t kernelpagesize; + size_t rss; + size_t private_hugetlb; + size_t shared_hugetlb; + size_t anonhugepages; + size_t swap; + bool rd, wr, ex; + bool sh; // shared + bool nr; // no reserve + bool hg; // thp-advised + bool ht; // uses hugetlb pages + bool nh; // thp forbidden + + size_t vsize() const { + return from < to ? pointer_delta(to, from, 1) : 0; + } + + void reset() { + from = to = nullptr; + prot[0] = filename[0] = '\0'; + kernelpagesize = rss = private_hugetlb = shared_hugetlb = anonhugepages = swap = 0; + rd = wr = ex = sh = nr = hg = ht = nh = false; + } +}; + +class ProcSmapsParser { + FILE* _f; + const size_t _linelen; + char* _line; + + bool read_line(); // sets had_error in case of error + bool is_header_line(); + void scan_header_line(ProcSmapsInfo& out); + void scan_additional_line(ProcSmapsInfo& out); + +public: + + ProcSmapsParser(FILE* f); + ~ProcSmapsParser(); + + // Starts or continues parsing. Returns true on success, + // false on EOF or on error. + bool parse_next(ProcSmapsInfo& out); +}; + +#endif // OS_LINUX_PROCMAPSPARSER_HPP diff --git a/src/hotspot/share/nmt/memMapPrinter.cpp b/src/hotspot/share/nmt/memMapPrinter.cpp index 5480904d57c40..5f920b102a977 100644 --- a/src/hotspot/share/nmt/memMapPrinter.cpp +++ b/src/hotspot/share/nmt/memMapPrinter.cpp @@ -27,8 +27,9 @@ #ifdef LINUX -#include "logging/logAsyncWriter.hpp" #include "gc/shared/collectedHeap.hpp" +#include "logging/logAsyncWriter.hpp" +#include "memory/allocation.hpp" #include "memory/universe.hpp" #include "memory/resourceArea.hpp" #include "nmt/memflags.hpp" @@ -42,7 +43,6 @@ #include "runtime/threadSMR.hpp" #include "runtime/vmThread.hpp" #include "utilities/globalDefinitions.hpp" -#include "utilities/growableArray.hpp" #include "utilities/ostream.hpp" // Note: throughout this code we will use the term "VMA" for OS system level memory mapping @@ -160,13 +160,6 @@ class CachedNMTInformation : public VirtualMemoryWalker { bool fill_from_nmt() { return VirtualMemoryTracker::walk_virtual_memory(this); } - - void print_on(outputStream* st) const { - for (size_t i = 0; i < _count; i ++) { - st->print_cr(PTR_FORMAT "-" PTR_FORMAT " %s", p2i(_ranges[i].from), p2i(_ranges[i].to), - NMTUtil::flag_to_enum_name(_flags[i])); - } - } }; /////// Thread information ////////////////////////// @@ -198,7 +191,16 @@ struct GCThreadClosure : public ThreadClosure { }; static void print_thread_details(uintx thread_id, const char* name, outputStream* st) { - st->print("(" UINTX_FORMAT " \"%s\")", (uintx)thread_id, name); + // avoid commas and spaces in output to ease post-processing via awk + char tmp[64]; + stringStream ss(tmp, sizeof(tmp)); + ss.print(":" UINTX_FORMAT "-%s", (uintx)thread_id, name); + for (int i = 0; tmp[i] != '\0'; i++) { + if (!isalnum(tmp[i])) { + tmp[i] = '-'; + } + } + st->print_raw(tmp); } // Given a region [from, to), if it intersects a known thread stack, print detail infos about that thread. @@ -230,41 +232,18 @@ static void print_thread_details_for_supposed_stack_address(const void* from, co /////////////// -static void print_legend(outputStream* st) { -#define DO(flag, shortname, text) st->print_cr("%10s %s", shortname, text); +MappingPrintSession::MappingPrintSession(outputStream* st, const CachedNMTInformation& nmt_info) : + _out(st), _nmt_info(nmt_info) +{} + +void MappingPrintSession::print_nmt_flag_legend() const { +#define DO(flag, shortname, text) _out->indent(); _out->print_cr("%10s: %s", shortname, text); NMT_FLAGS_DO(DO) #undef DO } -MappingPrintClosure::MappingPrintClosure(outputStream* st, bool human_readable, const CachedNMTInformation& nmt_info) : - _out(st), _human_readable(human_readable), - _total_count(0), _total_vsize(0), _nmt_info(nmt_info) -{} - -void MappingPrintClosure::do_it(const MappingPrintInformation* info) { - - _total_count++; - - const void* const vma_from = info->from(); - const void* const vma_to = info->to(); - - // print from, to - _out->print(PTR_FORMAT " - " PTR_FORMAT " ", p2i(vma_from), p2i(vma_to)); - const size_t size = pointer_delta(vma_to, vma_from, 1); - _total_vsize += size; - - // print mapping size - if (_human_readable) { - _out->print(PROPERFMT " ", PROPERFMTARGS(size)); - } else { - _out->print("%11zu", size); - } - - assert(info->from() <= info->to(), "Invalid VMA"); - _out->fill_to(53); - info->print_OS_specific_details(_out); - _out->fill_to(70); - +bool MappingPrintSession::print_nmt_info_for_region(const void* vma_from, const void* vma_to) const { + int num_printed = 0; // print NMT information, if available if (MemTracker::enabled()) { // Correlate vma region (from, to) with NMT region(s) we collected previously. @@ -273,59 +252,33 @@ void MappingPrintClosure::do_it(const MappingPrintInformation* info) { for (int i = 0; i < mt_number_of_types; i++) { const MEMFLAGS flag = (MEMFLAGS)i; if (flags.has_flag(flag)) { + if (num_printed > 0) { + _out->put(','); + } _out->print("%s", get_shortname_for_nmt_flag(flag)); if (flag == mtThreadStack) { print_thread_details_for_supposed_stack_address(vma_from, vma_to, _out); } - _out->print(" "); + num_printed++; } } } } - - // print file name, if available - const char* f = info->filename(); - if (f != nullptr) { - _out->print_raw(f); - } - _out->cr(); -} - -void MemMapPrinter::print_header(outputStream* st) { - st->print( -#ifdef _LP64 - // 0x0000000000000000 - 0x0000000000000000 - "from to " -#else - // 0x00000000 - 0x00000000 - "from to " -#endif - ); - // Print platform-specific columns - pd_print_header(st); + return num_printed > 0; } -void MemMapPrinter::print_all_mappings(outputStream* st, bool human_readable) { - // First collect all NMT information +void MemMapPrinter::print_all_mappings(outputStream* st) { CachedNMTInformation nmt_info; - nmt_info.fill_from_nmt(); - DEBUG_ONLY(nmt_info.print_on(st);) st->print_cr("Memory mappings:"); - if (!MemTracker::enabled()) { - st->cr(); - st->print_cr(" (NMT is disabled, will not annotate mappings)."); + // Prepare NMT info cache. But only do so if we print individual mappings, + // otherwise, we won't need it and can save that work. + if (MemTracker::enabled()) { + nmt_info.fill_from_nmt(); + } else { + st->print_cr("NMT is disabled. VM info not available."); } - st->cr(); - - print_legend(st); - st->print_cr("(*) - Mapping contains data from multiple regions"); - st->cr(); - - pd_print_header(st); - MappingPrintClosure closure(st, human_readable, nmt_info); - pd_iterate_all_mappings(closure); - st->print_cr("Total: " UINTX_FORMAT " mappings with a total vsize of %zu (" PROPERFMT ")", - closure.total_count(), closure.total_vsize(), PROPERFMTARGS(closure.total_vsize())); + MappingPrintSession session(st, nmt_info); + pd_print_all_mappings(session); } #endif // LINUX diff --git a/src/hotspot/share/nmt/memMapPrinter.hpp b/src/hotspot/share/nmt/memMapPrinter.hpp index 67706c4d4d74e..aa35a830001e3 100644 --- a/src/hotspot/share/nmt/memMapPrinter.hpp +++ b/src/hotspot/share/nmt/memMapPrinter.hpp @@ -35,39 +35,20 @@ class outputStream; class CachedNMTInformation; -class MappingPrintInformation { - const void* const _from; - const void* const _to; -public: - MappingPrintInformation(const void* from, const void* to) : _from(from), _to(to) {} - const void* from() const { return _from; } - const void* to() const { return _to; } - // Will be called for each mapping before VM annotations are printed. - virtual void print_OS_specific_details(outputStream* st) const {} - // If mapping is backed by a file, the name of that file - virtual const char* filename() const { return nullptr; } -}; - -class MappingPrintClosure { +class MappingPrintSession { outputStream* const _out; - const bool _human_readable; - uintx _total_count; - size_t _total_vsize; const CachedNMTInformation& _nmt_info; public: - MappingPrintClosure(outputStream* st, bool human_readable, const CachedNMTInformation& nmt_info); - void do_it(const MappingPrintInformation* info); // returns false if timeout reached. - uintx total_count() const { return _total_count; } - size_t total_vsize() const { return _total_vsize; } + MappingPrintSession(outputStream* st, const CachedNMTInformation& nmt_info); + bool print_nmt_info_for_region(const void* from, const void* to) const; + void print_nmt_flag_legend() const; + outputStream* out() const { return _out; } }; class MemMapPrinter : public AllStatic { - static void pd_print_header(outputStream* st); - static void print_header(outputStream* st); - static void pd_iterate_all_mappings(MappingPrintClosure& closure); + static void pd_print_all_mappings(const MappingPrintSession& session); public: - static void mark_page_malloced(const void* p, MEMFLAGS f); - static void print_all_mappings(outputStream* st, bool human_readable); + static void print_all_mappings(outputStream* st); }; #endif // LINUX diff --git a/src/hotspot/share/runtime/java.cpp b/src/hotspot/share/runtime/java.cpp index 674716a859852..7ffe56d9715a3 100644 --- a/src/hotspot/share/runtime/java.cpp +++ b/src/hotspot/share/runtime/java.cpp @@ -487,7 +487,7 @@ void before_exit(JavaThread* thread, bool halt) { CodeCache::write_perf_map(); } if (PrintMemoryMapAtExit) { - MemMapPrinter::print_all_mappings(tty, false); + MemMapPrinter::print_all_mappings(tty); } #endif diff --git a/src/hotspot/share/services/attachListener.cpp b/src/hotspot/share/services/attachListener.cpp index d1531e1ec012e..36931531a4e02 100644 --- a/src/hotspot/share/services/attachListener.cpp +++ b/src/hotspot/share/services/attachListener.cpp @@ -395,7 +395,13 @@ void AttachListenerThread::thread_entry(JavaThread* thread, TRAPS) { } ResourceMark rm; - bufferedStream st; + // jcmd output can get lengthy. As long as we miss jcmd continuous streaming output + // and instead just send the output in bulk, make sure large command output does not + // cause asserts. We still retain a max cap, but dimensioned in a way that makes it + // highly unlikely we should ever hit it under normal conditions. + constexpr size_t initial_size = 1 * M; + constexpr size_t max_size = 3 * G; + bufferedStream st(initial_size, max_size); jint res = JNI_OK; // handle special detachall operation diff --git a/src/hotspot/share/services/diagnosticCommand.cpp b/src/hotspot/share/services/diagnosticCommand.cpp index 4b8eae8a4138e..7d2325c16b651 100644 --- a/src/hotspot/share/services/diagnosticCommand.cpp +++ b/src/hotspot/share/services/diagnosticCommand.cpp @@ -1180,23 +1180,17 @@ void CompilationMemoryStatisticDCmd::execute(DCmdSource source, TRAPS) { #ifdef LINUX -SystemMapDCmd::SystemMapDCmd(outputStream* output, bool heap) : - DCmdWithParser(output, heap), - _human_readable("-H", "Human readable format", "BOOLEAN", false, "false") { - _dcmdparser.add_dcmd_option(&_human_readable); -} +SystemMapDCmd::SystemMapDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} void SystemMapDCmd::execute(DCmdSource source, TRAPS) { - MemMapPrinter::print_all_mappings(output(), _human_readable.value()); + MemMapPrinter::print_all_mappings(output()); } static constexpr char default_filename[] = "vm_memory_map_<pid>.txt"; SystemDumpMapDCmd::SystemDumpMapDCmd(outputStream* output, bool heap) : - DCmdWithParser(output, heap), - _human_readable("-H", "Human readable format", "BOOLEAN", false, "false"), + DCmdWithParser(output, heap), _filename("-F", "file path", "STRING", false, default_filename) { - _dcmdparser.add_dcmd_option(&_human_readable); _dcmdparser.add_dcmd_option(&_filename); } @@ -1214,7 +1208,7 @@ void SystemDumpMapDCmd::execute(DCmdSource source, TRAPS) { if (!MemTracker::enabled()) { output()->print_cr("(NMT is disabled, will not annotate mappings)."); } - MemMapPrinter::print_all_mappings(&fs, _human_readable.value()); + MemMapPrinter::print_all_mappings(&fs); // For the readers convenience, resolve path name. char tmp[JVM_MAXPATHLEN]; const char* absname = os::Posix::realpath(name, tmp, sizeof(tmp)); diff --git a/src/hotspot/share/services/diagnosticCommand.hpp b/src/hotspot/share/services/diagnosticCommand.hpp index 88a4897081091..ec3469c8d1523 100644 --- a/src/hotspot/share/services/diagnosticCommand.hpp +++ b/src/hotspot/share/services/diagnosticCommand.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -983,16 +983,14 @@ class CompilationMemoryStatisticDCmd: public DCmdWithParser { #ifdef LINUX -class SystemMapDCmd : public DCmdWithParser { - DCmdArgument<bool> _human_readable; +class SystemMapDCmd : public DCmd { public: - static int num_arguments() { return 1; } SystemMapDCmd(outputStream* output, bool heap); static const char* name() { return "System.map"; } static const char* description() { return "Prints an annotated process memory map of the VM process (linux only)."; } - static const char* impact() { return "Low"; } + static const char* impact() { return "Medium; can be high for very large java heaps."; } static const JavaPermission permission() { JavaPermission p = {"java.lang.management.ManagementPermission", "control", nullptr}; @@ -1002,16 +1000,15 @@ class SystemMapDCmd : public DCmdWithParser { }; class SystemDumpMapDCmd : public DCmdWithParser { - DCmdArgument<bool> _human_readable; DCmdArgument<char*> _filename; public: - static int num_arguments() { return 2; } + static int num_arguments() { return 1; } SystemDumpMapDCmd(outputStream* output, bool heap); static const char* name() { return "System.dump_map"; } static const char* description() { return "Dumps an annotated process memory map to an output file (linux only)."; } - static const char* impact() { return "Low"; } + static const char* impact() { return "Medium; can be high for very large java heaps."; } static const JavaPermission permission() { JavaPermission p = {"java.lang.management.ManagementPermission", "control", nullptr}; diff --git a/src/hotspot/share/utilities/ostream.cpp b/src/hotspot/share/utilities/ostream.cpp index 5d6731785a3ac..b8f27fbd4130b 100644 --- a/src/hotspot/share/utilities/ostream.cpp +++ b/src/hotspot/share/utilities/ostream.cpp @@ -191,9 +191,10 @@ void outputStream::print_raw(const char* str, size_t len) { write(str, len); } -void outputStream::fill_to(int col) { - int need_fill = col - position(); +int outputStream::fill_to(int col) { + const int need_fill = MAX2(col - position(), 0); sp(need_fill); + return need_fill; } void outputStream::move_to(int col, int slop, int min_space) { @@ -1037,7 +1038,7 @@ void bufferedStream::write(const char* s, size_t len) { const size_t reasonable_cap = MAX2(100 * M, buffer_max * 2); if (end > reasonable_cap) { // In debug VM, assert right away. - assert(false, "Exceeded max buffer size for this string."); + assert(false, "Exceeded max buffer size for this string (\"%.200s...\").", buffer); // Release VM: silently truncate. We do this since these kind of errors // are both difficult to predict with testing (depending on logging content) // and usually not serious enough to kill a production VM for it. diff --git a/src/hotspot/share/utilities/ostream.hpp b/src/hotspot/share/utilities/ostream.hpp index bff682a3e5aa9..beb02309d3f23 100644 --- a/src/hotspot/share/utilities/ostream.hpp +++ b/src/hotspot/share/utilities/ostream.hpp @@ -101,7 +101,7 @@ class outputStream : public CHeapObjBase { void dec(int n) { _indentation -= n; }; int indentation() const { return _indentation; } void set_indentation(int i) { _indentation = i; } - void fill_to(int col); + int fill_to(int col); void move_to(int col, int slop = 6, int min_space = 2); // Automatic indentation: diff --git a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemDumpMapTest.java b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemDumpMapTest.java index 347e888409631..eb0b6bd8566ae 100644 --- a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemDumpMapTest.java +++ b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemDumpMapTest.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2023, Red Hat, Inc. and/or its affiliates. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Red Hat, Inc. and/or its affiliates. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,6 @@ import jdk.test.lib.process.OutputAnalyzer; import java.io.*; -import java.util.ArrayList; import java.util.HashSet; import java.util.regex.Pattern; @@ -41,9 +40,9 @@ * java.compiler * java.management * jdk.internal.jvmstat/sun.jvmstat.monitor - * @run testng SystemDumpMapTest + * @run testng/othervm -XX:+UsePerfData SystemDumpMapTest */ -public class SystemDumpMapTest { +public class SystemDumpMapTest extends SystemMapTestBase { private void run_test(CommandExecutor executor, boolean useDefaultFileName) { @@ -64,18 +63,22 @@ private void run_test(CommandExecutor executor, boolean useDefaultFileName) { boolean NMTOff = output.contains("NMT is disabled"); String regexBase = ".*0x\\p{XDigit}+ - 0x\\p{XDigit}+ +\\d+"; HashSet<Pattern> patterns = new HashSet<>(); - patterns.add(Pattern.compile(regexBase + ".*jvm.*")); + for (String s: shouldMatchUnconditionally) { + patterns.add(Pattern.compile(s)); + } if (!NMTOff) { // expect VM annotations if NMT is on - patterns.add(Pattern.compile(regexBase + ".*JAVAHEAP.*")); - patterns.add(Pattern.compile(regexBase + ".*META.*")); - patterns.add(Pattern.compile(regexBase + ".*CODE.*")); - patterns.add(Pattern.compile(regexBase + ".*STACK.*main.*")); + for (String s: shouldMatchIfNMTIsEnabled) { + patterns.add(Pattern.compile(s)); + } } + do { String line = reader.readLine(); if (line != null) { + System.out.println(" " + line); for (Pattern pat : patterns) { if (pat.matcher(line).matches()) { + System.out.println(">>> matches " + pat); patterns.remove(pat); break; } diff --git a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTest.java b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTest.java index 9fb8efe5a716b..43857a1f039bf 100644 --- a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTest.java +++ b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTest.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2023, Red Hat, Inc. and/or its affiliates. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Red Hat, Inc. and/or its affiliates. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,13 +27,6 @@ import jdk.test.lib.dcmd.JMXExecutor; import jdk.test.lib.process.OutputAnalyzer; -import java.io.*; -import java.util.ArrayDeque; -import java.util.Collections; -import java.util.Deque; -import java.util.HashSet; -import java.util.regex.Pattern; - /* * @test * @summary Test of diagnostic command System.map @@ -43,21 +36,19 @@ * java.compiler * java.management * jdk.internal.jvmstat/sun.jvmstat.monitor - * @run testng SystemMapTest + * @run testng/othervm -XX:+UsePerfData SystemMapTest */ -public class SystemMapTest { +public class SystemMapTest extends SystemMapTestBase { public void run(CommandExecutor executor) { OutputAnalyzer output = executor.execute("System.map"); - output.reportDiagnosticSummary(); boolean NMTOff = output.contains("NMT is disabled"); - - String regexBase = ".*0x\\p{XDigit}+ - 0x\\p{XDigit}+ +\\d+"; - output.shouldMatch(regexBase + ".*jvm.*"); + for (String s: shouldMatchUnconditionally) { + output.shouldMatch(s); + } if (!NMTOff) { // expect VM annotations if NMT is on - output.shouldMatch(regexBase + ".*JAVAHEAP.*"); - output.shouldMatch(regexBase + ".*META.*"); - output.shouldMatch(regexBase + ".*CODE.*"); - output.shouldMatch(regexBase + ".*STACK.*main.*"); + for (String s: shouldMatchIfNMTIsEnabled) { + output.shouldMatch(s); + } } } diff --git a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java new file mode 100644 index 0000000000000..20dc8d70d7a47 --- /dev/null +++ b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Red Hat, Inc. and/or its affiliates. + * 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. + */ + +public class SystemMapTestBase { + + // e.g. + // 0x00000007ff800000-0x00000007ff91a000 1155072 rw-p 1155072 0 4K com JAVAHEAP /shared/projects/openjdk/jdk-jdk/output-fastdebug/images/jdk/lib/server/classes.jsa + private static final String range = "0x\\p{XDigit}+-0x\\p{XDigit}+"; + private static final String space = " +"; + private static final String someSize = "\\d+"; + private static final String pagesize = "(4K|8K|16K|64K|2M|16M|64M)"; + private static final String prot = "[rwsxp-]+"; + + private static final String regexBase = range + space + + someSize + space + + prot + space + + someSize + space + + someSize + space + + pagesize + space; + + private static final String regexBase_committed = regexBase + "com.*"; + private static final String regexBase_shared_and_committed = regexBase + "shrd,com.*"; + + protected static final String shouldMatchUnconditionally[] = { + // java launcher + regexBase_committed + "/bin/java", + // libjvm + regexBase_committed + "/lib/.*/libjvm.so", + // vdso library, should be part of all user space apps on all architectures OpenJDK supports. + regexBase_committed + "\\[vdso\\]", + // we should see the hs-perf data file, and it should appear as shared as well as committed + regexBase_shared_and_committed + "hsperfdata_.*" + }; + + protected static final String shouldMatchIfNMTIsEnabled[] = { + regexBase_committed + "JAVAHEAP.*", + // metaspace + regexBase_committed + "META.*", + // parts of metaspace should be uncommitted + regexBase + "-" + space + "META.*", + // code cache + regexBase_committed + "CODE.*", + // Main thread stack + regexBase_committed + "STACK.*main.*" + }; +} From 13b782c3de9a470a7cf1db9d5111ce19faf28729 Mon Sep 17 00:00:00 2001 From: Hamlin Li <mli@openjdk.org> Date: Wed, 3 Jul 2024 16:10:22 +0000 Subject: [PATCH 288/471] 8334554: RISC-V: verify & fix perf of string comparison Reviewed-by: rehn, luhenry, fyang --- .../cpu/riscv/c2_MacroAssembler_riscv.cpp | 21 +++++++++---- .../cpu/riscv/c2_MacroAssembler_riscv.hpp | 2 +- src/hotspot/cpu/riscv/riscv_v.ad | 30 +++++++++++++++++-- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp index 9ce197a44bf8a..887baa4a506d1 100644 --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp @@ -2326,12 +2326,13 @@ void C2_MacroAssembler::expand_bits_l_v(Register dst, Register src, Register mas } void C2_MacroAssembler::element_compare(Register a1, Register a2, Register result, Register cnt, Register tmp1, Register tmp2, - VectorRegister vr1, VectorRegister vr2, VectorRegister vrs, bool islatin, Label &DONE) { + VectorRegister vr1, VectorRegister vr2, VectorRegister vrs, bool islatin, Label &DONE, + Assembler::LMUL lmul) { Label loop; Assembler::SEW sew = islatin ? Assembler::e8 : Assembler::e16; bind(loop); - vsetvli(tmp1, cnt, sew, Assembler::m2); + vsetvli(tmp1, cnt, sew, lmul); vlex_v(vr1, a1, sew); vlex_v(vr2, a2, sew); vmsne_vv(vrs, vr1, vr2); @@ -2357,7 +2358,7 @@ void C2_MacroAssembler::string_equals_v(Register a1, Register a2, Register resul mv(result, false); - element_compare(a1, a2, result, cnt, tmp1, tmp2, v2, v4, v2, true, DONE); + element_compare(a1, a2, result, cnt, tmp1, tmp2, v2, v4, v2, true, DONE, Assembler::m2); bind(DONE); BLOCK_COMMENT("} string_equals_v"); @@ -2410,7 +2411,7 @@ void C2_MacroAssembler::arrays_equals_v(Register a1, Register a2, Register resul la(a1, Address(a1, base_offset)); la(a2, Address(a2, base_offset)); - element_compare(a1, a2, result, cnt1, tmp1, tmp2, v2, v4, v2, elem_size == 1, DONE); + element_compare(a1, a2, result, cnt1, tmp1, tmp2, v2, v4, v2, elem_size == 1, DONE, Assembler::m2); bind(DONE); @@ -2445,8 +2446,18 @@ void C2_MacroAssembler::string_compare_v(Register str1, Register str2, Register mv(cnt2, cnt1); bind(L); + // We focus on the optimization of small sized string. + // Please check below document for string size distribution statistics. + // https://cr.openjdk.org/~shade/density/string-density-report.pdf if (str1_isL == str2_isL) { // LL or UU - element_compare(str1, str2, zr, cnt2, tmp1, tmp2, v2, v4, v2, encLL, DIFFERENCE); + // Below construction of v regs and lmul is based on test on 2 different boards, + // vlen == 128 and vlen == 256 respectively. + if (!encLL && MaxVectorSize == 16) { // UU + element_compare(str1, str2, zr, cnt2, tmp1, tmp2, v4, v8, v4, encLL, DIFFERENCE, Assembler::m4); + } else { // UU + MaxVectorSize or LL + element_compare(str1, str2, zr, cnt2, tmp1, tmp2, v2, v4, v2, encLL, DIFFERENCE, Assembler::m2); + } + j(DONE); } else { // LU or UL Register strL = encLU ? str1 : str2; diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp index 9988b98fa2c4d..07041fe085006 100644 --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp @@ -37,7 +37,7 @@ Register tmp1, Register tmp2, VectorRegister vr1, VectorRegister vr2, VectorRegister vrs, - bool is_latin, Label& DONE); + bool is_latin, Label& DONE, Assembler::LMUL lmul); void compress_bits_v(Register dst, Register src, Register mask, bool is_long); void expand_bits_v(Register dst, Register src, Register mask, bool is_long); diff --git a/src/hotspot/cpu/riscv/riscv_v.ad b/src/hotspot/cpu/riscv/riscv_v.ad index 841e8cb260cb8..1a51d7583c9dd 100644 --- a/src/hotspot/cpu/riscv/riscv_v.ad +++ b/src/hotspot/cpu/riscv/riscv_v.ad @@ -3605,14 +3605,37 @@ instruct varray_equalsC(iRegP_R11 ary1, iRegP_R12 ary2, iRegI_R10 result, ins_pipe(pipe_class_memory); %} +instruct vstring_compareU_128b(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_R14 cnt2, + iRegI_R10 result, vReg_V4 v4, vReg_V5 v5, vReg_V6 v6, vReg_V7 v7, + vReg_V8 v8, vReg_V9 v9, vReg_V10 v10, vReg_V11 v11, + iRegP_R28 tmp1, iRegL_R29 tmp2) +%{ + predicate(UseRVV && ((StrCompNode *)n)->encoding() == StrIntrinsicNode::UU && + MaxVectorSize == 16); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(KILL tmp1, KILL tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, + TEMP v4, TEMP v5, TEMP v6, TEMP v7, TEMP v8, TEMP v9, TEMP v10, TEMP v11); + + format %{ "String Compare $str1, $cnt1, $str2, $cnt2 -> $result\t#@string_compareU" %} + ins_encode %{ + // Count is in 8-bit bytes; non-Compact chars are 16 bits. + __ string_compare_v($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, $result$$Register, + $tmp1$$Register, $tmp2$$Register, + StrIntrinsicNode::UU); + %} + ins_pipe(pipe_class_memory); +%} + instruct vstring_compareU(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_R14 cnt2, iRegI_R10 result, vReg_V2 v2, vReg_V3 v3, vReg_V4 v4, vReg_V5 v5, iRegP_R28 tmp1, iRegL_R29 tmp2) %{ - predicate(UseRVV && ((StrCompNode *)n)->encoding() == StrIntrinsicNode::UU); + predicate(UseRVV && ((StrCompNode *)n)->encoding() == StrIntrinsicNode::UU && + MaxVectorSize > 16); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(KILL tmp1, KILL tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, - TEMP v2, TEMP v3, TEMP v4, TEMP v5); + TEMP v2, TEMP v3, TEMP v4, TEMP v5); format %{ "String Compare $str1, $cnt1, $str2, $cnt2 -> $result\t#@string_compareU" %} ins_encode %{ @@ -3624,6 +3647,7 @@ instruct vstring_compareU(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_ %} ins_pipe(pipe_class_memory); %} + instruct vstring_compareL(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_R14 cnt2, iRegI_R10 result, vReg_V2 v2, vReg_V3 v3, vReg_V4 v4, vReg_V5 v5, iRegP_R28 tmp1, iRegL_R29 tmp2) @@ -3631,7 +3655,7 @@ instruct vstring_compareL(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_ predicate(UseRVV && ((StrCompNode *)n)->encoding() == StrIntrinsicNode::LL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(KILL tmp1, KILL tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, - TEMP v2, TEMP v3, TEMP v4, TEMP v5); + TEMP v2, TEMP v3, TEMP v4, TEMP v5); format %{ "String Compare $str1, $cnt1, $str2, $cnt2 -> $result\t#@string_compareL" %} ins_encode %{ From 9a91865ff38f6fbb48b9aba5028e0b529d9bce76 Mon Sep 17 00:00:00 2001 From: Thomas Schatzl <tschatzl@openjdk.org> Date: Wed, 3 Jul 2024 16:29:52 +0000 Subject: [PATCH 289/471] 8335395: G1: Verification does not detect references into Free regions Reviewed-by: ayang, iwalulya --- src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp | 1 + src/hotspot/share/gc/g1/g1HeapRegion.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp index 49f1c82a98ab0..63eceb4a5baa5 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp @@ -253,6 +253,7 @@ inline bool G1CollectedHeap::is_obj_filler(const oop obj) { } inline bool G1CollectedHeap::is_obj_dead(const oop obj, const G1HeapRegion* hr) const { + assert(!hr->is_free(), "looking up obj " PTR_FORMAT " in Free region %u", p2i(obj), hr->hrm_index()); if (hr->is_in_parsable_area(obj)) { // This object is in the parsable part of the heap, live unless scrubbed. return is_obj_filler(obj); diff --git a/src/hotspot/share/gc/g1/g1HeapRegion.cpp b/src/hotspot/share/gc/g1/g1HeapRegion.cpp index 94382a3b256d1..d611cf7f947ff 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegion.cpp +++ b/src/hotspot/share/gc/g1/g1HeapRegion.cpp @@ -547,7 +547,10 @@ class G1VerifyLiveAndRemSetClosure : public BasicOopIterateClosure { } bool failed() const { - return !_is_in_heap || this->_g1h->is_obj_dead_cond(this->_obj, _vo); + return !_is_in_heap || + // is_obj_dead* assume that obj is not in a Free region. + this->_g1h->heap_region_containing(this->_obj)->is_free() || + this->_g1h->is_obj_dead_cond(this->_obj, _vo); } void report_error() { From 68ffec9800b798927a050900a2d47000aa18ef30 Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Wed, 3 Jul 2024 20:43:08 +0000 Subject: [PATCH 290/471] 8335479: JFR: Missing documentation for -XX:StartFlightRecording Reviewed-by: mgronlun --- src/java.base/share/man/java.1 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/java.base/share/man/java.1 b/src/java.base/share/man/java.1 index 839d46e122833..133710abc25db 100644 --- a/src/java.base/share/man/java.1 +++ b/src/java.base/share/man/java.1 @@ -1710,10 +1710,12 @@ This prevents the JVM from exiting and keeps the process active so that you can attach a debugger to it to investigate the cause of the error. By default, this option is disabled. .TP -\f[V]-XX:StartFlightRecording=\f[R]\f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R] +\f[V]-XX:StartFlightRecording:\f[R]\f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R] Starts a JFR recording for the Java application. This option is equivalent to the \f[V]JFR.start\f[R] diagnostic command that starts a recording during runtime. +\f[V]-XX:StartFlightRecording:help\f[R] prints available options and +example command lines. You can set the following \f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R] entries when starting a JFR recording: .RS @@ -1760,6 +1762,8 @@ written when the recording is stopped, for example: .PP If %p and/or %t is specified in the filename, it expands to the JVM\[aq]s PID and the current timestamp, respectively. +The filename may also be a directory in which case, the filename is +generated from the PID and the current date in the specified directory. .RE .TP \f[V]name=\f[R]\f[I]identifier\f[R] @@ -1840,6 +1844,9 @@ The whitespace delimiter can be omitted for timespan values, i.e. 20ms. For more information about the settings syntax, see Javadoc of the jdk.jfr package. +.PP +To only see warnings and errors from JFR during startup set +-Xlog:jfr+startup=warning. .RE .TP \f[V]-XX:ThreadStackSize=\f[R]\f[I]size\f[R] From 587535c5b9bb258836b47c3a8c41ffb91bbfc131 Mon Sep 17 00:00:00 2001 From: David Holmes <dholmes@openjdk.org> Date: Wed, 3 Jul 2024 21:42:08 +0000 Subject: [PATCH 291/471] 8334545: runtime/ClassInitErrors/TestStackOverflowDuringInit.java fails after JDK-8294960 Reviewed-by: iklam, stuefe --- test/hotspot/jtreg/ProblemList.txt | 1 - .../TestStackOverflowDuringInit.java | 49 ++++++++++++++----- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index c55790de5ca58..d7088408ab887 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -108,7 +108,6 @@ runtime/StackGuardPages/TestStackGuardPagesNative.java 8303612 linux-all runtime/ErrorHandling/TestDwarf.java#checkDecoder 8305489 linux-all runtime/ErrorHandling/MachCodeFramesInErrorFile.java 8313315 linux-ppc64le runtime/cds/appcds/customLoader/HelloCustom_JFR.java 8241075 linux-all,windows-x64 -runtime/ClassInitErrors/TestStackOverflowDuringInit.java 8334545 generic-all applications/jcstress/copy.java 8229852 linux-all diff --git a/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java b/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java index 43a9985d8357f..3917abe85ad57 100644 --- a/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java +++ b/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,16 +23,15 @@ /** * @test - * @bug 8309034 + * @bug 8309034 8334545 * @summary Test that when saving a class initialization failure caused by * a StackOverflowError, that we record the SOE as the underlying * cause, even if we can't create the ExceptionInInitializerError - * @requires os.simpleArch == "x64" - * @comment The reproducer only fails in the desired way on x64. - * @requires vm.flagless * @comment This test could easily be perturbed so don't allow flag settings. - * - * @run main/othervm -Xss160K -Xint TestStackOverflowDuringInit + * @requires vm.flagless + * @comment Run with the smallest stack possible to limit the execution time. + * This is the smallest stack that is supported by all platforms. + * @run main/othervm -Xss240K -Xint TestStackOverflowDuringInit */ import java.io.ByteArrayOutputStream; @@ -51,11 +50,33 @@ public class TestStackOverflowDuringInit { // of another class, which is where we will fail to create the EIIE. // Even then this is non-trivial, only the use of Long.valueOf from // the original reproducer seems to trigger SOE in just the right places. + // Later changes to the JDK meant that LongCache was initialized before + // the test even started under jtreg so we define local versions. + + static class LongCache { + // Must have a static initializer + static { + System.out.println("LongCache is initializing"); + } + static java.lang.Long valueOf(long l) { + return Long.valueOf(l); + } + } + + static class MyLong { + static java.lang.Long valueOf(long l) { + if (l > -128 && l < 127) { + return LongCache.valueOf(l); + } else { + return Long.valueOf(l); + } + } + } static void recurse() { try { - // This will initialize Long but not touch LongCache. - Long.valueOf(1024L); + // This will initialize MyLong but not touch LongCache. + MyLong.valueOf(1024L); recurse(); } finally { // This will require initializing LongCache, which will @@ -63,14 +84,20 @@ static void recurse() { // will be marked erroneous. As we unwind and again execute this // we will throw NoClassDefFoundError due to the erroneous // state of LongCache. - Long.valueOf(0); + MyLong.valueOf(0); } } public static void main(String[] args) throws Exception { - String expected = "java.lang.NoClassDefFoundError: Could not initialize class java.lang.Long$LongCache"; + String expected = "java.lang.NoClassDefFoundError: Could not initialize class TestStackOverflowDuringInit$LongCache"; String cause = "Caused by: java.lang.StackOverflowError"; + // Pre-load, but not initialize, LongCache, else we will + // hit SOE during class loading. + System.out.println("Pre-loading ..."); + Class<?> c = Class.forName("TestStackOverflowDuringInit$LongCache", + false, + TestStackOverflowDuringInit.class.getClassLoader()); try { recurse(); } catch (Throwable ex) { From 3efa93ba1307cedf05609c0c04b2ba986a515f6e Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Wed, 3 Jul 2024 22:03:23 +0000 Subject: [PATCH 292/471] 8335588: Fix -Wzero-as-null-pointer-constant warnings in calls to Node ctor Reviewed-by: thartmann, chagedorn --- src/hotspot/share/opto/addnode.hpp | 4 ++-- src/hotspot/share/opto/convertnode.hpp | 4 ++-- src/hotspot/share/opto/countbitsnode.hpp | 4 ++-- src/hotspot/share/opto/intrinsicnode.hpp | 18 +++++++++--------- src/hotspot/share/opto/loopnode.hpp | 2 +- src/hotspot/share/opto/memnode.hpp | 2 +- src/hotspot/share/opto/movenode.hpp | 2 +- src/hotspot/share/opto/mulnode.hpp | 20 ++++++++++---------- src/hotspot/share/opto/opaquenode.hpp | 2 +- src/hotspot/share/opto/subnode.hpp | 10 +++++----- 10 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/hotspot/share/opto/addnode.hpp b/src/hotspot/share/opto/addnode.hpp index fd044d6eead63..8879606954a52 100644 --- a/src/hotspot/share/opto/addnode.hpp +++ b/src/hotspot/share/opto/addnode.hpp @@ -43,7 +43,7 @@ typedef const Pair<Node*, jint> ConstAddOperands; class AddNode : public Node { virtual uint hash() const; public: - AddNode( Node *in1, Node *in2 ) : Node(0,in1,in2) { + AddNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) { init_class_id(Class_Add); } @@ -165,7 +165,7 @@ class AddPNode : public Node { Base, // Base oop, for GC purposes Address, // Actually address, derived from base Offset } ; // Offset added to address - AddPNode( Node *base, Node *ptr, Node *off ) : Node(0,base,ptr,off) { + AddPNode( Node *base, Node *ptr, Node *off ) : Node(nullptr,base,ptr,off) { init_class_id(Class_AddP); } virtual int Opcode() const; diff --git a/src/hotspot/share/opto/convertnode.hpp b/src/hotspot/share/opto/convertnode.hpp index cf76f5ab6fde2..9438176a9f996 100644 --- a/src/hotspot/share/opto/convertnode.hpp +++ b/src/hotspot/share/opto/convertnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -260,7 +260,7 @@ class RoundDoubleModeNode: public Node { rmode_floor = 1, rmode_ceil = 2 }; - RoundDoubleModeNode(Node *in1, Node * rmode): Node(0, in1, rmode) {} + RoundDoubleModeNode(Node *in1, Node * rmode): Node(nullptr, in1, rmode) {} static RoundDoubleModeNode* make(PhaseGVN& gvn, Node* arg, RoundDoubleModeNode::RoundingMode rmode); virtual int Opcode() const; virtual const Type *bottom_type() const { return Type::DOUBLE; } diff --git a/src/hotspot/share/opto/countbitsnode.hpp b/src/hotspot/share/opto/countbitsnode.hpp index b0703d33326c9..410d51298829b 100644 --- a/src/hotspot/share/opto/countbitsnode.hpp +++ b/src/hotspot/share/opto/countbitsnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,7 +33,7 @@ class PhaseTransform; //---------- CountBitsNode ----------------------------------------------------- class CountBitsNode : public Node { public: - CountBitsNode(Node* in1) : Node(0, in1) {} + CountBitsNode(Node* in1) : Node(nullptr, in1) {} const Type* bottom_type() const { return TypeInt::INT; } virtual uint ideal_reg() const { return Op_RegI; } }; diff --git a/src/hotspot/share/opto/intrinsicnode.hpp b/src/hotspot/share/opto/intrinsicnode.hpp index e8ebad788eb21..bfb200b5e9695 100644 --- a/src/hotspot/share/opto/intrinsicnode.hpp +++ b/src/hotspot/share/opto/intrinsicnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -239,7 +239,7 @@ class WhitespaceNode : public Node { //------------------------------CopySign----------------------------------------- class CopySignDNode : public Node { protected: - CopySignDNode(Node* in1, Node* in2, Node* in3) : Node(0, in1, in2, in3) {} + CopySignDNode(Node* in1, Node* in2, Node* in3) : Node(nullptr, in1, in2, in3) {} public: static CopySignDNode* make(PhaseGVN& gvn, Node* in1, Node* in2); virtual int Opcode() const; @@ -249,7 +249,7 @@ class CopySignDNode : public Node { class CopySignFNode : public Node { public: - CopySignFNode(Node* in1, Node* in2) : Node(0, in1, in2) {} + CopySignFNode(Node* in1, Node* in2) : Node(nullptr, in1, in2) {} virtual int Opcode() const; const Type* bottom_type() const { return TypeLong::FLOAT; } virtual uint ideal_reg() const { return Op_RegF; } @@ -258,7 +258,7 @@ class CopySignFNode : public Node { //------------------------------Signum------------------------------------------- class SignumDNode : public Node { protected: - SignumDNode(Node* in1, Node* in2, Node* in3) : Node(0, in1, in2, in3) {} + SignumDNode(Node* in1, Node* in2, Node* in3) : Node(nullptr, in1, in2, in3) {} public: static SignumDNode* make(PhaseGVN& gvn, Node* in); virtual int Opcode() const; @@ -268,7 +268,7 @@ class SignumDNode : public Node { class SignumFNode : public Node { protected: - SignumFNode(Node* in1, Node* in2, Node* in3) : Node(0, in1, in2, in3) {} + SignumFNode(Node* in1, Node* in2, Node* in3) : Node(nullptr, in1, in2, in3) {} public: static SignumFNode* make(PhaseGVN& gvn, Node* in); virtual int Opcode() const; @@ -306,7 +306,7 @@ class ExpandBitsNode : public TypeNode { //---------- IsInfiniteFNode ----------------------------------------------------- class IsInfiniteFNode : public Node { public: - IsInfiniteFNode(Node* in1) : Node(0, in1) {} + IsInfiniteFNode(Node* in1) : Node(nullptr, in1) {} virtual int Opcode() const; const Type* bottom_type() const { return TypeInt::BOOL; } virtual uint ideal_reg() const { return Op_RegI; } @@ -315,7 +315,7 @@ class IsInfiniteFNode : public Node { //---------- IsInfiniteDNode ----------------------------------------------------- class IsInfiniteDNode : public Node { public: - IsInfiniteDNode(Node* in1) : Node(0, in1) {} + IsInfiniteDNode(Node* in1) : Node(nullptr, in1) {} virtual int Opcode() const; const Type* bottom_type() const { return TypeInt::BOOL; } virtual uint ideal_reg() const { return Op_RegI; } @@ -324,7 +324,7 @@ class IsInfiniteDNode : public Node { //---------- IsFiniteFNode ----------------------------------------------------- class IsFiniteFNode : public Node { public: - IsFiniteFNode(Node* in1) : Node(0, in1) {} + IsFiniteFNode(Node* in1) : Node(nullptr, in1) {} virtual int Opcode() const; const Type* bottom_type() const { return TypeInt::BOOL; } virtual uint ideal_reg() const { return Op_RegI; } @@ -333,7 +333,7 @@ class IsFiniteFNode : public Node { //---------- IsFiniteDNode ----------------------------------------------------- class IsFiniteDNode : public Node { public: - IsFiniteDNode(Node* in1) : Node(0, in1) {} + IsFiniteDNode(Node* in1) : Node(nullptr, in1) {} virtual int Opcode() const; const Type* bottom_type() const { return TypeInt::BOOL; } virtual uint ideal_reg() const { return Op_RegI; } diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp index 448c29b6976bb..7d78bf5021c22 100644 --- a/src/hotspot/share/opto/loopnode.hpp +++ b/src/hotspot/share/opto/loopnode.hpp @@ -514,7 +514,7 @@ inline jlong BaseCountedLoopNode::stride_con() const { class LoopLimitNode : public Node { enum { Init=1, Limit=2, Stride=3 }; public: - LoopLimitNode( Compile* C, Node *init, Node *limit, Node *stride ) : Node(0,init,limit,stride) { + LoopLimitNode( Compile* C, Node *init, Node *limit, Node *stride ) : Node(nullptr,init,limit,stride) { // Put it on the Macro nodes list to optimize during macro nodes expansion. init_flags(Flag_is_macro); C->add_macro_node(this); diff --git a/src/hotspot/share/opto/memnode.hpp b/src/hotspot/share/opto/memnode.hpp index e0f5a4374133a..1b65585f1a006 100644 --- a/src/hotspot/share/opto/memnode.hpp +++ b/src/hotspot/share/opto/memnode.hpp @@ -1681,7 +1681,7 @@ class CacheWBPostSyncNode : public Node { // Allocation prefetch which may fault, TLAB size have to be adjusted. class PrefetchAllocationNode : public Node { public: - PrefetchAllocationNode(Node *mem, Node *adr) : Node(0,mem,adr) {} + PrefetchAllocationNode(Node *mem, Node *adr) : Node(nullptr,mem,adr) {} virtual int Opcode() const; virtual uint ideal_reg() const { return NotAMachineReg; } virtual uint match_edge(uint idx) const { return idx==2; } diff --git a/src/hotspot/share/opto/movenode.hpp b/src/hotspot/share/opto/movenode.hpp index ae1e8563da368..02db0c73079f8 100644 --- a/src/hotspot/share/opto/movenode.hpp +++ b/src/hotspot/share/opto/movenode.hpp @@ -158,7 +158,7 @@ class MoveD2LNode : public MoveNode { // (CMove (Binary bol cmp) (Binary src1 src2)) class BinaryNode : public Node { public: - BinaryNode( Node *n1, Node *n2 ) : Node(0,n1,n2) { } + BinaryNode( Node *n1, Node *n2 ) : Node(nullptr,n1,n2) { } virtual int Opcode() const; virtual uint ideal_reg() const { return 0; } }; diff --git a/src/hotspot/share/opto/mulnode.hpp b/src/hotspot/share/opto/mulnode.hpp index 10ef442299d87..4c5e3e33248da 100644 --- a/src/hotspot/share/opto/mulnode.hpp +++ b/src/hotspot/share/opto/mulnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -167,7 +167,7 @@ const Type* MulHiValue(const Type *t1, const Type *t2, const Type *bot); // Upper 64 bits of a 64 bit by 64 bit multiply class MulHiLNode : public Node { public: - MulHiLNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {} + MulHiLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {} virtual int Opcode() const; virtual const Type* Value(PhaseGVN* phase) const; const Type *bottom_type() const { return TypeLong::LONG; } @@ -178,7 +178,7 @@ class MulHiLNode : public Node { // Upper 64 bits of a 64 bit by 64 bit unsigned multiply class UMulHiLNode : public Node { public: - UMulHiLNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {} + UMulHiLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {} virtual int Opcode() const; virtual const Type* Value(PhaseGVN* phase) const; const Type *bottom_type() const { return TypeLong::LONG; } @@ -291,7 +291,7 @@ class RotateRightNode : public TypeNode { // Signed shift right class RShiftINode : public Node { public: - RShiftINode( Node *in1, Node *in2 ) : Node(0,in1,in2) {} + RShiftINode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {} virtual int Opcode() const; virtual Node* Identity(PhaseGVN* phase); virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); @@ -304,7 +304,7 @@ class RShiftINode : public Node { // Signed shift right class RShiftLNode : public Node { public: - RShiftLNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {} + RShiftLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {} virtual int Opcode() const; virtual Node* Identity(PhaseGVN* phase); virtual const Type* Value(PhaseGVN* phase) const; @@ -316,7 +316,7 @@ class RShiftLNode : public Node { // Logical shift right class URShiftBNode : public Node { public: - URShiftBNode( Node *in1, Node *in2 ) : Node(0,in1,in2) { + URShiftBNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) { ShouldNotReachHere(); // only vector variant is used } virtual int Opcode() const; @@ -326,7 +326,7 @@ class URShiftBNode : public Node { // Logical shift right class URShiftSNode : public Node { public: - URShiftSNode( Node *in1, Node *in2 ) : Node(0,in1,in2) { + URShiftSNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) { ShouldNotReachHere(); // only vector variant is used } virtual int Opcode() const; @@ -336,7 +336,7 @@ class URShiftSNode : public Node { // Logical shift right class URShiftINode : public Node { public: - URShiftINode( Node *in1, Node *in2 ) : Node(0,in1,in2) {} + URShiftINode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {} virtual int Opcode() const; virtual Node* Identity(PhaseGVN* phase); virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); @@ -349,7 +349,7 @@ class URShiftINode : public Node { // Logical shift right class URShiftLNode : public Node { public: - URShiftLNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {} + URShiftLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {} virtual int Opcode() const; virtual Node* Identity(PhaseGVN* phase); virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); @@ -396,7 +396,7 @@ class FmaFNode : public FmaNode { class MulAddS2INode : public Node { virtual uint hash() const; public: - MulAddS2INode(Node* in1, Node *in2, Node *in3, Node* in4) : Node(0, in1, in2, in3, in4) {} + MulAddS2INode(Node* in1, Node *in2, Node *in3, Node* in4) : Node(nullptr, in1, in2, in3, in4) {} virtual int Opcode() const; const Type *bottom_type() const { return TypeInt::INT; } virtual uint ideal_reg() const { return Op_RegI; } diff --git a/src/hotspot/share/opto/opaquenode.hpp b/src/hotspot/share/opto/opaquenode.hpp index 4617979c2e494..9c775408cc0cd 100644 --- a/src/hotspot/share/opto/opaquenode.hpp +++ b/src/hotspot/share/opto/opaquenode.hpp @@ -140,7 +140,7 @@ class ProfileBooleanNode : public Node { virtual uint hash() const ; // { return NO_HASH; } virtual bool cmp( const Node &n ) const; public: - ProfileBooleanNode(Node *n, uint false_cnt, uint true_cnt) : Node(0, n), + ProfileBooleanNode(Node *n, uint false_cnt, uint true_cnt) : Node(nullptr, n), _false_cnt(false_cnt), _true_cnt(true_cnt), _consumed(false), _delay_removal(true) {} uint false_count() const { return _false_cnt; } diff --git a/src/hotspot/share/opto/subnode.hpp b/src/hotspot/share/opto/subnode.hpp index f424e258db2cf..a0c052645c69c 100644 --- a/src/hotspot/share/opto/subnode.hpp +++ b/src/hotspot/share/opto/subnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ // are compressed into -1, and all positive answers compressed to 1. class SubNode : public Node { public: - SubNode( Node *in1, Node *in2 ) : Node(0,in1,in2) { + SubNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) { init_class_id(Class_Sub); } @@ -363,7 +363,7 @@ class BoolNode : public Node { // for finding this pattern in the graph. class AbsNode : public Node { public: - AbsNode( Node *value ) : Node(0,value) {} + AbsNode( Node *value ) : Node(nullptr,value) {} virtual Node* Identity(PhaseGVN* phase); virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); virtual const Type* Value(PhaseGVN* phase) const; @@ -420,7 +420,7 @@ class AbsDNode : public AbsNode { // If p < q, return -1 else return 0. Nice for flow-free idioms. class CmpLTMaskNode : public Node { public: - CmpLTMaskNode( Node *p, Node *q ) : Node(0, p, q) {} + CmpLTMaskNode( Node *p, Node *q ) : Node(nullptr, p, q) {} virtual int Opcode() const; const Type *bottom_type() const { return TypeInt::INT; } virtual uint ideal_reg() const { return Op_RegI; } @@ -430,7 +430,7 @@ class CmpLTMaskNode : public Node { //------------------------------NegNode---------------------------------------- class NegNode : public Node { public: - NegNode(Node* in1) : Node(0, in1) { + NegNode(Node* in1) : Node(nullptr, in1) { init_class_id(Class_Neg); } }; From e01626cf09850f7b0af33cdb905ca8992266fe5b Mon Sep 17 00:00:00 2001 From: David Holmes <dholmes@openjdk.org> Date: Thu, 4 Jul 2024 04:18:31 +0000 Subject: [PATCH 293/471] 8335655: ProblemList serviceability/dcmd/vm tests failing after JDK-8322475 Reviewed-by: mikael --- test/hotspot/jtreg/ProblemList-generational-zgc.txt | 3 +++ test/hotspot/jtreg/ProblemList-zgc.txt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/test/hotspot/jtreg/ProblemList-generational-zgc.txt b/test/hotspot/jtreg/ProblemList-generational-zgc.txt index db8182641ac54..bdeed9947c571 100644 --- a/test/hotspot/jtreg/ProblemList-generational-zgc.txt +++ b/test/hotspot/jtreg/ProblemList-generational-zgc.txt @@ -114,4 +114,7 @@ serviceability/sa/sadebugd/PmapOnDebugdTest.java 8307393 generic- serviceability/sa/sadebugd/RunCommandOnServerTest.java 8307393 generic-all serviceability/sa/sadebugd/SADebugDTest.java 8307393 generic-all +serviceability/dcmd/vm/SystemMapTest.java 8335643 generic-all +serviceability/dcmd/vm/SystemDumpMapTest.java 8335643 generic-all + vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java 8289582 windows-x64 diff --git a/test/hotspot/jtreg/ProblemList-zgc.txt b/test/hotspot/jtreg/ProblemList-zgc.txt index 1afe56c99f8af..892c980b0696d 100644 --- a/test/hotspot/jtreg/ProblemList-zgc.txt +++ b/test/hotspot/jtreg/ProblemList-zgc.txt @@ -45,4 +45,7 @@ serviceability/sa/TestSysProps.java 8302055 generic- serviceability/sa/TestHeapDumpForInvokeDynamic.java 8315646 generic-all +serviceability/dcmd/vm/SystemMapTest.java 8335643 generic-all +serviceability/dcmd/vm/SystemDumpMapTest.java 8335643 generic-all + vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java 8289582 windows-x64 From 7b894bc4afa96bc04f0d58042f69becadb573e20 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Thu, 4 Jul 2024 05:44:44 +0000 Subject: [PATCH 294/471] 8332786: When dumping static CDS archives, explicitly assert that we don't use a CDS archive Reviewed-by: iklam, dholmes --- src/hotspot/share/cds/metaspaceShared.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hotspot/share/cds/metaspaceShared.cpp b/src/hotspot/share/cds/metaspaceShared.cpp index a5061fef567e3..4d978a7ad880f 100644 --- a/src/hotspot/share/cds/metaspaceShared.cpp +++ b/src/hotspot/share/cds/metaspaceShared.cpp @@ -510,6 +510,8 @@ char* VM_PopulateDumpSharedSpace::dump_read_only_tables() { } void VM_PopulateDumpSharedSpace::doit() { + guarantee(!CDSConfig::is_using_archive(), "We should not be using an archive when we dump"); + DEBUG_ONLY(SystemDictionaryShared::NoClassLoadingMark nclm); FileMapInfo::check_nonempty_dir_in_shared_path_table(); From 38a578d547f39c3637d97f5e0242f4a69f3bbb31 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Thu, 4 Jul 2024 06:20:03 +0000 Subject: [PATCH 295/471] 8334738: os::print_hex_dump should optionally print ASCII Reviewed-by: dholmes, sgehwolf --- .../windows_aarch64/os_windows_aarch64.cpp | 4 +- src/hotspot/share/cds/archiveBuilder.cpp | 2 +- src/hotspot/share/runtime/os.cpp | 89 ++++++++---- src/hotspot/share/runtime/os.hpp | 8 +- .../share/utilities/globalDefinitions.hpp | 1 + src/hotspot/share/utilities/ostream.hpp | 1 + test/hotspot/gtest/runtime/test_os.cpp | 131 ++++++++++-------- 7 files changed, 144 insertions(+), 92 deletions(-) diff --git a/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp b/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp index 78e98609b6bdc..722c3c8dd608d 100644 --- a/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp +++ b/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, Microsoft Corporation. All rights reserved. - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -219,7 +219,7 @@ void os::print_tos_pc(outputStream *st, const void *context) { // this at the end, and hope for the best. address pc = (address)uc->Pc; st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc); - print_hex_dump(st, pc - 32, pc + 32, sizeof(char)); + print_hex_dump(st, pc - 32, pc + 32, sizeof(char), /* print_ascii=*/false); st->cr(); } diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp index a87a3ff042dec..fdbb6605c13e9 100644 --- a/src/hotspot/share/cds/archiveBuilder.cpp +++ b/src/hotspot/share/cds/archiveBuilder.cpp @@ -1273,7 +1273,7 @@ class ArchiveBuilder::CDSMapLogger : AllStatic { // longs and doubles will be split into two words. unitsize = sizeof(narrowOop); } - os::print_hex_dump(&lsh, base, top, unitsize, 32, requested_base); + os::print_hex_dump(&lsh, base, top, unitsize, /* print_ascii=*/true, /* bytes_per_line=*/32, requested_base); } } diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp index 97bf33fbaaa7c..d141ee244262b 100644 --- a/src/hotspot/share/runtime/os.cpp +++ b/src/hotspot/share/runtime/os.cpp @@ -938,56 +938,73 @@ bool os::print_function_and_library_name(outputStream* st, return have_function_name || have_library_name; } -ATTRIBUTE_NO_ASAN static bool read_safely_from(intptr_t* p, intptr_t* result) { - const intptr_t errval = 0x1717; - intptr_t i = SafeFetchN(p, errval); +ATTRIBUTE_NO_ASAN static bool read_safely_from(const uintptr_t* p, uintptr_t* result) { + DEBUG_ONLY(*result = 0xAAAA;) + const uintptr_t errval = 0x1717; + uintptr_t i = (uintptr_t)SafeFetchN((intptr_t*)p, errval); if (i == errval) { - i = SafeFetchN(p, ~errval); + i = (uintptr_t)SafeFetchN((intptr_t*)p, ~errval); if (i == ~errval) { return false; } } - (*result) = i; + (*result) = (uintptr_t)i; return true; } -static void print_hex_location(outputStream* st, address p, int unitsize) { +// Helper for os::print_hex_dump +static void print_ascii_form(stringStream& ascii_form, uint64_t value, int unitsize) { + union { + uint64_t v; + uint8_t c[sizeof(v)]; + } u = { value }; + for (int i = 0; i < unitsize; i++) { + const int idx = LITTLE_ENDIAN_ONLY(i) BIG_ENDIAN_ONLY(sizeof(u.v) - 1 - i); + const uint8_t c = u.c[idx]; + ascii_form.put(isprint(c) && isascii(c) ? c : '.'); + } +} + +// Helper for os::print_hex_dump +static void print_hex_location(outputStream* st, const_address p, int unitsize, stringStream& ascii_form) { assert(is_aligned(p, unitsize), "Unaligned"); - address pa = align_down(p, sizeof(intptr_t)); + const uintptr_t* pa = (const uintptr_t*) align_down(p, sizeof(intptr_t)); #ifndef _LP64 // Special handling for printing qwords on 32-bit platforms if (unitsize == 8) { - intptr_t i1, i2; - if (read_safely_from((intptr_t*)pa, &i1) && - read_safely_from((intptr_t*)pa + 1, &i2)) { + uintptr_t i1 = 0, i2 = 0; + if (read_safely_from(pa, &i1) && + read_safely_from(pa + 1, &i2)) { const uint64_t value = LITTLE_ENDIAN_ONLY((((uint64_t)i2) << 32) | i1) BIG_ENDIAN_ONLY((((uint64_t)i1) << 32) | i2); st->print("%016" FORMAT64_MODIFIER "x", value); + print_ascii_form(ascii_form, value, unitsize); } else { st->print_raw("????????????????"); } return; } #endif // 32-bit, qwords - intptr_t i = 0; - if (read_safely_from((intptr_t*)pa, &i)) { + uintptr_t i = 0; + if (read_safely_from(pa, &i)) { // bytes: CA FE BA BE DE AD C0 DE // bytoff: 0 1 2 3 4 5 6 7 // LE bits: 0 8 16 24 32 40 48 56 // BE bits: 56 48 40 32 24 16 8 0 - const int offset = (int)(p - (address)pa); + const int offset = (int)(p - (const_address)pa); const int bitoffset = LITTLE_ENDIAN_ONLY(offset * BitsPerByte) BIG_ENDIAN_ONLY((int)((sizeof(intptr_t) - unitsize - offset) * BitsPerByte)); const int bitfieldsize = unitsize * BitsPerByte; - intptr_t value = bitfield(i, bitoffset, bitfieldsize); + uintptr_t value = bitfield(i, bitoffset, bitfieldsize); switch (unitsize) { case 1: st->print("%02x", (u1)value); break; case 2: st->print("%04x", (u2)value); break; case 4: st->print("%08x", (u4)value); break; case 8: st->print("%016" FORMAT64_MODIFIER "x", (u8)value); break; } + print_ascii_form(ascii_form, value, unitsize); } else { switch (unitsize) { case 1: st->print_raw("??"); break; @@ -998,36 +1015,56 @@ static void print_hex_location(outputStream* st, address p, int unitsize) { } } -void os::print_hex_dump(outputStream* st, address start, address end, int unitsize, - int bytes_per_line, address logical_start) { +void os::print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize, + bool print_ascii, int bytes_per_line, const_address logical_start) { + constexpr int max_bytes_per_line = 64; assert(unitsize == 1 || unitsize == 2 || unitsize == 4 || unitsize == 8, "just checking"); + assert(bytes_per_line > 0 && bytes_per_line <= max_bytes_per_line && + is_power_of_2(bytes_per_line), "invalid bytes_per_line"); start = align_down(start, unitsize); logical_start = align_down(logical_start, unitsize); bytes_per_line = align_up(bytes_per_line, 8); int cols = 0; - int cols_per_line = bytes_per_line / unitsize; + const int cols_per_line = bytes_per_line / unitsize; - address p = start; - address logical_p = logical_start; + const_address p = start; + const_address logical_p = logical_start; + + stringStream ascii_form; // Print out the addresses as if we were starting from logical_start. - st->print(PTR_FORMAT ": ", p2i(logical_p)); while (p < end) { - print_hex_location(st, p, unitsize); + if (cols == 0) { + st->print(PTR_FORMAT ": ", p2i(logical_p)); + } + print_hex_location(st, p, unitsize, ascii_form); p += unitsize; logical_p += unitsize; cols++; - if (cols >= cols_per_line && p < end) { - cols = 0; + if (cols >= cols_per_line) { + if (print_ascii && !ascii_form.is_empty()) { + st->print(" %s", ascii_form.base()); + } + ascii_form.reset(); st->cr(); - st->print(PTR_FORMAT ": ", p2i(logical_p)); + cols = 0; } else { st->print(" "); } } - st->cr(); + + if (cols > 0) { // did not print a full line + if (print_ascii) { + // indent last ascii part to match that of full lines + const int size_of_printed_unit = unitsize * 2; + const int space_left = (cols_per_line - cols) * (size_of_printed_unit + 1); + st->sp(space_left); + st->print(" %s", ascii_form.base()); + } + st->cr(); + } } void os::print_dhm(outputStream* st, const char* startStr, long sec) { @@ -1045,7 +1082,7 @@ void os::print_tos(outputStream* st, address sp) { void os::print_instructions(outputStream* st, address pc, int unitsize) { st->print_cr("Instructions: (pc=" PTR_FORMAT ")", p2i(pc)); - print_hex_dump(st, pc - 256, pc + 256, unitsize); + print_hex_dump(st, pc - 256, pc + 256, unitsize, /* print_ascii=*/false); } void os::print_environment_variables(outputStream* st, const char** env_list) { diff --git a/src/hotspot/share/runtime/os.hpp b/src/hotspot/share/runtime/os.hpp index f3f44ddb2e659..af8eb8c8b9a13 100644 --- a/src/hotspot/share/runtime/os.hpp +++ b/src/hotspot/share/runtime/os.hpp @@ -856,10 +856,10 @@ class os: AllStatic { // return current frame. pc() and sp() are set to null on failure. static frame current_frame(); - static void print_hex_dump(outputStream* st, address start, address end, int unitsize, - int bytes_per_line, address logical_start); - static void print_hex_dump(outputStream* st, address start, address end, int unitsize) { - print_hex_dump(st, start, end, unitsize, /*bytes_per_line=*/16, /*logical_start=*/start); + static void print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize, bool print_ascii, + int bytes_per_line, const_address logical_start); + static void print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize, bool print_ascii = true) { + print_hex_dump(st, start, end, unitsize, print_ascii, /*bytes_per_line=*/16, /*logical_start=*/start); } // returns a string to describe the exception/signal; diff --git a/src/hotspot/share/utilities/globalDefinitions.hpp b/src/hotspot/share/utilities/globalDefinitions.hpp index a15a4de3e93dc..74817a35e7706 100644 --- a/src/hotspot/share/utilities/globalDefinitions.hpp +++ b/src/hotspot/share/utilities/globalDefinitions.hpp @@ -455,6 +455,7 @@ typedef unsigned int uint; NEEDS_CLEANUP typedef signed char s_char; typedef unsigned char u_char; typedef u_char* address; +typedef const u_char* const_address; // Pointer subtraction. // The idea here is to avoid ptrdiff_t, which is signed and so doesn't have diff --git a/src/hotspot/share/utilities/ostream.hpp b/src/hotspot/share/utilities/ostream.hpp index beb02309d3f23..9faaf32fb6bc1 100644 --- a/src/hotspot/share/utilities/ostream.hpp +++ b/src/hotspot/share/utilities/ostream.hpp @@ -267,6 +267,7 @@ class stringStream : public outputStream { return _buffer; }; void reset(); + bool is_empty() const { return _buffer[0] == '\0'; } // Copy to a resource, or C-heap, array as requested char* as_string(bool c_heap = false) const; }; diff --git a/test/hotspot/gtest/runtime/test_os.cpp b/test/hotspot/gtest/runtime/test_os.cpp index 55d30349ee5a9..654c2c60673ba 100644 --- a/test/hotspot/gtest/runtime/test_os.cpp +++ b/test/hotspot/gtest/runtime/test_os.cpp @@ -167,82 +167,95 @@ TEST_VM_ASSERT_MSG(os, page_size_for_region_with_zero_min_pages, } #endif -static void do_test_print_hex_dump(address addr, size_t len, int unitsize, const char* expected) { - char buf[256]; +#ifndef AIX +// Test relies on the ability to protect memory allocated with os::reserve_memory. AIX may not be able +// to do that (mprotect won't work on System V shm). +static void do_test_print_hex_dump(const_address from, const_address to, int unitsize, int bytes_per_line, + const_address logical_start, const char* expected) { + char buf[2048]; buf[0] = '\0'; stringStream ss(buf, sizeof(buf)); - os::print_hex_dump(&ss, addr, addr + len, unitsize); - // tty->print_cr("expected: %s", expected); - // tty->print_cr("result: %s", buf); - EXPECT_THAT(buf, HasSubstr(expected)); + os::print_hex_dump(&ss, from, to, unitsize, /* print_ascii=*/true, bytes_per_line, logical_start); + EXPECT_STREQ(buf, expected); } TEST_VM(os, test_print_hex_dump) { - const char* pattern [4] = { -#ifdef VM_LITTLE_ENDIAN - "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f", - "0100 0302 0504 0706 0908 0b0a 0d0c 0f0e", - "03020100 07060504 0b0a0908 0f0e0d0c", - "0706050403020100 0f0e0d0c0b0a0908" + +#ifdef _LP64 +#define ADDRESS1 "0x0000aaaaaaaaaa00" +#define ADDRESS2 "0x0000aaaaaaaaaa20" +#define ADDRESS3 "0x0000aaaaaaaaaa40" #else - "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f", - "0001 0203 0405 0607 0809 0a0b 0c0d 0e0f", - "00010203 04050607 08090a0b 0c0d0e0f", - "0001020304050607 08090a0b0c0d0e0f" +#define ADDRESS1 "0xaaaaaa00" +#define ADDRESS2 "0xaaaaaa20" +#define ADDRESS3 "0xaaaaaa40" #endif - }; - const char* pattern_not_readable [4] = { - "?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??", - "???? ???? ???? ???? ???? ???? ???? ????", - "???????? ???????? ???????? ????????", - "???????????????? ????????????????" - }; +#define ASCII_1 "....#.jdk/internal/loader/Native" +#define ASCII_2 "Libraries......." - // On AIX, zero page is readable. - address unreadable = -#ifdef AIX - (address) 0xFFFFFFFFFFFF0000ULL; +#define PAT_1 ADDRESS1 ": ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??\n" \ + ADDRESS2 ": ff ff e0 dc 23 00 6a 64 6b 2f 69 6e 74 65 72 6e 61 6c 2f 6c 6f 61 64 65 72 2f 4e 61 74 69 76 65 " ASCII_1 "\n" \ + ADDRESS3 ": 4c 69 62 72 61 72 69 65 73 00 00 00 00 00 00 00 " ASCII_2 "\n" + +#ifdef VM_LITTLE_ENDIAN +#define PAT_2 ADDRESS1 ": ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????\n" \ + ADDRESS2 ": ffff dce0 0023 646a 2f6b 6e69 6574 6e72 6c61 6c2f 616f 6564 2f72 614e 6974 6576 " ASCII_1 "\n" \ + ADDRESS3 ": 694c 7262 7261 6569 0073 0000 0000 0000 " ASCII_2 "\n" + +#define PAT_4 ADDRESS1 ": ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????\n" \ + ADDRESS2 ": dce0ffff 646a0023 6e692f6b 6e726574 6c2f6c61 6564616f 614e2f72 65766974 " ASCII_1 "\n" \ + ADDRESS3 ": 7262694c 65697261 00000073 00000000 " ASCII_2 "\n" + +#define PAT_8 ADDRESS1 ": ???????????????? ???????????????? ???????????????? ????????????????\n" \ + ADDRESS2 ": 646a0023dce0ffff 6e7265746e692f6b 6564616f6c2f6c61 65766974614e2f72 " ASCII_1 "\n" \ + ADDRESS3 ": 656972617262694c 0000000000000073 " ASCII_2 "\n" #else - (address) 0 -#endif - ; +#define PAT_2 ADDRESS1 ": ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????\n" \ + ADDRESS2 ": ffff e0dc 2300 6a64 6b2f 696e 7465 726e 616c 2f6c 6f61 6465 722f 4e61 7469 7665 " ASCII_1 "\n" \ + ADDRESS3 ": 4c69 6272 6172 6965 7300 0000 0000 0000 " ASCII_2 "\n" - ResourceMark rm; - char buf[64]; - stringStream ss(buf, sizeof(buf)); - outputStream* out = &ss; -// outputStream* out = tty; // enable for printout - - // Test dumping unreadable memory - // Exclude test for Windows for now, since it needs SEH handling to work which cannot be - // guaranteed when we call directly into VM code. (see JDK-8220220) -#ifndef _WIN32 - do_test_print_hex_dump(unreadable, 100, 1, pattern_not_readable[0]); - do_test_print_hex_dump(unreadable, 100, 2, pattern_not_readable[1]); - do_test_print_hex_dump(unreadable, 100, 4, pattern_not_readable[2]); - do_test_print_hex_dump(unreadable, 100, 8, pattern_not_readable[3]); +#define PAT_4 ADDRESS1 ": ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????\n" \ + ADDRESS2 ": ffffe0dc 23006a64 6b2f696e 7465726e 616c2f6c 6f616465 722f4e61 74697665 " ASCII_1 "\n" \ + ADDRESS3 ": 4c696272 61726965 73000000 00000000 " ASCII_2 "\n" + +#define PAT_8 ADDRESS1 ": ???????????????? ???????????????? ???????????????? ????????????????\n" \ + ADDRESS2 ": ffffe0dc23006a64 6b2f696e7465726e 616c2f6c6f616465 722f4e6174697665 " ASCII_1 "\n" \ + ADDRESS3 ": 4c69627261726965 7300000000000000 " ASCII_2 "\n" #endif - // Test dumping readable memory - address arr = (address)os::malloc(100, mtInternal); - for (u1 c = 0; c < 100; c++) { - arr[c] = c; - } + constexpr uint8_t bytes[] = { + 0xff, 0xff, 0xe0, 0xdc, 0x23, 0x00, 0x6a, 0x64, 0x6b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + // two pages, first one protected. + const size_t ps = os::vm_page_size(); + char* two_pages = os::reserve_memory(ps * 2, false, mtTest); + os::commit_memory(two_pages, ps * 2, false); + os::protect_memory(two_pages, ps, os::MEM_PROT_NONE, true); + + memcpy(two_pages + ps, bytes, sizeof(bytes)); + + // print + const const_address from = (const_address) two_pages + ps - 32; + const const_address to = (const_address) from + 32 + sizeof(bytes); + const const_address logical_start = (const_address) LP64_ONLY(0xAAAAAAAAAA00ULL) NOT_LP64(0xAAAAAA00ULL); - // properly aligned - do_test_print_hex_dump(arr, 100, 1, pattern[0]); - do_test_print_hex_dump(arr, 100, 2, pattern[1]); - do_test_print_hex_dump(arr, 100, 4, pattern[2]); - do_test_print_hex_dump(arr, 100, 8, pattern[3]); + do_test_print_hex_dump(from, to, 1, 32, logical_start, PAT_1); + do_test_print_hex_dump(from, to, 2, 32, logical_start, PAT_2); + do_test_print_hex_dump(from, to, 4, 32, logical_start, PAT_4); + do_test_print_hex_dump(from, to, 8, 32, logical_start, PAT_8); - // Not properly aligned. Should automatically down-align by unitsize - do_test_print_hex_dump(arr + 1, 100, 2, pattern[1]); - do_test_print_hex_dump(arr + 1, 100, 4, pattern[2]); - do_test_print_hex_dump(arr + 1, 100, 8, pattern[3]); + // unaligned printing, should align to next lower unitsize + do_test_print_hex_dump(from + 1, to, 2, 32, logical_start, PAT_2); + do_test_print_hex_dump(from + 1, to, 4, 32, logical_start, PAT_4); + do_test_print_hex_dump(from + 1, to, 8, 32, logical_start, PAT_8); - os::free(arr); + os::release_memory(two_pages, ps * 2); } +#endif // not AIX ////////////////////////////////////////////////////////////////////////////// // Test os::vsnprintf and friends. From b20e8c8e85e0a0e96ae648f42ff803f1c83f6291 Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas <aboldtch@openjdk.org> Date: Thu, 4 Jul 2024 08:21:18 +0000 Subject: [PATCH 296/471] 8335397: Improve reliability of TestRecursiveMonitorChurn.java Reviewed-by: coleenp, rkennke, dholmes --- src/hotspot/share/prims/whitebox.cpp | 9 ++ src/hotspot/share/prims/whitebox.hpp | 1 + src/hotspot/share/runtime/synchronizer.hpp | 1 + .../locking/TestRecursiveMonitorChurn.java | 82 ++++++++----------- test/lib/jdk/test/whitebox/WhiteBox.java | 2 + 5 files changed, 46 insertions(+), 49 deletions(-) diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index 5ed593b0d2f8e..c480f8a09ac1c 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -1115,6 +1115,10 @@ bool WhiteBox::compile_method(Method* method, int comp_level, int bci, JavaThrea return false; } +size_t WhiteBox::get_in_use_monitor_count() { + return ObjectSynchronizer::_in_use_list.count(); +} + WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci)) jmethodID jmid = reflected_method_to_jmid(thread, env, method); CHECK_JNI_EXCEPTION_(env, JNI_FALSE); @@ -1850,6 +1854,10 @@ WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj)) return (jboolean) obj_oop->mark().has_monitor(); WB_END +WB_ENTRY(jlong, WB_getInUseMonitorCount(JNIEnv* env, jobject wb)) + return (jlong) WhiteBox::get_in_use_monitor_count(); +WB_END + WB_ENTRY(jint, WB_getLockStackCapacity(JNIEnv* env)) return (jint) LockStack::CAPACITY; WB_END @@ -2844,6 +2852,7 @@ static JNINativeMethod methods[] = { (void*)&WB_AddModuleExportsToAll }, {CC"deflateIdleMonitors", CC"()Z", (void*)&WB_DeflateIdleMonitors }, {CC"isMonitorInflated0", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated }, + {CC"getInUseMonitorCount", CC"()J", (void*)&WB_getInUseMonitorCount }, {CC"getLockStackCapacity", CC"()I", (void*)&WB_getLockStackCapacity }, {CC"supportsRecursiveLightweightLocking", CC"()Z", (void*)&WB_supportsRecursiveLightweightLocking }, {CC"forceSafepoint", CC"()V", (void*)&WB_ForceSafepoint }, diff --git a/src/hotspot/share/prims/whitebox.hpp b/src/hotspot/share/prims/whitebox.hpp index a88f8d218439f..c5072b97d4f22 100644 --- a/src/hotspot/share/prims/whitebox.hpp +++ b/src/hotspot/share/prims/whitebox.hpp @@ -68,6 +68,7 @@ class WhiteBox : public AllStatic { JNINativeMethod* method_array, int method_count); static void register_extended(JNIEnv* env, jclass wbclass, JavaThread* thread); static bool compile_method(Method* method, int comp_level, int bci, JavaThread* THREAD); + static size_t get_in_use_monitor_count(); #ifdef LINUX static bool validate_cgroup(const char* proc_cgroups, const char* proc_self_cgroup, const char* proc_self_mountinfo, u1* cg_flags); #endif diff --git a/src/hotspot/share/runtime/synchronizer.hpp b/src/hotspot/share/runtime/synchronizer.hpp index 7406af678e0e7..493303df66124 100644 --- a/src/hotspot/share/runtime/synchronizer.hpp +++ b/src/hotspot/share/runtime/synchronizer.hpp @@ -69,6 +69,7 @@ class MonitorList::Iterator { class ObjectSynchronizer : AllStatic { friend class VMStructs; friend class ObjectMonitorDeflationLogging; + friend class WhiteBox; public: typedef enum { diff --git a/test/hotspot/jtreg/runtime/locking/TestRecursiveMonitorChurn.java b/test/hotspot/jtreg/runtime/locking/TestRecursiveMonitorChurn.java index 47cb561317196..19dd90015bf1c 100644 --- a/test/hotspot/jtreg/runtime/locking/TestRecursiveMonitorChurn.java +++ b/test/hotspot/jtreg/runtime/locking/TestRecursiveMonitorChurn.java @@ -21,19 +21,21 @@ * questions. */ -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.process.ProcessTools; - -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /* * @test * @summary Tests that recursive locking doesn't cause excessive native memory usage * @library /test/lib - * @run driver TestRecursiveMonitorChurn + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -Xmx100M -XX:AsyncDeflationInterval=0 -XX:GuaranteedAsyncDeflationInterval=0 + * -Xlog:monitorinflation=trace + * TestRecursiveMonitorChurn */ + +import jdk.test.whitebox.WhiteBox; +import jtreg.SkippedException; + public class TestRecursiveMonitorChurn { static class Monitor { public static volatile int i, j; @@ -46,50 +48,32 @@ synchronized void doSomethingElse() { } } - public static volatile Monitor monitor; - public static void main(String[] args) throws IOException { - if (args.length == 1 && args[0].equals("test")) { - // The actual test, in a forked JVM. - for (int i = 0; i < 100000; i++) { - monitor = new Monitor(); - monitor.doSomething(); - } - System.out.println("i + j = " + (Monitor.i + Monitor.j)); - } else { - ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( - "-XX:+UnlockDiagnosticVMOptions", - "-Xmx100M", "-XX:AsyncDeflationInterval=0", "-XX:GuaranteedAsyncDeflationInterval=0", - "-XX:NativeMemoryTracking=summary", "-XX:+PrintNMTStatistics", - "TestRecursiveMonitorChurn", - "test"); - OutputAnalyzer output = new OutputAnalyzer(pb.start()); - output.reportDiagnosticSummary(); - - output.shouldHaveExitValue(0); + static final WhiteBox WB = WhiteBox.getWhiteBox(); + static final int LM_MONITOR = 0; + static final int COUNT = 100000; - // We want to see, in the final NMT printout, a committed object monitor size that is reasonably low. - // Like this: - // - Object Monitors (reserved=208, committed=208) - // (malloc=208 #1) (at peak) - // - // Without recursive locking support, this would look more like this: - // - Object Monitors (reserved=20800624, committed=20800624) - // (malloc=20800624 #100003) (at peak) + public static volatile Monitor monitor; + public static void main(String[] args) { + if (WB.getIntVMFlag("LockingMode") == LM_MONITOR) { + throw new SkippedException("LM_MONITOR always inflates. Invalid test."); + } + final long pre_monitor_count = WB.getInUseMonitorCount(); + System.out.println(" Precount = " + pre_monitor_count); + for (int i = 0; i < COUNT; i++) { + monitor = new Monitor(); + monitor.doSomething(); + } + System.out.println("i + j = " + (Monitor.i + Monitor.j)); + final long post_monitor_count = WB.getInUseMonitorCount(); + System.out.println("Postcount = " + post_monitor_count); - Pattern pat = Pattern.compile("- *Object Monitors.*reserved=(\\d+), committed=(\\d+).*"); - for (String line : output.asLines()) { - Matcher m = pat.matcher(line); - if (m.matches()) { - long reserved = Long.parseLong(m.group(1)); - long committed = Long.parseLong(m.group(2)); - System.out.println(">>>>> " + line + ": " + reserved + " - " + committed); - if (committed > 1000) { - throw new RuntimeException("Allocated too many monitors"); - } - return; - } + if (pre_monitor_count != post_monitor_count) { + final long monitor_count_change = post_monitor_count - pre_monitor_count; + System.out.println("Unexpected change in monitor count: " + monitor_count_change); + if (monitor_count_change < 0) { + throw new RuntimeException("Unexpected Deflation"); } - throw new RuntimeException("Did not find expected NMT output"); + throw new RuntimeException("Unexpected Inflation"); } } } diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java index 3b930aec16f29..1bc309e2aecf8 100644 --- a/test/lib/jdk/test/whitebox/WhiteBox.java +++ b/test/lib/jdk/test/whitebox/WhiteBox.java @@ -119,6 +119,8 @@ public boolean isMonitorInflated(Object obj) { return isMonitorInflated0(obj); } + public native long getInUseMonitorCount(); + public native int getLockStackCapacity(); public native boolean supportsRecursiveLightweightLocking(); From 3e3f83f62c67caf960ca031439b022f915e1102a Mon Sep 17 00:00:00 2001 From: Jan Lahoda <jlahoda@openjdk.org> Date: Thu, 4 Jul 2024 08:36:56 +0000 Subject: [PATCH 297/471] 8335385: javac crash on unattributed piece of AST Reviewed-by: vromero --- .../com/sun/tools/javac/comp/Resolve.java | 18 +- .../importscope/BadClassFileDuringImport.java | 100 +++++++- ...utesFilledForReferencesOnMissingTypes.java | 227 ++++++++++++++++++ 3 files changed, 337 insertions(+), 8 deletions(-) create mode 100644 test/langtools/tools/javac/tree/ASTAttributesFilledForReferencesOnMissingTypes.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index 079a0bc5c6a46..643bb22c85358 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -2423,7 +2423,14 @@ Symbol findType(Env<AttrContext> env, Name name) { * (a subset of VAL, TYP, PCK). */ Symbol findIdent(DiagnosticPosition pos, Env<AttrContext> env, Name name, KindSelector kind) { - return checkNonExistentType(checkRestrictedType(pos, findIdentInternal(pos, env, name, kind), name)); + try { + return checkNonExistentType(checkRestrictedType(pos, findIdentInternal(pos, env, name, kind), name)); + } catch (ClassFinder.BadClassFile err) { + return new BadClassFileError(err); + } catch (CompletionFailure cf) { + chk.completionError(pos, cf); + return typeNotFound; + } } Symbol findIdentInternal(DiagnosticPosition pos, Env<AttrContext> env, Name name, KindSelector kind) { @@ -2495,7 +2502,14 @@ Symbol findIdentInPackageInternal(Env<AttrContext> env, TypeSymbol pck, Symbol findIdentInType(DiagnosticPosition pos, Env<AttrContext> env, Type site, Name name, KindSelector kind) { - return checkNonExistentType(checkRestrictedType(pos, findIdentInTypeInternal(env, site, name, kind), name)); + try { + return checkNonExistentType(checkRestrictedType(pos, findIdentInTypeInternal(env, site, name, kind), name)); + } catch (ClassFinder.BadClassFile err) { + return new BadClassFileError(err); + } catch (CompletionFailure cf) { + chk.completionError(pos, cf); + return typeNotFound; + } } private Symbol checkNonExistentType(Symbol symbol) { diff --git a/test/langtools/tools/javac/importscope/BadClassFileDuringImport.java b/test/langtools/tools/javac/importscope/BadClassFileDuringImport.java index a4b751fea41ba..8d1d2a965130b 100644 --- a/test/langtools/tools/javac/importscope/BadClassFileDuringImport.java +++ b/test/langtools/tools/javac/importscope/BadClassFileDuringImport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /** * @test - * @bug 8198378 + * @bug 8198378 8335385 * @summary Verify that BadClassFile related to imports are handled properly. * @library /tools/lib * @modules jdk.compiler/com.sun.tools.javac.api @@ -53,7 +53,9 @@ void run() throws Exception { new JavacTask(tb) .outdir(".") .sources("package p; public class A { }", - "package p; public class B { public static class I { } }") + "package p; public class B { public static class I { } }", + "package m; public class A { }", + "package m; public class B { public static class I { } }") .run() .writeAll(); @@ -65,80 +67,165 @@ void run() throws Exception { out.write("broken".getBytes("UTF-8")); } + Files.delete(Paths.get(".", "m", "A.class")); + Files.delete(Paths.get(".", "m", "B$I.class")); + doTest("import p.A;", "", "Test.java:2:9: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import m.A;", + "", + "Test.java:2:9: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.package, m, null)", + "1 error"); doTest("import p.A;", "A a;", "Test.java:2:9: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", "Test.java:2:33: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)", "2 errors"); + doTest("import m.A;", + "A a;", + "Test.java:2:9: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.package, m, null)", + "Test.java:2:33: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); doTest("import p.A;", "void test() { A a; }", "Test.java:2:9: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", "Test.java:2:47: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)", "2 errors"); + doTest("import m.A;", + "void test() { A a; }", + "Test.java:2:9: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.package, m, null)", + "Test.java:2:47: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); doTest("import p.*;", "", (String[]) null); + doTest("import m.*;", + "", + (String[]) null); doTest("import p.*;", "A a;", "Test.java:2:33: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import m.*;", + "A a;", + "Test.java:2:33: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)", + "1 error"); doTest("import p.*;", "void test() { A a; }", "Test.java:2:47: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import m.*;", + "void test() { A a; }", + "Test.java:2:47: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)", + "1 error"); doTest("import p.B.I;", "", "Test.java:2:11: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import m.B.I;", + "", + "Test.java:2:11: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "1 error"); doTest("import p.B.I;", "I i;", "Test.java:2:11: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", - "1 error"); + "Test.java:2:35: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); + doTest("import m.B.I;", + "I i;", + "Test.java:2:11: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "Test.java:2:35: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); doTest("import p.B.I;", "void test() { I i; }", "Test.java:2:11: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", - "1 error"); + "Test.java:2:49: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); + doTest("import m.B.I;", + "void test() { I i; }", + "Test.java:2:11: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "Test.java:2:49: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); doTest("import p.B.*;", "", (String[]) null); + doTest("import m.B.*;", + "", + (String[]) null); doTest("import p.B.*;", "I i;", "Test.java:2:35: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import m.B.*;", + "I i;", + "Test.java:2:35: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "1 error"); + doTest("import m.B.*;", + "I i;", + "Test.java:2:35: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "1 error"); doTest("import p.B.*;", "void test() { I i; }", "Test.java:2:49: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import m.B.*;", + "void test() { I i; }", + "Test.java:2:49: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "1 error"); doTest("import static p.B.I;", "", "Test.java:2:1: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import static m.B.I;", + "", + "Test.java:2:1: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "1 error"); doTest("import static p.B.I;", "I i;", "Test.java:2:42: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import static m.B.I;", + "I i;", + "Test.java:2:42: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "1 error"); doTest("import static p.B.I;", "void test() { I i; }", "Test.java:2:1: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import static m.B.I;", + "void test() { I i; }", + "Test.java:2:1: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "Test.java:2:56: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); doTest("import static p.B.*;", "", "Test.java:2:1: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import static m.B.*;", + "", + "Test.java:2:1: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "1 error"); doTest("import static p.B.*;", "I i;", "Test.java:2:42: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import static m.B.*;", + "I i;", + "Test.java:2:42: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "1 error"); doTest("import static p.B.*;", "void test() { I i; }", "Test.java:2:1: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", "1 error"); + doTest("import static m.B.*;", + "void test() { M m; }", + "Test.java:2:1: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)", + "Test.java:2:56: compiler.err.cant.resolve.location: kindname.class, M, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); } void doTest(String importText, String useText, String... expectedOutput) { @@ -146,7 +233,8 @@ void doTest(String importText, String useText, String... expectedOutput) { .classpath(".") .sources("\n" + importText + " public class Test { " + useText + " }") .options("-XDrawDiagnostics") - .run(expectedOutput != null ? Task.Expect.FAIL : Task.Expect.SUCCESS) + .run(expectedOutput != null ? Task.Expect.FAIL : Task.Expect.SUCCESS, + expectedOutput != null ? 1 : 0) .writeAll() .getOutputLines(Task.OutputKind.DIRECT); diff --git a/test/langtools/tools/javac/tree/ASTAttributesFilledForReferencesOnMissingTypes.java b/test/langtools/tools/javac/tree/ASTAttributesFilledForReferencesOnMissingTypes.java new file mode 100644 index 0000000000000..908a3c24f7bd8 --- /dev/null +++ b/test/langtools/tools/javac/tree/ASTAttributesFilledForReferencesOnMissingTypes.java @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8335385 + * @summary Verify that BadClassFile related to imports are handled properly. + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @build toolbox.ToolBox toolbox.JavacTask + * @run main ASTAttributesFilledForReferencesOnMissingTypes + */ + +import com.sun.source.tree.IdentifierTree; +import com.sun.source.tree.MemberSelectTree; +import com.sun.source.util.TaskEvent; +import com.sun.source.util.TaskListener; +import com.sun.source.util.TreePathScanner; +import com.sun.source.util.Trees; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import javax.lang.model.element.Element; + +import toolbox.JavacTask; +import toolbox.Task; +import toolbox.ToolBox; + +public class ASTAttributesFilledForReferencesOnMissingTypes { + public static void main(String... args) throws Exception { + new ASTAttributesFilledForReferencesOnMissingTypes().run(); + } + + ToolBox tb = new ToolBox(); + + void run() throws Exception { + new JavacTask(tb) + .outdir(".") + .sources("package p; public class A { }", + "package p; public class B { public static class I { } public static class M { } }", + "package p; public class C { }") + .run() + .writeAll(); + + try (OutputStream out = Files.newOutputStream(Paths.get(".", "p", "A.class"))) { + out.write("broken".getBytes("UTF-8")); + } + + try (OutputStream out = Files.newOutputStream(Paths.get(".", "p", "B$I.class"))) { + out.write("broken".getBytes("UTF-8")); + } + + Files.delete(Paths.get(".", "p", "C.class")); + Files.delete(Paths.get(".", "p", "B$M.class")); + + //tests for findIdent (must be in some global scope): + doTest(""" + package p; + public class Test { + A a; + } + """, + "Test.java:3:5: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", + "1 error"); + doTest(""" + import p.*; + public class Test { + A a; + } + """, + "Test.java:3:5: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", + "1 error"); + doTest(""" + package p; + public class Test { + C c; + } + """, + "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.class, p.Test, null)", + "1 error"); + doTest(""" + import p.*; + public class Test { + C c; + } + """, + "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.class, Test, null)", + "1 error"); + + //tests for findIdentInPackage: + doTest(""" + import p.A; + public class Test { + A a; + } + """, + "Test.java:1:9: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", + "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); + doTest(""" + public class Test { + p.A a; + } + """, + "Test.java:2:6: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))", + "1 error"); + doTest(""" + import p.C; + public class Test { + C c; + } + """, + "Test.java:1:9: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.package, p, null)", + "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); + doTest(""" + public class Test { + p.C c; + } + """, + "Test.java:2:6: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.package, p, null)", + "1 error"); + + //tests for findIdentInType: + doTest(""" + import p.B.I; + public class Test { + I i; + } + """, + "Test.java:1:11: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", + "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); + doTest(""" + import p.B.M; + public class Test { + M m; + } + """, + "Test.java:1:11: compiler.err.cant.access: p.B.M, (compiler.misc.class.file.not.found: p.B$M)", + "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, M, , , (compiler.misc.location: kindname.class, Test, null)", + "2 errors"); + doTest(""" + public class Test { + p.B.I i; + } + """, + "Test.java:2:8: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))", + "1 error"); + doTest(""" + public class Test { + p.B.M m; + } + """, + "Test.java:2:8: compiler.err.cant.access: p.B.M, (compiler.misc.class.file.not.found: p.B$M)", + "1 error"); + } + + void doTest(String code, String... expectedOutput) { + List<String> log = new JavacTask(tb) + .classpath(".") + .sources(code) + .options("-XDrawDiagnostics") + .callback(task -> { + task.addTaskListener(new TaskListener() { + @Override + public void finished(TaskEvent e) { + if (e.getKind() != TaskEvent.Kind.ANALYZE) { + return ; + } + Trees trees = Trees.instance(task); + new TreePathScanner<Void, Void>() { + @Override + public Void visitIdentifier(IdentifierTree node, Void p) { + validateAttributes(); + return super.visitIdentifier(node, p); + } + @Override + public Void visitMemberSelect(MemberSelectTree node, Void p) { + if (!node.getIdentifier().contentEquals("*")) { + validateAttributes(); + } + return super.visitMemberSelect(node, p); + } + void validateAttributes() { + Element el = trees.getElement(getCurrentPath()); + if (el == null) { + throw new AssertionError("A null sym attribute for: " + getCurrentPath().getLeaf() + "!"); + } + } + }.scan(e.getCompilationUnit(), null); + } + }); + }) + .run(expectedOutput != null ? Task.Expect.FAIL : Task.Expect.SUCCESS, + expectedOutput != null ? 1 : 0) + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + + if (expectedOutput != null && !log.equals(Arrays.asList(expectedOutput))) { + throw new AssertionError("Unexpected output: " + log); + } + } +} From 0bb9c76288b5f63fe965c3276bb566cef5f51c50 Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Thu, 4 Jul 2024 10:03:39 +0000 Subject: [PATCH 298/471] 8324089: Fix typo in the manual page for "jcmd" (man jcmd) Reviewed-by: mgronlun, kevinw --- src/jdk.jcmd/share/man/jcmd.1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jdk.jcmd/share/man/jcmd.1 b/src/jdk.jcmd/share/man/jcmd.1 index 1a8aefde06e8b..ec87ee3ae47a9 100644 --- a/src/jdk.jcmd/share/man/jcmd.1 +++ b/src/jdk.jcmd/share/man/jcmd.1 @@ -528,7 +528,7 @@ is not used: \[aq]m\[aq] or \[aq]M\[aq] for megabytes OR \[aq]g\[aq] or If no name is given, data from all recordings is dumped. (STRING, no default value) .IP \[bu] 2 -\f[V]path-to-gc-root\f[R]: (Optional) Flag for saving the path to +\f[V]path-to-gc-roots\f[R]: (Optional) Flag for saving the path to garbage collection (GC) roots at the time the recording data is dumped. The path information is useful for finding memory leaks but collecting it can cause the application to pause for a short period of time. @@ -606,7 +606,7 @@ Make note of the generated name that is shown in the response to the command so that you can use it with other commands. (STRING, system-generated default name) .IP \[bu] 2 -\f[V]path-to-gc-root\f[R]: (Optional) Flag for saving the path to +\f[V]path-to-gc-roots\f[R]: (Optional) Flag for saving the path to garbage collection (GC) roots at the end of a recording. The path information is useful for finding memory leaks but collecting it is time consuming. From cf1be87279ddfb2a9fd272e0b245fccd7ec10972 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Thu, 4 Jul 2024 10:04:52 +0000 Subject: [PATCH 299/471] 8335663: Fix simple -Wzero-as-null-pointer-constant warnings in C2 code Reviewed-by: jwaters, chagedorn --- src/hotspot/share/opto/block.hpp | 4 ++-- src/hotspot/share/opto/cfgnode.hpp | 4 ++-- src/hotspot/share/opto/constantTable.hpp | 4 ++-- src/hotspot/share/opto/machnode.hpp | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hotspot/share/opto/block.hpp b/src/hotspot/share/opto/block.hpp index 2a08328b95c1c..e48b50b06ae8a 100644 --- a/src/hotspot/share/opto/block.hpp +++ b/src/hotspot/share/opto/block.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -281,7 +281,7 @@ class Block : public CFGElement { _succs(a), _num_succs(0), _pre_order(0), - _idom(0), + _idom(nullptr), _loop(nullptr), _reg_pressure(0), _ihrp_index(1), diff --git a/src/hotspot/share/opto/cfgnode.hpp b/src/hotspot/share/opto/cfgnode.hpp index 32ac8c0162f22..18d7577d9e621 100644 --- a/src/hotspot/share/opto/cfgnode.hpp +++ b/src/hotspot/share/opto/cfgnode.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -238,7 +238,7 @@ class PhiNode : public TypeNode { int is_diamond_phi() const; bool try_clean_memory_phi(PhaseIterGVN* igvn); virtual int Opcode() const; - virtual bool pinned() const { return in(0) != 0; } + virtual bool pinned() const { return in(0) != nullptr; } virtual const TypePtr *adr_type() const { verify_adr_type(true); return _adr_type; } void set_inst_mem_id(int inst_mem_id) { _inst_mem_id = inst_mem_id; } diff --git a/src/hotspot/share/opto/constantTable.hpp b/src/hotspot/share/opto/constantTable.hpp index f7197783773e3..74d310ec8d554 100644 --- a/src/hotspot/share/opto/constantTable.hpp +++ b/src/hotspot/share/opto/constantTable.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,7 @@ class ConstantTable { bool _can_be_reused; // true (default) if the value can be shared with other users. public: - Constant() : _type(T_ILLEGAL), _is_array(false), _alignment(-1), _offset(-1), _freq(0.0f), _can_be_reused(true) { _v._value.l = 0; } + Constant() : _type(T_ILLEGAL), _is_array(false), _alignment(-1), _offset(-1), _freq(0.0f), _can_be_reused(true) { _v._value.l = nullptr; } Constant(BasicType type, jvalue value, float freq = 0.0f, bool can_be_reused = true) : _type(type), _is_array(false), diff --git a/src/hotspot/share/opto/machnode.hpp b/src/hotspot/share/opto/machnode.hpp index 6dbaa8a13969a..4d7b9c62aaa5b 100644 --- a/src/hotspot/share/opto/machnode.hpp +++ b/src/hotspot/share/opto/machnode.hpp @@ -1084,7 +1084,7 @@ class labelOper : public MachOper { uint _block_num; - labelOper() : _label(0), _block_num(0) {} + labelOper() : _label(nullptr), _block_num(0) {} labelOper(Label* label, uint block_num) : _label(label), _block_num(block_num) {} From c0604fb823d9f3b2e347a9857b11606b223ad8ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20=C3=96sterlund?= <eosterlund@openjdk.org> Date: Thu, 4 Jul 2024 10:06:09 +0000 Subject: [PATCH 300/471] 8334890: Missing unconditional cross modifying fence in nmethod entry barriers Reviewed-by: aboldtch, kbarrett --- .../share/gc/shared/barrierSetNMethod.cpp | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/hotspot/share/gc/shared/barrierSetNMethod.cpp b/src/hotspot/share/gc/shared/barrierSetNMethod.cpp index 79e3f47ed57bd..f041a2ccce184 100644 --- a/src/hotspot/share/gc/shared/barrierSetNMethod.cpp +++ b/src/hotspot/share/gc/shared/barrierSetNMethod.cpp @@ -178,16 +178,9 @@ int BarrierSetNMethod::nmethod_stub_entry_barrier(address* return_address_ptr) { nmethod* nm = cb->as_nmethod(); BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod(); - // Check for disarmed method here to avoid going into DeoptimizeNMethodBarriersALot code - // too often. nmethod_entry_barrier checks for disarmed status itself, - // but we have no visibility into whether the barrier acted or not. - if (!bs_nm->is_armed(nm)) { - return 0; - } - - assert(!nm->is_osr_method(), "Should not reach here"); // Called upon first entry after being armed bool may_enter = bs_nm->nmethod_entry_barrier(nm); + assert(!nm->is_osr_method() || may_enter, "OSR nmethods should always be entrant after migration"); // In case a concurrent thread disarmed the nmethod, we need to ensure the new instructions // are made visible, by using a cross modify fence. Note that this is synchronous cross modifying @@ -197,11 +190,11 @@ int BarrierSetNMethod::nmethod_stub_entry_barrier(address* return_address_ptr) { // it can be made conditional on the nmethod_patching_type. OrderAccess::cross_modify_fence(); - // Diagnostic option to force deoptimization 1 in 3 times. It is otherwise + // Diagnostic option to force deoptimization 1 in 10 times. It is otherwise // a very rare event. - if (DeoptimizeNMethodBarriersALot) { + if (DeoptimizeNMethodBarriersALot && !nm->is_osr_method()) { static volatile uint32_t counter=0; - if (Atomic::add(&counter, 1u) % 3 == 0) { + if (Atomic::add(&counter, 1u) % 10 == 0) { may_enter = false; } } @@ -214,15 +207,6 @@ int BarrierSetNMethod::nmethod_stub_entry_barrier(address* return_address_ptr) { } bool BarrierSetNMethod::nmethod_osr_entry_barrier(nmethod* nm) { - // This check depends on the invariant that all nmethods that are deoptimized / made not entrant - // are NOT disarmed. - // This invariant is important because a method can be deoptimized after the method have been - // resolved / looked up by OSR by another thread. By not deoptimizing them we guarantee that - // a deoptimized method will always hit the barrier and come to the same conclusion - deoptimize - if (!is_armed(nm)) { - return true; - } - assert(nm->is_osr_method(), "Should not reach here"); log_trace(nmethod, barrier)("Running osr nmethod entry barrier: " PTR_FORMAT, p2i(nm)); bool result = nmethod_entry_barrier(nm); From 916db07e533cdc0fca2010751f7ebe54e6ada7b9 Mon Sep 17 00:00:00 2001 From: Yudi Zheng <yzheng@openjdk.org> Date: Thu, 4 Jul 2024 10:34:56 +0000 Subject: [PATCH 301/471] 8335532: [JVMCI] Export VM_Version::L1_line_size in JVMCI Reviewed-by: dnsimon --- src/hotspot/share/jvmci/jvmciCompilerToVM.hpp | 4 ++++ src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp | 8 ++++++++ src/hotspot/share/jvmci/vmStructs_jvmci.cpp | 2 ++ 3 files changed, 14 insertions(+) diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp index 2208813f170d6..665656d0be441 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp @@ -108,6 +108,10 @@ class CompilerToVM { static int sizeof_ZStoreBarrierEntry; #endif +#ifdef X86 + static int L1_line_size; +#endif + static address dsin; static address dcos; static address dtan; diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp index 8595ac193fb8b..02cf6baff7827 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp @@ -114,6 +114,10 @@ int CompilerToVM::Data::_fields_annotations_base_offset; CardTable::CardValue* CompilerToVM::Data::cardtable_start_address; int CompilerToVM::Data::cardtable_shift; +#ifdef X86 +int CompilerToVM::Data::L1_line_size; +#endif + size_t CompilerToVM::Data::vm_page_size; int CompilerToVM::Data::sizeof_vtableEntry = sizeof(vtableEntry); @@ -240,6 +244,10 @@ void CompilerToVM::Data::initialize(JVMCI_TRAPS) { cardtable_shift = 0; } +#ifdef X86 + L1_line_size = VM_Version::L1_line_size(); +#endif + vm_page_size = os::vm_page_size(); #define SET_TRIGFUNC(name) \ diff --git a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp index fea308503cf71..8f83d483bcf4b 100644 --- a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp +++ b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp @@ -112,6 +112,8 @@ static_field(CompilerToVM::Data, cardtable_start_address, CardTable::CardValue*) \ static_field(CompilerToVM::Data, cardtable_shift, int) \ \ + X86_ONLY(static_field(CompilerToVM::Data, L1_line_size, int)) \ + \ static_field(CompilerToVM::Data, vm_page_size, size_t) \ \ static_field(CompilerToVM::Data, sizeof_vtableEntry, int) \ From ced99066354fc6a32c587b9e3c35b07e26d3452e Mon Sep 17 00:00:00 2001 From: Joachim Kern <jkern@openjdk.org> Date: Thu, 4 Jul 2024 11:20:57 +0000 Subject: [PATCH 302/471] 8334371: [AIX] Beginning with AIX 7.3 TL1 mmap() supports 64K memory pages Reviewed-by: stuefe, mbaesken, mdoerr --- src/hotspot/os/aix/os_aix.cpp | 130 ++++++++++++++------- src/hotspot/os/aix/os_aix.hpp | 1 + src/hotspot/share/memory/virtualspace.cpp | 2 +- src/hotspot/share/runtime/os.cpp | 3 +- test/hotspot/gtest/runtime/test_os.cpp | 12 -- test/hotspot/gtest/runtime/test_os_aix.cpp | 46 ++++++++ 6 files changed, 135 insertions(+), 59 deletions(-) create mode 100644 test/hotspot/gtest/runtime/test_os_aix.cpp diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp index 39f3e420662f0..dce12db3935b3 100644 --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -69,6 +69,7 @@ #include "signals_posix.hpp" #include "utilities/align.hpp" #include "utilities/checkedCast.hpp" +#include "utilities/debug.hpp" #include "utilities/decoder.hpp" #include "utilities/defaultStream.hpp" #include "utilities/events.hpp" @@ -96,6 +97,12 @@ #include <sys/ioctl.h> #include <sys/ipc.h> #include <sys/mman.h> +// sys/mman.h defines MAP_ANON_64K beginning with AIX7.3 TL1 +#ifndef MAP_ANON_64K + #define MAP_ANON_64K 0x400 +#else + STATIC_ASSERT(MAP_ANON_64K == 0x400); +#endif #include <sys/resource.h> #include <sys/select.h> #include <sys/shm.h> @@ -217,21 +224,22 @@ static address g_brk_at_startup = nullptr; // http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/multiple_page_size_app_support.htm // static struct { - size_t pagesize; // sysconf _SC_PAGESIZE (4K) - size_t datapsize; // default data page size (LDR_CNTRL DATAPSIZE) - size_t shmpsize; // default shared memory page size (LDR_CNTRL SHMPSIZE) - size_t pthr_stack_pagesize; // stack page size of pthread threads - size_t textpsize; // default text page size (LDR_CNTRL STACKPSIZE) - bool can_use_64K_pages; // True if we can alloc 64K pages dynamically with Sys V shm. - bool can_use_16M_pages; // True if we can alloc 16M pages dynamically with Sys V shm. - int error; // Error describing if something went wrong at multipage init. + size_t pagesize; // sysconf _SC_PAGESIZE (4K) + size_t datapsize; // default data page size (LDR_CNTRL DATAPSIZE) + size_t shmpsize; // default shared memory page size (LDR_CNTRL SHMPSIZE) + size_t pthr_stack_pagesize; // stack page size of pthread threads + size_t textpsize; // default text page size (LDR_CNTRL STACKPSIZE) + bool can_use_64K_pages; // True if we can alloc 64K pages dynamically with Sys V shm. + bool can_use_16M_pages; // True if we can alloc 16M pages dynamically with Sys V shm. + bool can_use_64K_mmap_pages; // True if we can alloc 64K pages dynamically with mmap. + int error; // Error describing if something went wrong at multipage init. } g_multipage_support = { (size_t) -1, (size_t) -1, (size_t) -1, (size_t) -1, (size_t) -1, - false, false, + false, false, false, 0 }; @@ -366,12 +374,16 @@ static void query_multipage_support() { // our own page size after allocated. { const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR); - guarantee(shmid != -1, "shmget failed"); - void* p = ::shmat(shmid, nullptr, 0); - ::shmctl(shmid, IPC_RMID, nullptr); - guarantee(p != (void*) -1, "shmat failed"); - g_multipage_support.shmpsize = os::Aix::query_pagesize(p); - ::shmdt(p); + assert(shmid != -1, "shmget failed"); + if (shmid != -1) { + void* p = ::shmat(shmid, nullptr, 0); + ::shmctl(shmid, IPC_RMID, nullptr); + assert(p != (void*) -1, "shmat failed"); + if (p != (void*) -1) { + g_multipage_support.shmpsize = os::Aix::query_pagesize(p); + ::shmdt(p); + } + } } // Before querying the stack page size, make sure we are not running as primordial @@ -421,26 +433,30 @@ static void query_multipage_support() { trcVerbose("Probing support for %s pages...", describe_pagesize(pagesize)); const int shmid = ::shmget(IPC_PRIVATE, pagesize, IPC_CREAT | S_IRUSR | S_IWUSR); - guarantee0(shmid != -1); // Should always work. - // Try to set pagesize. - struct shmid_ds shm_buf = { }; - shm_buf.shm_pagesize = pagesize; - if (::shmctl(shmid, SHM_PAGESIZE, &shm_buf) != 0) { - const int en = errno; - ::shmctl(shmid, IPC_RMID, nullptr); // As early as possible! - log_warning(pagesize)("shmctl(SHM_PAGESIZE) failed with errno=%d", errno); - } else { - // Attach and double check pageisze. - void* p = ::shmat(shmid, nullptr, 0); - ::shmctl(shmid, IPC_RMID, nullptr); // As early as possible! - guarantee0(p != (void*) -1); // Should always work. - const size_t real_pagesize = os::Aix::query_pagesize(p); - if (real_pagesize != pagesize) { - log_warning(pagesize)("real page size (" SIZE_FORMAT_X ") differs.", real_pagesize); + assert(shmid != -1, "shmget failed"); + if (shmid != -1) { + // Try to set pagesize. + struct shmid_ds shm_buf = { }; + shm_buf.shm_pagesize = pagesize; + if (::shmctl(shmid, SHM_PAGESIZE, &shm_buf) != 0) { + const int en = errno; + ::shmctl(shmid, IPC_RMID, nullptr); // As early as possible! + log_warning(pagesize)("shmctl(SHM_PAGESIZE) failed with errno=%d", errno); } else { - can_use = true; + // Attach and double check pageisze. + void* p = ::shmat(shmid, nullptr, 0); + ::shmctl(shmid, IPC_RMID, nullptr); // As early as possible! + assert(p != (void*) -1, "shmat failed"); + if (p != (void*) -1) { + const size_t real_pagesize = os::Aix::query_pagesize(p); + if (real_pagesize != pagesize) { + log_warning(pagesize)("real page size (" SIZE_FORMAT_X ") differs.", real_pagesize); + } else { + can_use = true; + } + ::shmdt(p); + } } - ::shmdt(p); } trcVerbose("Can use: %s", (can_use ? "yes" : "no")); if (pagesize == 64*K) { @@ -450,6 +466,16 @@ static void query_multipage_support() { } } + // Can we use mmap with 64K pages? (Should be available with AIX7.3 TL1) + { + void* p = mmap(NULL, 64*K, PROT_READ | PROT_WRITE, MAP_ANON_64K | MAP_ANONYMOUS | MAP_SHARED, -1, 0); + assert(p != (void*) -1, "mmap failed"); + if (p != (void*) -1) { + g_multipage_support.can_use_64K_mmap_pages = (64*K == os::Aix::query_pagesize(p)); + munmap(p, 64*K); + } + } + } // end: check which pages can be used for shared memory query_multipage_support_end: @@ -462,6 +488,8 @@ static void query_multipage_support() { describe_pagesize(g_multipage_support.textpsize)); trcVerbose("Thread stack page size (pthread): %s", describe_pagesize(g_multipage_support.pthr_stack_pagesize)); + trcVerbose("Can use 64K pages with mmap memory: %s", + (g_multipage_support.can_use_64K_mmap_pages ? "yes" :"no")); trcVerbose("Default shared memory page size: %s", describe_pagesize(g_multipage_support.shmpsize)); trcVerbose("Can use 64K pages dynamically with shared memory: %s", @@ -1133,6 +1161,8 @@ void os::print_memory_info(outputStream* st) { describe_pagesize(g_multipage_support.textpsize)); st->print_cr(" Thread stack page size (pthread): %s", describe_pagesize(g_multipage_support.pthr_stack_pagesize)); + st->print_cr(" Can use 64K pages with mmap memory: %s", + (g_multipage_support.can_use_64K_mmap_pages ? "yes" :"no")); st->print_cr(" Default shared memory page size: %s", describe_pagesize(g_multipage_support.shmpsize)); st->print_cr(" Can use 64K pages dynamically with shared memory: %s", @@ -1612,6 +1642,10 @@ static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) { // later use msync(MS_INVALIDATE) (see os::uncommit_memory). int flags = MAP_ANONYMOUS | MAP_SHARED; + if (os::vm_page_size() == 64*K && g_multipage_support.can_use_64K_mmap_pages) { + flags |= MAP_ANON_64K; + } + // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what // it means if wishaddress is given but MAP_FIXED is not set. // @@ -1661,7 +1695,11 @@ static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) { p2i(addr), p2i(addr + bytes), bytes); // bookkeeping - vmembk_add(addr, size, 4*K, VMEM_MAPPED); + if (os::vm_page_size() == 64*K && g_multipage_support.can_use_64K_mmap_pages) { + vmembk_add(addr, size, 64*K, VMEM_MAPPED); + } else { + vmembk_add(addr, size, 4*K, VMEM_MAPPED); + } // Test alignment, see above. assert0(is_aligned_to(addr, os::vm_page_size())); @@ -1854,8 +1892,8 @@ char* os::pd_reserve_memory(size_t bytes, bool exec) { bytes = align_up(bytes, os::vm_page_size()); // In 4K mode always use mmap. - // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted. - if (os::vm_page_size() == 4*K) { + // In 64K mode allocate with mmap if it supports 64K pages, otherwise use 64K shmatted. + if (os::vm_page_size() == 4*K || g_multipage_support.can_use_64K_mmap_pages) { return reserve_mmaped_memory(bytes, nullptr /* requested_addr */); } else { return reserve_shmated_memory(bytes, nullptr /* requested_addr */); @@ -2042,8 +2080,8 @@ char* os::pd_attempt_reserve_memory_at(char* requested_addr, size_t bytes, bool bytes = align_up(bytes, os::vm_page_size()); // In 4K mode always use mmap. - // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted. - if (os::vm_page_size() == 4*K) { + // In 64K mode allocate with mmap if it supports 64K pages, otherwise use 64K shmatted. + if (os::vm_page_size() == 4*K || g_multipage_support.can_use_64K_mmap_pages) { return reserve_mmaped_memory(bytes, requested_addr); } else { return reserve_shmated_memory(bytes, requested_addr); @@ -2183,18 +2221,18 @@ void os::init(void) { // and should be allocated with 64k pages. // // So, we do the following: - // LDR_CNTRL can_use_64K_pages_dynamically what we do remarks - // 4K no 4K old systems (aix 5.2) or new systems with AME activated - // 4k yes 64k (treat 4k stacks as 64k) different loader than java and standard settings + // LDR_CNTRL can_use_64K_pages_dynamically(mmap or shm) what we do remarks + // 4K no 4K old systems (aix 5.2) or new systems with AME activated + // 4k yes 64k (treat 4k stacks as 64k) different loader than java and standard settings // 64k no --- AIX 5.2 ? --- - // 64k yes 64k new systems and standard java loader (we set datapsize=64k when linking) + // 64k yes 64k new systems and standard java loader (we set datapsize=64k when linking) // We explicitly leave no option to change page size, because only upgrading would work, // not downgrading (if stack page size is 64k you cannot pretend its 4k). if (g_multipage_support.datapsize == 4*K) { // datapsize = 4K. Data segment, thread stacks are 4K paged. - if (g_multipage_support.can_use_64K_pages) { + if (g_multipage_support.can_use_64K_pages || g_multipage_support.can_use_64K_mmap_pages) { // .. but we are able to use 64K pages dynamically. // This would be typical for java launchers which are not linked // with datapsize=64K (like, any other launcher but our own). @@ -2224,7 +2262,7 @@ void os::init(void) { // This normally means that we can allocate 64k pages dynamically. // (There is one special case where this may be false: EXTSHM=on. // but we decided to not support that mode). - assert0(g_multipage_support.can_use_64K_pages); + assert0(g_multipage_support.can_use_64K_pages || g_multipage_support.can_use_64K_mmap_pages); set_page_size(64*K); trcVerbose("64K page mode"); FLAG_SET_ERGO(Use64KPages, true); @@ -2709,6 +2747,10 @@ void os::Aix::initialize_libperfstat() { } } +bool os::Aix::supports_64K_mmap_pages() { + return g_multipage_support.can_use_64K_mmap_pages; +} + ///////////////////////////////////////////////////////////////////////////// // thread stack diff --git a/src/hotspot/os/aix/os_aix.hpp b/src/hotspot/os/aix/os_aix.hpp index 759bc552bb7c0..d17c022e41136 100644 --- a/src/hotspot/os/aix/os_aix.hpp +++ b/src/hotspot/os/aix/os_aix.hpp @@ -76,6 +76,7 @@ class os::Aix { public: static void init_thread_fpu_state(); static pthread_t main_thread(void) { return _main_thread; } + static bool supports_64K_mmap_pages(); // Given an address, returns the size of the page backing that address static size_t query_pagesize(void* p); diff --git a/src/hotspot/share/memory/virtualspace.cpp b/src/hotspot/share/memory/virtualspace.cpp index a75d9f076ad22..7df35bbeec88e 100644 --- a/src/hotspot/share/memory/virtualspace.cpp +++ b/src/hotspot/share/memory/virtualspace.cpp @@ -380,7 +380,7 @@ void ReservedHeapSpace::establish_noaccess_prefix() { if (base() && base() + _size > (char *)OopEncodingHeapMax) { if (true WIN64_ONLY(&& !UseLargePages) - AIX_ONLY(&& os::vm_page_size() != 64*K)) { + AIX_ONLY(&& (os::Aix::supports_64K_mmap_pages() || os::vm_page_size() == 4*K))) { // Protect memory at the base of the allocated region. // If special, the page was committed (only matters on windows) if (!os::protect_memory(_base, _noaccess_prefix, os::MEM_PROT_NONE, _special)) { diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp index d141ee244262b..7b766707b0d0e 100644 --- a/src/hotspot/share/runtime/os.cpp +++ b/src/hotspot/share/runtime/os.cpp @@ -1958,8 +1958,7 @@ char* os::attempt_reserve_memory_between(char* min, char* max, size_t bytes, siz // This is not reflected by os_allocation_granularity(). // The logic here is dual to the one in pd_reserve_memory in os_aix.cpp const size_t system_allocation_granularity = - AIX_ONLY(os::vm_page_size() == 4*K ? 4*K : 256*M) - NOT_AIX(os::vm_allocation_granularity()); + AIX_ONLY((!os::Aix::supports_64K_mmap_pages() && os::vm_page_size() == 64*K) ? 256*M : ) os::vm_allocation_granularity(); const size_t alignment_adjusted = MAX2(alignment, system_allocation_granularity); diff --git a/test/hotspot/gtest/runtime/test_os.cpp b/test/hotspot/gtest/runtime/test_os.cpp index 654c2c60673ba..70f739ce9228f 100644 --- a/test/hotspot/gtest/runtime/test_os.cpp +++ b/test/hotspot/gtest/runtime/test_os.cpp @@ -967,18 +967,6 @@ TEST_VM(os, reserve_at_wish_address_shall_not_replace_mappings_largepages) { } } -#ifdef AIX -// On Aix, we should fail attach attempts not aligned to segment boundaries (256m) -TEST_VM(os, aix_reserve_at_non_shmlba_aligned_address) { - if (Use64KPages) { - char* p = os::attempt_reserve_memory_at((char*)0x1f00000, M); - ASSERT_EQ(p, nullptr); // should have failed - p = os::attempt_reserve_memory_at((char*)((64 * G) + M), M); - ASSERT_EQ(p, nullptr); // should have failed - } -} -#endif // AIX - TEST_VM(os, vm_min_address) { size_t s = os::vm_min_address(); ASSERT_GE(s, M); diff --git a/test/hotspot/gtest/runtime/test_os_aix.cpp b/test/hotspot/gtest/runtime/test_os_aix.cpp new file mode 100644 index 0000000000000..e8b06b3b4bc8b --- /dev/null +++ b/test/hotspot/gtest/runtime/test_os_aix.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "precompiled.hpp" + +#ifdef AIX + +#include "runtime/os.inline.hpp" +#include "utilities/debug.hpp" +#include "utilities/globalDefinitions.hpp" +#include "unittest.hpp" + +// On Aix, when using shmget() in os::attempt_reserve_memory_at() we should fail with attach +// attempts not aligned to shmget() segment boundaries (256m) +// But shmget() is only used in cases we want to have 64K pages and mmap() does not provide it. +TEST_VM(os_aix, aix_reserve_at_non_shmlba_aligned_address) { + if (os::vm_page_size() != 4*K && !os::Aix::supports_64K_mmap_pages()) { + // With this condition true shmget() is used inside + char* p = os::attempt_reserve_memory_at((char*)0x1f00000, M); + ASSERT_EQ(p, nullptr); // should have failed + p = os::attempt_reserve_memory_at((char*)((64 * G) + M), M); + ASSERT_EQ(p, nullptr); // should have failed + } +} + +#endif // AIX From 7e378fccd8a4601c8b8e86aa2862c61e469c3a04 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Thu, 4 Jul 2024 12:16:54 +0000 Subject: [PATCH 303/471] 8335667: Fix simple -Wzero-as-null-pointer-constant warnings in compiler code Reviewed-by: chagedorn --- src/hotspot/share/ci/ciStreams.hpp | 4 ++-- src/hotspot/share/code/exceptionHandlerTable.hpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/ci/ciStreams.hpp b/src/hotspot/share/ci/ciStreams.hpp index 224dfbe556f0f..6c5dc31f4df9f 100644 --- a/src/hotspot/share/ci/ciStreams.hpp +++ b/src/hotspot/share/ci/ciStreams.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ class ciBytecodeStream : StackObj { Bytecodes::Code _raw_bc; // Current bytecode, raw form void reset( address base, unsigned int size ) { - _bc_start =_was_wide = 0; + _bc_start = _was_wide = nullptr; _start = _pc = base; _end = base + size; } diff --git a/src/hotspot/share/code/exceptionHandlerTable.hpp b/src/hotspot/share/code/exceptionHandlerTable.hpp index 083dc43011117..9d7981f392ca8 100644 --- a/src/hotspot/share/code/exceptionHandlerTable.hpp +++ b/src/hotspot/share/code/exceptionHandlerTable.hpp @@ -148,7 +148,7 @@ class ImplicitExceptionTable { ReallocMark _nesting; // assertion check for reallocations public: - ImplicitExceptionTable( ) : _size(0), _len(0), _data(0) { } + ImplicitExceptionTable( ) : _size(0), _len(0), _data(nullptr) { } // (run-time) construction from nmethod ImplicitExceptionTable(const nmethod *nm); From 6a472797a410a6fa27f50371b255054af0cd3c99 Mon Sep 17 00:00:00 2001 From: Nizar Benalla <nbenalla@openjdk.org> Date: Thu, 4 Jul 2024 12:29:32 +0000 Subject: [PATCH 304/471] 8332072: Convert package.html files in `java.naming` to package-info.java 8335213: Code snippet in javax.naming.ldap package summary does not compile Reviewed-by: aefimov --- .../javax/naming/directory/package-info.java | 86 ++++++ .../javax/naming/directory/package.html | 90 ------ .../javax/naming/event/package-info.java | 118 ++++++++ .../classes/javax/naming/event/package.html | 125 -------- .../javax/naming/ldap/package-info.java | 259 +++++++++++++++++ .../classes/javax/naming/ldap/package.html | 266 ------------------ .../javax/naming/ldap/spi/package-info.java | 33 +++ .../classes/javax/naming/package-info.java | 136 +++++++++ .../share/classes/javax/naming/package.html | 143 ---------- .../javax/naming/spi/package-info.java | 85 ++++++ .../classes/javax/naming/spi/package.html | 90 ------ 11 files changed, 717 insertions(+), 714 deletions(-) create mode 100644 src/java.naming/share/classes/javax/naming/directory/package-info.java delete mode 100644 src/java.naming/share/classes/javax/naming/directory/package.html create mode 100644 src/java.naming/share/classes/javax/naming/event/package-info.java delete mode 100644 src/java.naming/share/classes/javax/naming/event/package.html create mode 100644 src/java.naming/share/classes/javax/naming/ldap/package-info.java delete mode 100644 src/java.naming/share/classes/javax/naming/ldap/package.html create mode 100644 src/java.naming/share/classes/javax/naming/ldap/spi/package-info.java create mode 100644 src/java.naming/share/classes/javax/naming/package-info.java delete mode 100644 src/java.naming/share/classes/javax/naming/package.html create mode 100644 src/java.naming/share/classes/javax/naming/spi/package-info.java delete mode 100644 src/java.naming/share/classes/javax/naming/spi/package.html diff --git a/src/java.naming/share/classes/javax/naming/directory/package-info.java b/src/java.naming/share/classes/javax/naming/directory/package-info.java new file mode 100644 index 0000000000000..3f32a95c31efe --- /dev/null +++ b/src/java.naming/share/classes/javax/naming/directory/package-info.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +/** + * + * Extends the {@code javax.naming} package to provide functionality + * for accessing directory services. + * + * <p> + * This package defines the directory operations of the Java Naming and + * Directory Interface (JNDI).   + * JNDI provides naming and directory functionality to applications + * written in the Java programming language. It is designed to be + * independent of any specific naming or directory service + * implementation. Thus a variety of services--new, emerging, and + * already deployed ones--can be accessed in a common way. + * + * <p> + * This package allows applications to retrieve and update attributes + * associated with objects stored in a directory, and to search for + * objects using specified attributes. + * + * <h2>The Directory Context</h2> + * + * The {@code DirContext} + * interface represents a <em>directory context</em>. + * It defines methods for examining and updating attributes associated with a + * <em>directory object</em>, or <em>directory entry</em> as it is sometimes + * called. + * <p> + * You use {@code getAttributes()} to retrieve the attributes + * associated with a directory object (for which you supply the name). + * Attributes are modified using {@code modifyAttributes()}. + * You can add, replace, or remove attributes and/or attribute values + * using this operation. + * <p> + * {@code DirContext} also behaves as a naming context + * by extending the {@code Context} interface in the {@code javax.naming} package. + * This means that any directory object can also provide + * a naming context. + * For example, the directory object for a person might contain + * the attributes of that person, and at the same time provide + * a context for naming objects relative to that person + * such as his printers and home directory. + * + * <h3>Searches</h3> + * {@code DirContext} contains methods for + * performing content-based searching of the directory. + * In the simplest and most common form of usage, the application + * specifies a set of attributes--possibly with specific + * values--to match, and submits this attribute set, to the + * {@code search()} method. + * There are other overloaded forms of {@code search()} + * that support more sophisticated <em>search filters</em>. + * + * + * <h2>Package Specification</h2> + * + * The JNDI API Specification and related documents can be found in the + * {@extLink jndi_overview JNDI documentation}. + * + * @since 1.3 + */ +package javax.naming.directory; diff --git a/src/java.naming/share/classes/javax/naming/directory/package.html b/src/java.naming/share/classes/javax/naming/directory/package.html deleted file mode 100644 index ff4a83b4ce02d..0000000000000 --- a/src/java.naming/share/classes/javax/naming/directory/package.html +++ /dev/null @@ -1,90 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> -<html> -<head> -<!-- -Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. -DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - -This code is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 only, as -published by the Free Software Foundation. Oracle designates this -particular file as subject to the "Classpath" exception as provided -by Oracle in the LICENSE file that accompanied this code. - -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. ---> -</head> -<body bgcolor="white"> - -Extends the <code>javax.naming</code> package to provide functionality -for accessing directory services. - -<p> -This package defines the directory operations of the Java Naming and -Directory Interface (JNDI).   -JNDI provides naming and directory functionality to applications -written in the Java programming language. It is designed to be -independent of any specific naming or directory service -implementation. Thus a variety of services--new, emerging, and -already deployed ones--can be accessed in a common way. - -<p> -This package allows applications to retrieve and update attributes -associated with objects stored in a directory, and to search for -objects using specified attributes. - -<h2>The Directory Context</h2> - -The <code>DirContext</code> -interface represents a <em>directory context</em>. -It defines methods for examining and updating attributes associated with a -<em>directory object</em>, or <em>directory entry</em> as it is sometimes -called. -<p> -You use <code>getAttributes()</code> to retrieve the attributes -associated with a directory object (for which you supply the name). -Attributes are modified using <code>modifyAttributes()</code>. -You can add, replace, or remove attributes and/or attribute values -using this operation. -<p> -<code>DirContext</code> also behaves as a naming context -by extending the <code>Context</code> interface in the <code>javax.naming</code> package. -This means that any directory object can also provide -a naming context. -For example, the directory object for a person might contain -the attributes of that person, and at the same time provide -a context for naming objects relative to that person -such as his printers and home directory. - -<h3>Searches</h3> -<code>DirContext</code> contains methods for -performing content-based searching of the directory. -In the simplest and most common form of usage, the application -specifies a set of attributes--possibly with specific -values--to match, and submits this attribute set, to the -<code>search()</code> method. -There are other overloaded forms of <code>search()</code> -that support more sophisticated <em>search filters</em>. - - -<h2>Package Specification</h2> - -The JNDI API Specification and related documents can be found in the -{@extLink jndi_overview JNDI documentation}. - -@since 1.3 - -</body> -</html> diff --git a/src/java.naming/share/classes/javax/naming/event/package-info.java b/src/java.naming/share/classes/javax/naming/event/package-info.java new file mode 100644 index 0000000000000..4214ee8597394 --- /dev/null +++ b/src/java.naming/share/classes/javax/naming/event/package-info.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +/** + * + * Provides support for event notification when accessing naming and + * directory services. + * + * <p> + * This package defines the event notification operations of the Java Naming + * and Directory Interface (JNDI).   + * JNDI provides naming and directory functionality to applications + * written in the Java programming language. It is designed to be + * independent of any specific naming or directory service + * implementation. Thus a variety of services--new, emerging, and + * already deployed ones--can be accessed in a common way. + * + * <h2>Naming Events</h2> + * <p> + * This package defines a {@code NamingEvent} class to represent an event + * that is generated by a naming/directory service. + * It also defines subinterfaces of {@code Context} and {@code DirContext}, + * called {@code EventContext} and {@code EventDirContext}, + * through which applications can register their interest in events + * fired by the context. + * <p> + * {@code NamingEvent} represents an event that occurs in a + * naming or directory service. There are two categories of naming events: + * <ul> + * <li>Those that affect the namespace (add/remove/rename an object) + * <li>Those that affect the objects' contents. + * </ul> + * Each category of events is handled by a corresponding listener: + * {@code NamespaceChangeListener}, {@code ObjectChangeListener}. + * <p> + * An application, for example, can register its interest in changes to + * objects in a context as follows: + * {@snippet : + * EventContext src = + * (EventContext)(new InitialContext()).lookup("o=wiz,c=us"); + * src.addNamingListener("ou=users", EventContext.ONELEVEL_SCOPE, + * new ChangeHandler()); + * ... + * class ChangeHandler implements ObjectChangeListener { + * public void objectChanged(NamingEvent evt) { + * System.out.println(evt.getNewBinding()); + * } + * public void namingExceptionThrown(NamingExceptionEvent evt) { + * System.out.println(evt.getException()); + * } + * } + * } + * + * <a id=THREADING></a> + * <h3>Threading Issues</h3> + * + * When an event is dispatched to a listener, the listener method (such + * as {@code objectChanged()}) may be executed in a thread other than the + * one in which the call to {@code addNamingListener()} was executed. + * The choice of which thread to use is made by the service provider. + * When an event is dispatched to multiple listeners, the service provider + * may choose (and is generally encouraged) to execute the listener methods + * concurrently in separate threads. + * <p> + * When a listener instance invokes {@code NamingEvent.getEventContext()}, + * it must take into account the possibility that other threads will be + * working with that context concurrently. Likewise, when a listener is + * registered via {@code addNamingListener()}, the registering thread + * must take into account the likely possibility that the service provider + * will later invoke the listeners in newly-created threads. As {@code Context} + * instances are not guaranteed to be thread-safe in general, all context + * operations must be synchronized as needed. + * + * <h3>Exception Handling</h3> + * + * When a listener registers for events with a context, the context might + * need to do some internal processing in order to collect information + * required to generate the events. The context, for example, might need + * to make a request to the server to register interest in changes + * on the server that will eventually be translated into events. + * If an exception occurs that prevents information about the events from + * being collected, the listener will never be notified of the events. + * When such an exception occurs, a {@code NamingExceptionEvent} is + * fired to notify the listener. The listener's + * {@code namingExceptionThrown()} method is invoked, as shown in the + * sample code above, + * and the listener is automatically deregistered. + * + * <h2>Package Specification</h2> + * + * The JNDI API Specification and related documents can be found in the + * {@extLink jndi_overview JNDI documentation}. + * + * @since 1.3 + */ +package javax.naming.event; diff --git a/src/java.naming/share/classes/javax/naming/event/package.html b/src/java.naming/share/classes/javax/naming/event/package.html deleted file mode 100644 index 087e7c869a4bc..0000000000000 --- a/src/java.naming/share/classes/javax/naming/event/package.html +++ /dev/null @@ -1,125 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> -<html> -<head> -<!-- -Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. -DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - -This code is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 only, as -published by the Free Software Foundation. Oracle designates this -particular file as subject to the "Classpath" exception as provided -by Oracle in the LICENSE file that accompanied this code. - -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. ---> -</head> -<body bgcolor="white"> - -Provides support for event notification when accessing naming and -directory services. - -<p> -This package defines the event notification operations of the Java Naming -and Directory Interface (JNDI).   -JNDI provides naming and directory functionality to applications -written in the Java programming language. It is designed to be -independent of any specific naming or directory service -implementation. Thus a variety of services--new, emerging, and -already deployed ones--can be accessed in a common way. - -<h2>Naming Events</h2> -<p> -This package defines a <code>NamingEvent</code> class to represent an event -that is generated by a naming/directory service. -It also defines subinterfaces of <code>Context</code> and <code>DirContext</code>, -called <code>EventContext</code> and <code>EventDirContext</code>, -through which applications can register their interest in events -fired by the context. -<p> -<code>NamingEvent</code> represents an event that occurs in a -naming or directory service. There are two categories of naming events: -<ul> -<li>Those that affect the namespace (add/remove/rename an object) -<li>Those that affect the objects' contents. -</ul> -Each category of events is handled by a corresponding listener: -<code>NamespaceChangeListener</code>, <code>ObjectChangeListener</code>. -<p> -An application, for example, can register its interest in changes to -objects in a context as follows: -<blockquote> -<pre> -EventContext src = - (EventContext)(new InitialContext()).lookup("o=wiz,c=us"); -src.addNamingListener("ou=users", EventContext.ONELEVEL_SCOPE, - new ChangeHandler()); -... -class ChangeHandler implements ObjectChangeListener { - public void objectChanged(NamingEvent evt) { - System.out.println(evt.getNewBinding()); - } - public void namingExceptionThrown(NamingExceptionEvent evt) { - System.out.println(evt.getException()); - } -} -</pre> -</blockquote> - -<a id=THREADING></a> -<h3>Threading Issues</h3> - -When an event is dispatched to a listener, the listener method (such -as <code>objectChanged()</code>) may be executed in a thread other than the -one in which the call to <code>addNamingListener()</code> was executed. -The choice of which thread to use is made by the service provider. -When an event is dispatched to multiple listeners, the service provider -may choose (and is generally encouraged) to execute the listener methods -concurrently in separate threads. -<p> -When a listener instance invokes <code>NamingEvent.getEventContext()</code>, -it must take into account the possibility that other threads will be -working with that context concurrently. Likewise, when a listener is -registered via <code>addNamingListener()</code>, the registering thread -must take into account the likely possibility that the service provider -will later invoke the listeners in newly-created threads. As <code>Context</code> -instances are not guaranteed to be thread-safe in general, all context -operations must be synchronized as needed. - -<h3>Exception Handling</h3> - -When a listener registers for events with a context, the context might -need to do some internal processing in order to collect information -required to generate the events. The context, for example, might need -to make a request to the server to register interest in changes -on the server that will eventually be translated into events. -If an exception occurs that prevents information about the events from -being collected, the listener will never be notified of the events. -When such an exception occurs, a <code>NamingExceptionEvent</code> is -fired to notify the listener. The listener's -<code>namingExceptionThrown()</code> method is invoked, as shown in the -sample code above, -and the listener is automatically deregistered. - -<h2>Package Specification</h2> - - -The JNDI API Specification and related documents can be found in the -{@extLink jndi_overview JNDI documentation}. - -@since 1.3 - -</body> -</html> diff --git a/src/java.naming/share/classes/javax/naming/ldap/package-info.java b/src/java.naming/share/classes/javax/naming/ldap/package-info.java new file mode 100644 index 0000000000000..f5ba4906fd786 --- /dev/null +++ b/src/java.naming/share/classes/javax/naming/ldap/package-info.java @@ -0,0 +1,259 @@ +/* + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +/** + * + * Provides support for LDAPv3 extended operations and controls. + * + * <p> + * This package extends the directory operations of the Java Naming and + * Directory Interface (JNDI).   + * JNDI provides naming and directory functionality to applications + * written in the Java programming language. It is designed to be + * independent of any specific naming or directory service + * implementation. Thus a variety of services--new, emerging, and + * already deployed ones--can be accessed in a common way. + * + * <p> + * This package is for applications and service providers that deal with + * LDAPv3 extended operations and controls, as defined by + * <a href=http://www.ietf.org/rfc/rfc2251.txt>RFC 2251</a>. + * The core interface in this package is {@code LdapContext}, which defines + * methods on a context for performing extended operations and handling + * controls. + * + * <h2>Extended Operations</h2> + * <p> + * This package defines the interface {@code ExtendedRequest} + * to represent the argument to an extended operation, + * and the interface {@code ExtendedResponse} to represent the result + * of the extended operation. + * An extended response is always paired with an extended request + * but not necessarily vice versa. That is, you can have an extended request + * that has no corresponding extended response. + * <p> + * An application typically does not deal directly with these interfaces. + * Instead, it deals with classes that <em>implement</em> these + * interfaces. + * The application gets these classes either as part of a + * repertoire of extended operations standardized through the IETF, or + * from directory vendors for vendor-specific extended operations. + * The request classes should have constructors that accept + * arguments in a type-safe and user-friendly manner, while the + * response classes should have access methods for getting the data + * of the response in a type-safe and user-friendly manner. + * Internally, the request/response classes deal with encoding and decoding + * BER values. + * <p> + * For example, suppose an LDAP server supports a "get time" extended operation. + * It would supply classes such as + * {@code GetTimeRequest} and {@code GetTimeResponse}, + * so that applications can use this feature. + * An application would use these classes as follows: + * {@snippet : + * GetTimeResponse resp = + * (GetTimeResponse) ectx.extendedOperation(new GetTimeRequest()); + * long time = resp.getTime(); + * } + * <p> + * The {@code GetTimeRequest} and {@code GetTimeResponse} classes might + * be defined as follows: + * {@snippet : + * public class GetTimeRequest implements ExtendedRequest { + * // User-friendly constructor + * public GetTimeRequest() { + * }; + * + * // Methods used by service providers + * public String getID() { + * return GETTIME_REQ_OID; + * } + * public byte[] getEncodedValue() { + * return null; // no value needed for get time request + * } + * public ExtendedResponse createExtendedResponse( + * String id, byte[] berValue, int offset, int length) throws NamingException { + * return new GetTimeResponse(id, berValue, offset, length); + * } + * } + * public class GetTimeResponse implements ExtendedResponse { + * long time; + * // called by GetTimeRequest.createExtendedResponse() + * public GetTimeResponse(String id, byte[] berValue, int offset, int length) + * throws NamingException { + * // check validity of id + * long time = ... // decode berValue to get time + * } + * + * // Type-safe and User-friendly methods + * public java.util.Date getDate() { return new java.util.Date(time); } + * public long getTime() { return time; } + * + * // Low level methods + * public byte[] getEncodedValue() { + * return // berValue saved; + * } + * public String getID() { + * return GETTIME_RESP_OID; + * } + * } + * } + * + * <h2>Controls</h2> + * + * This package defines the interface {@code Control} to represent an LDAPv3 + * control. It can be a control that is sent to an LDAP server + * (<em>request control</em>) or a control returned by an LDAP server + * (<em>response control</em>). Unlike extended requests and responses, + * there is not necessarily any pairing between request controls and + * response controls. You can send request controls and expect no + * response controls back, or receive response controls without sending + * any request controls. + * <p> + * An application typically does not deal directly with this interface. + * Instead, it deals with classes that <em>implement</em> this interface. + * The application gets control classes either as part of a repertoire of + * controls standardized through the IETF, or from directory vendors for + * vendor-specific controls. The request control classes should have + * constructors that accept arguments in a type-safe and user-friendly + * manner, while the response control classes should have access methods + * for getting the data of the response in a type-safe and user-friendly + * manner. Internally, the request/response control classes deal with + * encoding and decoding BER values. + * <p> + * For example, suppose an LDAP server supports a "signed results" + * request control, which when sent with a request, asks the + * server to digitally sign the results of an operation. + * It would supply a class {@code SignedResultsControl} so that applications + * can use this feature. + * An application would use this class as follows: + * {@snippet : + * Control[] reqCtls = new Control[] {new SignedResultsControl(Control.CRITICAL)}; + * ectx.setRequestControls(reqCtls); + * NamingEnumeration enum = ectx.search(...); + * } + * The {@code SignedResultsControl} class might be defined as follows: + * {@snippet : + * public class SignedResultsControl implements Control { + * // User-friendly constructor + * public SignedResultsControl(boolean criticality) { + * // assemble the components of the request control + * }; + * + * // Methods used by service providers + * public String getID() { + * return // control's object identifier + * } + * public byte[] getEncodedValue() { + * return // ASN.1 BER encoded control value + * } + * ... + * } + * } + * <p> + * When a service provider receives response controls, it uses + * the {@code ControlFactory} class to produce specific classes + * that implement the {@code Control} interface. + * <p> + * An LDAP server can send back response controls with an LDAP operation + * and also with enumeration results, such as those returned + * by a list or search operation. + * The {@code LdapContext} provides a method ({@code getResponseControls()}) + * for getting the response controls sent with an LDAP operation, + * while the {@code HasControls} interface is used to retrieve + * response controls associated with enumeration results. + * <p> + * For example, suppose an LDAP server sends back a "change ID" control in response + * to a successful modification. It would supply a class {@code ChangeIDControl} + * so that the application can use this feature. + * An application would perform an update, and then try to get the change ID. + * {@snippet : + * // Perform update + * Context ctx = ectx.createSubsubcontext("cn=newobj"); + * + * // Get response controls + * Control[] respCtls = ectx.getResponseControls(); + * if (respCtls != null) { + * // Find the one we want + * for (int i = 0; i < respCtls.length; i++) { + * if(respCtls[i] instanceof ChangeIDControl) { + * ChangeIDControl cctl = (ChangeIDControl)respCtls[i]; + * System.out.println(cctl.getChangeID()); + * } + * } + * } + * } + * The vendor might supply the following {@code ChangeIDControl} and + * {@code VendorXControlFactory} classes. The {@code VendorXControlFactory} + * will be used by the service provider when the provider receives response + * controls from the LDAP server. + * {@snippet : + * public class ChangeIDControl implements Control { + * long id; + * + * // Constructor used by ControlFactory + * public ChangeIDControl(String OID, byte[] berVal) throws NamingException { + * // check validity of OID + * id = // extract change ID from berVal + * }; + * + * // Type-safe and User-friendly method + * public long getChangeID() { + * return id; + * } + * + * // Low-level methods + * public String getID() { + * return CHANGEID_OID; + * } + * public byte[] getEncodedValue() { + * return // original berVal + * } + * ... + * } + * public class VendorXControlFactory extends ControlFactory { + * public VendorXControlFactory () { + * } + * + * public Control getControlInstance(Control orig) throws NamingException { + * if (isOneOfMyControls(orig.getID())) { + * ... + * + * // determine which of ours it is and call its constructor + * return (new ChangeIDControl(orig.getID(), orig.getEncodedValue())); + * } + * return null; // not one of ours + * } + * } + * } + * + * <h2>Package Specification</h2> + * + * The JNDI API Specification and related documents can be found in the + * {@extLink jndi_overview JNDI documentation}. + * + * @since 1.3 + */ +package javax.naming.ldap; diff --git a/src/java.naming/share/classes/javax/naming/ldap/package.html b/src/java.naming/share/classes/javax/naming/ldap/package.html deleted file mode 100644 index 6bd2f78e7890b..0000000000000 --- a/src/java.naming/share/classes/javax/naming/ldap/package.html +++ /dev/null @@ -1,266 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> -<html> -<head> -<!-- -Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. -DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - -This code is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 only, as -published by the Free Software Foundation. Oracle designates this -particular file as subject to the "Classpath" exception as provided -by Oracle in the LICENSE file that accompanied this code. - -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. - ---> -</head> -<body bgcolor="white"> - -Provides support for LDAPv3 extended operations and controls. - -<p> -This package extends the directory operations of the Java Naming and -Directory Interface (JNDI).   -JNDI provides naming and directory functionality to applications -written in the Java programming language. It is designed to be -independent of any specific naming or directory service -implementation. Thus a variety of services--new, emerging, and -already deployed ones--can be accessed in a common way. - -<p> -This package is for applications and service providers that deal with -LDAPv3 extended operations and controls, as defined by -<a href=http://www.ietf.org/rfc/rfc2251.txt>RFC 2251</a>. -The core interface in this package is <code>LdapContext</code>, which defines -methods on a context for performing extended operations and handling -controls. - -<h2>Extended Operations</h2> -<p> -This package defines the interface <code>ExtendedRequest</code> -to represent the argument to an extended operation, -and the interface <code>ExtendedResponse</code> to represent the result -of the extended operation. -An extended response is always paired with an extended request -but not necessarily vice versa. That is, you can have an extended request -that has no corresponding extended response. -<p> -An application typically does not deal directly with these interfaces. -Instead, it deals with classes that <em>implement</em> these -interfaces. -The application gets these classes either as part of a -repertoire of extended operations standardized through the IETF, or -from directory vendors for vendor-specific extended operations. -The request classes should have constructors that accept -arguments in a type-safe and user-friendly manner, while the -response classes should have access methods for getting the data -of the response in a type-safe and user-friendly manner. -Internally, the request/response classes deal with encoding and decoding -BER values. -<p> -For example, suppose an LDAP server supports a "get time" extended operation. -It would supply classes such as -<code>GetTimeRequest</code> and <code>GetTimeResponse</code>, -so that applications can use this feature. -An application would use these classes as follows: -<blockquote><pre> -GetTimeResponse resp = - (GetTimeResponse) ectx.extendedOperation(new GetTimeRequest()); -long time = resp.getTime(); -</pre></blockquote> -<p> -The <code>GetTimeRequest</code> and <code>GetTimeResponse</code> classes might -be defined as follows: -<blockquote><pre> -public class GetTimeRequest implements ExtendedRequest { - // User-friendly constructor - public GetTimeRequest() { - }; - - // Methods used by service providers - public String getID() { - return GETTIME_REQ_OID; - } - public byte[] getEncodedValue() { - return null; // no value needed for get time request - } - public ExtendedResponse createExtendedResponse( - String id, byte[] berValue, int offset, int length) throws NamingException { - return new GetTimeResponse(id, berValue, offset, length); - } -} -public class GetTimeResponse() implements ExtendedResponse { - long time; - // called by GetTimeRequest.createExtendedResponse() - public GetTimeResponse(String id, byte[] berValue, int offset, int length) - throws NamingException { - // check validity of id - long time = ... // decode berValue to get time - } - - // Type-safe and User-friendly methods - public java.util.Date getDate() { return new java.util.Date(time); } - public long getTime() { return time; } - - // Low level methods - public byte[] getEncodedValue() { - return // berValue saved; - } - public String getID() { - return GETTIME_RESP_OID; - } -} -</pre></blockquote> - -<h2>Controls</h2> - -This package defines the interface <code>Control</code> to represent an LDAPv3 -control. It can be a control that is sent to an LDAP server -(<em>request control</em>) or a control returned by an LDAP server -(<em>response control</em>). Unlike extended requests and responses, -there is not necessarily any pairing between request controls and -response controls. You can send request controls and expect no -response controls back, or receive response controls without sending -any request controls. -<p> -An application typically does not deal directly with this interface. -Instead, it deals with classes that <em>implement</em> this interface. -The application gets control classes either as part of a repertoire of -controls standardized through the IETF, or from directory vendors for -vendor-specific controls. The request control classes should have -constructors that accept arguments in a type-safe and user-friendly -manner, while the response control classes should have access methods -for getting the data of the response in a type-safe and user-friendly -manner. Internally, the request/response control classes deal with -encoding and decoding BER values. -<p> -For example, suppose an LDAP server supports a "signed results" -request control, which when sent with a request, asks the -server to digitally sign the results of an operation. -It would supply a class <code>SignedResultsControl</code> so that applications -can use this feature. -An application would use this class as follows: -<blockquote> -<pre> -Control[] reqCtls = new Control[] {new SignedResultsControl(Control.CRITICAL)}; -ectx.setRequestControls(reqCtls); -NamingEnumeration enum = ectx.search(...); -</pre> -</blockquote> -The <code>SignedResultsControl</code> class might be defined as follows: -<blockquote><pre> -public class SignedResultsControl implements Control { - // User-friendly constructor - public SignedResultsControl(boolean criticality) { - // assemble the components of the request control - }; - - // Methods used by service providers - public String getID() { - return // control's object identifier - } - public byte[] getEncodedValue() { - return // ASN.1 BER encoded control value - } - ... -} -</pre></blockquote> -<p> -When a service provider receives response controls, it uses -the <code>ControlFactory</code> class to produce specific classes -that implement the <code>Control</code> interface. -<p> -An LDAP server can send back response controls with an LDAP operation -and also with enumeration results, such as those returned -by a list or search operation. -The <code>LdapContext</code> provides a method (<code>getResponseControls()</code>) -for getting the response controls sent with an LDAP operation, -while the <code>HasControls</code> interface is used to retrieve -response controls associated with enumeration results. -<p> -For example, suppose an LDAP server sends back a "change ID" control in response -to a successful modification. It would supply a class <code>ChangeIDControl</code> -so that the application can use this feature. -An application would perform an update, and then try to get the change ID. -<blockquote><pre> -// Perform update -Context ctx = ectx.createSubsubcontext("cn=newobj"); - -// Get response controls -Control[] respCtls = ectx.getResponseControls(); -if (respCtls != null) { - // Find the one we want - for (int i = 0; i < respCtls; i++) { - if(respCtls[i] instanceof ChangeIDControl) { - ChangeIDControl cctl = (ChangeIDControl)respCtls[i]; - System.out.println(cctl.getChangeID()); - } - } -} -</pre></blockquote> -The vendor might supply the following <code>ChangeIDControl</code> and -<code>VendorXControlFactory</code> classes. The <code>VendorXControlFactory</code> -will be used by the service provider when the provider receives response -controls from the LDAP server. -<blockquote><pre> -public class ChangeIDControl implements Control { - long id; - - // Constructor used by ControlFactory - public ChangeIDControl(String OID, byte[] berVal) throws NamingException { - // check validity of OID - id = // extract change ID from berVal - }; - - // Type-safe and User-friendly method - public long getChangeID() { - return id; - } - - // Low-level methods - public String getID() { - return CHANGEID_OID; - } - public byte[] getEncodedValue() { - return // original berVal - } - ... -} -public class VendorXControlFactory extends ControlFactory { - public VendorXControlFactory () { - } - - public Control getControlInstance(Control orig) throws NamingException { - if (isOneOfMyControls(orig.getID())) { - ... - - // determine which of ours it is and call its constructor - return (new ChangeIDControl(orig.getID(), orig.getEncodedValue())); - } - return null; // not one of ours - } -} -</pre></blockquote> - -<h2>Package Specification</h2> - -The JNDI API Specification and related documents can be found in the -{@extLink jndi_overview JNDI documentation}. - -@since 1.3 - -</body> -</html> diff --git a/src/java.naming/share/classes/javax/naming/ldap/spi/package-info.java b/src/java.naming/share/classes/javax/naming/ldap/spi/package-info.java new file mode 100644 index 0000000000000..20f3ea258ef40 --- /dev/null +++ b/src/java.naming/share/classes/javax/naming/ldap/spi/package-info.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +/** + * + * Provides the Service Provider Interface for DNS lookups when + * performing LDAP operations. + * + * @since 12 + */ +package javax.naming.ldap.spi; diff --git a/src/java.naming/share/classes/javax/naming/package-info.java b/src/java.naming/share/classes/javax/naming/package-info.java new file mode 100644 index 0000000000000..edcc76506efe1 --- /dev/null +++ b/src/java.naming/share/classes/javax/naming/package-info.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +/** + * Provides the classes and interfaces for accessing naming services. + * + * <p> + * This package defines the naming operations of the Java Naming and + * Directory Interface (JNDI).   + * JNDI provides naming and directory functionality to applications + * written in the Java programming language. It is designed to be + * independent of any specific naming or directory service + * implementation. Thus a variety of services--new, emerging, and + * already deployed ones--can be accessed in a common way. + * + * + * <h2>Context</h2> + * <p> + * This package defines the notion of a <em>context</em>, represented + * by the {@code Context} interface. + * A context consists of a set of name-to-object <em>bindings</em>. + * {@code Context} is the core interface for looking up, binding, unbinding, + * and renaming objects, and for creating and destroying subcontexts. + * <p> + * {@code lookup()} is the most commonly used operation. + * You supply {@code lookup()} + * the name of the object you want + * to look up, and it returns the object bound to that name. + * For example, the following code fragment looks up + * a printer and sends a document to the printer object + * to be printed: + * + * {@snippet : + * Printer printer = (Printer)ctx.lookup("treekiller"); + * printer.print(report); + * } + * + * <h2>Names</h2> + * <p> + * Every naming method in the {@code Context} + * interface has two + * overloads: one that accepts a + * {@code Name} argument and one that accepts a string name. + * {@code Name} is an interface that represents a generic + * name--an ordered sequence of zero of more components. + * For these methods, {@code Name} can be used to represent a + * <em>composite name</em> ({@code CompositeName}) + * so that you can name an object using a name which spans multiple namespaces. + * <p> + * The overloads that accept {@code Name} + * are useful for applications that need to manipulate names: composing + * them, comparing components, and so on. + * The overloads that accept string names are likely to be more useful + * for simple applications, such as those that simply read in a name + * and look up the corresponding object. + * + * <h2>Bindings</h2> + * + * The {@code Binding} class represents a name-to-object binding. + * It is a tuple containing the name of the bound object, + * the name of the object's class, and the object itself. + * <p> + * The {@code Binding} class is actually a subclass of + * {@code NameClassPair}, which consists + * simply of the object's name and the object's class name. + * The {@code NameClassPair} is useful when you only want + * information about the object's class and do not want to + * pay the extra cost of getting the object. + * + * <h2>References</h2> + * Objects are stored in naming and directory services in different ways. + * If an object store supports storing Java objects, + * it might support storing an object in its serialized form. + * However, some naming and directory services do not support the + * storing of Java objects. Furthermore, for some + * objects in the directory, Java programs are but one group of applications + * that access them. In this case, a serialized Java object might + * not be the most appropriate representation. + * JNDI defines a <em>reference</em>, represented by the {@code Reference} + * class, which contains information on how to construct a copy of the object. + * JNDI will attempt to turn references looked up from the directory + * into the Java objects they represent, so that + * JNDI clients have the illusion that what + * is stored in the directory are Java objects. + * + * + * <h2>The Initial Context</h2> + * + * In JNDI, all naming and directory operations are performed relative + * to a context. There are no absolute roots. + * Therefore JNDI defines an <em>initial context</em>, + * {@code InitialContext}, + * which provides a starting point for naming and directory operations. + * Once you have an initial context, you can use it to + * look up other contexts and objects. + * + * <h2>Exceptions</h2> + * + * JNDI defines a class hierarchy for exceptions that can be thrown in + * the course of performing naming and directory operations. The root of + * this class hierarchy is {@code NamingException}. + * Programs interested in dealing with a particular exception + * can catch the corresponding subclass of the exception. + * Otherwise, programs should catch {@code NamingException}. + * + * + * <h2>Package Specification</h2> + * + * The JNDI API Specification and related documents can be found in the + * {@extLink jndi_overview JNDI documentation}. + * + * @since 1.3 + */ +package javax.naming; diff --git a/src/java.naming/share/classes/javax/naming/package.html b/src/java.naming/share/classes/javax/naming/package.html deleted file mode 100644 index 67e046f84c6ab..0000000000000 --- a/src/java.naming/share/classes/javax/naming/package.html +++ /dev/null @@ -1,143 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> -<html> -<head> -<!-- -Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. -DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - -This code is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 only, as -published by the Free Software Foundation. Oracle designates this -particular file as subject to the "Classpath" exception as provided -by Oracle in the LICENSE file that accompanied this code. - -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. ---> -</head> -<body bgcolor="white"> - -Provides the classes and interfaces for accessing naming services. - -<p> -This package defines the naming operations of the Java Naming and -Directory Interface (JNDI).   -JNDI provides naming and directory functionality to applications -written in the Java programming language. It is designed to be -independent of any specific naming or directory service -implementation. Thus a variety of services--new, emerging, and -already deployed ones--can be accessed in a common way. - - -<h2>Context</h2> -<p> -This package defines the notion of a <em>context</em>, represented -by the <code>Context</code> interface. -A context consists of a set of name-to-object <em>bindings</em>. -<code>Context</code> is the core interface for looking up, binding, unbinding, -and renaming objects, and for creating and destroying subcontexts. -<p> -<code>lookup()</code> is the most commonly used operation. -You supply <code>lookup()</code> -the name of the object you want -to look up, and it returns the object bound to that name. -For example, the following code fragment looks up -a printer and sends a document to the printer object -to be printed: - -<blockquote> -<pre> -Printer printer = (Printer)ctx.lookup("treekiller"); -printer.print(report); -</pre> -</blockquote> - -<h2>Names</h2> -<p> -Every naming method in the <code>Context</code> -interface has two -overloads: one that accepts a -<code>Name</code> argument and one that accepts a string name. -<code>Name</code> is an interface that represents a generic -name--an ordered sequence of zero of more components. -For these methods, <code>Name</code> can be used to represent a -<em>composite name</em> (<code>CompositeName</code>) -so that you can name an object using a name which spans multiple namespaces. -<p> -The overloads that accept <code>Name</code> -are useful for applications that need to manipulate names: composing -them, comparing components, and so on. -The overloads that accept string names are likely to be more useful -for simple applications, such as those that simply read in a name -and look up the corresponding object. - -<h2>Bindings</h2> - -The <code>Binding</code> class represents a name-to-object binding. -It is a tuple containing the name of the bound object, -the name of the object's class, and the object itself. -<p> -The <code>Binding</code> class is actually a subclass of -<code>NameClassPair</code>, which consists -simply of the object's name and the object's class name. -The <code>NameClassPair</code> is useful when you only want -information about the object's class and do not want to -pay the extra cost of getting the object. - -<h2>References</h2> -Objects are stored in naming and directory services in different ways. -If an object store supports storing Java objects, -it might support storing an object in its serialized form. -However, some naming and directory services do not support the -storing of Java objects. Furthermore, for some -objects in the directory, Java programs are but one group of applications -that access them. In this case, a serialized Java object might -not be the most appropriate representation. -JNDI defines a <em>reference</em>, represented by the <code>Reference</code> -class, which contains information on how to construct a copy of the object. -JNDI will attempt to turn references looked up from the directory -into the Java objects they represent, so that -JNDI clients have the illusion that what -is stored in the directory are Java objects. - - -<h2>The Initial Context</h2> - -In JNDI, all naming and directory operations are performed relative -to a context. There are no absolute roots. -Therefore JNDI defines an <em>initial context</em>, -<code>InitialContext</code>, -which provides a starting point for naming and directory operations. -Once you have an initial context, you can use it to -look up other contexts and objects. - -<h2>Exceptions</h2> - -JNDI defines a class hierarchy for exceptions that can be thrown in -the course of performing naming and directory operations. The root of -this class hierarchy is <code>NamingException</code>. -Programs interested in dealing with a particular exception -can catch the corresponding subclass of the exception. -Otherwise, programs should catch <code>NamingException</code>. - - -<h2>Package Specification</h2> - -The JNDI API Specification and related documents can be found in the -{@extLink jndi_overview JNDI documentation}. - -@since 1.3 - -</body> -</html> diff --git a/src/java.naming/share/classes/javax/naming/spi/package-info.java b/src/java.naming/share/classes/javax/naming/spi/package-info.java new file mode 100644 index 0000000000000..382a35a17e8ba --- /dev/null +++ b/src/java.naming/share/classes/javax/naming/spi/package-info.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +/** + * Provides the means for dynamically plugging in support for accessing + * naming and directory services through the {@code javax.naming} + * and related packages. + * + * <p> + * This package defines the service provider interface (SPI) of the Java Naming + * and Directory Interface (JNDI).   + * JNDI provides naming and directory functionality to applications + * written in the Java programming language. It is designed to be + * independent of any specific naming or directory service + * implementation. Thus a variety of services--new, emerging, and + * already deployed ones--can be accessed in a common way. + * + * <p> + * The JNDI SPI provides the means for creating JNDI service providers, + * through which JNDI applications access different naming and + * directory services. + * + * + * <h2>Plug-in Architecture</h2> + * + * The service provider package allows different implementations to be plugged in + * dynamically. + * These different implementations include those for the + * <em>initial context</em>, + * and implementations for contexts that can be reached + * from the initial context. + * + * <h2>Java Object Support</h2> + * + * The service provider package provides support + * for implementors of the + * {@code javax.naming.Context.lookup()} + * method and related methods to return Java objects that are natural + * and intuitive for the Java programmer. + * For example, when looking up a printer name from the directory, + * it is natural for you to expect to get + * back a printer object on which to operate. + * + * + * <h2>Multiple Naming Systems (Federation)</h2> + * + * JNDI operations allow applications to supply names that span multiple + * naming systems. So in the process of completing + * an operation, one service provider might need to interact + * with another service provider, for example, to pass on + * the operation to be continued in the next naming system. + * The service provider package provides support for + * different providers to cooperate to complete JNDI operations. + * + * + * <h2>Package Specification</h2> + * + * The JNDI SPI Specification and related documents can be found in the + * {@extLink jndi_overview JNDI documentation}. + * + * @since 1.3 + */ +package javax.naming.spi; diff --git a/src/java.naming/share/classes/javax/naming/spi/package.html b/src/java.naming/share/classes/javax/naming/spi/package.html deleted file mode 100644 index f523c76deb4b5..0000000000000 --- a/src/java.naming/share/classes/javax/naming/spi/package.html +++ /dev/null @@ -1,90 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> -<html> -<head> -<!-- -Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. -DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - -This code is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License version 2 only, as -published by the Free Software Foundation. Oracle designates this -particular file as subject to the "Classpath" exception as provided -by Oracle in the LICENSE file that accompanied this code. - -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. ---> -</head> -<body bgcolor="white"> - -Provides the means for dynamically plugging in support for accessing -naming and directory services through the <code>javax.naming</code> -and related packages. - -<p> -This package defines the service provider interface (SPI) of the Java Naming -and Directory Interface (JNDI).   -JNDI provides naming and directory functionality to applications -written in the Java programming language. It is designed to be -independent of any specific naming or directory service -implementation. Thus a variety of services--new, emerging, and -already deployed ones--can be accessed in a common way. - -<p> -The JNDI SPI provides the means for creating JNDI service providers, -through which JNDI applications access different naming and -directory services. - - -<h2>Plug-in Architecture</h2> - -The service provider package allows different implementations to be plugged in -dynamically. -These different implementations include those for the -<em>initial context</em>, -and implementations for contexts that can be reached -from the initial context. - -<h2>Java Object Support</h2> - -The service provider package provides support -for implementors of the -<code>javax.naming.Context.lookup()</code> -method and related methods to return Java objects that are natural -and intuitive for the Java programmer. -For example, when looking up a printer name from the directory, -it is natural for you to expect to get -back a printer object on which to operate. - - -<h2>Multiple Naming Systems (Federation)</h2> - -JNDI operations allow applications to supply names that span multiple -naming systems. So in the process of completing -an operation, one service provider might need to interact -with another service provider, for example, to pass on -the operation to be continued in the next naming system. -The service provider package provides support for -different providers to cooperate to complete JNDI operations. - - -<h2>Package Specification</h2> - -The JNDI SPI Specification and related documents can be found in the -{@extLink jndi_overview JNDI documentation}. - -@since 1.3 - -</body> -</html> From b0efd7740243916ba22178524ab2ede9e5436d94 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Thu, 4 Jul 2024 12:42:47 +0000 Subject: [PATCH 305/471] 8314653: Metaspace: remove allocation guard feature Reviewed-by: azafari, dholmes --- .../share/memory/metaspace/metaspaceArena.cpp | 41 +---------- .../share/memory/metaspace/metaspaceArena.hpp | 24 +------ .../memory/metaspace/metaspaceSettings.cpp | 8 +-- .../memory/metaspace/metaspaceSettings.hpp | 6 +- src/hotspot/share/runtime/globals.hpp | 3 - .../gtest/metaspace/test_allocationGuard.cpp | 69 ------------------- .../gtest/metaspace/test_metaspacearena.cpp | 22 ------ .../metaspace/test_metaspacearena_stress.cpp | 4 +- test/hotspot/jtreg/gtest/MetaspaceGtests.java | 18 ++--- .../runtime/Metaspace/PrintMetaspaceDcmd.java | 13 +--- .../elastic/MetaspaceTestContext.java | 10 +-- .../runtime/Metaspace/elastic/Settings.java | 4 +- .../elastic/TestMetaspaceAllocation.java | 16 ++--- .../elastic/TestMetaspaceAllocationMT1.java | 23 +------ .../elastic/TestMetaspaceAllocationMT2.java | 23 +------ 15 files changed, 21 insertions(+), 263 deletions(-) delete mode 100644 test/hotspot/gtest/metaspace/test_allocationGuard.cpp diff --git a/src/hotspot/share/memory/metaspace/metaspaceArena.cpp b/src/hotspot/share/memory/metaspace/metaspaceArena.cpp index 8c5ebfed289f4..92d7d0ea7eba1 100644 --- a/src/hotspot/share/memory/metaspace/metaspaceArena.cpp +++ b/src/hotspot/share/memory/metaspace/metaspaceArena.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2020, 2023 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -117,9 +117,6 @@ MetaspaceArena::MetaspaceArena(ChunkManager* chunk_manager, const ArenaGrowthPol _fbl(nullptr), _total_used_words_counter(total_used_words_counter), _name(name) -#ifdef ASSERT - , _first_fence(nullptr) -#endif { UL(debug, ": born."); @@ -128,14 +125,7 @@ MetaspaceArena::MetaspaceArena(ChunkManager* chunk_manager, const ArenaGrowthPol } MetaspaceArena::~MetaspaceArena() { -#ifdef ASSERT - SOMETIMES(verify();) - if (Settings::use_allocation_guard()) { - verify_allocation_guards(); - } -#endif MemRangeCounter return_counter; - Metachunk* c = _chunks.first(); Metachunk* c2 = nullptr; @@ -239,23 +229,6 @@ MetaWord* MetaspaceArena::allocate(size_t requested_word_size) { // Primary allocation p = allocate_inner(aligned_word_size); -#ifdef ASSERT - // Fence allocation - if (p != nullptr && Settings::use_allocation_guard()) { - STATIC_ASSERT(is_aligned(sizeof(Fence), BytesPerWord)); - MetaWord* guard = allocate_inner(sizeof(Fence) / BytesPerWord); - if (guard != nullptr) { - // Ignore allocation errors for the fence to keep coding simple. If this - // happens (e.g. because right at this time we hit the Metaspace GC threshold) - // we miss adding this one fence. Not a big deal. Note that his would - // be pretty rare. Chances are much higher the primary allocation above - // would have already failed). - Fence* f = new(guard) Fence(_first_fence); - _first_fence = f; - } - } -#endif // ASSERT - return p; } @@ -427,18 +400,6 @@ void MetaspaceArena::verify() const { } } -void MetaspaceArena::Fence::verify() const { - assert(_eye1 == EyeCatcher && _eye2 == EyeCatcher, - "Metaspace corruption: fence block at " PTR_FORMAT " broken.", p2i(this)); -} - -void MetaspaceArena::verify_allocation_guards() const { - assert(Settings::use_allocation_guard(), "Don't call with guards disabled."); - for (const Fence* f = _first_fence; f != nullptr; f = f->next()) { - f->verify(); - } -} - // Returns true if the area indicated by pointer and size have actually been allocated // from this arena. bool MetaspaceArena::is_valid_area(MetaWord* p, size_t word_size) const { diff --git a/src/hotspot/share/memory/metaspace/metaspaceArena.hpp b/src/hotspot/share/memory/metaspace/metaspaceArena.hpp index 58d80e97e172c..77eb939c6b4d8 100644 --- a/src/hotspot/share/memory/metaspace/metaspaceArena.hpp +++ b/src/hotspot/share/memory/metaspace/metaspaceArena.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2020 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -100,28 +100,6 @@ class MetaspaceArena : public CHeapObj<mtClass> { // A name for purely debugging/logging purposes. const char* const _name; -#ifdef ASSERT - // Allocation guards: When active, arena allocations are interleaved with - // fence allocations. An overwritten fence indicates a buffer overrun in either - // the preceding or the following user block. All fences are linked together; - // validating the fences just means walking that linked list. - // Note that for the Arena, fence blocks are just another form of user blocks. - class Fence { - static const uintx EyeCatcher = - NOT_LP64(0x77698465) LP64_ONLY(0x7769846577698465ULL); // "META" resp "METAMETA" - // Two eyecatchers to easily spot a corrupted _next pointer - const uintx _eye1; - const Fence* const _next; - NOT_LP64(uintx _dummy;) - const uintx _eye2; - public: - Fence(const Fence* next) : _eye1(EyeCatcher), _next(next), _eye2(EyeCatcher) {} - const Fence* next() const { return _next; } - void verify() const; - }; - const Fence* _first_fence; -#endif // ASSERT - ChunkManager* chunk_manager() const { return _chunk_manager; } // free block list diff --git a/src/hotspot/share/memory/metaspace/metaspaceSettings.cpp b/src/hotspot/share/memory/metaspace/metaspaceSettings.cpp index 7dc742755b65e..b812341a2da34 100644 --- a/src/hotspot/share/memory/metaspace/metaspaceSettings.cpp +++ b/src/hotspot/share/memory/metaspace/metaspaceSettings.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2020, 2023 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -36,8 +36,6 @@ namespace metaspace { -DEBUG_ONLY(bool Settings::_use_allocation_guard = false;) - void Settings::ergo_initialize() { // Granules must be a multiple of page size, and a power-2-value. @@ -46,9 +44,6 @@ void Settings::ergo_initialize() { "Granule size must be a page-size-aligned power-of-2 value"); assert(commit_granule_words() <= chunklevel::MAX_CHUNK_WORD_SIZE, "Too large granule size"); - // Off for release builds, off by default - but switchable - for debug builds. - DEBUG_ONLY(_use_allocation_guard = MetaspaceGuardAllocations;) - LogStream ls(Log(metaspace)::info()); Settings::print_on(&ls); } @@ -58,7 +53,6 @@ void Settings::print_on(outputStream* st) { st->print_cr(" - commit_granule_words: " SIZE_FORMAT ".", commit_granule_words()); st->print_cr(" - virtual_space_node_default_size: " SIZE_FORMAT ".", virtual_space_node_default_word_size()); st->print_cr(" - enlarge_chunks_in_place: %d.", (int)enlarge_chunks_in_place()); - st->print_cr(" - use_allocation_guard: %d.", (int)use_allocation_guard()); } } // namespace metaspace diff --git a/src/hotspot/share/memory/metaspace/metaspaceSettings.hpp b/src/hotspot/share/memory/metaspace/metaspaceSettings.hpp index 93be0eb6fe63e..84dcf8d2f0f09 100644 --- a/src/hotspot/share/memory/metaspace/metaspaceSettings.hpp +++ b/src/hotspot/share/memory/metaspace/metaspaceSettings.hpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, 2023 SAP SE. All rights reserved. - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,9 +56,6 @@ class Settings : public AllStatic { // the requested size, we attempt to double the chunk size in place... static const bool _enlarge_chunks_in_place = true; - // If true, metablock allocations are guarded and periodically checked. - DEBUG_ONLY(static bool _use_allocation_guard;) - public: static size_t commit_granule_bytes() { return _commit_granule_bytes; } @@ -66,7 +63,6 @@ class Settings : public AllStatic { static size_t virtual_space_node_default_word_size() { return _virtual_space_node_default_word_size; } static size_t virtual_space_node_reserve_alignment_words() { return _virtual_space_node_reserve_alignment_words; } static bool enlarge_chunks_in_place() { return _enlarge_chunks_in_place; } - static bool use_allocation_guard() { return DEBUG_ONLY(_use_allocation_guard) NOT_DEBUG(false); } static void ergo_initialize(); diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp index 468e9bd880086..cbd161d86eb48 100644 --- a/src/hotspot/share/runtime/globals.hpp +++ b/src/hotspot/share/runtime/globals.hpp @@ -1408,9 +1408,6 @@ const int ObjectAlignmentInBytes = 8; product(bool, PrintMetaspaceStatisticsAtExit, false, DIAGNOSTIC, \ "Print metaspace statistics upon VM exit.") \ \ - develop(bool, MetaspaceGuardAllocations, false, \ - "Metapace allocations are guarded.") \ - \ product(uintx, MinHeapFreeRatio, 40, MANAGEABLE, \ "The minimum percentage of heap free after GC to avoid expansion."\ " For most GCs this applies to the old generation. In G1 and" \ diff --git a/test/hotspot/gtest/metaspace/test_allocationGuard.cpp b/test/hotspot/gtest/metaspace/test_allocationGuard.cpp deleted file mode 100644 index 9b0eb3d69a5df..0000000000000 --- a/test/hotspot/gtest/metaspace/test_allocationGuard.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2020 SAP SE. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include "precompiled.hpp" -#include "memory/metaspace/metaspaceArena.hpp" -#include "memory/metaspace/metaspaceSettings.hpp" -#include "memory/metaspace/testHelpers.hpp" -#include "utilities/debug.hpp" -#include "utilities/ostream.hpp" - -//#define LOG_PLEASE -#include "metaspaceGtestCommon.hpp" -#include "metaspaceGtestContexts.hpp" - -#ifdef ASSERT - -using metaspace::MetaspaceArena; -using metaspace::MetaspaceTestArena; -using metaspace::Settings; - -// Test that overwriting memory triggers an assert if allocation guards are enabled. -// Note: We use TEST_VM_ASSERT_MSG. However, an assert is only triggered if allocation -// guards are enabled; if guards are disabled for the gtests, this test would fail. -// So for that case, we trigger a fake assert. -TEST_VM_ASSERT_MSG(metaspace, test_overwriter, ".*Metaspace corruption.*") { - - if (Settings::use_allocation_guard()) { - MetaspaceGtestContext context; - MetaspaceTestArena* arena = context.create_arena(Metaspace::StandardMetaspaceType); - // We allocate two blocks. We then write over the end of the first block, which - // should corrupt the fence between the two blocks. - // Note: there is of course no guarantee that blocks allocated sequentially are neighbors; - // but in this case (clean standard-sized test arena and very small allocations) it can - // be safely assumed). - MetaWord* p1 = arena->allocate(8); - MetaWord* p2 = arena->allocate(2); - p1[8] = (MetaWord)0x9345; // Overwriter - // Now we delete the arena (as happens during class unloading); this will check all - // block canaries and should trigger an assert (see MetaspaceArena::verify_allocation_guards()). - delete arena; - } else { - assert(false, "Metaspace corruption - please ignore this, fake message to satisfy tests"); - } - -} - -#endif // ASSERT diff --git a/test/hotspot/gtest/metaspace/test_metaspacearena.cpp b/test/hotspot/gtest/metaspace/test_metaspacearena.cpp index f7474da22c065..aee53ea32aa16 100644 --- a/test/hotspot/gtest/metaspace/test_metaspacearena.cpp +++ b/test/hotspot/gtest/metaspace/test_metaspacearena.cpp @@ -291,11 +291,6 @@ TEST_VM(metaspace, MetaspaceArena_test_enlarge_in_place_micro_nc) { // Here, we give it an ideal policy which should enable the initial chunk to grow unmolested // until finish. TEST_VM(metaspace, MetaspaceArena_test_enlarge_in_place_2) { - - if (Settings::use_allocation_guard()) { - return; - } - // Note: internally, chunk in-place enlargement is disallowed if growing the chunk // would cause the arena to claim more memory than its growth policy allows. This // is done to prevent the arena to grow too fast. @@ -337,11 +332,6 @@ TEST_VM(metaspace, MetaspaceArena_test_enlarge_in_place_2) { // test that in place enlargement correctly fails if growing the chunk would bring us // beyond the max. size of a chunk. TEST_VM(metaspace, MetaspaceArena_test_failing_to_enlarge_in_place_max_chunk_size) { - - if (Settings::use_allocation_guard()) { - return; - } - MetaspaceGtestContext context; for (size_t first_allocation_size = 1; first_allocation_size <= MAX_CHUNK_WORD_SIZE / 2; first_allocation_size *= 2) { @@ -372,11 +362,6 @@ TEST_VM(metaspace, MetaspaceArena_test_failing_to_enlarge_in_place_max_chunk_siz // test that in place enlargement correctly fails if growing the chunk would cause more // than doubling its size TEST_VM(metaspace, MetaspaceArena_test_failing_to_enlarge_in_place_doubling_chunk_size) { - - if (Settings::use_allocation_guard()) { - return; - } - MetaspaceGtestContext context; MetaspaceArenaTestHelper helper(context, Metaspace::StandardMetaspaceType, false); @@ -399,9 +384,6 @@ TEST_VM(metaspace, MetaspaceArena_test_failing_to_enlarge_in_place_doubling_chun // Allocate, deallocate, then allocate the same block again. The second allocate should // reuse the deallocated block. TEST_VM(metaspace, MetaspaceArena_deallocate) { - if (Settings::use_allocation_guard()) { - return; - } for (size_t s = 2; s <= MAX_CHUNK_WORD_SIZE; s *= 2) { MetaspaceGtestContext context; MetaspaceArenaTestHelper helper(context, Metaspace::StandardMetaspaceType, false); @@ -505,10 +487,6 @@ static void test_controlled_growth(Metaspace::MetaspaceType type, bool is_class, bool test_in_place_enlargement) { - if (Settings::use_allocation_guard()) { - return; - } - // From a MetaspaceArena in a clean room allocate tiny amounts; // watch it grow. Used/committed/capacity should not grow in // large jumps. Also, different types of MetaspaceArena should diff --git a/test/hotspot/gtest/metaspace/test_metaspacearena_stress.cpp b/test/hotspot/gtest/metaspace/test_metaspacearena_stress.cpp index 7d3df0798025e..e94f733e45b2d 100644 --- a/test/hotspot/gtest/metaspace/test_metaspacearena_stress.cpp +++ b/test/hotspot/gtest/metaspace/test_metaspacearena_stress.cpp @@ -106,15 +106,13 @@ class MetaspaceArenaTestBed : public CHeapObj<mtInternal> { // - alignment/padding of allocations // - inside used counter contains blocks in free list // - free block list splinter threshold - // - if +MetaspaceGuardAllocations, guard costs // Since what we deallocated may have been given back to us in a following allocation, // we only know fore sure we allocated what we did not give back. const size_t at_least_allocated = _alloc_count.total_size() - _dealloc_count.total_size(); // At most we allocated this: - const size_t max_word_overhead_per_alloc = - 4 + (metaspace::Settings::use_allocation_guard() ? 4 : 0); + constexpr size_t max_word_overhead_per_alloc = 4; const size_t at_most_allocated = _alloc_count.total_size() + max_word_overhead_per_alloc * _alloc_count.count(); ASSERT_LE(at_least_allocated, in_use_stats._used_words - stats._free_blocks_word_size); diff --git a/test/hotspot/jtreg/gtest/MetaspaceGtests.java b/test/hotspot/jtreg/gtest/MetaspaceGtests.java index 4710c5910295e..f1f811d6a7183 100644 --- a/test/hotspot/jtreg/gtest/MetaspaceGtests.java +++ b/test/hotspot/jtreg/gtest/MetaspaceGtests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2020, 2023 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -25,8 +25,8 @@ /* * Note: This runs the metaspace-related parts of gtest in configurations which - * are not tested explicitly in the standard gtests. - * + * are not tested explicitly in the standard gtest. Hence, there is no "default-ndebug" + * since that would be equivalent to the normal gtest for release builds. */ /* @test id=default-debug @@ -40,17 +40,7 @@ * @run main/native GTestWrapper --gtest_filter=metaspace* -XX:+UnlockDiagnosticVMOptions -XX:VerifyMetaspaceInterval=1 */ -/* @test id=balanced-with-guards - * @summary Run metaspace-related gtests with allocation guards enabled - * @library /test/lib - * @modules java.base/jdk.internal.misc - * java.xml - * @requires vm.debug - * @requires vm.flagless - * @run main/native GTestWrapper --gtest_filter=metaspace* -XX:VerifyMetaspaceInterval=1 -XX:+MetaspaceGuardAllocations - */ - -/* @test id=balanced-no-ccs +/* @test id=no-ccs * @summary Run metaspace-related gtests with compressed class pointers off * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/runtime/Metaspace/PrintMetaspaceDcmd.java b/test/hotspot/jtreg/runtime/Metaspace/PrintMetaspaceDcmd.java index 56d9c2095b2eb..42f22309d9684 100644 --- a/test/hotspot/jtreg/runtime/Metaspace/PrintMetaspaceDcmd.java +++ b/test/hotspot/jtreg/runtime/Metaspace/PrintMetaspaceDcmd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, SAP and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -36,17 +36,6 @@ * @run main/othervm -Dwith-compressed-class-space -XX:MaxMetaspaceSize=201M -Xmx100M -XX:+UseCompressedOops -XX:+UseCompressedClassPointers PrintMetaspaceDcmd */ -/* - * @test id=test-64bit-ccs-guarded - * @summary Test the VM.metaspace command - * @requires vm.bits == "64" - * @requires vm.debug == true - * @library /test/lib - * @modules java.base/jdk.internal.misc - * java.management - * @run main/othervm -Dwith-compressed-class-space -XX:MaxMetaspaceSize=201M -Xmx100M -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UnlockDiagnosticVMOptions -XX:+MetaspaceGuardAllocations PrintMetaspaceDcmd - */ - /* * @test id=test-64bit-noccs * @summary Test the VM.metaspace command diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/MetaspaceTestContext.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/MetaspaceTestContext.java index 5061c828c0693..fe52317d4dd65 100644 --- a/test/hotspot/jtreg/runtime/Metaspace/elastic/MetaspaceTestContext.java +++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/MetaspaceTestContext.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, 2023 SAP SE. All rights reserved. - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -195,17 +195,11 @@ public void checkStatistics() { // - whatever we allocated // - deallocated blocks in fbl // - remains of retired chunks in fbl - // - overhead per allocation (padding for alignment, possibly allocation guards) + // - overhead per allocation (padding for alignment) // Overhead per allocation (see metaspaceArena.cpp, get_raw_allocation_word_size() ) // Any allocation is 3 words least expectedMaxUsage += (numAllocated * 3); - if (Settings.settings().usesAllocationGuards) { - // Guards need space. - expectedMaxUsage += (numAllocated * 2); - // Also, they disable the fbl, so deallocated still counts as used. - expectedMaxUsage += deallocatedWords; - } // Lets add a overhead per arena. Each arena carries a free block list containing // deallocated/retired blocks. We do not know how much. In general, the free block list should not diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/Settings.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/Settings.java index c6d69f341b9dd..222ce44acc65f 100644 --- a/test/hotspot/jtreg/runtime/Metaspace/elastic/Settings.java +++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/Settings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2020 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -27,8 +27,6 @@ public final class Settings { - public boolean usesAllocationGuards = WhiteBox.getWhiteBox().getBooleanVMFlag("MetaspaceGuardAllocations"); - final static long rootChunkWordSize = 2048 * 1024; static Settings theSettings; diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocation.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocation.java index 1ecde3f83764e..10d05a867fc61 100644 --- a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocation.java +++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocation.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, 2023 SAP SE. All rights reserved. - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,30 +27,22 @@ * @test id=debug * @bug 8251158 * @library /test/lib - * @modules java.base/jdk.internal.misc - * java.management + * @modules java.base/jdk.internal.misc java.management * @build jdk.test.whitebox.WhiteBox * @requires (vm.debug == true) - * * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:VerifyMetaspaceInterval=10 TestMetaspaceAllocation - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:VerifyMetaspaceInterval=10 -XX:+MetaspaceGuardAllocations TestMetaspaceAllocation - * */ /* * @test id=ndebug * @bug 8251158 * @library /test/lib - * @modules java.base/jdk.internal.misc - * java.management + * @modules java.base/jdk.internal.misc java.management * @build jdk.test.whitebox.WhiteBox * @requires (vm.debug == false) - * * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestMetaspaceAllocation + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestMetaspaceAllocation */ public class TestMetaspaceAllocation { diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT1.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT1.java index 8bbab2c71e96a..5676f2c4bdb0a 100644 --- a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT1.java +++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT1.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, 2023 SAP SE. All rights reserved. - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ */ /* - * @test id=debug-default-strict + * @test id=debug-default-long-manual * @library /test/lib * @modules java.base/jdk.internal.misc * java.management @@ -74,24 +74,6 @@ * TestMetaspaceAllocationMT1 10 */ -/* - * @test id=debug-guard - * @library /test/lib - * @modules java.base/jdk.internal.misc - * java.management - * @build jdk.test.whitebox.WhiteBox - * @key randomness - * @requires (vm.debug == true) - * - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * - * @run main/othervm/timeout=400 - * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI - * -XX:VerifyMetaspaceInterval=10 - * -XX:+MetaspaceGuardAllocations - * TestMetaspaceAllocationMT1 3 - */ - /* * @test id=ndebug-default * @library /test/lib @@ -130,7 +112,6 @@ public static void main(String[] args) throws Exception { System.out.println("#### seconds: " + seconds); System.out.println("#### commitLimit: " + commitLimit); System.out.println("#### reserveLimit: " + reserveLimit); - System.out.println("#### guards: " + Settings.settings().usesAllocationGuards); MetaspaceTestContext context = new MetaspaceTestContext(commitLimit, reserveLimit); MetaspaceTestOneArenaManyThreads test = new MetaspaceTestOneArenaManyThreads(context, testAllocationCeiling, numThreads, seconds); diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT2.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT2.java index 17e3bb99353b2..2c6b3923d9464 100644 --- a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT2.java +++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT2.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, 2023 SAP SE. All rights reserved. - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,7 +58,7 @@ */ /* - * @test id=debug-default-strict + * @test id=debug-default-long-manual * @library /test/lib * @modules java.base/jdk.internal.misc * java.management @@ -74,24 +74,6 @@ * TestMetaspaceAllocationMT2 10 */ -/* - * @test id=debug-guard - * @library /test/lib - * @modules java.base/jdk.internal.misc - * java.management - * @build jdk.test.whitebox.WhiteBox - * @key randomness - * @requires (vm.debug == true) - * - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * - * @run main/othervm/timeout=400 - * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI - * -XX:VerifyMetaspaceInterval=10 - * -XX:+MetaspaceGuardAllocations - * TestMetaspaceAllocationMT2 3 - */ - /* * @test id=ndebug-default * @library /test/lib @@ -129,7 +111,6 @@ public static void main(String[] args) throws Exception { System.out.println("#### seconds: " + seconds); System.out.println("#### commitLimit: " + commitLimit); System.out.println("#### reserveLimit: " + reserveLimit); - System.out.println("#### guards: " + Settings.settings().usesAllocationGuards); MetaspaceTestContext context = new MetaspaceTestContext(commitLimit, reserveLimit); MetaspaceTestManyArenasManyThreads test = new MetaspaceTestManyArenasManyThreads(context, testAllocationCeiling, numThreads, seconds); From da0ffa8b7ff04eb5cbc0fcbe4b858f20d7e46405 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga <rtoyonag@redhat.com> Date: Thu, 4 Jul 2024 13:35:24 +0000 Subject: [PATCH 306/471] 8334031: Generated JfrNativeSettings seems off Reviewed-by: egahlin --- make/src/classes/build/tools/jfr/GenerateJfrFiles.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make/src/classes/build/tools/jfr/GenerateJfrFiles.java b/make/src/classes/build/tools/jfr/GenerateJfrFiles.java index 34e933eb22d23..7532a446aa162 100644 --- a/make/src/classes/build/tools/jfr/GenerateJfrFiles.java +++ b/make/src/classes/build/tools/jfr/GenerateJfrFiles.java @@ -668,7 +668,7 @@ private static void printJfrEventControlHpp(Metadata metadata, File outputFile) out.write(" // add named struct members also."); out.write(" struct {"); out.write(" jfrNativeEventSetting pad[NUMBER_OF_RESERVED_EVENTS];"); - for (TypeElement t : metadata.getEventsAndStructs()) { + for (TypeElement t : metadata.getEvents()) { out.write(" jfrNativeEventSetting " + t.name + ";"); } out.write(" } ev;"); From 3050ba017687ac13e1bbccdd1544d25f8eb2a747 Mon Sep 17 00:00:00 2001 From: Jasmine Karthikeyan <jkarthikeyan@openjdk.org> Date: Thu, 4 Jul 2024 14:09:45 +0000 Subject: [PATCH 307/471] 8335654: Remove stale hyperlink in divnode.cpp Reviewed-by: chagedorn, thartmann --- src/hotspot/share/opto/divnode.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hotspot/share/opto/divnode.cpp b/src/hotspot/share/opto/divnode.cpp index 9c6c6ed25dec2..967d6661eec54 100644 --- a/src/hotspot/share/opto/divnode.cpp +++ b/src/hotspot/share/opto/divnode.cpp @@ -266,7 +266,6 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con } // Taken from Hacker's Delight, Fig. 8-2. Multiply high signed. - // (http://www.hackersdelight.org/HDcode/mulhs.c) // // int mulhs(int u, int v) { // unsigned u0, v0, w0; From f4fa35e28b9881729ac47c8518e758bba676fdec Mon Sep 17 00:00:00 2001 From: Nizar Benalla <nbenalla@openjdk.org> Date: Thu, 4 Jul 2024 15:44:57 +0000 Subject: [PATCH 308/471] 8330954: since-checker - Fix remaining @ since tags in java.base Reviewed-by: liach, naoto --- .../classes/java/io/FileInputStream.java | 3 +++ .../java/lang/classfile/ClassSignature.java | 6 ++++- .../classes/java/lang/constant/ClassDesc.java | 3 +++ .../java/lang/constant/MethodHandleDesc.java | 3 +++ .../java/lang/constant/MethodTypeDesc.java | 2 ++ .../java/lang/foreign/MemorySegment.java | 2 ++ .../classes/java/lang/ref/Reference.java | 4 +--- .../share/classes/java/text/ChoiceFormat.java | 6 +++++ .../util/concurrent/CompletableFuture.java | 24 +++++++++++++++++++ .../java/util/concurrent/DelayQueue.java | 2 ++ .../java/util/concurrent/ForkJoinTask.java | 9 +++++++ .../java/util/concurrent/FutureTask.java | 9 +++++++ 12 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/java/io/FileInputStream.java b/src/java.base/share/classes/java/io/FileInputStream.java index 20bf57a56c77a..2750710823771 100644 --- a/src/java.base/share/classes/java/io/FileInputStream.java +++ b/src/java.base/share/classes/java/io/FileInputStream.java @@ -371,6 +371,9 @@ public byte[] readAllBytes() throws IOException { return (capacity == nread) ? buf : Arrays.copyOf(buf, nread); } + /** + * @since 11 + */ @Override public byte[] readNBytes(int len) throws IOException { if (len < 0) diff --git a/src/java.base/share/classes/java/lang/classfile/ClassSignature.java b/src/java.base/share/classes/java/lang/classfile/ClassSignature.java index b3050b78a8568..852d5f9baf4f1 100644 --- a/src/java.base/share/classes/java/lang/classfile/ClassSignature.java +++ b/src/java.base/share/classes/java/lang/classfile/ClassSignature.java @@ -41,7 +41,11 @@ public sealed interface ClassSignature /** {@return the type parameters of this class} */ List<Signature.TypeParam> typeParameters(); - /** {@return the instantiation of the superclass in this signature} */ + /** + * {@return the instantiation of the superclass in this signature} + * + * @since 23 + */ Signature.ClassTypeSig superclassSignature(); /** {@return the instantiation of the interfaces in this signature} */ diff --git a/src/java.base/share/classes/java/lang/constant/ClassDesc.java b/src/java.base/share/classes/java/lang/constant/ClassDesc.java index 370d2eee507f6..d2da4ec5c85d3 100644 --- a/src/java.base/share/classes/java/lang/constant/ClassDesc.java +++ b/src/java.base/share/classes/java/lang/constant/ClassDesc.java @@ -374,6 +374,9 @@ else if (isArray()) { */ String descriptorString(); + /** + * @since 21 + */ @Override Class<?> resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException; diff --git a/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java b/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java index 616c5b6736597..6a3541bf5e930 100644 --- a/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java +++ b/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java @@ -207,6 +207,9 @@ default MethodHandleDesc asType(MethodTypeDesc type) { */ MethodTypeDesc invocationType(); + /** + * @since 21 + */ @Override MethodHandle resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException; diff --git a/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java b/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java index 19bce254d496e..fb90b1f15c586 100644 --- a/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java +++ b/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java @@ -222,6 +222,8 @@ default String displayDescriptor() { * @apiNote {@linkplain MethodTypeDesc} can represent method type descriptors * that are not representable by {@linkplain MethodType}, such as methods with * more than 255 parameter slots, so attempts to resolve these may result in errors. + * + * @since 21 */ @Override MethodType resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException; diff --git a/src/java.base/share/classes/java/lang/foreign/MemorySegment.java b/src/java.base/share/classes/java/lang/foreign/MemorySegment.java index 1b378512316a6..aa1f1762aec65 100644 --- a/src/java.base/share/classes/java/lang/foreign/MemorySegment.java +++ b/src/java.base/share/classes/java/lang/foreign/MemorySegment.java @@ -618,6 +618,8 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * // Take action (e.g. throw an Exception) * } * } + * + * @since 23 */ long maxByteAlignment(); diff --git a/src/java.base/share/classes/java/lang/ref/Reference.java b/src/java.base/share/classes/java/lang/ref/Reference.java index f29a293ce02c7..747aa64902f8e 100644 --- a/src/java.base/share/classes/java/lang/ref/Reference.java +++ b/src/java.base/share/classes/java/lang/ref/Reference.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -521,8 +521,6 @@ public boolean enqueue() { * * @return never returns normally * @throws CloneNotSupportedException always - * - * @since 11 */ @Override protected Object clone() throws CloneNotSupportedException { diff --git a/src/java.base/share/classes/java/text/ChoiceFormat.java b/src/java.base/share/classes/java/text/ChoiceFormat.java index 5d71d9d726296..ccb6cc4a04f47 100644 --- a/src/java.base/share/classes/java/text/ChoiceFormat.java +++ b/src/java.base/share/classes/java/text/ChoiceFormat.java @@ -586,12 +586,18 @@ public Number parse(String text, ParsePosition status) { return Double.valueOf(bestNumber); } + /** + * @since 23 + */ @Override public boolean isStrict() { throw new UnsupportedOperationException( "ChoiceFormat does not utilize leniency when parsing"); } + /** + * @since 23 + */ @Override public void setStrict(boolean strict) { throw new UnsupportedOperationException( diff --git a/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java b/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java index 32545155b53fa..1a43b29d798f3 100644 --- a/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java +++ b/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java @@ -2178,6 +2178,9 @@ public T getNow(T valueIfAbsent) { return ((r = result) == null) ? valueIfAbsent : (T) reportJoin(r, "getNow"); } + /** + * @since 19 + */ @Override public T resultNow() { Object r = result; @@ -2193,6 +2196,9 @@ public T resultNow() { throw new IllegalStateException(); } + /** + * @since 19 + */ @Override public Throwable exceptionNow() { Object r = result; @@ -2440,26 +2446,41 @@ public CompletableFuture<T> exceptionally( return uniExceptionallyStage(null, fn); } + /** + * @since 12 + */ public CompletableFuture<T> exceptionallyAsync( Function<Throwable, ? extends T> fn) { return uniExceptionallyStage(defaultExecutor(), fn); } + /** + * @since 12 + */ public CompletableFuture<T> exceptionallyAsync( Function<Throwable, ? extends T> fn, Executor executor) { return uniExceptionallyStage(screenExecutor(executor), fn); } + /** + * @since 12 + */ public CompletableFuture<T> exceptionallyCompose( Function<Throwable, ? extends CompletionStage<T>> fn) { return uniComposeExceptionallyStage(null, fn); } + /** + * @since 12 + */ public CompletableFuture<T> exceptionallyComposeAsync( Function<Throwable, ? extends CompletionStage<T>> fn) { return uniComposeExceptionallyStage(defaultExecutor(), fn); } + /** + * @since 12 + */ public CompletableFuture<T> exceptionallyComposeAsync( Function<Throwable, ? extends CompletionStage<T>> fn, Executor executor) { @@ -2585,6 +2606,9 @@ public boolean isCompletedExceptionally() { return ((r = result) instanceof AltResult) && r != NIL; } + /** + * @since 19 + */ @Override public State state() { Object r = result; diff --git a/src/java.base/share/classes/java/util/concurrent/DelayQueue.java b/src/java.base/share/classes/java/util/concurrent/DelayQueue.java index c53a02ddf71c3..abd14142da52d 100644 --- a/src/java.base/share/classes/java/util/concurrent/DelayQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/DelayQueue.java @@ -327,6 +327,8 @@ public E poll(long timeout, TimeUnit unit) throws InterruptedException { * @return the <em>expired head</em> of this queue * @throws NoSuchElementException if this queue has no elements with an * expired delay + * + * @since 21 */ public E remove() { return super.remove(); diff --git a/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java b/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java index e58af0b0fa5a8..8ca52dc5cb29d 100644 --- a/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java +++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java @@ -887,6 +887,9 @@ public final boolean isCompletedNormally() { return (status & (DONE | ABNORMAL)) == DONE; } + /** + * @since 19 + */ @Override public State state() { int s = status; @@ -896,6 +899,9 @@ public State state() { State.CANCELLED; } + /** + * @since 19 + */ @Override public V resultNow() { int s = status; @@ -910,6 +916,9 @@ public V resultNow() { return getRawResult(); } + /** + * @since 19 + */ @Override public Throwable exceptionNow() { Throwable ex; diff --git a/src/java.base/share/classes/java/util/concurrent/FutureTask.java b/src/java.base/share/classes/java/util/concurrent/FutureTask.java index 371055d2c11d2..627e69559c856 100644 --- a/src/java.base/share/classes/java/util/concurrent/FutureTask.java +++ b/src/java.base/share/classes/java/util/concurrent/FutureTask.java @@ -205,6 +205,9 @@ public V get(long timeout, TimeUnit unit) return report(s); } + /** + * @since 19 + */ @Override public V resultNow() { switch (state()) { // Future.State @@ -221,6 +224,9 @@ public V resultNow() { } } + /** + * @since 19 + */ @Override public Throwable exceptionNow() { switch (state()) { // Future.State @@ -236,6 +242,9 @@ public Throwable exceptionNow() { } } + /** + * @since 19 + */ @Override public State state() { int s = state; From cff9e246cc2fbd3914f40bb71daa85dcf7731396 Mon Sep 17 00:00:00 2001 From: Liang Mao <lmao@openjdk.org> Date: Fri, 5 Jul 2024 02:29:07 +0000 Subject: [PATCH 309/471] 8335493: check_gc_overhead_limit should reset SoftRefPolicy::_should_clear_all_soft_refs Reviewed-by: ayang --- src/hotspot/share/gc/shared/gcOverheadChecker.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/gc/shared/gcOverheadChecker.cpp b/src/hotspot/share/gc/shared/gcOverheadChecker.cpp index acbc1d65c26a4..18a92caf5dfb1 100644 --- a/src/hotspot/share/gc/shared/gcOverheadChecker.cpp +++ b/src/hotspot/share/gc/shared/gcOverheadChecker.cpp @@ -40,7 +40,11 @@ void GCOverheadChecker::check_gc_overhead_limit(GCOverheadTester* time_overhead, bool is_full_gc, GCCause::Cause gc_cause, SoftRefPolicy* soft_ref_policy) { - + if (is_full_gc) { + // Explicit Full GC would do the clearing of soft-refs as well + // So reset in the beginning + soft_ref_policy->set_should_clear_all_soft_refs(false); + } // Ignore explicit GC's. Exiting here does not set the flag and // does not reset the count. if (GCCause::is_user_requested_gc(gc_cause) || From b9d8056d5c1528198ad373f9b4a09547e2fcabd6 Mon Sep 17 00:00:00 2001 From: Sonia Zaldana Calles <szaldana@openjdk.org> Date: Fri, 5 Jul 2024 04:49:01 +0000 Subject: [PATCH 310/471] 8332124: Jcmd should recognise options that look like requests for help Reviewed-by: kevinw, stuefe --- .../share/services/diagnosticFramework.cpp | 29 ++++- .../share/services/diagnosticFramework.hpp | 5 +- .../tools/jcmd/TestJcmdSubcommandHelp.java | 119 ++++++++++++++++++ 3 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 test/jdk/sun/tools/jcmd/TestJcmdSubcommandHelp.java diff --git a/src/hotspot/share/services/diagnosticFramework.cpp b/src/hotspot/share/services/diagnosticFramework.cpp index 984122f2777f5..73aa80a950f93 100644 --- a/src/hotspot/share/services/diagnosticFramework.cpp +++ b/src/hotspot/share/services/diagnosticFramework.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -400,7 +400,15 @@ void DCmd::parse_and_execute(DCmdSource source, outputStream* out, break; } if (line.is_executable()) { + // Allow for "<cmd> -h|-help|--help" to enable the help diagnostic command. + // Ignores any additional arguments. ResourceMark rm; + stringStream updated_line; + if (reorder_help_cmd(line, updated_line)) { + CmdLine updated_cmd(updated_line.base(), updated_line.size(), false); + line = updated_cmd; + } + DCmd* command = DCmdFactory::create_local_DCmd(source, line, out, CHECK); assert(command != nullptr, "command error must be handled before this line"); DCmdMark mark(command); @@ -411,6 +419,25 @@ void DCmd::parse_and_execute(DCmdSource source, outputStream* out, } } +bool DCmd::reorder_help_cmd(CmdLine line, stringStream &updated_line) { + stringStream args; + args.print("%s", line.args_addr()); + char* rest = args.as_string(); + char* token = strtok_r(rest, " ", &rest); + while (token != NULL) { + if (strcmp(token, "-h") == 0 || strcmp(token, "--help") == 0 || + strcmp(token, "-help") == 0) { + updated_line.print("%s", "help "); + updated_line.write(line.cmd_addr(), line.cmd_len()); + updated_line.write("\0", 1); + return true; + } + token = strtok_r(rest, " ", &rest); + } + + return false; +} + void DCmdWithParser::parse(CmdLine* line, char delim, TRAPS) { _dcmdparser.parse(line, delim, CHECK); } diff --git a/src/hotspot/share/services/diagnosticFramework.hpp b/src/hotspot/share/services/diagnosticFramework.hpp index 898f29274eaa1..e8881c2364611 100644 --- a/src/hotspot/share/services/diagnosticFramework.hpp +++ b/src/hotspot/share/services/diagnosticFramework.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -312,6 +312,9 @@ class DCmd : public AnyObj { // management.cpp every time. static void register_dcmds(); + // Helper method to substitute help options "<cmd> -h|-help|--help" + // for "help <cmd>". + static bool reorder_help_cmd(CmdLine line, stringStream& updated_line); }; class DCmdWithParser : public DCmd { diff --git a/test/jdk/sun/tools/jcmd/TestJcmdSubcommandHelp.java b/test/jdk/sun/tools/jcmd/TestJcmdSubcommandHelp.java new file mode 100644 index 0000000000000..dee26ac5a17ba --- /dev/null +++ b/test/jdk/sun/tools/jcmd/TestJcmdSubcommandHelp.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Red Hat Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8332124 + * @summary Test to verify jcmd accepts the "-help", "--help" and "-h" suboptions as a command argument + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run main/othervm TestJcmdSubcommandHelp + * + */ + +import jdk.test.lib.process.OutputAnalyzer; + + +public class TestJcmdSubcommandHelp { + + private static final String HELP_ONE_DASH = "-help"; + private static final String HELP_TWO_DASH = "--help"; + private static final String SINGLE_H = "-h"; + private static final String CMD = "VM.metaspace"; + private static final String ILLEGAL = "IllegalArgumentException: Unknown argument"; + + public static void main(String[] args) throws Exception { + + // Sanity check with empty input + OutputAnalyzer output = JcmdBase.jcmd(); + output.shouldContain("The following commands are available:"); + + // Sanity check with existing usage for "help <cmd>" + output = JcmdBase.jcmd("help", CMD); + String expectedOutput = output.getOutput(); + output.shouldNotContain("Unknown diagnostic command"); + + testExpectedUsage(HELP_ONE_DASH, expectedOutput); + testExpectedUsage(HELP_TWO_DASH, expectedOutput); + testExpectedUsage(SINGLE_H, expectedOutput); + + testIgnoreAdditionalArgs(HELP_ONE_DASH, expectedOutput); + testIgnoreAdditionalArgs(HELP_TWO_DASH, expectedOutput); + testIgnoreAdditionalArgs(SINGLE_H, expectedOutput); + + testIgnoreTrailingSpaces(HELP_ONE_DASH, expectedOutput); + testIgnoreTrailingSpaces(HELP_TWO_DASH, expectedOutput); + testIgnoreTrailingSpaces(SINGLE_H, expectedOutput); + + testSimilarCommand(HELP_ONE_DASH + "less", ILLEGAL); + testSimilarCommand(HELP_TWO_DASH + "me", ILLEGAL); + testSimilarCommand(SINGLE_H + "ello", ILLEGAL); + } + + private static void testExpectedUsage(String helpOption, String expectedOutput) throws Exception { + verifyOutput(new String[] {CMD, helpOption}, expectedOutput, + "Expected jcmd to accept '%s' suboption as a command argument and issue the same help output.".formatted(helpOption)); + } + + private static void testIgnoreAdditionalArgs(String helpOption, String expectedOutput) throws Exception { + verifyOutput(new String[] {CMD, helpOption, "basic"}, expectedOutput, + "Expected jcmd to accept '%s' suboption with additional arguments after help.".formatted(helpOption)); + } + + private static void testIgnoreTrailingSpaces(String helpOption, String expectedOutput) throws Exception { + verifyOutput(new String[] {CMD, "%s ".formatted(helpOption)}, expectedOutput, + "Expected jcmd to accept '%s' suboption with trailing spaces".formatted(helpOption)); + } + + private static void testSimilarCommand(String helpOption, String expectedOutput) throws Exception { + verifyOutputContains(new String[] {CMD, helpOption}, expectedOutput, + "Expected jcmd to NOT accept '%s' suboption with trailing content".formatted(helpOption)); + } + + private static void verifyOutputContains(String[] args, String expectedOutput, String errorMessage) throws Exception { + OutputAnalyzer output = JcmdBase.jcmd(args); + String issuedOutput = output.getOutput(); + if (!issuedOutput.contains(expectedOutput)) { + printDifferingOutputs(expectedOutput, issuedOutput); + throw new Exception(errorMessage); + } + } + + private static void verifyOutput(String[] args, String expectedOutput, String errorMessage) throws Exception { + OutputAnalyzer output = JcmdBase.jcmd(args); + String issuedOutput = output.getOutput(); + if (!expectedOutput.equals(issuedOutput)) { + printDifferingOutputs(expectedOutput, issuedOutput); + throw new Exception(errorMessage); + } + } + + private static void printDifferingOutputs(String expectedOutput, String issuedOutput) { + System.out.println("Expected output: "); + System.out.println(expectedOutput); + System.out.println("Issued output: "); + System.out.println(issuedOutput); + } +} From 4ec1ae109710aa150e27acf5706475d335c4655c Mon Sep 17 00:00:00 2001 From: Thomas Schatzl <tschatzl@openjdk.org> Date: Fri, 5 Jul 2024 07:18:34 +0000 Subject: [PATCH 311/471] 8331385: G1: Prefix HeapRegion helper classes with G1 Reviewed-by: ayang, dholmes --- src/hotspot/share/gc/g1/g1Arguments.cpp | 6 +- src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 94 ++++++------ src/hotspot/share/gc/g1/g1CollectedHeap.hpp | 54 +++---- src/hotspot/share/gc/g1/g1CollectionSet.cpp | 30 ++-- src/hotspot/share/gc/g1/g1CollectionSet.hpp | 26 ++-- .../share/gc/g1/g1CollectionSetCandidates.hpp | 4 +- .../share/gc/g1/g1CollectionSetChooser.cpp | 4 +- .../share/gc/g1/g1CommittedRegionMap.cpp | 22 +-- .../share/gc/g1/g1CommittedRegionMap.hpp | 12 +- src/hotspot/share/gc/g1/g1ConcurrentMark.cpp | 28 ++-- src/hotspot/share/gc/g1/g1ConcurrentMark.hpp | 4 +- .../gc/g1/g1ConcurrentRebuildAndScrub.cpp | 4 +- .../share/gc/g1/g1ConcurrentRefine.cpp | 6 +- .../share/gc/g1/g1EvacFailureRegions.cpp | 4 +- .../share/gc/g1/g1EvacFailureRegions.hpp | 8 +- src/hotspot/share/gc/g1/g1FullCollector.cpp | 2 +- .../share/gc/g1/g1FullGCAdjustTask.cpp | 4 +- .../share/gc/g1/g1FullGCAdjustTask.hpp | 4 +- .../share/gc/g1/g1FullGCCompactTask.hpp | 4 +- .../share/gc/g1/g1FullGCHeapRegionAttr.hpp | 4 +- .../share/gc/g1/g1FullGCPrepareTask.hpp | 8 +- .../share/gc/g1/g1FullGCResetMetadataTask.hpp | 6 +- src/hotspot/share/gc/g1/g1HeapRegion.cpp | 26 ++-- src/hotspot/share/gc/g1/g1HeapRegion.hpp | 40 ++--- .../share/gc/g1/g1HeapRegionBounds.hpp | 4 +- .../share/gc/g1/g1HeapRegionBounds.inline.hpp | 10 +- .../share/gc/g1/g1HeapRegionEventSender.cpp | 4 +- .../share/gc/g1/g1HeapRegionManager.cpp | 138 +++++++++--------- .../share/gc/g1/g1HeapRegionManager.hpp | 42 +++--- .../gc/g1/g1HeapRegionManager.inline.hpp | 16 +- .../share/gc/g1/g1HeapRegionPrinter.hpp | 2 +- .../share/gc/g1/g1HeapRegionRemSet.cpp | 36 ++--- .../share/gc/g1/g1HeapRegionRemSet.hpp | 8 +- .../share/gc/g1/g1HeapRegionRemSet.inline.hpp | 18 +-- src/hotspot/share/gc/g1/g1HeapRegionSet.cpp | 62 ++++---- src/hotspot/share/gc/g1/g1HeapRegionSet.hpp | 54 +++---- .../share/gc/g1/g1HeapRegionSet.inline.hpp | 30 ++-- .../share/gc/g1/g1HeapRegionTracer.cpp | 4 +- .../share/gc/g1/g1HeapRegionTracer.hpp | 4 +- src/hotspot/share/gc/g1/g1HeapRegionType.cpp | 18 +-- src/hotspot/share/gc/g1/g1HeapRegionType.hpp | 16 +- src/hotspot/share/gc/g1/g1HeapTransition.cpp | 4 +- src/hotspot/share/gc/g1/g1HeapVerifier.cpp | 44 +++--- src/hotspot/share/gc/g1/g1NUMA.cpp | 4 +- src/hotspot/share/gc/g1/g1NUMA.hpp | 6 +- .../share/gc/g1/g1OopClosures.inline.hpp | 6 +- src/hotspot/share/gc/g1/g1RemSet.cpp | 24 +-- src/hotspot/share/gc/g1/g1RemSet.hpp | 4 +- src/hotspot/share/gc/g1/g1RemSetSummary.cpp | 14 +- src/hotspot/share/gc/g1/g1YoungCollector.cpp | 6 +- .../g1/g1YoungGCAllocationFailureInjector.cpp | 2 +- .../gc/g1/g1YoungGCPostEvacuateTasks.cpp | 26 ++-- .../share/gc/g1/jvmFlagConstraintsG1.cpp | 6 +- src/hotspot/share/gc/g1/vmStructs_g1.hpp | 38 ++--- src/hotspot/share/prims/whitebox.cpp | 2 +- .../jvm/hotspot/gc/g1/G1CollectedHeap.java | 26 ++-- .../sun/jvm/hotspot/gc/g1/G1HeapRegion.java | 4 +- ...nClosure.java => G1HeapRegionClosure.java} | 4 +- ...nManager.java => G1HeapRegionManager.java} | 8 +- ...nSetBase.java => G1HeapRegionSetBase.java} | 8 +- ...pRegionType.java => G1HeapRegionType.java} | 26 ++-- ...Closure.java => G1PrintRegionClosure.java} | 4 +- .../sun/jvm/hotspot/tools/HeapSummary.java | 4 +- .../gtest/gc/g1/test_freeRegionList.cpp | 4 +- .../gtest/gc/g1/test_g1CardSetContainers.cpp | 4 +- test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp | 6 +- 66 files changed, 576 insertions(+), 578 deletions(-) rename src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/{HeapRegionClosure.java => G1HeapRegionClosure.java} (89%) rename src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/{HeapRegionManager.java => G1HeapRegionManager.java} (92%) rename src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/{HeapRegionSetBase.java => G1HeapRegionSetBase.java} (90%) rename src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/{HeapRegionType.java => G1HeapRegionType.java} (79%) rename src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/{PrintRegionClosure.java => G1PrintRegionClosure.java} (91%) diff --git a/src/hotspot/share/gc/g1/g1Arguments.cpp b/src/hotspot/share/gc/g1/g1Arguments.cpp index a62eb994486f5..3d4ce0d780da9 100644 --- a/src/hotspot/share/gc/g1/g1Arguments.cpp +++ b/src/hotspot/share/gc/g1/g1Arguments.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, Red Hat, Inc. and/or its affiliates. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -125,15 +125,13 @@ void G1Arguments::initialize_mark_stack_size() { MAX2(MarkStackSize, (size_t)ConcGCThreads * TASKQUEUE_SIZE)); FLAG_SET_ERGO(MarkStackSize, mark_stack_size); } - } - void G1Arguments::initialize_card_set_configuration() { assert(G1HeapRegion::LogOfHRGrainBytes != 0, "not initialized"); // Array of Cards card set container globals. const uint LOG_M = 20; - assert(log2i_exact(HeapRegionBounds::min_size()) == LOG_M, "inv"); + assert(log2i_exact(G1HeapRegionBounds::min_size()) == LOG_M, "inv"); assert(G1HeapRegion::LogOfHRGrainBytes >= LOG_M, "from the above"); uint region_size_log_mb = G1HeapRegion::LogOfHRGrainBytes - LOG_M; diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index 258f3f667c5cd..afd7b8948598e 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -129,7 +129,7 @@ size_t G1CollectedHeap::_humongous_object_threshold_in_words = 0; // is done by clients of this interface.) void G1RegionMappingChangedListener::reset_from_card_cache(uint start_idx, size_t num_regions) { - HeapRegionRemSet::invalidate_from_card_cache(start_idx, num_regions); + G1HeapRegionRemSet::invalidate_from_card_cache(start_idx, num_regions); } void G1RegionMappingChangedListener::on_commit(uint start_idx, size_t num_regions, bool zero_filled) { @@ -162,7 +162,7 @@ G1HeapRegion* G1CollectedHeap::new_heap_region(uint hrs_index, // Private methods. G1HeapRegion* G1CollectedHeap::new_region(size_t word_size, - HeapRegionType type, + G1HeapRegionType type, bool do_expand, uint node_index) { assert(!is_humongous(word_size) || word_size <= G1HeapRegion::GrainWords, @@ -710,7 +710,7 @@ HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size, ShouldNotReachHere(); } -class PostCompactionPrinterClosure: public HeapRegionClosure { +class PostCompactionPrinterClosure: public G1HeapRegionClosure { public: bool do_heap_region(G1HeapRegion* hr) { assert(!hr->is_young(), "not expecting to find young regions"); @@ -1070,7 +1070,7 @@ void G1CollectedHeap::shrink(size_t shrink_bytes) { _verifier->verify_region_sets_optional(); } -class OldRegionSetChecker : public HeapRegionSetChecker { +class OldRegionSetChecker : public G1HeapRegionSetChecker { public: void check_mt_safety() { // Master Old Set MT safety protocol: @@ -1098,7 +1098,7 @@ class OldRegionSetChecker : public HeapRegionSetChecker { const char* get_description() { return "Old Regions"; } }; -class HumongousRegionSetChecker : public HeapRegionSetChecker { +class HumongousRegionSetChecker : public G1HeapRegionSetChecker { public: void check_mt_safety() { // Humongous Set MT safety protocol: @@ -1352,9 +1352,9 @@ jint G1CollectedHeap::initialize() { guarantee(G1HeapRegion::CardsPerRegion < max_cards_per_region, "too many cards per region"); - HeapRegionRemSet::initialize(_reserved); + G1HeapRegionRemSet::initialize(_reserved); - FreeRegionList::set_unrealistically_long_length(max_regions() + 1); + G1FreeRegionList::set_unrealistically_long_length(max_regions() + 1); _bot = new G1BlockOffsetTable(reserved(), bot_storage); @@ -1536,7 +1536,7 @@ size_t G1CollectedHeap::used_unlocked() const { return _summary_bytes_used; } -class SumUsedClosure: public HeapRegionClosure { +class SumUsedClosure: public G1HeapRegionClosure { size_t _used; public: SumUsedClosure() : _used(0) {} @@ -1887,7 +1887,7 @@ bool G1CollectedHeap::is_in(const void* p) const { // Iterates an ObjectClosure over all objects within a G1HeapRegion. -class IterateObjectClosureRegionClosure: public HeapRegionClosure { +class IterateObjectClosureRegionClosure: public G1HeapRegionClosure { ObjectClosure* _cl; public: IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {} @@ -1907,7 +1907,7 @@ void G1CollectedHeap::object_iterate(ObjectClosure* cl) { class G1ParallelObjectIterator : public ParallelObjectIteratorImpl { private: G1CollectedHeap* _heap; - HeapRegionClaimer _claimer; + G1HeapRegionClaimer _claimer; public: G1ParallelObjectIterator(uint thread_num) : @@ -1923,7 +1923,7 @@ ParallelObjectIteratorImpl* G1CollectedHeap::parallel_object_iterator(uint threa return new G1ParallelObjectIterator(thread_num); } -void G1CollectedHeap::object_iterate_parallel(ObjectClosure* cl, uint worker_id, HeapRegionClaimer* claimer) { +void G1CollectedHeap::object_iterate_parallel(ObjectClosure* cl, uint worker_id, G1HeapRegionClaimer* claimer) { IterateObjectClosureRegionClosure blk(cl); heap_region_par_iterate_from_worker_offset(&blk, claimer, worker_id); } @@ -1932,43 +1932,43 @@ void G1CollectedHeap::keep_alive(oop obj) { G1BarrierSet::enqueue_preloaded(obj); } -void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const { +void G1CollectedHeap::heap_region_iterate(G1HeapRegionClosure* cl) const { _hrm.iterate(cl); } -void G1CollectedHeap::heap_region_iterate(HeapRegionIndexClosure* cl) const { +void G1CollectedHeap::heap_region_iterate(G1HeapRegionIndexClosure* cl) const { _hrm.iterate(cl); } -void G1CollectedHeap::heap_region_par_iterate_from_worker_offset(HeapRegionClosure* cl, - HeapRegionClaimer *hrclaimer, +void G1CollectedHeap::heap_region_par_iterate_from_worker_offset(G1HeapRegionClosure* cl, + G1HeapRegionClaimer *hrclaimer, uint worker_id) const { _hrm.par_iterate(cl, hrclaimer, hrclaimer->offset_for_worker(worker_id)); } -void G1CollectedHeap::heap_region_par_iterate_from_start(HeapRegionClosure* cl, - HeapRegionClaimer *hrclaimer) const { +void G1CollectedHeap::heap_region_par_iterate_from_start(G1HeapRegionClosure* cl, + G1HeapRegionClaimer *hrclaimer) const { _hrm.par_iterate(cl, hrclaimer, 0); } -void G1CollectedHeap::collection_set_iterate_all(HeapRegionClosure* cl) { +void G1CollectedHeap::collection_set_iterate_all(G1HeapRegionClosure* cl) { _collection_set.iterate(cl); } -void G1CollectedHeap::collection_set_par_iterate_all(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, +void G1CollectedHeap::collection_set_par_iterate_all(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, uint worker_id) { _collection_set.par_iterate(cl, hr_claimer, worker_id); } -void G1CollectedHeap::collection_set_iterate_increment_from(HeapRegionClosure *cl, - HeapRegionClaimer* hr_claimer, +void G1CollectedHeap::collection_set_iterate_increment_from(G1HeapRegionClosure *cl, + G1HeapRegionClaimer* hr_claimer, uint worker_id) { _collection_set.iterate_incremental_part_from(cl, hr_claimer, worker_id); } -void G1CollectedHeap::par_iterate_regions_array(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, +void G1CollectedHeap::par_iterate_regions_array(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, const uint regions[], size_t length, uint worker_id) const { @@ -2046,10 +2046,10 @@ bool G1CollectedHeap::supports_concurrent_gc_breakpoints() const { return true; } -class PrintRegionClosure: public HeapRegionClosure { +class G1PrintRegionClosure: public G1HeapRegionClosure { outputStream* _st; public: - PrintRegionClosure(outputStream* st) : _st(st) {} + G1PrintRegionClosure(outputStream* st) : _st(st) {} bool do_heap_region(G1HeapRegion* r) { r->print_on(_st); return false; @@ -2121,7 +2121,7 @@ void G1CollectedHeap::print_regions_on(outputStream* st) const { "CS=collection set, F=free, " "TAMS=top-at-mark-start, " "PB=parsable bottom"); - PrintRegionClosure blk(st); + G1PrintRegionClosure blk(st); heap_region_iterate(&blk); } @@ -2281,14 +2281,14 @@ void G1CollectedHeap::start_concurrent_cycle(bool concurrent_operation_is_full_m bool G1CollectedHeap::is_potential_eager_reclaim_candidate(G1HeapRegion* r) const { // We don't nominate objects with many remembered set entries, on // the assumption that such objects are likely still live. - HeapRegionRemSet* rem_set = r->rem_set(); + G1HeapRegionRemSet* rem_set = r->rem_set(); return rem_set->occupancy_less_or_equal_than(G1EagerReclaimRemSetThreshold); } #ifndef PRODUCT void G1CollectedHeap::verify_region_attr_remset_is_tracked() { - class VerifyRegionAttrRemSet : public HeapRegionClosure { + class VerifyRegionAttrRemSet : public G1HeapRegionClosure { public: virtual bool do_heap_region(G1HeapRegion* r) { G1CollectedHeap* g1h = G1CollectedHeap::heap(); @@ -2538,9 +2538,9 @@ void G1CollectedHeap::unload_classes_and_code(const char* description, BoolObjec } class G1BulkUnregisterNMethodTask : public WorkerTask { - HeapRegionClaimer _hrclaimer; + G1HeapRegionClaimer _hrclaimer; - class UnregisterNMethodsHeapRegionClosure : public HeapRegionClosure { + class UnregisterNMethodsHeapRegionClosure : public G1HeapRegionClosure { public: bool do_heap_region(G1HeapRegion* hr) { @@ -2614,7 +2614,7 @@ void G1CollectedHeap::clear_bitmap_for_region(G1HeapRegion* hr) { concurrent_mark()->clear_bitmap_for_region(hr); } -void G1CollectedHeap::free_region(G1HeapRegion* hr, FreeRegionList* free_list) { +void G1CollectedHeap::free_region(G1HeapRegion* hr, G1FreeRegionList* free_list) { assert(!hr->is_free(), "the region should not be free"); assert(!hr->is_empty(), "the region should not be empty"); assert(_hrm.is_available(hr->hrm_index()), "region should be committed"); @@ -2636,7 +2636,7 @@ void G1CollectedHeap::retain_region(G1HeapRegion* hr) { } void G1CollectedHeap::free_humongous_region(G1HeapRegion* hr, - FreeRegionList* free_list) { + G1FreeRegionList* free_list) { assert(hr->is_humongous(), "this is only for humongous regions"); hr->clear_humongous(); free_region(hr, free_list); @@ -2652,7 +2652,7 @@ void G1CollectedHeap::remove_from_old_gen_sets(const uint old_regions_removed, } -void G1CollectedHeap::prepend_to_freelist(FreeRegionList* list) { +void G1CollectedHeap::prepend_to_freelist(G1FreeRegionList* list) { assert(list != nullptr, "list can't be null"); if (!list->is_empty()) { MutexLocker x(FreeList_lock, Mutex::_no_safepoint_check_flag); @@ -2678,7 +2678,7 @@ void G1CollectedHeap::rebuild_free_region_list() { phase_times()->record_total_rebuild_freelist_time_ms((Ticks::now() - start).seconds() * 1000.0); } -class G1AbandonCollectionSetClosure : public HeapRegionClosure { +class G1AbandonCollectionSetClosure : public G1HeapRegionClosure { public: virtual bool do_heap_region(G1HeapRegion* r) { assert(r->in_collection_set(), "Region %u must have been in collection set", r->hrm_index()); @@ -2707,7 +2707,7 @@ void G1CollectedHeap::set_region_short_lived_locked(G1HeapRegion* hr) { #ifdef ASSERT -class NoYoungRegionsClosure: public HeapRegionClosure { +class NoYoungRegionsClosure: public G1HeapRegionClosure { private: bool _success; public: @@ -2768,22 +2768,22 @@ void G1CollectedHeap::set_used(size_t bytes) { _summary_bytes_used = bytes; } -class RebuildRegionSetsClosure : public HeapRegionClosure { +class RebuildRegionSetsClosure : public G1HeapRegionClosure { private: bool _free_list_only; - HeapRegionSet* _old_set; - HeapRegionSet* _humongous_set; + G1HeapRegionSet* _old_set; + G1HeapRegionSet* _humongous_set; - HeapRegionManager* _hrm; + G1HeapRegionManager* _hrm; size_t _total_used; public: RebuildRegionSetsClosure(bool free_list_only, - HeapRegionSet* old_set, - HeapRegionSet* humongous_set, - HeapRegionManager* hrm) : + G1HeapRegionSet* old_set, + G1HeapRegionSet* humongous_set, + G1HeapRegionManager* hrm) : _free_list_only(free_list_only), _old_set(old_set), _humongous_set(humongous_set), _hrm(hrm), _total_used(0) { assert(_hrm->num_free_regions() == 0, "pre-condition"); @@ -2849,7 +2849,7 @@ G1HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size, bool should_allocate = policy()->should_allocate_mutator_region(); if (should_allocate) { G1HeapRegion* new_alloc_region = new_region(word_size, - HeapRegionType::Eden, + G1HeapRegionType::Eden, false /* do_expand */, node_index); if (new_alloc_region != nullptr) { @@ -2895,11 +2895,11 @@ G1HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size, G1HeapRegio return nullptr; } - HeapRegionType type; + G1HeapRegionType type; if (dest.is_young()) { - type = HeapRegionType::Survivor; + type = G1HeapRegionType::Survivor; } else { - type = HeapRegionType::Old; + type = G1HeapRegionType::Old; } G1HeapRegion* new_alloc_region = new_region(word_size, diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp index 1cf89879fd735..ec3cf8eafe3a0 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp @@ -162,7 +162,7 @@ class G1CollectedHeap : public CollectedHeap { // Other related classes. friend class G1HeapPrinterMark; - friend class HeapRegionClaimer; + friend class G1HeapRegionClaimer; // Testing classes. friend class G1CheckRegionAttrTableClosure; @@ -180,8 +180,8 @@ class G1CollectedHeap : public CollectedHeap { static size_t _humongous_object_threshold_in_words; // These sets keep track of old and humongous regions respectively. - HeapRegionSet _old_set; - HeapRegionSet _humongous_set; + G1HeapRegionSet _old_set; + G1HeapRegionSet _humongous_set; // Young gen memory statistics before GC. G1MonotonicArenaMemoryStats _young_gen_card_set_stats; @@ -212,7 +212,7 @@ class G1CollectedHeap : public CollectedHeap { G1NUMA* _numa; // The sequence of all heap regions in the heap. - HeapRegionManager _hrm; + G1HeapRegionManager _hrm; // Manages all allocations with regions except humongous object allocations. G1Allocator* _allocator; @@ -386,9 +386,9 @@ class G1CollectedHeap : public CollectedHeap { // an allocation of the given word_size. If do_expand is true, // attempt to expand the heap if necessary to satisfy the allocation // request. 'type' takes the type of region to be allocated. (Use constants - // Old, Eden, Humongous, Survivor defined in HeapRegionType.) + // Old, Eden, Humongous, Survivor defined in G1HeapRegionType.) G1HeapRegion* new_region(size_t word_size, - HeapRegionType type, + G1HeapRegionType type, bool do_expand, uint node_index = G1NUMA::AnyNodeIndex); @@ -679,7 +679,7 @@ class G1CollectedHeap : public CollectedHeap { // in another way). // Callers must ensure they are the only one calling free on the given region // at the same time. - void free_region(G1HeapRegion* hr, FreeRegionList* free_list); + void free_region(G1HeapRegion* hr, G1FreeRegionList* free_list); // Add the given region to the retained regions collection set candidates. void retain_region(G1HeapRegion* hr); @@ -697,7 +697,7 @@ class G1CollectedHeap : public CollectedHeap { // The method assumes that only a single thread is ever calling // this for a particular region at once. void free_humongous_region(G1HeapRegion* hr, - FreeRegionList* free_list); + G1FreeRegionList* free_list); // Execute func(G1HeapRegion* r, bool is_last) on every region covered by the // given range. @@ -1022,7 +1022,7 @@ class G1CollectedHeap : public CollectedHeap { void remove_from_old_gen_sets(const uint old_regions_removed, const uint humongous_regions_removed); - void prepend_to_freelist(FreeRegionList* list); + void prepend_to_freelist(G1FreeRegionList* list); void decrement_summary_bytes(size_t bytes); bool is_in(const void* p) const override; @@ -1060,7 +1060,7 @@ class G1CollectedHeap : public CollectedHeap { // Iteration functions. - void object_iterate_parallel(ObjectClosure* cl, uint worker_id, HeapRegionClaimer* claimer); + void object_iterate_parallel(ObjectClosure* cl, uint worker_id, G1HeapRegionClaimer* claimer); // Iterate over all objects, calling "cl.do_object" on each. void object_iterate(ObjectClosure* cl) override; @@ -1072,8 +1072,8 @@ class G1CollectedHeap : public CollectedHeap { // Iterate over heap regions, in address order, terminating the // iteration early if the "do_heap_region" method returns "true". - void heap_region_iterate(HeapRegionClosure* blk) const; - void heap_region_iterate(HeapRegionIndexClosure* blk) const; + void heap_region_iterate(G1HeapRegionClosure* blk) const; + void heap_region_iterate(G1HeapRegionIndexClosure* blk) const; // Return the region with the given index. It assumes the index is valid. inline G1HeapRegion* region_at(uint index) const; @@ -1091,41 +1091,41 @@ class G1CollectedHeap : public CollectedHeap { inline HeapWord* bottom_addr_for_region(uint index) const; // Two functions to iterate over the heap regions in parallel. Threads - // compete using the HeapRegionClaimer to claim the regions before + // compete using the G1HeapRegionClaimer to claim the regions before // applying the closure on them. - // The _from_worker_offset version uses the HeapRegionClaimer and + // The _from_worker_offset version uses the G1HeapRegionClaimer and // the worker id to calculate a start offset to prevent all workers to // start from the point. - void heap_region_par_iterate_from_worker_offset(HeapRegionClosure* cl, - HeapRegionClaimer* hrclaimer, + void heap_region_par_iterate_from_worker_offset(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hrclaimer, uint worker_id) const; - void heap_region_par_iterate_from_start(HeapRegionClosure* cl, - HeapRegionClaimer* hrclaimer) const; + void heap_region_par_iterate_from_start(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hrclaimer) const; // Iterate over all regions in the collection set in parallel. - void collection_set_par_iterate_all(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, + void collection_set_par_iterate_all(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, uint worker_id); // Iterate over all regions currently in the current collection set. - void collection_set_iterate_all(HeapRegionClosure* blk); + void collection_set_iterate_all(G1HeapRegionClosure* blk); // Iterate over the regions in the current increment of the collection set. // Starts the iteration so that the start regions of a given worker id over the // set active_workers are evenly spread across the set of collection set regions // to be iterated. - // The variant with the HeapRegionClaimer guarantees that the closure will be + // The variant with the G1HeapRegionClaimer guarantees that the closure will be // applied to a particular region exactly once. - void collection_set_iterate_increment_from(HeapRegionClosure *blk, uint worker_id) { + void collection_set_iterate_increment_from(G1HeapRegionClosure *blk, uint worker_id) { collection_set_iterate_increment_from(blk, nullptr, worker_id); } - void collection_set_iterate_increment_from(HeapRegionClosure *blk, HeapRegionClaimer* hr_claimer, uint worker_id); + void collection_set_iterate_increment_from(G1HeapRegionClosure *blk, G1HeapRegionClaimer* hr_claimer, uint worker_id); // Iterate over the array of region indexes, uint regions[length], applying - // the given HeapRegionClosure on each region. The worker_id will determine where + // the given G1HeapRegionClosure on each region. The worker_id will determine where // to start the iteration to allow for more efficient parallel iteration. - void par_iterate_regions_array(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, + void par_iterate_regions_array(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, const uint regions[], size_t length, uint worker_id) const; diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.cpp b/src/hotspot/share/gc/g1/g1CollectionSet.cpp index 5da8f26b3310b..fe4dfafee97bf 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSet.cpp +++ b/src/hotspot/share/gc/g1/g1CollectionSet.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -129,7 +129,7 @@ void G1CollectionSet::clear() { _collection_set_cur_length = 0; } -void G1CollectionSet::iterate(HeapRegionClosure* cl) const { +void G1CollectionSet::iterate(G1HeapRegionClosure* cl) const { size_t len = _collection_set_cur_length; OrderAccess::loadload(); @@ -143,13 +143,13 @@ void G1CollectionSet::iterate(HeapRegionClosure* cl) const { } } -void G1CollectionSet::par_iterate(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, +void G1CollectionSet::par_iterate(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, uint worker_id) const { iterate_part_from(cl, hr_claimer, 0, cur_length(), worker_id); } -void G1CollectionSet::iterate_optional(HeapRegionClosure* cl) const { +void G1CollectionSet::iterate_optional(G1HeapRegionClosure* cl) const { assert_at_safepoint(); for (G1HeapRegion* r : _optional_old_regions) { @@ -158,14 +158,14 @@ void G1CollectionSet::iterate_optional(HeapRegionClosure* cl) const { } } -void G1CollectionSet::iterate_incremental_part_from(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, +void G1CollectionSet::iterate_incremental_part_from(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, uint worker_id) const { iterate_part_from(cl, hr_claimer, _inc_part_start, increment_length(), worker_id); } -void G1CollectionSet::iterate_part_from(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, +void G1CollectionSet::iterate_part_from(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, size_t offset, size_t length, uint worker_id) const { @@ -207,11 +207,11 @@ void G1CollectionSet::add_eden_region(G1HeapRegion* hr) { } #ifndef PRODUCT -class G1VerifyYoungAgesClosure : public HeapRegionClosure { +class G1VerifyYoungAgesClosure : public G1HeapRegionClosure { public: bool _valid; - G1VerifyYoungAgesClosure() : HeapRegionClosure(), _valid(true) { } + G1VerifyYoungAgesClosure() : G1HeapRegionClosure(), _valid(true) { } virtual bool do_heap_region(G1HeapRegion* r) { guarantee(r->is_young(), "Region must be young but is %s", r->get_type_str()); @@ -246,10 +246,10 @@ bool G1CollectionSet::verify_young_ages() { return cl.valid(); } -class G1PrintCollectionSetDetailClosure : public HeapRegionClosure { +class G1PrintCollectionSetDetailClosure : public G1HeapRegionClosure { outputStream* _st; public: - G1PrintCollectionSetDetailClosure(outputStream* st) : HeapRegionClosure(), _st(st) { } + G1PrintCollectionSetDetailClosure(outputStream* st) : G1HeapRegionClosure(), _st(st) { } virtual bool do_heap_region(G1HeapRegion* r) { assert(r->in_collection_set(), "Region %u should be in collection set", r->hrm_index()); @@ -471,12 +471,12 @@ void G1CollectionSet::abandon_optional_collection_set(G1ParScanThreadStateSet* p } #ifdef ASSERT -class G1VerifyYoungCSetIndicesClosure : public HeapRegionClosure { +class G1VerifyYoungCSetIndicesClosure : public G1HeapRegionClosure { private: size_t _young_length; uint* _heap_region_indices; public: - G1VerifyYoungCSetIndicesClosure(size_t young_length) : HeapRegionClosure(), _young_length(young_length) { + G1VerifyYoungCSetIndicesClosure(size_t young_length) : G1HeapRegionClosure(), _young_length(young_length) { _heap_region_indices = NEW_C_HEAP_ARRAY(uint, young_length + 1, mtGC); for (size_t i = 0; i < young_length + 1; i++) { _heap_region_indices[i] = UINT_MAX; diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.hpp b/src/hotspot/share/gc/g1/g1CollectionSet.hpp index e78a426e40302..e569d3ee966c3 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSet.hpp +++ b/src/hotspot/share/gc/g1/g1CollectionSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,8 +36,8 @@ class G1ParScanThreadStateSet; class G1Policy; class G1SurvivorRegions; class G1HeapRegion; -class HeapRegionClaimer; -class HeapRegionClosure; +class G1HeapRegionClaimer; +class G1HeapRegionClosure; // The collection set. // @@ -197,10 +197,10 @@ class G1CollectionSet { void finalize_old_part(double time_remaining_ms); // Iterate the part of the collection set given by the offset and length applying the given - // HeapRegionClosure. The worker_id will determine where in the part to start the iteration + // G1HeapRegionClosure. The worker_id will determine where in the part to start the iteration // to allow for more efficient parallel iteration. - void iterate_part_from(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, + void iterate_part_from(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, size_t offset, size_t length, uint worker_id) const; @@ -243,9 +243,9 @@ class G1CollectionSet { // Stop adding regions to the current collection set increment. void stop_incremental_building() { _inc_build_state = Inactive; } - // Iterate over the current collection set increment applying the given HeapRegionClosure + // Iterate over the current collection set increment applying the given G1HeapRegionClosure // from a starting position determined by the given worker id. - void iterate_incremental_part_from(HeapRegionClosure* cl, HeapRegionClaimer* hr_claimer, uint worker_id) const; + void iterate_incremental_part_from(G1HeapRegionClosure* cl, G1HeapRegionClaimer* hr_claimer, uint worker_id) const; // Returns the length of the current increment in number of regions. size_t increment_length() const { return _collection_set_cur_length - _inc_part_start; } @@ -253,13 +253,13 @@ class G1CollectionSet { size_t cur_length() const { return _collection_set_cur_length; } // Iterate over the entire collection set (all increments calculated so far), applying - // the given HeapRegionClosure on all of them. - void iterate(HeapRegionClosure* cl) const; - void par_iterate(HeapRegionClosure* cl, - HeapRegionClaimer* hr_claimer, + // the given G1HeapRegionClosure on all of them. + void iterate(G1HeapRegionClosure* cl) const; + void par_iterate(G1HeapRegionClosure* cl, + G1HeapRegionClaimer* hr_claimer, uint worker_id) const; - void iterate_optional(HeapRegionClosure* cl) const; + void iterate_optional(G1HeapRegionClosure* cl) const; // Finalize the initial collection set consisting of all young regions potentially a // few old gen regions. diff --git a/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp b/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp index 7d24f02246183..e629aa8f36324 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp +++ b/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp @@ -36,7 +36,7 @@ class G1CollectionCandidateList; class G1CollectionSetCandidates; class G1HeapRegion; -class HeapRegionClosure; +class G1HeapRegionClosure; using G1CollectionCandidateRegionListIterator = GrowableArrayIterator<G1HeapRegion*>; @@ -110,7 +110,7 @@ class G1CollectionCandidateList : public CHeapObj<mtGC> { // Restore sorting order by decreasing gc efficiency, using the existing efficiency // values. void sort_by_efficiency(); - // Removes any HeapRegions stored in this list also in the other list. The other + // Removes any heap regions stored in this list also in the other list. The other // list may only contain regions in this list, sorted by gc efficiency. It need // not be a prefix of this list. Returns the number of regions removed. // E.g. if this list is "A B G H", the other list may be "A G H", but not "F" (not in diff --git a/src/hotspot/share/gc/g1/g1CollectionSetChooser.cpp b/src/hotspot/share/gc/g1/g1CollectionSetChooser.cpp index a45e7de67bf37..630fb8a7a1122 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSetChooser.cpp +++ b/src/hotspot/share/gc/g1/g1CollectionSetChooser.cpp @@ -116,7 +116,7 @@ class G1BuildCandidateRegionsTask : public WorkerTask { // Per-region closure. In addition to determining whether a region should be // added to the candidates, and calculating those regions' gc efficiencies, also // gather additional statistics. - class G1BuildCandidateRegionsClosure : public HeapRegionClosure { + class G1BuildCandidateRegionsClosure : public G1HeapRegionClosure { G1BuildCandidateArray* _array; uint _cur_chunk_idx; @@ -177,7 +177,7 @@ class G1BuildCandidateRegionsTask : public WorkerTask { }; G1CollectedHeap* _g1h; - HeapRegionClaimer _hrclaimer; + G1HeapRegionClaimer _hrclaimer; uint volatile _num_regions_added; diff --git a/src/hotspot/share/gc/g1/g1CommittedRegionMap.cpp b/src/hotspot/share/gc/g1/g1CommittedRegionMap.cpp index 80cbcf1c7dc20..6919cc7d0c911 100644 --- a/src/hotspot/share/gc/g1/g1CommittedRegionMap.cpp +++ b/src/hotspot/share/gc/g1/g1CommittedRegionMap.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,7 @@ #include "runtime/safepoint.hpp" #include "utilities/debug.hpp" -HeapRegionRange::HeapRegionRange(uint start, uint end) : +G1HeapRegionRange::G1HeapRegionRange(uint start, uint end) : _start(start), _end(end) { assert(start <= end, "Invariant"); @@ -97,21 +97,21 @@ void G1CommittedRegionMap::uncommit(uint start, uint end) { inactive_clear_range(start, end); } -HeapRegionRange G1CommittedRegionMap::next_active_range(uint offset) const { +G1HeapRegionRange G1CommittedRegionMap::next_active_range(uint offset) const { // Find first active index from offset. uint start = (uint) _active.find_first_set_bit(offset); if (start == max_length()) { // Early out when no active regions are found. - return HeapRegionRange(max_length(), max_length()); + return G1HeapRegionRange(max_length(), max_length()); } uint end = (uint) _active.find_first_clear_bit(start); verify_active_range(start, end); - return HeapRegionRange(start, end); + return G1HeapRegionRange(start, end); } -HeapRegionRange G1CommittedRegionMap::next_committable_range(uint offset) const { +G1HeapRegionRange G1CommittedRegionMap::next_committable_range(uint offset) const { // We should only call this function when there are no inactive regions. verify_no_inactive_regons(); @@ -119,28 +119,28 @@ HeapRegionRange G1CommittedRegionMap::next_committable_range(uint offset) const uint start = (uint) _active.find_first_clear_bit(offset); if (start == max_length()) { // Early out when no free regions are found. - return HeapRegionRange(max_length(), max_length()); + return G1HeapRegionRange(max_length(), max_length()); } uint end = (uint) _active.find_first_set_bit(start); verify_free_range(start, end); - return HeapRegionRange(start, end); + return G1HeapRegionRange(start, end); } -HeapRegionRange G1CommittedRegionMap::next_inactive_range(uint offset) const { +G1HeapRegionRange G1CommittedRegionMap::next_inactive_range(uint offset) const { // Find first inactive region from offset. uint start = (uint) _inactive.find_first_set_bit(offset); if (start == max_length()) { // Early when no inactive regions are found. - return HeapRegionRange(max_length(), max_length()); + return G1HeapRegionRange(max_length(), max_length()); } uint end = (uint) _inactive.find_first_clear_bit(start); verify_inactive_range(start, end); - return HeapRegionRange(start, end); + return G1HeapRegionRange(start, end); } void G1CommittedRegionMap::active_set_range(uint start, uint end) { diff --git a/src/hotspot/share/gc/g1/g1CommittedRegionMap.hpp b/src/hotspot/share/gc/g1/g1CommittedRegionMap.hpp index 38db9bf8f34da..595a6f7f9c9ab 100644 --- a/src/hotspot/share/gc/g1/g1CommittedRegionMap.hpp +++ b/src/hotspot/share/gc/g1/g1CommittedRegionMap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,13 +30,13 @@ #include "utilities/macros.hpp" // Helper class to define a range [start, end) of regions. -class HeapRegionRange : public StackObj { +class G1HeapRegionRange : public StackObj { // Inclusive start of the range. uint _start; // Exclusive end of the range. uint _end; public: - HeapRegionRange(uint start, uint end); + G1HeapRegionRange(uint start, uint end); uint start() const { return _start; } uint end() const { return _end; } @@ -101,13 +101,13 @@ class G1CommittedRegionMap : public CHeapObj<mtGC> { void uncommit(uint start, uint end); // Finds the next range of active regions starting at offset. - HeapRegionRange next_active_range(uint offset) const; + G1HeapRegionRange next_active_range(uint offset) const; // Finds the next range of inactive regions starting at offset. - HeapRegionRange next_inactive_range(uint offset) const; + G1HeapRegionRange next_inactive_range(uint offset) const; // Finds the next range of committable regions starting at offset. // This function must only be called when no inactive regions are // present and can be used to activate more regions. - HeapRegionRange next_committable_range(uint offset) const; + G1HeapRegionRange next_committable_range(uint offset) const; protected: virtual void guarantee_mt_safety_active() const; diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp index 827c538a2e59c..3d56973299ee8 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp @@ -675,7 +675,7 @@ class G1ClearBitMapTask : public WorkerTask { private: // Heap region closure used for clearing the _mark_bitmap. - class G1ClearBitmapHRClosure : public HeapRegionClosure { + class G1ClearBitmapHRClosure : public G1HeapRegionClosure { private: G1ConcurrentMark* _cm; G1CMBitMap* _bitmap; @@ -715,7 +715,7 @@ class G1ClearBitMapTask : public WorkerTask { public: G1ClearBitmapHRClosure(G1ConcurrentMark* cm, bool suspendible) : - HeapRegionClosure(), + G1HeapRegionClosure(), _cm(cm), _bitmap(cm->mark_bitmap()), _suspendible(suspendible) @@ -759,7 +759,7 @@ class G1ClearBitMapTask : public WorkerTask { }; G1ClearBitmapHRClosure _cl; - HeapRegionClaimer _hr_claimer; + G1HeapRegionClaimer _hr_claimer; bool _suspendible; // If the task is suspendible, workers must join the STS. public: @@ -843,7 +843,7 @@ class G1PreConcurrentStartTask::ResetMarkingStateTask : public G1AbstractSubTask }; class G1PreConcurrentStartTask::NoteStartOfMarkTask : public G1AbstractSubTask { - HeapRegionClaimer _claimer; + G1HeapRegionClaimer _claimer; public: NoteStartOfMarkTask() : G1AbstractSubTask(G1GCPhaseTimes::NoteStartOfMark), _claimer(0) { } @@ -863,11 +863,11 @@ void G1PreConcurrentStartTask::ResetMarkingStateTask::do_work(uint worker_id) { _cm->reset(); } -class NoteStartOfMarkHRClosure : public HeapRegionClosure { +class NoteStartOfMarkHRClosure : public G1HeapRegionClosure { G1ConcurrentMark* _cm; public: - NoteStartOfMarkHRClosure() : HeapRegionClosure(), _cm(G1CollectedHeap::heap()->concurrent_mark()) { } + NoteStartOfMarkHRClosure() : G1HeapRegionClosure(), _cm(G1CollectedHeap::heap()->concurrent_mark()) { } bool do_heap_region(G1HeapRegion* r) override { if (r->is_old_or_humongous() && !r->is_collection_set_candidate() && !r->in_collection_set()) { @@ -1204,14 +1204,14 @@ void G1ConcurrentMark::verify_during_pause(G1HeapVerifier::G1VerifyType type, class G1UpdateRegionLivenessAndSelectForRebuildTask : public WorkerTask { G1CollectedHeap* _g1h; G1ConcurrentMark* _cm; - HeapRegionClaimer _hrclaimer; + G1HeapRegionClaimer _hrclaimer; uint volatile _total_selected_for_rebuild; // Reclaimed empty regions - FreeRegionList _cleanup_list; + G1FreeRegionList _cleanup_list; - struct G1OnRegionClosure : public HeapRegionClosure { + struct G1OnRegionClosure : public G1HeapRegionClosure { G1CollectedHeap* _g1h; G1ConcurrentMark* _cm; // The number of regions actually selected for rebuild. @@ -1220,11 +1220,11 @@ class G1UpdateRegionLivenessAndSelectForRebuildTask : public WorkerTask { size_t _freed_bytes; uint _num_old_regions_removed; uint _num_humongous_regions_removed; - FreeRegionList* _local_cleanup_list; + G1FreeRegionList* _local_cleanup_list; G1OnRegionClosure(G1CollectedHeap* g1h, G1ConcurrentMark* cm, - FreeRegionList* local_cleanup_list) : + G1FreeRegionList* local_cleanup_list) : _g1h(g1h), _cm(cm), _num_selected_for_rebuild(0), @@ -1325,7 +1325,7 @@ class G1UpdateRegionLivenessAndSelectForRebuildTask : public WorkerTask { } void work(uint worker_id) override { - FreeRegionList local_cleanup_list("Local Cleanup List"); + G1FreeRegionList local_cleanup_list("Local Cleanup List"); G1OnRegionClosure on_region_cl(_g1h, _cm, &local_cleanup_list); _g1h->heap_region_par_iterate_from_worker_offset(&on_region_cl, &_hrclaimer, worker_id); @@ -1352,7 +1352,7 @@ class G1UpdateRegionLivenessAndSelectForRebuildTask : public WorkerTask { } }; -class G1UpdateRegionsAfterRebuild : public HeapRegionClosure { +class G1UpdateRegionsAfterRebuild : public G1HeapRegionClosure { G1CollectedHeap* _g1h; public: @@ -3078,7 +3078,7 @@ G1PrintRegionLivenessInfoClosure::~G1PrintRegionLivenessInfoClosure() { G1CollectedHeap* g1h = G1CollectedHeap::heap(); _total_remset_bytes += g1h->card_set_freelist_pool()->mem_size(); // add static memory usages to remembered set sizes - _total_remset_bytes += HeapRegionRemSet::static_mem_size(); + _total_remset_bytes += G1HeapRegionRemSet::static_mem_size(); // Print the footer of the output. log_trace(gc, liveness)(G1PPRL_LINE_PREFIX); log_trace(gc, liveness)(G1PPRL_LINE_PREFIX diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp index f2206664b257a..918384372bbb8 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -949,7 +949,7 @@ class G1CMTask : public TerminatorTerminator { // Class that's used to to print out per-region liveness // information. It's currently used at the end of marking and also // after we sort the old regions at the end of the cleanup operation. -class G1PrintRegionLivenessInfoClosure : public HeapRegionClosure { +class G1PrintRegionLivenessInfoClosure : public G1HeapRegionClosure { // Accumulators for these values. size_t _total_used_bytes; size_t _total_capacity_bytes; diff --git a/src/hotspot/share/gc/g1/g1ConcurrentRebuildAndScrub.cpp b/src/hotspot/share/gc/g1/g1ConcurrentRebuildAndScrub.cpp index cacb28f84b1e2..1b6b1eed7b13b 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentRebuildAndScrub.cpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentRebuildAndScrub.cpp @@ -63,11 +63,11 @@ // a pause. class G1RebuildRSAndScrubTask : public WorkerTask { G1ConcurrentMark* _cm; - HeapRegionClaimer _hr_claimer; + G1HeapRegionClaimer _hr_claimer; const bool _should_rebuild_remset; - class G1RebuildRSAndScrubRegionClosure : public HeapRegionClosure { + class G1RebuildRSAndScrubRegionClosure : public G1HeapRegionClosure { G1ConcurrentMark* _cm; const G1CMBitMap* _bitmap; diff --git a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp index 2fabeec980547..b51d0cdf84aee 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -253,7 +253,7 @@ uint64_t G1ConcurrentRefine::adjust_threads_wait_ms() const { } } -class G1ConcurrentRefine::RemSetSamplingClosure : public HeapRegionClosure { +class G1ConcurrentRefine::RemSetSamplingClosure : public G1HeapRegionClosure { G1CollectionSet* _cset; size_t _sampled_card_rs_length; size_t _sampled_code_root_rs_length; @@ -263,7 +263,7 @@ class G1ConcurrentRefine::RemSetSamplingClosure : public HeapRegionClosure { _cset(cset), _sampled_card_rs_length(0), _sampled_code_root_rs_length(0) {} bool do_heap_region(G1HeapRegion* r) override { - HeapRegionRemSet* rem_set = r->rem_set(); + G1HeapRegionRemSet* rem_set = r->rem_set(); _sampled_card_rs_length += rem_set->occupied(); _sampled_code_root_rs_length += rem_set->code_roots_list_length(); return false; diff --git a/src/hotspot/share/gc/g1/g1EvacFailureRegions.cpp b/src/hotspot/share/gc/g1/g1EvacFailureRegions.cpp index 845868c3e2415..afc1602639a30 100644 --- a/src/hotspot/share/gc/g1/g1EvacFailureRegions.cpp +++ b/src/hotspot/share/gc/g1/g1EvacFailureRegions.cpp @@ -64,8 +64,8 @@ bool G1EvacFailureRegions::contains(uint region_idx) const { return _regions_evac_failed.par_at(region_idx, memory_order_relaxed); } -void G1EvacFailureRegions::par_iterate(HeapRegionClosure* closure, - HeapRegionClaimer* hrclaimer, +void G1EvacFailureRegions::par_iterate(G1HeapRegionClosure* closure, + G1HeapRegionClaimer* hrclaimer, uint worker_id) const { G1CollectedHeap::heap()->par_iterate_regions_array(closure, hrclaimer, diff --git a/src/hotspot/share/gc/g1/g1EvacFailureRegions.hpp b/src/hotspot/share/gc/g1/g1EvacFailureRegions.hpp index b8f9ea8003884..9d29957b782c5 100644 --- a/src/hotspot/share/gc/g1/g1EvacFailureRegions.hpp +++ b/src/hotspot/share/gc/g1/g1EvacFailureRegions.hpp @@ -28,8 +28,8 @@ #include "utilities/bitMap.hpp" class G1AbstractSubTask; -class HeapRegionClosure; -class HeapRegionClaimer; +class G1HeapRegionClaimer; +class G1HeapRegionClosure; // This class records for every region on the heap whether it had experienced an // evacuation failure. @@ -70,8 +70,8 @@ class G1EvacFailureRegions { void post_collection(); bool contains(uint region_idx) const; - void par_iterate(HeapRegionClosure* closure, - HeapRegionClaimer* hrclaimer, + void par_iterate(G1HeapRegionClosure* closure, + G1HeapRegionClaimer* hrclaimer, uint worker_id) const; // Return a G1AbstractSubTask which does necessary preparation for evacuation failed regions diff --git a/src/hotspot/share/gc/g1/g1FullCollector.cpp b/src/hotspot/share/gc/g1/g1FullCollector.cpp index 0fba8c1017f02..219480227d3fd 100644 --- a/src/hotspot/share/gc/g1/g1FullCollector.cpp +++ b/src/hotspot/share/gc/g1/g1FullCollector.cpp @@ -164,7 +164,7 @@ G1FullCollector::~G1FullCollector() { FREE_C_HEAP_ARRAY(G1RegionMarkStats, _live_stats); } -class PrepareRegionsClosure : public HeapRegionClosure { +class PrepareRegionsClosure : public G1HeapRegionClosure { G1FullCollector* _collector; public: diff --git a/src/hotspot/share/gc/g1/g1FullGCAdjustTask.cpp b/src/hotspot/share/gc/g1/g1FullGCAdjustTask.cpp index 75da25199eb7f..0d4adbe632e39 100644 --- a/src/hotspot/share/gc/g1/g1FullGCAdjustTask.cpp +++ b/src/hotspot/share/gc/g1/g1FullGCAdjustTask.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ class G1AdjustLiveClosure : public StackObj { } }; -class G1AdjustRegionClosure : public HeapRegionClosure { +class G1AdjustRegionClosure : public G1HeapRegionClosure { G1FullCollector* _collector; G1CMBitMap* _bitmap; uint _worker_id; diff --git a/src/hotspot/share/gc/g1/g1FullGCAdjustTask.hpp b/src/hotspot/share/gc/g1/g1FullGCAdjustTask.hpp index 26ac183d10d75..af232188e4660 100644 --- a/src/hotspot/share/gc/g1/g1FullGCAdjustTask.hpp +++ b/src/hotspot/share/gc/g1/g1FullGCAdjustTask.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ class G1CollectedHeap; class G1FullGCAdjustTask : public G1FullGCTask { G1RootProcessor _root_processor; WeakProcessor::Task _weak_proc_task; - HeapRegionClaimer _hrclaimer; + G1HeapRegionClaimer _hrclaimer; G1AdjustClosure _adjust; public: diff --git a/src/hotspot/share/gc/g1/g1FullGCCompactTask.hpp b/src/hotspot/share/gc/g1/g1FullGCCompactTask.hpp index 341542f6d6f70..5c3929f1eed7d 100644 --- a/src/hotspot/share/gc/g1/g1FullGCCompactTask.hpp +++ b/src/hotspot/share/gc/g1/g1FullGCCompactTask.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ class G1FullCollector; class G1FullGCCompactTask : public G1FullGCTask { G1FullCollector* _collector; - HeapRegionClaimer _claimer; + G1HeapRegionClaimer _claimer; G1CollectedHeap* _g1h; void compact_region(G1HeapRegion* hr); diff --git a/src/hotspot/share/gc/g1/g1FullGCHeapRegionAttr.hpp b/src/hotspot/share/gc/g1/g1FullGCHeapRegionAttr.hpp index 2fc7d74f331f1..9eaa172b5e51b 100644 --- a/src/hotspot/share/gc/g1/g1FullGCHeapRegionAttr.hpp +++ b/src/hotspot/share/gc/g1/g1FullGCHeapRegionAttr.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ #include "gc/g1/g1BiasedArray.hpp" -// This table is used to store attribute values of all HeapRegions that need +// This table is used to store attribute values of all heap regions that need // fast access during the full collection. In particular some parts of the // region type information is encoded in these per-region bytes. Value encoding // has been specifically chosen to make required accesses fast. In particular, diff --git a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp index a4dbbf2edbaea..9d2887c01a6c9 100644 --- a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp +++ b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ class G1HeapRegion; // Determines the regions in the heap that should be part of the compaction and // distributes them among the compaction queues in round-robin fashion. -class G1DetermineCompactionQueueClosure : public HeapRegionClosure { +class G1DetermineCompactionQueueClosure : public G1HeapRegionClosure { G1CollectedHeap* _g1h; G1FullCollector* _collector; uint _cur_worker; @@ -62,7 +62,7 @@ class G1DetermineCompactionQueueClosure : public HeapRegionClosure { class G1FullGCPrepareTask : public G1FullGCTask { volatile bool _has_free_compaction_targets; - HeapRegionClaimer _hrclaimer; + G1HeapRegionClaimer _hrclaimer; void set_has_free_compaction_targets(); @@ -74,7 +74,7 @@ class G1FullGCPrepareTask : public G1FullGCTask { bool has_free_compaction_targets(); private: - class G1CalculatePointersClosure : public HeapRegionClosure { + class G1CalculatePointersClosure : public G1HeapRegionClosure { G1CollectedHeap* _g1h; G1FullCollector* _collector; G1CMBitMap* _bitmap; diff --git a/src/hotspot/share/gc/g1/g1FullGCResetMetadataTask.hpp b/src/hotspot/share/gc/g1/g1FullGCResetMetadataTask.hpp index 98d7af6e2f388..5f046e35001a5 100644 --- a/src/hotspot/share/gc/g1/g1FullGCResetMetadataTask.hpp +++ b/src/hotspot/share/gc/g1/g1FullGCResetMetadataTask.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,9 +29,9 @@ class G1FullGCResetMetadataTask : public G1FullGCTask { G1FullCollector* _collector; - HeapRegionClaimer _claimer; + G1HeapRegionClaimer _claimer; - class G1ResetMetadataClosure : public HeapRegionClosure { + class G1ResetMetadataClosure : public G1HeapRegionClosure { G1CollectedHeap* _g1h; G1FullCollector* _collector; diff --git a/src/hotspot/share/gc/g1/g1HeapRegion.cpp b/src/hotspot/share/gc/g1/g1HeapRegion.cpp index d611cf7f947ff..9851b1df9c9b5 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegion.cpp +++ b/src/hotspot/share/gc/g1/g1HeapRegion.cpp @@ -55,20 +55,20 @@ size_t G1HeapRegion::GrainWords = 0; size_t G1HeapRegion::CardsPerRegion = 0; size_t G1HeapRegion::max_region_size() { - return HeapRegionBounds::max_size(); + return G1HeapRegionBounds::max_size(); } size_t G1HeapRegion::min_region_size_in_words() { - return HeapRegionBounds::min_size() >> LogHeapWordSize; + return G1HeapRegionBounds::min_size() >> LogHeapWordSize; } void G1HeapRegion::setup_heap_region_size(size_t max_heap_size) { size_t region_size = G1HeapRegionSize; // G1HeapRegionSize = 0 means decide ergonomically. if (region_size == 0) { - region_size = clamp(max_heap_size / HeapRegionBounds::target_number(), - HeapRegionBounds::min_size(), - HeapRegionBounds::max_ergonomics_size()); + region_size = clamp(max_heap_size / G1HeapRegionBounds::target_number(), + G1HeapRegionBounds::min_size(), + G1HeapRegionBounds::max_ergonomics_size()); } // Make sure region size is a power of 2. Rounding up since this @@ -76,7 +76,7 @@ void G1HeapRegion::setup_heap_region_size(size_t max_heap_size) { region_size = round_up_power_of_2(region_size); // Now make sure that we don't go over or under our limits. - region_size = clamp(region_size, HeapRegionBounds::min_size(), HeapRegionBounds::max_size()); + region_size = clamp(region_size, G1HeapRegionBounds::min_size(), G1HeapRegionBounds::max_size()); // Now, set up the globals. guarantee(LogOfHRGrainBytes == 0, "we should only set it once"); @@ -247,7 +247,7 @@ G1HeapRegion::G1HeapRegion(uint hrm_index, assert(Universe::on_page_boundary(mr.start()) && Universe::on_page_boundary(mr.end()), "invalid space boundaries"); - _rem_set = new HeapRegionRemSet(this, config); + _rem_set = new G1HeapRegionRemSet(this, config); initialize(); } @@ -264,11 +264,11 @@ void G1HeapRegion::initialize(bool clear_space, bool mangle_space) { } void G1HeapRegion::report_region_type_change(G1HeapRegionTraceType::Type to) { - HeapRegionTracer::send_region_type_change(_hrm_index, - get_trace_type(), - to, - (uintptr_t)bottom(), - used()); + G1HeapRegionTracer::send_region_type_change(_hrm_index, + get_trace_type(), + to, + (uintptr_t)bottom(), + used()); } void G1HeapRegion::note_evacuation_failure() { @@ -377,7 +377,7 @@ bool G1HeapRegion::verify_code_roots(VerifyOption vo) const { return false; } - HeapRegionRemSet* hrrs = rem_set(); + G1HeapRegionRemSet* hrrs = rem_set(); size_t code_roots_length = hrrs->code_roots_list_length(); // if this region is empty then there should be no entries diff --git a/src/hotspot/share/gc/g1/g1HeapRegion.hpp b/src/hotspot/share/gc/g1/g1HeapRegion.hpp index 67d6556203cad..ed953094a679f 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegion.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegion.hpp @@ -40,9 +40,9 @@ class G1CardSetConfiguration; class G1CollectedHeap; class G1CMBitMap; class G1Predictions; -class HeapRegionRemSet; class G1HeapRegion; -class HeapRegionSetBase; +class G1HeapRegionRemSet; +class G1HeapRegionSetBase; class nmethod; #define HR_FORMAT "%u:(%s)[" PTR_FORMAT "," PTR_FORMAT "," PTR_FORMAT "]" @@ -195,12 +195,12 @@ class G1HeapRegion : public CHeapObj<mtGC> { private: // The remembered set for this region. - HeapRegionRemSet* _rem_set; + G1HeapRegionRemSet* _rem_set; // Cached index of this region in the heap region sequence. const uint _hrm_index; - HeapRegionType _type; + G1HeapRegionType _type; // For a humongous region, region in which it starts. G1HeapRegion* _humongous_start_region; @@ -211,11 +211,11 @@ class G1HeapRegion : public CHeapObj<mtGC> { // is considered optional during a mixed collections. uint _index_in_opt_cset; - // Fields used by the HeapRegionSetBase class and subclasses. + // Fields used by the G1HeapRegionSetBase class and subclasses. G1HeapRegion* _next; G1HeapRegion* _prev; #ifdef ASSERT - HeapRegionSetBase* _containing_set; + G1HeapRegionSetBase* _containing_set; #endif // ASSERT // The area above this limit is fully parsable. This limit @@ -276,7 +276,7 @@ class G1HeapRegion : public CHeapObj<mtGC> { MemRegion mr, G1CardSetConfiguration* config); - // If this region is a member of a HeapRegionManager, the index in that + // If this region is a member of a G1HeapRegionManager, the index in that // sequence, otherwise -1. uint hrm_index() const { return _hrm_index; } @@ -418,9 +418,9 @@ class G1HeapRegion : public CHeapObj<mtGC> { // Unsets the humongous-related fields on the region. void clear_humongous(); - void set_rem_set(HeapRegionRemSet* rem_set) { _rem_set = rem_set; } + void set_rem_set(G1HeapRegionRemSet* rem_set) { _rem_set = rem_set; } // If the region has a remembered set, return a pointer to it. - HeapRegionRemSet* rem_set() const { + G1HeapRegionRemSet* rem_set() const { return _rem_set; } @@ -428,7 +428,7 @@ class G1HeapRegion : public CHeapObj<mtGC> { void prepare_remset_for_scan(); - // Methods used by the HeapRegionSetBase class and subclasses. + // Methods used by the G1HeapRegionSetBase class and subclasses. // Getter and setter for the next and prev fields used to link regions into // linked lists. @@ -445,7 +445,7 @@ class G1HeapRegion : public CHeapObj<mtGC> { // the contents of a set are as they should be and it's only // available in non-product builds. #ifdef ASSERT - void set_containing_set(HeapRegionSetBase* containing_set) { + void set_containing_set(G1HeapRegionSetBase* containing_set) { assert((containing_set != nullptr && _containing_set == nullptr) || containing_set == nullptr, "containing_set: " PTR_FORMAT " " @@ -455,9 +455,9 @@ class G1HeapRegion : public CHeapObj<mtGC> { _containing_set = containing_set; } - HeapRegionSetBase* containing_set() { return _containing_set; } + G1HeapRegionSetBase* containing_set() { return _containing_set; } #else // ASSERT - void set_containing_set(HeapRegionSetBase* containing_set) { } + void set_containing_set(G1HeapRegionSetBase* containing_set) { } // containing_set() is only used in asserts so there's no reason // to provide a dummy version of it. @@ -552,10 +552,10 @@ class G1HeapRegion : public CHeapObj<mtGC> { bool verify(VerifyOption vo) const; }; -// HeapRegionClosure is used for iterating over regions. +// G1HeapRegionClosure is used for iterating over regions. // Terminates the iteration when the "do_heap_region" method returns "true". -class HeapRegionClosure : public StackObj { - friend class HeapRegionManager; +class G1HeapRegionClosure : public StackObj { + friend class G1HeapRegionManager; friend class G1CollectionSet; friend class G1CollectionSetCandidates; @@ -563,7 +563,7 @@ class HeapRegionClosure : public StackObj { void set_incomplete() { _is_complete = false; } public: - HeapRegionClosure(): _is_complete(true) {} + G1HeapRegionClosure(): _is_complete(true) {} // Typically called on each region until it returns true. virtual bool do_heap_region(G1HeapRegion* r) = 0; @@ -573,8 +573,8 @@ class HeapRegionClosure : public StackObj { bool is_complete() { return _is_complete; } }; -class HeapRegionIndexClosure : public StackObj { - friend class HeapRegionManager; +class G1HeapRegionIndexClosure : public StackObj { + friend class G1HeapRegionManager; friend class G1CollectionSet; friend class G1CollectionSetCandidates; @@ -582,7 +582,7 @@ class HeapRegionIndexClosure : public StackObj { void set_incomplete() { _is_complete = false; } public: - HeapRegionIndexClosure(): _is_complete(true) {} + G1HeapRegionIndexClosure(): _is_complete(true) {} // Typically called on each region until it returns true. virtual bool do_heap_region_index(uint region_index) = 0; diff --git a/src/hotspot/share/gc/g1/g1HeapRegionBounds.hpp b/src/hotspot/share/gc/g1/g1HeapRegionBounds.hpp index 3cde2f77d4a5b..83314820c830c 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionBounds.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionBounds.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ #include "memory/allStatic.hpp" #include "utilities/globalDefinitions.hpp" -class HeapRegionBounds : public AllStatic { +class G1HeapRegionBounds : public AllStatic { private: // Minimum region size; we won't go lower than that. // We might want to decrease this in the future, to deal with small diff --git a/src/hotspot/share/gc/g1/g1HeapRegionBounds.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegionBounds.inline.hpp index 473057144d30c..63c086c178abb 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionBounds.inline.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionBounds.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,19 +27,19 @@ #include "gc/g1/g1HeapRegionBounds.hpp" -size_t HeapRegionBounds::min_size() { +size_t G1HeapRegionBounds::min_size() { return MIN_REGION_SIZE; } -size_t HeapRegionBounds::max_ergonomics_size() { +size_t G1HeapRegionBounds::max_ergonomics_size() { return MAX_ERGONOMICS_SIZE; } -size_t HeapRegionBounds::max_size() { +size_t G1HeapRegionBounds::max_size() { return MAX_REGION_SIZE; } -size_t HeapRegionBounds::target_number() { +size_t G1HeapRegionBounds::target_number() { return TARGET_REGION_NUMBER; } diff --git a/src/hotspot/share/gc/g1/g1HeapRegionEventSender.cpp b/src/hotspot/share/gc/g1/g1HeapRegionEventSender.cpp index 6f01524a14b61..3be3ec2410c7e 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionEventSender.cpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionEventSender.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,7 @@ #include "jfr/jfrEvents.hpp" #include "runtime/vmThread.hpp" -class DumpEventInfoClosure : public HeapRegionClosure { +class DumpEventInfoClosure : public G1HeapRegionClosure { public: bool do_heap_region(G1HeapRegion* r) { EventG1HeapRegionInformation evt; diff --git a/src/hotspot/share/gc/g1/g1HeapRegionManager.cpp b/src/hotspot/share/gc/g1/g1HeapRegionManager.cpp index 2cf6a4088d3f5..b37e65f8b868a 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionManager.cpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ #include "runtime/orderAccess.hpp" #include "utilities/bitMap.inline.hpp" -class MasterFreeRegionListChecker : public HeapRegionSetChecker { +class G1MasterFreeRegionListChecker : public G1HeapRegionSetChecker { public: void check_mt_safety() { // Master Free List MT safety protocol: @@ -62,20 +62,20 @@ class MasterFreeRegionListChecker : public HeapRegionSetChecker { const char* get_description() { return "Free Regions"; } }; -HeapRegionManager::HeapRegionManager() : +G1HeapRegionManager::G1HeapRegionManager() : _bot_mapper(nullptr), _cardtable_mapper(nullptr), _committed_map(), _allocated_heapregions_length(0), _regions(), _heap_mapper(nullptr), _bitmap_mapper(nullptr), - _free_list("Free list", new MasterFreeRegionListChecker()) + _free_list("Free list", new G1MasterFreeRegionListChecker()) { } -void HeapRegionManager::initialize(G1RegionToSpaceMapper* heap_storage, - G1RegionToSpaceMapper* bitmap, - G1RegionToSpaceMapper* bot, - G1RegionToSpaceMapper* cardtable) { +void G1HeapRegionManager::initialize(G1RegionToSpaceMapper* heap_storage, + G1RegionToSpaceMapper* bitmap, + G1RegionToSpaceMapper* bot, + G1RegionToSpaceMapper* cardtable) { _allocated_heapregions_length = 0; _heap_mapper = heap_storage; @@ -90,7 +90,7 @@ void HeapRegionManager::initialize(G1RegionToSpaceMapper* heap_storage, _committed_map.initialize(reserved_length()); } -G1HeapRegion* HeapRegionManager::allocate_free_region(HeapRegionType type, uint requested_node_index) { +G1HeapRegion* G1HeapRegionManager::allocate_free_region(G1HeapRegionType type, uint requested_node_index) { G1HeapRegion* hr = nullptr; bool from_head = !type.is_young(); G1NUMA* numa = G1NUMA::numa(); @@ -118,7 +118,7 @@ G1HeapRegion* HeapRegionManager::allocate_free_region(HeapRegionType type, uint return hr; } -G1HeapRegion* HeapRegionManager::allocate_humongous_from_free_list(uint num_regions) { +G1HeapRegion* G1HeapRegionManager::allocate_humongous_from_free_list(uint num_regions) { uint candidate = find_contiguous_in_free_list(num_regions); if (candidate == G1_NO_HRM_INDEX) { return nullptr; @@ -126,7 +126,7 @@ G1HeapRegion* HeapRegionManager::allocate_humongous_from_free_list(uint num_regi return allocate_free_regions_starting_at(candidate, num_regions); } -G1HeapRegion* HeapRegionManager::allocate_humongous_allow_expand(uint num_regions) { +G1HeapRegion* G1HeapRegionManager::allocate_humongous_allow_expand(uint num_regions) { uint candidate = find_contiguous_allow_expand(num_regions); if (candidate == G1_NO_HRM_INDEX) { return nullptr; @@ -135,25 +135,25 @@ G1HeapRegion* HeapRegionManager::allocate_humongous_allow_expand(uint num_region return allocate_free_regions_starting_at(candidate, num_regions); } -G1HeapRegion* HeapRegionManager::allocate_humongous(uint num_regions) { +G1HeapRegion* G1HeapRegionManager::allocate_humongous(uint num_regions) { // Special case a single region to avoid expensive search. if (num_regions == 1) { - return allocate_free_region(HeapRegionType::Humongous, G1NUMA::AnyNodeIndex); + return allocate_free_region(G1HeapRegionType::Humongous, G1NUMA::AnyNodeIndex); } return allocate_humongous_from_free_list(num_regions); } -G1HeapRegion* HeapRegionManager::expand_and_allocate_humongous(uint num_regions) { +G1HeapRegion* G1HeapRegionManager::expand_and_allocate_humongous(uint num_regions) { return allocate_humongous_allow_expand(num_regions); } #ifdef ASSERT -bool HeapRegionManager::is_free(G1HeapRegion* hr) const { +bool G1HeapRegionManager::is_free(G1HeapRegion* hr) const { return _free_list.contains(hr); } #endif -G1HeapRegion* HeapRegionManager::new_heap_region(uint hrm_index) { +G1HeapRegion* G1HeapRegionManager::new_heap_region(uint hrm_index) { G1CollectedHeap* g1h = G1CollectedHeap::heap(); HeapWord* bottom = g1h->bottom_addr_for_region(hrm_index); MemRegion mr(bottom, bottom + G1HeapRegion::GrainWords); @@ -161,7 +161,7 @@ G1HeapRegion* HeapRegionManager::new_heap_region(uint hrm_index) { return g1h->new_heap_region(hrm_index, mr); } -void HeapRegionManager::expand(uint start, uint num_regions, WorkerThreads* pretouch_workers) { +void G1HeapRegionManager::expand(uint start, uint num_regions, WorkerThreads* pretouch_workers) { commit_regions(start, num_regions, pretouch_workers); for (uint i = start; i < start + num_regions; i++) { G1HeapRegion* hr = _regions.get_by_index(i); @@ -176,7 +176,7 @@ void HeapRegionManager::expand(uint start, uint num_regions, WorkerThreads* pret activate_regions(start, num_regions); } -void HeapRegionManager::commit_regions(uint index, size_t num_regions, WorkerThreads* pretouch_workers) { +void G1HeapRegionManager::commit_regions(uint index, size_t num_regions, WorkerThreads* pretouch_workers) { guarantee(num_regions > 0, "Must commit more than zero regions"); guarantee(num_regions <= available(), "Cannot commit more than the maximum amount of regions"); @@ -190,7 +190,7 @@ void HeapRegionManager::commit_regions(uint index, size_t num_regions, WorkerThr _cardtable_mapper->commit_regions(index, num_regions, pretouch_workers); } -void HeapRegionManager::uncommit_regions(uint start, uint num_regions) { +void G1HeapRegionManager::uncommit_regions(uint start, uint num_regions) { guarantee(num_regions > 0, "No point in calling this for zero regions"); uint end = start + num_regions; @@ -215,7 +215,7 @@ void HeapRegionManager::uncommit_regions(uint start, uint num_regions) { _committed_map.uncommit(start, end); } -void HeapRegionManager::initialize_regions(uint start, uint num_regions) { +void G1HeapRegionManager::initialize_regions(uint start, uint num_regions) { for (uint i = start; i < start + num_regions; i++) { assert(is_available(i), "Just made region %u available but is apparently not.", i); G1HeapRegion* hr = at(i); @@ -227,12 +227,12 @@ void HeapRegionManager::initialize_regions(uint start, uint num_regions) { } } -void HeapRegionManager::activate_regions(uint start, uint num_regions) { +void G1HeapRegionManager::activate_regions(uint start, uint num_regions) { _committed_map.activate(start, start + num_regions); initialize_regions(start, num_regions); } -void HeapRegionManager::reactivate_regions(uint start, uint num_regions) { +void G1HeapRegionManager::reactivate_regions(uint start, uint num_regions) { assert(num_regions > 0, "No point in calling this for zero regions"); clear_auxiliary_data_structures(start, num_regions); @@ -241,7 +241,7 @@ void HeapRegionManager::reactivate_regions(uint start, uint num_regions) { initialize_regions(start, num_regions); } -void HeapRegionManager::deactivate_regions(uint start, uint num_regions) { +void G1HeapRegionManager::deactivate_regions(uint start, uint num_regions) { assert(num_regions > 0, "Need to specify at least one region to uncommit, tried to uncommit zero regions at %u", start); assert(length() >= num_regions, "pre-condition"); @@ -256,7 +256,7 @@ void HeapRegionManager::deactivate_regions(uint start, uint num_regions) { _committed_map.deactivate(start, end); } -void HeapRegionManager::clear_auxiliary_data_structures(uint start, uint num_regions) { +void G1HeapRegionManager::clear_auxiliary_data_structures(uint start, uint num_regions) { // Signal marking bitmaps to clear the given regions. _bitmap_mapper->signal_mapping_changed(start, num_regions); // Signal G1BlockOffsetTable to clear the given regions. @@ -265,7 +265,7 @@ void HeapRegionManager::clear_auxiliary_data_structures(uint start, uint num_reg _cardtable_mapper->signal_mapping_changed(start, num_regions); } -MemoryUsage HeapRegionManager::get_auxiliary_data_memory_usage() const { +MemoryUsage G1HeapRegionManager::get_auxiliary_data_memory_usage() const { size_t used_sz = _bitmap_mapper->committed_size() + _bot_mapper->committed_size() + @@ -279,18 +279,18 @@ MemoryUsage HeapRegionManager::get_auxiliary_data_memory_usage() const { return MemoryUsage(0, used_sz, committed_sz, committed_sz); } -bool HeapRegionManager::has_inactive_regions() const { +bool G1HeapRegionManager::has_inactive_regions() const { return _committed_map.num_inactive() > 0; } -uint HeapRegionManager::uncommit_inactive_regions(uint limit) { +uint G1HeapRegionManager::uncommit_inactive_regions(uint limit) { assert(limit > 0, "Need to specify at least one region to uncommit"); uint uncommitted = 0; uint offset = 0; do { MutexLocker uc(Uncommit_lock, Mutex::_no_safepoint_check_flag); - HeapRegionRange range = _committed_map.next_inactive_range(offset); + G1HeapRegionRange range = _committed_map.next_inactive_range(offset); // No more regions available for uncommit. Return the number of regions // already uncommitted or 0 if there were no longer any inactive regions. if (range.length() == 0) { @@ -307,12 +307,12 @@ uint HeapRegionManager::uncommit_inactive_regions(uint limit) { return uncommitted; } -uint HeapRegionManager::expand_inactive(uint num_regions) { +uint G1HeapRegionManager::expand_inactive(uint num_regions) { uint offset = 0; uint expanded = 0; do { - HeapRegionRange regions = _committed_map.next_inactive_range(offset); + G1HeapRegionRange regions = _committed_map.next_inactive_range(offset); if (regions.length() == 0) { // No more unavailable regions. break; @@ -327,14 +327,14 @@ uint HeapRegionManager::expand_inactive(uint num_regions) { return expanded; } -uint HeapRegionManager::expand_any(uint num_regions, WorkerThreads* pretouch_workers) { +uint G1HeapRegionManager::expand_any(uint num_regions, WorkerThreads* pretouch_workers) { assert(num_regions > 0, "Must expand at least 1 region"); uint offset = 0; uint expanded = 0; do { - HeapRegionRange regions = _committed_map.next_committable_range(offset); + G1HeapRegionRange regions = _committed_map.next_committable_range(offset); if (regions.length() == 0) { // No more unavailable regions. break; @@ -349,7 +349,7 @@ uint HeapRegionManager::expand_any(uint num_regions, WorkerThreads* pretouch_wor return expanded; } -uint HeapRegionManager::expand_by(uint num_regions, WorkerThreads* pretouch_workers) { +uint G1HeapRegionManager::expand_by(uint num_regions, WorkerThreads* pretouch_workers) { assert(num_regions > 0, "Must expand at least 1 region"); // First "undo" any requests to uncommit memory concurrently by @@ -365,7 +365,7 @@ uint HeapRegionManager::expand_by(uint num_regions, WorkerThreads* pretouch_work return expanded; } -void HeapRegionManager::expand_exact(uint start, uint num_regions, WorkerThreads* pretouch_workers) { +void G1HeapRegionManager::expand_exact(uint start, uint num_regions, WorkerThreads* pretouch_workers) { assert(num_regions != 0, "Need to request at least one region"); uint end = start + num_regions; @@ -393,7 +393,7 @@ void HeapRegionManager::expand_exact(uint start, uint num_regions, WorkerThreads verify_optional(); } -uint HeapRegionManager::expand_on_preferred_node(uint preferred_index) { +uint G1HeapRegionManager::expand_on_preferred_node(uint preferred_index) { uint expand_candidate = UINT_MAX; if (available() >= 1) { @@ -420,13 +420,13 @@ uint HeapRegionManager::expand_on_preferred_node(uint preferred_index) { return 1; } -bool HeapRegionManager::is_on_preferred_index(uint region_index, uint preferred_node_index) { +bool G1HeapRegionManager::is_on_preferred_index(uint region_index, uint preferred_node_index) { uint region_node_index = G1NUMA::numa()->preferred_node_index_for_index(region_index); return region_node_index == preferred_node_index; } #ifdef ASSERT -void HeapRegionManager::assert_contiguous_range(uint start, uint num_regions) { +void G1HeapRegionManager::assert_contiguous_range(uint start, uint num_regions) { // General sanity check, regions found should either be available and empty // or not available so that we can make them available and use them. for (uint i = start; i < (start + num_regions); i++) { @@ -439,7 +439,7 @@ void HeapRegionManager::assert_contiguous_range(uint start, uint num_regions) { } #endif -uint HeapRegionManager::find_contiguous_in_range(uint start, uint end, uint num_regions) { +uint G1HeapRegionManager::find_contiguous_in_range(uint start, uint end, uint num_regions) { assert(start <= end, "precondition"); assert(num_regions >= 1, "precondition"); uint candidate = start; // First region in candidate sequence. @@ -465,9 +465,9 @@ uint HeapRegionManager::find_contiguous_in_range(uint start, uint end, uint num_ return G1_NO_HRM_INDEX; } -uint HeapRegionManager::find_contiguous_in_free_list(uint num_regions) { +uint G1HeapRegionManager::find_contiguous_in_free_list(uint num_regions) { uint candidate = G1_NO_HRM_INDEX; - HeapRegionRange range(0,0); + G1HeapRegionRange range(0,0); do { range = _committed_map.next_active_range(range.end()); @@ -477,7 +477,7 @@ uint HeapRegionManager::find_contiguous_in_free_list(uint num_regions) { return candidate; } -uint HeapRegionManager::find_contiguous_allow_expand(uint num_regions) { +uint G1HeapRegionManager::find_contiguous_allow_expand(uint num_regions) { // Check if we can actually satisfy the allocation. if (num_regions > available()) { return G1_NO_HRM_INDEX; @@ -486,7 +486,7 @@ uint HeapRegionManager::find_contiguous_allow_expand(uint num_regions) { return find_contiguous_in_range(0, reserved_length(), num_regions); } -G1HeapRegion* HeapRegionManager::next_region_in_heap(const G1HeapRegion* r) const { +G1HeapRegion* G1HeapRegionManager::next_region_in_heap(const G1HeapRegion* r) const { guarantee(r != nullptr, "Start region must be a valid region"); guarantee(is_available(r->hrm_index()), "Trying to iterate starting from region %u which is not in the heap", r->hrm_index()); for (uint i = r->hrm_index() + 1; i < _allocated_heapregions_length; i++) { @@ -498,7 +498,7 @@ G1HeapRegion* HeapRegionManager::next_region_in_heap(const G1HeapRegion* r) cons return nullptr; } -void HeapRegionManager::iterate(HeapRegionClosure* blk) const { +void G1HeapRegionManager::iterate(G1HeapRegionClosure* blk) const { uint len = reserved_length(); for (uint i = 0; i < len; i++) { @@ -514,7 +514,7 @@ void HeapRegionManager::iterate(HeapRegionClosure* blk) const { } } -void HeapRegionManager::iterate(HeapRegionIndexClosure* blk) const { +void G1HeapRegionManager::iterate(G1HeapRegionIndexClosure* blk) const { uint len = reserved_length(); for (uint i = 0; i < len; i++) { @@ -529,7 +529,7 @@ void HeapRegionManager::iterate(HeapRegionIndexClosure* blk) const { } } -uint HeapRegionManager::find_highest_free(bool* expanded) { +uint G1HeapRegionManager::find_highest_free(bool* expanded) { // Loop downwards from the highest region index, looking for an // entry which is either free or not yet committed. If not yet // committed, expand at that index. @@ -551,7 +551,7 @@ uint HeapRegionManager::find_highest_free(bool* expanded) { return G1_NO_HRM_INDEX; } -bool HeapRegionManager::allocate_containing_regions(MemRegion range, size_t* commit_count, WorkerThreads* pretouch_workers) { +bool G1HeapRegionManager::allocate_containing_regions(MemRegion range, size_t* commit_count, WorkerThreads* pretouch_workers) { size_t commits = 0; uint start_index = (uint)_regions.get_index_by_address(range.start()); uint last_index = (uint)_regions.get_index_by_address(range.last()); @@ -574,7 +574,7 @@ bool HeapRegionManager::allocate_containing_regions(MemRegion range, size_t* com return true; } -void HeapRegionManager::par_iterate(HeapRegionClosure* blk, HeapRegionClaimer* hrclaimer, const uint start_index) const { +void G1HeapRegionManager::par_iterate(G1HeapRegionClosure* blk, G1HeapRegionClaimer* hrclaimer, const uint start_index) const { // Every worker will actually look at all regions, skipping over regions that // are currently not committed. // This also (potentially) iterates over regions newly allocated during GC. This @@ -603,7 +603,7 @@ void HeapRegionManager::par_iterate(HeapRegionClosure* blk, HeapRegionClaimer* h } } -uint HeapRegionManager::shrink_by(uint num_regions_to_remove) { +uint G1HeapRegionManager::shrink_by(uint num_regions_to_remove) { assert(length() > 0, "the region sequence should not be empty"); assert(length() <= _allocated_heapregions_length, "invariant"); assert(_allocated_heapregions_length > 0, "we should have at least one region committed"); @@ -633,7 +633,7 @@ uint HeapRegionManager::shrink_by(uint num_regions_to_remove) { return removed; } -void HeapRegionManager::shrink_at(uint index, size_t num_regions) { +void G1HeapRegionManager::shrink_at(uint index, size_t num_regions) { #ifdef ASSERT for (uint i = index; i < (index + num_regions); i++) { assert(is_available(i), "Expected available region at index %u", i); @@ -645,7 +645,7 @@ void HeapRegionManager::shrink_at(uint index, size_t num_regions) { deactivate_regions(index, (uint) num_regions); } -uint HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_idx) const { +uint G1HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_idx) const { guarantee(start_idx <= _allocated_heapregions_length, "checking"); guarantee(res_idx != nullptr, "checking"); @@ -679,7 +679,7 @@ uint HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_id return num_regions_found; } -void HeapRegionManager::verify() { +void G1HeapRegionManager::verify() { guarantee(length() <= _allocated_heapregions_length, "invariant: _length: %u _allocated_length: %u", length(), _allocated_heapregions_length); @@ -724,65 +724,65 @@ void HeapRegionManager::verify() { } #ifndef PRODUCT -void HeapRegionManager::verify_optional() { +void G1HeapRegionManager::verify_optional() { verify(); } #endif // PRODUCT -HeapRegionClaimer::HeapRegionClaimer(uint n_workers) : +G1HeapRegionClaimer::G1HeapRegionClaimer(uint n_workers) : _n_workers(n_workers), _n_regions(G1CollectedHeap::heap()->_hrm._allocated_heapregions_length), _claims(nullptr) { uint* new_claims = NEW_C_HEAP_ARRAY(uint, _n_regions, mtGC); memset(new_claims, Unclaimed, sizeof(*_claims) * _n_regions); _claims = new_claims; } -HeapRegionClaimer::~HeapRegionClaimer() { +G1HeapRegionClaimer::~G1HeapRegionClaimer() { FREE_C_HEAP_ARRAY(uint, _claims); } -uint HeapRegionClaimer::offset_for_worker(uint worker_id) const { +uint G1HeapRegionClaimer::offset_for_worker(uint worker_id) const { assert(_n_workers > 0, "must be set"); assert(worker_id < _n_workers, "Invalid worker_id."); return _n_regions * worker_id / _n_workers; } -bool HeapRegionClaimer::is_region_claimed(uint region_index) const { +bool G1HeapRegionClaimer::is_region_claimed(uint region_index) const { assert(region_index < _n_regions, "Invalid index."); return _claims[region_index] == Claimed; } -bool HeapRegionClaimer::claim_region(uint region_index) { +bool G1HeapRegionClaimer::claim_region(uint region_index) { assert(region_index < _n_regions, "Invalid index."); uint old_val = Atomic::cmpxchg(&_claims[region_index], Unclaimed, Claimed); return old_val == Unclaimed; } class G1RebuildFreeListTask : public WorkerTask { - HeapRegionManager* _hrm; - FreeRegionList* _worker_freelists; - uint _worker_chunk_size; - uint _num_workers; + G1HeapRegionManager* _hrm; + G1FreeRegionList* _worker_freelists; + uint _worker_chunk_size; + uint _num_workers; public: - G1RebuildFreeListTask(HeapRegionManager* hrm, uint num_workers) : + G1RebuildFreeListTask(G1HeapRegionManager* hrm, uint num_workers) : WorkerTask("G1 Rebuild Free List Task"), _hrm(hrm), - _worker_freelists(NEW_C_HEAP_ARRAY(FreeRegionList, num_workers, mtGC)), + _worker_freelists(NEW_C_HEAP_ARRAY(G1FreeRegionList, num_workers, mtGC)), _worker_chunk_size((_hrm->reserved_length() + num_workers - 1) / num_workers), _num_workers(num_workers) { for (uint worker = 0; worker < _num_workers; worker++) { - ::new (&_worker_freelists[worker]) FreeRegionList("Appendable Worker Free List"); + ::new (&_worker_freelists[worker]) G1FreeRegionList("Appendable Worker Free List"); } } ~G1RebuildFreeListTask() { for (uint worker = 0; worker < _num_workers; worker++) { - _worker_freelists[worker].~FreeRegionList(); + _worker_freelists[worker].~G1FreeRegionList(); } - FREE_C_HEAP_ARRAY(FreeRegionList, _worker_freelists); + FREE_C_HEAP_ARRAY(G1FreeRegionList, _worker_freelists); } - FreeRegionList* worker_freelist(uint worker) { + G1FreeRegionList* worker_freelist(uint worker) { return &_worker_freelists[worker]; } @@ -800,7 +800,7 @@ class G1RebuildFreeListTask : public WorkerTask { return; } - FreeRegionList* free_list = worker_freelist(worker_id); + G1FreeRegionList* free_list = worker_freelist(worker_id); for (uint i = start; i < end; i++) { G1HeapRegion* region = _hrm->at_or_null(i); if (region != nullptr && region->is_free()) { @@ -815,7 +815,7 @@ class G1RebuildFreeListTask : public WorkerTask { } }; -void HeapRegionManager::rebuild_free_list(WorkerThreads* workers) { +void G1HeapRegionManager::rebuild_free_list(WorkerThreads* workers) { // Abandon current free list to allow a rebuild. _free_list.abandon(); diff --git a/src/hotspot/share/gc/g1/g1HeapRegionManager.hpp b/src/hotspot/share/gc/g1/g1HeapRegionManager.hpp index 3162cc39a9938..d3f1843f07dbf 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionManager.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionManager.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,9 +33,9 @@ #include "services/memoryUsage.hpp" class G1HeapRegion; -class HeapRegionClosure; -class HeapRegionClaimer; -class FreeRegionList; +class G1HeapRegionClaimer; +class G1HeapRegionClosure; +class G1FreeRegionList; class WorkerThreads; class G1HeapRegionTable : public G1BiasedMappedArray<G1HeapRegion*> { @@ -49,7 +49,7 @@ class G1HeapRegionTable : public G1BiasedMappedArray<G1HeapRegion*> { // This allows maximum flexibility for deciding what to commit or uncommit given // a request from outside. // -// HeapRegions are kept in the _regions array in address order. A region's +// G1HeapRegions are kept in the _regions array in address order. A region's // index in the array corresponds to its index in the heap (i.e., 0 is the // region at the bottom of the heap, 1 is the one after it, etc.). Two // regions that are consecutive in the array should also be adjacent in the @@ -65,14 +65,14 @@ class G1HeapRegionTable : public G1BiasedMappedArray<G1HeapRegion*> { // * _num_committed (returned by length()) is the number of currently // committed regions. These may not be contiguous. // * _allocated_heapregions_length (not exposed outside this class) is the -// number of regions+1 for which we have HeapRegions. +// number of regions+1 for which we have G1HeapRegions. // * max_length() returns the maximum number of regions the heap may commit. // * reserved_length() returns the maximum number of regions the heap has reserved. // -class HeapRegionManager: public CHeapObj<mtGC> { +class G1HeapRegionManager: public CHeapObj<mtGC> { friend class VMStructs; - friend class HeapRegionClaimer; + friend class G1HeapRegionClaimer; G1RegionToSpaceMapper* _bot_mapper; G1RegionToSpaceMapper* _cardtable_mapper; @@ -90,7 +90,7 @@ class HeapRegionManager: public CHeapObj<mtGC> { // Pass down commit calls to the VirtualSpace. void commit_regions(uint index, size_t num_regions = 1, WorkerThreads* pretouch_workers = nullptr); - // Initialize the HeapRegions in the range and put them on the free list. + // Initialize the G1HeapRegions in the range and put them on the free list. void initialize_regions(uint start, uint num_regions); // Find a contiguous set of empty or uncommitted regions of length num_regions and return @@ -123,7 +123,7 @@ class HeapRegionManager: public CHeapObj<mtGC> { G1HeapRegionTable _regions; G1RegionToSpaceMapper* _heap_mapper; G1RegionToSpaceMapper* _bitmap_mapper; - FreeRegionList _free_list; + G1FreeRegionList _free_list; void expand(uint index, uint num_regions, WorkerThreads* pretouch_workers = nullptr); @@ -157,7 +157,7 @@ class HeapRegionManager: public CHeapObj<mtGC> { #endif public: // Empty constructor, we'll initialize it with the initialize() method. - HeapRegionManager(); + G1HeapRegionManager(); void initialize(G1RegionToSpaceMapper* heap_storage, G1RegionToSpaceMapper* bitmap, @@ -196,12 +196,12 @@ class HeapRegionManager: public CHeapObj<mtGC> { void rebuild_free_list(WorkerThreads* workers); // Insert the given region list into the global free region list. - void insert_list_into_free_list(FreeRegionList* list) { + void insert_list_into_free_list(G1FreeRegionList* list) { _free_list.add_ordered(list); } // Allocate a free region with specific node index. If fails allocate with next node index. - G1HeapRegion* allocate_free_region(HeapRegionType type, uint requested_node_index); + G1HeapRegion* allocate_free_region(G1HeapRegionType type, uint requested_node_index); // Allocate a humongous object from the free list G1HeapRegion* allocate_humongous(uint num_regions); @@ -246,7 +246,7 @@ class HeapRegionManager: public CHeapObj<mtGC> { MemRegion reserved() const { return MemRegion(heap_bottom(), heap_end()); } // Expand the sequence to reflect that the heap has grown. Either create new - // HeapRegions, or re-use existing ones. Returns the number of regions the + // G1HeapRegions, or re-use existing ones. Returns the number of regions the // sequence was expanded by. If a G1HeapRegion allocation fails, the resulting // number of regions might be smaller than what's desired. uint expand_by(uint num_regions, WorkerThreads* pretouch_workers); @@ -268,10 +268,10 @@ class HeapRegionManager: public CHeapObj<mtGC> { // Apply blk->do_heap_region() on all committed regions in address order, // terminating the iteration early if do_heap_region() returns true. - void iterate(HeapRegionClosure* blk) const; - void iterate(HeapRegionIndexClosure* blk) const; + void iterate(G1HeapRegionClosure* blk) const; + void iterate(G1HeapRegionIndexClosure* blk) const; - void par_iterate(HeapRegionClosure* blk, HeapRegionClaimer* hrclaimer, const uint start_index) const; + void par_iterate(G1HeapRegionClosure* blk, G1HeapRegionClaimer* hrclaimer, const uint start_index) const; // Uncommit up to num_regions_to_remove regions that are completely free. // Return the actual number of uncommitted regions. @@ -294,9 +294,9 @@ class HeapRegionManager: public CHeapObj<mtGC> { void verify_optional() PRODUCT_RETURN; }; -// The HeapRegionClaimer is used during parallel iteration over heap regions, +// The G1HeapRegionClaimer is used during parallel iteration over heap regions, // allowing workers to claim heap regions, gaining exclusive rights to these regions. -class HeapRegionClaimer : public StackObj { +class G1HeapRegionClaimer : public StackObj { uint _n_workers; uint _n_regions; volatile uint* _claims; @@ -305,8 +305,8 @@ class HeapRegionClaimer : public StackObj { static const uint Claimed = 1; public: - HeapRegionClaimer(uint n_workers); - ~HeapRegionClaimer(); + G1HeapRegionClaimer(uint n_workers); + ~G1HeapRegionClaimer(); inline uint n_regions() const { return _n_regions; diff --git a/src/hotspot/share/gc/g1/g1HeapRegionManager.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegionManager.inline.hpp index 0a74a22c52e1e..f78f12672e3ce 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionManager.inline.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionManager.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,11 +31,11 @@ #include "gc/g1/g1HeapRegion.hpp" #include "gc/g1/g1HeapRegionSet.inline.hpp" -inline bool HeapRegionManager::is_available(uint region) const { +inline bool G1HeapRegionManager::is_available(uint region) const { return _committed_map.active(region); } -inline G1HeapRegion* HeapRegionManager::addr_to_region(HeapWord* addr) const { +inline G1HeapRegion* G1HeapRegionManager::addr_to_region(HeapWord* addr) const { assert(addr < heap_end(), "addr: " PTR_FORMAT " end: " PTR_FORMAT, p2i(addr), p2i(heap_end())); assert(addr >= heap_bottom(), @@ -43,7 +43,7 @@ inline G1HeapRegion* HeapRegionManager::addr_to_region(HeapWord* addr) const { return _regions.get_by_address(addr); } -inline G1HeapRegion* HeapRegionManager::at(uint index) const { +inline G1HeapRegion* G1HeapRegionManager::at(uint index) const { assert(is_available(index), "pre-condition"); G1HeapRegion* hr = _regions.get_by_index(index); assert(hr != nullptr, "sanity"); @@ -51,7 +51,7 @@ inline G1HeapRegion* HeapRegionManager::at(uint index) const { return hr; } -inline G1HeapRegion* HeapRegionManager::at_or_null(uint index) const { +inline G1HeapRegion* G1HeapRegionManager::at_or_null(uint index) const { if (!is_available(index)) { return nullptr; } @@ -61,7 +61,7 @@ inline G1HeapRegion* HeapRegionManager::at_or_null(uint index) const { return hr; } -inline G1HeapRegion* HeapRegionManager::next_region_in_humongous(G1HeapRegion* hr) const { +inline G1HeapRegion* G1HeapRegionManager::next_region_in_humongous(G1HeapRegion* hr) const { uint index = hr->hrm_index(); assert(is_available(index), "pre-condition"); assert(hr->is_humongous(), "next_region_in_humongous should only be called for a humongous region."); @@ -73,11 +73,11 @@ inline G1HeapRegion* HeapRegionManager::next_region_in_humongous(G1HeapRegion* h } } -inline void HeapRegionManager::insert_into_free_list(G1HeapRegion* hr) { +inline void G1HeapRegionManager::insert_into_free_list(G1HeapRegion* hr) { _free_list.add_ordered(hr); } -inline G1HeapRegion* HeapRegionManager::allocate_free_regions_starting_at(uint first, uint num_regions) { +inline G1HeapRegion* G1HeapRegionManager::allocate_free_regions_starting_at(uint first, uint num_regions) { G1HeapRegion* start = at(first); _free_list.remove_starting_at(start, num_regions); return start; diff --git a/src/hotspot/share/gc/g1/g1HeapRegionPrinter.hpp b/src/hotspot/share/gc/g1/g1HeapRegionPrinter.hpp index bd686f3809d05..d7b1a6da92c17 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionPrinter.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionPrinter.hpp @@ -29,7 +29,7 @@ #include "logging/log.hpp" #include "memory/allStatic.hpp" -class FreeRegionList; +class G1FreeRegionList; class G1HeapRegionPrinter : public AllStatic { diff --git a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.cpp b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.cpp index 2610fbde298e8..6e98b64adbc24 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.cpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,17 +45,17 @@ #include "utilities/growableArray.hpp" #include "utilities/powerOfTwo.hpp" -HeapWord* HeapRegionRemSet::_heap_base_address = nullptr; +HeapWord* G1HeapRegionRemSet::_heap_base_address = nullptr; -const char* HeapRegionRemSet::_state_strings[] = {"Untracked", "Updating", "Complete"}; -const char* HeapRegionRemSet::_short_state_strings[] = {"UNTRA", "UPDAT", "CMPLT"}; +const char* G1HeapRegionRemSet::_state_strings[] = {"Untracked", "Updating", "Complete"}; +const char* G1HeapRegionRemSet::_short_state_strings[] = {"UNTRA", "UPDAT", "CMPLT"}; -void HeapRegionRemSet::initialize(MemRegion reserved) { +void G1HeapRegionRemSet::initialize(MemRegion reserved) { G1CardSet::initialize(reserved); _heap_base_address = reserved.start(); } -HeapRegionRemSet::HeapRegionRemSet(G1HeapRegion* hr, +G1HeapRegionRemSet::G1HeapRegionRemSet(G1HeapRegion* hr, G1CardSetConfiguration* config) : _code_roots(), _card_set_mm(config, G1CollectedHeap::heap()->card_set_freelist_pool()), @@ -63,11 +63,11 @@ HeapRegionRemSet::HeapRegionRemSet(G1HeapRegion* hr, _hr(hr), _state(Untracked) { } -void HeapRegionRemSet::clear_fcc() { +void G1HeapRegionRemSet::clear_fcc() { G1FromCardCache::clear(_hr->hrm_index()); } -void HeapRegionRemSet::clear(bool only_cardset, bool keep_tracked) { +void G1HeapRegionRemSet::clear(bool only_cardset, bool keep_tracked) { if (!only_cardset) { _code_roots.clear(); } @@ -81,17 +81,17 @@ void HeapRegionRemSet::clear(bool only_cardset, bool keep_tracked) { assert(occupied() == 0, "Should be clear."); } -void HeapRegionRemSet::reset_table_scanner() { +void G1HeapRegionRemSet::reset_table_scanner() { _code_roots.reset_table_scanner(); _card_set.reset_table_scanner(); } -G1MonotonicArenaMemoryStats HeapRegionRemSet::card_set_memory_stats() const { +G1MonotonicArenaMemoryStats G1HeapRegionRemSet::card_set_memory_stats() const { return _card_set_mm.memory_stats(); } -void HeapRegionRemSet::print_static_mem_size(outputStream* out) { - out->print_cr(" Static structures = " SIZE_FORMAT, HeapRegionRemSet::static_mem_size()); +void G1HeapRegionRemSet::print_static_mem_size(outputStream* out) { + out->print_cr(" Static structures = " SIZE_FORMAT, G1HeapRegionRemSet::static_mem_size()); } // Code roots support @@ -101,12 +101,12 @@ void HeapRegionRemSet::print_static_mem_size(outputStream* out) { // except when doing a full gc. // When not at safepoint the CodeCache_lock must be held during modifications. -void HeapRegionRemSet::add_code_root(nmethod* nm) { +void G1HeapRegionRemSet::add_code_root(nmethod* nm) { assert(nm != nullptr, "sanity"); _code_roots.add(nm); } -void HeapRegionRemSet::remove_code_root(nmethod* nm) { +void G1HeapRegionRemSet::remove_code_root(nmethod* nm) { assert(nm != nullptr, "sanity"); _code_roots.remove(nm); @@ -115,18 +115,18 @@ void HeapRegionRemSet::remove_code_root(nmethod* nm) { guarantee(!_code_roots.contains(nm), "duplicate entry found"); } -void HeapRegionRemSet::bulk_remove_code_roots() { +void G1HeapRegionRemSet::bulk_remove_code_roots() { _code_roots.bulk_remove(); } -void HeapRegionRemSet::code_roots_do(NMethodClosure* blk) const { +void G1HeapRegionRemSet::code_roots_do(NMethodClosure* blk) const { _code_roots.nmethods_do(blk); } -void HeapRegionRemSet::clean_code_roots(G1HeapRegion* hr) { +void G1HeapRegionRemSet::clean_code_roots(G1HeapRegion* hr) { _code_roots.clean(hr); } -size_t HeapRegionRemSet::code_roots_mem_size() { +size_t G1HeapRegionRemSet::code_roots_mem_size() { return _code_roots.mem_size(); } diff --git a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.hpp b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.hpp index fb0a64ac0d18c..e92ecdc9cf9b0 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ class G1CardSetMemoryManager; class outputStream; -class HeapRegionRemSet : public CHeapObj<mtGC> { +class G1HeapRegionRemSet : public CHeapObj<mtGC> { friend class VMStructs; // A set of nmethods whose code contains pointers into @@ -57,7 +57,7 @@ class HeapRegionRemSet : public CHeapObj<mtGC> { void clear_fcc(); public: - HeapRegionRemSet(G1HeapRegion* hr, G1CardSetConfiguration* config); + G1HeapRegionRemSet(G1HeapRegion* hr, G1CardSetConfiguration* config); bool cardset_is_empty() const { return _card_set.is_empty(); @@ -126,7 +126,7 @@ class HeapRegionRemSet : public CHeapObj<mtGC> { // root set. size_t mem_size() { return _card_set.mem_size() - + (sizeof(HeapRegionRemSet) - sizeof(G1CardSet)) // Avoid double-counting G1CardSet. + + (sizeof(G1HeapRegionRemSet) - sizeof(G1CardSet)) // Avoid double-counting G1CardSet. + code_roots_mem_size(); } diff --git a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.inline.hpp index 78153cc0c3023..457027ad1260a 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.inline.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,7 +33,7 @@ #include "runtime/atomic.hpp" #include "utilities/bitMap.inline.hpp" -void HeapRegionRemSet::set_state_untracked() { +void G1HeapRegionRemSet::set_state_untracked() { guarantee(SafepointSynchronize::is_at_safepoint() || !is_tracked(), "Should only set to Untracked during safepoint but is %s.", get_state_str()); if (_state == Untracked) { @@ -43,14 +43,14 @@ void HeapRegionRemSet::set_state_untracked() { _state = Untracked; } -void HeapRegionRemSet::set_state_updating() { +void G1HeapRegionRemSet::set_state_updating() { guarantee(SafepointSynchronize::is_at_safepoint() && !is_tracked(), "Should only set to Updating from Untracked during safepoint but is %s", get_state_str()); clear_fcc(); _state = Updating; } -void HeapRegionRemSet::set_state_complete() { +void G1HeapRegionRemSet::set_state_complete() { clear_fcc(); _state = Complete; } @@ -107,7 +107,7 @@ class G1HeapRegionRemSetMergeCardClosure : public G1CardSet::ContainerPtrClosure }; template <class CardOrRangeVisitor> -inline void HeapRegionRemSet::iterate_for_merge(CardOrRangeVisitor& cl) { +inline void G1HeapRegionRemSet::iterate_for_merge(CardOrRangeVisitor& cl) { G1HeapRegionRemSetMergeCardClosure<CardOrRangeVisitor, G1ContainerCardsOrRanges> cl2(&_card_set, cl, _card_set.config()->log2_card_regions_per_heap_region(), @@ -116,11 +116,11 @@ inline void HeapRegionRemSet::iterate_for_merge(CardOrRangeVisitor& cl) { } -uintptr_t HeapRegionRemSet::to_card(OopOrNarrowOopStar from) const { +uintptr_t G1HeapRegionRemSet::to_card(OopOrNarrowOopStar from) const { return pointer_delta(from, _heap_base_address, 1) >> CardTable::card_shift(); } -void HeapRegionRemSet::add_reference(OopOrNarrowOopStar from, uint tid) { +void G1HeapRegionRemSet::add_reference(OopOrNarrowOopStar from, uint tid) { assert(_state != Untracked, "must be"); uint cur_idx = _hr->hrm_index(); @@ -136,11 +136,11 @@ void HeapRegionRemSet::add_reference(OopOrNarrowOopStar from, uint tid) { _card_set.add_card(to_card(from)); } -bool HeapRegionRemSet::contains_reference(OopOrNarrowOopStar from) { +bool G1HeapRegionRemSet::contains_reference(OopOrNarrowOopStar from) { return _card_set.contains_card(to_card(from)); } -void HeapRegionRemSet::print_info(outputStream* st, OopOrNarrowOopStar from) { +void G1HeapRegionRemSet::print_info(outputStream* st, OopOrNarrowOopStar from) { _card_set.print_info(st, to_card(from)); } diff --git a/src/hotspot/share/gc/g1/g1HeapRegionSet.cpp b/src/hotspot/share/gc/g1/g1HeapRegionSet.cpp index eaf475aff34e3..38796239168ef 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionSet.cpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionSet.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,10 +28,10 @@ #include "gc/g1/g1HeapRegionSet.inline.hpp" #include "gc/g1/g1NUMA.hpp" -uint FreeRegionList::_unrealistically_long_length = 0; +uint G1FreeRegionList::_unrealistically_long_length = 0; #ifndef PRODUCT -void HeapRegionSetBase::verify_region(G1HeapRegion* hr) { +void G1HeapRegionSetBase::verify_region(G1HeapRegion* hr) { assert(hr->containing_set() == this, "Inconsistent containing set for %u", hr->hrm_index()); assert(!hr->is_young(), "Adding young region %u", hr->hrm_index()); // currently we don't use these sets for young regions assert(_checker == nullptr || _checker->is_correct_type(hr), "Wrong type of region %u (%s) and set %s", @@ -41,7 +41,7 @@ void HeapRegionSetBase::verify_region(G1HeapRegion* hr) { } #endif -void HeapRegionSetBase::verify() { +void G1HeapRegionSetBase::verify() { // It's important that we also observe the MT safety protocol even // for the verification calls. If we do verification without the // appropriate locks and the set changes underneath our feet @@ -53,18 +53,18 @@ void HeapRegionSetBase::verify() { "invariant"); } -void HeapRegionSetBase::verify_start() { +void G1HeapRegionSetBase::verify_start() { // See comment in verify() about MT safety and verification. check_mt_safety(); assert_heap_region_set(!_verify_in_progress, "verification should not be in progress"); // Do the basic verification first before we do the checks over the regions. - HeapRegionSetBase::verify(); + G1HeapRegionSetBase::verify(); _verify_in_progress = true; } -void HeapRegionSetBase::verify_end() { +void G1HeapRegionSetBase::verify_end() { // See comment in verify() about MT safety and verification. check_mt_safety(); assert_heap_region_set(_verify_in_progress, "verification should be in progress"); @@ -72,30 +72,30 @@ void HeapRegionSetBase::verify_end() { _verify_in_progress = false; } -void HeapRegionSetBase::print_on(outputStream* out, bool print_contents) { +void G1HeapRegionSetBase::print_on(outputStream* out, bool print_contents) { out->cr(); out->print_cr("Set: %s (" PTR_FORMAT ")", name(), p2i(this)); out->print_cr(" Region Type : %s", _checker->get_description()); out->print_cr(" Length : %14u", length()); } -HeapRegionSetBase::HeapRegionSetBase(const char* name, HeapRegionSetChecker* checker) +G1HeapRegionSetBase::G1HeapRegionSetBase(const char* name, G1HeapRegionSetChecker* checker) : _checker(checker), _length(0), _name(name), _verify_in_progress(false) { } -void FreeRegionList::set_unrealistically_long_length(uint len) { +void G1FreeRegionList::set_unrealistically_long_length(uint len) { guarantee(_unrealistically_long_length == 0, "should only be set once"); _unrealistically_long_length = len; } -void FreeRegionList::abandon() { +void G1FreeRegionList::abandon() { check_mt_safety(); clear(); verify_optional(); } -void FreeRegionList::remove_all() { +void G1FreeRegionList::remove_all() { check_mt_safety(); verify_optional(); @@ -117,7 +117,7 @@ void FreeRegionList::remove_all() { verify_optional(); } -void FreeRegionList::add_list_common_start(FreeRegionList* from_list) { +void G1FreeRegionList::add_list_common_start(G1FreeRegionList* from_list) { check_mt_safety(); from_list->check_mt_safety(); verify_optional(); @@ -132,7 +132,7 @@ void FreeRegionList::add_list_common_start(FreeRegionList* from_list) { } #ifdef ASSERT - FreeRegionListIterator iter(from_list); + G1FreeRegionListIterator iter(from_list); while (iter.more_available()) { G1HeapRegion* hr = iter.get_next(); // In set_containing_set() we check that we either set the value @@ -144,7 +144,7 @@ void FreeRegionList::add_list_common_start(FreeRegionList* from_list) { #endif // ASSERT } -void FreeRegionList::add_list_common_end(FreeRegionList* from_list) { +void G1FreeRegionList::add_list_common_end(G1FreeRegionList* from_list) { _length += from_list->length(); from_list->clear(); @@ -152,7 +152,7 @@ void FreeRegionList::add_list_common_end(FreeRegionList* from_list) { from_list->verify_optional(); } -void FreeRegionList::append_ordered(FreeRegionList* from_list) { +void G1FreeRegionList::append_ordered(G1FreeRegionList* from_list) { add_list_common_start(from_list); if (from_list->is_empty()) { @@ -177,7 +177,7 @@ void FreeRegionList::append_ordered(FreeRegionList* from_list) { add_list_common_end(from_list); } -void FreeRegionList::add_ordered(FreeRegionList* from_list) { +void G1FreeRegionList::add_ordered(G1FreeRegionList* from_list) { add_list_common_start(from_list); if (from_list->is_empty()) { @@ -227,7 +227,7 @@ void FreeRegionList::add_ordered(FreeRegionList* from_list) { } #ifdef ASSERT -void FreeRegionList::verify_region_to_remove(G1HeapRegion* curr, G1HeapRegion* next) { +void G1FreeRegionList::verify_region_to_remove(G1HeapRegion* curr, G1HeapRegion* next) { assert_free_region_list(_head != next, "invariant"); if (next != nullptr) { assert_free_region_list(next->prev() == curr, "invariant"); @@ -244,7 +244,7 @@ void FreeRegionList::verify_region_to_remove(G1HeapRegion* curr, G1HeapRegion* n } #endif -void FreeRegionList::remove_starting_at(G1HeapRegion* first, uint num_regions) { +void G1FreeRegionList::remove_starting_at(G1HeapRegion* first, uint num_regions) { check_mt_safety(); assert_free_region_list(num_regions >= 1, "pre-condition"); assert_free_region_list(!is_empty(), "pre-condition"); @@ -304,8 +304,8 @@ void FreeRegionList::remove_starting_at(G1HeapRegion* first, uint num_regions) { verify_optional(); } -void FreeRegionList::verify() { - // See comment in HeapRegionSetBase::verify() about MT safety and +void G1FreeRegionList::verify() { + // See comment in G1HeapRegionSetBase::verify() about MT safety and // verification. check_mt_safety(); @@ -317,7 +317,7 @@ void FreeRegionList::verify() { verify_end(); } -void FreeRegionList::clear() { +void G1FreeRegionList::clear() { _length = 0; _head = nullptr; _tail = nullptr; @@ -328,7 +328,7 @@ void FreeRegionList::clear() { } } -void FreeRegionList::verify_list() { +void G1FreeRegionList::verify_list() { G1HeapRegion* curr = _head; G1HeapRegion* prev1 = nullptr; G1HeapRegion* prev0 = nullptr; @@ -364,37 +364,37 @@ void FreeRegionList::verify_list() { } -FreeRegionList::FreeRegionList(const char* name, HeapRegionSetChecker* checker): - HeapRegionSetBase(name, checker), +G1FreeRegionList::G1FreeRegionList(const char* name, G1HeapRegionSetChecker* checker): + G1HeapRegionSetBase(name, checker), _node_info(G1NUMA::numa()->is_enabled() ? new NodeInfo() : nullptr) { clear(); } -FreeRegionList::~FreeRegionList() { +G1FreeRegionList::~G1FreeRegionList() { if (_node_info != nullptr) { delete _node_info; } } -FreeRegionList::NodeInfo::NodeInfo() : _numa(G1NUMA::numa()), _length_of_node(nullptr), - _num_nodes(_numa->num_active_nodes()) { +G1FreeRegionList::NodeInfo::NodeInfo() : _numa(G1NUMA::numa()), _length_of_node(nullptr), + _num_nodes(_numa->num_active_nodes()) { assert(UseNUMA, "Invariant"); _length_of_node = NEW_C_HEAP_ARRAY(uint, _num_nodes, mtGC); } -FreeRegionList::NodeInfo::~NodeInfo() { +G1FreeRegionList::NodeInfo::~NodeInfo() { FREE_C_HEAP_ARRAY(uint, _length_of_node); } -void FreeRegionList::NodeInfo::clear() { +void G1FreeRegionList::NodeInfo::clear() { for (uint i = 0; i < _num_nodes; ++i) { _length_of_node[i] = 0; } } -void FreeRegionList::NodeInfo::add(NodeInfo* info) { +void G1FreeRegionList::NodeInfo::add(NodeInfo* info) { for (uint i = 0; i < _num_nodes; ++i) { _length_of_node[i] += info->_length_of_node[i]; } diff --git a/src/hotspot/share/gc/g1/g1HeapRegionSet.hpp b/src/hotspot/share/gc/g1/g1HeapRegionSet.hpp index e401b38aadc94..19e98e8c54cfa 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionSet.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,14 +48,14 @@ // Interface collecting various instance specific verification methods of -// HeapRegionSets. -class HeapRegionSetChecker : public CHeapObj<mtGC> { +// G1HeapRegionSets. +class G1HeapRegionSetChecker : public CHeapObj<mtGC> { public: - // Verify MT safety for this HeapRegionSet. + // Verify MT safety for this G1HeapRegionSet. virtual void check_mt_safety() = 0; - // Returns true if the given G1HeapRegion is of the correct type for this HeapRegionSet. + // Returns true if the given G1HeapRegion is of the correct type for this G1HeapRegionSet. virtual bool is_correct_type(G1HeapRegion* hr) = 0; - // Return a description of the type of regions this HeapRegionSet contains. + // Return a description of the type of regions this G1HeapRegionSet contains. virtual const char* get_description() = 0; }; @@ -64,10 +64,10 @@ class HeapRegionSetChecker : public CHeapObj<mtGC> { // (e.g., length, region num, used bytes sum) plus any shared // functionality (e.g., verification). -class HeapRegionSetBase { +class G1HeapRegionSetBase { friend class VMStructs; - HeapRegionSetChecker* _checker; + G1HeapRegionSetChecker* _checker; protected: // The number of regions in to the set. @@ -87,7 +87,7 @@ class HeapRegionSetBase { } } - HeapRegionSetBase(const char* name, HeapRegionSetChecker* verifier); + G1HeapRegionSetBase(const char* name, G1HeapRegionSetChecker* verifier); public: const char* name() { return _name; } @@ -117,12 +117,12 @@ class HeapRegionSetBase { // This class represents heap region sets whose members are not // explicitly tracked. It's helpful to group regions using such sets // so that we can reason about all the region groups in the heap using -// the same interface (namely, the HeapRegionSetBase API). +// the same interface (namely, the G1HeapRegionSetBase API). -class HeapRegionSet : public HeapRegionSetBase { +class G1HeapRegionSet : public G1HeapRegionSetBase { public: - HeapRegionSet(const char* name, HeapRegionSetChecker* checker): - HeapRegionSetBase(name, checker) { + G1HeapRegionSet(const char* name, G1HeapRegionSetChecker* checker): + G1HeapRegionSetBase(name, checker) { } void bulk_remove(const uint removed) { @@ -135,11 +135,11 @@ class HeapRegionSet : public HeapRegionSetBase { // such lists in performance critical paths. Typically we should // add / remove one region at a time or concatenate two lists. -class FreeRegionListIterator; +class G1FreeRegionListIterator; class G1NUMA; -class FreeRegionList : public HeapRegionSetBase { - friend class FreeRegionListIterator; +class G1FreeRegionList : public G1HeapRegionSetBase { + friend class G1FreeRegionListIterator; private: @@ -181,17 +181,17 @@ class FreeRegionList : public HeapRegionSetBase { inline void decrease_length(uint node_index); // Common checks for adding a list. - void add_list_common_start(FreeRegionList* from_list); - void add_list_common_end(FreeRegionList* from_list); + void add_list_common_start(G1FreeRegionList* from_list); + void add_list_common_end(G1FreeRegionList* from_list); void verify_region_to_remove(G1HeapRegion* curr, G1HeapRegion* next) NOT_DEBUG_RETURN; protected: - // See the comment for HeapRegionSetBase::clear() + // See the comment for G1HeapRegionSetBase::clear() virtual void clear(); public: - FreeRegionList(const char* name, HeapRegionSetChecker* checker = nullptr); - ~FreeRegionList(); + G1FreeRegionList(const char* name, G1HeapRegionSetChecker* checker = nullptr); + ~G1FreeRegionList(); void verify_list(); @@ -218,8 +218,8 @@ class FreeRegionList : public HeapRegionSetBase { // Merge two ordered lists. The result is also ordered. The order is // determined by hrm_index. - void add_ordered(FreeRegionList* from_list); - void append_ordered(FreeRegionList* from_list); + void add_ordered(G1FreeRegionList* from_list); + void append_ordered(G1FreeRegionList* from_list); // It empties the list by removing all regions from it. void remove_all(); @@ -235,16 +235,16 @@ class FreeRegionList : public HeapRegionSetBase { virtual void verify(); - using HeapRegionSetBase::length; + using G1HeapRegionSetBase::length; uint length(uint node_index) const; }; // Iterator class that provides a convenient way to iterate over the // regions of a FreeRegionList. -class FreeRegionListIterator : public StackObj { +class G1FreeRegionListIterator : public StackObj { private: - FreeRegionList* _list; + G1FreeRegionList* _list; G1HeapRegion* _curr; public: @@ -265,7 +265,7 @@ class FreeRegionListIterator : public StackObj { return hr; } - FreeRegionListIterator(FreeRegionList* list) + G1FreeRegionListIterator(G1FreeRegionList* list) : _list(list), _curr(list->_head) { } diff --git a/src/hotspot/share/gc/g1/g1HeapRegionSet.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegionSet.inline.hpp index f0a38a4175436..80b23616f9205 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionSet.inline.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionSet.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ #include "gc/g1/g1NUMA.hpp" -inline void HeapRegionSetBase::add(G1HeapRegion* hr) { +inline void G1HeapRegionSetBase::add(G1HeapRegion* hr) { check_mt_safety(); assert_heap_region_set(hr->containing_set() == nullptr, "should not already have a containing set"); assert_heap_region_set(hr->next() == nullptr, "should not already be linked"); @@ -40,7 +40,7 @@ inline void HeapRegionSetBase::add(G1HeapRegion* hr) { verify_region(hr); } -inline void HeapRegionSetBase::remove(G1HeapRegion* hr) { +inline void G1HeapRegionSetBase::remove(G1HeapRegion* hr) { check_mt_safety(); verify_region(hr); assert_heap_region_set(hr->next() == nullptr, "should already be unlinked"); @@ -51,7 +51,7 @@ inline void HeapRegionSetBase::remove(G1HeapRegion* hr) { _length--; } -inline void FreeRegionList::add_to_tail(G1HeapRegion* region_to_add) { +inline void G1FreeRegionList::add_to_tail(G1HeapRegion* region_to_add) { assert_free_region_list((length() == 0 && _head == nullptr && _tail == nullptr && _last == nullptr) || (length() > 0 && _head != nullptr && _tail != nullptr && _tail->hrm_index() < region_to_add->hrm_index()), "invariant"); @@ -71,7 +71,7 @@ inline void FreeRegionList::add_to_tail(G1HeapRegion* region_to_add) { increase_length(region_to_add->node_index()); } -inline void FreeRegionList::add_ordered(G1HeapRegion* hr) { +inline void G1FreeRegionList::add_ordered(G1HeapRegion* hr) { assert_free_region_list((length() == 0 && _head == nullptr && _tail == nullptr && _last == nullptr) || (length() > 0 && _head != nullptr && _tail != nullptr), "invariant"); @@ -120,7 +120,7 @@ inline void FreeRegionList::add_ordered(G1HeapRegion* hr) { increase_length(hr->node_index()); } -inline G1HeapRegion* FreeRegionList::remove_from_head_impl() { +inline G1HeapRegion* G1FreeRegionList::remove_from_head_impl() { G1HeapRegion* result = _head; _head = result->next(); if (_head == nullptr) { @@ -132,7 +132,7 @@ inline G1HeapRegion* FreeRegionList::remove_from_head_impl() { return result; } -inline G1HeapRegion* FreeRegionList::remove_from_tail_impl() { +inline G1HeapRegion* G1FreeRegionList::remove_from_tail_impl() { G1HeapRegion* result = _tail; _tail = result->prev(); @@ -145,7 +145,7 @@ inline G1HeapRegion* FreeRegionList::remove_from_tail_impl() { return result; } -inline G1HeapRegion* FreeRegionList::remove_region(bool from_head) { +inline G1HeapRegion* G1FreeRegionList::remove_region(bool from_head) { check_mt_safety(); verify_optional(); @@ -174,7 +174,7 @@ inline G1HeapRegion* FreeRegionList::remove_region(bool from_head) { return hr; } -inline G1HeapRegion* FreeRegionList::remove_region_with_node_index(bool from_head, +inline G1HeapRegion* G1FreeRegionList::remove_region_with_node_index(bool from_head, uint requested_node_index) { assert(UseNUMA, "Invariant"); @@ -232,13 +232,13 @@ inline G1HeapRegion* FreeRegionList::remove_region_with_node_index(bool from_hea return cur; } -inline void FreeRegionList::NodeInfo::increase_length(uint node_index) { +inline void G1FreeRegionList::NodeInfo::increase_length(uint node_index) { if (node_index < _num_nodes) { _length_of_node[node_index] += 1; } } -inline void FreeRegionList::NodeInfo::decrease_length(uint node_index) { +inline void G1FreeRegionList::NodeInfo::decrease_length(uint node_index) { if (node_index < _num_nodes) { assert(_length_of_node[node_index] > 0, "Current length %u should be greater than zero for node %u", @@ -247,23 +247,23 @@ inline void FreeRegionList::NodeInfo::decrease_length(uint node_index) { } } -inline uint FreeRegionList::NodeInfo::length(uint node_index) const { +inline uint G1FreeRegionList::NodeInfo::length(uint node_index) const { return _length_of_node[node_index]; } -inline void FreeRegionList::increase_length(uint node_index) { +inline void G1FreeRegionList::increase_length(uint node_index) { if (_node_info != nullptr) { return _node_info->increase_length(node_index); } } -inline void FreeRegionList::decrease_length(uint node_index) { +inline void G1FreeRegionList::decrease_length(uint node_index) { if (_node_info != nullptr) { return _node_info->decrease_length(node_index); } } -inline uint FreeRegionList::length(uint node_index) const { +inline uint G1FreeRegionList::length(uint node_index) const { if (_node_info != nullptr) { return _node_info->length(node_index); } else { diff --git a/src/hotspot/share/gc/g1/g1HeapRegionTracer.cpp b/src/hotspot/share/gc/g1/g1HeapRegionTracer.cpp index c66ae0cb06941..749b7d2d1f5cc 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionTracer.cpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionTracer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ #include "gc/g1/g1HeapRegionTracer.hpp" #include "jfr/jfrEvents.hpp" -void HeapRegionTracer::send_region_type_change(uint index, +void G1HeapRegionTracer::send_region_type_change(uint index, G1HeapRegionTraceType::Type from, G1HeapRegionTraceType::Type to, uintptr_t start, diff --git a/src/hotspot/share/gc/g1/g1HeapRegionTracer.hpp b/src/hotspot/share/gc/g1/g1HeapRegionTracer.hpp index 137bc6189aed0..42c88aa5f0fad 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionTracer.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionTracer.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ #include "memory/allStatic.hpp" #include "utilities/globalDefinitions.hpp" -class HeapRegionTracer : AllStatic { +class G1HeapRegionTracer : AllStatic { public: static void send_region_type_change(uint index, G1HeapRegionTraceType::Type from, diff --git a/src/hotspot/share/gc/g1/g1HeapRegionType.cpp b/src/hotspot/share/gc/g1/g1HeapRegionType.cpp index e55759b3bf38d..c6d38e341be33 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionType.cpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionType.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,12 +26,12 @@ #include "gc/g1/g1HeapRegionTraceType.hpp" #include "gc/g1/g1HeapRegionType.hpp" -const HeapRegionType HeapRegionType::Eden = HeapRegionType(EdenTag); -const HeapRegionType HeapRegionType::Survivor = HeapRegionType(SurvTag); -const HeapRegionType HeapRegionType::Old = HeapRegionType(OldTag); -const HeapRegionType HeapRegionType::Humongous = HeapRegionType(StartsHumongousTag); +const G1HeapRegionType G1HeapRegionType::Eden = G1HeapRegionType(EdenTag); +const G1HeapRegionType G1HeapRegionType::Survivor = G1HeapRegionType(SurvTag); +const G1HeapRegionType G1HeapRegionType::Old = G1HeapRegionType(OldTag); +const G1HeapRegionType G1HeapRegionType::Humongous = G1HeapRegionType(StartsHumongousTag); -bool HeapRegionType::is_valid(Tag tag) { +bool G1HeapRegionType::is_valid(Tag tag) { switch (tag) { case FreeTag: case EdenTag: @@ -45,7 +45,7 @@ bool HeapRegionType::is_valid(Tag tag) { } } -const char* HeapRegionType::get_str() const { +const char* G1HeapRegionType::get_str() const { hrt_assert_is_valid(_tag); switch (_tag) { case FreeTag: return "FREE"; @@ -60,7 +60,7 @@ const char* HeapRegionType::get_str() const { } } -const char* HeapRegionType::get_short_str() const { +const char* G1HeapRegionType::get_short_str() const { hrt_assert_is_valid(_tag); switch (_tag) { case FreeTag: return "F"; @@ -75,7 +75,7 @@ const char* HeapRegionType::get_short_str() const { } } -G1HeapRegionTraceType::Type HeapRegionType::get_trace_type() { +G1HeapRegionTraceType::Type G1HeapRegionType::get_trace_type() { hrt_assert_is_valid(_tag); switch (_tag) { case FreeTag: return G1HeapRegionTraceType::Free; diff --git a/src/hotspot/share/gc/g1/g1HeapRegionType.hpp b/src/hotspot/share/gc/g1/g1HeapRegionType.hpp index b62699cc3fb9e..839df68febd90 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionType.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionType.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ #define hrt_assert_is_valid(tag) \ assert(is_valid((tag)), "invalid HR type: %u", (uint) (tag)) -class HeapRegionType { +class G1HeapRegionType { friend class VMStructs; private: @@ -101,7 +101,7 @@ friend class VMStructs; } // Private constructor used for static constants - HeapRegionType(Tag t) : _tag(t) { hrt_assert_is_valid(_tag); } + G1HeapRegionType(Tag t) : _tag(t) { hrt_assert_is_valid(_tag); } public: // Queries @@ -159,12 +159,12 @@ friend class VMStructs; const char* get_short_str() const; G1HeapRegionTraceType::Type get_trace_type(); - HeapRegionType() : _tag(FreeTag) { hrt_assert_is_valid(_tag); } + G1HeapRegionType() : _tag(FreeTag) { hrt_assert_is_valid(_tag); } - static const HeapRegionType Eden; - static const HeapRegionType Survivor; - static const HeapRegionType Old; - static const HeapRegionType Humongous; + static const G1HeapRegionType Eden; + static const G1HeapRegionType Survivor; + static const G1HeapRegionType Old; + static const G1HeapRegionType Humongous; }; #endif // SHARE_GC_G1_G1HEAPREGIONTYPE_HPP diff --git a/src/hotspot/share/gc/g1/g1HeapTransition.cpp b/src/hotspot/share/gc/g1/g1HeapTransition.cpp index 8804d37cc719a..815b701c4be90 100644 --- a/src/hotspot/share/gc/g1/g1HeapTransition.cpp +++ b/src/hotspot/share/gc/g1/g1HeapTransition.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -79,7 +79,7 @@ struct G1HeapTransition::DetailedUsage : public StackObj { _humongous_region_count(0) {} }; -class G1HeapTransition::DetailedUsageClosure: public HeapRegionClosure { +class G1HeapTransition::DetailedUsageClosure: public G1HeapRegionClosure { public: DetailedUsage _usage; bool do_heap_region(G1HeapRegion* r) { diff --git a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp index 9201fc98c8a14..7d399b8265e65 100644 --- a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp +++ b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -111,7 +111,7 @@ class G1VerifyCodeRootOopClosure: public OopClosure { // Now fetch the region containing the object G1HeapRegion* hr = _g1h->heap_region_containing(obj); - HeapRegionRemSet* hrrs = hr->rem_set(); + G1HeapRegionRemSet* hrrs = hr->rem_set(); // Verify that the code root list for this region // contains the nmethod if (!hrrs->code_roots_list_contains(_nm)) { @@ -231,7 +231,7 @@ class VerifyObjsInRegionClosure: public ObjectClosure { size_t live_bytes() { return _live_bytes; } }; -class VerifyRegionClosure: public HeapRegionClosure { +class VerifyRegionClosure: public G1HeapRegionClosure { private: VerifyOption _vo; bool _failures; @@ -287,10 +287,10 @@ class VerifyRegionClosure: public HeapRegionClosure { class G1VerifyTask: public WorkerTask { private: - G1CollectedHeap* _g1h; - VerifyOption _vo; - bool _failures; - HeapRegionClaimer _hrclaimer; + G1CollectedHeap* _g1h; + VerifyOption _vo; + bool _failures; + G1HeapRegionClaimer _hrclaimer; public: G1VerifyTask(G1CollectedHeap* g1h, VerifyOption vo) : @@ -377,20 +377,20 @@ void G1HeapVerifier::verify(VerifyOption vo) { // Heap region set verification -class VerifyRegionListsClosure : public HeapRegionClosure { +class VerifyRegionListsClosure : public G1HeapRegionClosure { private: - HeapRegionSet* _old_set; - HeapRegionSet* _humongous_set; - HeapRegionManager* _hrm; + G1HeapRegionSet* _old_set; + G1HeapRegionSet* _humongous_set; + G1HeapRegionManager* _hrm; public: uint _old_count; uint _humongous_count; uint _free_count; - VerifyRegionListsClosure(HeapRegionSet* old_set, - HeapRegionSet* humongous_set, - HeapRegionManager* hrm) : + VerifyRegionListsClosure(G1HeapRegionSet* old_set, + G1HeapRegionSet* humongous_set, + G1HeapRegionManager* hrm) : _old_set(old_set), _humongous_set(humongous_set), _hrm(hrm), _old_count(), _humongous_count(), _free_count(){ } @@ -412,7 +412,7 @@ class VerifyRegionListsClosure : public HeapRegionClosure { return false; } - void verify_counts(HeapRegionSet* old_set, HeapRegionSet* humongous_set, HeapRegionManager* free_list) { + void verify_counts(G1HeapRegionSet* old_set, G1HeapRegionSet* humongous_set, G1HeapRegionManager* free_list) { guarantee(old_set->length() == _old_count, "Old set count mismatch. Expected %u, actual %u.", old_set->length(), _old_count); guarantee(humongous_set->length() == _humongous_count, "Hum set count mismatch. Expected %u, actual %u.", humongous_set->length(), _humongous_count); guarantee(free_list->num_free_regions() == _free_count, "Free list count mismatch. Expected %u, actual %u.", free_list->num_free_regions(), _free_count); @@ -435,7 +435,7 @@ void G1HeapVerifier::verify_region_sets() { _g1h->collection_set()->candidates()->verify(); } -class G1VerifyRegionMarkingStateClosure : public HeapRegionClosure { +class G1VerifyRegionMarkingStateClosure : public G1HeapRegionClosure { class MarkedBytesClosure { size_t _marked_words; @@ -535,7 +535,7 @@ void G1HeapVerifier::verify_bitmap_clear(bool from_tams) { return; } - class G1VerifyBitmapClear : public HeapRegionClosure { + class G1VerifyBitmapClear : public G1HeapRegionClosure { bool _from_tams; public: @@ -557,7 +557,7 @@ void G1HeapVerifier::verify_bitmap_clear(bool from_tams) { } #ifndef PRODUCT -class G1VerifyCardTableCleanup: public HeapRegionClosure { +class G1VerifyCardTableCleanup: public G1HeapRegionClosure { G1HeapVerifier* _verifier; public: G1VerifyCardTableCleanup(G1HeapVerifier* verifier) @@ -603,11 +603,11 @@ void G1HeapVerifier::verify_dirty_region(G1HeapRegion* hr) { } } -class G1VerifyDirtyYoungListClosure : public HeapRegionClosure { +class G1VerifyDirtyYoungListClosure : public G1HeapRegionClosure { private: G1HeapVerifier* _verifier; public: - G1VerifyDirtyYoungListClosure(G1HeapVerifier* verifier) : HeapRegionClosure(), _verifier(verifier) { } + G1VerifyDirtyYoungListClosure(G1HeapVerifier* verifier) : G1HeapRegionClosure(), _verifier(verifier) { } virtual bool do_heap_region(G1HeapRegion* r) { _verifier->verify_dirty_region(r); return false; @@ -619,12 +619,12 @@ void G1HeapVerifier::verify_dirty_young_regions() { _g1h->collection_set()->iterate(&cl); } -class G1CheckRegionAttrTableClosure : public HeapRegionClosure { +class G1CheckRegionAttrTableClosure : public G1HeapRegionClosure { private: bool _failures; public: - G1CheckRegionAttrTableClosure() : HeapRegionClosure(), _failures(false) { } + G1CheckRegionAttrTableClosure() : G1HeapRegionClosure(), _failures(false) { } virtual bool do_heap_region(G1HeapRegion* hr) { uint i = hr->hrm_index(); diff --git a/src/hotspot/share/gc/g1/g1NUMA.cpp b/src/hotspot/share/gc/g1/g1NUMA.cpp index fd80bd52ce17e..923d3af621d70 100644 --- a/src/hotspot/share/gc/g1/g1NUMA.cpp +++ b/src/hotspot/share/gc/g1/g1NUMA.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -224,7 +224,7 @@ void G1NUMA::request_memory_on_node(void* aligned_address, size_t size_in_bytes, uint G1NUMA::max_search_depth() const { // Multiple of 3 is just random number to limit iterations. - // There would be some cases that 1 page may be consisted of multiple HeapRegions. + // There would be some cases that 1 page may be consisted of multiple heap regions. return 3 * MAX2((uint)(page_size() / region_size()), (uint)1) * num_active_nodes(); } diff --git a/src/hotspot/share/gc/g1/g1NUMA.hpp b/src/hotspot/share/gc/g1/g1NUMA.hpp index e9726fcad1b49..72d6702822bb1 100644 --- a/src/hotspot/share/gc/g1/g1NUMA.hpp +++ b/src/hotspot/share/gc/g1/g1NUMA.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -95,7 +95,7 @@ class G1NUMA: public CHeapObj<mtGC> { uint index_of_current_thread() const; // Returns the preferred index for the given G1HeapRegion index. - // This assumes that HeapRegions are evenly spit, so we can decide preferred index + // This assumes that heap regions are evenly spit, so we can decide preferred index // with the given G1HeapRegion index. // Result is less than num_active_nodes(). uint preferred_node_index_for_index(uint region_index) const; @@ -127,7 +127,7 @@ class G1NUMA: public CHeapObj<mtGC> { void print_statistics() const; }; -class G1NodeIndexCheckClosure : public HeapRegionClosure { +class G1NodeIndexCheckClosure : public G1HeapRegionClosure { const char* _desc; G1NUMA* _numa; // Records matched count of each node. diff --git a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp index 1d4a1d5ab8661..26cc88de0beb5 100644 --- a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp +++ b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -146,7 +146,7 @@ inline void G1ConcurrentRefineOopClosure::do_oop_work(T* p) { return; } - HeapRegionRemSet* to_rem_set = _g1h->heap_region_containing(obj)->rem_set(); + G1HeapRegionRemSet* to_rem_set = _g1h->heap_region_containing(obj)->rem_set(); assert(to_rem_set != nullptr, "Need per-region 'into' remsets."); if (to_rem_set->is_tracked()) { @@ -266,7 +266,7 @@ template <class T> void G1RebuildRemSetClosure::do_oop_work(T* p) { } G1HeapRegion* to = _g1h->heap_region_containing(obj); - HeapRegionRemSet* rem_set = to->rem_set(); + G1HeapRegionRemSet* rem_set = to->rem_set(); if (rem_set->is_tracked()) { rem_set->add_reference(p, _worker_id); } diff --git a/src/hotspot/share/gc/g1/g1RemSet.cpp b/src/hotspot/share/gc/g1/g1RemSet.cpp index 39c9c2c7a30e9..f2426cdfca5f9 100644 --- a/src/hotspot/share/gc/g1/g1RemSet.cpp +++ b/src/hotspot/share/gc/g1/g1RemSet.cpp @@ -365,7 +365,7 @@ class G1RemSetScanState : public CHeapObj<mtGC> { _next_dirty_regions = nullptr; } - void iterate_dirty_regions_from(HeapRegionClosure* cl, uint worker_id) { + void iterate_dirty_regions_from(G1HeapRegionClosure* cl, uint worker_id) { uint num_regions = _next_dirty_regions->size(); if (num_regions == 0) { @@ -481,7 +481,7 @@ class G1CardTableChunkClaimer { }; // Scans a heap region for dirty cards. -class G1ScanHRForRegionClosure : public HeapRegionClosure { +class G1ScanHRForRegionClosure : public G1HeapRegionClosure { using CardValue = CardTable::CardValue; G1CollectedHeap* _g1h; @@ -755,7 +755,7 @@ class G1ScanAndCountNMethodClosure : public NMethodClosure { // Heap region closure to be applied to all regions in the current collection set // increment to fix up non-card related roots. -class G1ScanCollectionSetRegionClosure : public HeapRegionClosure { +class G1ScanCollectionSetRegionClosure : public G1HeapRegionClosure { G1ParScanThreadState* _pss; G1RemSetScanState* _scan_state; @@ -972,13 +972,13 @@ class G1MergeHeapRootsTask : public WorkerTask { // Visitor for remembered sets. Several methods of it are called by a region's // card set iterator to drop card set remembered set entries onto the card. - // table. This is in addition to being the HeapRegionClosure to iterate over + // table. This is in addition to being the HG1eapRegionClosure to iterate over // all region's remembered sets. // // We add a small prefetching cache in front of the actual work as dropping // onto the card table is basically random memory access. This improves // performance of this operation significantly. - class G1MergeCardSetClosure : public HeapRegionClosure { + class G1MergeCardSetClosure : public G1HeapRegionClosure { friend class G1MergeCardSetCache; G1RemSetScanState* _scan_state; @@ -1074,7 +1074,7 @@ class G1MergeHeapRootsTask : public WorkerTask { void merge_card_set_for_region(G1HeapRegion* r) { assert(r->in_collection_set() || r->is_starts_humongous(), "must be"); - HeapRegionRemSet* rem_set = r->rem_set(); + G1HeapRegionRemSet* rem_set = r->rem_set(); if (!rem_set->is_empty()) { rem_set->iterate_for_merge(*this); } @@ -1098,7 +1098,7 @@ class G1MergeHeapRootsTask : public WorkerTask { // Closure to make sure that the marking bitmap is clear for any old region in // the collection set. // This is needed to be able to use the bitmap for evacuation failure handling. - class G1ClearBitmapClosure : public HeapRegionClosure { + class G1ClearBitmapClosure : public G1HeapRegionClosure { G1CollectedHeap* _g1h; void assert_bitmap_clear(G1HeapRegion* hr, const G1CMBitMap* bitmap) { @@ -1144,11 +1144,11 @@ class G1MergeHeapRootsTask : public WorkerTask { // Helper to allow two closure to be applied when // iterating through the collection set. - class G1CombinedClosure : public HeapRegionClosure { - HeapRegionClosure* _closure1; - HeapRegionClosure* _closure2; + class G1CombinedClosure : public G1HeapRegionClosure { + G1HeapRegionClosure* _closure1; + G1HeapRegionClosure* _closure2; public: - G1CombinedClosure(HeapRegionClosure* cl1, HeapRegionClosure* cl2) : + G1CombinedClosure(G1HeapRegionClosure* cl1, G1HeapRegionClosure* cl2) : _closure1(cl1), _closure2(cl2) { } @@ -1160,7 +1160,7 @@ class G1MergeHeapRootsTask : public WorkerTask { // Visitor for the remembered sets of humongous candidate regions to merge their // remembered set into the card table. - class G1FlushHumongousCandidateRemSets : public HeapRegionIndexClosure { + class G1FlushHumongousCandidateRemSets : public G1HeapRegionIndexClosure { G1MergeCardSetClosure _cl; public: diff --git a/src/hotspot/share/gc/g1/g1RemSet.hpp b/src/hotspot/share/gc/g1/g1RemSet.hpp index 65eabc312a6c5..0445ad185d3e9 100644 --- a/src/hotspot/share/gc/g1/g1RemSet.hpp +++ b/src/hotspot/share/gc/g1/g1RemSet.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,6 +42,7 @@ class CardTableBarrierSet; class G1AbstractSubTask; class G1CollectedHeap; class G1CMBitMap; +class G1HeapRegionClaimer; class G1RemSetScanState; class G1ParScanThreadState; class G1ParScanThreadStateSet; @@ -49,7 +50,6 @@ class G1Policy; class G1RemSetSamplingTask; class G1ScanCardClosure; class G1ServiceThread; -class HeapRegionClaimer; // A G1RemSet in which each heap region has a rem set that records the // external heap references into it. Uses a mod ref bs to track updates, diff --git a/src/hotspot/share/gc/g1/g1RemSetSummary.cpp b/src/hotspot/share/gc/g1/g1RemSetSummary.cpp index b8a0c709276cc..14fb8c0b8d273 100644 --- a/src/hotspot/share/gc/g1/g1RemSetSummary.cpp +++ b/src/hotspot/share/gc/g1/g1RemSetSummary.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -181,7 +181,7 @@ class RegionTypeCounter { }; -class HRRSStatsIter: public HeapRegionClosure { +class HRRSStatsIter: public G1HeapRegionClosure { private: RegionTypeCounter _young; RegionTypeCounter _humongous; @@ -216,9 +216,9 @@ class HRRSStatsIter: public HeapRegionClosure { {} bool do_heap_region(G1HeapRegion* r) { - HeapRegionRemSet* hrrs = r->rem_set(); + G1HeapRegionRemSet* hrrs = r->rem_set(); - // HeapRegionRemSet::mem_size() includes the + // G1HeapRegionRemSet::mem_size() includes the // size of the code roots size_t rs_unused_mem_sz = hrrs->unused_mem_size(); size_t rs_mem_sz = hrrs->mem_size(); @@ -274,19 +274,19 @@ class HRRSStatsIter: public HeapRegionClosure { } // Largest sized rem set region statistics - HeapRegionRemSet* rem_set = max_rs_mem_sz_region()->rem_set(); + G1HeapRegionRemSet* rem_set = max_rs_mem_sz_region()->rem_set(); out->print_cr(" Region with largest rem set = " HR_FORMAT ", " "size = " SIZE_FORMAT " occupied = " SIZE_FORMAT, HR_FORMAT_PARAMS(max_rs_mem_sz_region()), rem_set->mem_size(), rem_set->occupied()); - HeapRegionRemSet::print_static_mem_size(out); + G1HeapRegionRemSet::print_static_mem_size(out); G1CollectedHeap* g1h = G1CollectedHeap::heap(); g1h->card_set_freelist_pool()->print_on(out); // Code root statistics - HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region()->rem_set(); + G1HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region()->rem_set(); out->print_cr(" Total heap region code root sets sizes = " SIZE_FORMAT "%s." " Max = " SIZE_FORMAT "%s.", byte_size_in_proper_unit(total_code_root_mem_sz()), diff --git a/src/hotspot/share/gc/g1/g1YoungCollector.cpp b/src/hotspot/share/gc/g1/g1YoungCollector.cpp index d0d49fa6d4000..cadab2fbc489d 100644 --- a/src/hotspot/share/gc/g1/g1YoungCollector.cpp +++ b/src/hotspot/share/gc/g1/g1YoungCollector.cpp @@ -259,7 +259,7 @@ void G1YoungCollector::wait_for_root_region_scanning() { phase_times()->record_root_region_scan_wait_time(wait_time.seconds() * MILLIUNITS); } -class G1PrintCollectionSetClosure : public HeapRegionClosure { +class G1PrintCollectionSetClosure : public G1HeapRegionClosure { public: virtual bool do_heap_region(G1HeapRegion* r) { G1HeapRegionPrinter::cset(r); @@ -286,7 +286,7 @@ void G1YoungCollector::calculate_collection_set(G1EvacInfo* evacuation_info, dou } class G1PrepareEvacuationTask : public WorkerTask { - class G1PrepareRegionsClosure : public HeapRegionClosure { + class G1PrepareRegionsClosure : public G1HeapRegionClosure { G1CollectedHeap* _g1h; G1PrepareEvacuationTask* _parent_task; uint _worker_humongous_total; @@ -418,7 +418,7 @@ class G1PrepareEvacuationTask : public WorkerTask { }; G1CollectedHeap* _g1h; - HeapRegionClaimer _claimer; + G1HeapRegionClaimer _claimer; volatile uint _humongous_total; volatile uint _humongous_candidates; diff --git a/src/hotspot/share/gc/g1/g1YoungGCAllocationFailureInjector.cpp b/src/hotspot/share/gc/g1/g1YoungGCAllocationFailureInjector.cpp index 066f4353d4c0b..dcf42b31bb133 100644 --- a/src/hotspot/share/gc/g1/g1YoungGCAllocationFailureInjector.cpp +++ b/src/hotspot/share/gc/g1/g1YoungGCAllocationFailureInjector.cpp @@ -30,7 +30,7 @@ #if ALLOCATION_FAILURE_INJECTOR -class SelectAllocationFailureRegionClosure : public HeapRegionClosure { +class SelectAllocationFailureRegionClosure : public G1HeapRegionClosure { CHeapBitMap& _allocation_failure_regions; size_t _allocation_failure_regions_num; diff --git a/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp b/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp index 90c85250c05fa..c5ebdb3d22dd0 100644 --- a/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp +++ b/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -333,7 +333,7 @@ G1PostEvacuateCollectionSetCleanupTask1::G1PostEvacuateCollectionSetCleanupTask1 } } -class G1FreeHumongousRegionClosure : public HeapRegionIndexClosure { +class G1FreeHumongousRegionClosure : public G1HeapRegionIndexClosure { uint _humongous_objects_reclaimed; uint _humongous_regions_reclaimed; size_t _freed_bytes; @@ -537,9 +537,9 @@ class RedirtyLoggedCardTableEntryClosure : public G1CardTableEntryClosure { class G1PostEvacuateCollectionSetCleanupTask2::ProcessEvacuationFailedRegionsTask : public G1AbstractSubTask { G1EvacFailureRegions* _evac_failure_regions; - HeapRegionClaimer _claimer; + G1HeapRegionClaimer _claimer; - class ProcessEvacuationFailedRegionsClosure : public HeapRegionClosure { + class ProcessEvacuationFailedRegionsClosure : public G1HeapRegionClosure { public: bool do_heap_region(G1HeapRegion* r) override { @@ -706,7 +706,7 @@ class FreeCSetStats { }; // Closure applied to all regions in the collection set. -class FreeCSetClosure : public HeapRegionClosure { +class FreeCSetClosure : public G1HeapRegionClosure { // Helper to send JFR events for regions. class JFREventForRegion { EventGCPhaseParallel _event; @@ -807,7 +807,7 @@ class FreeCSetClosure : public HeapRegionClosure { uint worker_id, FreeCSetStats* stats, G1EvacFailureRegions* evac_failure_regions) : - HeapRegionClosure(), + G1HeapRegionClosure(), _g1h(G1CollectedHeap::heap()), _surviving_young_words(surviving_young_words), _worker_id(worker_id), @@ -853,14 +853,14 @@ class FreeCSetClosure : public HeapRegionClosure { }; class G1PostEvacuateCollectionSetCleanupTask2::FreeCollectionSetTask : public G1AbstractSubTask { - G1CollectedHeap* _g1h; - G1EvacInfo* _evacuation_info; - FreeCSetStats* _worker_stats; - HeapRegionClaimer _claimer; - const size_t* _surviving_young_words; - uint _active_workers; + G1CollectedHeap* _g1h; + G1EvacInfo* _evacuation_info; + FreeCSetStats* _worker_stats; + G1HeapRegionClaimer _claimer; + const size_t* _surviving_young_words; + uint _active_workers; G1EvacFailureRegions* _evac_failure_regions; - volatile uint _num_retained_regions; + volatile uint _num_retained_regions; FreeCSetStats* worker_stats(uint worker) { return &_worker_stats[worker]; diff --git a/src/hotspot/share/gc/g1/jvmFlagConstraintsG1.cpp b/src/hotspot/share/gc/g1/jvmFlagConstraintsG1.cpp index 46c850cb643a4..0a29caed8ccd8 100644 --- a/src/hotspot/share/gc/g1/jvmFlagConstraintsG1.cpp +++ b/src/hotspot/share/gc/g1/jvmFlagConstraintsG1.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,7 +81,7 @@ JVMFlag::Error G1HeapRegionSizeConstraintFunc(size_t value, bool verbose) { if (!UseG1GC) return JVMFlag::SUCCESS; // Default value of G1HeapRegionSize=0 means will be set ergonomically. - if (FLAG_IS_CMDLINE(G1HeapRegionSize) && (value < HeapRegionBounds::min_size())) { + if (FLAG_IS_CMDLINE(G1HeapRegionSize) && (value < G1HeapRegionBounds::min_size())) { JVMFlag::printError(verbose, "G1HeapRegionSize (" SIZE_FORMAT ") must be " "greater than or equal to ergonomic heap region minimum size\n", @@ -180,7 +180,7 @@ JVMFlag::Error NewSizeConstraintFuncG1(size_t value, bool verbose) { } size_t MaxSizeForHeapAlignmentG1() { - return HeapRegionBounds::max_size(); + return G1HeapRegionBounds::max_size(); } static JVMFlag::Error buffer_size_constraint_helper(JVMFlagsEnum flagid, diff --git a/src/hotspot/share/gc/g1/vmStructs_g1.hpp b/src/hotspot/share/gc/g1/vmStructs_g1.hpp index ec0db2d978215..22c4cfc584aba 100644 --- a/src/hotspot/share/gc/g1/vmStructs_g1.hpp +++ b/src/hotspot/share/gc/g1/vmStructs_g1.hpp @@ -37,13 +37,13 @@ static_field(G1HeapRegion, GrainBytes, size_t) \ static_field(G1HeapRegion, LogOfHRGrainBytes, uint) \ \ - nonstatic_field(G1HeapRegion, _type, HeapRegionType) \ + nonstatic_field(G1HeapRegion, _type, G1HeapRegionType) \ nonstatic_field(G1HeapRegion, _bottom, HeapWord* const) \ nonstatic_field(G1HeapRegion, _top, HeapWord* volatile) \ nonstatic_field(G1HeapRegion, _end, HeapWord* const) \ volatile_nonstatic_field(G1HeapRegion, _pinned_object_count, size_t) \ \ - nonstatic_field(HeapRegionType, _tag, HeapRegionType::Tag volatile) \ + nonstatic_field(G1HeapRegionType, _tag, G1HeapRegionType::Tag volatile) \ \ \ nonstatic_field(G1HeapRegionTable, _base, address) \ @@ -52,13 +52,13 @@ nonstatic_field(G1HeapRegionTable, _bias, size_t) \ nonstatic_field(G1HeapRegionTable, _shift_by, uint) \ \ - nonstatic_field(HeapRegionManager, _regions, G1HeapRegionTable) \ + nonstatic_field(G1HeapRegionManager, _regions, G1HeapRegionTable) \ \ volatile_nonstatic_field(G1CollectedHeap, _summary_bytes_used, size_t) \ - nonstatic_field(G1CollectedHeap, _hrm, HeapRegionManager) \ + nonstatic_field(G1CollectedHeap, _hrm, G1HeapRegionManager) \ nonstatic_field(G1CollectedHeap, _monitoring_support, G1MonitoringSupport*) \ - nonstatic_field(G1CollectedHeap, _old_set, HeapRegionSetBase) \ - nonstatic_field(G1CollectedHeap, _humongous_set, HeapRegionSetBase) \ + nonstatic_field(G1CollectedHeap, _old_set, G1HeapRegionSetBase) \ + nonstatic_field(G1CollectedHeap, _humongous_set, G1HeapRegionSetBase) \ \ nonstatic_field(G1MonitoringSupport, _eden_space_committed, size_t) \ nonstatic_field(G1MonitoringSupport, _eden_space_used, size_t) \ @@ -67,21 +67,21 @@ nonstatic_field(G1MonitoringSupport, _old_gen_committed, size_t) \ nonstatic_field(G1MonitoringSupport, _old_gen_used, size_t) \ \ - nonstatic_field(HeapRegionSetBase, _length, uint) \ + nonstatic_field(G1HeapRegionSetBase, _length, uint) \ \ nonstatic_field(SATBMarkQueue, _active, bool) \ nonstatic_field(PtrQueue, _buf, void**) \ nonstatic_field(PtrQueue, _index, size_t) #define VM_INT_CONSTANTS_G1GC(declare_constant, declare_constant_with_value) \ - declare_constant(HeapRegionType::FreeTag) \ - declare_constant(HeapRegionType::YoungMask) \ - declare_constant(HeapRegionType::EdenTag) \ - declare_constant(HeapRegionType::SurvTag) \ - declare_constant(HeapRegionType::HumongousMask) \ - declare_constant(HeapRegionType::StartsHumongousTag) \ - declare_constant(HeapRegionType::ContinuesHumongousTag) \ - declare_constant(HeapRegionType::OldMask) \ + declare_constant(G1HeapRegionType::FreeTag) \ + declare_constant(G1HeapRegionType::YoungMask) \ + declare_constant(G1HeapRegionType::EdenTag) \ + declare_constant(G1HeapRegionType::SurvTag) \ + declare_constant(G1HeapRegionType::HumongousMask) \ + declare_constant(G1HeapRegionType::StartsHumongousTag) \ + declare_constant(G1HeapRegionType::ContinuesHumongousTag) \ + declare_constant(G1HeapRegionType::OldMask) \ declare_constant(BarrierSet::G1BarrierSet) \ declare_constant(G1CardTable::g1_young_gen) @@ -94,11 +94,11 @@ declare_type(G1CollectedHeap, CollectedHeap) \ \ declare_toplevel_type(G1HeapRegion) \ - declare_toplevel_type(HeapRegionManager) \ - declare_toplevel_type(HeapRegionSetBase) \ + declare_toplevel_type(G1HeapRegionManager) \ + declare_toplevel_type(G1HeapRegionSetBase) \ declare_toplevel_type(G1MonitoringSupport) \ declare_toplevel_type(PtrQueue) \ - declare_toplevel_type(HeapRegionType) \ + declare_toplevel_type(G1HeapRegionType) \ declare_toplevel_type(SATBMarkQueue) \ declare_toplevel_type(G1DirtyCardQueue) \ \ @@ -106,6 +106,6 @@ declare_toplevel_type(G1HeapRegion*) \ declare_toplevel_type(G1MonitoringSupport*) \ \ - declare_integer_type(HeapRegionType::Tag volatile) + declare_integer_type(G1HeapRegionType::Tag volatile) #endif // SHARE_GC_G1_VMSTRUCTS_G1_HPP diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index c480f8a09ac1c..a799d5b5de42d 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -608,7 +608,7 @@ WB_ENTRY(jintArray, WB_G1MemoryNodeIds(JNIEnv* env, jobject o)) THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1MemoryNodeIds: G1 GC is not enabled"); WB_END -class OldRegionsLivenessClosure: public HeapRegionClosure { +class OldRegionsLivenessClosure: public G1HeapRegionClosure { private: const int _liveness; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java index 16e91d0a0cdec..a68b8b596b45a 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java @@ -30,8 +30,8 @@ import sun.jvm.hotspot.utilities.Observer; import sun.jvm.hotspot.debugger.Address; -import sun.jvm.hotspot.gc.g1.HeapRegionClosure; -import sun.jvm.hotspot.gc.g1.PrintRegionClosure; +import sun.jvm.hotspot.gc.g1.G1HeapRegionClosure; +import sun.jvm.hotspot.gc.g1.G1PrintRegionClosure; import sun.jvm.hotspot.gc.shared.CollectedHeap; import sun.jvm.hotspot.gc.shared.CollectedHeapName; import sun.jvm.hotspot.gc.shared.LiveRegionsClosure; @@ -47,7 +47,7 @@ // Mirror class for G1CollectedHeap. public class G1CollectedHeap extends CollectedHeap { - // HeapRegionManager _hrm; + // G1HeapRegionManager _hrm; private static long hrmFieldOffset; // MemRegion _g1_reserved; private static long g1ReservedFieldOffset; @@ -55,9 +55,9 @@ public class G1CollectedHeap extends CollectedHeap { private static CIntegerField summaryBytesUsedField; // G1MonitoringSupport* _monitoring_support; private static AddressField monitoringSupportField; - // HeapRegionSet _old_set; + // G1HeapRegionSet _old_set; private static long oldSetFieldOffset; - // HeapRegionSet _humongous_set; + // G1HeapRegionSet _humongous_set; private static long humongousSetFieldOffset; static { @@ -90,9 +90,9 @@ public long n_regions() { return hrm().length(); } - public HeapRegionManager hrm() { + public G1HeapRegionManager hrm() { Address hrmAddr = addr.addOffsetTo(hrmFieldOffset); - return VMObjectFactory.newObject(HeapRegionManager.class, hrmAddr); + return VMObjectFactory.newObject(G1HeapRegionManager.class, hrmAddr); } public G1MonitoringSupport monitoringSupport() { @@ -100,21 +100,21 @@ public G1MonitoringSupport monitoringSupport() { return VMObjectFactory.newObject(G1MonitoringSupport.class, monitoringSupportAddr); } - public HeapRegionSetBase oldSet() { + public G1HeapRegionSetBase oldSet() { Address oldSetAddr = addr.addOffsetTo(oldSetFieldOffset); - return VMObjectFactory.newObject(HeapRegionSetBase.class, oldSetAddr); + return VMObjectFactory.newObject(G1HeapRegionSetBase.class, oldSetAddr); } - public HeapRegionSetBase humongousSet() { + public G1HeapRegionSetBase humongousSet() { Address humongousSetAddr = addr.addOffsetTo(humongousSetFieldOffset); - return VMObjectFactory.newObject(HeapRegionSetBase.class, humongousSetAddr); + return VMObjectFactory.newObject(G1HeapRegionSetBase.class, humongousSetAddr); } private Iterator<G1HeapRegion> heapRegionIterator() { return hrm().heapRegionIterator(); } - public void heapRegionIterate(HeapRegionClosure hrcl) { + public void heapRegionIterate(G1HeapRegionClosure hrcl) { Iterator<G1HeapRegion> iter = heapRegionIterator(); while (iter.hasNext()) { G1HeapRegion hr = iter.next(); @@ -159,7 +159,7 @@ public void printOn(PrintStream tty) { } public void printRegionDetails(PrintStream tty) { - PrintRegionClosure prc = new PrintRegionClosure(tty); + G1PrintRegionClosure prc = new G1PrintRegionClosure(tty); heapRegionIterate(prc); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegion.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegion.java index ef270ba5671b7..5cf9b3c3b7586 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegion.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegion.java @@ -55,7 +55,7 @@ public class G1HeapRegion extends ContiguousSpace implements LiveRegionsProvider private static long typeFieldOffset; private static long pointerSize; - private HeapRegionType type; + private G1HeapRegionType type; static { VM.registerVMInitializedObserver(new Observer() { @@ -88,7 +88,7 @@ public G1HeapRegion(Address addr) { super(addr); Address typeAddr = (addr instanceof OopHandle) ? addr.addOffsetToAsOopHandle(typeFieldOffset) : addr.addOffsetTo(typeFieldOffset); - type = VMObjectFactory.newObject(HeapRegionType.class, typeAddr); + type = VMObjectFactory.newObject(G1HeapRegionType.class, typeAddr); } public Address bottom() { return bottomField.getValue(addr); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionClosure.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionClosure.java similarity index 89% rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionClosure.java rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionClosure.java index d63679d309957..4203e6952f8d7 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionClosure.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionClosure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,6 @@ package sun.jvm.hotspot.gc.g1; -public interface HeapRegionClosure { +public interface G1HeapRegionClosure { public void doHeapRegion(G1HeapRegion hr); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionManager.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionManager.java similarity index 92% rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionManager.java rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionManager.java index d79723c2c80f5..d1e2a4687314c 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionManager.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionManager.java @@ -37,9 +37,9 @@ import sun.jvm.hotspot.types.Type; import sun.jvm.hotspot.types.TypeDataBase; -// Mirror class for HeapRegionManager. +// Mirror class for G1HeapRegionManager. -public class HeapRegionManager extends VMObject { +public class G1HeapRegionManager extends VMObject { // G1HeapRegionTable _regions private static long regionsFieldOffset; @@ -52,7 +52,7 @@ public void update(Observable o, Object data) { } private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("HeapRegionManager"); + Type type = db.lookupType("G1HeapRegionManager"); regionsFieldOffset = type.getField("_regions").getOffset(); } @@ -74,7 +74,7 @@ public Iterator<G1HeapRegion> heapRegionIterator() { return regions().heapRegionIterator(length()); } - public HeapRegionManager(Address addr) { + public G1HeapRegionManager(Address addr) { super(addr); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionSetBase.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionSetBase.java similarity index 90% rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionSetBase.java rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionSetBase.java index 7cfcf938d9ecc..5d44c46d01388 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionSetBase.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionSetBase.java @@ -37,9 +37,9 @@ import sun.jvm.hotspot.types.Type; import sun.jvm.hotspot.types.TypeDataBase; -// Mirror class for HeapRegionSetBase. Represents a group of regions. +// Mirror class for G1HeapRegionSetBase. Represents a group of regions. -public class HeapRegionSetBase extends VMObject { +public class G1HeapRegionSetBase extends VMObject { // uint _length private static CIntegerField lengthField; @@ -53,7 +53,7 @@ public void update(Observable o, Object data) { } private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("HeapRegionSetBase"); + Type type = db.lookupType("G1HeapRegionSetBase"); lengthField = type.getCIntegerField("_length"); } @@ -62,7 +62,7 @@ public long length() { return lengthField.getValue(addr); } - public HeapRegionSetBase(Address addr) { + public G1HeapRegionSetBase(Address addr) { super(addr); } } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionType.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionType.java similarity index 79% rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionType.java rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionType.java index 1e5787849005a..e5536bbe70390 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionType.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,10 +33,10 @@ import sun.jvm.hotspot.types.Type; import sun.jvm.hotspot.types.TypeDataBase; -// Mirror class for HeapRegionType. Currently we don't actually include +// Mirror class for G1HeapRegionType. Currently we don't actually include // any of its fields but only iterate over it. -public class HeapRegionType extends VMObject { +public class G1HeapRegionType extends VMObject { private static int freeTag; private static int youngMask; @@ -58,18 +58,18 @@ public void update(Observable o, Object data) { } private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("HeapRegionType"); + Type type = db.lookupType("G1HeapRegionType"); tagField = type.getCIntegerField("_tag"); - freeTag = db.lookupIntConstant("HeapRegionType::FreeTag"); - youngMask = db.lookupIntConstant("HeapRegionType::YoungMask"); - edenTag = db.lookupIntConstant("HeapRegionType::EdenTag"); - survTag = db.lookupIntConstant("HeapRegionType::SurvTag"); - startsHumongousTag = db.lookupIntConstant("HeapRegionType::StartsHumongousTag"); - continuesHumongousTag = db.lookupIntConstant("HeapRegionType::ContinuesHumongousTag"); - humongousMask = db.lookupIntConstant("HeapRegionType::HumongousMask"); - oldMask = db.lookupIntConstant("HeapRegionType::OldMask"); + freeTag = db.lookupIntConstant("G1HeapRegionType::FreeTag"); + youngMask = db.lookupIntConstant("G1HeapRegionType::YoungMask"); + edenTag = db.lookupIntConstant("G1HeapRegionType::EdenTag"); + survTag = db.lookupIntConstant("G1HeapRegionType::SurvTag"); + startsHumongousTag = db.lookupIntConstant("G1HeapRegionType::StartsHumongousTag"); + continuesHumongousTag = db.lookupIntConstant("G1HeapRegionType::ContinuesHumongousTag"); + humongousMask = db.lookupIntConstant("G1HeapRegionType::HumongousMask"); + oldMask = db.lookupIntConstant("G1HeapRegionType::OldMask"); } public boolean isFree() { @@ -104,7 +104,7 @@ public boolean isOld() { return (tagField.getValue(addr) & oldMask) != 0; } - public HeapRegionType(Address addr) { + public G1HeapRegionType(Address addr) { super(addr); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/PrintRegionClosure.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1PrintRegionClosure.java similarity index 91% rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/PrintRegionClosure.java rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1PrintRegionClosure.java index fb777f35167c5..340f40e288d5f 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/PrintRegionClosure.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1PrintRegionClosure.java @@ -27,10 +27,10 @@ import java.io.PrintStream; import sun.jvm.hotspot.gc.g1.G1HeapRegion; -public class PrintRegionClosure implements HeapRegionClosure { +public class G1PrintRegionClosure implements G1HeapRegionClosure { private PrintStream tty; - public PrintRegionClosure(PrintStream tty) { + public G1PrintRegionClosure(PrintStream tty) { this.tty = tty; } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java index 22eb627d39ff5..86a1216bbd3d4 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java @@ -252,8 +252,8 @@ public void printG1HeapSummary(PrintStream tty, G1CollectedHeap g1h) { G1MonitoringSupport monitoringSupport = g1h.monitoringSupport(); long edenSpaceRegionNum = monitoringSupport.edenSpaceRegionNum(); long survivorSpaceRegionNum = monitoringSupport.survivorSpaceRegionNum(); - HeapRegionSetBase oldSet = g1h.oldSet(); - HeapRegionSetBase humongousSet = g1h.humongousSet(); + G1HeapRegionSetBase oldSet = g1h.oldSet(); + G1HeapRegionSetBase humongousSet = g1h.humongousSet(); long oldGenRegionNum = oldSet.length() + humongousSet.length(); printG1Space(tty, "G1 Heap:", g1h.n_regions(), g1h.used(), g1h.capacity()); diff --git a/test/hotspot/gtest/gc/g1/test_freeRegionList.cpp b/test/hotspot/gtest/gc/g1/test_freeRegionList.cpp index 60ebf3c72082a..bc45626deecb0 100644 --- a/test/hotspot/gtest/gc/g1/test_freeRegionList.cpp +++ b/test/hotspot/gtest/gc/g1/test_freeRegionList.cpp @@ -34,12 +34,12 @@ #include "unittest.hpp" // @requires UseG1GC -TEST_OTHER_VM(FreeRegionList, length) { +TEST_OTHER_VM(G1FreeRegionList, length) { if (!UseG1GC) { return; } - FreeRegionList l("test"); + G1FreeRegionList l("test"); const uint num_regions_in_test = 5; // Create a fake heap. It does not need to be valid, as the G1HeapRegion constructor diff --git a/test/hotspot/gtest/gc/g1/test_g1CardSetContainers.cpp b/test/hotspot/gtest/gc/g1/test_g1CardSetContainers.cpp index 21ae6e9c1da04..fcc3053bd851e 100644 --- a/test/hotspot/gtest/gc/g1/test_g1CardSetContainers.cpp +++ b/test/hotspot/gtest/gc/g1/test_g1CardSetContainers.cpp @@ -236,8 +236,8 @@ void G1CardSetContainersTest::cardset_bitmap_test(uint threshold, uint size_in_b } TEST_VM_F(G1CardSetContainersTest, basic_cardset_inptr_test) { - uint const min = (uint)log2i(HeapRegionBounds::min_size()); - uint const max = (uint)log2i(HeapRegionBounds::max_size()); + uint const min = (uint)log2i(G1HeapRegionBounds::min_size()); + uint const max = (uint)log2i(G1HeapRegionBounds::max_size()); for (uint i = min; i <= max; i++) { G1CardSetContainersTest::cardset_inlineptr_test(i - CardTable::card_shift()); diff --git a/test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp b/test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp index feb5f58bbde52..f9075f27bd48f 100644 --- a/test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp +++ b/test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp @@ -62,7 +62,7 @@ static void generate_random_map(G1CommittedRegionMap* map) { static void random_deactivate(G1CommittedRegionMap* map) { uint current_offset = 0; do { - HeapRegionRange current = map->next_active_range(current_offset); + G1HeapRegionRange current = map->next_active_range(current_offset); if (mutate()) { if (current.length() < 5) { // For short ranges, deactivate whole. @@ -79,7 +79,7 @@ static void random_deactivate(G1CommittedRegionMap* map) { static void random_uncommit_or_reactive(G1CommittedRegionMap* map) { uint current_offset = 0; do { - HeapRegionRange current = map->next_inactive_range(current_offset); + G1HeapRegionRange current = map->next_inactive_range(current_offset); // Randomly either reactivate or uncommit if (mutate()) { map->reactivate(current.start(), current.end()); @@ -94,7 +94,7 @@ static void random_uncommit_or_reactive(G1CommittedRegionMap* map) { static void random_activate_free(G1CommittedRegionMap* map) { uint current_offset = 0; do { - HeapRegionRange current = map->next_committable_range(current_offset); + G1HeapRegionRange current = map->next_committable_range(current_offset); // Randomly either reactivate or uncommit if (mutate()) { if (current.length() < 5) { From 6409ec336af647044d0746c219496ad070de5e9d Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Fri, 5 Jul 2024 08:43:27 +0000 Subject: [PATCH 312/471] 8335711: G1: Remove unused bot_updates argument in G1AllocRegion constructor Reviewed-by: iwalulya, tschatzl --- src/hotspot/share/gc/g1/g1AllocRegion.cpp | 4 +--- src/hotspot/share/gc/g1/g1AllocRegion.hpp | 12 ++++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1AllocRegion.cpp b/src/hotspot/share/gc/g1/g1AllocRegion.cpp index c4ab81cda8fc4..b06f8fd32235f 100644 --- a/src/hotspot/share/gc/g1/g1AllocRegion.cpp +++ b/src/hotspot/share/gc/g1/g1AllocRegion.cpp @@ -236,9 +236,7 @@ void G1AllocRegion::trace(const char* str, size_t min_word_size, size_t desired_ } #endif // PRODUCT -G1AllocRegion::G1AllocRegion(const char* name, - bool bot_updates, - uint node_index) +G1AllocRegion::G1AllocRegion(const char* name, uint node_index) : _alloc_region(nullptr), _count(0), _name(name), diff --git a/src/hotspot/share/gc/g1/g1AllocRegion.hpp b/src/hotspot/share/gc/g1/g1AllocRegion.hpp index 391ded283885f..4d2d18dd6b8c3 100644 --- a/src/hotspot/share/gc/g1/g1AllocRegion.hpp +++ b/src/hotspot/share/gc/g1/g1AllocRegion.hpp @@ -118,7 +118,7 @@ class G1AllocRegion : public CHeapObj<mtGC> { virtual G1HeapRegion* allocate_new_region(size_t word_size) = 0; virtual void retire_region(G1HeapRegion* alloc_region) = 0; - G1AllocRegion(const char* name, bool bot_updates, uint node_index); + G1AllocRegion(const char* name, uint node_index); public: static void setup(G1CollectedHeap* g1h, G1HeapRegion* dummy_region); @@ -188,7 +188,7 @@ class MutatorAllocRegion : public G1AllocRegion { size_t retire(bool fill_up) override; public: MutatorAllocRegion(uint node_index) - : G1AllocRegion("Mutator Alloc Region", false /* bot_updates */, node_index), + : G1AllocRegion("Mutator Alloc Region", node_index), _wasted_bytes(0), _retained_alloc_region(nullptr) { } @@ -228,9 +228,9 @@ class G1GCAllocRegion : public G1AllocRegion { size_t retire(bool fill_up) override; - G1GCAllocRegion(const char* name, bool bot_updates, G1EvacStats* stats, + G1GCAllocRegion(const char* name, G1EvacStats* stats, G1HeapRegionAttr::region_type_t purpose, uint node_index = G1NUMA::AnyNodeIndex) - : G1AllocRegion(name, bot_updates, node_index), _used_bytes_before(0), _stats(stats), _purpose(purpose) { + : G1AllocRegion(name, node_index), _used_bytes_before(0), _stats(stats), _purpose(purpose) { assert(stats != nullptr, "Must pass non-null PLAB statistics"); } public: @@ -243,13 +243,13 @@ class G1GCAllocRegion : public G1AllocRegion { class SurvivorGCAllocRegion : public G1GCAllocRegion { public: SurvivorGCAllocRegion(G1EvacStats* stats, uint node_index) - : G1GCAllocRegion("Survivor GC Alloc Region", false /* bot_updates */, stats, G1HeapRegionAttr::Young, node_index) { } + : G1GCAllocRegion("Survivor GC Alloc Region", stats, G1HeapRegionAttr::Young, node_index) { } }; class OldGCAllocRegion : public G1GCAllocRegion { public: OldGCAllocRegion(G1EvacStats* stats) - : G1GCAllocRegion("Old GC Alloc Region", true /* bot_updates */, stats, G1HeapRegionAttr::Old) { } + : G1GCAllocRegion("Old GC Alloc Region", stats, G1HeapRegionAttr::Old) { } }; #endif // SHARE_GC_G1_G1ALLOCREGION_HPP From bdf470b3b8f8814cb29f2877490d5bc1e79bdecb Mon Sep 17 00:00:00 2001 From: Thomas Schatzl <tschatzl@openjdk.org> Date: Fri, 5 Jul 2024 09:06:37 +0000 Subject: [PATCH 313/471] 8335742: Problemlist gc/g1/TestMixedGCLiveThreshold.java#25percent with virtual threads Reviewed-by: aboldtch, kbarrett --- test/hotspot/jtreg/ProblemList-Virtual.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/hotspot/jtreg/ProblemList-Virtual.txt b/test/hotspot/jtreg/ProblemList-Virtual.txt index e7627be7b8c0b..ac35f60e66153 100644 --- a/test/hotspot/jtreg/ProblemList-Virtual.txt +++ b/test/hotspot/jtreg/ProblemList-Virtual.txt @@ -86,6 +86,11 @@ vmTestbase/nsk/jdi/ExceptionEvent/catchLocation/location002/TestDescription.java vmTestbase/nsk/jdi/VMOutOfMemoryException/VMOutOfMemoryException001/VMOutOfMemoryException001.java 8285417 generic-all +### +# Fails on Windows because of additional memory allocation. + +gc/g1/TestMixedGCLiveThreshold.java#25percent JDK-8334759 windows-x64 + ########## ## Tests incompatible with with virtual test thread factory. ## There is no goal to run all test with virtual test thread factory. From c8acea87e2c5ba6672c011ec4e57a53c55fee74b Mon Sep 17 00:00:00 2001 From: Ivan Walulya <iwalulya@openjdk.org> Date: Fri, 5 Jul 2024 09:10:30 +0000 Subject: [PATCH 314/471] 8335706: G1: Remove unused G1ConcurrentRefine::RemSetSamplingClosure::_cset Reviewed-by: ayang, tschatzl --- src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp index b51d0cdf84aee..7d6cc9a41cb64 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp @@ -254,13 +254,12 @@ uint64_t G1ConcurrentRefine::adjust_threads_wait_ms() const { } class G1ConcurrentRefine::RemSetSamplingClosure : public G1HeapRegionClosure { - G1CollectionSet* _cset; size_t _sampled_card_rs_length; size_t _sampled_code_root_rs_length; public: - explicit RemSetSamplingClosure(G1CollectionSet* cset) : - _cset(cset), _sampled_card_rs_length(0), _sampled_code_root_rs_length(0) {} + RemSetSamplingClosure() : + _sampled_card_rs_length(0), _sampled_code_root_rs_length(0) {} bool do_heap_region(G1HeapRegion* r) override { G1HeapRegionRemSet* rem_set = r->rem_set(); @@ -287,8 +286,8 @@ class G1ConcurrentRefine::RemSetSamplingClosure : public G1HeapRegionClosure { // gen size to keep pause time length goal. void G1ConcurrentRefine::adjust_young_list_target_length() { if (_policy->use_adaptive_young_list_length()) { + RemSetSamplingClosure cl; G1CollectionSet* cset = G1CollectedHeap::heap()->collection_set(); - RemSetSamplingClosure cl{cset}; cset->iterate(&cl); _policy->revise_young_list_target_length(cl.sampled_card_rs_length(), cl.sampled_code_root_rs_length()); } From 194425d7875ef42fce52516ed59c81ee97720399 Mon Sep 17 00:00:00 2001 From: Shaojin Wen <shaojin.wensj@alibaba-inc.com> Date: Fri, 5 Jul 2024 12:50:09 +0000 Subject: [PATCH 315/471] 8335645: j.u.Formatter#trailingZeros improved with String repeat Reviewed-by: liach, jlu, naoto --- src/java.base/share/classes/java/util/Formatter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/Formatter.java b/src/java.base/share/classes/java/util/Formatter.java index 41b9540001c83..dfdb77cc6ace2 100644 --- a/src/java.base/share/classes/java/util/Formatter.java +++ b/src/java.base/share/classes/java/util/Formatter.java @@ -4249,8 +4249,8 @@ private int adjustWidth(int width, int flags, boolean neg) { // Add trailing zeros private void trailingZeros(StringBuilder sb, int nzeros) { - for (int i = 0; i < nzeros; i++) { - sb.append('0'); + if (nzeros > 0) { + sb.repeat('0', nzeros); } } From ff49f677ee5017019c90823bc412ceb90068ffbd Mon Sep 17 00:00:00 2001 From: Severin Gehwolf <sgehwolf@openjdk.org> Date: Fri, 5 Jul 2024 13:44:35 +0000 Subject: [PATCH 316/471] 8335775: Remove extraneous 's' in comment of rawmonitor.cpp test file Reviewed-by: gdams, stuefe --- .../nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp index 11ef7e18d7bd9..6ee955ae420dd 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp @@ -1,5 +1,4 @@ /* -s * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * From 7efe16038e5df9894a265ea1214068060f595c4e Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Fri, 5 Jul 2024 16:44:41 +0000 Subject: [PATCH 317/471] 8335730: JFR: Clean up jdk.jfr Reviewed-by: mgronlun --- .../share/classes/jdk/jfr/consumer/RecordedClass.java | 4 ++-- .../share/classes/jdk/jfr/consumer/RecordedFrame.java | 6 +++--- .../share/classes/jdk/jfr/consumer/RecordedMethod.java | 4 ++-- .../share/classes/jdk/jfr/consumer/RecordedObject.java | 5 ++++- .../share/classes/jdk/jfr/consumer/RecordedThread.java | 6 +++--- .../jdk/jfr/events/AbstractBufferStatisticsEvent.java | 4 ++-- .../classes/jdk/jfr/events/ActiveRecordingEvent.java | 1 - .../share/classes/jdk/jfr/events/ActiveSettingEvent.java | 1 - .../classes/jdk/jfr/events/ExceptionStatisticsEvent.java | 1 - .../share/classes/jdk/jfr/internal/EventControl.java | 1 - .../classes/jdk/jfr/internal/MetadataRepository.java | 2 -- .../share/classes/jdk/jfr/internal/OldObjectSample.java | 3 +-- .../share/classes/jdk/jfr/internal/RepositoryChunk.java | 5 +---- .../share/classes/jdk/jfr/internal/ShutdownHook.java | 2 -- .../classes/jdk/jfr/internal/dcmd/QueryRecording.java | 7 +------ src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java | 4 ++-- .../classes/jdk/jfr/internal/jfc/model/XmlSetting.java | 4 ++-- src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java | 4 ++-- .../share/classes/jdk/jfr/internal/query/TableSorter.java | 5 +---- .../classes/jdk/jfr/internal/settings/LevelSetting.java | 4 ++-- .../share/classes/jdk/jfr/internal/tool/Disassemble.java | 8 ++++---- .../share/classes/jdk/jfr/internal/tool/PrettyWriter.java | 3 +-- src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java | 3 +-- .../share/classes/jdk/jfr/internal/util/ValueParser.java | 4 ++-- 24 files changed, 36 insertions(+), 55 deletions(-) diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedClass.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedClass.java index 8d6b5647f2f58..d0ae1e7d297e1 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedClass.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ public final class RecordedClass extends RecordedObject { * @see java.lang.reflect.Modifier */ public int getModifiers() { - return getTyped("modifiers", Integer.class, -1); + return getTyped("modifiers", Integer.class, INTEGER_MINUS_ONE); } /** diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedFrame.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedFrame.java index 9640330fca2fc..cdb893274acd0 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedFrame.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedFrame.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,7 +65,7 @@ public boolean isJavaFrame() { * @return byte code index, or {@code -1} if doesn't exist */ public int getBytecodeIndex() { - return getTyped("bytecodeIndex", Integer.class, Integer.valueOf(-1)); + return getTyped("bytecodeIndex", Integer.class, INTEGER_MINUS_ONE); } /** @@ -75,7 +75,7 @@ public int getBytecodeIndex() { * @return the line number, or {@code -1} if doesn't exist */ public int getLineNumber() { - return getTyped("lineNumber", Integer.class, Integer.valueOf(-1)); + return getTyped("lineNumber", Integer.class, INTEGER_MINUS_ONE); } /** diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedMethod.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedMethod.java index a82b43ffc363b..6c8f23aa02a86 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedMethod.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -94,7 +94,7 @@ public String getDescriptor() { * @see RecordedFrame#isJavaFrame */ public int getModifiers() { - return getTyped("modifiers", Integer.class, Integer.valueOf(0)); + return getTyped("modifiers", Integer.class, INTEGER_ZERO); } /** diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java index e5825b8ea07c5..21bd30a8248d1 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -154,6 +154,9 @@ public MetadataEvent newMetadataEvent(List<EventType> previous, List<EventType> private static final record UnsignedValue(Object value) { } + static final Integer INTEGER_MINUS_ONE = Integer.valueOf(-1); + static final Integer INTEGER_ZERO = Integer.valueOf(0); + static final Long LONG_MINUS_ONE = Long.valueOf(-1L); final Object[] objects; final ObjectContext objectContext; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedThread.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedThread.java index 4031e70d24b56..d12d65faf10ea 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedThread.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ public long getOSThreadId() { if (isVirtual()) { return -1L; } - Long l = getTyped("osThreadId", Long.class, -1L); + Long l = getTyped("osThreadId", Long.class, LONG_MINUS_ONE); return l.longValue(); } @@ -92,7 +92,7 @@ public String getJavaName() { * @see java.lang.Thread#threadId() */ public long getJavaThreadId() { - Long l = getTyped("javaThreadId", Long.class, -1L); + Long l = getTyped("javaThreadId", Long.class, LONG_MINUS_ONE); long id = l.longValue(); return id == 0 ? -1L : id; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/AbstractBufferStatisticsEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/AbstractBufferStatisticsEvent.java index d436b32db83e3..f7a03c7446e84 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/AbstractBufferStatisticsEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/AbstractBufferStatisticsEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,7 @@ import jdk.jfr.*; @Category({ "Java Application", "Statistics" }) -public abstract class AbstractBufferStatisticsEvent extends AbstractPeriodicEvent { +abstract class AbstractBufferStatisticsEvent extends AbstractPeriodicEvent { protected AbstractBufferStatisticsEvent(BufferPool bufferPool) { count = bufferPool.getCount(); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java index 352a8b6a07397..ffb45caa42cf9 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java @@ -29,7 +29,6 @@ import jdk.jfr.Label; import jdk.jfr.DataAmount; import jdk.jfr.Name; -import jdk.jfr.StackTrace; import jdk.jfr.Timespan; import jdk.jfr.Timestamp; import jdk.jfr.internal.RemoveFields; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java index 3658b06eb14a8..6aade8e01f5d5 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java @@ -28,7 +28,6 @@ import jdk.jfr.Category; import jdk.jfr.Label; import jdk.jfr.Name; -import jdk.jfr.StackTrace; import jdk.jfr.internal.RemoveFields; import jdk.jfr.internal.Type; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java index 795f618b4e62a..0cdd987227193 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java @@ -29,7 +29,6 @@ import jdk.jfr.Description; import jdk.jfr.Label; import jdk.jfr.Name; -import jdk.jfr.StackTrace; import jdk.jfr.internal.MirrorEvent; import jdk.jfr.internal.RemoveFields; import jdk.jfr.internal.Type; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java index 2a758aa8addc6..71569c30273be 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java @@ -46,7 +46,6 @@ import jdk.jfr.Threshold; import jdk.jfr.events.ActiveSettingEvent; import jdk.jfr.events.StackFilter; -import jdk.jfr.internal.JVM; import jdk.jfr.internal.settings.CutoffSetting; import jdk.jfr.internal.settings.EnabledSetting; import jdk.jfr.internal.settings.LevelSetting; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java index 75be70a0d1dae..4a7bc734d7571 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java @@ -44,8 +44,6 @@ import jdk.jfr.EventType; import jdk.jfr.Name; import jdk.jfr.Period; -import jdk.jfr.StackTrace; -import jdk.jfr.Threshold; import jdk.jfr.ValueDescriptor; import jdk.jfr.internal.consumer.RepositoryFiles; import jdk.jfr.internal.event.EventConfiguration; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java index 5fa9eb709ef08..21079fab3a912 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,7 +33,6 @@ import jdk.jfr.RecordingState; import jdk.jfr.internal.settings.CutoffSetting; import jdk.jfr.internal.test.WhiteBox; -import jdk.jfr.internal.util.Utils; // The Old Object event could have been implemented as a periodic event, but // due to chunk rotations and how settings are calculated when multiple recordings diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/RepositoryChunk.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/RepositoryChunk.java index 72d3a719452f4..e46b6020d5dbd 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/RepositoryChunk.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/RepositoryChunk.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,10 +29,7 @@ import java.io.RandomAccessFile; import java.nio.channels.ReadableByteChannel; import java.time.Instant; -import java.time.Period; -import java.time.Duration; import java.util.Comparator; -import java.util.Optional; import jdk.jfr.internal.SecuritySupport.SafePath; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/ShutdownHook.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/ShutdownHook.java index afd9ec09bd9f1..8375dab0bcce3 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/ShutdownHook.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/ShutdownHook.java @@ -25,14 +25,12 @@ package jdk.jfr.internal; -import java.io.IOException; import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import jdk.jfr.RecordingState; -import jdk.jfr.internal.util.Utils; /** * Class responsible for dumping recordings on exit diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/QueryRecording.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/QueryRecording.java index 75fefca0f08af..fa60079b52247 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/QueryRecording.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/QueryRecording.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ import java.io.IOException; import java.time.Duration; import java.time.Instant; -import java.util.ArrayList; import java.util.List; import java.util.ListIterator; @@ -37,12 +36,8 @@ import jdk.jfr.internal.PrivateAccess; import jdk.jfr.internal.RepositoryChunk; import jdk.jfr.internal.query.Configuration; -import jdk.jfr.internal.query.QueryPrinter; -import jdk.jfr.internal.query.ViewPrinter; import jdk.jfr.internal.query.Configuration.Truncate; import jdk.jfr.internal.util.UserDataException; -import jdk.jfr.internal.util.UserSyntaxException; -import jdk.jfr.internal.util.Output; /** * Helper class that holds recording chunks alive during a query. It also helps diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java index 6d7cccfb2a6d0..0511ce57001c6 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -293,7 +293,7 @@ public static Reader newReader(SafePath sf) throws IOException { public static String formatException(String prefix, Exception e, String input) { String message = prefix + " " + JFC.exceptionToVerb(e) + " file '" + input + "'"; String details = e.getMessage(); - if (e instanceof JFCModelException m) { + if (e instanceof JFCModelException) { return message + ". " + details; } if (e instanceof ParseException && !details.isEmpty()) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlSetting.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlSetting.java index 56f2208ded313..536c5051f54e1 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlSetting.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlSetting.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ public void onChange() { @Override final void setContent(String value) { super.setContent(value); - if (getParent() instanceof XmlEvent event) { + if (getParent() instanceof XmlEvent) { SettingsLog.log(this, value); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java index da32f86c171ba..cb54b6b651abd 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,6 +53,6 @@ public void putText(int index, String text) { @Override public String toString() { - return Arrays.asList(values).toString(); + return Arrays.toString(values); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/TableSorter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/TableSorter.java index 65f664018bab2..8869516280960 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/TableSorter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/TableSorter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,10 +24,7 @@ */ package jdk.jfr.internal.query; -import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; -import java.util.List; import java.util.function.Predicate; import jdk.jfr.internal.query.Query.OrderElement; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/LevelSetting.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/LevelSetting.java index acf67c0aa06a5..b6aa7500d4b68 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/LevelSetting.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/LevelSetting.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ @MetadataDefinition @Label("Level") @Name(Type.SETTINGS_PREFIX + "Level") -public class LevelSetting extends JDKSettingControl { +public final class LevelSetting extends JDKSettingControl { private final PlatformEventType eventType; private final List<String> levels; private String value; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java index 06616771cf9cf..48dd52475685a 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -223,9 +223,9 @@ private void splitFile(Path directory, Path file, List<Long> splitPositions) thr Path p = directory.resolve(formattedFilename); File splittedFile = p.toFile(); println("Writing " + splittedFile + " ... " + bytes.length); - FileOutputStream fos = new FileOutputStream(splittedFile); - fos.write(bytes); - fos.close(); + try (var fos = new FileOutputStream(splittedFile)) { + fos.write(bytes); + } } } catch (IOException ioe) { throw new UserDataException("i/o error writing file " + file); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java index aec1f18546c77..77b3f4d1e8c41 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,6 @@ import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; import java.util.List; import java.util.StringJoiner; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java index a22c64c931e8f..613e315ff1390 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,7 +33,6 @@ import java.util.List; import jdk.jfr.consumer.EventStream; -import jdk.jfr.internal.util.Columnizer; import jdk.jfr.internal.query.ViewPrinter; import jdk.jfr.internal.query.Configuration; import jdk.jfr.internal.query.Configuration.Truncate; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueParser.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueParser.java index 1c6561f45c4a6..730c83daaae67 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueParser.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; -public class ValueParser { +public final class ValueParser { private static final String INFINITY = "infinity"; public static long parseTimespanWithInfinity(String s) { From b83766e59063a41ea8801ac9e7c15dce67727c62 Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Fri, 5 Jul 2024 17:07:22 +0000 Subject: [PATCH 318/471] 8335632: jdk/jfr/api/consumer/streaming/TestJVMExit.java failed with "Process [...] is no longer alive" Reviewed-by: mgronlun --- .../jfr/api/consumer/streaming/TestJVMExit.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/jdk/jdk/jfr/api/consumer/streaming/TestJVMExit.java b/test/jdk/jdk/jfr/api/consumer/streaming/TestJVMExit.java index 5b30a52e4b757..77eba735d7a3b 100644 --- a/test/jdk/jdk/jfr/api/consumer/streaming/TestJVMExit.java +++ b/test/jdk/jdk/jfr/api/consumer/streaming/TestJVMExit.java @@ -34,12 +34,29 @@ * @requires vm.hasJFR * @library /test/lib /test/jdk * @modules jdk.jfr jdk.attach java.base/jdk.internal.misc + * @build jdk.jfr.api.consumer.streaming.TestProcess * * @run main/othervm -Dsun.tools.attach.attachTimeout=100000 jdk.jfr.api.consumer.streaming.TestJVMExit */ public class TestJVMExit { public static void main(String... args) throws Exception { + while (true) { + try { + testExit(); + return; + } catch (RuntimeException e) { + String message = String.valueOf(e.getMessage()); + // If the test application crashes during startup, retry. + if (!message.contains("is no longer alive")) { + throw e; + } + System.out.println("Application not alive when trying to get repository. Retrying."); + } + } + } + + private static void testExit() throws Exception { try (TestProcess process = new TestProcess("exit-application")) { AtomicInteger eventCounter = new AtomicInteger(); try (EventStream es = EventStream.openRepository(process.getRepository())) { From 6f7f0f1de05fdc0f6a88ccd90b806e8a5c5074ef Mon Sep 17 00:00:00 2001 From: Per Minborg <pminborg@openjdk.org> Date: Sat, 6 Jul 2024 15:05:26 +0000 Subject: [PATCH 319/471] 8333884: MemorySegment::reinterpret removes read-only property Reviewed-by: jvernee, mcimadamore --- .../java/lang/foreign/MemorySegment.java | 21 +++++++++++++++++++ .../foreign/AbstractMemorySegmentImpl.java | 2 +- .../internal/foreign/SegmentFactories.java | 10 ++++++--- test/jdk/java/foreign/TestSegments.java | 12 +++++++---- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/java.base/share/classes/java/lang/foreign/MemorySegment.java b/src/java.base/share/classes/java/lang/foreign/MemorySegment.java index aa1f1762aec65..83a8b09f9d453 100644 --- a/src/java.base/share/classes/java/lang/foreign/MemorySegment.java +++ b/src/java.base/share/classes/java/lang/foreign/MemorySegment.java @@ -633,6 +633,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * asSlice(offset, newSize, 1); * } * <p> + * If this segment is {@linkplain MemorySegment#isReadOnly() read-only}, + * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}. + * <p> * The returned memory segment shares a region of backing memory with this segment. * Hence, no memory will be allocated or freed by this method. * @@ -652,6 +655,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * alignment constraint. The returned segment's address is the address of this * segment plus the given offset; its size is specified by the given argument. * <p> + * If this segment is {@linkplain MemorySegment#isReadOnly() read-only}, + * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}. + * <p> * The returned memory segment shares a region of backing memory with this segment. * Hence, no memory will be allocated or freed by this method. * @@ -679,6 +685,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * asSlice(offset, layout.byteSize(), layout.byteAlignment()); * } * <p> + * If this segment is {@linkplain MemorySegment#isReadOnly() read-only}, + * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}. + * <p> * The returned memory segment shares a region of backing memory with this segment. * Hence, no memory will be allocated or freed by this method. * @@ -705,6 +714,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * asSlice(offset, byteSize() - offset); * } * <p> + * If this segment is {@linkplain MemorySegment#isReadOnly() read-only}, + * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}. + * <p> * The returned memory segment shares a region of backing memory with this segment. * Hence, no memory will be allocated or freed by this method. * @@ -721,6 +733,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * Returns a new memory segment that has the same address and scope as this segment, * but with the provided size. * <p> + * If this segment is {@linkplain MemorySegment#isReadOnly() read-only}, + * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}. + * <p> * The returned memory segment shares a region of backing memory with this segment. * Hence, no memory will be allocated or freed by this method. * @@ -759,6 +774,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * scope, and is accessible from any thread. The size of the segment accepted by the * cleanup action is {@link #byteSize()}. * <p> + * If this segment is {@linkplain MemorySegment#isReadOnly() read-only}, + * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}. + * <p> * The returned memory segment shares a region of backing memory with this segment. * Hence, no memory will be allocated or freed by this method. * @@ -807,6 +825,9 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl { * scope, and is accessible from any thread. The size of the segment accepted by the * cleanup action is {@code newSize}. * <p> + * If this segment is {@linkplain MemorySegment#isReadOnly() read-only}, + * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}. + * <p> * The returned memory segment shares a region of backing memory with this segment. * Hence, no memory will be allocated or freed by this method. * diff --git a/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java b/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java index f9f6ac2022a2b..325dbe1093f25 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java +++ b/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java @@ -159,7 +159,7 @@ public MemorySegment reinterpretInternal(Class<?> callerClass, long newSize, Sco () -> cleanup.accept(SegmentFactories.makeNativeSegmentUnchecked(address(), newSize)) : null; return SegmentFactories.makeNativeSegmentUnchecked(address(), newSize, - (MemorySessionImpl)scope, action); + (MemorySessionImpl)scope, readOnly, action); } private AbstractMemorySegmentImpl asSliceNoCheck(long offset, long newSize) { diff --git a/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java b/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java index 17f141b4e8c64..133631e2aa4d8 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java +++ b/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,14 +57,18 @@ public class SegmentFactories { // associated with MemorySegment::ofAddress. @ForceInline - public static MemorySegment makeNativeSegmentUnchecked(long min, long byteSize, MemorySessionImpl sessionImpl, Runnable action) { + public static MemorySegment makeNativeSegmentUnchecked(long min, + long byteSize, + MemorySessionImpl sessionImpl, + boolean readOnly, + Runnable action) { ensureInitialized(); if (action == null) { sessionImpl.checkValidState(); } else { sessionImpl.addCloseAction(action); } - return new NativeMemorySegmentImpl(min, byteSize, false, sessionImpl); + return new NativeMemorySegmentImpl(min, byteSize, readOnly, sessionImpl); } @ForceInline diff --git a/test/jdk/java/foreign/TestSegments.java b/test/jdk/java/foreign/TestSegments.java index 44ecd12ba5ebd..b361abac3dfa4 100644 --- a/test/jdk/java/foreign/TestSegments.java +++ b/test/jdk/java/foreign/TestSegments.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,6 @@ import java.util.function.Supplier; import static java.lang.foreign.ValueLayout.JAVA_INT; -import static java.lang.foreign.ValueLayout.JAVA_LONG; import static org.testng.Assert.*; public class TestSegments { @@ -383,9 +382,14 @@ void testReinterpret() { assertEquals(MemorySegment.ofAddress(42).reinterpret(100, Arena.ofAuto(), null).byteSize(), 100); // check scope and cleanup assertEquals(MemorySegment.ofAddress(42).reinterpret(100, arena, s -> counter.incrementAndGet()).scope(), arena.scope()); - assertEquals(MemorySegment.ofAddress(42).reinterpret(arena, s -> counter.incrementAndGet()).scope(), arena.scope()); + assertEquals(MemorySegment.ofAddress(42).reinterpret(arena, _ -> counter.incrementAndGet()).scope(), arena.scope()); + // check read-only state + assertFalse(MemorySegment.ofAddress(42).reinterpret(100).isReadOnly()); + assertTrue(MemorySegment.ofAddress(42).asReadOnly().reinterpret(100).isReadOnly()); + assertTrue(MemorySegment.ofAddress(42).asReadOnly().reinterpret(100, Arena.ofAuto(), null).isReadOnly()); + assertTrue(MemorySegment.ofAddress(42).asReadOnly().reinterpret(arena, _ -> counter.incrementAndGet()).isReadOnly()); } - assertEquals(counter.get(), 2); + assertEquals(counter.get(), 3); } @Test From 3f37c5718d676b7001e6a084aed3ba645745a144 Mon Sep 17 00:00:00 2001 From: SendaoYan <syan@openjdk.org> Date: Mon, 8 Jul 2024 01:19:36 +0000 Subject: [PATCH 320/471] 8335806: RISC-V: Corrected typos Bizarrely Reviewed-by: aph, amitkumar --- src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp | 2 +- src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp index 7e3ceb1f02029..251ea3813ff84 100644 --- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp @@ -1154,7 +1154,7 @@ void C2_MacroAssembler::string_compare(Register str1, Register str2, BLOCK_COMMENT("string_compare {"); - // Bizzarely, the counts are passed in bytes, regardless of whether they + // Bizarrely, the counts are passed in bytes, regardless of whether they // are L or U strings, however the result is always in characters. if (!str1_isL) asrw(cnt1, cnt1, 1); if (!str2_isL) asrw(cnt2, cnt2, 1); diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp index 887baa4a506d1..3cb2e52c8cb93 100644 --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp @@ -1322,7 +1322,7 @@ void C2_MacroAssembler::string_compare(Register str1, Register str2, BLOCK_COMMENT("string_compare {"); - // Bizzarely, the counts are passed in bytes, regardless of whether they + // Bizarrely, the counts are passed in bytes, regardless of whether they // are L or U strings, however the result is always in characters. if (!str1_isL) { sraiw(cnt1, cnt1, 1); From 02956ab6e161ca8556a73f328f79bcbfba997cbc Mon Sep 17 00:00:00 2001 From: Emanuel Peter <epeter@openjdk.org> Date: Mon, 8 Jul 2024 06:23:03 +0000 Subject: [PATCH 321/471] 8332163: C2 SuperWord: refactor PacksetGraph and SuperWord::output into VTransformGraph Reviewed-by: chagedorn, kvn --- src/hotspot/share/opto/superword.cpp | 816 +++--------------- src/hotspot/share/opto/superword.hpp | 18 +- .../share/opto/superwordVTransformBuilder.cpp | 308 +++++++ .../share/opto/superwordVTransformBuilder.hpp | 87 ++ .../share/opto/traceAutoVectorizationTag.hpp | 1 + src/hotspot/share/opto/vectorization.cpp | 1 - src/hotspot/share/opto/vectorization.hpp | 16 +- src/hotspot/share/opto/vtransform.cpp | 450 ++++++++++ src/hotspot/share/opto/vtransform.hpp | 515 +++++++++++ 9 files changed, 1489 insertions(+), 723 deletions(-) create mode 100644 src/hotspot/share/opto/superwordVTransformBuilder.cpp create mode 100644 src/hotspot/share/opto/superwordVTransformBuilder.hpp create mode 100644 src/hotspot/share/opto/vtransform.cpp create mode 100644 src/hotspot/share/opto/vtransform.hpp diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp index f78a9b63926fd..ba2dd423bf51d 100644 --- a/src/hotspot/share/opto/superword.cpp +++ b/src/hotspot/share/opto/superword.cpp @@ -22,22 +22,13 @@ */ #include "precompiled.hpp" -#include "libadt/vectset.hpp" -#include "memory/allocation.inline.hpp" -#include "memory/resourceArea.hpp" #include "opto/addnode.hpp" -#include "opto/c2compiler.hpp" #include "opto/castnode.hpp" #include "opto/convertnode.hpp" -#include "opto/matcher.hpp" -#include "opto/memnode.hpp" -#include "opto/opcodes.hpp" -#include "opto/opaquenode.hpp" -#include "opto/rootnode.hpp" #include "opto/superword.hpp" +#include "opto/superwordVTransformBuilder.hpp" #include "opto/vectornode.hpp" #include "opto/movenode.hpp" -#include "utilities/powerOfTwo.hpp" SuperWord::SuperWord(const VLoopAnalyzer &vloop_analyzer) : _vloop_analyzer(vloop_analyzer), @@ -707,7 +698,7 @@ bool SuperWord::can_pack_into_pair(Node* s1, Node* s2) { } // Forbid anything that looks like a PopulateIndex to be packed. It does not need to be packed, - // and will still be vectorized by SuperWord::vector_opd. + // and will still be vectorized by SuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_index. if (isomorphic(s1, s2) && !is_populate_index(s1, s2)) { if ((independent(s1, s2) && have_similar_inputs(s1, s2)) || reduction(s1, s2)) { if (!_pairset.is_left(s1) && !_pairset.is_right(s2)) { @@ -769,8 +760,9 @@ bool SuperWord::isomorphic(Node* s1, Node* s2) { } } -// Look for pattern n1 = (iv + c) and n2 = (iv + c + 1), which may lead to PopulateIndex vector node. -// We skip the pack creation of these nodes. They will be vectorized by SuperWord::vector_opd. +// Look for pattern n1 = (iv + c) and n2 = (iv + c + 1), which may lead to +// PopulateIndex vector node. We skip the pack creation of these nodes. They +// will be vectorized by SuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_index. bool SuperWord::is_populate_index(const Node* n1, const Node* n2) const { return n1->is_Add() && n2->is_Add() && @@ -1858,307 +1850,74 @@ void PackSet::verify() const { } #endif -// The PacksetGraph combines the dependency graph with the packset. In the PackSet -// graph, we have two kinds of nodes: -// (1) pack-node: Represents all nodes of some pack p in a single node, which -// shall later become a vector node. -// (2) scalar-node: Represents a node that is not in any pack. -// For any edge (n1, n2) in the dependency graph, we add an edge to the PacksetGraph for -// the PacksetGraph nodes corresponding to n1 and n2. -// We work from the dependency graph, because it gives us all the data-dependencies, -// as well as more refined memory-dependencies than the C2 graph. The dependency graph -// does not have cycles. But packing nodes can introduce cyclic dependencies. Example: -// -// +--------+ -// A -> X | v -// Pack [A,B] and [X,Y] [A,B] [X,Y] -// Y -> B ^ | -// +--------+ -// -class PacksetGraph { -private: - // pid: packset graph node id. - GrowableArray<int> _pid; // bb_idx(n) -> pid - GrowableArray<Node*> _pid_to_node; // one node per pid, find rest via _packset.pack - GrowableArray<GrowableArray<int>> _out; // out-edges - GrowableArray<int> _incnt; // number of (implicit) in-edges - int _max_pid = 0; - - bool _schedule_success; - - SuperWord* _slp; -public: - PacksetGraph(SuperWord* slp) - : _pid(8, 0, /* default */ 0), _slp(slp) { - } - // Get pid, if there is a packset node that n belongs to. Else return 0. - int get_pid_or_zero(const Node* n) const { - if (!_slp->in_bb(n)) { - return 0; - } - int idx = _slp->bb_idx(n); - if (idx >= _pid.length()) { - return 0; - } else { - return _pid.at(idx); - } - } - int get_pid(const Node* n) { - int poz = get_pid_or_zero(n); - assert(poz != 0, "pid should not be zero"); - return poz; - } - void set_pid(Node* n, int pid) { - assert(n != nullptr && pid > 0, "sane inputs"); - assert(_slp->in_bb(n), "must be"); - int idx = _slp->bb_idx(n); - _pid.at_put_grow(idx, pid); - _pid_to_node.at_put_grow(pid - 1, n, nullptr); - } - Node* get_node(int pid) { - assert(pid > 0 && pid <= _pid_to_node.length(), "pid must be mapped"); - Node* n = _pid_to_node.at(pid - 1); - assert(n != nullptr, "sanity"); - return n; - } - int new_pid() { - _incnt.push(0); - _out.push(GrowableArray<int>()); - return ++_max_pid; - } - int incnt(int pid) { return _incnt.at(pid - 1); } - void incnt_set(int pid, int cnt) { return _incnt.at_put(pid - 1, cnt); } - GrowableArray<int>& out(int pid) { return _out.at(pid - 1); } - bool schedule_success() const { return _schedule_success; } - - // Create nodes (from packs and scalar-nodes), and add edges, based on the dependency graph. - void build() { - const PackSet& packset = _slp->packset(); - const GrowableArray<Node*>& body = _slp->body(); - // Map nodes in packsets - for (int i = 0; i < packset.length(); i++) { - Node_List* p = packset.at(i); - int pid = new_pid(); - for (uint k = 0; k < p->size(); k++) { - Node* n = p->at(k); - set_pid(n, pid); - assert(packset.get_pack(n) == p, "matching packset"); - } - } - - int max_pid_packset = _max_pid; - - // Map nodes not in packset - for (int i = 0; i < body.length(); i++) { - Node* n = body.at(i); - if (n->is_Phi() || n->is_CFG()) { - continue; // ignore control flow - } - int pid = get_pid_or_zero(n); - if (pid == 0) { - pid = new_pid(); - set_pid(n, pid); - assert(packset.get_pack(n) == nullptr, "no packset"); - } - } - - // Map edges for packset nodes - VectorSet set; - for (int i = 0; i < packset.length(); i++) { - Node_List* p = packset.at(i); - set.clear(); - int pid = get_pid(p->at(0)); - for (uint k = 0; k < p->size(); k++) { - Node* n = p->at(k); - assert(pid == get_pid(n), "all nodes in pack have same pid"); - for (VLoopDependencyGraph::PredsIterator preds(_slp->dependency_graph(), n); !preds.done(); preds.next()) { - Node* pred = preds.current(); - int pred_pid = get_pid_or_zero(pred); - if (pred_pid == pid && _slp->is_marked_reduction(n)) { - continue; // reduction -> self-cycle is not a cyclic dependency - } - // Only add edges once, and only for mapped nodes (in body) - if (pred_pid > 0 && !set.test_set(pred_pid)) { - incnt_set(pid, incnt(pid) + 1); // increment - out(pred_pid).push(pid); - } - } - } - } - - // Map edges for nodes not in packset - for (int i = 0; i < body.length(); i++) { - Node* n = body.at(i); - int pid = get_pid_or_zero(n); // zero for Phi or CFG - if (pid <= max_pid_packset) { - continue; // Only scalar-nodes - } - for (VLoopDependencyGraph::PredsIterator preds(_slp->dependency_graph(), n); !preds.done(); preds.next()) { - Node* pred = preds.current(); - int pred_pid = get_pid_or_zero(pred); - // Only add edges for mapped nodes (in body) - if (pred_pid > 0) { - incnt_set(pid, incnt(pid) + 1); // increment - out(pred_pid).push(pid); - } - } - } - } - - // Schedule nodes of PacksetGraph to worklist, using topsort: schedule a node - // that has zero incnt. If a PacksetGraph node corresponds to memops, then add - // those to the memops_schedule. At the end, we return the memops_schedule, and - // note if topsort was successful. - Node_List schedule() { - Node_List memops_schedule; - GrowableArray<int> worklist; - // Directly schedule all nodes without precedence - for (int pid = 1; pid <= _max_pid; pid++) { - if (incnt(pid) == 0) { - worklist.push(pid); - } - } - // Continue scheduling via topological sort - for (int i = 0; i < worklist.length(); i++) { - int pid = worklist.at(i); - - // Add memops to memops_schedule - Node* n = get_node(pid); - Node_List* p = _slp->packset().get_pack(n); - if (n->is_Mem()) { - if (p == nullptr) { - memops_schedule.push(n); - } else { - for (uint k = 0; k < p->size(); k++) { - memops_schedule.push(p->at(k)); - assert(p->at(k)->is_Mem(), "only schedule memops"); - } - } - } +bool SuperWord::schedule_and_apply() const { + if (_packset.is_empty()) { return false; } - // Decrement incnt for all successors - for (int j = 0; j < out(pid).length(); j++){ - int pid_use = out(pid).at(j); - int incnt_use = incnt(pid_use) - 1; - incnt_set(pid_use, incnt_use); - // Did use lose its last input? - if (incnt_use == 0) { - worklist.push(pid_use); - } - } - } - - // Was every pid scheduled? If not, we found some cycles in the PacksetGraph. - _schedule_success = (worklist.length() == _max_pid); - return memops_schedule; - } - - // Print the PacksetGraph. - // print_nodes = true: print all C2 nodes beloning to PacksetGrahp node. - // print_zero_incnt = false: do not print nodes that have no in-edges (any more). - void print(bool print_nodes, bool print_zero_incnt) { - const GrowableArray<Node*> &body = _slp->body(); - tty->print_cr("PacksetGraph"); - for (int pid = 1; pid <= _max_pid; pid++) { - if (incnt(pid) == 0 && !print_zero_incnt) { - continue; - } - tty->print("Node %d. incnt %d [", pid, incnt(pid)); - for (int j = 0; j < out(pid).length(); j++) { - tty->print("%d ", out(pid).at(j)); - } - tty->print_cr("]"); + // Make an empty transform. #ifndef PRODUCT - if (print_nodes) { - for (int i = 0; i < body.length(); i++) { - Node* n = body.at(i); - if (get_pid_or_zero(n) == pid) { - tty->print(" "); - n->dump(); - } - } - } + VTransformTrace trace(_vloop.vtrace(), + is_trace_superword_rejections(), + is_trace_align_vector(), + is_trace_superword_info()); #endif - } - } -}; - -// We want to replace the packed scalars from the PackSet and replace them -// with vector operations. This requires scheduling and re-ordering the memory -// graph. We take these steps: -// (1) Build the PacksetGraph. It combines the dependency graph with the -// packset. The PacksetGraph gives us the dependencies that must be -// respected after scheduling. -// (2) Schedule the PacksetGraph to the memops_schedule, which represents -// a linear order of all memops in the body. The order respects the -// dependencies of the PacksetGraph. -// (3) If the PacksetGraph has cycles, we cannot schedule. Abort. -// (4) Apply the vectorization, including re-ordering the memops and replacing -// packed scalars with vector operations. -bool SuperWord::schedule_and_apply() { - if (_packset.is_empty()) { - return false; - } - ResourceMark rm; + VTransform vtransform(_vloop_analyzer, + _mem_ref_for_main_loop_alignment, + _aw_for_main_loop_alignment + NOT_PRODUCT(COMMA trace) + ); - // (1) Build the PacksetGraph. - PacksetGraph graph(this); - graph.build(); + // Build the transform from the packset. + { + ResourceMark rm; + SuperWordVTransformBuilder builder(_packset, vtransform); + } - // (2) Schedule the PacksetGraph. - Node_List memops_schedule = graph.schedule(); + if (!vtransform.schedule()) { return false; } + vtransform.apply(); + return true; +} - // (3) Check if the PacksetGraph schedule succeeded (had no cycles). - // We now know that we only have independent packs, see verify_packs. - // This is a necessary but not a sufficient condition for an acyclic - // graph (DAG) after scheduling. Thus, we must check if the packs have - // introduced a cycle. The SuperWord paper mentions the need for this - // in "3.7 Scheduling". - if (!graph.schedule_success()) { +// Apply the vectorization, i.e. we irreversibly edit the C2 graph. At this point, all +// correctness and profitability checks have passed, and the graph was successfully scheduled. +void VTransform::apply() { #ifndef PRODUCT - if (is_trace_superword_rejections()) { - tty->print_cr("SuperWord::schedule found cycle in PacksetGraph:"); - graph.print(true, false); - tty->print_cr("removing all packs from packset."); - } -#endif - _packset.clear(); - return false; + if (_trace._info || TraceLoopOpts) { + tty->print_cr("\nVTransform::apply:"); + lpt()->dump_head(); + lpt()->head()->dump(); } + assert(cl()->is_main_loop(), "auto vectorization only for main loops"); + assert(_graph.is_scheduled(), "must already be scheduled"); +#endif - // (4) Apply the vectorization, including re-ordering the memops. - return apply(memops_schedule); -} - -bool SuperWord::apply(Node_List& memops_schedule) { Compile* C = phase()->C; - CountedLoopNode* cl = lpt()->_head->as_CountedLoop(); - C->print_method(PHASE_AUTO_VECTORIZATION1_BEFORE_APPLY, 4, cl); + C->print_method(PHASE_AUTO_VECTORIZATION1_BEFORE_APPLY, 4, cl()); - apply_memops_reordering_with_schedule(memops_schedule); - C->print_method(PHASE_AUTO_VECTORIZATION2_AFTER_REORDER, 4, cl); + _graph.apply_memops_reordering_with_schedule(); + C->print_method(PHASE_AUTO_VECTORIZATION2_AFTER_REORDER, 4, cl()); adjust_pre_loop_limit_to_align_main_loop_vectors(); - C->print_method(PHASE_AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, 4, cl); - - bool is_success = apply_vectorization(); - C->print_method(PHASE_AUTO_VECTORIZATION4_AFTER_APPLY, 4, cl); + C->print_method(PHASE_AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, 4, cl()); - return is_success; + apply_vectorization(); + C->print_method(PHASE_AUTO_VECTORIZATION4_AFTER_APPLY, 4, cl()); } -// Reorder the memory graph for all slices in parallel. We walk over the schedule once, -// and track the current memory state of each slice. -void SuperWord::apply_memops_reordering_with_schedule(Node_List& memops_schedule) { +// We prepare the memory graph for the replacement of scalar memops with vector memops. +// We reorder all slices in parallel, ensuring that the memops inside each slice are +// ordered according to the _schedule. This means that all packed memops are consecutive +// in the memory graph after the reordering. +void VTransformGraph::apply_memops_reordering_with_schedule() const { #ifndef PRODUCT - if (is_trace_superword_info()) { - tty->print_cr("\nSuperWord::apply_memops_reordering_with_schedule:"); - memops_schedule.dump(); + assert(is_scheduled(), "must be already scheduled"); + if (_trace._info) { + print_memops_schedule(); } #endif + ResourceMark rm; int max_slices = phase()->C->num_alias_types(); - // When iterating over the memops_schedule, we keep track of the current memory state, + // When iterating over the schedule, we keep track of the current memory state, // which is the Phi or a store in the loop. GrowableArray<Node*> current_state_in_slice(max_slices, max_slices, nullptr); // The memory state after the loop is the last store inside the loop. If we reorder the @@ -2179,10 +1938,9 @@ void SuperWord::apply_memops_reordering_with_schedule(Node_List& memops_schedule old_last_store_in_slice.at_put(alias_idx, last_store); } - // (2) Walk over memops_schedule, append memops to the current state + // (2) Walk over schedule, append memops to the current state // of that slice. If it is a Store, we take it as the new state. - for (uint i = 0; i < memops_schedule.size(); i++) { - MemNode* n = memops_schedule.at(i)->as_Mem(); + for_each_memop_in_schedule([&] (MemNode* n) { assert(n->is_Load() || n->is_Store(), "only loads or stores"); int alias_idx = phase()->C->get_alias_index(n->adr_type()); Node* current_state = current_state_in_slice.at(alias_idx); @@ -2198,12 +1956,12 @@ void SuperWord::apply_memops_reordering_with_schedule(Node_List& memops_schedule current_state_in_slice.at_put(alias_idx, n); } } - } + }); // (3) For each slice, we add the current state to the backedge // in the Phi. Further, we replace uses of the old last store // with uses of the new last store (current_state). - Node_List uses_after_loop; + GrowableArray<Node*> uses_after_loop; for (int i = 0; i < mem_slice_head.length(); i++) { Node* phi = mem_slice_head.at(i); int alias_idx = phase()->C->get_alias_index(phi->adr_type()); @@ -2225,7 +1983,7 @@ void SuperWord::apply_memops_reordering_with_schedule(Node_List& memops_schedule uses_after_loop.push(use); } } - for (uint k = 0; k < uses_after_loop.size(); k++) { + for (int k = 0; k < uses_after_loop.length(); k++) { Node* use = uses_after_loop.at(k); for (uint j = 0; j < use->req(); j++) { Node* def = use->in(j); @@ -2237,396 +1995,65 @@ void SuperWord::apply_memops_reordering_with_schedule(Node_List& memops_schedule } } -// Convert packs into vector node operations -// At this point, all correctness and profitability checks have passed. -// We start the irreversible process of editing the C2 graph. Should -// there be an unexpected situation (assert fails), then we can only -// bail out of the compilation, as the graph has already been partially -// modified. We bail out, and retry without SuperWord. -bool SuperWord::apply_vectorization() { - CountedLoopNode *cl = lpt()->_head->as_CountedLoop(); - assert(cl->is_main_loop(), "SLP should only work on main loops"); - Compile* C = phase()->C; - assert(!_packset.is_empty(), "vectorization requires non-empty packset"); - -#ifndef PRODUCT - if (TraceLoopOpts) { - tty->print("SuperWord::apply_vectorization "); - lpt()->dump_head(); - } -#endif - - uint max_vlen_in_bytes = 0; - uint max_vlen = 0; - - for (int i = 0; i < body().length(); i++) { - Node* n = body().at(i); - Node_List* p = get_pack(n); - if (p != nullptr && n == p->at(p->size()-1)) { - // After apply_memops_reordering_with_schedule, we know that the memops have the same order in the pack - // as in the memory slice. Hence, "first" is the first memop in the slice from the pack, - // and "n" is the last node in the slice from the pack. - Node* first = p->at(0); - uint vlen = p->size(); - uint vlen_in_bytes = 0; - Node* vn = nullptr; - int opc = n->Opcode(); - if (n->is_Load()) { - Node* ctl = n->in(MemNode::Control); - Node* mem = first->in(MemNode::Memory); - // Set the memory dependency of the LoadVector as early as possible. - // Walk up the memory chain, and ignore any StoreVector that provably - // does not have any memory dependency. - while (mem->is_StoreVector()) { - VPointer p_store(mem->as_Mem(), _vloop); - if (p_store.overlap_possible_with_any_in(p)) { - break; - } else { - mem = mem->in(MemNode::Memory); - } - } - Node* adr = first->in(MemNode::Address); - const TypePtr* atyp = n->adr_type(); - vn = LoadVectorNode::make(opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n), control_dependency(p)); - vlen_in_bytes = vn->as_LoadVector()->memory_size(); - } else if (n->is_Store()) { - // Promote value to be stored to vector - Node* val = vector_opd(p, MemNode::ValueIn); - if (val == nullptr) { - assert(false, "input to vector store was not created"); - C->record_failure(C2Compiler::retry_no_superword()); - return false; // bailout - } +void VTransformGraph::apply_vectorization_for_each_vtnode(uint& max_vector_length, uint& max_vector_width) const { + ResourceMark rm; + // We keep track of the resulting Nodes from every "VTransformNode::apply" call. + // Since "apply" is called on defs before uses, this allows us to find the + // generated def (input) nodes when we are generating the use nodes in "apply". + int length = _vtnodes.length(); + GrowableArray<Node*> vtnode_idx_to_transformed_node(length, length, nullptr); - Node* ctl = n->in(MemNode::Control); - Node* mem = first->in(MemNode::Memory); - Node* adr = first->in(MemNode::Address); - const TypePtr* atyp = n->adr_type(); - vn = StoreVectorNode::make(opc, ctl, mem, adr, atyp, val, vlen); - vlen_in_bytes = vn->as_StoreVector()->memory_size(); - } else if (VectorNode::is_scalar_rotate(n)) { - Node* in1 = vector_opd(p, 1); - Node* in2 = first->in(2); - // If rotation count is non-constant or greater than 8bit value create a vector. - if (!in2->is_Con() || !Matcher::supports_vector_constant_rotates(in2->get_int())) { - in2 = vector_opd(p, 2); - } - vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n)); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else if (VectorNode::is_roundopD(n)) { - Node* in1 = vector_opd(p, 1); - Node* in2 = first->in(2); - assert(in2->is_Con(), "Constant rounding mode expected."); - vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n)); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else if (VectorNode::is_muladds2i(n)) { - assert(n->req() == 5u, "MulAddS2I should have 4 operands."); - Node* in1 = vector_opd(p, 1); - Node* in2 = vector_opd(p, 2); - vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n)); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else if (opc == Op_SignumF || opc == Op_SignumD) { - assert(n->req() == 4, "four inputs expected"); - Node* in = vector_opd(p, 1); - Node* zero = vector_opd(p, 2); - Node* one = vector_opd(p, 3); - vn = VectorNode::make(opc, in, zero, one, vlen, velt_basic_type(n)); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else if (n->is_Cmp()) { - // Bool + Cmp + CMove -> VectorMaskCmp + VectorBlend - continue; - } else if (n->is_Bool()) { - // Bool + Cmp + CMove -> VectorMaskCmp + VectorBlend - continue; - } else if (n->is_CMove()) { - // Bool + Cmp + CMove -> VectorMaskCmp + VectorBlend - - BoolNode* bol = n->in(1)->as_Bool(); - assert(bol != nullptr, "must have Bool above CMove"); - Node_List* bool_pack = get_pack(bol); - assert(bool_pack != nullptr, "CMove must have matching Bool pack"); - - CmpNode* cmp = bol->in(1)->as_Cmp(); - assert(cmp != nullptr, "must have cmp above CMove"); - Node_List* cmp_pack = get_pack(cmp); - assert(cmp_pack != nullptr, "Bool must have matching Cmp pack"); - - Node* cmp_in1 = vector_opd(cmp_pack, 1); - Node* cmp_in2 = vector_opd(cmp_pack, 2); - - Node* blend_in1 = vector_opd(p, 2); - Node* blend_in2 = vector_opd(p, 3); - - VTransformBoolTest bool_test = _packset.get_bool_test(bool_pack); - BoolTest::mask test_mask = bool_test._mask; - if (bool_test._is_negated) { - // We can cancel out the negation by swapping the blend inputs. - swap(blend_in1, blend_in2); - } + for (int i = 0; i < _schedule.length(); i++) { + VTransformNode* vtn = _schedule.at(i); + VTransformApplyResult result = vtn->apply(_vloop_analyzer, + vtnode_idx_to_transformed_node); + NOT_PRODUCT( if (_trace._verbose) { result.trace(vtn); } ) - // VectorMaskCmp - ConINode* test_mask_node = igvn().intcon((int)test_mask); - BasicType bt = velt_basic_type(cmp); - const TypeVect* vt = TypeVect::make(bt, vlen); - VectorNode* mask = new VectorMaskCmpNode(test_mask, cmp_in1, cmp_in2, test_mask_node, vt); - phase()->register_new_node_with_ctrl_of(mask, p->at(0)); - igvn()._worklist.push(mask); - - // VectorBlend - vn = new VectorBlendNode(blend_in1, blend_in2, mask); - } else if (n->req() == 3) { - // Promote operands to vector - Node* in1 = nullptr; - bool node_isa_reduction = is_marked_reduction(n); - if (node_isa_reduction) { - // the input to the first reduction operation is retained - in1 = first->in(1); - } else { - in1 = vector_opd(p, 1); - if (in1 == nullptr) { - assert(false, "input in1 to vector operand was not created"); - C->record_failure(C2Compiler::retry_no_superword()); - return false; // bailout - } - } - Node* in2 = vector_opd(p, 2); - if (in2 == nullptr) { - assert(false, "input in2 to vector operand was not created"); - C->record_failure(C2Compiler::retry_no_superword()); - return false; // bailout - } - if (in1->Opcode() == Op_Replicate && (node_isa_reduction == false) && (n->is_Add() || n->is_Mul())) { - // Move invariant vector input into second position to avoid register spilling. - Node* tmp = in1; - in1 = in2; - in2 = tmp; - } - if (node_isa_reduction) { - const Type *arith_type = n->bottom_type(); - vn = ReductionNode::make(opc, nullptr, in1, in2, arith_type->basic_type()); - if (in2->is_Load()) { - vlen_in_bytes = in2->as_LoadVector()->memory_size(); - } else { - vlen_in_bytes = in2->as_Vector()->length_in_bytes(); - } - } else { - if (VectorNode::can_use_RShiftI_instead_of_URShiftI(n, velt_basic_type(n))) { - opc = Op_RShiftI; - } - vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n)); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } - } else if (VectorNode::is_scalar_unary_op_with_equal_input_and_output_types(opc)) { - assert(n->req() == 2, "only one input expected"); - Node* in = vector_opd(p, 1); - vn = VectorNode::make(opc, in, nullptr, vlen, velt_basic_type(n)); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else if (VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(opc)) { - assert(n->req() == 2, "only one input expected"); - Node* in = vector_opd(p, 1); - Node* longval = VectorNode::make(opc, in, nullptr, vlen, T_LONG); - phase()->register_new_node_with_ctrl_of(longval, first); - // Requires extra vector long -> int conversion. - vn = VectorCastNode::make(Op_VectorCastL2X, longval, T_INT, vlen); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else if (VectorNode::is_convert_opcode(opc)) { - assert(n->req() == 2, "only one input expected"); - BasicType bt = velt_basic_type(n); - Node* in = vector_opd(p, 1); - int vopc = VectorCastNode::opcode(opc, in->bottom_type()->is_vect()->element_basic_type()); - vn = VectorCastNode::make(vopc, in, bt, vlen); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else if (opc == Op_FmaD || opc == Op_FmaF) { - // Promote operands to vector - Node* in1 = vector_opd(p, 1); - Node* in2 = vector_opd(p, 2); - Node* in3 = vector_opd(p, 3); - vn = VectorNode::make(opc, in1, in2, in3, vlen, velt_basic_type(n)); - vlen_in_bytes = vn->as_Vector()->length_in_bytes(); - } else { - assert(false, "Unhandled scalar opcode (%s)", NodeClassNames[opc]); - C->record_failure(C2Compiler::retry_no_superword()); - return false; // bailout - } - - if (vn == nullptr) { - assert(false, "got null node instead of vector node"); - C->record_failure(C2Compiler::retry_no_superword()); - return false; // bailout - } + vtnode_idx_to_transformed_node.at_put(vtn->_idx, result.node()); + max_vector_length = MAX2(max_vector_length, result.vector_length()); + max_vector_width = MAX2(max_vector_width, result.vector_width()); + } +} -#ifdef ASSERT - // Mark Load/Store Vector for alignment verification - if (VerifyAlignVector) { - if (vn->Opcode() == Op_LoadVector) { - vn->as_LoadVector()->set_must_verify_alignment(); - } else if (vn->Opcode() == Op_StoreVector) { - vn->as_StoreVector()->set_must_verify_alignment(); - } - } +// We call "apply" on every VTransformNode, which replaces the packed scalar nodes with vector nodes. +void VTransform::apply_vectorization() const { + Compile* C = phase()->C; +#ifndef PRODUCT + if (_trace._verbose) { + tty->print_cr("\nVTransform::apply_vectorization:"); + } #endif - phase()->register_new_node_with_ctrl_of(vn, first); - for (uint j = 0; j < p->size(); j++) { - Node* pm = p->at(j); - igvn().replace_node(pm, vn); - } - igvn()._worklist.push(vn); + uint max_vector_length = 0; // number of elements + uint max_vector_width = 0; // total width in bytes + _graph.apply_vectorization_for_each_vtnode(max_vector_length, max_vector_width); - if (vlen > max_vlen) { - max_vlen = vlen; - } - if (vlen_in_bytes > max_vlen_in_bytes) { - max_vlen_in_bytes = vlen_in_bytes; - } - VectorNode::trace_new_vector(vn, "SuperWord"); - } - }//for (int i = 0; i < body().length(); i++) + assert(max_vector_length > 0 && max_vector_width > 0, "must have vectorized"); + cl()->mark_loop_vectorized(); - if (max_vlen_in_bytes > C->max_vector_size()) { - C->set_max_vector_size(max_vlen_in_bytes); - } - if (max_vlen_in_bytes > 0) { - cl->mark_loop_vectorized(); + if (max_vector_width > C->max_vector_size()) { + C->set_max_vector_size(max_vector_width); } if (SuperWordLoopUnrollAnalysis) { - if (cl->has_passed_slp()) { - uint slp_max_unroll_factor = cl->slp_max_unroll(); - if (slp_max_unroll_factor == max_vlen) { + if (cl()->has_passed_slp()) { + uint slp_max_unroll_factor = cl()->slp_max_unroll(); + if (slp_max_unroll_factor == max_vector_length) { #ifndef PRODUCT if (TraceSuperWordLoopUnrollAnalysis) { - tty->print_cr("vector loop(unroll=%d, len=%d)\n", max_vlen, max_vlen_in_bytes*BitsPerByte); + tty->print_cr("vector loop(unroll=%d, len=%d)\n", max_vector_length, max_vector_width * BitsPerByte); } #endif // For atomic unrolled loops which are vector mapped, instigate more unrolling - cl->set_notpassed_slp(); + cl()->set_notpassed_slp(); // if vector resources are limited, do not allow additional unrolling if (Matcher::float_pressure_limit() > 8) { C->set_major_progress(); - cl->mark_do_unroll_only(); + cl()->mark_do_unroll_only(); } } } } - - return true; -} - -//------------------------------vector_opd--------------------------- -// Create a vector operand for the nodes in pack p for operand: in(opd_idx) -Node* SuperWord::vector_opd(Node_List* p, int opd_idx) { - Node* p0 = p->at(0); - uint vlen = p->size(); - Node* opd = p0->in(opd_idx); - CountedLoopNode *cl = lpt()->_head->as_CountedLoop(); - Node* same_input = _packset.same_inputs_at_index_or_null(p, opd_idx); - - // Insert index population operation to create a vector of increasing - // indices starting from the iv value. In some special unrolled loops - // (see JDK-8286125), we need scalar replications of the iv value if - // all inputs are the same iv, so we do a same inputs check here. - if (opd == iv() && same_input == nullptr) { - BasicType p0_bt = velt_basic_type(p0); - BasicType iv_bt = is_subword_type(p0_bt) ? p0_bt : T_INT; - assert(VectorNode::is_populate_index_supported(iv_bt), "Should support"); - const TypeVect* vt = TypeVect::make(iv_bt, vlen); - Node* vn = new PopulateIndexNode(iv(), igvn().intcon(1), vt); - VectorNode::trace_new_vector(vn, "SuperWord"); - phase()->register_new_node_with_ctrl_of(vn, opd); - return vn; - } - - if (same_input != nullptr) { - if (opd->is_Vector() || opd->is_LoadVector()) { - if (opd_idx == 2 && VectorNode::is_shift(p0)) { - assert(false, "shift's count can't be vector"); - return nullptr; - } - return opd; // input is matching vector - } - if ((opd_idx == 2) && VectorNode::is_shift(p0)) { - Node* cnt = opd; - // Vector instructions do not mask shift count, do it here. - juint mask = (p0->bottom_type() == TypeInt::INT) ? (BitsPerInt - 1) : (BitsPerLong - 1); - const TypeInt* t = opd->find_int_type(); - if (t != nullptr && t->is_con()) { - juint shift = t->get_con(); - if (shift > mask) { // Unsigned cmp - cnt = igvn().intcon(shift & mask); - phase()->set_ctrl(cnt, phase()->C->root()); - } - } else { - if (t == nullptr || t->_lo < 0 || t->_hi > (int)mask) { - cnt = igvn().intcon(mask); - cnt = new AndINode(opd, cnt); - phase()->register_new_node_with_ctrl_of(cnt, opd); - } - if (!opd->bottom_type()->isa_int()) { - assert(false, "int type only"); - return nullptr; - } - } - // Move shift count into vector register. - cnt = VectorNode::shift_count(p0->Opcode(), cnt, vlen, velt_basic_type(p0)); - phase()->register_new_node_with_ctrl_of(cnt, opd); - return cnt; - } - if (opd->is_StoreVector()) { - assert(false, "StoreVector is not expected here"); - return nullptr; - } - // Convert scalar input to vector with the same number of elements as - // p0's vector. Use p0's type because size of operand's container in - // vector should match p0's size regardless operand's size. - const Type* p0_t = nullptr; - VectorNode* vn = nullptr; - if (opd_idx == 2 && VectorNode::is_scalar_rotate(p0)) { - Node* conv = opd; - p0_t = TypeInt::INT; - if (p0->bottom_type()->isa_long()) { - p0_t = TypeLong::LONG; - conv = new ConvI2LNode(opd); - phase()->register_new_node_with_ctrl_of(conv, opd); - } - vn = VectorNode::scalar2vector(conv, vlen, p0_t); - } else { - p0_t = velt_type(p0); - vn = VectorNode::scalar2vector(opd, vlen, p0_t); - } - - phase()->register_new_node_with_ctrl_of(vn, opd); - VectorNode::trace_new_vector(vn, "SuperWord"); - return vn; - } - - // Insert pack operation - BasicType bt = velt_basic_type(p0); - PackNode* pk = PackNode::make(opd, vlen, bt); - DEBUG_ONLY( const BasicType opd_bt = opd->bottom_type()->basic_type(); ) - - for (uint i = 1; i < vlen; i++) { - Node* pi = p->at(i); - Node* in = pi->in(opd_idx); - if (get_pack(in) != nullptr) { - assert(false, "Should already have been unpacked"); - return nullptr; - } - assert(opd_bt == in->bottom_type()->basic_type(), "all same type"); - pk->add_opd(in); - if (VectorNode::is_muladds2i(pi)) { - Node* in2 = pi->in(opd_idx + 2); - if (get_pack(in2) != nullptr) { - assert(false, "Should already have been unpacked"); - return nullptr; - } - assert(opd_bt == in2->bottom_type()->basic_type(), "all same type"); - pk->add_opd(in2); - } - } - phase()->register_new_node_with_ctrl_of(pk, opd); - VectorNode::trace_new_vector(pk, "SuperWord"); - return pk; } #ifdef ASSERT @@ -2797,18 +2224,7 @@ bool SuperWord::is_vector_use(Node* use, int u_idx) const { return _packset.is_muladds2i_pack_with_pack_inputs(u_pk); } - if (u_pk->size() != d_pk->size()) { - return false; - } - - for (uint i = 0; i < u_pk->size(); i++) { - Node* ui = u_pk->at(i); - Node* di = d_pk->at(i); - if (ui->in(u_idx) != di) { - return false; - } - } - return true; + return _packset.pack_input_at_index_or_null(u_pk, u_idx) != nullptr; } // MulAddS2I takes 4 shorts and produces an int. We can reinterpret @@ -3182,10 +2598,10 @@ bool VLoopMemorySlices::same_memory_slice(MemNode* m1, MemNode* m2) const { _vloop.phase()->C->get_alias_index(m2->adr_type()); } -LoadNode::ControlDependency SuperWord::control_dependency(Node_List* p) { +LoadNode::ControlDependency VTransformLoadVectorNode::control_dependency() const { LoadNode::ControlDependency dep = LoadNode::DependsOnlyOnTest; - for (uint i = 0; i < p->size(); i++) { - Node* n = p->at(i); + for (int i = 0; i < nodes().length(); i++) { + Node* n = nodes().at(i); assert(n->is_Load(), "only meaningful for loads"); if (!n->depends_only_on_test()) { if (n->as_Load()->has_unknown_control_dependency() && @@ -3202,8 +2618,8 @@ LoadNode::ControlDependency SuperWord::control_dependency(Node_List* p) { } // Find the memop pack with the maximum vector width, unless they were already -// determined by SuperWord::filter_packs_for_alignment(). -void SuperWord::determine_mem_ref_and_aw_for_main_loop_alignment() { +// determined (e.g. by SuperWord::filter_packs_for_alignment()). +void VTransform::determine_mem_ref_and_aw_for_main_loop_alignment() { if (_mem_ref_for_main_loop_alignment != nullptr) { assert(VLoop::vectors_should_be_aligned(), "mem_ref only set if filtered for alignment"); return; @@ -3211,15 +2627,18 @@ void SuperWord::determine_mem_ref_and_aw_for_main_loop_alignment() { MemNode const* mem_ref = nullptr; int max_aw = 0; - for (int i = 0; i < _packset.length(); i++) { - Node_List* pack = _packset.at(i); - MemNode* first = pack->at(0)->isa_Mem(); - if (first == nullptr) { continue; } - int vw = first->memory_size() * pack->size(); + const GrowableArray<VTransformNode*>& vtnodes = _graph.vtnodes(); + for (int i = 0; i < vtnodes.length(); i++) { + VTransformVectorNode* vtn = vtnodes.at(i)->isa_Vector(); + if (vtn == nullptr) { continue; } + MemNode* p0 = vtn->nodes().at(0)->isa_Mem(); + if (p0 == nullptr) { continue; } + + int vw = p0->memory_size() * vtn->nodes().length(); if (vw > max_aw) { max_aw = vw; - mem_ref = first; + mem_ref = p0; } } assert(mem_ref != nullptr && max_aw > 0, "found mem_ref and aw"); @@ -3229,7 +2648,7 @@ void SuperWord::determine_mem_ref_and_aw_for_main_loop_alignment() { #define TRACE_ALIGN_VECTOR_NODE(node) { \ DEBUG_ONLY( \ - if (is_trace_align_vector()) { \ + if (_trace._align_vector) { \ tty->print(" " #node ": "); \ node->dump(); \ } \ @@ -3240,7 +2659,7 @@ void SuperWord::determine_mem_ref_and_aw_for_main_loop_alignment() { // the address of "_mem_ref_for_main_loop_alignment" to "_aw_for_main_loop_alignment", which is a // sufficiently large alignment width. We adjust the pre-loop iteration count by adjusting the // pre-loop limit. -void SuperWord::adjust_pre_loop_limit_to_align_main_loop_vectors() { +void VTransform::adjust_pre_loop_limit_to_align_main_loop_vectors() { determine_mem_ref_and_aw_for_main_loop_alignment(); const MemNode* align_to_ref = _mem_ref_for_main_loop_alignment; const int aw = _aw_for_main_loop_alignment; @@ -3397,8 +2816,8 @@ void SuperWord::adjust_pre_loop_limit_to_align_main_loop_vectors() { Node* invar = align_to_ref_p.invar(); #ifdef ASSERT - if (is_trace_align_vector()) { - tty->print_cr("\nadjust_pre_loop_limit_to_align_main_loop_vectors:"); + if (_trace._align_vector) { + tty->print_cr("\nVTransform::adjust_pre_loop_limit_to_align_main_loop_vectors:"); tty->print(" align_to_ref:"); align_to_ref->dump(); tty->print_cr(" aw: %d", aw); @@ -3424,7 +2843,7 @@ void SuperWord::adjust_pre_loop_limit_to_align_main_loop_vectors() { scale == 0 || !is_power_of_2(abs(scale)) || abs(scale) >= aw) { #ifdef ASSERT - if (is_trace_align_vector()) { + if (_trace._align_vector) { tty->print_cr(" Alignment cannot be affected by changing pre-loop limit because"); tty->print_cr(" stride or scale are not power of 2, or abs(scale) >= aw."); } @@ -3440,7 +2859,7 @@ void SuperWord::adjust_pre_loop_limit_to_align_main_loop_vectors() { const int AW = aw / abs(scale); #ifdef ASSERT - if (is_trace_align_vector()) { + if (_trace._align_vector) { tty->print_cr(" AW = aw(%d) / abs(scale(%d)) = %d", aw, scale, AW); } #endif @@ -3595,10 +3014,10 @@ void PackSet::print_pack(Node_List* pack) { #ifndef PRODUCT void VLoopBody::print() const { - tty->print_cr("\nBlock"); + tty->print_cr("\nVLoopBody::print"); for (int i = 0; i < body().length(); i++) { Node* n = body().at(i); - tty->print("%d ", i); + tty->print("%4d ", i); if (n != nullptr) { n->dump(); } @@ -3615,3 +3034,4 @@ bool SuperWord::same_origin_idx(Node* a, Node* b) const { bool SuperWord::same_generation(Node* a, Node* b) const { return a != nullptr && b != nullptr && _clone_map.same_gen(a->_idx, b->_idx); } + diff --git a/src/hotspot/share/opto/superword.hpp b/src/hotspot/share/opto/superword.hpp index fb91d014faebb..65f870825251f 100644 --- a/src/hotspot/share/opto/superword.hpp +++ b/src/hotspot/share/opto/superword.hpp @@ -25,6 +25,7 @@ #define SHARE_OPTO_SUPERWORD_HPP #include "opto/vectorization.hpp" +#include "opto/vtransform.hpp" #include "utilities/growableArray.hpp" // @@ -367,6 +368,10 @@ class PackSet : public StackObj { Node* same_inputs_at_index_or_null(const Node_List* pack, const int index) const; VTransformBoolTest get_bool_test(const Node_List* bool_pack) const; + Node_List* pack_input_at_index_or_null(const Node_List* pack, const int index) const { + return strided_pack_input_at_index_or_null(pack, index, 1, 0); + } + private: SplitStatus split_pack(const char* split_name, Node_List* pack, SplitTask task); public: @@ -599,13 +604,6 @@ class SuperWord : public ResourceObj { DEBUG_ONLY(void verify_packs() const;) - bool schedule_and_apply(); - bool apply(Node_List& memops_schedule); - void apply_memops_reordering_with_schedule(Node_List& memops_schedule); - bool apply_vectorization(); - // Create a vector operand for the nodes in pack p for operand: in(opd_idx) - Node* vector_opd(Node_List* p, int opd_idx); - // Can code be generated for the pack, restricted to size nodes? bool implemented(const Node_List* pack, const uint size) const; // Find the maximal implemented size smaller or equal to the packs size @@ -630,11 +628,7 @@ class SuperWord : public ResourceObj { bool is_velt_basic_type_compatible_use_def(Node* use, Node* def) const; - static LoadNode::ControlDependency control_dependency(Node_List* p); - - // Ensure that the main loop vectors are aligned by adjusting the pre loop limit. - void determine_mem_ref_and_aw_for_main_loop_alignment(); - void adjust_pre_loop_limit_to_align_main_loop_vectors(); + bool schedule_and_apply() const; }; #endif // SHARE_OPTO_SUPERWORD_HPP diff --git a/src/hotspot/share/opto/superwordVTransformBuilder.cpp b/src/hotspot/share/opto/superwordVTransformBuilder.cpp new file mode 100644 index 0000000000000..b0a0c97cb1676 --- /dev/null +++ b/src/hotspot/share/opto/superwordVTransformBuilder.cpp @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "precompiled.hpp" +#include "opto/superwordVTransformBuilder.hpp" +#include "opto/vectornode.hpp" + +void SuperWordVTransformBuilder::build() { + assert(!_packset.is_empty(), "must have non-empty packset"); + assert(!_vtransform.has_graph(), "start with empty vtransform"); + + // Create vtnodes for all nodes in the loop. + build_vector_vtnodes_for_packed_nodes(); + build_scalar_vtnodes_for_non_packed_nodes(); + + // Connect all vtnodes with their inputs. Possibly create vtnodes for input + // nodes that are outside the loop. + VectorSet vtn_dependencies; // Shared, but cleared for every vtnode. + build_inputs_for_vector_vtnodes(vtn_dependencies); + build_inputs_for_scalar_vtnodes(vtn_dependencies); +} + +void SuperWordVTransformBuilder::build_vector_vtnodes_for_packed_nodes() { + for (int i = 0; i < _packset.length(); i++) { + Node_List* pack = _packset.at(i); + VTransformVectorNode* vtn = make_vector_vtnode_for_pack(pack); + for (uint k = 0; k < pack->size(); k++) { + map_node_to_vtnode(pack->at(k), vtn); + } + } +} + +void SuperWordVTransformBuilder::build_scalar_vtnodes_for_non_packed_nodes() { + for (int i = 0; i < _vloop_analyzer.body().body().length(); i++) { + Node* n = _vloop_analyzer.body().body().at(i); + if (_packset.get_pack(n) != nullptr) { continue; } + VTransformScalarNode* vtn = new (_vtransform.arena()) VTransformScalarNode(_vtransform, n); + map_node_to_vtnode(n, vtn); + } +} + +void SuperWordVTransformBuilder::build_inputs_for_vector_vtnodes(VectorSet& vtn_dependencies) { + for (int i = 0; i < _packset.length(); i++) { + Node_List* pack = _packset.at(i); + Node* p0 = pack->at(0); + + VTransformVectorNode* vtn = get_vtnode(p0)->isa_Vector(); + assert(vtn != nullptr, "all packs must have vector vtnodes"); + vtn_dependencies.clear(); // Add every dependency only once per vtn. + + if (p0->is_Load()) { + set_req_with_scalar(p0, vtn, vtn_dependencies, MemNode::Address); + } else if (p0->is_Store()) { + set_req_with_scalar(p0, vtn, vtn_dependencies, MemNode::Address); + set_req_with_vector(pack, vtn, vtn_dependencies, MemNode::ValueIn); + } else if (vtn->isa_ReductionVector() != nullptr) { + set_req_with_scalar(p0, vtn, vtn_dependencies, 1); // scalar init + set_req_with_vector(pack, vtn, vtn_dependencies, 2); // vector + } else { + assert(vtn->isa_ElementWiseVector() != nullptr, "all other vtnodes are handled above"); + if (VectorNode::is_scalar_rotate(p0) && + p0->in(2)->is_Con() && + Matcher::supports_vector_constant_rotates(p0->in(2)->get_int())) { + set_req_with_vector(pack, vtn, vtn_dependencies, 1); + set_req_with_scalar(p0, vtn, vtn_dependencies, 2); // constant rotation + } else if (VectorNode::is_roundopD(p0)) { + set_req_with_vector(pack, vtn, vtn_dependencies, 1); + set_req_with_scalar(p0, vtn, vtn_dependencies, 2); // constant rounding mode + } else if (p0->is_CMove()) { + // Cmp + Bool + CMove -> VectorMaskCmp + VectorBlend. + set_all_req_with_vectors(pack, vtn, vtn_dependencies); + VTransformBoolVectorNode* vtn_mask_cmp = vtn->in(1)->isa_BoolVector(); + if (vtn_mask_cmp->test()._is_negated) { + vtn->swap_req(2, 3); // swap if test was negated. + } + } else { + set_all_req_with_vectors(pack, vtn, vtn_dependencies); + } + } + + for (uint k = 0; k < pack->size(); k++) { + add_dependencies_of_node_to_vtnode(pack->at(k), vtn, vtn_dependencies); + } + } +} + +void SuperWordVTransformBuilder::build_inputs_for_scalar_vtnodes(VectorSet& vtn_dependencies) { + for (int i = 0; i < _vloop_analyzer.body().body().length(); i++) { + Node* n = _vloop_analyzer.body().body().at(i); + VTransformScalarNode* vtn = get_vtnode(n)->isa_Scalar(); + if (vtn == nullptr) { continue; } + vtn_dependencies.clear(); // Add every dependency only once per vtn. + + if (n->is_Load()) { + set_req_with_scalar(n, vtn, vtn_dependencies, MemNode::Address); + } else if (n->is_Store()) { + set_req_with_scalar(n, vtn, vtn_dependencies, MemNode::Address); + set_req_with_scalar(n, vtn, vtn_dependencies, MemNode::ValueIn); + } else if (n->is_CountedLoop()) { + continue; // Is "root", has no dependency. + } else if (n->is_Phi()) { + // CountedLoop Phi's: ignore backedge (and entry value). + assert(n->in(0) == _vloop.cl(), "only Phi's from the CountedLoop allowed"); + set_req_with_scalar(n, vtn, vtn_dependencies, 0); + continue; + } else { + set_all_req_with_scalars(n, vtn, vtn_dependencies); + } + + add_dependencies_of_node_to_vtnode(n, vtn, vtn_dependencies); + } +} + +// Create a vtnode for each pack. No in/out edges set yet. +VTransformVectorNode* SuperWordVTransformBuilder::make_vector_vtnode_for_pack(const Node_List* pack) const { + uint pack_size = pack->size(); + Node* p0 = pack->at(0); + int opc = p0->Opcode(); + VTransformVectorNode* vtn = nullptr; + + if (p0->is_Load()) { + vtn = new (_vtransform.arena()) VTransformLoadVectorNode(_vtransform, pack_size); + } else if (p0->is_Store()) { + vtn = new (_vtransform.arena()) VTransformStoreVectorNode(_vtransform, pack_size); + } else if (p0->is_Bool()) { + VTransformBoolTest kind = _packset.get_bool_test(pack); + vtn = new (_vtransform.arena()) VTransformBoolVectorNode(_vtransform, pack_size, kind); + } else if (_vloop_analyzer.reductions().is_marked_reduction(p0)) { + vtn = new (_vtransform.arena()) VTransformReductionVectorNode(_vtransform, pack_size); + } else if (VectorNode::is_muladds2i(p0)) { + // A special kind of binary element-wise vector op: the inputs are "ints" a and b, + // but reinterpreted as two "shorts" [a0, a1] and [b0, b1]: + // v = MulAddS2I(a, b) = a0 * b0 + a1 + b1 + assert(p0->req() == 5, "MulAddS2I should have 4 operands"); + vtn = new (_vtransform.arena()) VTransformElementWiseVectorNode(_vtransform, 3, pack_size); + } else { + assert(p0->req() == 3 || + p0->is_CMove() || + VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(opc) || + VectorNode::is_convert_opcode(opc) || + VectorNode::is_scalar_unary_op_with_equal_input_and_output_types(opc) || + opc == Op_FmaD || + opc == Op_FmaF || + opc == Op_SignumF || + opc == Op_SignumD, + "pack type must be in this list"); + vtn = new (_vtransform.arena()) VTransformElementWiseVectorNode(_vtransform, p0->req(), pack_size); + } + vtn->set_nodes(pack); + return vtn; +} + +void SuperWordVTransformBuilder::set_req_with_scalar(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies, const int index) { + VTransformNode* req = get_vtnode_or_wrap_as_input_scalar(n->in(index)); + vtn->set_req(index, req); + vtn_dependencies.set(req->_idx); +} + +// Either get the existing vtnode vector input (when input is a pack), or else make a +// new vector vtnode for the input (e.g. for Replicate or PopulateIndex). +VTransformNode* SuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_index(const Node_List* pack, const int index) { + Node* p0 = pack->at(0); + + Node_List* pack_in = _packset.pack_input_at_index_or_null(pack, index); + if (pack_in != nullptr) { + // Input is a matching pack -> vtnode already exists. + assert(index != 2 || !VectorNode::is_shift(p0), "shift's count cannot be vector"); + return get_vtnode(pack_in->at(0)); + } + + if (VectorNode::is_muladds2i(p0)) { + assert(_packset.is_muladds2i_pack_with_pack_inputs(pack), "inputs must all be packs"); + // All inputs are strided (stride = 2), either with offset 0 or 1. + Node_List* pack_in0 = _packset.strided_pack_input_at_index_or_null(pack, index, 2, 0); + if (pack_in0 != nullptr) { + return get_vtnode(pack_in0->at(0)); + } + Node_List* pack_in1 = _packset.strided_pack_input_at_index_or_null(pack, index, 2, 1); + if (pack_in1 != nullptr) { + return get_vtnode(pack_in1->at(0)); + } + } + + Node* same_input = _packset.same_inputs_at_index_or_null(pack, index); + if (same_input == nullptr && p0->in(index) == _vloop.iv()) { + // PopulateIndex: [iv+0, iv+1, iv+2, ...] + VTransformNode* iv_vtn = get_vtnode_or_wrap_as_input_scalar(_vloop.iv()); + BasicType p0_bt = _vloop_analyzer.types().velt_basic_type(p0); + // If we have subword type, take that type directly. If p0 is some ConvI2L/F/D, + // then the p0_bt can also be L/F/D but we need to produce ints for the input of + // the ConvI2L/F/D. + BasicType element_bt = is_subword_type(p0_bt) ? p0_bt : T_INT; + VTransformNode* populate_index = new (_vtransform.arena()) VTransformPopulateIndexNode(_vtransform, pack->size(), element_bt); + populate_index->set_req(1, iv_vtn); + return populate_index; + } + + if (same_input != nullptr) { + VTransformNode* same_input_vtn = get_vtnode_or_wrap_as_input_scalar(same_input); + if (index == 2 && VectorNode::is_shift(p0)) { + // Scalar shift count for vector shift operation: vec2 = shiftV(vec1, scalar_count) + // Scalar shift operations masks the shift count, but the vector shift does not, so + // create a special ShiftCount node. + BasicType element_bt = _vloop_analyzer.types().velt_basic_type(p0); + juint mask = (p0->bottom_type() == TypeInt::INT) ? (BitsPerInt - 1) : (BitsPerLong - 1); + VTransformNode* shift_count = new (_vtransform.arena()) VTransformShiftCountNode(_vtransform, pack->size(), element_bt, mask, p0->Opcode()); + shift_count->set_req(1, same_input_vtn); + return shift_count; + } else { + // Replicate the scalar same_input to every vector element. + const Type* element_type = _vloop_analyzer.types().velt_type(p0); + if (index == 2 && VectorNode::is_scalar_rotate(p0) && element_type->isa_long()) { + // Scalar rotate has int rotation value, but the scalar rotate expects longs. + assert(same_input->bottom_type()->isa_int(), "scalar rotate expects int rotation"); + VTransformNode* conv = new (_vtransform.arena()) VTransformConvI2LNode(_vtransform); + conv->set_req(1, same_input_vtn); + same_input_vtn = conv; + } + VTransformNode* replicate = new (_vtransform.arena()) VTransformReplicateNode(_vtransform, pack->size(), element_type); + replicate->set_req(1, same_input_vtn); + return replicate; + } + } + + // The input is neither a pack not a same_input node. SuperWord::profitable does not allow + // any other case. In the future, we could insert a PackNode. +#ifdef ASSERT + tty->print_cr("\nSuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_index: index=%d", index); + pack->dump(); + assert(false, "Pack input was neither a pack nor a same_input node"); +#endif + ShouldNotReachHere(); +} + +VTransformNode* SuperWordVTransformBuilder::get_vtnode_or_wrap_as_input_scalar(Node* n) { + VTransformNode* vtn = get_vtnode_or_null(n); + if (vtn != nullptr) { return vtn; } + + assert(!_vloop.in_bb(n), "only nodes outside the loop can be input nodes to the loop"); + vtn = new (_vtransform.arena()) VTransformInputScalarNode(_vtransform, n); + map_node_to_vtnode(n, vtn); + return vtn; +} + +void SuperWordVTransformBuilder::set_req_with_vector(const Node_List* pack, VTransformNode* vtn, VectorSet& vtn_dependencies, int j) { + VTransformNode* req = get_or_make_vtnode_vector_input_at_index(pack, j); + vtn->set_req(j, req); + vtn_dependencies.set(req->_idx); +} + +void SuperWordVTransformBuilder::set_all_req_with_scalars(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies) { + assert(vtn->req() == n->req(), "scalars must have same number of reqs"); + for (uint j = 0; j < n->req(); j++) { + Node* def = n->in(j); + if (def == nullptr) { continue; } + set_req_with_scalar(n, vtn, vtn_dependencies, j); + } +} + +void SuperWordVTransformBuilder::set_all_req_with_vectors(const Node_List* pack, VTransformNode* vtn, VectorSet& vtn_dependencies) { + Node* p0 = pack->at(0); + assert(vtn->req() <= p0->req(), "must have at at most as many reqs"); + // Vectors have no ctrl, so ignore it. + for (uint j = 1; j < vtn->req(); j++) { + Node* def = p0->in(j); + if (def == nullptr) { continue; } + set_req_with_vector(pack, vtn, vtn_dependencies, j); + } +} + +void SuperWordVTransformBuilder::add_dependencies_of_node_to_vtnode(Node*n, VTransformNode* vtn, VectorSet& vtn_dependencies) { + for (VLoopDependencyGraph::PredsIterator preds(_vloop_analyzer.dependency_graph(), n); !preds.done(); preds.next()) { + Node* pred = preds.current(); + if (!_vloop.in_bb(pred)) { continue; } + + // Only add memory dependencies to memory nodes. All others are taken care of with the req. + if (n->is_Mem() && !pred->is_Mem()) { continue; } + + VTransformNode* dependency = get_vtnode(pred); + + // Reduction self-cycle? + if (vtn == dependency && _vloop_analyzer.reductions().is_marked_reduction(n)) { continue; } + + if (vtn_dependencies.test_set(dependency->_idx)) { continue; } + vtn->add_dependency(dependency); // Add every dependency only once per vtn. + } +} + diff --git a/src/hotspot/share/opto/superwordVTransformBuilder.hpp b/src/hotspot/share/opto/superwordVTransformBuilder.hpp new file mode 100644 index 0000000000000..847f870bef616 --- /dev/null +++ b/src/hotspot/share/opto/superwordVTransformBuilder.hpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "opto/vtransform.hpp" +#include "opto/superword.hpp" + +#ifndef SHARE_OPTO_SUPERWORD_VTRANSFORM_BUILDER_HPP +#define SHARE_OPTO_SUPERWORD_VTRANSFORM_BUILDER_HPP + +// Facility class that builds a VTransform from a SuperWord PackSet. +class SuperWordVTransformBuilder : public StackObj { +private: + const VLoopAnalyzer& _vloop_analyzer; + const VLoop& _vloop; + const PackSet& _packset; + VTransform& _vtransform; + + ResourceHashtable</* Node::_idx*/ int, VTransformNode* /* or null*/> _idx_to_vtnode; + +public: + SuperWordVTransformBuilder(const PackSet& packset, + VTransform& vtransform) : + _vloop_analyzer(vtransform.vloop_analyzer()), + _vloop(_vloop_analyzer.vloop()), + _packset(packset), + _vtransform(vtransform) + { + assert(!_vtransform.has_graph(), "constructor is passed an empty vtransform"); + build(); + assert(_vtransform.has_graph(), "vtransform must contain some vtnodes now"); + } + +private: + void build(); + void build_vector_vtnodes_for_packed_nodes(); + void build_scalar_vtnodes_for_non_packed_nodes(); + void build_inputs_for_vector_vtnodes(VectorSet& vtn_dependencies); + void build_inputs_for_scalar_vtnodes(VectorSet& vtn_dependencies); + + // Helper methods for building VTransform. + VTransformNode* get_vtnode_or_null(Node* n) const { + VTransformNode** ptr = _idx_to_vtnode.get(n->_idx); + return (ptr == nullptr) ? nullptr : *ptr; + } + + VTransformNode* get_vtnode(Node* n) const { + VTransformNode* vtn = get_vtnode_or_null(n); + assert(vtn != nullptr, "expect non-null vtnode"); + return vtn; + } + + void map_node_to_vtnode(Node* n, VTransformNode* vtn) { + assert(vtn != nullptr, "only set non-null vtnodes"); + _idx_to_vtnode.put_when_absent(n->_idx, vtn); + } + + VTransformVectorNode* make_vector_vtnode_for_pack(const Node_List* pack) const; + VTransformNode* get_or_make_vtnode_vector_input_at_index(const Node_List* pack, const int index); + VTransformNode* get_vtnode_or_wrap_as_input_scalar(Node* n); + void set_req_with_scalar(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies, const int index); + void set_req_with_vector(const Node_List* pack, VTransformNode* vtn, VectorSet& vtn_dependencies, const int index); + void set_all_req_with_scalars(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies); + void set_all_req_with_vectors(const Node_List* pack, VTransformNode* vtn, VectorSet& vtn_dependencies); + void add_dependencies_of_node_to_vtnode(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies); +}; + +#endif // SHARE_OPTO_SUPERWORD_VTRANSFORM_BUILDER_HPP diff --git a/src/hotspot/share/opto/traceAutoVectorizationTag.hpp b/src/hotspot/share/opto/traceAutoVectorizationTag.hpp index 3aae04c9453f5..038e04fe0c50b 100644 --- a/src/hotspot/share/opto/traceAutoVectorizationTag.hpp +++ b/src/hotspot/share/opto/traceAutoVectorizationTag.hpp @@ -43,6 +43,7 @@ flags(SW_INFO, "Trace SuperWord info (equivalent to TraceSuperWord)") \ flags(SW_VERBOSE, "Trace SuperWord verbose (all SW tags enabled)") \ flags(ALIGN_VECTOR, "Trace AlignVector") \ + flags(VTRANSFORM, "Trace VTransform Graph") \ flags(ALL, "Trace everything (very verbose)") #define table_entry(name, description) name, diff --git a/src/hotspot/share/opto/vectorization.cpp b/src/hotspot/share/opto/vectorization.cpp index 01b235e8b27e8..8d2d3868fe635 100644 --- a/src/hotspot/share/opto/vectorization.cpp +++ b/src/hotspot/share/opto/vectorization.cpp @@ -26,7 +26,6 @@ #include "opto/addnode.hpp" #include "opto/connode.hpp" #include "opto/convertnode.hpp" -#include "opto/matcher.hpp" #include "opto/mulnode.hpp" #include "opto/rootnode.hpp" #include "opto/vectorization.hpp" diff --git a/src/hotspot/share/opto/vectorization.hpp b/src/hotspot/share/opto/vectorization.hpp index c9f54594910ab..3984407c5654b 100644 --- a/src/hotspot/share/opto/vectorization.hpp +++ b/src/hotspot/share/opto/vectorization.hpp @@ -25,7 +25,7 @@ #ifndef SHARE_OPTO_VECTORIZATION_HPP #define SHARE_OPTO_VECTORIZATION_HPP -#include "opto/node.hpp" +#include "opto/matcher.hpp" #include "opto/loopnode.hpp" #include "opto/traceAutoVectorizationTag.hpp" #include "utilities/pair.hpp" @@ -763,9 +763,9 @@ class VPointer : public ArenaObj { } } - bool overlap_possible_with_any_in(const Node_List* p) const { - for (uint k = 0; k < p->size(); k++) { - MemNode* mem = p->at(k)->as_Mem(); + bool overlap_possible_with_any_in(const GrowableArray<Node*>& nodes) const { + for (int i = 0; i < nodes.length(); i++) { + MemNode* mem = nodes.at(i)->as_Mem(); VPointer p_mem(mem, _vloop); // Only if we know that we have Less or Greater can we // be sure that there can never be an overlap between @@ -1323,12 +1323,4 @@ class AlignmentSolver { #endif }; -struct VTransformBoolTest { - const BoolTest::mask _mask; - const bool _is_negated; - - VTransformBoolTest(const BoolTest::mask mask, bool is_negated) : - _mask(mask), _is_negated(is_negated) {} -}; - #endif // SHARE_OPTO_VECTORIZATION_HPP diff --git a/src/hotspot/share/opto/vtransform.cpp b/src/hotspot/share/opto/vtransform.cpp new file mode 100644 index 0000000000000..e40157caa362b --- /dev/null +++ b/src/hotspot/share/opto/vtransform.cpp @@ -0,0 +1,450 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "precompiled.hpp" +#include "opto/vtransform.hpp" +#include "opto/vectornode.hpp" +#include "opto/convertnode.hpp" + +void VTransformGraph::add_vtnode(VTransformNode* vtnode) { + assert(vtnode->_idx == _vtnodes.length(), "position must match idx"); + _vtnodes.push(vtnode); +} + +// Compute a linearization of the graph. We do this with a reverse-post-order of a DFS. +// This only works if the graph is a directed acyclic graph (DAG). The C2 graph, and +// the VLoopDependencyGraph are both DAGs, but after introduction of vectors/packs, the +// graph has additional constraints which can introduce cycles. Example: +// +// +--------+ +// A -> X | v +// Pack [A,B] and [X,Y] [A,B] [X,Y] +// Y -> B ^ | +// +--------+ +// +// We return "true" IFF we find no cycle, i.e. if the linearization succeeds. +bool VTransformGraph::schedule() { + assert(!is_scheduled(), "not yet scheduled"); + +#ifndef PRODUCT + if (_trace._verbose) { + print_vtnodes(); + } +#endif + + ResourceMark rm; + GrowableArray<VTransformNode*> stack; + VectorSet pre_visited; + VectorSet post_visited; + + collect_nodes_without_req_or_dependency(stack); + + // We create a reverse-post-visit order. This gives us a linearization, if there are + // no cycles. Then, we simply reverse the order, and we have a schedule. + int rpo_idx = _vtnodes.length() - 1; + while (!stack.is_empty()) { + VTransformNode* vtn = stack.top(); + if (!pre_visited.test_set(vtn->_idx)) { + // Forward arc in graph (pre-visit). + } else if (!post_visited.test(vtn->_idx)) { + // Forward arc in graph. Check if all uses were already visited: + // Yes -> post-visit. + // No -> we are mid-visit. + bool all_uses_already_visited = true; + + for (int i = 0; i < vtn->outs(); i++) { + VTransformNode* use = vtn->out(i); + if (post_visited.test(use->_idx)) { continue; } + if (pre_visited.test(use->_idx)) { + // Cycle detected! + // The nodes that are pre_visited but not yet post_visited form a path from + // the "root" to the current vtn. Now, we are looking at an edge (vtn, use), + // and discover that use is also pre_visited but not post_visited. Thus, use + // lies on that path from "root" to vtn, and the edge (vtn, use) closes a + // cycle. + NOT_PRODUCT(if (_trace._rejections) { trace_schedule_cycle(stack, pre_visited, post_visited); } ) + return false; + } + stack.push(use); + all_uses_already_visited = false; + } + + if (all_uses_already_visited) { + stack.pop(); + post_visited.set(vtn->_idx); // post-visit + _schedule.at_put_grow(rpo_idx--, vtn); // assign rpo_idx + } + } else { + stack.pop(); // Already post-visited. Ignore secondary edge. + } + } + +#ifndef PRODUCT + if (_trace._verbose) { + print_schedule(); + } +#endif + + assert(rpo_idx == -1, "used up all rpo_idx, rpo_idx=%d", rpo_idx); + return true; +} + +// Push all "root" nodes, i.e. those that have no inputs (req or dependency): +void VTransformGraph::collect_nodes_without_req_or_dependency(GrowableArray<VTransformNode*>& stack) const { + for (int i = 0; i < _vtnodes.length(); i++) { + VTransformNode* vtn = _vtnodes.at(i); + if (!vtn->has_req_or_dependency()) { + stack.push(vtn); + } + } +} + +#ifndef PRODUCT +void VTransformGraph::trace_schedule_cycle(const GrowableArray<VTransformNode*>& stack, + const VectorSet& pre_visited, + const VectorSet& post_visited) const { + tty->print_cr("\nVTransform::schedule found a cycle on path (P), vectorization attempt fails."); + for (int j = 0; j < stack.length(); j++) { + VTransformNode* n = stack.at(j); + bool on_path = pre_visited.test(n->_idx) && !post_visited.test(n->_idx); + tty->print(" %s ", on_path ? "P" : "_"); + n->print(); + } +} + +void VTransformApplyResult::trace(VTransformNode* vtnode) const { + tty->print(" apply: "); + vtnode->print(); + tty->print(" -> "); + if (_node == nullptr) { + tty->print_cr("nullptr"); + } else { + _node->dump(); + } +} +#endif + +Node* VTransformNode::find_transformed_input(int i, const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + Node* n = vnode_idx_to_transformed_node.at(in(i)->_idx); + assert(n != nullptr, "must find input IR node"); + return n; +} + +VTransformApplyResult VTransformScalarNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + // This was just wrapped. Now we simply unwap without touching the inputs. + return VTransformApplyResult::make_scalar(_node); +} + +VTransformApplyResult VTransformReplicateNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + Node* val = find_transformed_input(1, vnode_idx_to_transformed_node); + VectorNode* vn = VectorNode::scalar2vector(val, _vlen, _element_type); + register_new_node_from_vectorization(vloop_analyzer, vn, val); + return VTransformApplyResult::make_vector(vn, _vlen, vn->length_in_bytes()); +} + +VTransformApplyResult VTransformConvI2LNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + Node* val = find_transformed_input(1, vnode_idx_to_transformed_node); + Node* n = new ConvI2LNode(val); + register_new_node_from_vectorization(vloop_analyzer, n, val); + return VTransformApplyResult::make_scalar(n); +} + +VTransformApplyResult VTransformShiftCountNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + PhaseIdealLoop* phase = vloop_analyzer.vloop().phase(); + Node* shift_count_in = find_transformed_input(1, vnode_idx_to_transformed_node); + assert(shift_count_in->bottom_type()->isa_int(), "int type only for shift count"); + // The shift_count_in would be automatically truncated to the lowest _mask + // bits in a scalar shift operation. But vector shift does not truncate, so + // we must apply the mask now. + Node* shift_count_masked = new AndINode(shift_count_in, phase->igvn().intcon(_mask)); + register_new_node_from_vectorization(vloop_analyzer, shift_count_masked, shift_count_in); + // Now that masked value is "boadcast" (some platforms only set the lowest element). + VectorNode* vn = VectorNode::shift_count(_shift_opcode, shift_count_masked, _vlen, _element_bt); + register_new_node_from_vectorization(vloop_analyzer, vn, shift_count_in); + return VTransformApplyResult::make_vector(vn, _vlen, vn->length_in_bytes()); +} + + +VTransformApplyResult VTransformPopulateIndexNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + PhaseIdealLoop* phase = vloop_analyzer.vloop().phase(); + Node* val = find_transformed_input(1, vnode_idx_to_transformed_node); + assert(val->is_Phi(), "expected to be iv"); + assert(VectorNode::is_populate_index_supported(_element_bt), "should support"); + const TypeVect* vt = TypeVect::make(_element_bt, _vlen); + VectorNode* vn = new PopulateIndexNode(val, phase->igvn().intcon(1), vt); + register_new_node_from_vectorization(vloop_analyzer, vn, val); + return VTransformApplyResult::make_vector(vn, _vlen, vn->length_in_bytes()); +} + +VTransformApplyResult VTransformElementWiseVectorNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + Node* first = nodes().at(0); + uint vlen = nodes().length(); + int opc = first->Opcode(); + BasicType bt = vloop_analyzer.types().velt_basic_type(first); + + if (first->is_Cmp()) { + // Cmp + Bool -> VectorMaskCmp + // Handled by Bool / VTransformBoolVectorNode, so we do not generate any nodes here. + return VTransformApplyResult::make_empty(); + } + + assert(2 <= req() && req() <= 4, "Must have 1-3 inputs"); + VectorNode* vn = nullptr; + Node* in1 = find_transformed_input(1, vnode_idx_to_transformed_node); + Node* in2 = (req() >= 3) ? find_transformed_input(2, vnode_idx_to_transformed_node) : nullptr; + Node* in3 = (req() >= 4) ? find_transformed_input(3, vnode_idx_to_transformed_node) : nullptr; + + if (first->is_CMove()) { + assert(req() == 4, "three inputs expected: mask, blend1, blend2"); + vn = new VectorBlendNode(/* blend1 */ in2, /* blend2 */ in3, /* mask */ in1); + } else if (VectorNode::is_convert_opcode(opc)) { + assert(first->req() == 2 && req() == 2, "only one input expected"); + int vopc = VectorCastNode::opcode(opc, in1->bottom_type()->is_vect()->element_basic_type()); + vn = VectorCastNode::make(vopc, in1, bt, vlen); + } else if (VectorNode::can_use_RShiftI_instead_of_URShiftI(first, bt)) { + opc = Op_RShiftI; + vn = VectorNode::make(opc, in1, in2, vlen, bt); + } else if (VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(opc)) { + // The scalar operation was a long -> int operation. + // However, the vector operation is long -> long. + VectorNode* long_vn = VectorNode::make(opc, in1, nullptr, vlen, T_LONG); + register_new_node_from_vectorization(vloop_analyzer, long_vn, first); + // Cast long -> int, to mimic the scalar long -> int operation. + vn = VectorCastNode::make(Op_VectorCastL2X, long_vn, T_INT, vlen); + } else if (req() == 3 || + VectorNode::is_scalar_unary_op_with_equal_input_and_output_types(opc)) { + assert(!VectorNode::is_roundopD(first) || in2->is_Con(), "rounding mode must be constant"); + vn = VectorNode::make(opc, in1, in2, vlen, bt); // unary and binary + } else { + assert(req() == 4, "three inputs expected"); + assert(opc == Op_FmaD || + opc == Op_FmaF || + opc == Op_SignumF || + opc == Op_SignumD, + "element wise operation must be from this list"); + vn = VectorNode::make(opc, in1, in2, in3, vlen, bt); // ternary + } + + register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn); + return VTransformApplyResult::make_vector(vn, vlen, vn->length_in_bytes()); +} + +VTransformApplyResult VTransformBoolVectorNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + BoolNode* first = nodes().at(0)->as_Bool(); + uint vlen = nodes().length(); + BasicType bt = vloop_analyzer.types().velt_basic_type(first); + + // Cmp + Bool -> VectorMaskCmp + VTransformElementWiseVectorNode* vtn_cmp = in(1)->isa_ElementWiseVector(); + assert(vtn_cmp != nullptr && vtn_cmp->nodes().at(0)->is_Cmp(), + "bool vtn expects cmp vtn as input"); + + Node* cmp_in1 = vtn_cmp->find_transformed_input(1, vnode_idx_to_transformed_node); + Node* cmp_in2 = vtn_cmp->find_transformed_input(2, vnode_idx_to_transformed_node); + BoolTest::mask mask = test()._mask; + + PhaseIdealLoop* phase = vloop_analyzer.vloop().phase(); + ConINode* mask_node = phase->igvn().intcon((int)mask); + const TypeVect* vt = TypeVect::make(bt, vlen); + VectorNode* vn = new VectorMaskCmpNode(mask, cmp_in1, cmp_in2, mask_node, vt); + register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn); + return VTransformApplyResult::make_vector(vn, vlen, vn->vect_type()->length_in_bytes()); +} + +VTransformApplyResult VTransformReductionVectorNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + Node* first = nodes().at(0); + uint vlen = nodes().length(); + int opc = first->Opcode(); + BasicType bt = first->bottom_type()->basic_type(); + + Node* init = find_transformed_input(1, vnode_idx_to_transformed_node); + Node* vec = find_transformed_input(2, vnode_idx_to_transformed_node); + + ReductionNode* vn = ReductionNode::make(opc, nullptr, init, vec, bt); + register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn); + return VTransformApplyResult::make_vector(vn, vlen, vn->vect_type()->length_in_bytes()); +} + +VTransformApplyResult VTransformLoadVectorNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + LoadNode* first = nodes().at(0)->as_Load(); + uint vlen = nodes().length(); + Node* ctrl = first->in(MemNode::Control); + Node* mem = first->in(MemNode::Memory); + Node* adr = first->in(MemNode::Address); + int opc = first->Opcode(); + const TypePtr* adr_type = first->adr_type(); + BasicType bt = vloop_analyzer.types().velt_basic_type(first); + + // Set the memory dependency of the LoadVector as early as possible. + // Walk up the memory chain, and ignore any StoreVector that provably + // does not have any memory dependency. + while (mem->is_StoreVector()) { + VPointer p_store(mem->as_Mem(), vloop_analyzer.vloop()); + if (p_store.overlap_possible_with_any_in(nodes())) { + break; + } else { + mem = mem->in(MemNode::Memory); + } + } + + LoadVectorNode* vn = LoadVectorNode::make(opc, ctrl, mem, adr, adr_type, vlen, bt, + control_dependency()); + DEBUG_ONLY( if (VerifyAlignVector) { vn->set_must_verify_alignment(); } ) + register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn); + return VTransformApplyResult::make_vector(vn, vlen, vn->memory_size()); +} + +VTransformApplyResult VTransformStoreVectorNode::apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const { + StoreNode* first = nodes().at(0)->as_Store(); + uint vlen = nodes().length(); + Node* ctrl = first->in(MemNode::Control); + Node* mem = first->in(MemNode::Memory); + Node* adr = first->in(MemNode::Address); + int opc = first->Opcode(); + const TypePtr* adr_type = first->adr_type(); + + Node* value = find_transformed_input(MemNode::ValueIn, vnode_idx_to_transformed_node); + StoreVectorNode* vn = StoreVectorNode::make(opc, ctrl, mem, adr, adr_type, value, vlen); + DEBUG_ONLY( if (VerifyAlignVector) { vn->set_must_verify_alignment(); } ) + register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn); + return VTransformApplyResult::make_vector(vn, vlen, vn->memory_size()); +} + +void VTransformVectorNode::register_new_node_from_vectorization_and_replace_scalar_nodes(const VLoopAnalyzer& vloop_analyzer, Node* vn) const { + PhaseIdealLoop* phase = vloop_analyzer.vloop().phase(); + Node* first = nodes().at(0); + + register_new_node_from_vectorization(vloop_analyzer, vn, first); + + for (int i = 0; i < _nodes.length(); i++) { + Node* n = _nodes.at(i); + phase->igvn().replace_node(n, vn); + } +} + +void VTransformNode::register_new_node_from_vectorization(const VLoopAnalyzer& vloop_analyzer, Node* vn, Node* old_node) const { + PhaseIdealLoop* phase = vloop_analyzer.vloop().phase(); + phase->register_new_node_with_ctrl_of(vn, old_node); + phase->igvn()._worklist.push(vn); + VectorNode::trace_new_vector(vn, "AutoVectorization"); +} + +#ifndef PRODUCT +void VTransformGraph::print_vtnodes() const { + tty->print_cr("\nVTransformGraph::print_vtnodes:"); + for (int i = 0; i < _vtnodes.length(); i++) { + _vtnodes.at(i)->print(); + } +} + +void VTransformGraph::print_schedule() const { + tty->print_cr("\nVTransformGraph::print_schedule:"); + for (int i = 0; i < _schedule.length(); i++) { + tty->print(" %3d: ", i); + VTransformNode* vtn = _schedule.at(i); + if (vtn == nullptr) { + tty->print_cr("nullptr"); + } else { + vtn->print(); + } + } +} + +void VTransformGraph::print_memops_schedule() const { + tty->print_cr("\nVTransformGraph::print_memops_schedule:"); + int i = 0; + for_each_memop_in_schedule([&] (MemNode* mem) { + tty->print(" %3d: ", i++); + mem->dump(); + }); +} + +void VTransformNode::print() const { + tty->print("%3d %s (", _idx, name()); + for (uint i = 0; i < _req; i++) { + print_node_idx(_in.at(i)); + } + if ((uint)_in.length() > _req) { + tty->print(" |"); + for (int i = _req; i < _in.length(); i++) { + print_node_idx(_in.at(i)); + } + } + tty->print(") ["); + for (int i = 0; i < _out.length(); i++) { + print_node_idx(_out.at(i)); + } + tty->print("] "); + print_spec(); + tty->cr(); +} + +void VTransformNode::print_node_idx(const VTransformNode* vtn) { + if (vtn == nullptr) { + tty->print(" _"); + } else { + tty->print(" %d", vtn->_idx); + } +} + +void VTransformScalarNode::print_spec() const { + tty->print("node[%d %s]", _node->_idx, _node->Name()); +} + +void VTransformReplicateNode::print_spec() const { + tty->print("vlen=%d element_type=", _vlen); + _element_type->dump(); +} + +void VTransformShiftCountNode::print_spec() const { + tty->print("vlen=%d element_bt=%s mask=%d shift_opcode=%s", + _vlen, type2name(_element_bt), _mask, + NodeClassNames[_shift_opcode]); +} + +void VTransformPopulateIndexNode::print_spec() const { + tty->print("vlen=%d element_bt=%s", _vlen, type2name(_element_bt)); +} + +void VTransformVectorNode::print_spec() const { + tty->print("%d-pack[", _nodes.length()); + for (int i = 0; i < _nodes.length(); i++) { + Node* n = _nodes.at(i); + if (i > 0) { + tty->print(", "); + } + tty->print("%d %s", n->_idx, n->Name()); + } + tty->print("]"); +} +#endif diff --git a/src/hotspot/share/opto/vtransform.hpp b/src/hotspot/share/opto/vtransform.hpp new file mode 100644 index 0000000000000..071674533a798 --- /dev/null +++ b/src/hotspot/share/opto/vtransform.hpp @@ -0,0 +1,515 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#ifndef SHARE_OPTO_VTRANSFORM_HPP +#define SHARE_OPTO_VTRANSFORM_HPP + +#include "opto/node.hpp" +#include "opto/vectorization.hpp" + +// VTransform: +// - Models the transformation of the scalar loop to vectorized loop: +// It is a "C2 subgraph" -> "C2 subgraph" mapping. +// - The VTransform contains a graph (VTransformGraph), which consists of +// many vtnodes (VTransformNode). +// - Each vtnode models a part of the transformation, and is supposed +// to represent the output C2 nodes after the vectorization as closely +// as possible. +// +// This is the life-cycle of a VTransform: +// - Construction: +// - From SuperWord, with the SuperWordVTransformBuilder. +// +// - Future Plans: optimize, if-conversion, etc. +// +// - Schedule: +// - Compute linearization of the VTransformGraph, into an order that respects +// all edges in the graph (bailout if cycle detected). +// +// - Apply: +// - Changes to the C2 IR are only made once the "apply" method is called. +// - Each vtnode generates its corresponding scalar and vector C2 nodes, +// possibly replacing old scalar C2 nodes. +// +// Future Plans with VTransform: +// - Cost model: estimate if vectorization is profitable. +// - Optimizations: moving unordered reductions out of the loop, whih decreases cost. +// - Pack/Unpack/Shuffle: introduce additional nodes not present in the scalar loop. +// This is difficult to do with the SuperWord packset approach. +// - If-conversion: convert predicated nodes into CFG. + +typedef int VTransformNodeIDX; +class VTransformNode; +class VTransformScalarNode; +class VTransformInputScalarNode; +class VTransformVectorNode; +class VTransformElementWiseVectorNode; +class VTransformBoolVectorNode; +class VTransformReductionVectorNode; + +// Result from VTransformNode::apply +class VTransformApplyResult { +private: + Node* const _node; + const uint _vector_length; // number of elements + const uint _vector_width; // total width in bytes + + VTransformApplyResult(Node* n, uint vector_length, uint vector_width) : + _node(n), + _vector_length(vector_length), + _vector_width(vector_width) {} + +public: + static VTransformApplyResult make_scalar(Node* n) { + return VTransformApplyResult(n, 0, 0); + } + + static VTransformApplyResult make_vector(Node* n, uint vector_length, uint vector_width) { + assert(vector_length > 0 && vector_width > 0, "must have nonzero size"); + return VTransformApplyResult(n, vector_length, vector_width); + } + + static VTransformApplyResult make_empty() { + return VTransformApplyResult(nullptr, 0, 0); + } + + Node* node() const { return _node; } + uint vector_length() const { return _vector_length; } + uint vector_width() const { return _vector_width; } + NOT_PRODUCT( void trace(VTransformNode* vtnode) const; ) +}; + +#ifndef PRODUCT +// Convenience class for tracing flags. +class VTransformTrace { +public: + const bool _verbose; + const bool _rejections; + const bool _align_vector; + const bool _info; + + VTransformTrace(const VTrace& vtrace, + const bool is_trace_rejections, + const bool is_trace_align_vector, + const bool is_trace_info) : + _verbose (vtrace.is_trace(TraceAutoVectorizationTag::ALL)), + _rejections (_verbose | is_trace_vtransform(vtrace) | is_trace_rejections), + _align_vector(_verbose | is_trace_vtransform(vtrace) | is_trace_align_vector), + _info (_verbose | is_trace_vtransform(vtrace) | is_trace_info) {} + + static bool is_trace_vtransform(const VTrace& vtrace) { + return vtrace.is_trace(TraceAutoVectorizationTag::VTRANSFORM); + } +}; +#endif + +// VTransformGraph: component of VTransform +// See description at top of this file. +class VTransformGraph : public StackObj { +private: + const VLoopAnalyzer& _vloop_analyzer; + const VLoop& _vloop; + + NOT_PRODUCT(const VTransformTrace _trace;) + + VTransformNodeIDX _next_idx; + GrowableArray<VTransformNode*> _vtnodes; + + // Schedule (linearization) of the graph. We use this to reorder the memory graph + // before inserting vector operations. + GrowableArray<VTransformNode*> _schedule; + +public: + VTransformGraph(const VLoopAnalyzer& vloop_analyzer, + Arena& arena + NOT_PRODUCT( COMMA const VTransformTrace trace)) : + _vloop_analyzer(vloop_analyzer), + _vloop(vloop_analyzer.vloop()), + NOT_PRODUCT(_trace(trace) COMMA) + _next_idx(0), + _vtnodes(&arena, _vloop.estimated_body_length(), 0, nullptr), + _schedule(&arena, _vloop.estimated_body_length(), 0, nullptr) {} + + VTransformNodeIDX new_idx() { return _next_idx++; } + void add_vtnode(VTransformNode* vtnode); + DEBUG_ONLY( bool is_empty() const { return _vtnodes.is_empty(); } ) + DEBUG_ONLY( bool is_scheduled() const { return _schedule.is_nonempty(); } ) + const GrowableArray<VTransformNode*>& vtnodes() const { return _vtnodes; } + + bool schedule(); + void apply_memops_reordering_with_schedule() const; + void apply_vectorization_for_each_vtnode(uint& max_vector_length, uint& max_vector_width) const; + +private: + // VLoop accessors + PhaseIdealLoop* phase() const { return _vloop.phase(); } + PhaseIterGVN& igvn() const { return _vloop.phase()->igvn(); } + bool in_bb(const Node* n) const { return _vloop.in_bb(n); } + + void collect_nodes_without_req_or_dependency(GrowableArray<VTransformNode*>& stack) const; + + template<typename Callback> + void for_each_memop_in_schedule(Callback callback) const; + +#ifndef PRODUCT + void print_vtnodes() const; + void print_schedule() const; + void print_memops_schedule() const; + void trace_schedule_cycle(const GrowableArray<VTransformNode*>& stack, + const VectorSet& pre_visited, + const VectorSet& post_visited) const; +#endif +}; + +// VTransform: models the transformation of the scalar loop to vectorized loop. +// It is a "C2 subgraph" to "C2 subgraph" mapping. +// See description at top of this file. +class VTransform : public StackObj { +private: + const VLoopAnalyzer& _vloop_analyzer; + const VLoop& _vloop; + + NOT_PRODUCT(const VTransformTrace _trace;) + + // Everything in the vtransform is allocated from this arena, including all vtnodes. + Arena _arena; + + VTransformGraph _graph; + + // Memory reference, and the alignment width (aw) for which we align the main-loop, + // by adjusting the pre-loop limit. + MemNode const* _mem_ref_for_main_loop_alignment; + int _aw_for_main_loop_alignment; + +public: + VTransform(const VLoopAnalyzer& vloop_analyzer, + MemNode const* mem_ref_for_main_loop_alignment, + int aw_for_main_loop_alignment + NOT_PRODUCT( COMMA const VTransformTrace trace) + ) : + _vloop_analyzer(vloop_analyzer), + _vloop(vloop_analyzer.vloop()), + NOT_PRODUCT(_trace(trace) COMMA) + _arena(mtCompiler), + _graph(_vloop_analyzer, _arena NOT_PRODUCT(COMMA _trace)), + _mem_ref_for_main_loop_alignment(mem_ref_for_main_loop_alignment), + _aw_for_main_loop_alignment(aw_for_main_loop_alignment) {} + + const VLoopAnalyzer& vloop_analyzer() const { return _vloop_analyzer; } + Arena* arena() { return &_arena; } + DEBUG_ONLY( bool has_graph() const { return !_graph.is_empty(); } ) + VTransformGraph& graph() { return _graph; } + + bool schedule() { return _graph.schedule(); } + void apply(); + +private: + // VLoop accessors + PhaseIdealLoop* phase() const { return _vloop.phase(); } + PhaseIterGVN& igvn() const { return _vloop.phase()->igvn(); } + IdealLoopTree* lpt() const { return _vloop.lpt(); } + CountedLoopNode* cl() const { return _vloop.cl(); } + int iv_stride() const { return cl()->stride_con(); } + + // VLoopVPointers accessors + const VPointer& vpointer(const MemNode* mem) const { + return _vloop_analyzer.vpointers().vpointer(mem); + } + + // Ensure that the main loop vectors are aligned by adjusting the pre loop limit. + void determine_mem_ref_and_aw_for_main_loop_alignment(); + void adjust_pre_loop_limit_to_align_main_loop_vectors(); + + void apply_vectorization() const; +}; + +// The vtnodes (VTransformNode) resemble the C2 IR Nodes, and model a part of the +// VTransform. Many such vtnodes make up the VTransformGraph. The vtnodes represent +// the resulting scalar and vector nodes as closely as possible. +// See description at top of this file. +class VTransformNode : public ArenaObj { +public: + const VTransformNodeIDX _idx; + +private: + // _in is split into required inputs (_req), and additional dependencies. + const uint _req; + GrowableArray<VTransformNode*> _in; + GrowableArray<VTransformNode*> _out; + +public: + VTransformNode(VTransform& vtransform, const uint req) : + _idx(vtransform.graph().new_idx()), + _req(req), + _in(vtransform.arena(), req, req, nullptr), + _out(vtransform.arena(), 4, 0, nullptr) + { + vtransform.graph().add_vtnode(this); + } + + void set_req(uint i, VTransformNode* n) { + assert(i < _req, "must be a req"); + assert(_in.at(i) == nullptr && n != nullptr, "only set once"); + _in.at_put(i, n); + n->add_out(this); + } + + void swap_req(uint i, uint j) { + assert(i < _req, "must be a req"); + assert(j < _req, "must be a req"); + VTransformNode* tmp = _in.at(i); + _in.at_put(i, _in.at(j)); + _in.at_put(j, tmp); + } + + void add_dependency(VTransformNode* n) { + assert(n != nullptr, "no need to add nullptr"); + _in.push(n); + n->add_out(this); + } + + void add_out(VTransformNode* n) { + _out.push(n); + } + + uint req() const { return _req; } + VTransformNode* in(int i) const { return _in.at(i); } + int outs() const { return _out.length(); } + VTransformNode* out(int i) const { return _out.at(i); } + + bool has_req_or_dependency() const { + for (int i = 0; i < _in.length(); i++) { + if (_in.at(i) != nullptr) { return true; } + } + return false; + } + + virtual VTransformScalarNode* isa_Scalar() { return nullptr; } + virtual VTransformInputScalarNode* isa_InputScalar() { return nullptr; } + virtual VTransformVectorNode* isa_Vector() { return nullptr; } + virtual VTransformElementWiseVectorNode* isa_ElementWiseVector() { return nullptr; } + virtual VTransformBoolVectorNode* isa_BoolVector() { return nullptr; } + virtual VTransformReductionVectorNode* isa_ReductionVector() { return nullptr; } + + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const = 0; + + Node* find_transformed_input(int i, const GrowableArray<Node*>& vnode_idx_to_transformed_node) const; + + void register_new_node_from_vectorization(const VLoopAnalyzer& vloop_analyzer, Node* vn, Node* old_node) const; + + NOT_PRODUCT(virtual const char* name() const = 0;) + NOT_PRODUCT(void print() const;) + NOT_PRODUCT(virtual void print_spec() const {};) + NOT_PRODUCT(static void print_node_idx(const VTransformNode* vtn);) +}; + +// Identity transform for scalar nodes. +class VTransformScalarNode : public VTransformNode { +private: + Node* _node; +public: + VTransformScalarNode(VTransform& vtransform, Node* n) : + VTransformNode(vtransform, n->req()), _node(n) {} + Node* node() const { return _node; } + virtual VTransformScalarNode* isa_Scalar() override { return this; } + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "Scalar"; };) + NOT_PRODUCT(virtual void print_spec() const override;) +}; + +// Wrapper node for nodes outside the loop that are inputs to nodes in the loop. +// Since we want the loop-internal nodes to be able to reference all inputs as vtnodes, +// we must wrap the inputs that are outside the loop into special vtnodes, too. +class VTransformInputScalarNode : public VTransformScalarNode { +public: + VTransformInputScalarNode(VTransform& vtransform, Node* n) : + VTransformScalarNode(vtransform, n) {} + virtual VTransformInputScalarNode* isa_InputScalar() override { return this; } + NOT_PRODUCT(virtual const char* name() const override { return "InputScalar"; };) +}; + +// Transform produces a ReplicateNode, replicating the input to all vector lanes. +class VTransformReplicateNode : public VTransformNode { +private: + int _vlen; + const Type* _element_type; +public: + VTransformReplicateNode(VTransform& vtransform, int vlen, const Type* element_type) : + VTransformNode(vtransform, 2), _vlen(vlen), _element_type(element_type) {} + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "Replicate"; };) + NOT_PRODUCT(virtual void print_spec() const override;) +}; + +// Transform introduces a scalar ConvI2LNode that was not previously in the C2 graph. +class VTransformConvI2LNode : public VTransformNode { +public: + VTransformConvI2LNode(VTransform& vtransform) : VTransformNode(vtransform, 2) {} + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "ConvI2L"; };) +}; + +// Transform introduces a shift-count node that truncates the shift count for a vector shift. +class VTransformShiftCountNode : public VTransformNode { +private: + int _vlen; + const BasicType _element_bt; + juint _mask; + int _shift_opcode; +public: + VTransformShiftCountNode(VTransform& vtransform, int vlen, BasicType element_bt, juint mask, int shift_opcode) : + VTransformNode(vtransform, 2), _vlen(vlen), _element_bt(element_bt), _mask(mask), _shift_opcode(shift_opcode) {} + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "ShiftCount"; };) + NOT_PRODUCT(virtual void print_spec() const override;) +}; + +// Transform introduces a PopulateIndex node: [phi, phi+1, phi+2, phi+3, ...]. +class VTransformPopulateIndexNode : public VTransformNode { +private: + int _vlen; + const BasicType _element_bt; +public: + VTransformPopulateIndexNode(VTransform& vtransform, int vlen, const BasicType element_bt) : + VTransformNode(vtransform, 2), _vlen(vlen), _element_bt(element_bt) {} + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "PopulateIndex"; };) + NOT_PRODUCT(virtual void print_spec() const override;) +}; + +// Base class for all vector vtnodes. +class VTransformVectorNode : public VTransformNode { +private: + GrowableArray<Node*> _nodes; +public: + VTransformVectorNode(VTransform& vtransform, const uint req, const uint number_of_nodes) : + VTransformNode(vtransform, req), _nodes(vtransform.arena(), number_of_nodes, number_of_nodes, nullptr) {} + + void set_nodes(const Node_List* pack) { + for (uint k = 0; k < pack->size(); k++) { + _nodes.at_put(k, pack->at(k)); + } + } + + const GrowableArray<Node*>& nodes() const { return _nodes; } + virtual VTransformVectorNode* isa_Vector() override { return this; } + void register_new_node_from_vectorization_and_replace_scalar_nodes(const VLoopAnalyzer& vloop_analyzer, Node* vn) const; + NOT_PRODUCT(virtual void print_spec() const override;) +}; + +// Catch all for all element-wise vector operations. +class VTransformElementWiseVectorNode : public VTransformVectorNode { +public: + VTransformElementWiseVectorNode(VTransform& vtransform, uint req, uint number_of_nodes) : + VTransformVectorNode(vtransform, req, number_of_nodes) {} + virtual VTransformElementWiseVectorNode* isa_ElementWiseVector() override { return this; } + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "ElementWiseVector"; };) +}; + +struct VTransformBoolTest { + const BoolTest::mask _mask; + const bool _is_negated; + + VTransformBoolTest(const BoolTest::mask mask, bool is_negated) : + _mask(mask), _is_negated(is_negated) {} +}; + +class VTransformBoolVectorNode : public VTransformElementWiseVectorNode { +private: + const VTransformBoolTest _test; +public: + VTransformBoolVectorNode(VTransform& vtransform, uint number_of_nodes, VTransformBoolTest test) : + VTransformElementWiseVectorNode(vtransform, 2, number_of_nodes), _test(test) {} + VTransformBoolTest test() const { return _test; } + virtual VTransformBoolVectorNode* isa_BoolVector() override { return this; } + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "BoolVector"; };) +}; + +class VTransformReductionVectorNode : public VTransformVectorNode { +public: + // req = 3 -> [ctrl, scalar init, vector] + VTransformReductionVectorNode(VTransform& vtransform, uint number_of_nodes) : + VTransformVectorNode(vtransform, 3, number_of_nodes) {} + virtual VTransformReductionVectorNode* isa_ReductionVector() override { return this; } + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "ReductionVector"; };) +}; + +class VTransformLoadVectorNode : public VTransformVectorNode { +public: + // req = 3 -> [ctrl, mem, adr] + VTransformLoadVectorNode(VTransform& vtransform, uint number_of_nodes) : + VTransformVectorNode(vtransform, 3, number_of_nodes) {} + LoadNode::ControlDependency control_dependency() const; + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "LoadVector"; };) +}; + +class VTransformStoreVectorNode : public VTransformVectorNode { +public: + // req = 4 -> [ctrl, mem, adr, val] + VTransformStoreVectorNode(VTransform& vtransform, uint number_of_nodes) : + VTransformVectorNode(vtransform, 4, number_of_nodes) {} + virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer, + const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override; + NOT_PRODUCT(virtual const char* name() const override { return "StoreVector"; };) +}; + +// Invoke callback on all memops, in the order of the schedule. +template<typename Callback> +void VTransformGraph::for_each_memop_in_schedule(Callback callback) const { + assert(_schedule.length() == _vtnodes.length(), "schedule was computed"); + + for (int i = 0; i < _schedule.length(); i++) { + VTransformNode* vtn = _schedule.at(i); + + // We can ignore input nodes, they are outside the loop. + if (vtn->isa_InputScalar() != nullptr) { continue; } + + VTransformScalarNode* scalar = vtn->isa_Scalar(); + if (scalar != nullptr && scalar->node()->is_Mem()) { + callback(scalar->node()->as_Mem()); + } + + VTransformVectorNode* vector = vtn->isa_Vector(); + if (vector != nullptr && vector->nodes().at(0)->is_Mem()) { + for (int j = 0; j < vector->nodes().length(); j++) { + callback(vector->nodes().at(j)->as_Mem()); + } + } + } +} + +#endif // SHARE_OPTO_VTRANSFORM_HPP From 55fd1ed228ea3c42aaf92579e5dcb818fe14351d Mon Sep 17 00:00:00 2001 From: Jatin Bhateja <jbhateja@openjdk.org> Date: Mon, 8 Jul 2024 06:42:46 +0000 Subject: [PATCH 322/471] 8333890: Fatal error in auto-vectorizer with float16 kernel. Reviewed-by: kvn --- src/hotspot/share/opto/superword.cpp | 6 ++ .../TestFloat16VectorConvChain.java | 65 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 test/hotspot/jtreg/compiler/vectorization/TestFloat16VectorConvChain.java diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp index ba2dd423bf51d..5721f7bcd5420 100644 --- a/src/hotspot/share/opto/superword.cpp +++ b/src/hotspot/share/opto/superword.cpp @@ -2586,6 +2586,12 @@ const Type* VLoopTypes::container_type(Node* n) const { } const Type* t = _vloop.phase()->igvn().type(n); if (t->basic_type() == T_INT) { + // Float to half float conversion may be succeeded by a conversion from + // half float to float, in such a case back propagation of narrow type (SHORT) + // may not be possible. + if (n->Opcode() == Op_ConvF2HF) { + return TypeInt::SHORT; + } // A narrow type of arithmetic operations will be determined by // propagating the type of memory operations. return TypeInt::INT; diff --git a/test/hotspot/jtreg/compiler/vectorization/TestFloat16VectorConvChain.java b/test/hotspot/jtreg/compiler/vectorization/TestFloat16VectorConvChain.java new file mode 100644 index 0000000000000..6b090c965bb8c --- /dev/null +++ b/test/hotspot/jtreg/compiler/vectorization/TestFloat16VectorConvChain.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** +* @test +* @summary Test Float16 vector conversion chain. +* @requires vm.compiler2.enabled +* @library /test/lib / +* @run driver compiler.vectorization.TestFloat16VectorConvChain +*/ + +package compiler.vectorization; + +import compiler.lib.ir_framework.*; +import java.util.Random; +import java.util.Arrays; + + +public class TestFloat16VectorConvChain { + + @Test + @IR(counts = {IRNode.VECTOR_CAST_HF2F, IRNode.VECTOR_SIZE_ANY, ">= 1", IRNode.VECTOR_CAST_F2HF, IRNode.VECTOR_SIZE_ANY, " >= 1"}) + public static void test(short [] res, short [] src1, short [] src2) { + for (int i = 0; i < res.length; i++) { + res[i] = (short)Float.float16ToFloat(Float.floatToFloat16(Float.float16ToFloat(src1[i]) + Float.float16ToFloat(src2[i]))); + } + } + + @Run(test = {"test"}) + @Warmup(1000) + public static void micro() { + short [] res = new short[1024]; + short [] src1 = new short[1024]; + short [] src2 = new short[1024]; + Arrays.fill(src1, (short)Float.floatToFloat16(1.0f)); + Arrays.fill(src2, (short)Float.floatToFloat16(2.0f)); + for (int i = 0; i < 1000; i++) { + test(res, src1, src2); + } + } + + public static void main(String [] args) { + TestFramework.run(TestFloat16VectorConvChain.class); + } +} From 3cce31ad8877ec62429981871bcb0067770f9ccb Mon Sep 17 00:00:00 2001 From: Thomas Stuefe <stuefe@openjdk.org> Date: Mon, 8 Jul 2024 08:06:56 +0000 Subject: [PATCH 323/471] 8335643: serviceability/dcmd/vm tests fail for ZGC after JDK-8322475 Reviewed-by: sgehwolf, dholmes --- test/hotspot/jtreg/ProblemList-generational-zgc.txt | 3 --- test/hotspot/jtreg/ProblemList-zgc.txt | 3 --- .../jtreg/serviceability/dcmd/vm/SystemMapTestBase.java | 4 +++- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList-generational-zgc.txt b/test/hotspot/jtreg/ProblemList-generational-zgc.txt index bdeed9947c571..db8182641ac54 100644 --- a/test/hotspot/jtreg/ProblemList-generational-zgc.txt +++ b/test/hotspot/jtreg/ProblemList-generational-zgc.txt @@ -114,7 +114,4 @@ serviceability/sa/sadebugd/PmapOnDebugdTest.java 8307393 generic- serviceability/sa/sadebugd/RunCommandOnServerTest.java 8307393 generic-all serviceability/sa/sadebugd/SADebugDTest.java 8307393 generic-all -serviceability/dcmd/vm/SystemMapTest.java 8335643 generic-all -serviceability/dcmd/vm/SystemDumpMapTest.java 8335643 generic-all - vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java 8289582 windows-x64 diff --git a/test/hotspot/jtreg/ProblemList-zgc.txt b/test/hotspot/jtreg/ProblemList-zgc.txt index 892c980b0696d..1afe56c99f8af 100644 --- a/test/hotspot/jtreg/ProblemList-zgc.txt +++ b/test/hotspot/jtreg/ProblemList-zgc.txt @@ -45,7 +45,4 @@ serviceability/sa/TestSysProps.java 8302055 generic- serviceability/sa/TestHeapDumpForInvokeDynamic.java 8315646 generic-all -serviceability/dcmd/vm/SystemMapTest.java 8335643 generic-all -serviceability/dcmd/vm/SystemDumpMapTest.java 8335643 generic-all - vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java 8289582 windows-x64 diff --git a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java index 20dc8d70d7a47..000e977a590e5 100644 --- a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java +++ b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java @@ -42,6 +42,8 @@ public class SystemMapTestBase { private static final String regexBase_committed = regexBase + "com.*"; private static final String regexBase_shared_and_committed = regexBase + "shrd,com.*"; + // java heap is either committed, non-shared, or - in case of ZGC - committed and shared. + private static final String regexBase_java_heap = regexBase + "(shrd,)?com.*"; protected static final String shouldMatchUnconditionally[] = { // java launcher regexBase_committed + "/bin/java", @@ -54,7 +56,7 @@ public class SystemMapTestBase { }; protected static final String shouldMatchIfNMTIsEnabled[] = { - regexBase_committed + "JAVAHEAP.*", + regexBase_java_heap + "JAVAHEAP.*", // metaspace regexBase_committed + "META.*", // parts of metaspace should be uncommitted From 540188fdebd089d4145eca18c0f95bf338cbcefc Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Mon, 8 Jul 2024 10:03:39 +0000 Subject: [PATCH 324/471] 8334445: Parallel: Decouple maximum compaction from SoftReference clearing Reviewed-by: zgu, lmao --- .../gc/parallel/parallelScavengeHeap.cpp | 6 +-- .../share/gc/parallel/psParallelCompact.cpp | 50 +++++++++---------- .../share/gc/parallel/psParallelCompact.hpp | 9 ++-- src/hotspot/share/gc/parallel/psScavenge.cpp | 4 +- 4 files changed, 31 insertions(+), 38 deletions(-) diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp index 665b14bb1eabf..33a499ce47134 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp @@ -441,11 +441,7 @@ HeapWord* ParallelScavengeHeap::mem_allocate_old_gen(size_t size) { } void ParallelScavengeHeap::do_full_collection(bool clear_all_soft_refs) { - // The do_full_collection() parameter clear_all_soft_refs - // is interpreted here as maximum_compaction which will - // cause SoftRefs to be cleared. - bool maximum_compaction = clear_all_soft_refs; - PSParallelCompact::invoke(maximum_compaction); + PSParallelCompact::invoke(clear_all_soft_refs); } // Failed allocation policy. Must be called from the VM thread, and diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index b4fe706d1e410..d4a24b710cfae 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -826,15 +826,21 @@ void PSParallelCompact::fill_dense_prefix_end(SpaceId id) { } } -bool PSParallelCompact::reassess_maximum_compaction(bool maximum_compaction, - size_t total_live_words, - MutableSpace* const old_space, - HeapWord* full_region_prefix_end) { +bool PSParallelCompact::check_maximum_compaction(size_t total_live_words, + MutableSpace* const old_space, + HeapWord* full_region_prefix_end) { + + ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); + + // Check System.GC + bool is_max_on_system_gc = UseMaximumCompactionOnSystemGC + && GCCause::is_user_requested_gc(heap->gc_cause()); + // Check if all live objs are larger than old-gen. const bool is_old_gen_overflowing = (total_live_words > old_space->capacity_in_words()); // JVM flags - const uint total_invocations = ParallelScavengeHeap::heap()->total_full_collections(); + const uint total_invocations = heap->total_full_collections(); assert(total_invocations >= _maximum_compaction_gc_num, "sanity"); const size_t gcs_since_max = total_invocations - _maximum_compaction_gc_num; const bool is_interval_ended = gcs_since_max > HeapMaximumCompactionInterval; @@ -843,7 +849,7 @@ bool PSParallelCompact::reassess_maximum_compaction(bool maximum_compaction, const bool is_region_full = full_region_prefix_end >= _summary_data.region_align_down(old_space->top()); - if (maximum_compaction || is_old_gen_overflowing || is_interval_ended || is_region_full) { + if (is_max_on_system_gc || is_old_gen_overflowing || is_interval_ended || is_region_full) { _maximum_compaction_gc_num = total_invocations; return true; } @@ -851,7 +857,7 @@ bool PSParallelCompact::reassess_maximum_compaction(bool maximum_compaction, return false; } -void PSParallelCompact::summary_phase(bool maximum_compaction) +void PSParallelCompact::summary_phase() { GCTraceTime(Info, gc, phases) tm("Summary Phase", &_gc_timer); @@ -874,10 +880,9 @@ void PSParallelCompact::summary_phase(bool maximum_compaction) _space_info[i].set_dense_prefix(space->bottom()); } - maximum_compaction = reassess_maximum_compaction(maximum_compaction, - total_live_words, - old_space, - full_region_prefix_end); + bool maximum_compaction = check_maximum_compaction(total_live_words, + old_space, + full_region_prefix_end); HeapWord* dense_prefix_end = maximum_compaction ? full_region_prefix_end : compute_dense_prefix_for_old_space(old_space, @@ -958,26 +963,23 @@ void PSParallelCompact::summary_phase(bool maximum_compaction) // may be true because this method can be called without intervening // activity. For example when the heap space is tight and full measure // are being taken to free space. -bool PSParallelCompact::invoke(bool maximum_heap_compaction) { +bool PSParallelCompact::invoke(bool clear_all_soft_refs) { assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint"); assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread"); - ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); - assert(!heap->is_stw_gc_active(), "not reentrant"); - IsSTWGCActiveMark mark; - const bool clear_all_soft_refs = - heap->soft_ref_policy()->should_clear_all_soft_refs(); + ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); + clear_all_soft_refs = clear_all_soft_refs + || heap->soft_ref_policy()->should_clear_all_soft_refs(); - return PSParallelCompact::invoke_no_policy(clear_all_soft_refs || - maximum_heap_compaction); + return PSParallelCompact::invoke_no_policy(clear_all_soft_refs); } // This method contains no policy. You should probably // be calling invoke() instead. -bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { +bool PSParallelCompact::invoke_no_policy(bool clear_all_soft_refs) { assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint"); assert(ref_processor() != nullptr, "Sanity"); @@ -998,7 +1000,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { // The scope of casr should end after code that can change // SoftRefPolicy::_should_clear_all_soft_refs. - ClearedAllSoftRefs casr(maximum_heap_compaction, + ClearedAllSoftRefs casr(clear_all_soft_refs, heap->soft_ref_policy()); // Make sure data structures are sane, make the heap parsable, and do other @@ -1033,7 +1035,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { DerivedPointerTable::clear(); #endif - ref_processor()->start_discovery(maximum_heap_compaction); + ref_processor()->start_discovery(clear_all_soft_refs); ClassUnloadingContext ctx(1 /* num_nmethod_unlink_workers */, false /* unregister_nmethods_during_purge */, @@ -1041,9 +1043,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { marking_phase(&_gc_tracer); - bool max_on_system_gc = UseMaximumCompactionOnSystemGC - && GCCause::is_user_requested_gc(gc_cause); - summary_phase(maximum_heap_compaction || max_on_system_gc); + summary_phase(); #if COMPILER2_OR_JVMCI assert(DerivedPointerTable::is_active(), "Sanity"); diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.hpp b/src/hotspot/share/gc/parallel/psParallelCompact.hpp index 93ea7aed78e9f..1e04beb8c66f6 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.hpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.hpp @@ -723,10 +723,9 @@ class PSParallelCompact : AllStatic { static void pre_compact(); static void post_compact(); - static bool reassess_maximum_compaction(bool maximum_compaction, - size_t total_live_words, - MutableSpace* const old_space, - HeapWord* full_region_prefix_end); + static bool check_maximum_compaction(size_t total_live_words, + MutableSpace* const old_space, + HeapWord* full_region_prefix_end); // Mark live objects static void marking_phase(ParallelOldTracer *gc_tracer); @@ -739,7 +738,7 @@ class PSParallelCompact : AllStatic { // make the heap parsable. static void fill_dense_prefix_end(SpaceId id); - static void summary_phase(bool maximum_compaction); + static void summary_phase(); static void adjust_pointers(); static void forward_to_new_addr(); diff --git a/src/hotspot/share/gc/parallel/psScavenge.cpp b/src/hotspot/share/gc/parallel/psScavenge.cpp index 865bbd170997d..708bb9da48af7 100644 --- a/src/hotspot/share/gc/parallel/psScavenge.cpp +++ b/src/hotspot/share/gc/parallel/psScavenge.cpp @@ -235,7 +235,6 @@ bool PSScavenge::invoke() { assert(!ParallelScavengeHeap::heap()->is_stw_gc_active(), "not reentrant"); ParallelScavengeHeap* const heap = ParallelScavengeHeap::heap(); - PSAdaptiveSizePolicy* policy = heap->size_policy(); IsSTWGCActiveMark mark; const bool scavenge_done = PSScavenge::invoke_no_policy(); @@ -250,8 +249,7 @@ bool PSScavenge::invoke() { if (need_full_gc) { GCCauseSetter gccs(heap, GCCause::_adaptive_size_policy); - SoftRefPolicy* srp = heap->soft_ref_policy(); - const bool clear_all_softrefs = srp->should_clear_all_soft_refs(); + const bool clear_all_softrefs = heap->soft_ref_policy()->should_clear_all_soft_refs(); full_gc_done = PSParallelCompact::invoke_no_policy(clear_all_softrefs); } From c5a668bb653feb3408a9efa3274ceabf9f01a2c7 Mon Sep 17 00:00:00 2001 From: Xiaolong Peng <xpeng@openjdk.org> Date: Mon, 8 Jul 2024 10:33:08 +0000 Subject: [PATCH 325/471] 8334231: Optimize MethodData layout Reviewed-by: dholmes, chagedorn, shade --- src/hotspot/share/oops/methodData.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hotspot/share/oops/methodData.hpp b/src/hotspot/share/oops/methodData.hpp index b6e2a1c965212..5071c29f1d774 100644 --- a/src/hotspot/share/oops/methodData.hpp +++ b/src/hotspot/share/oops/methodData.hpp @@ -1946,7 +1946,6 @@ class ciMethodData; class MethodData : public Metadata { friend class VMStructs; friend class JVMCIVMStructs; -private: friend class ProfileData; friend class TypeEntriesAtCall; friend class ciMethodData; @@ -2080,8 +2079,8 @@ class MethodData : public Metadata { #if INCLUDE_JVMCI // Support for HotSpotMethodData.setCompiledIRSize(int) - int _jvmci_ir_size; FailedSpeculation* _failed_speculations; + int _jvmci_ir_size; #endif // Size of _data array in bytes. (Excludes header and extra_data fields.) From c34a1b7013b27a8a214f63387bd528a90342a416 Mon Sep 17 00:00:00 2001 From: Tobias Hartmann <thartmann@openjdk.org> Date: Mon, 8 Jul 2024 10:53:03 +0000 Subject: [PATCH 326/471] 8335861: Problem list compiler/vectorization/TestFloat16VectorConvChain.java Reviewed-by: epeter --- test/hotspot/jtreg/ProblemList.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index d7088408ab887..76dc9f6f033fa 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -69,6 +69,8 @@ compiler/startup/StartupOutput.java 8326615 generic-x64 compiler/codecache/CodeCacheFullCountTest.java 8332954 generic-all +compiler/vectorization/TestFloat16VectorConvChain.java 8335860 generic-all + ############################################################################# # :hotspot_gc From 953c35eb5bff49ec5f7dbb25edd8a324b94318eb Mon Sep 17 00:00:00 2001 From: Thomas Schatzl <tschatzl@openjdk.org> Date: Mon, 8 Jul 2024 11:44:04 +0000 Subject: [PATCH 327/471] 8335824: Test gc/arguments/TestMinInitialErgonomics.java is timing out Reviewed-by: ayang, kbarrett --- test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java b/test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java index 6b03401a563df..6912499e53f00 100644 --- a/test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java +++ b/test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ * @test TestMinInitialErgonomics * @bug 8006088 * @requires vm.gc.Parallel + * @requires vm.compMode != "Xcomp" * @summary Test Parallel GC ergonomics decisions related to minimum and initial heap size. * @library /test/lib * @library / From cec222e46065fc15db3f2eb241d3607d605ab580 Mon Sep 17 00:00:00 2001 From: Jorn Vernee <jvernee@openjdk.org> Date: Mon, 8 Jul 2024 12:39:33 +0000 Subject: [PATCH 328/471] 8317611: Add a tool like jdeprscan to find usage of restricted methods Reviewed-by: alanb, ihse, mcimadamore, jlahoda, jwaters --- make/modules/jdk.jdeps/Launcher.gmk | 9 + .../javac/platform/JDKPlatformProvider.java | 11 +- .../share/classes/module-info.java | 8 +- .../classes/com/sun/tools/jdeprscan/Main.java | 4 +- .../tools/jnativescan/ClassFileSource.java | 124 +++++++++ .../sun/tools/jnativescan/ClassResolver.java | 163 +++++++++++ .../jnativescan/JNativeScanFatalError.java | 45 ++++ .../tools/jnativescan/JNativeScanTask.java | 195 ++++++++++++++ .../com/sun/tools/jnativescan/Main.java | 234 ++++++++++++++++ .../com/sun/tools/jnativescan/MethodRef.java | 48 ++++ .../tools/jnativescan/NativeMethodFinder.java | 141 ++++++++++ .../sun/tools/jnativescan/RestrictedUse.java | 32 +++ src/jdk.jdeps/share/classes/module-info.java | 23 +- src/jdk.jdeps/share/man/jnativescan.1 | 220 +++++++++++++++ test/jdk/tools/launcher/HelpFlagsTest.java | 1 + test/langtools/TEST.groups | 4 + .../jnativescan/JNativeScanTestBase.java | 86 ++++++ .../tools/jnativescan/TestArrayTypeRefs.java | 56 ++++ .../tools/jnativescan/TestJNativeScan.java | 252 ++++++++++++++++++ .../jnativescan/TestMissingSystemClass.java | 60 +++++ .../tools/jnativescan/TestSubclassRefs.java | 56 ++++ .../jnativescan/cases/classpath/app/App.java | 31 +++ .../cases/classpath/arrayref/App.java | 32 +++ .../jnativescan/cases/classpath/lib/Lib.java | 33 +++ .../cases/classpath/missingsystem/App.java | 32 +++ .../cases/classpath/singlejar/main/Main.java | 34 +++ .../cases/classpath/subclassref/App.java | 32 +++ .../unnamed_package/UnnamedPackage.java | 32 +++ .../cases/modules/org.lib/module-info.java | 26 ++ .../cases/modules/org.lib/org/lib/Lib.java | 34 +++ .../modules/org.lib/org/lib/Service.java | 26 ++ .../cases/modules/org.myapp/module-info.java | 28 ++ .../org.myapp/org/myapp/main/Main.java | 32 +++ .../modules/org.service/module-info.java | 27 ++ .../org.service/org/service/ServiceImpl.java | 35 +++ .../modules/org.singlejar/module-info.java | 25 ++ .../org/singlejar/main/Main.java | 34 +++ 37 files changed, 2250 insertions(+), 15 deletions(-) create mode 100644 src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassFileSource.java create mode 100644 src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassResolver.java create mode 100644 src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanFatalError.java create mode 100644 src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanTask.java create mode 100644 src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/Main.java create mode 100644 src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/MethodRef.java create mode 100644 src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/NativeMethodFinder.java create mode 100644 src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/RestrictedUse.java create mode 100644 src/jdk.jdeps/share/man/jnativescan.1 create mode 100644 test/langtools/tools/jnativescan/JNativeScanTestBase.java create mode 100644 test/langtools/tools/jnativescan/TestArrayTypeRefs.java create mode 100644 test/langtools/tools/jnativescan/TestJNativeScan.java create mode 100644 test/langtools/tools/jnativescan/TestMissingSystemClass.java create mode 100644 test/langtools/tools/jnativescan/TestSubclassRefs.java create mode 100644 test/langtools/tools/jnativescan/cases/classpath/app/App.java create mode 100644 test/langtools/tools/jnativescan/cases/classpath/arrayref/App.java create mode 100644 test/langtools/tools/jnativescan/cases/classpath/lib/Lib.java create mode 100644 test/langtools/tools/jnativescan/cases/classpath/missingsystem/App.java create mode 100644 test/langtools/tools/jnativescan/cases/classpath/singlejar/main/Main.java create mode 100644 test/langtools/tools/jnativescan/cases/classpath/subclassref/App.java create mode 100644 test/langtools/tools/jnativescan/cases/classpath/unnamed_package/UnnamedPackage.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.lib/module-info.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Lib.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Service.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.myapp/module-info.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.myapp/org/myapp/main/Main.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.service/module-info.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.service/org/service/ServiceImpl.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.singlejar/module-info.java create mode 100644 test/langtools/tools/jnativescan/cases/modules/org.singlejar/org/singlejar/main/Main.java diff --git a/make/modules/jdk.jdeps/Launcher.gmk b/make/modules/jdk.jdeps/Launcher.gmk index ceab793124584..1aa54e16f4564 100644 --- a/make/modules/jdk.jdeps/Launcher.gmk +++ b/make/modules/jdk.jdeps/Launcher.gmk @@ -51,3 +51,12 @@ $(eval $(call SetupBuildLauncher, jdeprscan, \ MAIN_CLASS := com.sun.tools.jdeprscan.Main, \ CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ )) + +################################################################################ +## Build jnativescan +################################################################################ + +$(eval $(call SetupBuildLauncher, jnativescan, \ + MAIN_CLASS := com.sun.tools.jnativescan.Main, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ +)) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java index 487fe969f9774..4c24f9892a673 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -83,7 +83,14 @@ public Iterable<String> getSupportedPlatformNames() { } @Override - public PlatformDescription getPlatform(String platformName, String options) { + public PlatformDescription getPlatform(String platformName, String options) throws PlatformNotSupported { + if (!SUPPORTED_JAVA_PLATFORM_VERSIONS.contains(platformName)) { + throw new PlatformNotSupported(); + } + return getPlatformTrusted(platformName); + } + + public PlatformDescription getPlatformTrusted(String platformName) { return new PlatformDescriptionImpl(platformName); } diff --git a/src/jdk.internal.opt/share/classes/module-info.java b/src/jdk.internal.opt/share/classes/module-info.java index 67ed1410560df..ba6987f1ea93c 100644 --- a/src/jdk.internal.opt/share/classes/module-info.java +++ b/src/jdk.internal.opt/share/classes/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,11 +31,13 @@ module jdk.internal.opt { exports jdk.internal.joptsimple to jdk.jlink, - jdk.jshell; + jdk.jshell, + jdk.jdeps; exports jdk.internal.opt to jdk.compiler, jdk.jartool, jdk.javadoc, jdk.jlink, - jdk.jpackage; + jdk.jpackage, + jdk.jdeps; } diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/Main.java b/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/Main.java index c67510de441da..f77d29a8bfa5b 100644 --- a/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/Main.java +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -414,7 +414,7 @@ boolean processRelease(String release, Collection<String> classes) throws IOExce .noneMatch(n -> n.equals(release))) { return false; } - JavaFileManager fm = pp.getPlatform(release, "").getFileManager(); + JavaFileManager fm = pp.getPlatformTrusted(release).getFileManager(); List<String> classNames = new ArrayList<>(); for (JavaFileObject fo : fm.list(StandardLocation.PLATFORM_CLASS_PATH, "", diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassFileSource.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassFileSource.java new file mode 100644 index 0000000000000..754904c9c7f24 --- /dev/null +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassFileSource.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jnativescan; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.lang.module.ModuleReader; +import java.lang.module.ModuleReference; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.jar.JarFile; +import java.util.stream.Stream; +import java.util.zip.ZipFile; + +sealed interface ClassFileSource { + String moduleName(); + Path path(); + + Stream<byte[]> classFiles(Runtime.Version version) throws IOException; + + record Module(ModuleReference reference) implements ClassFileSource { + @Override + public String moduleName() { + return reference.descriptor().name(); + } + + @Override + public Path path() { + URI location = reference.location().orElseThrow(); + return Path.of(location); + } + + @Override + public Stream<byte[]> classFiles(Runtime.Version version) throws IOException { + ModuleReader reader = reference().open(); + return reader.list() + .filter(resourceName -> resourceName.endsWith(".class")) + .map(resourceName -> { + try (InputStream stream = reader.open(resourceName).orElseThrow()) { + return stream.readAllBytes(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }).onClose(() -> { + try { + reader.close(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }); + } + } + + record ClassPathJar(Path path) implements ClassFileSource { + @Override + public String moduleName() { + return "ALL-UNNAMED"; + } + + @Override + public Stream<byte[]> classFiles(Runtime.Version version) throws IOException { + JarFile jf = new JarFile(path().toFile(), false, ZipFile.OPEN_READ, version); + return jf.versionedStream() + .filter(je -> je.getName().endsWith(".class")) + .map(je -> { + try (InputStream stream = jf.getInputStream(je)){ + return stream.readAllBytes(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }).onClose(() -> { + try { + jf.close(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }); + } + } + + record ClassPathDirectory(Path path) implements ClassFileSource { + @Override + public String moduleName() { + return "ALL-UNNAMED"; + } + + @Override + public Stream<byte[]> classFiles(Runtime.Version version) throws IOException { + return Files.walk(path) + .filter(file -> Files.isRegularFile(file) && file.toString().endsWith(".class")) + .map(file -> { + try (InputStream stream = Files.newInputStream(file)){ + return stream.readAllBytes(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }); + } + } +} diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassResolver.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassResolver.java new file mode 100644 index 0000000000000..7a267a58aa5a3 --- /dev/null +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassResolver.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jnativescan; + +import com.sun.tools.javac.platform.PlatformDescription; +import com.sun.tools.javac.platform.PlatformProvider; + +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.StandardLocation; +import java.io.IOException; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassModel; +import java.lang.constant.ClassDesc; +import java.lang.module.ModuleDescriptor; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.stream.Stream; + +abstract class ClassResolver implements AutoCloseable { + + static ClassResolver forClassFileSources(List<ClassFileSource> sources, Runtime.Version version) throws IOException { + Map<ClassDesc, Info> classMap = new HashMap<>(); + for (ClassFileSource source : sources) { + try (Stream<byte[]> classFiles = source.classFiles(version)) { + classFiles.forEach(bytes -> { + ClassModel model = ClassFile.of().parse(bytes); + ClassDesc desc = model.thisClass().asSymbol(); + classMap.put(desc, new Info(source, model)); + }); + } + } + return new SimpleClassResolver(classMap); + } + + static ClassResolver forSystemModules(Runtime.Version version) { + String platformName = String.valueOf(version.feature()); + PlatformProvider platformProvider = ServiceLoader.load(PlatformProvider.class).findFirst().orElseThrow(); + PlatformDescription platform; + try { + platform = platformProvider.getPlatform(platformName, null); + } catch (PlatformProvider.PlatformNotSupported e) { + throw new JNativeScanFatalError("Release: " + platformName + " not supported", e); + } + JavaFileManager fm = platform.getFileManager(); + return new SystemModuleClassResolver(fm); + } + + record Info(ClassFileSource source, ClassModel model) {} + + public abstract void forEach(BiConsumer<ClassDesc, ClassResolver.Info> action); + public abstract Optional<ClassResolver.Info> lookup(ClassDesc desc); + + @Override + public abstract void close() throws IOException; + + private static class SimpleClassResolver extends ClassResolver { + + private final Map<ClassDesc, ClassResolver.Info> classMap; + + public SimpleClassResolver(Map<ClassDesc, Info> classMap) { + this.classMap = classMap; + } + + public void forEach(BiConsumer<ClassDesc, ClassResolver.Info> action) { + classMap.forEach(action); + } + + public Optional<ClassResolver.Info> lookup(ClassDesc desc) { + return Optional.ofNullable(classMap.get(desc)); + } + + @Override + public void close() {} + } + + private static class SystemModuleClassResolver extends ClassResolver { + + private final JavaFileManager platformFileManager; + private final Map<String, String> packageToSystemModule; + private final Map<ClassDesc, Info> cache = new HashMap<>(); + + public SystemModuleClassResolver(JavaFileManager platformFileManager) { + this.platformFileManager = platformFileManager; + this.packageToSystemModule = packageToSystemModule(platformFileManager); + } + + private static Map<String, String> packageToSystemModule(JavaFileManager platformFileManager) { + try { + Set<JavaFileManager.Location> locations = platformFileManager.listLocationsForModules( + StandardLocation.SYSTEM_MODULES).iterator().next(); + + Map<String, String> result = new HashMap<>(); + for (JavaFileManager.Location loc : locations) { + JavaFileObject jfo = platformFileManager.getJavaFileForInput(loc, "module-info", JavaFileObject.Kind.CLASS); + ModuleDescriptor descriptor = ModuleDescriptor.read(jfo.openInputStream()); + for (ModuleDescriptor.Exports export : descriptor.exports()) { + if (!export.isQualified()) { + result.put(export.source(), descriptor.name()); + } + } + } + return result; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void forEach(BiConsumer<ClassDesc, Info> action) { + throw new UnsupportedOperationException("NYI"); + } + + @Override + public Optional<Info> lookup(ClassDesc desc) { + return Optional.ofNullable(cache.computeIfAbsent(desc, _ -> { + String qualName = JNativeScanTask.qualName(desc); + String moduleName = packageToSystemModule.get(desc.packageName()); + if (moduleName != null) { + try { + JavaFileManager.Location loc = platformFileManager.getLocationForModule(StandardLocation.SYSTEM_MODULES, moduleName); + JavaFileObject jfo = platformFileManager.getJavaFileForInput(loc, qualName, JavaFileObject.Kind.CLASS); + if (jfo == null) { + throw new JNativeScanFatalError("System class can not be found: " + qualName); + } + ClassModel model = ClassFile.of().parse(jfo.openInputStream().readAllBytes()); + return new Info(null, model); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return null; + })); + } + + @Override + public void close() throws IOException { + platformFileManager.close(); + } + } +} diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanFatalError.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanFatalError.java new file mode 100644 index 0000000000000..15cf86e03c333 --- /dev/null +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanFatalError.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jnativescan; + +import java.io.Serial; + +// Exception used in case of fatal error that is reasonably expected and handled. +public class JNativeScanFatalError extends RuntimeException { + @Serial + private static final long serialVersionUID = 1L; + + public JNativeScanFatalError(String message) { + super(message); + } + + public JNativeScanFatalError(String message, Throwable cause) { + super(message, cause); + } + + public JNativeScanFatalError(Throwable cause) { + super(cause); + } +} diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanTask.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanTask.java new file mode 100644 index 0000000000000..2ff172e9c1b71 --- /dev/null +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanTask.java @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jnativescan; + +import java.io.IOException; +import java.io.PrintWriter; +import java.lang.constant.ClassDesc; +import java.lang.module.Configuration; +import java.lang.module.ModuleFinder; +import java.lang.module.ResolvedModule; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import java.util.stream.Collectors; +import java.util.zip.ZipFile; + +class JNativeScanTask { + + private final PrintWriter out; + private final List<Path> classPaths; + private final List<Path> modulePaths; + private final List<String> cmdRootModules; + private final Runtime.Version version; + private final Action action; + + public JNativeScanTask(PrintWriter out, List<Path> classPaths, List<Path> modulePaths, + List<String> cmdRootModules, Runtime.Version version, Action action) { + this.out = out; + this.classPaths = classPaths; + this.modulePaths = modulePaths; + this.version = version; + this.action = action; + this.cmdRootModules = cmdRootModules; + } + + public void run() throws JNativeScanFatalError { + List<ClassFileSource> toScan = new ArrayList<>(findAllClassPathJars()); + + ModuleFinder moduleFinder = ModuleFinder.of(modulePaths.toArray(Path[]::new)); + List<String> rootModules = cmdRootModules; + if (rootModules.contains("ALL-MODULE-PATH")) { + rootModules = allModuleNames(moduleFinder); + } + Configuration config = systemConfiguration().resolveAndBind(ModuleFinder.of(), moduleFinder, rootModules); + for (ResolvedModule m : config.modules()) { + toScan.add(new ClassFileSource.Module(m.reference())); + } + + SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> allRestrictedMethods; + try(ClassResolver classesToScan = ClassResolver.forClassFileSources(toScan, version); + ClassResolver systemClassResolver = ClassResolver.forSystemModules(version)) { + NativeMethodFinder finder = NativeMethodFinder.create(classesToScan, systemClassResolver); + allRestrictedMethods = finder.findAll(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + switch (action) { + case PRINT -> printNativeAccess(allRestrictedMethods); + case DUMP_ALL -> dumpAll(allRestrictedMethods); + } + } + + private List<ClassFileSource> findAllClassPathJars() throws JNativeScanFatalError { + List<ClassFileSource> result = new ArrayList<>(); + for (Path path : classPaths) { + if (isJarFile(path)) { + Deque<Path> jarsToScan = new ArrayDeque<>(); + jarsToScan.offer(path); + + // recursively look for all class path jars, starting at the root jars + // in this.classPaths, and recursively following all Class-Path manifest + // attributes + while (!jarsToScan.isEmpty()) { + Path jar = jarsToScan.poll(); + String[] classPathAttribute = classPathAttribute(jar); + Path parentDir = jar.getParent(); + for (String classPathEntry : classPathAttribute) { + Path otherJar = parentDir != null + ? parentDir.resolve(classPathEntry) + : Path.of(classPathEntry); + if (Files.exists(otherJar)) { + // Class-Path attribute specifies that jars that + // are not found are simply ignored. Do the same here + jarsToScan.offer(otherJar); + } + } + result.add(new ClassFileSource.ClassPathJar(jar)); + } + } else if (Files.isDirectory(path)) { + result.add(new ClassFileSource.ClassPathDirectory(path)); + } else { + throw new JNativeScanFatalError( + "Path does not appear to be a jar file, or directory containing classes: " + path); + } + } + return result; + } + + private String[] classPathAttribute(Path jar) { + try (JarFile jf = new JarFile(jar.toFile(), false, ZipFile.OPEN_READ, version)) { + Manifest manifest = jf.getManifest(); + if (manifest != null) { + String attrib = manifest.getMainAttributes().getValue("Class-Path"); + if (attrib != null) { + return attrib.split("\\s+"); + } + } + return new String[0]; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private Configuration systemConfiguration() { + ModuleFinder systemFinder = ModuleFinder.ofSystem(); + Configuration system = Configuration.resolve(systemFinder, List.of(Configuration.empty()), ModuleFinder.of(), + allModuleNames(systemFinder)); // resolve all of them + return system; + } + + private List<String> allModuleNames(ModuleFinder finder) { + return finder.findAll().stream().map(mr -> mr.descriptor().name()).toList(); + } + + private void printNativeAccess(SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> allRestrictedMethods) { + String nativeAccess = allRestrictedMethods.keySet().stream() + .map(ClassFileSource::moduleName) + .distinct() + .collect(Collectors.joining(",")); + out.println(nativeAccess); + } + + private void dumpAll(SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> allRestrictedMethods) { + if (allRestrictedMethods.isEmpty()) { + out.println(" <no restricted methods>"); + } else { + allRestrictedMethods.forEach((module, perClass) -> { + out.println(module.path() + " (" + module.moduleName() + "):"); + perClass.forEach((classDesc, restrictedUses) -> { + out.println(" " + qualName(classDesc) + ":"); + restrictedUses.forEach(use -> { + switch (use) { + case RestrictedUse.NativeMethodDecl(MethodRef nmd) -> + out.println(" " + nmd + " is a native method declaration"); + case RestrictedUse.RestrictedMethodRefs(MethodRef referent, Set<MethodRef> referees) -> { + out.println(" " + referent + " references restricted methods:"); + referees.forEach(referee -> out.println(" " + referee)); + } + } + }); + }); + }); + } + } + + private static boolean isJarFile(Path path) throws JNativeScanFatalError { + return Files.exists(path) && Files.isRegularFile(path) && path.toString().endsWith(".jar"); + } + + public enum Action { + DUMP_ALL, + PRINT + } + + public static String qualName(ClassDesc desc) { + String packagePrefix = desc.packageName().isEmpty() ? "" : desc.packageName() + "."; + return packagePrefix + desc.displayName(); + } +} diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/Main.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/Main.java new file mode 100644 index 0000000000000..425a106d599f0 --- /dev/null +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/Main.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jnativescan; + +import jdk.internal.joptsimple.*; +import jdk.internal.opt.CommandLine; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Path; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; +import java.util.spi.ToolProvider; + +public class Main { + + private static boolean DEBUG = Boolean.getBoolean("com.sun.tools.jnativescan.DEBUG"); + + private static final int SUCCESS_CODE = 0; + private static final int FATAL_ERROR_CODE = 1; + + private final PrintWriter out; + private final PrintWriter err; + + private Main(PrintWriter out, PrintWriter err) { + this.out = out; + this.err = err; + } + + private void printError(String message) { + err.println("ERROR: " + message); + } + + private void printUsage() { + out.print(""" + Use 'jnativescan --help' for help + """); + } + + private void printVersion() { + out.println(System.getProperty("java.version")); + } + + public int run(String[] args) { + if (args.length < 1) { + printUsage(); + return FATAL_ERROR_CODE; + } + + try { + String[] expandedArgs = expandArgFiles(args); + parseOptionsAndRun(expandedArgs); + } catch (JNativeScanFatalError fatalError) { + printError(fatalError.getMessage()); + for (Throwable cause = fatalError.getCause(); + cause instanceof JNativeScanFatalError jNativeScanFatalError; + cause = jNativeScanFatalError.getCause()) { + err.println("CAUSED BY: " + jNativeScanFatalError.getMessage()); + } + if (DEBUG) { + fatalError.printStackTrace(err); + } + return FATAL_ERROR_CODE; + } catch (Throwable e) { + printError("Unexpected exception encountered"); + e.printStackTrace(err); + return FATAL_ERROR_CODE; + } + + return SUCCESS_CODE; + } + + private void parseOptionsAndRun(String[] expandedArgs) throws JNativeScanFatalError { + OptionParser parser = new OptionParser(false); + OptionSpec<Void> helpOpt = parser.acceptsAll(List.of("?", "h", "help"), "help").forHelp(); + OptionSpec<Void> versionOpt = parser.accepts("version", "Print version information and exit"); + OptionSpec<Path> classPathOpt = parser.accepts( + "class-path", + "The class path as used at runtime") + .withRequiredArg() + .withValuesSeparatedBy(File.pathSeparatorChar) + .withValuesConvertedBy(PARSE_PATH); + OptionSpec<Path> modulePathOpt = parser.accepts( + "module-path", + "The module path as used at runtime") + .withRequiredArg() + .withValuesSeparatedBy(File.pathSeparatorChar) + .withValuesConvertedBy(PARSE_PATH); + OptionSpec<Runtime.Version> releaseOpt = parser.accepts( + "release", + "The runtime version that will run the application") + .withRequiredArg() + .withValuesConvertedBy(PARSE_VERSION); + OptionSpec<String> addModulesOpt = parser.accepts( + "add-modules", + "List of root modules to scan") + .requiredIf(modulePathOpt) + .withRequiredArg() + .withValuesSeparatedBy(','); + OptionSpec<Void> printNativeAccessOpt = parser.accepts( + "print-native-access", + "print a comma separated list of modules that may perform native access operations." + + " ALL-UNNAMED is used to indicate unnamed modules."); + + OptionSet optionSet; + try { + optionSet = parser.parse(expandedArgs); + } catch (OptionException oe) { + throw new JNativeScanFatalError("Parsing options failed: " + oe.getMessage(), oe); + } + + if (optionSet.nonOptionArguments().size() != 0) { + throw new JNativeScanFatalError("jnativescan does not accept positional arguments"); + } + + if (optionSet.has(helpOpt)) { + out.println(""" + The jnativescan tool can be used to find methods that may access native functionality when + run. This includes restricted method calls and 'native' method declarations. + """); + try { + parser.printHelpOn(out); + return; + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + if (optionSet.has(versionOpt)) { + printVersion(); + return; + } + + List<Path> classPathJars = optionSet.valuesOf(classPathOpt); + List<Path> modulePaths = optionSet.valuesOf(modulePathOpt); + List<String> rootModules = optionSet.valuesOf(addModulesOpt); + Runtime.Version version = Optional.ofNullable(optionSet.valueOf(releaseOpt)).orElse(Runtime.version()); + + JNativeScanTask.Action action = JNativeScanTask.Action.DUMP_ALL; + if (optionSet.has(printNativeAccessOpt)) { + action = JNativeScanTask.Action.PRINT; + } + + new JNativeScanTask(out, classPathJars, modulePaths, rootModules, version, action).run(); + } + + private static String[] expandArgFiles(String[] args) throws JNativeScanFatalError { + try { + return CommandLine.parse(args); + } catch (IOException e) { // file not found + throw new JNativeScanFatalError(e.getMessage(), e); + } + } + + public static void main(String[] args) { + System.exit(new Main.Provider().run(System.out, System.err, args)); + } + + public static class Provider implements ToolProvider { + + @Override + public String name() { + return "jnativescan"; + } + + @Override + public int run(PrintWriter out, PrintWriter err, String... args) { + return new Main(out, err).run(args); + } + } + + // where + private static final ValueConverter<Path> PARSE_PATH = new ValueConverter<>() { + @Override + public Path convert(String value) { + return Path.of(value); + } + + @Override + public Class<? extends Path> valueType() { + return Path.class; + } + + @Override + public String valuePattern() { + return "Path"; + } + }; + + private static final ValueConverter<Runtime.Version> PARSE_VERSION = new ValueConverter<>() { + @Override + public Runtime.Version convert(String value) { + try { + return Runtime.Version.parse(value); + } catch (IllegalArgumentException e) { + throw new JNativeScanFatalError("Invalid release: " + value + ": " + e.getMessage()); + } + } + + @Override + public Class<? extends Runtime.Version> valueType() { + return Runtime.Version.class; + } + + @Override + public String valuePattern() { + return "Version"; + } + }; +} diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/MethodRef.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/MethodRef.java new file mode 100644 index 0000000000000..b19e4e7ec8f2b --- /dev/null +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/MethodRef.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jnativescan; + +import java.lang.classfile.MethodModel; +import java.lang.classfile.constantpool.MemberRefEntry; +import java.lang.classfile.instruction.InvokeInstruction; +import java.lang.constant.ClassDesc; +import java.lang.constant.MethodTypeDesc; + +record MethodRef(ClassDesc owner, String name, MethodTypeDesc type) { + public static MethodRef ofModel(MethodModel model) { + return new MethodRef(model.parent().orElseThrow().thisClass().asSymbol(), + model.methodName().stringValue(), model.methodTypeSymbol()); + } + + public static MethodRef ofInvokeInstruction(InvokeInstruction instruction) { + return new MethodRef(instruction.owner().asSymbol(), + instruction.name().stringValue(), instruction.typeSymbol()); + } + + @Override + public String toString() { + return JNativeScanTask.qualName(owner) + "::" + name + type.displayDescriptor(); + } +} diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/NativeMethodFinder.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/NativeMethodFinder.java new file mode 100644 index 0000000000000..681b954d4cdd9 --- /dev/null +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/NativeMethodFinder.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jnativescan; + +import com.sun.tools.jnativescan.RestrictedUse.NativeMethodDecl; +import com.sun.tools.jnativescan.RestrictedUse.RestrictedMethodRefs; + +import java.io.IOException; +import java.lang.classfile.Attributes; +import java.lang.classfile.ClassModel; +import java.lang.classfile.MethodModel; +import java.lang.classfile.instruction.InvokeInstruction; +import java.lang.constant.ClassDesc; +import java.lang.constant.MethodTypeDesc; +import java.lang.reflect.AccessFlag; +import java.util.*; + +class NativeMethodFinder { + + // ct.sym uses this fake name for the restricted annotation instead + // see make/langtools/src/classes/build/tools/symbolgenerator/CreateSymbols.java + private static final String RESTRICTED_NAME = "Ljdk/internal/javac/Restricted+Annotation;"; + + private final Map<MethodRef, Boolean> cache = new HashMap<>(); + private final ClassResolver classesToScan; + private final ClassResolver systemClassResolver; + + private NativeMethodFinder(ClassResolver classesToScan, ClassResolver systemClassResolver) { + this.classesToScan = classesToScan; + this.systemClassResolver = systemClassResolver; + } + + public static NativeMethodFinder create(ClassResolver classesToScan, ClassResolver systemClassResolver) throws JNativeScanFatalError, IOException { + return new NativeMethodFinder(classesToScan, systemClassResolver); + } + + public SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> findAll() throws JNativeScanFatalError { + SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> restrictedMethods + = new TreeMap<>(Comparator.comparing(ClassFileSource::path)); + classesToScan.forEach((_, info) -> { + ClassModel classModel = info.model(); + List<RestrictedUse> perClass = new ArrayList<>(); + classModel.methods().forEach(methodModel -> { + if (methodModel.flags().has(AccessFlag.NATIVE)) { + perClass.add(new NativeMethodDecl(MethodRef.ofModel(methodModel))); + } else { + SortedSet<MethodRef> perMethod = new TreeSet<>(Comparator.comparing(MethodRef::toString)); + methodModel.code().ifPresent(code -> { + try { + code.forEach(e -> { + switch (e) { + case InvokeInstruction invoke -> { + MethodRef ref = MethodRef.ofInvokeInstruction(invoke); + if (isRestrictedMethod(ref)) { + perMethod.add(ref); + } + } + default -> { + } + } + }); + } catch (JNativeScanFatalError e) { + throw new JNativeScanFatalError("Error while processing method: " + + MethodRef.ofModel(methodModel), e); + } + }); + if (!perMethod.isEmpty()) { + perClass.add(new RestrictedMethodRefs(MethodRef.ofModel(methodModel), perMethod)); + } + } + }); + if (!perClass.isEmpty()) { + restrictedMethods.computeIfAbsent(info.source(), + _ -> new TreeMap<>(Comparator.comparing(JNativeScanTask::qualName))) + .put(classModel.thisClass().asSymbol(), perClass); + } + }); + return restrictedMethods; + } + + private boolean isRestrictedMethod(MethodRef ref) throws JNativeScanFatalError { + return cache.computeIfAbsent(ref, methodRef -> { + if (methodRef.owner().isArray()) { + // no restricted methods in arrays atm, and we can't look them up since they have no class file + return false; + } + Optional<ClassResolver.Info> info = systemClassResolver.lookup(methodRef.owner()); + if (!info.isPresent()) { + return false; + } + ClassModel classModel = info.get().model(); + Optional<MethodModel> methodModel = findMethod(classModel, methodRef.name(), methodRef.type()); + if (!methodModel.isPresent()) { + // If we are here, the method was referenced through a subclass of the class containing the actual + // method declaration. We could implement a method resolver (that needs to be version aware + // as well) to find the method model of the declaration, but it's not really worth it. + // None of the restricted methods (atm) are exposed through more than 1 public type, so it's not + // possible for user code to reference them through a subclass. + return false; + } + + return hasRestrictedAnnotation(methodModel.get()); + }); + } + + private static boolean hasRestrictedAnnotation(MethodModel method) { + return method.findAttribute(Attributes.runtimeVisibleAnnotations()) + .map(rva -> rva.annotations().stream().anyMatch(ann -> + ann.className().stringValue().equals(RESTRICTED_NAME))) + .orElse(false); + } + + private static Optional<MethodModel> findMethod(ClassModel classModel, String name, MethodTypeDesc type) { + return classModel.methods().stream() + .filter(m -> m.methodName().stringValue().equals(name) + && m.methodType().stringValue().equals(type.descriptorString())) + .findFirst(); + } +} diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/RestrictedUse.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/RestrictedUse.java new file mode 100644 index 0000000000000..58c5798d33f07 --- /dev/null +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/RestrictedUse.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jnativescan; + +import java.util.SortedSet; + +sealed interface RestrictedUse { + record RestrictedMethodRefs(MethodRef referent, SortedSet<MethodRef> referees) implements RestrictedUse {} + record NativeMethodDecl(MethodRef decl) implements RestrictedUse {} +} diff --git a/src/jdk.jdeps/share/classes/module-info.java b/src/jdk.jdeps/share/classes/module-info.java index e8ad319d70c55..3fdd3ca32d270 100644 --- a/src/jdk.jdeps/share/classes/module-info.java +++ b/src/jdk.jdeps/share/classes/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,12 +28,13 @@ /** * Defines tools for analysing dependencies in Java libraries and programs, * including the <em>{@index jdeps jdeps tool}</em>, - * <em>{@index javap javap tool}</em>, and - * <em>{@index jdeprscan jdeprscan tool}</em> tools. + * <em>{@index javap javap tool}</em>, + * <em>{@index jdeprscan jdeprscan tool}</em>, and + * <em>{@index jnativescan jnativescan tool}</em> tools. * * <p> * This module provides the equivalent of command-line access to the - * <em>javap</em> and <em>jdeps</em> tools via the + * <em>javap</em>, <em>jdeps</em>, and <em>jnativescan</em> tools via the * {@link java.util.spi.ToolProvider ToolProvider} service provider * interface (SPI)</p> * @@ -49,12 +50,14 @@ * @toolGuide javap * @toolGuide jdeprscan * @toolGuide jdeps + * @toolGuide jnativescan * * @provides java.util.spi.ToolProvider - * Use {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("javap")} - * or {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("jdeps")} + * Use {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("javap")}, + * {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("jdeps")}, + * or {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("jnativescan")} * to obtain an instance of a {@code ToolProvider} that provides the equivalent - * of command-line access to the {@code javap} or {@code jdeps} tool. + * of command-line access to the {@code javap}, {@code jdeps}, {@code jnativescan} tool. * * @moduleGraph * @since 9 @@ -63,10 +66,14 @@ module jdk.jdeps { requires java.compiler; requires jdk.compiler; + requires jdk.internal.opt; + + uses com.sun.tools.javac.platform.PlatformProvider; exports com.sun.tools.classfile to jdk.jlink; provides java.util.spi.ToolProvider with com.sun.tools.javap.Main.JavapToolProvider, - com.sun.tools.jdeps.Main.JDepsToolProvider; + com.sun.tools.jdeps.Main.JDepsToolProvider, + com.sun.tools.jnativescan.Main.Provider; } diff --git a/src/jdk.jdeps/share/man/jnativescan.1 b/src/jdk.jdeps/share/man/jnativescan.1 new file mode 100644 index 0000000000000..ff7f18277f260 --- /dev/null +++ b/src/jdk.jdeps/share/man/jnativescan.1 @@ -0,0 +1,220 @@ +.\" Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +.\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +.\" +.\" This code is free software; you can redistribute it and/or modify it +.\" under the terms of the GNU General Public License version 2 only, as +.\" published by the Free Software Foundation. +.\" +.\" This code is distributed in the hope that it will be useful, but WITHOUT +.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +.\" version 2 for more details (a copy is included in the LICENSE file that +.\" accompanied this code). +.\" +.\" You should have received a copy of the GNU General Public License version +.\" 2 along with this work; if not, write to the Free Software Foundation, +.\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +.\" +.\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +.\" or visit www.oracle.com if you need additional information or have any +.\" questions. +.\" +.\" Automatically generated by Pandoc 2.19.2 +.\" +.\" Define V font for inline verbatim, using C font in formats +.\" that render this, and otherwise B font. +.ie "\f[CB]x\f[R]"x" \{\ +. ftr V B +. ftr VI BI +. ftr VB B +. ftr VBI BI +.\} +.el \{\ +. ftr V CR +. ftr VI CI +. ftr VB CB +. ftr VBI CBI +.\} +.TH "JNATIVESCAN" "1" "2025" "JDK 24-ea" "JDK Commands" +.hy +.SH NAME +.PP +jnativescan - static analysis tool that scans one or more jar files for +uses of native functionalities, such as restricted method calls or +\f[V]native\f[R] method declarations. +.SH SYNOPSIS +.PP +\f[V]jnativescan\f[R] [\f[I]options\f[R]] +.TP +\f[I]options\f[R] +See \f[B]Options for the jnativescan Command\f[R] +.SH DESCRIPTION +.PP +The \f[V]jnative\f[R] tool is a static analysis tool provided by the JDK +that scans a JAR file for uses of native functionalities, such as +restricted method calls or \f[V]native\f[R] method declarations. +.PP +\f[V]jnativescan\f[R] accepts a runtime class path and module path +configuration, as well as a set of root modules, and a target release. +It scans the jars on the class and module paths, and reports uses of +native functionalities either in a tree like structure, which also +identifies that calling classes and methods, or as a list of module +names when the \f[V]--print-native-access\f[R] flag is specified. +.SH OPTIONS FOR THE JNATIVESCAN COMMAND +.PP +The following options are available: +.TP +\f[V]--class-path\f[R] \f[I]path\f[R] +Used to specify a list of paths pointing to jar files to be scanned. +.PP +All jar files specified through this list will be scanned. +If a jar file contains a \f[V]Class-Path\f[R] attribute in its manifest, +jar files listed there will be scanned as well. +Jar files listed in the \f[V]Class-Path\f[R] manifest attribute that can +not be found are ignored. +All the jar files found are treated as if they belonged to the unnamed +module. +.TP +\f[V]--module-path\f[R] \f[I]path\f[R] +Used to specify a list of paths pointing to jar files or directories +containing jar files, that the tool can use to find modules that need to +be scanned. +The list of jar files that will be scanned depends on the +\f[V]--add-modules\f[R] option. +.RS +.PP +For both the \f[V]--class-path\f[R] and \f[V]--module-path\f[R] options, +\f[I]path\f[R] should be a search path that consists of one or more jar +files, separated by the system-specific path separator. +For example: +.IP \[bu] 2 +\f[B]Linux and macOS:\f[R] +.RS 2 +.RS +.PP +\f[V]--class-path /some/foo.jar:/another/different/bar.jar\f[R] +.RE +.RE +.PP +\f[B]Note:\f[R] +.PP +On Windows, use a semicolon (\f[V];\f[R]) as the separator instead of a +colon (\f[V]:\f[R]). +.IP \[bu] 2 +\f[B]Windows:\f[R] +.RS 2 +.RS +.PP +\f[V]--class-path C:\[rs]some\[rs]foo.jar;C:\[rs]another\[rs]different\[rs]bar.jar\f[R] +.RE +.RE +.RE +.TP +\f[V]--add-modules\f[R] \f[I]module[,module...]\f[R] +Used to specify a comma-separated list of module names that indicate the +root modules to scan. +All the root modules will be scanned, as well as any modules that they +depend on. +This includes dependencies on service implementations specified through +the \f[V]uses\f[R] directive in a module\[aq]s \f[V]module-info\f[R] +file. +All modules found on the module path that provide an implementation of +such a service will be scanned as well. +.TP +\f[V]--release\f[R] \f[I]version\f[R] +Used to specify the Java SE release that specifies the set of restricted +methods to scan for. +For multi-release jar files, this option also indicates the version of +class file that should be loaded from the jar. +This option should be set to the version of the runtime under which the +application is eventually intended to be run. +If this flag is omitted, the version of \f[V]jnativescan\f[R] is used as +release version, which is the same as the version of the JDK that the +tool belongs to. +.TP +\f[V]--print-native-access\f[R] +Print a comma-separated list of module names that use native +functionalities, instead of the default tree structure. +.TP +\f[V]--help\f[R] or \f[V]-h\f[R] +Prints out a full help message. +.TP +\f[V]--version\f[R] +Prints out the abbreviated version string of the tool. +.SH EXAMPLE OF \f[V]jnativescan\f[R] USE +.PP +\f[V]jnativescan\f[R] accepts a runtime configuration in the form of a +class path, module path, set of root modules, and a target release +version. +For the class path, the tool will scan all jar files, including those +found recursively through the \f[V]Class-Path\f[R] manifest attribute. +For the module path, the tool scans all root modules specified through +\f[V]--add-modules\f[R], and any (transitive) dependence of the root +modules, including any modules that contain service implementations that +are used by a scanned module. +.PP +By default, the tool prints out which jars, classes, and methods use +native functionalities, in a tree-like structure. +The following is an example output: +.IP +.nf +\f[CB] +$ jnativescan --class-path app.jar +app.jar (ALL-UNNAMED): + foo.Main: + foo.Main::main(String[])void references restricted methods: + java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment + foo.Main::nativeMethod()void is a native method declaration +\f[R] +.fi +.PP +\f[V]app.jar (ALL-UNNAMED)\f[R] is the path to the jar file, with the +module name in parentheses behind it. +Since in this case the jar file appears on the class path, +\f[V]ALL-UNNAMED\f[R] is printed to indicate the unnamed module. +The second line of the output, \f[V]foo.Main\f[R], indicates that +methods using native functionalities were found in the +\f[V]foo.Main\f[R] class. +The next line: +.IP +.nf +\f[CB] + foo.Main::main(String[])void references restricted methods: +\f[R] +.fi +.PP +Indicates that the \f[V]main(String[])\f[R] method in the +\f[V]foo.Main\f[R] class references a restricted method, which is listed +on the following line as: +.IP +.nf +\f[CB] + java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment +\f[R] +.fi +.PP +Lastly, the text: +.IP +.nf +\f[CB] + foo.Main::nativeMethod()void is a native method declaration +\f[R] +.fi +.PP +Indicates that the \f[V]foo.Main\f[R] class contains a declaration of a +\f[V]native\f[R] method named \f[V]nativeMethod\f[R]. +.PP +If we add \f[V]--print-native-access\f[R] to the example command line, +we instead get a list of the names of modules that contain accesses to +native functionalities: +.IP +.nf +\f[CB] +$ jnativescan --class-path app.jar --print-native-access +ALL-UNNAMED +\f[R] +.fi +.PP +In this case the output consists of just \f[V]ALL-UNNAMED\f[R], which +indicates a jar file on the class path, that is, in the unnamed module, +contains an access to native functionalities. diff --git a/test/jdk/tools/launcher/HelpFlagsTest.java b/test/jdk/tools/launcher/HelpFlagsTest.java index dda649b9f41ba..15c6c101dd0c1 100644 --- a/test/jdk/tools/launcher/HelpFlagsTest.java +++ b/test/jdk/tools/launcher/HelpFlagsTest.java @@ -141,6 +141,7 @@ private static class ToolHelpSpec { new ToolHelpSpec("jlink", 1, 1, 1, 0, 0, 0, 2), // -?, -h, --help new ToolHelpSpec("jmap", 1, 1, 1, 0, 1, 0, 1), // -?, -h, --help, -help accepted but not documented. new ToolHelpSpec("jmod", 1, 1, 1, 0, 1, 0, 2), // -?, -h, --help, -help accepted but not documented. + new ToolHelpSpec("jnativescan", 1, 1, 1, 0, 1, 0, 1), // -?, -h, --help, -help accepted but not documented. new ToolHelpSpec("jps", 1, 1, 1, 0, 1, 1, 1), // -?, -h, --help -help, Documents -help new ToolHelpSpec("jrunscript", 1, 1, 1, 0, 1, 1, 7), // -?, -h, --help -help, Documents -help new ToolHelpSpec("jshell", 1, 1, 1, 0, 1, 0, 1), // -?, -h, --help, -help accepted but not documented. diff --git a/test/langtools/TEST.groups b/test/langtools/TEST.groups index 74503501da9b9..e290a1431a3c5 100644 --- a/test/langtools/TEST.groups +++ b/test/langtools/TEST.groups @@ -63,6 +63,10 @@ langtools_jdeps = \ tools/all \ tools/jdeps +langtools_jnativescan = \ + tools/all \ + tools/jnativescan + langtools_slow = \ jdk/internal/shellsupport/doc/FullJavadocHelperTest.java diff --git a/test/langtools/tools/jnativescan/JNativeScanTestBase.java b/test/langtools/tools/jnativescan/JNativeScanTestBase.java new file mode 100644 index 0000000000000..97c0b21a738a2 --- /dev/null +++ b/test/langtools/tools/jnativescan/JNativeScanTestBase.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Path; +import java.util.Arrays; + +import java.io.StringWriter; +import java.util.spi.ToolProvider; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.util.JarUtils; + +public class JNativeScanTestBase { + + public static final String MODULE_PATH = "mods"; + + private static final ToolProvider JNATIVESCAN_TOOL = ToolProvider.findFirst("jnativescan") + .orElseThrow(() -> new RuntimeException("jnativescan tool not found")); + + public static OutputAnalyzer jnativescan(String... args) { + return run(JNATIVESCAN_TOOL, args); + } + + private static OutputAnalyzer run(ToolProvider tp, String[] commands) { + int rc; + StringWriter sw = new StringWriter(); + StringWriter esw = new StringWriter(); + + try (PrintWriter pw = new PrintWriter(sw); + PrintWriter epw = new PrintWriter(esw)) { + System.out.println("Running " + tp.name() + ", Command: " + Arrays.toString(commands)); + rc = tp.run(pw, epw, commands); + } + OutputAnalyzer output = new OutputAnalyzer(sw.toString(), esw.toString(), rc); + output.outputTo(System.out); + output.errorTo(System.err); + return output; + } + + public static Path makeModularJar(String moduleName) throws IOException { + Path jarPath = Path.of(MODULE_PATH, moduleName + ".jar"); + Path moduleRoot = moduleRoot(moduleName); + JarUtils.createJarFile(jarPath, moduleRoot); + return jarPath; + } + + public static Path moduleRoot(String name) { + return Path.of(System.getProperty("test.module.path")).resolve(name); + } + + public static OutputAnalyzer assertSuccess(OutputAnalyzer output) { + if (output.getExitValue() != 0) { + throw new IllegalStateException("tool run failed"); + } + return output; + } + + public static OutputAnalyzer assertFailure(OutputAnalyzer output) { + if (output.getExitValue() == 0) { + throw new IllegalStateException("tool run succeeded"); + } + return output; + } +} diff --git a/test/langtools/tools/jnativescan/TestArrayTypeRefs.java b/test/langtools/tools/jnativescan/TestArrayTypeRefs.java new file mode 100644 index 0000000000000..a439fdfdef967 --- /dev/null +++ b/test/langtools/tools/jnativescan/TestArrayTypeRefs.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /test/lib .. ./cases/modules + * @build JNativeScanTestBase + * cases.classpath.arrayref.App + * @run junit TestArrayTypeRefs + */ + +import jdk.test.lib.util.JarUtils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; + +public class TestArrayTypeRefs extends JNativeScanTestBase { + + static Path ARRAY_REF; + + @BeforeAll + public static void before() throws IOException { + ARRAY_REF = Path.of("arrayref.jar"); + Path testClasses = Path.of(System.getProperty("test.classes", "")); + JarUtils.createJarFile(ARRAY_REF, testClasses, Path.of("arrayref", "App.class")); + } + + @Test + public void testSingleJarClassPath() { + assertSuccess(jnativescan("--class-path", ARRAY_REF.toString())) + .stderrShouldBeEmpty() + .stdoutShouldContain("<no restricted methods>"); + } +} diff --git a/test/langtools/tools/jnativescan/TestJNativeScan.java b/test/langtools/tools/jnativescan/TestJNativeScan.java new file mode 100644 index 0000000000000..94db492441263 --- /dev/null +++ b/test/langtools/tools/jnativescan/TestJNativeScan.java @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /test/lib .. ./cases/modules + * @build JNativeScanTestBase + * org.singlejar/* org.lib/* org.myapp/* org.service/* + * cases.classpath.singlejar.main.Main + * cases.classpath.lib.Lib + * cases.classpath.app.App + * cases.classpath.unnamed_package.UnnamedPackage + * @run junit TestJNativeScan + */ + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.util.JarUtils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import java.util.jar.Attributes; +import java.util.jar.Manifest; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class TestJNativeScan extends JNativeScanTestBase { + + static Path TEST_CLASSES; + + static Path CLASS_PATH_APP; + static Path SINGLE_JAR_CLASS_PATH; + static Path SINGLE_JAR_MODULAR; + static Path ORG_MYAPP; + static Path ORG_LIB; + static Path UNNAMED_PACKAGE_JAR; + static Path LIB_JAR; + + @BeforeAll + public static void before() throws IOException { + SINGLE_JAR_CLASS_PATH = Path.of("singleJar.jar"); + TEST_CLASSES = Path.of(System.getProperty("test.classes", "")); + JarUtils.createJarFile(SINGLE_JAR_CLASS_PATH, TEST_CLASSES, Path.of("main", "Main.class")); + + LIB_JAR = Path.of("lib.jar"); + JarUtils.createJarFile(LIB_JAR, TEST_CLASSES, Path.of("lib", "Lib.class")); + Manifest manifest = new Manifest(); + Attributes mainAttrs = manifest.getMainAttributes(); + mainAttrs.put(Attributes.Name.MANIFEST_VERSION, "1.0"); // need version or other attributes will be ignored + mainAttrs.putValue("Class-Path", "lib.jar non-existent.jar"); + CLASS_PATH_APP = Path.of("app.jar"); + JarUtils.createJarFile(CLASS_PATH_APP, manifest, TEST_CLASSES, Path.of("app", "App.class")); + + SINGLE_JAR_MODULAR = makeModularJar("org.singlejar"); + ORG_MYAPP = makeModularJar("org.myapp"); + ORG_LIB = makeModularJar("org.lib"); + makeModularJar("org.service"); + + UNNAMED_PACKAGE_JAR = Path.of("unnamed_package.jar"); + JarUtils.createJarFile(UNNAMED_PACKAGE_JAR, TEST_CLASSES, Path.of("UnnamedPackage.class")); + } + + @Test + public void testSingleJarClassPath() { + assertSuccess(jnativescan("--class-path", SINGLE_JAR_CLASS_PATH.toString())) + .stderrShouldBeEmpty() + .stdoutShouldContain("ALL-UNNAMED") + .stdoutShouldContain("main.Main") + .stdoutShouldContain("main.Main::m()void is a native method declaration") + .stdoutShouldContain("main.Main::main(String[])void references restricted methods") + .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment"); + } + + @Test + public void testSingleJarModulePath() { + assertSuccess(jnativescan("--module-path", MODULE_PATH, "--add-modules", "org.singlejar")) + .stderrShouldBeEmpty() + .stdoutShouldContain("org.singlejar") + .stdoutShouldContain("org.singlejar.main.Main") + .stdoutShouldContain("org.singlejar.main.Main::m()void is a native method declaration") + .stdoutShouldContain("org.singlejar.main.Main::main(String[])void references restricted methods") + .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment"); + } + + @Test + public void testWithDepModule() { + assertSuccess(jnativescan("--module-path", MODULE_PATH, "--add-modules", "org.myapp")) + .stderrShouldBeEmpty() + .stdoutShouldContain("org.lib") + .stdoutShouldContain("org.lib.Lib") + .stdoutShouldContain("org.lib.Lib::m()void is a native method declaration") + .stdoutShouldContain("org.lib.Lib::doIt()void references restricted methods") + .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment") + .stdoutShouldContain("org.service") + .stdoutShouldContain("org.service.ServiceImpl") + .stdoutShouldContain("org.service.ServiceImpl::m()void is a native method declaration") + .stdoutShouldContain("org.service.ServiceImpl::doIt()void references restricted methods") + .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment"); + } + + @Test + public void testAllModulePath() { + assertSuccess(jnativescan("--module-path", MODULE_PATH, "--add-modules", "ALL-MODULE-PATH")) + .stderrShouldBeEmpty() + .stdoutShouldContain("org.singlejar") + .stdoutShouldContain("org.lib") + .stdoutShouldContain("org.service"); + } + + @Test + public void testClassPathAttribute() { + assertSuccess(jnativescan("--class-path", CLASS_PATH_APP.toString())) + .stderrShouldBeEmpty() + .stdoutShouldContain("ALL-UNNAMED") + .stdoutShouldContain("lib.Lib") + .stdoutShouldContain("lib.Lib::m()void is a native method declaration") + .stdoutShouldContain("lib.Lib::doIt()void references restricted methods") + .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment"); + } + + @Test + public void testInvalidRelease() { + assertFailure(jnativescan("--module-path", MODULE_PATH, "--add-modules", "ALL-MODULE-PATH", "--release", "asdf")) + .stderrShouldContain("Invalid release"); + } + + @Test + public void testReleaseNotSupported() { + assertFailure(jnativescan("--module-path", MODULE_PATH, "--add-modules", "ALL-MODULE-PATH", "--release", "9999999")) + .stderrShouldContain("Release: 9999999 not supported"); + } + + @Test + public void testFileDoesNotExist() { + assertFailure(jnativescan("--class-path", "non-existent.jar")) + .stderrShouldContain("Path does not appear to be a jar file, or directory containing classes"); + } + + @Test + public void testModuleNotAJarFile() { + String modulePath = moduleRoot("org.myapp").toString() + File.pathSeparator + ORG_LIB.toString(); + assertSuccess(jnativescan("--module-path", modulePath, + "--add-modules", "ALL-MODULE-PATH")) + .stdoutShouldContain("lib.Lib") + .stdoutShouldContain("lib.Lib::m()void is a native method declaration") + .stdoutShouldContain("lib.Lib::doIt()void references restricted methods") + .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment"); + } + + @Test + public void testPrintNativeAccess() { + assertSuccess(jnativescan("--module-path", MODULE_PATH, + "-add-modules", "org.singlejar,org.myapp", + "--print-native-access")) + .stdoutShouldMatch("org.lib,org.service,org.singlejar"); + } + + @Test + public void testNoDuplicateNames() { + String classPath = SINGLE_JAR_CLASS_PATH + File.pathSeparator + CLASS_PATH_APP; + OutputAnalyzer output = assertSuccess(jnativescan("--class-path", classPath, "--print-native-access")); + String[] moduleNames = output.getStdout().split(","); + Set<String> names = new HashSet<>(); + for (String name : moduleNames) { + assertTrue(names.add(name.strip())); + } + } + + @Test + public void testUnnamedPackage() { + assertSuccess(jnativescan("--class-path", UNNAMED_PACKAGE_JAR.toString())) + .stderrShouldBeEmpty() + .stdoutShouldContain("ALL-UNNAMED") + .stdoutShouldNotContain(".UnnamedPackage") + .stdoutShouldContain("UnnamedPackage") + .stdoutShouldContain("UnnamedPackage::m()void is a native method declaration") + .stdoutShouldContain("UnnamedPackage::main(String[])void references restricted methods") + .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment"); + } + + @Test + public void testPositionalArguments() { + assertFailure(jnativescan("foo")) + .stdoutShouldBeEmpty() + .stderrShouldContain("jnativescan does not accept positional arguments"); + } + + @Test + public void testMissingRootModules() { + assertFailure(jnativescan("--module-path", MODULE_PATH)) + .stdoutShouldBeEmpty() + .stderrShouldContain("Missing required option(s) [add-modules]"); + } + + @Test + public void testClassPathDirectory() { + assertSuccess(jnativescan("--class-path", TEST_CLASSES.toString())) + .stderrShouldBeEmpty() + .stdoutShouldContain("ALL-UNNAMED") + .stdoutShouldContain("UnnamedPackage") + .stdoutShouldContain("UnnamedPackage::m()void is a native method declaration") + .stdoutShouldContain("UnnamedPackage::main(String[])void references restricted methods") + .stdoutShouldContain("main.Main") + .stdoutShouldContain("main.Main::m()void is a native method declaration") + .stdoutShouldContain("main.Main::main(String[])void references restricted methods") + .stdoutShouldContain("lib.Lib") + .stdoutShouldContain("lib.Lib::m()void is a native method declaration") + .stdoutShouldContain("lib.Lib::doIt()void references restricted methods") + .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment"); + } + + @Test + public void testMultipleClassPathJars() { + // make sure all of these are reported, even when they are all in the ALL-UNNAMED module + String classPath = UNNAMED_PACKAGE_JAR + + File.pathSeparator + SINGLE_JAR_CLASS_PATH + + File.pathSeparator + LIB_JAR; + assertSuccess(jnativescan("--class-path", classPath)) + .stderrShouldBeEmpty() + .stdoutShouldContain("ALL-UNNAMED") + .stdoutShouldContain("UnnamedPackage") + .stdoutShouldContain(UNNAMED_PACKAGE_JAR.toString()) + .stdoutShouldContain("lib.Lib") + .stdoutShouldContain(LIB_JAR.toString()) + .stdoutShouldContain("main.Main") + .stdoutShouldContain(SINGLE_JAR_CLASS_PATH.toString()); + } +} diff --git a/test/langtools/tools/jnativescan/TestMissingSystemClass.java b/test/langtools/tools/jnativescan/TestMissingSystemClass.java new file mode 100644 index 0000000000000..5806590d0e081 --- /dev/null +++ b/test/langtools/tools/jnativescan/TestMissingSystemClass.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /test/lib .. ./cases/modules + * @build JNativeScanTestBase + * @compile --release 20 cases/classpath/missingsystem/App.java + * @run junit TestMissingSystemClass + */ + +import jdk.test.lib.util.JarUtils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; + +public class TestMissingSystemClass extends JNativeScanTestBase { + + static Path MISSING_SYSTEM; + + @BeforeAll + public static void before() throws IOException { + MISSING_SYSTEM = Path.of("missingsystem.jar"); + Path testClasses = Path.of(System.getProperty("test.classes", "")); + JarUtils.createJarFile(MISSING_SYSTEM, testClasses, Path.of("missingsystem", "App.class")); + } + + @Test + public void testSingleJarClassPath() { + assertFailure(jnativescan("--class-path", MISSING_SYSTEM.toString(), "--release", "21")) + .stdoutShouldBeEmpty() + .stderrShouldContain("Error while processing method") + .stderrShouldContain("missingsystem.App::main(String[])void") + .stderrShouldContain("CAUSED BY:") + .stderrShouldContain("System class can not be found") + .stderrShouldContain("java.lang.Compiler"); + } +} diff --git a/test/langtools/tools/jnativescan/TestSubclassRefs.java b/test/langtools/tools/jnativescan/TestSubclassRefs.java new file mode 100644 index 0000000000000..c8eed0439ee75 --- /dev/null +++ b/test/langtools/tools/jnativescan/TestSubclassRefs.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /test/lib .. ./cases/modules + * @build JNativeScanTestBase + * cases.classpath.subclassref.App + * @run junit TestSubclassRefs + */ + +import jdk.test.lib.util.JarUtils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; + +public class TestSubclassRefs extends JNativeScanTestBase { + + static Path SUBCLASS_REF; + + @BeforeAll + public static void before() throws IOException { + SUBCLASS_REF = Path.of("subclassref.jar"); + Path testClasses = Path.of(System.getProperty("test.classes", "")); + JarUtils.createJarFile(SUBCLASS_REF, testClasses, Path.of("subclassref", "App.class")); + } + + @Test + public void testSingleJarClassPath() { + assertSuccess(jnativescan("--class-path", SUBCLASS_REF.toString())) + .stderrShouldBeEmpty() + .stdoutShouldContain("<no restricted methods>"); + } +} diff --git a/test/langtools/tools/jnativescan/cases/classpath/app/App.java b/test/langtools/tools/jnativescan/cases/classpath/app/App.java new file mode 100644 index 0000000000000..f96ab11e5764a --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/classpath/app/App.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package app; + +import lib.Lib; + +public class App { + public static void main(String[] args) { + Lib.doIt(); + } +} diff --git a/test/langtools/tools/jnativescan/cases/classpath/arrayref/App.java b/test/langtools/tools/jnativescan/cases/classpath/arrayref/App.java new file mode 100644 index 0000000000000..aa480f392fbf2 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/classpath/arrayref/App.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package arrayref; + +public class App { + public static void main(String[] args) { + // reference an array method to see that + // RestrictedMethodFinder correctly handles + // references to array methods + args.clone(); + } +} diff --git a/test/langtools/tools/jnativescan/cases/classpath/lib/Lib.java b/test/langtools/tools/jnativescan/cases/classpath/lib/Lib.java new file mode 100644 index 0000000000000..ec92696364c9d --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/classpath/lib/Lib.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package lib; + +import java.lang.foreign.MemorySegment; + +public class Lib { + public static void doIt() { + MemorySegment.ofAddress(1234).reinterpret(10); + } + + private static native void m(); +} diff --git a/test/langtools/tools/jnativescan/cases/classpath/missingsystem/App.java b/test/langtools/tools/jnativescan/cases/classpath/missingsystem/App.java new file mode 100644 index 0000000000000..0e20fe81eecd0 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/classpath/missingsystem/App.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package missingsystem; + +public class App { + public static void main(String[] args) { + // this class was present in Java 20, but removed in 21 + // if we compile with --release 20, but run jnativescan + // with --release 21, we should get an error + java.lang.Compiler.enable(); + } +} diff --git a/test/langtools/tools/jnativescan/cases/classpath/singlejar/main/Main.java b/test/langtools/tools/jnativescan/cases/classpath/singlejar/main/Main.java new file mode 100644 index 0000000000000..280e8646f9ff4 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/classpath/singlejar/main/Main.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package main; + +import java.lang.foreign.*; + +public class Main { + public static void main(String[] args) { + MemorySegment.ofAddress(1234).reinterpret(10); + } + + private static native void m(); +} diff --git a/test/langtools/tools/jnativescan/cases/classpath/subclassref/App.java b/test/langtools/tools/jnativescan/cases/classpath/subclassref/App.java new file mode 100644 index 0000000000000..abe9e41265e4c --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/classpath/subclassref/App.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package subclassref; + +import java.util.List; + +public class App { + public static void main(String[] args) { + List<String> l = List.of(args); + l.stream(); // List does not declare stream() + } +} diff --git a/test/langtools/tools/jnativescan/cases/classpath/unnamed_package/UnnamedPackage.java b/test/langtools/tools/jnativescan/cases/classpath/unnamed_package/UnnamedPackage.java new file mode 100644 index 0000000000000..4e8dfe69b5a19 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/classpath/unnamed_package/UnnamedPackage.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.foreign.*; + +public class UnnamedPackage { + public static void main(String[] args) { + MemorySegment.ofAddress(1234).reinterpret(10); + } + + private static native void m(); +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.lib/module-info.java b/test/langtools/tools/jnativescan/cases/modules/org.lib/module-info.java new file mode 100644 index 0000000000000..8572ed80e431d --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.lib/module-info.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module org.lib { + exports org.lib; +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Lib.java b/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Lib.java new file mode 100644 index 0000000000000..3f9ea0e1ada26 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Lib.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.lib; + +import java.lang.foreign.*; + +public class Lib { + public static void doIt() { + MemorySegment.ofAddress(1234).reinterpret(10); + } + + private static native void m(); +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Service.java b/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Service.java new file mode 100644 index 0000000000000..2e406d926a662 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Service.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.lib; + +public interface Service { +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.myapp/module-info.java b/test/langtools/tools/jnativescan/cases/modules/org.myapp/module-info.java new file mode 100644 index 0000000000000..8155fb5d8f260 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.myapp/module-info.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module org.myapp { + requires org.lib; + + uses org.lib.Service; +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.myapp/org/myapp/main/Main.java b/test/langtools/tools/jnativescan/cases/modules/org.myapp/org/myapp/main/Main.java new file mode 100644 index 0000000000000..c2329b2ceeb2f --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.myapp/org/myapp/main/Main.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.myapp.main; + +import org.lib.Lib; + +public class Main { + public static void main(String[] args) { + Lib.doIt(); + } +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.service/module-info.java b/test/langtools/tools/jnativescan/cases/modules/org.service/module-info.java new file mode 100644 index 0000000000000..431dd64172dd4 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.service/module-info.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +module org.service { + requires org.lib; + + provides org.lib.Service with org.service.ServiceImpl; +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.service/org/service/ServiceImpl.java b/test/langtools/tools/jnativescan/cases/modules/org.service/org/service/ServiceImpl.java new file mode 100644 index 0000000000000..6e643f1c649f1 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.service/org/service/ServiceImpl.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.service; + +import org.lib.Service; + +import java.lang.foreign.MemorySegment; + +public class ServiceImpl implements Service { + public void doIt() { + MemorySegment.ofAddress(1234).reinterpret(10); + } + + private native void m(); +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.singlejar/module-info.java b/test/langtools/tools/jnativescan/cases/modules/org.singlejar/module-info.java new file mode 100644 index 0000000000000..c9f96e4f77147 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.singlejar/module-info.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +module org.singlejar { + +} diff --git a/test/langtools/tools/jnativescan/cases/modules/org.singlejar/org/singlejar/main/Main.java b/test/langtools/tools/jnativescan/cases/modules/org.singlejar/org/singlejar/main/Main.java new file mode 100644 index 0000000000000..c6925eaf64996 --- /dev/null +++ b/test/langtools/tools/jnativescan/cases/modules/org.singlejar/org/singlejar/main/Main.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.singlejar.main; + +import java.lang.foreign.*; + +public class Main { + public static void main(String[] args) { + MemorySegment.ofAddress(1234).reinterpret(10); + } + + private static native void m(); +} From be3676f6bbc2d8041e43cf7bcfaee7fb9d864378 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva <matsaave@openjdk.org> Date: Mon, 8 Jul 2024 14:04:32 +0000 Subject: [PATCH 329/471] 8304484: CDS dynamic dumping incorrectly leads to "Error occurred during initialization of VM" Reviewed-by: ccheung, iklam --- src/hotspot/share/classfile/classLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/classfile/classLoader.cpp b/src/hotspot/share/classfile/classLoader.cpp index 910cbe48c5c19..e410824e3001c 100644 --- a/src/hotspot/share/classfile/classLoader.cpp +++ b/src/hotspot/share/classfile/classLoader.cpp @@ -470,7 +470,7 @@ bool ClassPathImageEntry::is_modules_image() const { void ClassLoader::exit_with_path_failure(const char* error, const char* message) { assert(CDSConfig::is_dumping_archive(), "sanity"); tty->print_cr("Hint: enable -Xlog:class+path=info to diagnose the failure"); - vm_exit_during_initialization(error, message); + vm_exit_during_cds_dumping(error, message); } #endif From d8c1c6ab0543c986280dcfa1c6c79e010a7b35fb Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Mon, 8 Jul 2024 15:45:26 +0000 Subject: [PATCH 330/471] 8335604: Serial: Inline Generation::contiguous_available Reviewed-by: tschatzl --- src/hotspot/share/gc/serial/defNewGeneration.cpp | 5 ----- src/hotspot/share/gc/serial/defNewGeneration.hpp | 2 -- src/hotspot/share/gc/serial/generation.hpp | 4 ---- src/hotspot/share/gc/serial/tenuredGeneration.cpp | 6 +----- src/hotspot/share/gc/serial/tenuredGeneration.hpp | 2 -- 5 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index acf7e23910367..715b82fd38d32 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -533,11 +533,6 @@ size_t DefNewGeneration::capacity_before_gc() const { return eden()->capacity(); } -size_t DefNewGeneration::contiguous_available() const { - return eden()->free(); -} - - void DefNewGeneration::object_iterate(ObjectClosure* blk) { eden()->object_iterate(blk); from()->object_iterate(blk); diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp index a7ee555902a25..011b79fdabd6b 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.hpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp @@ -172,8 +172,6 @@ class DefNewGeneration: public Generation { // heuristic resizing decisions. size_t unsafe_max_alloc_nogc() const; - size_t contiguous_available() const; - size_t max_eden_size() const { return _max_eden_size; } size_t max_survivor_size() const { return _max_survivor_size; } diff --git a/src/hotspot/share/gc/serial/generation.hpp b/src/hotspot/share/gc/serial/generation.hpp index 5e5aad5d0c1b2..a757c97c5cb15 100644 --- a/src/hotspot/share/gc/serial/generation.hpp +++ b/src/hotspot/share/gc/serial/generation.hpp @@ -96,10 +96,6 @@ class Generation: public CHeapObj<mtGC> { // for the allocation of objects. virtual size_t max_capacity() const; - // The largest number of contiguous free bytes in the generation, - // including expansion (Assumes called at a safepoint.) - virtual size_t contiguous_available() const = 0; - MemRegion reserved() const { return _reserved; } /* Returns "TRUE" iff "p" points into the reserved area of the generation. */ diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.cpp b/src/hotspot/share/gc/serial/tenuredGeneration.cpp index f1389b48557f8..b1b7507094771 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.cpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.cpp @@ -377,7 +377,7 @@ void TenuredGeneration::update_counters() { } bool TenuredGeneration::promotion_attempt_is_safe(size_t max_promotion_in_bytes) const { - size_t available = contiguous_available(); + size_t available = _the_space->free() + _virtual_space.uncommitted_size(); size_t av_promo = (size_t)_avg_promoted->padded_average(); bool res = (available >= av_promo) || (available >= max_promotion_in_bytes); @@ -413,10 +413,6 @@ TenuredGeneration::expand_and_allocate(size_t word_size, bool is_tlab) { return allocate(word_size, is_tlab); } -size_t TenuredGeneration::contiguous_available() const { - return _the_space->free() + _virtual_space.uncommitted_size(); -} - void TenuredGeneration::assert_correct_size_change_locking() { assert_locked_or_safepoint(Heap_lock); } diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.hpp b/src/hotspot/share/gc/serial/tenuredGeneration.hpp index bcb2d668213e8..dcec912d4887f 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.hpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.hpp @@ -124,8 +124,6 @@ class TenuredGeneration: public Generation { const char* name() const { return "tenured generation"; } const char* short_name() const { return "Tenured"; } - size_t contiguous_available() const; - // Iteration void object_iterate(ObjectClosure* blk); From a9b7f42f29120a3cca0d341350ff03cae485e68b Mon Sep 17 00:00:00 2001 From: Joe Darcy <darcy@openjdk.org> Date: Mon, 8 Jul 2024 16:20:01 +0000 Subject: [PATCH 331/471] 8333826: Update --release 23 symbol information for JDK 23 build 29 Reviewed-by: iris, jlahoda --- src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt b/src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt index fdc899578cf82..577ff91c7caad 100644 --- a/src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt +++ b/src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt @@ -119,6 +119,10 @@ class name javax/swing/JScrollBar method name setMinimumSize descriptor (Ljava/awt/Dimension;)V flags 1 method name setMaximumSize descriptor (Ljava/awt/Dimension;)V flags 1 +class name javax/swing/plaf/basic/BasicSliderUI +-method name <init> descriptor ()V +method name <init> descriptor ()V flags 1 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="23") + class name javax/swing/plaf/synth/SynthTreeUI method name getCollapsedIcon descriptor ()Ljavax/swing/Icon; flags 1 From 284671a1e4fb5bfe15b20b7f41fc24415b1235ed Mon Sep 17 00:00:00 2001 From: Calvin Cheung <ccheung@openjdk.org> Date: Mon, 8 Jul 2024 16:44:22 +0000 Subject: [PATCH 332/471] 8335449: runtime/cds/DeterministicDump.java fails with File content different at byte ... Reviewed-by: matsaave, iklam --- test/hotspot/jtreg/runtime/cds/DeterministicDump.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/runtime/cds/DeterministicDump.java b/test/hotspot/jtreg/runtime/cds/DeterministicDump.java index 8f9bb4a582985..cc8d8c2b1dde9 100644 --- a/test/hotspot/jtreg/runtime/cds/DeterministicDump.java +++ b/test/hotspot/jtreg/runtime/cds/DeterministicDump.java @@ -25,7 +25,7 @@ * @test * @bug 8241071 * @summary The same JDK build should always generate the same archive file (no randomness). - * @requires vm.cds + * @requires vm.cds & vm.flagless * @library /test/lib * @run driver DeterministicDump */ From 3a87eb5c4606ce39970962895315567e8606eba7 Mon Sep 17 00:00:00 2001 From: Kelvin Nilsen <kdnilsen@openjdk.org> Date: Mon, 8 Jul 2024 18:03:19 +0000 Subject: [PATCH 333/471] 8335126: Shenandoah: Improve OOM handling Reviewed-by: shade, ysr, wkemper, rkennke --- .../gc/shenandoah/shenandoahControlThread.cpp | 3 +- .../gc/shenandoah/shenandoahDegeneratedGC.cpp | 1 - .../share/gc/shenandoah/shenandoahHeap.cpp | 48 ++++++++++++------- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp index e538ca024678f..95a70de5790e9 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp @@ -318,7 +318,8 @@ void ShenandoahControlThread::service_concurrent_normal_cycle(GCCause::Cause cau ShenandoahConcurrentGC gc; if (gc.collect(cause)) { - // Cycle is complete + // Cycle is complete. There were no failed allocation requests and no degeneration, so count this as good progress. + heap->notify_gc_progress(); heap->heuristics()->record_success_concurrent(); heap->shenandoah_policy()->record_success_concurrent(gc.abbreviated()); } else { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp index fb5283bb1d88d..6b597d9b2d7b3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp @@ -228,7 +228,6 @@ void ShenandoahDegenGC::op_degenerated() { // Check for futility and fail. There is no reason to do several back-to-back Degenerated cycles, // because that probably means the heap is overloaded and/or fragmented. if (!metrics.is_good_progress()) { - heap->notify_gc_no_progress(); heap->cancel_gc(GCCause::_shenandoah_upgrade_to_full_gc); op_degenerated_futile(); } else { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index ee3f4e7d8eb8c..5c5b6f7ebe58d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -945,24 +945,36 @@ HeapWord* ShenandoahHeap::allocate_memory(ShenandoahAllocRequest& req) { return nullptr; } - // Block until control thread reacted, then retry allocation. - // - // It might happen that one of the threads requesting allocation would unblock - // way later after GC happened, only to fail the second allocation, because - // other threads have already depleted the free storage. In this case, a better - // strategy is to try again, as long as GC makes progress (or until at least - // one full GC has completed). - size_t original_count = shenandoah_policy()->full_gc_count(); - while (result == nullptr - && (get_gc_no_progress_count() == 0 || original_count == shenandoah_policy()->full_gc_count())) { - control_thread()->handle_alloc_failure(req, true); - result = allocate_memory_under_lock(req, in_new_region); - } - - if (log_is_enabled(Debug, gc, alloc)) { - ResourceMark rm; - log_debug(gc, alloc)("Thread: %s, Result: " PTR_FORMAT ", Request: %s, Size: " SIZE_FORMAT ", Original: " SIZE_FORMAT ", Latest: " SIZE_FORMAT, - Thread::current()->name(), p2i(result), req.type_string(), req.size(), original_count, get_gc_no_progress_count()); + if (result == nullptr) { + // Block until control thread reacted, then retry allocation. + // + // It might happen that one of the threads requesting allocation would unblock + // way later after GC happened, only to fail the second allocation, because + // other threads have already depleted the free storage. In this case, a better + // strategy is to try again, until at least one full GC has completed. + // + // Stop retrying and return nullptr to cause OOMError exception if our allocation failed even after: + // a) We experienced a GC that had good progress, or + // b) We experienced at least one Full GC (whether or not it had good progress) + // + // TODO: Consider GLOBAL GC rather than Full GC to remediate OOM condition: https://bugs.openjdk.org/browse/JDK-8335910 + + size_t original_count = shenandoah_policy()->full_gc_count(); + while ((result == nullptr) && (original_count == shenandoah_policy()->full_gc_count())) { + control_thread()->handle_alloc_failure(req, true); + result = allocate_memory_under_lock(req, in_new_region); + } + if (result != nullptr) { + // If our allocation request has been satisifed after it initially failed, we count this as good gc progress + notify_gc_progress(); + } + if (log_is_enabled(Debug, gc, alloc)) { + ResourceMark rm; + log_debug(gc, alloc)("Thread: %s, Result: " PTR_FORMAT ", Request: %s, Size: " SIZE_FORMAT + ", Original: " SIZE_FORMAT ", Latest: " SIZE_FORMAT, + Thread::current()->name(), p2i(result), req.type_string(), req.size(), + original_count, get_gc_no_progress_count()); + } } } else { assert(req.is_gc_alloc(), "Can only accept GC allocs here"); From 3733fe3a207078b585421cd2a098e808fafaa817 Mon Sep 17 00:00:00 2001 From: "lawrence.andrews" <lawrence.andrews@oracle.com> Date: Mon, 8 Jul 2024 19:14:33 +0000 Subject: [PATCH 334/471] 8335789: [TESTBUG] XparColor.java test fails with Error. Parse Exception: Invalid or unrecognized bugid: @ Reviewed-by: aivanov --- test/jdk/java/awt/print/PrinterJob/XparColor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/java/awt/print/PrinterJob/XparColor.java b/test/jdk/java/awt/print/PrinterJob/XparColor.java index 9a85a78af558a..30713b1424e53 100644 --- a/test/jdk/java/awt/print/PrinterJob/XparColor.java +++ b/test/jdk/java/awt/print/PrinterJob/XparColor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /** * @test * @bug 4179262 - @ @key printer + * @key printer * @summary Confirm that transparent colors are printed correctly. The * printout should show transparent rings with increasing darkness toward * the center. From babf6df7d97e4beedb25e689634d999412c1e950 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon <cushon@openjdk.org> Date: Mon, 8 Jul 2024 20:09:07 +0000 Subject: [PATCH 335/471] 8334757: AssertionError: Missing type variable in where clause Reviewed-by: jlahoda, vromero --- .../javac/util/RichDiagnosticFormatter.java | 3 +++ .../CantAnnotateClassWithTypeVariable.java | 19 +++++++++++++++++++ .../CantAnnotateClassWithTypeVariable.out | 2 ++ 3 files changed, 24 insertions(+) create mode 100644 test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.java create mode 100644 test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java index e1faa02bd38af..3bc5c671bfda2 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java @@ -184,6 +184,9 @@ protected void preprocessArgument(Object arg) { if (arg instanceof Type type) { preprocessType(type); } + else if (arg instanceof JCDiagnostic.AnnotatedType type) { + preprocessType(type.type()); + } else if (arg instanceof Symbol symbol) { preprocessSymbol(symbol); } diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.java b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.java new file mode 100644 index 0000000000000..8d575caec57c2 --- /dev/null +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.java @@ -0,0 +1,19 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8334757 + * @compile/fail/ref=CantAnnotateClassWithTypeVariable.out -XDrawDiagnostics CantAnnotateClassWithTypeVariable.java + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +public class CantAnnotateClassWithTypeVariable { + @Target(ElementType.TYPE_USE) + @interface TA {} + + static class A { + static class B<T> {} + } + + <T> @TA A.B<T> f() {} +} diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.out b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.out new file mode 100644 index 0000000000000..80fa9f2cdd9c9 --- /dev/null +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.out @@ -0,0 +1,2 @@ +CantAnnotateClassWithTypeVariable.java:18:14: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @CantAnnotateClassWithTypeVariable.TA), CantAnnotateClassWithTypeVariable.A, @CantAnnotateClassWithTypeVariable.TA CantAnnotateClassWithTypeVariable.A.B<T> +1 error From bb1f8a1698553d5962569ac8912edd0d7ef010dd Mon Sep 17 00:00:00 2001 From: Xiaolong Peng <xpeng@openjdk.org> Date: Mon, 8 Jul 2024 20:10:27 +0000 Subject: [PATCH 336/471] 8335904: Fix invalid comment in ShenandoahLock Reviewed-by: shade --- src/hotspot/share/gc/shenandoah/shenandoahLock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp b/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp index 6fc74c53e6390..63c6c9ea88624 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp @@ -44,7 +44,7 @@ void ShenandoahLock::contended_lock(bool allow_block_for_safepoint) { template<bool ALLOW_BLOCK> void ShenandoahLock::contended_lock_internal(JavaThread* java_thread) { assert(!ALLOW_BLOCK || java_thread != nullptr, "Must have a Java thread when allowing block."); - // Spin this much on multi-processor, do not spin on multi-processor. + // Spin this much, but only on multi-processor systems. int ctr = os::is_MP() ? 0xFF : 0; // Apply TTAS to avoid more expensive CAS calls if the lock is still held by other thread. while (Atomic::load(&_state) == locked || From 9c7a6eabb93c570fdb74076edc931576ed6be3e0 Mon Sep 17 00:00:00 2001 From: Ioi Lam <iklam@openjdk.org> Date: Mon, 8 Jul 2024 20:14:26 +0000 Subject: [PATCH 337/471] 8312125: Refactor CDS enum class handling Reviewed-by: matsaave, ccheung --- src/hotspot/share/cds/cdsEnumKlass.cpp | 136 +++++++++++++++++++++++ src/hotspot/share/cds/cdsEnumKlass.hpp | 50 +++++++++ src/hotspot/share/cds/heapShared.cpp | 94 +--------------- src/hotspot/share/cds/heapShared.hpp | 4 - src/hotspot/share/oops/instanceKlass.cpp | 3 +- 5 files changed, 192 insertions(+), 95 deletions(-) create mode 100644 src/hotspot/share/cds/cdsEnumKlass.cpp create mode 100644 src/hotspot/share/cds/cdsEnumKlass.hpp diff --git a/src/hotspot/share/cds/cdsEnumKlass.cpp b/src/hotspot/share/cds/cdsEnumKlass.cpp new file mode 100644 index 0000000000000..b77f2fd9d16ad --- /dev/null +++ b/src/hotspot/share/cds/cdsEnumKlass.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "cds/archiveHeapLoader.hpp" +#include "cds/cdsEnumKlass.hpp" +#include "cds/heapShared.hpp" +#include "classfile/vmClasses.hpp" +#include "classfile/systemDictionaryShared.hpp" +#include "memory/resourceArea.hpp" +#include "oops/fieldStreams.inline.hpp" +#include "oops/oop.inline.hpp" +#include "runtime/fieldDescriptor.inline.hpp" + +#if INCLUDE_CDS_JAVA_HEAP + +bool CDSEnumKlass::is_enum_obj(oop orig_obj) { + Klass* k = orig_obj->klass(); + Klass* buffered_k = ArchiveBuilder::get_buffered_klass(k); + return k->is_instance_klass() && + InstanceKlass::cast(k)->java_super() == vmClasses::Enum_klass(); +} + +// -- Handling of Enum objects +// Java Enum classes have synthetic <clinit> methods that look like this +// enum MyEnum {FOO, BAR} +// MyEnum::<clinint> { +// /*static final MyEnum*/ MyEnum::FOO = new MyEnum("FOO"); +// /*static final MyEnum*/ MyEnum::BAR = new MyEnum("BAR"); +// } +// +// If MyEnum::FOO object is referenced by any of the archived subgraphs, we must +// ensure the archived value equals (in object address) to the runtime value of +// MyEnum::FOO. +// +// However, since MyEnum::<clinint> is synthetically generated by javac, there's +// no way of programmatically handling this inside the Java code (as you would handle +// ModuleLayer::EMPTY_LAYER, for example). +// +// Instead, we archive all static field of such Enum classes. At runtime, +// HeapShared::initialize_enum_klass() skips the <clinit> method and instead pulls +// the static fields out of the archived heap. +void CDSEnumKlass::handle_enum_obj(int level, + KlassSubGraphInfo* subgraph_info, + oop orig_obj) { + assert(level > 1, "must never be called at the first (outermost) level"); + assert(is_enum_obj(orig_obj), "must be"); + + InstanceKlass* ik = InstanceKlass::cast(orig_obj->klass()); + if (ik->has_archived_enum_objs()) { + return; + } + + ik->set_has_archived_enum_objs(); + ArchiveBuilder::get_buffered_klass(ik)->set_has_archived_enum_objs(); + + oop mirror = ik->java_mirror(); + for (JavaFieldStream fs(ik); !fs.done(); fs.next()) { + if (fs.access_flags().is_static()) { + archive_static_field(level, subgraph_info, ik, mirror, fs); + } + } +} + +void CDSEnumKlass::archive_static_field(int level, KlassSubGraphInfo* subgraph_info, + InstanceKlass* ik, oop mirror, JavaFieldStream& fs) { + ResourceMark rm; + fieldDescriptor& fd = fs.field_descriptor(); + if (fd.field_type() != T_OBJECT && fd.field_type() != T_ARRAY) { + guarantee(false, "static field %s::%s must be T_OBJECT or T_ARRAY", + ik->external_name(), fd.name()->as_C_string()); + } + oop oop_field = mirror->obj_field(fd.offset()); + if (oop_field == nullptr) { + guarantee(false, "static field %s::%s must not be null", + ik->external_name(), fd.name()->as_C_string()); + } else if (oop_field->klass() != ik && oop_field->klass() != ik->array_klass_or_null()) { + guarantee(false, "static field %s::%s is of the wrong type", + ik->external_name(), fd.name()->as_C_string()); + } + bool success = HeapShared::archive_reachable_objects_from(level, subgraph_info, oop_field); + assert(success, "VM should have exited with unarchivable objects for _level > 1"); + int root_index = HeapShared::append_root(oop_field); + log_info(cds, heap)("Archived enum obj @%d %s::%s (" INTPTR_FORMAT ")", + root_index, ik->external_name(), fd.name()->as_C_string(), + p2i((oopDesc*)oop_field)); + SystemDictionaryShared::add_enum_klass_static_field(ik, root_index); +} + +bool CDSEnumKlass::initialize_enum_klass(InstanceKlass* k, TRAPS) { + if (!ArchiveHeapLoader::is_in_use()) { + return false; + } + + RunTimeClassInfo* info = RunTimeClassInfo::get_for(k); + assert(info != nullptr, "sanity"); + + if (log_is_enabled(Info, cds, heap)) { + ResourceMark rm; + log_info(cds, heap)("Initializing Enum class: %s", k->external_name()); + } + + oop mirror = k->java_mirror(); + int i = 0; + for (JavaFieldStream fs(k); !fs.done(); fs.next()) { + if (fs.access_flags().is_static()) { + int root_index = info->enum_klass_static_field_root_index_at(i++); + fieldDescriptor& fd = fs.field_descriptor(); + assert(fd.field_type() == T_OBJECT || fd.field_type() == T_ARRAY, "must be"); + mirror->obj_field_put(fd.offset(), HeapShared::get_root(root_index, /*clear=*/true)); + } + } + return true; +} +#endif // INCLUDE_CDS_JAVA_HEAP diff --git a/src/hotspot/share/cds/cdsEnumKlass.hpp b/src/hotspot/share/cds/cdsEnumKlass.hpp new file mode 100644 index 0000000000000..c898bfec60d45 --- /dev/null +++ b/src/hotspot/share/cds/cdsEnumKlass.hpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_CDS_CDSENUMKLASS_HPP +#define SHARE_CDS_CDSENUMKLASS_HPP + +#include "memory/allStatic.hpp" +#include "oops/oop.hpp" +#include "utilities/exceptions.hpp" +#include "utilities/macros.hpp" + +class InstanceKlass; +class JavaFieldStream; +class KlassSubGraphInfo; + +class CDSEnumKlass: AllStatic { +public: + static bool is_enum_obj(oop orig_obj); + static void handle_enum_obj(int level, + KlassSubGraphInfo* subgraph_info, + oop orig_obj); + static bool initialize_enum_klass(InstanceKlass* k, TRAPS) NOT_CDS_JAVA_HEAP_RETURN_(false); + +private: + static void archive_static_field(int level, KlassSubGraphInfo* subgraph_info, + InstanceKlass* ik, oop mirror, JavaFieldStream& fs); +}; + +#endif // SHARE_CDS_CDSENUMKLASS_HPP diff --git a/src/hotspot/share/cds/heapShared.cpp b/src/hotspot/share/cds/heapShared.cpp index 7b519a57d57cd..ff84ddc13fc6c 100644 --- a/src/hotspot/share/cds/heapShared.cpp +++ b/src/hotspot/share/cds/heapShared.cpp @@ -28,6 +28,7 @@ #include "cds/archiveHeapWriter.hpp" #include "cds/archiveUtils.hpp" #include "cds/cdsConfig.hpp" +#include "cds/cdsEnumKlass.hpp" #include "cds/cdsHeapVerifier.hpp" #include "cds/heapShared.hpp" #include "cds/metaspaceShared.hpp" @@ -451,95 +452,6 @@ void HeapShared::set_has_native_pointers(oop src_obj) { info->set_has_native_pointers(); } -// -- Handling of Enum objects -// Java Enum classes have synthetic <clinit> methods that look like this -// enum MyEnum {FOO, BAR} -// MyEnum::<clinint> { -// /*static final MyEnum*/ MyEnum::FOO = new MyEnum("FOO"); -// /*static final MyEnum*/ MyEnum::BAR = new MyEnum("BAR"); -// } -// -// If MyEnum::FOO object is referenced by any of the archived subgraphs, we must -// ensure the archived value equals (in object address) to the runtime value of -// MyEnum::FOO. -// -// However, since MyEnum::<clinint> is synthetically generated by javac, there's -// no way of programmatically handling this inside the Java code (as you would handle -// ModuleLayer::EMPTY_LAYER, for example). -// -// Instead, we archive all static field of such Enum classes. At runtime, -// HeapShared::initialize_enum_klass() will skip the <clinit> method and pull -// the static fields out of the archived heap. -void HeapShared::check_enum_obj(int level, - KlassSubGraphInfo* subgraph_info, - oop orig_obj) { - assert(level > 1, "must never be called at the first (outermost) level"); - Klass* k = orig_obj->klass(); - Klass* buffered_k = ArchiveBuilder::get_buffered_klass(k); - if (!k->is_instance_klass()) { - return; - } - InstanceKlass* ik = InstanceKlass::cast(k); - if (ik->java_super() == vmClasses::Enum_klass() && !ik->has_archived_enum_objs()) { - ResourceMark rm; - ik->set_has_archived_enum_objs(); - buffered_k->set_has_archived_enum_objs(); - oop mirror = ik->java_mirror(); - - for (JavaFieldStream fs(ik); !fs.done(); fs.next()) { - if (fs.access_flags().is_static()) { - fieldDescriptor& fd = fs.field_descriptor(); - if (fd.field_type() != T_OBJECT && fd.field_type() != T_ARRAY) { - guarantee(false, "static field %s::%s must be T_OBJECT or T_ARRAY", - ik->external_name(), fd.name()->as_C_string()); - } - oop oop_field = mirror->obj_field(fd.offset()); - if (oop_field == nullptr) { - guarantee(false, "static field %s::%s must not be null", - ik->external_name(), fd.name()->as_C_string()); - } else if (oop_field->klass() != ik && oop_field->klass() != ik->array_klass_or_null()) { - guarantee(false, "static field %s::%s is of the wrong type", - ik->external_name(), fd.name()->as_C_string()); - } - bool success = archive_reachable_objects_from(level, subgraph_info, oop_field); - assert(success, "VM should have exited with unarchivable objects for _level > 1"); - int root_index = append_root(oop_field); - log_info(cds, heap)("Archived enum obj @%d %s::%s (" INTPTR_FORMAT ")", - root_index, ik->external_name(), fd.name()->as_C_string(), - p2i((oopDesc*)oop_field)); - SystemDictionaryShared::add_enum_klass_static_field(ik, root_index); - } - } - } -} - -// See comments in HeapShared::check_enum_obj() -bool HeapShared::initialize_enum_klass(InstanceKlass* k, TRAPS) { - if (!ArchiveHeapLoader::is_in_use()) { - return false; - } - - RunTimeClassInfo* info = RunTimeClassInfo::get_for(k); - assert(info != nullptr, "sanity"); - - if (log_is_enabled(Info, cds, heap)) { - ResourceMark rm; - log_info(cds, heap)("Initializing Enum class: %s", k->external_name()); - } - - oop mirror = k->java_mirror(); - int i = 0; - for (JavaFieldStream fs(k); !fs.done(); fs.next()) { - if (fs.access_flags().is_static()) { - int root_index = info->enum_klass_static_field_root_index_at(i++); - fieldDescriptor& fd = fs.field_descriptor(); - assert(fd.field_type() == T_OBJECT || fd.field_type() == T_ARRAY, "must be"); - mirror->obj_field_put(fd.offset(), get_root(root_index, /*clear=*/true)); - } - } - return true; -} - void HeapShared::archive_objects(ArchiveHeapInfo *heap_info) { { NoSafepointVerifier nsv; @@ -1241,7 +1153,9 @@ bool HeapShared::archive_reachable_objects_from(int level, WalkOopAndArchiveClosure walker(level, record_klasses_only, subgraph_info, orig_obj); orig_obj->oop_iterate(&walker); - check_enum_obj(level + 1, subgraph_info, orig_obj); + if (CDSEnumKlass::is_enum_obj(orig_obj)) { + CDSEnumKlass::handle_enum_obj(level + 1, subgraph_info, orig_obj); + } return true; } diff --git a/src/hotspot/share/cds/heapShared.hpp b/src/hotspot/share/cds/heapShared.hpp index aa8c1dd3bc4f9..fa34289a38eda 100644 --- a/src/hotspot/share/cds/heapShared.hpp +++ b/src/hotspot/share/cds/heapShared.hpp @@ -212,9 +212,6 @@ class HeapShared: AllStatic { }; private: - static void check_enum_obj(int level, KlassSubGraphInfo* subgraph_info, - oop orig_obj); - static const int INITIAL_TABLE_SIZE = 15889; // prime number static const int MAX_TABLE_SIZE = 1000000; typedef ResizeableResourceHashtable<oop, CachedOopInfo, @@ -428,7 +425,6 @@ class HeapShared: AllStatic { static void write_subgraph_info_table() NOT_CDS_JAVA_HEAP_RETURN; static void init_roots(oop roots_oop) NOT_CDS_JAVA_HEAP_RETURN; static void serialize_tables(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN; - static bool initialize_enum_klass(InstanceKlass* k, TRAPS) NOT_CDS_JAVA_HEAP_RETURN_(false); static bool is_a_test_class_in_unnamed_module(Klass* ik) NOT_CDS_JAVA_HEAP_RETURN_(false); }; diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index 9c40bc1cee811..930f8cf177116 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -25,6 +25,7 @@ #include "precompiled.hpp" #include "cds/archiveUtils.hpp" #include "cds/cdsConfig.hpp" +#include "cds/cdsEnumKlass.hpp" #include "cds/classListWriter.hpp" #include "cds/heapShared.hpp" #include "cds/metaspaceShared.hpp" @@ -1576,7 +1577,7 @@ void InstanceKlass::call_class_initializer(TRAPS) { // This is needed to ensure the consistency of the archived heap objects. if (has_archived_enum_objs()) { assert(is_shared(), "must be"); - bool initialized = HeapShared::initialize_enum_klass(this, CHECK); + bool initialized = CDSEnumKlass::initialize_enum_klass(this, CHECK); if (initialized) { return; } From 564a72e1dba0f145600c8e7eff66992fbf294df0 Mon Sep 17 00:00:00 2001 From: Thomas Schatzl <tschatzl@openjdk.org> Date: Tue, 9 Jul 2024 08:10:55 +0000 Subject: [PATCH 338/471] 8335955: JDK-8335742 wrongly used a "JDK-" prefix in the problemlist bug number Reviewed-by: iwalulya --- test/hotspot/jtreg/ProblemList-Virtual.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/ProblemList-Virtual.txt b/test/hotspot/jtreg/ProblemList-Virtual.txt index ac35f60e66153..06110ddcbc1a8 100644 --- a/test/hotspot/jtreg/ProblemList-Virtual.txt +++ b/test/hotspot/jtreg/ProblemList-Virtual.txt @@ -89,7 +89,7 @@ vmTestbase/nsk/jdi/VMOutOfMemoryException/VMOutOfMemoryException001/VMOutOfMemor ### # Fails on Windows because of additional memory allocation. -gc/g1/TestMixedGCLiveThreshold.java#25percent JDK-8334759 windows-x64 +gc/g1/TestMixedGCLiveThreshold.java#25percent 8334759 windows-x64 ########## ## Tests incompatible with with virtual test thread factory. From 2a2964759c73b3b9ab6afaad109383c89952977b Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Tue, 9 Jul 2024 08:25:00 +0000 Subject: [PATCH 339/471] 8334777: Test javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java failed with NullPointerException Reviewed-by: cjplummer, dholmes --- .../remote/mandatory/notif/NotifReconnectDeadlockTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/jdk/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java b/test/jdk/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java index 72ae57663079c..8f8ef54eade22 100644 --- a/test/jdk/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java +++ b/test/jdk/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,9 @@ * @bug 6199899 * @summary Tests reconnection done by a fetching notif thread. * @author Shanliang JIANG + * @requires vm.compMode != "Xcomp" + * @comment Running with -Xcomp is likely to cause a timeout from ServerCommunicatorAdmin + * before addNotificationListener can complete. * * @run clean NotifReconnectDeadlockTest * @run build NotifReconnectDeadlockTest From 8f62f31dff564289a2422d58e8ecd5062d443b81 Mon Sep 17 00:00:00 2001 From: Amit Kumar <amitkumar@openjdk.org> Date: Tue, 9 Jul 2024 08:26:25 +0000 Subject: [PATCH 340/471] 8335906: [s390x] Test Failure: GTestWrapper.java Reviewed-by: stuefe --- src/hotspot/share/runtime/os.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp index 7b766707b0d0e..490a04aa6f132 100644 --- a/src/hotspot/share/runtime/os.cpp +++ b/src/hotspot/share/runtime/os.cpp @@ -959,7 +959,7 @@ static void print_ascii_form(stringStream& ascii_form, uint64_t value, int units uint8_t c[sizeof(v)]; } u = { value }; for (int i = 0; i < unitsize; i++) { - const int idx = LITTLE_ENDIAN_ONLY(i) BIG_ENDIAN_ONLY(sizeof(u.v) - 1 - i); + const int idx = LITTLE_ENDIAN_ONLY(i) BIG_ENDIAN_ONLY(sizeof(u.v) - unitsize + i); const uint8_t c = u.c[idx]; ascii_form.put(isprint(c) && isascii(c) ? c : '.'); } From f3ff4f7427c3c3f5cb2a115a61462bb9d28de1cd Mon Sep 17 00:00:00 2001 From: Severin Gehwolf <sgehwolf@openjdk.org> Date: Tue, 9 Jul 2024 10:21:47 +0000 Subject: [PATCH 341/471] 8335882: platform/cgroup/TestSystemSettings.java fails on Alpine Linux Reviewed-by: stuefe, mbaesken --- test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java b/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java index 8d9279e1603c1..0e668b1f969d4 100644 --- a/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java +++ b/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java @@ -24,7 +24,7 @@ /* * @test * @key cgroups - * @requires os.family == "linux" + * @requires (os.family == "linux" & !vm.musl) * @requires vm.flagless * @library /test/lib * @build TestSystemSettings From 0e0dfca21f64ecfcb3e5ed7cdc2a173834faa509 Mon Sep 17 00:00:00 2001 From: Aleksei Voitylov <avoitylov@openjdk.org> Date: Tue, 9 Jul 2024 10:27:44 +0000 Subject: [PATCH 342/471] 8330806: test/hotspot/jtreg/compiler/c1/TestLargeMonitorOffset.java fails on ARM32 Reviewed-by: snazarki, dsamersoff --- src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp index 688790f07e548..999f8fe590472 100644 --- a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp +++ b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp @@ -152,8 +152,14 @@ void LIR_Assembler::osr_entry() { int monitor_offset = (method()->max_locals() + 2 * (number_of_locks - 1)) * BytesPerWord; for (int i = 0; i < number_of_locks; i++) { int slot_offset = monitor_offset - (i * 2 * BytesPerWord); - __ ldr(R1, Address(OSR_buf, slot_offset + 0*BytesPerWord)); - __ ldr(R2, Address(OSR_buf, slot_offset + 1*BytesPerWord)); + if (slot_offset >= 4096 - BytesPerWord) { + __ add_slow(R2, OSR_buf, slot_offset); + __ ldr(R1, Address(R2, 0*BytesPerWord)); + __ ldr(R2, Address(R2, 1*BytesPerWord)); + } else { + __ ldr(R1, Address(OSR_buf, slot_offset + 0*BytesPerWord)); + __ ldr(R2, Address(OSR_buf, slot_offset + 1*BytesPerWord)); + } __ str(R1, frame_map()->address_for_monitor_lock(i)); __ str(R2, frame_map()->address_for_monitor_object(i)); } From 531a6d85b00b88688668ab1ced0db6ce0214a5f1 Mon Sep 17 00:00:00 2001 From: Volker Simonis <simonis@openjdk.org> Date: Tue, 9 Jul 2024 13:11:07 +0000 Subject: [PATCH 343/471] 8335911: Document ccls indexer in doc/ide.md Reviewed-by: erikj --- doc/ide.html | 11 ++++++----- doc/ide.md | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/ide.html b/doc/ide.html index 0dd16b7b9e6e7..ef6f434013ed1 100644 --- a/doc/ide.html +++ b/doc/ide.html @@ -63,11 +63,12 @@ <h5 id="alternative-indexers">Alternative indexers</h5> <p>The main <code>vscode-project</code> target configures the default C++ support in Visual Studio Code. There are also other source indexers that can be installed, that may provide additional features. It's -currently possible to generate configuration for two such indexers, <a -href="https://clang.llvm.org/extra/clangd/">clangd</a> and <a -href="https://github.com/Andersbakken/rtags">rtags</a>. These can be -configured by appending the name of the indexer to the make target, such -as:</p> +currently possible to generate configuration for three such indexers, <a +href="https://clang.llvm.org/extra/clangd/">clangd</a>, <a +href="https://github.com/MaskRay/ccls/wiki/Visual-Studio-Code">ccls</a> +and <a href="https://github.com/Andersbakken/rtags">rtags</a>. These can +be configured by appending the name of the indexer to the make target, +such as:</p> <pre class="shell"><code>make vscode-project-clangd</code></pre> <p>Additional instructions for configuring the given indexer will be displayed after the workspace has been generated.</p> diff --git a/doc/ide.md b/doc/ide.md index 40e3430a43875..d6ebb7b742a61 100644 --- a/doc/ide.md +++ b/doc/ide.md @@ -32,7 +32,8 @@ choose `File -> Open Workspace...` in Visual Studio Code. The main `vscode-project` target configures the default C++ support in Visual Studio Code. There are also other source indexers that can be installed, that may provide additional features. It's currently possible to generate -configuration for two such indexers, [clangd](https://clang.llvm.org/extra/clangd/) +configuration for three such indexers, [clangd](https://clang.llvm.org/extra/clangd/), +[ccls](https://github.com/MaskRay/ccls/wiki/Visual-Studio-Code) and [rtags](https://github.com/Andersbakken/rtags). These can be configured by appending the name of the indexer to the make target, such as: From 7e11fb702696df733ca89d325200f2e9414402d9 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Tue, 9 Jul 2024 13:11:20 +0000 Subject: [PATCH 344/471] 8335688: Fix -Wzero-as-null-pointer-constant warnings from fflush calls in jvmti tests Reviewed-by: jwaters, coleenp --- .../libAddModuleUsesAndProvidesTest.c | 6 +- .../GenerateEvents/libGenerateEvents1.cpp | 2 +- .../GenerateEvents/libGenerateEvents2.cpp | 4 +- .../FilteredFields/libFilteredFieldsTest.cpp | 4 +- .../libMissedStackMapFrames.cpp | 2 +- .../libRedefineRetransform.cpp | 2 +- .../FramePop/framepop02/libframepop02.cpp | 4 +- .../thread/GetStackTrace/get_stack_trace.hpp | 2 +- .../SuspendResume1/libSuspendResume1.cpp | 6 +- .../getclfld007/getclfld007.cpp | 6 +- .../followref001/followref001.cpp | 58 ++++++++-------- .../followref002/followref002.cpp | 62 ++++++++--------- .../followref003/followref003.cpp | 68 +++++++++---------- .../followref004/followref004.cpp | 12 ++-- .../followref005/followref005.cpp | 2 +- .../followref006/followref006.cpp | 2 +- .../earlyretbase/earlyretbase.cpp | 12 ++-- .../earlyretfp/earlyretfp.cpp | 18 ++--- .../earlyretint/earlyretint.cpp | 14 ++-- .../earlyretlong/earlyretlong.cpp | 14 ++-- .../earlyretobj/earlyretobj.cpp | 14 ++-- .../earlyretstr/earlyretstr.cpp | 12 ++-- .../earlyretvoid/earlyretvoid.cpp | 12 ++-- .../getallstktr001/getallstktr001.cpp | 6 +- .../getcpool001/getcpool001.cpp | 6 +- 25 files changed, 175 insertions(+), 175 deletions(-) diff --git a/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c b/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c index 86f9993c70334..a979d1f913e0a 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c +++ b/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -200,7 +200,7 @@ Java_MyPackage_AddModuleUsesAndProvidesTest_checkUses(JNIEnv *env, throw_exc(env, "Check #UC3: service can not be used unexpectedly"); return FAILED; } - fflush(0); + fflush(NULL); return PASSED; } @@ -275,7 +275,7 @@ Java_MyPackage_AddModuleUsesAndProvidesTest_checkProvides(JNIEnv *env, throw_exc(env, "Check #PC2: error in add provides to baseModule with correct service and serviceImpl"); return FAILED; } - fflush(0); + fflush(NULL); return PASSED; } diff --git a/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents1.cpp b/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents1.cpp index fa60c07f8db41..0f040175bf953 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents1.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents1.cpp @@ -71,7 +71,7 @@ CompiledMethodLoad(jvmtiEnv* jvmti, jmethodID method, check_jvmti_status(env, err, "CompiledMethodLoad: Error in JVMTI GetMethodName"); printf("%s: CompiledMethodLoad: %s%s\n", AGENT_NAME, name, sign); - fflush(0); + fflush(nullptr); } JNIEXPORT jint JNICALL diff --git a/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents2.cpp b/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents2.cpp index 7af061196a157..d582a9648920e 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents2.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents2.cpp @@ -71,7 +71,7 @@ CompiledMethodLoad(jvmtiEnv* jvmti, jmethodID method, check_jvmti_status(env, err, "CompiledMethodLoad: Error in JVMTI GetMethodName"); printf("%s: CompiledMethodLoad: %s%s\n", AGENT_NAME, name, sign); - fflush(0); + fflush(nullptr); } JNIEXPORT jint JNICALL @@ -132,7 +132,7 @@ Java_MyPackage_GenerateEventsTest_agent2FailStatus(JNIEnv *env, jclass cls) { printf("check2: Unexpected non-zero event count in agent2: %d\n", agent2_event_count); } printf("\n"); - fflush(0); + fflush(nullptr); return fail_status; } diff --git a/test/hotspot/jtreg/serviceability/jvmti/GetClassFields/FilteredFields/libFilteredFieldsTest.cpp b/test/hotspot/jtreg/serviceability/jvmti/GetClassFields/FilteredFields/libFilteredFieldsTest.cpp index 28bfaaa03bd6f..fbefb1219e602 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/GetClassFields/FilteredFields/libFilteredFieldsTest.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/GetClassFields/FilteredFields/libFilteredFieldsTest.cpp @@ -35,7 +35,7 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { jint res = jvm->GetEnv((void **)&jvmti, JVMTI_VERSION_1_1); if (res != JNI_OK || jvmti == nullptr) { printf("Wrong result of a valid call to GetEnv!\n"); - fflush(0); + fflush(nullptr); return JNI_ERR; } return JNI_OK; @@ -72,7 +72,7 @@ Java_FilteredFieldsTest_getJVMTIFieldCount(JNIEnv *env, jclass cls, jclass clazz printf(" [%d]: %s\n", i, name); jvmti->Deallocate((unsigned char *)name); } - fflush(0); + fflush(nullptr); return fcount; } diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/libMissedStackMapFrames.cpp b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/libMissedStackMapFrames.cpp index 5cebf608c3484..066794d1d6077 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/libMissedStackMapFrames.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/libMissedStackMapFrames.cpp @@ -31,7 +31,7 @@ static void _log(const char* format, ...) { va_start(args, format); vprintf(format, args); va_end(args); - fflush(0); + fflush(nullptr); } static jvmtiEnv* jvmti = nullptr; diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/libRedefineRetransform.cpp b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/libRedefineRetransform.cpp index 518e147c94278..450b0f35918b6 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/libRedefineRetransform.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/libRedefineRetransform.cpp @@ -36,7 +36,7 @@ static void _log(const char* format, ...) { va_start(args, format); vprintf(format, args); va_end(args); - fflush(0); + fflush(nullptr); } static bool isTestClass(const char* name) { diff --git a/test/hotspot/jtreg/serviceability/jvmti/events/FramePop/framepop02/libframepop02.cpp b/test/hotspot/jtreg/serviceability/jvmti/events/FramePop/framepop02/libframepop02.cpp index 61c9a91184bab..93df7f98277bf 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/events/FramePop/framepop02/libframepop02.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/events/FramePop/framepop02/libframepop02.cpp @@ -194,7 +194,7 @@ void JNICALL MethodEntry(jvmtiEnv *jvmti, JNIEnv *jni, { if (printdump == JNI_TRUE) { print_current_time(); - fflush(0); + fflush(nullptr); LOG(">>> %sMethod entry\n>>>", (isNative == JNI_TRUE) ? "Native " : ""); printInfo(jni, jvmti, thr, method, frameCount); } @@ -231,7 +231,7 @@ void JNICALL FramePop(jvmtiEnv *jvmti, JNIEnv *jni, { if (printdump == JNI_TRUE) { print_current_time(); - fflush(0); + fflush(nullptr); LOG(" >>> Frame Pop\n>>>"); printInfo(jni, jvmti, thr, method, frameCount); } diff --git a/test/hotspot/jtreg/serviceability/jvmti/thread/GetStackTrace/get_stack_trace.hpp b/test/hotspot/jtreg/serviceability/jvmti/thread/GetStackTrace/get_stack_trace.hpp index d7c85704275f2..b8828b0e80f29 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/thread/GetStackTrace/get_stack_trace.hpp +++ b/test/hotspot/jtreg/serviceability/jvmti/thread/GetStackTrace/get_stack_trace.hpp @@ -70,7 +70,7 @@ int compare_stack_trace(jvmtiEnv *jvmti, JNIEnv *jni, jthread thread, int exp_idx = expected_frames_length - 1 - i; printf("expected idx %d\n", exp_idx); - fflush(0); + fflush(nullptr); if (i < expected_frames_length) { // for generated classes don't compare lambda indicies diff --git a/test/hotspot/jtreg/serviceability/jvmti/vthread/SuspendResume1/libSuspendResume1.cpp b/test/hotspot/jtreg/serviceability/jvmti/vthread/SuspendResume1/libSuspendResume1.cpp index f05e619e0bd7d..93ad399b121ac 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/vthread/SuspendResume1/libSuspendResume1.cpp +++ b/test/hotspot/jtreg/serviceability/jvmti/vthread/SuspendResume1/libSuspendResume1.cpp @@ -138,7 +138,7 @@ check_suspended_state(JNIEnv* jni, jthread thread, int thr_idx, char* tname, con LOG("## Agent: %s: virtual thread of carrier thread has state: %s (%d)\n", func_name, TranslateState(state), (int)state); - fflush(0); + fflush(nullptr); } set_agent_fail_status(); fatal(jni, "check_resumed_state: expected SUSPENDED flag in thread state"); @@ -169,7 +169,7 @@ check_resumed_state(JNIEnv* jni, jthread thread, int thr_idx, char* tname, const LOG("## Agent: %s: virtual thread of carrier thread has state: %s (%d)\n", func_name, TranslateState(state), (int)state); - fflush(0); + fflush(nullptr); } set_agent_fail_status(); fatal(jni, "check_resumed_state: NOT expected SUSPENDED flag in thread state"); @@ -210,7 +210,7 @@ test_thread_resume(JNIEnv* jni, jthread thread, int thr_idx, char* tname) { LOG("## Agent: test_thread_resume: virtual thread of carrier thread has state: %s (%d)\n", TranslateState(state), (int)state); - fflush(0); + fflush(nullptr); } check_jvmti_status(jni, err, "test_thread_resume: error in JVMTI ResumeThread"); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007/getclfld007.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007/getclfld007.cpp index 3cd333843308c..89a62346ca9f0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007/getclfld007.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007/getclfld007.cpp @@ -86,7 +86,7 @@ Java_nsk_jvmti_GetClassFields_getclfld007_check(JNIEnv *env, jclass cls, jclass if (jvmti == nullptr) { printf("JVMTI client was not properly loaded!\n"); - fflush(0); + fflush(nullptr); result = STATUS_FAILED; return; } @@ -98,7 +98,7 @@ Java_nsk_jvmti_GetClassFields_getclfld007_check(JNIEnv *env, jclass cls, jclass if (err != JVMTI_ERROR_NONE) { printf("GetClassFields unexpected error: %s (%d)\n", TranslateError(err), err); - fflush(0); + fflush(nullptr); result = STATUS_FAILED; return; } @@ -132,7 +132,7 @@ Java_nsk_jvmti_GetClassFields_getclfld007_check(JNIEnv *env, jclass cls, jclass jvmti->Deallocate((unsigned char *)name); jvmti->Deallocate((unsigned char *)sig); } - fflush(0); + fflush(nullptr); } JNIEXPORT int JNICALL diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref001/followref001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref001/followref001.cpp index ff431aa2203e9..b33128b491626 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref001/followref001.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref001/followref001.cpp @@ -137,14 +137,14 @@ static bool initObjectDescList(jvmtiEnv* jvmti, *objectsCount = 1 + 2 * chainLength; printf("Allocate memory for objects list: %d objects\n", *objectsCount); - fflush(0); + fflush(nullptr); if (!NSK_JVMTI_VERIFY(jvmti->Allocate((*objectsCount * sizeof(ObjectDesc)), (unsigned char**) objectDescList))) { nsk_jvmti_setFailStatus(); return false; } printf(" ... allocated array: 0x%p\n", (void*)objectDescList); - fflush(0); + fflush(nullptr); { int k; @@ -179,7 +179,7 @@ static bool getAndTagClasses(jvmtiEnv* jvmti, } printf("\nFound debugee class: 0x%p\n %s\n", (void*) *debugeeClass, DEBUGEE_CLASS_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*rootObjectClass = jni->FindClass(ROOT_OBJECT_CLASS_NAME)) != nullptr)) { @@ -194,7 +194,7 @@ static bool getAndTagClasses(jvmtiEnv* jvmti, printf("\nFound root object class: 0x%p, tag=%ld\n %s\n", (void*) *rootObjectClass,(long) ROOT_CLASS_TAG, ROOT_OBJECT_CLASS_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*chainObjectClass = @@ -209,7 +209,7 @@ static bool getAndTagClasses(jvmtiEnv* jvmti, printf("\nFound chain object class: 0x%p, tag=%ld\n %s\n", (void*) *chainObjectClass, (long) CHAIN_CLASS_TAG, CHAIN_OBJECT_CLASS_NAME); - fflush(0); + fflush(nullptr); return true; } /* getAndTagClasses */ @@ -234,7 +234,7 @@ static bool getFieldsAndObjects(jvmtiEnv* jvmti, } printf("\nFound fieldID: 0x%p - \'%s\' static field in debugee class\n", (void*) rootObjectField, OBJECT_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*reachableChainField = jni->GetFieldID(rootObjectClass, REACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { @@ -243,7 +243,7 @@ static bool getFieldsAndObjects(jvmtiEnv* jvmti, } printf("\nFound fieldID: 0x%p - \'%s\' field in root object class\n", (void*) reachableChainField, REACHABLE_CHAIN_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*unreachableChainField = jni->GetFieldID(rootObjectClass, UNREACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { @@ -253,7 +253,7 @@ static bool getFieldsAndObjects(jvmtiEnv* jvmti, printf("\nFound fieldID: 0x%p - \'%s\' field in root object class\n", (void*) unreachableChainField, UNREACHABLE_CHAIN_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*nextField = jni->GetFieldID(chainObjectClass, NEXT_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { @@ -262,7 +262,7 @@ static bool getFieldsAndObjects(jvmtiEnv* jvmti, } printf("\nFound fieldID: 0x%p - \'%s\' field in chain object class\n", (void*) nextField, NEXT_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*rootObjectPtr = jni->GetStaticObjectField(debugeeClass, rootObjectField)) != nullptr)) { @@ -270,14 +270,14 @@ static bool getFieldsAndObjects(jvmtiEnv* jvmti, return false; } printf("\nFound root object: 0x%p\n", (void*) *rootObjectPtr); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*rootObjectPtr = jni->NewGlobalRef(*rootObjectPtr)) != nullptr)) { nsk_jvmti_setFailStatus(); return false; } printf("Created root object global ref: 0x%p\n", (void*)*rootObjectPtr); - fflush(0); + fflush(nullptr); return true; } /* getFieldsAndObjects */ @@ -318,7 +318,7 @@ static bool getAndTagChainObjects( nsk_jvmti_setFailStatus(); } printf(" tag=%-5ld object=0x%p\n", (long)objTag, (void*)nextObj); - fflush(0); + fflush(nullptr); /* To continue traversing objects in the chain */ if (!getAndTagChainObjects(jvmti, @@ -394,7 +394,7 @@ static int getAndTagTestedObjects( (long) ROOT_OBJECT_TAG, (void*) *rootObjectPtr); printf(" reachable objects chain: %d objects\n", chainLength); - fflush(0); + fflush(nullptr); if (!getAndTagChainObjects(jvmti, jni, @@ -453,7 +453,7 @@ static bool checkTestedObjects(jvmtiEnv* jvmti, } printf("\nReachable objects:\n"); - fflush(0); + fflush(nullptr); for (i = 0; i < chainLength; i++) { idx = i + 1; printf("Reachable object:\n" @@ -488,7 +488,7 @@ static bool checkTestedObjects(jvmtiEnv* jvmti, NSK_COMPLAIN0("Unreachable object was iterated\n"); nsk_jvmti_setFailStatus(); } - fflush(0); + fflush(nullptr); } return true; @@ -514,7 +514,7 @@ static void releaseTestedObjects(jvmtiEnv* jvmti, } } - fflush(0); + fflush(nullptr); } /* releaseTestedObjects */ @@ -542,7 +542,7 @@ jint JNICALL heapReferenceCallback( /* ss45998: class_tag=>referrence_class_tag */ printf(" size: %" LL "d, tag_ptr: 0x%p, referrer_tag_ptr: 0x%p, length: %-d\n", size, tag_ptr, referrer_tag_ptr, length); - fflush(0); + fflush(nullptr); if (((uintptr_t) tag_ptr & FULL_32_BIT_MASK) == FULL_32_BIT_MASK) { NSK_COMPLAIN1("wrong tag_ptr passed to " @@ -567,7 +567,7 @@ jint JNICALL heapReferenceCallback( printf(" class_tag=%" LL "d, tag=%" LL "d, size=%" LL "d," " ref_tag=%" LL "d, referrer_index=%d\n\n", class_tag, tag, size, ref_tag, referrer_index); - fflush(0); + fflush(nullptr); if (length != -1) { NSK_COMPLAIN1("wrong length passed to heapReferenceCallback: " @@ -647,7 +647,7 @@ jint JNICALL heapReferenceCallback( case JVMTI_HEAP_REFERENCE_OTHER: { NSK_COMPLAIN1("This reference kind was not expected: %s\n", ref_kind_str[reference_kind]); - fflush(0); + fflush(nullptr); nsk_jvmti_setFailStatus(); return 0; } @@ -674,7 +674,7 @@ jint JNICALL primitiveFieldCallback( (long) class_tag, (long) DEREF(tag_ptr), (int) value_type); - fflush(0); + fflush(nullptr); return 0; } /* primitiveFieldCallback */ @@ -694,7 +694,7 @@ jint JNICALL arrayPrimitiveValueCallback( (long) DEREF(tag_ptr), (int) element_count, (int) element_type); - fflush(0); + fflush(nullptr); return 0; } /* arrayPrimitiveValueCallback */ @@ -711,7 +711,7 @@ jint JNICALL stringPrimitiveValueCallback( (long) class_tag, (long) DEREF(tag_ptr), (int) value_length); - fflush(0); + fflush(nullptr); return 0; } /* stringPrimitiveValueCallback */ @@ -725,14 +725,14 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { jobject rootObject = nullptr; printf("Wait for tested objects created\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout))) { return; } printf(">>> Obtain and tag tested objects from debugee class\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(getAndTagTestedObjects(jvmti, jni, @@ -745,7 +745,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Let debugee to clean links to unreachable objects\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_resumeSync())) { return; @@ -755,7 +755,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Start iteration from root tested object: 0x%p\n\n", rootObject); - fflush(0); + fflush(nullptr); if (!NSK_JVMTI_VERIFY(jvmti->FollowReferences((jint) 0, /* heap_filter */ (jclass) nullptr, /* class */ @@ -767,19 +767,19 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Check if reachable objects were iterated:\n"); - fflush(0); + fflush(nullptr); if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) { nsk_jvmti_setFailStatus(); } printf(">>> Clean used data\n"); - fflush(0); + fflush(nullptr); releaseTestedObjects(jvmti, jni, chainLength, objectDescList, rootObject); printf(">>> Let debugee to finish\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_resumeSync())) { return; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref002/followref002.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref002/followref002.cpp index 6366b430776c9..9ea3a5d0d01c0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref002/followref002.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref002/followref002.cpp @@ -131,7 +131,7 @@ static int getAndTagChainObjects( nsk_jvmti_setFailStatus(); } printf(" tag=%-5ld object=0x%p\n", (long)objTag, (void*)obj); - fflush(0); + fflush(nullptr); if (!getAndTagChainObjects(jvmti, jni, obj, nextField, nextFieldName, @@ -170,14 +170,14 @@ static int getAndTagTestedObjects( *objectsCount = 1 + 2 * chainLength; printf("Allocate memory for objects list: %d objects\n", *objectsCount); - fflush(0); + fflush(nullptr); if (!NSK_JVMTI_VERIFY(jvmti->Allocate((*objectsCount * sizeof(ObjectDesc)), (unsigned char**)objectDescList))) { nsk_jvmti_setFailStatus(); return NSK_FALSE; } printf(" ... allocated array: 0x%p\n", (void*)objectDescList); - fflush(0); + fflush(nullptr); { int k; @@ -191,7 +191,7 @@ static int getAndTagTestedObjects( (*objectDescList)[0].exp_class_tag = rootClassTag; printf("Find debugee class: %s\n", DEBUGEE_CLASS_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (debugeeClass = jni->FindClass(DEBUGEE_CLASS_NAME)) != nullptr)) { nsk_jvmti_setFailStatus(); return NSK_FALSE; @@ -199,7 +199,7 @@ static int getAndTagTestedObjects( printf(" ... found class: 0x%p\n", (void*)debugeeClass); printf("Find root object class: %s\n", ROOT_OBJECT_CLASS_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (rootObjectClass = jni->FindClass(ROOT_OBJECT_CLASS_NAME)) != nullptr)) { nsk_jvmti_setFailStatus(); return NSK_FALSE; @@ -212,7 +212,7 @@ static int getAndTagTestedObjects( printf(" tag=%-5ld rootClass=0x%p\n", (long)rootClassTag, (void*)rootObjectClass); printf("Find chain object class: %s\n", CHAIN_OBJECT_CLASS_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (chainObjectClass = jni->FindClass(CHAIN_OBJECT_CLASS_NAME)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -226,7 +226,7 @@ static int getAndTagTestedObjects( printf(" tag=%-5ld chainClass=0x%p\n", (long)chainClassTag, (void*)chainObjectClass); printf("Find static field in debugee class: %s\n", OBJECT_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (objectField = jni->GetStaticFieldID(debugeeClass, OBJECT_FIELD_NAME, ROOT_OBJECT_CLASS_SIG)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -235,7 +235,7 @@ static int getAndTagTestedObjects( printf(" ... got fieldID: 0x%p\n", (void*)objectField); printf("Find instance field in root object class: %s\n", REACHABLE_CHAIN_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (reachableChainField = jni->GetFieldID(rootObjectClass, REACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -244,7 +244,7 @@ static int getAndTagTestedObjects( printf(" ... got fieldID: 0x%p\n", (void*)reachableChainField); printf("Find instance field in root object class: %s\n", UNREACHABLE_CHAIN_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (unreachableChainField = jni->GetFieldID(rootObjectClass, UNREACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -253,7 +253,7 @@ static int getAndTagTestedObjects( printf(" ... got fieldID: 0x%p\n", (void*)unreachableChainField); printf("Find instance field in chain object class: %s\n", TAIL_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (tailField = jni->GetFieldID(chainObjectClass, TAIL_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -262,14 +262,14 @@ static int getAndTagTestedObjects( printf(" ... got fieldID: 0x%p\n", (void*)tailField); printf("Get root object from static field: %s\n", OBJECT_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*rootObject = jni->GetStaticObjectField(debugeeClass, objectField)) != nullptr)) { nsk_jvmti_setFailStatus(); return NSK_FALSE; } printf(" ... got object: 0x%p\n", (void*)*rootObject); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*rootObject = jni->NewGlobalRef(*rootObject)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -280,7 +280,7 @@ static int getAndTagTestedObjects( printf("Obtain and tag chain objects:\n"); printf(" root tested object:\n"); - fflush(0); + fflush(nullptr); if (!NSK_JVMTI_VERIFY(jvmti->SetTag(*rootObject, rootObjectTag))) { nsk_jvmti_setFailStatus(); } @@ -295,7 +295,7 @@ static int getAndTagTestedObjects( (*objectDescList)[chainLength].exp_found = 1; printf(" reachable objects chain: %d objects\n", chainLength); - fflush(0); + fflush(nullptr); if (!getAndTagChainObjects(jvmti, jni, *rootObject, reachableChainField, REACHABLE_CHAIN_FIELD_NAME, @@ -348,7 +348,7 @@ static int checkTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, } printf("\nReachable objects:\n"); - fflush(0); + fflush(nullptr); for (i = 0; i < chainLength; i++) { idx = i + 1; printf("Reachable object:\n" @@ -383,7 +383,7 @@ static int checkTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, NSK_COMPLAIN0("Unreachable object was iterated\n"); nsk_jvmti_setFailStatus(); } - fflush(0); + fflush(nullptr); } return NSK_TRUE; @@ -404,7 +404,7 @@ static int releaseTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, } } - fflush(0); + fflush(nullptr); return NSK_TRUE; } /* releaseTestedObjects */ @@ -456,7 +456,7 @@ jint JNICALL heapReferenceCallback( (long) size, (long) ref_tag, (int) referrer_index); - fflush(0); + fflush(nullptr); if (tag_ptr == nullptr) { NSK_COMPLAIN1("null tag_ptr is passed to heapReferenceCallback:" @@ -531,7 +531,7 @@ jint JNICALL heapReferenceCallback( case JVMTI_HEAP_REFERENCE_OTHER: { NSK_COMPLAIN1("This reference kind was not expected: %s\n", ref_kind_str[reference_kind]); - fflush(0); + fflush(nullptr); nsk_jvmti_setFailStatus(); return 0; } @@ -556,7 +556,7 @@ jint JNICALL primitiveFieldCallback( (long) class_tag, (long) DEREF(tag_ptr), (int) value_type); - fflush(0); + fflush(nullptr); return 0; } @@ -574,7 +574,7 @@ jint JNICALL arrayPrimitiveValueCallback( (long) DEREF(tag_ptr), (int) element_count, (int) element_type); - fflush(0); + fflush(nullptr); return 0; } @@ -590,7 +590,7 @@ jint JNICALL stringPrimitiveValueCallback( (long) class_tag, (long) DEREF(tag_ptr), (int) value_length); - fflush(0); + fflush(nullptr); return 0; } @@ -602,13 +602,13 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { jobject rootObject = nullptr; printf("Wait for tested objects created\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout))) { return; } printf(">>> Obtain and tag tested objects from debugee class\n"); - fflush(0); + fflush(nullptr); { if (!NSK_VERIFY(getAndTagTestedObjects(jvmti, jni, chainLength, &objectsCount, @@ -618,7 +618,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Let debugee to clean links to unreachable objects\n"); - fflush(0); + fflush(nullptr); { if (!NSK_VERIFY(nsk_jvmti_resumeSync())) { return; @@ -629,7 +629,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf("\n\n>>> Start 1-st iteration for root tested object: 0x%p\n", rootObject); - fflush(0); + fflush(nullptr); { jint heap_filter = JVMTI_HEAP_FILTER_UNTAGGED | JVMTI_HEAP_FILTER_CLASS_UNTAGGED; if (!NSK_JVMTI_VERIFY(jvmti->FollowReferences(heap_filter, @@ -643,7 +643,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Check if reachable objects were iterated\n"); - fflush(0); + fflush(nullptr); { if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) { nsk_jvmti_setFailStatus(); @@ -660,7 +660,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf("\n\n>>> Start 2-nd iteration for root tested object: 0x%p\n", rootObject); - fflush(0); + fflush(nullptr); { /* This time everythig is filtered out */ jint heap_filter = JVMTI_HEAP_FILTER_UNTAGGED | JVMTI_HEAP_FILTER_CLASS_UNTAGGED | @@ -676,7 +676,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Check if reachable objects were not reported this time\n"); - fflush(0); + fflush(nullptr); { if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) { nsk_jvmti_setFailStatus(); @@ -684,7 +684,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Clean used data\n"); - fflush(0); + fflush(nullptr); { if (!NSK_VERIFY(releaseTestedObjects(jvmti, jni, chainLength, objectDescList, rootObject))) { return; @@ -692,7 +692,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf("Let debugee to finish\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_resumeSync())) return; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref003/followref003.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref003/followref003.cpp index cb0385ee6535b..80cbf856f4504 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref003/followref003.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref003/followref003.cpp @@ -146,7 +146,7 @@ static int getChainObjects(jvmtiEnv* jvmti, JNIEnv* jni, jobject firstObject, nsk_jvmti_setFailStatus(); } printf(" tag=%-5ld object=0x%p\n", (long)objTag, (void*)obj); - fflush(0); + fflush(nullptr); if (!getChainObjects(jvmti, jni, obj, nextField, nextFieldName, nextField, nextFieldName, count, objectDescList, tag, reachable)) { @@ -173,14 +173,14 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, *objectsCount = 1 + 2 * chainLength; printf("Allocate memory for objects list: %d objects\n", *objectsCount); - fflush(0); + fflush(nullptr); if (!NSK_JVMTI_VERIFY(jvmti->Allocate((*objectsCount * sizeof(ObjectDesc)), (unsigned char**)objectDescList))) { nsk_jvmti_setFailStatus(); return NSK_FALSE; } printf(" ... allocated array: 0x%p\n", (void*)objectDescList); - fflush(0); + fflush(nullptr); { int k; @@ -194,7 +194,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, (*objectDescList)[0].exp_class_tag = rootClassTag; printf("Find debugee class: %s\n", DEBUGEE_CLASS_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (debugeeClass = jni->FindClass(DEBUGEE_CLASS_NAME)) != nullptr)) { nsk_jvmti_setFailStatus(); return NSK_FALSE; @@ -202,7 +202,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, printf(" ... found class: 0x%p\n", (void*)debugeeClass); printf("Find root object class: %s\n", ROOT_OBJECT_CLASS_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (rootObjectClass = jni->FindClass(ROOT_OBJECT_CLASS_NAME)) != nullptr)) { nsk_jvmti_setFailStatus(); return NSK_FALSE; @@ -216,7 +216,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, (long)rootClassTag, (void*)rootObjectClass); printf("Find chain object class: %s\n", CHAIN_OBJECT_CLASS_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (chainObjectClass = jni->FindClass(CHAIN_OBJECT_CLASS_NAME)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -232,7 +232,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, (long)chainClassTag, (void*)chainObjectClass); printf("Find static field in debugee class: %s\n", OBJECT_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (objectField = jni->GetStaticFieldID(debugeeClass, OBJECT_FIELD_NAME, ROOT_OBJECT_CLASS_SIG)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -241,7 +241,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, printf(" ... got fieldID: 0x%p\n", (void*)objectField); printf("Find instance field in root object class: %s\n", REACHABLE_CHAIN_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (reachableChainField = jni->GetFieldID(rootObjectClass, REACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -250,7 +250,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, printf(" ... got fieldID: 0x%p\n", (void*)reachableChainField); printf("Find instance field in root object class: %s\n", UNREACHABLE_CHAIN_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (unreachableChainField = jni->GetFieldID(rootObjectClass, UNREACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -259,7 +259,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, printf(" ... got fieldID: 0x%p\n", (void*)unreachableChainField); printf("Find instance field in chain object class: %s\n", TAIL_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (tailField = jni->GetFieldID(chainObjectClass, TAIL_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -268,14 +268,14 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, printf(" ... got fieldID: 0x%p\n", (void*)tailField); printf("Get root object from static field: %s\n", OBJECT_FIELD_NAME); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*rootObject = jni->GetStaticObjectField(debugeeClass, objectField)) != nullptr)) { nsk_jvmti_setFailStatus(); return NSK_FALSE; } printf(" ... got object: 0x%p\n", (void*)*rootObject); - fflush(0); + fflush(nullptr); if (!NSK_JNI_VERIFY(jni, (*rootObject = jni->NewGlobalRef(*rootObject)) != nullptr)) { nsk_jvmti_setFailStatus(); @@ -286,7 +286,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, printf("Obtain and tag chain objects:\n"); printf(" root tested object\n"); - fflush(0); + fflush(nullptr); if (!NSK_JVMTI_VERIFY(jvmti->SetTag(*rootObject, rootObjectTag))) { nsk_jvmti_setFailStatus(); } @@ -298,7 +298,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, (*objectDescList)[0].tag = rootObjectTag; printf(" reachable objects chain: %d objects\n", chainLength); - fflush(0); + fflush(nullptr); if (!getChainObjects(jvmti, jni, *rootObject, reachableChainField, REACHABLE_CHAIN_FIELD_NAME, tailField, TAIL_FIELD_NAME, @@ -347,7 +347,7 @@ static int checkTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, } printf("\nReachable objects:\n"); - fflush(0); + fflush(nullptr); for (i = 0; i < chainLength; i++) { idx = i + 1; printf("Reachable object:\n" @@ -382,7 +382,7 @@ static int checkTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, NSK_COMPLAIN0("Unreachable object was iterated\n"); nsk_jvmti_setFailStatus(); } - fflush(0); + fflush(nullptr); } return NSK_TRUE; @@ -403,7 +403,7 @@ static int releaseTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength, } } - fflush(0); + fflush(nullptr); return NSK_TRUE; } @@ -646,7 +646,7 @@ jint JNICALL heapReferenceCallback( (long) size); } - fflush(0); + fflush(nullptr); return 0; } @@ -665,7 +665,7 @@ jint JNICALL heapReferenceCallback( method, (long) location, (int) index); - fflush(0); + fflush(nullptr); if (tag_ptr == nullptr) { NSK_COMPLAIN1("null tag_ptr is passed to heapReferenceCallback:" @@ -748,7 +748,7 @@ jint JNICALL heapReferenceCallback( if (tag != rootObjectTag || class_tag != rootClassTag) { NSK_COMPLAIN1("This reference kind was not expected: %s\n", ref_kind_str[ref_kind]); - fflush(0); + fflush(nullptr); nsk_jvmti_setFailStatus(); } break; @@ -818,7 +818,7 @@ jint JNICALL heapReferenceCallback( default: { NSK_COMPLAIN1("This reference kind was not expected: %s\n\n", ref_kind_str[ref_kind]); - fflush(0); + fflush(nullptr); nsk_jvmti_setFailStatus(); break; } @@ -840,7 +840,7 @@ jint JNICALL primitiveFieldCallback (long) class_tag, (long) DEREF(tag_ptr), (int) value_type); - fflush(0); + fflush(nullptr); return 0; } @@ -853,7 +853,7 @@ jint JNICALL arrayPrimitiveValueCallback (long) DEREF(tag_ptr), (int) element_count, (int) element_type); - fflush(0); + fflush(nullptr); return 0; } @@ -865,7 +865,7 @@ jint JNICALL stringPrimitiveValueCallback (long) class_tag, (long) DEREF(tag_ptr), (int) value_length); - fflush(0); + fflush(nullptr); return 0; } @@ -902,13 +902,13 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { jobject rootObject = nullptr; printf("Wait for tested objects created\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout))) { return; } printf(">>> Obtain and tag tested objects from debugee class\n"); - fflush(0); + fflush(nullptr); { if (!NSK_VERIFY(getTestedObjects(jvmti, jni, chainLength, &objectsCount, &objectDescList, &rootObject))) { @@ -917,7 +917,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Let debugee to clean links to unreachable objects\n"); - fflush(0); + fflush(nullptr); { if (!NSK_VERIFY(nsk_jvmti_resumeSync())) { return; @@ -933,7 +933,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf("\n\n>>> Start 1-st iteration starting from the heap root\n"); - fflush(0); + fflush(nullptr); { if (!NSK_JVMTI_VERIFY(jvmti->FollowReferences((jint) 0, /* heap_filter */ (jclass) nullptr, /* class */ @@ -946,7 +946,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Check if reachable objects were iterated\n"); - fflush(0); + fflush(nullptr); { if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) { nsk_jvmti_setFailStatus(); @@ -968,7 +968,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf("\n\n>>> Start 2-nd iteration starting from the heap root\n"); - fflush(0); + fflush(nullptr); first_followref = 0; { jint heap_filter = JVMTI_HEAP_FILTER_UNTAGGED @@ -985,7 +985,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { printf(">>> Check that both reachable and unreachable " "objects were not iterated\n"); - fflush(0); + fflush(nullptr); { if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) { nsk_jvmti_setFailStatus(); @@ -994,7 +994,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { printf(">>> Clean used data\n"); - fflush(0); + fflush(nullptr); { if (!NSK_VERIFY(releaseTestedObjects(jvmti, jni, chainLength, objectDescList, rootObject))) { @@ -1003,7 +1003,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf("Let debugee to finish\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_resumeSync())) return; } @@ -1047,7 +1047,7 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { info = INFO_HEAPOBJ; else { printf("Unknown option value: info=%s\n", infoOpt); - fflush(0); + fflush(nullptr); return JNI_ERR; } } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref004/followref004.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref004/followref004.cpp index e73534de8b6b4..2446b5f7caf93 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref004/followref004.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref004/followref004.cpp @@ -86,7 +86,7 @@ jint JNICALL primitiveFieldCallback( (long) DEREF(tag_ptr), (int) value_type); - fflush(0); + fflush(nullptr); markTagVisited(DEREF(tag_ptr)); @@ -111,7 +111,7 @@ jint JNICALL arrayPrimitiveValueCallback( (long) DEREF(tag_ptr), (int) element_count, (int) element_type); - fflush(0); + fflush(nullptr); markTagVisited(DEREF(tag_ptr)); @@ -132,7 +132,7 @@ jint JNICALL stringPrimitiveValueCallback( (long) class_tag, (long) DEREF(tag_ptr), (int) value_length); - fflush(0); + fflush(nullptr); markTagVisited(DEREF(tag_ptr)); @@ -168,14 +168,14 @@ static void JNICALL agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) jvmtiError retCode; printf(">>> Sync with Java code\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_waitForSync(g_timeout))) { return; } printf(">>> Create JNI global references\n"); - fflush(0); + fflush(nullptr); createGlobalRefs(jni); @@ -192,7 +192,7 @@ static void JNICALL agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) checkThatAllTagsVisited(); printf(">>> Let debugee to finish\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_resumeSync())) { return; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref005/followref005.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref005/followref005.cpp index 333ddcccf831a..d0194feab0288 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref005/followref005.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref005/followref005.cpp @@ -88,7 +88,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) { } printf(">>> Let debugee to finish\n"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_waitForSync(g_timeout))) { return; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref006/followref006.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref006/followref006.cpp index 54485fb809ae2..5c5e37803211d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref006/followref006.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref006/followref006.cpp @@ -181,7 +181,7 @@ static void JNICALL agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) checkNoObjIterated(jni, jvmti, JAVA_UTIL_CALENDAR_CLASS_NAME); NSK_DISPLAY0("Let debugee to finish"); - fflush(0); + fflush(nullptr); if (!NSK_VERIFY(nsk_jvmti_waitForSync(g_timeout))) { return; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretbase/earlyretbase.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretbase/earlyretbase.cpp index 47b9618d19c88..6c57004fc5f59 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretbase/earlyretbase.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretbase/earlyretbase.cpp @@ -33,7 +33,7 @@ extern "C" { #define STATUS_FAILED 2 #define PASSED 0 -#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return errCode +#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return errCode static jvmtiEnv *jvmti = nullptr; static jvmtiCapabilities caps; @@ -59,7 +59,7 @@ MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thr, if (method == midActiveMethod) { printf("#### MethodExit event occurred ####\n"); - fflush(0); + fflush(nullptr); meth_exit_gen_events++; } } @@ -70,7 +70,7 @@ FramePop(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, if (method == midActiveMethod) { printf("#### FramePop event occurred ####\n"); - fflush(0); + fflush(nullptr); pop_frame_gen_events++; } } @@ -120,7 +120,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretbase_resThread(JNIEnv *env, return JNI_ERR; } printf("<<<<<<<< ResumeThread() is successfully done\n"); - fflush(0); + fflush(nullptr); return PASSED; } @@ -176,7 +176,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretbase_doForceEarlyReturn(JNIEnv *env RETURN_FAILED; } printf("Check #1 PASSED: ForceEarlyReturn() is successfully done\n"); - fflush(0); + fflush(nullptr); return(errCode); } @@ -268,7 +268,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretbase_check(JNIEnv *env, jclass cls) "events generated correctly\n"); errCode = PASSED; } - fflush(0); + fflush(nullptr); return errCode; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretfp/earlyretfp.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretfp/earlyretfp.cpp index 9a0ce3d85508b..5e7506a871e3c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretfp/earlyretfp.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretfp/earlyretfp.cpp @@ -33,7 +33,7 @@ extern "C" { #define PASSED 0 #define STATUS_FAILED 2 -#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return +#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return #define METHCNT 2 static jvmtiEnv *jvmti = nullptr; @@ -175,7 +175,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid, printf(" expected: %d\n", framesCount + 1); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -220,7 +220,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, TranslateError(err), err); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -256,7 +256,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, RETURN_FAILED; } } - fflush(0); + fflush(nullptr); } void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, @@ -289,7 +289,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, printf("Method was_popped_by_exception unexpectedly\n"); errCode = STATUS_FAILED; } - fflush(0); + fflush(nullptr); } #ifdef STATIC_BUILD @@ -361,7 +361,7 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { printf("Warning: Breakpoint or SingleStep event are not implemented\n"); } - fflush(0); + fflush(nullptr); return JNI_OK; } @@ -431,7 +431,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretfp_printFloat( JNIEnv *env, jclass cls, jfloat val) { printf("\n>>> Returned value is %8.4f, hex: %#a\n", val, val); - fflush(0); + fflush(nullptr); return; } @@ -440,7 +440,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretfp_printDouble( JNIEnv *env, jclass cls, jdouble val) { printf("\n>>> Returned value is %8.4f, hex: %#a\n", val, val); - fflush(0); + fflush(nullptr); return; } @@ -451,7 +451,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretfp_check(JNIEnv *env, jclass cls) { framesCount, framesExpected); errCode = STATUS_FAILED; } - fflush(0); + fflush(nullptr); return errCode; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretint/earlyretint.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretint/earlyretint.cpp index feb51d5fc407d..16cd4c3856712 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretint/earlyretint.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretint/earlyretint.cpp @@ -33,7 +33,7 @@ extern "C" { #define PASSED 0 #define STATUS_FAILED 2 -#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return +#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return static jvmtiEnv *jvmti = nullptr; static jvmtiCapabilities caps; @@ -184,7 +184,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid, printf(" expected: %d\n", framesCount + 1); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -229,7 +229,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, TranslateError(err), err); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -270,7 +270,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, RETURN_FAILED; } } - fflush(0); + fflush(nullptr); } void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, @@ -295,7 +295,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, printf("Method was_popped_by_exception unexpectedly\n"); errCode = STATUS_FAILED; } - fflush(0); + fflush(nullptr); } #ifdef STATIC_BUILD @@ -452,7 +452,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretint_printInt( JNIEnv *env, jclass cls, jint val) { printf("\n>>> Returned value: dec %d, hex: %#x\n", val, val); - fflush(0); + fflush(nullptr); return; } @@ -463,7 +463,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretint_check(JNIEnv *env, jclass cls) framesCount, framesExpected); errCode = STATUS_FAILED; } - fflush(0); + fflush(nullptr); return errCode; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretlong/earlyretlong.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretlong/earlyretlong.cpp index 170d6839bef09..2cb1a318d4492 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretlong/earlyretlong.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretlong/earlyretlong.cpp @@ -34,7 +34,7 @@ extern "C" { #define PASSED 0 #define STATUS_FAILED 2 -#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return +#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return static jvmtiEnv *jvmti = nullptr; static jvmtiCapabilities caps; @@ -168,7 +168,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid, printf(" expected: %d\n", framesCount + 1); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -213,7 +213,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, TranslateError(err), err); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -251,7 +251,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, RETURN_FAILED; } } - fflush(0); + fflush(nullptr); } void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, @@ -276,7 +276,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, errCode = STATUS_FAILED; } } - fflush(0); + fflush(nullptr); } #ifdef STATIC_BUILD @@ -412,7 +412,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretlong_printLong( printf("\n>>> Returned value: dec: %" LL "d, hex: %#x %#x\n", val, iptr[0], iptr[1]); - fflush(0); + fflush(nullptr); return; } @@ -423,7 +423,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretlong_check(JNIEnv *env, jclass cls) framesCount, framesExpected); errCode = STATUS_FAILED; } - fflush(0); + fflush(nullptr); return errCode; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretobj/earlyretobj.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretobj/earlyretobj.cpp index 6faf82f9ed90e..ee3b79632d5c2 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretobj/earlyretobj.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretobj/earlyretobj.cpp @@ -34,7 +34,7 @@ extern "C" { #define PASSED 0 #define STATUS_FAILED 2 -#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return +#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return static jvmtiEnv *jvmti = nullptr; static jvmtiCapabilities caps; @@ -168,7 +168,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid, printf(" expected: %d\n", framesCount + 1); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -213,7 +213,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, TranslateError(err), err); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -251,7 +251,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, RETURN_FAILED; } } - fflush(0); + fflush(nullptr); } void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, @@ -274,7 +274,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, errCode = STATUS_FAILED; } } - fflush(0); + fflush(nullptr); } #ifdef STATIC_BUILD @@ -410,7 +410,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretobj_check(JNIEnv *env, jclass cls) framesCount, framesExpected); errCode = STATUS_FAILED; } - fflush(0); + fflush(nullptr); return errCode; } @@ -419,7 +419,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretobj_printObject( JNIEnv *env, jclass cls, jobject obj) { printf("\nReturned jobject: %#" PRIxPTR "\n", (uintptr_t)obj); - fflush(0); + fflush(nullptr); return; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretstr/earlyretstr.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretstr/earlyretstr.cpp index 6ebb50026a34a..8465d05f9561a 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretstr/earlyretstr.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretstr/earlyretstr.cpp @@ -33,7 +33,7 @@ extern "C" { #define PASSED 0 #define STATUS_FAILED 2 -#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return +#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return static jvmtiEnv *jvmti = nullptr; static jvmtiCapabilities caps; @@ -167,7 +167,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid, printf(" expected: %d\n", framesCount + 1); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -212,7 +212,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, TranslateError(err), err); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -249,7 +249,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, RETURN_FAILED; } } - fflush(0); + fflush(nullptr); } void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, @@ -273,7 +273,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread, errCode = STATUS_FAILED; } } - fflush(0); + fflush(nullptr); } #ifdef STATIC_BUILD @@ -409,7 +409,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretstr_check(JNIEnv *env, jclass cls) framesCount, framesExpected); errCode = STATUS_FAILED; } - fflush(0); + fflush(nullptr); return errCode; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretvoid/earlyretvoid.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretvoid/earlyretvoid.cpp index 4919d27e9e7c7..e66b9fc97acd6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretvoid/earlyretvoid.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretvoid/earlyretvoid.cpp @@ -33,7 +33,7 @@ extern "C" { #define PASSED 0 #define STATUS_FAILED 2 -#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return +#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return static jvmtiEnv *jvmti = nullptr; static jvmtiCapabilities caps; @@ -155,7 +155,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid, } jvmti_env->Deallocate((unsigned char*)table); } - fflush(0); + fflush(nullptr); } void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -192,7 +192,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, TranslateError(err), err); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -223,7 +223,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env, RETURN_FAILED; } } - fflush(0); + fflush(nullptr); } #ifdef STATIC_BUILD @@ -339,7 +339,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretvoid_getReady( } else { framesExpected = depth; } - fflush(0); + fflush(nullptr); } JNIEXPORT jint JNICALL @@ -349,7 +349,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretvoid_check(JNIEnv *env, jclass cls) framesCount, framesExpected); errCode = STATUS_FAILED; } - fflush(0); + fflush(nullptr); return errCode; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetAllStackTraces/getallstktr001/getallstktr001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetAllStackTraces/getallstktr001/getallstktr001.cpp index c1f0443186f20..8916186531d58 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetAllStackTraces/getallstktr001/getallstktr001.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetAllStackTraces/getallstktr001/getallstktr001.cpp @@ -179,7 +179,7 @@ void compare_all_frames(int ti, int frames_count, printf("thr #%d: compare frame #%d: fields are the same: " " method: 0x%p, location: %#" LL "x\n", ti, fi, fr1->method, fr1->location); - fflush(0); + fflush(nullptr); } } @@ -225,7 +225,7 @@ void compare_one_stack_trace(int ti, " jthread: 0x%p, state: %d, frame_count: %d\n", ti, stk1->thread, stk1->state, stk1->frame_count); - fflush(0); + fflush(nullptr); compare_all_frames(ti, stk1->frame_count, stk1->frame_buffer, @@ -291,7 +291,7 @@ Java_nsk_jvmti_unit_GetAllStackTraces_getallstktr001_GetThreadsInfo( iGlobalStatus = STATUS_FAILED; } printf("GetThreadInfo %d: thread: %s\n", ti, thread_info[ti].name); - fflush(0); + fflush(nullptr); } } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetConstantPool/getcpool001/getcpool001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetConstantPool/getcpool001/getcpool001.cpp index 997e6c667e60a..d3905ad65ebcf 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetConstantPool/getcpool001/getcpool001.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetConstantPool/getcpool001/getcpool001.cpp @@ -36,7 +36,7 @@ extern "C" { static jvmtiCapabilities caps; static jvmtiEventCallbacks callbacks; -#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return +#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return static jint errCode = PASSED; static jvmtiEnv *jvmti = nullptr; @@ -63,7 +63,7 @@ Java_nsk_jvmti_unit_GetConstantPool_getcpool001_getCP( /* Print Constant Pool attrs*/ printf("getCP: id = %d, cnt = %03d, bytes_cnt = %04d\n", id, cp_cnt, cp_bytes_cnt); - fflush(0); + fflush(nullptr); } void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, @@ -83,7 +83,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env, TranslateError(err), err); RETURN_FAILED; } - fflush(0); + fflush(nullptr); } #ifdef STATIC_BUILD From 1472124489c841642996ae984e21c533ffec8091 Mon Sep 17 00:00:00 2001 From: Mark Powers <mpowers@openjdk.org> Date: Tue, 9 Jul 2024 20:38:09 +0000 Subject: [PATCH 345/471] 8333364: Minor cleanup could be done in com.sun.crypto.provider Reviewed-by: mullan, valeriep --- .../sun/crypto/provider/AESKeyGenerator.java | 12 +- .../com/sun/crypto/provider/AESKeyWrap.java | 30 ++--- .../sun/crypto/provider/AESKeyWrapPadded.java | 34 ++--- .../sun/crypto/provider/ARCFOURCipher.java | 8 +- .../sun/crypto/provider/ChaCha20Cipher.java | 35 +++-- .../provider/ChaCha20Poly1305Parameters.java | 7 +- .../crypto/provider/CipherBlockChaining.java | 4 +- .../com/sun/crypto/provider/CipherCore.java | 21 ++- .../crypto/provider/CipherTextStealing.java | 5 +- .../sun/crypto/provider/ConstructKeys.java | 6 +- .../com/sun/crypto/provider/DESCrypt.java | 126 +++++++++--------- .../sun/crypto/provider/DESKeyFactory.java | 4 +- .../sun/crypto/provider/DESedeKeyFactory.java | 4 +- .../crypto/provider/DESedeKeyGenerator.java | 4 +- .../sun/crypto/provider/DESedeWrapCipher.java | 15 +-- .../com/sun/crypto/provider/DHKEM.java | 20 +-- .../sun/crypto/provider/DHKeyAgreement.java | 30 ++--- .../crypto/provider/DHKeyPairGenerator.java | 5 +- .../crypto/provider/ElectronicCodeBook.java | 6 +- .../sun/crypto/provider/FeedbackCipher.java | 6 +- .../classes/com/sun/crypto/provider/GCTR.java | 5 +- .../com/sun/crypto/provider/GHASH.java | 7 +- .../crypto/provider/GaloisCounterMode.java | 34 ++--- .../com/sun/crypto/provider/HmacCore.java | 27 ++-- .../com/sun/crypto/provider/HmacMD5.java | 9 +- .../crypto/provider/HmacMD5KeyGenerator.java | 5 +- .../com/sun/crypto/provider/HmacSHA1.java | 9 +- .../crypto/provider/HmacSHA1KeyGenerator.java | 5 +- .../sun/crypto/provider/ISO10126Padding.java | 5 +- .../com/sun/crypto/provider/JceKeyStore.java | 14 +- .../com/sun/crypto/provider/KWUtil.java | 10 +- .../com/sun/crypto/provider/KeyProtector.java | 6 +- .../sun/crypto/provider/KeyWrapCipher.java | 20 +-- .../sun/crypto/provider/OAEPParameters.java | 12 +- .../sun/crypto/provider/OutputFeedback.java | 4 +- .../sun/crypto/provider/PBEKeyFactory.java | 4 +- .../com/sun/crypto/provider/PBES1Core.java | 6 +- .../sun/crypto/provider/PBES2Parameters.java | 20 ++- .../sun/crypto/provider/PBKDF2KeyImpl.java | 21 +-- .../com/sun/crypto/provider/PBMAC1Core.java | 4 +- .../com/sun/crypto/provider/PKCS5Padding.java | 5 +- .../com/sun/crypto/provider/Poly1305.java | 12 +- .../com/sun/crypto/provider/RC2Crypt.java | 4 +- .../com/sun/crypto/provider/RSACipher.java | 7 +- .../com/sun/crypto/provider/SslMacCore.java | 23 ++-- .../provider/TlsKeyMaterialGenerator.java | 12 +- .../sun/crypto/provider/TlsPrfGenerator.java | 8 +- 47 files changed, 313 insertions(+), 367 deletions(-) diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java index 2672807aaddae..51671fdf25d0a 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,19 +25,19 @@ package com.sun.crypto.provider; -import java.security.SecureRandom; -import java.security.InvalidParameterException; import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; +import java.security.InvalidParameterException; +import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import java.util.Arrays; import javax.crypto.KeyGeneratorSpi; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; + import sun.security.util.SecurityProviderConstants; /** - * This class generates a AES key. + * This class generates an AES key. * * @author Valerie Peng * @@ -105,7 +105,7 @@ protected void engineInit(int keysize, SecureRandom random) { * @return the new AES key */ protected SecretKey engineGenerateKey() { - SecretKeySpec aesKey = null; + SecretKeySpec aesKey; if (this.random == null) { this.random = SunJCE.getRandom(); diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java index 9cb338996406e..7fad0b84d0715 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,11 @@ package com.sun.crypto.provider; -import java.util.Arrays; -import java.security.*; -import java.security.spec.*; -import javax.crypto.*; -import javax.crypto.spec.*; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import javax.crypto.IllegalBlockSizeException; + import static com.sun.crypto.provider.KWUtil.*; /** @@ -66,7 +66,7 @@ String getFeedback() { @Override void save() { throw new UnsupportedOperationException("save not supported"); - }; + } /** * Restores the content of this cipher to the previous saved one. @@ -74,7 +74,7 @@ void save() { @Override void restore() { throw new UnsupportedOperationException("restore not supported"); - }; + } /** * Initializes the cipher in the specified mode with the given key @@ -112,20 +112,20 @@ void init(boolean decrypting, String algorithm, byte[] key, byte[] iv) @Override void reset() { throw new UnsupportedOperationException("reset not supported"); - }; + } - // no support for multi-part encryption + // no support for multipart encryption @Override int encrypt(byte[] pt, int ptOfs, int ptLen, byte[] ct, int ctOfs) { - throw new UnsupportedOperationException("multi-part not supported"); - }; + throw new UnsupportedOperationException("multipart not supported"); + } - // no support for multi-part decryption + // no support for multipart decryption @Override int decrypt(byte[] ct, int ctOfs, int ctLen, byte[] pt, int ptOfs) { - throw new UnsupportedOperationException("multi-part not supported"); - }; + throw new UnsupportedOperationException("multipart not supported"); + } /** * Performs single-part encryption operation. diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java index 4ae96acbca853..1e4e7236c8cae 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,12 @@ package com.sun.crypto.provider; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; import java.util.Arrays; import java.util.HexFormat; -import java.security.*; -import java.security.spec.*; -import javax.crypto.*; -import javax.crypto.spec.*; +import javax.crypto.IllegalBlockSizeException; + import static com.sun.crypto.provider.KWUtil.*; /** @@ -49,7 +49,7 @@ class AESKeyWrapPadded extends FeedbackCipher { private static final byte[] PAD_BLK = new byte[SEMI_BLKSIZE - 1]; - // set the first semiblock of dest with iv and inLen + // set the first semi-block of dest with iv and inLen private static void setIvAndLen(byte[] dest, byte[] iv, int inLen) { assert(dest.length >= SEMI_BLKSIZE) : "buffer needs at least 8 bytes"; @@ -60,7 +60,7 @@ private static void setIvAndLen(byte[] dest, byte[] iv, int inLen) { dest[7] = (byte) (inLen & 0xFF); } - // validate the recovered internal ivAndLen semiblock against iv and + // validate the recovered internal ivAndLen semi-block against iv and // return the recovered input length private static int validateIV(byte[] ivAndLen, byte[] iv) throws IllegalBlockSizeException { @@ -103,7 +103,7 @@ String getFeedback() { @Override void save() { throw new UnsupportedOperationException("save not supported"); - }; + } /** * Restores the content of this cipher to the previous saved one. @@ -111,7 +111,7 @@ void save() { @Override void restore() { throw new UnsupportedOperationException("restore not supported"); - }; + } /** * Initializes the cipher in the specified mode with the given key @@ -151,19 +151,19 @@ void init(boolean decrypting, String algorithm, byte[] key, byte[] iv) @Override void reset() { throw new UnsupportedOperationException("reset not supported"); - }; + } - // no support for multi-part encryption + // no support for multipart encryption @Override int encrypt(byte[] pt, int ptOfs, int ptLen, byte[] ct, int ctOfs) { - throw new UnsupportedOperationException("multi-part not supported"); - }; + throw new UnsupportedOperationException("multipart not supported"); + } - // no support for multi-part decryption + // no support for multipart decryption @Override int decrypt(byte[] ct, int ctOfs, int ctLen, byte[] pt, int ptOfs) { - throw new UnsupportedOperationException("multi-part not supported"); - }; + throw new UnsupportedOperationException("multipart not supported"); + } /** * Performs single-part encryption operation. @@ -199,7 +199,7 @@ int encryptFinal(byte[] pt, int dummy1, int ptLen, byte[] dummy2, } if (ptLen <= BLKSIZE) { - // overwrite the first semiblock with iv and input length + // overwrite the first semi-block with iv and input length setIvAndLen(pt, iv, actualLen); embeddedCipher.encryptBlock(pt, 0, pt, 0); } else { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ARCFOURCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/ARCFOURCipher.java index 09d5a8cddebfb..d7c0f3dd35dae 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/ARCFOURCipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/ARCFOURCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -114,7 +114,7 @@ private void crypt(byte[] in, int inOfs, int inLen, byte[] out, // Modes do not make sense with stream ciphers, but allow ECB // see JCE spec. protected void engineSetMode(String mode) throws NoSuchAlgorithmException { - if (mode.equalsIgnoreCase("ECB") == false) { + if (!mode.equalsIgnoreCase("ECB")) { throw new NoSuchAlgorithmException("Unsupported mode " + mode); } } @@ -123,7 +123,7 @@ protected void engineSetMode(String mode) throws NoSuchAlgorithmException { // see JCE spec. protected void engineSetPadding(String padding) throws NoSuchPaddingException { - if (padding.equalsIgnoreCase("NoPadding") == false) { + if (!padding.equalsIgnoreCase("NoPadding")) { throw new NoSuchPaddingException("Padding must be NoPadding"); } } @@ -201,7 +201,7 @@ private static byte[] getEncodedKey(Key key) throws InvalidKeyException { if (!keyAlg.equals("RC4") && !keyAlg.equals("ARCFOUR")) { throw new InvalidKeyException("Not an ARCFOUR key: " + keyAlg); } - if ("RAW".equals(key.getFormat()) == false) { + if (!"RAW".equals(key.getFormat())) { throw new InvalidKeyException("Key encoding format must be RAW"); } byte[] encodedKey = key.getEncoded(); diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java index ed2fda5bf0086..fc39b4ed63480 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -156,7 +156,7 @@ protected ChaCha20Cipher() { } */ @Override protected void engineSetMode(String mode) throws NoSuchAlgorithmException { - if (mode.equalsIgnoreCase("None") == false) { + if (!mode.equalsIgnoreCase("None")) { throw new NoSuchAlgorithmException("Mode must be None"); } } @@ -174,7 +174,7 @@ protected void engineSetMode(String mode) throws NoSuchAlgorithmException { @Override protected void engineSetPadding(String padding) throws NoSuchPaddingException { - if (padding.equalsIgnoreCase("NoPadding") == false) { + if (!padding.equalsIgnoreCase("NoPadding")) { throw new NoSuchPaddingException("Padding must be NoPadding"); } } @@ -326,7 +326,7 @@ protected void engineInit(int opmode, Key key, // We will ignore the secure random implementation and use the nonce // from the AlgorithmParameterSpec instead. - byte[] newNonce = null; + byte[] newNonce; switch (mode) { case MODE_NONE: if (!(params instanceof ChaCha20ParameterSpec)) { @@ -360,7 +360,7 @@ protected void engineInit(int opmode, Key key, /** * Initialize the engine using the {@code AlgorithmParameter} initialization - * format. This cipher does supports initialization with + * format. This cipher supports initialization with * {@code AlgorithmParameter} objects for ChaCha20-Poly1305 but not for * ChaCha20 as a simple stream cipher. In the latter case, it will throw * an {@code InvalidAlgorithmParameterException} if the value is non-null. @@ -618,7 +618,7 @@ private void checkKeyAndNonce(byte[] newKeyBytes, byte[] newNonce) * or if the key encoding format is not {@code RAW}. */ private static byte[] getEncodedKey(Key key) throws InvalidKeyException { - if ("RAW".equals(key.getFormat()) == false) { + if (!"RAW".equals(key.getFormat())) { throw new InvalidKeyException("Key encoding format must be RAW"); } byte[] encodedKey = key.getEncoded(); @@ -675,7 +675,7 @@ protected byte[] engineUpdate(byte[] in, int inOfs, int inLen) { @Override protected int engineUpdate(byte[] in, int inOfs, int inLen, byte[] out, int outOfs) throws ShortBufferException { - int bytesUpdated = 0; + int bytesUpdated; try { bytesUpdated = engine.doUpdate(in, inOfs, inLen, out, outOfs); } catch (KeyException ke) { @@ -691,10 +691,10 @@ protected int engineUpdate(byte[] in, int inOfs, int inLen, * @param output ByteBuffer that will hold the resulting data. This * must be large enough to hold the resulting data. * - * @return the length in bytes of the data written into the {@code out} + * @return the length in bytes of the data written into the {@code output} * buffer. * - * @throws ShortBufferException if the buffer {@code out} does not have + * @throws ShortBufferException if the buffer {@code output} does not have * enough space to hold the resulting data. */ @Override @@ -763,7 +763,7 @@ protected byte[] engineDoFinal(byte[] in, int inOfs, int inLen) protected int engineDoFinal(byte[] in, int inOfs, int inLen, byte[] out, int outOfs) throws ShortBufferException, AEADBadTagException { - int bytesUpdated = 0; + int bytesUpdated; try { bytesUpdated = engine.doFinal(in, inOfs, inLen, out, outOfs); } catch (KeyException ke) { @@ -785,6 +785,9 @@ protected int engineDoFinal(byte[] in, int inOfs, int inLen, byte[] out, * * @return the resulting plaintext or ciphertext bytes. * + * @throws ShortBufferException if the buffer {@code output} does not have + * enough space to hold the resulting data. + * * @throws AEADBadTagException if, during decryption, the provided tag * does not match the calculated tag. */ @@ -947,12 +950,8 @@ protected int engineGetKeySize(Key key) throws InvalidKeyException { * key and nonce into their proper locations. The counter field is not * set here. * - * @throws IllegalArgumentException if the key or nonce are not in - * their proper lengths (32 bytes for the key, 12 bytes for the - * nonce). - * @throws InvalidKeyException if the key does not support an encoded form. */ - private void setInitialState() throws InvalidKeyException { + private void setInitialState() { // Apply constants to first 4 words startState[0] = STATE_CONST_0; startState[1] = STATE_CONST_1; @@ -1257,11 +1256,11 @@ private int authUpdate(byte[] data, int offset, int length) { * @param out the array to write the resulting tag into * @param outOff the offset to begin writing the data. * - * @throws ShortBufferException if there is insufficient room to + * @throws ProviderException if there is insufficient room to * write the tag. */ private void authFinalizeData(byte[] data, int dataOff, int length, - byte[] out, int outOff) throws ShortBufferException { + byte[] out, int outOff) { // Update with the final chunk of ciphertext, then pad to a // multiple of 16. if (data != null) { @@ -1300,7 +1299,7 @@ private void authPad16(long dataLen) { * @param dLen the length of the application data. * @param buf the buffer to write the two lengths into. * - * @note it is the caller's responsibility to provide an array large + * @implNote it is the caller's responsibility to provide an array large * enough to hold the two longs. */ private void authWriteLengths(long aLen, long dLen, byte[] buf) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Poly1305Parameters.java b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Poly1305Parameters.java index 762827d0152ff..ab9d4a23e6098 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Poly1305Parameters.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Poly1305Parameters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -206,8 +206,7 @@ protected byte[] engineGetEncoded(String encodingMethod) protected String engineToString() { String LINE_SEP = System.lineSeparator(); HexDumpEncoder encoder = new HexDumpEncoder(); - StringBuilder sb = new StringBuilder(LINE_SEP + "nonce:" + - LINE_SEP + "[" + encoder.encodeBuffer(nonce) + "]"); - return sb.toString(); + return LINE_SEP + "nonce:" + + LINE_SEP + "[" + encoder.encodeBuffer(nonce) + "]"; } } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/CipherBlockChaining.java b/src/java.base/share/classes/com/sun/crypto/provider/CipherBlockChaining.java index 5d756e2684746..4bd7faea72257 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/CipherBlockChaining.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/CipherBlockChaining.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -180,7 +180,7 @@ private int implEncrypt(byte[] plain, int plainOffset, int plainLen, * * <p>It is also the application's responsibility to make sure that * <code>init</code> has been called before this method is called. - * (This check is omitted here, to avoid double checking.) + * (This check is omitted here, to avoid double-checking.) * * @param cipher the buffer with the input data to be decrypted * @param cipherOffset the offset in <code>cipherOffset</code> diff --git a/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java b/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java index 2555448e3c011..c808756fa1d7a 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,7 +67,7 @@ final class CipherCore { /* * unit size (number of input bytes that can be processed at a time) */ - private int unitBytes = 0; + private int unitBytes; /* * index of the content size left in the buffer @@ -91,17 +91,17 @@ final class CipherCore { * input bytes that are processed at a time is different from the block * size) */ - private int diffBlocksize = 0; + private int diffBlocksize; /* * padding class */ - private Padding padding = null; + private Padding padding; /* * internal cipher engine */ - private FeedbackCipher cipher = null; + private FeedbackCipher cipher; /* * the cipher mode @@ -136,7 +136,7 @@ final class CipherCore { /* * The buffer should be usable for all cipher mode and padding * schemes. Thus, it has to be at least (blockSize+1) for CTS. - * In decryption mode, it also hold the possible padding block. + * In decryption mode, it also holds the possible padding block. */ buffer = new byte[blockSize*2]; @@ -334,7 +334,7 @@ AlgorithmParameters getParameters(String algName) { if (cipherMode == ECB_MODE) { return null; } - AlgorithmParameters params = null; + AlgorithmParameters params; AlgorithmParameterSpec spec; byte[] iv = getIV(); if (iv == null) { @@ -545,7 +545,7 @@ static byte[] getKeyBytes(Key key) throws InvalidKeyException { */ byte[] update(byte[] input, int inputOffset, int inputLen) { - byte[] output = null; + byte[] output; try { output = new byte[getOutputSizeByOperation(inputLen, false)]; int len = update(input, inputOffset, inputLen, output, @@ -930,8 +930,7 @@ private byte[] prepareInputBuffer(byte[] input, int inputOffset, private int fillOutputBuffer(byte[] finalBuf, int finalOffset, byte[] output, int outOfs, int finalBufLen, byte[] input) - throws ShortBufferException, BadPaddingException, - IllegalBlockSizeException { + throws BadPaddingException, IllegalBlockSizeException { int len; try { @@ -967,7 +966,7 @@ private int checkOutputCapacity(byte[] output, int outputOffset, private int finalNoPadding(byte[] in, int inOfs, byte[] out, int outOfs, int len) - throws IllegalBlockSizeException, ShortBufferException { + throws IllegalBlockSizeException { if (in == null || len == 0) { return 0; diff --git a/src/java.base/share/classes/com/sun/crypto/provider/CipherTextStealing.java b/src/java.base/share/classes/com/sun/crypto/provider/CipherTextStealing.java index 630f8707fdeb7..da46f220825a5 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/CipherTextStealing.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/CipherTextStealing.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package com.sun.crypto.provider; import javax.crypto.IllegalBlockSizeException; -import javax.crypto.ShortBufferException; /** * This class represents ciphers in cipher text stealing (CTS) mode. @@ -153,7 +152,7 @@ int encryptFinal(byte[] plain, int plainOffset, int plainLen, * * <p>It is also the application's responsibility to make sure that * <code>init</code> has been called before this method is called. - * (This check is omitted here, to avoid double checking.) + * (This check is omitted here, to avoid double-checking.) * * @param cipher the buffer with the input data to be decrypted * @param cipherOffset the offset in <code>cipherOffset</code> diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java b/src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java index e8375d1eb8182..2019104941efd 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ final class ConstructKeys { private static final PublicKey constructPublicKey(byte[] encodedKey, int ofs, int len, String encodedKeyAlgorithm) throws InvalidKeyException, NoSuchAlgorithmException { - PublicKey key = null; + PublicKey key; byte[] keyBytes = (ofs == 0 && encodedKey.length == len) ? encodedKey : Arrays.copyOfRange(encodedKey, ofs, ofs + len); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); @@ -88,7 +88,7 @@ private static final PublicKey constructPublicKey(byte[] encodedKey, private static final PrivateKey constructPrivateKey(byte[] encodedKey, int ofs, int len, String encodedKeyAlgorithm) throws InvalidKeyException, NoSuchAlgorithmException { - PrivateKey key = null; + PrivateKey key; byte[] keyBytes = (ofs == 0 && encodedKey.length == len) ? encodedKey : Arrays.copyOfRange(encodedKey, ofs, ofs + len); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESCrypt.java b/src/java.base/share/classes/com/sun/crypto/provider/DESCrypt.java index acbde75cd8426..29a5ba2540860 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DESCrypt.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DESCrypt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ */ class DESCrypt extends SymmetricCipher implements DESConstants { - private static final int s0p[] = { + private static final int[] s0p = { 0x00410100, 0x00010000, 0x40400000, 0x40410100, 0x00400000, 0x40010100, 0x40010000, 0x40400000, 0x40010100, 0x00410100, 0x00410000, 0x40000100, 0x40400100, 0x00400000, 0x00000000, @@ -56,7 +56,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants { 0x40000000, 0x40410000, 0x00000100, 0x40010100, }; - private static final int s1p[] = { + private static final int[] s1p = { 0x08021002, 0x00000000, 0x00021000, 0x08020000, 0x08000002, 0x00001002, 0x08001000, 0x00021000, 0x00001000, 0x08020002, 0x00000002, 0x08001000, 0x00020002, 0x08021000, 0x08020000, @@ -72,7 +72,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants { 0x08001002, 0x00000002, 0x08020000, 0x00021000, }; - private static final int s2p[] = { + private static final int[] s2p = { 0x20800000, 0x00808020, 0x00000020, 0x20800020, 0x20008000, 0x00800000, 0x20800020, 0x00008020, 0x00800020, 0x00008000, 0x00808000, 0x20000000, 0x20808020, 0x20000020, 0x20000000, @@ -88,7 +88,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants { 0x20800000, 0x20008020, 0x00000020, 0x00808000, }; - private static final int s3p[] = { + private static final int[] s3p = { 0x00080201, 0x02000200, 0x00000001, 0x02080201, 0x00000000, 0x02080000, 0x02000201, 0x00080001, 0x02080200, 0x02000001, 0x02000000, 0x00000201, 0x02000001, 0x00080201, 0x00080000, @@ -104,7 +104,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants { 0x00000201, 0x02000000, 0x02000001, 0x02080200, }; - private static final int s4p[] = { + private static final int[] s4p = { 0x01000000, 0x00002000, 0x00000080, 0x01002084, 0x01002004, 0x01000080, 0x00002084, 0x01002000, 0x00002000, 0x00000004, 0x01000004, 0x00002080, 0x01000084, 0x01002004, 0x01002080, @@ -120,7 +120,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants { 0x00000004, 0x00002084, 0x01002000, 0x01000004, }; - private static final int s5p[] = { + private static final int[] s5p = { 0x10000008, 0x00040008, 0x00000000, 0x10040400, 0x00040008, 0x00000400, 0x10000408, 0x00040000, 0x00000408, 0x10040408, 0x00040400, 0x10000000, 0x10000400, 0x10000008, 0x10040000, @@ -136,7 +136,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants { 0x10040000, 0x00000408, 0x00000008, 0x10040008, }; - private static final int s6p[] = { + private static final int[] s6p = { 0x00000800, 0x00000040, 0x00200040, 0x80200000, 0x80200840, 0x80000800, 0x00000840, 0x00000000, 0x00200000, 0x80200040, 0x80000040, 0x00200800, 0x80000000, 0x00200840, 0x00200800, @@ -152,7 +152,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants { 0x80200000, 0x00200840, 0x00200800, 0x80000800, }; - private static final int s7p[] = { + private static final int[] s7p = { 0x04100010, 0x04104000, 0x00004010, 0x00000000, 0x04004000, 0x00100010, 0x04100000, 0x04104010, 0x00000010, 0x04000000, 0x00104000, 0x00004010, 0x00104010, 0x04004010, 0x04000010, @@ -168,112 +168,112 @@ class DESCrypt extends SymmetricCipher implements DESConstants { 0x04000000, 0x04100010, 0x00004000, 0x00104010, }; - private static final int permRight0[] = { + private static final int[] permRight0 = { 0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040, }; - private static final int permLeft1[] = { + private static final int[] permLeft1 = { 0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040, }; - private static final int permRight2[] = { + private static final int[] permRight2 = { 0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010, }; - private static final int permLeft3[] = { + private static final int[] permLeft3 = { 0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010, }; - private static final int permRight4[] = { + private static final int[] permRight4 = { 0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404, }; - private static final int permLeft5[] = { + private static final int[] permLeft5 = { 0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404, }; - private static final int permRight6[] = { + private static final int[] permRight6 = { 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101, }; - private static final int permLeft7[] = { + private static final int[] permLeft7 = { 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101, }; - private static final int permRight8[] = { + private static final int[] permRight8 = { 0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080, }; - private static final int permLeft9[] = { + private static final int[] permLeft9 = { 0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080, }; - private static final int permRightA[] = { + private static final int[] permRightA = { 0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020, }; - private static final int permLeftB[] = { + private static final int[] permLeftB = { 0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020, }; - private static final int permRightC[] = { + private static final int[] permRightC = { 0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808, }; - private static final int permLeftD[] = { + private static final int[] permLeftD = { 0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808, }; - private static final int permRightE[] = { + private static final int[] permRightE = { 0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, 0x02020202, }; - private static final int permLeftF[] = { + private static final int[] permLeftF = { 0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, @@ -283,224 +283,224 @@ class DESCrypt extends SymmetricCipher implements DESConstants { /* * Initial Permutation */ - private static final int initPermLeft0[] = { + private static final int[] initPermLeft0 = { 0x00000000, 0x00008000, 0x00000000, 0x00008000, 0x00000080, 0x00008080, 0x00000080, 0x00008080, 0x00000000, 0x00008000, 0x00000000, 0x00008000, 0x00000080, 0x00008080, 0x00000080, 0x00008080, }; - private static final int initPermRight0[] = { + private static final int[] initPermRight0 = { 0x00000000, 0x00000000, 0x00008000, 0x00008000, 0x00000000, 0x00000000, 0x00008000, 0x00008000, 0x00000080, 0x00000080, 0x00008080, 0x00008080, 0x00000080, 0x00000080, 0x00008080, 0x00008080, }; - private static final int initPermLeft1[] = { + private static final int[] initPermLeft1 = { 0x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00800000, 0x80800000, 0x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00800000, 0x80800000, }; - private static final int initPermRight1[] = { + private static final int[] initPermRight1 = { 0x00000000, 0x00000000, 0x80000000, 0x80000000, 0x00000000, 0x00000000, 0x80000000, 0x80000000, 0x00800000, 0x00800000, 0x80800000, 0x80800000, 0x00800000, 0x00800000, 0x80800000, 0x80800000, }; - private static final int initPermLeft2[] = { + private static final int[] initPermLeft2 = { 0x00000000, 0x00004000, 0x00000000, 0x00004000, 0x00000040, 0x00004040, 0x00000040, 0x00004040, 0x00000000, 0x00004000, 0x00000000, 0x00004000, 0x00000040, 0x00004040, 0x00000040, 0x00004040, }; - private static final int initPermRight2[] = { + private static final int[] initPermRight2 = { 0x00000000, 0x00000000, 0x00004000, 0x00004000, 0x00000000, 0x00000000, 0x00004000, 0x00004000, 0x00000040, 0x00000040, 0x00004040, 0x00004040, 0x00000040, 0x00000040, 0x00004040, 0x00004040, }; - private static final int initPermLeft3[] = { + private static final int[] initPermLeft3 = { 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00400000, 0x40400000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00400000, 0x40400000, }; - private static final int initPermRight3[] = { + private static final int[] initPermRight3 = { 0x00000000, 0x00000000, 0x40000000, 0x40000000, 0x00000000, 0x00000000, 0x40000000, 0x40000000, 0x00400000, 0x00400000, 0x40400000, 0x40400000, 0x00400000, 0x00400000, 0x40400000, 0x40400000, }; - private static final int initPermLeft4[] = { + private static final int[] initPermLeft4 = { 0x00000000, 0x00002000, 0x00000000, 0x00002000, 0x00000020, 0x00002020, 0x00000020, 0x00002020, 0x00000000, 0x00002000, 0x00000000, 0x00002000, 0x00000020, 0x00002020, 0x00000020, 0x00002020, }; - private static final int initPermRight4[] = { + private static final int[] initPermRight4 = { 0x00000000, 0x00000000, 0x00002000, 0x00002000, 0x00000000, 0x00000000, 0x00002000, 0x00002000, 0x00000020, 0x00000020, 0x00002020, 0x00002020, 0x00000020, 0x00000020, 0x00002020, 0x00002020, }; - private static final int initPermLeft5[] = { + private static final int[] initPermLeft5 = { 0x00000000, 0x20000000, 0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00200000, 0x20200000, 0x00000000, 0x20000000, 0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00200000, 0x20200000, }; - private static final int initPermRight5[] = { + private static final int[] initPermRight5 = { 0x00000000, 0x00000000, 0x20000000, 0x20000000, 0x00000000, 0x00000000, 0x20000000, 0x20000000, 0x00200000, 0x00200000, 0x20200000, 0x20200000, 0x00200000, 0x00200000, 0x20200000, 0x20200000, }; - private static final int initPermLeft6[] = { + private static final int[] initPermLeft6 = { 0x00000000, 0x00001000, 0x00000000, 0x00001000, 0x00000010, 0x00001010, 0x00000010, 0x00001010, 0x00000000, 0x00001000, 0x00000000, 0x00001000, 0x00000010, 0x00001010, 0x00000010, 0x00001010, }; - private static final int initPermRight6[] = { + private static final int[] initPermRight6 = { 0x00000000, 0x00000000, 0x00001000, 0x00001000, 0x00000000, 0x00000000, 0x00001000, 0x00001000, 0x00000010, 0x00000010, 0x00001010, 0x00001010, 0x00000010, 0x00000010, 0x00001010, 0x00001010, }; - private static final int initPermLeft7[] = { + private static final int[] initPermLeft7 = { 0x00000000, 0x10000000, 0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00100000, 0x10100000, 0x00000000, 0x10000000, 0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00100000, 0x10100000, }; - private static final int initPermRight7[] = { + private static final int[] initPermRight7 = { 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00100000, 0x00100000, 0x10100000, 0x10100000, 0x00100000, 0x00100000, 0x10100000, 0x10100000, }; - private static final int initPermLeft8[] = { + private static final int[] initPermLeft8 = { 0x00000000, 0x00000800, 0x00000000, 0x00000800, 0x00000008, 0x00000808, 0x00000008, 0x00000808, 0x00000000, 0x00000800, 0x00000000, 0x00000800, 0x00000008, 0x00000808, 0x00000008, 0x00000808, }; - private static final int initPermRight8[] = { + private static final int[] initPermRight8 = { 0x00000000, 0x00000000, 0x00000800, 0x00000800, 0x00000000, 0x00000000, 0x00000800, 0x00000800, 0x00000008, 0x00000008, 0x00000808, 0x00000808, 0x00000008, 0x00000008, 0x00000808, 0x00000808, }; - private static final int initPermLeft9[] = { + private static final int[] initPermLeft9 = { 0x00000000, 0x08000000, 0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00080000, 0x08080000, 0x00000000, 0x08000000, 0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00080000, 0x08080000, }; - private static final int initPermRight9[] = { + private static final int[] initPermRight9 = { 0x00000000, 0x00000000, 0x08000000, 0x08000000, 0x00000000, 0x00000000, 0x08000000, 0x08000000, 0x00080000, 0x00080000, 0x08080000, 0x08080000, 0x00080000, 0x00080000, 0x08080000, 0x08080000, }; - private static final int initPermLeftA[] = { + private static final int[] initPermLeftA = { 0x00000000, 0x00000400, 0x00000000, 0x00000400, 0x00000004, 0x00000404, 0x00000004, 0x00000404, 0x00000000, 0x00000400, 0x00000000, 0x00000400, 0x00000004, 0x00000404, 0x00000004, 0x00000404, }; - private static final int initPermRightA[] = { + private static final int[] initPermRightA = { 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000004, 0x00000004, 0x00000404, 0x00000404, 0x00000004, 0x00000004, 0x00000404, 0x00000404, }; - private static final int initPermLeftB[] = { + private static final int[] initPermLeftB = { 0x00000000, 0x04000000, 0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00040000, 0x04040000, 0x00000000, 0x04000000, 0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00040000, 0x04040000, }; - private static final int initPermRightB[] = { + private static final int[] initPermRightB = { 0x00000000, 0x00000000, 0x04000000, 0x04000000, 0x00000000, 0x00000000, 0x04000000, 0x04000000, 0x00040000, 0x00040000, 0x04040000, 0x04040000, 0x00040000, 0x00040000, 0x04040000, 0x04040000, }; - private static final int initPermLeftC[] = { + private static final int[] initPermLeftC = { 0x00000000, 0x00000200, 0x00000000, 0x00000200, 0x00000002, 0x00000202, 0x00000002, 0x00000202, 0x00000000, 0x00000200, 0x00000000, 0x00000200, 0x00000002, 0x00000202, 0x00000002, 0x00000202, }; - private static final int initPermRightC[] = { + private static final int[] initPermRightC = { 0x00000000, 0x00000000, 0x00000200, 0x00000200, 0x00000000, 0x00000000, 0x00000200, 0x00000200, 0x00000002, 0x00000002, 0x00000202, 0x00000202, 0x00000002, 0x00000002, 0x00000202, 0x00000202, }; - private static final int initPermLeftD[] = { + private static final int[] initPermLeftD = { 0x00000000, 0x02000000, 0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00020000, 0x02020000, 0x00000000, 0x02000000, 0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00020000, 0x02020000, }; - private static final int initPermRightD[] = { + private static final int[] initPermRightD = { 0x00000000, 0x00000000, 0x02000000, 0x02000000, 0x00000000, 0x00000000, 0x02000000, 0x02000000, 0x00020000, 0x00020000, 0x02020000, 0x02020000, 0x00020000, 0x00020000, 0x02020000, 0x02020000, }; - private static final int initPermLeftE[] = { + private static final int[] initPermLeftE = { 0x00000000, 0x00000100, 0x00000000, 0x00000100, 0x00000001, 0x00000101, 0x00000001, 0x00000101, 0x00000000, 0x00000100, 0x00000000, 0x00000100, 0x00000001, 0x00000101, 0x00000001, 0x00000101, }; - private static final int initPermRightE[] = { + private static final int[] initPermRightE = { 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000001, 0x00000001, 0x00000101, 0x00000101, 0x00000001, 0x00000001, 0x00000101, 0x00000101, }; - private static final int initPermLeftF[] = { + private static final int[] initPermLeftF = { 0x00000000, 0x01000000, 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00010000, 0x01010000, 0x00000000, 0x01000000, 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00010000, 0x01010000, }; - private static final int initPermRightF[] = { + private static final int[] initPermRightF = { 0x00000000, 0x00000000, 0x01000000, 0x01000000, 0x00000000, 0x00000000, 0x01000000, 0x01000000, 0x00010000, 0x00010000, 0x01010000, 0x01010000, 0x00010000, 0x00010000, 0x01010000, @@ -586,7 +586,7 @@ void decryptBlock(byte[] cipher, int cipherOffset, void cipherBlock(byte[] in, int inOffset, byte[] out, int outOffset) { - byte key[]; + byte[] key; int temp; int i, j; int offset; @@ -638,7 +638,7 @@ void cipherBlock(byte[] in, int inOffset, byte[] out, int outOffset) { } private static void perm(int left, int right, - byte out[], int offset) { + byte[] out, int offset) { int low, high, temp; temp = left; @@ -687,7 +687,7 @@ private static void perm(int left, int right, } - private static int initialPermutationLeft(byte block[], int offset) { + private static int initialPermutationLeft(byte[] block, int offset) { int l; l = initPermLeft1[block[offset] & 0xf]; @@ -709,7 +709,7 @@ private static int initialPermutationLeft(byte block[], int offset) { return l; } - private static int initialPermutationRight(byte block[], int offset) { + private static int initialPermutationRight(byte[] block, int offset) { int l; l = initPermRight1[block[offset] & 0xf]; @@ -731,9 +731,9 @@ private static int initialPermutationRight(byte block[], int offset) { return l; } - void expandKey(byte key[]) { + void expandKey(byte[] key) { int octet; - byte ek[] = new byte[128]; + byte[] ek = new byte[128]; octet = key[0]; if ((octet & 0x80) != 0) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESKeyFactory.java b/src/java.base/share/classes/com/sun/crypto/provider/DESKeyFactory.java index fa06797abc293..fd3320b070d54 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DESKeyFactory.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DESKeyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -104,7 +104,7 @@ protected KeySpec engineGetKeySpec(SecretKey key, Class<?> keySpec) try { - if ((key instanceof SecretKey) + if ((key != null) && (key.getAlgorithm().equalsIgnoreCase("DES")) && (key.getFormat().equalsIgnoreCase("RAW"))) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java index fd20415bb2d4a..b769aab417b22 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -103,7 +103,7 @@ protected KeySpec engineGetKeySpec(SecretKey key, Class<?> keySpec) throws InvalidKeySpecException { try { - if ((key instanceof SecretKey) + if ((key != null) && (key.getAlgorithm().equalsIgnoreCase("DESede")) && (key.getFormat().equalsIgnoreCase("RAW"))) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyGenerator.java index 28684b0f9e7af..325c0588777d1 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyGenerator.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -130,7 +130,7 @@ protected SecretKey engineGenerateKey() { java.util.Arrays.fill(tmpkey, (byte)0x00); } - DESedeKey desEdeKey = null; + DESedeKey desEdeKey; try { desEdeKey = new DESedeKey(rawkey); } catch (InvalidKeyException ike) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESedeWrapCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/DESedeWrapCipher.java index 92d25b57a7e50..f9281ae929536 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DESedeWrapCipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DESedeWrapCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -137,13 +137,13 @@ protected int engineGetBlockSize() { */ protected int engineGetOutputSize(int inputLen) { // can only return an upper-limit if not initialized yet. - int result = 0; + int result; if (decrypting) { result = inputLen - 16; // CHECKSUM_LEN + IV_LEN; } else { result = Math.addExact(inputLen, 16); } - return (result < 0? 0:result); + return (Math.max(result, 0)); } /** @@ -210,7 +210,7 @@ protected void engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException { - byte[] currIv = null; + byte[] currIv; if (opmode == Cipher.WRAP_MODE) { decrypting = false; if (params == null) { @@ -380,7 +380,7 @@ protected int engineDoFinal(byte[] input, int inputOffset, int inputLen, /** * Returns the parameters used with this cipher. * Note that null maybe returned if this cipher does not use any - * parameters or when it has not be set, e.g. initialized with + * parameters or when it has not been set, e.g. initialized with * UNWRAP_MODE but wrapped key data has not been given. * * @return the parameters used with this cipher; can be null. @@ -556,9 +556,8 @@ protected Key engineUnwrap(byte[] wrappedKey, buffer2, 0); int keyValLen = buffer2.length - CHECKSUM_LEN; byte[] cks = getChecksum(buffer2, 0, keyValLen); - int offset = keyValLen; for (int i = 0; i < CHECKSUM_LEN; i++) { - if (buffer2[offset + i] != cks[i]) { + if (buffer2[keyValLen + i] != cks[i]) { throw new InvalidKeyException("Checksum comparison failed"); } } @@ -588,7 +587,7 @@ private static final byte[] getChecksum(byte[] in) { return getChecksum(in, 0, in.length); } private static final byte[] getChecksum(byte[] in, int offset, int len) { - MessageDigest md = null; + MessageDigest md; try { md = MessageDigest.getInstance("SHA1"); } catch (NoSuchAlgorithmException nsae) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java b/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java index bd1c3f7c38053..3fa6b14762ac2 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,21 +24,23 @@ */ package com.sun.crypto.provider; -import sun.security.jca.JCAUtil; -import sun.security.ssl.HKDF; -import sun.security.util.*; - -import javax.crypto.*; -import javax.crypto.spec.SecretKeySpec; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigInteger; -import java.nio.charset.StandardCharsets; import java.security.*; -import java.security.interfaces.*; +import java.security.interfaces.ECKey; +import java.security.interfaces.ECPublicKey; +import java.security.interfaces.XECKey; +import java.security.interfaces.XECPublicKey; import java.security.spec.*; import java.util.Arrays; import java.util.Objects; +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; + +import sun.security.jca.JCAUtil; +import sun.security.ssl.HKDF; +import sun.security.util.*; // Implementing DHKEM defined inside https://www.rfc-editor.org/rfc/rfc9180.html, // without the AuthEncap and AuthDecap functions diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java index 01f978fff615f..5eebf98acc3d8 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,23 +25,15 @@ package com.sun.crypto.provider; -import java.util.*; -import java.lang.*; import java.math.BigInteger; -import java.security.AccessController; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.Key; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.PrivilegedAction; -import java.security.ProviderException; +import java.security.*; import java.security.spec.AlgorithmParameterSpec; -import java.security.spec.InvalidKeySpecException; +import java.util.Arrays; import javax.crypto.KeyAgreementSpi; -import javax.crypto.ShortBufferException; import javax.crypto.SecretKey; -import javax.crypto.spec.*; +import javax.crypto.ShortBufferException; +import javax.crypto.spec.DHParameterSpec; +import javax.crypto.spec.SecretKeySpec; import sun.security.util.KeyUtil; @@ -180,7 +172,7 @@ protected void engineInit(Key key, AlgorithmParameterSpec params, * @param key the key for this phase. For example, in the case of * Diffie-Hellman between 2 parties, this would be the other party's * Diffie-Hellman public key. - * @param lastPhase flag which indicates whether or not this is the last + * @param lastPhase flag which indicates if this is the last * phase of this key agreement. * * @return the (intermediate) key resulting from this phase, or null if @@ -227,7 +219,7 @@ protected Key engineDoPhase(Key key, boolean lastPhase) // intermediate secret, in which case we wrap it into a // Diffie-Hellman public key object and return it. generateSecret = true; - if (lastPhase == false) { + if (!lastPhase) { byte[] intermediate = engineGenerateSecret(); return new DHPublicKey(new BigInteger(1, intermediate), init_p, init_g); @@ -293,7 +285,7 @@ protected byte[] engineGenerateSecret() protected int engineGenerateSecret(byte[] sharedSecret, int offset) throws IllegalStateException, ShortBufferException { - if (generateSecret == false) { + if (!generateSecret) { throw new IllegalStateException ("Key agreement has not been completed yet"); } @@ -413,9 +405,7 @@ protected SecretKey engineGenerateSecret(String algorithm) int keysize = secret.length; if (keysize >= BlowfishConstants.BLOWFISH_MAX_KEYSIZE) keysize = BlowfishConstants.BLOWFISH_MAX_KEYSIZE; - SecretKeySpec skey = new SecretKeySpec(secret, 0, keysize, - "Blowfish"); - return skey; + return new SecretKeySpec(secret, 0, keysize, "Blowfish"); } else if (algorithm.equalsIgnoreCase("AES")) { // AES int keysize = secret.length; diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java index 4cc979cb29a89..89d4fcfc402cb 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,11 +28,10 @@ import java.math.BigInteger; import java.security.*; import java.security.spec.AlgorithmParameterSpec; -import java.security.spec.InvalidParameterSpecException; import javax.crypto.spec.DHParameterSpec; -import javax.crypto.spec.DHGenParameterSpec; import sun.security.provider.ParameterCache; + import static sun.security.util.SecurityProviderConstants.DEF_DH_KEY_SIZE; import static sun.security.util.SecurityProviderConstants.getDefDHPrivateExpSize; diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ElectronicCodeBook.java b/src/java.base/share/classes/com/sun/crypto/provider/ElectronicCodeBook.java index c2085816453d5..ba8a564be11f8 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/ElectronicCodeBook.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/ElectronicCodeBook.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,9 +27,9 @@ import java.security.InvalidKeyException; import java.security.ProviderException; -import sun.security.util.ArrayUtil; -import java.util.Objects; + import jdk.internal.vm.annotation.IntrinsicCandidate; +import sun.security.util.ArrayUtil; /** * This class represents ciphers in electronic codebook (ECB) mode. diff --git a/src/java.base/share/classes/com/sun/crypto/provider/FeedbackCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/FeedbackCipher.java index 6c0e10eb6d0a4..985c1b81f4393 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/FeedbackCipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/FeedbackCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -157,7 +157,7 @@ abstract int encrypt(byte[] plain, int plainOffset, int plainLen, */ int encryptFinal(byte[] plain, int plainOffset, int plainLen, byte[] cipher, int cipherOffset) - throws IllegalBlockSizeException, ShortBufferException { + throws IllegalBlockSizeException { return encrypt(plain, plainOffset, plainLen, cipher, cipherOffset); } /** @@ -199,7 +199,7 @@ abstract int decrypt(byte[] cipher, int cipherOffset, int cipherLen, */ int decryptFinal(byte[] cipher, int cipherOffset, int cipherLen, byte[] plain, int plainOffset) - throws IllegalBlockSizeException, ShortBufferException { + throws IllegalBlockSizeException { return decrypt(cipher, cipherOffset, cipherLen, plain, plainOffset); } } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java b/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java index 7aaec3d6c1ae1..926a56c140b66 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -79,8 +79,7 @@ private long blocksUntilRollover() { ByteBuffer buf = ByteBuffer.wrap(counter, counter.length - 4, 4); buf.order(ByteOrder.BIG_ENDIAN); long ctr32 = 0xFFFFFFFFL & buf.getInt(); - long blocksLeft = (1L << 32) - ctr32; - return blocksLeft; + return (1L << 32) - ctr32; } private void checkBlock() { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/GHASH.java b/src/java.base/share/classes/com/sun/crypto/provider/GHASH.java index b7aaf6059d535..6b8c2e9c1a965 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/GHASH.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/GHASH.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -190,9 +190,8 @@ int update(ByteBuffer ct, int inLen) { // If ct is a direct bytebuffer, send it directly to the intrinsic if (ct.isDirect()) { - int processed = inLen; processBlocksDirect(ct, inLen); - return processed; + return inLen; } else if (!ct.isReadOnly()) { // If a non-read only heap bytebuffer, use the array update method int processed = update(ct.array(), @@ -273,7 +272,7 @@ private static void ghashRangeCheck(byte[] in, int inOfs, int inLen, /* * This is an intrinsified method. The method's argument list must match * the hotspot signature. This method and methods called by it, cannot - * throw exceptions or allocate arrays as it will breaking intrinsics + * throw exceptions or allocate arrays as it will break intrinsics. */ @IntrinsicCandidate private static void processBlocks(byte[] data, int inOfs, int blocks, diff --git a/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java b/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java index 8cfd7d13f12b2..44cfb76d1628e 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,38 +25,24 @@ package com.sun.crypto.provider; -import jdk.internal.access.JavaNioAccess; -import jdk.internal.access.SharedSecrets; -import jdk.internal.misc.Unsafe; -import sun.nio.ch.DirectBuffer; -import sun.security.jca.JCAUtil; -import sun.security.util.ArrayUtil; - -import javax.crypto.AEADBadTagException; -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.CipherSpi; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.ShortBufferException; -import javax.crypto.spec.GCMParameterSpec; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.security.AlgorithmParameters; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.Key; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.ProviderException; -import java.security.SecureRandom; +import java.security.*; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.InvalidParameterSpecException; import java.util.Arrays; +import javax.crypto.*; +import javax.crypto.spec.GCMParameterSpec; +import jdk.internal.access.JavaNioAccess; +import jdk.internal.access.SharedSecrets; +import jdk.internal.misc.Unsafe; import jdk.internal.vm.annotation.IntrinsicCandidate; +import sun.nio.ch.DirectBuffer; +import sun.security.jca.JCAUtil; +import sun.security.util.ArrayUtil; /** * This class represents ciphers in GaloisCounter (GCM) mode. diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java index fecc30a5a085d..c6707fb994113 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,12 @@ package com.sun.crypto.provider; -import java.util.Arrays; - import java.nio.ByteBuffer; - +import java.security.*; +import java.security.spec.AlgorithmParameterSpec; +import java.util.Arrays; import javax.crypto.MacSpi; import javax.crypto.SecretKey; -import java.security.*; -import java.security.spec.*; - -import sun.security.x509.AlgorithmId; /** * This class constitutes the core of HMAC-<MD> algorithms, where @@ -87,8 +83,7 @@ abstract class HmacCore extends MacSpi implements Cloneable { break; } } - } catch (NoSuchAlgorithmException nsae) { - continue; + } catch (NoSuchAlgorithmException ignored) { } } if (md == null) { @@ -169,7 +164,7 @@ protected void engineInit(Key key, AlgorithmParameterSpec params) * @param input the input byte to be processed. */ protected void engineUpdate(byte input) { - if (first == true) { + if (first) { // compute digest for 1st pass; start with inner pad md.update(k_ipad); first = false; @@ -187,8 +182,8 @@ protected void engineUpdate(byte input) { * @param offset the offset in <code>input</code> where the input starts. * @param len the number of bytes to process. */ - protected void engineUpdate(byte input[], int offset, int len) { - if (first == true) { + protected void engineUpdate(byte[] input, int offset, int len) { + if (first) { // compute digest for 1st pass; start with inner pad md.update(k_ipad); first = false; @@ -205,7 +200,7 @@ protected void engineUpdate(byte input[], int offset, int len) { * @param input the input byte buffer. */ protected void engineUpdate(ByteBuffer input) { - if (first == true) { + if (first) { // compute digest for 1st pass; start with inner pad md.update(k_ipad); first = false; @@ -221,7 +216,7 @@ protected void engineUpdate(ByteBuffer input) { * @return the HMAC result. */ protected byte[] engineDoFinal() { - if (first == true) { + if (first) { // compute digest for 1st pass; start with inner pad md.update(k_ipad); } else { @@ -250,7 +245,7 @@ protected byte[] engineDoFinal() { * HMAC was initialized with. */ protected void engineReset() { - if (first == false) { + if (!first) { md.reset(); first = true; } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5.java index ccf85561db9ec..3e85ad51bb3bd 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,7 @@ package com.sun.crypto.provider; -import java.nio.ByteBuffer; - -import javax.crypto.MacSpi; -import javax.crypto.SecretKey; -import java.security.*; -import java.security.spec.*; +import java.security.NoSuchAlgorithmException; /** * This is an implementation of the HMAC-MD5 algorithm. diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5KeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5KeyGenerator.java index ba29e3c74793e..2634128dd286a 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5KeyGenerator.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5KeyGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,8 @@ package com.sun.crypto.provider; -import java.security.SecureRandom; -import java.security.InvalidParameterException; import java.security.InvalidAlgorithmParameterException; +import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import java.util.Arrays; import javax.crypto.KeyGeneratorSpi; diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1.java index b79dc9d96584c..0a17cad0ea397 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,7 @@ package com.sun.crypto.provider; -import java.nio.ByteBuffer; - -import javax.crypto.MacSpi; -import javax.crypto.SecretKey; -import java.security.*; -import java.security.spec.*; +import java.security.NoSuchAlgorithmException; /** * This is an implementation of the HMAC-SHA1 algorithm. diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1KeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1KeyGenerator.java index 9d92d60ae3656..1997777750348 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1KeyGenerator.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1KeyGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,8 @@ package com.sun.crypto.provider; -import java.security.SecureRandom; -import java.security.InvalidParameterException; import java.security.InvalidAlgorithmParameterException; +import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import java.util.Arrays; import javax.crypto.KeyGeneratorSpi; diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ISO10126Padding.java b/src/java.base/share/classes/com/sun/crypto/provider/ISO10126Padding.java index a86f313e2c9e1..43f153422849b 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/ISO10126Padding.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/ISO10126Padding.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -119,7 +119,6 @@ public int unpad(byte[] in, int off, int len) { * @return the length of the padding */ public int padLength(int len) { - int paddingOctet = blockSize - (len % blockSize); - return paddingOctet; + return blockSize - (len % blockSize); } } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java b/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java index fcc450387af9c..ab8f2d7097b04 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,7 +75,7 @@ private static final class PrivateKeyEntry { Date date; // the creation date of this entry byte[] protectedKey; Certificate[] chain; - }; + } // Secret key private static final class SecretKeyEntry { @@ -93,7 +93,7 @@ private static final class SecretKeyEntry { private static final class TrustedCertEntry { Date date; // the creation date of this entry Certificate cert; - }; + } /** * Private keys and certificates are stored in a hashtable. @@ -119,7 +119,7 @@ private static final class TrustedCertEntry { public Key engineGetKey(String alias, char[] password) throws NoSuchAlgorithmException, UnrecoverableKeyException { - Key key = null; + Key key; Object entry = entries.get(alias.toLowerCase(Locale.ENGLISH)); @@ -652,7 +652,7 @@ public void engineStore(OutputStream stream, char[] password) * the keystore (such as deleting or modifying key or * certificate entries). */ - byte digest[] = md.digest(); + byte[] digest = md.digest(); dos.write(digest); dos.flush(); @@ -691,8 +691,8 @@ public void engineLoad(InputStream stream, char[] password) MessageDigest md = null; CertificateFactory cf = null; Hashtable<String, CertificateFactory> cfs = null; - ByteArrayInputStream bais = null; - byte[] encoded = null; + ByteArrayInputStream bais; + byte[] encoded; int trustedKeyCount = 0, privateKeyCount = 0, secretKeyCount = 0; if (stream == null) diff --git a/src/java.base/share/classes/com/sun/crypto/provider/KWUtil.java b/src/java.base/share/classes/com/sun/crypto/provider/KWUtil.java index 7892ca198a8e6..e5dc892032694 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/KWUtil.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/KWUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,6 @@ package com.sun.crypto.provider; import java.util.Arrays; -import java.security.*; -import java.security.spec.*; -import javax.crypto.*; -import javax.crypto.spec.*; /** * This class acts as the base class for AES KeyWrap algorithms as defined @@ -58,7 +54,7 @@ static final int W(byte[] icvIn, byte[] in, int inLen, ("Invalid data length for W: " + inLen); assert(icvIn.length == SEMI_BLKSIZE) : "Invalid ICV buffer size"; - // overwrite the first block of in with the icv semiblock + // overwrite the first block of in with the icv semi-block System.arraycopy(icvIn, 0, in, 0, SEMI_BLKSIZE); int n = inLen / SEMI_BLKSIZE - 1; @@ -93,7 +89,7 @@ static final int W(byte[] icvIn, byte[] in, int inLen, * data until the initial value and padding bytes are verified. * @param in input bytes, i.e. the to-be-processed data * @param inLen length of the to-be-processed bytes - * @param ivOut buffer for holding the recovered ICV semiblock + * @param ivOut buffer for holding the recovered ICV semi-block * @param cipher the initialized cipher object used * @return the recovered data length, i.e. {@code (inLen - icvOut.length)} */ diff --git a/src/java.base/share/classes/com/sun/crypto/provider/KeyProtector.java b/src/java.base/share/classes/com/sun/crypto/provider/KeyProtector.java index eadc032b36ac6..f2d3efd685c06 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/KeyProtector.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/KeyProtector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -98,7 +98,7 @@ final class KeyProtector { iterationCount > MAX_ITERATION_COUNT) { iterationCount = DEFAULT_ITERATION_COUNT; } - } catch (NumberFormatException e) {} + } catch (NumberFormatException ignored) {} } ITERATION_COUNT = iterationCount; } @@ -369,7 +369,7 @@ Key unseal(SealedObject so, int maxLength) sKey = new PBEKey(pbeKeySpec, "PBEWithMD5AndTripleDES"); pbeKeySpec.clearPassword(); - SealedObjectForKeyProtector soForKeyProtector = null; + SealedObjectForKeyProtector soForKeyProtector; if (!(so instanceof SealedObjectForKeyProtector)) { soForKeyProtector = new SealedObjectForKeyProtector(so); } else { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java index dfd2ec2b04bb5..fb69a27c62d51 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -285,7 +285,7 @@ protected int engineGetOutputSize(int inLen) { padLen = SEMI_BLKSIZE - n; } } - // then add the first semiblock and padLen to result + // then add the first semi-block and padLen to result result = Math.addExact(result, SEMI_BLKSIZE + padLen); } else { result = inLen - SEMI_BLKSIZE; @@ -339,7 +339,7 @@ private void implInit(int opmode, Key key, byte[] iv, SecureRandom random) protected void engineInit(int opmode, Key key, SecureRandom random) throws InvalidKeyException { try { - implInit(opmode, key, (byte[])null, random); + implInit(opmode, key, null, random); } catch (InvalidAlgorithmParameterException iae) { // should never happen throw new AssertionError(iae); @@ -394,9 +394,9 @@ protected void engineInit(int opmode, Key key, AlgorithmParameters params, byte[] iv = null; if (params != null) { try { - AlgorithmParameterSpec spec = + IvParameterSpec spec = params.getParameterSpec(IvParameterSpec.class); - iv = ((IvParameterSpec)spec).getIV(); + iv = spec.getIV(); } catch (InvalidParameterSpecException ispe) { throw new InvalidAlgorithmParameterException( "Only IvParameterSpec is accepted"); @@ -462,7 +462,7 @@ private void implUpdate(byte[] in, int inOfs, int inLen) { if (inLen <= 0) return; if (opmode == Cipher.ENCRYPT_MODE && dataIdx == 0) { - // the first semiblock is for iv, store data after it + // the first semi-block is for iv, store data after it dataIdx = SEMI_BLKSIZE; } store(in, inOfs, inLen); @@ -595,8 +595,8 @@ private int implDoFinal(byte[] in, int inOfs, int inLen, byte[] out) } // helper routine for in-place encryption. - // 'inBuf' = semiblock | plain text | extra bytes if padding is used - // 'inLen' = semiblock length + plain text length + // 'inBuf' = semi-block | plain text | extra bytes if padding is used + // 'inLen' = semi-block length + plain text length private int helperEncrypt(byte[] inBuf, int inLen) throws IllegalBlockSizeException, ShortBufferException { @@ -646,7 +646,7 @@ private int helperDecrypt(byte[] inBuf, int inLen) */ @Override protected AlgorithmParameters engineGetParameters() { - AlgorithmParameters params = null; + AlgorithmParameters params; byte[] iv = cipher.getIV(); if (iv == null) { @@ -711,7 +711,7 @@ protected byte[] engineWrap(Key key) // output size is known, allocate output buffer byte[] out = new byte[engineGetOutputSize(encoded.length)]; - // reserve the first semiblock and do not write data + // reserve the first semi-block and do not write data int len = SEMI_BLKSIZE; System.arraycopy(encoded, 0, out, len, encoded.length); len += encoded.length; diff --git a/src/java.base/share/classes/com/sun/crypto/provider/OAEPParameters.java b/src/java.base/share/classes/com/sun/crypto/provider/OAEPParameters.java index 9d72472889357..3b826aa38f283 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/OAEPParameters.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/OAEPParameters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -225,11 +225,9 @@ protected byte[] engineGetEncoded(String encodingMethod) } protected String engineToString() { - StringBuilder sb = new StringBuilder(); - sb.append("MD: " + mdName + "\n"); - sb.append("MGF: MGF1" + mgfSpec.getDigestAlgorithm() + "\n"); - sb.append("PSource: PSpecified " + - (p.length==0? "":Debug.toHexString(new BigInteger(p))) + "\n"); - return sb.toString(); + return "MD: " + mdName + "\n" + + "MGF: MGF1" + mgfSpec.getDigestAlgorithm() + "\n" + + "PSource: PSpecified " + + (p.length == 0 ? "" : Debug.toHexString(new BigInteger(p))) + "\n"; } } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/OutputFeedback.java b/src/java.base/share/classes/com/sun/crypto/provider/OutputFeedback.java index aa56144f09052..414659fcf3d40 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/OutputFeedback.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/OutputFeedback.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,7 +53,7 @@ final class OutputFeedback extends FeedbackCipher { private final byte[] register; /* - * number of bytes for each stream unit, defaults to the blocksize + * number of bytes for each stream unit, defaults to the block size * of the embedded cipher */ private final int numBytes; diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBEKeyFactory.java b/src/java.base/share/classes/com/sun/crypto/provider/PBEKeyFactory.java index 02451e536c677..da73d0bc7ce95 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PBEKeyFactory.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBEKeyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -261,7 +261,7 @@ protected SecretKey engineGenerateSecret(KeySpec keySpec) */ protected KeySpec engineGetKeySpec(SecretKey key, Class<?> keySpecCl) throws InvalidKeySpecException { - if ((key instanceof SecretKey) + if ((key != null) && (validTypes.contains(key.getAlgorithm().toUpperCase(Locale.ENGLISH))) && (key.getFormat().equalsIgnoreCase("RAW"))) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java b/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java index 68b1771d7d967..e10b0b1a7cfb5 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -161,7 +161,7 @@ byte[] getIV() { * does not use any parameters. */ AlgorithmParameters getParameters() { - AlgorithmParameters params = null; + AlgorithmParameters params; if (salt == null) { salt = new byte[8]; SunJCE.getRandom().nextBytes(salt); @@ -303,7 +303,7 @@ private byte[] deriveCipherKey(byte[] passwdBytes) { // Concatenate the output from each digest round with the // password, and use the result as the input to the next digest // operation. - byte[] toBeHashed = null; + byte[] toBeHashed; result = new byte[DESedeKeySpec.DES_EDE_KEY_LEN + DESConstants.DES_BLOCK_SIZE]; for (i = 0; i < 2; i++) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java b/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java index fb3dfa00148e0..d6b7d00d360df 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -131,8 +131,8 @@ abstract class PBES2Parameters extends AlgorithmParametersSpi { PBES2Parameters(String pbes2AlgorithmName) throws NoSuchAlgorithmException { int and; - String kdfAlgo = null; - String cipherAlgo = null; + String kdfAlgo; + String cipherAlgo; // Extract the KDF and encryption algorithm names this.pbes2AlgorithmName = pbes2AlgorithmName; @@ -210,9 +210,6 @@ protected void engineInit(AlgorithmParameterSpec paramSpec) protected void engineInit(byte[] encoded) throws IOException { - String kdfAlgo = null; - String cipherAlgo = null; - DerValue pBES2_params = new DerValue(encoded); if (pBES2_params.tag != DerValue.tag_Sequence) { throw new IOException("PBE parameter parsing error: " @@ -231,16 +228,15 @@ protected void engineInit(byte[] encoded) kdf = pBES2_params.data.getDerValue(); } - kdfAlgo = parseKDF(kdf); + String kdfAlgo = parseKDF(kdf); if (pBES2_params.tag != DerValue.tag_Sequence) { throw new IOException("PBE parameter parsing error: " + "not an ASN.1 SEQUENCE tag"); } - cipherAlgo = parseES(pBES2_params.data.getDerValue()); + String cipherAlgo = parseES(pBES2_params.data.getDerValue()); - this.pbes2AlgorithmName = new StringBuilder().append("PBEWith") - .append(kdfAlgo).append("And").append(cipherAlgo).toString(); + this.pbes2AlgorithmName = "PBEWith" + kdfAlgo + "And" + cipherAlgo; } @SuppressWarnings("deprecation") @@ -305,7 +301,7 @@ private String parseKDF(DerValue keyDerivationFunc) throws IOException { @SuppressWarnings("deprecation") private String parseES(DerValue encryptionScheme) throws IOException { - String cipherAlgo = null; + String cipherAlgo; cipherAlgo_OID = encryptionScheme.data.getOID(); if (aes128CBC_OID.equals(cipherAlgo_OID)) { @@ -399,7 +395,7 @@ protected byte[] engineGetEncoded(String encodingMethod) /* * Returns a formatted string describing the parameters. * - * The algorithn name pattern is: "PBEWith<prf>And<encryption>" + * The algorithm name pattern is: "PBEWith<prf>And<encryption>" * where <prf> is one of: HmacSHA1, HmacSHA224, HmacSHA256, HmacSHA384, * HmacSHA512, HmacSHA512/224, or HmacSHA512/256 and <encryption> is * AES with a keysize suffix. diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java b/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java index a02ce2d15511a..c8b9c392a4b49 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,26 +25,29 @@ package com.sun.crypto.provider; -import java.io.*; -import java.lang.ref.Reference; +import java.io.IOException; +import java.io.InvalidObjectException; +import java.io.ObjectInputStream; +import java.io.ObjectStreamException; import java.lang.ref.Cleaner; +import java.lang.ref.Reference; import java.nio.ByteBuffer; import java.nio.CharBuffer; -import java.util.Arrays; -import java.util.Locale; -import java.security.MessageDigest; -import java.security.KeyRep; import java.security.GeneralSecurityException; +import java.security.KeyRep; +import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; +import java.util.Arrays; +import java.util.Locale; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.PBEKeySpec; -import static java.nio.charset.StandardCharsets.UTF_8; - import jdk.internal.ref.CleanerFactory; +import static java.nio.charset.StandardCharsets.UTF_8; + /** * This class represents a PBE key derived using PBKDF2 defined * in PKCS#5 v2.0. meaning that diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Core.java b/src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Core.java index 56059a89264a7..146999e35ce7d 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Core.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Core.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ abstract class PBMAC1Core extends HmacCore { } private static PBKDF2Core getKDFImpl(String algo) { - PBKDF2Core kdf = null; + PBKDF2Core kdf; switch(algo) { case "HmacSHA1": kdf = new PBKDF2Core.HmacSHA1(); diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PKCS5Padding.java b/src/java.base/share/classes/com/sun/crypto/provider/PKCS5Padding.java index af072c6f5d708..a8ba711d658c3 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PKCS5Padding.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PKCS5Padding.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -120,7 +120,6 @@ public int unpad(byte[] in, int off, int len) { * @return the length of the padding */ public int padLength(int len) { - int paddingOctet = blockSize - (len % blockSize); - return paddingOctet; + return blockSize - (len % blockSize); } } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/Poly1305.java b/src/java.base/share/classes/com/sun/crypto/provider/Poly1305.java index 1752bb8ddddfd..1473cf4aba147 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/Poly1305.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/Poly1305.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.crypto.provider; import java.nio.ByteBuffer; -import java.security.Key; import java.security.InvalidKeyException; +import java.security.Key; import java.security.spec.AlgorithmParameterSpec; import java.util.Arrays; import java.util.Objects; -import sun.security.util.math.*; -import sun.security.util.math.intpoly.*; -import jdk.internal.vm.annotation.IntrinsicCandidate; import jdk.internal.vm.annotation.ForceInline; +import jdk.internal.vm.annotation.IntrinsicCandidate; +import sun.security.util.math.IntegerFieldModuloP; +import sun.security.util.math.IntegerModuloP; +import sun.security.util.math.MutableIntegerModuloP; +import sun.security.util.math.intpoly.IntegerPolynomial1305; /** * This class represents the Poly1305 function defined in RFC 7539. diff --git a/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java b/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java index aa3100c1b7d10..78f25f33b2df8 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,7 +108,7 @@ void initEffectiveKeyBits(int effectiveKeyBits) { static void checkKey(String algorithm, int keyLength) throws InvalidKeyException { - if (algorithm.equals("RC2") == false) { + if (!algorithm.equals("RC2")) { throw new InvalidKeyException("Key algorithm must be RC2"); } if ((keyLength < 5) || (keyLength > 128)) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/RSACipher.java b/src/java.base/share/classes/com/sun/crypto/provider/RSACipher.java index df76f78bfb5e0..b48917e755713 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/RSACipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/RSACipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,7 @@ import java.security.spec.AlgorithmParameterSpec; import java.security.spec.InvalidParameterSpecException; import java.security.spec.MGF1ParameterSpec; +import java.util.Objects; import javax.crypto.*; import javax.crypto.spec.PSource; @@ -126,7 +127,7 @@ public RSACipher() { // modes do not make sense for RSA, but allow ECB // see JCE spec protected void engineSetMode(String mode) throws NoSuchAlgorithmException { - if (mode.equalsIgnoreCase("ECB") == false) { + if (!mode.equalsIgnoreCase("ECB")) { throw new NoSuchAlgorithmException("Unsupported mode " + mode); } } @@ -468,7 +469,7 @@ protected Key engineUnwrap(byte[] wrappedKey, String algorithm, boolean isTlsRsaPremasterSecret = algorithm.equals("TlsRsaPremasterSecret"); - byte[] encoded = null; + byte[] encoded; update(wrappedKey, 0, wrappedKey.length); try { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/SslMacCore.java b/src/java.base/share/classes/com/sun/crypto/provider/SslMacCore.java index 057c139b5945c..0d25c0064c4f1 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/SslMacCore.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/SslMacCore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,11 +26,10 @@ package com.sun.crypto.provider; import java.nio.ByteBuffer; - -import javax.crypto.MacSpi; -import javax.crypto.SecretKey; import java.security.*; import java.security.spec.AlgorithmParameterSpec; +import javax.crypto.MacSpi; +import javax.crypto.SecretKey; import static com.sun.crypto.provider.TlsPrfGenerator.genPad; @@ -109,7 +108,7 @@ void init(Key key, AlgorithmParameterSpec params) * @param input the input byte to be processed. */ void update(byte input) { - if (first == true) { + if (first) { // compute digest for 1st pass; start with inner pad md.update(secret); md.update(pad1); @@ -128,8 +127,8 @@ void update(byte input) { * @param offset the offset in <code>input</code> where the input starts. * @param len the number of bytes to process. */ - void update(byte input[], int offset, int len) { - if (first == true) { + void update(byte[] input, int offset, int len) { + if (first) { // compute digest for 1st pass; start with inner pad md.update(secret); md.update(pad1); @@ -141,7 +140,7 @@ void update(byte input[], int offset, int len) { } void update(ByteBuffer input) { - if (first == true) { + if (first) { // compute digest for 1st pass; start with inner pad md.update(secret); md.update(pad1); @@ -158,7 +157,7 @@ void update(ByteBuffer input) { * @return the Mac result. */ byte[] doFinal() { - if (first == true) { + if (first) { // compute digest for 1st pass; start with inner pad md.update(secret); md.update(pad1); @@ -189,7 +188,7 @@ byte[] doFinal() { * Mac was initialized with. */ void reset() { - if (first == false) { + if (!first) { md.reset(); first = true; } @@ -211,7 +210,7 @@ protected void engineInit(Key key, AlgorithmParameterSpec params) protected void engineUpdate(byte input) { core.update(input); } - protected void engineUpdate(byte input[], int offset, int len) { + protected void engineUpdate(byte[] input, int offset, int len) { core.update(input, offset, len); } protected void engineUpdate(ByteBuffer input) { @@ -244,7 +243,7 @@ protected void engineInit(Key key, AlgorithmParameterSpec params) protected void engineUpdate(byte input) { core.update(input); } - protected void engineUpdate(byte input[], int offset, int len) { + protected void engineUpdate(byte[] input, int offset, int len) { core.update(input, offset, len); } protected void engineUpdate(ByteBuffer input) { diff --git a/src/java.base/share/classes/com/sun/crypto/provider/TlsKeyMaterialGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/TlsKeyMaterialGenerator.java index 56e4dd976632a..2440b45a2ae60 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/TlsKeyMaterialGenerator.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/TlsKeyMaterialGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,11 +62,11 @@ protected void engineInit(SecureRandom random) { @SuppressWarnings("deprecation") protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { - if (params instanceof TlsKeyMaterialParameterSpec == false) { + if (!(params instanceof TlsKeyMaterialParameterSpec)) { throw new InvalidAlgorithmParameterException(MSG); } this.spec = (TlsKeyMaterialParameterSpec)params; - if ("RAW".equals(spec.getMasterSecret().getFormat()) == false) { + if (!"RAW".equals(spec.getMasterSecret().getFormat())) { throw new InvalidAlgorithmParameterException( "Key format must be RAW"); } @@ -105,8 +105,6 @@ private SecretKey engineGenerateKey0(byte[] masterSecret) throws GeneralSecurity SecretKey clientMacKey = null; SecretKey serverMacKey = null; - SecretKey clientCipherKey = null; - SecretKey serverCipherKey = null; IvParameterSpec clientIv = null; IvParameterSpec serverIv = null; @@ -194,8 +192,10 @@ private SecretKey engineGenerateKey0(byte[] masterSecret) throws GeneralSecurity System.arraycopy(keyBlock, ofs, serverKeyBytes, 0, keyLength); ofs += keyLength; + SecretKey clientCipherKey; + SecretKey serverCipherKey; try { - if (isExportable == false) { + if (!isExportable) { // cipher keys clientCipherKey = new SecretKeySpec(clientKeyBytes, alg); serverCipherKey = new SecretKeySpec(serverKeyBytes, alg); diff --git a/src/java.base/share/classes/com/sun/crypto/provider/TlsPrfGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/TlsPrfGenerator.java index 1102f4b94ee1a..f8f733b6d2f74 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/TlsPrfGenerator.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/TlsPrfGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -132,12 +132,12 @@ protected void engineInit(SecureRandom random) { @SuppressWarnings("deprecation") protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { - if (params instanceof TlsPrfParameterSpec == false) { + if (!(params instanceof TlsPrfParameterSpec)) { throw new InvalidAlgorithmParameterException(MSG); } this.spec = (TlsPrfParameterSpec)params; SecretKey key = spec.getSecret(); - if ((key != null) && ("RAW".equals(key.getFormat()) == false)) { + if ((key != null) && (!"RAW".equals(key.getFormat()))) { throw new InvalidAlgorithmParameterException( "Key encoding format must be RAW"); } @@ -378,7 +378,7 @@ private static void expand(MessageDigest digest, int hmacSize, * TLS 1.2 uses a different hash algorithm than 1.0/1.1 for the PRF * calculations. As of 2010, there is no PKCS11-level support for TLS * 1.2 PRF calculations, and no known OS's have an internal variant - * we could use. Therefore for TLS 1.2, we are updating JSSE to request + * we could use. Therefore, for TLS 1.2, we are updating JSSE to request * a different provider algorithm: "SunTls12Prf". If we reused the * name "SunTlsPrf", the PKCS11 provider would need be updated to * fail correctly when presented with the wrong version number From dcf4e0d51f392afe2711223484e932e3826e8864 Mon Sep 17 00:00:00 2001 From: Jaikiran Pai <jpai@openjdk.org> Date: Wed, 10 Jul 2024 03:30:19 +0000 Subject: [PATCH 346/471] 8335966: Remove incorrect problem listing of java/lang/instrument/NativeMethodPrefixAgent.java in ProblemList-Virtual.txt Reviewed-by: kevinw, amenkov --- test/jdk/ProblemList-Virtual.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/jdk/ProblemList-Virtual.txt b/test/jdk/ProblemList-Virtual.txt index c45353e65edb7..d7692b578cd04 100644 --- a/test/jdk/ProblemList-Virtual.txt +++ b/test/jdk/ProblemList-Virtual.txt @@ -36,8 +36,6 @@ javax/management/remote/mandatory/loading/MissingClassTest.java 8145413 windows- javax/management/remote/mandatory/loading/RMIDownloadTest.java 8308366 windows-x64 -java/lang/instrument/NativeMethodPrefixAgent.java 8307169 generic-all - java/lang/ScopedValue/StressStackOverflow.java#default 8309646 generic-all java/lang/ScopedValue/StressStackOverflow.java#no-TieredCompilation 8309646 generic-all java/lang/ScopedValue/StressStackOverflow.java#TieredStopAtLevel1 8309646 generic-all From b5909cabeef22954f4d9c642b1cbf288b3454562 Mon Sep 17 00:00:00 2001 From: Koichi Sakata <ksakata@openjdk.org> Date: Wed, 10 Jul 2024 05:57:11 +0000 Subject: [PATCH 347/471] 8323242: Remove vestigial DONT_USE_REGISTER_DEFINES Reviewed-by: gli, kvn --- src/hotspot/cpu/zero/register_zero.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/hotspot/cpu/zero/register_zero.hpp b/src/hotspot/cpu/zero/register_zero.hpp index 1b6f52879ef16..fd30f2067623c 100644 --- a/src/hotspot/cpu/zero/register_zero.hpp +++ b/src/hotspot/cpu/zero/register_zero.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright 2007 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -114,8 +114,6 @@ class ConcreteRegisterImpl : public AbstractRegisterImpl { }; CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1)); -#ifndef DONT_USE_REGISTER_DEFINES #define noreg ((Register)(noreg_RegisterEnumValue)) -#endif #endif // CPU_ZERO_REGISTER_ZERO_HPP From a44b60c8c14ad998e51239f48e64779304aaac50 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Wed, 10 Jul 2024 07:53:52 +0000 Subject: [PATCH 348/471] 8335778: runtime/ClassInitErrors/TestStackOverflowDuringInit.java fails on ppc64 platforms after JDK-8334545 Reviewed-by: dholmes, asteiner --- .../runtime/ClassInitErrors/TestStackOverflowDuringInit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java b/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java index 3917abe85ad57..180dc539795fa 100644 --- a/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java +++ b/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java @@ -31,7 +31,7 @@ * @requires vm.flagless * @comment Run with the smallest stack possible to limit the execution time. * This is the smallest stack that is supported by all platforms. - * @run main/othervm -Xss240K -Xint TestStackOverflowDuringInit + * @run main/othervm -Xss384K -Xint TestStackOverflowDuringInit */ import java.io.ByteArrayOutputStream; From 537d20afbff255489a7b1bdb0410b9d1aba715b7 Mon Sep 17 00:00:00 2001 From: Jan Lahoda <jlahoda@openjdk.org> Date: Wed, 10 Jul 2024 09:55:56 +0000 Subject: [PATCH 349/471] 8335766: Switch case with pattern matching and guard clause compiles inconsistently Reviewed-by: abimpoudis --- .../com/sun/tools/javac/parser/JavacParser.java | 10 +++++++++- .../tools/javac/patterns/DisambiguatePatterns.java | 6 +++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index ef2d71831dc59..f570ad54c58e8 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -3436,7 +3436,15 @@ PatternResult analyzePattern(int lookahead) { : PatternResult.PATTERN; } parenDepth++; break; - case RPAREN: parenDepth--; break; + case RPAREN: + parenDepth--; + if (parenDepth == 0 && + typeDepth == 0 && + peekToken(lookahead, TokenKind.IDENTIFIER) && + S.token(lookahead + 1).name() == names.when) { + return PatternResult.PATTERN; + } + break; case ARROW: return parenDepth > 0 ? PatternResult.EXPRESSION : pendingResult; case FINAL: diff --git a/test/langtools/tools/javac/patterns/DisambiguatePatterns.java b/test/langtools/tools/javac/patterns/DisambiguatePatterns.java index ef4d065f91295..d6180c1810f90 100644 --- a/test/langtools/tools/javac/patterns/DisambiguatePatterns.java +++ b/test/langtools/tools/javac/patterns/DisambiguatePatterns.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -109,6 +109,10 @@ public static void main(String... args) throws Throwable { ExpressionType.EXPRESSION); test.disambiguationTest("a & b", ExpressionType.EXPRESSION); + test.disambiguationTest("R r when (x > 0)", + ExpressionType.PATTERN); + test.disambiguationTest("R(int x) when (x > 0)", + ExpressionType.PATTERN); } private final ParserFactory factory; From e0fb949460d0c7e2ab1697a6466e7d4831a20a33 Mon Sep 17 00:00:00 2001 From: Erik Gahlin <egahlin@openjdk.org> Date: Wed, 10 Jul 2024 14:28:20 +0000 Subject: [PATCH 350/471] 8335779: JFR: Hide sleep events Reviewed-by: mgronlun --- .../share/jfr/support/jfrIntrinsics.hpp | 2 +- src/hotspot/share/runtime/objectMonitor.cpp | 2 +- .../share/classes/jdk/jfr/internal/JVM.java | 1 + .../classes/jdk/jfr/internal/JVMSupport.java | 4 +- .../jdk/jfr/internal/MetadataRepository.java | 4 +- .../jfr/internal/consumer/OngoingStream.java | 16 ++-- .../jfr/internal/consumer/RecordingInput.java | 7 +- .../internal/consumer/RepositoryFiles.java | 19 ++-- .../internal/{ => management}/HiddenWait.java | 12 ++- .../internal/management/StreamBarrier.java | 48 ++++++---- .../classes/jdk/jfr/internal/util/Utils.java | 23 +---- .../jdk/management/jfr/DownLoadThread.java | 14 +-- .../classes/jdk/management/jfr/FileDump.java | 52 ++++++----- test/jdk/jdk/jfr/jvm/TestHiddenWait.java | 88 +++++++++++++++++++ 14 files changed, 192 insertions(+), 100 deletions(-) rename src/jdk.jfr/share/classes/jdk/jfr/internal/{ => management}/HiddenWait.java (82%) create mode 100644 test/jdk/jdk/jfr/jvm/TestHiddenWait.java diff --git a/src/hotspot/share/jfr/support/jfrIntrinsics.hpp b/src/hotspot/share/jfr/support/jfrIntrinsics.hpp index 6520f3cb00ca0..77affc69926f0 100644 --- a/src/hotspot/share/jfr/support/jfrIntrinsics.hpp +++ b/src/hotspot/share/jfr/support/jfrIntrinsics.hpp @@ -47,7 +47,7 @@ class JfrIntrinsicSupport : AllStatic { #define JFR_HAVE_INTRINSICS #define JFR_TEMPLATES(template) \ - template(jdk_jfr_internal_HiddenWait, "jdk/jfr/internal/HiddenWait") \ + template(jdk_jfr_internal_management_HiddenWait, "jdk/jfr/internal/management/HiddenWait") \ template(jdk_jfr_internal_JVM, "jdk/jfr/internal/JVM") \ template(jdk_jfr_internal_event_EventWriterFactory, "jdk/jfr/internal/event/EventWriterFactory") \ template(jdk_jfr_internal_event_EventConfiguration_signature, "Ljdk/jfr/internal/event/EventConfiguration;") \ diff --git a/src/hotspot/share/runtime/objectMonitor.cpp b/src/hotspot/share/runtime/objectMonitor.cpp index ba463231592c5..c509ed691cdb8 100644 --- a/src/hotspot/share/runtime/objectMonitor.cpp +++ b/src/hotspot/share/runtime/objectMonitor.cpp @@ -1442,7 +1442,7 @@ bool ObjectMonitor::check_owner(TRAPS) { static inline bool is_excluded(const Klass* monitor_klass) { assert(monitor_klass != nullptr, "invariant"); NOT_JFR_RETURN_(false); - JFR_ONLY(return vmSymbols::jdk_jfr_internal_HiddenWait() == monitor_klass->name();) + JFR_ONLY(return vmSymbols::jdk_jfr_internal_management_HiddenWait() == monitor_klass->name();) } static void post_monitor_wait_event(EventJavaMonitorWait* event, diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java index 2e600c8c02974..cc0ee05a948a5 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java @@ -31,6 +31,7 @@ import jdk.jfr.Event; import jdk.jfr.internal.event.EventConfiguration; import jdk.jfr.internal.event.EventWriter; +import jdk.jfr.internal.management.HiddenWait; /** * Interface against the JVM. diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java index 114052ecea250..7fde28a3d21fc 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java @@ -30,6 +30,7 @@ import jdk.jfr.Recording; import jdk.jfr.internal.event.EventConfiguration; +import jdk.jfr.internal.management.HiddenWait; import jdk.jfr.internal.util.Utils; import jdk.jfr.internal.util.ValueFormatter; @@ -118,7 +119,8 @@ private static void awaitUniqueTimestamp() { lastTimestamp = time; return; } - Utils.takeNap(1); + HiddenWait hiddenWait = new HiddenWait(); + hiddenWait.takeNap(1); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java index 4a7bc734d7571..49afd0082d8a9 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java @@ -47,6 +47,7 @@ import jdk.jfr.ValueDescriptor; import jdk.jfr.internal.consumer.RepositoryFiles; import jdk.jfr.internal.event.EventConfiguration; +import jdk.jfr.internal.management.HiddenWait; import jdk.jfr.internal.periodic.PeriodicEvents; import jdk.jfr.internal.util.Utils; @@ -57,6 +58,7 @@ public final class MetadataRepository { private final Map<String, EventType> nativeEventTypes = LinkedHashMap.newHashMap(150); private final Map<String, EventControl> nativeControls = LinkedHashMap.newHashMap(150); private final SettingsManager settingsManager = new SettingsManager(); + private final HiddenWait threadSleeper = new HiddenWait(); private Constructor<EventConfiguration> cachedEventConfigurationConstructor; private boolean staleMetadata = true; private boolean unregistered; @@ -341,7 +343,7 @@ private void awaitEpochMilliShift() { lastMillis = millis; return; } - Utils.takeNap(1); + threadSleeper.takeNap(1); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/OngoingStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/OngoingStream.java index 1816d00f345a7..e0dd7fa2ad8d5 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/OngoingStream.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/OngoingStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,7 @@ import jdk.jfr.internal.SecuritySupport; import jdk.jfr.internal.SecuritySupport.SafePath; import jdk.jfr.internal.management.EventByteStream; +import jdk.jfr.internal.management.HiddenWait; import jdk.jfr.internal.management.ManagementSupport; public final class OngoingStream extends EventByteStream { @@ -44,6 +45,7 @@ public final class OngoingStream extends EventByteStream { private final RepositoryFiles repositoryFiles; private final Recording recording; + private final HiddenWait threadSleeper = new HiddenWait(); private final int blockSize; private final long endTimeNanos; private final byte[] headerBytes = new byte[HEADER_SIZE]; @@ -195,19 +197,13 @@ private byte[] readWithHeader(int size) throws IOException { return bytes; } } - takeNap(); + if (!threadSleeper.takeNap(10)) { + throw new IOException("Read operation interrupted"); + } } return EMPTY_ARRAY; } - private void takeNap() throws IOException { - try { - Thread.sleep(10); - } catch (InterruptedException ie) { - throw new IOException("Read operation interrupted", ie); - } - } - private boolean ensureInput() throws IOException { if (input == null) { if (SecuritySupport.getFileSize(new SafePath(path)) < HEADER_SIZE) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInput.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInput.java index 90a03130f4990..69ec73f57fd6f 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInput.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,8 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.nio.file.Path; + +import jdk.jfr.internal.management.HiddenWait; import jdk.jfr.internal.util.Utils; public final class RecordingInput implements DataInput, AutoCloseable { @@ -67,6 +69,7 @@ public void reset() { } private final int blockSize; private final FileAccess fileAccess; + private final HiddenWait threadSleeper = new HiddenWait(); private long pollCount = 1000; private RandomAccessFile file; private String filename; @@ -453,6 +456,6 @@ public void pollWait() throws IOException { if (pollCount < 0) { throw new IOException("Recording file is stuck in locked stream state."); } - Utils.takeNap(1); + threadSleeper.takeNap(1); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RepositoryFiles.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RepositoryFiles.java index 6ef88ecad3750..3f0611f998173 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RepositoryFiles.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RepositoryFiles.java @@ -46,9 +46,10 @@ import jdk.jfr.internal.Logger; import jdk.jfr.internal.Repository; import jdk.jfr.internal.SecuritySupport.SafePath; +import jdk.jfr.internal.management.HiddenWait;; public final class RepositoryFiles { - private static final Object WAIT_OBJECT = new Object(); + private static final HiddenWait WAIT_OBJECT = new HiddenWait(); private static final String DIRECTORY_PATTERN = "DDDD_DD_DD_DD_DD_DD_"; public static void notifyNewFile() { synchronized (WAIT_OBJECT) { @@ -59,7 +60,7 @@ public static void notifyNewFile() { private final FileAccess fileAccess; private final NavigableMap<Long, Path> pathSet = new TreeMap<>(); private final Map<Path, Long> pathLookup = new HashMap<>(); - private final Object waitObject; + private final HiddenWait waitObject; private boolean allowSubDirectory; private volatile boolean closed; private Path repository; @@ -67,7 +68,7 @@ public static void notifyNewFile() { public RepositoryFiles(FileAccess fileAccess, Path repository, boolean allowSubDirectory) { this.repository = repository; this.fileAccess = fileAccess; - this.waitObject = repository == null ? WAIT_OBJECT : new Object(); + this.waitObject = repository == null ? WAIT_OBJECT : new HiddenWait(); this.allowSubDirectory = allowSubDirectory; } @@ -108,7 +109,7 @@ private boolean updatePaths(boolean wait) { // was accessed. Just ignore, and retry later. } if (wait) { - nap(); + waitObject.takeNap(1000); } else { return pathLookup.size() > beforeSize; } @@ -157,16 +158,6 @@ private Path path(long timestamp, boolean wait) { } } - private void nap() { - try { - synchronized (waitObject) { - waitObject.wait(1000); - } - } catch (InterruptedException e) { - // ignore - } - } - private boolean updatePaths() throws IOException, DirectoryIteratorException { boolean foundNew = false; Path repoPath = repository; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/HiddenWait.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/HiddenWait.java similarity index 82% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/HiddenWait.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/management/HiddenWait.java index 26505990332c9..9070faad5a658 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/HiddenWait.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/HiddenWait.java @@ -22,11 +22,21 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.jfr.internal; +package jdk.jfr.internal.management; /** * The HiddenWait class is used to exclude jdk.JavaMonitorWait events * from being generated when Object.wait() is called on an object of this type. */ public final class HiddenWait { + + public synchronized boolean takeNap(long timeoutMillis) { + try { + this.wait(timeoutMillis); + return true; + } catch (InterruptedException e) { + // Ok, ignore + return false; + } + } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java index 0b3132da2178b..7f1db163b4e3d 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java @@ -39,45 +39,57 @@ * processing should not continue. */ public final class StreamBarrier implements Closeable { - + private final HiddenWait lock = new HiddenWait(); private boolean activated = false; private boolean used = false; private long end = Long.MAX_VALUE; // Blocks thread until barrier is deactivated - public synchronized void check() { - while (activated) { - try { - this.wait(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); + public void check() { + synchronized (lock) { + while (activated) { + try { + lock.wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } } } } - public synchronized void setStreamEnd(long timestamp) { - end = timestamp; + public void setStreamEnd(long timestamp) { + synchronized(lock) { + end = timestamp; + } } - public synchronized long getStreamEnd() { - return end; + public long getStreamEnd() { + synchronized(lock) { + return end; + } } - public synchronized void activate() { - activated = true; - used = true; + public void activate() { + synchronized (lock) { + activated = true; + used = true; + } } @Override public synchronized void close() throws IOException { - activated = false; - this.notifyAll(); + synchronized (lock) { + activated = false; + lock.notifyAll(); + } } /** * Returns {@code true) if barrier is, or has been, in active state, {@code false) otherwise. */ - public synchronized boolean used() { - return used; + public boolean used() { + synchronized (lock) { + return used; + } } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java index 5e04a25fe7ddf..ae83727096a2a 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java @@ -48,19 +48,19 @@ import jdk.jfr.Event; import jdk.jfr.EventType; import jdk.jfr.RecordingState; -import jdk.jfr.internal.HiddenWait; import jdk.jfr.internal.LogLevel; import jdk.jfr.internal.LogTag; import jdk.jfr.internal.Logger; import jdk.jfr.internal.MirrorEvent; import jdk.jfr.internal.SecuritySupport; import jdk.jfr.internal.Type; +import jdk.jfr.internal.management.HiddenWait; import jdk.jfr.internal.settings.PeriodSetting; import jdk.jfr.internal.settings.StackTraceSetting; import jdk.jfr.internal.settings.ThresholdSetting; public final class Utils { - private static final Object flushObject = new Object(); + private static final HiddenWait flushObject = new HiddenWait(); private static final String LEGACY_EVENT_NAME_PREFIX = "com.oracle.jdk."; /** @@ -351,17 +351,6 @@ private static boolean isSupportedType(Class<?> type) { return Type.isValidJavaFieldType(type.getName()); } - public static void takeNap(long millis) { - HiddenWait hiddenWait = new HiddenWait(); - try { - synchronized(hiddenWait) { - hiddenWait.wait(millis); - } - } catch (InterruptedException e) { - // ok - } - } - public static void notifyFlush() { synchronized (flushObject) { flushObject.notifyAll(); @@ -369,13 +358,7 @@ public static void notifyFlush() { } public static void waitFlush(long timeOut) { - synchronized (flushObject) { - try { - flushObject.wait(timeOut); - } catch (InterruptedException e) { - // OK - } - } + flushObject.takeNap(timeOut); } public static Instant epochNanosToInstant(long epochNanos) { diff --git a/src/jdk.management.jfr/share/classes/jdk/management/jfr/DownLoadThread.java b/src/jdk.management.jfr/share/classes/jdk/management/jfr/DownLoadThread.java index 5ce66692537cb..05895f0f4a99b 100644 --- a/src/jdk.management.jfr/share/classes/jdk/management/jfr/DownLoadThread.java +++ b/src/jdk.management.jfr/share/classes/jdk/management/jfr/DownLoadThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,12 +30,14 @@ import java.util.Map; import jdk.jfr.internal.management.ManagementSupport; +import jdk.jfr.internal.management.HiddenWait; final class DownLoadThread extends Thread { private final RemoteRecordingStream stream; private final Instant startTime; private final Instant endTime; private final DiskRepository diskRepository; + private final HiddenWait threadSleeper = new HiddenWait(); DownLoadThread(RemoteRecordingStream stream, String name) { super(name); @@ -64,7 +66,7 @@ public void run() { if (bytes.length != 0) { diskRepository.write(bytes); } else { - takeNap(); + threadSleeper.takeNap(1000); } } } catch (IOException ioe) { @@ -73,12 +75,4 @@ public void run() { diskRepository.complete(); } } - - private void takeNap() { - try { - Thread.sleep(1000); - } catch (InterruptedException ie) { - // ignore - } - } } diff --git a/src/jdk.management.jfr/share/classes/jdk/management/jfr/FileDump.java b/src/jdk.management.jfr/share/classes/jdk/management/jfr/FileDump.java index 7da0fe351c450..37ba296732635 100644 --- a/src/jdk.management.jfr/share/classes/jdk/management/jfr/FileDump.java +++ b/src/jdk.management.jfr/share/classes/jdk/management/jfr/FileDump.java @@ -32,8 +32,10 @@ import java.util.Deque; import jdk.management.jfr.DiskRepository.DiskChunk; +import jdk.jfr.internal.management.HiddenWait; final class FileDump { + private final HiddenWait lock = new HiddenWait(); private final Deque<DiskChunk> chunks = new ArrayDeque<>(); private final long stopTimeMillis; private boolean complete; @@ -42,45 +44,53 @@ final class FileDump { this.stopTimeMillis = stopTimeMillis; } - public synchronized void add(DiskChunk dc) { - if (isComplete()) { - return; - } - dc.acquire(); - chunks.addFirst(dc); - long endMillis = dc.endTimeNanos / 1_000_000; - if (endMillis >= stopTimeMillis) { - setComplete(); + public void add(DiskChunk dc) { + synchronized (lock) { + if (isComplete()) { + return; + } + dc.acquire(); + chunks.addFirst(dc); + long endMillis = dc.endTimeNanos / 1_000_000; + if (endMillis >= stopTimeMillis) { + setComplete(); + } } } - public synchronized boolean isComplete() { - return complete; + public boolean isComplete() { + synchronized (lock) { + return complete; + } } - public synchronized void setComplete() { - complete = true; - this.notifyAll(); + public void setComplete() { + synchronized (lock) { + complete = true; + lock.notifyAll(); + } } - public synchronized void close() { - for (DiskChunk dc : chunks) { - dc.release(); + public void close() { + synchronized (lock) { + for (DiskChunk dc : chunks) { + dc.release(); + } + chunks.clear(); + complete = true; } - chunks.clear(); - complete = true; } private DiskChunk oldestChunk() throws InterruptedException { while (true) { - synchronized (this) { + synchronized (lock) { if (!chunks.isEmpty()) { return chunks.pollLast(); } if (complete) { return null; } - this.wait(); + lock.wait(); } } } diff --git a/test/jdk/jdk/jfr/jvm/TestHiddenWait.java b/test/jdk/jdk/jfr/jvm/TestHiddenWait.java new file mode 100644 index 0000000000000..f4b810f192e48 --- /dev/null +++ b/test/jdk/jdk/jfr/jvm/TestHiddenWait.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.jvm; + +import java.nio.file.Path; +import java.time.Duration; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; + +import jdk.jfr.Recording; +import jdk.jfr.Name; +import jdk.jfr.Event; +import jdk.jfr.FlightRecorder; +import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordingStream; +import jdk.test.lib.jfr.Events; + +/** + * @test TestHiddenWait + * @key jfr + * @summary Checks that JFR code don't emit noise in the form of ThreadSleep and JavaMonitorWait events. + * @requires vm.hasJFR + * @library /test/lib + * @run main/othervm jdk.jfr.jvm.TestHiddenWait + */ +public class TestHiddenWait { + static final String PERIODIC_EVENT_NAME = "test.Periodic"; + + @Name(PERIODIC_EVENT_NAME) + public static class PeriodicEvent extends Event { + } + + public static void main(String... args) throws Exception { + FlightRecorder.addPeriodicEvent(PeriodicEvent.class, () -> { + PeriodicEvent event = new PeriodicEvent(); + event.commit(); + }); + try (Recording r = new Recording()) { + AtomicLong counter = new AtomicLong(); + r.enable("jdk.ThreadSleep").withoutThreshold(); + r.enable("jdk.JavaMonitorWait").withoutThreshold(); + r.enable(PERIODIC_EVENT_NAME).withPeriod(Duration.ofMillis(100)); + r.start(); + // Triggers Object.wait() in stream barrier + try (RecordingStream b = new RecordingStream()) { + b.startAsync(); + b.stop(); + } + // Wait for for periodic events + try (RecordingStream s = new RecordingStream()) { + s.onEvent(PERIODIC_EVENT_NAME, e -> { + if (counter.incrementAndGet() >= 2) { + s.close(); + } + }); + s.start(); + } + List<RecordedEvent> events = Events.fromRecording(r); + for (RecordedEvent event : events) { + if (!event.getEventType().getName().equals(PERIODIC_EVENT_NAME)) { + System.out.println(event); + throw new Exception("Didn't expect ThreadSleep or JavaMonitorWait events"); + } + } + } + } +} From e6c5aa7a6cb54c647d261facdcffa6a410849627 Mon Sep 17 00:00:00 2001 From: Christian Stein <cstein@openjdk.org> Date: Wed, 10 Jul 2024 15:12:49 +0000 Subject: [PATCH 351/471] 8336012: Fix usages of jtreg-reserved properties Reviewed-by: jjg --- test/jdk/java/lang/invoke/PrivateInvokeTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/jdk/java/lang/invoke/PrivateInvokeTest.java b/test/jdk/java/lang/invoke/PrivateInvokeTest.java index 12edf8e326316..8ae78d96713c6 100644 --- a/test/jdk/java/lang/invoke/PrivateInvokeTest.java +++ b/test/jdk/java/lang/invoke/PrivateInvokeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,8 +67,6 @@ public class PrivateInvokeTest { String vstr = System.getProperty(THIS_CLASS.getSimpleName()+".verbose"); if (vstr == null) vstr = System.getProperty(THIS_CLASS.getName()+".verbose"); - if (vstr == null) - vstr = System.getProperty("test.verbose"); if (vstr != null) verbose = Integer.parseInt(vstr); } private static int referenceKind(Method m) { From fb9a227e02ebf826edb762283e15dd7e402f8433 Mon Sep 17 00:00:00 2001 From: Doug Simon <dnsimon@openjdk.org> Date: Wed, 10 Jul 2024 15:34:27 +0000 Subject: [PATCH 352/471] 8313909: [JVMCI] assert(cp->tag_at(index).is_unresolved_klass()) in lookupKlassInPool Reviewed-by: yzheng, never --- src/hotspot/share/jvmci/jvmciCompilerToVM.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp index d92d193017362..68168c56b9aac 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp @@ -897,7 +897,9 @@ C2V_VMENTRY_NULL(jobject, lookupKlassInPool, (JNIEnv* env, jobject, ARGUMENT_PAI } else if (tag.is_symbol()) { symbol = cp->symbol_at(index); } else { - assert(cp->tag_at(index).is_unresolved_klass(), "wrong tag"); + if (!tag.is_unresolved_klass()) { + JVMCI_THROW_MSG_NULL(InternalError, err_msg("Expected %d at index %d, got %d", JVM_CONSTANT_UnresolvedClassInError, index, tag.value())); + } symbol = cp->klass_name_at(index); } } From fb66716a1bc914db194c5b0b833cc2317704f166 Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas <aboldtch@openjdk.org> Date: Wed, 10 Jul 2024 16:12:40 +0000 Subject: [PATCH 353/471] 8331725: ubsan: pc may not always be the entry point for a VtableStub Reviewed-by: kvn, mbaesken --- src/hotspot/share/code/vtableStubs.cpp | 24 ++++++++++++++++++++---- src/hotspot/share/code/vtableStubs.hpp | 23 +++++++++++++---------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/hotspot/share/code/vtableStubs.cpp b/src/hotspot/share/code/vtableStubs.cpp index 5a54426d6a420..a65852e247fae 100644 --- a/src/hotspot/share/code/vtableStubs.cpp +++ b/src/hotspot/share/code/vtableStubs.cpp @@ -255,6 +255,19 @@ inline uint VtableStubs::hash(bool is_vtable_stub, int vtable_index){ } +inline uint VtableStubs::unsafe_hash(address entry_point) { + // The entrypoint may or may not be a VtableStub. Generate a hash as if it was. + address vtable_stub_addr = entry_point - VtableStub::entry_offset(); + assert(CodeCache::contains(vtable_stub_addr), "assumed to always be the case"); + address vtable_type_addr = vtable_stub_addr + offset_of(VtableStub, _type); + address vtable_index_addr = vtable_stub_addr + offset_of(VtableStub, _index); + bool is_vtable_stub = *vtable_type_addr == static_cast<uint8_t>(VtableStub::Type::vtable_stub); + int vtable_index; + memcpy(&vtable_index, vtable_index_addr, sizeof(vtable_index)); + return hash(is_vtable_stub, vtable_index); +} + + VtableStub* VtableStubs::lookup(bool is_vtable_stub, int vtable_index) { assert_lock_strong(VtableStubs_lock); unsigned hash = VtableStubs::hash(is_vtable_stub, vtable_index); @@ -275,12 +288,15 @@ void VtableStubs::enter(bool is_vtable_stub, int vtable_index, VtableStub* s) { } VtableStub* VtableStubs::entry_point(address pc) { + // The pc may or may not be the entry point for a VtableStub. Use unsafe_hash + // to generate the hash that would have been used if it was. The lookup in the + // _table will only succeed if there is a VtableStub with an entry point at + // the pc. MutexLocker ml(VtableStubs_lock, Mutex::_no_safepoint_check_flag); - VtableStub* stub = (VtableStub*)(pc - VtableStub::entry_offset()); - uint hash = VtableStubs::hash(stub->is_vtable_stub(), stub->index()); + uint hash = VtableStubs::unsafe_hash(pc); VtableStub* s; - for (s = Atomic::load(&_table[hash]); s != nullptr && s != stub; s = s->next()) {} - return (s == stub) ? s : nullptr; + for (s = Atomic::load(&_table[hash]); s != nullptr && s->entry_point() != pc; s = s->next()) {} + return (s != nullptr && s->entry_point() == pc) ? s : nullptr; } bool VtableStubs::contains(address pc) { diff --git a/src/hotspot/share/code/vtableStubs.hpp b/src/hotspot/share/code/vtableStubs.hpp index 426753ef00813..06acd8f25b921 100644 --- a/src/hotspot/share/code/vtableStubs.hpp +++ b/src/hotspot/share/code/vtableStubs.hpp @@ -28,7 +28,6 @@ #include "asm/macroAssembler.hpp" #include "code/vmreg.hpp" #include "memory/allStatic.hpp" -#include "sanitizers/ub.hpp" #include "utilities/checkedCast.hpp" // A VtableStub holds an individual code stub for a pair (vtable index, #args) for either itables or vtables @@ -94,6 +93,7 @@ class VtableStubs : AllStatic { static VtableStub* lookup (bool is_vtable_stub, int vtable_index); static void enter (bool is_vtable_stub, int vtable_index, VtableStub* s); static inline uint hash (bool is_vtable_stub, int vtable_index); + static inline uint unsafe_hash (address entry_point); static address find_stub (bool is_vtable_stub, int vtable_index); static void bookkeeping(MacroAssembler* masm, outputStream* out, VtableStub* s, address npe_addr, address ame_addr, bool is_vtable_stub, @@ -119,6 +119,12 @@ class VtableStub { private: friend class VtableStubs; + enum class Type : uint8_t { + itable_stub, + vtable_stub, + }; + + static address _chunk; // For allocation static address _chunk_end; // For allocation static VMReg _receiver_location; // Where to find receiver @@ -127,14 +133,14 @@ class VtableStub { const short _index; // vtable index short _ame_offset; // Where an AbstractMethodError might occur short _npe_offset; // Where a NullPointerException might occur - bool _is_vtable_stub; // True if vtable stub, false, is itable stub + Type _type; // Type, either vtable stub or itable stub /* code follows here */ // The vtableStub code void* operator new(size_t size, int code_size) throw(); VtableStub(bool is_vtable_stub, short index) : _next(nullptr), _index(index), _ame_offset(-1), _npe_offset(-1), - _is_vtable_stub(is_vtable_stub) {} + _type(is_vtable_stub ? Type::vtable_stub : Type::itable_stub) {} VtableStub* next() const { return _next; } int index() const { return _index; } static VMReg receiver_location() { return _receiver_location; } @@ -142,12 +148,12 @@ class VtableStub { public: address code_begin() const { return (address)(this + 1); } - address code_end() const { return code_begin() + VtableStubs::code_size_limit(_is_vtable_stub); } + address code_end() const { return code_begin() + VtableStubs::code_size_limit(is_vtable_stub()); } address entry_point() const { return code_begin(); } static int entry_offset() { return sizeof(class VtableStub); } bool matches(bool is_vtable_stub, int index) const { - return _index == index && _is_vtable_stub == is_vtable_stub; + return _index == index && this->is_vtable_stub() == is_vtable_stub; } bool contains(address pc) const { return code_begin() <= pc && pc < code_end(); } @@ -173,11 +179,8 @@ class VtableStub { public: // Query - bool is_itable_stub() { return !_is_vtable_stub; } - // We reinterpret arbitrary memory as VtableStub. This does not cause failures because the lookup/equality - // check will reject false objects. Disabling UBSan is a temporary workaround until JDK-8331725 is fixed. - ATTRIBUTE_NO_UBSAN - bool is_vtable_stub() { return _is_vtable_stub; } + bool is_itable_stub() const { return _type == Type::itable_stub; } + bool is_vtable_stub() const { return _type == Type::vtable_stub; } bool is_abstract_method_error(address epc) { return epc == code_begin()+_ame_offset; } bool is_null_pointer_exception(address epc) { return epc == code_begin()+_npe_offset; } From 7ab96c74e2c39f430a5c2f65a981da7314a2385b Mon Sep 17 00:00:00 2001 From: Patricio Chilano Mateo <pchilanomate@openjdk.org> Date: Wed, 10 Jul 2024 16:26:16 +0000 Subject: [PATCH 354/471] 8335409: Can't allocate and retain memory from resource area in frame::oops_interpreted_do oop closure after 8329665 Reviewed-by: dholmes, stuefe, coleenp, shade --- src/hotspot/share/interpreter/oopMapCache.cpp | 60 ++++++++----------- src/hotspot/share/interpreter/oopMapCache.hpp | 23 ++++--- src/hotspot/share/runtime/frame.cpp | 1 - 3 files changed, 35 insertions(+), 49 deletions(-) diff --git a/src/hotspot/share/interpreter/oopMapCache.cpp b/src/hotspot/share/interpreter/oopMapCache.cpp index a10f8c439eaa4..87b124e9d7968 100644 --- a/src/hotspot/share/interpreter/oopMapCache.cpp +++ b/src/hotspot/share/interpreter/oopMapCache.cpp @@ -66,9 +66,6 @@ class OopMapCacheEntry: private InterpreterOopMap { public: OopMapCacheEntry() : InterpreterOopMap() { _next = nullptr; -#ifdef ASSERT - _resource_allocate_bit_mask = false; -#endif } }; @@ -177,9 +174,13 @@ class VerifyClosure : public OffsetClosure { InterpreterOopMap::InterpreterOopMap() { initialize(); -#ifdef ASSERT - _resource_allocate_bit_mask = true; -#endif +} + +InterpreterOopMap::~InterpreterOopMap() { + if (has_valid_mask() && mask_size() > small_mask_limit) { + assert(_bit_mask[0] != 0, "should have pointer to C heap"); + FREE_C_HEAP_ARRAY(uintptr_t, _bit_mask[0]); + } } bool InterpreterOopMap::is_empty() const { @@ -399,37 +400,24 @@ void OopMapCacheEntry::deallocate(OopMapCacheEntry* const entry) { // Implementation of OopMapCache -void InterpreterOopMap::resource_copy(OopMapCacheEntry* from) { - assert(_resource_allocate_bit_mask, - "Should not resource allocate the _bit_mask"); - assert(from->has_valid_mask(), - "Cannot copy entry with an invalid mask"); +void InterpreterOopMap::copy_from(const OopMapCacheEntry* src) { + // The expectation is that this InterpreterOopMap is recently created + // and empty. It is used to get a copy of a cached entry. + assert(!has_valid_mask(), "InterpreterOopMap object can only be filled once"); + assert(src->has_valid_mask(), "Cannot copy entry with an invalid mask"); - set_method(from->method()); - set_bci(from->bci()); - set_mask_size(from->mask_size()); - set_expression_stack_size(from->expression_stack_size()); - _num_oops = from->num_oops(); + set_method(src->method()); + set_bci(src->bci()); + set_mask_size(src->mask_size()); + set_expression_stack_size(src->expression_stack_size()); + _num_oops = src->num_oops(); // Is the bit mask contained in the entry? - if (from->mask_size() <= small_mask_limit) { - memcpy((void *)_bit_mask, (void *)from->_bit_mask, - mask_word_size() * BytesPerWord); + if (src->mask_size() <= small_mask_limit) { + memcpy(_bit_mask, src->_bit_mask, mask_word_size() * BytesPerWord); } else { - // The expectation is that this InterpreterOopMap is a recently created - // and empty. It is used to get a copy of a cached entry. - // If the bit mask has a value, it should be in the - // resource area. - assert(_bit_mask[0] == 0 || - Thread::current()->resource_area()->contains((void*)_bit_mask[0]), - "The bit mask should have been allocated from a resource area"); - // Allocate the bit_mask from a Resource area for performance. Allocating - // from the C heap as is done for OopMapCache has a significant - // performance impact. - _bit_mask[0] = (uintptr_t) NEW_RESOURCE_ARRAY(uintptr_t, mask_word_size()); - assert(_bit_mask[0] != 0, "bit mask was not allocated"); - memcpy((void*) _bit_mask[0], (void*) from->_bit_mask[0], - mask_word_size() * BytesPerWord); + _bit_mask[0] = (uintptr_t) NEW_C_HEAP_ARRAY(uintptr_t, mask_word_size(), mtClass); + memcpy((void*) _bit_mask[0], (void*) src->_bit_mask[0], mask_word_size() * BytesPerWord); } } @@ -512,7 +500,7 @@ void OopMapCache::lookup(const methodHandle& method, for (int i = 0; i < probe_depth; i++) { OopMapCacheEntry *entry = entry_at(probe + i); if (entry != nullptr && !entry->is_empty() && entry->match(method, bci)) { - entry_for->resource_copy(entry); + entry_for->copy_from(entry); assert(!entry_for->is_empty(), "A non-empty oop map should be returned"); log_debug(interpreter, oopmap)("- found at hash %d", probe + i); return; @@ -526,7 +514,7 @@ void OopMapCache::lookup(const methodHandle& method, OopMapCacheEntry* tmp = NEW_C_HEAP_OBJ(OopMapCacheEntry, mtClass); tmp->initialize(); tmp->fill(method, bci); - entry_for->resource_copy(tmp); + entry_for->copy_from(tmp); if (method->should_not_be_cached()) { // It is either not safe or not a good idea to cache this Method* @@ -627,7 +615,7 @@ void OopMapCache::compute_one_oop_map(const methodHandle& method, int bci, Inter tmp->initialize(); tmp->fill(method, bci); if (tmp->has_valid_mask()) { - entry->resource_copy(tmp); + entry->copy_from(tmp); } OopMapCacheEntry::deallocate(tmp); } diff --git a/src/hotspot/share/interpreter/oopMapCache.hpp b/src/hotspot/share/interpreter/oopMapCache.hpp index 7037b2c7d1fcf..062b4178ce06e 100644 --- a/src/hotspot/share/interpreter/oopMapCache.hpp +++ b/src/hotspot/share/interpreter/oopMapCache.hpp @@ -36,13 +36,14 @@ // OopMapCache's are allocated lazily per InstanceKlass. // The oopMap (InterpreterOopMap) is stored as a bit mask. If the -// bit_mask can fit into two words it is stored in +// bit_mask can fit into four words it is stored in // the _bit_mask array, otherwise it is allocated on the heap. // For OopMapCacheEntry the bit_mask is allocated in the C heap // because these entries persist between garbage collections. -// For InterpreterOopMap the bit_mask is allocated in -// a resource area for better performance. InterpreterOopMap -// should only be created and deleted during same garbage collection. +// For InterpreterOopMap the bit_mask is allocated in the C heap +// to avoid issues with allocations from the resource area that have +// to live accross the oop closure. InterpreterOopMap should only be +// created and deleted during the same garbage collection. // // If ENABBLE_ZAP_DEAD_LOCALS is defined, two bits are used // per entry instead of one. In all cases, @@ -88,9 +89,6 @@ class InterpreterOopMap: ResourceObj { unsigned short _bci; // the bci for which the mask is valid protected: -#ifdef ASSERT - bool _resource_allocate_bit_mask; -#endif int _num_oops; intptr_t _bit_mask[N]; // the bit mask if // mask_size <= small_mask_limit, @@ -128,12 +126,13 @@ class InterpreterOopMap: ResourceObj { public: InterpreterOopMap(); + ~InterpreterOopMap(); - // Copy the OopMapCacheEntry in parameter "from" into this - // InterpreterOopMap. If the _bit_mask[0] in "from" points to - // allocated space (i.e., the bit mask was to large to hold - // in-line), allocate the space from a Resource area. - void resource_copy(OopMapCacheEntry* from); + // Copy the OopMapCacheEntry in parameter "src" into this + // InterpreterOopMap. If the _bit_mask[0] in "src" points to + // allocated space (i.e., the bit mask was too large to hold + // in-line), allocate the space from the C heap. + void copy_from(const OopMapCacheEntry* src); void iterate_oop(OffsetClosure* oop_closure) const; void print() const; diff --git a/src/hotspot/share/runtime/frame.cpp b/src/hotspot/share/runtime/frame.cpp index 8f5d2ad4acbf1..1aed46d58804f 100644 --- a/src/hotspot/share/runtime/frame.cpp +++ b/src/hotspot/share/runtime/frame.cpp @@ -947,7 +947,6 @@ void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool quer InterpreterFrameClosure blk(this, max_locals, m->max_stack(), f); // process locals & expression stack - ResourceMark rm(thread); InterpreterOopMap mask; if (query_oop_map_cache) { m->mask_for(m, bci, &mask); From 66db71563c3ebd715a1192a9b399b618d7bdb8d0 Mon Sep 17 00:00:00 2001 From: Joe Darcy <darcy@openjdk.org> Date: Wed, 10 Jul 2024 16:36:39 +0000 Subject: [PATCH 355/471] 8335637: Add explicit non-null return value expectations to Object.toString() Reviewed-by: jpai, alanb, smarks, prappo --- src/java.base/share/classes/java/lang/Object.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/java.base/share/classes/java/lang/Object.java b/src/java.base/share/classes/java/lang/Object.java index b8bfdc3e3f9bf..d9813df57a4f0 100644 --- a/src/java.base/share/classes/java/lang/Object.java +++ b/src/java.base/share/classes/java/lang/Object.java @@ -237,6 +237,10 @@ public boolean equals(Object obj) { /** * {@return a string representation of the object} + * + * Satisfying this method's contract implies a non-{@code null} + * result must be returned. + * * @apiNote * In general, the * {@code toString} method returns a string that From 242f1133f8e1b373de3714cefc7f6701c39707fe Mon Sep 17 00:00:00 2001 From: Yudi Zheng <yzheng@openjdk.org> Date: Wed, 10 Jul 2024 19:42:23 +0000 Subject: [PATCH 356/471] 8334481: [JVMCI] add LINK_TO_NATIVE to MethodHandleAccessProvider.IntrinsicMethod Reviewed-by: dnsimon --- src/hotspot/share/jvmci/vmStructs_jvmci.cpp | 1 + .../jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java | 2 ++ .../share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java | 1 + .../classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java | 4 +++- 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp index 8f83d483bcf4b..f55c7bf91a9b6 100644 --- a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp +++ b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp @@ -778,6 +778,7 @@ declare_constant(vmIntrinsics::_linkToStatic) \ declare_constant(vmIntrinsics::_linkToSpecial) \ declare_constant(vmIntrinsics::_linkToInterface) \ + declare_constant(vmIntrinsics::_linkToNative) \ \ declare_constant(vmSymbols::FIRST_SID) \ declare_constant(vmSymbols::SID_LIMIT) \ diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java index 7e47196a42b89..3d3d140b1ca79 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java @@ -146,6 +146,8 @@ public static IntrinsicMethod getMethodHandleIntrinsic(int intrinsicId) { return IntrinsicMethod.LINK_TO_STATIC; } else if (intrinsicId == config.vmIntrinsicLinkToVirtual) { return IntrinsicMethod.LINK_TO_VIRTUAL; + } else if (intrinsicId == config.vmIntrinsicLinkToNative) { + return IntrinsicMethod.LINK_TO_NATIVE; } return null; } diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java index c49f24efed51e..57f9473c90209 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java @@ -342,6 +342,7 @@ final int baseVtableLength() { final int vmIntrinsicLinkToStatic = getConstant("vmIntrinsics::_linkToStatic", Integer.class); final int vmIntrinsicLinkToSpecial = getConstant("vmIntrinsics::_linkToSpecial", Integer.class); final int vmIntrinsicLinkToInterface = getConstant("vmIntrinsics::_linkToInterface", Integer.class); + final int vmIntrinsicLinkToNative = getConstant("vmIntrinsics::_linkToNative", Integer.class); final int codeInstallResultOk = getConstant("JVMCI::ok", Integer.class); final int codeInstallResultDependenciesFailed = getConstant("JVMCI::dependencies_failed", Integer.class); diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java index f053905b160c9..eb8b9721d49ce 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java @@ -45,7 +45,9 @@ enum IntrinsicMethod { /** The method {@code MethodHandle.linkToVirtual}. */ LINK_TO_VIRTUAL, /** The method {@code MethodHandle.linkToInterface}. */ - LINK_TO_INTERFACE + LINK_TO_INTERFACE, + /** The method {@code MethodHandle.linkToNative}. */ + LINK_TO_NATIVE } /** From cad68e06ecad1e19091d1af9c0f9b8145d6842fb Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Wed, 10 Jul 2024 21:06:39 +0000 Subject: [PATCH 357/471] 8335935: Chained builders not sending transformed models to next transforms Reviewed-by: asotona --- .../java/lang/classfile/CodeBuilder.java | 4 +- .../classfile/impl/BlockCodeBuilderImpl.java | 16 +- .../classfile/impl/BufferedCodeBuilder.java | 4 +- .../classfile/impl/ChainedClassBuilder.java | 16 +- .../classfile/impl/ChainedMethodBuilder.java | 10 +- .../classfile/impl/DirectCodeBuilder.java | 4 +- .../internal/classfile/impl/LabelContext.java | 4 +- .../classfile/impl/TerminalCodeBuilder.java | 8 +- .../impl/TransformingCodeBuilder.java | 91 ---------- test/jdk/jdk/classfile/TransformTests.java | 163 ++++++++++++++++++ 10 files changed, 196 insertions(+), 124 deletions(-) delete mode 100644 src/java.base/share/classes/jdk/internal/classfile/impl/TransformingCodeBuilder.java diff --git a/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java b/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java index cffa560bef305..a166637509174 100644 --- a/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java +++ b/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java @@ -86,7 +86,7 @@ import static java.util.Objects.requireNonNull; import static jdk.internal.classfile.impl.BytecodeHelpers.handleDescToHandleInfo; -import jdk.internal.classfile.impl.TransformingCodeBuilder; + import jdk.internal.javac.PreviewFeature; /** @@ -192,7 +192,7 @@ public sealed interface CodeBuilder default CodeBuilder transforming(CodeTransform transform, Consumer<CodeBuilder> handler) { var resolved = transform.resolve(this); resolved.startHandler().run(); - handler.accept(new TransformingCodeBuilder(this, resolved.consumer())); + handler.accept(new ChainedCodeBuilder(this, resolved.consumer())); resolved.endHandler().run(); return this; } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java index ffe1a2bd6160f..66e974b4a51b6 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,13 +51,13 @@ public BlockCodeBuilderImpl(CodeBuilder parent, Label breakLabel) { public void start() { topLocal = topLocal(parent); - terminalMaxLocals = topLocal(terminal); - terminal.with((LabelTarget) startLabel); + terminalMaxLocals = terminal.curTopLocal(); + parent.with((LabelTarget) startLabel); } public void end() { - terminal.with((LabelTarget) endLabel); - if (terminalMaxLocals != topLocal(terminal)) { + parent.with((LabelTarget) endLabel); + if (terminalMaxLocals != terminal.curTopLocal()) { throw new IllegalStateException("Interference in local variable slot management"); } } @@ -73,10 +73,8 @@ public boolean isEmpty() { private int topLocal(CodeBuilder parent) { return switch (parent) { case BlockCodeBuilderImpl b -> b.topLocal; - case ChainedCodeBuilder b -> topLocal(b.terminal); - case DirectCodeBuilder b -> b.curTopLocal(); - case BufferedCodeBuilder b -> b.curTopLocal(); - case TransformingCodeBuilder b -> topLocal(b.delegate); + case ChainedCodeBuilder b -> b.terminal.curTopLocal(); + case TerminalCodeBuilder b -> b.curTopLocal(); }; } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedCodeBuilder.java index 60e73cdd987c0..8603c77ab8b2a 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedCodeBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedCodeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,7 @@ import java.util.function.Consumer; public final class BufferedCodeBuilder - implements TerminalCodeBuilder, LabelContext { + implements TerminalCodeBuilder { private final SplitConstantPool constantPool; private final ClassFileImpl context; private final List<CodeElement> elements = new ArrayList<>(); diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java index cc19bf9d31c8d..b33d192f9b355 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,13 +33,11 @@ public final class ChainedClassBuilder implements ClassBuilder, Consumer<ClassElement> { - private final ClassBuilder downstream; private final DirectClassBuilder terminal; private final Consumer<ClassElement> consumer; public ChainedClassBuilder(ClassBuilder downstream, Consumer<ClassElement> consumer) { - this.downstream = downstream; this.consumer = consumer; this.terminal = switch (downstream) { case ChainedClassBuilder cb -> cb.terminal; @@ -60,10 +58,11 @@ public Optional<ClassModel> original() { @Override public ClassBuilder withField(Utf8Entry name, Utf8Entry descriptor, Consumer<? super FieldBuilder> handler) { - return downstream.with(new BufferedFieldBuilder(terminal.constantPool, terminal.context, + consumer.accept(new BufferedFieldBuilder(terminal.constantPool, terminal.context, name, descriptor, null) .run(handler) .toModel()); + return this; } @Override @@ -72,16 +71,18 @@ public ClassBuilder transformField(FieldModel field, FieldTransform transform) { field.fieldName(), field.fieldType(), field); builder.transform(field, transform); - return downstream.with(builder.toModel()); + consumer.accept(builder.toModel()); + return this; } @Override public ClassBuilder withMethod(Utf8Entry name, Utf8Entry descriptor, int flags, Consumer<? super MethodBuilder> handler) { - return downstream.with(new BufferedMethodBuilder(terminal.constantPool, terminal.context, + consumer.accept(new BufferedMethodBuilder(terminal.constantPool, terminal.context, name, descriptor, null) .run(handler) .toModel()); + return this; } @Override @@ -89,7 +90,8 @@ public ClassBuilder transformMethod(MethodModel method, MethodTransform transfor BufferedMethodBuilder builder = new BufferedMethodBuilder(terminal.constantPool, terminal.context, method.methodName(), method.methodType(), method); builder.transform(method, transform); - return downstream.with(builder.toModel()); + consumer.accept(builder.toModel()); + return this; } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java index 38850aec10978..866dda2c5bc53 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,13 +36,11 @@ import java.lang.classfile.constantpool.ConstantPoolBuilder; public final class ChainedMethodBuilder implements MethodBuilder { - final MethodBuilder downstream; final TerminalMethodBuilder terminal; final Consumer<MethodElement> consumer; public ChainedMethodBuilder(MethodBuilder downstream, Consumer<MethodElement> consumer) { - this.downstream = downstream; this.consumer = consumer; this.terminal = switch (downstream) { case ChainedMethodBuilder cb -> cb.terminal; @@ -58,16 +56,18 @@ public MethodBuilder with(MethodElement element) { @Override public MethodBuilder withCode(Consumer<? super CodeBuilder> handler) { - return downstream.with(terminal.bufferedCodeBuilder(null) + consumer.accept(terminal.bufferedCodeBuilder(null) .run(handler) .toModel()); + return this; } @Override public MethodBuilder transformCode(CodeModel code, CodeTransform transform) { BufferedCodeBuilder builder = terminal.bufferedCodeBuilder(code); builder.transform(code, transform); - return downstream.with(builder.toModel()); + consumer.accept(builder.toModel()); + return this; } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectCodeBuilder.java index b961a12031f59..0b6549a82da9e 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectCodeBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectCodeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,7 +75,7 @@ public final class DirectCodeBuilder extends AbstractDirectBuilder<CodeModel> - implements TerminalCodeBuilder, LabelContext { + implements TerminalCodeBuilder { private final List<CharacterRange> characterRanges = new ArrayList<>(); final List<AbstractPseudoInstruction.ExceptionCatchImpl> handlers = new ArrayList<>(); private final List<LocalVariable> localVariables = new ArrayList<>(); diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/LabelContext.java b/src/java.base/share/classes/jdk/internal/classfile/impl/LabelContext.java index e17adcbcf121f..749abbed23b6d 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/LabelContext.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/LabelContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ import java.lang.classfile.Label; public sealed interface LabelContext - permits BufferedCodeBuilder, CodeImpl, DirectCodeBuilder { + permits TerminalCodeBuilder, CodeImpl { Label newLabel(); Label getLabel(int bci); void setLabelTarget(Label label, int bci); diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/TerminalCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/TerminalCodeBuilder.java index e13b09b0a4d0d..6e3ca516bf480 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/TerminalCodeBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/TerminalCodeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ import java.lang.classfile.CodeBuilder; -public sealed interface TerminalCodeBuilder extends CodeBuilder - permits DirectCodeBuilder, BufferedCodeBuilder, TransformingCodeBuilder { - +public sealed interface TerminalCodeBuilder extends CodeBuilder, LabelContext + permits DirectCodeBuilder, BufferedCodeBuilder { + int curTopLocal(); } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/TransformingCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/TransformingCodeBuilder.java deleted file mode 100644 index 4ffc75d3edc82..0000000000000 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/TransformingCodeBuilder.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package jdk.internal.classfile.impl; - -import java.lang.classfile.CodeBuilder; -import java.lang.classfile.CodeModel; -import java.util.Optional; -import java.util.function.Consumer; -import java.lang.classfile.CodeElement; -import java.lang.classfile.Label; -import java.lang.classfile.TypeKind; -import java.lang.classfile.constantpool.ConstantPoolBuilder; - -public final class TransformingCodeBuilder implements TerminalCodeBuilder { - - final CodeBuilder delegate; - final Consumer<CodeElement> consumer; - - public TransformingCodeBuilder(CodeBuilder delegate, Consumer<CodeElement> consumer) { - this.delegate = delegate; - this.consumer = consumer; - } - - @Override - public CodeBuilder with(CodeElement e) { - consumer.accept(e); - return this; - } - - @Override - public Optional<CodeModel> original() { - return delegate.original(); - } - - @Override - public Label newLabel() { - return delegate.newLabel(); - } - - @Override - public Label startLabel() { - return delegate.startLabel(); - } - - @Override - public Label endLabel() { - return delegate.endLabel(); - } - - @Override - public int receiverSlot() { - return delegate.receiverSlot(); - } - - @Override - public int parameterSlot(int paramNo) { - return delegate.parameterSlot(paramNo); - } - - @Override - public int allocateLocal(TypeKind typeKind) { - return delegate.allocateLocal(typeKind); - } - - @Override - public ConstantPoolBuilder constantPool() { - return delegate.constantPool(); - } -} diff --git a/test/jdk/jdk/classfile/TransformTests.java b/test/jdk/jdk/classfile/TransformTests.java index 1df7b73bda56a..0cc1dafdf3274 100644 --- a/test/jdk/jdk/classfile/TransformTests.java +++ b/test/jdk/jdk/classfile/TransformTests.java @@ -23,9 +23,22 @@ /* * @test + * @bug 8336010 * @summary Testing ClassFile transformations. * @run junit TransformTests */ +import java.lang.classfile.ClassBuilder; +import java.lang.classfile.CodeBuilder; +import java.lang.classfile.CodeElement; +import java.lang.classfile.FieldModel; +import java.lang.classfile.FieldTransform; +import java.lang.classfile.Label; +import java.lang.classfile.MethodTransform; +import java.lang.classfile.instruction.BranchInstruction; +import java.lang.classfile.instruction.LabelTarget; +import java.lang.constant.ClassDesc; +import java.lang.constant.MethodTypeDesc; +import java.lang.reflect.AccessFlag; import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; @@ -39,8 +52,13 @@ import java.lang.classfile.CodeTransform; import java.lang.classfile.MethodModel; import java.lang.classfile.instruction.ConstantInstruction; +import java.util.HashSet; +import java.util.Set; + import org.junit.jupiter.api.Test; +import static java.lang.classfile.ClassFile.*; +import static java.lang.constant.ConstantDescs.*; import static org.junit.jupiter.api.Assertions.*; /** @@ -126,6 +144,151 @@ void testSeqN() throws Exception { assertEquals(invoke(cc.transformClass(cm, transformCode(foo2foo.andThen(foo2bar).andThen(bar2baz)))), "baz"); } + /** + * Test to ensure class elements, such as field and + * methods defined with transform/with, are visible + * to next transforms. + */ + @Test + void testClassChaining() throws Exception { + var bytes = Files.readAllBytes(testClassPath); + var cf = ClassFile.of(); + var cm = cf.parse(bytes); + var otherCm = cf.parse(cf.build(ClassDesc.of("Temp"), clb -> clb + .withMethodBody("baz", MTD_void, ACC_STATIC, CodeBuilder::return_) + .withField("baz", CD_long, ACC_STATIC))); + + var methodBaz = otherCm.methods().getFirst(); + var fieldBaz = otherCm.fields().getFirst(); + + ClassTransform transform1 = ClassTransform.endHandler(cb -> { + ClassBuilder ret; + ret = cb.withMethodBody("bar", MTD_void, ACC_STATIC, CodeBuilder::return_); + assertSame(cb, ret); + ret = cb.transformMethod(methodBaz, MethodTransform.ACCEPT_ALL); + assertSame(cb, ret); + ret = cb.withField("bar", CD_int, ACC_STATIC); + assertSame(cb, ret); + ret = cb.transformField(fieldBaz, FieldTransform.ACCEPT_ALL); + assertSame(cb, ret); + }); + + Set<String> methodNames = new HashSet<>(); + Set<String> fieldNames = new HashSet<>(); + ClassTransform transform2 = (cb, ce) -> { + if (ce instanceof MethodModel mm) { + methodNames.add(mm.methodName().stringValue()); + } + if (ce instanceof FieldModel fm) { + fieldNames.add(fm.fieldName().stringValue()); + } + cb.with(ce); + }; + + cf.transformClass(cm, transform1.andThen(transform2)); + + assertEquals(Set.of(INIT_NAME, "foo", "bar", "baz"), methodNames); + assertEquals(Set.of("bar", "baz"), fieldNames); + } + + /** + * Test to ensure method elements, such as generated + * or transformed code, are visible to transforms. + */ + @Test + void testMethodChaining() throws Exception { + var mtd = MethodTypeDesc.of(CD_String); + + var cf = ClassFile.of(); + + // withCode + var cm = cf.parse(cf.build(ClassDesc.of("Temp"), clb -> clb + .withMethod("baz", mtd, ACC_STATIC | ACC_NATIVE, _ -> {}))); + + MethodTransform transform1 = MethodTransform.endHandler(mb -> { + var ret = mb.withCode(cob -> cob.loadConstant("foo").areturn()); + assertSame(mb, ret); + }); + + boolean[] sawWithCode = { false }; + MethodTransform transform2 = (mb, me) -> { + if (me instanceof CodeModel) { + sawWithCode[0] = true; + } + mb.with(me); + }; + + cf.transformClass(cm, ClassTransform.transformingMethods(transform1.andThen(transform2))); + + assertTrue(sawWithCode[0], "Code attribute generated not visible"); + + // transformCode + var outerCm = cf.parse(testClassPath); + var foo = outerCm.methods().stream() + .filter(m -> m.flags().has(AccessFlag.STATIC)) + .findFirst().orElseThrow(); + + MethodTransform transform3 = MethodTransform.endHandler(mb -> { + var ret = mb.transformCode(foo.code().orElseThrow(), CodeTransform.ACCEPT_ALL); + assertSame(mb, ret); + }); + + boolean[] sawTransformCode = { false }; + MethodTransform transform4 = (mb, me) -> { + if (me instanceof CodeModel) { + sawTransformCode[0] = true; + } + mb.with(me); + }; + + cf.transformClass(cm, ClassTransform.transformingMethods(transform3.andThen(transform4))); + + assertTrue(sawTransformCode[0], "Code attribute transformed not visible"); + } + + /** + * Test to ensure code elements, such as code block + * begin and end labels, are visible to transforms. + */ + @Test + void testCodeChaining() throws Exception { + var bytes = Files.readAllBytes(testClassPath); + var cf = ClassFile.of(); + var cm = cf.parse(bytes); + + CodeTransform transform1 = new CodeTransform() { + @Override + public void atStart(CodeBuilder builder) { + builder.block(bcb -> { + bcb.loadConstant(9876L); + bcb.goto_(bcb.endLabel()); + }); + } + + @Override + public void accept(CodeBuilder builder, CodeElement element) { + builder.with(element); + } + }; + Set<Label> leaveLabels = new HashSet<>(); + Set<Label> targetedLabels = new HashSet<>(); + CodeTransform transform2 = (cb, ce) -> { + if (ce instanceof BranchInstruction bi) { + leaveLabels.add(bi.target()); + } + if (ce instanceof LabelTarget lt) { + targetedLabels.add(lt.label()); + } + cb.with(ce); + }; + + cf.transformClass(cm, ClassTransform.transformingMethods(MethodTransform + .transformingCode(transform1.andThen(transform2)))); + + leaveLabels.removeIf(targetedLabels::contains); + assertTrue(leaveLabels.isEmpty(), () -> "Some labels are not bounded: " + leaveLabels); + } + public static class TestClass { static public String foo() { return "foo"; From d6c6847e32673d36a1958cefd1851ec9f3b1e2ad Mon Sep 17 00:00:00 2001 From: KIRIYAMA Takuya <kiriyama.takuya@fujitsu.com> Date: Thu, 11 Jul 2024 02:44:12 +0000 Subject: [PATCH 358/471] 8335743: jhsdb jstack cannot print some information on the waiting thread Reviewed-by: dholmes, cjplummer, kevinw --- .../sun/jvm/hotspot/runtime/JavaVFrame.java | 4 ++-- .../serviceability/sa/LingeredAppWithLock.java | 18 ++++++++++++++++-- .../sa/TestClhsdbJstackLock.java | 6 ++++-- .../serviceability/sa/TestJhsdbJstackLock.java | 4 +++- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java index 7a3609425724b..60bcb7bb86dbe 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -100,7 +100,7 @@ public void printLockInfo(PrintStream tty, int frameCount) { // then print out the receiver. Locals are not always available, // e.g., compiled native frames have no scope so there are no locals. if (frameCount == 0) { - if (getMethod().getName().asString().equals("wait") && + if (getMethod().getName().asString().equals("wait0") && getMethod().getMethodHolder().getName().asString().equals("java/lang/Object")) { String waitState = "waiting on"; // assume we are waiting // If earlier in the output we reported java.lang.Thread.State == diff --git a/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java b/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java index 4140a3e338104..4319d576590cf 100644 --- a/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java +++ b/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ public class LingeredAppWithLock extends LingeredApp { + private static Object lockObj = new Object(); public static void lockMethod(Object lock) { synchronized (lock) { @@ -36,16 +37,28 @@ public static void lockMethod(Object lock) { } } + public static void waitMethod() { + synchronized (lockObj) { + try { + lockObj.wait(300000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + public static void main(String args[]) { Thread classLock1 = new Thread(() -> lockMethod(LingeredAppWithLock.class)); Thread classLock2 = new Thread(() -> lockMethod(LingeredAppWithLock.class)); Thread objectLock = new Thread(() -> lockMethod(classLock1)); Thread primitiveLock = new Thread(() -> lockMethod(int.class)); + Thread objectWait = new Thread(() -> waitMethod()); classLock1.start(); classLock2.start(); objectLock.start(); primitiveLock.start(); + objectWait.start(); // Wait until all threads have reached their blocked or timed wait state while ((classLock1.getState() != Thread.State.BLOCKED && @@ -53,7 +66,8 @@ public static void main(String args[]) { (classLock2.getState() != Thread.State.BLOCKED && classLock2.getState() != Thread.State.TIMED_WAITING) || (objectLock.getState() != Thread.State.TIMED_WAITING) || - (primitiveLock.getState() != Thread.State.TIMED_WAITING)) { + (primitiveLock.getState() != Thread.State.TIMED_WAITING) || + (objectWait.getState() != Thread.State.TIMED_WAITING)) { try { Thread.sleep(100); } catch (InterruptedException ex) { diff --git a/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java index cac6dac44a057..e4d4361e6512b 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java +++ b/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,7 @@ /** * @test + * @bug 8185796 8335743 * @requires vm.hasSA * @library /test/lib * @run main/othervm TestClhsdbJstackLock @@ -57,7 +58,8 @@ public static void main (String... args) throws Exception { "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$", "^\\s+- waiting to lock <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$", "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Thread\\)$", - "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$")); + "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$", + "^\\s+- waiting on <0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)$")); unExpStrMap.put("jstack", List.of( "missing reason for ")); test.run(app.getPid(), cmds, expStrMap, unExpStrMap); diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java index 02a2a07f25087..98c4286609178 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ /** * @test + * @bug 8185796 8335743 * @requires vm.hasSA * @library /test/lib * @run driver TestJhsdbJstackLock @@ -64,6 +65,7 @@ public static void main (String... args) throws Exception { out.shouldMatch("^\\s+- waiting to lock <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$"); out.shouldMatch("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Thread\\)$"); out.shouldMatch("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$"); + out.shouldMatch("^\\s+- waiting on <0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)$"); out.stderrShouldBeEmptyIgnoreDeprecatedWarnings(); From b363de8c9fbf7d9e4aade41a2e883cc83ced320b Mon Sep 17 00:00:00 2001 From: Kuai Wei <kuaiwei.kw@alibaba-inc.com> Date: Thu, 11 Jul 2024 02:44:25 +0000 Subject: [PATCH 359/471] 8335946: DTrace code snippets should be generated when DTrace flags are enabled Reviewed-by: coleenp, dholmes --- .../cpu/aarch64/interp_masm_aarch64.cpp | 6 +- .../cpu/aarch64/sharedRuntime_aarch64.cpp | 71 ++++++++--------- .../cpu/aarch64/templateTable_aarch64.cpp | 3 +- src/hotspot/cpu/ppc/templateTable_ppc_64.cpp | 9 ++- src/hotspot/cpu/riscv/interp_masm_riscv.cpp | 6 +- src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp | 76 ++++++++----------- src/hotspot/cpu/riscv/templateTable_riscv.cpp | 3 +- src/hotspot/cpu/s390/templateTable_s390.cpp | 3 +- src/hotspot/cpu/x86/interp_masm_x86.cpp | 6 +- src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp | 6 +- src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp | 6 +- src/hotspot/cpu/x86/templateTable_x86.cpp | 3 +- 12 files changed, 85 insertions(+), 113 deletions(-) diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp index 5fea0b8d925b0..ca359fea9da77 100644 --- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp @@ -1418,8 +1418,7 @@ void InterpreterMacroAssembler::notify_method_entry() { bind(L); } - { - SkipIfEqual skip(this, &DTraceMethodProbes, false); + if (DTraceMethodProbes) { get_method(c_rarg1); call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), rthread, c_rarg1); @@ -1458,8 +1457,7 @@ void InterpreterMacroAssembler::notify_method_exit( pop(state); } - { - SkipIfEqual skip(this, &DTraceMethodProbes, false); + if (DTraceMethodProbes) { push(state); get_method(c_rarg1); call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), diff --git a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp index a260082562288..bb2554e65ce83 100644 --- a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp @@ -1754,11 +1754,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, __ set_last_Java_frame(sp, noreg, native_return, rscratch1); Label dtrace_method_entry, dtrace_method_entry_done; - { - uint64_t offset; - __ adrp(rscratch1, ExternalAddress((address)&DTraceMethodProbes), offset); - __ ldrb(rscratch1, Address(rscratch1, offset)); - __ cbnzw(rscratch1, dtrace_method_entry); + if (DTraceMethodProbes) { + __ b(dtrace_method_entry); __ bind(dtrace_method_entry_done); } @@ -1990,11 +1987,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, } Label dtrace_method_exit, dtrace_method_exit_done; - { - uint64_t offset; - __ adrp(rscratch1, ExternalAddress((address)&DTraceMethodProbes), offset); - __ ldrb(rscratch1, Address(rscratch1, offset)); - __ cbnzw(rscratch1, dtrace_method_exit); + if (DTraceMethodProbes) { + __ b(dtrace_method_exit); __ bind(dtrace_method_exit_done); } @@ -2138,37 +2132,38 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, } // SLOW PATH dtrace support - { - __ block_comment("dtrace entry {"); - __ bind(dtrace_method_entry); - - // We have all of the arguments setup at this point. We must not touch any register - // argument registers at this point (what if we save/restore them there are no oop? - - save_args(masm, total_c_args, c_arg, out_regs); - __ mov_metadata(c_rarg1, method()); - __ call_VM_leaf( - CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), - rthread, c_rarg1); - restore_args(masm, total_c_args, c_arg, out_regs); - __ b(dtrace_method_entry_done); - __ block_comment("} dtrace entry"); - } + if (DTraceMethodProbes) { + { + __ block_comment("dtrace entry {"); + __ bind(dtrace_method_entry); + + // We have all of the arguments setup at this point. We must not touch any register + // argument registers at this point (what if we save/restore them there are no oop? + + save_args(masm, total_c_args, c_arg, out_regs); + __ mov_metadata(c_rarg1, method()); + __ call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), + rthread, c_rarg1); + restore_args(masm, total_c_args, c_arg, out_regs); + __ b(dtrace_method_entry_done); + __ block_comment("} dtrace entry"); + } - { - __ block_comment("dtrace exit {"); - __ bind(dtrace_method_exit); - save_native_result(masm, ret_type, stack_slots); - __ mov_metadata(c_rarg1, method()); - __ call_VM_leaf( - CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), - rthread, c_rarg1); - restore_native_result(masm, ret_type, stack_slots); - __ b(dtrace_method_exit_done); - __ block_comment("} dtrace exit"); + { + __ block_comment("dtrace exit {"); + __ bind(dtrace_method_exit); + save_native_result(masm, ret_type, stack_slots); + __ mov_metadata(c_rarg1, method()); + __ call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), + rthread, c_rarg1); + restore_native_result(masm, ret_type, stack_slots); + __ b(dtrace_method_exit_done); + __ block_comment("} dtrace exit"); + } } - __ flush(); nmethod *nm = nmethod::new_native_nmethod(method, diff --git a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp index f32a4ee7372a7..f7cf99381578b 100644 --- a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp @@ -3648,8 +3648,7 @@ void TemplateTable::_new() { __ store_klass_gap(r0, zr); // zero klass gap for compressed oops __ store_klass(r0, r4); // store klass last - { - SkipIfEqual skip(_masm, &DTraceAllocProbes, false); + if (DTraceAllocProbes) { // Trigger dtrace event for fastpath __ push(atos); // save the return value __ call_VM_leaf( diff --git a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp index 770b2bfa68f0c..0ee9348dde810 100644 --- a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp +++ b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp @@ -3859,10 +3859,11 @@ void TemplateTable::_new() { __ store_klass(RallocatedObject, RinstanceKlass, Rscratch); // klass (last for cms) // Check and trigger dtrace event. - SkipIfEqualZero::skip_to_label_if_equal_zero(_masm, Rscratch, &DTraceAllocProbes, Ldone); - __ push(atos); - __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc))); - __ pop(atos); + if (DTraceAllocProbes) { + __ push(atos); + __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc))); + __ pop(atos); + } __ b(Ldone); } diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp index c5f97b60c4239..af6d043d1d63e 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp @@ -1467,8 +1467,7 @@ void InterpreterMacroAssembler::notify_method_entry() { bind(L); } - { - SkipIfEqual skip(this, &DTraceMethodProbes, false); + if (DTraceMethodProbes) { get_method(c_rarg1); call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), xthread, c_rarg1); @@ -1506,8 +1505,7 @@ void InterpreterMacroAssembler::notify_method_exit( pop(state); } - { - SkipIfEqual skip(this, &DTraceMethodProbes, false); + if (DTraceMethodProbes) { push(state); get_method(c_rarg1); call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), diff --git a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp index 9e6c8ce2e5e3b..3af203a95b039 100644 --- a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp +++ b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp @@ -1638,14 +1638,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, __ set_last_Java_frame(sp, noreg, native_return, t0); Label dtrace_method_entry, dtrace_method_entry_done; - { - ExternalAddress target((address)&DTraceMethodProbes); - __ relocate(target.rspec(), [&] { - int32_t offset; - __ la(t0, target.target(), offset); - __ lbu(t0, Address(t0, offset)); - }); - __ bnez(t0, dtrace_method_entry); + if (DTraceMethodProbes) { + __ j(dtrace_method_entry); __ bind(dtrace_method_entry_done); } @@ -1861,14 +1855,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, } Label dtrace_method_exit, dtrace_method_exit_done; - { - ExternalAddress target((address)&DTraceMethodProbes); - __ relocate(target.rspec(), [&] { - int32_t offset; - __ la(t0, target.target(), offset); - __ lbu(t0, Address(t0, offset)); - }); - __ bnez(t0, dtrace_method_exit); + if (DTraceMethodProbes) { + __ j(dtrace_method_exit); __ bind(dtrace_method_exit_done); } @@ -2009,34 +1997,36 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, } // SLOW PATH dtrace support - { - __ block_comment("dtrace entry {"); - __ bind(dtrace_method_entry); - - // We have all of the arguments setup at this point. We must not touch any register - // argument registers at this point (what if we save/restore them there are no oop? - - save_args(masm, total_c_args, c_arg, out_regs); - __ mov_metadata(c_rarg1, method()); - __ call_VM_leaf( - CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), - xthread, c_rarg1); - restore_args(masm, total_c_args, c_arg, out_regs); - __ j(dtrace_method_entry_done); - __ block_comment("} dtrace entry"); - } + if (DTraceMethodProbes) { + { + __ block_comment("dtrace entry {"); + __ bind(dtrace_method_entry); + + // We have all of the arguments setup at this point. We must not touch any register + // argument registers at this point (what if we save/restore them there are no oop? + + save_args(masm, total_c_args, c_arg, out_regs); + __ mov_metadata(c_rarg1, method()); + __ call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), + xthread, c_rarg1); + restore_args(masm, total_c_args, c_arg, out_regs); + __ j(dtrace_method_entry_done); + __ block_comment("} dtrace entry"); + } - { - __ block_comment("dtrace exit {"); - __ bind(dtrace_method_exit); - save_native_result(masm, ret_type, stack_slots); - __ mov_metadata(c_rarg1, method()); - __ call_VM_leaf( - CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), - xthread, c_rarg1); - restore_native_result(masm, ret_type, stack_slots); - __ j(dtrace_method_exit_done); - __ block_comment("} dtrace exit"); + { + __ block_comment("dtrace exit {"); + __ bind(dtrace_method_exit); + save_native_result(masm, ret_type, stack_slots); + __ mov_metadata(c_rarg1, method()); + __ call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), + xthread, c_rarg1); + restore_native_result(masm, ret_type, stack_slots); + __ j(dtrace_method_exit_done); + __ block_comment("} dtrace exit"); + } } __ flush(); diff --git a/src/hotspot/cpu/riscv/templateTable_riscv.cpp b/src/hotspot/cpu/riscv/templateTable_riscv.cpp index 5c72ddc9f81de..fa542343949ac 100644 --- a/src/hotspot/cpu/riscv/templateTable_riscv.cpp +++ b/src/hotspot/cpu/riscv/templateTable_riscv.cpp @@ -3592,8 +3592,7 @@ void TemplateTable::_new() { __ store_klass_gap(x10, zr); // zero klass gap for compressed oops __ store_klass(x10, x14); // store klass last - { - SkipIfEqual skip(_masm, &DTraceAllocProbes, false); + if (DTraceAllocProbes) { // Trigger dtrace event for fastpath __ push(atos); // save the return value __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)), x10); diff --git a/src/hotspot/cpu/s390/templateTable_s390.cpp b/src/hotspot/cpu/s390/templateTable_s390.cpp index 02b9405ad31d5..ef68a5ac83ac7 100644 --- a/src/hotspot/cpu/s390/templateTable_s390.cpp +++ b/src/hotspot/cpu/s390/templateTable_s390.cpp @@ -3976,8 +3976,7 @@ void TemplateTable::_new() { __ store_klass_gap(Rzero, RallocatedObject); // Zero klass gap for compressed oops. __ store_klass(iklass, RallocatedObject); // Store klass last. - { - SkipIfEqual skip(_masm, &DTraceAllocProbes, false, Z_ARG5 /*scratch*/); + if (DTraceAllocProbes) { // Trigger dtrace event for fastpath. __ push(atos); // Save the return value. __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)), RallocatedObject); diff --git a/src/hotspot/cpu/x86/interp_masm_x86.cpp b/src/hotspot/cpu/x86/interp_masm_x86.cpp index 4329b0b6411bb..57d77bafd4b73 100644 --- a/src/hotspot/cpu/x86/interp_masm_x86.cpp +++ b/src/hotspot/cpu/x86/interp_masm_x86.cpp @@ -1955,8 +1955,7 @@ void InterpreterMacroAssembler::notify_method_entry() { bind(L); } - { - SkipIfEqual skip(this, &DTraceMethodProbes, false, rscratch1); + if (DTraceMethodProbes) { NOT_LP64(get_thread(rthread);) get_method(rarg); call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), @@ -2000,8 +1999,7 @@ void InterpreterMacroAssembler::notify_method_exit( pop(state); } - { - SkipIfEqual skip(this, &DTraceMethodProbes, false, rscratch1); + if (DTraceMethodProbes) { push(state); NOT_LP64(get_thread(rthread);) get_method(rarg); diff --git a/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp b/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp index 79a573763dcc1..6303c279195ca 100644 --- a/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp @@ -1612,8 +1612,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, // We have all of the arguments setup at this point. We must not touch any register // argument registers at this point (what if we save/restore them there are no oop? - { - SkipIfEqual skip_if(masm, &DTraceMethodProbes, 0, noreg); + if (DTraceMethodProbes) { __ mov_metadata(rax, method()); __ call_VM_leaf( CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), @@ -1857,8 +1856,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, __ bind(fast_done); } - { - SkipIfEqual skip_if(masm, &DTraceMethodProbes, 0, noreg); + if (DTraceMethodProbes) { // Tell dtrace about this method exit save_native_result(masm, ret_type, stack_slots); __ mov_metadata(rax, method()); diff --git a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp index 4029e486c9cdf..decaa9d1ee914 100644 --- a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp @@ -2200,8 +2200,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, // We have all of the arguments setup at this point. We must not touch any register // argument registers at this point (what if we save/restore them there are no oop? - { - SkipIfEqual skip(masm, &DTraceMethodProbes, false, rscratch1); + if (DTraceMethodProbes) { // protect the args we've loaded save_args(masm, total_c_args, c_arg, out_regs); __ mov_metadata(c_rarg1, method()); @@ -2439,8 +2438,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, __ bind(fast_done); } - { - SkipIfEqual skip(masm, &DTraceMethodProbes, false, rscratch1); + if (DTraceMethodProbes) { save_native_result(masm, ret_type, stack_slots); __ mov_metadata(c_rarg1, method()); __ call_VM_leaf( diff --git a/src/hotspot/cpu/x86/templateTable_x86.cpp b/src/hotspot/cpu/x86/templateTable_x86.cpp index 248055337d824..6446ec6598791 100644 --- a/src/hotspot/cpu/x86/templateTable_x86.cpp +++ b/src/hotspot/cpu/x86/templateTable_x86.cpp @@ -4123,8 +4123,7 @@ void TemplateTable::_new() { #endif __ store_klass(rax, rcx, rscratch1); // klass - { - SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0, rscratch1); + if (DTraceAllocProbes) { // Trigger dtrace event for fastpath __ push(atos); __ call_VM_leaf( From cf940e139a76e5aabd52379b8a87065d82b2284c Mon Sep 17 00:00:00 2001 From: Doug Simon <dnsimon@openjdk.org> Date: Thu, 11 Jul 2024 07:03:44 +0000 Subject: [PATCH 360/471] 8335553: [Graal] Compiler thread calls into jdk.internal.vm.VMSupport.decodeAndThrowThrowable and crashes in OOM situation Reviewed-by: yzheng, never, dholmes --- src/hotspot/share/jvmci/jvmciCompilerToVM.cpp | 29 ++++++++++++ src/hotspot/share/jvmci/jvmciEnv.cpp | 10 ++++- src/hotspot/share/utilities/exceptions.cpp | 8 ++-- .../jdk/internal/vm/TranslatedException.java | 44 +++++++------------ .../classes/jdk/internal/vm/VMSupport.java | 7 ++- .../internal/vm/TestTranslatedException.java | 24 +++++++--- 6 files changed, 81 insertions(+), 41 deletions(-) diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp index 68168c56b9aac..5583ad8a6f5be 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp @@ -757,6 +757,35 @@ C2V_VMENTRY_NULL(jobject, lookupConstantInPool, (JNIEnv* env, jobject, ARGUMENT_ return JVMCIENV->get_jobject(result); } } +#ifdef ASSERT + // Support for testing an OOME raised in a context where the current thread cannot call Java + // 1. Put -Dtest.jvmci.oome_in_lookupConstantInPool=<trace> on the command line to + // discover possible values for step 2. + // Example output: + // + // CompilerToVM.lookupConstantInPool: "Overflow: String length out of range"{0x00000007ffeb2960} + // CompilerToVM.lookupConstantInPool: "null"{0x00000007ffebdfe8} + // CompilerToVM.lookupConstantInPool: "Maximum lock count exceeded"{0x00000007ffec4f90} + // CompilerToVM.lookupConstantInPool: "Negative length"{0x00000007ffec4468} + // + // 2. Choose a value shown in step 1. + // Example: -Dtest.jvmci.oome_in_lookupConstantInPool=Negative + const char* val = Arguments::PropertyList_get_value(Arguments::system_properties(), "test.jvmci.oome_in_lookupConstantInPool"); + if (val != nullptr) { + const char* str = obj->print_value_string(); + if (strstr(val, "<trace>") != nullptr) { + tty->print_cr("CompilerToVM.lookupConstantInPool: %s", str); + } else if (strstr(str, val) != nullptr) { + Handle garbage; + while (true) { + // Trigger an OutOfMemoryError + objArrayOop next = oopFactory::new_objectArray(0x7FFFFFFF, CHECK_NULL); + next->obj_at_put(0, garbage()); + garbage = Handle(THREAD, next); + } + } + } +#endif return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(obj)); C2V_END diff --git a/src/hotspot/share/jvmci/jvmciEnv.cpp b/src/hotspot/share/jvmci/jvmciEnv.cpp index 01b78b45b2a8e..129a88ac4d7fb 100644 --- a/src/hotspot/share/jvmci/jvmciEnv.cpp +++ b/src/hotspot/share/jvmci/jvmciEnv.cpp @@ -399,9 +399,11 @@ class ExceptionTranslation: public StackObj { _encoded_ok = 0, // exception was successfully encoded into buffer _buffer_alloc_fail = 1, // native memory for buffer could not be allocated _encode_oome_fail = 2, // OutOfMemoryError thrown during encoding - _encode_fail = 3 // some other problem occured during encoding. If buffer != 0, + _encode_fail = 3, // some other problem occured during encoding. If buffer != 0, // buffer contains a `struct { u4 len; char[len] desc}` // describing the problem + _encode_oome_in_vm = 4 // an OutOfMemoryError thrown from within VM code on a + // thread that cannot call Java (OOME has no stack trace) }; JVMCIEnv* _from_env; // Source of translation. Can be null. @@ -488,6 +490,12 @@ class HotSpotToSharedLibraryExceptionTranslation : public ExceptionTranslation { int encode(JavaThread* THREAD, jlong buffer, int buffer_size) { if (!THREAD->can_call_java()) { + Symbol *ex_name = _throwable->klass()->name(); + if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) { + JVMCI_event_1("translating exception: OutOfMemoryError within VM code"); + decode(THREAD, _encode_oome_in_vm, 0L); + return 0; + } char* char_buffer = print_throwable_to_buffer(_throwable, buffer, buffer_size); const char* detail = log_is_enabled(Info, exceptions) ? "" : " (-Xlog:exceptions may give more detail)"; JVMCI_event_1("cannot call Java to translate exception%s: %s", detail, char_buffer); diff --git a/src/hotspot/share/utilities/exceptions.cpp b/src/hotspot/share/utilities/exceptions.cpp index a99c36e7eb61b..78147ea4089ca 100644 --- a/src/hotspot/share/utilities/exceptions.cpp +++ b/src/hotspot/share/utilities/exceptions.cpp @@ -111,11 +111,9 @@ bool Exceptions::special_exception(JavaThread* thread, const char* file, int lin } #endif // ASSERT - if (!thread->can_call_java()) { + if (h_exception.is_null() && !thread->can_call_java()) { ResourceMark rm(thread); - const char* exc_value = h_exception.not_null() ? h_exception->print_value_string() : - h_name != nullptr ? h_name->as_C_string() : - "null"; + const char* exc_value = h_name != nullptr ? h_name->as_C_string() : "null"; log_info(exceptions)("Thread cannot call Java so instead of throwing exception <%s%s%s> (" PTR_FORMAT ") \n" "at [%s, line %d]\nfor thread " PTR_FORMAT ",\n" "throwing pre-allocated exception: %s", @@ -205,7 +203,7 @@ void Exceptions::_throw_msg_cause(JavaThread* thread, const char* file, int line void Exceptions::_throw_cause(JavaThread* thread, const char* file, int line, Symbol* name, Handle h_cause, Handle h_loader, Handle h_protection_domain) { // Check for special boot-strapping/compiler-thread handling - if (special_exception(thread, file, line, h_cause)) return; + if (special_exception(thread, file, line, Handle(), name)) return; // Create and throw exception Handle h_exception = new_exception(thread, name, h_cause, h_loader, h_protection_domain); _throw(thread, file, line, h_exception, nullptr); diff --git a/src/java.base/share/classes/jdk/internal/vm/TranslatedException.java b/src/java.base/share/classes/jdk/internal/vm/TranslatedException.java index 662ab25a12295..485d69b522606 100644 --- a/src/java.base/share/classes/jdk/internal/vm/TranslatedException.java +++ b/src/java.base/share/classes/jdk/internal/vm/TranslatedException.java @@ -42,9 +42,13 @@ /** * Support for translating exceptions between the HotSpot heap and libjvmci heap. + * + * Successfully translated exceptions are wrapped in a TranslatedException instance. + * This allows callers to distiguish between a translated exception and an error + * that arose during translation. */ @SuppressWarnings("serial") -final class TranslatedException extends Exception { +public final class TranslatedException extends Exception { /** * The value returned by {@link #encodeThrowable(Throwable)} when encoding @@ -61,15 +65,18 @@ final class TranslatedException extends Exception { maybeFailClinit(); try { FALLBACK_ENCODED_THROWABLE_BYTES = - encodeThrowable(new TranslatedException("error during encoding", - "<unknown>"), false); + encodeThrowable(translationFailure("error during encoding"), false); FALLBACK_ENCODED_OUTOFMEMORYERROR_BYTES = - encodeThrowable(new OutOfMemoryError(), false); + encodeThrowable(translationFailure("OutOfMemoryError during encoding"), false); } catch (IOException e) { throw new InternalError(e); } } + private static InternalError translationFailure(String messageFormat, Object... messageArgs) { + return new InternalError(messageFormat.formatted(messageArgs)); + } + /** * Helper to test exception translation. */ @@ -86,14 +93,8 @@ private static void maybeFailClinit() { } } - /** - * Class name of exception that could not be instantiated. - */ - private String originalExceptionClassName; - - private TranslatedException(String message, String originalExceptionClassName) { - super(message); - this.originalExceptionClassName = originalExceptionClassName; + TranslatedException(Throwable translated) { + super(translated); } /** @@ -106,18 +107,6 @@ public Throwable fillInStackTrace() { return this; } - @Override - public String toString() { - String s; - if (originalExceptionClassName.equals(TranslatedException.class.getName())) { - s = getClass().getName(); - } else { - s = getClass().getName() + "[" + originalExceptionClassName + "]"; - } - String message = getMessage(); - return (message != null) ? (s + ": " + message) : s; - } - /** * Prints a stack trace for {@code throwable} if the system property * {@code "jdk.internal.vm.TranslatedException.debug"} is true. @@ -163,7 +152,7 @@ private static Throwable create(String className, String message, Throwable caus return initCause((Throwable) cons.newInstance(message), cause, debug); } catch (Throwable translationFailure) { debugPrintStackTrace(translationFailure, debug); - return initCause(new TranslatedException(message, className), cause, debug); + return initCause(translationFailure("%s [%s]", message, className), cause, debug); } } @@ -308,11 +297,10 @@ static Throwable decodeThrowable(byte[] encodedThrowable, boolean debug) { throwable.setStackTrace(stackTrace); cause = throwable; } - return throwable; + return new TranslatedException(throwable); } catch (Throwable translationFailure) { debugPrintStackTrace(translationFailure, debug); - return new TranslatedException("Error decoding exception: " + encodedThrowable, - translationFailure.getClass().getName()); + return translationFailure("error decoding exception: %s", encodedThrowable); } } } diff --git a/src/java.base/share/classes/jdk/internal/vm/VMSupport.java b/src/java.base/share/classes/jdk/internal/vm/VMSupport.java index a8c3b5d4dfa5f..4ffb7ef7ebec0 100644 --- a/src/java.base/share/classes/jdk/internal/vm/VMSupport.java +++ b/src/java.base/share/classes/jdk/internal/vm/VMSupport.java @@ -122,6 +122,8 @@ public static byte[] serializeAgentPropertiesToByteArray() throws IOException { * 2: an OutOfMemoryError was thrown while encoding the exception * 3: some other problem occured while encoding the exception. If {@code buffer != 0}, * it contains a {@code struct { u4 len; char[len] desc}} where {@code desc} describes the problem + * 4: an OutOfMemoryError thrown from within VM code on a + * thread that cannot call Java (OOME has no stack trace) * </pre> * @param buffer encoded info about the exception to throw (depends on {@code format}) * @param inJVMHeap [@code true} if executing in the JVM heap, {@code false} otherwise @@ -129,13 +131,16 @@ public static byte[] serializeAgentPropertiesToByteArray() throws IOException { */ public static void decodeAndThrowThrowable(int format, long buffer, boolean inJVMHeap, boolean debug) throws Throwable { if (format != 0) { + if (format == 4) { + throw new TranslatedException(new OutOfMemoryError("in VM code and current thread cannot call Java")); + } String context = String.format("while encoding an exception to translate it %s the JVM heap", inJVMHeap ? "to" : "from"); if (format == 1) { throw new InternalError("native buffer could not be allocated " + context); } if (format == 2) { - throw new OutOfMemoryError("OutOfMemoryError occurred " + context); + throw new OutOfMemoryError(context); } if (format == 3 && buffer != 0L) { byte[] bytes = bufferToBytes(buffer); diff --git a/test/jdk/jdk/internal/vm/TestTranslatedException.java b/test/jdk/jdk/internal/vm/TestTranslatedException.java index 145e0faf8b4e4..a7d23510a3661 100644 --- a/test/jdk/jdk/internal/vm/TestTranslatedException.java +++ b/test/jdk/jdk/internal/vm/TestTranslatedException.java @@ -40,6 +40,7 @@ import org.testng.annotations.Test; import jdk.internal.misc.Unsafe; +import jdk.internal.vm.TranslatedException; import jdk.internal.vm.VMSupport; public class TestTranslatedException { @@ -100,6 +101,15 @@ public void encodeDecodeTest() throws Exception { try { VMSupport.decodeAndThrowThrowable(4, 0L, true, false); throw new AssertionError("expected decodeAndThrowThrowable to throw an exception"); + } catch (TranslatedException decoded) { + Assert.assertEquals(decoded.getCause().getClass(), OutOfMemoryError.class); + } catch (Throwable decoded) { + throw new AssertionError("unexpected exception: " + decoded); + } + + try { + VMSupport.decodeAndThrowThrowable(5, 0L, true, false); + throw new AssertionError("expected decodeAndThrowThrowable to throw an exception"); } catch (InternalError decoded) { // Expected } catch (Throwable decoded) { @@ -142,7 +152,7 @@ private void encodeDecode(Throwable throwable) throws Exception { VMSupport.decodeAndThrowThrowable(format, buffer, true, false); throw new AssertionError("expected decodeAndThrowThrowable to throw an exception"); } catch (Throwable decoded) { - assertThrowableEquals(throwable, decoded); + assertThrowableEquals(throwable, decoded.getCause()); } return; } @@ -152,13 +162,15 @@ private void encodeDecode(Throwable throwable) throws Exception { } } - private static void assertThrowableEquals(Throwable original, Throwable decoded) { + private static void assertThrowableEquals(Throwable originalIn, Throwable decodedIn) { + Throwable original = originalIn; + Throwable decoded = decodedIn; try { Assert.assertEquals(original == null, decoded == null); while (original != null) { if (Untranslatable.class.equals(original.getClass())) { - Assert.assertEquals(decoded.getClass().getName(), "jdk.internal.vm.TranslatedException"); - Assert.assertEquals(decoded.toString(), "jdk.internal.vm.TranslatedException[jdk.internal.vm.test.TestTranslatedException$Untranslatable]: test exception"); + Assert.assertEquals(decoded.getClass().getName(), "java.lang.InternalError"); + Assert.assertEquals(decoded.toString(), "java.lang.InternalError: test exception [jdk.internal.vm.test.TestTranslatedException$Untranslatable]"); Assert.assertEquals(original.getMessage(), "test exception"); } else { Assert.assertEquals(decoded.getClass().getName(), original.getClass().getName()); @@ -182,10 +194,10 @@ private static void assertThrowableEquals(Throwable original, Throwable decoded) } } catch (AssertionError e) { System.err.println("original:["); - original.printStackTrace(System.err); + originalIn.printStackTrace(System.err); System.err.println("]"); System.err.println("decoded:["); - original.printStackTrace(System.err); + decodedIn.printStackTrace(System.err); System.err.println("]"); throw e; } From b7d0eff5ad77e338b237773d2fc047eea3d2ac12 Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Thu, 11 Jul 2024 07:29:37 +0000 Subject: [PATCH 361/471] 8207908: JMXStatusTest.java fails assertion intermittently Reviewed-by: cjplummer, amenkov --- .../management/jmxremote/startstop/JMXStatusTest.java | 5 ++--- .../jmxremote/startstop/ManagementAgentJcmd.java | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/test/jdk/sun/management/jmxremote/startstop/JMXStatusTest.java b/test/jdk/sun/management/jmxremote/startstop/JMXStatusTest.java index 1e6259ef0d730..fc1b4883220b6 100644 --- a/test/jdk/sun/management/jmxremote/startstop/JMXStatusTest.java +++ b/test/jdk/sun/management/jmxremote/startstop/JMXStatusTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,8 +88,6 @@ public final void setup() throws Exception { args.addAll(getCustomVmArgs()); args.add(TEST_APP_NAME); testAppPb = ProcessTools.createTestJavaProcessBuilder(args); - - jcmd = new ManagementAgentJcmd(TEST_APP_NAME, false); } @BeforeMethod @@ -98,6 +96,7 @@ public final void startTestApp() throws Exception { TEST_APP_NAME, testAppPb, (Predicate<String>)l->l.trim().equals("main enter") ); + jcmd = new ManagementAgentJcmd(testApp, false); } @AfterMethod diff --git a/test/jdk/sun/management/jmxremote/startstop/ManagementAgentJcmd.java b/test/jdk/sun/management/jmxremote/startstop/ManagementAgentJcmd.java index 0781bc941fd46..7135f6ea2dba4 100644 --- a/test/jdk/sun/management/jmxremote/startstop/ManagementAgentJcmd.java +++ b/test/jdk/sun/management/jmxremote/startstop/ManagementAgentJcmd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,11 +47,11 @@ final class ManagementAgentJcmd { private static final String CMD_STATUS = "ManagementAgent.status"; private static final String CMD_PRINTPERF = "PerfCounter.print"; - private final String id; + private final long pid; private final boolean verbose; - public ManagementAgentJcmd(String targetApp, boolean verbose) { - this.id = targetApp; + public ManagementAgentJcmd(Process targetApp, boolean verbose) { + this.pid = targetApp.pid(); this.verbose = verbose; } @@ -174,7 +174,7 @@ private String jcmd(String ... command) throws IOException, InterruptedException * @throws InterruptedException */ private String jcmd(Consumer<String> c, String ... command) throws IOException, InterruptedException { - return jcmd(id, c, command); + return jcmd(Long.toString(pid), c, command); } /** From 1772a929af0c31bf22153cc19c5d11b00273453b Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan <psadhukhan@openjdk.org> Date: Thu, 11 Jul 2024 07:35:48 +0000 Subject: [PATCH 362/471] =?UTF-8?q?8334457:=20Test=20javax/swing/JTabbedPa?= =?UTF-8?q?ne/bug4666224.java=20fail=20on=20macOS=20with=20because=20press?= =?UTF-8?q?ing=20the=20=E2=80=98C=E2=80=99=20key=20does=20not=20switch=20t?= =?UTF-8?q?he=20layout=20to=20WRAP=5FTAB=5FLAYOUT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: achung, abhiscxk, tr --- test/jdk/javax/swing/JTabbedPane/bug4666224.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/javax/swing/JTabbedPane/bug4666224.java b/test/jdk/javax/swing/JTabbedPane/bug4666224.java index eff34db4c3ee8..0ade8002d8c85 100644 --- a/test/jdk/javax/swing/JTabbedPane/bug4666224.java +++ b/test/jdk/javax/swing/JTabbedPane/bug4666224.java @@ -49,7 +49,7 @@ public class bug4666224 { private static JFrame frame; private static final String INSTRUCTIONS = """ - ON ALL PLATFORMS + ON ALL PLATFORMS except macos where pt.6 is not applicable 1. Click on any of the tabs, focus indicator is visible. 2. Lose focus on the window by clicking on some other window. 3. Focus indicator should disappear From 2928753bd95356467e4fe42ee391e45d1cb6e89c Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas <aboldtch@openjdk.org> Date: Thu, 11 Jul 2024 08:18:46 +0000 Subject: [PATCH 363/471] 8324966: Allow selecting jtreg test case by ID from make Reviewed-by: erikj --- make/InitSupport.gmk | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/make/InitSupport.gmk b/make/InitSupport.gmk index b6a0a8d5d6fd5..ed9cd136c3f79 100644 --- a/make/InitSupport.gmk +++ b/make/InitSupport.gmk @@ -63,14 +63,14 @@ ifeq ($(HAS_SPEC),) # The variable MAKEOVERRIDES contains variable assignments from the command # line, but in reverse order to what the user entered. - # The '\#' <=> '\ 'dance is needed to keep values with space in them connected. - COMMAND_LINE_VARIABLES := $(subst \#,\ , $(call reverse, $(subst \ ,\#,$(MAKEOVERRIDES)))) + # The '§' <=> '\ 'dance is needed to keep values with space in them connected. + COMMAND_LINE_VARIABLES := $(subst §,\ , $(call reverse, $(subst \ ,§,$(MAKEOVERRIDES)))) # A list like FOO="val1" BAR="val2" containing all user-supplied make # variables that we should propagate. - # The '\#' <=> '\ 'dance is needed to keep values with space in them connected. - USER_MAKE_VARS := $(subst \#,\ , $(filter-out $(addsuffix =%, $(INIT_CONTROL_VARIABLES)), \ - $(subst \ ,\#,$(MAKEOVERRIDES)))) + # The '§' <=> '\ 'dance is needed to keep values with space in them connected. + USER_MAKE_VARS := $(subst §,\ , $(filter-out $(addsuffix =%, $(INIT_CONTROL_VARIABLES)), \ + $(subst \ ,§,$(MAKEOVERRIDES)))) # Setup information about available configurations, if any. ifneq ($(CUSTOM_ROOT), ) From 62cbf70346e78ca94ce6ea4ba5a308ea0a2bbfa8 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Thu, 11 Jul 2024 08:28:25 +0000 Subject: [PATCH 364/471] 8336085: Fix simple -Wzero-as-null-pointer-constant warnings in CDS code Reviewed-by: dholmes, jwaters --- src/hotspot/share/cds/archiveBuilder.cpp | 8 ++++---- src/hotspot/share/cds/filemap.hpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp index fdbb6605c13e9..76b6698a40099 100644 --- a/src/hotspot/share/cds/archiveBuilder.cpp +++ b/src/hotspot/share/cds/archiveBuilder.cpp @@ -1292,9 +1292,9 @@ class ArchiveBuilder::CDSMapLogger : AllStatic { address header = address(mapinfo->header()); address header_end = header + mapinfo->header()->header_size(); - log_region("header", header, header_end, 0); + log_region("header", header, header_end, nullptr); log_header(mapinfo); - log_as_hex(header, header_end, 0); + log_as_hex(header, header_end, nullptr); DumpRegion* rw_region = &builder->_rw_region; DumpRegion* ro_region = &builder->_ro_region; @@ -1303,8 +1303,8 @@ class ArchiveBuilder::CDSMapLogger : AllStatic { log_metaspace_region("ro region", ro_region, &builder->_ro_src_objs); address bitmap_end = address(bitmap + bitmap_size_in_bytes); - log_region("bitmap", address(bitmap), bitmap_end, 0); - log_as_hex((address)bitmap, bitmap_end, 0); + log_region("bitmap", address(bitmap), bitmap_end, nullptr); + log_as_hex((address)bitmap, bitmap_end, nullptr); #if INCLUDE_CDS_JAVA_HEAP if (heap_info->is_used()) { diff --git a/src/hotspot/share/cds/filemap.hpp b/src/hotspot/share/cds/filemap.hpp index 54881b8d2375d..7b10c16920b8f 100644 --- a/src/hotspot/share/cds/filemap.hpp +++ b/src/hotspot/share/cds/filemap.hpp @@ -298,7 +298,7 @@ class FileMapHeader: private CDSFileMapHeaderBase { void set_requested_base(char* b) { _requested_base_address = b; - _mapped_base_address = 0; + _mapped_base_address = nullptr; } SharedPathTable shared_path_table() const { From b32e4a68bca588d908bd81a398eb3171a6876dc5 Mon Sep 17 00:00:00 2001 From: Xiaolong Peng <xpeng@openjdk.org> Date: Thu, 11 Jul 2024 08:47:15 +0000 Subject: [PATCH 365/471] 8335356: Shenandoah: Improve concurrent cleanup locking Reviewed-by: ysr, shade --- .../share/gc/shenandoah/shenandoahFreeSet.cpp | 20 +++++++++++++++---- .../share/gc/shenandoah/shenandoahFreeSet.hpp | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp index 258dfe17b736e..725cfc85da645 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp @@ -577,6 +577,7 @@ void ShenandoahRegionPartitions::assert_bounds() { ShenandoahFreeSet::ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions) : _heap(heap), _partitions(max_regions, this), + _trash_regions(NEW_C_HEAP_ARRAY(ShenandoahHeapRegion*, max_regions, mtGC)), _right_to_left_bias(false), _alloc_bias_weight(0) { @@ -899,7 +900,7 @@ HeapWord* ShenandoahFreeSet::allocate_contiguous(ShenandoahAllocRequest& req) { return _heap->get_region(beg)->bottom(); } -void ShenandoahFreeSet::try_recycle_trashed(ShenandoahHeapRegion *r) { +void ShenandoahFreeSet::try_recycle_trashed(ShenandoahHeapRegion* r) { if (r->is_trash()) { _heap->decrease_used(r->used()); r->recycle(); @@ -910,13 +911,24 @@ void ShenandoahFreeSet::recycle_trash() { // lock is not reentrable, check we don't have it shenandoah_assert_not_heaplocked(); + size_t count = 0; for (size_t i = 0; i < _heap->num_regions(); i++) { ShenandoahHeapRegion* r = _heap->get_region(i); if (r->is_trash()) { - ShenandoahHeapLocker locker(_heap->lock()); - try_recycle_trashed(r); + _trash_regions[count++] = r; + } + } + + // Relinquish the lock after this much time passed. + static constexpr jlong deadline_ns = 30000; // 30 us + size_t idx = 0; + while (idx < count) { + os::naked_yield(); // Yield to allow allocators to take the lock + ShenandoahHeapLocker locker(_heap->lock()); + const jlong deadline = os::javaTimeNanos() + deadline_ns; + while (idx < count && os::javaTimeNanos() < deadline) { + try_recycle_trashed(_trash_regions[idx++]); } - SpinPause(); // allow allocators to take the lock } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp index e4789d48f802e..1975174b78492 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp @@ -258,6 +258,7 @@ class ShenandoahFreeSet : public CHeapObj<mtGC> { private: ShenandoahHeap* const _heap; ShenandoahRegionPartitions _partitions; + ShenandoahHeapRegion** _trash_regions; // Mutator allocations are biased from left-to-right or from right-to-left based on which end of mutator range // is most likely to hold partially used regions. In general, we want to finish consuming partially used From 6fcd49f9431cc3507f96ef2acdca43fc6a394a14 Mon Sep 17 00:00:00 2001 From: Pavel Rappo <prappo@openjdk.org> Date: Thu, 11 Jul 2024 10:08:54 +0000 Subject: [PATCH 366/471] 8336239: Fix javadoc markup in java.lang.Process Reviewed-by: jpai --- src/java.base/share/classes/java/lang/Process.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/lang/Process.java b/src/java.base/share/classes/java/lang/Process.java index f9762ffbcdb35..756705285d966 100644 --- a/src/java.base/share/classes/java/lang/Process.java +++ b/src/java.base/share/classes/java/lang/Process.java @@ -64,7 +64,7 @@ * {@link #getInputStream()}, and * {@link #getErrorStream()}. * The I/O streams of characters and lines can be written and read using the methods - * {@link #outputWriter()}, {@link #outputWriter(Charset)}}, + * {@link #outputWriter()}, {@link #outputWriter(Charset)}, * {@link #inputReader()}, {@link #inputReader(Charset)}, * {@link #errorReader()}, and {@link #errorReader(Charset)}. * The parent process uses these streams to feed input to and get output From 5c612c230b0a852aed5fd36e58b82ebf2e1838af Mon Sep 17 00:00:00 2001 From: Robbin Ehn <rehn@openjdk.org> Date: Thu, 11 Jul 2024 10:24:00 +0000 Subject: [PATCH 367/471] 8332689: RISC-V: Use load instead of trampolines Reviewed-by: fyang, mli, luhenry --- src/hotspot/cpu/riscv/c1_CodeStubs_riscv.cpp | 2 +- .../cpu/riscv/c1_LIRAssembler_riscv.cpp | 2 +- .../cpu/riscv/c1_LIRAssembler_riscv.hpp | 8 +- .../cpu/riscv/c2_MacroAssembler_riscv.cpp | 4 +- src/hotspot/cpu/riscv/codeBuffer_riscv.cpp | 7 +- src/hotspot/cpu/riscv/codeBuffer_riscv.hpp | 2 +- src/hotspot/cpu/riscv/compiledIC_riscv.cpp | 5 +- src/hotspot/cpu/riscv/globals_riscv.hpp | 4 +- .../cpu/riscv/jvmciCodeInstaller_riscv.cpp | 2 +- .../cpu/riscv/macroAssembler_riscv.cpp | 133 +++-- .../cpu/riscv/macroAssembler_riscv.hpp | 88 ++- src/hotspot/cpu/riscv/nativeInst_riscv.cpp | 528 +++++++++++++++++- src/hotspot/cpu/riscv/nativeInst_riscv.hpp | 159 ++---- src/hotspot/cpu/riscv/relocInfo_riscv.cpp | 15 +- src/hotspot/cpu/riscv/riscv.ad | 32 +- src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp | 4 +- 16 files changed, 720 insertions(+), 275 deletions(-) diff --git a/src/hotspot/cpu/riscv/c1_CodeStubs_riscv.cpp b/src/hotspot/cpu/riscv/c1_CodeStubs_riscv.cpp index 1a24f78ad12a6..b7e1b7863efdb 100644 --- a/src/hotspot/cpu/riscv/c1_CodeStubs_riscv.cpp +++ b/src/hotspot/cpu/riscv/c1_CodeStubs_riscv.cpp @@ -318,7 +318,7 @@ void ArrayCopyStub::emit_code(LIR_Assembler* ce) { } Address resolve(SharedRuntime::get_resolve_static_call_stub(), relocInfo::static_call_type); - address call = __ trampoline_call(resolve); + address call = __ reloc_call(resolve); if (call == nullptr) { ce->bailout("trampoline stub overflow"); return; diff --git a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp index b2489268611b7..798679185d3a2 100644 --- a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp @@ -1346,7 +1346,7 @@ void LIR_Assembler::align_call(LIR_Code code) { } void LIR_Assembler::call(LIR_OpJavaCall* op, relocInfo::relocType rtype) { - address call = __ trampoline_call(Address(op->addr(), rtype)); + address call = __ reloc_call(Address(op->addr(), rtype)); if (call == nullptr) { bailout("trampoline stub overflow"); return; diff --git a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp index ce23213776c08..4388d0cf4d71d 100644 --- a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp @@ -69,15 +69,15 @@ friend class ArrayCopyStub; enum { // See emit_static_call_stub for detail // CompiledDirectCall::to_interp_stub_size() (14) + CompiledDirectCall::to_trampoline_stub_size() (1 + 3 + address) - _call_stub_size = 14 * NativeInstruction::instruction_size + - (NativeInstruction::instruction_size + NativeCallTrampolineStub::instruction_size), + _call_stub_size = 14 * MacroAssembler::instruction_size + + (MacroAssembler::instruction_size + MacroAssembler::NativeShortCall::trampoline_size), // See emit_exception_handler for detail // verify_not_null_oop + far_call + should_not_reach_here + invalidate_registers(DEBUG_ONLY) _exception_handler_size = DEBUG_ONLY(584) NOT_DEBUG(548), // or smaller // See emit_deopt_handler for detail // auipc (1) + far_jump (6 or 2) - _deopt_handler_size = 1 * NativeInstruction::instruction_size + - 6 * NativeInstruction::instruction_size // or smaller + _deopt_handler_size = 1 * MacroAssembler::instruction_size + + 6 * MacroAssembler::instruction_size // or smaller }; void check_conflict(ciKlass* exact_klass, intptr_t current_klass, Register tmp, diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp index 3cb2e52c8cb93..d88e4bf320d70 100644 --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp @@ -1040,7 +1040,7 @@ void C2_MacroAssembler::string_indexof(Register haystack, Register needle, stub = RuntimeAddress(StubRoutines::riscv::string_indexof_linear_uu()); assert(stub.target() != nullptr, "string_indexof_linear_uu stub has not been generated"); } - address call = trampoline_call(stub); + address call = reloc_call(stub); if (call == nullptr) { DEBUG_ONLY(reset_labels(LINEARSEARCH, DONE, NOMATCH)); ciEnv::current()->record_failure("CodeCache is full"); @@ -1478,7 +1478,7 @@ void C2_MacroAssembler::string_compare(Register str1, Register str2, ShouldNotReachHere(); } assert(stub.target() != nullptr, "compare_long_string stub has not been generated"); - address call = trampoline_call(stub); + address call = reloc_call(stub); if (call == nullptr) { DEBUG_ONLY(reset_labels(DONE, SHORT_LOOP, SHORT_STRING, SHORT_LAST, SHORT_LOOP_TAIL, SHORT_LAST2, SHORT_LAST_INIT, SHORT_LOOP_START)); ciEnv::current()->record_failure("CodeCache is full"); diff --git a/src/hotspot/cpu/riscv/codeBuffer_riscv.cpp b/src/hotspot/cpu/riscv/codeBuffer_riscv.cpp index d62d595e4bc5e..e772959ed0845 100644 --- a/src/hotspot/cpu/riscv/codeBuffer_riscv.cpp +++ b/src/hotspot/cpu/riscv/codeBuffer_riscv.cpp @@ -50,17 +50,18 @@ static bool emit_shared_trampolines(CodeBuffer* cb, CodeBuffer::SharedTrampoline if (requests == nullptr) { return true; } + assert(UseTrampolines, "We are not using trampolines"); MacroAssembler masm(cb); auto emit = [&](address dest, const CodeBuffer::Offsets &offsets) { - assert(cb->stubs()->remaining() >= MacroAssembler::max_trampoline_stub_size(), "pre-allocated trampolines"); + assert(cb->stubs()->remaining() >= MacroAssembler::max_reloc_call_stub_size(), "pre-allocated trampolines"); LinkedListIterator<int> it(offsets.head()); int offset = *it.next(); address stub = __ emit_trampoline_stub(offset, dest); assert(stub, "pre-allocated trampolines"); - address reloc_pc = cb->stubs()->end() - NativeCallTrampolineStub::instruction_size; + address reloc_pc = cb->stubs()->end() - MacroAssembler::NativeShortCall::trampoline_size; while (!it.is_empty()) { offset = *it.next(); address caller_pc = cb->insts()->start() + offset; @@ -70,7 +71,7 @@ static bool emit_shared_trampolines(CodeBuffer* cb, CodeBuffer::SharedTrampoline }; assert(requests->number_of_entries() >= 1, "at least one"); - const int total_requested_size = MacroAssembler::max_trampoline_stub_size() * requests->number_of_entries(); + const int total_requested_size = MacroAssembler::max_reloc_call_stub_size() * requests->number_of_entries(); if (cb->stubs()->maybe_expand_to_ensure_remaining(total_requested_size) && cb->blob() == nullptr) { return false; } diff --git a/src/hotspot/cpu/riscv/codeBuffer_riscv.hpp b/src/hotspot/cpu/riscv/codeBuffer_riscv.hpp index 73a7f1cb89f9b..de70bc2ecc935 100644 --- a/src/hotspot/cpu/riscv/codeBuffer_riscv.hpp +++ b/src/hotspot/cpu/riscv/codeBuffer_riscv.hpp @@ -33,7 +33,7 @@ public: void flush_bundle(bool start_new_bundle) {} - static constexpr bool supports_shared_stubs() { return true; } + static bool supports_shared_stubs() { return UseTrampolines; } void share_trampoline_for(address dest, int caller_offset); diff --git a/src/hotspot/cpu/riscv/compiledIC_riscv.cpp b/src/hotspot/cpu/riscv/compiledIC_riscv.cpp index 60dceb3ada734..4bbea8f356f0b 100644 --- a/src/hotspot/cpu/riscv/compiledIC_riscv.cpp +++ b/src/hotspot/cpu/riscv/compiledIC_riscv.cpp @@ -69,10 +69,9 @@ int CompiledDirectCall::to_interp_stub_size() { } int CompiledDirectCall::to_trampoline_stub_size() { - // Somewhat pessimistically, we count 4 instructions here (although - // there are only 3) because we sometimes emit an alignment nop. + // We count instructions and an additional alignment nop. // Trampoline stubs are always word aligned. - return MacroAssembler::max_trampoline_stub_size(); + return MacroAssembler::max_reloc_call_stub_size(); } // Relocation entries for call stub, compiled java to interpreter. diff --git a/src/hotspot/cpu/riscv/globals_riscv.hpp b/src/hotspot/cpu/riscv/globals_riscv.hpp index c39b29f6ee4a7..c2585f2d1618d 100644 --- a/src/hotspot/cpu/riscv/globals_riscv.hpp +++ b/src/hotspot/cpu/riscv/globals_riscv.hpp @@ -120,6 +120,8 @@ define_pd_global(intx, InlineSmallCode, 1000); product(bool, UseZvkn, false, EXPERIMENTAL, \ "Use Zvkn group extension, Zvkned, Zvknhb, Zvkb, Zvkt") \ product(bool, UseRVVForBigIntegerShiftIntrinsics, true, \ - "Use RVV instructions for left/right shift of BigInteger") + "Use RVV instructions for left/right shift of BigInteger") \ + product(bool, UseTrampolines, false, EXPERIMENTAL, \ + "Far calls uses jal to trampoline.") #endif // CPU_RISCV_GLOBALS_RISCV_HPP diff --git a/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp b/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp index ba3d9c99aceb1..a366ef6171dd0 100644 --- a/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp +++ b/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp @@ -39,7 +39,7 @@ jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMCI_TRAPS) { address pc = (address) inst; if (inst->is_call()) { - return pc_offset + NativeCall::instruction_size; + return pc_offset + NativeCall::byte_size(); } else if (inst->is_jump()) { return pc_offset + NativeJump::instruction_size; } else if (inst->is_movptr1()) { diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index b3ae5fbcdd02b..e349eab317760 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -978,36 +978,23 @@ void MacroAssembler::li(Register Rd, int64_t imm) { } } +void MacroAssembler::load_link_jump(const address source, Register temp) { + assert(temp != noreg && temp != x0, "expecting a register"); + assert_cond(source != nullptr); + int64_t distance = source - pc(); + assert(is_simm32(distance), "Must be"); + auipc(temp, (int32_t)distance + 0x800); + ld(temp, Address(temp, ((int32_t)distance << 20) >> 20)); + jalr(temp); +} + void MacroAssembler::jump_link(const address dest, Register temp) { + assert(UseTrampolines, "Must be"); assert_cond(dest != nullptr); int64_t distance = dest - pc(); - if (is_simm21(distance) && ((distance % 2) == 0)) { - Assembler::jal(x1, distance); - } else { - assert(temp != noreg && temp != x0, "expecting a register"); - int32_t offset = 0; - la(temp, dest, offset); - jalr(temp, offset); - } -} - -void MacroAssembler::jump_link(const Address &adr, Register temp) { - switch (adr.getMode()) { - case Address::literal: { - relocate(adr.rspec(), [&] { - jump_link(adr.target(), temp); - }); - break; - } - case Address::base_plus_offset: { - int32_t offset = ((int32_t)adr.offset() << 20) >> 20; - la(temp, Address(adr.base(), adr.offset() - offset)); - jalr(temp, offset); - break; - } - default: - ShouldNotReachHere(); - } + assert(is_simm21(distance), "Must be"); + assert((distance % 2) == 0, "Must be"); + jal(x1, distance); } void MacroAssembler::j(const address dest, Register temp) { @@ -3941,15 +3928,7 @@ bool MacroAssembler::lookup_secondary_supers_table(Register r_sub_klass, // The next slot to be inspected, by the stub we're about to call, // is secondary_supers[r_array_index]. Bits 0 and 1 in the bitmap // have been checked. - Address stub = RuntimeAddress(StubRoutines::lookup_secondary_supers_table_slow_path_stub()); - if (stub_is_near) { - jump_link(stub, t0); - } else { - address call = trampoline_call(stub); - if (call == nullptr) { - return false; // trampoline allocation failed - } - } + rt_call(StubRoutines::lookup_secondary_supers_table_slow_path_stub()); BLOCK_COMMENT("} lookup_secondary_supers_table"); @@ -4258,12 +4237,42 @@ address MacroAssembler::trampoline_call(Address entry) { return call_pc; } +address MacroAssembler::load_and_call(Address entry) { + assert(entry.rspec().type() == relocInfo::runtime_call_type || + entry.rspec().type() == relocInfo::opt_virtual_call_type || + entry.rspec().type() == relocInfo::static_call_type || + entry.rspec().type() == relocInfo::virtual_call_type, "wrong reloc type"); + + address target = entry.target(); + + if (!in_scratch_emit_size()) { + address stub = emit_address_stub(offset(), target); + if (stub == nullptr) { + postcond(pc() == badAddress); + return nullptr; // CodeCache is full + } + } + + address call_pc = pc(); +#ifdef ASSERT + if (entry.rspec().type() != relocInfo::runtime_call_type) { + assert_alignment(call_pc); + } +#endif + relocate(entry.rspec(), [&] { + load_link_jump(target); + }); + + postcond(pc() != badAddress); + return call_pc; +} + address MacroAssembler::ic_call(address entry, jint method_index) { RelocationHolder rh = virtual_call_Relocation::spec(pc(), method_index); IncompressibleRegion ir(this); // relocations movptr(t1, (address)Universe::non_oop_word(), t0); assert_cond(entry != nullptr); - return trampoline_call(Address(entry, rh)); + return reloc_call(Address(entry, rh)); } int MacroAssembler::ic_check_size() { @@ -4308,6 +4317,34 @@ int MacroAssembler::ic_check(int end_alignment) { return uep_offset; } +address MacroAssembler::emit_address_stub(int insts_call_instruction_offset, address dest) { + address stub = start_a_stub(max_reloc_call_stub_size()); + if (stub == nullptr) { + return nullptr; // CodeBuffer::expand failed + } + + // We are always 4-byte aligned here. + assert_alignment(pc()); + + // Make sure the address of destination 8-byte aligned. + align(wordSize, 0); + + RelocationHolder rh = trampoline_stub_Relocation::spec(code()->insts()->start() + + insts_call_instruction_offset); + const int stub_start_offset = offset(); + relocate(rh, [&] { + assert(offset() - stub_start_offset == 0, + "%ld - %ld == %ld : should be", (long)offset(), (long)stub_start_offset, (long)0); + assert(offset() % wordSize == 0, "bad alignment"); + emit_int64((int64_t)dest); + }); + + const address stub_start_addr = addr_at(stub_start_offset); + end_a_stub(); + + return stub_start_addr; +} + // Emit a trampoline stub for a call to a target which is too far away. // // code sequences: @@ -4322,11 +4359,13 @@ int MacroAssembler::ic_check(int end_alignment) { address MacroAssembler::emit_trampoline_stub(int insts_call_instruction_offset, address dest) { // Max stub size: alignment nop, TrampolineStub. - address stub = start_a_stub(max_trampoline_stub_size()); + address stub = start_a_stub(max_reloc_call_stub_size()); if (stub == nullptr) { return nullptr; // CodeBuffer::expand failed } + assert(UseTrampolines, "Must be using trampos."); + // We are always 4-byte aligned here. assert_alignment(pc()); @@ -4335,7 +4374,7 @@ address MacroAssembler::emit_trampoline_stub(int insts_call_instruction_offset, // instructions code-section. // Make sure the address of destination 8-byte aligned after 3 instructions. - align(wordSize, MacroAssembler::trampoline_stub_data_offset); + align(wordSize, MacroAssembler::NativeShortCall::trampoline_data_offset); RelocationHolder rh = trampoline_stub_Relocation::spec(code()->insts()->start() + insts_call_instruction_offset); @@ -4348,7 +4387,7 @@ address MacroAssembler::emit_trampoline_stub(int insts_call_instruction_offset, ld(t0, target); // auipc + ld jr(t0); // jalr bind(target); - assert(offset() - stub_start_offset == MacroAssembler::trampoline_stub_data_offset, + assert(offset() - stub_start_offset == MacroAssembler::NativeShortCall::trampoline_data_offset, "should be"); assert(offset() % wordSize == 0, "bad alignment"); emit_int64((int64_t)dest); @@ -4356,15 +4395,17 @@ address MacroAssembler::emit_trampoline_stub(int insts_call_instruction_offset, const address stub_start_addr = addr_at(stub_start_offset); - assert(MacroAssembler::is_trampoline_stub_at(stub_start_addr), "doesn't look like a trampoline"); - end_a_stub(); + return stub_start_addr; } -int MacroAssembler::max_trampoline_stub_size() { +int MacroAssembler::max_reloc_call_stub_size() { // Max stub size: alignment nop, TrampolineStub. - return MacroAssembler::instruction_size + MacroAssembler::trampoline_stub_instruction_size; + if (UseTrampolines) { + return instruction_size + MacroAssembler::NativeShortCall::trampoline_size; + } + return instruction_size + wordSize; } int MacroAssembler::static_call_stub_size() { @@ -5083,14 +5124,14 @@ address MacroAssembler::zero_words(Register ptr, Register cnt) { RuntimeAddress zero_blocks(StubRoutines::riscv::zero_blocks()); assert(zero_blocks.target() != nullptr, "zero_blocks stub has not been generated"); if (StubRoutines::riscv::complete()) { - address tpc = trampoline_call(zero_blocks); + address tpc = reloc_call(zero_blocks); if (tpc == nullptr) { DEBUG_ONLY(reset_labels(around)); postcond(pc() == badAddress); return nullptr; } } else { - jump_link(zero_blocks, t0); + rt_call(zero_blocks.target()); } } bind(around); diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp index ea2b9229eab47..3c1add9036763 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp @@ -466,8 +466,10 @@ class MacroAssembler: public Assembler { return false; } + address emit_address_stub(int insts_call_instruction_offset, address target); address emit_trampoline_stub(int insts_call_instruction_offset, address target); - static int max_trampoline_stub_size(); + static int max_reloc_call_stub_size(); + void emit_static_call_stub(); static int static_call_stub_size(); @@ -623,8 +625,8 @@ class MacroAssembler: public Assembler { void bgtz(Register Rs, const address dest); private: + void load_link_jump(const address source, Register temp = t0); void jump_link(const address dest, Register temp); - void jump_link(const Address &adr, Register temp); public: // We try to follow risc-v asm menomics. // But as we don't layout a reachable GOT, @@ -1205,7 +1207,27 @@ class MacroAssembler: public Assembler { // be used instead. // All instructions are embedded at a call site. // - // - trampoline call: + // - indirect call: movptr + jalr + // This too can reach anywhere in the address space, but it cannot be + // patched while code is running, so it must only be modified at a safepoint. + // This form of call is most suitable for targets at fixed addresses, which + // will never be patched. + // + // - reloc call: + // This is only available in C1/C2-generated code (nmethod). + // + // [Main code section] + // auipc + // ld <address_from_stub_section> + // jalr + // [Stub section] + // trampoline: + // <64-bit destination address> + // + // To change the destination we simply atomically store the new + // address in the stub section. + // + // - trampoline call (old reloc call / -XX:+UseTrampolines): // This is only available in C1/C2-generated code (nmethod). It is a combination // of a direct call, which is used if the destination of a call is in range, // and a register-indirect call. It has the advantages of reaching anywhere in @@ -1224,18 +1246,11 @@ class MacroAssembler: public Assembler { // cache, 'jal trampoline' is replaced with 'jal destination' and the trampoline // is not used. // The optimization does not remove the trampoline from the stub section. - + // // This is necessary because the trampoline may well be redirected later when // code is patched, and the new destination may not be reachable by a simple JAL // instruction. // - // - indirect call: movptr + jalr - // This too can reach anywhere in the address space, but it cannot be - // patched while code is running, so it must only be modified at a safepoint. - // This form of call is most suitable for targets at fixed addresses, which - // will never be patched. - // - // // To patch a trampoline call when the JAL can't reach, we first modify // the 64-bit destination address in the trampoline, then modify the // JAL to point to the trampoline, then flush the instruction cache to @@ -1248,9 +1263,10 @@ class MacroAssembler: public Assembler { // invalidated, so there will be a trap at its start. // For this to work, the destination address in the trampoline is // always updated, even if we're not using the trampoline. + // -- // Emit a direct call if the entry address will always be in range, - // otherwise a trampoline call. + // otherwise a reloc call. // Supported entry.rspec(): // - relocInfo::runtime_call_type // - relocInfo::opt_virtual_call_type @@ -1258,7 +1274,13 @@ class MacroAssembler: public Assembler { // - relocInfo::virtual_call_type // // Return: the call PC or null if CodeCache is full. + address reloc_call(Address entry) { + return UseTrampolines ? trampoline_call(entry) : load_and_call(entry); + } + private: address trampoline_call(Address entry); + address load_and_call(Address entry); + public: address ic_call(address entry, jint method_index = 0); static int ic_check_size(); @@ -1585,51 +1607,20 @@ class MacroAssembler: public Assembler { public: enum { - // Refer to function emit_trampoline_stub. - trampoline_stub_instruction_size = 3 * instruction_size + wordSize, // auipc + ld + jr + target address - trampoline_stub_data_offset = 3 * instruction_size, // auipc + ld + jr - // movptr movptr1_instruction_size = 6 * instruction_size, // lui, addi, slli, addi, slli, addi. See movptr1(). movptr2_instruction_size = 5 * instruction_size, // lui, lui, slli, add, addi. See movptr2(). load_pc_relative_instruction_size = 2 * instruction_size // auipc, ld }; + enum NativeShortCall { + trampoline_size = 3 * instruction_size + wordSize, + trampoline_data_offset = 3 * instruction_size + }; + static bool is_load_pc_relative_at(address branch); static bool is_li16u_at(address instr); - static bool is_trampoline_stub_at(address addr) { - // Ensure that the stub is exactly - // ld t0, L--->auipc + ld - // jr t0 - // L: - - // judge inst + register + imm - // 1). check the instructions: auipc + ld + jalr - // 2). check if auipc[11:7] == t0 and ld[11:7] == t0 and ld[19:15] == t0 && jr[19:15] == t0 - // 3). check if the offset in ld[31:20] equals the data_offset - assert_cond(addr != nullptr); - const int instr_size = instruction_size; - if (is_auipc_at(addr) && - is_ld_at(addr + instr_size) && - is_jalr_at(addr + 2 * instr_size) && - (extract_rd(addr) == x5) && - (extract_rd(addr + instr_size) == x5) && - (extract_rs1(addr + instr_size) == x5) && - (extract_rs1(addr + 2 * instr_size) == x5) && - (Assembler::extract(Assembler::ld_instr(addr + 4), 31, 20) == trampoline_stub_data_offset)) { - return true; - } - return false; - } - - static bool is_call_at(address instr) { - if (is_jal_at(instr) || is_jalr_at(instr)) { - return true; - } - return false; - } - static bool is_jal_at(address instr) { assert_cond(instr != nullptr); return extract_opcode(instr) == 0b1101111; } static bool is_jalr_at(address instr) { assert_cond(instr != nullptr); return extract_opcode(instr) == 0b1100111 && extract_funct3(instr) == 0b000; } static bool is_branch_at(address instr) { assert_cond(instr != nullptr); return extract_opcode(instr) == 0b1100011; } @@ -1664,7 +1655,6 @@ class MacroAssembler: public Assembler { static bool is_lwu_to_zr(address instr); -private: static Register extract_rs1(address instr); static Register extract_rs2(address instr); static Register extract_rd(address instr); diff --git a/src/hotspot/cpu/riscv/nativeInst_riscv.cpp b/src/hotspot/cpu/riscv/nativeInst_riscv.cpp index 348a00b6767f9..f0357f1cd3029 100644 --- a/src/hotspot/cpu/riscv/nativeInst_riscv.cpp +++ b/src/hotspot/cpu/riscv/nativeInst_riscv.cpp @@ -39,71 +39,228 @@ #include "c1/c1_Runtime1.hpp" #endif -void NativeCall::verify() { - assert(MacroAssembler::is_call_at((address)this), "unexpected code at call site"); +//----------------------------------------------------------------------------- +// NativeInstruction + +bool NativeInstruction::is_call_at(address addr) { + return NativeCall::is_at(addr); } -address NativeCall::destination() const { - address addr = (address)this; +//----------------------------------------------------------------------------- +// NativeShortCallTrampoline +// +// Implements the trampoline part of reloc call - trampoline call. + +class NativeShortCall; + +class NativeShortCallTrampolineStub : public NativeInstruction { + private: + friend NativeShortCall; + enum RISCV_specific_constants { + trampoline_data_offset = 3 * NativeInstruction::instruction_size // auipc + ld + jr + }; + + address destination() const; + void set_destination(address new_destination); + + static bool is_at(address addr); + static NativeShortCallTrampolineStub* at(address addr); +}; + +address NativeShortCallTrampolineStub::destination() const { + return ptr_at(trampoline_data_offset); +} + +void NativeShortCallTrampolineStub::set_destination(address new_destination) { + set_ptr_at(trampoline_data_offset, new_destination); + OrderAccess::release(); +} + +bool NativeShortCallTrampolineStub::is_at(address addr) { + // Ensure that the stub is exactly + // ld t0, L--->auipc + ld + // jr t0 + // L: + + // judge inst + register + imm + // 1). check the instructions: auipc + ld + jalr + // 2). check if auipc[11:7] == t0 and ld[11:7] == t0 and ld[19:15] == t0 && jr[19:15] == t0 + // 3). check if the offset in ld[31:20] equals the data_offset + assert_cond(addr != nullptr); + const int instr_size = NativeInstruction::instruction_size; + if (MacroAssembler::is_auipc_at(addr) && + MacroAssembler::is_ld_at(addr + instr_size) && + MacroAssembler::is_jalr_at(addr + 2 * instr_size) && + (MacroAssembler::extract_rd(addr) == x5) && + (MacroAssembler::extract_rd(addr + instr_size) == x5) && + (MacroAssembler::extract_rs1(addr + instr_size) == x5) && + (MacroAssembler::extract_rs1(addr + 2 * instr_size) == x5) && + (Assembler::extract(Assembler::ld_instr(addr + 4), 31, 20) == trampoline_data_offset)) { + return true; + } + return false; +} + +NativeShortCallTrampolineStub* NativeShortCallTrampolineStub::at(address addr) { + assert_cond(addr != nullptr); + assert(NativeShortCallTrampolineStub::is_at(addr), "no call trampoline found"); + return (NativeShortCallTrampolineStub*)addr; +} + +//----------------------------------------------------------------------------- +// NativeShortCall +// +// Implements the trampoline call, a short call with a trampoline, version of reloc call. +// Enabled by setting the experimental UseTrampolines to true. + +class NativeShortCall: private NativeInstruction { + public: + enum RISCV_specific_constants { + return_address_offset = 1 * NativeInstruction::instruction_size // jal + }; + + address instruction_address() const { return addr_at(0); } + address next_instruction_address() const { return addr_at(return_address_offset); } + address return_address() const { return addr_at(return_address_offset); } + address destination() const; + address reloc_destination(address orig_address); + + void set_destination(address dest); + void verify(); + void print(); + + bool set_destination_mt_safe(address dest, bool assert_lock = true); + bool reloc_set_destination(address dest); + + private: + address get_trampoline(); + bool has_trampoline(); + address trampoline_destination(); + public: + + static NativeShortCall* at(address addr); + static bool is_at(address addr); + static bool is_call_before(address return_address); +}; + +address NativeShortCall::destination() const { + address addr = instruction_address(); assert(MacroAssembler::is_jal_at(instruction_address()), "inst must be jal."); + address destination = MacroAssembler::target_addr_for_insn(instruction_address()); // Do we use a trampoline stub for this call? CodeBlob* cb = CodeCache::find_blob(addr); assert(cb && cb->is_nmethod(), "sanity"); nmethod *nm = (nmethod *)cb; - if (nm != nullptr && nm->stub_contains(destination) && MacroAssembler::is_trampoline_stub_at(destination)) { + if (nm != nullptr && nm->stub_contains(destination) && NativeShortCallTrampolineStub::is_at(destination)) { // Yes we do, so get the destination from the trampoline stub. const address trampoline_stub_addr = destination; - destination = nativeCallTrampolineStub_at(trampoline_stub_addr)->destination(); + destination = NativeShortCallTrampolineStub::at(trampoline_stub_addr)->destination(); } return destination; } -// Similar to replace_mt_safe, but just changes the destination. The -// important thing is that free-running threads are able to execute this -// call instruction at all times. +address NativeShortCall::reloc_destination(address orig_address) { + address addr = instruction_address(); + if (NativeShortCall::is_at(addr)) { + NativeShortCall* call = NativeShortCall::at(addr); + if (call->has_trampoline()) { + return call->trampoline_destination(); + } + } + if (orig_address != nullptr) { + // the extracted address from the instructions in address orig_addr + address new_addr = MacroAssembler::pd_call_destination(orig_address); + // If call is branch to self, don't try to relocate it, just leave it + // as branch to self. This happens during code generation if the code + // buffer expands. It will be relocated to the trampoline above once + // code generation is complete. + new_addr = (new_addr == orig_address) ? addr : new_addr; + return new_addr; + } + return MacroAssembler::pd_call_destination(addr); +} + +void NativeShortCall::set_destination(address dest) { + assert(NativeShortCall::is_at(instruction_address()), "unexpected code at call site"); + assert(is_jal(), "Should be jal instruction!"); + intptr_t offset = (intptr_t)(dest - instruction_address()); + assert((offset & 0x1) == 0, "bad alignment"); + assert(Assembler::is_simm21(offset), "encoding constraint"); + unsigned int insn = 0b1101111; // jal + address pInsn = (address)(&insn); + Assembler::patch(pInsn, 31, 31, (offset >> 20) & 0x1); + Assembler::patch(pInsn, 30, 21, (offset >> 1) & 0x3ff); + Assembler::patch(pInsn, 20, 20, (offset >> 11) & 0x1); + Assembler::patch(pInsn, 19, 12, (offset >> 12) & 0xff); + Assembler::patch(pInsn, 11, 7, ra->encoding()); // Rd must be x1, need ra + set_int_at(0, insn); +} + +void NativeShortCall::verify() { + assert(NativeShortCall::is_at(instruction_address()), + "unexpected code at call site: %p", instruction_address()); +} + +void NativeShortCall::print() { + assert(NativeShortCall::is_at(instruction_address()), "unexpected code at call site"); + tty->print_cr(PTR_FORMAT ": jal/auipc,ld,jalr x1, offset/reg", p2i(instruction_address())); +} + +// The important thing is that threads are able to execute this +// call instruction at all times. (cmodx) // // Used in the runtime linkage of calls; see class CompiledIC. // // Add parameter assert_lock to switch off assertion // during code generation, where no patching lock is needed. -void NativeCall::set_destination_mt_safe(address dest, bool assert_lock) { +bool NativeShortCall::set_destination_mt_safe(address dest, bool assert_lock) { assert(!assert_lock || (Patching_lock->is_locked() || SafepointSynchronize::is_at_safepoint()) || - CompiledICLocker::is_safe(addr_at(0)), + CompiledICLocker::is_safe(instruction_address()), "concurrent code patching"); - address addr_call = addr_at(0); - assert(MacroAssembler::is_call_at(addr_call), "unexpected code at call site"); + address call_addr = instruction_address(); + assert(NativeCall::is_at(call_addr), "unexpected code at call site"); + + reloc_set_destination(dest); + + ICache::invalidate_range(call_addr, instruction_size); + return true; +} + +bool NativeShortCall::reloc_set_destination(address dest) { + address call_addr = instruction_address(); + assert(NativeCall::is_at(call_addr), "unexpected code at call site"); // Patch the constant in the call's trampoline stub. address trampoline_stub_addr = get_trampoline(); if (trampoline_stub_addr != nullptr) { - assert (!MacroAssembler::is_trampoline_stub_at(dest), "chained trampolines"); - nativeCallTrampolineStub_at(trampoline_stub_addr)->set_destination(dest); + assert(!NativeShortCallTrampolineStub::is_at(dest), "chained trampolines"); + NativeShortCallTrampolineStub::at(trampoline_stub_addr)->set_destination(dest); } // Patch the call. - if (Assembler::reachable_from_branch_at(addr_call, dest)) { + if (Assembler::reachable_from_branch_at(call_addr, dest)) { set_destination(dest); } else { assert (trampoline_stub_addr != nullptr, "we need a trampoline"); set_destination(trampoline_stub_addr); } - ICache::invalidate_range(addr_call, instruction_size); + return true; } -address NativeCall::get_trampoline() { - address call_addr = addr_at(0); +address NativeShortCall::get_trampoline() { + address call_addr = instruction_address(); CodeBlob *code = CodeCache::find_blob(call_addr); assert(code != nullptr, "Could not find the containing code blob"); address jal_destination = MacroAssembler::pd_call_destination(call_addr); - if (code != nullptr && code->contains(jal_destination) && MacroAssembler::is_trampoline_stub_at(jal_destination)) { + if (code != nullptr && code->contains(jal_destination) && NativeShortCallTrampolineStub::is_at(jal_destination)) { return jal_destination; } @@ -114,8 +271,326 @@ address NativeCall::get_trampoline() { return nullptr; } -// Inserts a native call instruction at a given pc -void NativeCall::insert(address code_pos, address entry) { Unimplemented(); } +bool NativeShortCall::has_trampoline() { + return NativeShortCall::get_trampoline() != nullptr; +} + +address NativeShortCall::trampoline_destination() { + return NativeShortCallTrampolineStub::at(get_trampoline())->destination(); +} + +NativeShortCall* NativeShortCall::at(address addr) { + assert_cond(addr != nullptr); + assert(NativeShortCall::is_at(addr), "unexpected code at call site: %p", addr); + NativeShortCall* call = (NativeShortCall*)(addr); + return call; +} + +bool NativeShortCall::is_at(address addr) { + if (MacroAssembler::is_jal_at(addr)) { + if (MacroAssembler::extract_rd(addr) == x1) { + return true; + } + } + return false; +} + +bool NativeShortCall::is_call_before(address return_address) { + return NativeShortCall::is_at(return_address - instruction_size); +} + +//----------------------------------------------------------------------------- +// NativeFarCall +// +// Implements direct far calling loading an address from the stub section version of reloc call. +// This is the default (experimental flag UseTrampolines, default false). + +class NativeFarCall: public NativeInstruction { + public: + enum RISCV_specific_constants { + return_address_offset = 3 * NativeInstruction::instruction_size, // auipc + ld + jalr + }; + + address instruction_address() const { return addr_at(0); } + address next_instruction_address() const { return addr_at(return_address_offset); } + address return_address() const { return addr_at(return_address_offset); } + address destination() const; + address reloc_destination(address orig_address); + + void set_destination(address dest); + void verify(); + void print(); + + bool set_destination_mt_safe(address dest, bool assert_lock = true); + bool reloc_set_destination(address dest); + + private: + address stub_address(); + + static void set_stub_address_destination_at(address dest, address value); + static address stub_address_destination_at(address src); + public: + + static NativeFarCall* at(address addr); + static bool is_at(address addr); + static bool is_call_before(address return_address); +}; + +address NativeFarCall::destination() const { + address addr = instruction_address(); + assert(NativeFarCall::is_at(addr), "unexpected code at call site"); + + address destination = MacroAssembler::target_addr_for_insn(addr); + + CodeBlob* cb = CodeCache::find_blob(addr); + assert(cb && cb->is_nmethod(), "sanity"); + nmethod *nm = (nmethod *)cb; + assert(nm != nullptr, "Sanity"); + assert(nm->stub_contains(destination), "Sanity"); + assert(destination != nullptr, "Sanity"); + return stub_address_destination_at(destination); +} + +address NativeFarCall::reloc_destination(address orig_address) { + address call_addr = instruction_address(); + + CodeBlob *code = CodeCache::find_blob(call_addr); + assert(code != nullptr, "Could not find the containing code blob"); + + address stub_addr = nullptr; + if (code != nullptr && code->is_nmethod()) { + stub_addr = trampoline_stub_Relocation::get_trampoline_for(call_addr, (nmethod*)code); + } + + if (stub_addr != nullptr) { + stub_addr = MacroAssembler::target_addr_for_insn(call_addr); + } + return stub_addr; +} + +void NativeFarCall::set_destination(address dest) { + address addr = instruction_address(); + assert(NativeFarCall::is_at(addr), "unexpected code at call site"); + Unimplemented(); +} + +void NativeFarCall::verify() { + assert(NativeFarCall::is_at(instruction_address()), "unexpected code at call site"); +} + +void NativeFarCall::print() { + assert(NativeFarCall::is_at(instruction_address()), "unexpected code at call site"); + tty->print_cr(PTR_FORMAT ": auipc,ld,jalr x1, offset/reg, ", p2i(addr_at(0))); +} + +bool NativeFarCall::set_destination_mt_safe(address dest, bool assert_lock) { + assert(NativeFarCall::is_at(addr_at(0)), "unexpected code at call site"); + assert(!assert_lock || + (Patching_lock->is_locked() || SafepointSynchronize::is_at_safepoint()) || + CompiledICLocker::is_safe(addr_at(0)), + "concurrent code patching"); + + address call_addr = addr_at(0); + assert(NativeFarCall::is_at(call_addr), "unexpected code at call site"); + + address stub_addr = stub_address(); + + if (stub_addr != nullptr) { + set_stub_address_destination_at(stub_addr, dest); + return true; + } + + return false; +} + +bool NativeFarCall::reloc_set_destination(address dest) { + address call_addr = addr_at(0); + assert(NativeFarCall::is_at(call_addr), "unexpected code at call site"); + + CodeBlob *code = CodeCache::find_blob(call_addr); + assert(code != nullptr, "Could not find the containing code blob"); + + address stub_addr = nullptr; + if (code != nullptr && code->is_nmethod()) { + stub_addr = trampoline_stub_Relocation::get_trampoline_for(call_addr, (nmethod*)code); + } + + if (stub_addr != nullptr) { + MacroAssembler::pd_patch_instruction_size(call_addr, stub_addr); + } + + return true; +} + +void NativeFarCall::set_stub_address_destination_at(address dest, address value) { + assert_cond(dest != nullptr); + assert_cond(value != nullptr); + + set_data64_at(dest, (uint64_t)value); + OrderAccess::release(); +} + +address NativeFarCall::stub_address_destination_at(address src) { + assert_cond(src != nullptr); + address dest = (address)get_data64_at(src); + return dest; +} + +address NativeFarCall::stub_address() { + address call_addr = addr_at(0); + + CodeBlob *code = CodeCache::find_blob(call_addr); + assert(code != nullptr, "Could not find the containing code blob"); + + address dest = MacroAssembler::pd_call_destination(call_addr); + assert(code->contains(dest), "Sanity"); + return dest; +} + +NativeFarCall* NativeFarCall::at(address addr) { + assert_cond(addr != nullptr); + assert(NativeFarCall::is_at(addr), "unexpected code at call site: %p", addr); + NativeFarCall* call = (NativeFarCall*)(addr); + return call; +} + +bool NativeFarCall::is_at(address addr) { + assert_cond(addr != nullptr); + const int instr_size = NativeInstruction::instruction_size; + if (MacroAssembler::is_auipc_at(addr) && + MacroAssembler::is_ld_at(addr + instr_size) && + MacroAssembler::is_jalr_at(addr + 2 * instr_size) && + (MacroAssembler::extract_rd(addr) == x5) && + (MacroAssembler::extract_rd(addr + instr_size) == x5) && + (MacroAssembler::extract_rs1(addr + instr_size) == x5) && + (MacroAssembler::extract_rs1(addr + 2 * instr_size) == x5) && + (MacroAssembler::extract_rd(addr + 2 * instr_size) == x1)) { + return true; + } + return false; +} + +bool NativeFarCall::is_call_before(address return_address) { + return NativeFarCall::is_at(return_address - return_address_offset); +} + +//----------------------------------------------------------------------------- +// NativeCall + +address NativeCall::instruction_address() const { + if (UseTrampolines) { + return NativeShortCall::at(addr_at(0))->instruction_address(); + } else { + return NativeFarCall::at(addr_at(0))->instruction_address(); + } +} + +address NativeCall::next_instruction_address() const { + if (UseTrampolines) { + return NativeShortCall::at(addr_at(0))->next_instruction_address(); + } else { + return NativeFarCall::at(addr_at(0))->next_instruction_address(); + } +} + +address NativeCall::return_address() const { + if (UseTrampolines) { + return NativeShortCall::at(addr_at(0))->return_address(); + } else { + return NativeFarCall::at(addr_at(0))->return_address(); + } +} + +address NativeCall::destination() const { + if (UseTrampolines) { + return NativeShortCall::at(addr_at(0))->destination(); + } else { + return NativeFarCall::at(addr_at(0))->destination(); + } +} + +address NativeCall::reloc_destination(address orig_address) { + if (UseTrampolines) { + return NativeShortCall::at(addr_at(0))->reloc_destination(orig_address); + } else { + return NativeFarCall::at(addr_at(0))->reloc_destination(orig_address); + } +} + +void NativeCall::set_destination(address dest) { + if (UseTrampolines) { + NativeShortCall::at(addr_at(0))->set_destination(dest); + } else { + NativeFarCall::at(addr_at(0))->set_destination(dest); + } +} + +void NativeCall::verify() { + if (UseTrampolines) { + NativeShortCall::at(addr_at(0))->verify(); + } else { + NativeFarCall::at(addr_at(0))->verify();; + } +} + +void NativeCall::print() { + if (UseTrampolines) { + NativeShortCall::at(addr_at(0))->print(); + } else { + NativeFarCall::at(addr_at(0))->print();; + } +} + +bool NativeCall::set_destination_mt_safe(address dest, bool assert_lock) { + if (UseTrampolines) { + return NativeShortCall::at(addr_at(0))->set_destination_mt_safe(dest, assert_lock); + } else { + return NativeFarCall::at(addr_at(0))->set_destination_mt_safe(dest, assert_lock); + } +} + +bool NativeCall::reloc_set_destination(address dest) { + if (UseTrampolines) { + return NativeShortCall::at(addr_at(0))->reloc_set_destination(dest); + } else { + return NativeFarCall::at(addr_at(0))->reloc_set_destination(dest); + } +} + +bool NativeCall::is_at(address addr) { + if (UseTrampolines) { + return NativeShortCall::is_at(addr); + } else { + return NativeFarCall::is_at(addr); + } +} + +bool NativeCall::is_call_before(address return_address) { + if (UseTrampolines) { + return NativeShortCall::is_call_before(return_address); + } else { + return NativeFarCall::is_call_before(return_address); + } +} + +NativeCall* nativeCall_at(address addr) { + assert_cond(addr != nullptr); + NativeCall* call = (NativeCall*)(addr); + DEBUG_ONLY(call->verify()); + return call; +} + +NativeCall* nativeCall_before(address return_address) { + assert_cond(return_address != nullptr); + NativeCall* call = nullptr; + if (UseTrampolines) { + call = (NativeCall*)(return_address - NativeShortCall::return_address_offset); + } else { + call = (NativeCall*)(return_address - NativeFarCall::return_address_offset); + } + DEBUG_ONLY(call->verify()); + return call; +} //------------------------------------------------------------------- @@ -327,15 +802,6 @@ void NativeGeneralJump::replace_mt_safe(address instr_addr, address code_buffer) //------------------------------------------------------------------- -address NativeCallTrampolineStub::destination(nmethod *nm) const { - return ptr_at(data_offset); -} - -void NativeCallTrampolineStub::set_destination(address new_destination) { - set_ptr_at(data_offset, new_destination); - OrderAccess::release(); -} - void NativePostCallNop::make_deopt() { MacroAssembler::assert_alignment(addr_at(0)); NativeDeoptInstruction::insert(addr_at(0)); diff --git a/src/hotspot/cpu/riscv/nativeInst_riscv.hpp b/src/hotspot/cpu/riscv/nativeInst_riscv.hpp index f925f8950aa23..0ac3a89969a25 100644 --- a/src/hotspot/cpu/riscv/nativeInst_riscv.hpp +++ b/src/hotspot/cpu/riscv/nativeInst_riscv.hpp @@ -41,8 +41,6 @@ // - - NativeJump // - - NativeGeneralJump // - - NativeIllegalInstruction -// - - NativeCallTrampolineStub -// - - NativeMembar // - - NativePostCallNop // - - NativeDeoptInstruction @@ -69,30 +67,31 @@ class NativeInstruction { bool is_movptr1() const { return MacroAssembler::is_movptr1_at(addr_at(0)); } bool is_movptr2() const { return MacroAssembler::is_movptr2_at(addr_at(0)); } bool is_auipc() const { return MacroAssembler::is_auipc_at(addr_at(0)); } - bool is_call() const { return MacroAssembler::is_call_at(addr_at(0)); } bool is_jump() const { return MacroAssembler::is_jump_at(addr_at(0)); } + bool is_call() const { return is_call_at(addr_at(0)); } + static bool is_call_at(address addr); - inline bool is_nop() const; - inline bool is_jump_or_nop(); + bool is_nop() const; + bool is_jump_or_nop(); bool is_safepoint_poll(); bool is_sigill_not_entrant(); bool is_stop(); protected: - address addr_at(int offset) const { return address(this) + offset; } + address addr_at(int offset) const { return address(this) + offset; } + jint int_at(int offset) const { return (jint) Bytes::get_native_u4(addr_at(offset)); } + juint uint_at(int offset) const { return Bytes::get_native_u4(addr_at(offset)); } + address ptr_at(int offset) const { return (address) Bytes::get_native_u8(addr_at(offset)); } + oop oop_at(int offset) const { return cast_to_oop(Bytes::get_native_u8(addr_at(offset))); } - jint int_at(int offset) const { return (jint)Bytes::get_native_u4(addr_at(offset)); } - juint uint_at(int offset) const { return Bytes::get_native_u4(addr_at(offset)); } - address ptr_at(int offset) const { return (address)Bytes::get_native_u8(addr_at(offset)); } + void set_int_at(int offset, jint i) { Bytes::put_native_u4(addr_at(offset), i); } + void set_uint_at(int offset, jint i) { Bytes::put_native_u4(addr_at(offset), i); } + void set_ptr_at(int offset, address ptr) { Bytes::put_native_u8(addr_at(offset), (u8)ptr); } + void set_oop_at(int offset, oop o) { Bytes::put_native_u8(addr_at(offset), cast_from_oop<u8>(o)); } - oop oop_at (int offset) const { return cast_to_oop(Bytes::get_native_u8(addr_at(offset))); } - - - void set_int_at(int offset, jint i) { Bytes::put_native_u4(addr_at(offset), i); } - void set_uint_at(int offset, jint i) { Bytes::put_native_u4(addr_at(offset), i); } - void set_ptr_at (int offset, address ptr) { Bytes::put_native_u8(addr_at(offset), (u8)ptr); } - void set_oop_at (int offset, oop o) { Bytes::put_native_u8(addr_at(offset), cast_from_oop<u8>(o)); } + static void set_data64_at(address dest, uint64_t data) { Bytes::put_native_u8(dest, (u8)data); } + static uint64_t get_data64_at(address src) { return Bytes::get_native_u8(src); } public: @@ -103,99 +102,56 @@ class NativeInstruction { } }; -inline NativeInstruction* nativeInstruction_at(address addr) { +NativeInstruction* nativeInstruction_at(address addr) { return (NativeInstruction*)addr; } -// The natural type of an RISCV instruction is uint32_t -inline NativeInstruction* nativeInstruction_at(uint32_t *addr) { - return (NativeInstruction*)addr; -} +NativeCall* nativeCall_at(address addr); +NativeCall* nativeCall_before(address return_address); -inline NativeCall* nativeCall_at(address addr); // The NativeCall is an abstraction for accessing/manipulating native // call instructions (used to manipulate inline caches, primitive & // DSO calls, etc.). - -class NativeCall: public NativeInstruction { - public: - enum RISCV_specific_constants { - instruction_size = 4, - instruction_offset = 0, - displacement_offset = 0, - return_address_offset = 4 +class NativeCall: private NativeInstruction { + // private: when common code is using byte_size() + private: + enum { + // Use byte_size() as it can be changed in runtime + // Since instruction_size exists on NativeInstruction we need + // to overload and hide it. + instruction_size = 3 * Assembler::instruction_size // auipc + ld + jalr }; + public: - static int byte_size() { return instruction_size; } - address instruction_address() const { return addr_at(instruction_offset); } - address next_instruction_address() const { return addr_at(return_address_offset); } - address return_address() const { return addr_at(return_address_offset); } - address destination() const; - - void set_destination(address dest) { - assert(is_jal(), "Should be jal instruction!"); - intptr_t offset = (intptr_t)(dest - instruction_address()); - assert((offset & 0x1) == 0, "bad alignment"); - assert(Assembler::is_simm21(offset), "encoding constraint"); - unsigned int insn = 0b1101111; // jal - address pInsn = (address)(&insn); - Assembler::patch(pInsn, 31, 31, (offset >> 20) & 0x1); - Assembler::patch(pInsn, 30, 21, (offset >> 1) & 0x3ff); - Assembler::patch(pInsn, 20, 20, (offset >> 11) & 0x1); - Assembler::patch(pInsn, 19, 12, (offset >> 12) & 0xff); - Assembler::patch(pInsn, 11, 7, ra->encoding()); // Rd must be x1, need ra - set_int_at(displacement_offset, insn); + static int byte_size() { + if (UseTrampolines) { + return NativeInstruction::instruction_size; // jal + } else { + return 3 * NativeInstruction::instruction_size; // auipc + ld + jalr + } } + // Creation + friend NativeCall* nativeCall_at(address addr); + friend NativeCall* nativeCall_before(address return_address); + + address instruction_address() const; + address next_instruction_address() const; + address return_address() const; + address destination() const; + address reloc_destination(address orig_address); void verify_alignment() {} // do nothing on riscv void verify(); void print(); - // Creation - inline friend NativeCall* nativeCall_at(address addr); - inline friend NativeCall* nativeCall_before(address return_address); - - static bool is_call_before(address return_address) { - return MacroAssembler::is_call_at(return_address - NativeCall::return_address_offset); - } - - // MT-safe patching of a call instruction. - static void insert(address code_pos, address entry); - - static void replace_mt_safe(address instr_addr, address code_buffer); - - // Similar to replace_mt_safe, but just changes the destination. The - // important thing is that free-running threads are able to execute - // this call instruction at all times. If the call is an immediate BL - // instruction we can simply rely on atomicity of 32-bit writes to - // make sure other threads will see no intermediate states. - - // We cannot rely on locks here, since the free-running threads must run at - // full speed. - // - // Used in the runtime linkage of calls; see class CompiledIC. - // (Cf. 4506997 and 4479829, where threads witnessed garbage displacements.) + void set_destination(address dest); + bool set_destination_mt_safe(address dest, bool assert_lock = true); + bool reloc_set_destination(address dest); - // The parameter assert_lock disables the assertion during code generation. - void set_destination_mt_safe(address dest, bool assert_lock = true); - - address get_trampoline(); + static bool is_at(address addr); + static bool is_call_before(address return_address); }; -inline NativeCall* nativeCall_at(address addr) { - assert_cond(addr != nullptr); - NativeCall* call = (NativeCall*)(addr - NativeCall::instruction_offset); - DEBUG_ONLY(call->verify()); - return call; -} - -inline NativeCall* nativeCall_before(address return_address) { - assert_cond(return_address != nullptr); - NativeCall* call = (NativeCall*)(return_address - NativeCall::return_address_offset); - DEBUG_ONLY(call->verify()); - return call; -} - // An interface for accessing/manipulating native mov reg, imm instructions. // (used to manipulate inlined 64-bit data calls, etc.) class NativeMovConstReg: public NativeInstruction { @@ -366,27 +322,6 @@ inline bool NativeInstruction::is_jump_or_nop() { return is_nop() || is_jump(); } -// Call trampoline stubs. -class NativeCallTrampolineStub : public NativeInstruction { - public: - - enum RISCV_specific_constants { - // Refer to function emit_trampoline_stub. - instruction_size = MacroAssembler::trampoline_stub_instruction_size, // auipc + ld + jr + target address - data_offset = MacroAssembler::trampoline_stub_data_offset, // auipc + ld + jr - }; - - address destination(nmethod *nm = nullptr) const; - void set_destination(address new_destination); - ptrdiff_t destination_offset() const; -}; - -inline NativeCallTrampolineStub* nativeCallTrampolineStub_at(address addr) { - assert_cond(addr != nullptr); - assert(MacroAssembler::is_trampoline_stub_at(addr), "no call trampoline found"); - return (NativeCallTrampolineStub*)addr; -} - // A NativePostCallNop takes the form of three instructions: // nop; lui zr, hi20; addiw zr, lo12 // diff --git a/src/hotspot/cpu/riscv/relocInfo_riscv.cpp b/src/hotspot/cpu/riscv/relocInfo_riscv.cpp index 43a9b8f89aeaa..d0903c96e2271 100644 --- a/src/hotspot/cpu/riscv/relocInfo_riscv.cpp +++ b/src/hotspot/cpu/riscv/relocInfo_riscv.cpp @@ -60,12 +60,10 @@ void Relocation::pd_set_data_value(address x, bool verify_only) { address Relocation::pd_call_destination(address orig_addr) { assert(is_call(), "should be an address instruction here"); - if (MacroAssembler::is_call_at(addr())) { - address trampoline = nativeCall_at(addr())->get_trampoline(); - if (trampoline != nullptr) { - return nativeCallTrampolineStub_at(trampoline)->destination(); - } + if (NativeCall::is_at(addr())) { + return nativeCall_at(addr())->reloc_destination(orig_addr); } + // Non call reloc if (orig_addr != nullptr) { // the extracted address from the instructions in address orig_addr address new_addr = MacroAssembler::pd_call_destination(orig_addr); @@ -81,10 +79,9 @@ address Relocation::pd_call_destination(address orig_addr) { void Relocation::pd_set_call_destination(address x) { assert(is_call(), "should be an address instruction here"); - if (MacroAssembler::is_call_at(addr())) { - address trampoline = nativeCall_at(addr())->get_trampoline(); - if (trampoline != nullptr) { - nativeCall_at(addr())->set_destination_mt_safe(x, /* assert_lock */false); + if (NativeCall::is_at(addr())) { + NativeCall* nc = nativeCall_at(addr()); + if (nc->reloc_set_destination(x)) { return; } } diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index e2a1fcf621fab..b176c6e9cb7c2 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1238,17 +1238,24 @@ bool needs_acquiring_load_reserved(const Node *n) int MachCallStaticJavaNode::ret_addr_offset() { - // jal - return 1 * NativeInstruction::instruction_size; + if (UseTrampolines) { + return 1 * NativeInstruction::instruction_size; // jal + } + return 3 * NativeInstruction::instruction_size; // auipc + ld + jalr } int MachCallDynamicJavaNode::ret_addr_offset() { - return NativeMovConstReg::movptr2_instruction_size + NativeInstruction::instruction_size; // movptr2, jal + if (UseTrampolines) { + return NativeMovConstReg::movptr2_instruction_size + NativeInstruction::instruction_size; // movptr2, jal + } + return NativeMovConstReg::movptr2_instruction_size + (3 * NativeInstruction::instruction_size); // movptr2, auipc + ld + jal } int MachCallRuntimeNode::ret_addr_offset() { - // for generated stubs the call will be + // For generated stubs the call will be: + // auipc + ld + jalr + // Using trampos: // jal(addr) // or with far branches // jal(trampoline_stub) @@ -1261,7 +1268,10 @@ int MachCallRuntimeNode::ret_addr_offset() { // jalr(t0) -> jalr CodeBlob *cb = CodeCache::find_blob(_entry_point); if (cb != nullptr) { - return 1 * NativeInstruction::instruction_size; + if (UseTrampolines) { + return 1 * NativeInstruction::instruction_size; + } + return 3 * NativeInstruction::instruction_size; } else { return 11 * NativeInstruction::instruction_size; } @@ -2403,7 +2413,7 @@ encode %{ assert_cond(addr != nullptr); if (!_method) { // A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap. - call = __ trampoline_call(Address(addr, relocInfo::runtime_call_type)); + call = __ reloc_call(Address(addr, relocInfo::runtime_call_type)); if (call == nullptr) { ciEnv::current()->record_failure("CodeCache is full"); return; @@ -2412,12 +2422,16 @@ encode %{ // The NOP here is purely to ensure that eliding a call to // JVM_EnsureMaterializedForStackWalk doesn't change the code size. __ nop(); + if (!UseTrampolines) { + __ nop(); + __ nop(); + } __ block_comment("call JVM_EnsureMaterializedForStackWalk (elided)"); } else { int method_index = resolved_method_index(masm); RelocationHolder rspec = _optimized_virtual ? opt_virtual_call_Relocation::spec(method_index) : static_call_Relocation::spec(method_index); - call = __ trampoline_call(Address(addr, rspec)); + call = __ reloc_call(Address(addr, rspec)); if (call == nullptr) { ciEnv::current()->record_failure("CodeCache is full"); return; @@ -2469,7 +2483,7 @@ encode %{ address entry = (address)$meth$$method; CodeBlob *cb = CodeCache::find_blob(entry); if (cb != nullptr) { - address call = __ trampoline_call(Address(entry, relocInfo::runtime_call_type)); + address call = __ reloc_call(Address(entry, relocInfo::runtime_call_type)); if (call == nullptr) { ciEnv::current()->record_failure("CodeCache is full"); return; @@ -10098,7 +10112,7 @@ instruct partialSubtypeCheckConstSuper(iRegP_R14 sub, iRegP_R10 super_reg, immP $tmpR11$$Register, $tmpR12$$Register, $tmpR13$$Register, $tmpR16$$Register, super_klass_slot); } else { - address call = __ trampoline_call(RuntimeAddress(StubRoutines::lookup_secondary_supers_table_stub(super_klass_slot))); + address call = __ reloc_call(RuntimeAddress(StubRoutines::lookup_secondary_supers_table_stub(super_klass_slot))); success = (call != nullptr); } if (!success) { diff --git a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp index 3af203a95b039..01ab3d5c27403 100644 --- a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp +++ b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp @@ -1005,7 +1005,7 @@ static void gen_continuation_enter(MacroAssembler* masm, // Make sure the call is patchable __ align(NativeInstruction::instruction_size); - const address tr_call = __ trampoline_call(resolve); + const address tr_call = __ reloc_call(resolve); if (tr_call == nullptr) { fatal("CodeCache is full at gen_continuation_enter"); } @@ -1037,7 +1037,7 @@ static void gen_continuation_enter(MacroAssembler* masm, // Make sure the call is patchable __ align(NativeInstruction::instruction_size); - const address tr_call = __ trampoline_call(resolve); + const address tr_call = __ reloc_call(resolve); if (tr_call == nullptr) { fatal("CodeCache is full at gen_continuation_enter"); } From dea92742c2b5889717f2183dc29b5772daff5340 Mon Sep 17 00:00:00 2001 From: Sonia Zaldana Calles <szaldana@openjdk.org> Date: Thu, 11 Jul 2024 14:12:13 +0000 Subject: [PATCH 368/471] 8332125: [nmt] Totals in diff report should print out total malloc and mmap diffs Reviewed-by: stuefe, jsjolen --- src/hotspot/share/nmt/memReporter.cpp | 28 +++++ .../runtime/NMT/TotalMallocMmapDiffTest.java | 107 ++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 test/hotspot/jtreg/runtime/NMT/TotalMallocMmapDiffTest.java diff --git a/src/hotspot/share/nmt/memReporter.cpp b/src/hotspot/share/nmt/memReporter.cpp index b09cf7ae2bdbc..d53782dfdaa15 100644 --- a/src/hotspot/share/nmt/memReporter.cpp +++ b/src/hotspot/share/nmt/memReporter.cpp @@ -487,7 +487,35 @@ void MemSummaryDiffReporter::report_diff() { print_virtual_memory_diff(_current_baseline.total_reserved_memory(), _current_baseline.total_committed_memory(), _early_baseline.total_reserved_memory(), _early_baseline.total_committed_memory()); + out->cr(); + out->cr(); + + // malloc diff + const size_t early_malloced_bytes = + _early_baseline.malloc_memory_snapshot()->total(); + const size_t early_count = + _early_baseline.malloc_memory_snapshot()->total_count(); + const size_t current_malloced_bytes = + _current_baseline.malloc_memory_snapshot()->total(); + const size_t current_count = + _current_baseline.malloc_memory_snapshot()->total_count(); + print_malloc_diff(current_malloced_bytes, current_count, early_malloced_bytes, + early_count, mtNone); + out->cr(); + out->cr(); + // mmap diff + out->print("mmap: "); + const size_t early_reserved = + _early_baseline.virtual_memory_snapshot()->total_reserved(); + const size_t early_committed = + _early_baseline.virtual_memory_snapshot()->total_committed(); + const size_t current_reserved = + _current_baseline.virtual_memory_snapshot()->total_reserved(); + const size_t current_committed = + _current_baseline.virtual_memory_snapshot()->total_committed(); + print_virtual_memory_diff(current_reserved, current_committed, early_reserved, + early_committed); out->cr(); out->cr(); diff --git a/test/hotspot/jtreg/runtime/NMT/TotalMallocMmapDiffTest.java b/test/hotspot/jtreg/runtime/NMT/TotalMallocMmapDiffTest.java new file mode 100644 index 0000000000000..3ba94c6a31a86 --- /dev/null +++ b/test/hotspot/jtreg/runtime/NMT/TotalMallocMmapDiffTest.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Red Hat Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8332125 + * @summary Test to verify correctness of total malloc and mmap diffs + * @key randomness + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=summary -Xms32m -Xmx32m TotalMallocMmapDiffTest + * + */ + +import jdk.test.lib.process.OutputAnalyzer; + +import jdk.test.whitebox.WhiteBox; + +public class TotalMallocMmapDiffTest { + private static final WhiteBox wb = WhiteBox.getWhiteBox(); + private static final long ALLOCATE_SIZE = 250 * 1024 * 1024; // 250MB + private static final double FUDGE_FACTOR = 0.2; + private static final double UPPER_BOUND = ALLOCATE_SIZE * (1 + FUDGE_FACTOR); + private static final double LOWER_BOUND = ALLOCATE_SIZE * (1 - FUDGE_FACTOR); + + public static void main(String[] args) throws Exception { + + // Get baseline + OutputAnalyzer output = NMTTestUtils.startJcmdVMNativeMemory("baseline=true", "scale=1"); + output.shouldContain("Baseline taken"); + + // Allocate some memory via malloc + long addr = wb.NMTMalloc(ALLOCATE_SIZE); + + // Virtually reserve and commit memory + addr = wb.NMTReserveMemory(ALLOCATE_SIZE); + wb.NMTCommitMemory(addr, ALLOCATE_SIZE); + + // Get NMT diff + output = NMTTestUtils.startJcmdVMNativeMemory("summary.diff", "scale=1"); + + // Verify malloc diff accounts for memory allocation with a fudge factor + long mallocDiff = getMallocDiff(output); + if (mallocDiff < LOWER_BOUND || mallocDiff > UPPER_BOUND) { + throw new Exception("Total malloc diff is incorrect. " + + "Expected malloc diff range: [" + LOWER_BOUND + " - " + UPPER_BOUND + "]" + + "Actual malloc diff: " + mallocDiff); + } + + // Verify mmap diff accounts for reserve and commit + long reservedDiff = getReservedDiff(output); + long committedDiff = getCommittedDiff(output); + if (reservedDiff < LOWER_BOUND || reservedDiff > UPPER_BOUND) { + throw new Exception("mmap reserved diff is incorrect. " + + "Expected reserved diff range: [" + LOWER_BOUND + " - " + UPPER_BOUND + "]" + + "Actual reserved diff: " + reservedDiff); + } + if (committedDiff < LOWER_BOUND || committedDiff > UPPER_BOUND) { + throw new Exception("mmap committed diff is incorrect. " + + "Expected committed diff range: [" + LOWER_BOUND + " - " + UPPER_BOUND + "]" + + "Actual committed diff: " + committedDiff); + } + + } + + private static long getMallocDiff(OutputAnalyzer output) { + // First match should be global malloc diff + String malloc = output.firstMatch("malloc=\\d+ \\+(\\d+)", 1); + return Long.parseLong(malloc); + } + + private static long getReservedDiff(OutputAnalyzer output) { + // First match should be global mmap diff + String reservedDiff = output.firstMatch("mmap: reserved=\\d+ \\+(\\d+)", 1); + return Long.parseLong(reservedDiff); + } + + private static long getCommittedDiff(OutputAnalyzer output) { + // First match should be global mmap diff + String committedDiff = output.firstMatch("mmap: reserved=\\d+ \\+\\d+, committed=\\d+ \\+(\\d+)", 1); + return Long.parseLong(committedDiff); + } +} From d06d79c80980644df511cded0eb8bc0309d878d3 Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Thu, 11 Jul 2024 16:07:03 +0000 Subject: [PATCH 369/471] 8325369: @sealedGraph: Bad link to image for tag on nested classes Reviewed-by: jjg --- .../build/tools/taglet/SealedGraph.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/make/jdk/src/classes/build/tools/taglet/SealedGraph.java b/make/jdk/src/classes/build/tools/taglet/SealedGraph.java index fd1b73355b3da..17867b99595bc 100644 --- a/make/jdk/src/classes/build/tools/taglet/SealedGraph.java +++ b/make/jdk/src/classes/build/tools/taglet/SealedGraph.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -107,7 +107,7 @@ public String toString(List<? extends DocTree> tags, Element element) { throw new RuntimeException(e); } - String simpleTypeName = element.getSimpleName().toString(); + String simpleTypeName = packagelessCanonicalName(typeElement).replace('.', '/'); String imageFile = simpleTypeName + "-sealed-graph.svg"; int thumbnailHeight = 100; // also appears in the stylesheet String hoverImage = "<span>" @@ -315,14 +315,14 @@ private static Optional<String> packageName(TypeElement element) { case MEMBER -> packageName((TypeElement) element.getEnclosingElement()); }; } + } - private static String packagelessCanonicalName(TypeElement element) { - String result = element.getSimpleName().toString(); - while (element.getNestingKind() == NestingKind.MEMBER) { - element = (TypeElement) element.getEnclosingElement(); - result = element.getSimpleName().toString() + '.' + result; - } - return result; + private static String packagelessCanonicalName(TypeElement element) { + String result = element.getSimpleName().toString(); + while (element.getNestingKind() == NestingKind.MEMBER) { + element = (TypeElement) element.getEnclosingElement(); + result = element.getSimpleName().toString() + '.' + result; } + return result; } } From 58c98420b65bcea08f37982fdfba747005c03553 Mon Sep 17 00:00:00 2001 From: Joe Wang <joehw@openjdk.org> Date: Thu, 11 Jul 2024 18:38:32 +0000 Subject: [PATCH 370/471] 8336021: Doccheck: valign not allowed for HTML5 in java.xml Reviewed-by: lancea --- .../share/classes/org/w3c/dom/Attr.java | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/java.xml/share/classes/org/w3c/dom/Attr.java b/src/java.xml/share/classes/org/w3c/dom/Attr.java index 54d0997eb38b0..0943fcac36313 100644 --- a/src/java.xml/share/classes/org/w3c/dom/Attr.java +++ b/src/java.xml/share/classes/org/w3c/dom/Attr.java @@ -124,65 +124,63 @@ * </thead> * <tbody> * <tr> - * <th scope="row" valign='top' rowspan='1' colspan='1'> + * <th scope="row"> * Character reference</th> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"x&#178;=5"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"x²=5"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"x&#178;=5"</pre> * </td> * </tr> * <tr> - * <th scope="row" valign='top' rowspan='1' colspan='1'>Built-in - * character entity</th> - * <td valign='top' rowspan='1' colspan='1'> + * <th scope="row">Built-in character entity</th> + * <td> * <pre>"y&lt;6"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"y<6"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"y&lt;6"</pre> * </td> * </tr> * <tr> - * <th scope="row" valign='top' rowspan='1' colspan='1'>Literal newline between</th> - * <td valign='top' rowspan='1' colspan='1'> - * <pre> - * "x=5&#10;y=6"</pre> + * <th scope="row">Literal newline between</th> + * <td> + * <pre>"x=5&#10;y=6"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"x=5 y=6"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"x=5&#10;y=6"</pre> * </td> * </tr> * <tr> - * <th scope="row" valign='top' rowspan='1' colspan='1'>Normalized newline between</th> - * <td valign='top' rowspan='1' colspan='1'> + * <th scope="row">Normalized newline between</th> + * <td> * <pre>"x=5 * y=6"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"x=5 y=6"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'> + * <td> * <pre>"x=5 y=6"</pre> * </td> * </tr> * <tr> - * <th scope="row" valign='top' rowspan='1' colspan='1'>Entity <code>e</code> with literal newline</th> - * <td valign='top' rowspan='1' colspan='1'> + * <th scope="row">Entity <code>e</code> with literal newline</th> + * <td> * <pre> * <!ENTITY e '...&#10;...'> [...]> "x=5&e;y=6"</pre> * </td> - * <td valign='top' rowspan='1' colspan='1'><em>Dependent on Implementation and Load Options</em></td> - * <td valign='top' rowspan='1' colspan='1'><em>Dependent on Implementation and Load/Save Options</em></td> + * <td><em>Dependent on Implementation and Load Options</em></td> + * <td><em>Dependent on Implementation and Load/Save Options</em></td> * </tr> * </tbody> * </table> From 5100303c6c5e4224d2c41f90719139bb5f4e236e Mon Sep 17 00:00:00 2001 From: Justin Lu <jlu@openjdk.org> Date: Thu, 11 Jul 2024 18:40:40 +0000 Subject: [PATCH 371/471] 8335668: NumberFormat integer only parsing should throw exception for edge case Reviewed-by: naoto --- .../classes/java/text/DecimalFormat.java | 14 +++++--- .../Format/NumberFormat/LenientParseTest.java | 30 ++++++++++++++-- .../Format/NumberFormat/StrictParseTest.java | 34 ++++++++++++++++--- 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/src/java.base/share/classes/java/text/DecimalFormat.java b/src/java.base/share/classes/java/text/DecimalFormat.java index 1f249888a28f5..04acca1ceb51d 100644 --- a/src/java.base/share/classes/java/text/DecimalFormat.java +++ b/src/java.base/share/classes/java/text/DecimalFormat.java @@ -2379,8 +2379,8 @@ private final boolean subparse(String text, ParsePosition parsePosition, NumericPosition pos = subparseNumber(text, position, digits, true, isExponent, status); position = pos.fullPos; - // First character after the prefix was un-parseable, should - // fail regardless if lenient or strict. + // First character after the prefix was un-parseable or parsing integer + // only with no integer portion. Should fail regardless if lenient or strict. if (position == -1) { parsePosition.index = oldStart; parsePosition.errorIndex = oldStart; @@ -2421,8 +2421,8 @@ private final boolean subparse(String text, ParsePosition parsePosition, } // When parsing integer only, index should be int pos - // If intPos is 0, the entire value was integer - if (isParseIntegerOnly() && pos.intPos > 0) { + // If intPos is -1, the entire value was integer and index should be full pos + if (isParseIntegerOnly() && pos.intPos != -1) { parsePosition.index = pos.intPos; } else { // increment the index by the suffix @@ -2474,7 +2474,7 @@ NumericPosition subparseNumber(String text, int position, boolean isExponent, boolean[] status) { // process digits or Inf, find decimal position status[STATUS_INFINITE] = false; - int intIndex = 0; + int intIndex = -1; if (!isExponent && text.regionMatches(position, symbols.getInfinity(), 0, symbols.getInfinity().length())) { position += symbols.getInfinity().length(); @@ -2570,6 +2570,10 @@ NumericPosition subparseNumber(String text, int position, // Cancel out backup setting (see grouping handler below) backup = -1; } else if (!isExponent && ch == decimal) { + if (isParseIntegerOnly() && startPos == position) { + // Parsing int only with no integer portion, fail + return new NumericPosition(-1, intIndex); + } // Check grouping size on decimal separator if (parseStrict && isGroupingViolation(position, prevSeparatorIndex)) { return new NumericPosition( diff --git a/test/jdk/java/text/Format/NumberFormat/LenientParseTest.java b/test/jdk/java/text/Format/NumberFormat/LenientParseTest.java index 41f8961ff32e2..c85fe0f6cbb59 100644 --- a/test/jdk/java/text/Format/NumberFormat/LenientParseTest.java +++ b/test/jdk/java/text/Format/NumberFormat/LenientParseTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8327640 8331485 8333456 + * @bug 8327640 8331485 8333456 8335668 * @summary Test suite for NumberFormat parsing when lenient. * @run junit/othervm -Duser.language=en -Duser.country=US LenientParseTest * @run junit/othervm -Duser.language=ja -Duser.country=JP LenientParseTest @@ -128,6 +128,28 @@ public void numFmtStrictIntegerOnlyUsed(String toParse, int expectedValue, int e dFmt.setParseIntegerOnly(false); } + // 8335668: Parsing with integer only against String with no integer portion + // should fail, not return 0. Expected error index should be 0 + @Test + public void integerParseOnlyFractionOnlyTest() { + var fmt = NumberFormat.getIntegerInstance(); + failParse(fmt, localizeText("."), 0); + failParse(fmt, localizeText(".0"), 0); + failParse(fmt, localizeText(".55"), 0); + } + + // 8335668: Parsing with integer only against String with no integer portion + // should fail, not return 0. Expected error index should be 0 + @Test // Non-localized, run once + @EnabledIfSystemProperty(named = "user.language", matches = "en") + public void compactIntegerParseOnlyFractionOnlyTest() { + var fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + fmt.setParseIntegerOnly(true); + failParse(fmt, ".K", 0); + failParse(fmt, ".0K", 0); + failParse(fmt, ".55K", 0); + } + @Test // Non-localized, only run once @EnabledIfSystemProperty(named = "user.language", matches = "en") public void badExponentParseNumberFormatTest() { @@ -313,7 +335,11 @@ private static Stream<Arguments> validFullParseStrings() { Arguments.of("10000", 10000d), Arguments.of("100,000", 100000d), Arguments.of("1,000,000", 1000000d), - Arguments.of("10,000,000", 10000000d)) + Arguments.of("10,000,000", 10000000d), + // Smaller value cases (w/ decimal) + Arguments.of(".1", .1d), + Arguments.of("1.1", 1.1d), + Arguments.of("11.1", 11.1d)) .map(args -> Arguments.of( localizeText(String.valueOf(args.get()[0])), args.get()[1])); } diff --git a/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java b/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java index 333bc1b050637..3e90ccb39ceaf 100644 --- a/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java +++ b/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8327640 8331485 8333755 + * @bug 8327640 8331485 8333755 8335668 * @summary Test suite for NumberFormat parsing with strict leniency * @run junit/othervm -Duser.language=en -Duser.country=US StrictParseTest * @run junit/othervm -Duser.language=ja -Duser.country=JP StrictParseTest @@ -203,6 +203,28 @@ public void numFmtStrictIntegerOnlyUsedTest(String toParse, Number expVal) { } } + // 8335668: Parsing with integer only against String with no integer portion + // should fail, not return 0. Expected error index should be 0 + @Test + public void integerParseOnlyFractionOnlyTest() { + var fmt = NumberFormat.getIntegerInstance(); + failParse(fmt, localizeText("."), 0); + failParse(fmt, localizeText(".0"), 0); + failParse(fmt, localizeText(".55"), 0); + } + + // 8335668: Parsing with integer only against String with no integer portion + // should fail, not return 0. Expected error index should be 0 + @Test // Non-localized, run once + @EnabledIfSystemProperty(named = "user.language", matches = "en") + public void compactIntegerParseOnlyFractionOnlyTest() { + var fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + fmt.setParseIntegerOnly(true); + failParse(fmt, ".K", 0); + failParse(fmt, ".0K", 0); + failParse(fmt, ".55K", 0); + } + // 8333755: Parsing behavior should follow normal strict behavior // when it comes to failures. @ParameterizedTest @@ -426,8 +448,8 @@ private static Stream<Arguments> badParseStrings() { Arguments.of("1,234a", 5), Arguments.of("1,.a", 2), Arguments.of("1.a", 2), - Arguments.of(".22a", 3), - Arguments.of(".1a1", 2), + Arguments.of("1.22a", 4), + Arguments.of("1.1a1", 3), Arguments.of("1,234,a", 5), // Double decimal Arguments.of("1,234..5", 5)) @@ -453,7 +475,11 @@ private static Stream<Arguments> validParseStrings() { Arguments.of("10000", 10000d), Arguments.of("100,000", 100000d), Arguments.of("1,000,000", 1000000d), - Arguments.of("10,000,000", 10000000d)) + Arguments.of("10,000,000", 10000000d), + // Smaller value cases (w/ decimal) + Arguments.of(".1", .1d), + Arguments.of("1.1", 1.1d), + Arguments.of("11.1", 11.1d)) .map(args -> Arguments.of( localizeText(String.valueOf(args.get()[0])), args.get()[1])); } From 9eb611e7f07ebb6eb0cbcca32d644abf8352c991 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon <cushon@openjdk.org> Date: Thu, 11 Jul 2024 19:53:52 +0000 Subject: [PATCH 372/471] 8334055: Unhelpful 'required: reference' diagnostics after JDK-8043226 Reviewed-by: vromero --- .../classes/com/sun/tools/javac/comp/Attr.java | 9 +-------- .../failures/CantAnnotateMissingSymbol.java | 16 ++++++++++++++++ .../failures/CantAnnotateMissingSymbol.out | 2 ++ .../failures/CantAnnotatePackages.java | 2 +- .../failures/CantAnnotatePackages.out | 6 +++--- .../failures/CantAnnotateScoping.java | 2 +- .../failures/CantAnnotateScoping.out | 9 ++++----- 7 files changed, 28 insertions(+), 18 deletions(-) create mode 100644 test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateMissingSymbol.java create mode 100644 test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateMissingSymbol.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index f58319496e968..9b79846ba40df 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -5241,14 +5241,7 @@ public void visitModifiers(JCModifiers tree) { public void visitAnnotatedType(JCAnnotatedType tree) { attribAnnotationTypes(tree.annotations, env); - Type underlyingType = - attribTree(tree.underlyingType, env, new ResultInfo(KindSelector.TYP_PCK, Type.noType)); - if (underlyingType.hasTag(PACKAGE)) { - // Type annotations are not admissible on packages, but we handle packages here to - // report better diagnostics later in validateAnnotatedType. - result = tree.type = underlyingType; - return; - } + Type underlyingType = attribType(tree.underlyingType, env); Type annotatedType = underlyingType.preannotatedType(); if (!env.info.isNewClass) diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateMissingSymbol.java b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateMissingSymbol.java new file mode 100644 index 0000000000000..469cffa37a61f --- /dev/null +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateMissingSymbol.java @@ -0,0 +1,16 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8026564 8043226 + * @summary 8334055 + * @compile/fail/ref=CantAnnotateMissingSymbol.out -XDrawDiagnostics CantAnnotateMissingSymbol.java + */ + +import java.lang.annotation.*; +import java.util.List; + +class CantAnnotateMissingSymbol { + List<@TA NoSuch> x; +} + +@Target(ElementType.TYPE_USE) +@interface TA { } diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateMissingSymbol.out b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateMissingSymbol.out new file mode 100644 index 0000000000000..b875cd2be7b80 --- /dev/null +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateMissingSymbol.out @@ -0,0 +1,2 @@ +CantAnnotateMissingSymbol.java:12:14: compiler.err.cant.resolve.location: kindname.class, NoSuch, , , (compiler.misc.location: kindname.class, CantAnnotateMissingSymbol, null) +1 error diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java index d7587dfcf5fc2..d35351b6f4084 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java @@ -1,6 +1,6 @@ /* * @test /nodynamiccopyright/ - * @bug 8026564 8043226 + * @bug 8026564 8043226 8334055 * @summary The parts of a fully-qualified type can't be annotated. * @author Werner Dietl * @compile/fail/ref=CantAnnotatePackages.out -XDrawDiagnostics CantAnnotatePackages.java diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out index 6e2b9cb93b0e2..b91d65828b97b 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out @@ -1,5 +1,5 @@ +CantAnnotatePackages.java:16:14: compiler.err.cant.resolve.location: kindname.class, java, , , (compiler.misc.location: kindname.class, CantAnnotatePackages, null) +CantAnnotatePackages.java:17:9: compiler.err.cant.resolve.location: kindname.class, lang, , , (compiler.misc.location: kindname.package, java, null) +CantAnnotatePackages.java:18:14: compiler.err.cant.resolve.location: kindname.class, lang, , , (compiler.misc.location: kindname.package, java, null) CantAnnotatePackages.java:14:18: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), java.lang, @TA java.lang.Object -CantAnnotatePackages.java:16:14: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), java.lang, @TA java.lang.Object -CantAnnotatePackages.java:17:9: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), java.lang, @TA java.lang.Object -CantAnnotatePackages.java:18:14: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), java.lang, @TA java.lang.Object 4 errors diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.java b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.java index aec691c913dd6..4bdd791909c27 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.java +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.java @@ -1,6 +1,6 @@ /* * @test /nodynamiccopyright/ - * @bug 8006733 8006775 8043226 + * @bug 8006733 8006775 8043226 8334055 * @summary Ensure behavior for nested types is correct. * @author Werner Dietl * @compile/fail/ref=CantAnnotateScoping.out -XDrawDiagnostics CantAnnotateScoping.java diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.out b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.out index 2ae736ad315d4..ade5333a446fa 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.out +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.out @@ -1,13 +1,12 @@ -CantAnnotateScoping.java:68:18: compiler.err.doesnt.exist: java.XXX +CantAnnotateScoping.java:63:9: compiler.err.cant.resolve.location: kindname.class, lang, , , (compiler.misc.location: kindname.package, java, null) +CantAnnotateScoping.java:68:9: compiler.err.cant.resolve.location: kindname.class, XXX, , , (compiler.misc.location: kindname.package, java, null) +CantAnnotateScoping.java:71:9: compiler.err.cant.resolve.location: kindname.class, lang, , , (compiler.misc.location: kindname.package, java, null) CantAnnotateScoping.java:38:14: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), Test.Outer, @TA Test.Outer.SInner CantAnnotateScoping.java:51:18: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), java.lang, @TA java.lang.Object CantAnnotateScoping.java:60:37: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation: @TA,@TA2), java.lang, @DTA @TA @TA2 java.lang.Object CantAnnotateScoping.java:40:14: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), Test.Outer, @TA Test.Outer.SInner -CantAnnotateScoping.java:63:11: compiler.err.annotation.type.not.applicable.to.type: DA -CantAnnotateScoping.java:68:11: compiler.err.annotation.type.not.applicable.to.type: DA -CantAnnotateScoping.java:71:9: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), java.lang, @TA java.lang.Object CantAnnotateScoping.java:44:34: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation: @TA,@TA2), Test.Outer, @TA @TA2 Test.Outer.SInner CantAnnotateScoping.java:44:25: compiler.err.annotation.type.not.applicable.to.type: DA CantAnnotateScoping.java:48:38: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @TA), Test.Outer, @TA Test.Outer.SInner CantAnnotateScoping.java:48:34: compiler.err.annotation.type.not.applicable.to.type: DA -12 errors +11 errors From 73e3e0edeb20c6f701b213423476f92fb05dd262 Mon Sep 17 00:00:00 2001 From: Dean Long <dlong@openjdk.org> Date: Thu, 11 Jul 2024 20:18:16 +0000 Subject: [PATCH 373/471] 8321509: False positive in get_trampoline fast path causes crash Reviewed-by: kvn, adinn, thartmann --- .../cpu/aarch64/globalDefinitions_aarch64.hpp | 4 +- .../cpu/aarch64/nativeInst_aarch64.cpp | 39 +++++++++---------- .../cpu/aarch64/nativeInst_aarch64.hpp | 7 ++-- src/hotspot/cpu/aarch64/relocInfo_aarch64.cpp | 33 ++++++++++------ src/hotspot/share/code/relocInfo.cpp | 8 ++++ src/hotspot/share/code/relocInfo.hpp | 5 +++ 6 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/hotspot/cpu/aarch64/globalDefinitions_aarch64.hpp b/src/hotspot/cpu/aarch64/globalDefinitions_aarch64.hpp index 63f6c9491c8de..faf635dc33282 100644 --- a/src/hotspot/cpu/aarch64/globalDefinitions_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/globalDefinitions_aarch64.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -76,4 +76,6 @@ const bool CCallingConventionRequiresIntsAsLongs = false; #define USE_POINTERS_TO_REGISTER_IMPL_ARRAY +#define USE_TRAMPOLINE_STUB_FIX_OWNER + #endif // CPU_AARCH64_GLOBALDEFINITIONS_AARCH64_HPP diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp index c88705618e63d..5a3f9d228ca89 100644 --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -51,13 +51,18 @@ void NativeInstruction::wrote(int offset) { } address NativeCall::destination() const { - address addr = (address)this; - address destination = instruction_address() + displacement(); + address addr = instruction_address(); + address destination = addr + displacement(); + + // Performance optimization: no need to call find_blob() if it is a self-call + if (destination == addr) { + return destination; + } // Do we use a trampoline stub for this call? CodeBlob* cb = CodeCache::find_blob(addr); - assert(cb && cb->is_nmethod(), "sanity"); - nmethod *nm = (nmethod *)cb; + assert(cb != nullptr && cb->is_nmethod(), "nmethod expected"); + nmethod *nm = cb->as_nmethod(); if (nm->stub_contains(destination) && is_NativeCallTrampolineStub_at(destination)) { // Yes we do, so get the destination from the trampoline stub. const address trampoline_stub_addr = destination; @@ -72,12 +77,8 @@ address NativeCall::destination() const { // call instruction at all times. // // Used in the runtime linkage of calls; see class CompiledIC. -// -// Add parameter assert_lock to switch off assertion -// during code generation, where no patching lock is needed. -void NativeCall::set_destination_mt_safe(address dest, bool assert_lock) { - assert(!assert_lock || - (Patching_lock->is_locked() || SafepointSynchronize::is_at_safepoint()) || +void NativeCall::set_destination_mt_safe(address dest) { + assert((Patching_lock->is_locked() || SafepointSynchronize::is_at_safepoint()) || CompiledICLocker::is_safe(addr_at(0)), "concurrent code patching"); @@ -104,22 +105,18 @@ void NativeCall::set_destination_mt_safe(address dest, bool assert_lock) { } address NativeCall::get_trampoline() { - address call_addr = addr_at(0); + address call_addr = instruction_address(); CodeBlob *code = CodeCache::find_blob(call_addr); - assert(code != nullptr, "Could not find the containing code blob"); + assert(code != nullptr && code->is_nmethod(), "nmethod expected"); + nmethod* nm = code->as_nmethod(); - address bl_destination - = MacroAssembler::pd_call_destination(call_addr); - if (code->contains(bl_destination) && + address bl_destination = call_addr + displacement(); + if (nm->stub_contains(bl_destination) && is_NativeCallTrampolineStub_at(bl_destination)) return bl_destination; - if (code->is_nmethod()) { - return trampoline_stub_Relocation::get_trampoline_for(call_addr, (nmethod*)code); - } - - return nullptr; + return trampoline_stub_Relocation::get_trampoline_for(call_addr, nm); } // Inserts a native call instruction at a given pc diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp index 974214d985b5d..0eb5ff815be1d 100644 --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2108, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -174,6 +174,7 @@ class NativeCall: public NativeInstruction { int displacement() const { return (int_at(displacement_offset) << 6) >> 4; } address displacement_address() const { return addr_at(displacement_offset); } address return_address() const { return addr_at(return_address_offset); } + address raw_destination() const { return instruction_address() + displacement(); } address destination() const; void set_destination(address dest) { @@ -213,9 +214,7 @@ class NativeCall: public NativeInstruction { // // Used in the runtime linkage of calls; see class CompiledIC. // (Cf. 4506997 and 4479829, where threads witnessed garbage displacements.) - - // The parameter assert_lock disables the assertion during code generation. - void set_destination_mt_safe(address dest, bool assert_lock = true); + void set_destination_mt_safe(address dest); address get_trampoline(); #if INCLUDE_JVMCI diff --git a/src/hotspot/cpu/aarch64/relocInfo_aarch64.cpp b/src/hotspot/cpu/aarch64/relocInfo_aarch64.cpp index 332f24996930f..c4c8648d552d0 100644 --- a/src/hotspot/cpu/aarch64/relocInfo_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/relocInfo_aarch64.cpp @@ -60,13 +60,12 @@ void Relocation::pd_set_data_value(address x, bool verify_only) { address Relocation::pd_call_destination(address orig_addr) { assert(is_call(), "should be a call here"); - if (NativeCall::is_call_at(addr())) { - address trampoline = nativeCall_at(addr())->get_trampoline(); - if (trampoline) { - return nativeCallTrampolineStub_at(trampoline)->destination(); + if (orig_addr == nullptr) { + if (NativeCall::is_call_at(addr())) { + NativeCall* call = nativeCall_at(addr()); + return call->destination(); } - } - if (orig_addr != nullptr) { + } else { address new_addr = MacroAssembler::pd_call_destination(orig_addr); // If call is branch to self, don't try to relocate it, just leave it // as branch to self. This happens during code generation if the code @@ -82,16 +81,26 @@ address Relocation::pd_call_destination(address orig_addr) { void Relocation::pd_set_call_destination(address x) { assert(is_call(), "should be a call here"); if (NativeCall::is_call_at(addr())) { - address trampoline = nativeCall_at(addr())->get_trampoline(); - if (trampoline) { - nativeCall_at(addr())->set_destination_mt_safe(x, /* assert_lock */false); - return; - } + NativeCall* call = nativeCall_at(addr()); + call->set_destination(x); + } else { + MacroAssembler::pd_patch_instruction(addr(), x); } - MacroAssembler::pd_patch_instruction(addr(), x); assert(pd_call_destination(addr()) == x, "fail in reloc"); } +void trampoline_stub_Relocation::pd_fix_owner_after_move() { + NativeCall* call = nativeCall_at(owner()); + assert(call->raw_destination() == owner(), "destination should be empty"); + address trampoline = addr(); + address dest = nativeCallTrampolineStub_at(trampoline)->destination(); + if (!Assembler::reachable_from_branch_at(owner(), dest)) { + dest = trampoline; + } + call->set_destination(dest); +} + + address* Relocation::pd_address_in_code() { return (address*)(addr() + 8); } diff --git a/src/hotspot/share/code/relocInfo.cpp b/src/hotspot/share/code/relocInfo.cpp index 3b19b63f24469..a379f88ddc180 100644 --- a/src/hotspot/share/code/relocInfo.cpp +++ b/src/hotspot/share/code/relocInfo.cpp @@ -373,6 +373,14 @@ void CallRelocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer } +#ifdef USE_TRAMPOLINE_STUB_FIX_OWNER +void trampoline_stub_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) { + // Finalize owner destination only for nmethods + if (dest->blob() != nullptr) return; + pd_fix_owner_after_move(); +} +#endif + //// pack/unpack methods void oop_Relocation::pack_data_to(CodeSection* dest) { diff --git a/src/hotspot/share/code/relocInfo.hpp b/src/hotspot/share/code/relocInfo.hpp index 6d0907d97dedc..25cca49e50bb8 100644 --- a/src/hotspot/share/code/relocInfo.hpp +++ b/src/hotspot/share/code/relocInfo.hpp @@ -1258,6 +1258,11 @@ class runtime_call_w_cp_Relocation : public CallRelocation { // in the code, it can patch it to jump to the trampoline where is // sufficient space for a far branch. Needed on PPC. class trampoline_stub_Relocation : public Relocation { +#ifdef USE_TRAMPOLINE_STUB_FIX_OWNER + void pd_fix_owner_after_move(); + void fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) override; +#endif + public: static RelocationHolder spec(address static_call) { return RelocationHolder::construct<trampoline_stub_Relocation>(static_call); From 889055713ea83f899ebd7bf640dcf3c3e1a82ebe Mon Sep 17 00:00:00 2001 From: Nizar Benalla <nbenalla@openjdk.org> Date: Thu, 11 Jul 2024 20:44:21 +0000 Subject: [PATCH 374/471] 8335623: Clean up HtmlTag.HtmlTag and make the ARIA role attribute global Reviewed-by: liach --- .../jdk/javadoc/internal/doclint/HtmlTag.java | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java index 0c820dae91392..fa9d3ea578dd4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java @@ -507,7 +507,7 @@ public enum Attr { PROFILE, REV, REVERSED, - ROLE, + ROLE(true), ROWSPAN, RULES, SCHEME, @@ -606,26 +606,6 @@ private static class AttrMap extends EnumMap<Attr,AttrKind> { this.attrs = new EnumMap<>(Attr.class); for (Map<Attr,AttrKind> m: attrMaps) this.attrs.putAll(m); - attrs.put(Attr.CLASS, AttrKind.OK); - attrs.put(Attr.ID, AttrKind.OK); - attrs.put(Attr.STYLE, AttrKind.OK); - attrs.put(Attr.ROLE, AttrKind.OK); - // for now, assume that all ARIA attributes are allowed on all tags. - attrs.put(Attr.ARIA_ACTIVEDESCENDANT, AttrKind.OK); - attrs.put(Attr.ARIA_CONTROLS, AttrKind.OK); - attrs.put(Attr.ARIA_DESCRIBEDBY, AttrKind.OK); - attrs.put(Attr.ARIA_EXPANDED, AttrKind.OK); - attrs.put(Attr.ARIA_LABEL, AttrKind.OK); - attrs.put(Attr.ARIA_LABELLEDBY, AttrKind.OK); - attrs.put(Attr.ARIA_LEVEL, AttrKind.OK); - attrs.put(Attr.ARIA_MULTISELECTABLE, AttrKind.OK); - attrs.put(Attr.ARIA_OWNS, AttrKind.OK); - attrs.put(Attr.ARIA_POSINSET, AttrKind.OK); - attrs.put(Attr.ARIA_READONLY, AttrKind.OK); - attrs.put(Attr.ARIA_REQUIRED, AttrKind.OK); - attrs.put(Attr.ARIA_SELECTED, AttrKind.OK); - attrs.put(Attr.ARIA_SETSIZE, AttrKind.OK); - attrs.put(Attr.ARIA_SORT, AttrKind.OK); } public boolean accepts(HtmlTag t) { From 687601ebcaedf133fd4d5cecc42c5aadf9c73f3c Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Thu, 11 Jul 2024 20:45:34 +0000 Subject: [PATCH 375/471] 8336257: Additional tests in jmxremote/startstop to match on PID not app name Reviewed-by: cjplummer, alanb, amenkov, dcubed --- .../sun/management/jmxremote/startstop/JMXStartStopTest.java | 5 +++-- .../jmxremote/startstop/JMXStatusPerfCountersTest.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/test/jdk/sun/management/jmxremote/startstop/JMXStartStopTest.java b/test/jdk/sun/management/jmxremote/startstop/JMXStartStopTest.java index 13a4f7bea73f0..3d125325449f5 100644 --- a/test/jdk/sun/management/jmxremote/startstop/JMXStartStopTest.java +++ b/test/jdk/sun/management/jmxremote/startstop/JMXStartStopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,7 +72,7 @@ public class JMXStartStopTest { private static final boolean verbose = false; - private static ManagementAgentJcmd jcmd = new ManagementAgentJcmd(TEST_APP_NAME, verbose); + private static ManagementAgentJcmd jcmd; private static void dbg_print(String msg) { if (verbose) { @@ -347,6 +347,7 @@ public synchronized void start() throws InterruptedException, IOException, Timeo "the requested port not being available"); } pid = p.pid(); + jcmd = new ManagementAgentJcmd(p, verbose); } catch (TimeoutException e) { if (p != null) { p.destroy(); diff --git a/test/jdk/sun/management/jmxremote/startstop/JMXStatusPerfCountersTest.java b/test/jdk/sun/management/jmxremote/startstop/JMXStatusPerfCountersTest.java index fc7a0de2d0630..e3703ba8dbc87 100644 --- a/test/jdk/sun/management/jmxremote/startstop/JMXStatusPerfCountersTest.java +++ b/test/jdk/sun/management/jmxremote/startstop/JMXStatusPerfCountersTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,7 +67,6 @@ public static void setupClass() throws Exception { @BeforeTest public void setup() { - jcmd = new ManagementAgentJcmd(TEST_APP_NAME, false); } @BeforeMethod @@ -76,6 +75,7 @@ public void startTestApp() throws Exception { TEST_APP_NAME, testAppPb, (Predicate<String>)l->l.trim().equals("main enter") ); + jcmd = new ManagementAgentJcmd(testApp, false); } @AfterMethod From b3ef2a600cfec31723dc78fe552e9cf9976b0337 Mon Sep 17 00:00:00 2001 From: Chen Liang <liach@openjdk.org> Date: Thu, 11 Jul 2024 20:51:27 +0000 Subject: [PATCH 376/471] 8336036: Synthetic documentation for a record's equals is incorrect for floating-point types Reviewed-by: prappo --- .../doclets/toolkit/resources/doclets.properties | 6 ++++-- .../doclet/testRecordTypes/TestRecordTypes.java | 14 +++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index 859289ff8bd21..0ee9429ec0c65 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -319,10 +319,12 @@ doclet.record_equals_doc.fullbody.head=\ doclet.record_equals_doc.fullbody.tail.both=\ Reference components are compared with \ {@link java.util.Objects#equals(Object,Object) Objects::equals(Object,Object)}; \ - primitive components are compared with '=='. + primitive components are compared with the <code>compare</code> method from \ + their corresponding wrapper classes. doclet.record_equals_doc.fullbody.tail.primitive=\ - All components in this record class are compared with '=='. + All components in this record class are compared with the <code>compare</code> \ + method from their corresponding wrapper classes. doclet.record_equals_doc.fullbody.tail.reference=\ All components in this record class are compared with \ diff --git a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java index c4579c501ec77..f9aa3cfd6fa49 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -237,7 +237,8 @@ public record R(int r1) { }"""); """ Indicates whether some other object is "equal to" this one. The objects are equa\ l if the other object is of the same class and if all the record components are \ - equal. All components in this record class are compared with '=='.""", + equal. All components in this record class are compared with the <code>compare</\ + code> method from their corresponding wrapper classes.""", """ <span class="element-name">r1</span>""", """ @@ -300,7 +301,8 @@ public record R(int r1) { }"""); """ Indicates whether some other object is "equal to" this one. The objects are equa\ l if the other object is of the same class and if all the record components are \ - equal. All components in this record class are compared with '=='.""", + equal. All components in this record class are compared with the <code>compare</\ + code> method from their corresponding wrapper classes.""", """ <span class="element-name">r1</span>""", """ @@ -311,7 +313,8 @@ l if the other object is of the same class and if all the record components are @Test public void testGeneratedEqualsPrimitive(Path base) throws IOException { testGeneratedEquals(base, "int a, int b", - "All components in this record class are compared with '=='."); + "All components in this record class are compared with the <code>compare</code> method " + + "from their corresponding wrapper classes."); } @Test @@ -324,7 +327,8 @@ public void testGeneratedEqualsReference(Path base) throws IOException { public void testGeneratedEqualsMixed(Path base) throws IOException { testGeneratedEquals(base, "int a, Object b", "Reference components are compared with <code>Objects::equals(Object,Object)</code>; " - + "primitive components are compared with '=='."); + + "primitive components are compared with the <code>compare</code> method from their " + + "corresponding wrapper classes."); } private void testGeneratedEquals(Path base, String comps, String expect) throws IOException { From 81a0d1ba03bbdbe718302b3925cdc207d5d05232 Mon Sep 17 00:00:00 2001 From: Vanitha B P <vanitha.b.p@oracle.com> Date: Thu, 11 Jul 2024 21:27:30 +0000 Subject: [PATCH 377/471] 8325525: Create jtreg test case for JDK-8325203 Reviewed-by: asemenyuk, almatvee --- .../apps/ChildProcessAppLauncher.java | 37 ++++++++ .../jpackage/windows/WinChildProcessTest.java | 88 +++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 test/jdk/tools/jpackage/apps/ChildProcessAppLauncher.java create mode 100644 test/jdk/tools/jpackage/windows/WinChildProcessTest.java diff --git a/test/jdk/tools/jpackage/apps/ChildProcessAppLauncher.java b/test/jdk/tools/jpackage/apps/ChildProcessAppLauncher.java new file mode 100644 index 0000000000000..11be90bc45622 --- /dev/null +++ b/test/jdk/tools/jpackage/apps/ChildProcessAppLauncher.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; + +public class ChildProcessAppLauncher { + + public static void main(String[] args) throws IOException { + String calcPath = Path.of(System.getenv("SystemRoot"), "system32", "calc.exe").toString(); + ProcessBuilder processBuilder = new ProcessBuilder(calcPath); + Process process = processBuilder.start(); + System.out.println("Calc id=" + process.pid()); + System.exit(0); + } +} diff --git a/test/jdk/tools/jpackage/windows/WinChildProcessTest.java b/test/jdk/tools/jpackage/windows/WinChildProcessTest.java new file mode 100644 index 0000000000000..2928f7f1c5ffe --- /dev/null +++ b/test/jdk/tools/jpackage/windows/WinChildProcessTest.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8325203 + * @summary Test that Jpackage windows executable application kills the launched 3rd party application + * when System.exit(0) is invoked along with terminating java program. + * @library ../helpers + * @library /test/lib + * @requires os.family == "windows" + * @build WinChildProcessTest + * @build jdk.jpackage.test.* + * @build WinChildProcessTest + * @modules jdk.jpackage/jdk.jpackage.internal + * @run main/othervm -Xmx512m jdk.jpackage.test.Main + * --jpt-run=WinChildProcessTest + * + */ + +import java.util.List; +import java.util.Optional; + +import java.nio.file.Path; + +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.Executor; +import jdk.jpackage.test.TKit; + +public class WinChildProcessTest { + private static final Path TEST_APP_JAVA = TKit.TEST_SRC_ROOT + .resolve("apps/ChildProcessAppLauncher.java"); + + @Test + public static void test() throws Throwable { + long calcPid = 0; + try { + JPackageCommand cmd = JPackageCommand + .helloAppImage(TEST_APP_JAVA + "*Hello"); + + // Create the image of the third party application launcher + cmd.executeAndAssertImageCreated(); + + // Start the third party application launcher and dump and save the + // output of the application + List<String> output = new Executor().saveOutput().dumpOutput() + .setExecutable(cmd.appLauncherPath().toAbsolutePath()) + .execute(0).getOutput(); + String pidStr = output.get(0); + + // parse calculator PID + calcPid = Long.parseLong(pidStr.split("=", 2)[1]); + + // Check whether the termination of third party application launcher + // also terminating the launched third party application + // If third party application is not terminated the test is + // successful else failure + Optional<ProcessHandle> processHandle = ProcessHandle.of(calcPid); + boolean isAlive = processHandle.isPresent() + && processHandle.get().isAlive(); + System.out.println("Is Alive " + isAlive); + TKit.assertTrue(isAlive, "Check is calculator process is alive"); + } finally { + // Kill only a specific calculator instance + Runtime.getRuntime().exec("taskkill /F /PID " + calcPid); + } + } +} \ No newline at end of file From c703d290425f85a06e61d72c9672ac2adac92db9 Mon Sep 17 00:00:00 2001 From: Matthias Baesken <mbaesken@openjdk.org> Date: Fri, 12 Jul 2024 05:56:53 +0000 Subject: [PATCH 378/471] 8335710: serviceability/dcmd/vm/SystemDumpMapTest.java and SystemMapTest.java fail on Linux Alpine after 8322475 Reviewed-by: stuefe, lucy --- .../jtreg/serviceability/dcmd/vm/SystemMapTestBase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java index 000e977a590e5..3d1284b09eeee 100644 --- a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java +++ b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java @@ -49,8 +49,8 @@ public class SystemMapTestBase { regexBase_committed + "/bin/java", // libjvm regexBase_committed + "/lib/.*/libjvm.so", - // vdso library, should be part of all user space apps on all architectures OpenJDK supports. - regexBase_committed + "\\[vdso\\]", + // heap segment, should be part of all user space apps on all architectures OpenJDK supports. + regexBase_committed + "\\[heap\\]", // we should see the hs-perf data file, and it should appear as shared as well as committed regexBase_shared_and_committed + "hsperfdata_.*" }; From 1fe3ada001e188754df5de00bf6804f028ad274b Mon Sep 17 00:00:00 2001 From: SendaoYan <syan@openjdk.org> Date: Fri, 12 Jul 2024 08:14:56 +0000 Subject: [PATCH 379/471] 8336284: Test TestClhsdbJstackLock.java/TestJhsdbJstackLock.java fails with -Xcomp after JDK-8335743 Reviewed-by: cjplummer, amenkov --- test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java | 2 +- test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java index e4d4361e6512b..266b14167ef4e 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java +++ b/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java @@ -59,7 +59,7 @@ public static void main (String... args) throws Exception { "^\\s+- waiting to lock <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$", "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Thread\\)$", "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$", - "^\\s+- waiting on <0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)$")); + "^\\s+- waiting on (<0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)|<no object reference available>)$")); unExpStrMap.put("jstack", List.of( "missing reason for ")); test.run(app.getPid(), cmds, expStrMap, unExpStrMap); diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java index 98c4286609178..d3c7f61103165 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java @@ -65,7 +65,7 @@ public static void main (String... args) throws Exception { out.shouldMatch("^\\s+- waiting to lock <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$"); out.shouldMatch("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Thread\\)$"); out.shouldMatch("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$"); - out.shouldMatch("^\\s+- waiting on <0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)$"); + out.shouldMatch("^\\s+- waiting on (<0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)|<no object reference available>)$"); out.stderrShouldBeEmptyIgnoreDeprecatedWarnings(); From f677b90eb93026d3fdfd4ae19d48415a7d8318e8 Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Fri, 12 Jul 2024 08:19:24 +0000 Subject: [PATCH 380/471] 8267887: RMIConnector_NPETest.java fails after removal of RMI Activation (JDK-8267123) Reviewed-by: cjplummer, sspitsyn --- test/jdk/ProblemList.txt | 2 - .../connection/RMIConnector_NPETest.java | 77 ------------------- 2 files changed, 79 deletions(-) delete mode 100644 test/jdk/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 20dfcef539de3..05e42b4933046 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -528,8 +528,6 @@ javax/management/MBeanServer/OldMBeanServerTest.java 8030957 aix-all javax/management/monitor/DerivedGaugeMonitorTest.java 8042211 generic-all -javax/management/remote/mandatory/connection/RMIConnector_NPETest.java 8267887 generic-all - javax/management/remote/mandatory/connection/BrokenConnectionTest.java 8262312 linux-all ############################################################################ diff --git a/test/jdk/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java b/test/jdk/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java deleted file mode 100644 index 29a91a464c713..0000000000000 --- a/test/jdk/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @summary NPE IN RMIConnector.connect - * @bug 6984520 - * @library /java/rmi/testlibrary - * @modules java.management.rmi - * java.rmi/sun.rmi.registry - * java.rmi/sun.rmi.server - * java.rmi/sun.rmi.transport - * java.rmi/sun.rmi.transport.tcp - * @run clean RMIConnector_NPETest - * @run build TestLibrary RMID - * @run build RMIConnector_NPETest - * @run main RMIConnector_NPETest - */ -import java.io.IOException; -import javax.management.*; -import javax.management.remote.rmi.*; - -public class RMIConnector_NPETest { - public static void main(String argv[]) throws Exception { - RMID rmid = RMID.createRMID(); - Exception failureCause = null; - RMIConnector agent = null; - - try { - rmid.start(); - int rmidPort = rmid.getPort(); - MBeanServer mbs = MBeanServerFactory.createMBeanServer(); - RMIJRMPServerImpl rmiserver = new RMIJRMPServerImpl(rmidPort, null, null, null); - rmiserver.setMBeanServer(mbs); - agent = new RMIConnector(rmiserver, null); - agent.connect(); - } catch (NullPointerException npe) { - failureCause = npe; - } catch (Exception e) { - // OK - } finally { - if (agent != null) { - try { - agent.close(); - } catch (IOException e) { - // ignore - } - } - rmid.destroy(); - } - - if (failureCause != null) { - TestLibrary.bomb("Test failed", failureCause); - } - - } -} From 7a6203296416268f1c3f269d0db2b0c817642a34 Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Fri, 12 Jul 2024 09:30:38 +0000 Subject: [PATCH 381/471] 8336081: Fix -Wzero-as-null-pointer-constant warnings in JVMTypedFlagLimit ctors Reviewed-by: dholmes, jwaters --- src/hotspot/share/runtime/flags/jvmFlagLimit.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/runtime/flags/jvmFlagLimit.hpp b/src/hotspot/share/runtime/flags/jvmFlagLimit.hpp index 69df96f226dd8..4a9c9c66d9b37 100644 --- a/src/hotspot/share/runtime/flags/jvmFlagLimit.hpp +++ b/src/hotspot/share/runtime/flags/jvmFlagLimit.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -155,7 +155,7 @@ class JVMTypedFlagLimit : public JVMFlagLimit { // dummy - no range or constraint. This object will not be emitted into the .o file // because we declare it as "const" but has no reference to it. constexpr JVMTypedFlagLimit(int type_enum) : - JVMFlagLimit(0, 0, JVMFlagConstraintPhase::AtParse, 0), _min(0), _max(0) {} + JVMFlagLimit(0, 0, JVMFlagConstraintPhase::AtParse, 0), _min(), _max() {} // range only constexpr JVMTypedFlagLimit(int type_enum, T min, T max) : @@ -163,7 +163,7 @@ class JVMTypedFlagLimit : public JVMFlagLimit { // constraint only constexpr JVMTypedFlagLimit(int type_enum, ConstraintMarker dummy2, short func, JVMFlagConstraintPhase phase) : - JVMFlagLimit(type_enum, func, phase, HAS_CONSTRAINT), _min(0), _max(0) {} + JVMFlagLimit(type_enum, func, phase, HAS_CONSTRAINT), _min(), _max() {} // range and constraint constexpr JVMTypedFlagLimit(int type_enum, T min, T max, ConstraintMarker dummy2, short func, JVMFlagConstraintPhase phase) : From 9b6f6c5c9dd6d0fbb056e8d84c3a0888a3320edf Mon Sep 17 00:00:00 2001 From: Kim Barrett <kbarrett@openjdk.org> Date: Fri, 12 Jul 2024 09:33:04 +0000 Subject: [PATCH 382/471] 8336082: Fix -Wzero-as-null-pointer-constant warnings in SimpleCompactHashtable Reviewed-by: coleenp, dholmes --- .../share/classfile/compactHashtable.hpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/classfile/compactHashtable.hpp b/src/hotspot/share/classfile/compactHashtable.hpp index e99369cc5c376..6cb689ad20df6 100644 --- a/src/hotspot/share/classfile/compactHashtable.hpp +++ b/src/hotspot/share/classfile/compactHashtable.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -204,18 +204,20 @@ class SimpleCompactHashtable { u4* _entries; public: - SimpleCompactHashtable() { - _entry_count = 0; - _bucket_count = 0; - _buckets = 0; - _entries = 0; - } + SimpleCompactHashtable() : + _base_address(nullptr), + _bucket_count(0), + _entry_count(0), + _buckets(nullptr), + _entries(nullptr) + {} void reset() { + _base_address = nullptr; _bucket_count = 0; _entry_count = 0; - _buckets = 0; - _entries = 0; + _buckets = nullptr; + _entries = nullptr; } void init(address base_address, u4 entry_count, u4 bucket_count, u4* buckets, u4* entries); From eec0e155f303ff4bbdab172765ca7c92c2b94cbd Mon Sep 17 00:00:00 2001 From: Volker Simonis <simonis@openjdk.org> Date: Fri, 12 Jul 2024 12:09:58 +0000 Subject: [PATCH 383/471] 8335619: Add an @apiNote to j.l.i.ClassFileTransformer to warn about recursive class loading and ClassCircularityErrors Reviewed-by: alanb, stuefe, liach --- .../lang/instrument/ClassFileTransformer.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java b/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java index d4c17f1cfdcf7..ee2037fac5bfb 100644 --- a/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java +++ b/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -155,11 +155,28 @@ * logging or debugging of format corruptions. * * <P> - * Note the term <i>class file</i> is used as defined in section 3.1 of - * <cite>The Java Virtual Machine Specification</cite>, to mean a - * sequence of bytes in class file format, whether or not they reside in a + * Note the term <i>class file</i> is used as defined in chapter {@jvms 4} The + * {@code class} File Format of <cite>The Java Virtual Machine Specification</cite>, + * to mean a sequence of bytes in class file format, whether or not they reside in a * file. * + * @apiNote + * Great care must be taken when transforming core JDK classes which are at the + * same time required during the transformation process as this can lead to class + * circularity or linkage errors. + * + * <P> + * If for example the invocation of {@link #transform transform()} for a class + * {@code C} requires loading or resolving the same class {@code C}, + * an error is thrown that is an instance of {@link LinkageError} (or a subclass). + * If the {@link LinkageError} occurs during reference resolution (see section + * {@jvms 5.4.3} Resolution of <cite>The Java Virtual Machine Specification</cite>) + * for a class {@code D}, the resolution of the corresponding reference in class + * {@code D} will permanently fail with the same error at any subsequent attempt. + * This means that a {@link LinkageError} triggered during transformation of + * {@code C} in a class {@code D} not directly related to {@code C} can repeatedly + * occur later in arbitrary user code which uses {@code D}. + * * @see java.lang.instrument.Instrumentation * @since 1.5 */ From 559826c2922851dbe45ead23ad1d73b1846334ac Mon Sep 17 00:00:00 2001 From: Jan Lahoda <jlahoda@openjdk.org> Date: Fri, 12 Jul 2024 12:17:21 +0000 Subject: [PATCH 384/471] 8332474: Tighten up ToolBox' JavacTask to not silently accept javac crash as a failure Reviewed-by: vromero --- .../com/sun/tools/javac/comp/Modules.java | 1 + .../tools/lib/toolbox/AbstractTask.java | 60 ++++++++++++++++--- .../tools/lib/toolbox/JavacTask.java | 20 +++++++ 3 files changed, 72 insertions(+), 9 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java index 1136cb5621a79..3d893252218b5 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java @@ -330,6 +330,7 @@ private void enterModule(JCCompilationUnit toplevel, ClassSymbol c, Set<ModuleSy } else { sym = syms.enterModule(name); if (sym.module_info.sourcefile != null && sym.module_info.sourcefile != toplevel.sourcefile) { + decl.sym = syms.errModule; log.error(decl.pos(), Errors.DuplicateModule(sym)); return; } diff --git a/test/langtools/tools/lib/toolbox/AbstractTask.java b/test/langtools/tools/lib/toolbox/AbstractTask.java index 83aca079ce592..778a5398605f8 100644 --- a/test/langtools/tools/lib/toolbox/AbstractTask.java +++ b/test/langtools/tools/lib/toolbox/AbstractTask.java @@ -35,6 +35,7 @@ import java.util.EnumMap; import java.util.HashMap; import java.util.Map; +import java.util.function.BiConsumer; import static toolbox.ToolBox.lineSeparator; /** @@ -50,7 +51,9 @@ abstract class AbstractTask<T extends AbstractTask<T>> implements Task { private final Map<OutputKind, String> redirects = new EnumMap<>(OutputKind.class); private final Map<String, String> envVars = new HashMap<>(); private Expect expect = Expect.SUCCESS; - int expectedExitCode = 0; + //validator for exit codes, first parameter is the exit code + //the second the test name: + private BiConsumer<Integer, String> exitCodeValidator = null; /** * Create a task that will execute in the specified mode. @@ -67,7 +70,7 @@ protected AbstractTask(ToolBox tb, Mode mode) { * @return the result of calling {@code run()} */ public Result run(Expect expect) { - expect(expect, Integer.MIN_VALUE); + expect(expect, (_, _) -> {}); return run(); } @@ -83,17 +86,56 @@ public Result run(Expect expect, int exitCode) { return run(); } + /** + * Sets the expected outcome of the task and calls {@code run()}. + * @param expect the expected outcome + * @param exitCodeValidator an exit code validator. The first parameter will + * be the actual exit code, the second test name, + * should throw TaskError if the exit code is not + * as expected. Only used if the expected outcome + * is {@code FAIL} + * @return the result of calling {@code run()} + */ + public Result run(Expect expect, + BiConsumer<Integer, String> exitCodeValidator) { + expect(expect, exitCodeValidator); + return run(); + } + + /** + * Sets the expected outcome and expected exit code of the task. + * The exit code will not be checked if the outcome is + * {@code Expect.SUCCESS} or if the exit code is set to + * {@code Integer.MIN_VALUE}. + * @param expect the expected outcome + * @param expectedExitCode the expected exit code + */ + protected void expect(Expect expect, int expectedExitCode) { + expect(expect, (exitCode, testName) -> { + if (expectedExitCode != Integer.MIN_VALUE && + exitCode != expectedExitCode) { + throw new TaskError("Task " + testName + "failed with unexpected exit code " + + exitCode + ", expected " + expectedExitCode); + } + }); + } + /** * Sets the expected outcome and expected exit code of the task. * The exit code will not be checked if the outcome is * {@code Expect.SUCCESS} or if the exit code is set to * {@code Integer.MIN_VALUE}. * @param expect the expected outcome - * @param exitCode the expected exit code + * @param exitCodeValidator an exit code validator. The first parameter will + * be the actual exit code, the second test name, + * should throw TaskError if the exit code is not + * as expected. Only used if the expected outcome + * is {@code FAIL} */ - protected void expect(Expect expect, int exitCode) { + protected void expect(Expect expect, + BiConsumer<Integer, String> exitCodeValidator) { this.expect = expect; - this.expectedExitCode = exitCode; + this.exitCodeValidator = exitCodeValidator; } /** @@ -119,11 +161,11 @@ protected Result checkExit(Result result) throws TaskError { throw new TaskError("Task " + name() + " succeeded unexpectedly"); } - if (expectedExitCode != Integer.MIN_VALUE - && result.exitCode != expectedExitCode) { + try { + exitCodeValidator.accept(result.exitCode, name()); + } catch (Throwable t) { result.writeAll(); - throw new TaskError("Task " + name() + "failed with unexpected exit code " - + result.exitCode + ", expected " + expectedExitCode); + throw t; } break; } diff --git a/test/langtools/tools/lib/toolbox/JavacTask.java b/test/langtools/tools/lib/toolbox/JavacTask.java index 5991d9e6063bc..ed056099e84e3 100644 --- a/test/langtools/tools/lib/toolbox/JavacTask.java +++ b/test/langtools/tools/lib/toolbox/JavacTask.java @@ -314,6 +314,26 @@ public String name() { return "javac"; } + @Override + public Result run(Expect expect) { + int expectedExitCode = expect == Expect.SUCCESS ? 0 : 1; + + return run(expect, (exitCode, testName) -> { + if (exitCode == 4) { + throw new TaskError("Task " + testName + " failed due to a javac crash " + + "(exit code 4)"); + } + }); + } + + @Override + public Result run(Expect expect, int exitCode) { + if (exitCode == 4) { + throw new IllegalArgumentException("Disallowed exit code: 4"); + } + return super.run(expect, exitCode); + } + /** * Calls the compiler with the arguments as currently configured. * @return a Result object indicating the outcome of the compilation From 2fc7eb44a018974734832576a0a2631ae747e0cd Mon Sep 17 00:00:00 2001 From: Abhishek Kumar <abhiscxk@openjdk.org> Date: Fri, 12 Jul 2024 12:37:58 +0000 Subject: [PATCH 385/471] 8155030: The Menu Mnemonics are always displayed for GTK LAF Hides mnemonics on menus, buttons, and labels for GTK L&F. Moved shared code for hiding mnemonics into sun/swing/MnemonicHandler and AltProcessor to avoid code duplication. Reviewed-by: prr, tr, achung, dnguyen, aivanov --- .../classes/com/apple/laf/AquaButtonUI.java | 7 +- .../classes/com/apple/laf/AquaLabelUI.java | 21 +-- .../com/apple/laf/AquaLookAndFeel.java | 11 +- .../com/apple/laf/AquaMenuPainter.java | 38 ++++-- .../java/swing/plaf/gtk/GTKGraphicsUtils.java | 21 ++- .../java/swing/plaf/gtk/GTKLookAndFeel.java | 70 ++++++++-- .../share/classes/sun/swing/AltProcessor.java | 67 ++++++++++ .../classes/sun/swing/MnemonicHandler.java} | 100 ++++++--------- .../plaf/windows/WindowsGraphicsUtils.java | 75 ++++------- .../swing/plaf/windows/WindowsLabelUI.java | 7 +- .../plaf/windows/WindowsLookAndFeel.java | 42 +----- .../swing/plaf/windows/WindowsMenuBarUI.java | 6 +- .../swing/plaf/windows/WindowsMenuItemUI.java | 5 +- .../plaf/windows/WindowsPopupMenuUI.java | 9 +- .../swing/plaf/windows/WindowsRootPaneUI.java | 36 +++--- .../swing/JMenuBar/TestMenuMnemonic.java | 8 +- .../JMenuBar/TestMenuMnemonicLinuxAndMac.java | 121 ++++++++++++++++++ .../javax/swing/LookAndFeel/bug4736093.java | 12 +- .../plaf/windows/6921687/bug6921687.java | 11 +- 19 files changed, 428 insertions(+), 239 deletions(-) create mode 100644 src/java.desktop/share/classes/sun/swing/AltProcessor.java rename src/java.desktop/{macosx/classes/com/apple/laf/AquaMnemonicHandler.java => share/classes/sun/swing/MnemonicHandler.java} (52%) create mode 100644 test/jdk/javax/swing/JMenuBar/TestMenuMnemonicLinuxAndMac.java diff --git a/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonUI.java b/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonUI.java index dab893252cfdb..063923ff80754 100644 --- a/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonUI.java +++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,6 +75,7 @@ import com.apple.laf.AquaUtilControlSize.Sizeable; import com.apple.laf.AquaUtils.RecyclableSingleton; import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor; +import sun.swing.MnemonicHandler; import sun.swing.SwingUtilities2; public class AquaButtonUI extends BasicButtonUI implements Sizeable { @@ -487,12 +488,10 @@ protected void paintIcon(final Graphics g, final AbstractButton b, final Rectang * Use the paintText method which takes the AbstractButton argument. */ protected void paintText(final Graphics g, final JComponent c, final Rectangle localTextRect, final String text) { - final Graphics2D g2d = g instanceof Graphics2D ? (Graphics2D)g : null; - final AbstractButton b = (AbstractButton)c; final ButtonModel model = b.getModel(); final FontMetrics fm = g.getFontMetrics(); - final int mnemonicIndex = AquaMnemonicHandler.isMnemonicHidden() ? -1 : b.getDisplayedMnemonicIndex(); + final int mnemonicIndex = MnemonicHandler.isMnemonicHidden() ? -1 : b.getDisplayedMnemonicIndex(); /* Draw the Text */ if (model.isEnabled()) { diff --git a/src/java.desktop/macosx/classes/com/apple/laf/AquaLabelUI.java b/src/java.desktop/macosx/classes/com/apple/laf/AquaLabelUI.java index fb5682d05413e..e0f282325e412 100644 --- a/src/java.desktop/macosx/classes/com/apple/laf/AquaLabelUI.java +++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaLabelUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,19 @@ package com.apple.laf; -import java.awt.*; +import java.awt.Color; +import java.awt.Graphics; -import javax.swing.*; -import javax.swing.plaf.*; -import javax.swing.plaf.basic.*; - -import sun.swing.SwingUtilities2; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.basic.BasicLabelUI; import com.apple.laf.AquaUtils.RecyclableSingleton; import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor; +import sun.swing.MnemonicHandler; +import sun.swing.SwingUtilities2; public class AquaLabelUI extends BasicLabelUI { private static final RecyclableSingleton<AquaLabelUI> aquaLabelUI = new RecyclableSingletonFromDefaultConstructor<AquaLabelUI>(AquaLabelUI.class); @@ -55,7 +58,7 @@ protected void uninstallListeners(final JLabel c) { protected void paintEnabledText(final JLabel l, final Graphics g, final String s, final int textX, final int textY) { int mnemIndex = l.getDisplayedMnemonicIndex(); - if (AquaMnemonicHandler.isMnemonicHidden()) { + if (MnemonicHandler.isMnemonicHidden()) { mnemIndex = -1; } @@ -72,7 +75,7 @@ protected void paintEnabledText(final JLabel l, final Graphics g, final String s */ protected void paintDisabledText(final JLabel l, final Graphics g, final String s, final int textX, final int textY) { int accChar = l.getDisplayedMnemonicIndex(); - if (AquaMnemonicHandler.isMnemonicHidden()) { + if (MnemonicHandler.isMnemonicHidden()) { accChar = -1; } diff --git a/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java b/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java index d68cd1448eaa9..83604e5d835cd 100644 --- a/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java +++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaLookAndFeel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,6 +55,8 @@ import apple.laf.JRSUIControl; import apple.laf.JRSUIUtils; +import sun.swing.AltProcessor; +import sun.swing.MnemonicHandler; import sun.swing.SwingAccessor; import sun.swing.SwingUtilities2; @@ -174,7 +176,9 @@ public Void run() { spf.setActive(true); PopupFactory.setSharedInstance(spf); - KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(AquaMnemonicHandler.getInstance()); + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .addKeyEventPostProcessor(AltProcessor.getInstance()); + MnemonicHandler.setMnemonicHidden(true); } /** @@ -185,7 +189,8 @@ public Void run() { * @see #initialize */ public void uninitialize() { - KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventPostProcessor(AquaMnemonicHandler.getInstance()); + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .removeKeyEventPostProcessor(AltProcessor.getInstance()); final PopupFactory popupFactory = PopupFactory.getSharedInstance(); if (popupFactory instanceof ScreenPopupFactory spf) { diff --git a/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuPainter.java b/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuPainter.java index 5a13822fd5acd..8f1a6799ff6b6 100644 --- a/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuPainter.java +++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuPainter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,21 +25,39 @@ package com.apple.laf; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +import javax.swing.ButtonModel; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.plaf.basic.BasicHTML; import javax.swing.text.View; -import sun.swing.SwingUtilities2; - -import apple.laf.JRSUIConstants.*; - +import apple.laf.JRSUIConstants.State; +import apple.laf.JRSUIConstants.Widget; import com.apple.laf.AquaIcon.InvertableIcon; import com.apple.laf.AquaUtils.RecyclableSingleton; import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor; +import sun.swing.MnemonicHandler; +import sun.swing.SwingUtilities2; /** * AquaMenuPainter, implements paintMenuItem to avoid code duplication @@ -287,7 +305,7 @@ protected void paintMenuItem(final Client client, final Graphics g, final JCompo if (v != null) { v.paint(g, textRect); } else { - final int mnemonic = (AquaMnemonicHandler.isMnemonicHidden() ? -1 : model.getMnemonic()); + final int mnemonic = (MnemonicHandler.isMnemonicHidden() ? -1 : model.getMnemonic()); drawString(g, c, text, mnemonic, textRect.x, textRect.y + fm.getAscent(), isEnabled, isSelected); } } diff --git a/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java b/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java index 0ef404593f592..2a0aa7be41c45 100644 --- a/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java +++ b/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,12 +24,19 @@ */ package com.sun.java.swing.plaf.gtk; -import javax.swing.*; -import javax.swing.plaf.synth.*; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; +import javax.swing.AbstractButton; +import javax.swing.JComponent; +import javax.swing.plaf.synth.Region; +import javax.swing.plaf.synth.SynthConstants; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthGraphicsUtils; + +import sun.swing.MnemonicHandler; + /** * @author Joshua Outwater */ @@ -49,6 +56,11 @@ public void paintText(SynthContext context, Graphics g, String text, int componentState = context.getComponentState(); String themeName = GTKLookAndFeel.getGtkThemeName(); + + if (MnemonicHandler.isMnemonicHidden()) { + mnemonicIndex = -1; + } + if (themeName != null && themeName.startsWith("blueprint") && shouldShadowText(context.getRegion(), componentState)) { @@ -115,7 +127,8 @@ public void paintText(SynthContext context, Graphics g, String text, g.setColor(color); } } - super.paintText(context, g, text, bounds, mnemonicIndex); + super.paintText(context, g, text, bounds, + MnemonicHandler.isMnemonicHidden() ? -1 : mnemonicIndex); } private static boolean shouldShadowText(Region id, int state) { diff --git a/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java b/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java index 65f29ea8384fe..93ba22d8dd3da 100644 --- a/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java +++ b/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java @@ -25,28 +25,50 @@ package com.sun.java.swing.plaf.gtk; -import java.awt.*; -import java.beans.*; -import java.io.File; -import java.lang.ref.*; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Insets; +import java.awt.KeyboardFocusManager; +import java.awt.Toolkit; +import java.awt.Window; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.Locale; -import javax.swing.*; -import javax.swing.colorchooser.*; -import javax.swing.plaf.*; -import javax.swing.plaf.synth.*; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JComponent; +import javax.swing.JTextField; +import javax.swing.LayoutStyle; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.UIDefaults; +import javax.swing.UIManager; +import javax.swing.colorchooser.AbstractColorChooserPanel; +import javax.swing.plaf.BorderUIResource; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.DimensionUIResource; +import javax.swing.plaf.InsetsUIResource; +import javax.swing.plaf.synth.Region; +import javax.swing.plaf.synth.SynthConstants; +import javax.swing.plaf.synth.SynthLookAndFeel; +import javax.swing.plaf.synth.SynthStyleFactory; import javax.swing.text.DefaultEditorKit; import com.sun.java.swing.plaf.gtk.GTKConstants.PositionType; import com.sun.java.swing.plaf.gtk.GTKConstants.StateType; -import java.util.HashMap; -import java.util.Map; import sun.awt.SunToolkit; import sun.awt.UNIXToolkit; -import sun.awt.OSInfo; import sun.security.action.GetPropertyAction; +import sun.swing.AltProcessor; import sun.swing.DefaultLayoutStyle; +import sun.swing.MnemonicHandler; import sun.swing.SwingAccessor; import sun.swing.SwingUtilities2; @@ -866,7 +888,6 @@ public Object createValue(UIDefaults table) { "ctrl released ENTER", "release" }, - "ScrollBar.squareButtons", Boolean.FALSE, "ScrollBar.thumbHeight", Integer.valueOf(14), "ScrollBar.width", Integer.valueOf(16), @@ -1414,6 +1435,10 @@ static boolean isLeftToRight(Component c) { return c.getComponentOrientation().isLeftToRight(); } + /** + * {@inheritDoc} + */ + @Override public void initialize() { /* * We need to call loadGTK() to ensure that the native GTK @@ -1456,6 +1481,23 @@ public void initialize() { gtkAAFontSettingsCond = SwingUtilities2.isLocalDisplay(); aaTextInfo = new HashMap<>(2); SwingUtilities2.putAATextInfo(gtkAAFontSettingsCond, aaTextInfo); + + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .addKeyEventPostProcessor(AltProcessor.getInstance()); + + // By default mnemonics are hidden for GTK L&F + MnemonicHandler.setMnemonicHidden(true); + } + + /** + * {@inheritDoc} + */ + @Override + public void uninitialize() { + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .removeKeyEventPostProcessor(AltProcessor.getInstance()); + MnemonicHandler.setMnemonicHidden(false); + super.uninitialize(); } static ReferenceQueue<GTKLookAndFeel> queue = new ReferenceQueue<GTKLookAndFeel>(); diff --git a/src/java.desktop/share/classes/sun/swing/AltProcessor.java b/src/java.desktop/share/classes/sun/swing/AltProcessor.java new file mode 100644 index 0000000000000..c7bb7b3d4102e --- /dev/null +++ b/src/java.desktop/share/classes/sun/swing/AltProcessor.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.swing; + +import java.awt.KeyEventPostProcessor; +import java.awt.Window; +import java.awt.event.KeyEvent; + +import javax.swing.JRootPane; +import javax.swing.SwingUtilities; + +public final class AltProcessor implements KeyEventPostProcessor { + + private AltProcessor() {} + + private static final AltProcessor altProcessor = new AltProcessor(); + + public static KeyEventPostProcessor getInstance() { + return altProcessor; + } + + @Override + public boolean postProcessKeyEvent(final KeyEvent ev) { + if (ev.getKeyCode() != KeyEvent.VK_ALT) { + return false; + } + + final JRootPane root = SwingUtilities.getRootPane(ev.getComponent()); + final Window winAncestor = (root == null ? null : SwingUtilities.getWindowAncestor(root)); + + switch (ev.getID()) { + case KeyEvent.KEY_PRESSED: + MnemonicHandler.setMnemonicHidden(false); + break; + case KeyEvent.KEY_RELEASED: + MnemonicHandler.setMnemonicHidden(true); + break; + } + + MnemonicHandler.repaintMnemonicsInWindow(winAncestor); + + return false; + } +} diff --git a/src/java.desktop/macosx/classes/com/apple/laf/AquaMnemonicHandler.java b/src/java.desktop/share/classes/sun/swing/MnemonicHandler.java similarity index 52% rename from src/java.desktop/macosx/classes/com/apple/laf/AquaMnemonicHandler.java rename to src/java.desktop/share/classes/sun/swing/MnemonicHandler.java index 76c9735882807..b4f0cac7c611a 100644 --- a/src/java.desktop/macosx/classes/com/apple/laf/AquaMnemonicHandler.java +++ b/src/java.desktop/share/classes/sun/swing/MnemonicHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,39 +23,27 @@ * questions. */ -package com.apple.laf; +package sun.swing; -import java.awt.*; -import java.awt.event.KeyEvent; +import java.awt.Component; +import java.awt.Container; +import java.awt.Window; -import javax.swing.*; +import javax.swing.AbstractButton; +import javax.swing.JLabel; +import javax.swing.UIManager; -import com.apple.laf.AquaUtils.RecyclableSingleton; -import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor; +public final class MnemonicHandler { -public class AquaMnemonicHandler { - private static final RecyclableSingleton<AltProcessor> altProcessor = new RecyclableSingletonFromDefaultConstructor<AltProcessor>(AltProcessor.class); - public static KeyEventPostProcessor getInstance() { - return altProcessor.get(); - } + private static boolean isMnemonicHidden; - protected static boolean isMnemonicHidden = true; // true by default - - public static void setMnemonicHidden(final boolean hide) { - if (UIManager.getBoolean("Button.showMnemonics")) { - // Do not hide mnemonics if the UI defaults do not support this - isMnemonicHidden = false; - } else { - isMnemonicHidden = hide; - } - } + private MnemonicHandler() {} /** - * Gets the state of the hide mnemonic flag. This only has meaning if this feature is supported by the underlying OS. + * Gets the state of the hide mnemonic flag. + * This only has meaning if this feature is supported by the underlying OS. * * @return true if mnemonics are hidden, otherwise, false - * @see #setMnemonicHidden - * @since 1.4 */ public static boolean isMnemonicHidden() { if (UIManager.getBoolean("Button.showMnemonics")) { @@ -65,34 +53,27 @@ public static boolean isMnemonicHidden() { return isMnemonicHidden; } - static class AltProcessor implements KeyEventPostProcessor { - public boolean postProcessKeyEvent(final KeyEvent ev) { - if (ev.getKeyCode() != KeyEvent.VK_ALT) { - return false; - } - - final JRootPane root = SwingUtilities.getRootPane(ev.getComponent()); - final Window winAncestor = (root == null ? null : SwingUtilities.getWindowAncestor(root)); - - switch(ev.getID()) { - case KeyEvent.KEY_PRESSED: - setMnemonicHidden(false); - break; - case KeyEvent.KEY_RELEASED: - setMnemonicHidden(true); - break; - } - - repaintMnemonicsInWindow(winAncestor); - - return false; + /** + * Sets the state of the hide mnemonic flag. This flag is used by the + * component UI delegates to determine if the mnemonic should be rendered. + * This method is a non operation if the underlying operating system + * does not support the mnemonic hiding feature. + * + * @param hide true if mnemonics should be hidden + */ + public static void setMnemonicHidden(final boolean hide) { + if (UIManager.getBoolean("Button.showMnemonics")) { + // Do not hide mnemonics if the UI defaults do not support this + isMnemonicHidden = false; + } else { + isMnemonicHidden = hide; } } - /* + /** * Repaints all the components with the mnemonics in the given window and all its owned windows. */ - static void repaintMnemonicsInWindow(final Window w) { + public static void repaintMnemonicsInWindow(final Window w) { if (w == null || !w.isShowing()) { return; } @@ -105,29 +86,22 @@ static void repaintMnemonicsInWindow(final Window w) { repaintMnemonicsInContainer(w); } - /* + /** * Repaints all the components with the mnemonics in container. * Recursively searches for all the subcomponents. */ - static void repaintMnemonicsInContainer(final Container cont) { - for (int i = 0; i < cont.getComponentCount(); i++) { - final Component c = cont.getComponent(i); + private static void repaintMnemonicsInContainer(final Container cont) { + final Component[] elements = cont.getComponents(); + for (final Component c : elements) { if (c == null || !c.isVisible()) { continue; } - if (c instanceof AbstractButton && ((AbstractButton)c).getMnemonic() != '\0') { - c.repaint(); - continue; - } - - if (c instanceof JLabel && ((JLabel)c).getDisplayedMnemonic() != '\0') { + if ((c instanceof AbstractButton b && b.getMnemonic() != '\0') + || (c instanceof JLabel l && l.getDisplayedMnemonic() != '\0')) { c.repaint(); - continue; - } - - if (c instanceof Container) { - repaintMnemonicsInContainer((Container)c); + } else if (c instanceof Container) { + repaintMnemonicsInContainer((Container) c); } } } diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java index ff38130f728e5..cb4b5caa86de9 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,14 +25,31 @@ package com.sun.java.swing.plaf.windows; -import sun.swing.SwingUtilities2; - -import java.awt.*; - -import javax.swing.*; +import java.awt.Color; +import java.awt.Component; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Rectangle; + +import javax.swing.AbstractButton; +import javax.swing.ButtonModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JRadioButton; +import javax.swing.JToggleButton; +import javax.swing.UIManager; import javax.swing.plaf.UIResource; -import static com.sun.java.swing.plaf.windows.TMSchema.*; +import sun.swing.MnemonicHandler; +import sun.swing.SwingUtilities2; + +import static com.sun.java.swing.plaf.windows.TMSchema.Part; +import static com.sun.java.swing.plaf.windows.TMSchema.Prop; +import static com.sun.java.swing.plaf.windows.TMSchema.State; +import static com.sun.java.swing.plaf.windows.TMSchema.TypeEnum; /** * A collection of static utility methods used for rendering the Windows look @@ -60,7 +77,7 @@ public static void paintText(Graphics g, AbstractButton b, int mnemIndex = b.getDisplayedMnemonicIndex(); // W2K Feature: Check to see if the Underscore should be rendered. - if (WindowsLookAndFeel.isMnemonicHidden() == true) { + if (MnemonicHandler.isMnemonicHidden()) { mnemIndex = -1; } @@ -191,46 +208,4 @@ static boolean isLeftToRight(Component c) { return c.getComponentOrientation().isLeftToRight(); } - /* - * Repaints all the components with the mnemonics in the given window and - * all its owned windows. - */ - static void repaintMnemonicsInWindow(Window w) { - if(w == null || !w.isShowing()) { - return; - } - - Window[] ownedWindows = w.getOwnedWindows(); - for(int i=0;i<ownedWindows.length;i++) { - repaintMnemonicsInWindow(ownedWindows[i]); - } - - repaintMnemonicsInContainer(w); - } - - /* - * Repaints all the components with the mnemonics in container. - * Recursively searches for all the subcomponents. - */ - static void repaintMnemonicsInContainer(Container cont) { - Component c; - for(int i=0; i<cont.getComponentCount(); i++) { - c = cont.getComponent(i); - if(c == null || !c.isVisible()) { - continue; - } - if(c instanceof AbstractButton - && ((AbstractButton)c).getMnemonic() != '\0') { - c.repaint(); - continue; - } else if(c instanceof JLabel - && ((JLabel)c).getDisplayedMnemonic() != '\0') { - c.repaint(); - continue; - } - if(c instanceof Container) { - repaintMnemonicsInContainer((Container)c); - } - } - } } diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLabelUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLabelUI.java index 93f69f49c63f6..6266772dcf4a2 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLabelUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLabelUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,7 @@ import javax.swing.plaf.basic.BasicLabelUI; import sun.awt.AppContext; +import sun.swing.MnemonicHandler; import sun.swing.SwingUtilities2; /** @@ -62,7 +63,7 @@ protected void paintEnabledText(JLabel l, Graphics g, String s, int textX, int textY) { int mnemonicIndex = l.getDisplayedMnemonicIndex(); // W2K Feature: Check to see if the Underscore should be rendered. - if (WindowsLookAndFeel.isMnemonicHidden() == true) { + if (MnemonicHandler.isMnemonicHidden()) { mnemonicIndex = -1; } @@ -75,7 +76,7 @@ protected void paintDisabledText(JLabel l, Graphics g, String s, int textX, int textY) { int mnemonicIndex = l.getDisplayedMnemonicIndex(); // W2K Feature: Check to see if the Underscore should be rendered. - if (WindowsLookAndFeel.isMnemonicHidden() == true) { + if (MnemonicHandler.isMnemonicHidden()) { mnemonicIndex = -1; } if ( UIManager.getColor("Label.disabledForeground") instanceof Color && diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java index f28346292a6ce..aa97b0d0741a4 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -93,6 +93,7 @@ import sun.security.action.GetPropertyAction; import sun.swing.DefaultLayoutStyle; import sun.swing.ImageIconUIResource; +import sun.swing.MnemonicHandler; import sun.swing.StringUIClientPropertyKey; import sun.swing.SwingAccessor; import sun.swing.SwingUtilities2; @@ -196,6 +197,7 @@ public void initialize() { } KeyboardFocusManager.getCurrentKeyboardFocusManager(). addKeyEventPostProcessor(WindowsRootPaneUI.altProcessor); + MnemonicHandler.setMnemonicHidden(true); } @@ -1908,48 +1910,10 @@ public void uninitialize() { WindowsDesktopProperty.flushUnreferencedProperties(); } - - // Toggle flag for drawing the mnemonic state - private static boolean isMnemonicHidden = true; - // Flag which indicates that the Win98/Win2k/WinME features // should be disabled. private static boolean isClassicWindows = false; - /** - * Sets the state of the hide mnemonic flag. This flag is used by the - * component UI delegates to determine if the mnemonic should be rendered. - * This method is a non operation if the underlying operating system - * does not support the mnemonic hiding feature. - * - * @param hide true if mnemonics should be hidden - * @since 1.4 - */ - public static void setMnemonicHidden(boolean hide) { - if (UIManager.getBoolean("Button.showMnemonics") == true) { - // Do not hide mnemonics if the UI defaults do not support this - isMnemonicHidden = false; - } else { - isMnemonicHidden = hide; - } - } - - /** - * Gets the state of the hide mnemonic flag. This only has meaning - * if this feature is supported by the underlying OS. - * - * @return true if mnemonics are hidden, otherwise, false - * @see #setMnemonicHidden - * @since 1.4 - */ - public static boolean isMnemonicHidden() { - if (UIManager.getBoolean("Button.showMnemonics") == true) { - // Do not hide mnemonics if the UI defaults do not support this - isMnemonicHidden = false; - } - return isMnemonicHidden; - } - /** * Gets the state of the flag which indicates if the old Windows * look and feel should be rendered. This flag is used by the diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java index 10aadfa7cd871..8c6cbdff5412e 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java @@ -52,6 +52,8 @@ import com.sun.java.swing.plaf.windows.TMSchema.State; import com.sun.java.swing.plaf.windows.XPStyle.Skin; +import sun.swing.MnemonicHandler; + /** * Windows rendition of the component. */ @@ -149,11 +151,11 @@ public void actionPerformed(ActionEvent e) { MenuElement[] selectedPath = msm.getSelectedPath(); if (selectedPath.length > 0 && (selectedPath[0] instanceof JMenuBar)) { msm.clearSelectedPath(); - WindowsLookAndFeel.setMnemonicHidden(true); + MnemonicHandler.setMnemonicHidden(true); } else { MenuElement[] path = {menuBar, menu}; msm.setSelectedPath(path); - WindowsLookAndFeel.setMnemonicHidden(false); + MnemonicHandler.setMnemonicHidden(false); } WindowsLookAndFeel.repaintRootPane(menuBar); } diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java index 09fad9c98a6de..2f76f9291332c 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,6 +46,7 @@ import com.sun.java.swing.plaf.windows.XPStyle.Skin; import sun.swing.MenuItemCheckIconFactory; import sun.swing.MenuItemLayoutHelper; +import sun.swing.MnemonicHandler; import sun.swing.SwingUtilities2; /** @@ -203,7 +204,7 @@ static void paintText(WindowsMenuItemUIAccessor menuItemUI, Graphics g, FontMetrics fm = SwingUtilities2.getFontMetrics(menuItem, g); int mnemIndex = menuItem.getDisplayedMnemonicIndex(); // W2K Feature: Check to see if the Underscore should be rendered. - if (WindowsLookAndFeel.isMnemonicHidden() == true) { + if (MnemonicHandler.isMnemonicHidden()) { mnemIndex = -1; } WindowsGraphicsUtils.paintXPText(menuItem, diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java index 87e89fca3dce6..3bf214aff374d 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,6 +47,7 @@ import com.sun.java.swing.plaf.windows.TMSchema.Part; import com.sun.java.swing.plaf.windows.TMSchema.State; import com.sun.java.swing.plaf.windows.XPStyle.Skin; +import sun.swing.MnemonicHandler; import sun.swing.StringUIClientPropertyKey; import static sun.swing.SwingUtilities2.BASICMENUITEMUI_MAX_TEXT_OFFSET; @@ -99,13 +100,13 @@ public void stateChanged(ChangeEvent ev) { MenuSelectionManager msm = (MenuSelectionManager)ev.getSource(); MenuElement[] path = msm.getSelectedPath(); if (path.length == 0) { - if(!WindowsLookAndFeel.isMnemonicHidden()) { + if (!MnemonicHandler.isMnemonicHidden()) { // menu was canceled -- hide mnemonics - WindowsLookAndFeel.setMnemonicHidden(true); + MnemonicHandler.setMnemonicHidden(true); if (repaintRoot != null) { Window win = SwingUtilities.getWindowAncestor(repaintRoot); - WindowsGraphicsUtils.repaintMnemonicsInWindow(win); + MnemonicHandler.repaintMnemonicsInWindow(win); } } repaintRoot = null; diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java index 86e9a888a2faf..f05da909ac1db 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,6 +61,8 @@ import javax.swing.plaf.basic.BasicRootPaneUI; import javax.swing.plaf.basic.ComboPopup; +import sun.swing.MnemonicHandler; + /** * Windows implementation of RootPaneUI, there is one shared between all * JRootPane instances. @@ -93,13 +95,13 @@ void altPressed(KeyEvent ev) { ev.consume(); } else if(path.length > 0) { // We are in ComboBox menuCanceledOnPress = false; - WindowsLookAndFeel.setMnemonicHidden(false); - WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor); + MnemonicHandler.setMnemonicHidden(false); + MnemonicHandler.repaintMnemonicsInWindow(winAncestor); ev.consume(); } else { menuCanceledOnPress = false; - WindowsLookAndFeel.setMnemonicHidden(false); - WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor); + MnemonicHandler.setMnemonicHidden(false); + MnemonicHandler.repaintMnemonicsInWindow(winAncestor); JMenuBar mbar = root != null ? root.getJMenuBar() : null; if(mbar == null && winAncestor instanceof JFrame) { mbar = ((JFrame)winAncestor).getJMenuBar(); @@ -113,8 +115,8 @@ void altPressed(KeyEvent ev) { void altReleased(KeyEvent ev) { if (menuCanceledOnPress) { - WindowsLookAndFeel.setMnemonicHidden(true); - WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor); + MnemonicHandler.setMnemonicHidden(true); + MnemonicHandler.repaintMnemonicsInWindow(winAncestor); return; } @@ -151,14 +153,14 @@ void altReleased(KeyEvent ev) { path[0] = mbar; path[1] = menu; msm.setSelectedPath(path); - } else if(!WindowsLookAndFeel.isMnemonicHidden()) { - WindowsLookAndFeel.setMnemonicHidden(true); - WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor); + } else if (!MnemonicHandler.isMnemonicHidden()) { + MnemonicHandler.setMnemonicHidden(true); + MnemonicHandler.repaintMnemonicsInWindow(winAncestor); } } else { if((msm.getSelectedPath())[0] instanceof ComboPopup) { - WindowsLookAndFeel.setMnemonicHidden(true); - WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor); + MnemonicHandler.setMnemonicHidden(true); + MnemonicHandler.repaintMnemonicsInWindow(winAncestor); } } @@ -193,8 +195,8 @@ public boolean postProcessKeyEvent(KeyEvent ev) { MenuSelectionManager.defaultManager(); MenuElement[] path = msm.getSelectedPath(); if (path.length <= 0) { - WindowsLookAndFeel.setMnemonicHidden(true); - WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor); + MnemonicHandler.setMnemonicHidden(true); + MnemonicHandler.repaintMnemonicsInWindow(winAncestor); } } altKeyPressed = false; @@ -202,9 +204,9 @@ public boolean postProcessKeyEvent(KeyEvent ev) { root = null; winAncestor = null; } else { - if (WindowsLookAndFeel.isMnemonicHidden() && ev.isAltDown()) { - WindowsLookAndFeel.setMnemonicHidden(false); - WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor); + if (MnemonicHandler.isMnemonicHidden() && ev.isAltDown()) { + MnemonicHandler.setMnemonicHidden(false); + MnemonicHandler.repaintMnemonicsInWindow(winAncestor); } altKeyPressed = false; } diff --git a/test/jdk/javax/swing/JMenuBar/TestMenuMnemonic.java b/test/jdk/javax/swing/JMenuBar/TestMenuMnemonic.java index 500d3ca3408af..7dd9ec16c91ec 100644 --- a/test/jdk/javax/swing/JMenuBar/TestMenuMnemonic.java +++ b/test/jdk/javax/swing/JMenuBar/TestMenuMnemonic.java @@ -23,10 +23,10 @@ /* * @test - * @bug 8326458 + * @bug 8326458 8155030 * @key headful * @requires (os.family == "windows") - * @modules java.desktop/com.sun.java.swing.plaf.windows + * @modules java.desktop/sun.swing * @summary Verifies if menu mnemonics toggle on F10 press in Windows LAF * @run main TestMenuMnemonic */ @@ -43,7 +43,7 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; -import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; +import sun.swing.MnemonicHandler; public class TestMenuMnemonic { @@ -93,7 +93,7 @@ private static void verifyMnemonicsState() { MenuSelectionManager msm = MenuSelectionManager.defaultManager(); MenuElement[] selectedPath = msm.getSelectedPath(); - if (WindowsLookAndFeel.isMnemonicHidden()) { + if (MnemonicHandler.isMnemonicHidden()) { mnemonicHideCount.getAndIncrement(); // Check if selection is cleared when mnemonics are hidden if (selectedPath.length != 0) { diff --git a/test/jdk/javax/swing/JMenuBar/TestMenuMnemonicLinuxAndMac.java b/test/jdk/javax/swing/JMenuBar/TestMenuMnemonicLinuxAndMac.java new file mode 100644 index 0000000000000..5fdf8f9aa2709 --- /dev/null +++ b/test/jdk/javax/swing/JMenuBar/TestMenuMnemonicLinuxAndMac.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +/* + * @test + * @bug 8155030 + * @key headful + * @requires (os.family == "linux" | os.family == "mac") + * @library /javax/swing/regtesthelpers + * @build Util + * @summary Verifies if menu mnemonic toggle on Alt press in GTK and Aqua LAF + * @run main TestMenuMnemonicLinuxAndMac + */ + +public class TestMenuMnemonicLinuxAndMac { + + private static JFrame frame; + private static JMenu fileMenu; + private static volatile Rectangle fileMenuRect; + + public static void main(String[] args) throws Exception { + for (UIManager.LookAndFeelInfo laf : + UIManager.getInstalledLookAndFeels()) { + if (laf.getName().contains("GTK") || laf.getName().contains("Aqua")) { + System.out.println("Testing: " + laf.getName()); + UIManager.setLookAndFeel(laf.getClassName()); + break; + } + } + + Robot robot = new Robot(); + robot.setAutoDelay(200); + + try { + SwingUtilities.invokeAndWait(TestMenuMnemonicLinuxAndMac::createAndShowUI); + robot.waitForIdle(); + robot.delay(1000); + + SwingUtilities.invokeAndWait(() -> { + fileMenuRect = new Rectangle(fileMenu.getLocationOnScreen(), + fileMenu.getSize()); + }); + + robot.keyPress(KeyEvent.VK_ALT); + robot.waitForIdle(); + + BufferedImage img1 = robot.createScreenCapture(fileMenuRect); + + robot.keyRelease(KeyEvent.VK_ALT); + robot.waitForIdle(); + + BufferedImage img2 = robot.createScreenCapture(fileMenuRect); + + if (Util.compareBufferedImages(img1, img2)) { + try { + ImageIO.write(img1, "png", new File("Menu_With_Mnemonic.png")); + ImageIO.write(img2, "png", new File("Menu_Without_Mnemonic.png")); + } catch (IOException ignored) { + } + throw new RuntimeException("Mismatch in mnemonic show/hide on Alt press"); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } + + private static void createAndShowUI() { + frame = new JFrame("Test Menu Mnemonic Show/Hide"); + JMenuBar menuBar = new JMenuBar(); + fileMenu = new JMenu("File"); + fileMenu.setMnemonic(KeyEvent.VK_F); + JMenuItem item1 = new JMenuItem("Item-1"); + JMenuItem item2 = new JMenuItem("Item-2"); + fileMenu.add(item1); + fileMenu.add(item2); + menuBar.add(fileMenu); + frame.setJMenuBar(menuBar); + frame.setSize(250, 200); + frame.setLocationRelativeTo(null); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setVisible(true); + } +} diff --git a/test/jdk/javax/swing/LookAndFeel/bug4736093.java b/test/jdk/javax/swing/LookAndFeel/bug4736093.java index 522eb98ab3e00..7b599f1527f87 100644 --- a/test/jdk/javax/swing/LookAndFeel/bug4736093.java +++ b/test/jdk/javax/swing/LookAndFeel/bug4736093.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,10 +23,10 @@ /* * @test - * @bug 4736093 + * @bug 4736093 8155030 * @requires (os.family == "windows") * @summary REGRESSION: Menu and controls shortcuts are not visible in Win L&F in jdk1.4.1 - * @modules java.desktop/com.sun.java.swing.plaf.windows + * @modules java.desktop/sun.swing * @key headful */ @@ -42,7 +42,7 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; -import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; +import sun.swing.MnemonicHandler; public class bug4736093 { static volatile boolean passed = true; @@ -62,7 +62,7 @@ public static void main(String args[]) throws Exception { winlaf = false; } - if (winlaf && WindowsLookAndFeel.isMnemonicHidden()) { + if (winlaf && MnemonicHandler.isMnemonicHidden()) { mainFrame = new JFrame("Bug 4736093"); mainFrame.addWindowListener(new TestStateListener()); mainFrame.setSize(200, 400); @@ -100,7 +100,7 @@ public static void addMenuBar() { public static void checkForMnemonics(boolean expected) { - if (expected != WindowsLookAndFeel.isMnemonicHidden()) { + if (expected != MnemonicHandler.isMnemonicHidden()) { passed = false; } } diff --git a/test/jdk/javax/swing/plaf/windows/6921687/bug6921687.java b/test/jdk/javax/swing/plaf/windows/6921687/bug6921687.java index 7213fe188e8c7..4d62af9122ba0 100644 --- a/test/jdk/javax/swing/plaf/windows/6921687/bug6921687.java +++ b/test/jdk/javax/swing/plaf/windows/6921687/bug6921687.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,14 +24,13 @@ /** * @test * @key headful - * @bug 6921687 8079428 + * @bug 6921687 8079428 8155030 * @summary Mnemonic disappears after repeated attempts to open menu items using * mnemonics - * @author Semyon Sadetsky * @library /test/lib * @build jdk.test.lib.Platform * @requires (os.family == "windows") - * @modules java.desktop/com.sun.java.swing.plaf.windows + * @modules java.desktop/sun.swing * @run main bug6921687 */ @@ -45,6 +44,8 @@ import javax.swing.UIManager; import jdk.test.lib.Platform; +import sun.swing.MnemonicHandler; + public class bug6921687 { private static Class lafClass; @@ -91,7 +92,7 @@ public static void main(String[] args) throws Exception { } private static void checkMnemonics() throws Exception { - if ((Boolean) lafClass.getMethod("isMnemonicHidden").invoke(lafClass)) { + if (MnemonicHandler.isMnemonicHidden()) { throw new RuntimeException("Mnemonics are hidden"); } } From 34d8562a913b8382601e4c0c31ad34a663b9ec0a Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang <ayang@openjdk.org> Date: Fri, 12 Jul 2024 12:59:13 +0000 Subject: [PATCH 386/471] 8335902: Parallel: Refactor VM_ParallelGCFailedAllocation and VM_ParallelGCSystemGC Reviewed-by: gli, zgu --- .../gc/parallel/parallelScavengeHeap.cpp | 173 ++++++++++-------- .../gc/parallel/parallelScavengeHeap.hpp | 37 ++-- .../parallel/parallelScavengeHeap.inline.hpp | 4 - .../parallel/psGCAdaptivePolicyCounters.cpp | 8 - .../parallel/psGCAdaptivePolicyCounters.hpp | 11 -- .../share/gc/parallel/psParallelCompact.cpp | 2 + src/hotspot/share/gc/parallel/psScavenge.cpp | 111 +++-------- src/hotspot/share/gc/parallel/psScavenge.hpp | 14 +- .../share/gc/parallel/psVMOperations.cpp | 32 ++-- .../share/gc/parallel/psVMOperations.hpp | 17 +- .../share/gc/shared/gcVMOperations.hpp | 8 +- src/hotspot/share/runtime/vmOperation.hpp | 4 +- .../sun/jvmstat/perfdata/resources/aliasmap | 4 - .../jfr/event/runtime/TestVMOperation.java | 2 +- 14 files changed, 173 insertions(+), 254 deletions(-) diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp index 33a499ce47134..cee5a805cb74a 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp @@ -263,13 +263,20 @@ bool ParallelScavengeHeap::requires_barriers(stackChunkOop p) const { // and the rest will not be executed. For that reason, this method loops // during failed allocation attempts. If the java heap becomes exhausted, // we rely on the size_policy object to force a bail out. -HeapWord* ParallelScavengeHeap::mem_allocate( - size_t size, - bool* gc_overhead_limit_was_exceeded) { +HeapWord* ParallelScavengeHeap::mem_allocate(size_t size, + bool* gc_overhead_limit_was_exceeded) { assert(!SafepointSynchronize::is_at_safepoint(), "should not be at safepoint"); assert(Thread::current() != (Thread*)VMThread::vm_thread(), "should not be in vm thread"); assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock"); + bool is_tlab = false; + return mem_allocate_work(size, is_tlab, gc_overhead_limit_was_exceeded); +} + +HeapWord* ParallelScavengeHeap::mem_allocate_work(size_t size, + bool is_tlab, + bool* gc_overhead_limit_was_exceeded) { + // In general gc_overhead_limit_was_exceeded should be false so // set it so here and reset it to true only if the gc time // limit is being exceeded as checked below. @@ -303,9 +310,11 @@ HeapWord* ParallelScavengeHeap::mem_allocate( } // If certain conditions hold, try allocating from the old gen. - result = mem_allocate_old_gen(size); - if (result != nullptr) { - return result; + if (!is_tlab) { + result = mem_allocate_old_gen(size); + if (result != nullptr) { + return result; + } } if (gclocker_stalled_count > GCLockerRetryAllocationCount) { @@ -338,7 +347,7 @@ HeapWord* ParallelScavengeHeap::mem_allocate( if (result == nullptr) { // Generate a VM operation - VM_ParallelGCFailedAllocation op(size, gc_count); + VM_ParallelCollectForAllocation op(size, is_tlab, gc_count); VMThread::execute(&op); // Did the VM operation execute? If so, return the result directly. @@ -395,23 +404,6 @@ HeapWord* ParallelScavengeHeap::mem_allocate( return result; } -// A "death march" is a series of ultra-slow allocations in which a full gc is -// done before each allocation, and after the full gc the allocation still -// cannot be satisfied from the young gen. This routine detects that condition; -// it should be called after a full gc has been done and the allocation -// attempted from the young gen. The parameter 'addr' should be the result of -// that young gen allocation attempt. -void -ParallelScavengeHeap::death_march_check(HeapWord* const addr, size_t size) { - if (addr != nullptr) { - _death_march_count = 0; // death march has ended - } else if (_death_march_count == 0) { - if (should_alloc_in_eden(size)) { - _death_march_count = 1; // death march has started - } - } -} - HeapWord* ParallelScavengeHeap::allocate_old_gen_and_record(size_t size) { assert_locked_or_safepoint(Heap_lock); HeapWord* res = old_gen()->allocate(size); @@ -427,74 +419,76 @@ HeapWord* ParallelScavengeHeap::mem_allocate_old_gen(size_t size) { return allocate_old_gen_and_record(size); } - // If a "death march" is in progress, allocate from the old gen a limited - // number of times before doing a GC. - if (_death_march_count > 0) { - if (_death_march_count < 64) { - ++_death_march_count; - return allocate_old_gen_and_record(size); - } else { - _death_march_count = 0; - } - } return nullptr; } void ParallelScavengeHeap::do_full_collection(bool clear_all_soft_refs) { + if (GCLocker::check_active_before_gc()) { + return; + } PSParallelCompact::invoke(clear_all_soft_refs); } -// Failed allocation policy. Must be called from the VM thread, and -// only at a safepoint! Note that this method has policy for allocation -// flow, and NOT collection policy. So we do not check for gc collection -// time over limit here, that is the responsibility of the heap specific -// collection methods. This method decides where to attempt allocations, -// and when to attempt collections, but no collection specific policy. -HeapWord* ParallelScavengeHeap::failed_mem_allocate(size_t size) { - assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint"); - assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread"); - assert(!is_stw_gc_active(), "not reentrant"); - assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock"); +HeapWord* ParallelScavengeHeap::expand_heap_and_allocate(size_t size, bool is_tlab) { + HeapWord* result = nullptr; - // We assume that allocation in eden will fail unless we collect. + result = young_gen()->allocate(size); + if (result == nullptr && !is_tlab) { + // auto expand inside + result = old_gen()->allocate(size); + } + return result; // Could be null if we are out of space. +} - // First level allocation failure, scavenge and allocate in young gen. - GCCauseSetter gccs(this, GCCause::_allocation_failure); - const bool invoked_full_gc = PSScavenge::invoke(); - HeapWord* result = young_gen()->allocate(size); +HeapWord* ParallelScavengeHeap::satisfy_failed_allocation(size_t size, bool is_tlab) { + assert(size != 0, "precondition"); - // Second level allocation failure. - // Mark sweep and allocate in young generation. - if (result == nullptr && !invoked_full_gc) { - do_full_collection(false); - result = young_gen()->allocate(size); + HeapWord* result = nullptr; + + GCLocker::check_active_before_gc(); + if (GCLocker::is_active_and_needs_gc()) { + return expand_heap_and_allocate(size, is_tlab); } - death_march_check(result, size); + // If young-gen can handle this allocation, attempt young-gc firstly. + bool should_run_young_gc = is_tlab || should_alloc_in_eden(size); + collect_at_safepoint(!should_run_young_gc); - // Third level allocation failure. - // After mark sweep and young generation allocation failure, - // allocate in old generation. - if (result == nullptr) { - result = allocate_old_gen_and_record(size); + result = expand_heap_and_allocate(size, is_tlab); + if (result != nullptr) { + return result; } - // Fourth level allocation failure. We're running out of memory. - // More complete mark sweep and allocate in young generation. - if (result == nullptr) { - do_full_collection(true); - result = young_gen()->allocate(size); + // If we reach this point, we're really out of memory. Try every trick + // we can to reclaim memory. Force collection of soft references. Force + // a complete compaction of the heap. Any additional methods for finding + // free memory should be here, especially if they are expensive. If this + // attempt fails, an OOM exception will be thrown. + { + // Make sure the heap is fully compacted + uintx old_interval = HeapMaximumCompactionInterval; + HeapMaximumCompactionInterval = 0; + + const bool clear_all_soft_refs = true; + PSParallelCompact::invoke(clear_all_soft_refs); + + // Restore + HeapMaximumCompactionInterval = old_interval; } - // Fifth level allocation failure. - // After more complete mark sweep, allocate in old generation. - if (result == nullptr) { - result = allocate_old_gen_and_record(size); + result = expand_heap_and_allocate(size, is_tlab); + if (result != nullptr) { + return result; } - return result; + // What else? We might try synchronous finalization later. If the total + // space available is large enough for the allocation, then a more + // complete compaction phase than we've tried so far might be + // appropriate. + return nullptr; } + void ParallelScavengeHeap::ensure_parsability(bool retire_tlabs) { CollectedHeap::ensure_parsability(retire_tlabs); young_gen()->eden_space()->ensure_parsability(); @@ -513,7 +507,10 @@ size_t ParallelScavengeHeap::unsafe_max_tlab_alloc(Thread* thr) const { } HeapWord* ParallelScavengeHeap::allocate_new_tlab(size_t min_size, size_t requested_size, size_t* actual_size) { - HeapWord* result = young_gen()->allocate(requested_size); + bool dummy; + HeapWord* result = mem_allocate_work(requested_size /* size */, + true /* is_tlab */, + &dummy); if (result != nullptr) { *actual_size = requested_size; } @@ -533,7 +530,6 @@ void ParallelScavengeHeap::prune_unlinked_nmethods() { ScavengableNMethods::prune_unlinked_nmethods(); } -// This method is used by System.gc() and JVMTI. void ParallelScavengeHeap::collect(GCCause::Cause cause) { assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock"); @@ -552,10 +548,10 @@ void ParallelScavengeHeap::collect(GCCause::Cause cause) { } while (true) { - VM_ParallelGCSystemGC op(gc_count, full_gc_count, cause); + VM_ParallelGCCollect op(gc_count, full_gc_count, cause); VMThread::execute(&op); - if (!GCCause::is_explicit_full_gc(cause) || op.full_gc_succeeded()) { + if (!GCCause::is_explicit_full_gc(cause)) { return; } @@ -573,6 +569,33 @@ void ParallelScavengeHeap::collect(GCCause::Cause cause) { } } +void ParallelScavengeHeap::try_collect_at_safepoint(bool full) { + assert(SafepointSynchronize::is_at_safepoint(), "precondition"); + if (GCLocker::check_active_before_gc()) { + return; + } + collect_at_safepoint(full); +} + +bool ParallelScavengeHeap::must_clear_all_soft_refs() { + return _gc_cause == GCCause::_metadata_GC_clear_soft_refs || + _gc_cause == GCCause::_wb_full_gc; +} + +void ParallelScavengeHeap::collect_at_safepoint(bool full) { + assert(!GCLocker::is_active(), "precondition"); + bool clear_soft_refs = must_clear_all_soft_refs(); + + if (!full) { + bool success = PSScavenge::invoke(clear_soft_refs); + if (success) { + return; + } + // Upgrade to Full-GC if young-gc fails + } + PSParallelCompact::invoke(clear_soft_refs); +} + void ParallelScavengeHeap::object_iterate(ObjectClosure* cl) { young_gen()->object_iterate(cl); old_gen()->object_iterate(cl); diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp index fa45abc80b4d4..a6601611c9be2 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp @@ -75,8 +75,6 @@ class ParallelScavengeHeap : public CollectedHeap { static PSAdaptiveSizePolicy* _size_policy; static PSGCAdaptivePolicyCounters* _gc_policy_counters; - unsigned int _death_march_count; - GCMemoryManager* _young_manager; GCMemoryManager* _old_manager; @@ -96,17 +94,27 @@ class ParallelScavengeHeap : public CollectedHeap { void update_parallel_worker_threads_cpu_time(); - protected: + void collect_at_safepoint(bool full); + + bool must_clear_all_soft_refs(); + HeapWord* allocate_new_tlab(size_t min_size, size_t requested_size, size_t* actual_size) override; inline bool should_alloc_in_eden(size_t size) const; - inline void death_march_check(HeapWord* const result, size_t size); + HeapWord* mem_allocate_old_gen(size_t size); - public: + HeapWord* mem_allocate_work(size_t size, + bool is_tlab, + bool* gc_overhead_limit_was_exceeded); + + HeapWord* expand_heap_and_allocate(size_t size, bool is_tlab); + + void do_full_collection(bool clear_all_soft_refs) override; + +public: ParallelScavengeHeap() : CollectedHeap(), - _death_march_count(0), _young_manager(nullptr), _old_manager(nullptr), _eden_pool(nullptr), @@ -184,25 +192,12 @@ class ParallelScavengeHeap : public CollectedHeap { // "gc_time_limit_was_exceeded" has an undefined meaning. HeapWord* mem_allocate(size_t size, bool* gc_overhead_limit_was_exceeded) override; - // Allocation attempt(s) during a safepoint. It should never be called - // to allocate a new TLAB as this allocation might be satisfied out - // of the old generation. - HeapWord* failed_mem_allocate(size_t size); + HeapWord* satisfy_failed_allocation(size_t size, bool is_tlab); // Support for System.gc() void collect(GCCause::Cause cause) override; - // These also should be called by the vm thread at a safepoint (e.g., from a - // VM operation). - // - // The first collects the young generation only, unless the scavenge fails; it - // will then attempt a full gc. The second collects the entire heap; if - // maximum_compaction is true, it will compact everything and clear all soft - // references. - inline bool invoke_scavenge(); - - // Perform a full collection - void do_full_collection(bool clear_all_soft_refs) override; + void try_collect_at_safepoint(bool full); void ensure_parsability(bool retire_tlabs) override; void resize_all_tlabs() override; diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.inline.hpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.inline.hpp index 93a90b3d0b50a..f257f4c9177c5 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.inline.hpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.inline.hpp @@ -34,10 +34,6 @@ inline bool ParallelScavengeHeap::should_alloc_in_eden(const size_t size) const return size < eden_size / 2; } -inline bool ParallelScavengeHeap::invoke_scavenge() { - return PSScavenge::invoke(); -} - inline bool ParallelScavengeHeap::is_in_young(const void* p) const { // Assumes the old gen address range is lower than that of the young gen. bool result = p >= young_gen()->reserved().start(); diff --git a/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.cpp b/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.cpp index b5d2e577a156c..20e14b73ac390 100644 --- a/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.cpp +++ b/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.cpp @@ -128,14 +128,6 @@ PSGCAdaptivePolicyCounters::PSGCAdaptivePolicyCounters(const char* name_arg, _major_pause_young_slope = PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_None, (jlong) 0, CHECK); - cname = PerfDataManager::counter_name(name_space(), "scavengeSkipped"); - _scavenge_skipped = PerfDataManager::create_variable(SUN_GC, cname, - PerfData::U_Bytes, (jlong) 0, CHECK); - - cname = PerfDataManager::counter_name(name_space(), "fullFollowsScavenge"); - _full_follows_scavenge = PerfDataManager::create_variable(SUN_GC, cname, - PerfData::U_Bytes, (jlong) 0, CHECK); - _counter_time_stamp.update(); } diff --git a/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.hpp b/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.hpp index 223a039d6fe37..620c761004ecd 100644 --- a/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.hpp +++ b/src/hotspot/share/gc/parallel/psGCAdaptivePolicyCounters.hpp @@ -61,9 +61,6 @@ class PSGCAdaptivePolicyCounters : public GCAdaptivePolicyCounters { PerfVariable* _minor_pause_old_slope; PerfVariable* _major_pause_young_slope; - PerfVariable* _scavenge_skipped; - PerfVariable* _full_follows_scavenge; - // Use this time stamp if the gc time stamp is not available. TimeStamp _counter_time_stamp; @@ -180,14 +177,6 @@ class PSGCAdaptivePolicyCounters : public GCAdaptivePolicyCounters { (jlong)(ps_size_policy()->live_at_last_full_gc())); } - inline void update_scavenge_skipped(int cause) { - _scavenge_skipped->set_value(cause); - } - - inline void update_full_follows_scavenge(int event) { - _full_follows_scavenge->set_value(event); - } - // Update all the counters that can be updated from the size policy. // This should be called after all policy changes have been made // and reflected internally in the size policy. diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index d4a24b710cfae..f41108d1a597f 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -51,6 +51,7 @@ #include "gc/shared/gcTimer.hpp" #include "gc/shared/gcTrace.hpp" #include "gc/shared/gcTraceTime.inline.hpp" +#include "gc/shared/gcVMOperations.hpp" #include "gc/shared/isGCActiveMark.hpp" #include "gc/shared/oopStorage.inline.hpp" #include "gc/shared/oopStorageSet.inline.hpp" @@ -968,6 +969,7 @@ bool PSParallelCompact::invoke(bool clear_all_soft_refs) { assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread"); + SvcGCMarker sgcm(SvcGCMarker::FULL); IsSTWGCActiveMark mark; ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); diff --git a/src/hotspot/share/gc/parallel/psScavenge.cpp b/src/hotspot/share/gc/parallel/psScavenge.cpp index 708bb9da48af7..929eca54a5ce9 100644 --- a/src/hotspot/share/gc/parallel/psScavenge.cpp +++ b/src/hotspot/share/gc/parallel/psScavenge.cpp @@ -42,6 +42,7 @@ #include "gc/shared/gcTimer.hpp" #include "gc/shared/gcTrace.hpp" #include "gc/shared/gcTraceTime.inline.hpp" +#include "gc/shared/gcVMOperations.hpp" #include "gc/shared/isGCActiveMark.hpp" #include "gc/shared/oopStorage.inline.hpp" #include "gc/shared/oopStorageSetParState.inline.hpp" @@ -221,42 +222,6 @@ class ParallelScavengeRefProcProxyTask : public RefProcProxyTask { } }; -// This method contains all heap specific policy for invoking scavenge. -// PSScavenge::invoke_no_policy() will do nothing but attempt to -// scavenge. It will not clean up after failed promotions, bail out if -// we've exceeded policy time limits, or any other special behavior. -// All such policy should be placed here. -// -// Note that this method should only be called from the vm_thread while -// at a safepoint! -bool PSScavenge::invoke() { - assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint"); - assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread"); - assert(!ParallelScavengeHeap::heap()->is_stw_gc_active(), "not reentrant"); - - ParallelScavengeHeap* const heap = ParallelScavengeHeap::heap(); - IsSTWGCActiveMark mark; - - const bool scavenge_done = PSScavenge::invoke_no_policy(); - const bool need_full_gc = !scavenge_done; - bool full_gc_done = false; - - if (UsePerfData) { - PSGCAdaptivePolicyCounters* const counters = heap->gc_policy_counters(); - const int ffs_val = need_full_gc ? full_follows_scavenge : not_skipped; - counters->update_full_follows_scavenge(ffs_val); - } - - if (need_full_gc) { - GCCauseSetter gccs(heap, GCCause::_adaptive_size_policy); - const bool clear_all_softrefs = heap->soft_ref_policy()->should_clear_all_soft_refs(); - - full_gc_done = PSParallelCompact::invoke_no_policy(clear_all_softrefs); - } - - return full_gc_done; -} - class PSThreadRootsTaskClosure : public ThreadClosure { uint _worker_id; public: @@ -288,14 +253,14 @@ class ScavengeRootsTask : public WorkerTask { public: ScavengeRootsTask(PSOldGen* old_gen, uint active_workers) : - WorkerTask("ScavengeRootsTask"), - _strong_roots_scope(active_workers), - _subtasks(ParallelRootType::sentinel), - _old_gen(old_gen), - _gen_top(old_gen->object_space()->top()), - _active_workers(active_workers), - _is_old_gen_empty(old_gen->object_space()->is_empty()), - _terminator(active_workers, PSPromotionManager::vm_thread_promotion_manager()->stack_array_depth()) { + WorkerTask("ScavengeRootsTask"), + _strong_roots_scope(active_workers), + _subtasks(ParallelRootType::sentinel), + _old_gen(old_gen), + _gen_top(old_gen->object_space()->top()), + _active_workers(active_workers), + _is_old_gen_empty(old_gen->object_space()->is_empty()), + _terminator(active_workers, PSPromotionManager::vm_thread_promotion_manager()->stack_array_depth()) { if (!_is_old_gen_empty) { PSCardTable* card_table = ParallelScavengeHeap::heap()->card_table(); card_table->pre_scavenge(active_workers); @@ -353,26 +318,23 @@ class ScavengeRootsTask : public WorkerTask { } }; -// This method contains no policy. You should probably -// be calling invoke() instead. -bool PSScavenge::invoke_no_policy() { +bool PSScavenge::invoke(bool clear_soft_refs) { assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint"); assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread"); - _gc_timer.register_gc_start(); - - if (GCLocker::check_active_before_gc()) { + // Check for potential problems. + if (!should_attempt_scavenge()) { return false; } + IsSTWGCActiveMark mark; + + _gc_timer.register_gc_start(); + ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); GCCause::Cause gc_cause = heap->gc_cause(); - // Check for potential problems. - if (!should_attempt_scavenge()) { - return false; - } - + SvcGCMarker sgcm(SvcGCMarker::MINOR); GCIdMark gc_id_mark; _gc_tracer.report_gc_start(heap->gc_cause(), _gc_timer.gc_start()); @@ -425,7 +387,7 @@ bool PSScavenge::invoke_no_policy() { DerivedPointerTable::clear(); #endif - reference_processor()->start_discovery(false /* always_clear */); + reference_processor()->start_discovery(clear_soft_refs); const PreGenGCValues pre_gc_values = heap->get_pre_gc_values(); @@ -537,14 +499,13 @@ bool PSScavenge::invoke_no_policy() { size_t survivor_limit = size_policy->max_survivor_size(max_young_size); _tenuring_threshold = - size_policy->compute_survivor_space_size_and_threshold( - _survivor_overflow, - _tenuring_threshold, - survivor_limit); + size_policy->compute_survivor_space_size_and_threshold(_survivor_overflow, + _tenuring_threshold, + survivor_limit); - log_debug(gc, age)("Desired survivor size %zu bytes, new threshold %u (max threshold %u)", - size_policy->calculated_survivor_size_in_bytes(), - _tenuring_threshold, MaxTenuringThreshold); + log_debug(gc, age)("Desired survivor size %zu bytes, new threshold %u (max threshold %u)", + size_policy->calculated_survivor_size_in_bytes(), + _tenuring_threshold, MaxTenuringThreshold); if (UsePerfData) { PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters(); @@ -568,8 +529,8 @@ bool PSScavenge::invoke_no_policy() { size_t cur_eden = young_gen->eden_space()->capacity_in_bytes(); size_t max_old_gen_size = old_gen->max_gen_size(); size_t max_eden_size = max_young_size - - young_gen->from_space()->capacity_in_bytes() - - young_gen->to_space()->capacity_in_bytes(); + young_gen->from_space()->capacity_in_bytes() - + young_gen->to_space()->capacity_in_bytes(); // Used for diagnostics size_policy->clear_generation_free_space_flags(); @@ -599,7 +560,7 @@ bool PSScavenge::invoke_no_policy() { // a full collection. Don't resize the old gen here. heap->resize_young_gen(size_policy->calculated_eden_size_in_bytes(), - size_policy->calculated_survivor_size_in_bytes()); + size_policy->calculated_survivor_size_in_bytes()); log_debug(gc, ergo)("AdaptiveSizeStop: collection: %d ", heap->total_collections()); } @@ -657,20 +618,12 @@ void PSScavenge::clean_up_failed_promotion() { bool PSScavenge::should_attempt_scavenge() { ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); - PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters(); - - if (UsePerfData) { - counters->update_scavenge_skipped(not_skipped); - } PSYoungGen* young_gen = heap->young_gen(); PSOldGen* old_gen = heap->old_gen(); - // Do not attempt to promote unless to_space is empty if (!young_gen->to_space()->is_empty()) { - if (UsePerfData) { - counters->update_scavenge_skipped(to_space_not_empty); - } + // To-space is not empty; should run full-gc instead. return false; } @@ -687,15 +640,7 @@ bool PSScavenge::should_attempt_scavenge() { result ? "Do" : "Skip", (size_t) policy->average_promoted_in_bytes(), (size_t) policy->padded_average_promoted_in_bytes(), free_in_old_gen); - if (young_gen->used_in_bytes() < (size_t) policy->padded_average_promoted_in_bytes()) { - log_trace(ergo)(" padded_promoted_average is greater than maximum promotion = " SIZE_FORMAT, young_gen->used_in_bytes()); - } - if (!result) { - if (UsePerfData) { - counters->update_scavenge_skipped(promoted_too_large); - } - } return result; } diff --git a/src/hotspot/share/gc/parallel/psScavenge.hpp b/src/hotspot/share/gc/parallel/psScavenge.hpp index c99034e04b5f8..99d0487760b15 100644 --- a/src/hotspot/share/gc/parallel/psScavenge.hpp +++ b/src/hotspot/share/gc/parallel/psScavenge.hpp @@ -45,13 +45,6 @@ class PSScavenge: AllStatic { friend class PSKeepAliveClosure; friend class PSPromotionManager; - enum ScavengeSkippedCause { - not_skipped = 0, - to_space_not_empty, - promoted_too_large, - full_follows_scavenge - }; - protected: // Flags/counters static SpanSubjectToDiscoveryClosure _span_based_discoverer; @@ -105,10 +98,9 @@ class PSScavenge: AllStatic { // Called by parallelScavengeHeap to init the tenuring threshold static void initialize(); - // Scavenge entry point. This may invoke a full gc; return true if so. - static bool invoke(); - // Return true if a collection was done; false otherwise. - static bool invoke_no_policy(); + // Scavenge entry point. + // Return true iff a young-gc is completed without promotion-failure. + static bool invoke(bool clear_soft_refs); template <class T> static inline bool should_scavenge(T* p); diff --git a/src/hotspot/share/gc/parallel/psVMOperations.cpp b/src/hotspot/share/gc/parallel/psVMOperations.cpp index db4d9a3660624..f7e00449f5c90 100644 --- a/src/hotspot/share/gc/parallel/psVMOperations.cpp +++ b/src/hotspot/share/gc/parallel/psVMOperations.cpp @@ -31,19 +31,19 @@ #include "utilities/dtrace.hpp" // The following methods are used by the parallel scavenge collector -VM_ParallelGCFailedAllocation::VM_ParallelGCFailedAllocation(size_t word_size, - uint gc_count) : - VM_CollectForAllocation(word_size, gc_count, GCCause::_allocation_failure) { +VM_ParallelCollectForAllocation::VM_ParallelCollectForAllocation(size_t word_size, + bool is_tlab, + uint gc_count) : + VM_CollectForAllocation(word_size, gc_count, GCCause::_allocation_failure), + _is_tlab(is_tlab) { assert(word_size != 0, "An allocation should always be requested with this operation."); } -void VM_ParallelGCFailedAllocation::doit() { - SvcGCMarker sgcm(SvcGCMarker::MINOR); - +void VM_ParallelCollectForAllocation::doit() { ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); GCCauseSetter gccs(heap, _gc_cause); - _result = heap->failed_mem_allocate(_word_size); + _result = heap->satisfy_failed_allocation(_word_size, _is_tlab); if (_result == nullptr && GCLocker::is_active_and_needs_gc()) { set_gc_locked(); @@ -56,24 +56,14 @@ static bool is_cause_full(GCCause::Cause cause) { } // Only used for System.gc() calls -VM_ParallelGCSystemGC::VM_ParallelGCSystemGC(uint gc_count, +VM_ParallelGCCollect::VM_ParallelGCCollect(uint gc_count, uint full_gc_count, GCCause::Cause gc_cause) : - VM_GC_Operation(gc_count, gc_cause, full_gc_count, is_cause_full(gc_cause)), - _full_gc_succeeded(false) -{ -} - -void VM_ParallelGCSystemGC::doit() { - SvcGCMarker sgcm(SvcGCMarker::FULL); + VM_GC_Operation(gc_count, gc_cause, full_gc_count, is_cause_full(gc_cause)) {} +void VM_ParallelGCCollect::doit() { ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); GCCauseSetter gccs(heap, _gc_cause); - if (!_full) { - // If (and only if) the scavenge fails, this will invoke a full gc. - _full_gc_succeeded = heap->invoke_scavenge(); - } else { - _full_gc_succeeded = PSParallelCompact::invoke(false); - } + heap->try_collect_at_safepoint(_full); } diff --git a/src/hotspot/share/gc/parallel/psVMOperations.hpp b/src/hotspot/share/gc/parallel/psVMOperations.hpp index cc49eb631c791..e473ebc49ca42 100644 --- a/src/hotspot/share/gc/parallel/psVMOperations.hpp +++ b/src/hotspot/share/gc/parallel/psVMOperations.hpp @@ -29,23 +29,22 @@ #include "gc/shared/gcCause.hpp" #include "gc/shared/gcVMOperations.hpp" -class VM_ParallelGCFailedAllocation : public VM_CollectForAllocation { - public: - VM_ParallelGCFailedAllocation(size_t word_size, uint gc_count); +class VM_ParallelCollectForAllocation : public VM_CollectForAllocation { + bool _is_tlab; +public: + VM_ParallelCollectForAllocation(size_t word_size, bool is_tlab, uint gc_count); virtual VMOp_Type type() const { - return VMOp_ParallelGCFailedAllocation; + return VMOp_ParallelCollectForAllocation; } virtual void doit(); }; -class VM_ParallelGCSystemGC: public VM_GC_Operation { - bool _full_gc_succeeded; +class VM_ParallelGCCollect: public VM_GC_Operation { public: - VM_ParallelGCSystemGC(uint gc_count, uint full_gc_count, GCCause::Cause gc_cause); - virtual VMOp_Type type() const { return VMOp_ParallelGCSystemGC; } + VM_ParallelGCCollect(uint gc_count, uint full_gc_count, GCCause::Cause gc_cause); + virtual VMOp_Type type() const { return VMOp_ParallelGCCollect; } virtual void doit(); - bool full_gc_succeeded() const { return _full_gc_succeeded; } }; #endif // SHARE_GC_PARALLEL_PSVMOPERATIONS_HPP diff --git a/src/hotspot/share/gc/shared/gcVMOperations.hpp b/src/hotspot/share/gc/shared/gcVMOperations.hpp index aa007fec5a6aa..e9281198fdfa1 100644 --- a/src/hotspot/share/gc/shared/gcVMOperations.hpp +++ b/src/hotspot/share/gc/shared/gcVMOperations.hpp @@ -42,10 +42,10 @@ // VM_GC_HeapInspection // VM_PopulateDynamicDumpSharedSpace // VM_SerialGCCollect -// VM_ParallelGCSystemGC +// VM_ParallelGCCollect // VM_CollectForAllocation // VM_SerialCollectForAllocation -// VM_ParallelGCFailedAllocation +// VM_ParallelCollectForAllocation // VM_Verify // VM_PopulateDumpSharedSpace // @@ -64,13 +64,13 @@ // // VM_CollectForAllocation // VM_SerialCollectForAllocation -// VM_ParallelGCFailedAllocation +// VM_ParallelCollectForAllocation // - this operation is invoked when allocation is failed; // operation performs garbage collection and tries to // allocate afterwards; // // VM_SerialGCCollect -// VM_ParallelGCSystemGC +// VM_ParallelGCCollect // - these operations perform full collection of heaps of // different kind // diff --git a/src/hotspot/share/runtime/vmOperation.hpp b/src/hotspot/share/runtime/vmOperation.hpp index 47eff632a39cf..36aa6d3f28ac8 100644 --- a/src/hotspot/share/runtime/vmOperation.hpp +++ b/src/hotspot/share/runtime/vmOperation.hpp @@ -52,8 +52,8 @@ template(GC_HeapInspection) \ template(SerialCollectForAllocation) \ template(SerialGCCollect) \ - template(ParallelGCFailedAllocation) \ - template(ParallelGCSystemGC) \ + template(ParallelCollectForAllocation) \ + template(ParallelGCCollect) \ template(G1CollectForAllocation) \ template(G1CollectFull) \ template(G1PauseRemark) \ diff --git a/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/resources/aliasmap b/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/resources/aliasmap index 9166170e50d84..5993acf701f51 100644 --- a/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/resources/aliasmap +++ b/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/resources/aliasmap @@ -459,8 +459,6 @@ alias sun.gc.policy.edenSize // 1.5.0 b39 hotspot.gc.policy.eden_size // 1.5.0 b21 alias sun.gc.policy.freeSpace // 1.5.0 b39 hotspot.gc.policy.free_space // 1.5.0 b21 -alias sun.gc.policy.fullFollowsScavenge // 1.5.0 b39 - hotspot.gc.policy.full_follows_scavenge // 1.5.0 b21 alias sun.gc.policy.gcTimeLimitExceeded // 1.5.0 b39 hotspot.gc.policy.gc_time_limit_exceeded // 1.5.0 b21 alias sun.gc.policy.generations // 1.5.0 b39 @@ -508,8 +506,6 @@ alias sun.gc.policy.promoSize // 1.5.0 b39 hotspot.gc.policy.promo_size // 1.5.0 b21 alias sun.gc.policy.promoted // 1.5.0 b39 hotspot.gc.policy.promoted // 1.5.0 b21 -alias sun.gc.policy.scavengeSkipped // 1.5.0 b39 - hotspot.gc.policy.scavenge_skipped // 1.5.0 b21 alias sun.gc.policy.survived // 1.5.0 b39 hotspot.gc.policy.survived // 1.5.0 b21 alias sun.gc.policy.survivorOverflowed // 1.5.0 b39 diff --git a/test/jdk/jdk/jfr/event/runtime/TestVMOperation.java b/test/jdk/jdk/jfr/event/runtime/TestVMOperation.java index ae6f1f27191af..3b4551d5eecfc 100644 --- a/test/jdk/jdk/jfr/event/runtime/TestVMOperation.java +++ b/test/jdk/jdk/jfr/event/runtime/TestVMOperation.java @@ -43,7 +43,7 @@ public class TestVMOperation { private static final String EVENT_NAME = EventNames.ExecuteVMOperation; - private static final String VM_OPERATION = "ParallelGCSystemGC"; + private static final String VM_OPERATION = "ParallelGCCollect"; public static void main(String[] args) throws Throwable { Recording recording = new Recording(); From 4f312d6bc1fda6e3863ac623902a7decb0704ec3 Mon Sep 17 00:00:00 2001 From: Zhengyu Gu <zgu@openjdk.org> Date: Fri, 12 Jul 2024 12:59:22 +0000 Subject: [PATCH 387/471] 8336152: Remove unused forward declaration in classLoadInfo.hpp Reviewed-by: dholmes, shade --- src/hotspot/share/classfile/classLoadInfo.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/hotspot/share/classfile/classLoadInfo.hpp b/src/hotspot/share/classfile/classLoadInfo.hpp index b1257dc998793..ab665c6b3dad6 100644 --- a/src/hotspot/share/classfile/classLoadInfo.hpp +++ b/src/hotspot/share/classfile/classLoadInfo.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,8 +29,6 @@ class InstanceKlass; -template <typename T> class GrowableArray; - class ClassInstanceInfo : public StackObj { private: InstanceKlass* _dynamic_nest_host; From 84c74ad0a94f5c36529c63d846f15916259ee6a5 Mon Sep 17 00:00:00 2001 From: Shaojin Wen <shaojin.wensj@alibaba-inc.com> Date: Fri, 12 Jul 2024 14:36:34 +0000 Subject: [PATCH 388/471] 8335802: Improve startup speed HexFormat uses boolean instead of enum Reviewed-by: liach --- .../share/classes/java/util/HexFormat.java | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/src/java.base/share/classes/java/util/HexFormat.java b/src/java.base/share/classes/java/util/HexFormat.java index b8c3a06e7ee34..cd6cf8af17de3 100644 --- a/src/java.base/share/classes/java/util/HexFormat.java +++ b/src/java.base/share/classes/java/util/HexFormat.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Alibaba Group Holding Limited. 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 @@ -158,22 +159,17 @@ public final class HexFormat { * The hexadecimal characters are from lowercase alpha digits. */ private static final HexFormat HEX_FORMAT = - new HexFormat("", "", "", Case.LOWERCASE); + new HexFormat("", "", "", false); private static final HexFormat HEX_UPPER_FORMAT = - new HexFormat("", "", "", Case.UPPERCASE); + new HexFormat("", "", "", true); private static final byte[] EMPTY_BYTES = {}; private final String delimiter; private final String prefix; private final String suffix; - private final Case digitCase; - - private enum Case { - LOWERCASE, - UPPERCASE - } + private final boolean ucase; /** * Returns a HexFormat with a delimiter, prefix, suffix, and array of digits. @@ -181,14 +177,14 @@ private enum Case { * @param delimiter a delimiter, non-null * @param prefix a prefix, non-null * @param suffix a suffix, non-null - * @param digitCase enum indicating how to case digits + * @param ucase enum indicating how to case digits * @throws NullPointerException if any argument is null */ - private HexFormat(String delimiter, String prefix, String suffix, Case digitCase) { + private HexFormat(String delimiter, String prefix, String suffix, boolean ucase) { this.delimiter = Objects.requireNonNull(delimiter, "delimiter"); this.prefix = Objects.requireNonNull(prefix, "prefix"); this.suffix = Objects.requireNonNull(suffix, "suffix"); - this.digitCase = digitCase; + this.ucase = ucase; } /** @@ -217,7 +213,7 @@ public static HexFormat of() { * @return a {@link HexFormat} with the delimiter and lowercase characters */ public static HexFormat ofDelimiter(String delimiter) { - return new HexFormat(delimiter, "", "", Case.LOWERCASE); + return new HexFormat(delimiter, "", "", false); } /** @@ -226,7 +222,7 @@ public static HexFormat ofDelimiter(String delimiter) { * @return a copy of this {@code HexFormat} with the delimiter */ public HexFormat withDelimiter(String delimiter) { - return new HexFormat(delimiter, this.prefix, this.suffix, this.digitCase); + return new HexFormat(delimiter, this.prefix, this.suffix, this.ucase); } /** @@ -236,7 +232,7 @@ public HexFormat withDelimiter(String delimiter) { * @return a copy of this {@code HexFormat} with the prefix */ public HexFormat withPrefix(String prefix) { - return new HexFormat(this.delimiter, prefix, this.suffix, this.digitCase); + return new HexFormat(this.delimiter, prefix, this.suffix, this.ucase); } /** @@ -246,7 +242,7 @@ public HexFormat withPrefix(String prefix) { * @return a copy of this {@code HexFormat} with the suffix */ public HexFormat withSuffix(String suffix) { - return new HexFormat(this.delimiter, this.prefix, suffix, this.digitCase); + return new HexFormat(this.delimiter, this.prefix, suffix, this.ucase); } /** @@ -258,7 +254,7 @@ public HexFormat withSuffix(String suffix) { public HexFormat withUpperCase() { if (this == HEX_FORMAT) return HEX_UPPER_FORMAT; - return new HexFormat(this.delimiter, this.prefix, this.suffix, Case.UPPERCASE); + return new HexFormat(this.delimiter, this.prefix, this.suffix, true); } /** @@ -268,7 +264,7 @@ public HexFormat withUpperCase() { * @return a copy of this {@code HexFormat} with lowercase hexadecimal characters */ public HexFormat withLowerCase() { - return new HexFormat(this.delimiter, this.prefix, this.suffix, Case.LOWERCASE); + return new HexFormat(this.delimiter, this.prefix, this.suffix, false); } /** @@ -306,7 +302,7 @@ public String suffix() { * otherwise {@code false} */ public boolean isUpperCase() { - return digitCase == Case.UPPERCASE; + return ucase; } /** @@ -436,7 +432,6 @@ private String formatOptDelimiter(byte[] bytes, int fromIndex, int toIndex) { return null; } - boolean ucase = digitCase == Case.UPPERCASE; int length = toIndex - fromIndex; if (delimiter.isEmpty()) { // Allocate the byte array and fill in the hex pairs for each byte @@ -637,7 +632,7 @@ public char toLowHexDigit(int value) { if (value < 10) { return (char)('0' + value); } - if (digitCase == Case.LOWERCASE) { + if (!ucase) { return (char)('a' - 10 + value); } return (char)('A' - 10 + value); @@ -658,7 +653,7 @@ public char toHighHexDigit(int value) { if (value < 10) { return (char)('0' + value); } - if (digitCase == Case.LOWERCASE) { + if (!ucase) { return (char)('a' - 10 + value); } return (char)('A' - 10 + value); @@ -1067,7 +1062,7 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; HexFormat otherHex = (HexFormat) o; - return digitCase == otherHex.digitCase && + return ucase == otherHex.ucase && delimiter.equals(otherHex.delimiter) && prefix.equals(otherHex.prefix) && suffix.equals(otherHex.suffix); @@ -1081,7 +1076,7 @@ public boolean equals(Object o) { @Override public int hashCode() { int result = Objects.hash(delimiter, prefix, suffix); - result = 31 * result + Boolean.hashCode(digitCase == Case.UPPERCASE); + result = 31 * result + Boolean.hashCode(ucase); return result; } @@ -1093,7 +1088,7 @@ public int hashCode() { */ @Override public String toString() { - return escapeNL("uppercase: " + (digitCase == Case.UPPERCASE) + + return escapeNL("uppercase: " + ucase + ", delimiter: \"" + delimiter + "\", prefix: \"" + prefix + "\", suffix: \"" + suffix + "\""); From 1f6e106b45e5109224e13d70f1a40c9e666ec2ab Mon Sep 17 00:00:00 2001 From: Kevin Walls <kevinw@openjdk.org> Date: Fri, 12 Jul 2024 17:11:20 +0000 Subject: [PATCH 389/471] 8335684: Test ThreadCpuTime.java should pause like ThreadCpuTimeArray.java Reviewed-by: sspitsyn, cjplummer --- .../lang/management/ThreadMXBean/ThreadCpuTime.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/test/jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java b/test/jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java index 61fff63936382..f8cab540465a5 100644 --- a/test/jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java +++ b/test/jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -177,6 +177,8 @@ private static void waitUntilThreadBlocked() } } } + // Account for threads using CPU for a few millis after their WAITING state is visible: + goSleep(500); } static class MyThread extends Thread { @@ -228,15 +230,6 @@ public void run() { " CurrentThreadCpuTime = " + time1 + " > ThreadCpuTime = " + time2); } -/************* - * FIXME: Seems that on Solaris-sparc, - * It occasionally returns a different current thread user time > thread user time - if (utime1 > utime2) { - throw new RuntimeException("TEST FAILED: " + getName() + - " CurrentThreadUserTime = " + utime1 + - " > ThreadUserTime = " + utime2); - } -*/ } } From 4957145e6c823bfaa638a77457da5c031af978b9 Mon Sep 17 00:00:00 2001 From: Shaojin Wen <shaojin.wensj@alibaba-inc.com> Date: Fri, 12 Jul 2024 21:49:28 +0000 Subject: [PATCH 390/471] 8336278: Micro-optimize Replace String.format("%n") to System.lineSeparator Reviewed-by: dnsimon, shade --- .../share/classes/jdk/vm/ci/code/CodeUtil.java | 4 ++-- .../share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java | 4 ++-- .../share/classes/jdk/jfr/internal/tool/StructuredWriter.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/CodeUtil.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/CodeUtil.java index d04823d3e4c1e..59af250a69518 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/CodeUtil.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/CodeUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ */ public class CodeUtil { - public static final String NEW_LINE = String.format("%n"); + public static final String NEW_LINE = System.lineSeparator(); public static final int K = 1024; public static final int M = 1024 * 1024; diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java index 1096771919c79..bc76b7656fa2a 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -318,7 +318,7 @@ public boolean isProfileMature() { @Override public String toString() { StringBuilder sb = new StringBuilder(); - String nl = String.format("%n"); + String nl = System.lineSeparator(); String nlIndent = String.format("%n%38s", ""); sb.append("Raw method data for "); sb.append(method.format("%H.%n(%p)")); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/StructuredWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/StructuredWriter.java index 3892e8502181f..8e16e5fb0bf2c 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/StructuredWriter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/StructuredWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ abstract class StructuredWriter { private int column; // print first event immediately so tool feels responsive private boolean first = true; - private String lineSeparator = String.format("%n"); + private String lineSeparator = System.lineSeparator(); StructuredWriter(PrintWriter p) { out = p; From 8ba9bc6f1735be98dcc039244a28884b4d9620ae Mon Sep 17 00:00:00 2001 From: Sean Gwizdak <sgwizdak@amazon.com> Date: Fri, 12 Jul 2024 21:49:51 +0000 Subject: [PATCH 391/471] 8332249: Micro-optimize Method.hashCode Reviewed-by: liach --- .../share/classes/java/lang/reflect/Method.java | 10 +++++++++- .../bench/java/lang/reflect/MethodBenchmark.java | 13 +++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/lang/reflect/Method.java b/src/java.base/share/classes/java/lang/reflect/Method.java index b6ccbaa829452..80e0209249c8b 100644 --- a/src/java.base/share/classes/java/lang/reflect/Method.java +++ b/src/java.base/share/classes/java/lang/reflect/Method.java @@ -95,6 +95,8 @@ public final class Method extends Executable { // If this branching structure would ever contain cycles, deadlocks can // occur in annotation code. private Method root; + // Hash code of this object + private int hash; // Generics infrastructure private String getGenericSignature() {return signature;} @@ -381,7 +383,13 @@ public boolean equals(Object obj) { * method's declaring class name and the method's name. */ public int hashCode() { - return getDeclaringClass().getName().hashCode() ^ getName().hashCode(); + int hc = hash; + + if (hc == 0) { + hc = hash = getDeclaringClass().getName().hashCode() ^ getName() + .hashCode(); + } + return hc; } /** diff --git a/test/micro/org/openjdk/bench/java/lang/reflect/MethodBenchmark.java b/test/micro/org/openjdk/bench/java/lang/reflect/MethodBenchmark.java index 96a218d440594..4e682cf4e92f1 100644 --- a/test/micro/org/openjdk/bench/java/lang/reflect/MethodBenchmark.java +++ b/test/micro/org/openjdk/bench/java/lang/reflect/MethodBenchmark.java @@ -36,8 +36,9 @@ import org.openjdk.jmh.annotations.Warmup; /** - * Benchmark measuring the speed of Method/Method.getExceptionTypes() and - * getParameterTypes(), in cases where the result array is length zero. + * Benchmark measuring the speed of Method/Method.getExceptionTypes(), + * getParameterTypes() in cases where the result array is length zero, + * and hashCode(). */ @BenchmarkMode(Mode.AverageTime) @State(Scope.Benchmark) @@ -50,6 +51,7 @@ public class MethodBenchmark { Method emptyParametersMethod; Method oneExceptionMethod; Method oneParameterMethod; + Method hashCodeMethod; public MethodBenchmark() { try { @@ -58,6 +60,8 @@ public MethodBenchmark() { emptyExceptionsMethod = emptyParametersMethod; oneExceptionMethod = oneParameterMethod; + + hashCodeMethod = String.class.getDeclaredMethod("toString"); } catch (Exception e) { throw new RuntimeException(e); } @@ -82,4 +86,9 @@ public Object[] getParameterTypes() throws Exception { public Object[] getParameterTypesEmpty() throws Exception { return emptyParametersMethod.getParameterTypes(); } + + @Benchmark + public int getMethodHashCode() { + return hashCodeMethod.hashCode(); + } } From 5bc86f332986e3fffc1363f569029bb73a706064 Mon Sep 17 00:00:00 2001 From: Nizar Benalla <nbenalla@openjdk.org> Date: Fri, 12 Jul 2024 21:50:51 +0000 Subject: [PATCH 392/471] 8336259: Wrong link to stylesheet.css in JavaDoc API documentation Reviewed-by: jjg, liach --- .../share/classes/java/lang/doc-files/ValueBased.html | 3 +-- .../java/lang/doc-files/threadPrimitiveDeprecation.html | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/java/lang/doc-files/ValueBased.html b/src/java.base/share/classes/java/lang/doc-files/ValueBased.html index 86d9b35955726..6a935afe04b69 100644 --- a/src/java.base/share/classes/java/lang/doc-files/ValueBased.html +++ b/src/java.base/share/classes/java/lang/doc-files/ValueBased.html @@ -1,6 +1,6 @@ <!doctype html> <!-- - Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ <html lang="en"> <head> <title>Value-based Classes -

{@index "Value-based Classes"}

diff --git a/src/java.base/share/classes/java/lang/doc-files/threadPrimitiveDeprecation.html b/src/java.base/share/classes/java/lang/doc-files/threadPrimitiveDeprecation.html index 6172a859ba6bd..c680c0d2745a5 100644 --- a/src/java.base/share/classes/java/lang/doc-files/threadPrimitiveDeprecation.html +++ b/src/java.base/share/classes/java/lang/doc-files/threadPrimitiveDeprecation.html @@ -1,6 +1,6 @@