diff --git a/make/data/cacerts/identrustdstx3 b/make/data/cacerts/identrustdstx3 deleted file mode 100644 index 87a0d0c4f60..00000000000 --- a/make/data/cacerts/identrustdstx3 +++ /dev/null @@ -1,27 +0,0 @@ -Owner: CN=DST Root CA X3, O=Digital Signature Trust Co. -Issuer: CN=DST Root CA X3, O=Digital Signature Trust Co. -Serial number: 44afb080d6a327ba893039862ef8406b -Valid from: Sat Sep 30 21:12:19 GMT 2000 until: Thu Sep 30 14:01:15 GMT 2021 -Signature algorithm name: SHA1withRSA -Subject Public Key Algorithm: 2048-bit RSA key -Version: 3 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- diff --git a/make/devkit/createJMHBundle.sh b/make/devkit/createJMHBundle.sh index 9e0b9c06e4f..848e8e1e432 100644 --- a/make/devkit/createJMHBundle.sh +++ b/make/devkit/createJMHBundle.sh @@ -1,6 +1,6 @@ #!/bin/bash -e # -# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 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 @@ -26,7 +26,7 @@ # Create a bundle in the build directory, containing what's needed to # build and run JMH microbenchmarks from the OpenJDK build. -JMH_VERSION=1.28 +JMH_VERSION=1.32 COMMONS_MATH3_VERSION=3.2 JOPT_SIMPLE_VERSION=4.6 diff --git a/make/test/JtregNativeHotspot.gmk b/make/test/JtregNativeHotspot.gmk index 14322220062..99eb2e58820 100644 --- a/make/test/JtregNativeHotspot.gmk +++ b/make/test/JtregNativeHotspot.gmk @@ -864,7 +864,7 @@ ifeq ($(call isTargetOs, linux), true) BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exeFPRegs := -ldl BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libAsyncGetCallTraceTest := -ldl else - BUILD_HOTSPOT_JTREG_EXCLUDE += libtest-rw.c libtest-rwx.c libTestJNI.c \ + BUILD_HOTSPOT_JTREG_EXCLUDE += libtest-rw.c libtest-rwx.c \ exeinvoke.c exestack-gap.c exestack-tls.c libAsyncGetCallTraceTest.cpp endif @@ -872,7 +872,7 @@ BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exesigtest := -ljvm ifeq ($(call isTargetOs, windows), true) BUILD_HOTSPOT_JTREG_EXECUTABLES_CFLAGS_exeFPRegs := -MT - BUILD_HOTSPOT_JTREG_EXCLUDE += exesigtest.c libterminatedThread.c + BUILD_HOTSPOT_JTREG_EXCLUDE += exesigtest.c libterminatedThread.c libTestJNI.c BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libatExit := jvm.lib else BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libbootclssearch_agent += -lpthread diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 404b4612e01..b439490660c 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -7521,7 +7521,7 @@ instruct loadConP(iRegPNoSp dst, immP con) ins_cost(INSN_COST * 4); format %{ - "mov $dst, $con\t# ptr\n\t" + "mov $dst, $con\t# ptr" %} ins_encode(aarch64_enc_mov_p(dst, con)); @@ -15046,13 +15046,13 @@ instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, iRegL val, Universe d ins_pipe(pipe_class_memory); %} -instruct clearArray_imm_reg(immL cnt, iRegP_R10 base, Universe dummy, rFlagsReg cr) +instruct clearArray_imm_reg(immL cnt, iRegP_R10 base, iRegL_R11 temp, Universe dummy, rFlagsReg cr) %{ predicate((uint64_t)n->in(2)->get_long() < (uint64_t)(BlockZeroingLowLimit >> LogBytesPerWord) && !((ClearArrayNode*)n)->word_copy_only()); match(Set dummy (ClearArray cnt base)); - effect(USE_KILL base); + effect(TEMP temp, USE_KILL base, KILL cr); ins_cost(4 * INSN_COST); format %{ "ClearArray $cnt, $base" %} diff --git a/src/hotspot/cpu/aarch64/c1_LIRGenerator_aarch64.cpp b/src/hotspot/cpu/aarch64/c1_LIRGenerator_aarch64.cpp index 517d41bbfc6..a43aa08b065 100644 --- a/src/hotspot/cpu/aarch64/c1_LIRGenerator_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c1_LIRGenerator_aarch64.cpp @@ -1146,8 +1146,8 @@ void LIRGenerator::do_NewInstance(NewInstance* x) { LIR_Opr reg = result_register_for(x->type()); new_instance(reg, x->klass(), x->is_unresolved(), /* allow_inline */ false, - FrameMap::r2_oop_opr, - FrameMap::r5_oop_opr, + FrameMap::r10_oop_opr, + FrameMap::r11_oop_opr, FrameMap::r4_oop_opr, LIR_OprFact::illegalOpr, FrameMap::r3_metadata_opr, info); @@ -1162,8 +1162,8 @@ void LIRGenerator::do_NewInlineTypeInstance(NewInlineTypeInstance* x) { LIR_Opr reg = result_register_for(x->type()); new_instance(reg, x->klass(), false, /* allow_inline */ true, - FrameMap::r2_oop_opr, - FrameMap::r5_oop_opr, + FrameMap::r10_oop_opr, + FrameMap::r11_oop_opr, FrameMap::r4_oop_opr, LIR_OprFact::illegalOpr, FrameMap::r3_metadata_opr, info); @@ -1179,8 +1179,8 @@ void LIRGenerator::do_NewTypeArray(NewTypeArray* x) { length.load_item_force(FrameMap::r19_opr); LIR_Opr reg = result_register_for(x->type()); - LIR_Opr tmp1 = FrameMap::r2_oop_opr; - LIR_Opr tmp2 = FrameMap::r4_oop_opr; + LIR_Opr tmp1 = FrameMap::r10_oop_opr; + LIR_Opr tmp2 = FrameMap::r11_oop_opr; LIR_Opr tmp3 = FrameMap::r5_oop_opr; LIR_Opr tmp4 = reg; LIR_Opr klass_reg = FrameMap::r3_metadata_opr; @@ -1208,8 +1208,8 @@ void LIRGenerator::do_NewObjectArray(NewObjectArray* x) { CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr reg = result_register_for(x->type()); - LIR_Opr tmp1 = FrameMap::r2_oop_opr; - LIR_Opr tmp2 = FrameMap::r4_oop_opr; + LIR_Opr tmp1 = FrameMap::r10_oop_opr; + LIR_Opr tmp2 = FrameMap::r11_oop_opr; LIR_Opr tmp3 = FrameMap::r5_oop_opr; LIR_Opr tmp4 = reg; LIR_Opr klass_reg = FrameMap::r3_metadata_opr; diff --git a/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp index f0a24fa2ee0..63f734bf3a6 100644 --- a/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2014, Red Hat Inc. All rights reserved. + * Copyright (c) 2014, 2021, 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 @@ -194,20 +194,24 @@ void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register } // preserves obj, destroys len_in_bytes -void C1_MacroAssembler::initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1) { +// +// Scratch registers: t1 = r10, t2 = r11 +// +void C1_MacroAssembler::initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1, Register t2) { assert(hdr_size_in_bytes >= 0, "header size must be positive or 0"); + assert(t1 == r10 && t2 == r11, "must be"); + Label done; // len_in_bytes is positive and ptr sized subs(len_in_bytes, len_in_bytes, hdr_size_in_bytes); br(Assembler::EQ, done); - // Preserve obj - if (hdr_size_in_bytes) - add(obj, obj, hdr_size_in_bytes); - zero_memory(obj, len_in_bytes, t1); - if (hdr_size_in_bytes) - sub(obj, obj, hdr_size_in_bytes); + // zero_words() takes ptr in r10 and count in words in r11 + mov(rscratch1, len_in_bytes); + lea(t1, Address(obj, hdr_size_in_bytes)); + lsr(t2, rscratch1, LogBytesPerWord); + zero_words(t1, t2); bind(done); } @@ -222,6 +226,7 @@ void C1_MacroAssembler::allocate_object(Register obj, Register t1, Register t2, initialize_object(obj, klass, noreg, object_size * HeapWordSize, t1, t2, UseTLAB); } +// Scratch registers: t1 = r10, t2 = r11 void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, bool is_tlab_allocated) { assert((con_size_in_bytes & MinObjAlignmentInBytesMask) == 0, "con_size_in_bytes is not multiple of alignment"); @@ -232,45 +237,13 @@ void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register if (!(UseTLAB && ZeroTLAB && is_tlab_allocated)) { // clear rest of allocated space const Register index = t2; - const int threshold = 16 * BytesPerWord; // approximate break even point for code size (see comments below) if (var_size_in_bytes != noreg) { mov(index, var_size_in_bytes); - initialize_body(obj, index, hdr_size_in_bytes, t1); - } else if (con_size_in_bytes <= threshold) { - // use explicit null stores - int i = hdr_size_in_bytes; - if (i < con_size_in_bytes && (con_size_in_bytes % (2 * BytesPerWord))) { - str(zr, Address(obj, i)); - i += BytesPerWord; - } - for (; i < con_size_in_bytes; i += 2 * BytesPerWord) - stp(zr, zr, Address(obj, i)); + initialize_body(obj, index, hdr_size_in_bytes, t1, t2); } else if (con_size_in_bytes > hdr_size_in_bytes) { - block_comment("zero memory"); - // use loop to null out the fields - - int words = (con_size_in_bytes - hdr_size_in_bytes) / BytesPerWord; - mov(index, words / 8); - - const int unroll = 8; // Number of str(zr) instructions we'll unroll - int remainder = words % unroll; - lea(rscratch1, Address(obj, hdr_size_in_bytes + remainder * BytesPerWord)); - - Label entry_point, loop; - b(entry_point); - - bind(loop); - sub(index, index, 1); - for (int i = -unroll; i < 0; i++) { - if (-i == remainder) - bind(entry_point); - str(zr, Address(rscratch1, i * wordSize)); - } - if (remainder == 0) - bind(entry_point); - add(rscratch1, rscratch1, unroll * wordSize); - cbnz(index, loop); - + con_size_in_bytes -= hdr_size_in_bytes; + lea(t1, Address(obj, hdr_size_in_bytes)); + zero_words(t1, con_size_in_bytes / BytesPerWord); } } @@ -306,8 +279,7 @@ void C1_MacroAssembler::allocate_array(Register obj, Register len, Register t1, initialize_header(obj, klass, len, t1, t2); // clear rest of allocated space - const Register len_zero = len; - initialize_body(obj, arr_size, header_size * BytesPerWord, len_zero); + initialize_body(obj, arr_size, header_size * BytesPerWord, t1, t2); membar(StoreStore); diff --git a/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.hpp index 95c2e1a914b..6c133bab616 100644 --- a/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.hpp @@ -1,6 +1,6 @@ /* * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved. + * Copyright (c) 2014, 2021, 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 @@ -48,7 +48,7 @@ using MacroAssembler::null_check; ); void initialize_header(Register obj, Register klass, Register len, Register t1, Register t2); - void initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1); + void initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1, Register t2); void float_cmp(bool is_float, int unordered_result, FloatRegister f0, FloatRegister f1, diff --git a/src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp b/src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp index 63f5b2e05db..12b87d815da 100644 --- a/src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2014, Red Hat Inc. All rights reserved. + * Copyright (c) 2014, 2021, 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 @@ -659,9 +659,9 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { if ((id == fast_new_instance_id || id == fast_new_instance_init_check_id) && !UseTLAB && Universe::heap()->supports_inline_contig_alloc()) { Label slow_path; - Register obj_size = r2; - Register t1 = r19; - Register t2 = r4; + Register obj_size = r19; + Register t1 = r10; + Register t2 = r11; assert_different_registers(klass, obj, obj_size, t1, t2); __ stp(r19, zr, Address(__ pre(sp, -2 * wordSize))); @@ -796,9 +796,9 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { // allocations. // Otherwise, just go to the slow path. if (!UseTLAB && Universe::heap()->supports_inline_contig_alloc()) { - Register arr_size = r4; - Register t1 = r2; - Register t2 = r5; + Register arr_size = r5; + Register t1 = r10; + Register t2 = r11; Label slow_path; assert_different_registers(length, klass, obj, arr_size, t1, t2); @@ -828,7 +828,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { __ andr(t1, t1, Klass::_lh_header_size_mask); __ sub(arr_size, arr_size, t1); // body length __ add(t1, t1, obj); // body start - __ initialize_body(t1, arr_size, 0, t2); + __ initialize_body(t1, arr_size, 0, t1, t2); __ membar(Assembler::StoreStore); __ verify_oop(obj); diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp index eebac9b85d6..d0f7e79b8b2 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp @@ -4423,68 +4423,6 @@ void MacroAssembler::eden_allocate(Register obj, bs->eden_allocate(this, obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case); } -// Zero words; len is in bytes -// Destroys all registers except addr -// len must be a nonzero multiple of wordSize -void MacroAssembler::zero_memory(Register addr, Register len, Register t1) { - assert_different_registers(addr, len, t1, rscratch1, rscratch2); - -#ifdef ASSERT - { Label L; - tst(len, BytesPerWord - 1); - br(Assembler::EQ, L); - stop("len is not a multiple of BytesPerWord"); - bind(L); - } -#endif - -#ifndef PRODUCT - block_comment("zero memory"); -#endif - - Label loop; - Label entry; - -// Algorithm: -// -// scratch1 = cnt & 7; -// cnt -= scratch1; -// p += scratch1; -// switch (scratch1) { -// do { -// cnt -= 8; -// p[-8] = 0; -// case 7: -// p[-7] = 0; -// case 6: -// p[-6] = 0; -// // ... -// case 1: -// p[-1] = 0; -// case 0: -// p += 8; -// } while (cnt); -// } - - const int unroll = 8; // Number of str(zr) instructions we'll unroll - - lsr(len, len, LogBytesPerWord); - andr(rscratch1, len, unroll - 1); // tmp1 = cnt % unroll - sub(len, len, rscratch1); // cnt -= unroll - // t1 always points to the end of the region we're about to zero - add(t1, addr, rscratch1, Assembler::LSL, LogBytesPerWord); - adr(rscratch2, entry); - sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2); - br(rscratch2); - bind(loop); - sub(len, len, unroll); - for (int i = -unroll; i < 0; i++) - Assembler::str(zr, Address(t1, i * wordSize)); - bind(entry); - add(t1, t1, unroll * wordSize); - cbnz(len, loop); -} - void MacroAssembler::verify_tlab() { #ifdef ASSERT if (UseTLAB && VerifyOops) { @@ -5063,10 +5001,11 @@ void MacroAssembler::string_equals(Register a1, Register a2, // handle anything smaller than this ourselves in zero_words(). const int MacroAssembler::zero_words_block_size = 8; -// zero_words() is used by C2 ClearArray patterns. It is as small as -// possible, handling small word counts locally and delegating -// anything larger to the zero_blocks stub. It is expanded many times -// in compiled code, so it is important to keep it short. +// zero_words() is used by C2 ClearArray patterns and by +// C1_MacroAssembler. It is as small as possible, handling small word +// counts locally and delegating anything larger to the zero_blocks +// stub. It is expanded many times in compiled code, so it is +// important to keep it short. // ptr: Address of a buffer to be zeroed. // cnt: Count in HeapWords. @@ -5075,32 +5014,46 @@ const int MacroAssembler::zero_words_block_size = 8; address MacroAssembler::zero_words(Register ptr, Register cnt) { assert(is_power_of_2(zero_words_block_size), "adjust this"); - assert(ptr == r10 && cnt == r11, "mismatch in register usage"); BLOCK_COMMENT("zero_words {"); - cmp(cnt, (u1)zero_words_block_size); + assert(ptr == r10 && cnt == r11, "mismatch in register usage"); + RuntimeAddress zero_blocks = RuntimeAddress(StubRoutines::aarch64::zero_blocks()); + assert(zero_blocks.target() != NULL, "zero_blocks stub has not been generated"); + + subs(rscratch1, cnt, zero_words_block_size); Label around; br(LO, around); { RuntimeAddress zero_blocks = RuntimeAddress(StubRoutines::aarch64::zero_blocks()); assert(zero_blocks.target() != NULL, "zero_blocks stub has not been generated"); - if (StubRoutines::aarch64::complete()) { + // Make sure this is a C2 compilation. C1 allocates space only for + // trampoline stubs generated by Call LIR ops, and in any case it + // makes sense for a C1 compilation task to proceed as quickly as + // possible. + CompileTask* task; + if (StubRoutines::aarch64::complete() + && Thread::current()->is_Compiler_thread() + && (task = ciEnv::current()->task()) + && is_c2_compile(task->comp_level())) { address tpc = trampoline_call(zero_blocks); if (tpc == NULL) { DEBUG_ONLY(reset_labels(around)); - postcond(pc() == badAddress); + assert(false, "failed to allocate space for trampoline"); return NULL; } } else { - bl(zero_blocks); + far_call(zero_blocks); } } bind(around); + + // We have a few words left to do. zero_blocks has adjusted r10 and r11 + // for us. for (int i = zero_words_block_size >> 1; i > 1; i >>= 1) { Label l; tbz(cnt, exact_log2(i), l); for (int j = 0; j < i; j += 2) { - stp(zr, zr, post(ptr, 16)); + stp(zr, zr, post(ptr, 2 * BytesPerWord)); } bind(l); } @@ -5110,46 +5063,56 @@ address MacroAssembler::zero_words(Register ptr, Register cnt) str(zr, Address(ptr)); bind(l); } + BLOCK_COMMENT("} zero_words"); - postcond(pc() != badAddress); return pc(); } // base: Address of a buffer to be zeroed, 8 bytes aligned. // cnt: Immediate count in HeapWords. -#define SmallArraySize (18 * BytesPerLong) +// +// r10, r11, rscratch1, and rscratch2 are clobbered. void MacroAssembler::zero_words(Register base, uint64_t cnt) { - BLOCK_COMMENT("zero_words {"); - int i = cnt & 1; // store any odd word to start - if (i) str(zr, Address(base)); - - if (cnt <= SmallArraySize / BytesPerLong) { + guarantee(zero_words_block_size < BlockZeroingLowLimit, + "increase BlockZeroingLowLimit"); + if (cnt <= (uint64_t)BlockZeroingLowLimit / BytesPerWord) { +#ifndef PRODUCT + { + char buf[64]; + snprintf(buf, sizeof buf, "zero_words (count = %" PRIu64 ") {", cnt); + BLOCK_COMMENT(buf); + } +#endif + if (cnt >= 16) { + uint64_t loops = cnt/16; + if (loops > 1) { + mov(rscratch2, loops - 1); + } + { + Label loop; + bind(loop); + for (int i = 0; i < 16; i += 2) { + stp(zr, zr, Address(base, i * BytesPerWord)); + } + add(base, base, 16 * BytesPerWord); + if (loops > 1) { + subs(rscratch2, rscratch2, 1); + br(GE, loop); + } + } + } + cnt %= 16; + int i = cnt & 1; // store any odd word to start + if (i) str(zr, Address(base)); for (; i < (int)cnt; i += 2) { stp(zr, zr, Address(base, i * wordSize)); } + BLOCK_COMMENT("} zero_words"); } else { - const int unroll = 4; // Number of stp(zr, zr) instructions we'll unroll - int remainder = cnt % (2 * unroll); - for (; i < remainder; i += 2) { - stp(zr, zr, Address(base, i * wordSize)); - } - Label loop; - Register cnt_reg = rscratch1; - Register loop_base = rscratch2; - cnt = cnt - remainder; - mov(cnt_reg, cnt); - // adjust base and prebias by -2 * wordSize so we can pre-increment - add(loop_base, base, (remainder - 2) * wordSize); - bind(loop); - sub(cnt_reg, cnt_reg, 2 * unroll); - for (i = 1; i < unroll; i++) { - stp(zr, zr, Address(loop_base, 2 * i * wordSize)); - } - stp(zr, zr, Address(pre(loop_base, 2 * unroll * wordSize))); - cbnz(cnt_reg, loop); + mov(r10, base); mov(r11, cnt); + zero_words(r10, r11); } - BLOCK_COMMENT("} zero_words"); } // Zero blocks of memory by using DC ZVA. diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp index 3759fcbbf3a..85723c6e8f6 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp @@ -946,7 +946,6 @@ class MacroAssembler: public Assembler { Register t2, // temp register Label& slow_case // continuation point if fast allocation fails ); - void zero_memory(Register addr, Register len, Register t1); void verify_tlab(); // For field "index" within "klass", return inline_klass ... diff --git a/src/hotspot/cpu/x86/matcher_x86.hpp b/src/hotspot/cpu/x86/matcher_x86.hpp index f0c7aff73f9..9071740aab3 100644 --- a/src/hotspot/cpu/x86/matcher_x86.hpp +++ b/src/hotspot/cpu/x86/matcher_x86.hpp @@ -178,11 +178,7 @@ // Some microarchitectures have mask registers used on vectors static const bool has_predicated_vectors(void) { - bool ret_value = false; - if (UseAVX > 2) { - ret_value = VM_Version::supports_avx512vl(); - } - return ret_value; + return VM_Version::supports_evex(); } // true means we have fast l2f convers diff --git a/src/hotspot/cpu/x86/vm_version_ext_x86.cpp b/src/hotspot/cpu/x86/vm_version_ext_x86.cpp index a84b37f7977..84e8c9fa819 100644 --- a/src/hotspot/cpu/x86/vm_version_ext_x86.cpp +++ b/src/hotspot/cpu/x86/vm_version_ext_x86.cpp @@ -948,7 +948,7 @@ const char* const VM_Version_Ext::_feature_ecx_id[] = { const char* const VM_Version_Ext::_feature_extended_ecx_id[] = { "LAHF/SAHF instruction support", - "Core multi-processor leagacy mode", + "Core multi-processor legacy mode", "", "", "", diff --git a/src/hotspot/cpu/x86/vm_version_ext_x86.hpp b/src/hotspot/cpu/x86/vm_version_ext_x86.hpp index 2d318dd390e..c81ebead23c 100644 --- a/src/hotspot/cpu/x86/vm_version_ext_x86.hpp +++ b/src/hotspot/cpu/x86/vm_version_ext_x86.hpp @@ -27,6 +27,7 @@ #include "runtime/vm_version.hpp" #include "utilities/macros.hpp" +#include "utilities/sizes.hpp" class VM_Version_Ext : public VM_Version { diff --git a/src/hotspot/cpu/x86/vm_version_x86.cpp b/src/hotspot/cpu/x86/vm_version_x86.cpp index 0c65ca80c0b..c92c58fadfa 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.cpp +++ b/src/hotspot/cpu/x86/vm_version_x86.cpp @@ -30,6 +30,7 @@ #include "logging/log.hpp" #include "logging/logStream.hpp" #include "memory/resourceArea.hpp" +#include "memory/universe.hpp" #include "runtime/globals_extension.hpp" #include "runtime/java.hpp" #include "runtime/os.hpp" @@ -65,6 +66,22 @@ extern "C" { static get_cpu_info_stub_t get_cpu_info_stub = NULL; static detect_virt_stub_t detect_virt_stub = NULL; +#ifdef _LP64 + +bool VM_Version::supports_clflush() { + // clflush should always be available on x86_64 + // if not we are in real trouble because we rely on it + // to flush the code cache. + // Unfortunately, Assembler::clflush is currently called as part + // of generation of the code cache flush routine. This happens + // under Universe::init before the processor features are set + // up. Assembler::flush calls this routine to check that clflush + // is allowed. So, we give the caller a free pass if Universe init + // is still in progress. + assert ((!Universe::is_fully_initialized() || (_features & CPU_FLUSH) != 0), "clflush should be available"); + return true; +} +#endif class VM_Version_StubGenerator: public StubCodeGenerator { public: @@ -1789,6 +1806,10 @@ bool VM_Version::compute_has_intel_jcc_erratum() { // 06_9EH | D | 9th Generation Intel® Core™ Processor Family based on microarchitecturecode name Coffee Lake H (8+2) // 06_9EH | D | 9th Generation Intel® Core™ Processor Family based on microarchitecture code name Coffee Lake S (8+2) return _stepping == 0x9 || _stepping == 0xA || _stepping == 0xB || _stepping == 0xD; + case 0xA5: + // Not in Intel documentation. + // 06_A5H | | 10th Generation Intel® Core™ Processor Family based on microarchitecture code name Comet Lake S/H + return true; case 0xA6: // 06_A6H | 0 | 10th Generation Intel® Core™ Processor Family based on microarchitecture code name Comet Lake U62 return _stepping == 0x0; diff --git a/src/hotspot/cpu/x86/vm_version_x86.hpp b/src/hotspot/cpu/x86/vm_version_x86.hpp index e6e94ca9a99..ec82ecd81c7 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.hpp +++ b/src/hotspot/cpu/x86/vm_version_x86.hpp @@ -25,9 +25,9 @@ #ifndef CPU_X86_VM_VERSION_X86_HPP #define CPU_X86_VM_VERSION_X86_HPP -#include "memory/universe.hpp" #include "runtime/abstract_vm_version.hpp" #include "utilities/macros.hpp" +#include "utilities/sizes.hpp" class VM_Version : public Abstract_VM_Version { friend class VMStructs; @@ -261,7 +261,9 @@ class VM_Version : public Abstract_VM_Version { uint32_t : 2, avx512_4vnniw : 1, avx512_4fmaps : 1, - : 28; + : 10, + serialize : 1, + : 17; } bits; }; @@ -359,7 +361,8 @@ class VM_Version : public Abstract_VM_Version { \ decl(AVX512_VBMI2, "avx512_vbmi2", 44) /* VBMI2 shift left double instructions */ \ decl(AVX512_VBMI, "avx512_vbmi", 45) /* Vector BMI instructions */ \ - decl(HV, "hv", 46) /* Hypervisor instructions */ + decl(HV, "hv", 46) /* Hypervisor instructions */ \ + decl(SERIALIZE, "serialize", 47) /* CPU SERIALIZE */ #define DECLARE_CPU_FEATURE_FLAG(id, name, bit) CPU_##id = (1ULL << bit), CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_FLAG) @@ -646,6 +649,8 @@ enum Extended_Family { if (_cpuid_info.sef_cpuid7_ebx.bits.clwb != 0) { result |= CPU_CLWB; } + if (_cpuid_info.sef_cpuid7_edx.bits.serialize != 0) + result |= CPU_SERIALIZE; } // ZX features. @@ -896,6 +901,7 @@ enum Extended_Family { static bool supports_avx512_vbmi() { return (_features & CPU_AVX512_VBMI) != 0; } static bool supports_avx512_vbmi2() { return (_features & CPU_AVX512_VBMI2) != 0; } static bool supports_hv() { return (_features & CPU_HV) != 0; } + static bool supports_serialize() { return (_features & CPU_SERIALIZE) != 0; } // Intel features static bool is_intel_family_core() { return is_intel() && @@ -1027,19 +1033,8 @@ enum Extended_Family { // and trailing StoreStore fences. #ifdef _LP64 - static bool supports_clflush() { - // clflush should always be available on x86_64 - // if not we are in real trouble because we rely on it - // to flush the code cache. - // Unfortunately, Assembler::clflush is currently called as part - // of generation of the code cache flush routine. This happens - // under Universe::init before the processor features are set - // up. Assembler::flush calls this routine to check that clflush - // is allowed. So, we give the caller a free pass if Universe init - // is still in progress. - assert ((!Universe::is_fully_initialized() || (_features & CPU_FLUSH) != 0), "clflush should be available"); - return true; - } + + static bool supports_clflush(); // Can't inline due to header file conflict #else static bool supports_clflush() { return ((_features & CPU_FLUSH) != 0); } #endif // _LP64 diff --git a/src/hotspot/cpu/x86/x86_32.ad b/src/hotspot/cpu/x86/x86_32.ad index 96c0e869576..98e5639d542 100644 --- a/src/hotspot/cpu/x86/x86_32.ad +++ b/src/hotspot/cpu/x86/x86_32.ad @@ -11540,7 +11540,7 @@ instruct rep_stos(eCXRegI cnt, eDIRegP base, regD tmp, eAXRegI zero, Universe du %} // Small ClearArray AVX512 non-constant length. -instruct rep_stos_evex(eCXRegI cnt, eDIRegP base, regD tmp, kReg ktmp, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ +instruct rep_stos_evex(eCXRegI cnt, eDIRegP base, legRegD tmp, kReg ktmp, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ predicate(!((ClearArrayNode*)n)->is_large() && (UseAVX > 2)); match(Set dummy (ClearArray cnt base)); ins_cost(125); @@ -11651,7 +11651,7 @@ instruct rep_stos_large(eCXRegI cnt, eDIRegP base, regD tmp, eAXRegI zero, Unive %} // Large ClearArray AVX512. -instruct rep_stos_large_evex(eCXRegI cnt, eDIRegP base, regD tmp, kReg ktmp, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ +instruct rep_stos_large_evex(eCXRegI cnt, eDIRegP base, legRegD tmp, kReg ktmp, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ predicate((UseAVX > 2) && ((ClearArrayNode*)n)->is_large()); match(Set dummy (ClearArray cnt base)); effect(USE_KILL cnt, USE_KILL base, TEMP tmp, TEMP ktmp, KILL zero, KILL cr); @@ -11717,7 +11717,7 @@ instruct rep_stos_im(immI cnt, kReg ktmp, eRegP base, regD tmp, rRegI zero, Univ instruct string_compareL(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, eAXRegI result, regD tmp1, eFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11732,7 +11732,7 @@ instruct string_compareL(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, instruct string_compareL_evex(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, eAXRegI result, regD tmp1, kReg ktmp, eFlagsReg cr) %{ - predicate(UseAVX > 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11747,7 +11747,7 @@ instruct string_compareL_evex(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI instruct string_compareU(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, eAXRegI result, regD tmp1, eFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11762,7 +11762,7 @@ instruct string_compareU(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, instruct string_compareU_evex(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, eAXRegI result, regD tmp1, kReg ktmp, eFlagsReg cr) %{ - predicate(UseAVX > 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11777,7 +11777,7 @@ instruct string_compareU_evex(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI instruct string_compareLU(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, eAXRegI result, regD tmp1, eFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11792,7 +11792,7 @@ instruct string_compareLU(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2 instruct string_compareLU_evex(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, eAXRegI result, regD tmp1, kReg ktmp, eFlagsReg cr) %{ - predicate(UseAVX > 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11807,7 +11807,7 @@ instruct string_compareLU_evex(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI instruct string_compareUL(eSIRegP str1, eDXRegI cnt1, eDIRegP str2, eCXRegI cnt2, eAXRegI result, regD tmp1, eFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11822,7 +11822,7 @@ instruct string_compareUL(eSIRegP str1, eDXRegI cnt1, eDIRegP str2, eCXRegI cnt2 instruct string_compareUL_evex(eSIRegP str1, eDXRegI cnt1, eDIRegP str2, eCXRegI cnt2, eAXRegI result, regD tmp1, kReg ktmp, eFlagsReg cr) %{ - predicate(UseAVX > 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11838,7 +11838,7 @@ instruct string_compareUL_evex(eSIRegP str1, eDXRegI cnt1, eDIRegP str2, eCXRegI // fast string equals instruct string_equals(eDIRegP str1, eSIRegP str2, eCXRegI cnt, eAXRegI result, regD tmp1, regD tmp2, eBXRegI tmp3, eFlagsReg cr) %{ - predicate(UseAVX <= 2); + predicate(!VM_Version::supports_avx512vlbw()); match(Set result (StrEquals (Binary str1 str2) cnt)); effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr); @@ -11854,7 +11854,7 @@ instruct string_equals(eDIRegP str1, eSIRegP str2, eCXRegI cnt, eAXRegI result, instruct string_equals_evex(eDIRegP str1, eSIRegP str2, eCXRegI cnt, eAXRegI result, regD tmp1, regD tmp2, kReg ktmp, eBXRegI tmp3, eFlagsReg cr) %{ - predicate(UseAVX > 2); + predicate(VM_Version::supports_avx512vlbw()); match(Set result (StrEquals (Binary str1 str2) cnt)); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr); @@ -12032,7 +12032,7 @@ instruct stringL_indexof_char(eDIRegP str1, eDXRegI cnt1, eAXRegI ch, instruct array_equalsB(eDIRegP ary1, eSIRegP ary2, eAXRegI result, regD tmp1, regD tmp2, eCXRegI tmp3, eBXRegI tmp4, eFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); + predicate(!VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (AryEq ary1 ary2)); effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); //ins_cost(300); @@ -12049,7 +12049,7 @@ instruct array_equalsB(eDIRegP ary1, eSIRegP ary2, eAXRegI result, instruct array_equalsB_evex(eDIRegP ary1, eSIRegP ary2, eAXRegI result, regD tmp1, regD tmp2, kReg ktmp, eCXRegI tmp3, eBXRegI tmp4, eFlagsReg cr) %{ - predicate(UseAVX > 2 && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); + predicate(VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (AryEq ary1 ary2)); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); //ins_cost(300); @@ -12066,7 +12066,7 @@ instruct array_equalsB_evex(eDIRegP ary1, eSIRegP ary2, eAXRegI result, instruct array_equalsC(eDIRegP ary1, eSIRegP ary2, eAXRegI result, regD tmp1, regD tmp2, eCXRegI tmp3, eBXRegI tmp4, eFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); + predicate(!VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (AryEq ary1 ary2)); effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); //ins_cost(300); @@ -12083,7 +12083,7 @@ instruct array_equalsC(eDIRegP ary1, eSIRegP ary2, eAXRegI result, instruct array_equalsC_evex(eDIRegP ary1, eSIRegP ary2, eAXRegI result, regD tmp1, regD tmp2, kReg ktmp, eCXRegI tmp3, eBXRegI tmp4, eFlagsReg cr) %{ - predicate(UseAVX > 2 && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); + predicate(VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (AryEq ary1 ary2)); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); //ins_cost(300); @@ -12100,7 +12100,7 @@ instruct array_equalsC_evex(eDIRegP ary1, eSIRegP ary2, eAXRegI result, instruct has_negatives(eSIRegP ary1, eCXRegI len, eAXRegI result, regD tmp1, regD tmp2, eBXRegI tmp3, eFlagsReg cr) %{ - predicate(UseAVX <= 2); + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); match(Set result (HasNegatives ary1 len)); effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr); @@ -12116,7 +12116,7 @@ instruct has_negatives(eSIRegP ary1, eCXRegI len, eAXRegI result, instruct has_negatives_evex(eSIRegP ary1, eCXRegI len, eAXRegI result, regD tmp1, regD tmp2, kReg ktmp1, kReg ktmp2, eBXRegI tmp3, eFlagsReg cr) %{ - predicate(UseAVX > 2); + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); match(Set result (HasNegatives ary1 len)); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp1, TEMP ktmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr); @@ -12133,7 +12133,7 @@ instruct has_negatives_evex(eSIRegP ary1, eCXRegI len, eAXRegI result, // fast char[] to byte[] compression instruct string_compress(eSIRegP src, eDIRegP dst, eDXRegI len, regD tmp1, regD tmp2, regD tmp3, regD tmp4, eCXRegI tmp5, eAXRegI result, eFlagsReg cr) %{ - predicate(UseAVX <= 2); + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); match(Set result (StrCompressedCopy src (Binary dst len))); effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr); @@ -12149,7 +12149,7 @@ instruct string_compress(eSIRegP src, eDIRegP dst, eDXRegI len, regD tmp1, regD instruct string_compress_evex(eSIRegP src, eDIRegP dst, eDXRegI len, regD tmp1, regD tmp2, regD tmp3, regD tmp4, kReg ktmp1, kReg ktmp2, eCXRegI tmp5, eAXRegI result, eFlagsReg cr) %{ - predicate(UseAVX > 2); + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); match(Set result (StrCompressedCopy src (Binary dst len))); effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP ktmp1, TEMP ktmp2, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr); @@ -12166,7 +12166,7 @@ instruct string_compress_evex(eSIRegP src, eDIRegP dst, eDXRegI len, regD tmp1, // fast byte[] to char[] inflation instruct string_inflate(Universe dummy, eSIRegP src, eDIRegP dst, eDXRegI len, regD tmp1, eCXRegI tmp2, eFlagsReg cr) %{ - predicate(UseAVX <= 2); + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); match(Set dummy (StrInflatedCopy src (Binary dst len))); effect(TEMP tmp1, TEMP tmp2, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr); @@ -12180,7 +12180,7 @@ instruct string_inflate(Universe dummy, eSIRegP src, eDIRegP dst, eDXRegI len, instruct string_inflate_evex(Universe dummy, eSIRegP src, eDIRegP dst, eDXRegI len, regD tmp1, kReg ktmp, eCXRegI tmp2, eFlagsReg cr) %{ - predicate(UseAVX > 2); + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); match(Set dummy (StrInflatedCopy src (Binary dst len))); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr); diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad index 3422e836261..fe061901898 100644 --- a/src/hotspot/cpu/x86/x86_64.ad +++ b/src/hotspot/cpu/x86/x86_64.ad @@ -11187,7 +11187,7 @@ instruct rep_stos_word_copy(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegL val, %} // Small ClearArray AVX512 non-constant length. -instruct rep_stos_evex(rcx_RegL cnt, rdi_RegP base, regD tmp, kReg ktmp, rax_RegL val, +instruct rep_stos_evex(rcx_RegL cnt, rdi_RegP base, legRegD tmp, kReg ktmp, rax_RegL val, Universe dummy, rFlagsReg cr) %{ predicate(!((ClearArrayNode*)n)->is_large() && !((ClearArrayNode*)n)->word_copy_only() && (UseAVX > 2)); @@ -11247,7 +11247,7 @@ instruct rep_stos_evex(rcx_RegL cnt, rdi_RegP base, regD tmp, kReg ktmp, rax_Reg ins_pipe(pipe_slow); %} -instruct rep_stos_evex_word_copy(rcx_RegL cnt, rdi_RegP base, regD tmp, kReg ktmp, rax_RegL val, +instruct rep_stos_evex_word_copy(rcx_RegL cnt, rdi_RegP base, legRegD tmp, kReg ktmp, rax_RegL val, Universe dummy, rFlagsReg cr) %{ predicate(!((ClearArrayNode*)n)->is_large() && ((ClearArrayNode*)n)->word_copy_only() && (UseAVX > 2)); @@ -11404,7 +11404,7 @@ instruct rep_stos_large_word_copy(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_Reg %} // Large ClearArray AVX512. -instruct rep_stos_large_evex(rcx_RegL cnt, rdi_RegP base, regD tmp, kReg ktmp, rax_RegL val, +instruct rep_stos_large_evex(rcx_RegL cnt, rdi_RegP base, legRegD tmp, kReg ktmp, rax_RegL val, Universe dummy, rFlagsReg cr) %{ predicate(((ClearArrayNode*)n)->is_large() && !((ClearArrayNode*)n)->word_copy_only() && (UseAVX > 2)); @@ -11454,7 +11454,7 @@ instruct rep_stos_large_evex(rcx_RegL cnt, rdi_RegP base, regD tmp, kReg ktmp, r ins_pipe(pipe_slow); %} -instruct rep_stos_large_evex_word_copy(rcx_RegL cnt, rdi_RegP base, regD tmp, kReg ktmp, rax_RegL val, +instruct rep_stos_large_evex_word_copy(rcx_RegL cnt, rdi_RegP base, legRegD tmp, kReg ktmp, rax_RegL val, Universe dummy, rFlagsReg cr) %{ predicate(((ClearArrayNode*)n)->is_large() && ((ClearArrayNode*)n)->word_copy_only() && (UseAVX > 2)); @@ -11522,7 +11522,7 @@ instruct rep_stos_im(immL cnt, rRegP base, regD tmp, rax_RegL val, kReg ktmp, Un instruct string_compareL(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, rax_RegI result, legRegD tmp1, rFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11538,7 +11538,7 @@ instruct string_compareL(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI c instruct string_compareL_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) %{ - predicate(UseAVX > 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11554,7 +11554,7 @@ instruct string_compareL_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_R instruct string_compareU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, rax_RegI result, legRegD tmp1, rFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11570,7 +11570,7 @@ instruct string_compareU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI c instruct string_compareU_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) %{ - predicate(UseAVX > 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11586,7 +11586,7 @@ instruct string_compareU_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_R instruct string_compareLU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, rax_RegI result, legRegD tmp1, rFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11602,7 +11602,7 @@ instruct string_compareLU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI instruct string_compareLU_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) %{ - predicate(UseAVX > 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11618,7 +11618,7 @@ instruct string_compareLU_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_ instruct string_compareUL(rsi_RegP str1, rdx_RegI cnt1, rdi_RegP str2, rcx_RegI cnt2, rax_RegI result, legRegD tmp1, rFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11634,7 +11634,7 @@ instruct string_compareUL(rsi_RegP str1, rdx_RegI cnt1, rdi_RegP str2, rcx_RegI instruct string_compareUL_evex(rsi_RegP str1, rdx_RegI cnt1, rdi_RegP str2, rcx_RegI cnt2, rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) %{ - predicate(UseAVX > 2 && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); @@ -11817,7 +11817,7 @@ instruct stringL_indexof_char(rdi_RegP str1, rdx_RegI cnt1, rax_RegI ch, instruct string_equals(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI result, legRegD tmp1, legRegD tmp2, rbx_RegI tmp3, rFlagsReg cr) %{ - predicate(UseAVX <= 2); + predicate(!VM_Version::supports_avx512vlbw()); match(Set result (StrEquals (Binary str1 str2) cnt)); effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr); @@ -11833,7 +11833,7 @@ instruct string_equals(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI resu instruct string_equals_evex(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI result, legRegD tmp1, legRegD tmp2, kReg ktmp, rbx_RegI tmp3, rFlagsReg cr) %{ - predicate(UseAVX > 2); + predicate(VM_Version::supports_avx512vlbw()); match(Set result (StrEquals (Binary str1 str2) cnt)); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr); @@ -11850,7 +11850,7 @@ instruct string_equals_evex(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI instruct array_equalsB(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, legRegD tmp1, legRegD tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); + predicate(!VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (AryEq ary1 ary2)); effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); @@ -11866,7 +11866,7 @@ instruct array_equalsB(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, instruct array_equalsB_evex(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, legRegD tmp1, legRegD tmp2, kReg ktmp, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) %{ - predicate(UseAVX > 2 && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); + predicate(VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (AryEq ary1 ary2)); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); @@ -11882,7 +11882,7 @@ instruct array_equalsB_evex(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, instruct array_equalsC(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, legRegD tmp1, legRegD tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) %{ - predicate(UseAVX <= 2 && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); + predicate(!VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (AryEq ary1 ary2)); effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); @@ -11898,7 +11898,7 @@ instruct array_equalsC(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, instruct array_equalsC_evex(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, legRegD tmp1, legRegD tmp2, kReg ktmp, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) %{ - predicate(UseAVX > 2 && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); + predicate(VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (AryEq ary1 ary2)); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); @@ -11914,7 +11914,7 @@ instruct array_equalsC_evex(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, instruct has_negatives(rsi_RegP ary1, rcx_RegI len, rax_RegI result, legRegD tmp1, legRegD tmp2, rbx_RegI tmp3, rFlagsReg cr,) %{ - predicate(UseAVX <= 2); + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); match(Set result (HasNegatives ary1 len)); effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr); @@ -11930,7 +11930,7 @@ instruct has_negatives(rsi_RegP ary1, rcx_RegI len, rax_RegI result, instruct has_negatives_evex(rsi_RegP ary1, rcx_RegI len, rax_RegI result, legRegD tmp1, legRegD tmp2, kReg ktmp1, kReg ktmp2, rbx_RegI tmp3, rFlagsReg cr,) %{ - predicate(UseAVX > 2); + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); match(Set result (HasNegatives ary1 len)); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp1, TEMP ktmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr); @@ -11946,7 +11946,7 @@ instruct has_negatives_evex(rsi_RegP ary1, rcx_RegI len, rax_RegI result, // fast char[] to byte[] compression instruct string_compress(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, legRegD tmp2, legRegD tmp3, legRegD tmp4, rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ - predicate(UseAVX <= 2); + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); match(Set result (StrCompressedCopy src (Binary dst len))); effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr); @@ -11963,7 +11963,7 @@ instruct string_compress(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, instruct string_compress_evex(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, legRegD tmp2, legRegD tmp3, legRegD tmp4, kReg ktmp1, kReg ktmp2, rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ - predicate(UseAVX > 2); + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); match(Set result (StrCompressedCopy src (Binary dst len))); effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP ktmp1, TEMP ktmp2, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr); @@ -11980,7 +11980,7 @@ instruct string_compress_evex(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD // fast byte[] to char[] inflation instruct string_inflate(Universe dummy, rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, rcx_RegI tmp2, rFlagsReg cr) %{ - predicate(UseAVX <= 2); + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); match(Set dummy (StrInflatedCopy src (Binary dst len))); effect(TEMP tmp1, TEMP tmp2, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr); @@ -11994,7 +11994,7 @@ instruct string_inflate(Universe dummy, rsi_RegP src, rdi_RegP dst, rdx_RegI len instruct string_inflate_evex(Universe dummy, rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, kReg ktmp, rcx_RegI tmp2, rFlagsReg cr) %{ - predicate(UseAVX > 2); + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); match(Set dummy (StrInflatedCopy src (Binary dst len))); effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr); diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp index d486aee1d8f..79fcdd886a2 100644 --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -788,7 +788,7 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, // JDK-8187028: It was observed that on some configurations (4K backed thread stacks) // the real thread stack size may be smaller than the requested stack size, by as much as 64K. // This very much looks like a pthread lib error. As a workaround, increase the stack size - // by 64K for small thread stacks (arbitrarily choosen to be < 4MB) + // by 64K for small thread stacks (arbitrarily chosen to be < 4MB) if (stack_size < 4096 * K) { stack_size += 64 * K; } diff --git a/src/hotspot/os/bsd/semaphore_bsd.cpp b/src/hotspot/os/bsd/semaphore_bsd.cpp index 012b5b8ed91..742790fa896 100644 --- a/src/hotspot/os/bsd/semaphore_bsd.cpp +++ b/src/hotspot/os/bsd/semaphore_bsd.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -30,7 +30,7 @@ #include #ifdef __APPLE__ -// OS X doesn't support unamed POSIX semaphores, so the implementation in os_posix.cpp can't be used. +// OS X doesn't support unnamed POSIX semaphores, so the implementation in os_posix.cpp can't be used. static const char* sem_init_strerror(kern_return_t value) { switch (value) { diff --git a/src/hotspot/os/bsd/semaphore_bsd.hpp b/src/hotspot/os/bsd/semaphore_bsd.hpp index 3a74cacbbf3..66549e5dafc 100644 --- a/src/hotspot/os/bsd/semaphore_bsd.hpp +++ b/src/hotspot/os/bsd/semaphore_bsd.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -32,7 +32,7 @@ # include "semaphore_posix.hpp" #else -// OS X doesn't support unamed POSIX semaphores, so the implementation in os_posix.cpp can't be used. +// OS X doesn't support unnamed POSIX semaphores, so the implementation in os_posix.cpp can't be used. # include "memory/allocation.hpp" # include diff --git a/src/hotspot/os/posix/semaphore_posix.cpp b/src/hotspot/os/posix/semaphore_posix.cpp index b5f7855b64e..7f61e6d469e 100644 --- a/src/hotspot/os/posix/semaphore_posix.cpp +++ b/src/hotspot/os/posix/semaphore_posix.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,7 +25,7 @@ #include "precompiled.hpp" #ifndef __APPLE__ #include "runtime/os.hpp" -// POSIX unamed semaphores are not supported on OS X. +// POSIX unnamed semaphores are not supported on OS X. #include "semaphore_posix.hpp" #include diff --git a/src/hotspot/os_cpu/bsd_x86/orderAccess_bsd_x86.hpp b/src/hotspot/os_cpu/bsd_x86/orderAccess_bsd_x86.hpp index 691f278bc95..90e2574abf2 100644 --- a/src/hotspot/os_cpu/bsd_x86/orderAccess_bsd_x86.hpp +++ b/src/hotspot/os_cpu/bsd_x86/orderAccess_bsd_x86.hpp @@ -60,8 +60,12 @@ inline void OrderAccess::fence() { } inline void OrderAccess::cross_modify_fence_impl() { - int idx = 0; - __asm__ volatile ("cpuid " : "+a" (idx) : : "ebx", "ecx", "edx", "memory"); + if (VM_Version::supports_serialize()) { + __asm__ volatile (".byte 0x0f, 0x01, 0xe8\n\t" : : :); //serialize + } else { + int idx = 0; + __asm__ volatile ("cpuid " : "+a" (idx) : : "ebx", "ecx", "edx", "memory"); + } } #endif // OS_CPU_BSD_X86_ORDERACCESS_BSD_X86_HPP diff --git a/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp b/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp index 076cc5e8f3b..a22f547c071 100644 --- a/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp +++ b/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp @@ -56,14 +56,18 @@ inline void OrderAccess::fence() { } inline void OrderAccess::cross_modify_fence_impl() { - int idx = 0; + if (VM_Version::supports_serialize()) { + __asm__ volatile (".byte 0x0f, 0x01, 0xe8\n\t" : : :); //serialize + } else { + int idx = 0; #ifdef AMD64 - __asm__ volatile ("cpuid " : "+a" (idx) : : "ebx", "ecx", "edx", "memory"); + __asm__ volatile ("cpuid " : "+a" (idx) : : "ebx", "ecx", "edx", "memory"); #else - // On some x86 systems EBX is a reserved register that cannot be - // clobbered, so we must protect it around the CPUID. - __asm__ volatile ("xchg %%esi, %%ebx; cpuid; xchg %%esi, %%ebx " : "+a" (idx) : : "esi", "ecx", "edx", "memory"); + // On some x86 systems EBX is a reserved register that cannot be + // clobbered, so we must protect it around the CPUID. + __asm__ volatile ("xchg %%esi, %%ebx; cpuid; xchg %%esi, %%ebx " : "+a" (idx) : : "esi", "ecx", "edx", "memory"); #endif + } } #endif // OS_CPU_LINUX_X86_ORDERACCESS_LINUX_X86_HPP diff --git a/src/hotspot/os_cpu/windows_x86/orderAccess_windows_x86.hpp b/src/hotspot/os_cpu/windows_x86/orderAccess_windows_x86.hpp index f7d990a64c4..43764b14a01 100644 --- a/src/hotspot/os_cpu/windows_x86/orderAccess_windows_x86.hpp +++ b/src/hotspot/os_cpu/windows_x86/orderAccess_windows_x86.hpp @@ -58,9 +58,22 @@ inline void OrderAccess::fence() { compiler_barrier(); } -inline void OrderAccess::cross_modify_fence_impl() { +inline void OrderAccess::cross_modify_fence_impl() +#if _MSC_VER >= 1928 +{ +//_serialize() intrinsic is supported starting from VS2019-16.7.2 + if (VM_Version::supports_serialize()) { + _serialize(); + } else { + int regs[4]; + __cpuid(regs, 0); + } +} +#else +{ int regs[4]; __cpuid(regs, 0); } +#endif #endif // OS_CPU_WINDOWS_X86_ORDERACCESS_WINDOWS_X86_HPP diff --git a/src/hotspot/share/c1/c1_Compilation.cpp b/src/hotspot/share/c1/c1_Compilation.cpp index b2a1bb4c168..ca8869c47f3 100644 --- a/src/hotspot/share/c1/c1_Compilation.cpp +++ b/src/hotspot/share/c1/c1_Compilation.cpp @@ -603,6 +603,9 @@ Compilation::Compilation(AbstractCompiler* compiler, ciEnv* env, ciMethod* metho } Compilation::~Compilation() { + // simulate crash during compilation + assert(CICrashAt < 0 || (uintx)_env->compile_id() != (uintx)CICrashAt, "just as planned"); + _env->set_compiler_data(NULL); } diff --git a/src/hotspot/share/cds/dumpTimeClassInfo.hpp b/src/hotspot/share/cds/dumpTimeClassInfo.hpp index 7b47ab91c01..722849954fa 100644 --- a/src/hotspot/share/cds/dumpTimeClassInfo.hpp +++ b/src/hotspot/share/cds/dumpTimeClassInfo.hpp @@ -171,10 +171,10 @@ inline unsigned DumpTimeSharedClassTable_hash(InstanceKlass* const& k) { class DumpTimeSharedClassTable: public ResourceHashtable< InstanceKlass*, DumpTimeClassInfo, - &DumpTimeSharedClassTable_hash, - primitive_equals, 15889, // prime number - ResourceObj::C_HEAP> + ResourceObj::C_HEAP, + mtClassShared, + &DumpTimeSharedClassTable_hash> { int _builtin_count; int _unregistered_count; diff --git a/src/hotspot/share/cds/heapShared.cpp b/src/hotspot/share/cds/heapShared.cpp index 909abe449dd..4f9d6210a27 100644 --- a/src/hotspot/share/cds/heapShared.cpp +++ b/src/hotspot/share/cds/heapShared.cpp @@ -143,10 +143,11 @@ void HeapShared::fixup_mapped_regions() { } unsigned HeapShared::oop_hash(oop const& p) { - assert(!EnableValhalla || !p->mark().is_inline_type(), - "this object should never have been locked"); - unsigned hash = (unsigned)p->identity_hash(); - return hash; + // We are at a safepoint, so the object won't move. It's OK to use its + // address as the hashcode. + // We can't use p->identity_hash() as it's not available for primitive oops. + assert_at_safepoint(); + return (unsigned)(p2i(p) >> LogBytesPerWord); } static void reset_states(oop obj, TRAPS) { @@ -280,12 +281,14 @@ oop HeapShared::archive_object(oop obj) { // in the shared heap. This also has the side effect of pre-initializing the // identity_hash for all shared objects, so they are less likely to be written // into during run time, increasing the potential of memory sharing. - int hash_original = obj->identity_hash(); - archived_oop->set_mark(archived_oop->klass()->prototype_header().copy_set_hash(hash_original)); - assert(archived_oop->mark().is_unlocked(), "sanity"); + if (!(EnableValhalla && obj->mark().is_inline_type())) { + int hash_original = obj->identity_hash(); + archived_oop->set_mark(archived_oop->klass()->prototype_header().copy_set_hash(hash_original)); + assert(archived_oop->mark().is_unlocked(), "sanity"); - DEBUG_ONLY(int hash_archived = archived_oop->identity_hash()); - assert(hash_original == hash_archived, "Different hash codes: original %x, archived %x", hash_original, hash_archived); + DEBUG_ONLY(int hash_archived = archived_oop->identity_hash()); + assert(hash_original == hash_archived, "Different hash codes: original %x, archived %x", hash_original, hash_archived); + } ArchivedObjectCache* cache = archived_object_cache(); cache->put(obj, archived_oop); diff --git a/src/hotspot/share/cds/heapShared.hpp b/src/hotspot/share/cds/heapShared.hpp index 873784ab784..ce7ce96ca54 100644 --- a/src/hotspot/share/cds/heapShared.hpp +++ b/src/hotspot/share/cds/heapShared.hpp @@ -148,9 +148,6 @@ class HeapShared: AllStatic { static DumpedInternedStrings *_dumped_interned_strings; public: - static bool oop_equals(oop const& p1, oop const& p2) { - return p1 == p2; - } static unsigned oop_hash(oop const& p); static unsigned string_oop_hash(oop const& string) { return java_lang_String::hash_code(string); @@ -158,16 +155,12 @@ class HeapShared: AllStatic { private: typedef ResourceHashtable ArchivedObjectCache; + ResourceObj::C_HEAP, + mtClassShared, + HeapShared::oop_hash> ArchivedObjectCache; static ArchivedObjectCache* _archived_object_cache; - static bool klass_equals(Klass* const& p1, Klass* const& p2) { - return primitive_equals(p1, p2); - } - static unsigned klass_hash(Klass* const& klass) { // Generate deterministic hashcode even if SharedBaseAddress is changed due to ASLR. return primitive_hash
(address(klass) - SharedBaseAddress); @@ -175,10 +168,10 @@ class HeapShared: AllStatic { class DumpTimeKlassSubGraphInfoTable : public ResourceHashtable { + ResourceObj::C_HEAP, + mtClassShared, + HeapShared::klass_hash> { public: int _count; }; @@ -230,10 +223,10 @@ class HeapShared: AllStatic { static int _narrow_oop_shift; typedef ResourceHashtable SeenObjectsTable; + ResourceObj::C_HEAP, + mtClassShared, + HeapShared::oop_hash> SeenObjectsTable; static SeenObjectsTable *_seen_objects_table; @@ -400,10 +393,10 @@ class HeapShared: AllStatic { #if INCLUDE_CDS_JAVA_HEAP class DumpedInternedStrings : public ResourceHashtable + ResourceObj::C_HEAP, + mtClassShared, + HeapShared::string_oop_hash> {}; #endif diff --git a/src/hotspot/share/cds/lambdaProxyClassDictionary.hpp b/src/hotspot/share/cds/lambdaProxyClassDictionary.hpp index e7153aa450e..55c49923f82 100644 --- a/src/hotspot/share/cds/lambdaProxyClassDictionary.hpp +++ b/src/hotspot/share/cds/lambdaProxyClassDictionary.hpp @@ -156,10 +156,11 @@ class RunTimeLambdaProxyClassInfo { class DumpTimeLambdaProxyClassDictionary : public ResourceHashtable { + ResourceObj::C_HEAP, + mtClassShared, + LambdaProxyClassKey::DUMPTIME_HASH, + LambdaProxyClassKey::DUMPTIME_EQUALS> { public: DumpTimeLambdaProxyClassDictionary() : _count(0) {} int _count; diff --git a/src/hotspot/share/ci/ciTypeFlow.cpp b/src/hotspot/share/ci/ciTypeFlow.cpp index 06a9bd3eb0b..c5fe1ba0fc1 100644 --- a/src/hotspot/share/ci/ciTypeFlow.cpp +++ b/src/hotspot/share/ci/ciTypeFlow.cpp @@ -637,11 +637,14 @@ void ciTypeFlow::StateVector::do_checkcast(ciBytecodeStream* str) { } } else { ciType* type = pop_value(); - if (type->unwrap() != klass && klass->is_loaded() && type->unwrap()->is_subtype_of(klass)) { + null_free |= type->is_null_free(); + type = type->unwrap(); + if (type->is_loaded() && klass->is_loaded() && + type != klass && type->is_subtype_of(klass)) { // Useless cast, propagate more precise type of object - klass = type->unwrap()->as_klass(); + klass = type->as_klass(); } - if (klass->is_inlinetype() && (null_free || type->is_null_free())) { + if (klass->is_inlinetype() && null_free) { push(outer()->mark_as_null_free(klass)); } else { push_object(klass); diff --git a/src/hotspot/share/classfile/bytecodeAssembler.hpp b/src/hotspot/share/classfile/bytecodeAssembler.hpp index 7bb80df05c4..d3d7602fe85 100644 --- a/src/hotspot/share/classfile/bytecodeAssembler.hpp +++ b/src/hotspot/share/classfile/bytecodeAssembler.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -125,6 +125,7 @@ class BytecodeCPEntry { class BytecodeConstantPool : ResourceObj { private: typedef ResourceHashtable IndexHash; ConstantPool* _orig; diff --git a/src/hotspot/share/classfile/classFileParser.cpp b/src/hotspot/share/classfile/classFileParser.cpp index 54dc3256eaa..a2a2361f86c 100644 --- a/src/hotspot/share/classfile/classFileParser.cpp +++ b/src/hotspot/share/classfile/classFileParser.cpp @@ -2224,6 +2224,7 @@ void ClassFileParser::copy_localvariable_table(const ConstMethod* cm, ResourceMark rm(THREAD); typedef ResourceHashtable LVT_HashTable; LVT_HashTable* const table = new LVT_HashTable(); diff --git a/src/hotspot/share/classfile/classLoaderStats.hpp b/src/hotspot/share/classfile/classLoaderStats.hpp index ce3f2331730..412351391bd 100644 --- a/src/hotspot/share/classfile/classLoaderStats.hpp +++ b/src/hotspot/share/classfile/classLoaderStats.hpp @@ -97,10 +97,6 @@ class ClassLoaderStats : public ResourceObj { class ClassLoaderStatsClosure : public CLDClosure { protected: - static bool oop_equals(oop const& s1, oop const& s2) { - return s1 == s2; - } - static unsigned oop_hash(oop const& s1) { // Robert Jenkins 1996 & Thomas Wang 1997 // http://web.archive.org/web/20071223173210/http://www.concentric.net/~Ttwang/tech/inthash.htm @@ -116,7 +112,8 @@ class ClassLoaderStatsClosure : public CLDClosure { } typedef ResourceHashtable StatsTable; + 256, ResourceObj::RESOURCE_AREA, mtInternal, + ClassLoaderStatsClosure::oop_hash> StatsTable; outputStream* _out; StatsTable* _stats; diff --git a/src/hotspot/share/classfile/moduleEntry.cpp b/src/hotspot/share/classfile/moduleEntry.cpp index a409d1096b3..429ea70a11f 100644 --- a/src/hotspot/share/classfile/moduleEntry.cpp +++ b/src/hotspot/share/classfile/moduleEntry.cpp @@ -372,8 +372,6 @@ void ModuleEntry::set_loader_data(ClassLoaderData* cld) { typedef ResourceHashtable< const ModuleEntry*, ModuleEntry*, - primitive_hash, - primitive_equals, 557, // prime number ResourceObj::C_HEAP> ArchivedModuleEntries; static ArchivedModuleEntries* _archive_modules_entries = NULL; diff --git a/src/hotspot/share/classfile/modules.cpp b/src/hotspot/share/classfile/modules.cpp index d1b98adb37a..7125a7ae7f0 100644 --- a/src/hotspot/share/classfile/modules.cpp +++ b/src/hotspot/share/classfile/modules.cpp @@ -698,7 +698,7 @@ jobject Modules::get_module(jclass clazz, TRAPS) { ls.print("get_module(): module "); java_lang_String::print(module_name, tty); } else { - ls.print("get_module(): Unamed Module"); + ls.print("get_module(): Unnamed Module"); } if (klass != NULL) { ls.print_cr(" for class %s", klass->external_name()); diff --git a/src/hotspot/share/classfile/packageEntry.cpp b/src/hotspot/share/classfile/packageEntry.cpp index c6e6e55bfeb..a24683c85d6 100644 --- a/src/hotspot/share/classfile/packageEntry.cpp +++ b/src/hotspot/share/classfile/packageEntry.cpp @@ -197,8 +197,6 @@ PackageEntryTable::~PackageEntryTable() { typedef ResourceHashtable< const PackageEntry*, PackageEntry*, - primitive_hash, - primitive_equals, 557, // prime number ResourceObj::C_HEAP> ArchivedPackageEntries; static ArchivedPackageEntries* _archived_packages_entries = NULL; diff --git a/src/hotspot/share/classfile/systemDictionaryShared.cpp b/src/hotspot/share/classfile/systemDictionaryShared.cpp index 38d14136be8..083fcf53d88 100644 --- a/src/hotspot/share/classfile/systemDictionaryShared.cpp +++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp @@ -424,8 +424,6 @@ InstanceKlass* SystemDictionaryShared::find_or_load_shared_class( class UnregisteredClassesTable : public ResourceHashtable< Symbol*, InstanceKlass*, - primitive_hash, - primitive_equals, 15889, // prime number ResourceObj::C_HEAP> {}; diff --git a/src/hotspot/share/classfile/verifier.hpp b/src/hotspot/share/classfile/verifier.hpp index fcbf697d1b6..a3ebe3ce16d 100644 --- a/src/hotspot/share/classfile/verifier.hpp +++ b/src/hotspot/share/classfile/verifier.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -275,8 +275,7 @@ class sig_as_verification_types : public ResourceObj { // This hashtable is indexed by the Utf8 constant pool indexes pointed to // by constant pool (Interface)Method_refs' NameAndType signature entries. -typedef ResourceHashtable, primitive_equals, 1007> +typedef ResourceHashtable method_signatures_table_type; // A new instance of this class is created for each class being verified diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index eda34ab0cf9..2d3625984fc 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -2251,8 +2251,10 @@ void nmethod::check_all_dependencies(DepChange& changes) { // Turn off dependency tracing while actually testing dependencies. NOT_PRODUCT( FlagSetting fs(TraceDependencies, false) ); - typedef ResourceHashtable DepTable; + typedef ResourceHashtable DepTable; DepTable* table = new DepTable(); diff --git a/src/hotspot/share/compiler/compileBroker.cpp b/src/hotspot/share/compiler/compileBroker.cpp index cf9c6d4b8a8..390457beeee 100644 --- a/src/hotspot/share/compiler/compileBroker.cpp +++ b/src/hotspot/share/compiler/compileBroker.cpp @@ -2126,8 +2126,6 @@ void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, bool fatal("Never compilable: %s", failure_reason); } } - // simulate crash during compilation - assert(task->compile_id() != CICrashAt, "just as planned"); } static void post_compilation_event(EventCompilation& event, CompileTask* task) { diff --git a/src/hotspot/share/compiler/disassembler.cpp b/src/hotspot/share/compiler/disassembler.cpp index 3914c777813..3fc6e408455 100644 --- a/src/hotspot/share/compiler/disassembler.cpp +++ b/src/hotspot/share/compiler/disassembler.cpp @@ -166,12 +166,6 @@ class decode_env { }; Link *head, *tail; - static unsigned hash(const address& a) { - return primitive_hash
(a); - } - static bool equals(const address& a0, const address& a1) { - return primitive_equals
(a0, a1); - } void append(const char* file, int line) { if (tail != NULL && tail->file == file && tail->line == line) { // Don't print duplicated lines at the same address. This could happen with C @@ -193,8 +187,6 @@ class decode_env { typedef ResourceHashtable< address, SourceFileInfo, - SourceFileInfo::hash, - SourceFileInfo::equals, 15889, // prime number ResourceObj::C_HEAP> SourceFileInfoTable; diff --git a/src/hotspot/share/gc/g1/g1BlockOffsetTable.cpp b/src/hotspot/share/gc/g1/g1BlockOffsetTable.cpp index 12d566ddaeb..e09bd750b5d 100644 --- a/src/hotspot/share/gc/g1/g1BlockOffsetTable.cpp +++ b/src/hotspot/share/gc/g1/g1BlockOffsetTable.cpp @@ -75,7 +75,6 @@ void G1BlockOffsetTable::check_index(size_t index, const char* msg) const { G1BlockOffsetTablePart::G1BlockOffsetTablePart(G1BlockOffsetTable* array, HeapRegion* hr) : _next_offset_threshold(NULL), - _next_offset_index(0), DEBUG_ONLY(_object_can_span(false) COMMA) _bot(array), _hr(hr) @@ -246,7 +245,7 @@ HeapWord* G1BlockOffsetTablePart::forward_to_block_containing_addr_slow(HeapWord } assert(q <= next_boundary && n > next_boundary, "Consequence of loop"); // [q, n) is the block that crosses the boundary. - alloc_block_work(&next_boundary, &next_index, q, n); + alloc_block_work(&next_boundary, q, n); } return forward_to_block_containing_addr_const(q, n, addr); } @@ -261,11 +260,11 @@ HeapWord* G1BlockOffsetTablePart::forward_to_block_containing_addr_slow(HeapWord // ( ^ ] // block-start // -void G1BlockOffsetTablePart::alloc_block_work(HeapWord** threshold_, size_t* index_, - HeapWord* blk_start, HeapWord* blk_end) { +void G1BlockOffsetTablePart::alloc_block_work(HeapWord** threshold_, HeapWord* blk_start, + HeapWord* blk_end) { // For efficiency, do copy-in/copy-out. HeapWord* threshold = *threshold_; - size_t index = *index_; + size_t index = _bot->index_for_raw(threshold); assert(blk_start != NULL && blk_end > blk_start, "phantom block"); @@ -283,8 +282,8 @@ void G1BlockOffsetTablePart::alloc_block_work(HeapWord** threshold_, size_t* ind DEBUG_ONLY(size_t orig_index = index;) // Mark the card that holds the offset into the block. Note - // that _next_offset_index and _next_offset_threshold are not - // updated until the end of this method. + // that _next_offset_threshold is not updated until the end + // of this method. _bot->set_offset_array(index, threshold, blk_start); // We need to now mark the subsequent cards that this blk spans. @@ -307,9 +306,7 @@ void G1BlockOffsetTablePart::alloc_block_work(HeapWord** threshold_, size_t* ind threshold = _bot->address_for_index(end_index) + BOTConstants::N_words; assert(threshold >= blk_end, "Incorrect offset threshold"); - // index_ and threshold_ updated here. *threshold_ = threshold; - *index_ = index; #ifdef ASSERT // The offset can be 0 if the block starts on a boundary. That @@ -341,7 +338,8 @@ void G1BlockOffsetTablePart::verify() const { assert(_hr->bottom() < _hr->top(), "Only non-empty regions should be verified."); size_t start_card = _bot->index_for(_hr->bottom()); // Do not verify beyond the BOT allocation threshold. - size_t end_card = MIN2(_bot->index_for(_hr->top() - 1), _next_offset_index - 1); + size_t next_offset_index = _bot->index_for_raw(_next_offset_threshold); + size_t end_card = MIN2(_bot->index_for(_hr->top() - 1), next_offset_index - 1); for (size_t current_card = start_card; current_card < end_card; current_card++) { u_char entry = _bot->offset_array(current_card); @@ -398,15 +396,13 @@ void G1BlockOffsetTablePart::print_on(outputStream* out) { (uint) _bot->offset_array(i)); } out->print_cr(" next offset threshold: " PTR_FORMAT, p2i(_next_offset_threshold)); - out->print_cr(" next offset index: " SIZE_FORMAT, _next_offset_index); } #endif // !PRODUCT HeapWord* G1BlockOffsetTablePart::initialize_threshold_raw() { - _next_offset_index = _bot->index_for_raw(_hr->bottom()); - _next_offset_index++; + size_t next_offset_index = _bot->index_for_raw(_hr->bottom()) + 1; _next_offset_threshold = - _bot->address_for_index_raw(_next_offset_index); + _bot->address_for_index_raw(next_offset_index); return _next_offset_threshold; } @@ -418,10 +414,9 @@ void G1BlockOffsetTablePart::zero_bottom_entry_raw() { } HeapWord* G1BlockOffsetTablePart::initialize_threshold() { - _next_offset_index = _bot->index_for(_hr->bottom()); - _next_offset_index++; + size_t next_offset_index = _bot->index_for(_hr->bottom()) + 1 ; _next_offset_threshold = - _bot->address_for_index(_next_offset_index); + _bot->address_for_index(next_offset_index); return _next_offset_threshold; } diff --git a/src/hotspot/share/gc/g1/g1BlockOffsetTable.hpp b/src/hotspot/share/gc/g1/g1BlockOffsetTable.hpp index 82726a7bb0f..02928425cb6 100644 --- a/src/hotspot/share/gc/g1/g1BlockOffsetTable.hpp +++ b/src/hotspot/share/gc/g1/g1BlockOffsetTable.hpp @@ -112,7 +112,6 @@ class G1BlockOffsetTablePart { private: // allocation boundary at which offset array must be updated HeapWord* _next_offset_threshold; - size_t _next_offset_index; // index corresponding to that boundary // Indicates if an object can span into this G1BlockOffsetTablePart. debug_only(bool _object_can_span;) @@ -166,14 +165,14 @@ class G1BlockOffsetTablePart { const void* addr); // Requires that "*threshold_" be the first array entry boundary at or - // above "blk_start", and that "*index_" be the corresponding array - // index. If the block starts at or crosses "*threshold_", records + // above "blk_start". If the block starts at or crosses "*threshold_", records // "blk_start" as the appropriate block start for the array index // starting at "*threshold_", and for any other indices crossed by the - // block. Updates "*threshold_" and "*index_" to correspond to the first - // index after the block end. - void alloc_block_work(HeapWord** threshold_, size_t* index_, - HeapWord* blk_start, HeapWord* blk_end); + // block. Updates "*threshold_" to correspond to the first index after + // the block end. + void alloc_block_work(HeapWord** threshold_, + HeapWord* blk_start, + HeapWord* blk_end); void check_all_cards(size_t left_card, size_t right_card) const; @@ -214,7 +213,7 @@ class G1BlockOffsetTablePart { // never exceeds the "_next_offset_threshold". void alloc_block(HeapWord* blk_start, HeapWord* blk_end) { if (blk_end > _next_offset_threshold) { - alloc_block_work(&_next_offset_threshold, &_next_offset_index, blk_start, blk_end); + alloc_block_work(&_next_offset_threshold, blk_start, blk_end); } } void alloc_block(HeapWord* blk, size_t size) { diff --git a/src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp b/src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp index 9eadd8d1d38..4af48441354 100644 --- a/src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp +++ b/src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp @@ -108,9 +108,11 @@ inline HeapWord* G1BlockOffsetTablePart::block_at_or_preceding(const void* addr) assert(_object_can_span || _bot->offset_array(_bot->index_for(_hr->bottom())) == 0, "Object crossed region boundary, found offset %u instead of 0", (uint) _bot->offset_array(_bot->index_for(_hr->bottom()))); - size_t index = _bot->index_for(addr); + // We must make sure that the offset table entry we use is valid. - assert(index < _next_offset_index, "Precondition"); + assert(addr < _next_offset_threshold, "Precondition"); + + size_t index = _bot->index_for(addr); HeapWord* q = _bot->address_for_index(index); diff --git a/src/hotspot/share/gc/parallel/psYoungGen.cpp b/src/hotspot/share/gc/parallel/psYoungGen.cpp index 47cca3a0996..a4ebea468de 100644 --- a/src/hotspot/share/gc/parallel/psYoungGen.cpp +++ b/src/hotspot/share/gc/parallel/psYoungGen.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -317,7 +317,7 @@ bool PSYoungGen::resize_generation(size_t eden_size, size_t survivor_size) { if (orig_size == max_gen_size()) { log_trace(gc)("PSYoung generation size at maximum: " SIZE_FORMAT "K", orig_size/K); } else if (orig_size == min_gen_size()) { - log_trace(gc)("PSYoung generation size at minium: " SIZE_FORMAT "K", orig_size/K); + log_trace(gc)("PSYoung generation size at minimum: " SIZE_FORMAT "K", orig_size/K); } } diff --git a/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp b/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp index 08cd7475184..b71999382d2 100644 --- a/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp +++ b/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp @@ -303,13 +303,16 @@ void ZBarrierSetC2::clone_at_expansion(PhaseMacroExpand* phase, ArrayCopyNode* a // BarrierSetC2::clone sets the offsets via BarrierSetC2::arraycopy_payload_base_offset // which 8-byte aligns them to allow for word size copies. Make sure the offsets point // to the first element in the array when cloning object arrays. Otherwise, load - // barriers are applied to parts of the header. + // barriers are applied to parts of the header. Also adjust the length accordingly. assert(src_offset == dest_offset, "should be equal"); - assert((src_offset->get_long() == arrayOopDesc::base_offset_in_bytes(T_OBJECT) && UseCompressedClassPointers) || - (src_offset->get_long() == arrayOopDesc::length_offset_in_bytes() && !UseCompressedClassPointers), - "unexpected offset for object array clone"); - src_offset = phase->longcon(arrayOopDesc::base_offset_in_bytes(T_OBJECT)); - dest_offset = src_offset; + jlong offset = src_offset->get_long(); + if (offset != arrayOopDesc::base_offset_in_bytes(T_OBJECT)) { + assert(!UseCompressedClassPointers, "should only happen without compressed class pointers"); + assert((arrayOopDesc::base_offset_in_bytes(T_OBJECT) - offset) == BytesPerLong, "unexpected offset"); + length = phase->transform_later(new SubXNode(length, phase->longcon(1))); // Size is in longs + src_offset = phase->longcon(arrayOopDesc::base_offset_in_bytes(T_OBJECT)); + dest_offset = src_offset; + } } Node* payload_src = phase->basic_plus_adr(src, src_offset); Node* payload_dst = phase->basic_plus_adr(dest, dest_offset); diff --git a/src/hotspot/share/gc/z/zForwarding.inline.hpp b/src/hotspot/share/gc/z/zForwarding.inline.hpp index 31bf7292996..9207dfdb012 100644 --- a/src/hotspot/share/gc/z/zForwarding.inline.hpp +++ b/src/hotspot/share/gc/z/zForwarding.inline.hpp @@ -137,7 +137,7 @@ inline uintptr_t ZForwarding::insert(uintptr_t from_index, uintptr_t to_offset, const ZForwardingEntry old_entry; // Empty for (;;) { - const ZForwardingEntry prev_entry = Atomic::cmpxchg(entries() + *cursor, old_entry, new_entry); + const ZForwardingEntry prev_entry = Atomic::cmpxchg(entries() + *cursor, old_entry, new_entry, memory_order_release); if (!prev_entry.populated()) { // Success return to_offset; diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp index a86a99f6d51..bde6be763ca 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp @@ -286,7 +286,9 @@ JVMCIObjectArray CompilerToVM::initialize_intrinsics(JVMCI_TRAPS) { jobjectArray readConfiguration0(JNIEnv *env, JVMCI_TRAPS) { JavaThread* THREAD = JavaThread::current(); // For exception macros. ResourceHashtable longs; - ResourceHashtable strings; + ResourceHashtable strings; jvalue prim; prim.z = true; JVMCIObject boxedTrue = JVMCIENV->create_box(T_BOOLEAN, &prim, JVMCI_CHECK_NULL); diff --git a/src/hotspot/share/logging/logAsyncWriter.hpp b/src/hotspot/share/logging/logAsyncWriter.hpp index 5a3fd464908..6aedbe432a7 100644 --- a/src/hotspot/share/logging/logAsyncWriter.hpp +++ b/src/hotspot/share/logging/logAsyncWriter.hpp @@ -110,8 +110,6 @@ class AsyncLogMessage { typedef LinkedListDeque AsyncLogBuffer; typedef ResourceHashtable, - primitive_equals, 17, /*table_size*/ ResourceObj::C_HEAP, mtLogging> AsyncLogMap; diff --git a/src/hotspot/share/memory/metaspace/metaspaceCommon.cpp b/src/hotspot/share/memory/metaspace/metaspaceCommon.cpp index 96673621bb2..61d364b7e33 100644 --- a/src/hotspot/share/memory/metaspace/metaspaceCommon.cpp +++ b/src/hotspot/share/memory/metaspace/metaspaceCommon.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, 2020 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -66,7 +66,7 @@ static const char* display_unit_for_scale(size_t scale) { // Print a human readable size. // byte_size: size, in bytes, to be printed. // scale: one of 1 (byte-wise printing), sizeof(word) (word-size printing), K, M, G (scaled by KB, MB, GB respectively, -// or 0, which means the best scale is choosen dynamically. +// or 0, which means the best scale is chosen dynamically. // width: printing width. void print_human_readable_size(outputStream* st, size_t byte_size, size_t scale, int width) { if (scale == 0) { diff --git a/src/hotspot/share/memory/metaspace/metaspaceCommon.hpp b/src/hotspot/share/memory/metaspace/metaspaceCommon.hpp index 6ce10199e42..f8e453ca82f 100644 --- a/src/hotspot/share/memory/metaspace/metaspaceCommon.hpp +++ b/src/hotspot/share/memory/metaspace/metaspaceCommon.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, 2020 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -67,7 +67,7 @@ void print_scaled_words_and_percentage(outputStream* st, size_t word_size, size_ // Print a human readable size. // byte_size: size, in bytes, to be printed. // scale: one of 1 (byte-wise printing), sizeof(word) (word-size printing), K, M, G (scaled by KB, MB, GB respectively, -// or 0, which means the best scale is choosen dynamically. +// or 0, which means the best scale is chosen dynamically. // width: printing width. void print_human_readable_size(outputStream* st, size_t byte_size, size_t scale = 0, int width = -1); diff --git a/src/hotspot/share/memory/metaspace/metaspaceDCmd.cpp b/src/hotspot/share/memory/metaspace/metaspaceDCmd.cpp index d54c9d236b9..22e623b2356 100644 --- a/src/hotspot/share/memory/metaspace/metaspaceDCmd.cpp +++ b/src/hotspot/share/memory/metaspace/metaspaceDCmd.cpp @@ -43,7 +43,7 @@ MetaspaceDCmd::MetaspaceDCmd(outputStream* output, bool heap) : _by_chunktype("by-chunktype", "Break down numbers by chunk type.", "BOOLEAN", false, "false"), _show_vslist("vslist", "Shows details about the underlying virtual space.", "BOOLEAN", false, "false"), _scale("scale", "Memory usage in which to scale. Valid values are: 1, KB, MB or GB (fixed scale) " - "or \"dynamic\" for a dynamically choosen scale.", + "or \"dynamic\" for a dynamically chosen scale.", "STRING", false, "dynamic"), _show_classes("show-classes", "If show-loaders is set, shows loaded classes for each loader.", "BOOLEAN", false, "false") { diff --git a/src/hotspot/share/opto/compile.cpp b/src/hotspot/share/opto/compile.cpp index 647abb09c80..6c7a446326a 100644 --- a/src/hotspot/share/opto/compile.cpp +++ b/src/hotspot/share/opto/compile.cpp @@ -485,6 +485,9 @@ CompileWrapper::CompileWrapper(Compile* compile) : _compile(compile) { _compile->clone_map().set_debug(_compile->has_method() && _compile->directive()->CloneMapDebugOption); } CompileWrapper::~CompileWrapper() { + // simulate crash during compilation + assert(CICrashAt < 0 || _compile->compile_id() != CICrashAt, "just as planned"); + _compile->end_method(); _compile->env()->set_compiler_data(NULL); } @@ -2573,10 +2576,6 @@ void Compile::Optimize() { if (failing()) return; } - // Now that all inlining is over, cut edge from root to loop - // safepoints - remove_root_to_sfpts_edges(igvn); - // Remove the speculative part of types and clean up the graph from // the extra CastPP nodes whose only purpose is to carry them. Do // that early so that optimizations are not disrupted by the extra @@ -2613,6 +2612,10 @@ void Compile::Optimize() { set_for_igvn(save_for_igvn); } + // Now that all inlining is over and no PhaseRemoveUseless will run, cut edge from root to loop + // safepoints + remove_root_to_sfpts_edges(igvn); + // Process inline type nodes now that all inlining is over process_inline_types(igvn); diff --git a/src/hotspot/share/opto/ifnode.cpp b/src/hotspot/share/opto/ifnode.cpp index 7e544ad4132..83ba066f7b8 100644 --- a/src/hotspot/share/opto/ifnode.cpp +++ b/src/hotspot/share/opto/ifnode.cpp @@ -114,10 +114,11 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) { if( !t->singleton() ) return NULL; // No intervening control, like a simple Call - Node *r = iff->in(0); - if( !r->is_Region() ) return NULL; - if (r->is_Loop()) return NULL; - if( phi->region() != r ) return NULL; + Node* r = iff->in(0); + if (!r->is_Region() || r->is_Loop() || phi->region() != r || r->as_Region()->is_copy()) { + return NULL; + } + // No other users of the cmp/bool if (b->outcnt() != 1 || cmp->outcnt() != 1) { //tty->print_cr("many users of cmp/bool"); @@ -243,13 +244,23 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) { } Node* proj = PhaseIdealLoop::find_predicate(r->in(ii)); if (proj != NULL) { + // Bail out if splitting through a region with a predicate input (could + // also be a loop header before loop opts creates a LoopNode for it). return NULL; } } // If all the defs of the phi are the same constant, we already have the desired end state. // Skip the split that would create empty phi and region nodes. - if((r->req() - req_c) == 1) { + if ((r->req() - req_c) == 1) { + return NULL; + } + + // At this point we know that we can apply the split if optimization. If the region is still on the worklist, + // we should wait until it is processed. The region might be removed which makes this optimization redundant. + // This also avoids the creation of dead data loops when rewiring data nodes below when a region is dying. + if (igvn->_worklist.member(r)) { + igvn->_worklist.push(iff); // retry split if later again return NULL; } diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp index 7754b34d62a..4990101d9db 100644 --- a/src/hotspot/share/opto/library_call.cpp +++ b/src/hotspot/share/opto/library_call.cpp @@ -2803,6 +2803,19 @@ bool LibraryCallKit::inline_unsafe_load_store(const BasicType type, const LoadSt if (is_reference_type(type)) { decorators |= IN_HEAP | ON_UNKNOWN_OOP_REF; + if (oldval != NULL && oldval->is_InlineType()) { + // Re-execute the unsafe access if allocation triggers deoptimization. + PreserveReexecuteState preexecs(this); + jvms()->set_should_reexecute(true); + oldval = oldval->as_InlineType()->buffer(this)->get_oop(); + } + if (newval != NULL && newval->is_InlineType()) { + // Re-execute the unsafe access if allocation triggers deoptimization. + PreserveReexecuteState preexecs(this); + jvms()->set_should_reexecute(true); + newval = newval->as_InlineType()->buffer(this)->get_oop(); + } + // Transformation of a value which could be NULL pointer (CastPP #NULL) // could be delayed during Parse (for example, in adjust_map_after_if()). // Execute transformation here to avoid barrier generation in such case. diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index 5d9e682f391..6f7e34d3d76 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -2045,7 +2045,7 @@ Node* CountedLoopNode::match_incr_with_optional_truncation(Node* expr, Node** tr } LoopNode* CountedLoopNode::skip_strip_mined(int expect_skeleton) { - if (is_strip_mined() && is_valid_counted_loop(T_INT)) { + if (is_strip_mined() && in(EntryControl) != NULL && in(EntryControl)->is_OuterStripMinedLoop()) { verify_strip_mined(expect_skeleton); return in(EntryControl)->as_Loop(); } diff --git a/src/hotspot/share/prims/nativeLookup.cpp b/src/hotspot/share/prims/nativeLookup.cpp index 3ae101ec602..16a1041e8d7 100644 --- a/src/hotspot/share/prims/nativeLookup.cpp +++ b/src/hotspot/share/prims/nativeLookup.cpp @@ -244,6 +244,7 @@ static JNINativeMethod lookup_special_native_methods[] = { { CC"Java_jdk_internal_invoke_NativeEntryPoint_registerNatives", NULL, FN_PTR(JVM_RegisterNativeEntryPointMethods) }, { CC"Java_jdk_internal_perf_Perf_registerNatives", NULL, FN_PTR(JVM_RegisterPerfMethods) }, { CC"Java_sun_hotspot_WhiteBox_registerNatives", NULL, FN_PTR(JVM_RegisterWhiteBoxMethods) }, + { CC"Java_jdk_test_whitebox_WhiteBox_registerNatives", NULL, FN_PTR(JVM_RegisterWhiteBoxMethods) }, { CC"Java_jdk_internal_vm_vector_VectorSupport_registerNatives", NULL, FN_PTR(JVM_RegisterVectorSupportMethods)}, #if INCLUDE_JVMCI { CC"Java_jdk_vm_ci_runtime_JVMCI_initializeRuntime", NULL, FN_PTR(JVM_GetJVMCIRuntime) }, diff --git a/src/hotspot/share/prims/wbtestmethods/parserTests.cpp b/src/hotspot/share/prims/wbtestmethods/parserTests.cpp index 32ef1653f04..c6ef6cf8296 100644 --- a/src/hotspot/share/prims/wbtestmethods/parserTests.cpp +++ b/src/hotspot/share/prims/wbtestmethods/parserTests.cpp @@ -50,7 +50,7 @@ * This method Returns a char* representation of that enum value. */ static const char* lookup_diagnosticArgumentEnum(const char* field_name, oop object) { - const char* enum_sig = "Lsun/hotspot/parser/DiagnosticCommand$DiagnosticArgumentType;"; + const char* enum_sig = "Ljdk/test/whitebox/parser/DiagnosticCommand$DiagnosticArgumentType;"; TempNewSymbol enumSigSymbol = SymbolTable::new_symbol(enum_sig); int offset = WhiteBox::offset_for_field(field_name, object, enumSigSymbol); oop enumOop = object->obj_field(offset); diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index 5e45d926d68..3cc3a5bd1ba 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -2287,6 +2287,9 @@ bool WhiteBox::lookup_bool(const char* field_name, oop object) { void WhiteBox::register_methods(JNIEnv* env, jclass wbclass, JavaThread* thread, JNINativeMethod* method_array, int method_count) { ResourceMark rm; + Klass* klass = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(wbclass)); + const char* klass_name = klass->external_name(); + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI // one by one registration natives for exception catching @@ -2302,13 +2305,13 @@ void WhiteBox::register_methods(JNIEnv* env, jclass wbclass, JavaThread* thread, if (env->IsInstanceOf(throwable_obj, no_such_method_error_klass)) { // NoSuchMethodError is thrown when a method can't be found or a method is not native. // Ignoring the exception since it is not preventing use of other WhiteBox methods. - tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", - method_array[i].name, method_array[i].signature); + tty->print_cr("Warning: 'NoSuchMethodError' on register of %s::%s%s", + klass_name, method_array[i].name, method_array[i].signature); } } else { // Registration failed unexpectedly. - tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered", - method_array[i].name, method_array[i].signature); + tty->print_cr("Warning: unexpected error on register of %s::%s%s. All methods will be unregistered", + klass_name, method_array[i].name, method_array[i].signature); env->UnregisterNatives(wbclass); break; } @@ -2523,7 +2526,7 @@ static JNINativeMethod methods[] = { {CC"countAliveClasses0", CC"(Ljava/lang/String;)I", (void*)&WB_CountAliveClasses }, {CC"getSymbolRefcount", CC"(Ljava/lang/String;)I", (void*)&WB_GetSymbolRefcount }, {CC"parseCommandLine0", - CC"(Ljava/lang/String;C[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;", + CC"(Ljava/lang/String;C[Ljdk/test/whitebox/parser/DiagnosticCommand;)[Ljava/lang/Object;", (void*) &WB_ParseCommandLine }, {CC"addToBootstrapClassLoaderSearch0", CC"(Ljava/lang/String;)V", diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 650c3f20803..937e523811a 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -53,7 +53,7 @@ #include "runtime/safepointMechanism.hpp" #include "runtime/vm_version.hpp" #include "services/management.hpp" -#include "services/memTracker.hpp" +#include "services/nmtCommon.hpp" #include "utilities/align.hpp" #include "utilities/defaultStream.hpp" #include "utilities/macros.hpp" @@ -1991,17 +1991,6 @@ bool Arguments::check_vm_args_consistency() { status = false; } - if (PrintNMTStatistics) { -#if INCLUDE_NMT - if (MemTracker::tracking_level() == NMT_off) { -#endif // INCLUDE_NMT - warning("PrintNMTStatistics is disabled, because native memory tracking is not enabled"); - PrintNMTStatistics = false; -#if INCLUDE_NMT - } -#endif - } - status = CompilerConfig::check_args_consistency(status); #if INCLUDE_JVMCI if (status && EnableJVMCI) { @@ -3736,29 +3725,6 @@ jint Arguments::match_special_option_and_act(const JavaVMInitArgs* args, JVMFlag::printFlags(tty, false); vm_exit(0); } - if (match_option(option, "-XX:NativeMemoryTracking", &tail)) { -#if INCLUDE_NMT - // The launcher did not setup nmt environment variable properly. - if (!MemTracker::check_launcher_nmt_support(tail)) { - warning("Native Memory Tracking did not setup properly, using wrong launcher?"); - } - - // Verify if nmt option is valid. - if (MemTracker::verify_nmt_option()) { - // Late initialization, still in single-threaded mode. - if (MemTracker::tracking_level() >= NMT_summary) { - MemTracker::init(); - } - } else { - vm_exit_during_initialization("Syntax error, expecting -XX:NativeMemoryTracking=[off|summary|detail]", NULL); - } - continue; -#else - jio_fprintf(defaultStream::error_stream(), - "Native Memory Tracking is not supported in this VM\n"); - return JNI_ERR; -#endif - } #ifndef PRODUCT if (match_option(option, "-XX:+PrintFlagsWithComments")) { @@ -4010,6 +3976,26 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) { no_shared_spaces("CDS Disabled"); #endif // INCLUDE_CDS +#if INCLUDE_NMT + // Verify NMT arguments + const NMT_TrackingLevel lvl = NMTUtil::parse_tracking_level(NativeMemoryTracking); + if (lvl == NMT_unknown) { + jio_fprintf(defaultStream::error_stream(), + "Syntax error, expecting -XX:NativeMemoryTracking=[off|summary|detail]", NULL); + return JNI_ERR; + } + if (PrintNMTStatistics && lvl == NMT_off) { + warning("PrintNMTStatistics is disabled, because native memory tracking is not enabled"); + FLAG_SET_DEFAULT(PrintNMTStatistics, false); + } +#else + if (!FLAG_IS_DEFAULT(NativeMemoryTracking) || PrintNMTStatistics) { + warning("Native Memory Tracking is not supported in this VM"); + FLAG_SET_DEFAULT(NativeMemoryTracking, "off"); + FLAG_SET_DEFAULT(PrintNMTStatistics, false); + } +#endif // INCLUDE_NMT + if (TraceDependencies && VerifyDependencies) { if (!FLAG_IS_DEFAULT(TraceDependencies)) { warning("TraceDependencies results may be inflated by VerifyDependencies"); diff --git a/src/hotspot/share/runtime/handshake.cpp b/src/hotspot/share/runtime/handshake.cpp index 5dbaee5cbde..2841d5a6f24 100644 --- a/src/hotspot/share/runtime/handshake.cpp +++ b/src/hotspot/share/runtime/handshake.cpp @@ -612,14 +612,12 @@ void HandshakeState::do_self_suspend() { assert(Thread::current() == _handshakee, "should call from _handshakee"); assert(_lock.owned_by_self(), "Lock must be held"); assert(!_handshakee->has_last_Java_frame() || _handshakee->frame_anchor()->walkable(), "should have walkable stack"); - JavaThreadState jts = _handshakee->thread_state(); + assert(_handshakee->thread_state() == _thread_blocked, "Caller should have transitioned to _thread_blocked"); + while (is_suspended()) { - _handshakee->set_thread_state(_thread_blocked); log_trace(thread, suspend)("JavaThread:" INTPTR_FORMAT " suspended", p2i(_handshakee)); _lock.wait_without_safepoint_check(); } - _handshakee->set_thread_state(jts); - set_async_suspend_handshake(false); log_trace(thread, suspend)("JavaThread:" INTPTR_FORMAT " resumed", p2i(_handshakee)); } @@ -631,7 +629,12 @@ class ThreadSelfSuspensionHandshake : public AsyncHandshakeClosure { void do_thread(Thread* thr) { JavaThread* current = JavaThread::cast(thr); assert(current == Thread::current(), "Must be self executed."); + JavaThreadState jts = current->thread_state(); + + current->set_thread_state(_thread_blocked); current->handshake_state()->do_self_suspend(); + current->set_thread_state(jts); + current->handshake_state()->set_async_suspend_handshake(false); } virtual bool is_suspend() { return true; } }; @@ -681,15 +684,19 @@ class SuspendThreadHandshake : public HandshakeClosure { bool HandshakeState::suspend() { JavaThread* self = JavaThread::current(); - SuspendThreadHandshake st; - Handshake::execute(&st, _handshakee); if (_handshakee == self) { - // If target is the current thread we need to call this to do the - // actual suspend since Handshake::execute() above only installed - // the asynchronous handshake. - SafepointMechanism::process_if_requested(self); + // If target is the current thread we can bypass the handshake machinery + // and just suspend directly + ThreadBlockInVM tbivm(self); + MutexLocker ml(&_lock, Mutex::_no_safepoint_check_flag); + set_suspended(true); + do_self_suspend(); + return true; + } else { + SuspendThreadHandshake st; + Handshake::execute(&st, _handshakee); + return st.did_suspend(); } - return st.did_suspend(); } bool HandshakeState::resume() { diff --git a/src/hotspot/share/runtime/orderAccess.hpp b/src/hotspot/share/runtime/orderAccess.hpp index e2d52923c4d..8e5944916f9 100644 --- a/src/hotspot/share/runtime/orderAccess.hpp +++ b/src/hotspot/share/runtime/orderAccess.hpp @@ -26,6 +26,7 @@ #define SHARE_RUNTIME_ORDERACCESS_HPP #include "memory/allocation.hpp" +#include "runtime/vm_version.hpp" #include "utilities/macros.hpp" // Memory Access Ordering Model diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp index 797ff8c6aaa..b206131e44f 100644 --- a/src/hotspot/share/runtime/os.cpp +++ b/src/hotspot/share/runtime/os.cpp @@ -64,6 +64,7 @@ #include "services/attachListener.hpp" #include "services/mallocTracker.hpp" #include "services/memTracker.hpp" +#include "services/nmtPreInit.hpp" #include "services/nmtCommon.hpp" #include "services/threadService.hpp" #include "utilities/align.hpp" @@ -646,6 +647,15 @@ void* os::malloc(size_t size, MEMFLAGS memflags, const NativeCallStack& stack) { NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1)); NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size)); +#if INCLUDE_NMT + { + void* rc = NULL; + if (NMTPreInit::handle_malloc(&rc, size)) { + return rc; + } + } +#endif + // Since os::malloc can be called when the libjvm.{dll,so} is // first loaded and we don't have a thread yet we must accept NULL also here. assert(!os::ThreadCrashProtection::is_crash_protected(Thread::current_or_null()), @@ -705,6 +715,15 @@ void* os::realloc(void *memblock, size_t size, MEMFLAGS flags) { void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, const NativeCallStack& stack) { +#if INCLUDE_NMT + { + void* rc = NULL; + if (NMTPreInit::handle_realloc(&rc, memblock, size)) { + return rc; + } + } +#endif + // For the test flag -XX:MallocMaxTestWords if (has_reached_max_malloc_test_peak(size)) { return NULL; @@ -755,6 +774,13 @@ void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, const NativeCa // handles NULL pointers void os::free(void *memblock) { + +#if INCLUDE_NMT + if (NMTPreInit::handle_free(memblock)) { + return; + } +#endif + NOT_PRODUCT(inc_stat_counter(&num_frees, 1)); #ifdef ASSERT if (memblock == NULL) return; @@ -989,7 +1015,9 @@ void os::print_environment_variables(outputStream* st, const char** env_list) { if (envvar != NULL) { st->print("%s", env_list[i]); st->print("="); - st->print_cr("%s", envvar); + st->print("%s", envvar); + // Use separate cr() printing to avoid unnecessary buffer operations that might cause truncation. + st->cr(); } } } diff --git a/src/hotspot/share/runtime/perfData.cpp b/src/hotspot/share/runtime/perfData.cpp index 9ce8f3fff93..843f7ddec72 100644 --- a/src/hotspot/share/runtime/perfData.cpp +++ b/src/hotspot/share/runtime/perfData.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -277,7 +277,8 @@ void PerfDataManager::destroy() { os::naked_short_sleep(1); // 1ms sleep to let other thread(s) run log_debug(perf, datacreation)("Total = %d, Sampled = %d, Constants = %d", - _all->length(), _sampled->length(), _constants->length()); + _all->length(), _sampled == NULL ? 0 : _sampled->length(), + _constants == NULL ? 0 : _constants->length()); for (int index = 0; index < _all->length(); index++) { PerfData* p = _all->at(index); diff --git a/src/hotspot/share/runtime/safepoint.cpp b/src/hotspot/share/runtime/safepoint.cpp index 1af823660b6..83d27dd389d 100644 --- a/src/hotspot/share/runtime/safepoint.cpp +++ b/src/hotspot/share/runtime/safepoint.cpp @@ -706,45 +706,34 @@ void SafepointSynchronize::block(JavaThread *thread) { } JavaThreadState state = thread->thread_state(); + assert(is_a_block_safe_state(state), "Illegal threadstate encountered: %d", state); thread->frame_anchor()->make_walkable(thread); uint64_t safepoint_id = SafepointSynchronize::safepoint_counter(); - // Check that we have a valid thread_state at this point - switch(state) { - case _thread_in_vm_trans: - case _thread_in_Java: // From compiled code - case _thread_in_native_trans: - case _thread_blocked_trans: - case _thread_new_trans: - - // We have no idea where the VMThread is, it might even be at next safepoint. - // So we can miss this poll, but stop at next. - // Load dependent store, it must not pass loading of safepoint_id. - thread->safepoint_state()->set_safepoint_id(safepoint_id); // Release store + // We have no idea where the VMThread is, it might even be at next safepoint. + // So we can miss this poll, but stop at next. - // This part we can skip if we notice we miss or are in a future safepoint. - OrderAccess::storestore(); - // Load in wait barrier should not float up - thread->set_thread_state_fence(_thread_blocked); + // Load dependent store, it must not pass loading of safepoint_id. + thread->safepoint_state()->set_safepoint_id(safepoint_id); // Release store - _wait_barrier->wait(static_cast(safepoint_id)); - assert(_state != _synchronized, "Can't be"); + // This part we can skip if we notice we miss or are in a future safepoint. + OrderAccess::storestore(); + // Load in wait barrier should not float up + thread->set_thread_state_fence(_thread_blocked); - // If barrier is disarmed stop store from floating above loads in barrier. - OrderAccess::loadstore(); - thread->set_thread_state(state); + _wait_barrier->wait(static_cast(safepoint_id)); + assert(_state != _synchronized, "Can't be"); - // Then we reset the safepoint id to inactive. - thread->safepoint_state()->reset_safepoint_id(); // Release store + // If barrier is disarmed stop store from floating above loads in barrier. + OrderAccess::loadstore(); + thread->set_thread_state(state); - OrderAccess::fence(); + // Then we reset the safepoint id to inactive. + thread->safepoint_state()->reset_safepoint_id(); // Release store - break; + OrderAccess::fence(); - default: - fatal("Illegal threadstate encountered: %d", state); - } guarantee(thread->safepoint_state()->get_safepoint_id() == InactiveSafepointCounter, "The safepoint id should be set only in block path"); diff --git a/src/hotspot/share/runtime/safepoint.hpp b/src/hotspot/share/runtime/safepoint.hpp index c35f55f0c27..e73d029a2f8 100644 --- a/src/hotspot/share/runtime/safepoint.hpp +++ b/src/hotspot/share/runtime/safepoint.hpp @@ -126,6 +126,19 @@ class SafepointSynchronize : AllStatic { JavaThread *thread, uint64_t safepoint_count); + static bool is_a_block_safe_state(JavaThreadState state) { + // Check that we have a valid thread_state before blocking for safepoints + switch(state) { + case _thread_in_vm_trans: + case _thread_in_Java: // From compiled code + case _thread_in_native_trans: + case _thread_blocked_trans: + case _thread_new_trans: + return true; + default: + return false; + } + } // Called when a thread voluntarily blocks static void block(JavaThread *thread); diff --git a/src/hotspot/share/runtime/safepointMechanism.cpp b/src/hotspot/share/runtime/safepointMechanism.cpp index 20e163a7f6c..b092f050539 100644 --- a/src/hotspot/share/runtime/safepointMechanism.cpp +++ b/src/hotspot/share/runtime/safepointMechanism.cpp @@ -118,6 +118,8 @@ void SafepointMechanism::process(JavaThread *thread, bool allow_suspend) { // local poll already checked, if used. bool need_rechecking; do { + JavaThreadState state = thread->thread_state(); + guarantee(SafepointSynchronize::is_a_block_safe_state(state), "Illegal threadstate encountered: %d", state); if (global_poll()) { // Any load in ::block() must not pass the global poll load. // Otherwise we might load an old safepoint counter (for example). diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp index a52b6026b43..7d18f438b70 100644 --- a/src/hotspot/share/runtime/thread.cpp +++ b/src/hotspot/share/runtime/thread.cpp @@ -95,7 +95,6 @@ #include "runtime/objectMonitor.hpp" #include "runtime/orderAccess.hpp" #include "runtime/osThread.hpp" -#include "runtime/prefetch.inline.hpp" #include "runtime/safepoint.hpp" #include "runtime/safepointMechanism.inline.hpp" #include "runtime/safepointVerifiers.hpp" @@ -2479,28 +2478,6 @@ size_t JavaThread::_stack_size_at_create = 0; bool Threads::_vm_complete = false; #endif -static inline void *prefetch_and_load_ptr(void **addr, intx prefetch_interval) { - Prefetch::read((void*)addr, prefetch_interval); - return *addr; -} - -// Possibly the ugliest for loop the world has seen. C++ does not allow -// multiple types in the declaration section of the for loop. In this case -// we are only dealing with pointers and hence can cast them. It looks ugly -// but macros are ugly and therefore it's fine to make things absurdly ugly. -#define DO_JAVA_THREADS(LIST, X) \ - for (JavaThread *MACRO_scan_interval = (JavaThread*)(uintptr_t)PrefetchScanIntervalInBytes, \ - *MACRO_list = (JavaThread*)(LIST), \ - **MACRO_end = ((JavaThread**)((ThreadsList*)MACRO_list)->threads()) + ((ThreadsList*)MACRO_list)->length(), \ - **MACRO_current_p = (JavaThread**)((ThreadsList*)MACRO_list)->threads(), \ - *X = (JavaThread*)prefetch_and_load_ptr((void**)MACRO_current_p, (intx)MACRO_scan_interval); \ - MACRO_current_p != MACRO_end; \ - MACRO_current_p++, \ - X = (JavaThread*)prefetch_and_load_ptr((void**)MACRO_current_p, (intx)MACRO_scan_interval)) - -// All JavaThreads -#define ALL_JAVA_THREADS(X) DO_JAVA_THREADS(ThreadsSMRSupport::get_java_thread_list(), X) - // All NonJavaThreads (i.e., every non-JavaThread in the system). void Threads::non_java_threads_do(ThreadClosure* tc) { NoSafepointVerifier nsv; @@ -2509,6 +2486,10 @@ void Threads::non_java_threads_do(ThreadClosure* tc) { } } +// All JavaThreads +#define ALL_JAVA_THREADS(X) \ + for (JavaThread* X : *ThreadsSMRSupport::get_java_thread_list()) + // All JavaThreads void Threads::java_threads_do(ThreadClosure* tc) { assert_locked_or_safepoint(Threads_lock); @@ -2727,6 +2708,11 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { jint parse_result = Arguments::parse(args); if (parse_result != JNI_OK) return parse_result; +#if INCLUDE_NMT + // Initialize NMT right after argument parsing to keep the pre-NMT-init window small. + MemTracker::initialize(); +#endif // INCLUDE_NMT + os::init_before_ergo(); jint ergo_result = Arguments::apply_ergo(); @@ -3642,7 +3628,7 @@ GrowableArray* Threads::get_pending_threads(ThreadsList * t_list, GrowableArray* result = new GrowableArray(count); int i = 0; - DO_JAVA_THREADS(t_list, p) { + for (JavaThread* p : *t_list) { if (!p->can_call_java()) continue; // The first stage of async deflation does not affect any field @@ -3663,7 +3649,7 @@ JavaThread *Threads::owning_thread_from_monitor_owner(ThreadsList * t_list, // NULL owner means not locked so we can skip the search if (owner == NULL) return NULL; - DO_JAVA_THREADS(t_list, p) { + for (JavaThread* p : *t_list) { // first, see if owner is the address of a Java thread if (owner == (address)p) return p; } @@ -3678,7 +3664,7 @@ JavaThread *Threads::owning_thread_from_monitor_owner(ThreadsList * t_list, // Lock Word in the owning Java thread's stack. // JavaThread* the_owner = NULL; - DO_JAVA_THREADS(t_list, q) { + for (JavaThread* q : *t_list) { if (q->is_lock_owned(owner)) { the_owner = q; break; diff --git a/src/hotspot/share/runtime/threadSMR.cpp b/src/hotspot/share/runtime/threadSMR.cpp index 7ff5e6fd1ae..6dd294ecdd6 100644 --- a/src/hotspot/share/runtime/threadSMR.cpp +++ b/src/hotspot/share/runtime/threadSMR.cpp @@ -35,6 +35,7 @@ #include "services/threadIdTable.hpp" #include "services/threadService.hpp" #include "utilities/copy.hpp" +#include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/ostream.hpp" #include "utilities/powerOfTwo.hpp" @@ -183,10 +184,6 @@ inline ThreadsList* ThreadsSMRSupport::xchg_java_thread_list(ThreadsList* new_li // class ThreadScanHashtable : public CHeapObj { private: - static bool ptr_equals(void * const& s1, void * const& s2) { - return s1 == s2; - } - static unsigned int ptr_hash(void * const& s1) { // 2654435761 = 2^32 * Phi (golden ratio) return (unsigned int)(((uint32_t)(uintptr_t)s1) * 2654435761u); @@ -194,9 +191,9 @@ class ThreadScanHashtable : public CHeapObj { // ResourceHashtable SIZE is specified at compile time so we // use 1031 which is the first prime after 1024. - typedef ResourceHashtable PtrTable; + typedef ResourceHashtable PtrTable; PtrTable * _ptrs; public: @@ -633,6 +630,29 @@ static JavaThread* const* make_threads_list_data(int entries) { return data; } +#ifdef ASSERT + +ThreadsList::Iterator::Iterator() : _thread_ptr(nullptr), _list(nullptr) {} + +uint ThreadsList::Iterator::check_index(ThreadsList* list, uint i) { + assert(i <= list->length(), "invalid index %u", i); + return i; +} + +void ThreadsList::Iterator::assert_not_singular() const { + assert(_list != nullptr, "singular iterator"); +} + +void ThreadsList::Iterator::assert_dereferenceable() const { + assert(_thread_ptr < (_list->threads() + _list->length()), "not dereferenceable"); +} + +void ThreadsList::Iterator::assert_same_list(Iterator i) const { + assert(_list == i._list, "iterators from different lists"); +} + +#endif // ASSERT + ThreadsList::ThreadsList(int entries) : _magic(THREADS_LIST_MAGIC), _length(entries), diff --git a/src/hotspot/share/runtime/threadSMR.hpp b/src/hotspot/share/runtime/threadSMR.hpp index a4df98cde0a..3dde3892ad5 100644 --- a/src/hotspot/share/runtime/threadSMR.hpp +++ b/src/hotspot/share/runtime/threadSMR.hpp @@ -29,6 +29,7 @@ #include "runtime/mutexLocker.hpp" #include "runtime/thread.hpp" #include "runtime/timer.hpp" +#include "utilities/debug.hpp" class JavaThread; class Monitor; @@ -192,6 +193,10 @@ class ThreadsList : public CHeapObj { explicit ThreadsList(int entries); ~ThreadsList(); + class Iterator; + inline Iterator begin(); + inline Iterator end(); + template void threads_do(T *cl) const; @@ -211,6 +216,29 @@ class ThreadsList : public CHeapObj { #endif }; +class ThreadsList::Iterator { + JavaThread* const* _thread_ptr; + DEBUG_ONLY(ThreadsList* _list;) + + static uint check_index(ThreadsList* list, uint i) NOT_DEBUG({ return i; }); + void assert_not_singular() const NOT_DEBUG_RETURN; + void assert_dereferenceable() const NOT_DEBUG_RETURN; + void assert_same_list(Iterator i) const NOT_DEBUG_RETURN; + +public: + Iterator() NOT_DEBUG(= default); // Singular iterator. + inline Iterator(ThreadsList* list, uint i); + + inline bool operator==(Iterator other) const; + inline bool operator!=(Iterator other) const; + + inline JavaThread* operator*() const; + inline JavaThread* operator->() const; + + inline Iterator& operator++(); + inline Iterator operator++(int); +}; + // An abstract safe ptr to a ThreadsList comprising either a stable hazard ptr // for leaves, or a retained reference count for nested uses. The user of this // API does not need to know which mechanism is providing the safety. diff --git a/src/hotspot/share/runtime/threadSMR.inline.hpp b/src/hotspot/share/runtime/threadSMR.inline.hpp index 190a014af93..993ac001a22 100644 --- a/src/hotspot/share/runtime/threadSMR.inline.hpp +++ b/src/hotspot/share/runtime/threadSMR.inline.hpp @@ -33,6 +33,57 @@ #include "memory/iterator.hpp" #include "runtime/prefetch.inline.hpp" #include "runtime/thread.inline.hpp" +#include "utilities/debug.hpp" +#include "utilities/macros.hpp" + +ThreadsList::Iterator::Iterator(ThreadsList* list, uint i) : + _thread_ptr(list->threads() + check_index(list, i)) + DEBUG_ONLY(COMMA _list(list)) +{} + +bool ThreadsList::Iterator::operator==(Iterator i) const { + assert_not_singular(); + assert_same_list(i); + return _thread_ptr == i._thread_ptr; +} + +bool ThreadsList::Iterator::operator!=(Iterator i) const { + return !operator==(i); +} + +JavaThread* ThreadsList::Iterator::operator*() const { + assert_not_singular(); + assert_dereferenceable(); + Prefetch::read(const_cast(_thread_ptr), PrefetchScanIntervalInBytes); + return *_thread_ptr; +} + +JavaThread* ThreadsList::Iterator::operator->() const { + return operator*(); +} + +ThreadsList::Iterator& ThreadsList::Iterator::operator++() { + assert_not_singular(); + assert_dereferenceable(); + ++_thread_ptr; + return *this; +} + +ThreadsList::Iterator ThreadsList::Iterator::operator++(int) { + assert_not_singular(); + assert_dereferenceable(); + Iterator result = *this; + ++_thread_ptr; + return result; +} + +ThreadsList::Iterator ThreadsList::begin() { + return Iterator(this, 0); +} + +ThreadsList::Iterator ThreadsList::end() { + return Iterator(this, length()); +} // Devirtualize known thread closure types. template diff --git a/src/hotspot/share/runtime/vmThread.cpp b/src/hotspot/share/runtime/vmThread.cpp index 87e5d8fd5e9..caf17d3a28d 100644 --- a/src/hotspot/share/runtime/vmThread.cpp +++ b/src/hotspot/share/runtime/vmThread.cpp @@ -60,7 +60,7 @@ void VMOperationTimeoutTask::task() { if (is_armed()) { jlong delay = nanos_to_millis(os::javaTimeNanos() - _arm_time); if (delay > AbortVMOnVMOperationTimeoutDelay) { - fatal("VM operation took too long: " JLONG_FORMAT " ms (timeout: " INTX_FORMAT " ms)", + fatal("VM operation took too long: " JLONG_FORMAT " ms elapsed since VM-op start (timeout: " INTX_FORMAT " ms)", delay, AbortVMOnVMOperationTimeoutDelay); } } diff --git a/src/hotspot/share/runtime/vm_version.hpp b/src/hotspot/share/runtime/vm_version.hpp index bf20885dab8..329851dd33f 100644 --- a/src/hotspot/share/runtime/vm_version.hpp +++ b/src/hotspot/share/runtime/vm_version.hpp @@ -25,6 +25,7 @@ #ifndef SHARE_RUNTIME_VM_VERSION_HPP #define SHARE_RUNTIME_VM_VERSION_HPP +#include "runtime/globals.hpp" #include "utilities/macros.hpp" // for CPU_HEADER() macro. #include CPU_HEADER(vm_version) diff --git a/src/hotspot/share/services/diagnosticCommand.hpp b/src/hotspot/share/services/diagnosticCommand.hpp index 4c95b645bdd..c2cef52f04b 100644 --- a/src/hotspot/share/services/diagnosticCommand.hpp +++ b/src/hotspot/share/services/diagnosticCommand.hpp @@ -371,7 +371,7 @@ class ClassHierarchyDCmd : public DCmdWithParser { return "VM.class_hierarchy"; } static const char* description() { - return "Print a list of all loaded classes, indented to show the class hiearchy. " + return "Print a list of all loaded classes, indented to show the class hierarchy. " "The name of each class is followed by the ClassLoaderData* of its ClassLoader, " "or \"null\" if loaded by the bootstrap class loader."; } diff --git a/src/hotspot/share/services/memTracker.cpp b/src/hotspot/share/services/memTracker.cpp index 981584f94be..a28d3badbcf 100644 --- a/src/hotspot/share/services/memTracker.cpp +++ b/src/hotspot/share/services/memTracker.cpp @@ -23,8 +23,11 @@ */ #include "precompiled.hpp" #include "jvm.h" +#include "logging/log.hpp" +#include "logging/logStream.hpp" #include "memory/metaspaceUtils.hpp" #include "runtime/atomic.hpp" +#include "runtime/globals.hpp" #include "runtime/orderAccess.hpp" #include "runtime/vmThread.hpp" #include "runtime/vmOperations.hpp" @@ -32,6 +35,8 @@ #include "services/memReporter.hpp" #include "services/mallocTracker.inline.hpp" #include "services/memTracker.hpp" +#include "services/nmtCommon.hpp" +#include "services/nmtPreInit.hpp" #include "services/threadStackTracker.hpp" #include "utilities/debug.hpp" #include "utilities/defaultStream.hpp" @@ -45,79 +50,44 @@ volatile NMT_TrackingLevel MemTracker::_tracking_level = NMT_unknown; NMT_TrackingLevel MemTracker::_cmdline_tracking_level = NMT_unknown; MemBaseline MemTracker::_baseline; -bool MemTracker::_is_nmt_env_valid = true; -static const size_t buffer_size = 64; +void MemTracker::initialize() { + bool rc = true; + assert(_tracking_level == NMT_unknown, "only call once"); + + NMT_TrackingLevel level = NMTUtil::parse_tracking_level(NativeMemoryTracking); + // Should have been validated before in arguments.cpp + assert(level == NMT_off || level == NMT_summary || level == NMT_detail, + "Invalid setting for NativeMemoryTracking (%s)", NativeMemoryTracking); -NMT_TrackingLevel MemTracker::init_tracking_level() { // Memory type is encoded into tracking header as a byte field, // make sure that we don't overflow it. STATIC_ASSERT(mt_number_of_types <= max_jubyte); - char nmt_env_variable[buffer_size]; - jio_snprintf(nmt_env_variable, sizeof(nmt_env_variable), "NMT_LEVEL_%d", os::current_process_id()); - const char* nmt_env_value; -#ifdef _WINDOWS - // Read the NMT environment variable from the PEB instead of the CRT - char value[buffer_size]; - nmt_env_value = GetEnvironmentVariable(nmt_env_variable, value, (DWORD)sizeof(value)) != 0 ? value : NULL; -#else - nmt_env_value = ::getenv(nmt_env_variable); -#endif - NMT_TrackingLevel level = NMT_off; - if (nmt_env_value != NULL) { - if (strcmp(nmt_env_value, "summary") == 0) { - level = NMT_summary; - } else if (strcmp(nmt_env_value, "detail") == 0) { - level = NMT_detail; - } else if (strcmp(nmt_env_value, "off") != 0) { - // The value of the environment variable is invalid - _is_nmt_env_valid = false; - } - // Remove the environment variable to avoid leaking to child processes - os::unsetenv(nmt_env_variable); - } - - if (!MallocTracker::initialize(level) || - !VirtualMemoryTracker::initialize(level)) { - level = NMT_off; - } - return level; -} - -void MemTracker::init() { - NMT_TrackingLevel level = tracking_level(); - if (level >= NMT_summary) { - if (!VirtualMemoryTracker::late_initialize(level) || - !ThreadStackTracker::late_initialize(level)) { - shutdown(); + if (level > NMT_off) { + if (!MallocTracker::initialize(level) || + !VirtualMemoryTracker::initialize(level) || + !ThreadStackTracker::initialize(level)) { + assert(false, "NMT initialization failed"); + level = NMT_off; + log_warning(nmt)("NMT initialization failed. NMT disabled."); return; } } -} -bool MemTracker::check_launcher_nmt_support(const char* value) { - if (strcmp(value, "=detail") == 0) { - if (MemTracker::tracking_level() != NMT_detail) { - return false; - } - } else if (strcmp(value, "=summary") == 0) { - if (MemTracker::tracking_level() != NMT_summary) { - return false; - } - } else if (strcmp(value, "=off") == 0) { - if (MemTracker::tracking_level() != NMT_off) { - return false; - } - } else { - _is_nmt_env_valid = false; - } + NMTPreInit::pre_to_post(); - return true; -} + _tracking_level = _cmdline_tracking_level = level; -bool MemTracker::verify_nmt_option() { - return _is_nmt_env_valid; + // Log state right after NMT initialization + if (log_is_enabled(Info, nmt)) { + LogTarget(Info, nmt) lt; + LogStream ls(lt); + ls.print_cr("NMT initialized: %s", NMTUtil::tracking_level_to_string(_tracking_level)); + ls.print_cr("Preinit state: "); + NMTPreInit::print_state(&ls); + ls.cr(); + } } void* MemTracker::malloc_base(void* memblock) { @@ -174,6 +144,8 @@ bool MemTracker::transition_to(NMT_TrackingLevel level) { void MemTracker::error_report(outputStream* output) { if (tracking_level() >= NMT_summary) { report(true, output, MemReporterBase::default_scale); // just print summary for error case. + output->print("Preinit state:"); + NMTPreInit::print_state(output); } } @@ -214,9 +186,14 @@ void MemTracker::report(bool summary_only, outputStream* output, size_t scale) { void MemTracker::tuning_statistics(outputStream* out) { // NMT statistics out->print_cr("Native Memory Tracking Statistics:"); + out->print_cr("State: %s", NMTUtil::tracking_level_to_string(_tracking_level)); out->print_cr("Malloc allocation site table size: %d", MallocSiteTable::hash_buckets()); out->print_cr(" Tracking stack depth: %d", NMT_TrackingStackDepth); NOT_PRODUCT(out->print_cr("Peak concurrent access: %d", MallocSiteTable::access_peak_count());) out->cr(); MallocSiteTable::print_tuning_statistics(out); + out->cr(); + out->print_cr("Preinit state:"); + NMTPreInit::print_state(out); + out->cr(); } diff --git a/src/hotspot/share/services/memTracker.hpp b/src/hotspot/share/services/memTracker.hpp index b15bc1dcc26..d18746f452e 100644 --- a/src/hotspot/share/services/memTracker.hpp +++ b/src/hotspot/share/services/memTracker.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -115,42 +115,33 @@ class Tracker : public StackObj { class MemTracker : AllStatic { friend class VirtualMemoryTrackerTest; + // Helper; asserts that we are in post-NMT-init phase + static void assert_post_init() { + assert(is_initialized(), "NMT not yet initialized."); + } + public: + + // Initializes NMT to whatever -XX:NativeMemoryTracking says. + // - Can only be called once. + // - NativeMemoryTracking must be validated beforehand. + static void initialize(); + + // Returns true if NMT had been initialized. + static bool is_initialized() { + return _tracking_level != NMT_unknown; + } + static inline NMT_TrackingLevel tracking_level() { - if (_tracking_level == NMT_unknown) { - // No fencing is needed here, since JVM is in single-threaded - // mode. - _tracking_level = init_tracking_level(); - _cmdline_tracking_level = _tracking_level; - } return _tracking_level; } - // A late initialization, for the stuff(s) can not be - // done in init_tracking_level(), which can NOT malloc - // any memory. - static void init(); - - // Shutdown native memory tracking + // Shutdown native memory tracking. + // This transitions the tracking level: + // summary -> minimal + // detail -> minimal static void shutdown(); - // Verify native memory tracking command line option. - // This check allows JVM to detect if compatible launcher - // is used. - // If an incompatible launcher is used, NMT may not be - // able to start, even it is enabled by command line option. - // A warning message should be given if it is encountered. - static bool check_launcher_nmt_support(const char* value); - - // This method checks native memory tracking environment - // variable value passed by launcher. - // Launcher only obligated to pass native memory tracking - // option value, but not obligated to validate the value, - // and launcher has option to discard native memory tracking - // option from the command line once it sets up the environment - // variable, so NMT has to catch the bad value here. - static bool verify_nmt_option(); - // Transition the tracking level to specified level static bool transition_to(NMT_TrackingLevel level); @@ -207,8 +198,12 @@ class MemTracker : AllStatic { MallocTracker::record_arena_size_change(diff, flag); } + // Note: virtual memory operations should only ever be called after NMT initialization + // (we do not do any reservations before that). + static inline void record_virtual_memory_reserve(void* addr, size_t size, const NativeCallStack& stack, MEMFLAGS flag = mtNone) { + assert_post_init(); if (tracking_level() < NMT_summary) return; if (addr != NULL) { ThreadCritical tc; @@ -220,6 +215,7 @@ class MemTracker : AllStatic { static inline void record_virtual_memory_reserve_and_commit(void* addr, size_t size, const NativeCallStack& stack, MEMFLAGS flag = mtNone) { + assert_post_init(); if (tracking_level() < NMT_summary) return; if (addr != NULL) { ThreadCritical tc; @@ -231,6 +227,7 @@ class MemTracker : AllStatic { static inline void record_virtual_memory_commit(void* addr, size_t size, const NativeCallStack& stack) { + assert_post_init(); if (tracking_level() < NMT_summary) return; if (addr != NULL) { ThreadCritical tc; @@ -246,6 +243,7 @@ class MemTracker : AllStatic { // The two new memory regions will be both registered under stack and // memory flags of the original region. static inline void record_virtual_memory_split_reserved(void* addr, size_t size, size_t split) { + assert_post_init(); if (tracking_level() < NMT_summary) return; if (addr != NULL) { ThreadCritical tc; @@ -256,6 +254,7 @@ class MemTracker : AllStatic { } static inline void record_virtual_memory_type(void* addr, MEMFLAGS flag) { + assert_post_init(); if (tracking_level() < NMT_summary) return; if (addr != NULL) { ThreadCritical tc; @@ -265,6 +264,7 @@ class MemTracker : AllStatic { } static void record_thread_stack(void* addr, size_t size) { + assert_post_init(); if (tracking_level() < NMT_summary) return; if (addr != NULL) { ThreadStackTracker::new_thread_stack((address)addr, size, CALLER_PC); @@ -272,6 +272,7 @@ class MemTracker : AllStatic { } static inline void release_thread_stack(void* addr, size_t size) { + assert_post_init(); if (tracking_level() < NMT_summary) return; if (addr != NULL) { ThreadStackTracker::delete_thread_stack((address)addr, size); diff --git a/src/hotspot/share/services/nmtCommon.cpp b/src/hotspot/share/services/nmtCommon.cpp index b1ba545fb34..fda0d9dc01d 100644 --- a/src/hotspot/share/services/nmtCommon.cpp +++ b/src/hotspot/share/services/nmtCommon.cpp @@ -61,3 +61,27 @@ size_t NMTUtil::scale_from_name(const char* scale) { return K; } +const char* NMTUtil::tracking_level_to_string(NMT_TrackingLevel lvl) { + switch(lvl) { + case NMT_unknown: return "unknown"; break; + case NMT_off: return "off"; break; + case NMT_minimal: return "minimal"; break; + case NMT_summary: return "summary"; break; + case NMT_detail: return "detail"; break; + default: return "invalid"; break; + } +} + +// Returns the parsed level; NMT_unknown if string is invalid +NMT_TrackingLevel NMTUtil::parse_tracking_level(const char* s) { + if (s != NULL) { + if (strcmp(s, "summary") == 0) { + return NMT_summary; + } else if (strcmp(s, "detail") == 0) { + return NMT_detail; + } else if (strcmp(s, "off") == 0) { + return NMT_off; + } + } + return NMT_unknown; +} diff --git a/src/hotspot/share/services/nmtCommon.hpp b/src/hotspot/share/services/nmtCommon.hpp index 7d4f02f1217..10876976091 100644 --- a/src/hotspot/share/services/nmtCommon.hpp +++ b/src/hotspot/share/services/nmtCommon.hpp @@ -32,12 +32,52 @@ #define CALC_OBJ_SIZE_IN_TYPE(obj, type) (align_up(sizeof(obj), sizeof(type))/sizeof(type)) // Native memory tracking level +// +// The meaning of the different states: +// +// "unknown": pre-init phase (before parsing NMT arguments) +// +// "off": after initialization - NMT confirmed off. +// - nothing is tracked +// - no malloc headers are used +// +// "minimal": after shutdown - NMT had been on at some point but has been switched off +// - nothing is tracked +// - malloc headers are allocated but not initialized not used +// +// "summary": after initialization with NativeMemoryTracking=summary - NMT in summary mode +// - category summaries per tag are tracked +// - thread stacks are tracked +// - malloc headers are used +// - malloc call site table is allocated and used +// +// "detail": after initialization with NativeMemoryTracking=detail - NMT in detail mode +// - category summaries per tag are tracked +// - malloc details per call site are tracked +// - virtual memory mapping info is tracked +// - thread stacks are tracked +// - malloc headers are used +// - malloc call site table is allocated and used +// +// Valid state transitions: +// +// unknown ----> off +// | +// |--> summary -- +// | | +// |--> detail --+--> minimal +// + + +// Please keep relation of numerical values! +// unknown < off < minimal < summary < detail +// enum NMT_TrackingLevel { - NMT_unknown = 0xFF, - NMT_off = 0x00, - NMT_minimal = 0x01, - NMT_summary = 0x02, - NMT_detail = 0x03 + NMT_unknown = 0, + NMT_off = 1, + NMT_minimal = 2, + NMT_summary = 3, + NMT_detail = 4 }; // Number of stack frames to capture. This is a @@ -83,6 +123,14 @@ class NMTUtil : AllStatic { static size_t amount_in_scale(size_t amount, size_t scale) { return (amount + scale / 2) / scale; } + + // Parses the tracking level from a string. Returns NMT_unknown if + // string is not a valid level. + static NMT_TrackingLevel parse_tracking_level(const char* s); + + // Returns textual representation of a tracking level. + static const char* tracking_level_to_string(NMT_TrackingLevel level); + private: static const char* _memory_type_names[mt_number_of_types]; }; diff --git a/src/hotspot/share/services/nmtDCmd.cpp b/src/hotspot/share/services/nmtDCmd.cpp index 4d18090d32a..e89dd2c56e7 100644 --- a/src/hotspot/share/services/nmtDCmd.cpp +++ b/src/hotspot/share/services/nmtDCmd.cpp @@ -35,7 +35,7 @@ NMTDCmd::NMTDCmd(outputStream* output, bool heap): DCmdWithParser(output, heap), _summary("summary", "request runtime to report current memory summary, " \ "which includes total reserved and committed memory, along " \ - "with memory usage summary by each subsytem.", + "with memory usage summary by each subsystem.", "BOOLEAN", false, "false"), _detail("detail", "request runtime to report memory allocation >= " "1K by each callsite.", diff --git a/src/hotspot/share/services/nmtPreInit.cpp b/src/hotspot/share/services/nmtPreInit.cpp new file mode 100644 index 00000000000..1fdf4ba9d9f --- /dev/null +++ b/src/hotspot/share/services/nmtPreInit.cpp @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2021 SAP SE. All rights reserved. + * Copyright (c) 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. + * + */ + +#include "precompiled.hpp" +#include "runtime/os.hpp" +#include "services/nmtPreInit.hpp" +#include "utilities/align.hpp" +#include "utilities/debug.hpp" +#include "utilities/ostream.hpp" +#include "utilities/globalDefinitions.hpp" + +#if INCLUDE_NMT + +// Obviously we cannot use os::malloc for any dynamic allocation during pre-NMT-init, so we must use +// raw malloc; to make this very clear, wrap them. +static void* raw_malloc(size_t s) { return ::malloc(s); } +static void* raw_realloc(void* old, size_t s) { return ::realloc(old, s); } +static void raw_free(void* p) { ::free(p); } + +// We must ensure that the start of the payload area of the nmt lookup table nodes is malloc-aligned +static const size_t malloc_alignment = 2 * sizeof(void*); // could we use max_align_t? +STATIC_ASSERT(is_aligned(sizeof(NMTPreInitAllocation), malloc_alignment)); + +// --------- NMTPreInitAllocation -------------- + +NMTPreInitAllocation* NMTPreInitAllocation::do_alloc(size_t payload_size) { + const size_t outer_size = sizeof(NMTPreInitAllocation) + payload_size; + void* p = raw_malloc(outer_size); + NMTPreInitAllocation* a = new(p) NMTPreInitAllocation(payload_size); + return a; +} + +NMTPreInitAllocation* NMTPreInitAllocation::do_reallocate(NMTPreInitAllocation* old, size_t new_payload_size) { + assert(old->next == NULL, "unhang from map first"); + // We just reallocate the old block, header and all. + const size_t new_outer_size = sizeof(NMTPreInitAllocation) + new_payload_size; + void* p = raw_realloc(old, new_outer_size); + // re-stamp header with new size + NMTPreInitAllocation* a = new(p) NMTPreInitAllocation(new_payload_size); + return a; +} + +void NMTPreInitAllocation::do_free(NMTPreInitAllocation* p) { + assert(p->next == NULL, "unhang from map first"); + raw_free(p); +} + +// --------- NMTPreInitAllocationTable -------------- + +NMTPreInitAllocationTable::NMTPreInitAllocationTable() { + ::memset(_entries, 0, sizeof(_entries)); +} + +// print a string describing the current state +void NMTPreInitAllocationTable::print_state(outputStream* st) const { + // Collect some statistics and print them + int num_entries = 0; + int num_primary_entries = 0; + int longest_chain = 0; + size_t sum_bytes = 0; + for (int i = 0; i < table_size; i++) { + int chain_len = 0; + for (NMTPreInitAllocation* a = _entries[i]; a != NULL; a = a->next) { + chain_len++; + sum_bytes += a->size; + } + if (chain_len > 0) { + num_primary_entries++; + } + num_entries += chain_len; + longest_chain = MAX2(chain_len, longest_chain); + } + st->print("entries: %d (primary: %d, empties: %d), sum bytes: " SIZE_FORMAT + ", longest chain length: %d", + num_entries, num_primary_entries, table_size - num_primary_entries, + sum_bytes, longest_chain); +} + +#ifdef ASSERT +void NMTPreInitAllocationTable::print_map(outputStream* st) const { + for (int i = 0; i < table_size; i++) { + st->print("[%d]: ", i); + for (NMTPreInitAllocation* a = _entries[i]; a != NULL; a = a->next) { + st->print( PTR_FORMAT "(" SIZE_FORMAT ") ", p2i(a->payload()), a->size); + } + st->cr(); + } +} + +void NMTPreInitAllocationTable::verify() const { + // This verifies the buildup of the lookup table, including the load and the chain lengths. + // We should see chain lens of 0-1 under normal conditions. Under artificial conditions + // (20000 VM args) we should see maybe 6-7. From a certain length on we can be sure something + // is broken. + const int longest_acceptable_chain_len = 30; + int num_chains_too_long = 0; + for (index_t i = 0; i < table_size; i++) { + int len = 0; + for (const NMTPreInitAllocation* a = _entries[i]; a != NULL; a = a->next) { + index_t i2 = index_for_key(a->payload()); + assert(i2 == i, "wrong hash"); + assert(a->size > 0, "wrong size"); + len++; + // very paranoid: search for dups + bool found = false; + for (const NMTPreInitAllocation* a2 = _entries[i]; a2 != NULL; a2 = a2->next) { + if (a == a2) { + assert(!found, "dup!"); + found = true; + } + } + } + if (len > longest_acceptable_chain_len) { + num_chains_too_long++; + } + } + if (num_chains_too_long > 0) { + assert(false, "NMT preinit lookup table degenerated (%d/%d chains longer than %d)", + num_chains_too_long, table_size, longest_acceptable_chain_len); + } +} +#endif // ASSERT + +// --------- NMTPreinit -------------- + +NMTPreInitAllocationTable* NMTPreInit::_table = NULL; +bool NMTPreInit::_nmt_was_initialized = false; + +// Some statistics +unsigned NMTPreInit::_num_mallocs_pre = 0; +unsigned NMTPreInit::_num_reallocs_pre = 0; +unsigned NMTPreInit::_num_frees_pre = 0; + +void NMTPreInit::create_table() { + assert(_table == NULL, "just once"); + void* p = raw_malloc(sizeof(NMTPreInitAllocationTable)); + _table = new(p) NMTPreInitAllocationTable(); +} + +// Allocate with os::malloc (hidden to prevent having to include os.hpp) +void* NMTPreInit::do_os_malloc(size_t size) { + return os::malloc(size, mtNMT); +} + +// Switches from NMT pre-init state to NMT post-init state; +// in post-init, no modifications to the lookup table are possible. +void NMTPreInit::pre_to_post() { + assert(_nmt_was_initialized == false, "just once"); + _nmt_was_initialized = true; + DEBUG_ONLY(verify();) +} + +#ifdef ASSERT +void NMTPreInit::verify() { + if (_table != NULL) { + _table->verify(); + } + assert(_num_reallocs_pre <= _num_mallocs_pre && + _num_frees_pre <= _num_mallocs_pre, "stats are off"); +} +#endif // ASSERT + +void NMTPreInit::print_state(outputStream* st) { + if (_table != NULL) { + _table->print_state(st); + st->cr(); + } + st->print_cr("pre-init mallocs: %u, pre-init reallocs: %u, pre-init frees: %u", + _num_mallocs_pre, _num_reallocs_pre, _num_frees_pre); +} + +#endif // INCLUDE_NMT diff --git a/src/hotspot/share/services/nmtPreInit.hpp b/src/hotspot/share/services/nmtPreInit.hpp new file mode 100644 index 00000000000..eed25191135 --- /dev/null +++ b/src/hotspot/share/services/nmtPreInit.hpp @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2021 SAP SE. All rights reserved. + * Copyright (c) 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. + * + */ + +#ifndef SHARE_SERVICES_NMT_PREINIT_HPP +#define SHARE_SERVICES_NMT_PREINIT_HPP + +#include "memory/allStatic.hpp" +#ifdef ASSERT +#include "runtime/atomic.hpp" +#endif +#include "utilities/debug.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/macros.hpp" + +#if INCLUDE_NMT + +class outputStream; + +// NMTPreInit is the solution to a specific problem: +// +// NMT tracks C-heap allocations (os::malloc and friends). Those can happen at all VM life stages, +// including very early during the dynamic C++ initialization of the hotspot, and in CreateJavaVM +// before argument parsing. +// +// However, before the VM parses NMT arguments, we do not know whether NMT is enabled or not. Can we +// just ignore early allocations? If the only problem were statistical correctness, sure: footprint-wise +// they are not really relevant. +// +// But there is one big problem: NMT uses malloc headers to keep meta information of malloced blocks. +// We have to consider those in os::free() when calling free(3). +// +// So: +// 1) NMT off: +// a) pre-NMT-init allocations have no header +// b) post-NMT-init allocations have no header +// 2) NMT on: +// a) pre-NMT-init allocations have no header +// b) post-NMT-init allocations do have a header +// +// The problem is that inside os::free(p), we only get an opaque void* p; we do not know if p had been +// allocated in (a) or (b) phase. Therefore, we do not know if p is preceded by an NMT header which we +// would need to subtract from the pointer before calling free(3). There is no safe way to "guess" here +// without risking C-heap corruption. +// +// To solve this, we need a way to quickly determine, at os::free(p), whether p was a pre-NMT-init +// allocation. There are several ways to do this, see discussion under JDK-8256844. +// +// One of the easiest and most elegant ways is to store early allocation pointers in a lookup table. +// This is what NMTPreInit does. +// +////////////////////////////////////////////////////////////////////////// +// +// VM initialization wrt NMT: +// +//--------------------------------------------------------------- +//-> launcher dlopen's libjvm ^ +// -> dynamic C++ initialization | +// of libjvm | +// | +//-> launcher starts new thread (maybe) NMT pre-init phase : store allocated pointers in lookup table +// | +//-> launcher invokes CreateJavaVM | +// -> VM initialization before arg parsing | +// -> VM argument parsing v +// -> NMT initialization ------------------------------------- +// ^ +// ... | +// -> VM life... NMT post-init phase : lookup table is read-only; use it in os::free() and os::realloc(). +// ... | +// v +//---------------------------------------------------------------- +// +////////////////////////////////////////////////////////////////////////// +// +// Notes: +// - The VM will malloc() and realloc() several thousand times before NMT initialization. +// Starting with a lot of arguments increases this number since argument parsing strdups +// around a lot. +// - However, *surviving* allocations (allocations not freed immediately) are much rarer: +// typically only about 300-500. Again, mainly depending on the number of VM args. +// - There are a few cases of pre-to-post-init reallocs where pre-init allocations get +// reallocated after NMT initialization. Those we need to handle with special care (see +// NMTPreInit::handle_realloc()). Because of them we need to store allocation size with +// every pre-init allocation. + +// For the lookup table, design considerations are: +// - lookup speed is paramount since lookup is done for every os::free() call. +// - insert/delete speed only matters for VM startup - after NMT initialization the lookup +// table is readonly +// - memory consumption of the lookup table matters since we always pay for it, NMT on or off. +// - Obviously, nothing here can use *os::malloc*. Any dynamic allocations - if they cannot +// be avoided - should use raw malloc(3). +// +// We use a basic open hashmap, dimensioned generously - hash collisions should be very rare. +// The table is customized for holding malloced pointers. One main point of this map is that we do +// not allocate memory for the nodes themselves. Instead we piggy-back on the user allocation: +// the hashmap entry structure precedes, as a header, the malloced block. That way we avoid extra +// allocations just to hold the map nodes. This keeps runtime/memory overhead as small as possible. + +struct NMTPreInitAllocation { + NMTPreInitAllocation* next; + const size_t size; // (inner) payload size without header + // <-- USER ALLOCATION (PAYLOAD) STARTS HERE --> + + NMTPreInitAllocation(size_t size) : next(NULL), size(size) {}; + + // Returns start of the user data area + void* payload() { return this + 1; } + const void* payload() const { return this + 1; } + + // These functions do raw-malloc/realloc/free a C-heap block of given payload size, + // preceded with a NMTPreInitAllocation header. + static NMTPreInitAllocation* do_alloc(size_t payload_size); + static NMTPreInitAllocation* do_reallocate(NMTPreInitAllocation* old, size_t new_payload_size); + static void do_free(NMTPreInitAllocation* p); +}; + +class NMTPreInitAllocationTable { + + // Table_size: keep table size a prime and the hash function simple; this + // seems to give a good distribution for malloced pointers on all our libc variants. + // 8000ish is really plenty: normal VM runs have ~500 pre-init allocations to hold, + // VMs with insanely long command lines maybe ~700-1000. Which gives us an expected + // load factor of ~.1. Hash collisions should be very rare. + // ~8000 entries cost us ~64K for this table (64-bit), which is acceptable. + static const int table_size = 7919; + + NMTPreInitAllocation* _entries[table_size]; + + typedef int index_t; + const index_t invalid_index = -1; + + static unsigned calculate_hash(const void* p) { + uintptr_t tmp = p2i(p); + unsigned hash = (unsigned)tmp + LP64_ONLY( ^ (unsigned)(tmp >> 32)); + return hash; + } + + static index_t index_for_key(const void* p) { + const unsigned hash = calculate_hash(p); + return hash % table_size; + } + + const NMTPreInitAllocation* const * find_entry(const void* p) const { + return const_cast(this)->find_entry(p); + } + + NMTPreInitAllocation** find_entry(const void* p) { + const unsigned index = index_for_key(p); + NMTPreInitAllocation** aa = (&(_entries[index])); + while ((*aa) != NULL && (*aa)->payload() != p) { + aa = &((*aa)->next); + } + assert((*aa) == NULL || p == (*aa)->payload(), + "retrieve mismatch " PTR_FORMAT " vs " PTR_FORMAT ".", + p2i(p), p2i((*aa)->payload())); + return aa; + } + +public: + + NMTPreInitAllocationTable(); + + // Adds an entry to the table + void add(NMTPreInitAllocation* a) { + void* payload = a->payload(); + const unsigned index = index_for_key(payload); + assert(a->next == NULL, "entry already in table?"); + a->next = _entries[index]; // add to front + _entries[index] = a; // of list + assert(find(payload) == a, "add: reverse lookup error?"); + } + + // Find - but does not remove - an entry in this map. + // Returns NULL if not found. + const NMTPreInitAllocation* find(const void* p) const { + return *(find_entry(p)); + } + + // Find and removes an entry from the table. Asserts if not found. + NMTPreInitAllocation* find_and_remove(void* p) { + NMTPreInitAllocation** aa = find_entry(p); + assert((*aa) != NULL, "Entry not found: " PTR_FORMAT, p2i(p)); + NMTPreInitAllocation* a = (*aa); + (*aa) = (*aa)->next; // remove from its list + DEBUG_ONLY(a->next = NULL;) // mark as removed + return a; + } + + void print_state(outputStream* st) const; + DEBUG_ONLY(void print_map(outputStream* st) const;) + DEBUG_ONLY(void verify() const;) +}; + +// NMTPreInit is the outside interface to all of NMT preinit handling. +class NMTPreInit : public AllStatic { + + static NMTPreInitAllocationTable* _table; + static bool _nmt_was_initialized; + + // Some statistics + static unsigned _num_mallocs_pre; // Number of pre-init mallocs + static unsigned _num_reallocs_pre; // Number of pre-init reallocs + static unsigned _num_frees_pre; // Number of pre-init frees + + static void create_table(); + + static void add_to_map(NMTPreInitAllocation* a) { + assert(!_nmt_was_initialized, "lookup map cannot be modified after NMT initialization"); + // Only on add, we create the table on demand. Only needed on add, since everything should start + // with a call to os::malloc(). + if (_table == NULL) { + create_table(); + } + return _table->add(a); + } + + static const NMTPreInitAllocation* find_in_map(void* p) { + assert(_table != NULL, "stray allocation?"); + return _table->find(p); + } + + static NMTPreInitAllocation* find_and_remove_in_map(void* p) { + assert(!_nmt_was_initialized, "lookup map cannot be modified after NMT initialization"); + assert(_table != NULL, "stray allocation?"); + return _table->find_and_remove(p); + } + + // Just a wrapper for os::malloc to avoid including os.hpp here. + static void* do_os_malloc(size_t size); + +public: + + // Switches from NMT pre-init state to NMT post-init state; + // in post-init, no modifications to the lookup table are possible. + static void pre_to_post(); + + // Returns true if we are still in pre-init phase, false if post-init + static bool in_preinit_phase() { return _nmt_was_initialized == false; } + + // Called from os::malloc. + // Returns true if allocation was handled here; in that case, + // *rc contains the return address. + static bool handle_malloc(void** rc, size_t size) { + size = MAX2((size_t)1, size); // malloc(0) + if (!_nmt_was_initialized) { + // pre-NMT-init: + // Allocate entry and add address to lookup table + NMTPreInitAllocation* a = NMTPreInitAllocation::do_alloc(size); + add_to_map(a); + (*rc) = a->payload(); + _num_mallocs_pre++; + return true; + } + return false; + } + + // Called from os::realloc. + // Returns true if reallocation was handled here; in that case, + // *rc contains the return address. + static bool handle_realloc(void** rc, void* old_p, size_t new_size) { + if (old_p == NULL) { // realloc(NULL, n) + return handle_malloc(rc, new_size); + } + new_size = MAX2((size_t)1, new_size); // realloc(.., 0) + if (!_nmt_was_initialized) { + // pre-NMT-init: + // - the address must already be in the lookup table + // - find the old entry, remove from table, reallocate, add to table + NMTPreInitAllocation* a = find_and_remove_in_map(old_p); + a = NMTPreInitAllocation::do_reallocate(a, new_size); + add_to_map(a); + (*rc) = a->payload(); + _num_reallocs_pre++; + return true; + } else { + // post-NMT-init: + // If the old block was allocated during pre-NMT-init, we must relocate it: the + // new block must be allocated with "normal" os::malloc. + // We do this by: + // - look up (but not remove! lu table is read-only here.) the old entry + // - allocate new memory via os::malloc() + // - manually copy the old content over + // - return the new memory + // - The lu table is readonly so we keep the old address in the table. And we leave + // the old block allocated too, to prevent the libc from returning the same address + // and confusing us. + const NMTPreInitAllocation* a = find_in_map(old_p); + if (a != NULL) { // this was originally a pre-init allocation + void* p_new = do_os_malloc(new_size); + ::memcpy(p_new, a->payload(), MIN2(a->size, new_size)); + (*rc) = p_new; + return true; + } + } + return false; + } + + // Called from os::free. + // Returns true if free was handled here. + static bool handle_free(void* p) { + if (p == NULL) { // free(NULL) + return true; + } + if (!_nmt_was_initialized) { + // pre-NMT-init: + // - the allocation must be in the hash map, since all allocations went through + // NMTPreInit::handle_malloc() + // - find the old entry, unhang from map, free it + NMTPreInitAllocation* a = find_and_remove_in_map(p); + NMTPreInitAllocation::do_free(a); + _num_frees_pre++; + return true; + } else { + // post-NMT-init: + // - look up (but not remove! lu table is read-only here.) the entry + // - if found, we do nothing: the lu table is readonly, so we keep the old address + // in the table. We leave the block allocated to prevent the libc from returning + // the same address and confusing us. + // - if not found, we let regular os::free() handle this pointer + if (find_in_map(p) != NULL) { + return true; + } + } + return false; + } + + static void print_state(outputStream* st); + static void print_map(outputStream* st); + DEBUG_ONLY(static void verify();) +}; + +#endif // INCLUDE_NMT + +#endif // SHARE_SERVICES_NMT_PREINIT_HPP + diff --git a/src/hotspot/share/services/threadService.cpp b/src/hotspot/share/services/threadService.cpp index 494ca337cf4..31c4f5c91ba 100644 --- a/src/hotspot/share/services/threadService.cpp +++ b/src/hotspot/share/services/threadService.cpp @@ -874,7 +874,10 @@ void ThreadSnapshot::initialize(ThreadsList * t_list, JavaThread* thread) { _sleep_ticks = stat->sleep_ticks(); _sleep_count = stat->sleep_count(); - _thread_status = java_lang_Thread::get_thread_status(threadObj); + // If thread is still attaching then threadObj will be NULL. + _thread_status = threadObj == NULL ? JavaThreadStatus::NEW + : java_lang_Thread::get_thread_status(threadObj); + _is_suspended = thread->is_suspended(); _is_in_native = (thread->thread_state() == _thread_in_native); diff --git a/src/hotspot/share/services/threadStackTracker.cpp b/src/hotspot/share/services/threadStackTracker.cpp index cfc80b24a2d..b426e81613b 100644 --- a/src/hotspot/share/services/threadStackTracker.cpp +++ b/src/hotspot/share/services/threadStackTracker.cpp @@ -33,7 +33,7 @@ volatile size_t ThreadStackTracker::_thread_count = 0; SortedLinkedList* ThreadStackTracker::_simple_thread_stacks = NULL; -bool ThreadStackTracker::late_initialize(NMT_TrackingLevel level) { +bool ThreadStackTracker::initialize(NMT_TrackingLevel level) { if (level == NMT_detail && !track_as_vm()) { _simple_thread_stacks = new (std::nothrow, ResourceObj::C_HEAP, mtNMT) SortedLinkedList(); diff --git a/src/hotspot/share/services/threadStackTracker.hpp b/src/hotspot/share/services/threadStackTracker.hpp index d628e7633d9..3eee93cd71c 100644 --- a/src/hotspot/share/services/threadStackTracker.hpp +++ b/src/hotspot/share/services/threadStackTracker.hpp @@ -71,8 +71,7 @@ class ThreadStackTracker : AllStatic { static int compare_thread_stack_base(const SimpleThreadStackSite& s1, const SimpleThreadStackSite& s2); static SortedLinkedList* _simple_thread_stacks; public: - // Late phase initialization - static bool late_initialize(NMT_TrackingLevel level); + static bool initialize(NMT_TrackingLevel level); static bool transition(NMT_TrackingLevel from, NMT_TrackingLevel to); static void new_thread_stack(void* base, size_t size, const NativeCallStack& stack); diff --git a/src/hotspot/share/services/virtualMemoryTracker.cpp b/src/hotspot/share/services/virtualMemoryTracker.cpp index 038e130f6ed..f9909f9e569 100644 --- a/src/hotspot/share/services/virtualMemoryTracker.cpp +++ b/src/hotspot/share/services/virtualMemoryTracker.cpp @@ -320,14 +320,9 @@ address ReservedMemoryRegion::thread_stack_uncommitted_bottom() const { } bool VirtualMemoryTracker::initialize(NMT_TrackingLevel level) { + assert(_reserved_regions == NULL, "only call once"); if (level >= NMT_summary) { VirtualMemorySummary::initialize(); - } - return true; -} - -bool VirtualMemoryTracker::late_initialize(NMT_TrackingLevel level) { - if (level >= NMT_summary) { _reserved_regions = new (std::nothrow, ResourceObj::C_HEAP, mtNMT) SortedLinkedList(); return (_reserved_regions != NULL); diff --git a/src/hotspot/share/services/virtualMemoryTracker.hpp b/src/hotspot/share/services/virtualMemoryTracker.hpp index 09b21bf8118..a7948f67447 100644 --- a/src/hotspot/share/services/virtualMemoryTracker.hpp +++ b/src/hotspot/share/services/virtualMemoryTracker.hpp @@ -371,9 +371,6 @@ class VirtualMemoryTracker : AllStatic { public: static bool initialize(NMT_TrackingLevel level); - // Late phase initialization - static bool late_initialize(NMT_TrackingLevel level); - static bool add_reserved_region (address base_addr, size_t size, const NativeCallStack& stack, MEMFLAGS flag = mtNone); static bool add_committed_region (address base_addr, size_t size, const NativeCallStack& stack); diff --git a/src/hotspot/share/utilities/resizeableResourceHash.hpp b/src/hotspot/share/utilities/resizeableResourceHash.hpp index 240349271b8..5a0b6540f34 100644 --- a/src/hotspot/share/utilities/resizeableResourceHash.hpp +++ b/src/hotspot/share/utilities/resizeableResourceHash.hpp @@ -78,11 +78,11 @@ template< > class ResizeableResourceHashtable : public ResourceHashtableBase< ResizeableResourceHashtableStorage, - K, V, HASH, EQUALS, ALLOC_TYPE, MEM_TYPE> { + K, V, ALLOC_TYPE, MEM_TYPE, HASH, EQUALS> { unsigned _max_size; using BASE = ResourceHashtableBase, - K, V, HASH, EQUALS, ALLOC_TYPE, MEM_TYPE>; + K, V, ALLOC_TYPE, MEM_TYPE, HASH, EQUALS>; using Node = ResourceHashtableNode; NONCOPYABLE(ResizeableResourceHashtable); public: diff --git a/src/hotspot/share/utilities/resourceHash.hpp b/src/hotspot/share/utilities/resourceHash.hpp index c01193ccd69..88c9068eab4 100644 --- a/src/hotspot/share/utilities/resourceHash.hpp +++ b/src/hotspot/share/utilities/resourceHash.hpp @@ -46,17 +46,22 @@ class ResourceHashtableNode : public ResourceObj { template< class STORAGE, typename K, typename V, - unsigned (*HASH) (K const&), - bool (*EQUALS)(K const&, K const&), ResourceObj::allocation_type ALLOC_TYPE, - MEMFLAGS MEM_TYPE + MEMFLAGS MEM_TYPE, + unsigned (*HASH) (K const&), + bool (*EQUALS)(K const&, K const&) > class ResourceHashtableBase : public STORAGE { using Node = ResourceHashtableNode; private: int _number_of_entries; - Node** bucket_at(unsigned index) const { + Node** bucket_at(unsigned index) { + Node** t = table(); + return &t[index]; + } + + const Node* const* bucket_at(unsigned index) const { Node** t = table(); return &t[index]; } @@ -210,6 +215,32 @@ class ResourceHashtableBase : public STORAGE { ++bucket; } } + + // ITER contains bool do_entry(K const&, V const&), which will be + // called for each entry in the table. If do_entry() returns true, + // the entry is deleted. + template + void unlink(ITER* iter) { + const unsigned sz = table_size(); + for (unsigned index = 0; index < sz; index++) { + Node** ptr = bucket_at(index); + while (*ptr != NULL) { + Node* node = *ptr; + // do_entry must clean up the key and value in Node. + bool clean = iter->do_entry(node->_key, node->_value); + if (clean) { + *ptr = node->_next; + if (ALLOC_TYPE == ResourceObj::C_HEAP) { + delete node; + } + _number_of_entries --; + } else { + ptr = &(node->_next); + } + } + } + } + }; template @@ -232,19 +263,19 @@ class FixedResourceHashtableStorage : public ResourceObj { template< typename K, typename V, - unsigned (*HASH) (K const&) = primitive_hash, - bool (*EQUALS)(K const&, K const&) = primitive_equals, unsigned SIZE = 256, ResourceObj::allocation_type ALLOC_TYPE = ResourceObj::RESOURCE_AREA, - MEMFLAGS MEM_TYPE = mtInternal + MEMFLAGS MEM_TYPE = mtInternal, + unsigned (*HASH) (K const&) = primitive_hash, + bool (*EQUALS)(K const&, K const&) = primitive_equals > class ResourceHashtable : public ResourceHashtableBase< FixedResourceHashtableStorage, - K, V, HASH, EQUALS, ALLOC_TYPE, MEM_TYPE> { + K, V, ALLOC_TYPE, MEM_TYPE, HASH, EQUALS> { NONCOPYABLE(ResourceHashtable); public: ResourceHashtable() : ResourceHashtableBase, - K, V, HASH, EQUALS, ALLOC_TYPE, MEM_TYPE>() {} + K, V, ALLOC_TYPE, MEM_TYPE, HASH, EQUALS>() {} }; #endif // SHARE_UTILITIES_RESOURCEHASH_HPP diff --git a/src/java.base/share/classes/java/io/ObjectInputFilter.java b/src/java.base/share/classes/java/io/ObjectInputFilter.java index 88eb34915b5..50a3e76d5b0 100644 --- a/src/java.base/share/classes/java/io/ObjectInputFilter.java +++ b/src/java.base/share/classes/java/io/ObjectInputFilter.java @@ -207,13 +207,13 @@ * // Called from the OIS constructor or perhaps OIS.setObjectInputFilter with no current filter * var filter = filterThreadLocal.get(); * if (filter != null) { - * // Prepend a filter to reject all UNDECIDED results + * // Wrap the filter to reject UNDECIDED results * filter = ObjectInputFilter.rejectUndecidedClass(filter); * } * if (next != null) { - * // Prepend the next filter to the thread filter, if any + * // Merge the next filter with the thread filter, if any * // Initially this is the static JVM-wide filter passed from the OIS constructor - * // Append the filter to reject all UNDECIDED results + * // Wrap the filter to reject UNDECIDED results * filter = ObjectInputFilter.merge(next, filter); * filter = ObjectInputFilter.rejectUndecidedClass(filter); * } @@ -222,7 +222,7 @@ * // Called from OIS.setObjectInputFilter with a current filter and a stream-specific filter. * // The curr filter already incorporates the thread filter and static JVM-wide filter * // and rejection of undecided classes - * // If there is a stream-specific filter prepend it and a filter to recheck for undecided + * // If there is a stream-specific filter wrap it and a filter to recheck for undecided * if (next != null) { * next = ObjectInputFilter.merge(next, curr); * next = ObjectInputFilter.rejectUndecidedClass(next); diff --git a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java index 237817f2e49..d2aad947513 100644 --- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java +++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java @@ -349,9 +349,8 @@ public void setLength(int newLength) { */ @Override public char charAt(int index) { - checkIndex(index, count); if (isLatin1()) { - return (char)(value[index] & 0xff); + return StringLatin1.charAt(value, index); } return StringUTF16.charAt(value, index); } diff --git a/src/java.base/share/classes/java/lang/Boolean.java b/src/java.base/share/classes/java/lang/Boolean.java index 0397277e68f..ba88157dc92 100644 --- a/src/java.base/share/classes/java/lang/Boolean.java +++ b/src/java.base/share/classes/java/lang/Boolean.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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 @@ -205,7 +205,7 @@ public static Boolean valueOf(String s) { * @since 1.4 */ public static String toString(boolean b) { - return b ? "true" : "false"; + return String.valueOf(b); } /** @@ -216,8 +216,9 @@ public static String toString(boolean b) { * * @return a string representation of this object. */ + @Override public String toString() { - return value ? "true" : "false"; + return String.valueOf(value); } /** diff --git a/src/java.base/share/classes/java/lang/Byte.java b/src/java.base/share/classes/java/lang/Byte.java index c80a6fc9fe0..cfd379bf64f 100644 --- a/src/java.base/share/classes/java/lang/Byte.java +++ b/src/java.base/share/classes/java/lang/Byte.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -90,7 +90,7 @@ public final class Byte extends Number implements Comparable, Constable { * @see java.lang.Integer#toString(int) */ public static String toString(byte b) { - return Integer.toString((int)b, 10); + return Integer.toString(b); } /** @@ -436,8 +436,9 @@ public double doubleValue() { * @return a string representation of the value of this object in * base 10. */ + @Override public String toString() { - return Integer.toString((int)value); + return Integer.toString(value); } /** diff --git a/src/java.base/share/classes/java/lang/Character.java b/src/java.base/share/classes/java/lang/Character.java index 2f196548237..8f3b633f75a 100644 --- a/src/java.base/share/classes/java/lang/Character.java +++ b/src/java.base/share/classes/java/lang/Character.java @@ -8657,6 +8657,7 @@ public boolean equals(Object obj) { * * @return a string representation of this object. */ + @Override public String toString() { return String.valueOf(value); } diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java index 6d75c33c3de..863efd05abf 100644 --- a/src/java.base/share/classes/java/lang/Class.java +++ b/src/java.base/share/classes/java/lang/Class.java @@ -233,9 +233,19 @@ private Class(ClassLoader loader, Class arrayComponentType) { * @return a string representation of this {@code Class} object. */ public String toString() { - return (isPrimitiveClass() ? "primitive " : "") - + (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) - + getName() + (isPrimitiveClass() && isPrimaryType() ? ".ref" : ""); + String s = isPrimitive() ? "" : "class "; + if (isInterface()) { + s = "interface "; + } + if (isPrimitiveClass()) { + s = "primitive "; + } + // Avoid invokedynamic based String concat, might be not available + s = s.concat(getName()); + if (isPrimitiveClass() && isPrimaryType()) { + s.concat(".ref"); + } + return s; } /** @@ -619,7 +629,7 @@ public Class asValueType() { if (isPrimitiveClass()) return secondaryType; - throw new UnsupportedOperationException(this.getName() + " is not a primitive class"); + throw new UnsupportedOperationException(this.getName().concat(" is not a primitive class")); } /** @@ -1016,7 +1026,7 @@ public String getName() { @CallerSensitive @ForceInline // to ensure Reflection.getCallerClass optimization public ClassLoader getClassLoader() { - ClassLoader cl = getClassLoader0(); + ClassLoader cl = classLoader; if (cl == null) return null; @SuppressWarnings("removal") @@ -1165,7 +1175,7 @@ public Package getPackage() { if (isPrimitive() || isArray()) { return null; } - ClassLoader cl = getClassLoader0(); + ClassLoader cl = classLoader; return cl != null ? cl.definePackage(this) : BootLoader.definePackage(this); } @@ -1779,7 +1789,7 @@ public String getSimpleName() { private String getSimpleName0() { if (isArray()) { - return getComponentType().getSimpleName() + "[]"; + return getComponentType().getSimpleName().concat("[]"); } String simpleName = getSimpleBinaryName(); if (simpleName == null) { // top level class @@ -1804,12 +1814,12 @@ public String getTypeName() { dimensions++; cl = cl.getComponentType(); } while (cl.isArray()); - return cl.getTypeName() + "[]".repeat(dimensions); + return cl.getTypeName().concat("[]".repeat(dimensions)); } catch (Throwable e) { /*FALLTHRU*/ } } if (isPrimitiveClass()) { // TODO: null-default - return isPrimaryType() ? getName() + ".ref" : getName(); + return isPrimaryType() ? getName().concat(".ref") : getName(); } else { return getName(); } @@ -1844,7 +1854,7 @@ private String getCanonicalName0() { if (isArray()) { String canonicalName = getComponentType().getCanonicalName(); if (canonicalName != null) - return canonicalName + "[]"; + return canonicalName.concat("[]"); else return ReflectionData.NULL_SENTINEL; } @@ -2950,7 +2960,7 @@ public InputStream getResourceAsStream(String name) { // resource not encapsulated or in package open to caller String mn = thisModule.getName(); - ClassLoader cl = getClassLoader0(); + ClassLoader cl = classLoader; try { // special-case built-in class loaders to avoid the @@ -2970,7 +2980,7 @@ public InputStream getResourceAsStream(String name) { } // unnamed module - ClassLoader cl = getClassLoader0(); + ClassLoader cl = classLoader; if (cl == null) { return ClassLoader.getSystemResourceAsStream(name); } else { @@ -3046,7 +3056,7 @@ public URL getResource(String name) { // resource not encapsulated or in package open to caller String mn = thisModule.getName(); - ClassLoader cl = getClassLoader0(); + ClassLoader cl = classLoader; try { if (cl == null) { return BootLoader.findResource(mn, name); @@ -3059,7 +3069,7 @@ public URL getResource(String name) { } // unnamed module - ClassLoader cl = getClassLoader0(); + ClassLoader cl = classLoader; if (cl == null) { return ClassLoader.getSystemResource(name); } else { @@ -3173,7 +3183,7 @@ private void checkMemberAccess(@SuppressWarnings("removal") SecurityManager sm, */ final ClassLoader ccl = ClassLoader.getClassLoader(caller); if (which != Member.PUBLIC) { - final ClassLoader cl = getClassLoader0(); + final ClassLoader cl = classLoader; if (ccl != cl) { sm.checkPermission(SecurityConstants.CHECK_MEMBER_ACCESS_PERMISSION); } @@ -3190,7 +3200,7 @@ private void checkMemberAccess(@SuppressWarnings("removal") SecurityManager sm, */ private void checkPackageAccess(@SuppressWarnings("removal") SecurityManager sm, final ClassLoader ccl, boolean checkProxyInterfaces) { - final ClassLoader cl = getClassLoader0(); + final ClassLoader cl = classLoader; if (ReflectUtil.needsPackageAccessCheck(ccl, cl)) { String pkg = this.getPackageName(); @@ -3219,7 +3229,7 @@ private void checkPackageAccess(@SuppressWarnings("removal") SecurityManager sm, */ private static void checkPackageAccessForPermittedSubclasses(@SuppressWarnings("removal") SecurityManager sm, final ClassLoader ccl, Class[] subClasses) { - final ClassLoader cl = subClasses[0].getClassLoader0(); + final ClassLoader cl = subClasses[0].classLoader; if (ReflectUtil.needsPackageAccessCheck(ccl, cl)) { Set packages = new HashSet<>(); @@ -3844,7 +3854,7 @@ private String methodToString(String name, Class[] argTypes) { * @since 1.4 */ public boolean desiredAssertionStatus() { - ClassLoader loader = getClassLoader0(); + ClassLoader loader = classLoader; // If the loader is null this is a system class, so ask the VM if (loader == null) return desiredAssertionStatus0(this); diff --git a/src/java.base/share/classes/java/lang/Double.java b/src/java.base/share/classes/java/lang/Double.java index 9d57960d0c7..dbb8770f485 100644 --- a/src/java.base/share/classes/java/lang/Double.java +++ b/src/java.base/share/classes/java/lang/Double.java @@ -877,8 +877,7 @@ public int hashCode() { * @since 1.8 */ public static int hashCode(double value) { - long bits = doubleToLongBits(value); - return (int)(bits ^ (bits >>> 32)); + return Long.hashCode(doubleToLongBits(value)); } /** diff --git a/src/java.base/share/classes/java/lang/Short.java b/src/java.base/share/classes/java/lang/Short.java index 00d4a91d37b..89f55d44d86 100644 --- a/src/java.base/share/classes/java/lang/Short.java +++ b/src/java.base/share/classes/java/lang/Short.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -89,7 +89,7 @@ public final class Short extends Number implements Comparable, Constable * @see java.lang.Integer#toString(int) */ public static String toString(short s) { - return Integer.toString((int)s, 10); + return Integer.toString(s); } /** @@ -441,8 +441,9 @@ public double doubleValue() { * @return a string representation of the value of this object in * base 10. */ + @Override public String toString() { - return Integer.toString((int)value); + return Integer.toString(value); } /** diff --git a/src/java.base/share/classes/java/lang/StringLatin1.java b/src/java.base/share/classes/java/lang/StringLatin1.java index 944fbeeb712..63e906c1dc4 100644 --- a/src/java.base/share/classes/java/lang/StringLatin1.java +++ b/src/java.base/share/classes/java/lang/StringLatin1.java @@ -27,11 +27,9 @@ import java.util.Arrays; import java.util.Locale; -import java.util.Objects; import java.util.Spliterator; import java.util.function.Consumer; import java.util.function.IntConsumer; -import java.util.stream.IntStream; import java.util.stream.Stream; import java.util.stream.StreamSupport; import jdk.internal.util.ArraysSupport; diff --git a/src/java.base/share/classes/java/lang/Thread.java b/src/java.base/share/classes/java/lang/Thread.java index c13b42c2f6f..33647db8f6b 100644 --- a/src/java.base/share/classes/java/lang/Thread.java +++ b/src/java.base/share/classes/java/lang/Thread.java @@ -417,14 +417,14 @@ private Thread(ThreadGroup g, Runnable target, String name, } } - /* checkAccess regardless of whether or not threadgroup is - explicitly passed in. */ - g.checkAccess(); - /* * Do we have the required permissions? */ if (security != null) { + /* checkAccess regardless of whether or not threadgroup is + explicitly passed in. */ + security.checkAccess(g); + if (isCCLOverridden(getClass())) { security.checkPermission( SecurityConstants.SUBCLASS_IMPLEMENTATION_PERMISSION); 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 8a150af2c40..e8684991dfc 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -230,7 +230,7 @@ public static Lookup privateLookupIn(Class targetClass, Lookup caller) throws @SuppressWarnings("removal") SecurityManager sm = System.getSecurityManager(); - if (sm != null) sm.checkPermission(ACCESS_PERMISSION); + if (sm != null) sm.checkPermission(SecurityConstants.ACCESS_PERMISSION); if (targetClass.isPrimitive()) throw new IllegalArgumentException(targetClass + " is a primitive class"); if (targetClass.isArray()) @@ -443,13 +443,10 @@ public static T classDataAt(Lookup caller, String name, Class type, int i public static T reflectAs(Class expected, MethodHandle target) { @SuppressWarnings("removal") SecurityManager smgr = System.getSecurityManager(); - if (smgr != null) smgr.checkPermission(ACCESS_PERMISSION); + if (smgr != null) smgr.checkPermission(SecurityConstants.ACCESS_PERMISSION); Lookup lookup = Lookup.IMPL_LOOKUP; // use maximally privileged lookup return lookup.revealDirect(target).reflectAs(expected, lookup); } - // Copied from AccessibleObject, as used by Method.setAccessible, etc.: - private static final java.security.Permission ACCESS_PERMISSION = - new ReflectPermission("suppressAccessChecks"); /** * A lookup object is a factory for creating method handles, diff --git a/src/java.base/share/classes/java/lang/reflect/Proxy.java b/src/java.base/share/classes/java/lang/reflect/Proxy.java index fcc0a6d79f8..c4d0663ea24 100644 --- a/src/java.base/share/classes/java/lang/reflect/Proxy.java +++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java @@ -527,7 +527,7 @@ private static Class defineProxyClass(Module m, List> interfaces) { if (proxyPkg == null) { // all proxy interfaces are public and exported if (!m.isNamed()) - throw new InternalError("ununamed module: " + m); + throw new InternalError("unnamed module: " + m); proxyPkg = nonExported ? PROXY_PACKAGE_PREFIX + "." + m.getName() : m.getName(); } else if (proxyPkg.isEmpty() && m.isNamed()) { 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 e4729780581..6d25f9d5e41 100644 --- a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java +++ b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java @@ -41,7 +41,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -245,7 +244,7 @@ private static void checkReturnTypes(List methods) { * List of return types that are not yet known to be * assignable from ("covered" by) any of the others. */ - LinkedList> uncoveredReturnTypes = new LinkedList<>(); + List> uncoveredReturnTypes = new ArrayList<>(1); nextNewReturnType: for (ProxyMethod pm : methods) { diff --git a/src/java.base/share/classes/java/math/MutableBigInteger.java b/src/java.base/share/classes/java/math/MutableBigInteger.java index f0dae7a07f7..7d0ccbf1e09 100644 --- a/src/java.base/share/classes/java/math/MutableBigInteger.java +++ b/src/java.base/share/classes/java/math/MutableBigInteger.java @@ -2106,6 +2106,7 @@ MutableBigInteger mutableModInverse(MutableBigInteger p) { oddPart.leftShift(powersOf2); oddPart.multiply(y1, result); + oddPart.clear(); evenPart.multiply(oddMod, temp1); temp1.multiply(y2, temp2); diff --git a/src/java.base/share/classes/java/time/LocalTime.java b/src/java.base/share/classes/java/time/LocalTime.java index 1b82bda5154..b89c72d1713 100644 --- a/src/java.base/share/classes/java/time/LocalTime.java +++ b/src/java.base/share/classes/java/time/LocalTime.java @@ -1596,8 +1596,7 @@ public boolean equals(Object obj) { */ @Override public int hashCode() { - long nod = toNanoOfDay(); - return (int) (nod ^ (nod >>> 32)); + return Long.hashCode(toNanoOfDay()); } //----------------------------------------------------------------------- diff --git a/src/java.base/share/classes/java/time/temporal/ValueRange.java b/src/java.base/share/classes/java/time/temporal/ValueRange.java index b17f56ccd4d..78a13420877 100644 --- a/src/java.base/share/classes/java/time/temporal/ValueRange.java +++ b/src/java.base/share/classes/java/time/temporal/ValueRange.java @@ -410,7 +410,7 @@ public int hashCode() { long hash = minSmallest + (minLargest << 16) + (minLargest >> 48) + (maxSmallest << 32) + (maxSmallest >> 32) + (maxLargest << 48) + (maxLargest >> 16); - return (int) (hash ^ (hash >>> 32)); + return Long.hashCode(hash); } //----------------------------------------------------------------------- diff --git a/src/java.base/share/classes/java/util/ResourceBundle.java b/src/java.base/share/classes/java/util/ResourceBundle.java index 4f2cdd719f3..8f57d782d47 100644 --- a/src/java.base/share/classes/java/util/ResourceBundle.java +++ b/src/java.base/share/classes/java/util/ResourceBundle.java @@ -2888,7 +2888,7 @@ protected List createObject(BaseLocale base) { if (language.equals("nb") || isNorwegianBokmal) { List tmpList = getDefaultList("nb", script, region, variant); // Insert a locale replacing "nb" with "no" for every list entry with precedence - List bokmalList = new LinkedList<>(); + List bokmalList = new ArrayList<>(); for (Locale l_nb : tmpList) { var isRoot = l_nb.getLanguage().isEmpty(); var l_no = Locale.getInstance(isRoot ? "" : "no", @@ -2928,7 +2928,7 @@ private static List getDefaultList(String language, String script, Strin List variants = null; if (!variant.isEmpty()) { - variants = new LinkedList<>(); + variants = new ArrayList<>(); int idx = variant.length(); while (idx != -1) { variants.add(variant.substring(0, idx)); @@ -2936,7 +2936,7 @@ private static List getDefaultList(String language, String script, Strin } } - List list = new LinkedList<>(); + List list = new ArrayList<>(); if (variants != null) { for (String v : variants) { diff --git a/src/java.base/share/classes/jdk/internal/loader/NativeLibraries.java b/src/java.base/share/classes/jdk/internal/loader/NativeLibraries.java index 9df51c7cef8..4814633d038 100644 --- a/src/java.base/share/classes/jdk/internal/loader/NativeLibraries.java +++ b/src/java.base/share/classes/jdk/internal/loader/NativeLibraries.java @@ -34,6 +34,8 @@ import java.security.PrivilegedAction; import java.util.ArrayDeque; import java.util.Deque; +import java.util.function.BiFunction; +import java.util.function.Function; import java.util.HashSet; import java.util.Objects; import java.util.Map; @@ -483,28 +485,36 @@ public int getCounter() { new ConcurrentHashMap<>(); private static void acquireNativeLibraryLock(String libraryName) { - nativeLibraryLockMap.compute(libraryName, (name, currentLock) -> { - if (currentLock == null) { - currentLock = new CountedLock(); + nativeLibraryLockMap.compute(libraryName, + new BiFunction<>() { + public CountedLock apply(String name, CountedLock currentLock) { + if (currentLock == null) { + currentLock = new CountedLock(); + } + // safe as compute BiFunction<> is executed atomically + currentLock.increment(); + return currentLock; + } } - // safe as compute lambda is executed atomically - currentLock.increment(); - return currentLock; - }).lock(); + ).lock(); } private static void releaseNativeLibraryLock(String libraryName) { - CountedLock lock = nativeLibraryLockMap.computeIfPresent(libraryName, (name, currentLock) -> { - if (currentLock.getCounter() == 1) { - // unlock and release the object if no other threads are queued - currentLock.unlock(); - // remove the element - return null; - } else { - currentLock.decrement(); - return currentLock; + CountedLock lock = nativeLibraryLockMap.computeIfPresent(libraryName, + new BiFunction<>() { + public CountedLock apply(String name, CountedLock currentLock) { + if (currentLock.getCounter() == 1) { + // unlock and release the object if no other threads are queued + currentLock.unlock(); + // remove the element + return null; + } else { + currentLock.decrement(); + return currentLock; + } + } } - }); + ); if (lock != null) { lock.unlock(); } @@ -521,7 +531,11 @@ private static final class NativeLibraryContext { private static Deque current() { return nativeLibraryThreadContext.computeIfAbsent( Thread.currentThread(), - t -> new ArrayDeque<>(8)); + new Function<>() { + public Deque apply(Thread t) { + return new ArrayDeque<>(8); + } + }); } private static NativeLibraryImpl peek() { diff --git a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java index b34b35562e5..a2a43fb8b1b 100644 --- a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java +++ b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java @@ -54,7 +54,6 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.NoSuchElementException; import java.util.Properties; @@ -219,7 +218,7 @@ public synchronized List closeLoaders() { if (closed) { return Collections.emptyList(); } - List result = new LinkedList<>(); + List result = new ArrayList<>(); for (Loader loader : loaders) { try { loader.close(); @@ -961,7 +960,7 @@ Resource getResource(final String name, boolean check, Resource res; String[] jarFiles; int count = 0; - LinkedList jarFilesList = null; + List jarFilesList; /* If there no jar files in the index that can potential contain * this resource then return immediately. diff --git a/src/java.base/share/classes/jdk/internal/util/jar/JarIndex.java b/src/java.base/share/classes/jdk/internal/util/jar/JarIndex.java index bd6efcbd927..c55a2f963fe 100644 --- a/src/java.base/share/classes/jdk/internal/util/jar/JarIndex.java +++ b/src/java.base/share/classes/jdk/internal/util/jar/JarIndex.java @@ -52,13 +52,13 @@ public class JarIndex { * The hash map that maintains mappings from * package/classe/resource to jar file list(s) */ - private HashMap> indexMap; + private final HashMap> indexMap; /** * The hash map that maintains mappings from * jar file to package/class/resource lists */ - private HashMap> jarMap; + private final HashMap> jarMap; /* * An ordered list of jar file names. @@ -132,13 +132,13 @@ public String[] getJarFiles() { /* * Add the key, value pair to the hashmap, the value will - * be put in a linked list which is created if necessary. + * be put in a list which is created if necessary. */ private void addToList(String key, String value, - HashMap> t) { - LinkedList list = t.get(key); + HashMap> t) { + List list = t.get(key); if (list == null) { - list = new LinkedList<>(); + list = new ArrayList<>(1); list.add(value); t.put(key, list); } else if (!list.contains(value)) { @@ -151,8 +151,8 @@ private void addToList(String key, String value, * * @param fileName the key of the mapping */ - public LinkedList get(String fileName) { - LinkedList jarFiles = null; + public List get(String fileName) { + List jarFiles; if ((jarFiles = indexMap.get(fileName)) == null) { /* try the package name again */ int pos; @@ -166,7 +166,7 @@ public LinkedList get(String fileName) { /** * Add the mapping from the specified file to the specified * jar file. If there were no mapping for the package of the - * specified file before, a new linked list will be created, + * specified file before, a new list will be created, * the jar file is added to the list and a new mapping from * the package to the jar file list is added to the hashmap. * Otherwise, the jar file will be added to the end of the @@ -261,7 +261,7 @@ public void write(OutputStream out) throws IOException { /* print out the jar file name */ String jar = jarFiles[i]; bw.write(jar + "\n"); - LinkedList jarlist = jarMap.get(jar); + List jarlist = jarMap.get(jar); if (jarlist != null) { Iterator listitr = jarlist.iterator(); while(listitr.hasNext()) { @@ -320,11 +320,11 @@ public void read(InputStream is) throws IOException { * */ public void merge(JarIndex toIndex, String path) { - Iterator>> itr = indexMap.entrySet().iterator(); + Iterator>> itr = indexMap.entrySet().iterator(); while(itr.hasNext()) { - Map.Entry> e = itr.next(); + Map.Entry> e = itr.next(); String packageName = e.getKey(); - LinkedList from_list = e.getValue(); + List from_list = e.getValue(); Iterator listItr = from_list.iterator(); while(listItr.hasNext()) { String jarName = listItr.next(); diff --git a/src/java.base/share/classes/sun/nio/ch/MembershipRegistry.java b/src/java.base/share/classes/sun/nio/ch/MembershipRegistry.java index c732a5d0f31..466b58a35a5 100644 --- a/src/java.base/share/classes/sun/nio/ch/MembershipRegistry.java +++ b/src/java.base/share/classes/sun/nio/ch/MembershipRegistry.java @@ -30,7 +30,7 @@ import java.nio.channels.MembershipKey; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -94,7 +94,7 @@ void add(MembershipKeyImpl key) { keys = groups.get(group); } if (keys == null) { - keys = new LinkedList<>(); + keys = new ArrayList<>(); groups.put(group, keys); } keys.add(key); diff --git a/src/java.base/share/classes/sun/nio/fs/AbstractPoller.java b/src/java.base/share/classes/sun/nio/fs/AbstractPoller.java index 88143530a83..7e7ab2cc0d0 100644 --- a/src/java.base/share/classes/sun/nio/fs/AbstractPoller.java +++ b/src/java.base/share/classes/sun/nio/fs/AbstractPoller.java @@ -40,14 +40,14 @@ abstract class AbstractPoller implements Runnable { - // list of requests pending to the poller thread - private final LinkedList requestList; + // requests pending to the poller thread + private final ArrayDeque requests; // set to true when shutdown private boolean shutdown; protected AbstractPoller() { - this.requestList = new LinkedList<>(); + this.requests = new ArrayDeque<>(); this.shutdown = false; } @@ -216,11 +216,11 @@ Object awaitResult() { private Object invoke(RequestType type, Object... params) throws IOException { // submit request Request req = new Request(type, params); - synchronized (requestList) { + synchronized (requests) { if (shutdown) { throw new ClosedWatchServiceException(); } - requestList.add(req); + requests.add(req); // wakeup thread wakeup(); @@ -243,9 +243,9 @@ private Object invoke(RequestType type, Object... params) throws IOException { */ @SuppressWarnings("unchecked") boolean processRequests() { - synchronized (requestList) { + synchronized (requests) { Request req; - while ((req = requestList.poll()) != null) { + while ((req = requests.poll()) != null) { // if in process of shutdown then reject request if (shutdown) { req.release(new ClosedWatchServiceException()); diff --git a/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java b/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java index afdeca8f6d4..bce426cef57 100644 --- a/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java +++ b/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -63,44 +63,6 @@ public class DistributionPointFetcher { */ private DistributionPointFetcher() {} - /** - * Return the X509CRLs matching this selector. The selector must be - * an X509CRLSelector with certificateChecking set. - */ - public static Collection getCRLs(X509CRLSelector selector, - boolean signFlag, PublicKey prevKey, String provider, - List certStores, boolean[] reasonsMask, - Set trustAnchors, Date validity, String variant) - throws CertStoreException - { - return getCRLs(selector, signFlag, prevKey, null, provider, certStores, - reasonsMask, trustAnchors, validity, variant, null); - } - /** - * Return the X509CRLs matching this selector. The selector must be - * an X509CRLSelector with certificateChecking set. - */ - // Called by com.sun.deploy.security.RevocationChecker - public static Collection getCRLs(X509CRLSelector selector, - boolean signFlag, - PublicKey prevKey, - String provider, - List certStores, - boolean[] reasonsMask, - Set trustAnchors, - Date validity) - throws CertStoreException - { - if (trustAnchors.isEmpty()) { - throw new CertStoreException( - "at least one TrustAnchor must be specified"); - } - TrustAnchor anchor = trustAnchors.iterator().next(); - return getCRLs(selector, signFlag, prevKey, null, provider, certStores, - reasonsMask, trustAnchors, validity, - Validator.VAR_PLUGIN_CODE_SIGNING, anchor); - } - /** * Return the X509CRLs matching this selector. The selector must be * an X509CRLSelector with certificateChecking set. diff --git a/src/java.base/share/classes/sun/security/provider/certpath/OCSP.java b/src/java.base/share/classes/sun/security/provider/certpath/OCSP.java index 9d3fb580631..4fdb6694c3b 100644 --- a/src/java.base/share/classes/sun/security/provider/certpath/OCSP.java +++ b/src/java.base/share/classes/sun/security/provider/certpath/OCSP.java @@ -38,7 +38,6 @@ import java.security.cert.TrustAnchor; import java.security.cert.X509Certificate; import java.util.Base64; -import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; @@ -98,67 +97,6 @@ private static int initializeTimeout() { private OCSP() {} - - /** - * Obtains the revocation status of a certificate using OCSP. - * - * @param cert the certificate to be checked - * @param issuerCert the issuer certificate - * @param responderURI the URI of the OCSP responder - * @param responderCert the OCSP responder's certificate - * @param date the time the validity of the OCSP responder's certificate - * should be checked against. If null, the current time is used. - * @return the RevocationStatus - * @throws IOException if there is an exception connecting to or - * communicating with the OCSP responder - * @throws CertPathValidatorException if an exception occurs while - * encoding the OCSP Request or validating the OCSP Response - */ - - // Called by com.sun.deploy.security.TrustDecider - public static RevocationStatus check(X509Certificate cert, - X509Certificate issuerCert, - URI responderURI, - X509Certificate responderCert, - Date date) - throws IOException, CertPathValidatorException - { - return check(cert, issuerCert, responderURI, responderCert, date, - Collections.emptyList(), - Validator.VAR_PLUGIN_CODE_SIGNING); - } - - - public static RevocationStatus check(X509Certificate cert, - X509Certificate issuerCert, URI responderURI, - X509Certificate responderCert, Date date, List extensions, - String variant) - throws IOException, CertPathValidatorException - { - return check(cert, responderURI, null, issuerCert, responderCert, date, - extensions, variant); - } - - public static RevocationStatus check(X509Certificate cert, - URI responderURI, TrustAnchor anchor, X509Certificate issuerCert, - X509Certificate responderCert, Date date, - List extensions, String variant) - throws IOException, CertPathValidatorException - { - CertId certId; - try { - X509CertImpl certImpl = X509CertImpl.toImpl(cert); - certId = new CertId(issuerCert, certImpl.getSerialNumberObject()); - } catch (CertificateException | IOException e) { - throw new CertPathValidatorException - ("Exception while encoding OCSPRequest", e); - } - OCSPResponse ocspResponse = check(Collections.singletonList(certId), - responderURI, new OCSPResponse.IssuerInfo(anchor, issuerCert), - responderCert, date, extensions, variant); - return (RevocationStatus) ocspResponse.getSingleResponse(certId); - } - /** * Checks the revocation status of a list of certificates using OCSP. * diff --git a/src/java.base/share/classes/sun/security/provider/certpath/PKIX.java b/src/java.base/share/classes/sun/security/provider/certpath/PKIX.java index 26ab6592a16..6abb3c2458d 100644 --- a/src/java.base/share/classes/sun/security/provider/certpath/PKIX.java +++ b/src/java.base/share/classes/sun/security/provider/certpath/PKIX.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -159,8 +159,7 @@ Date date() { // use timestamp if checking signed code that is // timestamped, otherwise use date parameter if (timestamp != null && - (variant.equals(Validator.VAR_CODE_SIGNING) || - variant.equals(Validator.VAR_PLUGIN_CODE_SIGNING))) { + variant.equals(Validator.VAR_CODE_SIGNING)) { date = timestamp.getTimestamp(); } else { date = params.getDate(); diff --git a/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java b/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java index f7beb72cddc..46064d0e9cc 100644 --- a/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java +++ b/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -805,7 +805,6 @@ public void permits(ConstraintsParameters cp) break; case "signedjar": match = - variant.equals(Validator.VAR_PLUGIN_CODE_SIGNING) || variant.equals(Validator.VAR_CODE_SIGNING) || variant.equals(Validator.VAR_TSA_SERVER); break; diff --git a/src/java.base/share/classes/sun/security/validator/EndEntityChecker.java b/src/java.base/share/classes/sun/security/validator/EndEntityChecker.java index 03675d0b257..d0363f7482b 100644 --- a/src/java.base/share/classes/sun/security/validator/EndEntityChecker.java +++ b/src/java.base/share/classes/sun/security/validator/EndEntityChecker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -53,10 +53,6 @@ * are relaxed compared to standard code signing checks in order to * allow these certificates to pass. * - *
  • Plugin code signing. WebStart and Plugin require their own variant - * which is equivalent to VAR_CODE_SIGNING with additional checks for - * compatibility/special cases. See also PKIXValidator. - * *
  • TSA Server (see RFC 3161, section 2.3). * * @@ -156,8 +152,6 @@ void check(X509Certificate[] chain, Object parameter, checkCodeSigning(chain[0], exts); } else if (variant.equals(Validator.VAR_JCE_SIGNING)) { checkCodeSigning(chain[0], exts); - } else if (variant.equals(Validator.VAR_PLUGIN_CODE_SIGNING)) { - checkCodeSigning(chain[0], exts); } else if (variant.equals(Validator.VAR_TSA_SERVER)) { checkTSAServer(chain[0], exts); } else { diff --git a/src/java.base/share/classes/sun/security/validator/PKIXValidator.java b/src/java.base/share/classes/sun/security/validator/PKIXValidator.java index 465666a0d99..a48dc1c6e82 100644 --- a/src/java.base/share/classes/sun/security/validator/PKIXValidator.java +++ b/src/java.base/share/classes/sun/security/validator/PKIXValidator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -25,11 +25,9 @@ package sun.security.validator; -import java.util.*; - import java.security.*; import java.security.cert.*; - +import java.util.*; import javax.security.auth.x500.X500Principal; import sun.security.action.GetBooleanAction; import sun.security.provider.certpath.AlgorithmChecker; @@ -81,8 +79,6 @@ private static boolean allowNonCaAnchor() { private final Map> trustedSubjects; private final CertificateFactory factory; - private final boolean plugin; - PKIXValidator(String variant, Collection trustedCerts) { super(TYPE_PKIX, variant); this.trustedCerts = (trustedCerts instanceof Set) ? @@ -104,7 +100,6 @@ private static boolean allowNonCaAnchor() { } setDefaultParameters(variant); - plugin = variant.equals(VAR_PLUGIN_CODE_SIGNING); trustedSubjects = setTrustedSubjects(); } @@ -126,8 +121,6 @@ private static boolean allowNonCaAnchor() { throw new RuntimeException("Internal error", e); } - plugin = variant.equals(VAR_PLUGIN_CODE_SIGNING); - trustedSubjects = setTrustedSubjects(); } @@ -270,58 +263,14 @@ X509Certificate[] engineValidate(X509Certificate[] chain, X509Certificate last = chain[chain.length - 1]; X500Principal issuer = last.getIssuerX500Principal(); X500Principal subject = last.getSubjectX500Principal(); - if (trustedSubjects.containsKey(issuer) && - isSignatureValid(trustedSubjects.get(issuer), last)) { + if (trustedSubjects.containsKey(issuer)) { return doValidate(chain, pkixParameters); } - // don't fallback to builder if called from plugin/webstart - if (plugin) { - // Validate chain even if no trust anchor is found. This - // allows plugin/webstart to make sure the chain is - // otherwise valid - if (chain.length > 1) { - X509Certificate[] newChain = - new X509Certificate[chain.length-1]; - System.arraycopy(chain, 0, newChain, 0, newChain.length); - - // temporarily set last cert as sole trust anchor - try { - pkixParameters.setTrustAnchors - (Collections.singleton(new TrustAnchor - (chain[chain.length-1], null))); - } catch (InvalidAlgorithmParameterException iape) { - // should never occur, but ... - throw new CertificateException(iape); - } - doValidate(newChain, pkixParameters); - } - // if the rest of the chain is valid, throw exception - // indicating no trust anchor was found - throw new ValidatorException - (ValidatorException.T_NO_TRUST_ANCHOR); - } // otherwise, fall back to builder - return doBuild(chain, otherCerts, pkixParameters); } - private boolean isSignatureValid(List keys, - X509Certificate sub) { - if (plugin) { - for (PublicKey key: keys) { - try { - sub.verify(key); - return true; - } catch (Exception ex) { - continue; - } - } - return false; - } - return true; // only check if PLUGIN is set - } - private static X509Certificate[] toArray(CertPath path, TrustAnchor anchor) throws CertificateException { X509Certificate trustedCert = anchor.getTrustedCert(); diff --git a/src/java.base/share/classes/sun/security/validator/Validator.java b/src/java.base/share/classes/sun/security/validator/Validator.java index 8c5a8e9b6c3..1394a79db8f 100644 --- a/src/java.base/share/classes/sun/security/validator/Validator.java +++ b/src/java.base/share/classes/sun/security/validator/Validator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -64,7 +64,6 @@ *
  • VAR_CODE_SIGNING (code signing specific checks). *
  • VAR_JCE_SIGNING (JCE code signing specific checks). *
  • VAR_TSA_SERVER (TSA server specific checks). - *
  • VAR_PLUGIN_CODE_SIGNING (Plugin/WebStart code signing specific checks). * * See EndEntityChecker for more information. *

    @@ -136,13 +135,6 @@ public abstract class Validator { */ public static final String VAR_TSA_SERVER = "tsa server"; - /** - * Constant for a Code Signing variant of a validator for use by - * the J2SE Plugin/WebStart code. - * @see #getInstance - */ - public static final String VAR_PLUGIN_CODE_SIGNING = "plugin code signing"; - private final String type; final EndEntityChecker endEntityChecker; final String variant; diff --git a/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java b/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java index f7e245c4e49..fd3d4965db3 100644 --- a/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java +++ b/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java @@ -26,7 +26,7 @@ package sun.util.locale.provider; import java.lang.ref.SoftReference; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -98,7 +98,7 @@ private static String[][] loadZoneStrings(Locale locale) { // Performs per-ID retrieval. Set zoneIDs = LocaleProviderAdapter.forJRE().getLocaleResources(locale).getZoneIDs(); - List zones = new LinkedList<>(); + List zones = new ArrayList<>(); for (String key : zoneIDs) { String[] names = retrieveDisplayNamesImpl(key, locale); if (names != null) { diff --git a/src/java.base/share/native/libjli/java.c b/src/java.base/share/native/libjli/java.c index e519686cb78..3d6d7e31cf8 100644 --- a/src/java.base/share/native/libjli/java.c +++ b/src/java.base/share/native/libjli/java.c @@ -108,7 +108,6 @@ static void SetJavaLauncherProp(); static void SetClassPath(const char *s); static void SetMainModule(const char *s); static void SelectVersion(int argc, char **argv, char **main_class); -static void SetJvmEnvironment(int argc, char **argv); static jboolean ParseArguments(int *pargc, char ***pargv, int *pmode, char **pwhat, int *pret, const char *jrepath); @@ -284,9 +283,6 @@ JLI_Launch(int argc, char ** argv, /* main argc, argv */ jvmpath, sizeof(jvmpath), jvmcfg, sizeof(jvmcfg)); - /* Set env. Must be done before LoadJavaVM. */ - SetJvmEnvironment(argc, argv); - ifn.CreateJavaVM = 0; ifn.GetDefaultJavaVMInitArgs = 0; @@ -798,84 +794,6 @@ CheckJvmType(int *pargc, char ***argv, jboolean speculative) { return jvmtype; } -/* - * This method must be called before the VM is loaded, primarily - * used to parse and set any VM related options or env variables. - * This function is non-destructive leaving the argument list intact. - */ -static void -SetJvmEnvironment(int argc, char **argv) { - - static const char* NMT_Env_Name = "NMT_LEVEL_"; - const char* NMT_Arg_Name = IsJavaArgs() ? "-J-XX:NativeMemoryTracking=" : "-XX:NativeMemoryTracking="; - int i; - /* process only the launcher arguments */ - for (i = 0; i < argc; i++) { - char *arg = argv[i]; - /* - * Java launcher (!IsJavaArgs()): - * Since this must be a VM flag we stop processing once we see - * an argument the launcher would not have processed beyond (such - * as -version or -h), or an argument that indicates the following - * arguments are for the application (i.e. the main class name, or - * the -jar argument). - * Other launchers (IsJavaArgs()): - * All arguments have to be scanned to see if it is a -J argument. - */ - if (!IsJavaArgs() && i > 0) { - char *prev = argv[i - 1]; - // skip non-dash arg preceded by class path specifiers - if (*arg != '-' && IsWhiteSpaceOption(prev)) { - continue; - } - - if (*arg != '-' || isTerminalOpt(arg)) { - return; - } - } - /* - * The following case checks for "-XX:NativeMemoryTracking=value". - * If value is non null, an environmental variable set to this value - * will be created to be used by the JVM. - * The argument is passed to the JVM, which will check validity. - * The JVM is responsible for removing the env variable. - */ - if (JLI_StrCCmp(arg, NMT_Arg_Name) == 0) { - int retval; - // get what follows this parameter, include "=" - size_t pnlen = JLI_StrLen(NMT_Arg_Name); - if (JLI_StrLen(arg) > pnlen) { - char* value = arg + pnlen; - size_t pbuflen = pnlen + JLI_StrLen(value) + 10; // 10 max pid digits - - /* - * ensures that malloc successful - * DONT JLI_MemFree() pbuf. JLI_PutEnv() uses system call - * that could store the address. - */ - char * pbuf = (char*)JLI_MemAlloc(pbuflen); - - JLI_Snprintf(pbuf, pbuflen, "%s%d=%s", NMT_Env_Name, JLI_GetPid(), value); - retval = JLI_PutEnv(pbuf); - if (JLI_IsTraceLauncher()) { - char* envName; - char* envBuf; - - // ensures that malloc successful - envName = (char*)JLI_MemAlloc(pbuflen); - JLI_Snprintf(envName, pbuflen, "%s%d", NMT_Env_Name, JLI_GetPid()); - - printf("TRACER_MARKER: NativeMemoryTracking: env var is %s\n",envName); - printf("TRACER_MARKER: NativeMemoryTracking: putenv arg %s\n",pbuf); - envBuf = getenv(envName); - printf("TRACER_MARKER: NativeMemoryTracking: got value %s\n",envBuf); - free(envName); - } - } - } - } -} - /* copied from HotSpot function "atomll()" */ static int parse_size(const char *s, jlong *result) { diff --git a/src/java.base/share/native/libjli/jli_util.h b/src/java.base/share/native/libjli/jli_util.h index 3512b1e96f5..6aa26a04f77 100644 --- a/src/java.base/share/native/libjli/jli_util.h +++ b/src/java.base/share/native/libjli/jli_util.h @@ -93,8 +93,6 @@ int JLI_Open(const char* name, int flags); JNIEXPORT void JNICALL JLI_CmdToArgs(char *cmdline); #define JLI_Lseek _lseeki64 -#define JLI_PutEnv _putenv -#define JLI_GetPid _getpid #else /* NIXES */ #include #include @@ -102,8 +100,6 @@ JLI_CmdToArgs(char *cmdline); #define JLI_StrNCaseCmp(p1, p2, p3) strncasecmp((p1), (p2), (p3)) #define JLI_Snprintf snprintf #define JLI_Open open -#define JLI_PutEnv putenv -#define JLI_GetPid getpid #ifdef __linux__ #define _LARGFILE64_SOURCE #define JLI_Lseek lseek64 diff --git a/src/java.base/unix/classes/sun/net/dns/ResolverConfigurationImpl.java b/src/java.base/unix/classes/sun/net/dns/ResolverConfigurationImpl.java index d46138f23b7..5584aba125b 100644 --- a/src/java.base/unix/classes/sun/net/dns/ResolverConfigurationImpl.java +++ b/src/java.base/unix/classes/sun/net/dns/ResolverConfigurationImpl.java @@ -26,7 +26,7 @@ package sun.net.dns; import java.util.List; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.StringTokenizer; import java.io.BufferedReader; import java.io.FileReader; @@ -56,11 +56,11 @@ // Parse /etc/resolv.conf to get the values for a particular // keyword. // - private LinkedList resolvconf(String keyword, + private ArrayList resolvconf(String keyword, int maxperkeyword, int maxkeywords) { - LinkedList ll = new LinkedList<>(); + ArrayList ll = new ArrayList<>(); try { BufferedReader in = @@ -111,8 +111,8 @@ private LinkedList resolvconf(String keyword, return ll; } - private LinkedList searchlist; - private LinkedList nameservers; + private ArrayList searchlist; + private ArrayList nameservers; // Load DNS configuration from OS @@ -133,7 +133,7 @@ private void loadConfig() { nameservers = java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<>() { - public LinkedList run() { + public ArrayList run() { // typically MAXNS is 3 but we've picked 5 here // to allow for additional servers if required. return resolvconf("nameserver", 1, 5); @@ -151,16 +151,16 @@ public LinkedList run() { // obtain search list or local domain @SuppressWarnings("removal") - private LinkedList getSearchList() { + private ArrayList getSearchList() { - LinkedList sl; + ArrayList sl; // first try the search keyword in /etc/resolv.conf sl = java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<>() { - public LinkedList run() { - LinkedList ll; + public ArrayList run() { + ArrayList ll; // first try search keyword (max 6 domains) ll = resolvconf("search", 6, 1); @@ -183,8 +183,8 @@ public LinkedList run() { sl = java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<>() { - public LinkedList run() { - LinkedList ll; + public ArrayList run() { + ArrayList ll; ll = resolvconf("domain", 1, 1); if (ll.size() > 0) { @@ -201,7 +201,7 @@ public LinkedList run() { // no local domain so try fallback (RPC) domain or // hostName - sl = new LinkedList<>(); + sl = new ArrayList<>(); String domain = fallbackDomain0(); if (domain != null && !domain.isEmpty()) { sl.add(domain); diff --git a/src/java.desktop/macosx/classes/apple/laf/JRSUIConstants.java b/src/java.desktop/macosx/classes/apple/laf/JRSUIConstants.java index 175af75f73d..1e98cb19ba4 100644 --- a/src/java.desktop/macosx/classes/apple/laf/JRSUIConstants.java +++ b/src/java.desktop/macosx/classes/apple/laf/JRSUIConstants.java @@ -111,8 +111,7 @@ public boolean equals(final Object obj) { } public int hashCode() { - final long bits = Double.doubleToLongBits(doubleValue); - return (int)(bits ^ (bits >>> 32)); + return Double.hashCode(doubleValue); } public String toString() { diff --git a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java index 49f899c09a2..5c0334abbef 100644 --- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java +++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -319,7 +319,7 @@ private static int readFieldValue(ImageInputStream stream, while (bytesToRead != 0) { int sz = Math.min(bytesToRead, UNIT_SIZE); byte[] unit = new byte[sz]; - stream.readFully(unit, bytesRead, sz); + stream.readFully(unit, 0, sz); bufs.add(unit); bytesRead += sz; bytesToRead -= sz; @@ -455,7 +455,7 @@ private static int readFieldValue(ImageInputStream stream, while (shortsToRead != 0) { int sz = Math.min(shortsToRead, SSHORT_TILE_SIZE); short[] unit = new short[sz]; - stream.readFully(unit, shortsRead, sz); + stream.readFully(unit, 0, sz); bufs.add(unit); shortsRead += sz; shortsToRead -= sz; @@ -486,7 +486,7 @@ private static int readFieldValue(ImageInputStream stream, while (intsToRead != 0) { int sz = Math.min(intsToRead, INT_TILE_SIZE); int[] unit = new int[sz]; - stream.readFully(unit, intsToRead, sz); + stream.readFully(unit, 0, sz); bufs.add(unit); intsRead += sz; intsToRead -= sz; @@ -518,7 +518,7 @@ private static int readFieldValue(ImageInputStream stream, while (srationalsToRead != 0) { int sz = Math.min(srationalsToRead, SRATIONAL_TILE_SIZE); int[] unit = new int[sz * 2]; - stream.readFully(unit, (srationalsToRead * 2), (sz * 2)); + stream.readFully(unit, 0, (sz * 2)); bufs.add(unit); srationalsRead += sz; srationalsToRead -= sz; @@ -552,7 +552,7 @@ private static int readFieldValue(ImageInputStream stream, while (floatsToRead != 0) { int sz = Math.min(floatsToRead, FLOAT_TILE_SIZE); float[] unit = new float[sz]; - stream.readFully(unit, floatsToRead, sz); + stream.readFully(unit, 0, sz); bufs.add(unit); floatsRead += sz; floatsToRead -= sz; @@ -583,7 +583,7 @@ private static int readFieldValue(ImageInputStream stream, while (doublesToRead != 0) { int sz = Math.min(doublesToRead, DOUBLE_TILE_SIZE); double[] unit = new double[sz]; - stream.readFully(unit, doublesToRead, sz); + stream.readFully(unit, 0, sz); bufs.add(unit); doublesRead += sz; doublesToRead -= sz; diff --git a/src/java.desktop/share/classes/javax/swing/JComponent.java b/src/java.desktop/share/classes/javax/swing/JComponent.java index 2e7c17665cd..57b0e6b21df 100644 --- a/src/java.desktop/share/classes/javax/swing/JComponent.java +++ b/src/java.desktop/share/classes/javax/swing/JComponent.java @@ -4191,17 +4191,17 @@ void clientPropertyChanged(Object key, Object oldValue, * @param value Object containing the property value */ void setUIProperty(String propertyName, Object value) { - if (propertyName == "opaque") { + if ("opaque".equals(propertyName)) { if (!getFlag(OPAQUE_SET)) { setOpaque(((Boolean)value).booleanValue()); setFlag(OPAQUE_SET, false); } - } else if (propertyName == "autoscrolls") { + } else if ("autoscrolls".equals(propertyName)) { if (!getFlag(AUTOSCROLLS_SET)) { setAutoscrolls(((Boolean)value).booleanValue()); setFlag(AUTOSCROLLS_SET, false); } - } else if (propertyName == "focusTraversalKeysForward") { + } else if ("focusTraversalKeysForward".equals(propertyName)) { @SuppressWarnings("unchecked") Set strokeSet = (Set) value; if (!getFlag(FOCUS_TRAVERSAL_KEYS_FORWARD_SET)) { @@ -4209,7 +4209,7 @@ void setUIProperty(String propertyName, Object value) { FORWARD_TRAVERSAL_KEYS, strokeSet); } - } else if (propertyName == "focusTraversalKeysBackward") { + } else if ("focusTraversalKeysBackward".equals(propertyName)) { @SuppressWarnings("unchecked") Set strokeSet = (Set) value; if (!getFlag(FOCUS_TRAVERSAL_KEYS_BACKWARD_SET)) { diff --git a/src/java.desktop/share/classes/javax/swing/JOptionPane.java b/src/java.desktop/share/classes/javax/swing/JOptionPane.java index e156cd3fd1d..8fe3b264909 100644 --- a/src/java.desktop/share/classes/javax/swing/JOptionPane.java +++ b/src/java.desktop/share/classes/javax/swing/JOptionPane.java @@ -272,7 +272,7 @@ * JOptionPane pane = new JOptionPane(arguments); * pane.set.Xxxx(...); // Configure * JDialog dialog = pane.createDialog(parentComponent, title); - * dialog.show(); + * dialog.setVisible(true); * Object selectedValue = pane.getValue(); * if(selectedValue == null) * return CLOSED_OPTION; diff --git a/src/java.desktop/unix/classes/sun/awt/X11/XMSelection.java b/src/java.desktop/unix/classes/sun/awt/X11/XMSelection.java index 7cd242a52ea..43a981dd2a4 100644 --- a/src/java.desktop/unix/classes/sun/awt/X11/XMSelection.java +++ b/src/java.desktop/unix/classes/sun/awt/X11/XMSelection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -37,7 +37,7 @@ public class XMSelection { /* - * A method for a subsytem to express its interest in a certain + * A method for a subsystem to express its interest in a certain * manager selection. * * If owner changes, the ownerChanged of the XMSelectionListener diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java index 3c50032b567..a9f58fc8b0c 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java @@ -123,8 +123,7 @@ public int hashCode() { if (value == 0d) { return 0; } - long v = Double.doubleToLongBits(value); - return (int) (v ^ (v >>> 32)); + return Double.hashCode(value); } // NOTE: 0.0 is equal but not identical to -0.0 diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java index 1a154b95ad5..73ca1bc62be 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java @@ -120,9 +120,6 @@ protected Check(Context context) { context.put(checkKey, this); names = Names.instance(context); - dfltTargetMeta = new Name[] { names.PACKAGE, names.TYPE, - names.FIELD, names.RECORD_COMPONENT, names.METHOD, names.CONSTRUCTOR, - names.ANNOTATION_TYPE, names.LOCAL_VARIABLE, names.PARAMETER, names.MODULE }; log = Log.instance(context); rs = Resolve.instance(context); syms = Symtab.instance(context); @@ -161,6 +158,7 @@ protected Check(Context context) { deferredLintHandler = DeferredLintHandler.instance(context); + allowModules = Feature.MODULES.allowedInSource(source); allowRecords = Feature.RECORDS.allowedInSource(source); allowSealed = Feature.SEALED_CLASSES.allowedInSource(source); allowUniversalTVars = Feature.UNIVERSAL_TVARS.allowedInSource(source); @@ -195,6 +193,10 @@ protected Check(Context context) { */ private DeferredLintHandler deferredLintHandler; + /** Are modules allowed + */ + private final boolean allowModules; + /** Are records allowed */ private final boolean allowRecords; @@ -3483,20 +3485,7 @@ private void validateTarget(TypeSymbol container, TypeSymbol contained, Diagnost /* get a set of names for the default target */ private Set getDefaultTargetSet() { if (defaultTargets == null) { - Set targets = new HashSet<>(); - targets.add(names.ANNOTATION_TYPE); - targets.add(names.CONSTRUCTOR); - targets.add(names.FIELD); - if (allowRecords) { - targets.add(names.RECORD_COMPONENT); - } - targets.add(names.LOCAL_VARIABLE); - targets.add(names.METHOD); - targets.add(names.PACKAGE); - targets.add(names.PARAMETER); - targets.add(names.TYPE); - - defaultTargets = java.util.Collections.unmodifiableSet(targets); + defaultTargets = Set.of(defaultTargetMetaInfo()); } return defaultTargets; @@ -3696,8 +3685,26 @@ Attribute.Array getAttributeTargetAttribute(TypeSymbol s) { return (atValue instanceof Attribute.Array attributeArray) ? attributeArray : null; } - public final Name[] dfltTargetMeta; + private Name[] dfltTargetMeta; private Name[] defaultTargetMetaInfo() { + if (dfltTargetMeta == null) { + ArrayList defaultTargets = new ArrayList<>(); + defaultTargets.add(names.PACKAGE); + defaultTargets.add(names.TYPE); + defaultTargets.add(names.FIELD); + defaultTargets.add(names.METHOD); + defaultTargets.add(names.CONSTRUCTOR); + defaultTargets.add(names.ANNOTATION_TYPE); + defaultTargets.add(names.LOCAL_VARIABLE); + defaultTargets.add(names.PARAMETER); + if (allowRecords) { + defaultTargets.add(names.RECORD_COMPONENT); + } + if (allowModules) { + defaultTargets.add(names.MODULE); + } + dfltTargetMeta = defaultTargets.toArray(new Name[0]); + } return dfltTargetMeta; } diff --git a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.amd64/src/jdk/vm/ci/amd64/AMD64.java b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.amd64/src/jdk/vm/ci/amd64/AMD64.java index 3fc5b6e7936..f22e120ae53 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.amd64/src/jdk/vm/ci/amd64/AMD64.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.amd64/src/jdk/vm/ci/amd64/AMD64.java @@ -220,6 +220,7 @@ public enum CPUFeature implements CPUFeatureName { AVX512_VBMI2, AVX512_VBMI, HV, + SERIALIZE, } private final EnumSet features; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 508d62a04d8..1e177a5d735 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -1830,8 +1830,8 @@ public List getAnnotations(List descList, b HtmlLinkInfo linkInfo = new HtmlLinkInfo(configuration, HtmlLinkInfo.Kind.ANNOTATION, annotationElement); Map pairs = aDesc.getElementValues(); - // If the annotation is synthesized, do not print the container. - if (utils.configuration.workArounds.isSynthesized(aDesc)) { + // If the annotation is mandated, do not print the container. + if (utils.configuration.workArounds.isMandated(aDesc)) { for (ExecutableElement ee : pairs.keySet()) { AnnotationValue annotationValue = pairs.get(ee); List annotationTypeValues = new ArrayList<>(); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java index 216dbfb97ea..a7ae68aa89b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java @@ -122,9 +122,8 @@ public boolean isDeprecated0(Element e) { return false; } - // TODO: fix jx.l.m add this method. - public boolean isSynthesized(AnnotationMirror aDesc) { - return ((Attribute)aDesc).isSynthesized(); + public boolean isMandated(AnnotationMirror aDesc) { + return elementUtils.getOrigin(null, aDesc) == Elements.Origin.MANDATED; } // TODO: DocTrees: Trees.getPath(Element e) is slow a factor 4-5 times. diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/MsiVersion.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/MsiVersion.java index 90a56f38066..c1ced669169 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/MsiVersion.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/MsiVersion.java @@ -25,6 +25,7 @@ package jdk.jpackage.internal; import java.math.BigInteger; +import java.text.MessageFormat; final class MsiVersion { @@ -42,9 +43,11 @@ static DottedVersion of(String value) { DottedVersion ver = new DottedVersion(value); BigInteger[] components = ver.getComponents(); - if (components.length > 3) { - throw new IllegalArgumentException(I18N.getString( - "error.msi-product-version-too-many-components")); + + if (components.length < 2 || components.length > 4) { + throw new IllegalArgumentException(MessageFormat.format( + I18N.getString("error.msi-product-version-components"), + value)); } if (BigInteger.valueOf(255).compareTo(components[0]) < 0) { 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 e335fc35bf0..34515283734 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 @@ -42,8 +42,8 @@ resource.installdirnotemptydlg-wix-file=Not empty install directory dialog WiX p error.no-wix-tools=Can not find WiX tools (light.exe, candle.exe) 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 according to these rules: https://msdn.microsoft.com/en-us/library/aa370859%28v\=VS.85%29.aspx -error.msi-product-version-too-many-components=Version sting may have between 1 and 3 components: 1, 1.2, 1.2.3. +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. error.msi-product-version-major-out-of-range=Major version must be in the range [0, 255] error.msi-product-version-build-out-of-range=Build part of version must be in the range [0, 65535] error.msi-product-version-minor-out-of-range=Minor version must be in the range [0, 255] 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 027f32ee2a8..f0e5e3e370b 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 @@ -42,8 +42,8 @@ resource.installdirnotemptydlg-wix-file=Not empty install directory dialog WiX p error.no-wix-tools=WiX\u30C4\u30FC\u30EB(light.exe\u3001candle.exe)\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 error.no-wix-tools.advice=WiX 3.0\u4EE5\u964D\u3092https://wixtoolset.org\u304B\u3089\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3001PATH\u306B\u8FFD\u52A0\u3057\u307E\u3059\u3002 -error.version-string-wrong-format.advice=--app-version\u30D1\u30E9\u30E1\u30FC\u30BF\u306E\u5024\u3092\u6B21\u306E\u898F\u5247\u306B\u5F93\u3063\u3066\u8A2D\u5B9A\u3057\u307E\u3059: https://msdn.microsoft.com/en-us/library/aa370859%28v=VS.85%29.aspx -error.msi-product-version-too-many-components=\u30D0\u30FC\u30B8\u30E7\u30F3\u6587\u5B57\u5217\u306B\u306F\u30011\u30011.2\u30011.2.3\u306A\u30691\u304B\u30893\u306E\u69CB\u6210\u8981\u7D20\u3092\u4F7F\u7528\u3067\u304D\u307E\u3059\u3002 +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. error.msi-product-version-major-out-of-range=\u30E1\u30B8\u30E3\u30FC\u30FB\u30D0\u30FC\u30B8\u30E7\u30F3\u306F\u7BC4\u56F2[0, 255]\u5185\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 error.msi-product-version-build-out-of-range=\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30D3\u30EB\u30C9\u90E8\u5206\u306F\u7BC4\u56F2[0, 65535]\u5185\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 error.msi-product-version-minor-out-of-range=\u30DE\u30A4\u30CA\u30FC\u30FB\u30D0\u30FC\u30B8\u30E7\u30F3\u306F\u7BC4\u56F2[0, 255]\u5185\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 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 7eb96b1319c..d0461b9996c 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 @@ -42,8 +42,8 @@ resource.installdirnotemptydlg-wix-file=Not empty install directory dialog WiX p error.no-wix-tools=\u627E\u4E0D\u5230 WiX \u5DE5\u5177 (light.exe, candle.exe) error.no-wix-tools.advice=\u4ECE https://wixtoolset.org \u4E0B\u8F7D WiX 3.0 \u6216\u66F4\u9AD8\u7248\u672C\uFF0C\u7136\u540E\u5C06\u5176\u6DFB\u52A0\u5230 PATH\u3002 -error.version-string-wrong-format.advice=\u6839\u636E\u4EE5\u4E0B\u89C4\u5219\u8BBE\u7F6E --app-version \u53C2\u6570\u7684\u503C\uFF1Ahttps://msdn.microsoft.com/en-us/library/aa370859%28v=VS.85%29.aspx -error.msi-product-version-too-many-components=\u7248\u672C\u5B57\u7B26\u4E32\u53EF\u4EE5\u5305\u542B 1 \u5230 3 \u4E2A\u7EC4\u4EF6\uFF1A1\u30011.2\u30011.2.3\u3002 +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. error.msi-product-version-major-out-of-range=\u4E3B\u7248\u672C\u5FC5\u987B\u4F4D\u4E8E [0, 255] \u8303\u56F4\u4E2D error.msi-product-version-build-out-of-range=\u7248\u672C\u7684\u5DE5\u4F5C\u7248\u672C\u90E8\u5206\u5FC5\u987B\u4F4D\u4E8E [0, 65535] \u8303\u56F4\u4E2D error.msi-product-version-minor-out-of-range=\u6B21\u7248\u672C\u5FC5\u987B\u4F4D\u4E8E [0, 255] \u8303\u56F4\u4E2D diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Selector.java b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Selector.java index 412efa6e5d7..9d540847148 100644 --- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Selector.java +++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/Selector.java @@ -276,7 +276,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return (int) (asBits() ^ (asBits() >>> 32)); + return Long.hashCode(asBits()); } /** diff --git a/src/jdk.management/unix/classes/com/sun/management/internal/OperatingSystemImpl.java b/src/jdk.management/unix/classes/com/sun/management/internal/OperatingSystemImpl.java index 05d59ba3985..44679e9009e 100644 --- a/src/jdk.management/unix/classes/com/sun/management/internal/OperatingSystemImpl.java +++ b/src/jdk.management/unix/classes/com/sun/management/internal/OperatingSystemImpl.java @@ -25,11 +25,14 @@ package com.sun.management.internal; +import java.util.concurrent.TimeUnit; +import java.util.function.DoubleSupplier; +import java.util.function.LongSupplier; +import java.util.function.ToDoubleFunction; + import jdk.internal.platform.Metrics; import sun.management.BaseOperatingSystemImpl; import sun.management.VMManagement; - -import java.util.concurrent.TimeUnit; /** * Implementation class for the operating system. * Standard and committed hotspot-specific metrics if any. @@ -42,8 +45,137 @@ class OperatingSystemImpl extends BaseOperatingSystemImpl private static final int MAX_ATTEMPTS_NUMBER = 10; private final Metrics containerMetrics; - private long usageTicks = 0; // used for cpu load calculation - private long totalTicks = 0; // used for cpu load calculation + private ContainerCpuTicks systemLoadTicks = new SystemCpuTicks(); + private ContainerCpuTicks processLoadTicks = new ProcessCpuTicks(); + + private abstract class ContainerCpuTicks { + private long usageTicks = 0; + private long totalTicks = 0; + + private double getUsageDividesTotal(long usageTicks, long totalTicks) { + // If cpu quota or cpu shares are in effect. Calculate the cpu load + // based on the following formula (similar to how + // getCpuLoad0() is being calculated): + // + // | usageTicks - usageTicks' | + // ------------------------------ + // | totalTicks - totalTicks' | + // + // where usageTicks' and totalTicks' are historical values + // retrieved via an earlier call of this method. + if (usageTicks < 0 || totalTicks <= 0) { + return -1; + } + long distance = usageTicks - this.usageTicks; + this.usageTicks = usageTicks; + long totalDistance = totalTicks - this.totalTicks; + this.totalTicks = totalTicks; + double systemLoad = 0.0; + if (distance > 0 && totalDistance > 0) { + systemLoad = ((double)distance) / totalDistance; + } + // Ensure the return value is in the range 0.0 -> 1.0 + systemLoad = Math.max(0.0, systemLoad); + systemLoad = Math.min(1.0, systemLoad); + return systemLoad; + } + + public double getContainerCpuLoad() { + assert(containerMetrics != null); + long quota = containerMetrics.getCpuQuota(); + long share = containerMetrics.getCpuShares(); + if (quota > 0) { + long numPeriods = containerMetrics.getCpuNumPeriods(); + long quotaNanos = TimeUnit.MICROSECONDS.toNanos(quota * numPeriods); + return getUsageDividesTotal(cpuUsageSupplier().getAsLong(), quotaNanos); + } else if (share > 0) { + long hostTicks = getHostTotalCpuTicks0(); + int totalCPUs = getHostOnlineCpuCount0(); + int containerCPUs = getAvailableProcessors(); + // scale the total host load to the actual container cpus + hostTicks = hostTicks * containerCPUs / totalCPUs; + return getUsageDividesTotal(cpuUsageSupplier().getAsLong(), hostTicks); + } else { + // If CPU quotas and shares are not active then find the average load for + // all online CPUs that are allowed to run this container. + + // If the cpuset is the same as the host's one there is no need to iterate over each CPU + if (isCpuSetSameAsHostCpuSet()) { + return defaultCpuLoadSupplier().getAsDouble(); + } else { + int[] cpuSet = containerMetrics.getEffectiveCpuSetCpus(); + // in case the effectiveCPUSetCpus are not available, attempt to use just cpusets.cpus + if (cpuSet == null || cpuSet.length <= 0) { + cpuSet = containerMetrics.getCpuSetCpus(); + } + if (cpuSet == null) { + // cgroups is mounted, but CPU resource is not limited. + // We can assume the VM is run on the host CPUs. + return defaultCpuLoadSupplier().getAsDouble(); + } else if (cpuSet.length > 0) { + return cpuSetCalc().applyAsDouble(cpuSet); + } + return -1; + } + } + } + + protected abstract DoubleSupplier defaultCpuLoadSupplier(); + protected abstract ToDoubleFunction cpuSetCalc(); + protected abstract LongSupplier cpuUsageSupplier(); + } + + private class ProcessCpuTicks extends ContainerCpuTicks { + + @Override + protected DoubleSupplier defaultCpuLoadSupplier() { + return () -> getProcessCpuLoad0(); + } + + @Override + protected ToDoubleFunction cpuSetCalc() { + return (int[] cpuSet) -> { + int totalCPUs = getHostOnlineCpuCount0(); + int containerCPUs = getAvailableProcessors(); + return Math.min(1.0, getProcessCpuLoad0() * totalCPUs / containerCPUs); + }; + } + + @Override + protected LongSupplier cpuUsageSupplier() { + return () -> getProcessCpuTime(); + } + + } + + private class SystemCpuTicks extends ContainerCpuTicks { + + @Override + protected DoubleSupplier defaultCpuLoadSupplier() { + return () -> getCpuLoad0(); + } + + @Override + protected ToDoubleFunction cpuSetCalc() { + return (int[] cpuSet) -> { + double systemLoad = 0.0; + for (int cpu : cpuSet) { + double cpuLoad = getSingleCpuLoad0(cpu); + if (cpuLoad < 0) { + return -1; + } + systemLoad += cpuLoad; + } + return systemLoad / cpuSet.length; + }; + } + + @Override + protected LongSupplier cpuUsageSupplier() { + return () -> containerMetrics.getCpuUsage(); + } + + } OperatingSystemImpl(VMManagement vm) { super(vm); @@ -134,90 +266,17 @@ public long getMaxFileDescriptorCount() { return getMaxFileDescriptorCount0(); } - private double getUsageDividesTotal(long usageTicks, long totalTicks) { - // If cpu quota or cpu shares are in effect calculate the cpu load - // based on the following formula (similar to how - // getCpuLoad0() is being calculated): - // - // | usageTicks - usageTicks' | - // ------------------------------ - // | totalTicks - totalTicks' | - // - // where usageTicks' and totalTicks' are historical values - // retrieved via an earlier call of this method. - // - // Total ticks should be scaled to the container effective number - // of cpus, if cpu shares are in effect. - if (usageTicks < 0 || totalTicks <= 0) { - return -1; - } - long distance = usageTicks - this.usageTicks; - this.usageTicks = usageTicks; - long totalDistance = totalTicks - this.totalTicks; - this.totalTicks = totalTicks; - - double systemLoad = 0.0; - if (distance > 0 && totalDistance > 0) { - systemLoad = ((double)distance) / totalDistance; - } - // Ensure the return value is in the range 0.0 -> 1.0 - systemLoad = Math.max(0.0, systemLoad); - systemLoad = Math.min(1.0, systemLoad); - return systemLoad; - } - public double getCpuLoad() { if (containerMetrics != null) { - long quota = containerMetrics.getCpuQuota(); - long share = containerMetrics.getCpuShares(); - long usageNanos = containerMetrics.getCpuUsage(); - if (quota > 0) { - long numPeriods = containerMetrics.getCpuNumPeriods(); - long quotaNanos = TimeUnit.MICROSECONDS.toNanos(quota * numPeriods); - return getUsageDividesTotal(usageNanos, quotaNanos); - } else if (share > 0) { - long hostTicks = getHostTotalCpuTicks0(); - int totalCPUs = getHostOnlineCpuCount0(); - int containerCPUs = getAvailableProcessors(); - // scale the total host load to the actual container cpus - hostTicks = hostTicks * containerCPUs / totalCPUs; - return getUsageDividesTotal(usageNanos, hostTicks); - } else { - // If CPU quotas and shares are not active then find the average system load for - // all online CPUs that are allowed to run this container. - - // If the cpuset is the same as the host's one there is no need to iterate over each CPU - if (isCpuSetSameAsHostCpuSet()) { - return getCpuLoad0(); - } else { - int[] cpuSet = containerMetrics.getEffectiveCpuSetCpus(); - // in case the effectiveCPUSetCpus are not available, attempt to use just cpusets.cpus - if (cpuSet == null || cpuSet.length <= 0) { - cpuSet = containerMetrics.getCpuSetCpus(); - } - if (cpuSet == null) { - // cgroups is mounted, but CPU resource is not limited. - // We can assume the VM is run on the host CPUs. - return getCpuLoad0(); - } else if (cpuSet.length > 0) { - double systemLoad = 0.0; - for (int cpu : cpuSet) { - double cpuLoad = getSingleCpuLoad0(cpu); - if (cpuLoad < 0) { - return -1; - } - systemLoad += cpuLoad; - } - return systemLoad / cpuSet.length; - } - return -1; - } - } + return systemLoadTicks.getContainerCpuLoad(); } return getCpuLoad0(); } public double getProcessCpuLoad() { + if (containerMetrics != null) { + return processLoadTicks.getContainerCpuLoad(); + } return getProcessCpuLoad0(); } 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 f04d8af64dd..4f9b4e427bc 100644 --- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java +++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java @@ -1575,6 +1575,10 @@ private byte[] initCEN() throws IOException { throw new ZipException("invalid CEN header (bad header size)"); } IndexNode inode = new IndexNode(cen, pos, nlen); + if (hasDotOrDotDot(inode.name)) { + throw new ZipException("ZIP file can't be opened as a file system " + + "because an entry has a '.' or '..' element in its name"); + } inodes.put(inode, inode); if (zc.isUTF8() || (flag & FLAG_USE_UTF8) != 0) { checkUTF8(inode.name); @@ -1591,6 +1595,44 @@ private byte[] initCEN() throws IOException { return cen; } + /** + * Check Inode.name to see if it includes a "." or ".." in the name array + * @param path the path as stored in Inode.name to verify + * @return true if the path contains a "." or ".." entry; false otherwise + */ + private boolean hasDotOrDotDot(byte[] path) { + // Inode.name always includes "/" in path[0] + assert path[0] == '/'; + if (path.length == 1) { + return false; + } + int index = 1; + while (index < path.length) { + int starting = index; + while (index < path.length && path[index] != '/') { + index++; + } + // Check the path snippet for a "." or ".." + if (isDotOrDotDotPath(path, starting, index)) { + return true; + } + index++; + } + return false; + } + + /** + * Check the path to see if it includes a "." or ".." + * @param path the path to check + * @return true if the path contains a "." or ".." entry; false otherwise + */ + private boolean isDotOrDotDotPath(byte[] path, int start, int index) { + int pathLen = index - start; + if ((pathLen == 1 && path[start] == '.')) + return true; + return (pathLen == 2 && path[start] == '.') && path[start + 1] == '.'; + } + private final void checkUTF8(byte[] a) throws ZipException { try { int end = a.length; diff --git a/src/jdk.zipfs/share/classes/module-info.java b/src/jdk.zipfs/share/classes/module-info.java index dcb2545b74a..da1559be28d 100644 --- a/src/jdk.zipfs/share/classes/module-info.java +++ b/src/jdk.zipfs/share/classes/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -45,6 +45,9 @@ *

  • Open an existing file as a Zip file system
  • * * + * The Zip file system provider does not support opening an existing Zip file + * that contains entries with "." or ".." in its name elements. + * *

    URI Scheme Used to Identify the Zip File System

    * * The URI {@link java.net.URI#getScheme scheme} that identifies the ZIP file system is {@code jar}. diff --git a/test/hotspot/gtest/memory/test_arena.cpp b/test/hotspot/gtest/memory/test_arena.cpp index bb65b9bac4c..148728c9864 100644 --- a/test/hotspot/gtest/memory/test_arena.cpp +++ b/test/hotspot/gtest/memory/test_arena.cpp @@ -25,9 +25,307 @@ #include "precompiled.hpp" #include "memory/arena.hpp" +#include "runtime/os.hpp" #include "utilities/align.hpp" #include "utilities/globalDefinitions.hpp" #include "unittest.hpp" +#include "testutils.hpp" + +#define ASSERT_CONTAINS(ar, p) ASSERT_TRUE(ar.contains(p)) + +// Note: +// - Amalloc returns 64bit aligned pointer (also on 32-bit) +// - AmallocWords returns word-aligned pointer +#define ASSERT_ALIGN_AMALLOC(p) ASSERT_ALIGN(p, ARENA_AMALLOC_ALIGNMENT) +#define ASSERT_ALIGN_AMALLOCWORDS(p) ASSERT_ALIGN(p, BytesPerWords) + +// Do a couple of checks on the return of a successful Amalloc +#define ASSERT_AMALLOC(ar, p) \ + ASSERT_NOT_NULL(p); \ + ASSERT_CONTAINS(ar, p); \ + ASSERT_ALIGN_AMALLOC(p); + +// #define LOG(s) tty->print_cr s; +#define LOG(s) + +// Test behavior for Amalloc(0). +// Amalloc just ignores Amalloc(0) and returns the current hwm without increasing it. +// Therefore, the returned pointer should be not null, aligned, but not (!) contained +// in the arena since hwm points beyond the arena. +TEST_VM(Arena, alloc_size_0) { + Arena ar(mtTest); + void* p = ar.Amalloc(0); + ASSERT_NOT_NULL(p); + ASSERT_ALIGN_AMALLOC(p); + if (!UseMallocOnly) { + // contains works differently for malloced mode (and there its broken anyway) + ASSERT_FALSE(ar.contains(p)); + } + // Allocate again. The new allocations should have the same position as the 0-sized + // first one. + if (!UseMallocOnly) { + void* p2 = ar.Amalloc(1); + ASSERT_AMALLOC(ar, p2); + ASSERT_EQ(p2, p); + } +} + +// Test behavior for Arealloc(p, 0) +TEST_VM(Arena, realloc_size_0) { + // Arealloc(p, 0) behaves like Afree(p). It should release the memory + // and, if top position, roll back the hwm. + Arena ar(mtTest); + void* p1 = ar.Amalloc(0x10); + ASSERT_AMALLOC(ar, p1); + void* p2 = ar.Arealloc(p1, 0x10, 0); + ASSERT_NULL(p2); + + // a subsequent allocation should get the same pointer + if (!UseMallocOnly) { + void* p3 = ar.Amalloc(0x20); + ASSERT_EQ(p3, p1); + } +} + +// Realloc equal sizes is a noop +TEST_VM(Arena, realloc_same_size) { + Arena ar(mtTest); + void* p1 = ar.Amalloc(0x200); + ASSERT_AMALLOC(ar, p1); + GtestUtils::mark_range(p1, 0x200); + + void* p2 = ar.Arealloc(p1, 0x200, 0x200); + + if (!UseMallocOnly) { + ASSERT_EQ(p2, p1); + } + ASSERT_RANGE_IS_MARKED(p2, 0x200); +} + +// Test behavior for Afree(NULL) and Arealloc(NULL, x) +TEST_VM(Arena, free_null) { + Arena ar(mtTest); + ar.Afree(NULL, 10); // should just be ignored +} + +TEST_VM(Arena, realloc_null) { + Arena ar(mtTest); + void* p = ar.Arealloc(NULL, 0, 20); // equivalent to Amalloc(20) + ASSERT_AMALLOC(ar, p); +} + +// Check Arena.Afree in a non-top position. +// The free'd allocation should be zapped (debug only), +// surrounding blocks should be unaffected. +TEST_VM(Arena, free_nontop) { + Arena ar(mtTest); + + void* p_before = ar.Amalloc(0x10); + ASSERT_AMALLOC(ar, p_before); + GtestUtils::mark_range(p_before, 0x10); + + void* p = ar.Amalloc(0x10); + ASSERT_AMALLOC(ar, p); + GtestUtils::mark_range_with(p, 0x10, 'Z'); + + void* p_after = ar.Amalloc(0x10); + ASSERT_AMALLOC(ar, p_after); + GtestUtils::mark_range(p_after, 0x10); + + ASSERT_RANGE_IS_MARKED(p_before, 0x10); + ASSERT_RANGE_IS_MARKED_WITH(p, 0x10, 'Z'); + ASSERT_RANGE_IS_MARKED(p_after, 0x10); + + ar.Afree(p, 0x10); + + ASSERT_RANGE_IS_MARKED(p_before, 0x10); + DEBUG_ONLY(ASSERT_RANGE_IS_MARKED_WITH(p, 0x10, badResourceValue);) + ASSERT_RANGE_IS_MARKED(p_after, 0x10); +} + +// Check Arena.Afree in a top position. +// The free'd allocation (non-top) should be zapped (debug only), +// the hwm should have been rolled back. +TEST_VM(Arena, free_top) { + Arena ar(mtTest); + + void* p = ar.Amalloc(0x10); + ASSERT_AMALLOC(ar, p); + GtestUtils::mark_range_with(p, 0x10, 'Z'); + + ar.Afree(p, 0x10); + DEBUG_ONLY(ASSERT_RANGE_IS_MARKED_WITH(p, 0x10, badResourceValue);) + + // a subsequent allocation should get the same pointer + if (!UseMallocOnly) { + void* p2 = ar.Amalloc(0x20); + ASSERT_EQ(p2, p); + } +} + +// In-place shrinking. +TEST_VM(Arena, realloc_top_shrink) { + if (!UseMallocOnly) { + Arena ar(mtTest); + + void* p1 = ar.Amalloc(0x200); + ASSERT_AMALLOC(ar, p1); + GtestUtils::mark_range(p1, 0x200); + + void* p2 = ar.Arealloc(p1, 0x200, 0x100); + ASSERT_EQ(p1, p2); + ASSERT_RANGE_IS_MARKED(p2, 0x100); // realloc should preserve old content + + // A subsequent allocation should be placed right after the end of the first, shrunk, allocation + void* p3 = ar.Amalloc(1); + ASSERT_EQ(p3, ((char*)p1) + 0x100); + } +} + +// not-in-place shrinking. +TEST_VM(Arena, realloc_nontop_shrink) { + Arena ar(mtTest); + + void* p1 = ar.Amalloc(200); + ASSERT_AMALLOC(ar, p1); + GtestUtils::mark_range(p1, 200); + + void* p_other = ar.Amalloc(20); // new top, p1 not top anymore + + void* p2 = ar.Arealloc(p1, 200, 100); + if (!UseMallocOnly) { + ASSERT_EQ(p1, p2); // should still shrink in place + } + ASSERT_RANGE_IS_MARKED(p2, 100); // realloc should preserve old content +} + +// in-place growing. +TEST_VM(Arena, realloc_top_grow) { + Arena ar(mtTest); // initial chunk size large enough to ensure below allocation grows in-place. + + void* p1 = ar.Amalloc(0x10); + ASSERT_AMALLOC(ar, p1); + GtestUtils::mark_range(p1, 0x10); + + void* p2 = ar.Arealloc(p1, 0x10, 0x20); + if (!UseMallocOnly) { + ASSERT_EQ(p1, p2); + } + ASSERT_RANGE_IS_MARKED(p2, 0x10); // realloc should preserve old content +} + +// not-in-place growing. +TEST_VM(Arena, realloc_nontop_grow) { + Arena ar(mtTest); + + void* p1 = ar.Amalloc(10); + ASSERT_AMALLOC(ar, p1); + GtestUtils::mark_range(p1, 10); + + void* p_other = ar.Amalloc(20); // new top, p1 not top anymore + + void* p2 = ar.Arealloc(p1, 10, 20); + ASSERT_AMALLOC(ar, p2); + ASSERT_RANGE_IS_MARKED(p2, 10); // realloc should preserve old content +} + +// -------- random alloc test ------------- + +static uint8_t canary(int i) { + return (uint8_t)('A' + i % 26); +} + +// Randomly allocate and reallocate with random sizes and differing alignments; +// check alignment; check for overwriters. +// We do this a number of times, to give chunk pool handling a good workout too. +TEST_VM(Arena, random_allocs) { + + const int num_allocs = 250 * 1000; + const int avg_alloc_size = 64; + + void** ptrs = NEW_C_HEAP_ARRAY(void*, num_allocs, mtTest); + size_t* sizes = NEW_C_HEAP_ARRAY(size_t, num_allocs, mtTest); + size_t* alignments = NEW_C_HEAP_ARRAY(size_t, num_allocs, mtTest); + + Arena ar(mtTest); + + // Allocate + for (int i = 0; i < num_allocs; i ++) { + size_t size = os::random() % (avg_alloc_size * 2); // Note: size==0 is okay; we want to test that too + size_t alignment = 0; + void* p = NULL; + if (os::random() % 2) { // randomly switch between Amalloc and AmallocWords + p = ar.Amalloc(size); + alignment = BytesPerLong; + } else { + // Inconsistency: AmallocWords wants its input size word aligned, whereas Amalloc takes + // care of alignment itself. We may want to clean this up, but for now just go with it. + size = align_up(size, BytesPerWord); + p = ar.AmallocWords(size); + alignment = BytesPerWord; + } + LOG(("[%d]: " PTR_FORMAT ", size " SIZE_FORMAT ", aligned " SIZE_FORMAT, + i, p2i(p), size, alignment)); + ASSERT_NOT_NULL(p); + ASSERT_ALIGN(p, alignment); + if (size > 0) { + ASSERT_CONTAINS(ar, p); + } + GtestUtils::mark_range_with(p, size, canary(i)); + ptrs[i] = p; sizes[i] = size; alignments[i] = alignment; + } + + // Check pattern in allocations for overwriters. + for (int i = 0; i < num_allocs; i ++) { + ASSERT_RANGE_IS_MARKED_WITH(ptrs[i], sizes[i], canary(i)); + } + + // realloc all of them + for (int i = 0; i < num_allocs; i ++) { + size_t new_size = os::random() % (avg_alloc_size * 2); // Note: 0 is possible and should work + void* p2 = ar.Arealloc(ptrs[i], sizes[i], new_size); + if (new_size > 0) { + ASSERT_NOT_NULL(p2); + ASSERT_CONTAINS(ar, p2); + ASSERT_ALIGN(p2, alignments[i]); // Realloc guarantees at least the original alignment + ASSERT_RANGE_IS_MARKED_WITH(p2, MIN2(sizes[i], new_size), canary(i)); // old content should have been preserved + + GtestUtils::mark_range_with(p2, new_size, canary(i)); // mark new range with canary + } else { + ASSERT_NULL(p2); + } + ptrs[i] = p2; sizes[i] = new_size; + LOG(("[%d]: realloc " PTR_FORMAT ", size " SIZE_FORMAT ", aligned " SIZE_FORMAT, + i, p2i(p2), new_size, alignments[i])); + } + + // Check test pattern again + // Note that we don't check the gap pattern anymore since if allocations had been shrunk in place + // this now gets difficult. + for (int i = 0; i < num_allocs; i ++) { + ASSERT_RANGE_IS_MARKED_WITH(ptrs[i], sizes[i], canary(i)); + } + + // Randomly free a bunch of allocations. + for (int i = 0; i < num_allocs; i ++) { + if (os::random() % 10 == 0) { + ar.Afree(ptrs[i], sizes[i]); + // In debug builds the freed space should be filled the space with badResourceValue + DEBUG_ONLY(ASSERT_RANGE_IS_MARKED_WITH(ptrs[i], sizes[i], badResourceValue)); + ptrs[i] = NULL; + } + } + + // Check test pattern again + for (int i = 0; i < num_allocs; i ++) { + ASSERT_RANGE_IS_MARKED_WITH(ptrs[i], sizes[i], canary(i)); + } + + // Free temp data + FREE_C_HEAP_ARRAY(char*, ptrs); + FREE_C_HEAP_ARRAY(size_t, sizes); + FREE_C_HEAP_ARRAY(size_t, alignments); +} #ifndef LP64 // These tests below are about alignment issues when mixing Amalloc and AmallocWords. diff --git a/test/hotspot/gtest/nmt/test_nmtpreinit.cpp b/test/hotspot/gtest/nmt/test_nmtpreinit.cpp new file mode 100644 index 00000000000..310cbb187b2 --- /dev/null +++ b/test/hotspot/gtest/nmt/test_nmtpreinit.cpp @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2021 SAP SE. All rights reserved. + * Copyright (c) 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. + */ + +#include "precompiled.hpp" +#include "memory/allocation.hpp" +#include "runtime/os.hpp" +#include "services/nmtPreInit.hpp" +#include "utilities/debug.hpp" +#include "utilities/ostream.hpp" +#include "unittest.hpp" + +// convenience log. switch on if debugging tests. Don't use tty, plain stdio only. +//#define LOG(...) { printf(__VA_ARGS__); printf("\n"); fflush(stdout); } +#define LOG(...) + + +// This tests the ability of the NMT pre-init system to deal with various combinations +// of pre- and post-init-allocations. + +// The tests consist of two phases: +// 1) before NMT initialization (pre-NMT-init) we allocate and reallocate a bunch of +// blocks via os::malloc() and os::realloc(), and free some of them via os::free() +// 2) after NMT initialization, we reallocate some more, then free all of them. +// +// The intent is to check that blocks allocated in pre-init phase and potentially realloced +// in pre-init phase are handled correctly if further realloc'ed or free'd post-init. + +// We manage to run tests in different phases with this technique: +// - for the pre-init phase, we start the tests in the constructor of a global object; that constructor will +// run as part of the dyn. C++ initialization of the gtestlauncher binary. Since the gtestlauncher links +// *statically* against the libjvm, gtestlauncher and libjvm initialization fold into one and are the same. +// - for the post-init phase, we just start it inside a TEST_VM scope, which needs to create the VM for +// us. So inside that scope VM initialization ran and with it the NMT initialization. +// To be sure, we assert those assumptions. + +#if INCLUDE_NMT + +// Some shorts to save writing out the flags every time +static void* os_malloc(size_t s) { return os::malloc(s, mtTest); } +static void* os_realloc(void* old, size_t s) { return os::realloc(old, s, mtTest); } + +static void log_state() { + // Don't use tty! the only safe thing to use at all times is stringStream. + char tmp[256]; + stringStream ss(tmp, sizeof(tmp)); + NMTPreInit::print_state(&ss); + LOG("%s", tmp); +} + +class TestAllocations { + void* p1, *p2, *p3, *p4; +public: + TestAllocations() { + test_pre(); + } + void test_pre() { + // Note that this part will run every time a gtestlauncher execs (so, for every TEST_OTHER_VM). + assert(NMTPreInit::in_preinit_phase(), + "This should be run in pre-init phase (as part of C++ dyn. initialization)"); + LOG("corner cases, pre-init (%d)", os::current_process_id()); + log_state(); + + p1 = os_malloc(100); // normal allocation + os::free(os_malloc(0)); // 0-sized allocation, should be free-able + p2 = os_realloc(os_malloc(10), 20); // realloc, growing + p3 = os_realloc(os_malloc(20), 10); // realloc, shrinking + p4 = os_realloc(NULL, 10); // realloc with NULL pointer + os_realloc(os_realloc(os_malloc(20), 0), 30); // realloc to size 0 and back up again + os::free(os_malloc(20)); // malloc, free + os::free(os_realloc(os_malloc(20), 30)); // malloc, realloc, free + os::free(NULL); // free(null) + DEBUG_ONLY(NMTPreInit::verify();) + + log_state(); + } + void test_post() { + assert(NMTPreInit::in_preinit_phase() == false, + "This should be run in post-init phase (from inside a TEST_VM test)"); + LOG("corner cases, post-init (%d)", os::current_process_id()); + log_state(); + + p1 = os_realloc(p1, 140); // realloc from pre-init-phase, growing + p2 = os_realloc(p2, 150); // realloc from pre-init-phase, growing + p3 = os_realloc(p3, 50); // realloc from pre-init-phase, growing + p4 = os_realloc(p4, 8); // realloc from pre-init-phase, shrinking + DEBUG_ONLY(NMTPreInit::verify();) + + log_state(); + } + void free_all() { + assert(NMTPreInit::in_preinit_phase() == false, + "This should be run in post-init phase (from inside a TEST_VM test)"); + LOG("corner cases, free-all (%d)", os::current_process_id()); + log_state(); + + os::free(p1); os::free(p2); os::free(p3); os::free(p4); + DEBUG_ONLY(NMTPreInit::verify();) + + log_state(); + } +}; + +static TestAllocations g_test_allocations; + +TEST_VM(NMTPreInit, pre_to_post_allocs) { + g_test_allocations.test_post(); + g_test_allocations.free_all(); +} + +#endif // INCLUDE_NMT diff --git a/test/hotspot/gtest/nmt/test_nmtpreinitmap.cpp b/test/hotspot/gtest/nmt/test_nmtpreinitmap.cpp new file mode 100644 index 00000000000..356c79a8d4a --- /dev/null +++ b/test/hotspot/gtest/nmt/test_nmtpreinitmap.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2021 SAP SE. All rights reserved. + * Copyright (c) 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. + */ + +#include "precompiled.hpp" +#include "jvm_io.h" +#include "memory/allocation.hpp" +#include "runtime/os.hpp" +#include "services/nmtPreInit.hpp" +#include "utilities/debug.hpp" +#include "utilities/ostream.hpp" +#include "unittest.hpp" + +#if INCLUDE_NMT + +// This tests the NMTPreInitAllocationTable hash table used to store C-heap allocations before NMT initialization ran. + +static size_t small_random_nonzero_size() { + // We keep the sizes random but not too random; the more regular the sizes, the + // more regular the malloc return pointers and the better we see how our hash + // function copes in the NMT preinit lu table. + switch (os::random() % 4) { + case 0: return 0x10; + case 1: return 0x42; + case 2: return 0x20; + case 3: return 0x80; + } + return 1; +} + +//#define VERBOSE + +static void print_and_check_table(NMTPreInitAllocationTable& table, int expected_num_entries) { + char tmp[256]; + stringStream ss(tmp, sizeof(tmp)); + char expected[256]; + jio_snprintf(expected, sizeof(expected), "entries: %d", expected_num_entries); + table.print_state(&ss); + EXPECT_EQ(::strncmp(tmp, expected, strlen(expected)), 0); +#ifdef VERBOSE + tty->print_raw(tmp); + tty->cr(); +#endif + DEBUG_ONLY(table.verify();) +} + +TEST_VM(NMTPreInit, stress_test_map) { + NMTPreInitAllocationTable table; + const int num_allocs = 32 * K; // about factor 100 more than normally expected + NMTPreInitAllocation** allocations = NEW_C_HEAP_ARRAY(NMTPreInitAllocation*, num_allocs, mtTest); + + // Fill table with allocations + for (int i = 0; i < num_allocs; i++) { + NMTPreInitAllocation* a = NMTPreInitAllocation::do_alloc(small_random_nonzero_size()); + table.add(a); + allocations[i] = a; + } + + print_and_check_table(table, num_allocs); + + // look them all up + for (int i = 0; i < num_allocs; i++) { + const NMTPreInitAllocation* a = table.find(allocations[i]->payload()); + ASSERT_EQ(a, allocations[i]); + } + + // Randomly realloc + for (int j = 0; j < num_allocs/2; j++) { + int pos = os::random() % num_allocs; + NMTPreInitAllocation* a1 = allocations[pos]; + NMTPreInitAllocation* a2 = table.find_and_remove(a1->payload()); + ASSERT_EQ(a1, a2); + NMTPreInitAllocation* a3 = NMTPreInitAllocation::do_reallocate(a2, small_random_nonzero_size()); + table.add(a3); + allocations[pos] = a3; + } + + print_and_check_table(table, num_allocs); + + // look them all up + for (int i = 0; i < num_allocs; i++) { + const NMTPreInitAllocation* a = table.find(allocations[i]->payload()); + ASSERT_EQ(a, allocations[i]); + } + + // free all + for (int i = 0; i < num_allocs; i++) { + NMTPreInitAllocation* a = table.find_and_remove(allocations[i]->payload()); + ASSERT_EQ(a, allocations[i]); + NMTPreInitAllocation::do_free(a); + allocations[i] = NULL; + } + + print_and_check_table(table, 0); + + FREE_C_HEAP_ARRAY(NMTPreInitAllocation*, allocations); +} + +#ifdef ASSERT +// Test that we will assert if the lookup table is seriously over-booked. +TEST_VM_ASSERT_MSG(NMTPreInit, assert_on_lu_table_overflow, ".*NMT preinit lookup table degenerated.*") { + NMTPreInitAllocationTable table; + const int num_allocs = 400 * 1000; // anything above ~250K entries should trigger the assert (note: normal number of entries is ~500) + for (int i = 0; i < num_allocs; i++) { + NMTPreInitAllocation* a = NMTPreInitAllocation::do_alloc(1); + table.add(a); + } +#ifdef VERBOSE + table.print_state(tty); + tty->cr(); +#endif + table.verify(); +} +#endif // ASSERT + +#endif // INCLUDE_NMT diff --git a/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp b/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp index 83e6315c589..0abc004a935 100644 --- a/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp +++ b/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp @@ -208,12 +208,20 @@ class CommittedVirtualMemoryTest { }; TEST_VM(CommittedVirtualMemoryTracker, test_committed_virtualmemory_region) { - VirtualMemoryTracker::initialize(NMT_detail); - VirtualMemoryTracker::late_initialize(NMT_detail); - CommittedVirtualMemoryTest::test(); - CommittedVirtualMemoryTest::test_committed_region(); - CommittedVirtualMemoryTest::test_partial_region(); + // This tests the VM-global NMT facility. The test must *not* modify global state, + // since that interferes with other tests! + // The gtestLauncher are called with and without -XX:NativeMemoryTracking during jtreg-controlled + // gtests. + + if (MemTracker::tracking_level() >= NMT_detail) { + CommittedVirtualMemoryTest::test(); + CommittedVirtualMemoryTest::test_committed_region(); + CommittedVirtualMemoryTest::test_partial_region(); + } else { + tty->print_cr("skipped."); + } + } #endif // INCLUDE_NMT diff --git a/test/hotspot/gtest/runtime/test_os.cpp b/test/hotspot/gtest/runtime/test_os.cpp index f09c26a606c..d19560730c7 100644 --- a/test/hotspot/gtest/runtime/test_os.cpp +++ b/test/hotspot/gtest/runtime/test_os.cpp @@ -26,6 +26,7 @@ #include "memory/resourceArea.hpp" #include "runtime/os.hpp" #include "runtime/thread.hpp" +#include "services/memTracker.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/macros.hpp" #include "utilities/ostream.hpp" @@ -412,11 +413,13 @@ struct NUMASwitcher { #endif #ifndef _AIX // JDK-8257041 -#if defined(__APPLE__) && !defined(AARCH64) // JDK-8267339 - TEST_VM(os, DISABLED_release_multi_mappings) { -#else - TEST_VM(os, release_multi_mappings) { -#endif +TEST_VM(os, release_multi_mappings) { + + // With NMT enabled, this will trigger JDK-8263464. For now disable the test if NMT=on. + if (MemTracker::tracking_level() > NMT_off) { + return; + } + // Test that we can release an area created with multiple reservation calls const size_t stripe_len = 4 * M; const int num_stripes = 4; diff --git a/test/hotspot/gtest/runtime/test_virtualMemoryTracker.cpp b/test/hotspot/gtest/runtime/test_virtualMemoryTracker.cpp index cc320ea0935..ae4457f3e93 100644 --- a/test/hotspot/gtest/runtime/test_virtualMemoryTracker.cpp +++ b/test/hotspot/gtest/runtime/test_virtualMemoryTracker.cpp @@ -21,6 +21,15 @@ * questions. */ +// Tests here test the VM-global NMT facility. +// The tests must *not* modify global state! E.g. switch NMT on or off. Instead, they +// should work passively with whatever setting the gtestlauncher had been started with +// - if NMT is enabled, test NMT, otherwise do whatever minimal tests make sense if NMT +// is off. +// +// The gtestLauncher then are called with various levels of -XX:NativeMemoryTracking during +// jtreg-controlled gtests (see test/hotspot/jtreg/gtest/NMTGtests.java) + #include "precompiled.hpp" // Included early because the NMT flags don't include it. @@ -28,10 +37,15 @@ #if INCLUDE_NMT +#include "memory/virtualspace.hpp" #include "services/memTracker.hpp" #include "services/virtualMemoryTracker.hpp" #include "utilities/globalDefinitions.hpp" #include "unittest.hpp" +#include + +// #define LOG(...) printf(__VA_ARGS__); printf("\n"); fflush(stdout); +#define LOG(...) namespace { struct R { @@ -47,11 +61,22 @@ namespace { check_inner((rmr), NULL, 0, __FILE__, __LINE__); \ } while (false) +static void diagnostic_print(ReservedMemoryRegion* rmr) { + CommittedRegionIterator iter = rmr->iterate_committed_regions(); + LOG("In reserved region " PTR_FORMAT ", size " SIZE_FORMAT_HEX ":", p2i(rmr->base()), rmr->size()); + for (const CommittedMemoryRegion* region = iter.next(); region != NULL; region = iter.next()) { + LOG(" committed region: " PTR_FORMAT ", size " SIZE_FORMAT_HEX, p2i(region->base()), region->size()); + } +} + static void check_inner(ReservedMemoryRegion* rmr, R* regions, size_t regions_size, const char* file, int line) { CommittedRegionIterator iter = rmr->iterate_committed_regions(); size_t i = 0; size_t size = 0; + // Helpful log + diagnostic_print(rmr); + #define WHERE " from " << file << ":" << line for (const CommittedMemoryRegion* region = iter.next(); region != NULL; region = iter.next()) { @@ -69,11 +94,10 @@ static void check_inner(ReservedMemoryRegion* rmr, R* regions, size_t regions_si class VirtualMemoryTrackerTest { public: static void test_add_committed_region_adjacent() { - VirtualMemoryTracker::initialize(NMT_detail); - VirtualMemoryTracker::late_initialize(NMT_detail); - address addr = (address)0x10000000; size_t size = 0x01000000; + ReservedSpace rs(size); + address addr = (address)rs.base(); address frame1 = (address)0x1234; address frame2 = (address)0x1235; @@ -81,10 +105,7 @@ class VirtualMemoryTrackerTest { NativeCallStack stack(&frame1, 1); NativeCallStack stack2(&frame2, 1); - // Add the reserved memory - VirtualMemoryTracker::add_reserved_region(addr, size, stack, mtTest); - - // Fetch the added RMR added above + // Fetch the added RMR for the space ReservedMemoryRegion* rmr = VirtualMemoryTracker::_reserved_regions->find(ReservedMemoryRegion(addr, size)); ASSERT_EQ(rmr->size(), size); @@ -147,11 +168,10 @@ class VirtualMemoryTrackerTest { } static void test_add_committed_region_adjacent_overlapping() { - VirtualMemoryTracker::initialize(NMT_detail); - VirtualMemoryTracker::late_initialize(NMT_detail); - address addr = (address)0x10000000; size_t size = 0x01000000; + ReservedSpace rs(size); + address addr = (address)rs.base(); address frame1 = (address)0x1234; address frame2 = (address)0x1235; @@ -162,7 +182,7 @@ class VirtualMemoryTrackerTest { // Add the reserved memory VirtualMemoryTracker::add_reserved_region(addr, size, stack, mtTest); - // Fetch the added RMR added above + // Fetch the added RMR for the space ReservedMemoryRegion* rmr = VirtualMemoryTracker::_reserved_regions->find(ReservedMemoryRegion(addr, size)); ASSERT_EQ(rmr->size(), size); @@ -235,11 +255,10 @@ class VirtualMemoryTrackerTest { } static void test_add_committed_region_overlapping() { - VirtualMemoryTracker::initialize(NMT_detail); - VirtualMemoryTracker::late_initialize(NMT_detail); - address addr = (address)0x10000000; size_t size = 0x01000000; + ReservedSpace rs(size); + address addr = (address)rs.base(); address frame1 = (address)0x1234; address frame2 = (address)0x1235; @@ -247,10 +266,7 @@ class VirtualMemoryTrackerTest { NativeCallStack stack(&frame1, 1); NativeCallStack stack2(&frame2, 1); - // Add the reserved memory - VirtualMemoryTracker::add_reserved_region(addr, size, stack, mtTest); - - // Fetch the added RMR added above + // Fetch the added RMR for the space ReservedMemoryRegion* rmr = VirtualMemoryTracker::_reserved_regions->find(ReservedMemoryRegion(addr, size)); ASSERT_EQ(rmr->size(), size); @@ -410,11 +426,10 @@ class VirtualMemoryTrackerTest { } static void test_remove_uncommitted_region() { - VirtualMemoryTracker::initialize(NMT_detail); - VirtualMemoryTracker::late_initialize(NMT_detail); - address addr = (address)0x10000000; size_t size = 0x01000000; + ReservedSpace rs(size); + address addr = (address)rs.base(); address frame1 = (address)0x1234; address frame2 = (address)0x1235; @@ -422,10 +437,7 @@ class VirtualMemoryTrackerTest { NativeCallStack stack(&frame1, 1); NativeCallStack stack2(&frame2, 1); - // Add the reserved memory - VirtualMemoryTracker::add_reserved_region(addr, size, stack, mtTest); - - // Fetch the added RMR added above + // Fetch the added RMR for the space ReservedMemoryRegion* rmr = VirtualMemoryTracker::_reserved_regions->find(ReservedMemoryRegion(addr, size)); ASSERT_EQ(rmr->size(), size); @@ -539,12 +551,20 @@ class VirtualMemoryTrackerTest { } }; -TEST_VM(VirtualMemoryTracker, add_committed_region) { - VirtualMemoryTrackerTest::test_add_committed_region(); +TEST_VM(NMT_VirtualMemoryTracker, add_committed_region) { + if (MemTracker::tracking_level() >= NMT_detail) { + VirtualMemoryTrackerTest::test_add_committed_region(); + } else { + tty->print_cr("skipped."); + } } -TEST_VM(VirtualMemoryTracker, remove_uncommitted_region) { - VirtualMemoryTrackerTest::test_remove_uncommitted_region(); +TEST_VM(NMT_VirtualMemoryTracker, remove_uncommitted_region) { + if (MemTracker::tracking_level() >= NMT_detail) { + VirtualMemoryTrackerTest::test_remove_uncommitted_region(); + } else { + tty->print_cr("skipped."); + } } #endif // INCLUDE_NMT diff --git a/test/hotspot/gtest/testutils.cpp b/test/hotspot/gtest/testutils.cpp new file mode 100644 index 00000000000..47351f056af --- /dev/null +++ b/test/hotspot/gtest/testutils.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021 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 "runtime/os.hpp" +#include "utilities/align.hpp" +#include "utilities/ostream.hpp" + +#include "testutils.hpp" +#include "unittest.hpp" + +#include + +// Note: these could be made more suitable for covering large ranges (e.g. just mark one byte per page). + +void GtestUtils::mark_range_with(void* p, size_t s, uint8_t mark) { + if (p != NULL && s > 0) { + ::memset(p, mark, s); + } +} + +bool GtestUtils::check_range(const void* p, size_t s, uint8_t expected) { + if (p == NULL || s == 0) { + return true; + } + + const char* first_wrong = NULL; + char* p2 = (char*)p; + const char* const end = p2 + s; + while (p2 < end) { + if (*p2 != (char)expected) { + first_wrong = p2; + break; + } + p2 ++; + } + + if (first_wrong != NULL) { + tty->print_cr("wrong pattern around " PTR_FORMAT, p2i(first_wrong)); + // Note: We deliberately print the surroundings too without bounds check. Might be interesting, + // and os::print_hex_dump uses SafeFetch, so this is fine without bounds checks. + os::print_hex_dump(tty, (address)(align_down(p2, 0x10) - 0x10), + (address)(align_up(end, 0x10) + 0x10), 1); + } + + return first_wrong == NULL; +} diff --git a/test/hotspot/gtest/testutils.hpp b/test/hotspot/gtest/testutils.hpp new file mode 100644 index 00000000000..8ed72f4644f --- /dev/null +++ b/test/hotspot/gtest/testutils.hpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021 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 TESTUTILS_HPP +#define TESTUTILS_HPP + +#include "memory/allStatic.hpp" +#include "utilities/globalDefinitions.hpp" +#include "unittest.hpp" + +class GtestUtils : public AllStatic { +public: + + // Fill range with a byte mark. + // Tolerates p == NULL or s == 0. + static void mark_range_with(void* p, size_t s, uint8_t mark); + + // Given a memory range, check that the whole range is filled with the expected byte. + // If not, hex dump around first non-matching address and return false. + // If p == NULL or size == 0, returns true. + static bool check_range(const void* p, size_t s, uint8_t expected); + + // Convenience method with a predefined byte mark. + static void mark_range(void* p, size_t s) { mark_range_with(p, s, 32); } + static bool check_range(const void* p, size_t s) { return check_range(p, s, 32); } + +}; + +#define ASSERT_RANGE_IS_MARKED_WITH(p, size, mark) ASSERT_TRUE(GtestUtils::check_range(p, size, mark)) +#define ASSERT_RANGE_IS_MARKED(p, size) ASSERT_TRUE(GtestUtils::check_range(p, size)) + +// Convenience asserts +#define ASSERT_NOT_NULL(p) ASSERT_NE(p, (char*)NULL) +#define ASSERT_NULL(p) ASSERT_EQ(p, (char*)NULL) + +#define ASSERT_ALIGN(p, n) ASSERT_TRUE(is_aligned(p, n)) + +#endif // TESTUTILS_HPP diff --git a/test/hotspot/gtest/utilities/test_resourceHash.cpp b/test/hotspot/gtest/utilities/test_resourceHash.cpp index a10241a84f3..bc0c7f85d12 100644 --- a/test/hotspot/gtest/utilities/test_resourceHash.cpp +++ b/test/hotspot/gtest/utilities/test_resourceHash.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -60,6 +60,21 @@ class CommonResourceHashtableTest : public ::testing::Test { } }; + class DeleterTestIter { + int _val; + public: + DeleterTestIter(int i) : _val(i) {} + + bool do_entry(K const& k, V const& v) { + if ((uintptr_t) k == (uintptr_t) _val) { + // Delete me! + return true; + } else { + return false; // continue iteration + } + } + }; + }; class SmallResourceHashtableTest : public CommonResourceHashtableTest { @@ -76,7 +91,7 @@ class SmallResourceHashtableTest : public CommonResourceHashtableTest { static void test(V step) { EqualityTestIter et; - ResourceHashtable rh; + ResourceHashtable rh; ASSERT_FALSE(rh.contains(as_K(step))); @@ -208,7 +223,7 @@ class GenericResourceHashtableTest : public CommonResourceHashtableTest { static void test(unsigned num_elements = SIZE) { EqualityTestIter et; - ResourceHashtable rh; + ResourceHashtable rh; for (uintptr_t i = 0; i < num_elements; ++i) { ASSERT_TRUE(rh.put(as_K(i), i)); @@ -233,6 +248,15 @@ class GenericResourceHashtableTest : public CommonResourceHashtableTest { ASSERT_FALSE(rh.remove(as_K(index))); } rh.iterate(&et); + + // Add more entries in and then delete one. + for (uintptr_t i = 10; i > 0; --i) { + uintptr_t index = i - 1; + ASSERT_TRUE(rh.put(as_K(index), index)); + } + DeleterTestIter dt(5); + rh.unlink(&dt); + ASSERT_FALSE(rh.get(as_K(5))); } }; }; diff --git a/test/hotspot/jtreg/ProblemList-zgc.txt b/test/hotspot/jtreg/ProblemList-zgc.txt index b792278fe9d..e0d6ef70dcd 100644 --- a/test/hotspot/jtreg/ProblemList-zgc.txt +++ b/test/hotspot/jtreg/ProblemList-zgc.txt @@ -40,3 +40,9 @@ serviceability/sa/ClhsdbPmap.java#id1 8268722 macosx-x serviceability/sa/ClhsdbPstack.java#id1 8268722 macosx-x64 serviceability/sa/TestJmapCore.java 8268722,8268283 macosx-x64,linux-aarch64 serviceability/sa/TestJmapCoreMetaspace.java 8268722,8268636 generic-all + +serviceability/sa/TestJhsdbJstackMixed.java 8248912 generic-all +serviceability/sa/ClhsdbPstack.java#id0 8248912 generic-all +serviceability/sa/ClhsdbPstack.java#id1 8248912 generic-all + +compiler/valhalla/inlinetypes/TestNativeClone.java 8270098 generic-all diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 2ed16a16cc9..dc4301fcda9 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -106,7 +106,7 @@ applications/jcstress/copy.java 8229852 linux-x64 # :hotspot_serviceability -serviceability/sa/sadebugd/DebugdConnectTest.java 8239062 macosx-x64 +serviceability/sa/sadebugd/DebugdConnectTest.java 8239062,8270326 macosx-x64,macosx-aarch64 serviceability/sa/TestRevPtrsForInvokeDynamic.java 8241235 generic-all resourcehogs/serviceability/sa/TestHeapDumpForLargeArray.java 8262386 generic-all @@ -118,8 +118,6 @@ serviceability/sa/ClhsdbFindPC.java#id1 8269982 macosx-aarch64 serviceability/sa/ClhsdbFindPC.java#id3 8269982 macosx-aarch64 serviceability/sa/ClhsdbPstack.java#id1 8269982 macosx-aarch64 -serviceability/dcmd/gc/HeapDumpAllTest.java 8270341 generic-x64 - # Valhalla TODO: serviceability/sa/ClhsdbCDSCore.java 8190936 generic-all serviceability/sa/ClhsdbCDSJstackPrintAll.java 8190936 generic-all @@ -146,8 +144,6 @@ serviceability/sa/TestJmapCore.java 8190936 generic-all serviceability/sa/TestJmapCoreMetaspace.java 8190936 generic-all serviceability/sa/TestPrintMdo.java 8190936 generic-all serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java 8190936 generic-all -compiler/valhalla/inlinetypes/TestNativeClone.java 8270098 generic-all - ############################################################################# diff --git a/test/hotspot/jtreg/TEST.ROOT b/test/hotspot/jtreg/TEST.ROOT index a6f242b8c98..cb10a02899f 100644 --- a/test/hotspot/jtreg/TEST.ROOT +++ b/test/hotspot/jtreg/TEST.ROOT @@ -40,7 +40,7 @@ groups=TEST.groups TEST.quick-groups # to determine additional characteristics of the system for use with the @requires tag. # Note: compiled bootlibs classes will be added to BCP. requires.extraPropDefns = ../../jtreg-ext/requires/VMProps.java -requires.extraPropDefns.bootlibs = ../../lib/sun +requires.extraPropDefns.bootlibs = ../../lib/jdk/test/whitebox requires.extraPropDefns.libs = \ ../../lib/jdk/test/lib/Platform.java \ ../../lib/jdk/test/lib/Container.java diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups index 1611f95fb7a..f2bb4b69264 100644 --- a/test/hotspot/jtreg/TEST.groups +++ b/test/hotspot/jtreg/TEST.groups @@ -105,7 +105,8 @@ tier1_common = \ sanity/BasicVMTest.java \ gtest/GTestWrapper.java \ gtest/MetaspaceGtests.java \ - gtest/LargePageGtests.java + gtest/LargePageGtests.java \ + gtest/NMTGtests.java \ tier1_compiler = \ :tier1_compiler_1 \ @@ -315,7 +316,6 @@ tier1_runtime = \ -runtime/modules/LoadUnloadModuleStress.java \ -runtime/modules/ModuleStress/ExportModuleStressTest.java \ -runtime/modules/ModuleStress/ModuleStressGC.java \ - -runtime/NMT \ -runtime/ReservedStack \ -runtime/SelectionResolution/AbstractMethodErrorTest.java \ -runtime/SelectionResolution/IllegalAccessErrorTest.java \ @@ -494,7 +494,8 @@ hotspot_runtime_minimalvm = \ runtime/logging hotspot_nmt = \ - runtime/NMT + runtime/NMT \ + gtest/NMTGtests.java hotspot_rest_runtime = \ :hotspot_runtime \ diff --git a/test/hotspot/jtreg/compiler/c2/TestDeadLoopSplitIfLoop.java b/test/hotspot/jtreg/compiler/c2/TestDeadLoopSplitIfLoop.java new file mode 100644 index 00000000000..2a5bc0324f9 --- /dev/null +++ b/test/hotspot/jtreg/compiler/c2/TestDeadLoopSplitIfLoop.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 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 + * @key stress randomness + * @requires vm.compiler2.enabled + * @bug 8268019 + * @summary Splitting an If through a dying loop header region that is not a LoopNode, yet, results in a dead data loop. + * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:CompileCommand=compileonly,compiler.c2.TestDeadLoopSplitIfLoop::test -XX:+UnlockDiagnosticVMOptions + * -XX:+StressIGVN -XX:StressSeed=2382674767 -XX:CompileCommand=dontinline,compiler.c2.TestDeadLoopSplitIfLoop::test + * compiler.c2.TestDeadLoopSplitIfLoop + * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:CompileCommand=compileonly,compiler.c2.TestDeadLoopSplitIfLoop::test -XX:+UnlockDiagnosticVMOptions + * -XX:+StressIGVN -XX:CompileCommand=dontinline,compiler.c2.TestDeadLoopSplitIfLoop::test + * compiler.c2.TestDeadLoopSplitIfLoop + */ +package compiler.c2; + +public class TestDeadLoopSplitIfLoop { + int a; + int b; + boolean c; + + public static void main(String[] g) { + TestDeadLoopSplitIfLoop h = new TestDeadLoopSplitIfLoop(); + h.test(); + } + + void test() { + int e = 4; + long f[] = new long[a]; + if (c) { + } else if (c) { + // Dead path is removed after parsing which results in a dead data loop for certain node orderings in IGVN. + switch (126) { + case 126: + do { + f[e] = b; + switch (6) { + case 7: + f = f; + } + } while (e++ < 93); + } + } + } +} diff --git a/test/hotspot/jtreg/compiler/c2/TestRenumberLiveNodesInfiniteLoop.java b/test/hotspot/jtreg/compiler/c2/TestRenumberLiveNodesInfiniteLoop.java new file mode 100644 index 00000000000..8b04eecb514 --- /dev/null +++ b/test/hotspot/jtreg/compiler/c2/TestRenumberLiveNodesInfiniteLoop.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2021, 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 8270886 + * @library /test/lib + * @summary Crash in PhaseIdealLoop::verify_strip_mined_scheduling + * + * @run main TestRenumberLiveNodesInfiniteLoop + * + */ + +import jdk.test.lib.Utils; + +public class TestRenumberLiveNodesInfiniteLoop { + public long m2 (double a_do0, byte a_by1){ + double do3 = -2074076350.2364243247; + int in4 = 129; + do3 = do3; + return -3480877547L; + } + + public void mainTest (String[] args){ + byte by14 = (byte)9; + long lo15 = 1502432357L; + short sha16[] = new short[473]; + + for (short sh17 : sha16) { + try { + sha16[2] = (short)23; + for (int i18 = 0; i18 < 17; i18++) { + sha16[i18] = sh17; + m2(1120187380.53448312, by14); + } + } catch (ArithmeticException a_e) {} + sha16[1] = sh17; + sha16[2] = sh17; + } + m2(825278101.1289499682, by14); + by14 = (byte)(by14 - by14); + for (int i19 = 0; i19 < 20; i19++) { + if (i19 == i19) { + sha16[i19] *= (short)-24; + i19 = i19; + } + for (short sh20 : sha16) { + for (int i21 = 0; i21 < 83; i21++) { + sha16[0] -= (short)-46; + i19 += 127; + } + for (int i22 = 0; i22 < 89; i22++) { + i22 = 8; + } + } + ; + } + ; + ; + for (int i23 = 0; i23 < 33; i23++) { + sha16[i23] = (short)46; + for (int i24 = 0; i24 < 94; i24++) { + sha16[2] = (short)-3; + } + } + sha16[0] = (short)14; + for (int i25 = 0; i25 < 35; i25++) { + for (short sh26 : sha16) { + if (i25 > 5) { + m2(1121925038.1118634045, by14); + } + } + m2(-1914069692.1375346593, (byte)16); + } + ; + for (int i27 = 0; i27 < 10; i27++) { + for (int i28 = 0; i28 < 44; i28++) { + if (i28 == i28) { + break; + } + sha16[i27] = (short)62; + for (int i29 = 0; i29 < 95; i29++) { + sha16[2] = (short)50; + sha16[2] = (short)30; + m2(1250986231.1599386644, by14); + } + } + sha16[2] = (short)28; + m2(672818118.3111172289, (byte)0); + } + sha16[0] = (short)19; + sha16[5] = (short)((short)-11 * (short)60); + for (int i30 = 0; i30 < 38; i30++) { + sha16[i30] = (short)43; + sha16[i30] = (short)49; + try { + for (short sh31 : sha16) { + m2(720645491.3777510146, by14); + sha16[i30] -= (short)-44; + sha16[i30] = (short)58; + } + for (short sh32 : sha16) { + m2(-3548500610.1703635180 % -2696439975.1456774235 % 2299457624.855537726, by14); + sha16[2] = (short)12; + sha16[i30] = (short)8; + } + i30 = 4; + } catch (ArithmeticException a_e) {} + } + for (int i33 = 0; i33 < 31; i33++) { + for (int i34 = 0; i34 < i33; i34++) { + try { + sha16[i34] /= (short)-25; + i34 = -65536; + i33 = i33; + } catch (ArithmeticException a_e) {} + for (short sh35 : sha16) { + sha16[i34] += sha16[i33]; + sha16[i34] = sh35; + sha16[i33] = (short)15; + } + for (short sh36 : sha16) { + m2(3573835015.2140351447, by14); + m2(2984270380.1830267895, by14); + } + } + sha16[i33] = (short)57; + m2(-3061961160.3118322232, (byte)-4); + } + sha16[256] -= (short)50; + } + + public static void main(String[] args) throws Exception{ + Thread thread = new Thread() { + public void run() { + TestRenumberLiveNodesInfiniteLoop instance = new TestRenumberLiveNodesInfiniteLoop(); + for (int i = 0; i < 100; ++i) { + instance.mainTest(args); + } + } + }; + // Give thread some time to trigger compilation + thread.setDaemon(true); + thread.start(); + Thread.sleep(Utils.adjustTimeout(4000)); + } +} diff --git a/test/hotspot/jtreg/compiler/ciReplay/TestInlining.java b/test/hotspot/jtreg/compiler/ciReplay/TestInlining.java new file mode 100644 index 00000000000..d3e93fd7617 --- /dev/null +++ b/test/hotspot/jtreg/compiler/ciReplay/TestInlining.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2016, 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 8270925 + * @library / /test/lib + * @summary testing of ciReplay with inlining + * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.debug == true & vm.compiler2.enabled + * @modules java.base/jdk.internal.misc + * @build sun.hotspot.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * compiler.ciReplay.TestInlining + */ + +package compiler.ciReplay; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.Path; +import java.util.List; +import java.util.StringTokenizer; +import jdk.test.lib.Asserts; + +public class TestInlining extends CiReplayBase { + public static void main(String args[]) { + new TestInlining().runTest(false, TIERED_DISABLED_VM_OPTION); + } + + @Override + public void testAction() { + try { + Path replayFilePath = Paths.get(REPLAY_FILE_NAME); + List replayContent = Files.readAllLines(replayFilePath); + boolean found = false; + for (int i = 0; i < replayContent.size(); i++) { + String line = replayContent.get(i); + if (line.startsWith("compile ")) { + StringTokenizer tokenizer = new StringTokenizer(line, " "); + Asserts.assertEQ(tokenizer.nextToken(), "compile"); + tokenizer.nextToken(); // class + tokenizer.nextToken(); // method + tokenizer.nextToken(); // signature + tokenizer.nextToken(); // bci + Asserts.assertEQ(tokenizer.nextToken(), "4"); // level + Asserts.assertEQ(tokenizer.nextToken(), "inline"); + found = true; + } + } + Asserts.assertEQ(found, true); + } catch (IOException ioe) { + throw new Error("Failed to read/write replay data: " + ioe, ioe); + } + } +} + diff --git a/test/hotspot/jtreg/compiler/jvmci/compilerToVM/AllocateCompileIdTest.java b/test/hotspot/jtreg/compiler/jvmci/compilerToVM/AllocateCompileIdTest.java index e8bb9ca5c17..4c4804e3702 100644 --- a/test/hotspot/jtreg/compiler/jvmci/compilerToVM/AllocateCompileIdTest.java +++ b/test/hotspot/jtreg/compiler/jvmci/compilerToVM/AllocateCompileIdTest.java @@ -37,9 +37,9 @@ * jdk.internal.vm.ci/jdk.vm.ci.runtime * * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper - * sun.hotspot.WhiteBox sun.hotspot.parser.DiagnosticCommand + * sun.hotspot.WhiteBox jdk.test.whitebox.parser.DiagnosticCommand * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox - * sun.hotspot.parser.DiagnosticCommand + * jdk.test.whitebox.parser.DiagnosticCommand * @run main/othervm -Xbootclasspath/a:. * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI * -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java b/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java index a5b72599668..4c45db26b34 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java @@ -24,12 +24,12 @@ package compiler.lib.ir_framework; import compiler.lib.ir_framework.driver.IRMatcher; -import compiler.lib.ir_framework.shared.TestFormat; -import compiler.lib.ir_framework.shared.TestFormatException; +import compiler.lib.ir_framework.shared.*; +import jdk.test.lib.Platform; +import sun.hotspot.WhiteBox; import java.util.ArrayList; import java.util.List; -import java.util.regex.Pattern; /** * This class provides default regex strings that can be used in {@link IR @IR} annotations to specify IR constraints. @@ -48,15 +48,20 @@ public class IRNode { private static final String START = "(\\d+(\\s){2}("; private static final String MID = ".*)+(\\s){2}===.*"; private static final String END = ")"; + private static final String COMPOSITE_PREFIX = "#PRE#"; // Prefix for regexes that require an additional user-defined string. + private static final String IS_REPLACED = "#IS_REPLACED#"; // Is replaced by an additional user-defined string. + private static final String STORE_OF_CLASS_POSTFIX = "(:|\\+)\\S* \\*" + END; + private static final String LOAD_OF_CLASS_POSTFIX = "(:|\\+)\\S* \\*" + END; - public static final String ALLOC = "(.*precise klass .*\\R(.*(movl|xorl|nop|spill).*\\R)*.*call,static wrapper for: _new_instance_Java" + END; - public static final String ALLOC_OF = "(.*precise klass .*"; - public static final String ALLOC_ARRAY = "(.*precise klass \\[L.*\\R(.*(movl|xorl|nop|spill).*\\R)*.*call,static wrapper for: _new_array_Java" + END; - public static final String ALLOC_ARRAY_OF = "(.*precise klass \\[L.*"; + public static final String ALLOC = "(.*precise klass .*\\R((.*(?i:mov|xorl|nop|spill).*|\\s*|.*LGHI.*)\\R)*.*(?i:call,static).*wrapper for: _new_instance_Java" + END; + public static final String ALLOC_OF = COMPOSITE_PREFIX + "(.*precise klass .*" + IS_REPLACED + ":.*\\R((.*(?i:mov|xorl|nop|spill).*|\\s*|.*LGHI.*)\\R)*.*(?i:call,static).*wrapper for: _new_instance_Java" + END; + public static final String ALLOC_ARRAY = "(.*precise klass \\[L.*\\R((.*(?i:mov|xor|nop|spill).*|\\s*|.*LGHI.*)\\R)*.*(?i:call,static).*wrapper for: _new_array_Java" + END; + public static final String ALLOC_ARRAY_OF = COMPOSITE_PREFIX + "(.*precise klass \\[L.*" + IS_REPLACED + ";:.*\\R((.*(?i:mov|xorl|nop|spill).*|\\s*|.*LGHI.*)\\R)*.*(?i:call,static).*wrapper for: _new_array_Java" + END; - public static final String CHECKCAST_ARRAY = "(cmp.*precise klass \\[.*;:" + END; - public static final String CHECKCAST_ARRAY_OF = "(cmp.*precise klass \\[.*"; - public static final String CHECKCAST_ARRAYCOPY = "(.*call_leaf_nofp,runtime checkcast_arraycopy.*" + END; + public static final String CHECKCAST_ARRAY = "(((?i:cmp|CLFI|CLR).*precise klass \\[.*;:|.*(?i:mov|or).*precise klass \\[.*;:.*\\R.*(cmp|CMP|CLR))" + END; + public static final String CHECKCAST_ARRAY_OF = COMPOSITE_PREFIX + "(((?i:cmp|CLFI|CLR).*precise klass \\[.*" + IS_REPLACED + ";:|.*(?i:mov|or).*precise klass \\[.*" + IS_REPLACED + ";:.*\\R.*(cmp|CMP|CLR))" + END; + // Does not work on s390 (a rule containing this regex will be skipped on s390). + public static final String CHECKCAST_ARRAYCOPY = "(.*((?i:call_leaf_nofp,runtime)|CALL,\\s?runtime leaf nofp|BCTRL.*.leaf call).*checkcast_arraycopy.*" + END; public static final String FIELD_ACCESS = "(.*Field: *" + END; @@ -69,16 +74,16 @@ public class IRNode { public static final String STORE_D = START + "StoreD" + MID + END; public static final String STORE_P = START + "StoreP" + MID + END; public static final String STORE_N = START + "StoreN" + MID + END; - public static final String STORE_OF_CLASS = START + "Store(B|C|S|I|L|F|D|P|N)" + MID + "@\\S*"; - public static final String STORE_B_OF_CLASS = START + "StoreB" + MID + "@\\S*"; - public static final String STORE_C_OF_CLASS = START + "StoreC" + MID + "@\\S*"; - public static final String STORE_I_OF_CLASS = START + "StoreI" + MID + "@\\S*"; - public static final String STORE_L_OF_CLASS = START + "StoreL" + MID + "@\\S*"; - public static final String STORE_F_OF_CLASS = START + "StoreF" + MID + "@\\S*"; - public static final String STORE_D_OF_CLASS = START + "StoreD" + MID + "@\\S*"; - public static final String STORE_P_OF_CLASS = START + "StoreP" + MID + "@\\S*"; - public static final String STORE_N_OF_CLASS = START + "StoreN" + MID + "@\\S*"; - public static final String STORE_OF_FIELD = START + "Store(B|C|S|I|L|F|D|P|N)" + MID + "@.*name="; + public static final String STORE_OF_CLASS = COMPOSITE_PREFIX + START + "Store(B|C|S|I|L|F|D|P|N)" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_B_OF_CLASS = COMPOSITE_PREFIX + START + "StoreB" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_C_OF_CLASS = COMPOSITE_PREFIX + START + "StoreC" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_I_OF_CLASS = COMPOSITE_PREFIX + START + "StoreI" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_L_OF_CLASS = COMPOSITE_PREFIX + START + "StoreL" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_F_OF_CLASS = COMPOSITE_PREFIX + START + "StoreF" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_D_OF_CLASS = COMPOSITE_PREFIX + START + "StoreD" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_P_OF_CLASS = COMPOSITE_PREFIX + START + "StoreP" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_N_OF_CLASS = COMPOSITE_PREFIX + START + "StoreN" + MID + "@\\S*" + IS_REPLACED + STORE_OF_CLASS_POSTFIX; + public static final String STORE_OF_FIELD = COMPOSITE_PREFIX + START + "Store(B|C|S|I|L|F|D|P|N)" + MID + "@.*name=" + IS_REPLACED + ",.*" + END; public static final String LOAD = START + "Load(B|UB|S|US|I|L|F|D|P|N)" + MID + END; public static final String LOAD_B = START + "LoadB" + MID + END; @@ -91,22 +96,22 @@ public class IRNode { public static final String LOAD_D = START + "LoadD" + MID + END; public static final String LOAD_P = START + "LoadP" + MID + END; public static final String LOAD_N = START + "LoadN" + MID + END; - public static final String LOAD_OF_CLASS = START + "Load(B|UB|S|US|I|L|F|D|P|N)" + MID + "@\\S*"; - public static final String LOAD_B_OF_CLASS = START + "LoadB" + MID + "@\\S*"; - public static final String LOAD_UB_OF_CLASS = START + "LoadUB" + MID + "@\\S*"; - public static final String LOAD_S_OF_CLASS = START + "LoadS" + MID + "@\\S*"; - public static final String LOAD_US_OF_CLASS = START + "LoadUS" + MID + "@\\S*"; - public static final String LOAD_I_OF_CLASS = START + "LoadI" + MID + "@\\S*"; - public static final String LOAD_L_OF_CLASS = START + "LoadL" + MID + "@\\S*"; - public static final String LOAD_F_OF_CLASS = START + "LoadF" + MID + "@\\S*"; - public static final String LOAD_D_OF_CLASS = START + "LoadD" + MID + "@\\S*"; - public static final String LOAD_P_OF_CLASS = START + "LoadP" + MID + "@\\S*"; - public static final String LOAD_N_OF_CLASS = START + "LoadN" + MID + "@\\S*"; - public static final String LOAD_OF_FIELD = START + "Load(B|C|S|I|L|F|D|P|N)" + MID + "@.*name="; + public static final String LOAD_OF_CLASS = COMPOSITE_PREFIX + START + "Load(B|UB|S|US|I|L|F|D|P|N)" + MID + "@\\S*"+ IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_B_OF_CLASS = COMPOSITE_PREFIX + START + "LoadB" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_UB_OF_CLASS = COMPOSITE_PREFIX + START + "LoadUB" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_S_OF_CLASS = COMPOSITE_PREFIX + START + "LoadS" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_US_OF_CLASS = COMPOSITE_PREFIX + START + "LoadUS" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_I_OF_CLASS = COMPOSITE_PREFIX + START + "LoadI" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_L_OF_CLASS = COMPOSITE_PREFIX + START + "LoadL" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_F_OF_CLASS = COMPOSITE_PREFIX + START + "LoadF" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_D_OF_CLASS = COMPOSITE_PREFIX + START + "LoadD" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_P_OF_CLASS = COMPOSITE_PREFIX + START + "LoadP" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_N_OF_CLASS = COMPOSITE_PREFIX + START + "LoadN" + MID + "@\\S*" + IS_REPLACED + LOAD_OF_CLASS_POSTFIX; + public static final String LOAD_OF_FIELD = COMPOSITE_PREFIX + START + "Load(B|C|S|I|L|F|D|P|N)" + MID + "@.*name=" + IS_REPLACED + ",.*" + END; public static final String LOAD_KLASS = START + "LoadK" + MID + END; - public static final String LOOP = START + "Loop" + MID + "" + END; - public static final String COUNTEDLOOP = START + "CountedLoop\\b" + MID + "" + END; + public static final String LOOP = START + "Loop" + MID + END; + public static final String COUNTEDLOOP = START + "CountedLoop\\b" + MID + END; public static final String COUNTEDLOOP_MAIN = START + "CountedLoop\\b" + MID + "main" + END; public static final String CALL = START + "CallStaticJava" + MID + END; @@ -118,20 +123,12 @@ public class IRNode { public static final String NULL_ASSERT_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*null_assert" + END; public static final String RANGE_CHECK_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*range_check" + END; public static final String UNHANDLED_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*unhandled" + END; + // Does not work for VM builds without JVMCI like x86_32 (a rule containing this regex will be skipped without having JVMCI built). public static final String INTRINSIC_OR_TYPE_CHECKED_INLINING_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*intrinsic_or_type_checked_inlining" + END; public static final String SCOPE_OBJECT = "(.*# ScObj.*" + END; public static final String MEMBAR = START + "MemBar" + MID + END; - - private static final String ALLOC_OF_POSTFIX = ":.*\\R(.*(movl|xorl|nop|spill).*\\R)*.*call,static wrapper for: _new_instance_Java" + END; - private static final String ALLOC_ARRAY_OF_POSTFIX = ";:.*\\R(.*(movl|xorl|nop|spill).*\\R)*.*call,static wrapper for: _new_array_Java" + END; - private static final String CHECKCAST_ARRAY_OF_POSTFIX = ";:" + END; - private static final String STORE_OF_FIELD_POSTFIX = ",.*" + END; - private static final String STORE_OF_CLASS_POSTFIX = "(:|\\+)\\S* \\*" + END; - private static final String LOAD_OF_CLASS_POSTFIX = "(:|\\+)\\S* \\*" + END; - private static final String LOAD_OF_FIELD_POSTFIX = ",.*" + END; - /** * Called by {@link IRMatcher} to merge special composite nodes together with additional user-defined input. */ @@ -139,29 +136,72 @@ public static List mergeNodes(String[] nodes) { List mergedNodes = new ArrayList<>(); for (int i = 0; i < nodes.length; i += 2) { String node = nodes[i]; - switch (node) { - case ALLOC_OF -> mergeCompositeNodes(nodes, mergedNodes, i, node, ALLOC_OF_POSTFIX, "ALLOC_OF"); - case ALLOC_ARRAY_OF -> mergeCompositeNodes(nodes, mergedNodes, i, node, ALLOC_ARRAY_OF_POSTFIX, "ALLOC_ARRAY_OF"); - case CHECKCAST_ARRAY_OF -> mergeCompositeNodes(nodes, mergedNodes, i, node, CHECKCAST_ARRAY_OF_POSTFIX, "CHECKCAST_ARRAY_OF"); - case STORE_OF_CLASS, STORE_B_OF_CLASS, STORE_C_OF_CLASS, STORE_D_OF_CLASS, STORE_F_OF_CLASS, STORE_I_OF_CLASS, - STORE_L_OF_CLASS, STORE_N_OF_CLASS, STORE_P_OF_CLASS - -> mergeCompositeNodes(nodes, mergedNodes, i, node, STORE_OF_CLASS_POSTFIX, "STORE_OF_CLASS"); - case STORE_OF_FIELD -> mergeCompositeNodes(nodes, mergedNodes, i, node, STORE_OF_FIELD_POSTFIX, "STORE_OF_FIELD"); - case LOAD_OF_CLASS, LOAD_B_OF_CLASS, LOAD_UB_OF_CLASS, LOAD_D_OF_CLASS, LOAD_F_OF_CLASS, LOAD_I_OF_CLASS, LOAD_L_OF_CLASS, - LOAD_N_OF_CLASS, LOAD_P_OF_CLASS, LOAD_S_OF_CLASS, LOAD_US_OF_CLASS - -> mergeCompositeNodes(nodes, mergedNodes, i, node, LOAD_OF_CLASS_POSTFIX, "LOAD_OF_CLASS"); - case LOAD_OF_FIELD -> mergeCompositeNodes(nodes, mergedNodes, i, node, LOAD_OF_FIELD_POSTFIX, "LOAD_OF_FIELD"); - default -> { - i--; // No composite node, do not increment by 2. - mergedNodes.add(node); + if (node.startsWith(COMPOSITE_PREFIX)) { + if (i + 1 == nodes.length) { + reportMissingCompositeValue(node, i); } + // Replace placeholder with user defined string. + node = node.substring(COMPOSITE_PREFIX.length()).replaceAll(IS_REPLACED, nodes[i + 1]); + } else { + i--; // No composite node, do not increment by 2. } + mergedNodes.add(node); } return mergedNodes; } - private static void mergeCompositeNodes(String[] nodes, List mergedNodes, int i, String node, String postFix, String varName) { - TestFormat.check(i + 1 < nodes.length, "Must provide class name at index " + (i + 1) + " right after " + varName); - mergedNodes.add(node + Pattern.quote(nodes[i + 1]) + postFix); + /** + * Is default regex supported on current platform, used VM build, etc.? + * Throws a {@link CheckedTestFrameworkException} if the default regex is unsupported. + */ + public static void checkDefaultRegexSupported(String node) throws CheckedTestFrameworkException { + switch (node) { + case INTRINSIC_OR_TYPE_CHECKED_INLINING_TRAP -> { + if (!WhiteBox.getWhiteBox().isJVMCISupportedByGC()) { + throw new CheckedTestFrameworkException("INTRINSIC_OR_TYPE_CHECKED_INLINING_TRAP is unsupported in builds without JVMCI."); + } + } + case CHECKCAST_ARRAYCOPY -> { + if (Platform.isS390x()) { + throw new CheckedTestFrameworkException("CHECKCAST_ARRAYCOPY is unsupported on s390."); + } + } + // default: do nothing -> default regex is supported + } + } + + /** + * Mapping from string variable value to string variable name for better error reporting. + */ + private static void reportMissingCompositeValue(String node, int i) { + String varName = switch (node) { + case ALLOC_OF -> "ALLOC_OF"; + case ALLOC_ARRAY_OF -> "ALLOC_ARRAY_OF"; + case CHECKCAST_ARRAY_OF -> "CHECKCAST_ARRAY_OF"; + case STORE_OF_CLASS -> "STORE_OF_CLASS"; + case STORE_B_OF_CLASS -> "STORE_B_OF_CLASS"; + case STORE_C_OF_CLASS -> "STORE_C_OF_CLASS"; + case STORE_D_OF_CLASS -> "STORE_D_OF_CLASS"; + case STORE_F_OF_CLASS -> "STORE_F_OF_CLASS"; + case STORE_I_OF_CLASS -> "STORE_I_OF_CLASS"; + case STORE_L_OF_CLASS -> "STORE_L_OF_CLASS"; + case STORE_N_OF_CLASS -> "STORE_N_OF_CLASS"; + case STORE_P_OF_CLASS -> "STORE_P_OF_CLASS"; + case STORE_OF_FIELD -> "STORE_OF_FIELD"; + case LOAD_OF_CLASS -> "LOAD_OF_CLASS"; + case LOAD_B_OF_CLASS -> "LOAD_B_OF_CLASS"; + case LOAD_UB_OF_CLASS -> "LOAD_UB_OF_CLASS"; + case LOAD_D_OF_CLASS -> "LOAD_D_OF_CLASS"; + case LOAD_F_OF_CLASS -> "LOAD_F_OF_CLASS"; + case LOAD_I_OF_CLASS -> "LOAD_I_OF_CLASS"; + case LOAD_L_OF_CLASS -> "LOAD_L_OF_CLASS"; + case LOAD_N_OF_CLASS -> "LOAD_N_OF_CLASS"; + case LOAD_P_OF_CLASS -> "LOAD_P_OF_CLASS"; + case LOAD_S_OF_CLASS -> "LOAD_S_OF_CLASS"; + case LOAD_US_OF_CLASS -> "LOAD_US_OF_CLASS"; + case LOAD_OF_FIELD -> "LOAD_OF_FIELD"; + default -> throw new TestFrameworkException("Missing variable mapping for " + node); + }; + TestFormat.fail("Must provide additional value at index " + (i + 1) + " right after " + varName); } } diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/Test.java b/test/hotspot/jtreg/compiler/lib/ir_framework/Test.java index b15a0f273b7..34936827180 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/Test.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/Test.java @@ -71,8 +71,8 @@ * * *

    - * Examples on how to write base tests can be found in {@link jdk.test.lib.hotspot.ir_framework.examples.BaseTestExample} - * and also as part of the internal testing in the package {@link jdk.test.lib.hotspot.ir_framework.tests}. + * Examples on how to write base tests can be found in {@link ir_framework.examples.BaseTestExample} + * and also as part of the internal testing in the package {@link ir_framework.tests}. * * @see Arguments */ diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java b/test/hotspot/jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java index ed8484e54bc..d5aa12976ba 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/driver/TestVMProcess.java @@ -69,7 +69,7 @@ public TestVMProcess(List additionalFlags, Class testClass, Set socketTask; private final ServerSocket serverSocket; + private boolean receivedStdOut = false; public TestFrameworkSocket() { try { @@ -88,6 +92,9 @@ private FutureTask initSocketTask() { String next; while ((next = in.readLine()) != null) { builder.append(next).append(System.lineSeparator()); + if (next.startsWith(STDOUT_PREFIX)) { + receivedStdOut = true; + } } return builder.toString(); } catch (IOException e) { @@ -108,14 +115,14 @@ public void close() { /** * Only called by test VM to write to server socket. */ - public static void write(String msg, String type) { - write(msg, type, false); + public static void write(String msg, String tag) { + write(msg, tag, false); } /** * Only called by test VM to write to server socket. */ - public static void write(String msg, String type, boolean stdout) { + public static void write(String msg, String tag, boolean stdout) { if (REPRODUCE) { System.out.println("Debugging Test VM: Skip writing due to -DReproduce"); return; @@ -129,7 +136,7 @@ public static void write(String msg, String type, boolean stdout) { clientWriter = new PrintWriter(clientSocket.getOutputStream(), true); } if (stdout) { - msg = STDOUT_PREFIX + msg; + msg = STDOUT_PREFIX + tag + " " + msg; } clientWriter.println(msg); } catch (Exception e) { @@ -145,7 +152,7 @@ Did you directly run the test VM (TestVM class) throw new TestRunException(failMsg, e); } if (TestFramework.VERBOSE) { - System.out.println("Written " + type + " to socket:"); + System.out.println("Written " + tag + " to socket:"); System.out.println(msg); } } @@ -178,4 +185,11 @@ public String getOutput() { throw new TestFrameworkException("Could not read from socket task", e); } } + + /** + * Return whether test VM sent messages to be put on stdout (starting with {@link ::STDOUT_PREFIX}). + */ + public boolean hasStdOut() { + return receivedStdOut; + } } 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 57e8bd4f2d3..dc3a2d304eb 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java @@ -96,6 +96,9 @@ public void emitRuleEncoding(Method m, boolean skipped) { private boolean shouldApplyIrRule(IR irAnno) { checkIRAnnotations(irAnno); + if (isDefaultRegexUnsupported(irAnno)) { + return false; + } if (irAnno.applyIf().length != 0) { return hasAllRequiredFlags(irAnno.applyIf(), "applyIf"); } @@ -141,7 +144,21 @@ private void checkIRAnnotations(IR irAnno) { } TestFormat.checkNoThrow(applyRules <= 1, "Can only specify one apply constraint " + failAt()); + } + private boolean isDefaultRegexUnsupported(IR irAnno) { + try { + for (String s : irAnno.failOn()) { + IRNode.checkDefaultRegexSupported(s); + } + for (String s : irAnno.counts()) { + IRNode.checkDefaultRegexSupported(s); + } + } catch (CheckedTestFrameworkException e) { + TestFrameworkSocket.write("Skip Rule " + ruleIndex + ": " + e.getMessage(), TestFrameworkSocket.DEFAULT_REGEX_TAG, true); + return true; + } + return false; } private boolean hasAllRequiredFlags(String[] andRules, String ruleType) { diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/test/TestVM.java b/test/hotspot/jtreg/compiler/lib/ir_framework/test/TestVM.java index f5bad469fcd..87d392dcec5 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/test/TestVM.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/test/TestVM.java @@ -796,7 +796,7 @@ private void runTests() { System.out.println("Run " + test.toString()); } if (testFilterPresent) { - TestFrameworkSocket.write("Run " + test.toString(), "testfilter", true); + TestFrameworkSocket.write("Run " + test.toString(), TestFrameworkSocket.TESTLIST_TAG, true); } try { test.run(); diff --git a/test/hotspot/jtreg/compiler/loopopts/TestMainNeverExecuted.java b/test/hotspot/jtreg/compiler/loopopts/TestMainNeverExecuted.java new file mode 100644 index 00000000000..fb8dee44333 --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/TestMainNeverExecuted.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021, 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 8271272 + * @summary C2: assert(!had_error) failed: bad dominance + * + * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:CompileOnly=TestMainNeverExecuted TestMainNeverExecuted + * + */ + +public class TestMainNeverExecuted { + public static long y; + static int iArrFld[] = new int[400]; + static long x = 0; + + public static void main(String[] strArr) { + for (int i1 = 0; i1 < 100; i1++) + vMeth(3, 5); + } + static void vMeth(int f, int g) { + int i3 = 23; + int i11 = 2, i12 = 12, i13 = 32901, i14 = 43741; + for (i11 = 7; i11 < 325; ++i11) { + i13 = 1; + while ((i13 += 3) < 5) { + iArrFld[i13 - 1] = 906; + for (i14 = i13; i14 < 5; i14 += 2) { + y += i14; + i3 += i14; + } + } + } + x += i11 + i12 + i13 + i14; + } +} diff --git a/test/hotspot/jtreg/compiler/valhalla/inlinetypes/InlineTypes.java b/test/hotspot/jtreg/compiler/valhalla/inlinetypes/InlineTypes.java index c6a2d980af9..c3d51a29c00 100644 --- a/test/hotspot/jtreg/compiler/valhalla/inlinetypes/InlineTypes.java +++ b/test/hotspot/jtreg/compiler/valhalla/inlinetypes/InlineTypes.java @@ -111,11 +111,12 @@ static class IRNode { protected static final String MID = ".*)+ ===.*"; protected static final String END = ")"; // Generic allocation - protected static final String ALLOC_G = "(.*call,static wrapper for: _new_instance_Java" + END; - protected static final String ALLOCA_G = "(.*call,static wrapper for: _new_array_Java" + END; + protected static final String ALLOC_G = "(.*call,static.*wrapper for: _new_instance_Java" + END; + protected static final String ALLOCA_G = "(.*call,static.*wrapper for: _new_array_Java" + END; // Inline type allocation - protected static final String ALLOC = "(.*precise klass compiler/valhalla/inlinetypes/MyValue.*\\R(.*(movl|xorl|nop|spill).*\\R)*.*_new_instance_Java" + END; - protected static final String ALLOCA = "(.*precise klass \\[(L|Q)compiler/valhalla/inlinetypes/MyValue.*\\R(.*(movl|xorl|nop|spill).*\\R)*.*_new_array_Java" + END; + protected static final String MYVALUE_ARRAY_KLASS = "precise klass \\[(L|Q)compiler/valhalla/inlinetypes/MyValue"; + protected static final String ALLOC = "(.*precise klass compiler/valhalla/inlinetypes/MyValue.*\\R(.*(?i:mov|xorl|nop|spill).*\\R)*.*_new_instance_Java" + END; + protected static final String ALLOCA = "(.*" + MYVALUE_ARRAY_KLASS + ".*\\R(.*(?i:mov|xorl|nop|spill).*\\R)*.*_new_array_Java" + END; protected static final String LOAD = START + "Load(B|S|I|L|F|D|P|N)" + MID + "@compiler/valhalla/inlinetypes/MyValue.*" + END; protected static final String LOADK = START + "LoadK" + MID + END; protected static final String STORE = START + "Store(B|C|S|I|L|F|D|P|N)" + MID + "@compiler/valhalla/inlinetypes/MyValue.*" + END; @@ -126,12 +127,14 @@ static class IRNode { protected static final String LINKTOSTATIC = START + "CallStaticJava" + MID + "linkToStatic" + END; protected static final String NPE = START + "CallStaticJava" + MID + "null_check" + END; protected static final String CALL = START + "CallStaticJava" + MID + END; + protected static final String CALL_LEAF = "(CALL, runtime leaf|call_leaf,runtime)"; + protected static final String CALL_LEAF_NOFP = "(CALL, runtime leaf nofp|call_leaf_nofp,runtime)"; protected static final String STORE_INLINE_FIELDS = START + "CallStaticJava" + MID + "store_inline_type_fields" + END; protected static final String SCOBJ = "(.*# ScObj.*" + END; - protected static final String LOAD_UNKNOWN_INLINE = "(.*call_leaf,runtime load_unknown_inline.*" + END; - protected static final String STORE_UNKNOWN_INLINE = "(.*call_leaf,runtime store_unknown_inline.*" + END; - protected static final String INLINE_ARRAY_NULL_GUARD = "(.*call,static wrapper for: uncommon_trap.*reason='null_check' action='none'.*" + END; - protected static final String INTRINSIC_SLOW_PATH = "(.*call,static wrapper for: uncommon_trap.*reason='intrinsic_or_type_checked_inlining'.*" + END; + protected static final String LOAD_UNKNOWN_INLINE = "(.*" + CALL_LEAF + ".*load_unknown_inline.*" + END; + protected static final String STORE_UNKNOWN_INLINE = "(.*" + CALL_LEAF + ".*store_unknown_inline.*" + END; + protected static final String INLINE_ARRAY_NULL_GUARD = "(.*call,static.*wrapper for: uncommon_trap.*reason='null_check' action='none'.*" + END; + protected static final String INTRINSIC_SLOW_PATH = "(.*call,static.*wrapper for: uncommon_trap.*reason='intrinsic_or_type_checked_inlining'.*" + END; protected static final String CLONE_INTRINSIC_SLOW_PATH = "(.*call,static.*java.lang.Object::clone.*" + END; protected static final String CLASS_CHECK_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*class_check" + END; protected static final String NULL_CHECK_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*null_check" + END; @@ -140,9 +143,9 @@ static class IRNode { protected static final String UNHANDLED_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*unhandled" + END; protected static final String PREDICATE_TRAP = START + "CallStaticJava" + MID + "uncommon_trap.*predicate" + END; protected static final String MEMBAR = START + "MemBar" + MID + END; - protected static final String CHECKCAST_ARRAY = "(cmp.*precise klass \\[(L|Q)compiler/valhalla/inlinetypes/MyValue.*" + END; - protected static final String CHECKCAST_ARRAYCOPY = "(.*call_leaf_nofp,runtime checkcast_arraycopy.*" + END; - protected static final String JLONG_ARRAYCOPY = "(.*call_leaf_nofp,runtime jlong_disjoint_arraycopy.*" + END; + protected static final String CHECKCAST_ARRAY = "(((?i:cmp|CLFI|CLR).*" + MYVALUE_ARRAY_KLASS + ".*;:|.*(?i:mov|or).*" + MYVALUE_ARRAY_KLASS + ".*;:.*\\R.*(cmp|CMP|CLR))" + END; + protected static final String CHECKCAST_ARRAYCOPY = "(.*" + CALL_LEAF_NOFP + ".*checkcast_arraycopy.*" + END; + protected static final String JLONG_ARRAYCOPY = "(.*" + CALL_LEAF_NOFP + ".*jlong_disjoint_arraycopy.*" + END; protected static final String FIELD_ACCESS = "(.*Field: *" + END; protected static final String SUBSTITUTABILITY_TEST = START + "CallStaticJava" + MID + "java.lang.invoke.ValueBootstrapMethods::isSubstitutable" + END; } diff --git a/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestIntrinsics.java b/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestIntrinsics.java index 071438bd219..d4e7d058fd1 100644 --- a/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestIntrinsics.java +++ b/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestIntrinsics.java @@ -1193,4 +1193,223 @@ public void test62_verifier() { // Expected } } + + // compareAndSet to flattened field in object + @Test + public boolean test63(MyValue1 oldVal, MyValue1 newVal) { + if (TEST31_VT_FLATTENED) { + return U.compareAndSetValue(this, TEST31_VT_OFFSET, MyValue1.class.asValueType(), oldVal, newVal); + } else { + return U.compareAndSetReference(this, TEST31_VT_OFFSET, oldVal, newVal); + } + } + + @Run(test = "test63") + public void test63_verifier() { + MyValue1 vt = MyValue1.createWithFieldsInline(rI, rL); + test31_vt = MyValue1.default; + + boolean res = test63(test31_vt, vt); + // Checks are disabled for non-flattened field because reference comparison + // fails if C2 scalarizes and re-allocates the inline type arguments. + if (TEST31_VT_FLATTENED) { + Asserts.assertTrue(res); + Asserts.assertEQ(test31_vt, vt); + } + + res = test63(MyValue1.default, MyValue1.default); + if (TEST31_VT_FLATTENED) { + Asserts.assertFalse(res); + Asserts.assertEQ(test31_vt, vt); + } + } + + // compareAndSet to flattened field in array + @Test + public boolean test64(MyValue1[] arr, MyValue1 oldVal, Object newVal) { + if (TEST33_FLATTENED_ARRAY) { + return U.compareAndSetValue(arr, TEST33_BASE_OFFSET + TEST33_INDEX_SCALE, MyValue1.class.asValueType(), oldVal, newVal); + } else { + return U.compareAndSetReference(arr, TEST33_BASE_OFFSET + TEST33_INDEX_SCALE, oldVal, newVal); + } + } + + @Run(test = "test64") + public void test64_verifier() { + MyValue1[] arr = new MyValue1[2]; + MyValue1 vt = MyValue1.createWithFieldsInline(rI, rL); + + boolean res = test64(arr, arr[1], vt); + // Checks are disabled for non-flattened array because reference comparison + // fails if C2 scalarizes and re-allocates the inline type arguments. + if (TEST33_FLATTENED_ARRAY) { + Asserts.assertTrue(res); + Asserts.assertEQ(arr[1], vt); + } + + res = test64(arr, MyValue1.default, MyValue1.default); + if (TEST33_FLATTENED_ARRAY) { + Asserts.assertFalse(res); + Asserts.assertEQ(arr[1], vt); + } + } + + // compareAndSet to flattened field in object with unknown container + @Test + public boolean test65(Object o, Object oldVal, MyValue1 newVal) { + if (TEST31_VT_FLATTENED) { + return U.compareAndSetValue(o, TEST31_VT_OFFSET, MyValue1.class.asValueType(), oldVal, newVal); + } else { + return U.compareAndSetReference(o, TEST31_VT_OFFSET, oldVal, newVal); + } + } + + @Run(test = "test65") + public void test65_verifier() { + MyValue1 vt = MyValue1.createWithFieldsInline(rI, rL); + test31_vt = MyValue1.default; + + boolean res = test65(this, test31_vt, vt); + Asserts.assertTrue(res); + Asserts.assertEQ(test31_vt, vt); + + res = test65(this, MyValue1.default, MyValue1.default); + Asserts.assertFalse(res); + Asserts.assertEQ(test31_vt, vt); + } + + // compareAndSet to flattened field in object, non-inline arguments to compare and set + @Test + public boolean test66(Object oldVal, Object newVal) { + if (TEST31_VT_FLATTENED) { + return U.compareAndSetValue(this, TEST31_VT_OFFSET, MyValue1.class.asValueType(), oldVal, newVal); + } else { + return U.compareAndSetReference(this, TEST31_VT_OFFSET, oldVal, newVal); + } + } + + @Run(test = "test66") + public void test66_verifier() { + MyValue1 vt = MyValue1.createWithFieldsInline(rI, rL); + test31_vt = MyValue1.default; + + boolean res = test66(test31_vt, vt); + Asserts.assertTrue(res); + Asserts.assertEQ(test31_vt, vt); + + res = test66(MyValue1.default, MyValue1.default); + Asserts.assertFalse(res); + Asserts.assertEQ(test31_vt, vt); + } + + // compareAndExchange to flattened field in object + @Test + public Object test67(MyValue1 oldVal, MyValue1 newVal) { + if (TEST31_VT_FLATTENED) { + return U.compareAndExchangeValue(this, TEST31_VT_OFFSET, MyValue1.class.asValueType(), oldVal, newVal); + } else { + return U.compareAndExchangeReference(this, TEST31_VT_OFFSET, oldVal, newVal); + } + } + + @Run(test = "test67") + public void test67_verifier() { + MyValue1 vt = MyValue1.createWithFieldsInline(rI, rL); + MyValue1 oldVal = MyValue1.default; + test31_vt = oldVal; + + Object res = test67(test31_vt, vt); + // Checks are disabled for non-flattened field because reference comparison + // fails if C2 scalarizes and re-allocates the inline type arguments. + if (TEST31_VT_FLATTENED) { + Asserts.assertEQ(res, oldVal); + Asserts.assertEQ(test31_vt, vt); + } + + res = test67(MyValue1.default, MyValue1.default); + if (TEST31_VT_FLATTENED) { + Asserts.assertEQ(res, vt); + Asserts.assertEQ(test31_vt, vt); + } + } + + // compareAndExchange to flattened field in array + @Test + public Object test68(MyValue1[] arr, MyValue1 oldVal, Object newVal) { + if (TEST33_FLATTENED_ARRAY) { + return U.compareAndExchangeValue(arr, TEST33_BASE_OFFSET + TEST33_INDEX_SCALE, MyValue1.class.asValueType(), oldVal, newVal); + } else { + return U.compareAndExchangeReference(arr, TEST33_BASE_OFFSET + TEST33_INDEX_SCALE, oldVal, newVal); + } + } + + @Run(test = "test68") + public void test68_verifier() { + MyValue1[] arr = new MyValue1[2]; + MyValue1 vt = MyValue1.createWithFieldsInline(rI, rL); + + Object res = test68(arr, arr[1], vt); + // Checks are disabled for non-flattened array because reference comparison + // fails if C2 scalarizes and re-allocates the inline type arguments. + if (TEST33_FLATTENED_ARRAY) { + Asserts.assertEQ(res, MyValue1.default); + Asserts.assertEQ(arr[1], vt); + } + + res = test68(arr, MyValue1.default, MyValue1.default); + if (TEST33_FLATTENED_ARRAY) { + Asserts.assertEQ(res, vt); + Asserts.assertEQ(arr[1], vt); + } + } + + // compareAndExchange to flattened field in object with unknown container + @Test + public Object test69(Object o, Object oldVal, MyValue1 newVal) { + if (TEST31_VT_FLATTENED) { + return U.compareAndExchangeValue(o, TEST31_VT_OFFSET, MyValue1.class.asValueType(), oldVal, newVal); + } else { + return U.compareAndExchangeReference(o, TEST31_VT_OFFSET, oldVal, newVal); + } + } + + @Run(test = "test69") + public void test69_verifier() { + MyValue1 vt = MyValue1.createWithFieldsInline(rI, rL); + MyValue1 oldVal = MyValue1.default; + test31_vt = oldVal; + + Object res = test69(this, test31_vt, vt); + Asserts.assertEQ(res, oldVal); + Asserts.assertEQ(test31_vt, vt); + + res = test69(this, MyValue1.default, MyValue1.default); + Asserts.assertEQ(res, vt); + Asserts.assertEQ(test31_vt, vt); + } + + // compareAndExchange to flattened field in object, non-inline arguments to compare and set + @Test + public Object test70(Object oldVal, Object newVal) { + if (TEST31_VT_FLATTENED) { + return U.compareAndExchangeValue(this, TEST31_VT_OFFSET, MyValue1.class.asValueType(), oldVal, newVal); + } else { + return U.compareAndExchangeReference(this, TEST31_VT_OFFSET, oldVal, newVal); + } + } + + @Run(test = "test70") + public void test70_verifier() { + MyValue1 vt = MyValue1.createWithFieldsInline(rI, rL); + MyValue1 oldVal = MyValue1.default; + test31_vt = oldVal; + + Object res = test70(test31_vt, vt); + Asserts.assertEQ(res, oldVal); + Asserts.assertEQ(test31_vt, vt); + + res = test70(MyValue1.default, MyValue1.default); + Asserts.assertEQ(res, vt); + Asserts.assertEQ(test31_vt, vt); + } } diff --git a/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestUnloadedInlineTypeField.java b/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestUnloadedInlineTypeField.java index 819dca6c90b..97aa8c3eadb 100644 --- a/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestUnloadedInlineTypeField.java +++ b/test/hotspot/jtreg/compiler/valhalla/inlinetypes/TestUnloadedInlineTypeField.java @@ -36,7 +36,7 @@ * @key randomness * @summary Test the handling of fields of unloaded inline classes. * @library /test/lib / - * @requires os.simpleArch == "x64" + * @requires (os.simpleArch == "x64" | os.simpleArch == "aarch64") * @compile hack/GetUnresolvedInlineFieldWrongSignature.java * @compile TestUnloadedInlineTypeField.java * @run driver/timeout=300 compiler.valhalla.inlinetypes.TestUnloadedInlineTypeField diff --git a/test/hotspot/jtreg/gc/arguments/TestParallelRefProc.java b/test/hotspot/jtreg/gc/arguments/TestParallelRefProc.java index 2af16cf506e..6e50a17fb12 100644 --- a/test/hotspot/jtreg/gc/arguments/TestParallelRefProc.java +++ b/test/hotspot/jtreg/gc/arguments/TestParallelRefProc.java @@ -51,7 +51,9 @@ public static void main(String args[]) throws Exception { } if (GC.Parallel.isSupported()) { noneGCSupported = false; - testFlag(new String[] { "-XX:+UseParallelGC" }, true); + testFlag(new String[] { "-XX:+UseParallelGC", "-XX:ParallelGCThreads=1" }, false); + testFlag(new String[] { "-XX:+UseParallelGC", "-XX:ParallelGCThreads=2" }, true); + testFlag(new String[] { "-XX:+UseParallelGC", "-XX:-ParallelRefProcEnabled", "-XX:ParallelGCThreads=2" }, false); } if (GC.G1.isSupported()) { noneGCSupported = false; diff --git a/test/hotspot/jtreg/gc/g1/TestMixedGCLiveThreshold.java b/test/hotspot/jtreg/gc/g1/TestMixedGCLiveThreshold.java index 88012b68fe7..a12a83d9127 100644 --- a/test/hotspot/jtreg/gc/g1/TestMixedGCLiveThreshold.java +++ b/test/hotspot/jtreg/gc/g1/TestMixedGCLiveThreshold.java @@ -24,14 +24,36 @@ package gc.g1; /* - * @test TestMixedGCLiveThreshold - * @summary Test G1MixedGCLiveThresholdPercent. Fill up a region to at least 1/3 region-size, - * the region should not be selected for mixed GC cycle if liveness is above threshold. + * @test id=0percent + * @summary Test G1MixedGCLiveThresholdPercent=0. Fill up a region to at least 33 percent, + * the region should not be selected for mixed GC cycle. * @requires vm.gc.G1 * @library /test/lib * @build sun.hotspot.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox - * @run driver gc.g1.TestMixedGCLiveThreshold + * @run driver gc.g1.TestMixedGCLiveThreshold 0 false + */ + +/* + * @test id=25percent + * @summary Test G1MixedGCLiveThresholdPercent=25. Fill up a region to at least 33 percent, + * the region should not be selected for mixed GC cycle. + * @requires vm.gc.G1 + * @library /test/lib + * @build sun.hotspot.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @run driver gc.g1.TestMixedGCLiveThreshold 25 false + */ + +/* + * @test id=100percent + * @summary Test G1MixedGCLiveThresholdPercent=100. Fill up a region to at least 33 percent, + * the region should be selected for mixed GC cycle. + * @requires vm.gc.G1 + * @library /test/lib + * @build sun.hotspot.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @run driver gc.g1.TestMixedGCLiveThreshold 100 true */ import java.util.ArrayList; @@ -48,14 +70,9 @@ public class TestMixedGCLiveThreshold { private static final String pattern = "Remembered Set Tracking update regions total ([0-9]+), selected ([0-9]+)$"; public static void main(String[] args) throws Exception { - // -XX:G1MixedGCLiveThresholdPercent=0 - testMixedGCLiveThresholdPercent(0, false); - - // -XX:G1MixedGCLiveThresholdPercent=25 - testMixedGCLiveThresholdPercent(25, false); - - // -XX:G1MixedGCLiveThresholdPercent=100 - testMixedGCLiveThresholdPercent(100, true); + int liveThresholdPercent = Integer.parseInt(args[0]); + boolean expectRebuild = Boolean.parseBoolean(args[1]); + testMixedGCLiveThresholdPercent(liveThresholdPercent, expectRebuild); } private static void testMixedGCLiveThresholdPercent(int liveThresholdPercent, boolean expectedRebuild) throws Exception { @@ -71,6 +88,7 @@ private static void testMixedGCLiveThresholdPercent(int liveThresholdPercent, bo " no regions should be selected") ); output.shouldHaveExitValue(0); + output.reportDiagnosticSummary(); } private static OutputAnalyzer testWithMixedGCLiveThresholdPercent(int percent) throws Exception { diff --git a/test/hotspot/jtreg/gtest/ArenaGtests.java b/test/hotspot/jtreg/gtest/ArenaGtests.java new file mode 100644 index 00000000000..ee8ec94e456 --- /dev/null +++ b/test/hotspot/jtreg/gtest/ArenaGtests.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020, 2021, 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. + * + */ + +/* + * Note: This runs the Arena portion of the gtests with UseMallocOnly + * (restricted to debug since UseMallocOnly is debug-only) + */ + +/* @test + * @bug 8271242 + * @summary Run arena tests with UseMallocOnly + * @requires vm.debug + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.xml + * @requires vm.flagless + * @run main/native GTestWrapper --gtest_filter=Arena* -XX:+UseMallocOnly + */ diff --git a/test/hotspot/jtreg/gtest/NMTGtests.java b/test/hotspot/jtreg/gtest/NMTGtests.java new file mode 100644 index 00000000000..b79f46395fb --- /dev/null +++ b/test/hotspot/jtreg/gtest/NMTGtests.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021 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. + * + */ + +/* + * This tests NMT by running gtests with NMT enabled. + * + * To save time, we just run them for debug builds (where we would catch assertions) and only a selection of tests + * (namely, NMT tests themselves, and - for the detail statistics - os tests, since those reserve a lot and stress NMT) + */ + +/* @test id=nmt-summary + * @summary Run NMT-related gtests with summary statistics + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.xml + * @requires vm.debug + * @run main/native GTestWrapper --gtest_filter=NMT* -XX:NativeMemoryTracking=summary + */ + +/* @test id=nmt-detail + * @summary Run NMT-related gtests with detailed statistics + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.xml + * @requires vm.debug + * @run main/native GTestWrapper --gtest_filter=NMT*:os* -XX:NativeMemoryTracking=detail + */ diff --git a/test/hotspot/jtreg/runtime/ClassFile/UnsupportedClassFileVersion.java b/test/hotspot/jtreg/runtime/ClassFile/UnsupportedClassFileVersion.java index 255e5e402cc..3ac53335ea4 100644 --- a/test/hotspot/jtreg/runtime/ClassFile/UnsupportedClassFileVersion.java +++ b/test/hotspot/jtreg/runtime/ClassFile/UnsupportedClassFileVersion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -27,8 +27,7 @@ * @modules java.base/jdk.internal.org.objectweb.asm * java.base/jdk.internal.misc * java.management - * @compile -XDignore.symbol.file UnsupportedClassFileVersion.java - * @run main UnsupportedClassFileVersion + * @run driver UnsupportedClassFileVersion */ import java.io.File; diff --git a/test/hotspot/jtreg/runtime/CompressedOops/CompressedClassPointers.java b/test/hotspot/jtreg/runtime/CompressedOops/CompressedClassPointers.java index 23471904a3e..c46b32b220d 100644 --- a/test/hotspot/jtreg/runtime/CompressedOops/CompressedClassPointers.java +++ b/test/hotspot/jtreg/runtime/CompressedOops/CompressedClassPointers.java @@ -26,6 +26,7 @@ * @bug 8024927 * @summary Testing address of compressed class pointer space as best as possible. * @requires vm.bits == 64 & !vm.graal.enabled + * @requires vm.flagless * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/CompressedOops/CompressedClassSpaceSize.java b/test/hotspot/jtreg/runtime/CompressedOops/CompressedClassSpaceSize.java index 0a25b68567e..aaa6b1f03dd 100644 --- a/test/hotspot/jtreg/runtime/CompressedOops/CompressedClassSpaceSize.java +++ b/test/hotspot/jtreg/runtime/CompressedOops/CompressedClassSpaceSize.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -26,6 +26,7 @@ * @bug 8022865 * @summary Tests for the -XX:CompressedClassSpaceSize command line option * @requires vm.bits == 64 & vm.opt.final.UseCompressedOops == true + * @requires vm.flagless * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/CompressedOops/CompressedKlassPointerAndOops.java b/test/hotspot/jtreg/runtime/CompressedOops/CompressedKlassPointerAndOops.java index 78275cf6f9f..28c517bbca9 100644 --- a/test/hotspot/jtreg/runtime/CompressedOops/CompressedKlassPointerAndOops.java +++ b/test/hotspot/jtreg/runtime/CompressedOops/CompressedKlassPointerAndOops.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -29,6 +29,7 @@ * @modules java.base/jdk.internal.misc * java.management * @requires vm.bits == 64 + * @requires vm.flagless * @run driver CompressedKlassPointerAndOops */ diff --git a/test/hotspot/jtreg/runtime/CompressedOops/ObjectAlignment.java b/test/hotspot/jtreg/runtime/CompressedOops/ObjectAlignment.java index 2570b118d4f..f9c6d6921aa 100644 --- a/test/hotspot/jtreg/runtime/CompressedOops/ObjectAlignment.java +++ b/test/hotspot/jtreg/runtime/CompressedOops/ObjectAlignment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -25,6 +25,7 @@ * @test * @bug 8022865 * @summary Tests for the -XX:ObjectAlignmentInBytes command line option + * @requires vm.flagless * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java b/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java index a4accdf2d08..d20f2f36a8d 100644 --- a/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java +++ b/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java @@ -25,6 +25,7 @@ * @test * @bug 8022865 * @summary Tests for different combination of UseCompressedOops options + * @requires vm.flagless * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/EnclosingMethodAttr/EnclMethodAttr.java b/test/hotspot/jtreg/runtime/EnclosingMethodAttr/EnclMethodAttr.java index 605a8a9a700..db6b924078b 100644 --- a/test/hotspot/jtreg/runtime/EnclosingMethodAttr/EnclMethodAttr.java +++ b/test/hotspot/jtreg/runtime/EnclosingMethodAttr/EnclMethodAttr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -44,6 +44,7 @@ public static void main(String args[]) throws Throwable { System.out.println("Regression test for bug 8044738"); ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("EnclMethTest"); OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotHaveExitValue(0); output.shouldContain("java.lang.ClassFormatError: Wrong EnclosingMethod"); } } diff --git a/test/hotspot/jtreg/runtime/ErrorHandling/ClassPathEnvVar.java b/test/hotspot/jtreg/runtime/ErrorHandling/ClassPathEnvVar.java new file mode 100644 index 00000000000..e0aeb937910 --- /dev/null +++ b/test/hotspot/jtreg/runtime/ErrorHandling/ClassPathEnvVar.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 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 8271003 + * @summary CLASSPATH env variable setting should not be truncated in a hs err log. + * @requires vm.debug + * @library /test/lib + * @run driver ClassPathEnvVar + */ +import java.io.File; +import java.util.Map; + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class ClassPathEnvVar { + private static final String pathSep = File.pathSeparator; + private static final String sep = File.separator; + private static final String classPathEnv = "CLASSPATH"; + private static final String endPath = "end-path"; + + public static void main(String[] args) throws Exception { + OutputAnalyzer output = runCrasher().shouldContain("CreateCoredumpOnCrash turned off, no core file dumped") + .shouldNotHaveExitValue(0); + + checkErrorLog(output); + + } + private static OutputAnalyzer runCrasher() throws Exception { + ProcessBuilder pb = + ProcessTools.createJavaProcessBuilder("-XX:-CreateCoredumpOnCrash", + "-XX:ErrorHandlerTest=14", + "-XX:+ErrorFileToStdout"); + + // Obtain the CLASSPATH setting and expand it to more than 2000 chars. + Map envMap = pb.environment(); + String cp = envMap.get(classPathEnv); + if (cp == null) { + cp = "this" + sep + "is" + sep + "dummy" + sep + "path"; + } + while (cp.length() < 2000) { + cp += pathSep + cp; + } + cp += pathSep + endPath; + envMap.put(classPathEnv, cp); + + return new OutputAnalyzer(pb.start()); + } + + private static void checkErrorLog(OutputAnalyzer output) throws Exception { + String classPathLine = output.firstMatch("CLASSPATH=.*"); + + if (classPathLine == null) { + throw new RuntimeException("CLASSPATH setting not found in hs err log."); + } + + // Check if the CLASSPATH line has been truncated. + if (!classPathLine.endsWith(endPath)) { + throw new RuntimeException("CLASSPATH was truncated in the hs err log."); + } + } +} diff --git a/test/hotspot/jtreg/runtime/LoadClass/LoadClassNegative.java b/test/hotspot/jtreg/runtime/LoadClass/LoadClassNegative.java index c9d8c6f9453..45360a251d6 100644 --- a/test/hotspot/jtreg/runtime/LoadClass/LoadClassNegative.java +++ b/test/hotspot/jtreg/runtime/LoadClass/LoadClassNegative.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -25,6 +25,7 @@ * @test * @bug 8020675 * @summary make sure there is no fatal error if a class is loaded from an invalid jar file which is in the bootclasspath + * @requires vm.flagless * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/LoadClass/LongBCP.java b/test/hotspot/jtreg/runtime/LoadClass/LongBCP.java index 51f397c6b40..e14cb45df87 100644 --- a/test/hotspot/jtreg/runtime/LoadClass/LongBCP.java +++ b/test/hotspot/jtreg/runtime/LoadClass/LongBCP.java @@ -26,6 +26,7 @@ * @summary JVM should be able to handle full path (directory path plus * class name) or directory path longer than MAX_PATH specified * in -Xbootclasspath/a on windows. + * @requires vm.flagless * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/LoadClass/TestResize.java b/test/hotspot/jtreg/runtime/LoadClass/TestResize.java index 609f3ab890d..80fa4b0ceff 100644 --- a/test/hotspot/jtreg/runtime/LoadClass/TestResize.java +++ b/test/hotspot/jtreg/runtime/LoadClass/TestResize.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -26,6 +26,7 @@ * @bug 8184765 * @summary make sure the SystemDictionary gets resized when load factor is too high * @requires vm.debug + * @requires vm.flagless * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/MinimalVM/CDS.java b/test/hotspot/jtreg/runtime/MinimalVM/CDS.java index e166d961fac..a86504c451a 100644 --- a/test/hotspot/jtreg/runtime/MinimalVM/CDS.java +++ b/test/hotspot/jtreg/runtime/MinimalVM/CDS.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -24,6 +24,7 @@ /* * @test * @requires vm.flavor == "minimal" + * @requires vm.flagless * @modules java.base/jdk.internal.misc * @library /test/lib * @run driver CDS diff --git a/test/hotspot/jtreg/runtime/MinimalVM/CheckJNI.java b/test/hotspot/jtreg/runtime/MinimalVM/CheckJNI.java index 14219653574..01c436c7086 100644 --- a/test/hotspot/jtreg/runtime/MinimalVM/CheckJNI.java +++ b/test/hotspot/jtreg/runtime/MinimalVM/CheckJNI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -24,6 +24,7 @@ /* * @test * @requires vm.flavor == "minimal" + * @requires vm.flagless * @modules java.base/jdk.internal.misc * @library /test/lib * @run driver CheckJNI diff --git a/test/hotspot/jtreg/runtime/MinimalVM/Instrumentation.java b/test/hotspot/jtreg/runtime/MinimalVM/Instrumentation.java index c5c56cead35..29fa15e607b 100644 --- a/test/hotspot/jtreg/runtime/MinimalVM/Instrumentation.java +++ b/test/hotspot/jtreg/runtime/MinimalVM/Instrumentation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -25,6 +25,7 @@ * @test * @library /test/lib * @requires vm.flavor == "minimal" + * @requires vm.flagless * @modules java.base/jdk.internal.misc * java.instrument * @run driver Instrumentation diff --git a/test/hotspot/jtreg/runtime/MinimalVM/JMX.java b/test/hotspot/jtreg/runtime/MinimalVM/JMX.java index 5a9dc20abf0..b7afcb6a81d 100644 --- a/test/hotspot/jtreg/runtime/MinimalVM/JMX.java +++ b/test/hotspot/jtreg/runtime/MinimalVM/JMX.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -24,6 +24,7 @@ /* * @test * @requires vm.flavor == "minimal" + * @requires vm.flagless * @library /test/lib * @run main/othervm JMX */ diff --git a/test/hotspot/jtreg/runtime/MinimalVM/JVMTI.java b/test/hotspot/jtreg/runtime/MinimalVM/JVMTI.java index ef3f481d15d..9a96e1bc481 100644 --- a/test/hotspot/jtreg/runtime/MinimalVM/JVMTI.java +++ b/test/hotspot/jtreg/runtime/MinimalVM/JVMTI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -24,6 +24,7 @@ /* * @test * @requires vm.flavor == "minimal" + * @requires vm.flagless * @modules java.base/jdk.internal.misc * @library /test/lib * @run driver JVMTI diff --git a/test/hotspot/jtreg/runtime/MinimalVM/NMT.java b/test/hotspot/jtreg/runtime/MinimalVM/NMT.java index 815fa6d0195..740912be231 100644 --- a/test/hotspot/jtreg/runtime/MinimalVM/NMT.java +++ b/test/hotspot/jtreg/runtime/MinimalVM/NMT.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -24,6 +24,7 @@ /* * @test * @requires vm.flavor == "minimal" + * @requires vm.flagless * @modules java.base/jdk.internal.misc * @library /test/lib * @run driver NMT diff --git a/test/hotspot/jtreg/runtime/NMT/NMTForOtherLaunchersTest.java b/test/hotspot/jtreg/runtime/NMT/NMTForOtherLaunchersTest.java new file mode 100644 index 00000000000..ab895a191d5 --- /dev/null +++ b/test/hotspot/jtreg/runtime/NMT/NMTForOtherLaunchersTest.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021 SAP SE. All rights reserved. + * Copyright (c) 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. + */ + +/* + * With JDK-8256844 "Make NMT late-initializable", NMT should work out of the box with jdk launchers other than + * java.exe. + * + * Test that assumption (we test with javac and jar and leave it at that, other tools should be fine as well) + */ + +/** + * @test id=javac + * @bug 8256844 + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver NMTForOtherLaunchersTest javac + */ + +/** + * @test id=jar + * @bug 8256844 + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver NMTForOtherLaunchersTest jar + */ + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.JDKToolFinder; + +public class NMTForOtherLaunchersTest { + public static void main(String args[]) throws Exception { + String tool = args[0]; + ProcessBuilder pb = new ProcessBuilder(); + pb.command(new String[]{ + JDKToolFinder.getJDKTool(tool), + "-J-XX:NativeMemoryTracking=summary", + "-J-XX:+UnlockDiagnosticVMOptions", + "-J-XX:+PrintNMTStatistics", + "--help"}); + System.out.println(pb.command()); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + // We should not see the "wrong launcher?" message, which would indicate + // an older JDK, and we should see the NMT stat output when the VM shuts down. + output.shouldNotContain("wrong launcher"); + output.shouldContain("Native Memory Tracking:"); + output.shouldMatch("Total: reserved=\\d+, committed=\\d+.*"); + } +} diff --git a/test/hotspot/jtreg/runtime/NMT/NMTInitializationTest.java b/test/hotspot/jtreg/runtime/NMT/NMTInitializationTest.java new file mode 100644 index 00000000000..896dcaa1f3c --- /dev/null +++ b/test/hotspot/jtreg/runtime/NMT/NMTInitializationTest.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2021 SAP SE. All rights reserved. + * Copyright (c) 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. + */ + + +/* + * This test tests the ability of NMT to work correctly when masses of allocations happen before NMT is initialized; + * That pre-NMT-init phase starts when the libjvm is loaded and the C++ dynamic initialization runs, and ends when + * NMT is initialized after the VM parsed its arguments in CreateJavaVM. + * + * During that phase, NMT is not yet initialized fully; C-heap allocations are kept in a special lookup table to + * be able to tell them apart from post-NMT-init initializations later. For details, see nmtPreInit.hpp. + * + * The size of this table is limited, and its load factor affects lookup time; that lookup time is paid throughout + * the VM life for all os::free() calls, regardless if NMT is on or not. Therefore we are interested in keeping the + * number of pre-NMT-init allocations low. + * + * Normally, the VM allocates about 500 surviving allocations (allocations which are not freed before NMT initialization + * finishes). The number is mainly influenced by the number of VM arguments, since those get strdup'ed around. + * Therefore, the only direct way to test pre-NMT-init allocations is by feeding the VM a lot of arguments, and this is + * what this test does. + * + */ + +/** + * @test id=normal-off + * @bug 8256844 + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver NMTInitializationTest normal off + */ + +/** + * @test id=normal-detail + * @bug 8256844 + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver NMTInitializationTest normal detail + */ + +/** + * @test id=default_long-off + * @bug 8256844 + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver NMTInitializationTest long off + */ + +/** + * @test id=default_long-detail + * @bug 8256844 + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver NMTInitializationTest long detail + */ + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +import java.io.FileWriter; +import java.io.PrintWriter; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class NMTInitializationTest { + + final static boolean debug = true; + + static String randomString() { + Random r = new Random(); + int len = r.nextInt(100) + 100; + StringBuilder bld = new StringBuilder(); + for (int i = 0; i < len; i ++) { + bld.append(r.nextInt(26) + 'A'); + } + return bld.toString(); + } + + static Path createCommandFile(int numlines) throws Exception { + String fileName = "commands_" + numlines + ".txt"; + FileWriter fileWriter = new FileWriter(fileName); + PrintWriter printWriter = new PrintWriter(fileWriter); + String line = "-XX:ErrorFile=" + randomString(); + for (long i = 0; i < numlines / 2; i++) { + printWriter.println(line); + } + printWriter.close(); + return Paths.get(fileName); + } + + enum TestMode { + // call the VM with a normal-ish command line (long but not oudlandishly so). We expect the lookup table after + // initialization to be sparsely populated and sport very short chain lengths. + mode_normal(30, 5), + // call the VM with an outlandishly long command line. We expect the lookup table after initialization + // to be densely populated but hopefully evenly distributed. + mode_long(20000, 20); + + final int num_command_line_args; + final int expected_max_chain_len; + + TestMode(int num_command_line_args, int expected_max_chain_len) { + this.num_command_line_args = num_command_line_args; + this.expected_max_chain_len = expected_max_chain_len; + } + }; + + enum NMTMode { + off, summary, detail + }; + + public static void main(String args[]) throws Exception { + TestMode testMode = TestMode.valueOf("mode_" + args[0]); + NMTMode nmtMode = NMTMode.valueOf(args[1]); + + System.out.println("Test mode: " + testMode + ", NMT mode: " + nmtMode); + + Path commandLineFile = createCommandFile(testMode.num_command_line_args); + + ArrayList vmArgs = new ArrayList<>(); + vmArgs.add("-Xlog:nmt"); + vmArgs.add("-XX:NativeMemoryTracking=" + nmtMode.name()); + vmArgs.add("-XX:+UnlockDiagnosticVMOptions"); + vmArgs.add("-XX:+PrintNMTStatistics"); + + if (commandLineFile != null) { + vmArgs.add("@" + commandLineFile.getFileName()); + } + vmArgs.add("-version"); + + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(vmArgs); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + if (debug) { + output.reportDiagnosticSummary(); + } + + output.shouldHaveExitValue(0); + + // Now evaluate the output of -Xlog:nmt + // We expect something like: + // [0.001s][info][nmt] NMT initialized: detail + // [0.001s][info][nmt] Preinit state: + // [0.001s][info][nmt] entries: 342 (primary: 342, empties: 7577), sum bytes: 12996, longest chain length: 1 + // [0.001s][info][nmt] pre-init mallocs: 375, pre-init reallocs: 6, pre-init frees: 33, pre-to-post reallocs: 4, pre-to-post frees: 0 + + output.shouldContain("NMT initialized: " + nmtMode.name()); + output.shouldContain("Preinit state:"); + String regex = ".*entries: (\\d+).*sum bytes: (\\d+).*longest chain length: (\\d+).*"; + output.shouldMatch(regex); + String line = output.firstMatch(regex, 0); + if (line == null) { + throw new RuntimeException("expected: " + regex); + } + System.out.println(line); + Pattern p = Pattern.compile(regex); + Matcher mat = p.matcher(line); + mat.matches(); + int entries = Integer.parseInt(mat.group(1)); + int sum_bytes = Integer.parseInt(mat.group(2)); + int longest_chain = Integer.parseInt(mat.group(3)); + System.out.println("found: " + entries + " - " + sum_bytes + longest_chain + "."); + + // Now we test the state of the internal lookup table, and through our assumptions about + // early pre-NMT-init allocations: + // The normal allocation count of surviving pre-init allocations is around 300-500, with the sum of allocated + // bytes of a few dozen KB. We check these boundaries (with a very generous overhead) to see if the numbers are + // way off. If they are, we may either have a leak or just a lot more allocations than we thought before + // NMT initialization. Both cases should be investigated. Even if the allocations are valid, too many of them + // stretches the limits of the lookup map, and therefore may cause slower lookup. We should then either change + // the coding, reducing the number of allocations. Or enlarge the lookup table. + + // Apply some sensible assumptions + if (entries > testMode.num_command_line_args + 2000) { // Note: normal baseline is 400-500 + throw new RuntimeException("Suspiciously high number of pre-init allocations."); + } + if (sum_bytes > 128 * 1024 * 1024) { // Note: normal baseline is ~30-40KB + throw new RuntimeException("Suspiciously high pre-init memory usage."); + } + if (longest_chain > testMode.expected_max_chain_len) { + // Under normal circumstances, load factor of the map should be about 0.1. With a good hash distribution, we + // should rarely see even a chain > 1. Warn if we see exceedingly long bucket chains, since this indicates + // either that the hash algorithm is inefficient or we have a bug somewhere. + throw new RuntimeException("Suspiciously long bucket chains in lookup table."); + } + + // Finally, check that we see our final NMT report: + if (nmtMode != NMTMode.off) { + output.shouldContain("Native Memory Tracking:"); + output.shouldMatch("Total: reserved=\\d+, committed=\\d+.*"); + } + } +} diff --git a/test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java b/test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java index c4bc60585c0..004df31f2f0 100644 --- a/test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java +++ b/test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java @@ -26,7 +26,7 @@ /* * @test TestAbortOnVMOperationTimeout - * @bug 8181143 + * @bug 8181143 8269523 * @summary Check abort on VM timeout is working * @library /test/lib * @modules java.base/jdk.internal.misc @@ -36,12 +36,17 @@ public class TestAbortOnVMOperationTimeout { + // A static array is unlikely to be optimised away by the JIT. + static Object[] arr; + public static void main(String[] args) throws Exception { if (args.length > 0) { - Object[] arr = new Object[10_000_000]; + arr = new Object[10_000_000]; for (int i = 0; i < arr.length; i++) { arr[i] = new Object(); } + // Try to force at least one full GC cycle. + System.gc(); return; } @@ -51,9 +56,9 @@ public static void main(String[] args) throws Exception { testWith(delay, true); } - // These should fail: Serial is not very fast. Traversing 10M objects in 5 ms - // means less than 0.5 ns per object, which is not doable. - for (int delay : new int[]{0, 1, 5}) { + // These should fail: Serial is not very fast but we have seen the test + // execute as quickly as 2ms! + for (int delay : new int[]{0, 1}) { testWith(delay, false); } } @@ -66,6 +71,7 @@ public static void testWith(int delay, boolean shouldPass) throws Exception { "-Xmx256m", "-XX:+UseSerialGC", "-XX:-CreateCoredumpOnCrash", + "-Xlog:gc", "TestAbortOnVMOperationTimeout", "foo" ); @@ -77,6 +83,6 @@ public static void testWith(int delay, boolean shouldPass) throws Exception { output.shouldContain("VM operation took too long"); output.shouldNotHaveExitValue(0); } + output.reportDiagnosticSummary(); } } - diff --git a/test/hotspot/jtreg/runtime/Throwable/StackTraceLogging.java b/test/hotspot/jtreg/runtime/Throwable/StackTraceLogging.java index c86da3a2c29..1482037b28f 100644 --- a/test/hotspot/jtreg/runtime/Throwable/StackTraceLogging.java +++ b/test/hotspot/jtreg/runtime/Throwable/StackTraceLogging.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -25,6 +25,7 @@ * @test * @bug 8150778 * @summary check stacktrace logging + * @requires vm.flagless * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/Throwable/TestCatchThrowableOOM.java b/test/hotspot/jtreg/runtime/Throwable/TestCatchThrowableOOM.java index 3aabb37323e..36fedc0bd2d 100644 --- a/test/hotspot/jtreg/runtime/Throwable/TestCatchThrowableOOM.java +++ b/test/hotspot/jtreg/runtime/Throwable/TestCatchThrowableOOM.java @@ -25,6 +25,7 @@ * @test * @bug 8267118 * @summary Test catching Throwable doesn't trigger OOME + * @requires vm.flagless * @library /test/lib * @run driver TestCatchThrowableOOM */ diff --git a/test/hotspot/jtreg/runtime/Throwable/TestMaxJavaStackTraceDepth.java b/test/hotspot/jtreg/runtime/Throwable/TestMaxJavaStackTraceDepth.java index 7862b4df6e4..92e57718608 100644 --- a/test/hotspot/jtreg/runtime/Throwable/TestMaxJavaStackTraceDepth.java +++ b/test/hotspot/jtreg/runtime/Throwable/TestMaxJavaStackTraceDepth.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -25,6 +25,7 @@ * @test * @bug 7179701 * @summary MaxJavaStackTraceDepth of zero is not handled correctly/consistently in the VM + * @requires vm.flagless * @modules java.base/jdk.internal.misc:open * @modules java.base/java.lang:open * @library /test/lib diff --git a/test/hotspot/jtreg/runtime/cds/appcds/JarBuilder.java b/test/hotspot/jtreg/runtime/cds/appcds/JarBuilder.java index 84f2242bffb..cd56e43413d 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/JarBuilder.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/JarBuilder.java @@ -131,14 +131,19 @@ static void update(String jarFile, String dir) throws Exception { } // Add commonly used inner classes that are often omitted by mistake. Currently - // we support only sun/hotspot/WhiteBox$WhiteBoxPermission. See JDK-8199290 + // we support only jdk/test/whitebox/WhiteBox$WhiteBoxPermission and + // sun/hotspot/WhiteBox$WhiteBoxPermission. See JDK-8199290 private static String[] addInnerClasses(String[] classes, int startIdx) { - boolean seenWB = false; - boolean seenWBInner = false; + boolean seenNewWb = false; + boolean seenNewWbInner = false; + boolean seenOldWb = false; + boolean seenOldWbInner = false; // This method is different than ClassFileInstaller.addInnerClasses which // uses "." as the package delimiter :-( - final String wb = "sun/hotspot/WhiteBox"; - final String wbInner = "sun/hotspot/WhiteBox$WhiteBoxPermission"; + final String newWb = "jdk/test/whitebox/WhiteBox"; + final String newWbInner = newWb + "$WhiteBoxPermission"; + final String oldWb = "sun/hotspot/WhiteBox"; + final String oldWbInner = oldWb + "$WhiteBoxPermission"; ArrayList list = new ArrayList<>(); @@ -146,12 +151,17 @@ private static String[] addInnerClasses(String[] classes, int startIdx) { String cls = classes[i]; list.add(cls); switch (cls) { - case wb: seenWB = true; break; - case wbInner: seenWBInner = true; break; + case newWb: seenNewWb = true; break; + case newWbInner: seenNewWbInner = true; break; + case oldWb: seenOldWb = true; break; + case oldWbInner: seenOldWbInner = true; break; } } - if (seenWB && !seenWBInner) { - list.add(wbInner); + if (seenNewWb && !seenNewWbInner) { + list.add(newWbInner); + } + if (seenOldWb && !seenOldWbInner) { + list.add(oldWbInner); } String[] array = new String[list.size()]; diff --git a/test/hotspot/jtreg/runtime/cds/appcds/SharedArchiveConsistency.java b/test/hotspot/jtreg/runtime/cds/appcds/SharedArchiveConsistency.java index 1a6523d9c0e..233511f704d 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/SharedArchiveConsistency.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/SharedArchiveConsistency.java @@ -34,42 +34,12 @@ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI SharedArchiveConsistency on * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI SharedArchiveConsistency auto */ +import jdk.test.lib.cds.CDSArchiveUtils; import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.Utils; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.FileChannel; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; -import java.nio.file.StandardOpenOption; -import static java.nio.file.StandardOpenOption.READ; -import static java.nio.file.StandardOpenOption.WRITE; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Random; -import sun.hotspot.WhiteBox; public class SharedArchiveConsistency { - public static WhiteBox wb; - public static int offset_magic; // CDSFileMapHeaderBase::_magic - public static int offset_version; // CDSFileMapHeaderBase::_version - public static int offset_jvm_ident; // FileMapHeader::_jvm_ident - public static int sp_offset_crc; // CDSFileMapRegion::_crc - public static int file_header_size = -1;// total size of header, variant, need calculation - public static int CDSFileMapRegion_size; // size of CDSFileMapRegion - public static int sp_offset; // offset of CDSFileMapRegion - public static int sp_used_offset; // offset of CDSFileMapRegion::_used - public static int size_t_size; // size of size_t - public static int int_size; // size of int - public static long alignment; // MetaspaceShared::core_region_alignment - public static boolean shareAuto; // true == -Xshare:auto // false == -Xshare:on @@ -94,256 +64,14 @@ public class SharedArchiveConsistency { "The shared archive file has been truncated." }; - public static void getFileOffsetInfo() throws Exception { - wb = WhiteBox.getWhiteBox(); - offset_magic = wb.getOffsetForName("FileMapHeader::_magic"); - offset_version = wb.getOffsetForName("FileMapHeader::_version"); - offset_jvm_ident = wb.getOffsetForName("FileMapHeader::_jvm_ident"); - sp_offset_crc = wb.getOffsetForName("CDSFileMapRegion::_crc"); - try { - int nonExistOffset = wb.getOffsetForName("FileMapHeader::_non_exist_offset"); - System.exit(-1); // should fail - } catch (Exception e) { - // success - } - - sp_offset = wb.getOffsetForName("FileMapHeader::_space[0]") - offset_magic; - sp_used_offset = wb.getOffsetForName("CDSFileMapRegion::_used") - sp_offset_crc; - size_t_size = wb.getOffsetForName("size_t_size"); - CDSFileMapRegion_size = wb.getOffsetForName("CDSFileMapRegion_size"); - alignment = wb.metaspaceSharedRegionAlignment(); - } - - public static int getFileHeaderSize(FileChannel fc) throws Exception { - if (file_header_size != -1) { - return file_header_size; - } - // this is not real header size, it is struct size - int_size = wb.getOffsetForName("int_size"); - file_header_size = wb.getOffsetForName("file_header_size"); - System.out.println("file_header_size = " + file_header_size); - file_header_size = (int)align_up_page(file_header_size); - System.out.println("file_header_size (aligned to page) = " + file_header_size); - return file_header_size; - } - - public static long align_up_page(long l) throws Exception { - // wb is obtained in getFileOffsetInfo() which is called first in main() else we should call - // WhiteBox.getWhiteBox() here first. - int pageSize = wb.getVMPageSize(); - return (l + pageSize -1) & (~ (pageSize - 1)); - } - - private static long getRandomBetween(long start, long end) throws Exception { - if (start > end) { - throw new IllegalArgumentException("start must be less than end"); - } - Random aRandom = Utils.getRandomInstance(); - int d = aRandom.nextInt((int)(end - start)); - if (d < 1) { - d = 1; - } - return start + d; - } - - public static long readInt(FileChannel fc, long offset, int nbytes) throws Exception { - ByteBuffer bb = ByteBuffer.allocate(nbytes); - bb.order(ByteOrder.nativeOrder()); - fc.position(offset); - fc.read(bb); - return (nbytes > 4 ? bb.getLong(0) : bb.getInt(0)); - } - - public static void writeData(FileChannel fc, long offset, ByteBuffer bb) throws Exception { - fc.position(offset); - fc.write(bb); - } - - public static FileChannel getFileChannel(File jsaFile) throws Exception { - List arry = new ArrayList(); - arry.add(READ); - arry.add(WRITE); - return FileChannel.open(jsaFile.toPath(), new HashSet(arry)); - } - - public static void modifyJsaContentRandomly(File jsaFile) throws Exception { - FileChannel fc = getFileChannel(jsaFile); - // corrupt random area in the data areas - long[] used = new long[num_regions]; // record used bytes - long start0, start, end, off; - int used_offset, path_info_size; - - int bufSize; - System.out.printf("%-24s%12s%12s%16s\n", "Space Name", "Used bytes", "Reg Start", "Random Offset"); - start0 = getFileHeaderSize(fc); - for (int i = 0; i < num_regions; i++) { - used[i] = get_region_used_size_aligned(fc, i); - start = start0; - for (int j = 0; j < i; j++) { - start += align_up_page(used[j]); - } - end = start + used[i]; - if (start == end) { - continue; // Ignore empty regions - } - off = getRandomBetween(start, end); - System.out.printf("%-24s%12d%12d%16d\n", shared_region_name[i], used[i], start, off); - if (end - off < 1024) { - bufSize = (int)(end - off + 1); - } else { - bufSize = 1024; - } - ByteBuffer bbuf = ByteBuffer.wrap(new byte[bufSize]); - writeData(fc, off, bbuf); - } - if (fc.isOpen()) { - fc.close(); - } - } - - static long get_region_used_size_aligned(FileChannel fc, int region) throws Exception { - long n = sp_offset + CDSFileMapRegion_size * region + sp_used_offset; - long used = readInt(fc, n, size_t_size); - used = (used + alignment - 1) & ~(alignment - 1); - return used; - } - - public static boolean modifyJsaContent(int region, File jsaFile) throws Exception { - FileChannel fc = getFileChannel(jsaFile); - byte[] buf = new byte[4096]; - ByteBuffer bbuf = ByteBuffer.wrap(buf); - - long total = 0L; - long[] used = new long[num_regions]; - System.out.printf("%-24s%12s\n", "Space name", "Used bytes"); - for (int i = 0; i < num_regions; i++) { - used[i] = get_region_used_size_aligned(fc, i); - System.out.printf("%-24s%12d\n", shared_region_name[i], used[i]); - total += used[i]; - } - System.out.printf("%-24s%12d\n", "Total: ", total); - long header_size = getFileHeaderSize(fc); - long region_start_offset = header_size; - for (int i=0; i exceptions = new ArrayList<>(); + + private static void addException(Exception e) { + System.out.println(TestFramework.getLastTestVMOutput()); + exceptions.add(e); + } + public static void main(String[] args) { runFailOnTestsArgs(BadFailOnConstraint.create(AndOr1.class, "test1(int)", 1, "CallStaticJava"), "-XX:TLABRefillWasteFraction=50", "-XX:+UsePerfData", "-XX:+UseTLAB"); runFailOnTestsArgs(BadFailOnConstraint.create(AndOr1.class, "test2()", 1, "CallStaticJava"), "-XX:TLABRefillWasteFraction=50", "-XX:-UsePerfData", "-XX:+UseTLAB"); @@ -55,7 +67,7 @@ public static void main(String[] args) { runWithArguments(GoodCount.class, "-XX:TLABRefillWasteFraction=50"); runWithArguments(MultipleFailOnGood.class, "-XX:TLABRefillWasteFraction=50"); - String[] allocMatches = { "MyClass", "call,static wrapper for: _new_instance_Java" }; + String[] allocMatches = { "MyClass", "wrapper for: _new_instance_Java" }; runCheck(BadFailOnConstraint.create(MultipleFailOnBad.class, "fail1()", 1, 1, "Store"), BadFailOnConstraint.create(MultipleFailOnBad.class, "fail1()", 1, 3, "Store"), GoodFailOnRegexConstraint.create(MultipleFailOnBad.class, "fail1()", 1, 2, 4), @@ -88,7 +100,7 @@ public static void main(String[] args) { BadCountsConstraint.create(BadCount.class, "bad3()", 2, 1, "Store") ); - String[] allocArrayMatches = { "MyClass", "call,static wrapper for: _new_array_Java"}; + String[] allocArrayMatches = { "MyClass", "wrapper for: _new_array_Java"}; runCheck(BadFailOnConstraint.create(AllocArray.class, "allocArray()", 1, allocArrayMatches), BadFailOnConstraint.create(AllocArray.class, "allocArray()", 2, allocArrayMatches), GoodFailOnConstraint.create(AllocArray.class, "allocArray()", 3), @@ -105,7 +117,7 @@ public static void main(String[] args) { BadFailOnConstraint.create(RunTests.class, "bad1(int)", 2, "Load") ); - runCheck(new String[] {"-XX:-UseCompressedClassPointers"}, + runCheck(new String[] {"-XX:+IgnoreUnrecognizedVMOptions", "-XX:-UseCompressedClassPointers"}, BadFailOnConstraint.create(Loads.class, "load()", 1, 1, "Load"), BadFailOnConstraint.create(Loads.class, "load()", 1, 3, "LoadI"), BadCountsConstraint.create(Loads.class, "load()", 1, 1, 0), @@ -170,7 +182,9 @@ public static void main(String[] args) { BadFailOnConstraint.create(Traps.class, "rangeCheck()", 3, "CallStaticJava", "uncommon_trap", "null_check"), GoodRuleConstraint.create(Traps.class, "rangeCheck()", 4), BadFailOnConstraint.create(Traps.class, "instrinsicOrTypeCheckedInlining()", 1, "CallStaticJava", "uncommon_trap"), - BadFailOnConstraint.create(Traps.class, "instrinsicOrTypeCheckedInlining()", 2, "CallStaticJava", "uncommon_trap", "intrinsic_or_type_checked_inlining"), + WhiteBox.getWhiteBox().isJVMCISupportedByGC() ? + BadFailOnConstraint.create(Traps.class, "instrinsicOrTypeCheckedInlining()", 2, "CallStaticJava", "uncommon_trap", "intrinsic_or_type_checked_inlining") + : GoodRuleConstraint.create(Traps.class, "instrinsicOrTypeCheckedInlining()", 2), BadFailOnConstraint.create(Traps.class, "instrinsicOrTypeCheckedInlining()", 3, "CallStaticJava", "uncommon_trap", "null_check"), GoodRuleConstraint.create(Traps.class, "instrinsicOrTypeCheckedInlining()", 4) ); @@ -184,11 +198,22 @@ public static void main(String[] args) { runCheck(BadFailOnConstraint.create(ScopeObj.class, "scopeObject()", 1, "ScObj")); runCheck(BadFailOnConstraint.create(Membar.class, "membar()", 1, "MemBar")); - runCheck(BadFailOnConstraint.create(CheckCastArray.class, "array()", 1, "cmp", "precise klass"), - BadFailOnConstraint.create(CheckCastArray.class, "array()", 2, 1,"cmp", "precise klass", "MyClass"), - BadFailOnConstraint.create(CheckCastArray.class, "array()", 2, 2,"cmp", "precise klass", "ir_framework/tests/MyClass"), + + String cmp; + if (Platform.isPPC() || Platform.isX86()) { + cmp = "CMP"; + } else if (Platform.isS390x()){ + cmp = "CLFI"; + } else { + cmp = "cmp"; + } + runCheck(BadFailOnConstraint.create(CheckCastArray.class, "array()", 1, cmp, "precise klass"), + BadFailOnConstraint.create(CheckCastArray.class, "array()", 2, 1,cmp, "precise klass", "MyClass"), + BadFailOnConstraint.create(CheckCastArray.class, "array()", 2, 2,cmp, "precise klass", "ir_framework/tests/MyClass"), GoodFailOnConstraint.create(CheckCastArray.class, "array()", 3), - BadFailOnConstraint.create(CheckCastArray.class, "arrayCopy(java.lang.Object[],java.lang.Class)", 1, "checkcast_arraycopy") + Platform.isS390x() ? // There is no checkcast_arraycopy stub for C2 on s390 + GoodFailOnConstraint.create(CheckCastArray.class, "arrayCopy(java.lang.Object[],java.lang.Class)", 1) + : BadFailOnConstraint.create(CheckCastArray.class, "arrayCopy(java.lang.Object[],java.lang.Class)", 1, "checkcast_arraycopy") ); // Redirect stdout to stream and then check if we find required IR encoding read from socket. @@ -198,33 +223,54 @@ public static void main(String[] args) { System.setOut(ps); try { - runWithArguments(CompilationOutputOfFails.class); + runWithArgumentsFail(CompilationOutputOfFails.class); shouldNotReach(); } catch (IRViolationException e) { - System.out.flush(); - String output = baos.toString(); - baos.reset(); - Pattern pattern = Pattern.compile(">>> Compilation.*both\\d.*\\RPrintIdeal:(?:(?!PrintOpto|>>> Compilation)[\\S\\s])+PrintOptoAssembly"); - Matcher matcher = pattern.matcher(output); - Asserts.assertEQ(matcher.results().count(), (long)7, "Could not find all both methods: " + output); - pattern = Pattern.compile(">>> Compilation.*ideal\\d.*\\RPrintIdeal:(?:(?!>>> Compilation)[\\S\\s])+"); - matcher = pattern.matcher(output); - int count = 0; - while (matcher.find()) { - String match = matcher.group(); - Asserts.assertFalse(match.contains("PrintOptoAssembly"), "Cannot contain opto assembly: " + output); - count++; - } - Asserts.assertEQ(count, 7, "Could not find all ideal methods: " + output); - pattern = Pattern.compile(">>> Compilation.*opto\\d.*\\RPrintOptoAssembly:(?:(?!>>> Compilation)[\\S\\s])+"); - matcher = pattern.matcher(output); - count = 0; - while (matcher.find()) { - String match = matcher.group(); - Asserts.assertFalse(match.contains("PrintIdeal"), "Cannot contain opto assembly: " + output); - count++; + try { + boolean failed = false; + System.out.flush(); + String output = baos.toString(); + baos.reset(); + Pattern pattern = Pattern.compile(">>> Compilation.*both\\d.*\\RPrintIdeal:(?:(?!PrintOpto|>>> Compilation)[\\S\\s])+PrintOptoAssembly"); + Matcher matcher = pattern.matcher(output); + long bothCount = matcher.results().count(); + if (bothCount != 7L) { + exceptions.add(new RuntimeException("Could not find all both() methods, expected 7 but found " + bothCount)); + failed = true; + } + pattern = Pattern.compile(">>> Compilation.*ideal\\d.*\\RPrintIdeal:(?:(?!>>> Compilation)[\\S\\s])+"); + matcher = pattern.matcher(output); + int count = 0; + while (matcher.find()) { + String match = matcher.group(); + Asserts.assertFalse(match.contains("PrintOptoAssembly"), "Cannot contain opto assembly: " + output); + count++; + } + if (count != 7) { + exceptions.add(new RuntimeException("Could not find all ideal() methods, expected 7 but found " + count)); + failed = true; + } + pattern = Pattern.compile(">>> Compilation.*opto\\d.*\\RPrintOptoAssembly:(?:(?!>>> Compilation)[\\S\\s])+"); + matcher = pattern.matcher(output); + count = 0; + while (matcher.find()) { + String match = matcher.group(); + Asserts.assertFalse(match.contains("PrintIdeal"), "Cannot contain opto assembly: " + output); + count++; + } + if (count != 7) { + exceptions.add(new RuntimeException("Could not find all opto() methods, expected 7 but found " + count)); + failed = true; + } + if (failed) { + System.err.println(TestFramework.getLastTestVMOutput()); + System.err.println(output); + } + } catch (Exception e1) { + addException(e1); } - Asserts.assertEQ(count, 7, "Could not find all opto methods"); + } catch (Exception e) { + addException(e); } runWithArguments(FlagComparisons.class, "-XX:TLABRefillWasteFraction=50"); @@ -248,9 +294,27 @@ public static void main(String[] args) { findIrIds(output, "testMatchAllIf50", 7, 12, 19, 21); findIrIds(output, "testMatchNoneIf50", 4, 7, 11, 16, 20, 22); System.setOut(old); + + if (!exceptions.isEmpty()) { + System.err.println("TestIRMatching failed with one or more exceptions:"); + for (Exception e : exceptions) { + System.err.println(e.getMessage()); + e.printStackTrace(System.err); + System.err.println("---------"); + } + throw new RuntimeException("TestIRMatching failed with one or more exceptions - check stderr and stdout"); + } } private static void runWithArguments(Class clazz, String... args) { + try { + new TestFramework(clazz).addFlags(args).start(); + } catch (Exception e) { + addException(e); + } + } + + private static void runWithArgumentsFail(Class clazz, String... args) { new TestFramework(clazz).addFlags(args).start(); } @@ -260,6 +324,8 @@ private static void runCheck(String[] args , Constraint... constraints) { shouldNotReach(); } catch (IRViolationException e) { checkConstraints(e, constraints); + } catch (Exception e) { + addException(e); } } @@ -269,6 +335,8 @@ private static void runCheck(Constraint... constraints) { shouldNotReach(); } catch (IRViolationException e) { checkConstraints(e, constraints); + } catch (Exception e) { + addException(e); } } @@ -281,7 +349,7 @@ private static void checkConstraints(IRViolationException e, Constraint[] constr } catch (Exception e1) { System.out.println(TestFramework.getLastTestVMOutput()); System.out.println(message); - throw e1; + exceptions.add(e1); } } @@ -291,7 +359,13 @@ private static void runFailOnTestsArgs(Constraint constraint, String... args) { new TestFramework(constraint.getKlass()).addFlags(args).start(); // All constraints have the same class. shouldNotReach(); } catch (IRViolationException e) { - constraint.checkConstraint(e); + try { + constraint.checkConstraint(e); + } catch (Exception e1) { + addException(e); + } + } catch (Exception e) { + addException(e); } } @@ -393,7 +467,7 @@ private void forceInline() {} class MultipleFailOnBad { private int iFld; private int myInt; - private MyClass myClass; + private MyClassEmpty myClass; @Test @IR(failOn = {IRNode.STORE, IRNode.CALL, IRNode.STORE_I, IRNode.LOOP}) @@ -426,21 +500,21 @@ public void fail5() { } @Test - @IR(failOn = {IRNode.STORE_OF_CLASS, "MyClass", IRNode.ALLOC, IRNode.CALL}) + @IR(failOn = {IRNode.STORE_OF_CLASS, "MyClassEmpty", IRNode.ALLOC, IRNode.CALL}) public void fail6() { - myClass = new MyClass(); + myClass = new MyClassEmpty(); } @Test - @IR(failOn = {IRNode.STORE_OF_CLASS, "UnknownClass", IRNode.ALLOC_OF, "MyClass"}) + @IR(failOn = {IRNode.STORE_OF_CLASS, "UnknownClass", IRNode.ALLOC_OF, "MyClassEmpty"}) public void fail7() { - myClass = new MyClass(); + myClass = new MyClassEmpty(); } @Test - @IR(failOn = {IRNode.STORE_OF_CLASS, "UnknownClass", IRNode.ALLOC_OF, "ir_framework/tests/MyClassSub"}) + @IR(failOn = {IRNode.STORE_OF_CLASS, "UnknownClass", IRNode.ALLOC_OF, "ir_framework/tests/MyClassEmptySub"}) public void fail8() { - myClass = new MyClassSub(); + myClass = new MyClassEmptySub(); } @Test @@ -564,6 +638,7 @@ class GoodCount { long result; MyClass myClass = new MyClass(); + MyClassEmpty myClassEmpty = new MyClassEmpty(); MyClass myClassSubPoly = new MyClassSub(); MyClassSub myClassSub = new MyClassSub(); @@ -647,11 +722,11 @@ public void good5() { } @Test - @IR(counts = {IRNode.STORE_OF_FIELD, "myClass", "1", IRNode.STORE_OF_CLASS, "GoodCount", "1", - IRNode.STORE_OF_CLASS, "/GoodCount", "1", IRNode.STORE_OF_CLASS, "MyClass", "0"}, - failOn = {IRNode.STORE_OF_CLASS, "MyClass"}) + @IR(counts = {IRNode.STORE_OF_FIELD, "myClassEmpty", "1", IRNode.STORE_OF_CLASS, "GoodCount", "1", + IRNode.STORE_OF_CLASS, "/GoodCount", "1", IRNode.STORE_OF_CLASS, "MyClassEmpty", "0"}, + failOn = {IRNode.STORE_OF_CLASS, "MyClassEmpty"}) public void good6() { - myClass = new MyClass(); + myClassEmpty = new MyClassEmpty(); } @Test @@ -1122,7 +1197,7 @@ public Object[] arrayCopy(Object[] src, Class klass) { public void testArrayCopy() { arrayCopy(mArr, MyClass[].class); arrayCopy(mArr, Object[].class); - arrayCopy(mArr, MyClass2[].class); + arrayCopy(mArr, MyClassEmpty[].class); } } @@ -1171,7 +1246,7 @@ public void both5() { @Test @IR(counts = {IRNode.COUNTEDLOOP, "0"}) - @IR(counts = {"call", "1"}) + @IR(counts = {"call", "0"}) public void both6() { for (int i = 0; i < 100; i++) { dontInline(); @@ -1180,7 +1255,7 @@ public void both6() { @Test @IR(failOn = IRNode.COUNTEDLOOP) - @IR(counts = {"call", "1"}) + @IR(counts = {"call", "0"}) public void both7() { for (int i = 0; i < 100; i++) { dontInline(); @@ -1275,7 +1350,7 @@ public void opto3() { } @Test - @IR(counts = {"call", "1"}) + @IR(counts = {"call", "0"}) public void opto4() { for (int i = 0; i < 100; i++) { dontInline(); @@ -1284,7 +1359,7 @@ public void opto4() { @Test @IR(failOn = IRNode.STORE) // not fail - @IR(counts = {"call", "1"}) + @IR(counts = {"call", "0"}) public void opto5() { for (int i = 0; i < 100; i++) { dontInline(); @@ -1293,7 +1368,7 @@ public void opto5() { @Test @IR(counts = {IRNode.STORE, "0"}) // not fail - @IR(counts = {"call", "1"}) + @IR(counts = {"call", "0"}) public void opto6() { for (int i = 0; i < 100; i++) { dontInline(); @@ -1302,7 +1377,7 @@ public void opto6() { @Test @IR(counts = {"call", "10"}) - @IR(counts = {"call", "1"}) + @IR(counts = {"call", "0"}) public void opto7() { for (int i = 0; i < 100; i++) { dontInline(); @@ -1328,7 +1403,9 @@ class MyClass { static long lFldStatic; } -class MyClass2 {} +class MyClassEmpty {} + +class MyClassEmptySub extends MyClassEmpty {} class MyClassSub extends MyClass { int iFld; @@ -1375,7 +1452,7 @@ abstract class Constraint { @Override public String toString() { - return "Constraint " + getClass().getSimpleName() + ", method: " + methodName + ", rule: " + ruleIdx; + return "Constraint " + getClass().getSimpleName() + ", " + errorPrefix(); } public Class getKlass() { @@ -1383,7 +1460,7 @@ public Class getKlass() { } protected String errorPrefix() { - return "Method " + methodName + ", Rule " + ruleIdx; + return "Class " + klass.getSimpleName() + ", Method " + methodName + ", Rule " + ruleIdx; } public void checkConstraint(IRViolationException e) { @@ -1405,8 +1482,6 @@ public void checkConstraint(IRViolationException e) { } abstract protected void checkIRRule(String irRule); - - protected void checkOnMethod(String method) {} } // Constraint for rule that does not fail. @@ -1538,7 +1613,9 @@ protected void checkIRRule(String irRule) { for (int i = 1; i < splitRegex.length; i++) { String regexString = splitRegex[i]; if (regexString.startsWith(String.valueOf(regexIndex))) { - Asserts.assertTrue(matches.stream().allMatch(regexString::contains), + // Do matching on actual match and not on regex string + String actualMatch = regexString.split("\\R", 2)[1]; + Asserts.assertTrue(matches.stream().allMatch(actualMatch::contains), errorPrefix() + " could not find all matches at Regex " + regexIndex); matched = true; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ArrayReference/setValues_l/setvaluesl002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ArrayReference/setValues_l/setvaluesl002/TestDescription.java index e1fcf0b13d6..1f0308b4ffc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ArrayReference/setValues_l/setvaluesl002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ArrayReference/setValues_l/setvaluesl002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -76,7 +76,7 @@ * 4448603: JDI spec: ArrayReference.setValues(List) has discrepancy * Evaluation: * There is indeed an inconsistency. The safer of the two options should be - * choosen: ignore tail elements in Lists that are too long. This is also what + * chosen: ignore tail elements in Lists that are too long. This is also what * the reference implementation does. * 4419982: JDI: two StackFrame methods return incorrect values for double * diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/stress/ClassPrepareEvents/ClassPrepareEvents001/ClassPrepareEvents001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/stress/ClassPrepareEvents/ClassPrepareEvents001/ClassPrepareEvents001.java index 3a95f6ccbea..c268f229632 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/stress/ClassPrepareEvents/ClassPrepareEvents001/ClassPrepareEvents001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/stress/ClassPrepareEvents/ClassPrepareEvents001/ClassPrepareEvents001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -31,7 +31,7 @@ * VM Testbase readme: * DESCRIPTION * Test covers bug 6426321. Test stress event queue forcing loading of 3000 classes in debuggee. - * Debugger in loop sends commad to debuggee to load class and waits READY answer. + * Debugger in loop sends command to debuggee to load class and waits READY answer. * Test passes if no hangs or any other errors occur in debuggee (if debuggee successfully sends answers for all commands). * (number of classes to load can be changed through parameter -classesToLoad (for example -classesToLoad 1000)). * diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t001/TestDescription.java index 7abe2ac8bbc..bcd61a5c1bf 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -38,20 +38,20 @@ * during the OnLoad phase * - enables events via SetEventNotificationMode during the OnLoad phase * for all optional events - * - provides the state to provoke generation of choosen events - * - checks that VM_INIT and choosen events were sent. + * - provides the state to provoke generation of chosen events + * - checks that VM_INIT and chosen events were sent. * (2) * - sets off callbacks for all optional events - * - changes callbacks for choosen events - * - provides the state to provoke generation of choosen events - * - checks that choosen events were sent + * - changes callbacks for chosen events + * - provides the state to provoke generation of chosen events + * - checks that chosen events were sent * - checks that altered callback works. * (3) - * - sets off callbacks for choosen events + * - sets off callbacks for chosen events * - sets callback for VM_DEATH event - * - checks that no choosen events are sent until VMDeath event. + * - checks that no chosen events are sent until VMDeath event. * This test checks that: - * (a) except for choosen events no other optional events are generated on + * (a) except for chosen events no other optional events are generated on * steps (1) and (2). * (b) Numbers of expected event on steps (1) and (2) is equal to 1. * (c) except for VM_DEATH no other events are generated on step (3). diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t002/TestDescription.java index f6e31c816e4..a9edca92190 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -41,20 +41,20 @@ * during the OnLoad phase * - enables events via SetEventNotificationMode during the OnLoad phase * for all optional events - * - provides the state to provoke generation of choosen events - * - checks that VM_INIT and choosen events were sent. + * - provides the state to provoke generation of chosen events + * - checks that VM_INIT and chosen events were sent. * (2) * - sets off callbacks for all optional events - * - changes callbacks for choosen events - * - provides the state to provoke generation of choosen events - * - checks that choosen events were sent + * - changes callbacks for chosen events + * - provides the state to provoke generation of chosen events + * - checks that chosen events were sent * - checks that altered callback works. * (3) - * - sets off callbacks for choosen events + * - sets off callbacks for chosen events * - sets callback for VM_DEATH event - * - checks that no choosen events are sent until VMDeath event. + * - checks that no chosen events are sent until VMDeath event. * This test checks that: - * (a) except for choosen events no other optional events are generated on + * (a) except for chosen events no other optional events are generated on * steps (1) and (2). * (b) Numbers of expected event on steps (1) and (2) is equal to 1. * (c) except for VM_DEATH no other events are generated on step (3). diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t003/TestDescription.java index ed173bf95e3..d3179b3c2c0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -36,20 +36,20 @@ * 1) * - adds the capability in * the OnLoad phase - * - sets callbacks for VM_INIT and choosen events during the OnLoad phase + * - sets callbacks for VM_INIT and chosen events during the OnLoad phase * - enables events via SetEventNotificationMode during the OnLoad phase * for all optional events. - * - provides the state to provoke generation of choosen events - * - checks that VM_INIT and choosen events were sent + * - provides the state to provoke generation of chosen events + * - checks that VM_INIT and chosen events were sent * 2) - * - changes callbacks for choosen events - * - provides the state to provoke generation of choosen events - * - checks that choosen events were sent + * - changes callbacks for chosen events + * - provides the state to provoke generation of chosen events + * - checks that chosen events were sent * - checks that altered callback works. * 3) - * - sets off callbacks for choosen events + * - sets off callbacks for chosen events * - sets callback for VM_DEATH event - * - checks that no choosen events are sent until VMDeath event. + * - checks that no chosen events are sent until VMDeath event. * COMMENTS * #4033759 JIT compiler must support unloading of classes containing compiled methods * Adjusted according to J2SE CCC updates: diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t004/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t004/TestDescription.java index dc3414104c5..b30a35ade2f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t004/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t004/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -38,20 +38,20 @@ * during the OnLoad phase * - enables events via SetEventNotificationMode during the OnLoad phase * for all optional events - * - provides the state to provoke generation of choosen events - * - checks that VM_INIT and choosen events were sent. + * - provides the state to provoke generation of chosen events + * - checks that VM_INIT and chosen events were sent. * (2) * - sets off callbacks for all optional events - * - changes callbacks for choosen events - * - provides the state to provoke generation of choosen events - * - checks that choosen events were sent + * - changes callbacks for chosen events + * - provides the state to provoke generation of chosen events + * - checks that chosen events were sent * - checks that altered callback works. * (3) - * - sets off callbacks for choosen events + * - sets off callbacks for chosen events * - sets callback for VM_DEATH event - * - checks that no choosen events are sent until VMDeath event. + * - checks that no chosen events are sent until VMDeath event. * This test checks that: - * (a) except for choosen events no other optional events are generated on + * (a) except for chosen events no other optional events are generated on * steps (1) and (2). * (b) Numbers of expected event on steps (1) and (2) is equal to 1. * (c) except for VM_DEATH no other events are generated on step (3). diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t008/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t008/TestDescription.java index bf743e31486..db4a7ed5b4b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t008/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t008/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -34,21 +34,21 @@ * 1) * - adds the capability during * the OnLoad phase; - * - sets callbacks for VM_INIT and choosen events during the OnLoad phase; + * - sets callbacks for VM_INIT and chosen events during the OnLoad phase; * - enables all optional events via SetEventNotificationMode during * the OnLoad phase; * - starts debuggee's threads which throw exceptions; * - expects that at least one EXCEPTION and EXCEPTION_CATCH events will * be sent. * 2) - * - changes callbacks for choosen event; + * - changes callbacks for chosen event; * - starts debuggee's threads which throw exceptions; * - checks that altered callback works and at least one EXCEPTION and * EXCEPTION_CATCH events will be sent. * 3) - * - sets off callbacks for choosen event; + * - sets off callbacks for chosen event; * - sets callback for VM_DEATH event; - * - checks that no choosen events are sent until VMDeath event. + * - checks that no chosen events are sent until VMDeath event. * COMMENTS * Modified due to fix of the bug * 5010571 TEST_BUG: jvmti tests with VMObjectAlloc callbacks should diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t009/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t009/TestDescription.java index c992b157844..d371c47717d 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t009/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t009/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -34,20 +34,20 @@ * 1) * - adds the , * capabilities during the OnLoad phase; - * - sets callbacks for VM_INIT and choosen events during the OnLoad phase; + * - sets callbacks for VM_INIT and chosen events during the OnLoad phase; * - enables all optional events via SetEventNotificationMode during * the OnLoad phase; * - starts debuggee's method 1000 times; * - expects that METHOD_ENTRY and METHOD_EXIT events are sent 1000 times. * 2) - * - changes callbacks for choosen event; + * - changes callbacks for chosen event; * - starts debuggee's method 1000 times; * - checks that altered callback works and METHOD_ENTRY and METHOD_EXIT * events will be sent 1000 times.. * 3) - * - sets off callbacks for choosen event; + * - sets off callbacks for chosen event; * - sets callback for VM_DEATH event; - * - checks that no choosen events are sent until VMDeath event. + * - checks that no chosen events are sent until VMDeath event. * COMMENTS * Modified due to fix of the bug * 5010571 TEST_BUG: jvmti tests with VMObjectAlloc callbacks should diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t010/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t010/TestDescription.java index c3ad87a908a..87ed2d58aa2 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t010/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t010/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -35,20 +35,20 @@ * 1) * - adds the , * capabilities during the OnLoad phase; - * - sets callbacks for VM_INIT and choosen events during the OnLoad phase; + * - sets callbacks for VM_INIT and chosen events during the OnLoad phase; * - enables all optional events via SetEventNotificationMode during * the OnLoad phase; * - reads and modifies static integer fields; - * - expects that each of choosen events is sent at least 1 time. + * - expects that each of chosen events is sent at least 1 time. * 2) - * - changes callbacks for choosen event; + * - changes callbacks for chosen event; * - reads and modifies static integer fields; - * - checks that altered callback works and each of choosen events + * - checks that altered callback works and each of chosen events * is sent at least 1 time. * 3) - * - sets off callbacks for choosen event; + * - sets off callbacks for chosen event; * - sets callback for VM_DEATH event; - * - checks that no choosen events are sent until VMDeath event. + * - checks that no chosen events are sent until VMDeath event. * COMMENTS * Modified due to fix of the bug * 5010571 TEST_BUG: jvmti tests with VMObjectAlloc callbacks should diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t011/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t011/TestDescription.java index 7518d9f9cb3..adf236394cc 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t011/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t011/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -34,20 +34,20 @@ * 1) * - adds the capabilities during the * OnLoad phase; - * - sets callbacks for VM_INIT and choosen events during the OnLoad phase; + * - sets callbacks for VM_INIT and chosen events during the OnLoad phase; * - enables all optional events via SetEventNotificationMode during * the OnLoad phase; * - reads and modifies static integer fields; - * - expects that each of choosen events is sent at least 1 time. + * - expects that each of chosen events is sent at least 1 time. * 2) - * - changes callbacks for choosen event; + * - changes callbacks for chosen event; * - reads and modifies static integer fields; - * - checks that altered callback works and each of choosen events + * - checks that altered callback works and each of chosen events * is sent at least 1 time. * 3) - * - sets off callbacks for choosen event; + * - sets off callbacks for chosen event; * - sets callback for VM_DEATH event; - * - checks that no choosen events are sent until VMDeath event. + * - checks that no chosen events are sent until VMDeath event. * COMMENTS * Modified due to fix of the bug * 5010571 TEST_BUG: jvmti tests with VMObjectAlloc callbacks should diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t012/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t012/TestDescription.java index 91dedd3d391..3eda230d30f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t012/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t012/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -41,7 +41,7 @@ * has been reached, jvmti agent suspend thread and calls NotifyFramePop; * - expects FRAME_POP event is sent 1000 time. * 2) - * - changes callbacks for choosen event; + * - changes callbacks for chosen event; * - debuggee starts recurisve method with depth=1000 and when defined depth * has been reached, jvmti agent suspend thread and calls NotifyFramePop; * - checks that altered callback works and FRAME_POP event is sent 1000 time. diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002.java index c733b1b2156..dcaca552073 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -40,7 +40,7 @@ *

  • sets callbacks for COMPILED_METHOD_LOAD, * COMPILED_METHOD_UNLOAD events during the OnLoad phase;
  • *
  • enables these events during the OnLoad phase;
  • - *
  • provides the state to provoke generation of choosen events (see details below);
  • + *
  • provides the state to provoke generation of chosen events (see details below);
  • *
  • checks number of COMPILED_METHOD_UNLOAD events is less than * COMPILED_METHOD_LOAD or equal.
  • * diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002/TestDescription.java index 797cfbc1310..aacc48a1e94 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM07/em07t002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -37,7 +37,7 @@ * (2) sets callbacks for COMPILED_METHOD_LOAD, COMPILED_METHOD_UNLOAD events * during the OnLoad phase; * (3) enables these events during the OnLoad phase; - * (4) provides the state to provoke generation of choosen events (see details + * (4) provides the state to provoke generation of chosen events (see details * in comments of em07t002.java) * (5) checks number of COMPILED_METHOD_UNLOAD events is less than * COMPILED_METHOD_LOAD or equal. diff --git a/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/thread/StandardThreadMonitoringScenarioFactory.java b/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/thread/StandardThreadMonitoringScenarioFactory.java index e858409e238..e928fe6677b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/thread/StandardThreadMonitoringScenarioFactory.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/thread/StandardThreadMonitoringScenarioFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -40,7 +40,7 @@ public StandardThreadMonitoringScenarioFactory(Log log, int maxDepth, int thread } public int getScenarioCount(int basicThreadCount) { - // This is choosen to have one scenario of each type and recursionType. + // This is chosen to have one scenario of each type and recursionType. basicThreadCount = Math.min(basicThreadCount, 3); return basicThreadCount * typeCount * 3; } diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 51301a7869a..298b5ce70fb 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -664,8 +664,6 @@ sun/security/provider/KeyStore/DKSTest.sh 8180266 windows- sun/security/pkcs11/KeyStore/SecretKeysBasic.java 8209398 generic-all security/infra/java/security/cert/CertPathValidator/certification/ActalisCA.java 8224768 generic-all -security/infra/java/security/cert/CertPathValidator/certification/ComodoCA.java 8263059 generic-all -security/infra/java/security/cert/CertPathValidator/certification/QuoVadisCA.java 8248899 generic-all sun/security/smartcardio/TestChannel.java 8039280 generic-all sun/security/smartcardio/TestConnect.java 8039280 generic-all @@ -702,6 +700,7 @@ javax/sound/sampled/Mixers/DisabledAssertionCrash.java 7067310 generic-all javax/sound/midi/Sequencer/Recording.java 8167580,8265485 linux-all,macosx-aarch64 javax/sound/midi/Sequencer/MetaCallback.java 8178698 linux-all +javax/sound/midi/Sequencer/Looping.java 8136897 generic-all ############################################################################ @@ -745,8 +744,6 @@ javax/swing/JEditorPane/6917744/bug6917744.java 8213124 macosx-all javax/swing/JRootPane/4670486/bug4670486.java 8042381 macosx-all javax/swing/JPopupMenu/4634626/bug4634626.java 8017175 macosx-all -javax/swing/plaf/basic/BasicHTML/4251579/bug4251579.java 8137101 linux-x64 - sanity/client/SwingSet/src/ToolTipDemoTest.java 8225012 windows-all,macosx-all sanity/client/SwingSet/src/ScrollPaneDemoTest.java 8225013 linux-all sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java 8265770 macosx-all @@ -788,6 +785,9 @@ com/sun/jdi/AfterThreadDeathTest.java 8232839 linux-al # jdk_util +java/util/Locale/LocaleProvidersRun.java 8268379 macosx-x64 +sun/util/locale/provider/CalendarDataRegression.java 8268379 macosx-x64 + ############################################################################ # jdk_instrument diff --git a/test/jdk/TEST.ROOT b/test/jdk/TEST.ROOT index 7d941b86317..6b78ca255f5 100644 --- a/test/jdk/TEST.ROOT +++ b/test/jdk/TEST.ROOT @@ -39,7 +39,7 @@ groups=TEST.groups # to determine additional characteristics of the system for use with the @requires tag. # Note: compiled bootlibs classes will be added to BCP. requires.extraPropDefns = ../jtreg-ext/requires/VMProps.java -requires.extraPropDefns.bootlibs = ../lib/sun +requires.extraPropDefns.bootlibs = ../lib/jdk/test/whitebox requires.extraPropDefns.libs = \ ../lib/jdk/test/lib/Platform.java \ ../lib/jdk/test/lib/Container.java diff --git a/test/jdk/java/rmi/module/ModuleTest.java b/test/jdk/java/rmi/module/ModuleTest.java index 6eca5452b68..85c91714517 100644 --- a/test/jdk/java/rmi/module/ModuleTest.java +++ b/test/jdk/java/rmi/module/ModuleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -149,7 +149,7 @@ public void testAppInUnnamedModule() throws Exception { * @throws Exception */ @Test - public void testClientInUnamedModule() throws Exception { + public void testClientInUnnamedModule() throws Exception { assertEquals(executeTestJava("--module-path", pathJoin(MTEST_JAR, SERVER_JAR), "--add-modules", "mserver", "-cp", CLIENT_JAR, diff --git a/test/jdk/java/rmi/reliability/benchmark/bench/rmi/Main.java b/test/jdk/java/rmi/reliability/benchmark/bench/rmi/Main.java index 8f997afca21..b4d8e289075 100644 --- a/test/jdk/java/rmi/reliability/benchmark/bench/rmi/Main.java +++ b/test/jdk/java/rmi/reliability/benchmark/bench/rmi/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -390,7 +390,7 @@ static void parseArgs(String[] args) { } try { //This is the hack code because named package class has - //difficulty in accessing unamed package class. This + //difficulty in accessing unnamed package class. This //should be removed ater JDK-8003358 is finished. port = (int) Class.forName("TestLibrary") .getMethod("getUnusedRandomPort") diff --git a/test/jdk/javax/imageio/plugins/tiff/LargeTIFFTagTest.java b/test/jdk/javax/imageio/plugins/tiff/LargeTIFFTagTest.java new file mode 100644 index 00000000000..dad0dd462ff --- /dev/null +++ b/test/jdk/javax/imageio/plugins/tiff/LargeTIFFTagTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 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 8270893 + * @summary Ensure that we don't throw IndexOutOfBoundsException when + * we read TIFF tag with content more than 1024000 bytes + * @run main LargeTIFFTagTest + */ + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Iterator; + +public class LargeTIFFTagTest { + public static void main(String[] args) throws IOException { + // TIFF stream length to hold 22 bytes of TIFF header + // plus 1024002 bytes of data in one TIFFTag + int length = 1024024; + byte[] ba = new byte[length]; + // Little endian TIFF stream with header and only one + // IFD entry at offset 22 having count value 1024002. + byte[] header = new byte[] { (byte)0x49, (byte) 0x49, + (byte)0x2a, (byte)0x00, (byte)0x08, (byte)0x00, + (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, + (byte)0x73, (byte)0x87, (byte)0x07, (byte)0x00, + (byte)0x02, (byte)0xA0, (byte)0x0F, (byte)0x00, + (byte)0x16, (byte)0x00, (byte)0x00, (byte)0x00}; + // copy first 22 bytes of TIFF header to byte array + for (int i = 0; i < 22; i++) { + ba[i] = header[i]; + } + ByteArrayInputStream bais = new ByteArrayInputStream(ba); + ImageInputStream stream = ImageIO.createImageInputStream(bais); + Iterator readers = ImageIO.getImageReaders(stream); + + if(readers.hasNext()) { + ImageReader reader = readers.next(); + reader.setInput(stream); + try { + reader.readAll(0, null); + } catch (IllegalArgumentException e) { + // do nothing we expect IllegalArgumentException but we + // should not throw IndexOutOfBoundsException. + System.out.println(e.toString()); + System.out.println("Caught IllegalArgumentException ignore it"); + } + } else { + throw new RuntimeException("No readers available for TIFF format"); + } + } +} diff --git a/test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.java b/test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.java index 19517b61bb5..5bdc85d7184 100644 --- a/test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.java +++ b/test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -187,7 +187,7 @@ public final void createUI() throws Exception { String instructions = "See for different look and feel tabbed panes titles \n" + " contain three dots(...) at the end if the pane size \n" - + " cannot accommadate the title completely.\n" + + " cannot accommodate the title completely.\n" + "If yes, click on 'pass' else click on 'fail'\n"; instructionTextArea = new JTextArea(); diff --git a/test/jdk/javax/swing/plaf/basic/BasicHTML/4251579/bug4251579.java b/test/jdk/javax/swing/plaf/basic/BasicHTML/4251579/bug4251579.java index 04244a925a2..79f9b53fd8c 100644 --- a/test/jdk/javax/swing/plaf/basic/BasicHTML/4251579/bug4251579.java +++ b/test/jdk/javax/swing/plaf/basic/BasicHTML/4251579/bug4251579.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -27,54 +27,68 @@ * @key headful * @bug 4251579 * @summary Tests if style sheets are working in JLabel - * @author Denis Sharypov * @run main bug4251579 */ -import java.awt.*; -import javax.swing.*; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Robot; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import javax.swing.JLabel; public class bug4251579 { private static JLabel htmlComponent; + private static JFrame mainFrame; public static void main(String[] args) throws Exception { final Robot robot = new Robot(); - robot.setAutoDelay(50); - SwingUtilities.invokeAndWait(new Runnable() { + try { + SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - createAndShowGUI(); - } - }); + @Override + public void run() { + createAndShowGUI(); + } + }); - robot.waitForIdle(); + robot.waitForIdle(); + robot.delay(1000); - SwingUtilities.invokeAndWait(new Runnable() { + SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - boolean passed = false; + @Override + public void run() { + boolean passed = false; - Point p = htmlComponent.getLocationOnScreen(); - Dimension d = htmlComponent.getSize(); - int x0 = p.x; - int y = p.y + d.height / 2; + Point p = htmlComponent.getLocationOnScreen(); + Dimension d = htmlComponent.getSize(); + int x0 = p.x; + int y = p.y + d.height / 2; - for (int x = x0; x < x0 + d.width; x++) { - if (robot.getPixelColor(x, y).equals(Color.blue)) { - passed = true; - break; + for (int x = x0; x < x0 + d.width; x++) { + if (robot.getPixelColor(x, y).equals(Color.blue)) { + passed = true; + break; + } } - } - if (!passed) { - throw new RuntimeException("Test failed."); - } + if (!passed) { + throw new RuntimeException("Test failed."); + } - } - }); + } + }); + } finally { + SwingUtilities.invokeAndWait(() -> { + if (mainFrame != null) { + mainFrame.dispose(); + } + }); + } } private static void createAndShowGUI() { @@ -86,12 +100,13 @@ private static void createAndShowGUI() { + "

    should be rendered with BLUE class definition

    " + ""; - JFrame mainFrame = new JFrame("bug4251579"); + mainFrame = new JFrame("bug4251579"); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); htmlComponent = new JLabel(htmlText); mainFrame.getContentPane().add(htmlComponent); + mainFrame.setLocationRelativeTo(null); mainFrame.pack(); mainFrame.setVisible(true); } diff --git a/test/jdk/jdk/jfr/event/diagnostics/TestHeapDump.java b/test/jdk/jdk/jfr/event/diagnostics/TestHeapDump.java index 1b5314519be..a24e6d5996f 100644 --- a/test/jdk/jdk/jfr/event/diagnostics/TestHeapDump.java +++ b/test/jdk/jdk/jfr/event/diagnostics/TestHeapDump.java @@ -63,8 +63,8 @@ public static void main(String[] args) throws Exception { RecordedEvent e = events.get(0); Events.assertField(e, "destination").equal(path.toString()); Events.assertField(e, "gcBeforeDump").equal(true); - Events.assertField(e, "onOutOfMemoryError").equals(false); - Events.assertField(e, "size").equals(Files.size(path)); + Events.assertField(e, "onOutOfMemoryError").equal(false); + Events.assertField(e, "size").equal(Files.size(path)); System.out.println(e); } } diff --git a/test/jdk/jdk/nio/zipfs/HasDotDotTest.java b/test/jdk/jdk/nio/zipfs/HasDotDotTest.java new file mode 100644 index 00000000000..6c6111dd0ab --- /dev/null +++ b/test/jdk/jdk/nio/zipfs/HasDotDotTest.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 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. + * + */ +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Stream; +import java.util.zip.CRC32; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import static org.testng.Assert.assertThrows; +import static org.testng.Assert.assertTrue; +/** + * @test + * @bug 8251329 + * @summary Excercise Zip FS with "." or ".." in a Zip Entry name + * @modules jdk.zipfs + * @run testng/othervm HasDotDotTest + */ +public class HasDotDotTest { + // Zip file to be created + private static final Path ZIPFILE = Path.of("zipfsDotDotTest.zip"); + // Data for Zip entries + private static final byte[] ENTRY_DATA = + "Tennis Anyone".getBytes(StandardCharsets.UTF_8); + // Display output + private static final boolean DEBUG = false; + + /** + * DataProvider containing Zip entry names which should result in an IOException + * @return Array of Zip entry names + */ + @DataProvider + private Object[][] checkForDotOrDotDotPaths() { + return new Object[][]{ + {"/./foo"}, + {"/../foo"}, + {"/../foo/.."}, + {"/foo/.."}, + {"/foo/."}, + {"/.."}, + {"/."}, + {"/.foo/./"}, + {"/.././"}, + }; + } + + // Zip entry names to create a Zip file with for validating they are not + // interpreted as a "." or ".." entry + private final String[] VALID_PATHS = + {"/foo.txt", "/..foo.txt", "/.foo.txt", "/.foo/bar.txt", "/foo/bar.txt"}; + // Paths to be returned from Files::walk via Zip FS + private final String[] EXPECTED_PATHS = + {"/", "/..foo.txt", "/foo.txt", "/.foo.txt", "/.foo", + "/.foo/bar.txt", "/foo/bar.txt", "/foo"}; + + /** + * Creates a Zip file + * @param zip path for Zip to be created + * @param entries the entries to add to the Zip file + * @throws IOException if an error occurs + */ + private static void createZip(Path zip, String... entries) throws IOException { + try (var os = Files.newOutputStream(zip); + ZipOutputStream zos = new ZipOutputStream(os)) { + for (var e : entries) { + var ze = new ZipEntry(e); + var crc = new CRC32(); + ze.setMethod(ZipEntry.STORED); + crc.update(ENTRY_DATA); + ze.setCrc(crc.getValue()); + ze.setSize(ENTRY_DATA.length); + zos.putNextEntry(ze); + zos.write(ENTRY_DATA); + } + } + } + + /** + * Test to validate an IOException is thrown when opening a Zip file using + * Zip FS and the path contains a "." or ".." + * @param path + * @throws IOException + */ + @Test(dataProvider = "checkForDotOrDotDotPaths") + public void hasDotOrDotDotTest(String path) throws IOException { + if (DEBUG) { + System.out.printf("Validating entry: %s%n", path); + } + Files.deleteIfExists(ZIPFILE); + createZip(ZIPFILE, path); + assertThrows(IOException.class, () -> + FileSystems.newFileSystem(ZIPFILE, Map.of())); + Files.deleteIfExists(ZIPFILE); + } + + /** + * Validate that an entry with a name containing a "." or ".." can be + * accessed via Files::walk + * @throws IOException if an error occurs + */ + @Test + public void validPaths() throws IOException { + Files.deleteIfExists(ZIPFILE); + createZip(ZIPFILE, VALID_PATHS); + /* + Walk through the Zip file and collect the Zip FS entries + */ + try (FileSystem zipfs = FileSystems.newFileSystem(ZIPFILE)) { + Path zipRoot = zipfs.getPath("/"); + try (Stream files = Files.walk(zipRoot, Integer.MAX_VALUE)) { + var entries = files.map(Path::toString) + .sorted() + .toArray(String[]::new); + if (DEBUG) { + for (String zipEntry : entries) { + System.out.println(zipEntry); + } + } + Arrays.sort(EXPECTED_PATHS); + assertTrue(Arrays.equals(entries, EXPECTED_PATHS)); + } + } + Files.deleteIfExists(ZIPFILE); + } +} diff --git a/test/jdk/jdk/security/JavaDotSecurity/MakeJavaSecurityTest.java b/test/jdk/jdk/security/JavaDotSecurity/MakeJavaSecurityTest.java new file mode 100644 index 00000000000..c4ea0538c9d --- /dev/null +++ b/test/jdk/jdk/security/JavaDotSecurity/MakeJavaSecurityTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 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. + */ + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; + +import jdk.test.lib.Asserts; + +/** + * @test + * @bug 8141690 + * @summary MakeJavaSecurity.java functions + * @library /test/lib /test/jdk + * @run main MakeJavaSecurityTest + */ +public class MakeJavaSecurityTest { + + private static final String TEST_SRC = System.getProperty("test.src", "."); + + public static void main(String[] args) throws Exception { + Path toolPath = getMakeJavaSecPath(); + + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + toolPath.toString(), + TEST_SRC + "/raw_java_security", + "outfile", + "solaris", + "sparc", + "somepolicy", + TEST_SRC + "/more_restricted"); + + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + + verifyOutputFile(); + } + + private static Path getMakeJavaSecPath() { + String testRoot = System.getProperty("test.root", "."); + Path toolPath = Paths.get(testRoot).getParent().getParent(); + toolPath = toolPath.resolve("make/jdk/src/classes/build/tools" + + "/makejavasecurity/MakeJavaSecurity.java"); + + Asserts.assertTrue(Files.exists(toolPath), + String.format("Cannot find %s. Maybe not all code repos are available", + toolPath)); + return toolPath; + } + + private static void verifyOutputFile() throws IOException { + Path actualFile = Path.of("./outfile"); + Path expectedFile = Path.of(TEST_SRC + "/final_java_security"); + + List list1 = Files.readAllLines(actualFile); + List list2 = Files.readAllLines(expectedFile); + list1 = removeEmptyLines(list1); + list2 = removeEmptyLines(list2); + + String errorMessage = String.format(""" + Expected file content: + %s\s + not equal to actual: + %s\s + """, list2, list1); + + Asserts.assertTrue(list1.equals(list2), errorMessage); + } + + private static List removeEmptyLines(List list) { + return list.stream() + .filter(item -> !item.isBlank()) + .collect(Collectors.toList()); + } +} diff --git a/test/jdk/jdk/security/JavaDotSecurity/ifdefs.sh b/test/jdk/jdk/security/JavaDotSecurity/ifdefs.sh deleted file mode 100644 index 5dc58345fc3..00000000000 --- a/test/jdk/jdk/security/JavaDotSecurity/ifdefs.sh +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright (c) 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. -# - -# @test -# @bug 8141690 -# @summary MakeJavaSecurity.java functions - -if [ "${TESTSRC}" = "" ] ; then - TESTSRC="." -fi - -if [ "${TESTJAVA}" = "" ] ; then - JAVAC_CMD=`which javac` - TESTJAVA=`dirname $JAVAC_CMD`/.. - COMPILEJAVA=${TESTJAVA} -fi - -JAVAC="${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS}" -JAVA="${TESTJAVA}/bin/java ${TESTVMOPTS}" -TOOLSRC="${TESTSRC}/../../../../make/src/classes/build/tools/makejavasecurity/MakeJavaSecurity.java" -TOOLNAME=build.tools.makejavasecurity.MakeJavaSecurity - -if [ ! -f $TOOLSRC ]; then - echo "Cannot find $TOOLSRC. Maybe not all code repos are available" - exit 0 -fi - -$JAVAC -d . $TOOLSRC -$JAVA $TOOLNAME \ - $TESTSRC/raw_java_security \ - outfile \ - solaris \ - sparc \ - somepolicy \ - $TESTSRC/more_restricted - -# On Windows, line end could be different. -b is a cross-platform option. -diff -b outfile $TESTSRC/final_java_security diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/ComodoCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/ComodoCA.java index 3b3466116ef..73d7171b906 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/ComodoCA.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/ComodoCA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -110,15 +110,65 @@ class ComodoRSA { + "pLwltum95OmYdBbxN4SBB7SC\n" + "-----END CERTIFICATE-----"; - // Owner: CN=comodorsacertificationauthority-ev.comodoca.com, OU=COMODO EV SGC SSL, O=Sectigo Limited, - // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, - // OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, - // SERIALNUMBER=04058690 + // Owner: CN=comodorsacertificationauthority-ev.comodoca.com, + // O=Sectigo Limited, STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, + // L=Salford, ST=Manchester, OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, + // OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 + // Issuer: CN=COMODO RSA Extended Validation Secure Server CA, O=COMODO CA Limited, L=Salford, + // ST=Greater Manchester, C=GB + // Serial number: 9eb246629030e0b527ca2f93e5ebf25a + // Valid from: Mon Mar 01 16:00:00 PST 2021 until: Sat Apr 02 16:59:59 PDT 2022 + private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + + "MIIHSzCCBjOgAwIBAgIRAJ6yRmKQMOC1J8ovk+Xr8lowDQYJKoZIhvcNAQELBQAw\n" + + "gZIxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n" + + "BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTgwNgYD\n" + + "VQQDEy9DT01PRE8gUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZl\n" + + "ciBDQTAeFw0yMTAzMDIwMDAwMDBaFw0yMjA0MDIyMzU5NTlaMIIBNzERMA8GA1UE\n" + + "BRMIMDQwNTg2OTAxEzARBgsrBgEEAYI3PAIBAxMCR0IxHTAbBgNVBA8TFFByaXZh\n" + + "dGUgT3JnYW5pemF0aW9uMQswCQYDVQQGEwJHQjEPMA0GA1UEERMGTTUgM0VRMRMw\n" + + "EQYDVQQIEwpNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRYwFAYDVQQJEw1U\n" + + "cmFmZm9yZCBSb2FkMRYwFAYDVQQJEw1FeGNoYW5nZSBRdWF5MSUwIwYDVQQJExwz\n" + + "cmQgRmxvb3IsIDI2IE9mZmljZSBWaWxsYWdlMRgwFgYDVQQKEw9TZWN0aWdvIExp\n" + + "bWl0ZWQxODA2BgNVBAMTL2NvbW9kb3JzYWNlcnRpZmljYXRpb25hdXRob3JpdHkt\n" + + "ZXYuY29tb2RvY2EuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n" + + "0P95lAFOOkEOy614rCX7OlOK0Xy0nPAcCFxAcLYBosX8YmXWuePHg596UyEqE3U5\n" + + "30pTqiccY53bDiYPgSJgr1OlfC7BPLN+QKaeSrFmNgrcoAk3TXejgv7zLXOwZVS6\n" + + "Wk38Z8xrFNvhd2Z5J6RM/3U+HDfF7OKMGrexr77Ws7lEFpPUgd4eEe+IL1Y2sbwI\n" + + "iD+PkzIL2LjctkeJFcsRHUvNP8wIhGyIbkARuJhdXkE13lKKIe0EnWrRkkf4DEvY\n" + + "RFpPjVUKmluhnBOGYkYaiTL0VaOnrPxToSfHR8Awkhk0TNbosAkUo8TKcRTTTiMU\n" + + "UIS6Y9SqoILiiDG6WmFjzQIDAQABo4IC8jCCAu4wHwYDVR0jBBgwFoAUOdr/yigU\n" + + "iqh0Ewi55A6p0vp+nWkwHQYDVR0OBBYEFD5LhmEivA6h4az0EFPi5erz1TH+MA4G\n" + + "A1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMB\n" + + "BggrBgEFBQcDAjBJBgNVHSAEQjBAMDUGDCsGAQQBsjEBAgEFATAlMCMGCCsGAQUF\n" + + "BwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAHBgVngQwBATBWBgNVHR8ETzBN\n" + + "MEugSaBHhkVodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FFeHRlbmRl\n" + + "ZFZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcmwwgYcGCCsGAQUFBwEBBHsweTBR\n" + + "BggrBgEFBQcwAoZFaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBRXh0\n" + + "ZW5kZWRWYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCQGCCsGAQUFBzABhhho\n" + + "dHRwOi8vb2NzcC5jb21vZG9jYS5jb20wOgYDVR0RBDMwMYIvY29tb2RvcnNhY2Vy\n" + + "dGlmaWNhdGlvbmF1dGhvcml0eS1ldi5jb21vZG9jYS5jb20wggEEBgorBgEEAdZ5\n" + + "AgQCBIH1BIHyAPAAdgBGpVXrdfqRIDC1oolp9PN9ESxBdL79SbiFq/L8cP5tRwAA\n" + + "AXfyqEfyAAAEAwBHMEUCIQDJbHPgbqK21/Nugwl5mgMO81YQSHOm4VcQ8UvOJjnN\n" + + "JQIgWw9fortwJBtv2Mts6xJYr5D6itPpEYP8uegURneBwRsAdgBvU3asMfAxGdiZ\n" + + "AKRRFf93FRwR2QLBACkGjbIImjfZEwAAAXfyqEjyAAAEAwBHMEUCIDifAsuw37D4\n" + + "beHZ9Ed5/Pab0Eg6Cobrh4jv3bjfA6KIAiEAmiA/XD+AccfI85c+C2zH9wNIs+Zm\n" + + "/V/uo/sv0i9eCAYwDQYJKoZIhvcNAQELBQADggEBADRFnOFgb3mzCUpXxiU5/mM5\n" + + "ECRj3NzXKXjcYlSMhVcWA7Eqa5rhJuh11vbPoDQzQcGxntS/zhRwJFRF3hnyFa3m\n" + + "4t+7ZnUaJN+GOMTABh4kYiOSpE9id12URdJzWv2IHg4CU3OLnsBHGh7H9eWfbPvn\n" + + "OW4owV1ChpiEHh40i/NQkTn9JzjlZepI9+EsSdhn2tpis7tko6PX/plgw8bRgm7f\n" + + "ong2QaX/DE6z4VIdomW8TQhB9turhKxwjzPTbtYDQIgZfRP/H1S5jYutqbE5yL5B\n" + + "r+VOiSuB8234P4xWg1IBL2EFbxPdgOSMTWRJutUcj44kJKmwp5GUQtySSccw4gk=\n" + + "-----END CERTIFICATE-----"; + + // Owner: CN=comodorsacertificationauthority-ev.comodoca.com, OU=COMODO EV SGC SSL, + // O=Sectigo Limited, STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, + // L=Salford, OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, + // OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 // Issuer: CN=COMODO RSA Extended Validation Secure Server CA, O=COMODO CA Limited, L=Salford, // ST=Greater Manchester, C=GB // Serial number: a0c7cabcc25ed9358ded02cc1d485545 // Valid from: Sun Sep 29 17:00:00 PDT 2019 until: Tue Dec 28 15:59:59 PST 2021 - private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + + private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + "MIIH0TCCBrmgAwIBAgIRAKDHyrzCXtk1je0CzB1IVUUwDQYJKoZIhvcNAQELBQAw\n" + "gZIxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n" + "BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTgwNgYD\n" + @@ -163,60 +213,6 @@ class ComodoRSA { "G3t91yw7BnNNInZlBSsFtqjbHhDcr7uruZdbi0rerSsi2qDr0w==\n" + "-----END CERTIFICATE-----"; - // Owner: CN=comodorsacertificationauthority-ev.comodoca.com, OU=COMODO EV SGC SSL, O=Sectigo Limited, - // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, - // ST=Greater Manchester, OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, - // OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 - // Issuer: CN=COMODO RSA Extended Validation Secure Server CA, O=COMODO CA Limited, L=Salford, - // ST=Greater Manchester, C=GB - // Serial number: d3df2597cbed1ab6e02ee82021771614 - // Valid from: Wed Nov 28 16:00:00 PST 2018 until: Fri Feb 26 15:59:59 PST 2021 - private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + - "MIIH7jCCBtagAwIBAgIRANPfJZfL7Rq24C7oICF3FhQwDQYJKoZIhvcNAQELBQAw\n" + - "gZIxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n" + - "BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTgwNgYD\n" + - "VQQDEy9DT01PRE8gUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZl\n" + - "ciBDQTAeFw0xODExMjkwMDAwMDBaFw0yMTAyMjYyMzU5NTlaMIIBWzERMA8GA1UE\n" + - "BRMIMDQwNTg2OTAxEzARBgsrBgEEAYI3PAIBAxMCR0IxHTAbBgNVBA8TFFByaXZh\n" + - "dGUgT3JnYW5pemF0aW9uMQswCQYDVQQGEwJHQjEPMA0GA1UEERMGTTUgM0VRMRsw\n" + - "GQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxFjAU\n" + - "BgNVBAkTDVRyYWZmb3JkIFJvYWQxFjAUBgNVBAkTDUV4Y2hhbmdlIFF1YXkxJTAj\n" + - "BgNVBAkTHDNyZCBGbG9vciwgMjYgT2ZmaWNlIFZpbGxhZ2UxGDAWBgNVBAoTD1Nl\n" + - "Y3RpZ28gTGltaXRlZDEaMBgGA1UECxMRQ09NT0RPIEVWIFNHQyBTU0wxODA2BgNV\n" + - "BAMTL2NvbW9kb3JzYWNlcnRpZmljYXRpb25hdXRob3JpdHktZXYuY29tb2RvY2Eu\n" + - "Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0P95lAFOOkEOy614\n" + - "rCX7OlOK0Xy0nPAcCFxAcLYBosX8YmXWuePHg596UyEqE3U530pTqiccY53bDiYP\n" + - "gSJgr1OlfC7BPLN+QKaeSrFmNgrcoAk3TXejgv7zLXOwZVS6Wk38Z8xrFNvhd2Z5\n" + - "J6RM/3U+HDfF7OKMGrexr77Ws7lEFpPUgd4eEe+IL1Y2sbwIiD+PkzIL2LjctkeJ\n" + - "FcsRHUvNP8wIhGyIbkARuJhdXkE13lKKIe0EnWrRkkf4DEvYRFpPjVUKmluhnBOG\n" + - "YkYaiTL0VaOnrPxToSfHR8Awkhk0TNbosAkUo8TKcRTTTiMUUIS6Y9SqoILiiDG6\n" + - "WmFjzQIDAQABo4IDcTCCA20wHwYDVR0jBBgwFoAUOdr/yigUiqh0Ewi55A6p0vp+\n" + - "nWkwHQYDVR0OBBYEFD5LhmEivA6h4az0EFPi5erz1TH+MA4GA1UdDwEB/wQEAwIF\n" + - "oDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBP\n" + - "BgNVHSAESDBGMDsGDCsGAQQBsjEBAgEFATArMCkGCCsGAQUFBwIBFh1odHRwczov\n" + - "L3NlY3VyZS5jb21vZG8uY29tL0NQUzAHBgVngQwBATBWBgNVHR8ETzBNMEugSaBH\n" + - "hkVodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FFeHRlbmRlZFZhbGlk\n" + - "YXRpb25TZWN1cmVTZXJ2ZXJDQS5jcmwwgYcGCCsGAQUFBwEBBHsweTBRBggrBgEF\n" + - "BQcwAoZFaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBRXh0ZW5kZWRW\n" + - "YWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8v\n" + - "b2NzcC5jb21vZG9jYS5jb20wOgYDVR0RBDMwMYIvY29tb2RvcnNhY2VydGlmaWNh\n" + - "dGlvbmF1dGhvcml0eS1ldi5jb21vZG9jYS5jb20wggF9BgorBgEEAdZ5AgQCBIIB\n" + - "bQSCAWkBZwB1AO5Lvbd1zmC64UJpH6vhnmajD35fsHLYgwDEe4l6qP3LAAABZ2Bx\n" + - "+EAAAAQDAEYwRAIgXot8xi2N4oV6A8n2aXJ/TI6oI5t30ZgiyR3jF8nY8tYCIGBB\n" + - "e7sTFniA3vzfxhMbYsyAEy50PNFCaqLjNoyOaGNqAHYAb1N2rDHwMRnYmQCkURX/\n" + - "dxUcEdkCwQApBo2yCJo32RMAAAFnYHH4LQAABAMARzBFAiBq8utPzn0fL5zPPQNB\n" + - "gueIXEFDXPw8s5D+pzD6+ySwegIhAJUCgsW++nO2JwYNwJTxPsHOWs7WpXqXCsVC\n" + - "/FlJ1HHbAHYAu9nfvB+KcbWTlCOXqpJ7RzhXlQqrUugakJZkNo4e0YUAAAFnYHH4\n" + - "OAAABAMARzBFAiA7rSUo9XVQDb3CBLo85qFMzYzsylF223s0u4WXQTUGqQIhAKJq\n" + - "j602nEd4imaE9Wr7OWdIbbhLcNm5dhVZerk4MD6GMA0GCSqGSIb3DQEBCwUAA4IB\n" + - "AQBPeidaCGBGyFDK60+Eh8GyKQSMowcRA74B6C+JlQYTBtl024xAV7d3fnbULtzY\n" + - "rs5EGxlEPIR/ZLAETTdEi1mAalXAi2l1QDrmTeOGW+FZXlcXQuNeg56D9gkApftR\n" + - "yFFRLNScchNDsMwR3UOlJnD05DJk1J+SeNvOlefwfDHIlZBiQIrSxdWS8GIIkKLp\n" + - "4PIy+N4lgNEudi2LuRheEjmrkN9+NcKlU+v7lzlwCfWCDna2hacGRPRo5fAao5O0\n" + - "mlUzAYm76dn5dGGBVVqA0cfWnUeVfSTrlVb/QN+uYno4vIrpR5VBYPuJYU47vgzL\n" + - "YrTYerPngjPbZB0bfLOja0vb\n" + - "-----END CERTIFICATE-----"; - public void runTest(ValidatePathWithParams pathValidator) throws Exception { // Validate valid pathValidator.validate(new String[]{VALID, INT}, @@ -225,7 +221,7 @@ public void runTest(ValidatePathWithParams pathValidator) throws Exception { // Validate Revoked pathValidator.validate(new String[]{REVOKED, INT}, ValidatePathWithParams.Status.REVOKED, - "Wed Oct 02 06:06:24 PDT 2019", System.out); + "Tue Mar 02 02:51:39 PST 2021", System.out); } } @@ -260,15 +256,55 @@ class ComodoECC { + "lnxmeeOBnnCaDIxAcA3aCj2Gtdt3sA==\n" + "-----END CERTIFICATE-----"; + // Owner: CN=comodoecccertificationauthority-ev.comodoca.com, O=Sectigo Limited, STREET="3rd Floor, + // 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, ST=Manchester, OID.2.5.4.17=M5 3EQ, + // C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 + // Issuer: CN=COMODO ECC Extended Validation Secure Server CA, O=COMODO CA Limited, L=Salford, + // ST=Greater Manchester, C=GB + // Serial number: db437a31e5be29a62443e3caa1479001 + // Valid from: Mon Mar 01 16:00:00 PST 2021 until: Sat Apr 02 16:59:59 PDT 2022 + private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + + "MIIFvzCCBWWgAwIBAgIRANtDejHlvimmJEPjyqFHkAEwCgYIKoZIzj0EAwIwgZIx\n" + + "CzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNV\n" + + "BAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTgwNgYDVQQD\n" + + "Ey9DT01PRE8gRUNDIEV4dGVuZGVkIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD\n" + + "QTAeFw0yMTAzMDIwMDAwMDBaFw0yMjA0MDIyMzU5NTlaMIIBNzERMA8GA1UEBRMI\n" + + "MDQwNTg2OTAxEzARBgsrBgEEAYI3PAIBAxMCR0IxHTAbBgNVBA8TFFByaXZhdGUg\n" + + "T3JnYW5pemF0aW9uMQswCQYDVQQGEwJHQjEPMA0GA1UEERMGTTUgM0VRMRMwEQYD\n" + + "VQQIEwpNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRYwFAYDVQQJEw1UcmFm\n" + + "Zm9yZCBSb2FkMRYwFAYDVQQJEw1FeGNoYW5nZSBRdWF5MSUwIwYDVQQJExwzcmQg\n" + + "Rmxvb3IsIDI2IE9mZmljZSBWaWxsYWdlMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0\n" + + "ZWQxODA2BgNVBAMTL2NvbW9kb2VjY2NlcnRpZmljYXRpb25hdXRob3JpdHktZXYu\n" + + "Y29tb2RvY2EuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt26qBS7TRu/y\n" + + "fR+RiqLAzW2C+UspFZlORc4EhLfNYMgFkoZKjEnwJzudH6a+uRPqPOhPgUd6PFfR\n" + + "QFOcLjmhgaOCAvIwggLuMB8GA1UdIwQYMBaAFNNOwxm6WFnRHGC3YVNHO6d3j/iK\n" + + "MB0GA1UdDgQWBBTpZ0tzKscFw6Z3vCEDFzGR5VSkVzAOBgNVHQ8BAf8EBAMCBYAw\n" + + "DAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSQYD\n" + + "VR0gBEIwQDA1BgwrBgEEAbIxAQIBBQEwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9z\n" + + "ZWN0aWdvLmNvbS9DUFMwBwYFZ4EMAQEwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDov\n" + + "L2NybC5jb21vZG9jYS5jb20vQ09NT0RPRUNDRXh0ZW5kZWRWYWxpZGF0aW9uU2Vj\n" + + "dXJlU2VydmVyQ0EuY3JsMIGHBggrBgEFBQcBAQR7MHkwUQYIKwYBBQUHMAKGRWh0\n" + + "dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET0VDQ0V4dGVuZGVkVmFsaWRhdGlv\n" + + "blNlY3VyZVNlcnZlckNBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29t\n" + + "b2RvY2EuY29tMDoGA1UdEQQzMDGCL2NvbW9kb2VjY2NlcnRpZmljYXRpb25hdXRo\n" + + "b3JpdHktZXYuY29tb2RvY2EuY29tMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHYA\n" + + "RqVV63X6kSAwtaKJafTzfREsQXS+/Um4havy/HD+bUcAAAF38qtH4AAABAMARzBF\n" + + "AiBsKoB1TTfoUYUNqF160/vlOENHyK1zzARcnfGKYURHTwIhANKYWg1CO7jyCPk+\n" + + "IrrLaR+461snNK4LJZXJm4o/9GeeAHYAb1N2rDHwMRnYmQCkURX/dxUcEdkCwQAp\n" + + "Bo2yCJo32RMAAAF38qtJIAAABAMARzBFAiEA1hgxkYZb5Tc9+vQsDnsfXVewClN2\n" + + "7gzwd4hZdqAsOSYCID9CWcBvkKrL44mfe9ky1Z6BnAWHUBMCxTjt8MO/IMZ8MAoG\n" + + "CCqGSM49BAMCA0gAMEUCIBa3sfOiVb0q4LcXU9umKjzVw3Ib8VdiPTtXSnyl0oLb\n" + + "AiEAnpRB53UtLAF7xw98ELmK/LEk1b5KSlqoO8sFHgwQ8vI=\n" + + "-----END CERTIFICATE-----"; + // Owner: CN=comodoecccertificationauthority-ev.comodoca.com, OU=COMODO EV SSL, O=Sectigo Limited, - // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, - // OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, - // SERIALNUMBER=04058690 + // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, OID.2.5.4.17=M5 3EQ, + // C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 // Issuer: CN=COMODO ECC Extended Validation Secure Server CA, O=COMODO CA Limited, L=Salford, // ST=Greater Manchester, C=GB // Serial number: 7972d9d8472a2d52ad1ee6edfb16cbe1 // Valid from: Sun Sep 29 17:00:00 PDT 2019 until: Tue Dec 28 15:59:59 PST 2021 - private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + + private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + "MIIGPzCCBeWgAwIBAgIQeXLZ2EcqLVKtHubt+xbL4TAKBggqhkjOPQQDAjCBkjEL\n" + "MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\n" + "BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxODA2BgNVBAMT\n" + @@ -305,52 +341,6 @@ class ComodoECC { "ER4wRjFfFoc6lC68OHGVg9CZZg==\n" + "-----END CERTIFICATE-----"; - // Owner: CN=comodoecccertificationauthority-ev.comodoca.com, OU=COMODO EV SSL, O=Sectigo Limited, - // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, - // ST=Greater Manchester, OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, - // OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 - // Issuer: CN=COMODO ECC Extended Validation Secure Server CA, O=COMODO CA Limited, L=Salford, - // ST=Greater Manchester, C=GB - // Serial number: 603a5c2f85b63e00ba46ce8c3f6000b0 - // Valid from: Wed Nov 28 16:00:00 PST 2018 until: Fri Feb 26 15:59:59 PST 2021 - private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + - "MIIGXzCCBgWgAwIBAgIQYDpcL4W2PgC6Rs6MP2AAsDAKBggqhkjOPQQDAjCBkjEL\n" + - "MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\n" + - "BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxODA2BgNVBAMT\n" + - "L0NPTU9ETyBFQ0MgRXh0ZW5kZWQgVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB\n" + - "MB4XDTE4MTEyOTAwMDAwMFoXDTIxMDIyNjIzNTk1OVowggFXMREwDwYDVQQFEwgw\n" + - "NDA1ODY5MDETMBEGCysGAQQBgjc8AgEDEwJHQjEdMBsGA1UEDxMUUHJpdmF0ZSBP\n" + - "cmdhbml6YXRpb24xCzAJBgNVBAYTAkdCMQ8wDQYDVQQREwZNNSAzRVExGzAZBgNV\n" + - "BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEWMBQGA1UE\n" + - "CRMNVHJhZmZvcmQgUm9hZDEWMBQGA1UECRMNRXhjaGFuZ2UgUXVheTElMCMGA1UE\n" + - "CRMcM3JkIEZsb29yLCAyNiBPZmZpY2UgVmlsbGFnZTEYMBYGA1UEChMPU2VjdGln\n" + - "byBMaW1pdGVkMRYwFAYDVQQLEw1DT01PRE8gRVYgU1NMMTgwNgYDVQQDEy9jb21v\n" + - "ZG9lY2NjZXJ0aWZpY2F0aW9uYXV0aG9yaXR5LWV2LmNvbW9kb2NhLmNvbTBZMBMG\n" + - "ByqGSM49AgEGCCqGSM49AwEHA0IABLduqgUu00bv8n0fkYqiwM1tgvlLKRWZTkXO\n" + - "BIS3zWDIBZKGSoxJ8Cc7nR+mvrkT6jzoT4FHejxX0UBTnC45oYGjggNzMIIDbzAf\n" + - "BgNVHSMEGDAWgBTTTsMZulhZ0Rxgt2FTRzund4/4ijAdBgNVHQ4EFgQU6WdLcyrH\n" + - "BcOmd7whAxcxkeVUpFcwDgYDVR0PAQH/BAQDAgWAMAwGA1UdEwEB/wQCMAAwHQYD\n" + - "VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCME8GA1UdIARIMEYwOwYMKwYBBAGy\n" + - "MQECAQUBMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20v\n" + - "Q1BTMAcGBWeBDAEBMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwuY29tb2Rv\n" + - "Y2EuY29tL0NPTU9ET0VDQ0V4dGVuZGVkVmFsaWRhdGlvblNlY3VyZVNlcnZlckNB\n" + - "LmNybDCBhwYIKwYBBQUHAQEEezB5MFEGCCsGAQUFBzAChkVodHRwOi8vY3J0LmNv\n" + - "bW9kb2NhLmNvbS9DT01PRE9FQ0NFeHRlbmRlZFZhbGlkYXRpb25TZWN1cmVTZXJ2\n" + - "ZXJDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTA6\n" + - "BgNVHREEMzAxgi9jb21vZG9lY2NjZXJ0aWZpY2F0aW9uYXV0aG9yaXR5LWV2LmNv\n" + - "bW9kb2NhLmNvbTCCAX8GCisGAQQB1nkCBAIEggFvBIIBawFpAHYA7ku9t3XOYLrh\n" + - "Qmkfq+GeZqMPfl+wctiDAMR7iXqo/csAAAFnYHQLpwAABAMARzBFAiB0pm9GZG/W\n" + - "REFW/umEd07eSzGsPZpRkOXahkiAmXiuxgIhAOiYZKB4Gr4JlAuQsajqbrS715L9\n" + - "03E7walRViBHMA3XAHcAb1N2rDHwMRnYmQCkURX/dxUcEdkCwQApBo2yCJo32RMA\n" + - "AAFnYHQLmwAABAMASDBGAiEAqUN6xU8mcNaYExuxUSZQR1WP5SZrgrDnAl+DN4t3\n" + - "R1MCIQCJseJMXtpzP2jB1d1sz/WS6pDERjutjYc0ko//m+WjlAB2ALvZ37wfinG1\n" + - "k5Qjl6qSe0c4V5UKq1LoGpCWZDaOHtGFAAABZ2B0C6cAAAQDAEcwRQIgI42QfFzd\n" + - "f9W0a383BnL3nGgLQinrd7usIbA81LwOvlECIQD+fmSDEs6lwsS5EGtIvygWMs2F\n" + - "7FWI1I8ucE0ikP+wCjAKBggqhkjOPQQDAgNIADBFAiB3P9kNVyLpA8tovSGeRvdx\n" + - "VfA0Slz//EIeeHhbHz7D/AIhAN+WFuDimGKE1XcKrmucSBLSrYGWlY8XJcF6en3v\n" + - "KOC7\n" + - "-----END CERTIFICATE-----"; - public void runTest(ValidatePathWithParams pathValidator) throws Exception { // Validate valid pathValidator.validate(new String[]{VALID, INT}, @@ -359,7 +349,7 @@ public void runTest(ValidatePathWithParams pathValidator) throws Exception { // Validate Revoked pathValidator.validate(new String[]{REVOKED, INT}, ValidatePathWithParams.Status.REVOKED, - "Wed Oct 02 06:05:57 PDT 2019", System.out); + "Tue Mar 02 02:53:40 PST 2021", System.out); } } @@ -370,7 +360,7 @@ class ComodoUserTrustRSA { // Issuer: CN=USERTrust RSA Certification Authority, O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US // Serial number: 284e39c14b386d889c7299e58cd05a57 // Valid from: Thu Nov 01 17:00:00 PDT 2018 until: Tue Dec 31 15:59:59 PST 2030 - private static final String INT_VALID = "-----BEGIN CERTIFICATE-----\n" + + private static final String INT = "-----BEGIN CERTIFICATE-----\n" + "MIIGNDCCBBygAwIBAgIQKE45wUs4bYiccpnljNBaVzANBgkqhkiG9w0BAQwFADCB\n" + "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n" + "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n" + @@ -407,57 +397,64 @@ class ComodoUserTrustRSA { "Q9zXE6hC6X4=\n" + "-----END CERTIFICATE-----"; - // Owner: CN=USERTrust RSA Extended Validation Secure Server CA, - // O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US - // Issuer: CN=USERTrust RSA Certification Authority, O=The USERTRUST Network, - // L=Jersey City, ST=New Jersey, C=US - // Serial number: f6bb751efa7d2e8368e606407334f83 - // Valid from: Sat Feb 11 16:00:00 PST 2012 until: Thu Feb 11 15:59:59 PST 2027 - private static final String INT_REVOKED = "-----BEGIN CERTIFICATE-----\n" - + "MIIGGTCCBAGgAwIBAgIQD2u3Ue+n0ug2jmBkBzNPgzANBgkqhkiG9w0BAQwFADCB\n" - + "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n" - + "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n" - + "BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTIw\n" - + "MjEyMDAwMDAwWhcNMjcwMjExMjM1OTU5WjCBlTELMAkGA1UEBhMCVVMxEzARBgNV\n" - + "BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\n" - + "aGUgVVNFUlRSVVNUIE5ldHdvcmsxOzA5BgNVBAMTMlVTRVJUcnVzdCBSU0EgRXh0\n" - + "ZW5kZWQgVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0B\n" - + "AQEFAAOCAQ8AMIIBCgKCAQEAlJwjjGNzAgMFwLu05RnhYFJS1PpbcyPH6VZOij+z\n" - + "PyvCILGvwXC8A+EgBthY080+kIlSxrNyOdnrUfNj8IsBtBlmtOF9nMWgD0Cb4HB1\n" - + "Y/tCNas8IHMtKr6eI4nJa4NjPhTcST+GtC8r+bVGHk0QpX4LbT+Z8WeE7pXIOUGs\n" - + "9j66/hsMwgnBxkQ9xXN0jhTFITUZfnCuM0vOo5hRYlCNtwD8iaHJPaKxYe6qHSKH\n" - + "WCBK7GUQiQRngry+YKLx3YtC3k/NQIyhaTLY/gUFi57kPcpZoa0h3RGfS9MpPFoe\n" - + "mk3rGH3jwjVFxR1ep1FtP/kprzLaR1UL81gxENhWvZEWXQIDAQABo4IBbjCCAWow\n" - + "HwYDVR0jBBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFC+BT+Jm\n" - + "+rxov5lDhFKJIDqC86SlMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/\n" - + "AgEAMDoGA1UdIAQzMDEwLwYEVR0gADAnMCUGCCsGAQUFBwIBFhlodHRwczovL2Nw\n" - + "cy51c2VydHJ1c3QuY29tMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNl\n" - + "cnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNy\n" - + "bDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRy\n" - + "dXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZ\n" - + "aHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAa2bX\n" - + "Xf22zjY/QLzzdZwJ9JO86qH/czwCFPK4o9Cb7rixQL9S7zHw1dm3n/+Lx5kT9lqx\n" - + "wB0dqoZ8o0XwFgVcksGz7QRhEBjrB0nSUNYG8kuFaMxRWa9ze6Ovov44WDrq1uyF\n" - + "npi3eeQiwMr3xHmY76b1NX0WqvlTTFw4L5DrcIohBz1zKVkRp7LH/s5vxjDECM+/\n" - + "erdy1WTILNFv09gwz4iFyfu/WmYYNUKlQJaSoUqja/KHcqY8zYKKjq5o982Ji3Ti\n" - + "/Odkx1NJA1Yf5ivDxxRFQmij6knL1pi1wgQxGjd67V3/+HfHF7MCRWk8mXnT32B9\n" - + "1Hk3jm10GL0R6y/XFsLhv0mGkmKD1vTP7vz1hdMLlVgxEs1k5dLMybtjUJ3LuENz\n" - + "avmZ/G/vOi284ZRo/gA/YjT5CeeWgI11IHbpRDAqKy4BWhmtIi11u12i9ftPxxrD\n" - + "/VwHtC0hTTOBnYgbJAK9ZLvaJUBU22EimU4Jv3ELkeV7SWedbAdfjXolI1mCcAbq\n" - + "RgzRC+RaTloSmO2dWicDBW7KlRHmKZXrkDUAExSBY/1j9HmNcYzWv4NCTtK7t0en\n" - + "gsE/OP2b7zHrHWtC/F1JwOCrH1JkbPA7c/6nNJVY2AscGM16pIU89OL0Ez1PyZYG\n" - + "4fokbdNREXoShKClNIPbB5iY+WdSzb9CKLyb96g=\n" - + "-----END CERTIFICATE-----"; + // Owner: CN=usertrustrsacertificationauthority-ev.comodoca.com, O=Sectigo Limited, STREET="3rd Floor, + // 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, ST=Manchester, OID.2.5.4.17=M5 3EQ, + // C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 + // Issuer: CN=Sectigo RSA Extended Validation Secure Server CA, O=Sectigo Limited, L=Salford, + // ST=Greater Manchester, C=GB + // Serial number: 4e484426dbfed0c222b2ed152465614a + // Valid from: Mon Mar 01 16:00:00 PST 2021 until: Sat Apr 02 16:59:59 PDT 2022 + private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + + "MIIHTzCCBjegAwIBAgIQTkhEJtv+0MIisu0VJGVhSjANBgkqhkiG9w0BAQsFADCB\n" + + "kTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n" + + "A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTkwNwYDVQQD\n" + + "EzBTZWN0aWdvIFJTQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFNlY3VyZSBTZXJ2ZXIg\n" + + "Q0EwHhcNMjEwMzAyMDAwMDAwWhcNMjIwNDAyMjM1OTU5WjCCAToxETAPBgNVBAUT\n" + + "CDA0MDU4NjkwMRMwEQYLKwYBBAGCNzwCAQMTAkdCMR0wGwYDVQQPExRQcml2YXRl\n" + + "IE9yZ2FuaXphdGlvbjELMAkGA1UEBhMCR0IxDzANBgNVBBETBk01IDNFUTETMBEG\n" + + "A1UECBMKTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEWMBQGA1UECRMNVHJh\n" + + "ZmZvcmQgUm9hZDEWMBQGA1UECRMNRXhjaGFuZ2UgUXVheTElMCMGA1UECRMcM3Jk\n" + + "IEZsb29yLCAyNiBPZmZpY2UgVmlsbGFnZTEYMBYGA1UEChMPU2VjdGlnbyBMaW1p\n" + + "dGVkMTswOQYDVQQDEzJ1c2VydHJ1c3Ryc2FjZXJ0aWZpY2F0aW9uYXV0aG9yaXR5\n" + + "LWV2LmNvbW9kb2NhLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n" + + "AJ4f68XomMKS2uudXi7xp0fkRK4Q1pE2bamXB8PTsuyS9rhC8hD2zPr9Gs+NHAR0\n" + + "tG0GSWW1plzbpDFDEsCG+M+7fDl5cc/br8RLn75agZeKngv89y6RQUURxHq6N8hi\n" + + "lcJKHtWj9j6u1HYvu4u3lWWXQNbYnMWVqP1AVPZsGyDmKn/+Mc2ehvPdYSm/jQLr\n" + + "hH8Rudr12ZfKHTE4Xx7g5ZH0u52TEAWjuNCiXkhAYa/uUyEu3e7VlsnvxeqBENPn\n" + + "RwYhfT8mdXV6DvGrnv/NJj/tBTGE5kRbCh4HumY6I3x/XC5UeZE6rT+U6oeRgUOM\n" + + "6d7siAQVOspSqfTzR5HsBlECAwEAAaOCAvUwggLxMB8GA1UdIwQYMBaAFCxp/4DJ\n" + + "h5CuNOG050yThZlA6aeyMB0GA1UdDgQWBBR8+3Lw59S2HtjPs+KZcEJ+67fd/DAO\n" + + "BgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcD\n" + + "AQYIKwYBBQUHAwIwSQYDVR0gBEIwQDA1BgwrBgEEAbIxAQIBBQEwJTAjBggrBgEF\n" + + "BQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwBwYFZ4EMAQEwVgYDVR0fBE8w\n" + + "TTBLoEmgR4ZFaHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBRXh0ZW5k\n" + + "ZWRWYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3JsMIGGBggrBgEFBQcBAQR6MHgw\n" + + "UQYIKwYBBQUHMAKGRWh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1JTQUV4\n" + + "dGVuZGVkVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNydDAjBggrBgEFBQcwAYYX\n" + + "aHR0cDovL29jc3Auc2VjdGlnby5jb20wPQYDVR0RBDYwNIIydXNlcnRydXN0cnNh\n" + + "Y2VydGlmaWNhdGlvbmF1dGhvcml0eS1ldi5jb21vZG9jYS5jb20wggEFBgorBgEE\n" + + "AdZ5AgQCBIH2BIHzAPEAdwBGpVXrdfqRIDC1oolp9PN9ESxBdL79SbiFq/L8cP5t\n" + + "RwAAAXfyrRCwAAAEAwBIMEYCIQCeOHfnABa6cl0EHTzyMj2t2qBqORBAC16hJIIl\n" + + "Y52W4QIhAKHDk1m9lW0kmcZJWEko3eA9QKJSDLNLpdUoBPzNNc76AHYAb1N2rDHw\n" + + "MRnYmQCkURX/dxUcEdkCwQApBo2yCJo32RMAAAF38q0R6wAABAMARzBFAiEAywsh\n" + + "8Ki6fFOExwR6de0qzTmf7bJMuQcY0Ry463/9R44CIDeAcX7Z9S1vlRB9gzVomNIN\n" + + "vkcnUazq7dowPnr5rYMOMA0GCSqGSIb3DQEBCwUAA4IBAQA3a+PBgH1SBVEDpgAN\n" + + "mWaqIQzJzMRfSgvopQ6nC8iD95SfYD/rvic7aOeBLh/5aEs/CknJsg6o0qB3wz1v\n" + + "T5JXd5JldRWw3nP80jkIaYgq97RUIkjcHhuw4hTyQP6wk7XVlPVLvBo9ePWxJjmn\n" + + "whxlSyxQ5A5NdrTqZOJmu9nFr2HXpX75kGwCkUKZI050FAZZydsK3LfMBTqe1Xwi\n" + + "PKyjXDWd40LjOEg31sA43ofO8n2pySP5LG5XAsvoAyPCy3zXhx5cdtmQFLIkntus\n" + + "DCfN+n51HPUo8r4PUhQtOiRUB3K871LTdwyv4/CRXS2fIhtO1pxYNKFOw0yrUf6j\n" + + "ECgk\n" + + "-----END CERTIFICATE-----"; // Owner: CN=usertrustrsacertificationauthority-ev.comodoca.com, OU=COMODO EV SGC SSL, O=Sectigo Limited, // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, ST=Manchester, - // OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, - // SERIALNUMBER=04058690 + // OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 // Issuer: CN=Sectigo RSA Extended Validation Secure Server CA, O=Sectigo Limited, L=Salford, // ST=Greater Manchester, C=GB // Serial number: b07fd164b5790c9d5d1fddff5819cdb2 // Valid from: Sun Sep 29 17:00:00 PDT 2019 until: Tue Dec 28 15:59:59 PST 2021 - private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + + private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + "MIIH5TCCBs2gAwIBAgIRALB/0WS1eQydXR/d/1gZzbIwDQYJKoZIhvcNAQELBQAw\n" + "gZExCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n" + "BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE5MDcGA1UE\n" + @@ -503,69 +500,15 @@ class ComodoUserTrustRSA { "7ml+Usz6udaD\n" + "-----END CERTIFICATE-----"; - // Owner: CN=usertrustrsacertificationauthority-ev.comodoca.com, OU=COMODO EV SGC SSL, O=Sectigo Limited, - // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, - // ST=Greater Manchester, OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, - // OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 - // Issuer: CN=USERTrust RSA Extended Validation Secure Server CA, O=The USERTRUST Network, L=Jersey City, - // ST=New Jersey, C=US - // Serial number: d3c204e8df6a1539568cf15e97e57b1d - // Valid from: Wed Nov 28 16:00:00 PST 2018 until: Fri Feb 26 15:59:59 PST 2021 - private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + - "MIIIADCCBuigAwIBAgIRANPCBOjfahU5VozxXpflex0wDQYJKoZIhvcNAQELBQAw\n" + - "gZUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK\n" + - "ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMTswOQYD\n" + - "VQQDEzJVU0VSVHJ1c3QgUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gU2VjdXJlIFNl\n" + - "cnZlciBDQTAeFw0xODExMjkwMDAwMDBaFw0yMTAyMjYyMzU5NTlaMIIBXjERMA8G\n" + - "A1UEBRMIMDQwNTg2OTAxEzARBgsrBgEEAYI3PAIBAxMCR0IxHTAbBgNVBA8TFFBy\n" + - "aXZhdGUgT3JnYW5pemF0aW9uMQswCQYDVQQGEwJHQjEPMA0GA1UEERMGTTUgM0VR\n" + - "MRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQx\n" + - "FjAUBgNVBAkTDVRyYWZmb3JkIFJvYWQxFjAUBgNVBAkTDUV4Y2hhbmdlIFF1YXkx\n" + - "JTAjBgNVBAkTHDNyZCBGbG9vciwgMjYgT2ZmaWNlIFZpbGxhZ2UxGDAWBgNVBAoT\n" + - "D1NlY3RpZ28gTGltaXRlZDEaMBgGA1UECxMRQ09NT0RPIEVWIFNHQyBTU0wxOzA5\n" + - "BgNVBAMTMnVzZXJ0cnVzdHJzYWNlcnRpZmljYXRpb25hdXRob3JpdHktZXYuY29t\n" + - "b2RvY2EuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnh/rxeiY\n" + - "wpLa651eLvGnR+RErhDWkTZtqZcHw9Oy7JL2uELyEPbM+v0az40cBHS0bQZJZbWm\n" + - "XNukMUMSwIb4z7t8OXlxz9uvxEufvlqBl4qeC/z3LpFBRRHEero3yGKVwkoe1aP2\n" + - "Pq7Udi+7i7eVZZdA1ticxZWo/UBU9mwbIOYqf/4xzZ6G891hKb+NAuuEfxG52vXZ\n" + - "l8odMThfHuDlkfS7nZMQBaO40KJeSEBhr+5TIS7d7tWWye/F6oEQ0+dHBiF9PyZ1\n" + - "dXoO8aue/80mP+0FMYTmRFsKHge6ZjojfH9cLlR5kTqtP5Tqh5GBQ4zp3uyIBBU6\n" + - "ylKp9PNHkewGUQIDAQABo4IDfTCCA3kwHwYDVR0jBBgwFoAUL4FP4mb6vGi/mUOE\n" + - "UokgOoLzpKUwHQYDVR0OBBYEFHz7cvDn1LYe2M+z4plwQn7rt938MA4GA1UdDwEB\n" + - "/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF\n" + - "BQcDAjBLBgNVHSAERDBCMDcGDCsGAQQBsjEBAgEFATAnMCUGCCsGAQUFBwIBFhlo\n" + - "dHRwczovL2Nwcy51c2VydHJ1c3QuY29tMAcGBWeBDAEBMFoGA1UdHwRTMFEwT6BN\n" + - "oEuGSWh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FFeHRlbmRl\n" + - "ZFZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcmwwgY0GCCsGAQUFBwEBBIGAMH4w\n" + - "VQYIKwYBBQUHMAKGSWh0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RS\n" + - "U0FFeHRlbmRlZFZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcnQwJQYIKwYBBQUH\n" + - "MAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wPQYDVR0RBDYwNIIydXNlcnRy\n" + - "dXN0cnNhY2VydGlmaWNhdGlvbmF1dGhvcml0eS1ldi5jb21vZG9jYS5jb20wggGA\n" + - "BgorBgEEAdZ5AgQCBIIBcASCAWwBagB3AO5Lvbd1zmC64UJpH6vhnmajD35fsHLY\n" + - "gwDEe4l6qP3LAAABZ2ElLBIAAAQDAEgwRgIhAM33ah4mcEfxzv4a8+BLysZKJygV\n" + - "jeARvesL/mH6y51bAiEA4hzW9aDRmEnuCcagONmIexMl0s3gMWfaU8/0s4ESJecA\n" + - "dgBvU3asMfAxGdiZAKRRFf93FRwR2QLBACkGjbIImjfZEwAAAWdhJSwQAAAEAwBH\n" + - "MEUCIQDCZ7GZayfWD3blSOWgk8PrAs/GVVpc5gJG3V+wq8LHMwIgH6n8DkoA46v1\n" + - "0UrmkVo7ND18ykuWyNH83QafsolTYSIAdwC72d+8H4pxtZOUI5eqkntHOFeVCqtS\n" + - "6BqQlmQ2jh7RhQAAAWdhJSwSAAAEAwBIMEYCIQC/XcbvfZzEqDpUthm3gYzndaiB\n" + - "8djqlQ89Mo29WDMS8AIhAKcWwmE5F2SuoTojiO0pPC5w5T38uW0vTXzb+fkj+6d5\n" + - "MA0GCSqGSIb3DQEBCwUAA4IBAQAmq2kRR74802+YMB2AaqklGcFRCuBVxU/ExbvE\n" + - "loNpNk64KH2eHwMK13ad0Lbc8/LaVgIJPtPz87LNqu00kQh0DL/kCnoO94+Z+usU\n" + - "ulQNYr8y3sg8+NZd9ui/VQTOcXrlovL+mnJnTgsCUzNYcoBIPq7lHxtZv5MG99AR\n" + - "6NyGTG28Aw8ZByCzhaasDOyT4YwlfveVUtsx1jKUC+0e6IhsGhxADnYOnrDD0cNd\n" + - "4bgX6SkpM0MCg6Nc3X/C4fo3WaSRM6FO4S98NY4g2DhNskT/7TmX2DsPwS005t0r\n" + - "3Ld31zbQaywKdpCsT74/hEBMfcDiP02mmtyrlqHD4R3tdYne\n" + - "-----END CERTIFICATE-----"; - public void runTest(ValidatePathWithParams pathValidator) throws Exception { // Validate valid - pathValidator.validate(new String[]{VALID, INT_VALID}, + pathValidator.validate(new String[]{VALID, INT}, ValidatePathWithParams.Status.GOOD, null, System.out); // Validate Revoked - pathValidator.validate(new String[]{REVOKED, INT_REVOKED}, + pathValidator.validate(new String[]{REVOKED, INT}, ValidatePathWithParams.Status.REVOKED, - "Wed Oct 02 06:07:12 PDT 2019", System.out); + "Tue Mar 02 02:55:42 PST 2021", System.out); } } @@ -576,7 +519,7 @@ class ComodoUserTrustECC { // Issuer: CN=USERTrust ECC Certification Authority, O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US // Serial number: 80f5606d3a162b143adc12fbe8c2066f // Valid from: Thu Nov 01 17:00:00 PDT 2018 until: Tue Dec 31 15:59:59 PST 2030 - private static final String INT_VALID = "-----BEGIN CERTIFICATE-----\n" + + private static final String INT = "-----BEGIN CERTIFICATE-----\n" + "MIIDyTCCA0+gAwIBAgIRAID1YG06FisUOtwS++jCBm8wCgYIKoZIzj0EAwMwgYgx\n" + "CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJz\n" + "ZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQD\n" + @@ -600,45 +543,57 @@ class ComodoUserTrustECC { "j+Th+DJ92JLvICVD/g==\n" + "-----END CERTIFICATE-----"; - // Owner: CN=USERTrust ECC Extended Validation Secure Server CA, O=The USERTRUST Network, - // L=Jersey City, ST=New Jersey, C=US - // Issuer: CN=USERTrust ECC Certification Authority, O=The USERTRUST Network, - // L=Jersey City, ST=New Jersey, C=US - // Serial number: 3d09b24f5c08a7ce8eb85a51d3c1aa52 - // Valid from: Sun Apr 14 17:00:00 PDT 2013 until: Fri Apr 14 16:59:59 PDT 2028 - private static final String INT_REVOKED = "-----BEGIN CERTIFICATE-----\n" - + "MIIDwTCCA0igAwIBAgIQPQmyT1wIp86OuFpR08GqUjAKBggqhkjOPQQDAzCBiDEL\n" - + "MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl\n" - + "eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT\n" - + "JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTMwNDE1\n" - + "MDAwMDAwWhcNMjgwNDE0MjM1OTU5WjCBlTELMAkGA1UEBhMCVVMxEzARBgNVBAgT\n" - + "Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg\n" - + "VVNFUlRSVVNUIE5ldHdvcmsxOzA5BgNVBAMTMlVTRVJUcnVzdCBFQ0MgRXh0ZW5k\n" - + "ZWQgVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMFkwEwYHKoZIzj0CAQYIKoZI\n" - + "zj0DAQcDQgAEkSRGk0F0N82ZCZ+kVZ/StqVUiWRirw1ebViS06+j+HgS9xZKRGh7\n" - + "bqSas/gNMyg1LZusGu5IvEmXmNC5hzOT06OCAYMwggF/MB8GA1UdIwQYMBaAFDrh\n" - + "CYbUzxnClnZ0SXbc4DXGY2OaMB0GA1UdDgQWBBQqnFr5TqEw2kBLK+lL8fWc3AL5\n" - + "LjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADA/BgNVHSAEODA2\n" - + "MDQGBFUdIAAwLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9jcHMudHJ1c3QtcHJvdmlk\n" - + "ZXIuY29tMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly9jcmwudHJ1c3QtcHJvdmlk\n" - + "ZXIuY29tL1VTRVJUcnVzdEVDQ0NlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMIGA\n" - + "BggrBgEFBQcBAQR0MHIwRAYIKwYBBQUHMAKGOGh0dHA6Ly9jcnQudHJ1c3QtcHJv\n" - + "dmlkZXIuY29tL1VTRVJUcnVzdEVDQ0FkZFRydXN0Q0EuY3J0MCoGCCsGAQUFBzAB\n" - + "hh5odHRwOi8vb2NzcC50cnVzdC1wcm92aWRlci5jb20wCgYIKoZIzj0EAwMDZwAw\n" - + "ZAIwSzIqrW8TN9/aCfkhUtz0t8IIK+Z46z3wm+crwjThpQ/VoPgTNbvP/lGTi1xR\n" - + "qJvLAjBFa27l4uqeAQZHNJnIx1Mu9OXzoJelx1cYP7ToQUms/g+PK77yImJcXUU3\n" - + "s1rWGRU=\n" - + "-----END CERTIFICATE-----"; - - // Owner: CN=usertrustecccertificationauthority-ev.comodoca.com, OU=COMODO EV SGC SSL, O=Sectigo Limited, + // Owner: CN=usertrustecccertificationauthority-ev.comodoca.com, O=Sectigo Limited, // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, - // OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, - // SERIALNUMBER=04058690 + // ST=Manchester, OID.2.5.4.17=M5 3EQ, + // C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 + // Issuer: CN=Sectigo ECC Extended Validation Secure Server CA, O=Sectigo Limited, L=Salford, + // ST=Greater Manchester, C=GB + // Serial number: 9aa5da67480446fd7bf408fd5fdaa1d8 + // Valid from: Mon Mar 01 16:00:00 PST 2021 until: Sat Apr 02 16:59:59 PDT 2022 + private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + + "MIIFwTCCBWigAwIBAgIRAJql2mdIBEb9e/QI/V/aodgwCgYIKoZIzj0EAwIwgZEx\n" + + "CzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNV\n" + + "BAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE5MDcGA1UEAxMw\n" + + "U2VjdGlnbyBFQ0MgRXh0ZW5kZWQgVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB\n" + + "MB4XDTIxMDMwMjAwMDAwMFoXDTIyMDQwMjIzNTk1OVowggE6MREwDwYDVQQFEwgw\n" + + "NDA1ODY5MDETMBEGCysGAQQBgjc8AgEDEwJHQjEdMBsGA1UEDxMUUHJpdmF0ZSBP\n" + + "cmdhbml6YXRpb24xCzAJBgNVBAYTAkdCMQ8wDQYDVQQREwZNNSAzRVExEzARBgNV\n" + + "BAgTCk1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxFjAUBgNVBAkTDVRyYWZm\n" + + "b3JkIFJvYWQxFjAUBgNVBAkTDUV4Y2hhbmdlIFF1YXkxJTAjBgNVBAkTHDNyZCBG\n" + + "bG9vciwgMjYgT2ZmaWNlIFZpbGxhZ2UxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRl\n" + + "ZDE7MDkGA1UEAxMydXNlcnRydXN0ZWNjY2VydGlmaWNhdGlvbmF1dGhvcml0eS1l\n" + + "di5jb21vZG9jYS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQtMl8R33Za\n" + + "WD6H8BW0+wybBf0+6+L5YYK/eyAVGm6vwjLaQZWlcdFBMKfaP1qTLi0VAabs4baS\n" + + "UkD8wR568pVpo4IC8zCCAu8wHwYDVR0jBBgwFoAU78EqlQwy2vtzMNyKE9gVS/cT\n" + + "6PgwHQYDVR0OBBYEFLOtYfOaIfDHZGubtKNELRR6A2srMA4GA1UdDwEB/wQEAwIH\n" + + "gDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBJ\n" + + "BgNVHSAEQjBAMDUGDCsGAQQBsjEBAgEFATAlMCMGCCsGAQUFBwIBFhdodHRwczov\n" + + "L3NlY3RpZ28uY29tL0NQUzAHBgVngQwBATBWBgNVHR8ETzBNMEugSaBHhkVodHRw\n" + + "Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29FQ0NFeHRlbmRlZFZhbGlkYXRpb25T\n" + + "ZWN1cmVTZXJ2ZXJDQS5jcmwwgYYGCCsGAQUFBwEBBHoweDBRBggrBgEFBQcwAoZF\n" + + "aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvRUNDRXh0ZW5kZWRWYWxpZGF0\n" + + "aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5z\n" + + "ZWN0aWdvLmNvbTA9BgNVHREENjA0gjJ1c2VydHJ1c3RlY2NjZXJ0aWZpY2F0aW9u\n" + + "YXV0aG9yaXR5LWV2LmNvbW9kb2NhLmNvbTCCAQMGCisGAQQB1nkCBAIEgfQEgfEA\n" + + "7wB2AEalVet1+pEgMLWiiWn0830RLEF0vv1JuIWr8vxw/m1HAAABd/Kung0AAAQD\n" + + "AEcwRQIhAI16l52NctGAphhc6eh2kK2vO5QYk5nyouL3P6U/gG/dAiBfJRJ+iqE/\n" + + "noco35RpNtlV4GABrwmw1I/1R+L79VzwEAB1AG9Tdqwx8DEZ2JkApFEV/3cVHBHZ\n" + + "AsEAKQaNsgiaN9kTAAABd/KunvwAAAQDAEYwRAIgS+r3C10ua38DPJKvUJvW5bvL\n" + + "SCQ949n3sBJvhV6aXq4CIH/oEGgvJmKtMEjVKUQg8TrZO6LwQ+0sYfL79Qvm8wL3\n" + + "MAoGCCqGSM49BAMCA0cAMEQCID4Q9cc8OQ9tmKnnKZyplPsPipI5apVGkBqFRUSt\n" + + "zzM3AiAw5tw3cv/oabDsYdU+lmp5kZ/S3Z97ANAAaHE0AfXe/Q==\n" + + "-----END CERTIFICATE-----"; + + // Owner: CN=usertrustecccertificationauthority-ev.comodoca.com, OU=COMODO EV SGC SSL, + // O=Sectigo Limited, STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, + // L=Salford, OID.2.5.4.17=M5 3EQ, + // C=GB, OID.2.5.4.15=Private Organization, OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 // Issuer: CN=Sectigo ECC Extended Validation Secure Server CA, O=Sectigo Limited, L=Salford, // ST=Greater Manchester, C=GB // Serial number: 8b72489b7f505a55e2a22659c90ed2ab // Valid from: Sun Sep 29 17:00:00 PDT 2019 until: Tue Dec 28 15:59:59 PST 2021 - private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + + private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + "MIIGRTCCBeugAwIBAgIRAItySJt/UFpV4qImWckO0qswCgYIKoZIzj0EAwIwgZEx\n" + "CzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNV\n" + "BAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE5MDcGA1UEAxMw\n" + @@ -675,60 +630,14 @@ class ComodoUserTrustECC { "59GEMj5NpyF2ZQEq5mEGcjJNojrn+PC4zg==\n" + "-----END CERTIFICATE-----"; - // Owner: CN=usertrustecccertificationauthority-ev.comodoca.com, OU=COMODO EV SGC SSL, O=Sectigo Limited, - // STREET="3rd Floor, 26 Office Village", STREET=Exchange Quay, STREET=Trafford Road, L=Salford, - // ST=Greater Manchester, OID.2.5.4.17=M5 3EQ, C=GB, OID.2.5.4.15=Private Organization, - // OID.1.3.6.1.4.1.311.60.2.1.3=GB, SERIALNUMBER=04058690 - // Issuer: CN=USERTrust ECC Extended Validation Secure Server CA, O=The USERTRUST Network, L=Jersey City, - // ST=New Jersey, C=US - // Serial number: ab1455f9833ae7783f95de8744181f6a - // Valid from: Wed Nov 28 16:00:00 PST 2018 until: Fri Feb 26 15:59:59 PST 2021 - private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + - "MIIGhjCCBiygAwIBAgIRAKsUVfmDOud4P5Xeh0QYH2owCgYIKoZIzj0EAwIwgZUx\n" + - "CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJz\n" + - "ZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMTswOQYDVQQD\n" + - "EzJVU0VSVHJ1c3QgRUNDIEV4dGVuZGVkIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZl\n" + - "ciBDQTAeFw0xODExMjkwMDAwMDBaFw0yMTAyMjYyMzU5NTlaMIIBXjERMA8GA1UE\n" + - "BRMIMDQwNTg2OTAxEzARBgsrBgEEAYI3PAIBAxMCR0IxHTAbBgNVBA8TFFByaXZh\n" + - "dGUgT3JnYW5pemF0aW9uMQswCQYDVQQGEwJHQjEPMA0GA1UEERMGTTUgM0VRMRsw\n" + - "GQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxFjAU\n" + - "BgNVBAkTDVRyYWZmb3JkIFJvYWQxFjAUBgNVBAkTDUV4Y2hhbmdlIFF1YXkxJTAj\n" + - "BgNVBAkTHDNyZCBGbG9vciwgMjYgT2ZmaWNlIFZpbGxhZ2UxGDAWBgNVBAoTD1Nl\n" + - "Y3RpZ28gTGltaXRlZDEaMBgGA1UECxMRQ09NT0RPIEVWIFNHQyBTU0wxOzA5BgNV\n" + - "BAMTMnVzZXJ0cnVzdGVjY2NlcnRpZmljYXRpb25hdXRob3JpdHktZXYuY29tb2Rv\n" + - "Y2EuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELTJfEd92Wlg+h/AVtPsM\n" + - "mwX9Puvi+WGCv3sgFRpur8Iy2kGVpXHRQTCn2j9aky4tFQGm7OG2klJA/MEeevKV\n" + - "aaOCA48wggOLMB8GA1UdIwQYMBaAFCqcWvlOoTDaQEsr6Uvx9ZzcAvkuMB0GA1Ud\n" + - "DgQWBBSzrWHzmiHwx2Rrm7SjRC0UegNrKzAOBgNVHQ8BAf8EBAMCBYAwDAYDVR0T\n" + - "AQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwUAYDVR0gBEkw\n" + - "RzA8BgwrBgEEAbIxAQIBBQEwLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9jcHMudHJ1\n" + - "c3QtcHJvdmlkZXIuY29tMAcGBWeBDAEBMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6\n" + - "Ly9jcmwudHJ1c3QtcHJvdmlkZXIuY29tL1VTRVJUcnVzdEVDQ0V4dGVuZGVkVmFs\n" + - "aWRhdGlvblNlY3VyZVNlcnZlckNBLmNybDCBmAYIKwYBBQUHAQEEgYswgYgwWgYI\n" + - "KwYBBQUHMAKGTmh0dHA6Ly9jcnQudHJ1c3QtcHJvdmlkZXIuY29tL1VTRVJUcnVz\n" + - "dEVDQ0V4dGVuZGVkVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNydDAqBggrBgEF\n" + - "BQcwAYYeaHR0cDovL29jc3AudHJ1c3QtcHJvdmlkZXIuY29tMD0GA1UdEQQ2MDSC\n" + - "MnVzZXJ0cnVzdGVjY2NlcnRpZmljYXRpb25hdXRob3JpdHktZXYuY29tb2RvY2Eu\n" + - "Y29tMIIBfQYKKwYBBAHWeQIEAgSCAW0EggFpAWcAdgDuS723dc5guuFCaR+r4Z5m\n" + - "ow9+X7By2IMAxHuJeqj9ywAAAWdhJc3KAAAEAwBHMEUCIQCPBqO6bw8GSm3HxUf5\n" + - "vRcv74BOEAwZxEr0+PyszJHDbQIgCDXHPzlznU2jbaPdbZ65OQ78mRL5aDDMt1vf\n" + - "/foQr/wAdQBvU3asMfAxGdiZAKRRFf93FRwR2QLBACkGjbIImjfZEwAAAWdhJc3B\n" + - "AAAEAwBGMEQCICIvBLk08NTaEWtKdH8xl2VjjYUo+yQmtdqwMiVMjEB8AiAc50at\n" + - "gCogvZhdlIlGAqg5oND0K74+iglilBVvuTcIoQB2ALvZ37wfinG1k5Qjl6qSe0c4\n" + - "V5UKq1LoGpCWZDaOHtGFAAABZ2ElzcsAAAQDAEcwRQIhALDnAxdhUQvt2HkslYbG\n" + - "J8mYzWbDSSoidZzF4EF4bredAiB3xrSKOKFdTF3KUFHJANqT0c6Xxmo5dVUtovwM\n" + - "QMb1vTAKBggqhkjOPQQDAgNIADBFAiEA2ZwNj/BD8n2yR5BMBQvw7utv9XWrJvKQ\n" + - "11EPtBSCEhUCIBcyI0yl5dRff6+4x8IeCrLiAOYsfzM7Y/a5uRKFnbYz\n" + - "-----END CERTIFICATE-----"; - public void runTest(ValidatePathWithParams pathValidator) throws Exception { // Validate valid - pathValidator.validate(new String[]{VALID, INT_VALID}, + pathValidator.validate(new String[]{VALID, INT}, ValidatePathWithParams.Status.GOOD, null, System.out); // Validate Revoked - pathValidator.validate(new String[]{REVOKED, INT_REVOKED}, + pathValidator.validate(new String[]{REVOKED, INT}, ValidatePathWithParams.Status.REVOKED, - "Wed Oct 02 06:06:50 PDT 2019", System.out); + "Tue Mar 02 02:59:25 PST 2021", System.out); } } diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/QuoVadisCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/QuoVadisCA.java index 94a317b2a4a..d47cbc49985 100644 --- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/QuoVadisCA.java +++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/QuoVadisCA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -33,7 +33,7 @@ /* * Obtain TLS test artifacts for QuoVadis CAs from: * - * https://www.quovadisglobal.com/QVRepository/TestCertificates.aspx + * https://www.quovadisglobal.com/download-roots-crl/ * */ public class QuoVadisCA { @@ -57,120 +57,127 @@ public static void main(String[] args) throws Exception { class RootCA1G3 { - // Owner: CN=QuoVadis QVRCA1G3 SSL ICA, O=QuoVadis Limited, C=BM + // Owner: CN=DigiCert QuoVadis TLS ICA QV Root CA 1 G3, O="DigiCert, Inc", C=US + // Issuer: CN=QuoVadis Root CA 1 G3, O=QuoVadis Limited, C=BM + // Serial number: 2837d5c3c2b57294becf99afe8bbdcd1bb0b20f1 + // Valid from: Wed Jan 06 12:50:51 PST 2021 until: Sat Jan 04 12:50:51 PST 2031 private static final String INT = "-----BEGIN CERTIFICATE-----\n" + - "MIIGszCCBJugAwIBAgIUdJ4w/GwP08WekbUIXvYTsQrO+a8wDQYJKoZIhvcNAQEL\n" + + "MIIFgDCCA2igAwIBAgIUKDfVw8K1cpS+z5mv6Lvc0bsLIPEwDQYJKoZIhvcNAQEL\n" + "BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc\n" + - "BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xNzA0MTkxNTAzMzZaFw0y\n" + - "NzA0MTkxNTAzMzZaMEwxCzAJBgNVBAYTAkJNMRkwFwYDVQQKDBBRdW9WYWRpcyBM\n" + - "aW1pdGVkMSIwIAYDVQQDDBlRdW9WYWRpcyBRVlJDQTFHMyBTU0wgSUNBMIICIjAN\n" + - "BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqVn6XxE+YKKifggi6EPcx7mOOrhA\n" + - "HVxHFsFV/OR/dtQlx2oOTAGPpa8o3ZPVubtNH5QiiMBBiPDW1KqBaU+rmgUeGCj0\n" + - "hWKbdNGRQ5h3rV+4Vhs45BYxQcUzGTZ+oobao8gNo1LuhPIhOQComGOjZtUP0+qQ\n" + - "nXsWJn5004TvCzu7mmt3aTlMeyjSbpoXa3ojwU2BvUzJwcLg0BD49kNXZsM0JLbY\n" + - "QgfEfluWFkb5QzjnE45sBni4LJNfSodhNB+mL/VmETO+0m/A1H6in1rG1n4Ao2G6\n" + - "KYgtk9rXWfF3g7JqwuZUULfI0467h14oG1PzqVcLgZ1B+wrdyiBJJSpRmhf00xSB\n" + - "WM/p93s2xkyQZ2Uh0b0tP90S6spwwpL8PSW3J8x46LaZDEVON/Gm9H891ZgwHLaf\n" + - "3idGX93XHFafve8CrJFMhK2AZElwYaz2H6iJuPftyhR3oQIgLst8l+/2LoqDRyaI\n" + - "6c+tVnk8LcvUgDEPuA70aNthQQ6PWA7iuI2Oies6GEPm7gKVNxIrg6rp2T9RghLm\n" + - "vLnf6Gyn1ONLI7Ib3EyzjE8CJIAtor5KZcs8xm8iPNsDQza+1ugx8D8Zsla64vVw\n" + - "w2W2qNH4orutsAQKRImtbDkEnMb3nGDe0ZPohVyw3Fy+b9g6MX7wQzFjIx3UkzZG\n" + - "QQqGdIh940Qq3wUCAwEAAaOCAY8wggGLMBIGA1UdEwEB/wQIMAYBAf8CAQAwSQYD\n" + - "VR0gBEIwQDA+BgRVHSAAMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cucXVvdmFk\n" + - "aXNnbG9iYWwuY29tL3JlcG9zaXRvcnkwdAYIKwYBBQUHAQEEaDBmMCoGCCsGAQUF\n" + - "BzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wOAYIKwYBBQUHMAKG\n" + - "LGh0dHA6Ly90cnVzdC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2ExZzMuY3J0MA4G\n" + - "A1UdDwEB/wQEAwIBBjAnBgNVHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsG\n" + - "AQUFBwMJMB8GA1UdIwQYMBaAFKOX1vNeohDhq0WfPBdkPO4BcJzMMDsGA1UdHwQ0\n" + - "MDIwMKAuoCyGKmh0dHA6Ly9jcmwucXVvdmFkaXNnbG9iYWwuY29tL3F2cmNhMWcz\n" + - "LmNybDAdBgNVHQ4EFgQUIAYNQkuk2dMocCdjvExpRiGBHTwwDQYJKoZIhvcNAQEL\n" + - "BQADggIBAEu/Bea66BZPfGNE4Np+PCRrTag/U7EBK/Yhjmf3mHtFMZzZ94QLH1km\n" + - "4iJ5dPKTR/+1iYYNHfO7fY2Lj/Tg/E+q2SEfA0n6Y/lYHAlbmnaYGGdtfTOjaQgL\n" + - "0Bf0TmLPyc/gf9uKHe230vIaN4QcodBnCmCJOAk/lvIl7b7gRNPN/HuJNQlBohNx\n" + - "ih9VAtLXJ6xO6Xfs5o8ZkZkHb2nG/M1yxySEyU3mqQ5PTgy8kg59szWr2ufT8PvL\n" + - "JuyGNQmT/PHcLp2zaCC0+5Ra65umjhG8IW2haXu8g8aRAgr9ZRPrcgg2npLBA0Qf\n" + - "MTEJPPptGx2GQgE+lMdn5Gff82d3Y35pDmxNTA7hy+4CnWKfmoey7ll8kwGxC+W1\n" + - "OUVgzfdXcpsm+HP2z4E/zw6uB0cAFgMJbxgnm6ZW9+R2yEbD6EOpqR8HqCvhVkkv\n" + - "CdQBNkk432pKD3+L7o6vkwONFOFWVpbXHIxDf9ys8Jr4B8qYWDUnR6jz/HG9aWPV\n" + - "k4vBYYWuahANZCfCKH2B9SqCdK6DjwKihYmallClwsUQnSwW8H7xqmLtAHX0ek7z\n" + - "1Ipj/BNS6c52cPxeAoFbUcVt6+M8xURIJ5qrobTYVaJ8AtfW+3Ml2oqT/EiItXOk\n" + - "W1319hZuAGD5qaG3dg9aLYUqpD948xJVhYVxwIIwvL4G9ZEVyYmE\n" + + "BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0yMTAxMDYyMDUwNTFaFw0z\n" + + "MTAxMDQyMDUwNTFaMFkxCzAJBgNVBAYTAlVTMRYwFAYDVQQKDA1EaWdpQ2VydCwg\n" + + "SW5jMTIwMAYDVQQDDClEaWdpQ2VydCBRdW9WYWRpcyBUTFMgSUNBIFFWIFJvb3Qg\n" + + "Q0EgMSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALMrbkb9kz/4\n" + + "y00r7tfK+uDRomMNd5iCDVMWOvSx1VygKoBn3aavw7gq9Vfb2fIMIWkWG0GMxWbG\n" + + "cx3wDHLWemd7yl9MxRUTGXkvH6/dNEavAQhUTL9TSf/N2e8f7q2dRDNYT7lXi/vR\n" + + "fTBiYlY7BLNha8C3sPHsKduaJN32cjdjVFH51rFDRdhUXlo2hhOjgB6bqoqs75A3\n" + + "Y3w88AdbMkapT63oGsCDO6N/uX2Mo9GSWREvlxHiXSMFf5qFw41vn5QIa5ADL1MP\n" + + "CzlLmJSHXE138H1+cG5IutD7tIieKjo/t+66PGMo8xicj3yUd8rHEmBqClG4Ty3d\n" + + "fF+bETFjLIUCAwEAAaOCAU8wggFLMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0j\n" + + "BBgwFoAUo5fW816iEOGrRZ88F2Q87gFwnMwwdAYIKwYBBQUHAQEEaDBmMDgGCCsG\n" + + "AQUFBzAChixodHRwOi8vdHJ1c3QucXVvdmFkaXNnbG9iYWwuY29tL3F2cmNhMWcz\n" + + "LmNydDAqBggrBgEFBQcwAYYeaHR0cDovL29jc3AucXVvdmFkaXNnbG9iYWwuY29t\n" + + "MBMGA1UdIAQMMAowCAYGZ4EMAQICMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEF\n" + + "BQcDATA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8vY3JsLnF1b3ZhZGlzZ2xvYmFs\n" + + "LmNvbS9xdnJjYTFnMy5jcmwwHQYDVR0OBBYEFJkRfemwrS1iWnDTPI2HIK3a2i5B\n" + + "MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAb6tTptzzi4ssb+jA\n" + + "n2O2vAjAo7ydlfN9v+QH0ZuGHlUc9bm8dpNpBo9yt6fWHIprGLJjVOF7HwVDQcJD\n" + + "DhX4638Q7ETDrbTVQ4/edX6Yesq6C1G8Pza1LwStXD/jCQHFvWbPud86V0ikS4rS\n" + + "qlmu3fzUrGZ2/Q+n5jrnRqM5IS8TXYcnzLD3azH1+aZjkwQt9HP4IuvAe/Bg9aWE\n" + + "XeDmksbg0SqQInrWn+BVYtD+hCZNz8K0GnKKpx3Q9VxzRv+BMbO5e9iqK1Hcj5Wv\n" + + "ZXvU45j2r5y9WML4fc8CvphzbF6ezr1e51i+yabNmfld33gRX48V5oNk16wX32ed\n" + + "kQ83sKNomQm1dXURWK8aSDcZFAvJQ8vKTLIE9wiQmtjfSGoJzQhKLaN+egrp4L9y\n" + + "fjpFIeK4zgAH39P4s4kaPWTdfXe2n6P5o7Xolp4R22SVkI76d8d+5Iv7Rtqd+mqI\n" + + "y1hkwyTBbOBLtyF7yMtJQewkkZ0MWxkPvWg193RbYVRx8w1EycnxMgNwy2sJw7MR\n" + + "XM6Mihkw910BkvlbsFUXw4uSvRkkRWSBWVrkM5hvZGtbIJkqrdnj55RSk4DLOOT/\n" + + "LUyji/KpgD7YCi7emFA4tH6OpkNrjUJ3gdRnD4GwQj/87tYeoQWZ6uCl0MHDUCmw\n" + + "73bpxSkjPrYbmKo9mGEAMhW1ZxY=\n" + "-----END CERTIFICATE-----"; - // Owner: CN=qvsslrca1g3-ssl-v.quovadisglobal.com, O=QuoVadis Limited, L=Hamilton, - // ST=Pembroke, C=BM + // Owner: CN=quovadis-root-ca-1-g3.chain-demos.digicert.com, O="DigiCert, Inc.", L=Lehi, ST=Utah, C=US + // Issuer: CN=DigiCert QuoVadis TLS ICA QV Root CA 1 G3, O="DigiCert, Inc", C=US + // Serial number: 2b9bf892d8abbde06c26d764263bfa8 + // Valid from: Tue Jan 19 16:00:00 PST 2021 until: Sun Feb 20 15:59:59 PST 2022 private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + - "MIIGJzCCBA+gAwIBAgIUGCzNOZhcLiPYbOjRFAp5n04dPNowDQYJKoZIhvcNAQEL\n" + - "BQAwTDELMAkGA1UEBhMCQk0xGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxIjAg\n" + - "BgNVBAMMGVF1b1ZhZGlzIFFWUkNBMUczIFNTTCBJQ0EwHhcNMTcwNTAyMTcwMDA4\n" + - "WhcNMjAwNTAyMTcxMDAwWjB9MQswCQYDVQQGEwJCTTERMA8GA1UECAwIUGVtYnJv\n" + - "a2UxETAPBgNVBAcMCEhhbWlsdG9uMRkwFwYDVQQKDBBRdW9WYWRpcyBMaW1pdGVk\n" + - "MS0wKwYDVQQDDCRxdnNzbHJjYTFnMy1zc2wtdi5xdW92YWRpc2dsb2JhbC5jb20w\n" + - "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCLgSX0nduUm87/qmfTdofL\n" + - "5P/Xtrly8Z9GaiLPLu1syNqT/Sri4ngYQGXXwF8h6gnHgEb6gDI2p3Q3gb75NthO\n" + - "WfWMD6FqafV47pUeNml6JvNbsYAPc8qGxMPtgQ8HhQuU+Trykx3onq/Se5HRYlve\n" + - "7MMJixiYQKYwwThHh9G1uGYPMQJT2TQfueIAu0MT6Ljc2YB6noXpzTzU63dvmC1Q\n" + - "8TMmFoJYL276lQ3p3vRKEW1nVmjeVoqvK/3Vpg440KbQL5D7Gj/pQPL4d7ljyS/I\n" + - "UN3q7QPS7BojsvF90u0YpvYEuBXsxdFnqivj5owSuSENG4nqcZUO8/nY+4b+NbJd\n" + - "AgMBAAGjggHOMIIByjB6BggrBgEFBQcBAQRuMGwwPgYIKwYBBQUHMAKGMmh0dHA6\n" + - "Ly90cnVzdC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2ExZzNzc2xpY2EuY3J0MCoG\n" + - "CCsGAQUFBzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wHQYDVR0O\n" + - "BBYEFIDk6mMLdh49CFbFiUDnjZhWatYzMB8GA1UdIwQYMBaAFCAGDUJLpNnTKHAn\n" + - "Y7xMaUYhgR08MGkGA1UdIARiMGAwRgYMKwYBBAG+WAABZAEBMDYwNAYIKwYBBQUH\n" + - "AgEWKGh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL3JlcG9zaXRvcnkwCAYG\n" + - "Z4EMAQICMAwGCisGAQQBvlgBhFgwQQYDVR0fBDowODA2oDSgMoYwaHR0cDovL2Ny\n" + - "bC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2ExZzNzc2xpY2EuY3JsMA4GA1UdDwEB\n" + - "/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwLwYDVR0RBCgw\n" + - "JoIkcXZzc2xyY2ExZzMtc3NsLXYucXVvdmFkaXNnbG9iYWwuY29tMA0GCSqGSIb3\n" + - "DQEBCwUAA4ICAQB2XiV2msE7M8Qp0YIcihD86T8U91PJH7Pb3F/3+8fyX08/oKDo\n" + - "s80sE50tiI5lw+tSFQZuvpOFefejEh1uAwu1slZOlvICHOAJNG1EXPa8pEmDU2i5\n" + - "nd5r7rM757/+cgsPLvwegVuIL4vIYhnoKzPiXpkl8FkNrhRjqeUIAXf2sLjbbbng\n" + - "oYRCypkSovpijPf7Cid19wKh/ipp8DxCNnGMit55mnx7eFNAWpb9cFljd+WaABCA\n" + - "IcvcZhZrLKYrbUErdQzzu0sa3IlEC5QBgz+IvT62RHT+vWRiv0LYhkHVLsDQUHpJ\n" + - "uTa1xi0qvBVGIP1jxIQv5W3hGPLYt7B/8A8v+xOn4m1VWfGIa4V3RGpbBMw19DH+\n" + - "JvLjg8coDWKhqZ150V31Ve8wczSjT+KZHFRWTb4TZt8GSXa56kJV5xadPW8A3EKV\n" + - "kulcspO1njb73ImrwTPIOLnDAsMDrAO41FEob87bdZacpg+kHjiAP9BzpgSSX1x5\n" + - "b/qy2uRtsf3ZlOb1J6fCqb8lRwSU7uGUStUx4tVMpjR5LQfNVroiDEthN5BE6sye\n" + - "zVRq8vyGvG40jSMBZF1KyW4GW6JlgM1THr1egNFhNkHBs7pSTHJp1Ea+QJjB1uVe\n" + - "A8kBL0iUlI5PPOqe5KdEXcFy3L+gRh34gyckC4vrLzfNLjKHQvdRHYnQBA==\n" + + "MIIGhjCCBW6gAwIBAgIQArm/iS2Ku94Gwm12QmO/qDANBgkqhkiG9w0BAQsFADBZ\n" + + "MQswCQYDVQQGEwJVUzEWMBQGA1UECgwNRGlnaUNlcnQsIEluYzEyMDAGA1UEAwwp\n" + + "RGlnaUNlcnQgUXVvVmFkaXMgVExTIElDQSBRViBSb290IENBIDEgRzMwHhcNMjEw\n" + + "MTIwMDAwMDAwWhcNMjIwMjIwMjM1OTU5WjB9MQswCQYDVQQGEwJVUzENMAsGA1UE\n" + + "CBMEVXRhaDENMAsGA1UEBxMETGVoaTEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4x\n" + + "NzA1BgNVBAMTLnF1b3ZhZGlzLXJvb3QtY2EtMS1nMy5jaGFpbi1kZW1vcy5kaWdp\n" + + "Y2VydC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUqAk3cOpq\n" + + "E+70B1WMI5R3QEqbrF4TE9jpXFIy2HQV60HSyxrsh2xDpU/zD0BF2mwOGZvQKc1F\n" + + "JcVpwWXJ4vjS/lqDvZBNlzDejr4sQbzZVGFkqP6wu+KrAa+Eu7Lvayke3vi99Ba3\n" + + "MmcauuHQsLwh/A+nLzUZIL56HKREDA6YmvF2Bkz6La+f3y4BhiFcQLWQOSr4LgvD\n" + + "7qqdtd550sT4agIh6G1C3CDgUU2OYX8d70YOokO+msZXppD2le5HJDAUwrEKXB/L\n" + + "3+jxA2wxgxmGzWigkRFl7UlsuLezUZKIHj8YoQu/0LGLZZUcW0OEHj5sspifmQJ7\n" + + "DccQrGWyqU6XAgMBAAGjggMkMIIDIDAfBgNVHSMEGDAWgBSZEX3psK0tYlpw0zyN\n" + + "hyCt2touQTAdBgNVHQ4EFgQUDBReNH49ishzOagWgVaxd7nSyrgwOQYDVR0RBDIw\n" + + "MIIucXVvdmFkaXMtcm9vdC1jYS0xLWczLmNoYWluLWRlbW9zLmRpZ2ljZXJ0LmNv\n" + + "bTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC\n" + + "MIGXBgNVHR8EgY8wgYwwRKBCoECGPmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E\n" + + "aWdpQ2VydFF1b1ZhZGlzVExTSUNBUVZSb290Q0ExRzMuY3JsMESgQqBAhj5odHRw\n" + + "Oi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRRdW9WYWRpc1RMU0lDQVFWUm9v\n" + + "dENBMUczLmNybDA+BgNVHSAENzA1MDMGBmeBDAECAjApMCcGCCsGAQUFBwIBFhto\n" + + "dHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgYMGCCsGAQUFBwEBBHcwdTAkBggr\n" + + "BgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME0GCCsGAQUFBzAChkFo\n" + + "dHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRRdW9WYWRpc1RMU0lD\n" + + "QVFWUm9vdENBMUczLmNydDAMBgNVHRMBAf8EAjAAMIIBBAYKKwYBBAHWeQIEAgSB\n" + + "9QSB8gDwAHUAKXm+8J45OSHwVnOfY6V35b5XfZxgCvj5TV0mXCVdx4QAAAF3IHgp\n" + + "NQAABAMARjBEAiBNOisRzreFHgpQYJmdzN8pKAGcerQHCWfeWeWyDDD8hQIgP2sh\n" + + "8KGW4sOt/BqEUNhGdD+ZAbv2+xrT57aSRONrG/UAdwAiRUUHWVUkVpY/oS/x922G\n" + + "4CMmY63AS39dxoNcbuIPAgAAAXcgeCmLAAAEAwBIMEYCIQCKVxPY+JbJX4IMcbVc\n" + + "HypoqNyozayPjzuHPZXsr5sZfAIhAIdS8wHmUZz6w5Frqa/CTUSugoNgx9H0K9dN\n" + + "Cl6gsvdcMA0GCSqGSIb3DQEBCwUAA4IBAQB35ONSVAMAhFpTwQl6HEFEmhh++JaF\n" + + "3WLMUODAa79N/GXe0JMvPuTbLsB/H1WXP/27D9ImvWlqLQU3EgqRp0fTdWCnnP4q\n" + + "8FKsKslnKPoiqNyTjpKHWk+gugFAyAAUXEFP4QYSMgye7kBNQZoX9MX4LhPBtqTa\n" + + "cPXLprb/gZMrNbbf9FdOGQXQgpFoaGnvyGw2oGU1Spb+Tx1QbK8NUWCdc8KNo1WB\n" + + "XH37EY8XJJxdjjoocLlFxRBUothYEUk+HdE5MGNqF3egtFKVvDk2OC8redCQ6dDC\n" + + "MKkGc7Avhn43gkRpzuush9Ph79aT1lf4Mm4Rs0FSYm8e62bQspH8UTdh\n" + "-----END CERTIFICATE-----"; - // Owner: CN=qvsslrca1g3-ssl-r.quovadisglobal.com, O=QuoVadis Limited, L=Hamilton, - // ST=Pembroke, C=BM + // Owner: CN=quovadis-root-ca-1-g3-revoked.chain-demos.digicert.com, O="DigiCert, Inc.", L=Lehi, ST=Utah, C=US + // Issuer: CN=DigiCert QuoVadis TLS ICA QV Root CA 1 G3, O="DigiCert, Inc", C=US + // Serial number: 8fb833dd0472302df1ddc134d36840d + // Valid from: Tue Jan 19 16:00:00 PST 2021 until: Sun Feb 20 15:59:59 PST 2022 private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + - "MIIGJzCCBA+gAwIBAgIUGeTgdhQ6UoMWie3kBh4IGxDH4AQwDQYJKoZIhvcNAQEL\n" + - "BQAwTDELMAkGA1UEBhMCQk0xGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxIjAg\n" + - "BgNVBAMMGVF1b1ZhZGlzIFFWUkNBMUczIFNTTCBJQ0EwHhcNMTcwNTAyMTY1OTQ4\n" + - "WhcNMjAwNTAyMTcwOTAwWjB9MQswCQYDVQQGEwJCTTERMA8GA1UECAwIUGVtYnJv\n" + - "a2UxETAPBgNVBAcMCEhhbWlsdG9uMRkwFwYDVQQKDBBRdW9WYWRpcyBMaW1pdGVk\n" + - "MS0wKwYDVQQDDCRxdnNzbHJjYTFnMy1zc2wtci5xdW92YWRpc2dsb2JhbC5jb20w\n" + - "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDR/0pcsSc4mmqVkzCO5h1m\n" + - "BlZ0uxmakNTNnWqeOXmMgl2KBni6MzIdxBkPmII5TI3nc+DXrWrtBCJKRtww3mbF\n" + - "ZoBhrscODv3OjfVqsVfhUPjqLwUEE9X/8IlxFpcsKRH1mC7weLg56kfnHuK2WHPQ\n" + - "dbnVgzzjk8mSi8HL3szIiojGC0ZwilrV/LCXBqETC3aMe8PtGnMW96TcvqQEdYFa\n" + - "4MEXuYnUwXB0WoKAJkHw/MMc0RytrICtlpaMQ7ZnloW8LvoQ1wIM7nWwCr+dieh6\n" + - "lZCWRN/Au+h6qdyDUDUPQFoGpp7AfE2OJmeCY30gp4GdAKtGpTG++gfJrtkc8FnZ\n" + - "AgMBAAGjggHOMIIByjB6BggrBgEFBQcBAQRuMGwwPgYIKwYBBQUHMAKGMmh0dHA6\n" + - "Ly90cnVzdC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2ExZzNzc2xpY2EuY3J0MCoG\n" + - "CCsGAQUFBzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wHQYDVR0O\n" + - "BBYEFGffDkPGAcip01jKnnvEt1jpKNRnMB8GA1UdIwQYMBaAFCAGDUJLpNnTKHAn\n" + - "Y7xMaUYhgR08MGkGA1UdIARiMGAwRgYMKwYBBAG+WAABZAEBMDYwNAYIKwYBBQUH\n" + - "AgEWKGh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL3JlcG9zaXRvcnkwCAYG\n" + - "Z4EMAQICMAwGCisGAQQBvlgBhFgwQQYDVR0fBDowODA2oDSgMoYwaHR0cDovL2Ny\n" + - "bC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2ExZzNzc2xpY2EuY3JsMA4GA1UdDwEB\n" + - "/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwLwYDVR0RBCgw\n" + - "JoIkcXZzc2xyY2ExZzMtc3NsLXIucXVvdmFkaXNnbG9iYWwuY29tMA0GCSqGSIb3\n" + - "DQEBCwUAA4ICAQBI/zlzisJLwBNaVZkQDMh1gYY8uRUad6Jn7yBFQbJ796VVlD1A\n" + - "yxJD+y9cpwzXvwKau8jIMi96OXo6xtsTDxKY9PzW8DkrlrxqdzLI7s5M30tGu8Sk\n" + - "WitIWPC3FU0oZqa9jBPkfujllR5FNuYikMOFIi2+/3haEK/6kviLpe5WyK4yJ3a9\n" + - "7dLq0If4vhNbKsuW1ROnq5CpPy+iIuZy3CWtq8WJSHDyZzhzrW48QHmTkoAU5lAb\n" + - "3KLMBo/gtUTjABVauADeVZVN6GgLflSIdz1P/aMJQ88q/88w+6KYJlBtg3mWSRHc\n" + - "Vh+BkIiKmfTG+N9SJ5jv7VKt8PjcKgqCzOHUslLHgUDFhJ5gdYIixD24ikRHYriH\n" + - "UCO3ltEppIUm/xgins75F6V9YBxHA1Ks/S5MfMnI6N+fFurIwIsas5w6gTPNwbBC\n" + - "z6G1fu6schk73uvfK4W6PiuMTURsQ1M746K2BlV+FIclTk8jYHe+EyLFgIsgVigo\n" + - "JJs0DsIp0RoGvw+bxxyA9CHeFFi+MlAVEj2+qJnwrD3ZqNFFw87/HDIWW+Ue8ERs\n" + - "HfPDZvEQZ1BHGzD/H04F0+HwwfItxvgiQVC2L/yjmh7St311OLiK8RM3Ur0X15bZ\n" + - "3g4c1gsHx9Gmlk3l8YIOk0yxvLaF03YsNbrfykXHuJM9Phy8Ya3nTpsqtw==\n" + + "MIIG1TCCBb2gAwIBAgIQCPuDPdBHIwLfHdwTTTaEDTANBgkqhkiG9w0BAQsFADBZ\n" + + "MQswCQYDVQQGEwJVUzEWMBQGA1UECgwNRGlnaUNlcnQsIEluYzEyMDAGA1UEAwwp\n" + + "RGlnaUNlcnQgUXVvVmFkaXMgVExTIElDQSBRViBSb290IENBIDEgRzMwHhcNMjEw\n" + + "MTIwMDAwMDAwWhcNMjIwMjIwMjM1OTU5WjCBhTELMAkGA1UEBhMCVVMxDTALBgNV\n" + + "BAgTBFV0YWgxDTALBgNVBAcTBExlaGkxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu\n" + + "MT8wPQYDVQQDEzZxdW92YWRpcy1yb290LWNhLTEtZzMtcmV2b2tlZC5jaGFpbi1k\n" + + "ZW1vcy5kaWdpY2VydC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n" + + "AQC/YHOKNPYW2a/aji68VN4EYwz5ANxRuCSHXOe6mg8pYaelrnky3hmNT3Ro86wc\n" + + "3UaXE07+fVGjXbbe4eRF5zj1pWsMe81n7NySoLud5C9CU/3okywv6SEPc/RiFKJk\n" + + "ic/BpRTE2pMtFfGsqWALjyDhM+W7SvM5eAXqcVVnqHgO5oToe2Cd0IqhgTgOUDdm\n" + + "+JuY/kY8gRmFyzfs4Oqe8nkgrdsvsyvRtQt1ldc9XKb+C/gnl8ZMiuLpuKWqezce\n" + + "2ED0SW4bVDbaDIhf97CNFeuMHHyZzI7Z0DH29WDcACOVBqVhGJl56T89COM3ISle\n" + + "WpYCOUgyzlPVODisfq/1zgepAgMBAAGjggNqMIIDZjAfBgNVHSMEGDAWgBSZEX3p\n" + + "sK0tYlpw0zyNhyCt2touQTAdBgNVHQ4EFgQUdZf0H3+QjsIMtfpwZUf3YNaVBQ0w\n" + + "fQYDVR0RBHYwdII2cXVvdmFkaXMtcm9vdC1jYS0xLWczLXJldm9rZWQuY2hhaW4t\n" + + "ZGVtb3MuZGlnaWNlcnQuY29tgjp3d3cucXVvdmFkaXMtcm9vdC1jYS0xLWczLXJl\n" + + "dm9rZWQuY2hhaW4tZGVtb3MuZGlnaWNlcnQuY29tMA4GA1UdDwEB/wQEAwIFoDAd\n" + + "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwgZcGA1UdHwSBjzCBjDBEoEKg\n" + + "QIY+aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0UXVvVmFkaXNUTFNJ\n" + + "Q0FRVlJvb3RDQTFHMy5jcmwwRKBCoECGPmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv\n" + + "bS9EaWdpQ2VydFF1b1ZhZGlzVExTSUNBUVZSb290Q0ExRzMuY3JsMD4GA1UdIAQ3\n" + + "MDUwMwYGZ4EMAQICMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQu\n" + + "Y29tL0NQUzCBgwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz\n" + + "cC5kaWdpY2VydC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9jYWNlcnRzLmRpZ2lj\n" + + "ZXJ0LmNvbS9EaWdpQ2VydFF1b1ZhZGlzVExTSUNBUVZSb290Q0ExRzMuY3J0MAwG\n" + + "A1UdEwEB/wQCMAAwggEGBgorBgEEAdZ5AgQCBIH3BIH0APIAdwApeb7wnjk5IfBW\n" + + "c59jpXflvld9nGAK+PlNXSZcJV3HhAAAAXcgeVnsAAAEAwBIMEYCIQCBIKm+1buq\n" + + "Ws6nDYt1OMGxHa7yaxwQu5yaWCq6wk3kXQIhAL0ImrZZWp0Uq2i3QhDVjAfsP9lF\n" + + "LRf2f0qbqJUXzTV7AHcAIkVFB1lVJFaWP6Ev8fdthuAjJmOtwEt/XcaDXG7iDwIA\n" + + "AAF3IHlaMwAABAMASDBGAiEAm+RVoIBHAiMN+m/fuo65CLCwTRa/YVrP8wjUT4pM\n" + + "5toCIQDhV6pbmxbwGl9rM56ypsKZLJeB4LeCWqJmb7yf61E9WzANBgkqhkiG9w0B\n" + + "AQsFAAOCAQEAh82J/F2rBZ6GUFmOdIS8mhzO/ItkpAX+bta5lyPasCgP3JEmHONr\n" + + "HBX1UIvKYo7/McgFBt1V90ncQXfuutIyh0hPXSbTqK/b7XCVarh9J0ZXp8gLstQ5\n" + + "39DiuiS+qWBSc8C14VIOjeTblTBM6hjvkdnYhTZt2ip3aKYu8sHyC+3DpAYuD2og\n" + + "Lzs8Q7wvPwvBE2HMsr6c8dFjC9S8HZvrfJTwuh/7QhafueuwPEfr6a2/TExF/3B1\n" + + "QXxgYPg7pQ2gPUqucO47FcEhr5GHzTwNoGAropkFj3g0byEt0i+EwLMjdAlDABzP\n" + + "CFww1aRfNklbdRBZ/rr7QzmGtn39JzZKMQ==\n" + "-----END CERTIFICATE-----"; public void runTest(ValidatePathWithParams pathValidator) @@ -182,148 +189,138 @@ public void runTest(ValidatePathWithParams pathValidator) // Validate Revoked pathValidator.validate(new String[]{REVOKED, INT}, ValidatePathWithParams.Status.REVOKED, - "Tue May 02 10:15:37 PDT 2017", System.out); + "Wed Jan 20 07:46:23 PST 2021", System.out); } } class RootCA2G3 { - // Owner: CN=QuoVadis EV SSL ICA G3, O=QuoVadis Limited, C=BM + // Owner: CN=DigiCert QV EV TLS ICA G1, O="DigiCert, Inc.", C=US + // Issuer: CN=QuoVadis Root CA 2 G3, O=QuoVadis Limited, C=BM + // Serial number: 65e9bcd53e791df22dffeb5ecc2bc7a5588d0883 + // Valid from: Mon Mar 16 12:39:42 PDT 2020 until: Thu Mar 14 12:39:42 PDT 2030 private static final String INT = "-----BEGIN CERTIFICATE-----\n" + - "MIIGuDCCBKCgAwIBAgIUUk/B8W400XArhKE/sEK7zHw8kDIwDQYJKoZIhvcNAQEL\n" + + "MIIFbzCCA1egAwIBAgIUZem81T55HfIt/+tezCvHpViNCIMwDQYJKoZIhvcNAQEL\n" + "BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc\n" + - "BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xNjExMzAxNjIxMDFaFw0y\n" + - "NjExMzAxNjIxMDFaMEkxCzAJBgNVBAYTAkJNMRkwFwYDVQQKDBBRdW9WYWRpcyBM\n" + - "aW1pdGVkMR8wHQYDVQQDDBZRdW9WYWRpcyBFViBTU0wgSUNBIEczMIICIjANBgkq\n" + - "hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAonyczmwRSnw5BhWIrfcD19EbE7bYu5dF\n" + - "tD8o/5NtQCW+XdoLX+X9uNTuvnPw9Hv2RdhYrJgeLgF2wZ52XMGknRdB8tQYrknA\n" + - "l/j0N5f8DD82xP2eBkCpIB0UED4zNVwwWcdWvBUgNEdNobz9vQKb7B5LlbXm9kaO\n" + - "uxYgcv8WsNMivSP3mkJShEOh4RZ3ZdBM/vtJyuvUyEPjyiSzfN94tZHx/H194S4D\n" + - "VAPgE7ny3ISzN+Aa3kjyLebP/sPzI1AY0DWx8Yg4STG1j0PJeuTb6Ago2kmx4Kqn\n" + - "4q4kSPL8CgITYHiKaJx6Dt8Q90ieJ7ywG4Mb/YADOIlmoXZ6kXhzGAxyWXFgolLb\n" + - "4UToIh6U66v3Iyq+gXyCeMXGT4nUgs3+PduzOei9668jeKQaoU5d7LjJUL+ZH2+Y\n" + - "1bPmMAypHFLZryziOzC5kRo4TamgAf3LHHr2C7yIUuo+avlv3cic3NUodcfMi7Ax\n" + - "OQFLb32CtDoDeVb5v3x88R0tIEJTizk6M1B/0pGtZiFfXtrNVfHmEYvY2rOLbgWK\n" + - "M831ykqZSYHUpiqgnaNJb4Qs8WcxqUw1xki64WwiPclUSn5XgGMIwxSDGjUIJHKR\n" + - "rzgQ9lneHOHVb8pXHNFkdBDHTb1KNmDOyLsg3q0LJP6P3nzT/aWDAj3glpJvGQ5d\n" + - "kjAbjx+NFk8CAwEAAaOCAZcwggGTMBIGA1UdEwEB/wQIMAYBAf8CAQAwUQYDVR0g\n" + - "BEowSDBGBgwrBgEEAb5YAAJkAQIwNjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5x\n" + - "dW92YWRpc2dsb2JhbC5jb20vcmVwb3NpdG9yeTB0BggrBgEFBQcBAQRoMGYwKgYI\n" + - "KwYBBQUHMAGGHmh0dHA6Ly9vY3NwLnF1b3ZhZGlzZ2xvYmFsLmNvbTA4BggrBgEF\n" + - "BQcwAoYsaHR0cDovL3RydXN0LnF1b3ZhZGlzZ2xvYmFsLmNvbS9xdnJjYTJnMy5j\n" + - "cnQwDgYDVR0PAQH/BAQDAgEGMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggrBgEFBQcD\n" + - "AgYIKwYBBQUHAwkwHwYDVR0jBBgwFoAU7edvdlq/YOxJW8ald7tyFnGbxD0wOwYD\n" + - "VR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5xdW92YWRpc2dsb2JhbC5jb20vcXZy\n" + - "Y2EyZzMuY3JsMB0GA1UdDgQWBBTlhFTQkEmfOLryyeEqCMVOn6BIPzANBgkqhkiG\n" + - "9w0BAQsFAAOCAgEAY/EHWbpNwCgGVQ1B7cIn530n6Rnht8ryN6E4Sis2GG09801s\n" + - "eCVMoGUB1uBCWm7uqQqydjTbjLhuub7hTjSJ1J30SOK1CZbk+c1VP9DcjY46hycy\n" + - "tUKQ2WbgkaY+l/tZNDKu0djc2hA5apljQCmiIzckbcHr6yRnFK7ZPjSPCAUKm20D\n" + - "vORQ7hsIaomsIlqXm5BPssMcxjI48Ezgv/s8ynASI8S5P2vOnBo08sJBM/a0Kbuw\n" + - "351SubTzjxG+o1SHe6lAzvIQMuSwxUca8YkiB19w5YZt+Ss2JXNc6F2jZwpr0hto\n" + - "IXe+N9/x0CohYRRa+IivRGgdDQc3w2P+pffNQP/qdPuUYyMkYWiuHH/YvwXyuDxv\n" + - "yGQfvKmHr1uq/qiqbK1bDSUoEq4Su8yX8YoF9TuxYraIpp9iErO5rarDO6GTNVHh\n" + - "1OXAJ/ePhOWzqo3flLTlAdTcs3Mq97kKW8XWCnu/cjJJglf2zVfLAlv95p56B9If\n" + - "0pXbN74qDkYEC8TdLOwryhcv8yyimh90/AvW9LpB7swkWnUUYNTep/XMX/RLpHLn\n" + - "JOVtnRpn3coVfSR/0rz0XKVXeZGnKztGdIMQhWMTxvZ1UpmRAH2Ab2QnVo1fkPVy\n" + - "qNSJces5Y/VKpIvLBk5Jj55fvK8ME/9ASa+LtLrIms8iYHl75cupuYZZlg8=\n" + + "BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0yMDAzMTYxOTM5NDJaFw0z\n" + + "MDAzMTQxOTM5NDJaMEoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKDA5EaWdpQ2VydCwg\n" + + "SW5jLjEiMCAGA1UEAwwZRGlnaUNlcnQgUVYgRVYgVExTIElDQSBHMTCCASIwDQYJ\n" + + "KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMhwn6I+pGrJsnisnzP7EU5cFN9UT5XF\n" + + "auA13F3jHeUUZmBOcMSOJEhx/e7oeVScTnmKpe7t7uey7lIIC9DWFmP8klbtLBgL\n" + + "0jY4MPlCkVyxUIhZ73EHCPqDCX9bo+rMB6C758/tKZOPcoWRixQypPwoC4cXNOOk\n" + + "ntqFPRxFSZoBdTDNlAmkAQJCRsXGCEC5pZ0JqzGcAA0/Pw1fB8lSPAti3trubYmd\n" + + "aaPFAKzGK7vsexxpuSUKO0opNkFWbLdHZ8jkr86R80oo1vhURJXWNeMS74ws5nbt\n" + + "Ll9sJTDW33MQPS0/JO3xYI7bQcW3K1sPSERa4BahqgOJvEXMk1eWRcUCAwEAAaOC\n" + + "AU0wggFJMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAU7edvdlq/YOxJ\n" + + "W8ald7tyFnGbxD0wOgYIKwYBBQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8v\n" + + "b2NzcC5xdW92YWRpc2dsb2JhbC5jb20wSwYDVR0gBEQwQjAHBgVngQwBATA3Bglg\n" + + "hkgBhv1sAgEwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t\n" + + "L0NQUzAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwOwYDVR0fBDQwMjAw\n" + + "oC6gLIYqaHR0cDovL2NybC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2EyZzMuY3Js\n" + + "MB0GA1UdDgQWBBQTL6fobnFR9uIMmEeDnn+deHk08zAOBgNVHQ8BAf8EBAMCAYYw\n" + + "DQYJKoZIhvcNAQELBQADggIBAEoOxze3kgnR39LX8M63EjiNxx0LThZHROqYqev6\n" + + "5ox/c5NNitk8/ODA8osdPpvnUBAlmE0+gqBvnTBRPVrJFd9bOr5BK8z6Os9/U0ed\n" + + "c3UINkWLS05B7ChC9s6Zw1Vd/WlW08TQJ80GpvAIbEKcg8EO/DXPniHxC4cMtv1T\n" + + "jtNeh98XiVgQXHL1FY+u/l413J8C4utKi4ZOQeCJDqvlSDzRsOi+tHsXrCJxnMWN\n" + + "2QBgMGgdPW37zwf0EffoH0Gee3pTgg7I5SzmvBq0t5xRDfv4N0OdM/sN1mc5f3o7\n" + + "0YCd9WXhyDCV5W2O8QIbrd42CK5k1rlM6gXwOyDmYY5CVAl1QeXEeRfDk/zNjU/1\n" + + "+LnH/Dv88VcZhODYq+VGbyM8bpNr0v95PY3yaH4kzpWGqWAN5i9LosfcaqRPmyL4\n" + + "PcKTQwcA9AVTjITExFua/QtGrXLPvMVxR248G9IQpJMxP3JEGkjlKCenmc29r2u1\n" + + "KE4TeCs2xxjR1PusTfX91bBW3YAoAPDTRQKZjolegLUY44j3uKSzAdhMEbZQhovH\n" + + "Lraqx1WjTayTuq1Vuakcia5shmgFVSNcE+NVgLEIe32oTOm/G6Kd1lcm9C4Ph1Cg\n" + + "nfDuqohZrk76kJTk8poAY5aFCQHhVzbpSw3zooMGjjvWnkG+/DC6SZM8rKoOdKiB\n" + + "cy+N\n" + "-----END CERTIFICATE-----"; - // Owner: CN=qvsslrca2g3-ev-v.quovadisglobal.com, O=QuoVadis Limited, L=Hamilton, - // ST=Pembroke, C=BM, SERIALNUMBER=28474, OID.2.5.4.15=Private Organization, - // OID.1.3.6.1.4.1.311.60.2.1.3=BM + // Owner: CN=quovadis-root-ca-2-g3.chain-demos.digicert.com, O="DigiCert, Inc.", L=Lehi, ST=Utah, C=US, + // SERIALNUMBER=5299537-0142, OID.1.3.6.1.4.1.311.60.2.1.2=Utah, OID.1.3.6.1.4.1.311.60.2.1.3=US, + // OID.2.5.4.15=Private Organization + // Issuer: CN=DigiCert QV EV TLS ICA G1, O="DigiCert, Inc.", C=US + // Serial number: a54e525a61f2552f65885c6dce9fe21 + // Valid from: Mon Feb 01 16:00:00 PST 2021 until: Sat Mar 05 15:59:59 PST 2022 private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + - "MIIH4DCCBcigAwIBAgIUUZsNAKy8C5AlCfpCZWUQY2R6VawwDQYJKoZIhvcNAQEL\n" + - "BQAwSTELMAkGA1UEBhMCQk0xGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxHzAd\n" + - "BgNVBAMMFlF1b1ZhZGlzIEVWIFNTTCBJQ0EgRzMwHhcNMTcwNDE4MTg1NjEyWhcN\n" + - "MTkwNDE4MTkwNjAwWjCBwDETMBEGCysGAQQBgjc8AgEDEwJCTTEdMBsGA1UEDwwU\n" + - "UHJpdmF0ZSBPcmdhbml6YXRpb24xDjAMBgNVBAUTBTI4NDc0MQswCQYDVQQGEwJC\n" + - "TTERMA8GA1UECAwIUGVtYnJva2UxETAPBgNVBAcMCEhhbWlsdG9uMRkwFwYDVQQK\n" + - "DBBRdW9WYWRpcyBMaW1pdGVkMSwwKgYDVQQDDCNxdnNzbHJjYTJnMy1ldi12LnF1\n" + - "b3ZhZGlzZ2xvYmFsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n" + - "ALo9QJVNVNVfG//nZiOPX/j2O8GTVlSAfIMliEj78G0xmPZiQD3n/70KcYlsI7No\n" + - "ilytC8e/m4Mic9PpYfmhAwiUSmb3ba8qjekUgmBFXuQqj3fH6Na+8f5WC9cYpwlc\n" + - "Ew3NuL2WBs86mjM/3GIa61IXrGpRxN6UQJwSxhqlb1QqEGtuwBiy9FJQd0xekCTC\n" + - "GBe2zFT1WhyVSMWlxwkcy1p2LeUmlvnV6FHQYcM9te8UPhgY53O6+u0tnnnsED37\n" + - "UOU3MLev8T++WL7VPOrjgjXydMC9ndXKRttQFIeJ1r+W7rdMLCWkrTzvJ6GtBZZr\n" + - "8jjHNabWPkBslML7oGwvUHMCAwEAAaOCA0YwggNCMHgGCCsGAQUFBwEBBGwwajA5\n" + - "BggrBgEFBQcwAoYtaHR0cDovL3RydXN0LnF1b3ZhZGlzZ2xvYmFsLmNvbS9xdmV2\n" + - "c3NsZzMuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8vZXYub2NzcC5xdW92YWRpc2ds\n" + - "b2JhbC5jb20wHQYDVR0OBBYEFLVK7rSs4x+DZrwYaWl2mjhhAtV/MAwGA1UdEwEB\n" + - "/wQCMAAwHwYDVR0jBBgwFoAU5YRU0JBJnzi68snhKgjFTp+gSD8wWgYDVR0gBFMw\n" + - "UTBGBgwrBgEEAb5YAAJkAQIwNjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5xdW92\n" + - "YWRpc2dsb2JhbC5jb20vcmVwb3NpdG9yeTAHBgVngQwBATA8BgNVHR8ENTAzMDGg\n" + - "L6AthitodHRwOi8vY3JsLnF1b3ZhZGlzZ2xvYmFsLmNvbS9xdmV2c3NsZzMuY3Js\n" + - "MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw\n" + - "LgYDVR0RBCcwJYIjcXZzc2xyY2EyZzMtZXYtdi5xdW92YWRpc2dsb2JhbC5jb20w\n" + - "ggF9BgorBgEEAdZ5AgQCBIIBbQSCAWkBZwB2ALvZ37wfinG1k5Qjl6qSe0c4V5UK\n" + - "q1LoGpCWZDaOHtGFAAABW4J1OtsAAAQDAEcwRQIhANABKS1i5uxEm/HMivDJFyNJ\n" + - "gOKRrApqmx3KV0/pWMzqAiAui21HV9lVJ1OT6dEA9mlZAH4NmzklmY9WI978GMYG\n" + - "mgB2AFYUBpov18Ls0/XhvUSyPsdGdrm8mRFcwO+UmFXWidDdAAABW4J1Os0AAAQD\n" + - "AEcwRQIgTWLHrhex17UyIlr0HC9LXNUv0kyOudo7MpxoWFy1xGICIQCHFSoQGwvv\n" + - "zzpQ3JmHSLHy0AQQfWlbV9rFv37F4A7AaAB1AKS5CZC0GFgUh7sTosxncAo8NZgE\n" + - "+RvfuON3zQ7IDdwQAAABW4J1OvYAAAQDAEYwRAIgWLm8u/bcMZt5oXAPIqP9/Qqj\n" + - "Q61VYX+II6RFK+EJCnwCIBrXxQgngqO7X/aaeWnEjfQeSu7WCK9Md3tcqXsn+gMd\n" + - "MA0GCSqGSIb3DQEBCwUAA4ICAQAu0Y29voXdwt/68hwbdj8L50yecl2Z0OkOA31v\n" + - "UhAHgRVhQ+WiAgoeGEgjdntQ5pL7Wtr314gHpG6iR849Zr56WOliA6pfBYDk3qkH\n" + - "UiRgqQBUEV8oRzgp0E+Ebev+p9leM4RPYmUNsP3K4Z/BY24HNOtNKMC3clqKO35K\n" + - "D7B9ObYUb0+IjreKgUyQB7wMgFi7393gXDraVDhDoLrcktAkvkv3Mbt+A3IO5VrO\n" + - "4mQwjrLHzj8nFCmsP4RbCIKFO2QZE8sJYwplKUWOk1ngjpOvObPYpMt5M1kiRvau\n" + - "agkQ+WvnvuMEgAgafHtI4uu0ZNDW1ib0H+xq5X/x2w1RjEElbXCKMbnf3Pdvh9FG\n" + - "mLpkVITXIKzT0Jm+oIs+Vk4ktNEe8hQIzcqimmtlVl2hgMWkmIfRio1+41EY4Din\n" + - "QXBVsbRqftamzSpLbW54ryGJB8dSiGe4P53DOcNKiyie7une95ouZY/1DfQIlVG/\n" + - "9XexhqdGMKp6qUjgd9hOfHrD+mZHeBdIIONOHOhy6ESIUgpSzaAAM7QXZFqlzLzY\n" + - "okRp6cJKDfUmXrk80MopQMhRHJwdxfeZ/A/xAkrWlVPshG+qltSGIZWrNjhQIwk3\n" + - "49zFQCuDS+FrkubRueV+MB8Abp+V1nv5PNbhwfPzGSqwn9XX3vUnsp9uLv+3WlrL\n" + - "Kl1DeA==\n" + + "MIIGuzCCBaOgAwIBAgIQClTlJaYfJVL2WIXG3On+ITANBgkqhkiG9w0BAQsFADBK\n" + + "MQswCQYDVQQGEwJVUzEXMBUGA1UECgwORGlnaUNlcnQsIEluYy4xIjAgBgNVBAMM\n" + + "GURpZ2lDZXJ0IFFWIEVWIFRMUyBJQ0EgRzEwHhcNMjEwMjAyMDAwMDAwWhcNMjIw\n" + + "MzA1MjM1OTU5WjCB3zEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEzAR\n" + + "BgsrBgEEAYI3PAIBAxMCVVMxFTATBgsrBgEEAYI3PAIBAhMEVXRhaDEVMBMGA1UE\n" + + "BRMMNTI5OTUzNy0wMTQyMQswCQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDENMAsG\n" + + "A1UEBxMETGVoaTEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xNzA1BgNVBAMTLnF1\n" + + "b3ZhZGlzLXJvb3QtY2EtMi1nMy5jaGFpbi1kZW1vcy5kaWdpY2VydC5jb20wggEi\n" + + "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfknHK7boXh9ysZ0FLDQKEyT2x\n" + + "Swtyecb5kkVgJU75XpXccV724mntCu5hpZ7Yt4tOmDZvbpYcqWbhIJgxGFNLyPdB\n" + + "Fn8jgZ4N0WoD7u295HI9izEmbM0XrO2rvHUc6ZhFFyx0jhvJPf/k9QbQB4TwKZri\n" + + "Iuf1E1Ek70DkTWAg6OrPHMe2ER3aSz2S2rNkMSopURvZuabzPovsGaz+XEZNfE4N\n" + + "UfkBLa0DUjFCamOMZKIfkzxpH/NhQcigGnZgxiyUb6KRhu9ydpWeOvOHwPWwR/fV\n" + + "7WT+X1DUHojoXeCk2RtIRMihDWPd+lqiUppM8IlEW/gxWbK1wP41qioiK9j5AgMB\n" + + "AAGjggMFMIIDATAfBgNVHSMEGDAWgBQTL6fobnFR9uIMmEeDnn+deHk08zAdBgNV\n" + + "HQ4EFgQUtAEN4g3bzwES6MoOINihiZQrt+owOQYDVR0RBDIwMIIucXVvdmFkaXMt\n" + + "cm9vdC1jYS0yLWczLmNoYWluLWRlbW9zLmRpZ2ljZXJ0LmNvbTAOBgNVHQ8BAf8E\n" + + "BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMHsGA1UdHwR0MHIw\n" + + "N6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFFWRVZUTFNJ\n" + + "Q0FHMS5jcmwwN6A1oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2Vy\n" + + "dFFWRVZUTFNJQ0FHMS5jcmwwSgYDVR0gBEMwQTALBglghkgBhv1sAgEwMgYFZ4EM\n" + + "AQEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMHYG\n" + + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\n" + + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\n" + + "aUNlcnRRVkVWVExTSUNBRzEuY3J0MAwGA1UdEwEB/wQCMAAwggEEBgorBgEEAdZ5\n" + + "AgQCBIH1BIHyAPAAdgApeb7wnjk5IfBWc59jpXflvld9nGAK+PlNXSZcJV3HhAAA\n" + + "AXdkNiYhAAAEAwBHMEUCIQDg62+lrhAGdZcklHTEzYpVIki6v6fYgsbxmkTqV6M2\n" + + "BgIgOcYjjM1DGT2FWFK5OO4Qs7T7V28neWwqbMPqLBZgRCoAdgAiRUUHWVUkVpY/\n" + + "oS/x922G4CMmY63AS39dxoNcbuIPAgAAAXdkNiaKAAAEAwBHMEUCIQC0ZH0YX6BP\n" + + "k4QAm22mVvXXG9EVBWIS5LP49f9VFhb67QIgfYqYV/wJt3czP5rA4NbJXBeFxZXy\n" + + "DVnewfs2mz7kNOIwDQYJKoZIhvcNAQELBQADggEBAHIFaq9Edv37sXl07n3H93ym\n" + + "AzvQKJGD1khWwHQCGBXVzpUBi2v9Il0oS2pTATGD3ZB81Clryy9X3gHgkJcHFRn0\n" + + "cVr88GcyEWrxE8D6sx1X4WhlQknbKXNw8eL97EpZ4zKF1nDaYmf+e/lbmjnZIcdr\n" + + "DRcMmWD6LZBWP8MMD+5uJvooO4eBYM/WKVRgg6jAj1HELBHi9E6Xwm5jPx3DKt6W\n" + + "voJqcRJg3d4TiV8U/yOs8+514iAw+1YJFtAaxg5/eUQM/22BGXki8QCJ3NaaUGrj\n" + + "UNASswMDevD8rVwZ5Bc2iC+c0WVIgHZepyioNC2XSVPovV9pF4Q3ppkSvEGQGSo=\n" + "-----END CERTIFICATE-----"; - // Owner: CN=qvsslrca2g3-ev-r.quovadisglobal.com, O=QuoVadis Limited, L=Hamilton, - // ST=Pembroke, C=BM, SERIALNUMBER=28474, OID.2.5.4.15=Private Organization, - // OID.1.3.6.1.4.1.311.60.2.1.3=BM + // Owner: CN=quovadis-root-ca-2-g3-revoked.chain-demos.digicert.com, O="DigiCert, Inc.", L=Lehi, ST=Utah, C=US, + // SERIALNUMBER=5299537-0142, OID.1.3.6.1.4.1.311.60.2.1.2=Utah, OID.1.3.6.1.4.1.311.60.2.1.3=US, + // OID.2.5.4.15=Private Organization + // Issuer: CN=DigiCert QV EV TLS ICA G1, O="DigiCert, Inc.", C=US + // Serial number: 27c8845dc98ebf433dc5ce8618570d1 + // Valid from: Mon Feb 01 16:00:00 PST 2021 until: Sat Mar 05 15:59:59 PST 2022 private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + - "MIIH4TCCBcmgAwIBAgIUZTuy16qm4LnioIRmiaQZuThb38gwDQYJKoZIhvcNAQEL\n" + - "BQAwSTELMAkGA1UEBhMCQk0xGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxHzAd\n" + - "BgNVBAMMFlF1b1ZhZGlzIEVWIFNTTCBJQ0EgRzMwHhcNMTcwNDE4MTg1NjQ0WhcN\n" + - "MTkwNDE4MTkwNjAwWjCBwDETMBEGCysGAQQBgjc8AgEDEwJCTTEdMBsGA1UEDwwU\n" + - "UHJpdmF0ZSBPcmdhbml6YXRpb24xDjAMBgNVBAUTBTI4NDc0MQswCQYDVQQGEwJC\n" + - "TTERMA8GA1UECAwIUGVtYnJva2UxETAPBgNVBAcMCEhhbWlsdG9uMRkwFwYDVQQK\n" + - "DBBRdW9WYWRpcyBMaW1pdGVkMSwwKgYDVQQDDCNxdnNzbHJjYTJnMy1ldi1yLnF1\n" + - "b3ZhZGlzZ2xvYmFsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n" + - "ALXMNTuogjC2wpziEXbKztdgzBflORLxoAo5Y8HNAZVo8MgJJucshZ5S6cmRjreY\n" + - "fOlwo85Vu9s39EMRR+I0AZLbxw2PZxNSHUxTCzWlmJ4yValRPRZjz2LXJ+mjpkc3\n" + - "hsVHtCawvPqh2uNwM2qUD6zKfRGdKC27NeICjYe7RtfhLRdrZ8MNtVWMrrFt3Dzd\n" + - "SRJXFcLkN4rPzRFCxldU2yH6V4cZwnVz4XxV/nbljVtGyMJWGVzU0Bhy1fedAJ9x\n" + - "KGJbM6wackOlpUm0XMQdFxHF2tW4Sus6Mcf+2N8FgXk4PnwXarIc/Sj5Tx+Bvf5y\n" + - "TwBOGS02Hzs07ILV3w4dp00CAwEAAaOCA0cwggNDMHgGCCsGAQUFBwEBBGwwajA5\n" + - "BggrBgEFBQcwAoYtaHR0cDovL3RydXN0LnF1b3ZhZGlzZ2xvYmFsLmNvbS9xdmV2\n" + - "c3NsZzMuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8vZXYub2NzcC5xdW92YWRpc2ds\n" + - "b2JhbC5jb20wHQYDVR0OBBYEFALFAuUwkAiTXc+DIW861Mu1o/7RMAwGA1UdEwEB\n" + - "/wQCMAAwHwYDVR0jBBgwFoAU5YRU0JBJnzi68snhKgjFTp+gSD8wWgYDVR0gBFMw\n" + - "UTBGBgwrBgEEAb5YAAJkAQIwNjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5xdW92\n" + - "YWRpc2dsb2JhbC5jb20vcmVwb3NpdG9yeTAHBgVngQwBATA8BgNVHR8ENTAzMDGg\n" + - "L6AthitodHRwOi8vY3JsLnF1b3ZhZGlzZ2xvYmFsLmNvbS9xdmV2c3NsZzMuY3Js\n" + - "MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw\n" + - "LgYDVR0RBCcwJYIjcXZzc2xyY2EyZzMtZXYtci5xdW92YWRpc2dsb2JhbC5jb20w\n" + - "ggF+BgorBgEEAdZ5AgQCBIIBbgSCAWoBaAB2AFYUBpov18Ls0/XhvUSyPsdGdrm8\n" + - "mRFcwO+UmFXWidDdAAABW4J1uUEAAAQDAEcwRQIhAK2LD7cJrN7YYjyBqFDoZva+\n" + - "fae1CiuYyxpREVes1c8OAiBLVt/dGKnvwY2CW2TN3/WyRM7al2sLnM+XwNUGZDrJ\n" + - "pgB2ALvZ37wfinG1k5Qjl6qSe0c4V5UKq1LoGpCWZDaOHtGFAAABW4J1uVQAAAQD\n" + - "AEcwRQIhAIA9IjxIT69JGX+sl1okMiGsXfCOPq5crSX+m04Q7LcgAiBJWUsLDtm9\n" + - "5TKsGZvlJRKOn1CcA94sApQ4v+1D+uz+JQB2AKS5CZC0GFgUh7sTosxncAo8NZgE\n" + - "+RvfuON3zQ7IDdwQAAABW4J1uWwAAAQDAEcwRQIhAIWbEqGnZSIwrI5eWCIzfMRY\n" + - "A+onO3IjQrVAE6ZuGu2bAiAlyoRSfH4s8+lVL225AYD45OkJJfG41T6k+wVLM5Hg\n" + - "ezANBgkqhkiG9w0BAQsFAAOCAgEAPwvRI5GmzR72cDoh+7VPj7PihQDG4HBYq5Ta\n" + - "bF7NK2v9DoaU99vv01K3WBNIydjQX4j+IK8MoGp9dXV+LDUTsebnsY+nr3O4R0pK\n" + - "I2TAazN7zcy3SYc/MtaW7JI+/ckjHaJw+AT+qUz+l20p9shBFlg4QvH2cx2OOCat\n" + - "/CRnG2Nqc5nN1xVcS3aVDrGl36XIcjV+ab+3zicm3OhWqn/hlfBBWimuhix68i/L\n" + - "k+qUyN6A8Bz7NwsouzG7keS17VZbLFkOuczq9KxJLHtlI1OYFNzrLEx6aXeM5VoH\n" + - "mlwETxagSL6fjRvcCaM6As9WVRS08p/RldUrEw+O6r3ob7FaOywwIzSMFV1GbVFG\n" + - "eIrSMuSVwbQRa5Duakoe5vz1vOddrZPm3kqpvyT7j51nuedrjc8YgisuyMbxkf5s\n" + - "8tesqxdltXjFNwpwveYlgHAi3sZvO2dm6bEZcioxLEWEpwmYXrkBJWLhcILdfY99\n" + - "SWFAmwGtmCqh8Sxla77o+gaZkNKf3zBn/34Q91Z96qKgqjXDAGefsZiy4tQeEUJc\n" + - "2qIqjb2rWi5Vo7hn2eolNXzp6ZdanicpecpqwpmW9/v6YRxKLGTsdVz82TGWPnpt\n" + - "q3rCll0NIAfcjekFmRzmBWF1jOn4fCcF/WOxKW1T4JcMIcNoa5iI9M1WcVKQvJKA\n" + - "Zd5LLu4=\n" + + "MIIGzDCCBbSgAwIBAgIQAnyIRdyY6/Qz3FzoYYVw0TANBgkqhkiG9w0BAQsFADBK\n" + + "MQswCQYDVQQGEwJVUzEXMBUGA1UECgwORGlnaUNlcnQsIEluYy4xIjAgBgNVBAMM\n" + + "GURpZ2lDZXJ0IFFWIEVWIFRMUyBJQ0EgRzEwHhcNMjEwMjAyMDAwMDAwWhcNMjIw\n" + + "MzA1MjM1OTU5WjCB5zEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEzAR\n" + + "BgsrBgEEAYI3PAIBAxMCVVMxFTATBgsrBgEEAYI3PAIBAhMEVXRhaDEVMBMGA1UE\n" + + "BRMMNTI5OTUzNy0wMTQyMQswCQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDENMAsG\n" + + "A1UEBxMETGVoaTEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xPzA9BgNVBAMTNnF1\n" + + "b3ZhZGlzLXJvb3QtY2EtMi1nMy1yZXZva2VkLmNoYWluLWRlbW9zLmRpZ2ljZXJ0\n" + + "LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL8H5MLxLmlUrb/C\n" + + "+GndqTYyAWf7dlxmqK4bRtIQf6YIAum8sZwo7M+av3lNQAqRa9PsV4ms50lUSP6u\n" + + "sFPAKINoOIu3ABT3qlSNb7ChxYCaZAiW3D1N4Jc9SU4Pa6tfPM3mSWc2HR7kSqj+\n" + + "PtdDHgB8/wjgQwvGRFXTacM/dQVtd8cSLYGMaSgPTKqV87aps7gvd0a9jvJRPmzr\n" + + "vJihL8K5MRiKTwXofT2s8/+/XMn0qWzWzBPe/bQuTT3Ot0Ee5u54FVPi0659rDtj\n" + + "hDIf1M7GmSA/kuhcxI6vGusPZhrr+BbSbX8bRyXMPyE/V2qN2rGMVqDgo8CYP9oY\n" + + "BXBocaECAwEAAaOCAw4wggMKMB8GA1UdIwQYMBaAFBMvp+hucVH24gyYR4Oef514\n" + + "eTTzMB0GA1UdDgQWBBSxl5QSK4J6HfhClE1Vq1ElwnnNDzBBBgNVHREEOjA4gjZx\n" + + "dW92YWRpcy1yb290LWNhLTItZzMtcmV2b2tlZC5jaGFpbi1kZW1vcy5kaWdpY2Vy\n" + + "dC5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF\n" + + "BQcDAjB7BgNVHR8EdDByMDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v\n" + + "RGlnaUNlcnRRVkVWVExTSUNBRzEuY3JsMDegNaAzhjFodHRwOi8vY3JsNC5kaWdp\n" + + "Y2VydC5jb20vRGlnaUNlcnRRVkVWVExTSUNBRzEuY3JsMEoGA1UdIARDMEEwCwYJ\n" + + "YIZIAYb9bAIBMDIGBWeBDAEBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGln\n" + + "aWNlcnQuY29tL0NQUzB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGGGGh0dHA6\n" + + "Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2NhY2VydHMu\n" + + "ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0UVZFVlRMU0lDQUcxLmNydDAMBgNVHRMBAf8E\n" + + "AjAAMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHcAKXm+8J45OSHwVnOfY6V35b5X\n" + + "fZxgCvj5TV0mXCVdx4QAAAF3ZDY16wAABAMASDBGAiEAxiHgWMmElnreF1ItPryX\n" + + "1zHYYy8MswsWwPSLCRoNIh8CIQCoMhTfGdeb/YfgU7ADy0zo1ktLjnoWUXy57e2s\n" + + "syevwAB2ACJFRQdZVSRWlj+hL/H3bYbgIyZjrcBLf13Gg1xu4g8CAAABd2Q2Nh0A\n" + + "AAQDAEcwRQIhAIEUtUcXMIj/5+uNhqtRuzeppiC0dU9pcWuCkOqazlSsAiBeuAjH\n" + + "z1EyH5zDDR2dJoVJekXsihpIoXUiClDNBgCNUjANBgkqhkiG9w0BAQsFAAOCAQEA\n" + + "s/QeNaPZt8WftrnUqWI+neGyFlh6odWgpKxudOKVdvlGIUZ1bZlNzPcoHvdqgeVy\n" + + "Vys3NxfSAX812lYo+IvPM9l3CmuaHkb7l/5O8bwnEPZuLd6EExp8BVYCIwfW+9cm\n" + + "uyHXBJUEm1gkF2Utd8EYdf4jEcBCdDIXgNJI+DY05OlHE0E2IseQIHf9kttZzQHH\n" + + "QEVtowJsaa2EksksBAmDDHH6ybyee7bZl8W2xkpbzvUvb6SuK+M/XyUjS9SYtun3\n" + + "z82BhOhRMbpokpK2Eba6IeC7WoVX2Y8Wsqj198qTVvuyRiw2B3SdZarKV5VTySY3\n" + + "aqsEyxenca5EjxU7QZDAHQ==\n" + "-----END CERTIFICATE-----"; public void runTest(ValidatePathWithParams pathValidator) @@ -335,126 +332,132 @@ public void runTest(ValidatePathWithParams pathValidator) // Validate Revoked pathValidator.validate(new String[]{REVOKED, INT}, ValidatePathWithParams.Status.REVOKED, - "Tue Apr 18 12:23:14 PDT 2017", System.out); + "Tue Feb 02 11:26:52 PST 2021", System.out); } } class RootCA3G3 { - // Owner: CN=QuoVadis QVRCA3G3 SSL ICA, O=QuoVadis Limited, C=BM + // Owner: CN=DigiCert QuoVadis TLS ICA QV Root CA 3 G3, O="DigiCert, Inc", C=US + // Issuer: CN=QuoVadis Root CA 3 G3, O=QuoVadis Limited, C=BM + // Serial number: 427dd33a8ff51d8152e813c7dec93ba76312a7d8 + // Valid from: Wed Jan 06 12:55:40 PST 2021 until: Sat Jan 04 12:55:40 PST 2031 private static final String INT = "-----BEGIN CERTIFICATE-----\n" + - "MIIGszCCBJugAwIBAgIURUME8OY/YBHyokbgxoTKpPcoiHYwDQYJKoZIhvcNAQEL\n" + + "MIIFgDCCA2igAwIBAgIUQn3TOo/1HYFS6BPH3sk7p2MSp9gwDQYJKoZIhvcNAQEL\n" + "BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc\n" + - "BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xNzA0MTkxNDQ4NDBaFw0y\n" + - "NzA0MTkxNDQ4NDBaMEwxCzAJBgNVBAYTAkJNMRkwFwYDVQQKDBBRdW9WYWRpcyBM\n" + - "aW1pdGVkMSIwIAYDVQQDDBlRdW9WYWRpcyBRVlJDQTNHMyBTU0wgSUNBMIICIjAN\n" + - "BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt8UIgFvcneWgv29aR2/UV810uW9N\n" + - "VpvdEgQDPHao5+i3IwCH1GrV8KeC25vfJAuW2TJ5gHeN5fmWAtWU8NDaNwGxJq/w\n" + - "jlOe/UW0KSosuuOBltLY9fl+7lDYqBjEwmCGvZMQOzpsbm8QUYTuZmtw96sT5beZ\n" + - "Kwqub/NBDE59IZ+b82obreNFFOgwcHv9E00bfRW7kizNfaC8AiwgV9WfIFgvtb4+\n" + - "YflcgGbdWnmNvwL8aZGWpGYjw/H/0kpwfMgrVF3Q7h8Y0yTg/jj8ZdXLdaE/PQzx\n" + - "8RUU4xJGxply/RrNUEvm9xeXZG3ssLW56WDEhRLkORX/zF4/mVyO2DpGJs06IUSP\n" + - "VWe+JuJGT1UxWqIsDIIHqJNa2BYl6O/XOjE2oGxiCb9w0/kQ8tKWWynFx4XOtrjA\n" + - "pGktsjw66tqE08XWOuoKwAXH2Llwz+VGSMzrCDH98VHtAu/XpEjuW3iP+I7EHksm\n" + - "W2eLdQdvTJ5DBdLsspIG4HC9Ke+c/gCEJHvOURPXoY7j9JPcQLc+5O7kBqiIjEBU\n" + - "NpPX37x7z3msac/IiG/SOYl+kiBESV44QFIOl8sHYmj9HGNlkQz4B/inuGwifIux\n" + - "rfdvm6nrpC7jhd/5Ptk4PO1kcAtgwcB99BnRCw47Xl7hrERTpoRISReNG0JMK7Op\n" + - "wVFqyi7bV1U/l4MCAwEAAaOCAY8wggGLMBIGA1UdEwEB/wQIMAYBAf8CAQAwSQYD\n" + - "VR0gBEIwQDA+BgRVHSAAMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cucXVvdmFk\n" + - "aXNnbG9iYWwuY29tL3JlcG9zaXRvcnkwdAYIKwYBBQUHAQEEaDBmMCoGCCsGAQUF\n" + - "BzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wOAYIKwYBBQUHMAKG\n" + - "LGh0dHA6Ly90cnVzdC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2EzZzMuY3J0MA4G\n" + - "A1UdDwEB/wQEAwIBBjAnBgNVHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsG\n" + - "AQUFBwMJMB8GA1UdIwQYMBaAFMYX0Lyo6gJD8hsGmV0rkCC515zkMDsGA1UdHwQ0\n" + - "MDIwMKAuoCyGKmh0dHA6Ly9jcmwucXVvdmFkaXNnbG9iYWwuY29tL3F2cmNhM2cz\n" + - "LmNybDAdBgNVHQ4EFgQUTknx5HQLmDQSOuWxVX3EknK1r6QwDQYJKoZIhvcNAQEL\n" + - "BQADggIBAHfmIJkd+URmnVm0X1/43QXu08RTzUr1zjf4ZBVtzUFoEkfZm+zKlhb7\n" + - "QeYJ5lprX1tdRfHLI+JC7oyI5+7/0q1j2FN2g0oKYN63dIgtppoCNpBu58f69YxL\n" + - "Y3GPSCfgs+ld+HegNSTjQVzelr16aFo9sj1fzUwY4Xj+xEYDjYxFmNGSXY37+DdN\n" + - "3WPm1iahBNNCZGfXq5T4qr6+R6RWwxsaBdQfZh3efGB1WG4DVSQBoiCKjS7Eg+Mf\n" + - "LT+KEZgawLUVrt/sT5lNfw23XA1gxIOcNRBHjsTWbtTBHJeb8hYvXB38UGK4GfIo\n" + - "NxtvRyXgG/U8+OuCQPS2SpJ1VH+yZ4Tn3G4k2+WillxfpqCVgHDVuT8wigw1xUNb\n" + - "0Ft9F3OWftWCVILaYEcyuJrnL3jjcZXc/zG01wIGDFvlPshRifVs/69Xq9UQmMfB\n" + - "GUh6MteDIsN9NdiArcumSC1dNoA/9eESp1pb186lDx9KxRQ/3NJRDMOIsMYN8Lyu\n" + - "cDNzsnymtQyIm3YG7VmZi/6k99n9vT8Ff9PvQ49cdfPl8GIONMdYmhTtLtuC00AU\n" + - "550HVLnpFW8d1NX3+XKxQ5FG04nsTxUD2FtT+trEQouktPq9iFqZN+PLPi8UdrBW\n" + - "AGUDCnO/TNo7IPW6arQrFpYbRLStiOJw7204Mjuqco/1KcqnEiIC\n" + + "BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0yMTAxMDYyMDU1NDBaFw0z\n" + + "MTAxMDQyMDU1NDBaMFkxCzAJBgNVBAYTAlVTMRYwFAYDVQQKDA1EaWdpQ2VydCwg\n" + + "SW5jMTIwMAYDVQQDDClEaWdpQ2VydCBRdW9WYWRpcyBUTFMgSUNBIFFWIFJvb3Qg\n" + + "Q0EgMyBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALxNTdqnFD+A\n" + + "MhketYfVfVUWQKPkVEuyYj7Y2uwXBMRP4RStO4CoQih+hX/h94vRlObOIsqcNnyC\n" + + "ElwBnLbmusaWYLYnDEWoROL8uN0pkWk0asfhhEsXTkAJ6FLHUD85WBkED4gIVWPi\n" + + "Sp4AOwiA+/zpbwgVAgdjJTO3jjMsp4F1lBrdViYSwoPRACH1ZMjJG572oXTpZkQX\n" + + "uWmEKLUOnik1i5cbqGLnwXiDvTAhxit7aBlj/C5IDvONWVQL34ZTYppvo8S3Hhy9\n" + + "xX0S4HCpTpeBe3mas7VOrjsXNlEoFvejrxcQ+fB/gUf6fLUPxUhcPtm8keBPQuxc\n" + + "qP12/+KG0WECAwEAAaOCAU8wggFLMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0j\n" + + "BBgwFoAUxhfQvKjqAkPyGwaZXSuQILnXnOQwdAYIKwYBBQUHAQEEaDBmMDgGCCsG\n" + + "AQUFBzAChixodHRwOi8vdHJ1c3QucXVvdmFkaXNnbG9iYWwuY29tL3F2cmNhM2cz\n" + + "LmNydDAqBggrBgEFBQcwAYYeaHR0cDovL29jc3AucXVvdmFkaXNnbG9iYWwuY29t\n" + + "MBMGA1UdIAQMMAowCAYGZ4EMAQICMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEF\n" + + "BQcDATA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8vY3JsLnF1b3ZhZGlzZ2xvYmFs\n" + + "LmNvbS9xdnJjYTNnMy5jcmwwHQYDVR0OBBYEFDNm+y+RBcyzYlLvzTz1fhzOpxeW\n" + + "MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAY0ZuDgyM4I4MO9ll\n" + + "D8qFUPQ8xtcGOuJgSRhDS2onIJ0M8yOGOYJCobIEGIgqyx94kI/n/1Xw+Wvsnhwb\n" + + "OYOtVedx6VGDu6IuSKTVgPPhzwKP5ZA7wtmgKR8+W4E3DM1VerA9Po9ycDK9qCdl\n" + + "K4tuF37grKEzlQKovG+kn0z+Zi0D/E1kN1Q8YmX35HHRenJWKEnAL9QROh0X9jFi\n" + + "SlsHPrxWC3adOdAW+B+kVG0cM2nurd0Ic2YkiLKOOaSd5hbCQY/fCZwohtest+ZU\n" + + "Ajyd+FVzSNvEFrwPzZwKfcdemvD4kew8lx5sG6BUL4GkFWnotxSr+F9Huwgj4pC+\n" + + "cxE2841a/9r/gliuwDM/8jkt16epFAdw0fXemyM8FdHJDnB++3d8SyjOOQ8j+VHW\n" + + "31NWx27sORa5CgRchlldXWDzIIEwbc82a1OAfGUmNAsdEHjMl1HMcZHbjCmdSdsw\n" + + "fmyldZrj2YmvOI5ZlE9z4vzi35KyqlxWCtu9O/SJq/rBvYS0TPmm8HbhJQbeMe6p\n" + + "vJGrxcb1muSBANn9T9wvukjiNNw32ciSDCjZ0h4N+CGxbzoZtgIAQ29IunYdnJix\n" + + "ZiP+ED6xvwgVRBkDSgWD2W/hex/+z4fNmGQJDcri51/tZCqHHv2Y7XReuf4Fk+nP\n" + + "l8Sd/Kpqwde/sJkoqwDcBSJygh0=\n" + "-----END CERTIFICATE-----"; - // Owner: CN=qvsslrca3g3-ssl-v.quovadisglobal.com, O=QuoVadis Limited, L=Hamilton, - // ST=Pembroke, C=BM + // Owner: CN=quovadis-root-ca-3-g3.chain-demos.digicert.com, O="DigiCert, Inc.", L=Lehi, ST=Utah, C=US + // Issuer: CN=DigiCert QuoVadis TLS ICA QV Root CA 3 G3, O="DigiCert, Inc", C=US + // Serial number: 19a05758f4ac7061ce9b3badd54d9b3 + // Valid from: Tue Jan 19 16:00:00 PST 2021 until: Sun Feb 20 15:59:59 PST 2022 private static final String VALID = "-----BEGIN CERTIFICATE-----\n" + - "MIIGJzCCBA+gAwIBAgIUatc95M2rfpt/opXnck37WXW2RpAwDQYJKoZIhvcNAQEL\n" + - "BQAwTDELMAkGA1UEBhMCQk0xGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxIjAg\n" + - "BgNVBAMMGVF1b1ZhZGlzIFFWUkNBM0czIFNTTCBJQ0EwHhcNMTcwNTAyMTY1OTAy\n" + - "WhcNMjAwNTAyMTcwOTAwWjB9MQswCQYDVQQGEwJCTTERMA8GA1UECAwIUGVtYnJv\n" + - "a2UxETAPBgNVBAcMCEhhbWlsdG9uMRkwFwYDVQQKDBBRdW9WYWRpcyBMaW1pdGVk\n" + - "MS0wKwYDVQQDDCRxdnNzbHJjYTNnMy1zc2wtdi5xdW92YWRpc2dsb2JhbC5jb20w\n" + - "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+S725uLLelMIYHWuh6fbT\n" + - "lGdi7wf1BlsfQY/ZnLvsFbT1KHodE407RXP0NB6AeEBOlO8xQxaZ5b38aF+HROJw\n" + - "TcvUAgQHmNE+ER0JCMi42jSFC2dc93PhdcUEeesxIfu1iIKXxFmlbJtJxG3l27yJ\n" + - "L4ufum9iQYeZeoGXAr54x6JMY29kl5t9QM018d9sA9bHY+0iVJevM3xgxVe7xApw\n" + - "MSKoZH/OmkX8FaEW9b7TqrWfWcAdD8fkXK8lHCDqmUzSiDGJP16YeQA/4dmFO2vr\n" + - "ItXY8rTPjXoaolebHxf5WG5Qosxv0mPyklUb+SVSJagv66zl/H2Uk0bLyFFmuNAd\n" + - "AgMBAAGjggHOMIIByjB6BggrBgEFBQcBAQRuMGwwPgYIKwYBBQUHMAKGMmh0dHA6\n" + - "Ly90cnVzdC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2EzZzNzc2xpY2EuY3J0MCoG\n" + - "CCsGAQUFBzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wHQYDVR0O\n" + - "BBYEFFhZXE0P1SMuntLc7JYoHTcD8JKfMB8GA1UdIwQYMBaAFE5J8eR0C5g0Ejrl\n" + - "sVV9xJJyta+kMGkGA1UdIARiMGAwRgYMKwYBBAG+WAADZAEBMDYwNAYIKwYBBQUH\n" + - "AgEWKGh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL3JlcG9zaXRvcnkwCAYG\n" + - "Z4EMAQICMAwGCisGAQQBvlgBhFgwQQYDVR0fBDowODA2oDSgMoYwaHR0cDovL2Ny\n" + - "bC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2EzZzNzc2xpY2EuY3JsMA4GA1UdDwEB\n" + - "/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwLwYDVR0RBCgw\n" + - "JoIkcXZzc2xyY2EzZzMtc3NsLXYucXVvdmFkaXNnbG9iYWwuY29tMA0GCSqGSIb3\n" + - "DQEBCwUAA4ICAQB6QV56jPZzFbFNnKq4xRglTkZSLDMnyrmquWJr4xUWkWIqhQqC\n" + - "s+wAchy39Uuu+Nv99N1AxJhorpdbyIOd7B2NAnUXPeOa1Rm34mh2a/df0gTVrrWJ\n" + - "YSUd3Tv7tcGrMXa7kNaP0N3lTITC0F0fu0rLyCH5I28t4zkCXadcWTqHUKIDNS1h\n" + - "fwx1Y6Dq4fBhKQGpqBq4ThEpBgJdj5aGCNiYfKO/MTDrLxD1BpIjV88O+54cdtYp\n" + - "3K+UDN2lP03PNH4Z/0jF4K43DHpwDM0r6qP4yLqFf3K1NlzGkYgNlMrKUPSlu+M8\n" + - "F6R45TWkcHndk3SUxbtGsxhiLG4xJKY7Zm/0vSxNqia+UJ5wL5s+IoiXhj22RrPe\n" + - "kcx7u3MxB+KWSrtQd8y624J6tqbE7R+aaAX95KTQZoawjypX99P8Kir/NynFHYri\n" + - "RAX9qFU8nYQEAe47oxl0bIr7URiQrlz+FJ/bzJZQwROWY723JPXgv7wUMifCYvJz\n" + - "4pLkuc4KE+LIEqk5LUuoYGEhKhKVu8YnmDifPPrBBADNvAnnGfDZF9FRvIcD6h8H\n" + - "icZBXJHOgu70Rh8Zc77x+v29tKlAJVtswLlV0mVClDUk7U36XL+mAvYntnG9kH5x\n" + - "qQ2Fl7AkUewOd4tLeiN4fl+S+ceW9sOZPSWx5aLui9p2mmxuyxhC5egCzg==\n" + + "MIIGhjCCBW6gAwIBAgIQAZoFdY9KxwYc6bO63VTZszANBgkqhkiG9w0BAQsFADBZ\n" + + "MQswCQYDVQQGEwJVUzEWMBQGA1UECgwNRGlnaUNlcnQsIEluYzEyMDAGA1UEAwwp\n" + + "RGlnaUNlcnQgUXVvVmFkaXMgVExTIElDQSBRViBSb290IENBIDMgRzMwHhcNMjEw\n" + + "MTIwMDAwMDAwWhcNMjIwMjIwMjM1OTU5WjB9MQswCQYDVQQGEwJVUzENMAsGA1UE\n" + + "CBMEVXRhaDENMAsGA1UEBxMETGVoaTEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4x\n" + + "NzA1BgNVBAMTLnF1b3ZhZGlzLXJvb3QtY2EtMy1nMy5jaGFpbi1kZW1vcy5kaWdp\n" + + "Y2VydC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCm/KON4FI\n" + + "zslgCHcJkdamTiryUif9w+BD1xGb7W7hCo+JuLkMzDSH+gGAdwdjYK1NY5c0gFiw\n" + + "Ud3OeHbNe7dZJSXhBP1oF3Xwl0f0DWIfa9nJObzQrN94PnYzDNGuFZut69dqzghO\n" + + "1QGG/+dVdITvzqyA/Mqy7TUsZyoaG4OALTdOXAlFmeMf5UP7EDrAEC0dlUoYJnwK\n" + + "0BeRNZDPYc/OsHviNa6/PnBli81C1QSrAT93STEAnWsCJrG8KlbSElYz2zwPwBZ7\n" + + "ye1m8vH/K7npIIL0d/vSCxLUbC1pstOUahXvZE/Wl1zIV+JyCRmZS7sxTy6s5M4+\n" + + "31Va8Y9jdbeBAgMBAAGjggMkMIIDIDAfBgNVHSMEGDAWgBQzZvsvkQXMs2JS7808\n" + + "9X4czqcXljAdBgNVHQ4EFgQUsVGPx+H0EHp+wefHsSq0rN9eOzMwOQYDVR0RBDIw\n" + + "MIIucXVvdmFkaXMtcm9vdC1jYS0zLWczLmNoYWluLWRlbW9zLmRpZ2ljZXJ0LmNv\n" + + "bTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC\n" + + "MIGXBgNVHR8EgY8wgYwwRKBCoECGPmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E\n" + + "aWdpQ2VydFF1b1ZhZGlzVExTSUNBUVZSb290Q0EzRzMuY3JsMESgQqBAhj5odHRw\n" + + "Oi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRRdW9WYWRpc1RMU0lDQVFWUm9v\n" + + "dENBM0czLmNybDA+BgNVHSAENzA1MDMGBmeBDAECAjApMCcGCCsGAQUFBwIBFhto\n" + + "dHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgYMGCCsGAQUFBwEBBHcwdTAkBggr\n" + + "BgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME0GCCsGAQUFBzAChkFo\n" + + "dHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRRdW9WYWRpc1RMU0lD\n" + + "QVFWUm9vdENBM0czLmNydDAMBgNVHRMBAf8EAjAAMIIBBAYKKwYBBAHWeQIEAgSB\n" + + "9QSB8gDwAHYAKXm+8J45OSHwVnOfY6V35b5XfZxgCvj5TV0mXCVdx4QAAAF3IHx1\n" + + "rwAABAMARzBFAiAHK4QuN606ween6tDb2EiNdYTNGhWayvJemSNKuGIELgIhAKaF\n" + + "1/emwlNTMJDlG+kqEhqeO/+XjtfUfhdIeT8dR7dPAHYAIkVFB1lVJFaWP6Ev8fdt\n" + + "huAjJmOtwEt/XcaDXG7iDwIAAAF3IHx13QAABAMARzBFAiEA7qBblGimuzeSA3S5\n" + + "hkE+fVi0DLn/eElclZRk/RSCcsECIDN91iQV6iQryAeD597RExuxunvz+DXn6iz7\n" + + "43/4LdbkMA0GCSqGSIb3DQEBCwUAA4IBAQBZl4PoBJhh6j32nW39aRpOWTEhxZt+\n" + + "NItfFhaQSrJWWmWkKyIQ6roKf8mDyf2x6PGiWV1+ZLEJ5iUmuFtcjlvdd6PjP2J9\n" + + "qEev/kWfdnBY0Ocvfo6ZYhXy/9lW/1s9RQSNiEXTAi+C3R6iTQ5RYW6w4mStynqH\n" + + "dDO763+aE7vxSh6BxvbZugbkDkrHpjrpoWceT0huwbS7y7U0mk94eXXnTzisBHPY\n" + + "zbWlJNJVmt2ut9L9TIAZfqTmdWNKVXiVd2tOB2vKwHYzKM55/LqwcX+XfSpT2FQP\n" + + "OQ1TllgAl+B+4PexVRfO7MNuZgKwT8LuJp1d6xZNvXiNx6dhNBnaY7eE\n" + "-----END CERTIFICATE-----"; - // Owner: CN=qvsslrca3g3-ssl-r.quovadisglobal.com, O=QuoVadis Limited, L=Hamilton, - // ST=Pembroke, C=BM + // Owner: CN=quovadis-root-ca-3-g3-revoked.chain-demos.digicert.com, O="DigiCert, Inc.", L=Lehi, ST=Utah, C=US + // Issuer: CN=DigiCert QuoVadis TLS ICA QV Root CA 3 G3, O="DigiCert, Inc", C=US + // Serial number: 804a1f35d45fb0f799c9dd1e54f0a41 + // Valid from: Tue Jan 19 16:00:00 PST 2021 until: Sun Feb 20 15:59:59 PST 2022 private static final String REVOKED = "-----BEGIN CERTIFICATE-----\n" + - "MIIGJzCCBA+gAwIBAgIUTgJvLquqZ+Padg/W5Y0bTu9jimswDQYJKoZIhvcNAQEL\n" + - "BQAwTDELMAkGA1UEBhMCQk0xGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxIjAg\n" + - "BgNVBAMMGVF1b1ZhZGlzIFFWUkNBM0czIFNTTCBJQ0EwHhcNMTcwNTAyMTY1ODQy\n" + - "WhcNMjAwNTAyMTcwODAwWjB9MQswCQYDVQQGEwJCTTERMA8GA1UECAwIUGVtYnJv\n" + - "a2UxETAPBgNVBAcMCEhhbWlsdG9uMRkwFwYDVQQKDBBRdW9WYWRpcyBMaW1pdGVk\n" + - "MS0wKwYDVQQDDCRxdnNzbHJjYTNnMy1zc2wtci5xdW92YWRpc2dsb2JhbC5jb20w\n" + - "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCOdbnnY8GsO002xJ6Snu2W\n" + - "snpPmW9ZJ4cEKzdBA4fYKP2V/8ibbOZVH5gI4tSSW+mcMrepS9Jw49sZaKOOGf/7\n" + - "YsjFOp4DQ0+w/7FOj4WrKWBhymDGKI8SsDqoCkxjCYkAc7cutm5Ge67Yto2mvkzW\n" + - "vThV7o9pJ4z2kMg+Q527908zvP1eqT2g+72X1L3o3RSdGM5V35R+lGiBDum8ojZm\n" + - "+QGCGuc6zROgumfYrh11iTNhXJw6KVAS9KJ5GSHzmua/Cu1dwC2SPxp/hRRHlvPp\n" + - "07EjY2oGhfe6Hvsu9YuoQCm95H4HPTmTDUCKURRIGcC8jdrjXBowEuH15vUocSIJ\n" + - "AgMBAAGjggHOMIIByjB6BggrBgEFBQcBAQRuMGwwPgYIKwYBBQUHMAKGMmh0dHA6\n" + - "Ly90cnVzdC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2EzZzNzc2xpY2EuY3J0MCoG\n" + - "CCsGAQUFBzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wHQYDVR0O\n" + - "BBYEFLzYzgqJRXrnLc5OYHF/koTdbIzeMB8GA1UdIwQYMBaAFE5J8eR0C5g0Ejrl\n" + - "sVV9xJJyta+kMGkGA1UdIARiMGAwRgYMKwYBBAG+WAADZAEBMDYwNAYIKwYBBQUH\n" + - "AgEWKGh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL3JlcG9zaXRvcnkwCAYG\n" + - "Z4EMAQICMAwGCisGAQQBvlgBhFgwQQYDVR0fBDowODA2oDSgMoYwaHR0cDovL2Ny\n" + - "bC5xdW92YWRpc2dsb2JhbC5jb20vcXZyY2EzZzNzc2xpY2EuY3JsMA4GA1UdDwEB\n" + - "/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwLwYDVR0RBCgw\n" + - "JoIkcXZzc2xyY2EzZzMtc3NsLXIucXVvdmFkaXNnbG9iYWwuY29tMA0GCSqGSIb3\n" + - "DQEBCwUAA4ICAQAge+6VZgaEFxN38q0MYKs/QbdGowLd5n2CfQfpdOTRnpOtKQw6\n" + - "Bc/o1O8O/y0XUl1Be7TCgfXKWgw+rKX+ZrI6wCm7MxYlWXV2guWU/AeEl2uv14s/\n" + - "KnKhzZHfb0eQyItfk23flubc7pbh99LaVqozsLCTL78lOB7N7ZQwsNCrEghHWMxl\n" + - "w1/IX/h9XOJoBzu4ulebJoQ3hdIYJY7+lkw64uH1FNrCu7P/jjU9ZlPaobZOUy64\n" + - "sYIt4GsZbMFaUiamNzBUvULw+ZkZq0hTK0cuyA85MXd+3rm5z2AMemC/29XTUYRU\n" + - "L9LkxMF71w8BJzgpVx3s0a6dfi6XtgacP407IhMc3EW1McsSWdT6jL0zidbjXisU\n" + - "vfvuzA50b3HwYz8PsRN0Zfi2R1BubaZQ9fQW2fe1EWgq80CqOdO7eNZeaBxbW/qB\n" + - "smGA1wiHIVEtyHbwZslcKNy8VPKurfKClwZQxf17/oK6QrhOgxiKJGYBUDTa7Ln7\n" + - "Qslp/y3G721NOXzborchs8XB+BYEETtWWkKoWFDiV7vkfyn3x2cYNiv5JCWDszhZ\n" + - "RyVrW26YOQ3MqBAiYqgbU2jMdqeRRfMIFqUvvXwoTvYXuN4Yc2ZAOmCBPpUxo66V\n" + - "zHDu+QK/2/pI1SMLvU3KG526gUtDd67t8JUHqxyo3NsXUCD8tUYpaJy/vg==\n" + + "MIIGlzCCBX+gAwIBAgIQCASh811F+w95nJ3R5U8KQTANBgkqhkiG9w0BAQsFADBZ\n" + + "MQswCQYDVQQGEwJVUzEWMBQGA1UECgwNRGlnaUNlcnQsIEluYzEyMDAGA1UEAwwp\n" + + "RGlnaUNlcnQgUXVvVmFkaXMgVExTIElDQSBRViBSb290IENBIDMgRzMwHhcNMjEw\n" + + "MTIwMDAwMDAwWhcNMjIwMjIwMjM1OTU5WjCBhTELMAkGA1UEBhMCVVMxDTALBgNV\n" + + "BAgTBFV0YWgxDTALBgNVBAcTBExlaGkxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu\n" + + "MT8wPQYDVQQDEzZxdW92YWRpcy1yb290LWNhLTMtZzMtcmV2b2tlZC5jaGFpbi1k\n" + + "ZW1vcy5kaWdpY2VydC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n" + + "AQC1ZjOf9P8AsZUMI2utVu8I9Ap1xOfIrZ0CGh5ZT1O/+PqE27hnqwG7Ed0yuQs7\n" + + "OMyo0BP5d8Fg7dbW4LqaA+al3vRH+CQQoeD8zsQd1jWS6ZuitB3CQecZpCaMdzBe\n" + + "kQrmj0ofmyEcI5tvQTh4UeGkT66ONB0t4Urol0PCanX8Y3jQVt3FdPDdDTiIHRnl\n" + + "maOD1nCkkEEKGbRhxHH/8p8NCQD+i1Rn6KVMjy/hdMVEJCdFDMfKETgfcs2ZgKce\n" + + "A8UyPo5pfpvPEptss2Ndj80ou4X0ACV8x0nqWpOojFsml5BYIzRK8s8adAmcUUkG\n" + + "uukBGeJTQLd3Ygt6wa2gkeP/AgMBAAGjggMsMIIDKDAfBgNVHSMEGDAWgBQzZvsv\n" + + "kQXMs2JS78089X4czqcXljAdBgNVHQ4EFgQUidJlKGbvtsxFbZ+KM2iajjjrEdcw\n" + + "QQYDVR0RBDowOII2cXVvdmFkaXMtcm9vdC1jYS0zLWczLXJldm9rZWQuY2hhaW4t\n" + + "ZGVtb3MuZGlnaWNlcnQuY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggr\n" + + "BgEFBQcDAQYIKwYBBQUHAwIwgZcGA1UdHwSBjzCBjDBEoEKgQIY+aHR0cDovL2Ny\n" + + "bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0UXVvVmFkaXNUTFNJQ0FRVlJvb3RDQTNH\n" + + "My5jcmwwRKBCoECGPmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFF1\n" + + "b1ZhZGlzVExTSUNBUVZSb290Q0EzRzMuY3JsMD4GA1UdIAQ3MDUwMwYGZ4EMAQIC\n" + + "MCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBgwYI\n" + + "KwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j\n" + + "b20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp\n" + + "Q2VydFF1b1ZhZGlzVExTSUNBUVZSb290Q0EzRzMuY3J0MAwGA1UdEwEB/wQCMAAw\n" + + "ggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdQApeb7wnjk5IfBWc59jpXflvld9nGAK\n" + + "+PlNXSZcJV3HhAAAAXcgfZ+yAAAEAwBGMEQCIC/jlb+hFwAO0CDUL1hJSIQ9QZOH\n" + + "y0fR4gQ3dIXicm26AiAeYJl/ldEn2ojtlL5SYlkpMyf0ry6dNVP0iD8ctUNyngB3\n" + + "ACJFRQdZVSRWlj+hL/H3bYbgIyZjrcBLf13Gg1xu4g8CAAABdyB9oAUAAAQDAEgw\n" + + "RgIhAMc2AQO/4o79MHwNZAaAFicxyvLCxjKbmR2kPxmL6oSUAiEA1ue6oGS9cIoy\n" + + "gTYMxvrLLcETbvapKRFu49dUeger7aUwDQYJKoZIhvcNAQELBQADggEBAG9vJ2sF\n" + + "Q/guZdJr8tnMcHNISmZSTCXPvc20kjkVF0M0kW979sskISxEmV9pI49FJqQB1hoz\n" + + "4YJhtOKAg5a9PsvOlMaeM/QNtGHdIf+BKJelpH38klHZ51zMPoWJZVDs+FX1s2fZ\n" + + "O9kJyU6u22eKhsea2Zt726sIQpL+d4cfBqyXWdUBFp+Kapa/tYhVYW5wo3lxGdf+\n" + + "ZgtZMd8tRrYtqD7Zz4fxB9SQj4uqbUydb6n95CR4agO+yNH0mzkD3csoeFfTyKkU\n" + + "93P11+3GMBIMY+Tqtm37eDQlZiJZt8zxdjQLO8oM8MgwimKvNeOIdETvZq6dHu8L\n" + + "d9QqGEKe5acHUL0=\n" + "-----END CERTIFICATE-----"; public void runTest(ValidatePathWithParams pathValidator) @@ -466,6 +469,6 @@ public void runTest(ValidatePathWithParams pathValidator) // Validate Revoked pathValidator.validate(new String[]{REVOKED, INT}, ValidatePathWithParams.Status.REVOKED, - "Tue May 02 10:15:53 PDT 2017", System.out); + "Wed Jan 20 07:51:03 PST 2021", System.out); } } diff --git a/test/jdk/sun/misc/JarIndex/JarIndexMergeTest.java b/test/jdk/sun/misc/JarIndex/JarIndexMergeTest.java index e7fe5324086..70e0d6ab361 100644 --- a/test/jdk/sun/misc/JarIndex/JarIndexMergeTest.java +++ b/test/jdk/sun/misc/JarIndex/JarIndexMergeTest.java @@ -35,7 +35,7 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.util.LinkedList; +import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; // implementation specific API @@ -64,7 +64,7 @@ public static void main(String[] args) throws Exception { static void assertFileResolved(JarIndex jarIndex2, String file, String jarName) { @SuppressWarnings("unchecked") - LinkedList jarLists = (LinkedList)jarIndex2.get(file); + List jarLists = (List)jarIndex2.get(file); if (jarLists == null || jarLists.size() == 0 || !jarName.equals(jarLists.get(0))) { throw new RuntimeException( diff --git a/test/jdk/sun/net/www/protocol/http/spnegoReadme b/test/jdk/sun/net/www/protocol/http/spnegoReadme index 0751251e568..15fe2ea7680 100644 --- a/test/jdk/sun/net/www/protocol/http/spnegoReadme +++ b/test/jdk/sun/net/www/protocol/http/spnegoReadme @@ -105,7 +105,7 @@ several configurations are needed to perform a success communication: It's only needed when you encounter a server which knows Negotiate but doesn't know about SPNEGO. - If http.auth.preference is not set, the internal order choosen is: + If http.auth.preference is not set, the internal order chosen is: GSS/SPNEGO -> Digest -> BTLM -> Basic Noticed that Kerberos does not appear in this list, since whenever diff --git a/test/jdk/sun/security/lib/cacerts/VerifyCACerts.java b/test/jdk/sun/security/lib/cacerts/VerifyCACerts.java index 5cdf81f4aa4..bb0a51ed5fb 100644 --- a/test/jdk/sun/security/lib/cacerts/VerifyCACerts.java +++ b/test/jdk/sun/security/lib/cacerts/VerifyCACerts.java @@ -27,7 +27,7 @@ * @bug 8189131 8198240 8191844 8189949 8191031 8196141 8204923 8195774 8199779 * 8209452 8209506 8210432 8195793 8216577 8222089 8222133 8222137 8222136 * 8223499 8225392 8232019 8234245 8233223 8225068 8225069 8243321 8243320 - * 8243559 8225072 8258630 8259312 8256421 8225081 + * 8243559 8225072 8258630 8259312 8256421 8225081 8225082 * @summary Check root CA entries in cacerts file */ import java.io.ByteArrayInputStream; @@ -54,12 +54,12 @@ public class VerifyCACerts { + File.separator + "security" + File.separator + "cacerts"; // The numbers of certs now. - private static final int COUNT = 91; + private static final int COUNT = 90; // SHA-256 of cacerts, can be generated with // shasum -a 256 cacerts | sed -e 's/../&:/g' | tr '[:lower:]' '[:upper:]' | cut -c1-95 private static final String CHECKSUM - = "9B:C3:0B:24:D4:26:E4:A9:4F:2C:96:25:06:9B:08:E5:13:5B:0B:33:74:5F:78:DB:BD:91:CD:31:D4:37:07:28"; + = "A2:36:27:B7:F6:99:7A:C7:7E:2D:55:47:66:57:08:3F:F8:8C:F2:28:77:29:30:40:A2:D3:6D:1A:B6:C7:32:6F"; // Hex formatter to upper case with ":" delimiter private static final HexFormat HEX = HexFormat.ofDelimiter(":").withUpperCase(); @@ -148,8 +148,6 @@ public class VerifyCACerts { "49:E7:A4:42:AC:F0:EA:62:87:05:00:54:B5:25:64:B6:50:E4:F4:9E:42:E3:48:D6:AA:38:E0:39:E9:57:B1:C1"); put("dtrustclass3ca2ev [jdk]", "EE:C5:49:6B:98:8C:E9:86:25:B9:34:09:2E:EC:29:08:BE:D0:B0:F3:16:C2:D4:73:0C:84:EA:F1:F3:D3:48:81"); - put("identrustdstx3 [jdk]", - "06:87:26:03:31:A7:24:03:D9:09:F1:05:E6:9B:CF:0D:32:E1:BD:24:93:FF:C6:D9:20:6D:11:BC:D6:77:07:39"); put("identrustpublicca [jdk]", "30:D0:89:5A:9A:44:8A:26:20:91:63:55:22:D1:F5:20:10:B5:86:7A:CA:E1:2C:78:EF:95:8F:D4:F4:38:9F:2F"); put("identrustcommercial [jdk]", @@ -268,8 +266,6 @@ public class VerifyCACerts { add("luxtrustglobalrootca [jdk]"); // Valid until: Wed Mar 17 11:33:33 PDT 2021 add("quovadisrootca [jdk]"); - // Valid until: Thu Sep 30 14:01:15 GMT 2021 - add("identrustdstx3 [jdk]"); } }; diff --git a/test/jdk/sun/security/validator/ConstructorTest.java b/test/jdk/sun/security/validator/ConstructorTest.java index e7af2621f1b..2d0045775cf 100644 --- a/test/jdk/sun/security/validator/ConstructorTest.java +++ b/test/jdk/sun/security/validator/ConstructorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -404,21 +404,6 @@ public static void testCtorByCollection(Set certSet) valNoGood = Validator.getInstance(Validator.TYPE_PKIX, "BogusVariant", certSet); System.out.println("\tSuccessful construction [PASS]"); - - // Case 6: Provide a null variant - // Expected result: throw NullPointerException - System.out.println("Constructor test 6: null variant"); - try { - valNoGood = Validator.getInstance(Validator.TYPE_PKIX, null, - certSet); - // Throw something non Runtime-related to indicate we shouldn't - // have succeeded on construction. - throw new IOException( - "Constructor did not throw NullPointerException"); - } catch (NullPointerException npe) { - System.out.println("\tCaught RuntimeException (" + npe.toString() + - ") [PASS])"); - } } public static void testCtorByPKIXBuilderParams(Set certSet) @@ -429,9 +414,9 @@ public static void testCtorByPKIXBuilderParams(Set certSet) X509Certificate[] chain = new X509Certificate[1]; Set intermeds = new HashSet<>(); - // Case 7: Make a PKIXValidator with valid arguments + // Case 6: Make a PKIXValidator with valid arguments // Expected result: Well-formed PKIXValidator object - System.out.println("Constructor test 7: Valid inputs"); + System.out.println("Constructor test 6: Valid inputs"); // Set up the PKIXBuilderParameters X509CertSelector sel = new X509CertSelector(); @@ -450,9 +435,9 @@ public static void testCtorByPKIXBuilderParams(Set certSet) showValidatedChain(valOK, chain, intermeds); - // Case 8: Make a PKIXValidator but provide a null PKIXBuilderParameters + // Case 7: Make a PKIXValidator but provide a null PKIXBuilderParameters // Expected result: throw NullPointerException - System.out.println("Constructor test 8: null params"); + System.out.println("Constructor test 7: null params"); try { valNoGood = Validator.getInstance(Validator.TYPE_PKIX, Validator.VAR_GENERIC, (PKIXBuilderParameters)null); diff --git a/test/jdk/sun/tools/jrunscript/jrunscript-eTest.sh b/test/jdk/sun/tools/jrunscript/jrunscript-eTest.sh index 6a3d4e76ff2..3d3723f81e2 100644 --- a/test/jdk/sun/tools/jrunscript/jrunscript-eTest.sh +++ b/test/jdk/sun/tools/jrunscript/jrunscript-eTest.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 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 @@ -39,7 +39,7 @@ if [ $? -eq 2 ]; then exit 0 fi -# -e option with JavaScript explicitly choosen as language +# -e option with JavaScript explicitly chosen as language rm -f jrunscript-eTest.out 2>/dev/null ${JRUNSCRIPT} -J-Dnashorn.args.prepend=--no-deprecation-warning -J-Djava.awt.headless=true -l nashorn -e "println('hello')" > jrunscript-eTest.out 2>&1 diff --git a/test/jdk/tools/jpackage/junit/jdk/jpackage/internal/PlatformVersionTest.java b/test/jdk/tools/jpackage/junit/jdk/jpackage/internal/PlatformVersionTest.java index 355dc25a2fe..3477dae822c 100644 --- a/test/jdk/tools/jpackage/junit/jdk/jpackage/internal/PlatformVersionTest.java +++ b/test/jdk/tools/jpackage/junit/jdk/jpackage/internal/PlatformVersionTest.java @@ -51,20 +51,20 @@ public PlatformVersionTest(Function parser, public static List data() { List data = new ArrayList<>(); addTo(data, WIN_MSI_PRODUCT_VERSION_PARSER, true, - "255", - "0", + "0.0", "255.255", + "0.0.0", "255.255.65535", - "1.0", - "1", - "01.02.6" + "0.0.0.0", + "255.255.65535.999999" ); addTo(data, WIN_MSI_PRODUCT_VERSION_PARSER, false, - "256", + "0", + "256.01", "255.256", "255.255.65536", - "1.2.3.4" + "1.2.3.4.5" ); addTo(data, MAC_CFBUNDLE_VERSION_PARSER, true, diff --git a/test/jdk/tools/launcher/TestSpecialArgs.java b/test/jdk/tools/launcher/TestSpecialArgs.java index a3953093a08..c58fd6dcaf8 100644 --- a/test/jdk/tools/launcher/TestSpecialArgs.java +++ b/test/jdk/tools/launcher/TestSpecialArgs.java @@ -24,8 +24,7 @@ /* * @test * @bug 7124089 7131021 8042469 8066185 8074373 8258917 - * @summary Checks for Launcher special flags, such as MacOSX specific flags, - * and JVM NativeMemoryTracking flags. + * @summary Checks for Launcher special flags, such as MacOSX specific flags. * @modules jdk.compiler * jdk.zipfs * @compile -XDignore.symbol.file TestSpecialArgs.java EnvironmentVariables.java @@ -111,167 +110,6 @@ void runTest(Set envToRemove, String... args) { } } - @Test - void testNativeMemoryTracking() { - final Map envMap = new HashMap<>(); - envMap.put("_JAVA_LAUNCHER_DEBUG", "true"); - TestResult tr; - /* - * test argument : -XX:NativeMemoryTracking=value - * A JVM flag, comsumed by the JVM, but requiring launcher - * to set an environmental variable if and only if value is supplied. - * Test and order: - * 1) execute with valid parameter: -XX:NativeMemoryTracking=MyValue - * a) check for correct env variable name: "NMT_LEVEL_" + pid - * b) check that "MyValue" was found in local env. - * 2) execute with invalid parameter: -XX:NativeMemoryTracking= - * !) Won't find "NativeMemoryTracking:" - * Code to create env variable not executed. - * 3) execute with invalid parameter: -XX:NativeMemoryTracking - * !) Won't find "NativeMemoryTracking:" - * Code to create env variable not executed. - * 4) give and invalid value and check to make sure JVM commented - */ - String envVarPidString = "TRACER_MARKER: NativeMemoryTracking: env var is NMT_LEVEL_"; - String NMT_Option_Value = "off"; - String myClassName = "helloworld"; - - // === Run the tests === - // ---Test 1a - tr = doExec(envMap, javaCmd, "-XX:NativeMemoryTracking=" + NMT_Option_Value, - "-version"); - - // get the PID from the env var we set for the JVM - String envVarPid = null; - for (String line : tr.testOutput) { - if (line.contains(envVarPidString)) { - int sindex = envVarPidString.length(); - envVarPid = line.substring(sindex); - break; - } - } - // did we find envVarPid? - if (envVarPid == null) { - System.out.println(tr); - throw new RuntimeException("Error: failed to find env Var Pid in tracking info"); - } - // we think we found the pid string. min test, not "". - if (envVarPid.length() < 1) { - System.out.println(tr); - throw new RuntimeException("Error: env Var Pid in tracking info is empty string"); - } - - // --- Test 1b - if (!tr.contains("NativeMemoryTracking: got value " + NMT_Option_Value)) { - System.out.println(tr); - throw new RuntimeException("Error: Valid param failed to set env variable"); - } - - // --- Test 2 - tr = doExec(envMap, javaCmd, "-XX:NativeMemoryTracking=", - "-version"); - if (tr.contains("NativeMemoryTracking:")) { - System.out.println(tr); - throw new RuntimeException("Error: invalid param caused env variable to be erroneously created"); - } - if (!tr.contains("Syntax error, expecting -XX:NativeMemoryTracking=")) { - System.out.println(tr); - throw new RuntimeException("Error: invalid param not checked by JVM"); - } - - // --- Test 3 - tr = doExec(envMap, javaCmd, "-XX:NativeMemoryTracking", - "-version"); - if (tr.contains("NativeMemoryTracking:")) { - System.out.println(tr); - throw new RuntimeException("Error: invalid param caused env variable to be erroneously created"); - } - if (!tr.contains("Syntax error, expecting -XX:NativeMemoryTracking=")) { - System.out.println(tr); - throw new RuntimeException("Error: invalid param not checked by JVM"); - } - // --- Test 4 - tr = doExec(envMap, javaCmd, "-XX:NativeMemoryTracking=BADVALUE", - "-version"); - if (!tr.contains("expecting -XX:NativeMemoryTracking")) { - System.out.println(tr); - throw new RuntimeException("Error: invalid param did not get JVM Syntax error message"); - } - } - - @Test - void testNMArgumentProcessing() throws FileNotFoundException { - TestResult tr; - // the direct invokers of the VM - String options[] = { - "-version", "-fullversion", "-help", "-?", "-X" - }; - for (String option : options) { - tr = doExec(javaCmd, option, "-XX:NativeMemoryTracking=summary"); - checkTestResult(tr); - } - - // create a test jar - File jarFile = new File("test.jar"); - createJar(jarFile, "public static void main(String... args){}"); - - // ones that involve main-class of some sort - tr = doExec(javaCmd, "-jar", jarFile.getName(), - "-XX:NativeMemoryTracking=summary"); - checkTestResult(tr); - - tr = doExec(javaCmd, "-cp", jarFile.getName(), "Foo", - "-XX:NativeMemoryTracking=summary"); - checkTestResult(tr); - - final Map envMap = new HashMap<>(); - // checkwith CLASSPATH set ie. no -cp or -classpath - envMap.put("CLASSPATH", "."); - tr = doExec(envMap, javaCmd, "Foo", "-XX:NativeMemoryTracking=summary"); - checkTestResult(tr); - - // should accept with no warnings - tr = doExec(javaCmd, "-cp", jarFile.getName(), - "-XX:NativeMemoryTracking=summary", "Foo"); - ensureNoWarnings(tr); - - // should accept with no warnings - tr = doExec(javaCmd, "-classpath", jarFile.getName(), - "-XX:NativeMemoryTracking=summary", "Foo"); - ensureNoWarnings(tr); - - // make sure a missing class is handled correctly, because the class - // resolution is performed by the JVM. - tr = doExec(javaCmd, "AbsentClass", "-XX:NativeMemoryTracking=summary"); - if (!tr.contains("Error: Could not find or load main class AbsentClass")) { - throw new RuntimeException("Test Fails"); - } - - // Make sure we handle correctly the module long form (--module=) - tr = doExec(javaCmd, "-XX:NativeMemoryTracking=summary", "--module=jdk.compiler/com.sun.tools.javac.Main", "--help"); - ensureNoWarnings(tr); - } - - @Test - void testNMTTools() throws FileNotFoundException { - TestResult tr; - // Tools (non-java launchers) should handle NTM (no "wrong launcher" warning). - tr = doExec(jarCmd, "-J-XX:NativeMemoryTracking=summary", "--help"); - ensureNoWarnings(tr); - - // And java terminal args (like "--help") don't stop "-J" args parsing. - tr = doExec(jarCmd, "--help", "-J-XX:NativeMemoryTracking=summary"); - ensureNoWarnings(tr); - } - - void ensureNoWarnings(TestResult tr) { - checkTestResult(tr); - if (tr.contains("warning: Native Memory Tracking")) { - System.err.println(tr.toString()); - throw new RuntimeException("Test Fails"); - } - } - void checkTestResult(TestResult tr) { if (!tr.isOK()) { System.err.println(tr.toString()); diff --git a/test/jtreg-ext/requires/VMProps.java b/test/jtreg-ext/requires/VMProps.java index c5d65a6f45b..e2f29ba5af0 100644 --- a/test/jtreg-ext/requires/VMProps.java +++ b/test/jtreg-ext/requires/VMProps.java @@ -44,10 +44,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import sun.hotspot.code.Compiler; -import sun.hotspot.cpuinfo.CPUInfo; -import sun.hotspot.gc.GC; -import sun.hotspot.WhiteBox; +import jdk.test.whitebox.code.Compiler; +import jdk.test.whitebox.cpuinfo.CPUInfo; +import jdk.test.whitebox.gc.GC; +import jdk.test.whitebox.WhiteBox; import jdk.test.lib.Platform; import jdk.test.lib.Container; diff --git a/test/langtools/ProblemList.txt b/test/langtools/ProblemList.txt index 71da6181e73..d9d8cfeeb9d 100644 --- a/test/langtools/ProblemList.txt +++ b/test/langtools/ProblemList.txt @@ -72,4 +72,3 @@ tools/sjavac/ClasspathDependencies.java # # jdeps -tools/jdeprscan/tests/jdk/jdeprscan/TestRelease.java 8270060 generic-all java.util.SplittableRandom extends a non-exported class diff --git a/test/langtools/tools/javac/annotations/8261088/T8261088.java b/test/langtools/tools/javac/annotations/8261088/T8261088.java new file mode 100644 index 00000000000..45ce1989818 --- /dev/null +++ b/test/langtools/tools/javac/annotations/8261088/T8261088.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021, Alphabet LLC. All rights reserved. + * 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 8261088 + * @summary Repeatable annotations without Target cannot have containers that target module declarations + * @compile T8261088.java + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Target; + +@Target(ElementType.MODULE) +@interface TC { + T[] value() default {}; +} + +@Repeatable(TC.class) +@interface T {} diff --git a/test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer.java b/test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer.java index 2e087a79a2d..cf1b30d50d4 100644 --- a/test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer.java +++ b/test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer.java @@ -25,7 +25,7 @@ /** * @test - * @bug 8006547 + * @bug 8006547 8261088 * @compile NoTargetOnContainer.java */ @@ -42,7 +42,8 @@ ElementType.PACKAGE, ElementType.ANNOTATION_TYPE, ElementType.FIELD, - ElementType.RECORD_COMPONENT + ElementType.RECORD_COMPONENT, + ElementType.MODULE, }) @Repeatable(FooContainer.class) @interface Foo {} diff --git a/test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer2.java b/test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer2.java index 9c06adc0bd4..db8e993cb40 100644 --- a/test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer2.java +++ b/test/langtools/tools/javac/annotations/repeatingAnnotations/NoTargetOnContainer2.java @@ -25,7 +25,7 @@ /** * @test - * @bug 8006547 + * @bug 8006547 8261088 * @compile NoTargetOnContainer2.java */ @@ -44,7 +44,8 @@ ElementType.FIELD, ElementType.TYPE_USE, ElementType.TYPE_PARAMETER, - ElementType.RECORD_COMPONENT + ElementType.RECORD_COMPONENT, + ElementType.MODULE, }) @Repeatable(FooContainer.class) @interface Foo {} diff --git a/test/lib-test/sun/hotspot/whitebox/BlobSanityTest.java b/test/lib-test/jdk/test/whitebox/BlobSanityTest.java similarity index 93% rename from test/lib-test/sun/hotspot/whitebox/BlobSanityTest.java rename to test/lib-test/jdk/test/whitebox/BlobSanityTest.java index bda27699991..4cc470b6179 100644 --- a/test/lib-test/sun/hotspot/whitebox/BlobSanityTest.java +++ b/test/lib-test/jdk/test/whitebox/BlobSanityTest.java @@ -27,14 +27,14 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * @modules java.management/sun.management - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @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 BlobSanityTest * @summary sanity testing of allocateCodeBlob, freeCodeBlob and getCodeBlob */ -import sun.hotspot.WhiteBox; +import jdk.test.whitebox.WhiteBox; import java.util.function.Consumer; import jdk.test.lib.Utils; diff --git a/test/lib-test/sun/hotspot/whitebox/CPUInfoTest.java b/test/lib-test/jdk/test/whitebox/CPUInfoTest.java similarity index 95% rename from test/lib-test/sun/hotspot/whitebox/CPUInfoTest.java rename to test/lib-test/jdk/test/whitebox/CPUInfoTest.java index 4a20b49a0b9..af1c0d18083 100644 --- a/test/lib-test/sun/hotspot/whitebox/CPUInfoTest.java +++ b/test/lib-test/jdk/test/whitebox/CPUInfoTest.java @@ -25,8 +25,8 @@ * @test * @library /test/lib / * - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @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 * CPUInfoTest @@ -35,8 +35,8 @@ import java.util.Set; import java.util.List; import jdk.test.lib.Platform; -import sun.hotspot.WhiteBox; -import sun.hotspot.cpuinfo.CPUInfo; +import jdk.test.whitebox.WhiteBox; +import jdk.test.whitebox.cpuinfo.CPUInfo; import static jdk.test.lib.Asserts.*; diff --git a/test/lib-test/sun/hotspot/whitebox/MismatchedWhiteBox/WhiteBox.java b/test/lib-test/jdk/test/whitebox/MismatchedWhiteBox/WhiteBox.java similarity index 92% rename from test/lib-test/sun/hotspot/whitebox/MismatchedWhiteBox/WhiteBox.java rename to test/lib-test/jdk/test/whitebox/MismatchedWhiteBox/WhiteBox.java index 2afcde8b57d..eba941c5b11 100644 --- a/test/lib-test/sun/hotspot/whitebox/MismatchedWhiteBox/WhiteBox.java +++ b/test/lib-test/jdk/test/whitebox/MismatchedWhiteBox/WhiteBox.java @@ -29,11 +29,11 @@ * @modules java.base/jdk.internal.misc * @library /test/lib * @compile WhiteBox.java - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-CheckIntrinsics sun.hotspot.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-CheckIntrinsics jdk.test.whitebox.WhiteBox */ -package sun.hotspot; +package jdk.test.whitebox; public class WhiteBox { @SuppressWarnings("serial") diff --git a/test/lib-test/jdk/test/whitebox/OldWhiteBox.java b/test/lib-test/jdk/test/whitebox/OldWhiteBox.java new file mode 100644 index 00000000000..677ed210f69 --- /dev/null +++ b/test/lib-test/jdk/test/whitebox/OldWhiteBox.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 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 id=without-inner-class + * @summary verify that sun.hotspot.WhiteBox class still can be used + * @library /test/lib + * @build sun.hotspot.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI OldWhiteBox + */ + +/* + * @test id=with-inner-class + * @summary verify that sun.hotspot.WhiteBox class still can be used + * @library /test/lib + * @build sun.hotspot.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI OldWhiteBox + */ + +import sun.hotspot.WhiteBox; + +public class OldWhiteBox { + public static void main(String[] args) { + WhiteBox wb = WhiteBox.getWhiteBox(); + if (wb.getHeapOopSize() < 0) { + throw new Error("wb.getHeapOopSize() < 0"); + } + } +} diff --git a/test/lib-test/sun/hotspot/whitebox/WBApi.java b/test/lib-test/jdk/test/whitebox/WBApi.java similarity index 90% rename from test/lib-test/sun/hotspot/whitebox/WBApi.java rename to test/lib-test/jdk/test/whitebox/WBApi.java index f43a67d5d96..1a83ffc328a 100644 --- a/test/lib-test/sun/hotspot/whitebox/WBApi.java +++ b/test/lib-test/jdk/test/whitebox/WBApi.java @@ -26,12 +26,12 @@ * @summary verify that whitebox functions can be linked and executed * @modules java.base/jdk.internal.misc * @library /test/lib - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @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 WBApi */ -import sun.hotspot.WhiteBox; +import jdk.test.whitebox.WhiteBox; public class WBApi { public static void main(String... args) { System.out.printf("args at: %x\n",WhiteBox.getWhiteBox().getObjectAddress(args)); diff --git a/test/lib-test/sun/hotspot/whitebox/vm_flags/BooleanTest.java b/test/lib-test/jdk/test/whitebox/vm_flags/BooleanTest.java similarity index 95% rename from test/lib-test/sun/hotspot/whitebox/vm_flags/BooleanTest.java rename to test/lib-test/jdk/test/whitebox/vm_flags/BooleanTest.java index 914e00e5add..43ed1dfc413 100644 --- a/test/lib-test/sun/hotspot/whitebox/vm_flags/BooleanTest.java +++ b/test/lib-test/jdk/test/whitebox/vm_flags/BooleanTest.java @@ -29,14 +29,14 @@ * java.compiler * java.management/sun.management * jdk.internal.jvmstat/sun.jvmstat.monitor - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI BooleanTest * @summary testing of WB::set/getBooleanVMFlag() * @author igor.ignatyev@oracle.com */ -import sun.hotspot.WhiteBox; +import jdk.test.whitebox.WhiteBox; import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.ProcessTools; import sun.management.*; diff --git a/test/lib-test/sun/hotspot/whitebox/vm_flags/DoubleTest.java b/test/lib-test/jdk/test/whitebox/vm_flags/DoubleTest.java similarity index 93% rename from test/lib-test/sun/hotspot/whitebox/vm_flags/DoubleTest.java rename to test/lib-test/jdk/test/whitebox/vm_flags/DoubleTest.java index 17ca502a91b..97e23b93655 100644 --- a/test/lib-test/sun/hotspot/whitebox/vm_flags/DoubleTest.java +++ b/test/lib-test/jdk/test/whitebox/vm_flags/DoubleTest.java @@ -27,8 +27,8 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * @modules java.management/sun.management - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI DoubleTest * @summary testing of WB::set/getDoubleVMFlag() * @author igor.ignatyev@oracle.com diff --git a/test/lib-test/sun/hotspot/whitebox/vm_flags/IntxTest.java b/test/lib-test/jdk/test/whitebox/vm_flags/IntxTest.java similarity index 95% rename from test/lib-test/sun/hotspot/whitebox/vm_flags/IntxTest.java rename to test/lib-test/jdk/test/whitebox/vm_flags/IntxTest.java index 0a44320abce..e9a696ff514 100644 --- a/test/lib-test/sun/hotspot/whitebox/vm_flags/IntxTest.java +++ b/test/lib-test/jdk/test/whitebox/vm_flags/IntxTest.java @@ -27,8 +27,8 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * @modules java.management/sun.management - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xint -XX:-ProfileInterpreter IntxTest * @summary testing of WB::set/getIntxVMFlag() * @author igor.ignatyev@oracle.com diff --git a/test/lib-test/sun/hotspot/whitebox/vm_flags/SizeTTest.java b/test/lib-test/jdk/test/whitebox/vm_flags/SizeTTest.java similarity index 94% rename from test/lib-test/sun/hotspot/whitebox/vm_flags/SizeTTest.java rename to test/lib-test/jdk/test/whitebox/vm_flags/SizeTTest.java index 21468acc771..ae57d6701fd 100644 --- a/test/lib-test/sun/hotspot/whitebox/vm_flags/SizeTTest.java +++ b/test/lib-test/jdk/test/whitebox/vm_flags/SizeTTest.java @@ -27,8 +27,8 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management/sun.management - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+UnlockExperimentalVMOptions SizeTTest * @summary testing of WB::set/getSizeTVMFlag() */ diff --git a/test/lib-test/sun/hotspot/whitebox/vm_flags/StringTest.java b/test/lib-test/jdk/test/whitebox/vm_flags/StringTest.java similarity index 94% rename from test/lib-test/sun/hotspot/whitebox/vm_flags/StringTest.java rename to test/lib-test/jdk/test/whitebox/vm_flags/StringTest.java index 86bc598285b..7bd684e7f05 100644 --- a/test/lib-test/sun/hotspot/whitebox/vm_flags/StringTest.java +++ b/test/lib-test/jdk/test/whitebox/vm_flags/StringTest.java @@ -27,8 +27,8 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * @modules java.management/sun.management - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI StringTest * @summary testing of WB::set/getStringVMFlag() * @author igor.ignatyev@oracle.com diff --git a/test/lib-test/sun/hotspot/whitebox/vm_flags/Uint64Test.java b/test/lib-test/jdk/test/whitebox/vm_flags/Uint64Test.java similarity index 93% rename from test/lib-test/sun/hotspot/whitebox/vm_flags/Uint64Test.java rename to test/lib-test/jdk/test/whitebox/vm_flags/Uint64Test.java index 2e703b605e7..c3f5e2daf0c 100644 --- a/test/lib-test/sun/hotspot/whitebox/vm_flags/Uint64Test.java +++ b/test/lib-test/jdk/test/whitebox/vm_flags/Uint64Test.java @@ -27,8 +27,8 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * @modules java.management/sun.management - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI Uint64Test * @summary testing of WB::set/getUint64VMFlag() * @author igor.ignatyev@oracle.com diff --git a/test/lib-test/sun/hotspot/whitebox/vm_flags/UintxTest.java b/test/lib-test/jdk/test/whitebox/vm_flags/UintxTest.java similarity index 94% rename from test/lib-test/sun/hotspot/whitebox/vm_flags/UintxTest.java rename to test/lib-test/jdk/test/whitebox/vm_flags/UintxTest.java index e7e65447ec2..7d980fc1968 100644 --- a/test/lib-test/sun/hotspot/whitebox/vm_flags/UintxTest.java +++ b/test/lib-test/jdk/test/whitebox/vm_flags/UintxTest.java @@ -27,8 +27,8 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management/sun.management - * @build sun.hotspot.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI UintxTest * @summary testing of WB::set/getUintxVMFlag() * @author igor.ignatyev@oracle.com diff --git a/test/lib-test/sun/hotspot/whitebox/vm_flags/VmFlagTest.java b/test/lib-test/jdk/test/whitebox/vm_flags/VmFlagTest.java similarity index 98% rename from test/lib-test/sun/hotspot/whitebox/vm_flags/VmFlagTest.java rename to test/lib-test/jdk/test/whitebox/vm_flags/VmFlagTest.java index 35d2ffa43a1..d48aab6cf26 100644 --- a/test/lib-test/sun/hotspot/whitebox/vm_flags/VmFlagTest.java +++ b/test/lib-test/jdk/test/whitebox/vm_flags/VmFlagTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -23,7 +23,7 @@ import java.util.function.BiConsumer; import java.util.function.Function; -import sun.hotspot.WhiteBox; +import jdk.test.whitebox.WhiteBox; import sun.management.*; import com.sun.management.*; import jdk.test.lib.Asserts; diff --git a/test/lib/jdk/test/lib/cds/CDSArchiveUtils.java b/test/lib/jdk/test/lib/cds/CDSArchiveUtils.java new file mode 100644 index 00000000000..f32561aeb43 --- /dev/null +++ b/test/lib/jdk/test/lib/cds/CDSArchiveUtils.java @@ -0,0 +1,314 @@ +/* + * Copyright (c) 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 jdk.test.lib.cds; + +import java.io.IOException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Random; + +import java.nio.file.Files; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; +import java.nio.file.StandardOpenOption; +import static java.nio.file.StandardOpenOption.READ; +import static java.nio.file.StandardOpenOption.WRITE; + +import jdk.test.lib.Utils; +import sun.hotspot.WhiteBox; + +// This class performs operations on shared archive file +public class CDSArchiveUtils { + public static int offsetMagic; // CDSFileMapHeaderBase::_magic + public static int offsetVersion; // CDSFileMapHeaderBase::_version + public static int offsetJvmIdent; // FileMapHeader::_jvm_ident + public static int spOffsetCrc; // CDSFileMapRegion::_crc + public static int fileHeaderSize; // total size of header, aligned with alignment + public static int cdsFileMapRegionSize; // size of CDSFileMapRegion + public static int spOffset; // offset of CDSFileMapRegion + public static int spUsedOffset; // offset of CDSFileMapRegion::_used + public static int sizetSize; // size of size_t + public static int intSize; // size of int + public static long alignment; // MetaspaceShared::core_region_alignment + + // The following should be consistent with the enum in the C++ MetaspaceShared class + public static String[] shared_region_name = { + "rw", // ReadWrite + "ro", // ReadOnly + "bm", // relocation bitmaps + "first_closed_archive", + "last_closed_archive", + "first_open_archive", + "last_open_archive" + }; + public static int num_regions = shared_region_name.length; + + static { + WhiteBox wb; + try { + wb = WhiteBox.getWhiteBox(); + offsetMagic = wb.getOffsetForName("FileMapHeader::_magic"); + offsetVersion = wb.getOffsetForName("FileMapHeader::_version"); + offsetJvmIdent = wb.getOffsetForName("FileMapHeader::_jvm_ident"); + spOffsetCrc = wb.getOffsetForName("CDSFileMapRegion::_crc"); + spOffset = wb.getOffsetForName("FileMapHeader::_space[0]") - offsetMagic; + spUsedOffset = wb.getOffsetForName("CDSFileMapRegion::_used") - spOffsetCrc; + sizetSize = wb.getOffsetForName("size_t_size"); + intSize = wb.getOffsetForName("int_size"); + cdsFileMapRegionSize = wb.getOffsetForName("CDSFileMapRegion_size"); + alignment = wb.metaspaceSharedRegionAlignment(); + // file_header_size is structure size, real size aligned with alignment + // so must be calculated after alignment is available + fileHeaderSize = (int)alignUpWithAlignment(wb.getOffsetForName("file_header_size")); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + + try { + int nonExistOffset = wb.getOffsetForName("FileMapHeader::_non_exist_offset"); + System.exit(-1); // should fail + } catch (Exception e) { + // success + } + } + + private static long alignUpWithAlignment(long l) { + return (l + alignment - 1) & (~ (alignment - 1)); + } + + private static void setReadWritePermission(File file) throws Exception { + if (!file.canRead()) { + if (!file.setReadable(true)) { + throw new IOException("Cannot modify file " + file + " as readable"); + } + } + if (!file.canWrite()) { + if (!file.setWritable(true)) { + throw new IOException("Cannot modify file " + file + " as writable"); + } + } + } + + public static long getRandomBetween(long start, long end) throws Exception { + if (start > end) { + throw new IllegalArgumentException("start must be less than end"); + } + Random aRandom = Utils.getRandomInstance(); + int d = aRandom.nextInt((int)(end - start)); + if (d < 1) { + d = 1; + } + return start + d; + } + + public static void modifyContentRandomly(File jsaFile) throws Exception { + // corrupt random area in the data areas + long[] used = new long[num_regions]; // record used bytes + long start0, start, end, offset; + int bufSize; + + System.out.printf("%-24s%12s%12s%16s\n", "Space Name", "Used bytes", "Reg Start", "Random Offset"); + start0 = fileHeaderSize; + for (int i = 0; i < num_regions; i++) { + used[i] = usedRegionSizeAligned(jsaFile, i); + start = start0; + for (int j = 0; j < i; j++) { + start += alignUpWithAlignment(used[j]); + } + end = start + used[i]; + if (start == end) { + continue; // Ignore empty regions + } + offset = getRandomBetween(start, end); + System.out.printf("%-24s%12d%12d%16d\n", shared_region_name[i], used[i], start, offset); + if (end - offset < 1024) { + bufSize = (int)(end - offset + 1); + } else { + bufSize = 1024; + } + writeData(jsaFile, offset, new byte[bufSize]); + } + } + + public static void modifyRegionContentRandomly(File jsaFile) throws Exception { + // corrupt random area in the data areas + long[] used = new long[num_regions]; // record used bytes + long start0, start, end, offset; + int bufSize; + + System.out.printf("%-24s%12s%12s%16s\n", "Space Name", "Used bytes", "Reg Start", "Random Offset"); + start0 = fileHeaderSize; + for (int i = 0; i < num_regions; i++) { + used[i] = usedRegionSizeAligned(jsaFile, i); + start = start0; + for (int j = 0; j < i; j++) { + start += alignUpWithAlignment(used[j]); + } + end = start + used[i]; + if (start == end) { + continue; // Ignore empty regions + } + offset = getRandomBetween(start, end); + System.out.printf("%-24s%12d%12d%16d\n", shared_region_name[i], used[i], start, offset); + if (end - offset < 1024) { + bufSize = (int)(end - offset + 1); + } else { + bufSize = 1024; + } + writeData(jsaFile, offset, new byte[bufSize]); + } + } + + public static boolean modifyRegionContent(int region, File jsaFile) throws Exception { + long total = 0L; + long[] used = new long[num_regions]; + System.out.printf("%-24s%12s\n", "Space name", "Used bytes"); + for (int i = 0; i < num_regions; i++) { + used[i] = usedRegionSizeAligned(jsaFile, i); + System.out.printf("%-24s%12d\n", shared_region_name[i], used[i]); + total += used[i]; + } + if (used[region] == 0) { + System.out.println("Region " + shared_region_name[region] + " is empty. Nothing to corrupt."); + return false; + } + byte[] buf = new byte[4096]; + System.out.printf("%-24s%12d\n", "Total: ", total); + long regionStartOffset = fileHeaderSize; + for (int i = 0; i < region; i++) { + regionStartOffset += used[i]; + } + System.out.println("Corrupt " + shared_region_name[region] + " section, start = " + regionStartOffset + + " (header_size + 0x" + Long.toHexString(regionStartOffset - fileHeaderSize) + ")"); + long bytesWritten = 0L; + while (bytesWritten < used[region]) { + bytesWritten += writeData(jsaFile, regionStartOffset + bytesWritten, buf); + } + return true; + } + + public static void modifyFileHeader(File jsaFile) throws Exception { + // screw up header info + byte[] buf = new byte[fileHeaderSize]; + writeData(jsaFile, 0, buf); + } + + public static void modifyJvmIdent(File jsaFile, String newJvmIdent) throws Exception { + byte[] buf = newJvmIdent.getBytes(); + writeData(jsaFile, (long)offsetJvmIdent, buf); + } + + public static void modifyHeaderIntField(File jsaFile, long offset, int value) throws Exception { + System.out.println(" offset " + offset); + + byte[] bytes = ByteBuffer.allocate(4).putInt(value).array(); + writeData(jsaFile, offset, bytes); + } + + // copy archive and set copied read/write permit + public static File copyArchiveFile(File orgJsaFile, String newName) throws Exception { + File newJsaFile = new File(newName); + if (newJsaFile.exists()) { + if (!newJsaFile.delete()) { + throw new IOException("Could not delete file " + newJsaFile); + } + } + Files.copy(orgJsaFile.toPath(), newJsaFile.toPath(), REPLACE_EXISTING); + + // change permission + setReadWritePermission(newJsaFile); + + return newJsaFile; + } + + private static FileChannel getFileChannel(File file) throws Exception { + List arry = new ArrayList(); + arry.add(READ); + arry.add(WRITE); + return FileChannel.open(file.toPath(), new HashSet(arry)); + } + + public static long readInt(File file, long offset, int nBytes) throws Exception { + try (FileChannel fc = getFileChannel(file)) { + ByteBuffer bb = ByteBuffer.allocate(nBytes); + bb.order(ByteOrder.nativeOrder()); + fc.position(offset); + fc.read(bb); + return (nBytes > 4 ? bb.getLong(0) : bb.getInt(0)); + } + } + + private static long writeData(FileChannel fc, long offset, ByteBuffer bb) throws Exception { + fc.position(offset); + return fc.write(bb); + } + + public static long writeData(File file, long offset, byte[] array) throws Exception { + try (FileChannel fc = getFileChannel(file)) { + ByteBuffer bbuf = ByteBuffer.wrap(array); + return writeData(fc, offset, bbuf); + } + } + + // dstFile will keep original size so will remove corresponding bytes.length bytes at end of file + public static File insertBytesRandomlyAfterHeader(File orgFile, String newFileName, byte[] bytes) throws Exception { + long offset = fileHeaderSize + getRandomBetween(0L, 4096L); + File dstFile = new File(newFileName); + try (FileChannel inputChannel = new FileInputStream(orgFile).getChannel(); + FileChannel outputChannel = new FileOutputStream(dstFile).getChannel()) { + long orgSize = inputChannel.size(); + outputChannel.transferFrom(inputChannel, 0, offset); + outputChannel.position(offset); + outputChannel.write(ByteBuffer.wrap(bytes)); + outputChannel.transferFrom(inputChannel, offset + bytes.length, orgSize - bytes.length); + } + return dstFile; + } + + // delete nBytes bytes from offset, so new file will be smaller than the original + public static File deleteBytesAtRandomPositionAfterHeader(File orgFile, String newFileName, int nBytes) throws Exception { + long offset = fileHeaderSize + getRandomBetween(0L, 4096L); + File dstFile = new File(newFileName); + try (FileChannel inputChannel = new FileInputStream(orgFile).getChannel(); + FileChannel outputChannel = new FileOutputStream(dstFile).getChannel()) { + long orgSize = inputChannel.size(); + outputChannel.transferFrom(inputChannel, 0, offset); + inputChannel.position(offset + nBytes); + outputChannel.transferFrom(inputChannel, offset, orgSize - nBytes); + } + return dstFile; + } + + // used region size + public static long usedRegionSizeAligned(File archiveFile, int region) throws Exception { + long offset = spOffset + cdsFileMapRegionSize * region + spUsedOffset; + long used = readInt(archiveFile, offset, sizetSize); + return alignUpWithAlignment(used); + } +} diff --git a/test/lib/jdk/test/lib/helpers/ClassFileInstaller.java b/test/lib/jdk/test/lib/helpers/ClassFileInstaller.java index b58ff795997..3c07469b7f7 100644 --- a/test/lib/jdk/test/lib/helpers/ClassFileInstaller.java +++ b/test/lib/jdk/test/lib/helpers/ClassFileInstaller.java @@ -102,12 +102,17 @@ public static void main(String... args) throws Exception { } // Add commonly used inner classes that are often omitted by mistake. Currently - // we support only sun.hotspot.WhiteBox$WhiteBoxPermission. See JDK-8199290 + // we support only jdk.test.whitebox.WhiteBox$WhiteBoxPermission and + // sun/hotspot/WhiteBox$WhiteBoxPermission. See JDK-8199290 private static String[] addInnerClasses(String[] classes, int startIdx) { - boolean seenWB = false; - boolean seenWBInner = false; - final String wb = "sun.hotspot.WhiteBox"; - final String wbInner = "sun.hotspot.WhiteBox$WhiteBoxPermission"; + boolean seenNewWb = false; + boolean seenNewWbInner = false; + boolean seenOldWb = false; + boolean seenOldWbInner = false; + final String newWb = "jdk.test.whitebox.WhiteBox"; + final String newWbInner = newWb + "$WhiteBoxPermission"; + final String oldWb = "sun.hotspot.WhiteBox"; + final String oldWbInner = oldWb + "$WhiteBoxPermission"; ArrayList list = new ArrayList<>(); @@ -115,12 +120,17 @@ private static String[] addInnerClasses(String[] classes, int startIdx) { String cls = classes[i]; list.add(cls); switch (cls) { - case wb: seenWB = true; break; - case wbInner: seenWBInner = true; break; + case newWb: seenNewWb = true; break; + case newWbInner: seenNewWbInner = true; break; + case oldWb: seenOldWb = true; break; + case oldWbInner: seenOldWbInner = true; break; } } - if (seenWB && !seenWBInner) { - list.add(wbInner); + if (seenNewWb && !seenNewWbInner) { + list.add(newWbInner); + } + if (seenOldWb && !seenOldWbInner) { + list.add(oldWbInner); } String[] array = new String[list.size()]; diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java new file mode 100644 index 00000000000..b534d0d7a4f --- /dev/null +++ b/test/lib/jdk/test/whitebox/WhiteBox.java @@ -0,0 +1,649 @@ +/* + * Copyright (c) 2012, 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 jdk.test.whitebox; + +import java.lang.management.MemoryUsage; +import java.lang.reflect.Executable; +import java.util.Arrays; +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.security.BasicPermission; +import java.util.Objects; + +import jdk.test.whitebox.parser.DiagnosticCommand; + +public class WhiteBox { + @SuppressWarnings("serial") + public static class WhiteBoxPermission extends BasicPermission { + public WhiteBoxPermission(String s) { + super(s); + } + } + + private WhiteBox() {} + private static final WhiteBox instance = new WhiteBox(); + private static native void registerNatives(); + + /** + * Returns the singleton WhiteBox instance. + * + * The returned WhiteBox object should be carefully guarded + * by the caller, since it can be used to read and write data + * at arbitrary memory addresses. It must never be passed to + * untrusted code. + */ + public synchronized static WhiteBox getWhiteBox() { + @SuppressWarnings("removal") + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission(new WhiteBoxPermission("getInstance")); + } + return instance; + } + + static { + registerNatives(); + } + + // Get the maximum heap size supporting COOPs + public native long getCompressedOopsMaxHeapSize(); + // Arguments + public native void printHeapSizes(); + + // Memory + private native long getObjectAddress0(Object o); + public long getObjectAddress(Object o) { + Objects.requireNonNull(o); + return getObjectAddress0(o); + } + + public native int getHeapOopSize(); + public native int getVMPageSize(); + public native long getVMAllocationGranularity(); + public native long getVMLargePageSize(); + public native long getHeapSpaceAlignment(); + public native long getHeapAlignment(); + + private native boolean isObjectInOldGen0(Object o); + public boolean isObjectInOldGen(Object o) { + Objects.requireNonNull(o); + return isObjectInOldGen0(o); + } + + private native long getObjectSize0(Object o); + public long getObjectSize(Object o) { + Objects.requireNonNull(o); + return getObjectSize0(o); + } + + // Runtime + // Make sure class name is in the correct format + public int countAliveClasses(String name) { + return countAliveClasses0(name.replace('.', '/')); + } + private native int countAliveClasses0(String name); + + public boolean isClassAlive(String name) { + return countAliveClasses(name) != 0; + } + + public native int getSymbolRefcount(String name); + + public native boolean deflateIdleMonitors(); + + private native boolean isMonitorInflated0(Object obj); + public boolean isMonitorInflated(Object obj) { + Objects.requireNonNull(obj); + return isMonitorInflated0(obj); + } + + public native void forceSafepoint(); + + private native long getConstantPool0(Class aClass); + public long getConstantPool(Class aClass) { + Objects.requireNonNull(aClass); + return getConstantPool0(aClass); + } + + private native int getConstantPoolCacheIndexTag0(); + public int getConstantPoolCacheIndexTag() { + return getConstantPoolCacheIndexTag0(); + } + + private native int getConstantPoolCacheLength0(Class aClass); + public int getConstantPoolCacheLength(Class aClass) { + Objects.requireNonNull(aClass); + return getConstantPoolCacheLength0(aClass); + } + + private native int remapInstructionOperandFromCPCache0(Class aClass, int index); + public int remapInstructionOperandFromCPCache(Class aClass, int index) { + Objects.requireNonNull(aClass); + return remapInstructionOperandFromCPCache0(aClass, index); + } + + private native int encodeConstantPoolIndyIndex0(int index); + public int encodeConstantPoolIndyIndex(int index) { + return encodeConstantPoolIndyIndex0(index); + } + + // JVMTI + private native void addToBootstrapClassLoaderSearch0(String segment); + public void addToBootstrapClassLoaderSearch(String segment){ + Objects.requireNonNull(segment); + addToBootstrapClassLoaderSearch0(segment); + } + + private native void addToSystemClassLoaderSearch0(String segment); + public void addToSystemClassLoaderSearch(String segment) { + Objects.requireNonNull(segment); + addToSystemClassLoaderSearch0(segment); + } + + // G1 + public native boolean g1InConcurrentMark(); + public native boolean g1HasRegionsToUncommit(); + private native boolean g1IsHumongous0(Object o); + public boolean g1IsHumongous(Object o) { + Objects.requireNonNull(o); + return g1IsHumongous0(o); + } + + private native boolean g1BelongsToHumongousRegion0(long adr); + public boolean g1BelongsToHumongousRegion(long adr) { + if (adr == 0) { + throw new IllegalArgumentException("adr argument should not be null"); + } + return g1BelongsToHumongousRegion0(adr); + } + + + private native boolean g1BelongsToFreeRegion0(long adr); + public boolean g1BelongsToFreeRegion(long adr) { + if (adr == 0) { + throw new IllegalArgumentException("adr argument should not be null"); + } + return g1BelongsToFreeRegion0(adr); + } + + public native long g1NumMaxRegions(); + public native long g1NumFreeRegions(); + public native int g1RegionSize(); + public native MemoryUsage g1AuxiliaryMemoryUsage(); + private native Object[] parseCommandLine0(String commandline, char delim, DiagnosticCommand[] args); + public Object[] parseCommandLine(String commandline, char delim, DiagnosticCommand[] args) { + Objects.requireNonNull(args); + return parseCommandLine0(commandline, delim, args); + } + + public native int g1ActiveMemoryNodeCount(); + public native int[] g1MemoryNodeIds(); + + // Parallel GC + public native long psVirtualSpaceAlignment(); + public native long psHeapGenerationAlignment(); + + /** + * Enumerates old regions with liveness less than specified and produces some statistics + * @param liveness percent of region's liveness (live_objects / total_region_size * 100). + * @return long[3] array where long[0] - total count of old regions + * long[1] - total memory of old regions + * long[2] - lowest estimation of total memory of old regions to be freed (non-full + * regions are not included) + */ + public native long[] g1GetMixedGCInfo(int liveness); + + // NMT + public native long NMTMalloc(long size); + public native void NMTFree(long mem); + public native long NMTReserveMemory(long size); + public native long NMTAttemptReserveMemoryAt(long addr, long size); + public native void NMTCommitMemory(long addr, long size); + public native void NMTUncommitMemory(long addr, long size); + public native void NMTReleaseMemory(long addr, long size); + public native long NMTMallocWithPseudoStack(long size, int index); + public native long NMTMallocWithPseudoStackAndType(long size, int index, int type); + public native boolean NMTChangeTrackingLevel(); + public native int NMTGetHashSize(); + public native long NMTNewArena(long initSize); + public native void NMTFreeArena(long arena); + public native void NMTArenaMalloc(long arena, long size); + + // Compiler + public native boolean isC2OrJVMCIIncluded(); + public native boolean isJVMCISupportedByGC(); + + public native int matchesMethod(Executable method, String pattern); + public native int matchesInline(Executable method, String pattern); + public native boolean shouldPrintAssembly(Executable method, int comp_level); + public native int deoptimizeFrames(boolean makeNotEntrant); + public native boolean isFrameDeoptimized(int depth); + public native void deoptimizeAll(); + + public boolean isMethodCompiled(Executable method) { + return isMethodCompiled(method, false /*not osr*/); + } + private native boolean isMethodCompiled0(Executable method, boolean isOsr); + public boolean isMethodCompiled(Executable method, boolean isOsr){ + Objects.requireNonNull(method); + return isMethodCompiled0(method, isOsr); + } + public boolean isMethodCompilable(Executable method) { + return isMethodCompilable(method, -1 /*any*/); + } + public boolean isMethodCompilable(Executable method, int compLevel) { + return isMethodCompilable(method, compLevel, false /*not osr*/); + } + private native boolean isMethodCompilable0(Executable method, int compLevel, boolean isOsr); + public boolean isMethodCompilable(Executable method, int compLevel, boolean isOsr) { + Objects.requireNonNull(method); + return isMethodCompilable0(method, compLevel, isOsr); + } + private native boolean isMethodQueuedForCompilation0(Executable method); + public boolean isMethodQueuedForCompilation(Executable method) { + Objects.requireNonNull(method); + return isMethodQueuedForCompilation0(method); + } + // Determine if the compiler corresponding to the compilation level 'compLevel' + // and to the compilation context 'compilation_context' provides an intrinsic + // for the method 'method'. An intrinsic is available for method 'method' if: + // - the intrinsic is enabled (by using the appropriate command-line flag) and + // - the platform on which the VM is running provides the instructions necessary + // for the compiler to generate the intrinsic code. + // + // The compilation context is related to using the DisableIntrinsic flag on a + // per-method level, see hotspot/src/share/vm/compiler/abstractCompiler.hpp + // for more details. + public boolean isIntrinsicAvailable(Executable method, + Executable compilationContext, + int compLevel) { + Objects.requireNonNull(method); + return isIntrinsicAvailable0(method, compilationContext, compLevel); + } + // If usage of the DisableIntrinsic flag is not expected (or the usage can be ignored), + // use the below method that does not require the compilation context as argument. + public boolean isIntrinsicAvailable(Executable method, int compLevel) { + return isIntrinsicAvailable(method, null, compLevel); + } + private native boolean isIntrinsicAvailable0(Executable method, + Executable compilationContext, + int compLevel); + public int deoptimizeMethod(Executable method) { + return deoptimizeMethod(method, false /*not osr*/); + } + private native int deoptimizeMethod0(Executable method, boolean isOsr); + public int deoptimizeMethod(Executable method, boolean isOsr) { + Objects.requireNonNull(method); + return deoptimizeMethod0(method, isOsr); + } + public void makeMethodNotCompilable(Executable method) { + makeMethodNotCompilable(method, -1 /*any*/); + } + public void makeMethodNotCompilable(Executable method, int compLevel) { + makeMethodNotCompilable(method, compLevel, false /*not osr*/); + } + private native void makeMethodNotCompilable0(Executable method, int compLevel, boolean isOsr); + public void makeMethodNotCompilable(Executable method, int compLevel, boolean isOsr) { + Objects.requireNonNull(method); + makeMethodNotCompilable0(method, compLevel, isOsr); + } + public int getMethodCompilationLevel(Executable method) { + return getMethodCompilationLevel(method, false /*not ost*/); + } + private native int getMethodCompilationLevel0(Executable method, boolean isOsr); + public int getMethodCompilationLevel(Executable method, boolean isOsr) { + Objects.requireNonNull(method); + return getMethodCompilationLevel0(method, isOsr); + } + private native boolean testSetDontInlineMethod0(Executable method, boolean value); + public boolean testSetDontInlineMethod(Executable method, boolean value) { + Objects.requireNonNull(method); + return testSetDontInlineMethod0(method, value); + } + public int getCompileQueuesSize() { + return getCompileQueueSize(-1 /*any*/); + } + public native int getCompileQueueSize(int compLevel); + private native boolean testSetForceInlineMethod0(Executable method, boolean value); + public boolean testSetForceInlineMethod(Executable method, boolean value) { + Objects.requireNonNull(method); + return testSetForceInlineMethod0(method, value); + } + public boolean enqueueMethodForCompilation(Executable method, int compLevel) { + return enqueueMethodForCompilation(method, compLevel, -1 /*InvocationEntryBci*/); + } + private native boolean enqueueMethodForCompilation0(Executable method, int compLevel, int entry_bci); + public boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci) { + Objects.requireNonNull(method); + return enqueueMethodForCompilation0(method, compLevel, entry_bci); + } + private native boolean enqueueInitializerForCompilation0(Class aClass, int compLevel); + public boolean enqueueInitializerForCompilation(Class aClass, int compLevel) { + Objects.requireNonNull(aClass); + return enqueueInitializerForCompilation0(aClass, compLevel); + } + private native void clearMethodState0(Executable method); + public native void markMethodProfiled(Executable method); + public void clearMethodState(Executable method) { + Objects.requireNonNull(method); + clearMethodState0(method); + } + public native void lockCompilation(); + public native void unlockCompilation(); + private native int getMethodEntryBci0(Executable method); + public int getMethodEntryBci(Executable method) { + Objects.requireNonNull(method); + return getMethodEntryBci0(method); + } + private native Object[] getNMethod0(Executable method, boolean isOsr); + public Object[] getNMethod(Executable method, boolean isOsr) { + Objects.requireNonNull(method); + return getNMethod0(method, isOsr); + } + public native long allocateCodeBlob(int size, int type); + public long allocateCodeBlob(long size, int type) { + int intSize = (int) size; + if ((long) intSize != size || size < 0) { + throw new IllegalArgumentException( + "size argument has illegal value " + size); + } + return allocateCodeBlob( intSize, type); + } + public native void freeCodeBlob(long addr); + public native void forceNMethodSweep(); + public native Object[] getCodeHeapEntries(int type); + public native int getCompilationActivityMode(); + private native long getMethodData0(Executable method); + public long getMethodData(Executable method) { + Objects.requireNonNull(method); + return getMethodData0(method); + } + public native Object[] getCodeBlob(long addr); + + private native void clearInlineCaches0(boolean preserve_static_stubs); + public void clearInlineCaches() { + clearInlineCaches0(false); + } + public void clearInlineCaches(boolean preserve_static_stubs) { + clearInlineCaches0(preserve_static_stubs); + } + + // Intered strings + public native boolean isInStringTable(String str); + + // Memory + public native void readReservedMemory(); + public native long allocateMetaspace(ClassLoader classLoader, long size); + public native long incMetaspaceCapacityUntilGC(long increment); + public native long metaspaceCapacityUntilGC(); + public native long metaspaceSharedRegionAlignment(); + + // Metaspace Arena Tests + public native long createMetaspaceTestContext(long commit_limit, long reserve_limit); + public native void destroyMetaspaceTestContext(long context); + public native void purgeMetaspaceTestContext(long context); + public native void printMetaspaceTestContext(long context); + public native long getTotalCommittedWordsInMetaspaceTestContext(long context); + public native long getTotalUsedWordsInMetaspaceTestContext(long context); + public native long createArenaInTestContext(long context, boolean is_micro); + public native void destroyMetaspaceTestArena(long arena); + public native long allocateFromMetaspaceTestArena(long arena, long word_size); + public native void deallocateToMetaspaceTestArena(long arena, long p, long word_size); + + public native long maxMetaspaceAllocationSize(); + + // Don't use these methods directly + // Use jdk.test.whitebox.gc.GC class instead. + public native boolean isGCSupported(int name); + public native boolean isGCSupportedByJVMCICompiler(int name); + public native boolean isGCSelected(int name); + public native boolean isGCSelectedErgonomically(); + + // Force Young GC + public native void youngGC(); + + // Force Full GC + public native void fullGC(); + + // Returns true if the current GC supports concurrent collection control. + public native boolean supportsConcurrentGCBreakpoints(); + + private void checkConcurrentGCBreakpointsSupported() { + if (!supportsConcurrentGCBreakpoints()) { + throw new UnsupportedOperationException("Concurrent GC breakpoints not supported"); + } + } + + private native void concurrentGCAcquireControl0(); + private native void concurrentGCReleaseControl0(); + private native void concurrentGCRunToIdle0(); + private native boolean concurrentGCRunTo0(String breakpoint); + + private static boolean concurrentGCIsControlled = false; + private void checkConcurrentGCIsControlled() { + if (!concurrentGCIsControlled) { + throw new IllegalStateException("Not controlling concurrent GC"); + } + } + + // All collectors supporting concurrent GC breakpoints are expected + // to provide at least the following breakpoints. + public final String AFTER_MARKING_STARTED = "AFTER MARKING STARTED"; + public final String BEFORE_MARKING_COMPLETED = "BEFORE MARKING COMPLETED"; + + // Collectors supporting concurrent GC breakpoints that do reference + // processing concurrently should provide the following breakpoint. + public final String AFTER_CONCURRENT_REFERENCE_PROCESSING_STARTED = + "AFTER CONCURRENT REFERENCE PROCESSING STARTED"; + + public void concurrentGCAcquireControl() { + checkConcurrentGCBreakpointsSupported(); + if (concurrentGCIsControlled) { + throw new IllegalStateException("Already controlling concurrent GC"); + } + concurrentGCAcquireControl0(); + concurrentGCIsControlled = true; + } + + public void concurrentGCReleaseControl() { + checkConcurrentGCBreakpointsSupported(); + concurrentGCReleaseControl0(); + concurrentGCIsControlled = false; + } + + // Keep concurrent GC idle. Release from breakpoint. + public void concurrentGCRunToIdle() { + checkConcurrentGCBreakpointsSupported(); + checkConcurrentGCIsControlled(); + concurrentGCRunToIdle0(); + } + + // Allow concurrent GC to run to breakpoint. + // Throws IllegalStateException if reached end of cycle first. + public void concurrentGCRunTo(String breakpoint) { + concurrentGCRunTo(breakpoint, true); + } + + // Allow concurrent GC to run to breakpoint. + // Returns true if reached breakpoint. If reached end of cycle first, + // then throws IllegalStateException if errorIfFail is true, returning + // false otherwise. + public boolean concurrentGCRunTo(String breakpoint, boolean errorIfFail) { + checkConcurrentGCBreakpointsSupported(); + checkConcurrentGCIsControlled(); + if (breakpoint == null) { + throw new NullPointerException("null breakpoint"); + } else if (concurrentGCRunTo0(breakpoint)) { + return true; + } else if (errorIfFail) { + throw new IllegalStateException("Missed requested breakpoint \"" + breakpoint + "\""); + } else { + return false; + } + } + + // Method tries to start concurrent mark cycle. + // It returns false if CM Thread is always in concurrent cycle. + public native boolean g1StartConcMarkCycle(); + + // Tests on ReservedSpace/VirtualSpace classes + public native int stressVirtualSpaceResize(long reservedSpaceSize, long magnitude, long iterations); + public native void readFromNoaccessArea(); + public native long getThreadStackSize(); + public native long getThreadRemainingStackSize(); + + // CPU features + public native String getCPUFeatures(); + + // VM flags + public native boolean isConstantVMFlag(String name); + public native boolean isLockedVMFlag(String name); + public native void setBooleanVMFlag(String name, boolean value); + public native void setIntVMFlag(String name, long value); + public native void setUintVMFlag(String name, long value); + public native void setIntxVMFlag(String name, long value); + public native void setUintxVMFlag(String name, long value); + public native void setUint64VMFlag(String name, long value); + public native void setSizeTVMFlag(String name, long value); + public native void setStringVMFlag(String name, String value); + public native void setDoubleVMFlag(String name, double value); + public native Boolean getBooleanVMFlag(String name); + public native Long getIntVMFlag(String name); + public native Long getUintVMFlag(String name); + public native Long getIntxVMFlag(String name); + public native Long getUintxVMFlag(String name); + public native Long getUint64VMFlag(String name); + public native Long getSizeTVMFlag(String name); + public native String getStringVMFlag(String name); + public native Double getDoubleVMFlag(String name); + private final List> flagsGetters = Arrays.asList( + this::getBooleanVMFlag, this::getIntVMFlag, this::getUintVMFlag, + this::getIntxVMFlag, this::getUintxVMFlag, this::getUint64VMFlag, + this::getSizeTVMFlag, this::getStringVMFlag, this::getDoubleVMFlag); + + public Object getVMFlag(String name) { + return flagsGetters.stream() + .map(f -> f.apply(name)) + .filter(x -> x != null) + .findAny() + .orElse(null); + } + + // Jigsaw + public native void DefineModule(Object module, boolean is_open, String version, + String location, Object[] packages); + public native void AddModuleExports(Object from_module, String pkg, Object to_module); + public native void AddReadsModule(Object from_module, Object source_module); + public native void AddModuleExportsToAllUnnamed(Object module, String pkg); + public native void AddModuleExportsToAll(Object module, String pkg); + + public native int getOffsetForName0(String name); + public int getOffsetForName(String name) throws Exception { + int offset = getOffsetForName0(name); + if (offset == -1) { + throw new RuntimeException(name + " not found"); + } + return offset; + } + public native Boolean getMethodBooleanOption(Executable method, String name); + public native Long getMethodIntxOption(Executable method, String name); + public native Long getMethodUintxOption(Executable method, String name); + public native Double getMethodDoubleOption(Executable method, String name); + public native String getMethodStringOption(Executable method, String name); + private final List> methodOptionGetters + = Arrays.asList(this::getMethodBooleanOption, this::getMethodIntxOption, + this::getMethodUintxOption, this::getMethodDoubleOption, + this::getMethodStringOption); + + public Object getMethodOption(Executable method, String name) { + return methodOptionGetters.stream() + .map(f -> f.apply(method, name)) + .filter(x -> x != null) + .findAny() + .orElse(null); + } + + // Sharing & archiving + public native String getDefaultArchivePath(); + public native boolean cdsMemoryMappingFailed(); + public native boolean isSharingEnabled(); + public native boolean isShared(Object o); + public native boolean isSharedClass(Class c); + public native boolean areSharedStringsIgnored(); + public native boolean isCDSIncluded(); + public native boolean isJFRIncluded(); + public native boolean isJavaHeapArchiveSupported(); + public native Object getResolvedReferences(Class c); + public native void linkClass(Class c); + public native boolean areOpenArchiveHeapObjectsMapped(); + + // Compiler Directive + public native int addCompilerDirective(String compDirect); + public native void removeCompilerDirective(int count); + + // Handshakes + public native int handshakeWalkStack(Thread t, boolean all_threads); + public native void asyncHandshakeWalkStack(Thread t); + + public native void lockAndBlock(boolean suspender); + + // Returns true on linux if library has the noexecstack flag set. + public native boolean checkLibSpecifiesNoexecstack(String libfilename); + + // Container testing + public native boolean isContainerized(); + public native int validateCgroup(String procCgroups, + String procSelfCgroup, + String procSelfMountinfo); + public native void printOsInfo(); + + // Decoder + public native void disableElfSectionCache(); + + // Resolved Method Table + public native long resolvedMethodItemsCount(); + + // Protection Domain Table + public native int protectionDomainRemovedCount(); + + public native int getKlassMetadataSize(Class c); + + // ThreadSMR GC safety check for threadObj + public native void checkThreadObjOfTerminatingThread(Thread target); + + // libc name + public native String getLibcName(); + + // Walk stack frames of current thread + public native void verifyFrames(boolean log, boolean updateRegisterMap); + + public native boolean isJVMTIIncluded(); + + public native void waitUnsafe(int time_ms); + + public native void lockCritical(); + + public native void unlockCritical(); +} diff --git a/test/lib/jdk/test/whitebox/code/BlobType.java b/test/lib/jdk/test/whitebox/code/BlobType.java new file mode 100644 index 00000000000..24ce9d96a41 --- /dev/null +++ b/test/lib/jdk/test/whitebox/code/BlobType.java @@ -0,0 +1,108 @@ +/* + * 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 jdk.test.whitebox.code; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryPoolMXBean; +import java.util.EnumSet; + +import jdk.test.whitebox.WhiteBox; + +public enum BlobType { + // Execution level 1 and 4 (non-profiled) nmethods (including native nmethods) + MethodNonProfiled(0, "CodeHeap 'non-profiled nmethods'", "NonProfiledCodeHeapSize") { + @Override + public boolean allowTypeWhenOverflow(BlobType type) { + return super.allowTypeWhenOverflow(type) + || type == BlobType.MethodProfiled; + } + }, + // Execution level 2 and 3 (profiled) nmethods + MethodProfiled(1, "CodeHeap 'profiled nmethods'", "ProfiledCodeHeapSize") { + @Override + public boolean allowTypeWhenOverflow(BlobType type) { + return super.allowTypeWhenOverflow(type) + || type == BlobType.MethodNonProfiled; + } + }, + // Non-nmethods like Buffers, Adapters and Runtime Stubs + NonNMethod(2, "CodeHeap 'non-nmethods'", "NonNMethodCodeHeapSize") { + @Override + public boolean allowTypeWhenOverflow(BlobType type) { + return super.allowTypeWhenOverflow(type) + || type == BlobType.MethodNonProfiled + || type == BlobType.MethodProfiled; + } + }, + // All types (No code cache segmentation) + All(3, "CodeCache", "ReservedCodeCacheSize"); + + public final int id; + public final String sizeOptionName; + public final String beanName; + + private BlobType(int id, String beanName, String sizeOptionName) { + this.id = id; + this.beanName = beanName; + this.sizeOptionName = sizeOptionName; + } + + public MemoryPoolMXBean getMemoryPool() { + for (MemoryPoolMXBean bean : ManagementFactory.getMemoryPoolMXBeans()) { + String name = bean.getName(); + if (beanName.equals(name)) { + return bean; + } + } + return null; + } + + public boolean allowTypeWhenOverflow(BlobType type) { + return type == this; + } + + public static EnumSet getAvailable() { + WhiteBox whiteBox = WhiteBox.getWhiteBox(); + if (!whiteBox.getBooleanVMFlag("SegmentedCodeCache")) { + // only All for non segmented world + return EnumSet.of(All); + } + if (System.getProperty("java.vm.info").startsWith("interpreted ")) { + // only NonNMethod for -Xint + return EnumSet.of(NonNMethod); + } + + EnumSet result = EnumSet.complementOf(EnumSet.of(All)); + if (!whiteBox.getBooleanVMFlag("TieredCompilation") + || whiteBox.getIntxVMFlag("TieredStopAtLevel") <= 1) { + // there is no MethodProfiled in non tiered world or pure C1 + result.remove(MethodProfiled); + } + return result; + } + + public long getSize() { + return WhiteBox.getWhiteBox().getUintxVMFlag(sizeOptionName); + } +} diff --git a/test/lib/jdk/test/whitebox/code/CodeBlob.java b/test/lib/jdk/test/whitebox/code/CodeBlob.java new file mode 100644 index 00000000000..c6c23fdff0c --- /dev/null +++ b/test/lib/jdk/test/whitebox/code/CodeBlob.java @@ -0,0 +1,70 @@ +/* + * 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 jdk.test.whitebox.code; + +import jdk.test.whitebox.WhiteBox; + +public class CodeBlob { + private static final WhiteBox WB = WhiteBox.getWhiteBox(); + public static CodeBlob[] getCodeBlobs(BlobType type) { + Object[] obj = WB.getCodeHeapEntries(type.id); + if (obj == null) { + return null; + } + CodeBlob[] result = new CodeBlob[obj.length]; + for (int i = 0, n = result.length; i < n; ++i) { + result[i] = new CodeBlob((Object[]) obj[i]); + } + return result; + } + public static CodeBlob getCodeBlob(long addr) { + Object[] obj = WB.getCodeBlob(addr); + if (obj == null) { + return null; + } + return new CodeBlob(obj); + } + protected CodeBlob(Object[] obj) { + assert obj.length == 4; + name = (String) obj[0]; + size = (Integer) obj[1]; + int blob_type_index = (Integer) obj[2]; + code_blob_type = BlobType.values()[blob_type_index]; + assert code_blob_type.id == (Integer) obj[2]; + address = (Long) obj[3]; + } + public final String name; + public final int size; + public final BlobType code_blob_type; + public final long address; + @Override + public String toString() { + return "CodeBlob{" + + "name=" + name + + ", size=" + size + + ", code_blob_type=" + code_blob_type + + ", address=" + address + + '}'; + } +} diff --git a/test/lib/jdk/test/whitebox/code/Compiler.java b/test/lib/jdk/test/whitebox/code/Compiler.java new file mode 100644 index 00000000000..65c5c464d00 --- /dev/null +++ b/test/lib/jdk/test/whitebox/code/Compiler.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2018, 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 jdk.test.whitebox.code; + +import java.lang.reflect.Executable; +import jdk.test.whitebox.WhiteBox; + +/** + * API to obtain information about enabled JIT compilers + * retrieved from the VM with the WhiteBox API. + */ +public class Compiler { + + private static final WhiteBox WB = WhiteBox.getWhiteBox(); + + /** + * Check if C2 or JVMCI were included in the VM build + * + * @return true if either C2 or JVMCI were included in the VM build. + */ + public static boolean isC2OrJVMCIIncluded() { + return WB.isC2OrJVMCIIncluded(); + } + + /** + * Check if JVMCI is enabled. + * + * @return true if JVMCI is enabled + */ + public static boolean isJVMCIEnabled() { + Boolean enableJvmci = WB.getBooleanVMFlag("EnableJVMCI"); + if (enableJvmci == null || !enableJvmci) { + return false; + } + + return true; + } + + /** + * Check if Graal is used as JIT compiler. + * + * Graal is enabled if following conditions are true: + * - we are not in Interpreter mode + * - UseJVMCICompiler flag is true + * - jvmci.Compiler variable is equal to 'graal' + * - TieredCompilation is not used or TieredStopAtLevel is greater than 3 + * No need to check client mode because it set UseJVMCICompiler to false. + * + * @return true if Graal is used as JIT compiler. + */ + public static boolean isGraalEnabled() { + Boolean useCompiler = WB.getBooleanVMFlag("UseCompiler"); + if (useCompiler == null || !useCompiler) { + return false; + } + Boolean useJvmciComp = WB.getBooleanVMFlag("UseJVMCICompiler"); + if (useJvmciComp == null || !useJvmciComp) { + return false; + } + + Boolean tieredCompilation = WB.getBooleanVMFlag("TieredCompilation"); + Long compLevel = WB.getIntxVMFlag("TieredStopAtLevel"); + // if TieredCompilation is enabled and compilation level is <= 3 then no Graal is used + if (tieredCompilation != null && tieredCompilation && + compLevel != null && compLevel <= 3) { + return false; + } + return true; + } + + /** + * Check if C2 is used as JIT compiler. + * + * C2 is enabled if following conditions are true: + * - we are not in Interpreter mode + * - we are in Server compilation mode + * - TieredCompilation is not used or TieredStopAtLevel is greater than 3 + * - Graal is not used + * + * @return true if C2 is used as JIT compiler. + */ + public static boolean isC2Enabled() { + Boolean useCompiler = WB.getBooleanVMFlag("UseCompiler"); + if (useCompiler == null || !useCompiler) { + return false; + } + Boolean serverMode = WB.getBooleanVMFlag("ProfileInterpreter"); + if (serverMode == null || !serverMode) { + return false; + } + + Boolean tieredCompilation = WB.getBooleanVMFlag("TieredCompilation"); + Long compLevel = WB.getIntxVMFlag("TieredStopAtLevel"); + // if TieredCompilation is enabled and compilation level is <= 3 then no Graal is used + if (tieredCompilation != null && tieredCompilation && + compLevel != null && compLevel <= 3) { + return false; + } + + if (isGraalEnabled()) { + return false; + } + + return true; + } + + /* + * Check if C1 is used as JIT compiler. + * + * C1 is enabled if following conditions are true: + * - we are not in Interpreter mode + * - we are not in Server compilation mode + * - TieredCompilation is used in Server mode + * + * @return true if C1 is used as JIT compiler. + */ + public static boolean isC1Enabled() { + Boolean useCompiler = WB.getBooleanVMFlag("UseCompiler"); + if (useCompiler == null || !useCompiler) { + return false; + } + Boolean serverMode = WB.getBooleanVMFlag("ProfileInterpreter"); + if (serverMode == null || !serverMode) { + return true; // Client mode + } + + Boolean tieredCompilation = WB.getBooleanVMFlag("TieredCompilation"); + // C1 is not used in server mode if TieredCompilation is off. + if (tieredCompilation != null && !tieredCompilation) { + return false; + } + return true; + } + + /* + * Determine if the compiler corresponding to the compilation level 'compLevel' + * provides an intrinsic for 'class'.'method'. + */ + public static boolean isIntrinsicAvailable(int compLevel, String klass, String method, Class... parameterTypes) { + Executable intrinsicMethod; + try { + intrinsicMethod = Class.forName(klass).getDeclaredMethod(method, parameterTypes); + } catch (NoSuchMethodException e) { + throw new RuntimeException("Test bug, '" + method + "' method unavailable. " + e); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Test bug, '" + klass + "' class unavailable. " + e); + } + return WB.isIntrinsicAvailable(intrinsicMethod, compLevel); + } +} diff --git a/test/lib/jdk/test/whitebox/code/NMethod.java b/test/lib/jdk/test/whitebox/code/NMethod.java new file mode 100644 index 00000000000..6092b1037db --- /dev/null +++ b/test/lib/jdk/test/whitebox/code/NMethod.java @@ -0,0 +1,58 @@ +/* + * 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 jdk.test.whitebox.code; + +import java.lang.reflect.Executable; +import jdk.test.whitebox.WhiteBox; + +public class NMethod extends CodeBlob { + private static final WhiteBox wb = WhiteBox.getWhiteBox(); + public static NMethod get(Executable method, boolean isOsr) { + Object[] obj = wb.getNMethod(method, isOsr); + return obj == null ? null : new NMethod(obj); + } + private NMethod(Object[] obj) { + super((Object[])obj[0]); + assert obj.length == 5; + comp_level = (Integer) obj[1]; + insts = (byte[]) obj[2]; + compile_id = (Integer) obj[3]; + entry_point = (Long) obj[4]; + } + public final byte[] insts; + public final int comp_level; + public final int compile_id; + public final long entry_point; + + @Override + public String toString() { + return "NMethod{" + + super.toString() + + ", insts=" + insts + + ", comp_level=" + comp_level + + ", compile_id=" + compile_id + + ", entry_point=" + entry_point + + '}'; + } +} diff --git a/test/lib/jdk/test/whitebox/cpuinfo/CPUInfo.java b/test/lib/jdk/test/whitebox/cpuinfo/CPUInfo.java new file mode 100644 index 00000000000..98ab5021727 --- /dev/null +++ b/test/lib/jdk/test/whitebox/cpuinfo/CPUInfo.java @@ -0,0 +1,96 @@ +/* + * 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 jdk.test.whitebox.cpuinfo; + +import java.util.List; +import java.util.Arrays; +import java.util.Collections; +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import jdk.test.whitebox.WhiteBox; + +/** + * Information about CPU on test box. + * + * CPUInfo uses WhiteBox to gather information, + * so WhiteBox class should be added to bootclasspath + * and option -XX:+WhiteBoxAPI should be explicitly + * specified on command line. + */ +public class CPUInfo { + + private static final List features; + private static final String additionalCPUInfo; + + static { + WhiteBox wb = WhiteBox.getWhiteBox(); + + Pattern additionalCPUInfoRE = + Pattern.compile("([^(]*\\([^)]*\\)[^,]*),\\s*"); + + String cpuFeaturesString = wb.getCPUFeatures(); + Matcher matcher = additionalCPUInfoRE.matcher(cpuFeaturesString); + if (matcher.find()) { + additionalCPUInfo = matcher.group(1); + } else { + additionalCPUInfo = ""; + } + String splittedFeatures[] = matcher.replaceAll("").split("(, )| "); + + features = Collections.unmodifiableList(Arrays. + asList(splittedFeatures)); + } + + /** + * Get additional information about CPU. + * For example, on X86 in will be family/model/stepping + * and number of cores. + * + * @return additional CPU info + */ + public static String getAdditionalCPUInfo() { + return additionalCPUInfo; + } + + /** + * Get all known features supported by CPU. + * + * @return unmodifiable list with names of all known features + * supported by CPU. + */ + public static List getFeatures() { + return features; + } + + /** + * Check if some feature is supported by CPU. + * + * @param feature Name of feature to be tested. + * @return true if tested feature is supported by CPU. + */ + public static boolean hasFeature(String feature) { + return features.contains(feature.toLowerCase()); + } +} diff --git a/test/lib/jdk/test/whitebox/gc/GC.java b/test/lib/jdk/test/whitebox/gc/GC.java new file mode 100644 index 00000000000..ddcb6e554d4 --- /dev/null +++ b/test/lib/jdk/test/whitebox/gc/GC.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016, 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 jdk.test.whitebox.gc; + +import jdk.test.whitebox.WhiteBox; + +/** + * API to obtain information about selected and supported Garbage Collectors + * retrieved from the VM with the WhiteBox API. + */ +public enum GC { + /* + * Enum values must match CollectedHeap::Name + */ + Serial(1), + Parallel(2), + G1(3), + Epsilon(4), + Z(5), + Shenandoah(6); + + private static final WhiteBox WB = WhiteBox.getWhiteBox(); + + private final int name; + + private GC(int name) { + this.name = name; + } + + /** + * @return true if this GC is supported by the VM, i.e., it is built into the VM. + */ + public boolean isSupported() { + return WB.isGCSupported(name); + } + + /** + * @return true if this GC is supported by the JVMCI compiler + */ + public boolean isSupportedByJVMCICompiler() { + return WB.isGCSupportedByJVMCICompiler(name); + } + + /** + * @return true if this GC is currently selected/used + */ + public boolean isSelected() { + return WB.isGCSelected(name); + } + + /** + * @return true if GC was selected ergonomically, as opposed + * to being explicitly specified on the command line + */ + public static boolean isSelectedErgonomically() { + return WB.isGCSelectedErgonomically(); + } + + /** + * @return the selected GC. + */ + public static GC selected() { + for (GC gc : values()) { + if (gc.isSelected()) { + return gc; + } + } + throw new IllegalStateException("No selected GC found"); + } +} diff --git a/test/lib/sun/hotspot/parser/DiagnosticCommand.java b/test/lib/jdk/test/whitebox/parser/DiagnosticCommand.java similarity index 95% rename from test/lib/sun/hotspot/parser/DiagnosticCommand.java rename to test/lib/jdk/test/whitebox/parser/DiagnosticCommand.java index 1ad6217ad59..adb699bac6a 100644 --- a/test/lib/sun/hotspot/parser/DiagnosticCommand.java +++ b/test/lib/jdk/test/whitebox/parser/DiagnosticCommand.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -21,7 +21,7 @@ * questions. */ -package sun.hotspot.parser; +package jdk.test.whitebox.parser; public class DiagnosticCommand { diff --git a/test/lib/sun/hotspot/WhiteBox.java b/test/lib/sun/hotspot/WhiteBox.java index dd5cc95e103..f00420d31ff 100644 --- a/test/lib/sun/hotspot/WhiteBox.java +++ b/test/lib/sun/hotspot/WhiteBox.java @@ -32,8 +32,9 @@ import java.security.BasicPermission; import java.util.Objects; -import sun.hotspot.parser.DiagnosticCommand; +import jdk.test.whitebox.parser.DiagnosticCommand; +@Deprecated public class WhiteBox { @SuppressWarnings("serial") public static class WhiteBoxPermission extends BasicPermission { @@ -58,7 +59,7 @@ public synchronized static WhiteBox getWhiteBox() { @SuppressWarnings("removal") SecurityManager sm = System.getSecurityManager(); if (sm != null) { - sm.checkPermission(new WhiteBoxPermission("getInstance")); + throw new SecurityException("can't use old whitebox with SecurityManager, please switch to jdk.test.whitebox.WhiteBox"); } return instance; } diff --git a/test/lib/sun/hotspot/code/CodeBlob.java b/test/lib/sun/hotspot/code/CodeBlob.java index 8050c38ef16..98076e052ce 100644 --- a/test/lib/sun/hotspot/code/CodeBlob.java +++ b/test/lib/sun/hotspot/code/CodeBlob.java @@ -25,6 +25,7 @@ import sun.hotspot.WhiteBox; +@Deprecated public class CodeBlob { private static final WhiteBox WB = WhiteBox.getWhiteBox(); public static CodeBlob[] getCodeBlobs(BlobType type) { diff --git a/test/lib/sun/hotspot/code/NMethod.java b/test/lib/sun/hotspot/code/NMethod.java index f7ebf752299..2f870396a59 100644 --- a/test/lib/sun/hotspot/code/NMethod.java +++ b/test/lib/sun/hotspot/code/NMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -26,6 +26,7 @@ import java.lang.reflect.Executable; import sun.hotspot.WhiteBox; +@Deprecated public class NMethod extends CodeBlob { private static final WhiteBox wb = WhiteBox.getWhiteBox(); public static NMethod get(Executable method, boolean isOsr) { diff --git a/test/lib/sun/hotspot/cpuinfo/CPUInfo.java b/test/lib/sun/hotspot/cpuinfo/CPUInfo.java index ae740884de6..3f1a8bdc4a0 100644 --- a/test/lib/sun/hotspot/cpuinfo/CPUInfo.java +++ b/test/lib/sun/hotspot/cpuinfo/CPUInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -39,6 +39,7 @@ * and option -XX:+WhiteBoxAPI should be explicitly * specified on command line. */ +@Deprecated public class CPUInfo { private static final List features; diff --git a/test/micro/org/openjdk/bench/vm/gc/RawAllocationRate.java b/test/micro/org/openjdk/bench/vm/gc/RawAllocationRate.java new file mode 100644 index 00000000000..4faf3e19535 --- /dev/null +++ b/test/micro/org/openjdk/bench/vm/gc/RawAllocationRate.java @@ -0,0 +1,28732 @@ +/* + * Copyright (c) 2021, 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. + */ +package org.openjdk.bench.vm.gc; + +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +// Test the raw allocation rate for long arrays. Allocate 1 megabyte +// of memory, in chunks of varying size. The resulting score is the +// allocation rate in megabytes per second. + +@OutputTimeUnit(TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1) +@Warmup(iterations = 15, time = 1) +@Fork(value = 1) +@State(Scope.Thread) +public class RawAllocationRate { + + @Param({"32", "64", "256", "1024", "2048", "4096", "8192", "16384", "65536", "131072"}) // Object size in bytes. + public int size; + + Object[] objects; + + private static final long megabyte = 1024 * 1024; + private static final long bytesPerLong = 8; + private static final int longsPerHeader = 2; + + @Setup(Level.Iteration) + public void up() throws Throwable { + if (size % bytesPerLong != 0) { + throw new RuntimeException("I'm sorry Dave, I can't do that"); + } + objects = new Object[1_000_000]; + } + + @TearDown(Level.Iteration) + public void down() throws Throwable { + objects = null; + } + + @Benchmark + public Object[] arrayTest() { + var arrays = objects; + final int longElements = (int)(size/bytesPerLong) - longsPerHeader; + int i, j; + for (i = 0, j = 0; ; i += size, j++) { + if (i + size < megabyte) { + arrays[j] = new long[longElements]; + } else { + long remaining = megabyte - i; + int elements = (int)(remaining/bytesPerLong) - longsPerHeader; + if (elements >= 0) { + arrays[j] = new long[elements]; + } + break; + } + } + return arrays; + } + + @Benchmark + @Fork(jvmArgsAppend={"-XX:TieredStopAtLevel=1"}) + public Object[] arrayTest_C1() { + return arrayTest(); + } + + @Benchmark + public Object[] instanceTest() { + var objects = this.objects; + final int longElements = (int)(size); + int i, j; + for (i = 0, j = 0; ; i += size, j++) { + if (i + size < megabyte) { + objects[j] = newInstance(longElements); + } else { + long remaining = megabyte - i; + int elements = (int)(remaining/bytesPerLong) - longsPerHeader; + if (elements >= 0) { + objects[j] = new long[elements]; + } + break; + } + } + return objects; + } + + @Benchmark + @Fork(jvmArgsAppend={"-XX:TieredStopAtLevel=1"}) + public Object[] instanceTest_C1() { + return instanceTest(); + } + + static class BaseClass { + } + + static class Class32 extends BaseClass { + long i0; + long i1; + } + static class Class64 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + } + static class Class256 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + long i6; + long i7; + long i8; + long i9; + long i10; + long i11; + long i12; + long i13; + long i14; + long i15; + long i16; + long i17; + long i18; + long i19; + long i20; + long i21; + long i22; + long i23; + long i24; + long i25; + long i26; + long i27; + long i28; + long i29; + } + static class Class1024 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + long i6; + long i7; + long i8; + long i9; + long i10; + long i11; + long i12; + long i13; + long i14; + long i15; + long i16; + long i17; + long i18; + long i19; + long i20; + long i21; + long i22; + long i23; + long i24; + long i25; + long i26; + long i27; + long i28; + long i29; + long i30; + long i31; + long i32; + long i33; + long i34; + long i35; + long i36; + long i37; + long i38; + long i39; + long i40; + long i41; + long i42; + long i43; + long i44; + long i45; + long i46; + long i47; + long i48; + long i49; + long i50; + long i51; + long i52; + long i53; + long i54; + long i55; + long i56; + long i57; + long i58; + long i59; + long i60; + long i61; + long i62; + long i63; + long i64; + long i65; + long i66; + long i67; + long i68; + long i69; + long i70; + long i71; + long i72; + long i73; + long i74; + long i75; + long i76; + long i77; + long i78; + long i79; + long i80; + long i81; + long i82; + long i83; + long i84; + long i85; + long i86; + long i87; + long i88; + long i89; + long i90; + long i91; + long i92; + long i93; + long i94; + long i95; + long i96; + long i97; + long i98; + long i99; + long i100; + long i101; + long i102; + long i103; + long i104; + long i105; + long i106; + long i107; + long i108; + long i109; + long i110; + long i111; + long i112; + long i113; + long i114; + long i115; + long i116; + long i117; + long i118; + long i119; + long i120; + long i121; + long i122; + long i123; + long i124; + long i125; + } + static class Class2048 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + long i6; + long i7; + long i8; + long i9; + long i10; + long i11; + long i12; + long i13; + long i14; + long i15; + long i16; + long i17; + long i18; + long i19; + long i20; + long i21; + long i22; + long i23; + long i24; + long i25; + long i26; + long i27; + long i28; + long i29; + long i30; + long i31; + long i32; + long i33; + long i34; + long i35; + long i36; + long i37; + long i38; + long i39; + long i40; + long i41; + long i42; + long i43; + long i44; + long i45; + long i46; + long i47; + long i48; + long i49; + long i50; + long i51; + long i52; + long i53; + long i54; + long i55; + long i56; + long i57; + long i58; + long i59; + long i60; + long i61; + long i62; + long i63; + long i64; + long i65; + long i66; + long i67; + long i68; + long i69; + long i70; + long i71; + long i72; + long i73; + long i74; + long i75; + long i76; + long i77; + long i78; + long i79; + long i80; + long i81; + long i82; + long i83; + long i84; + long i85; + long i86; + long i87; + long i88; + long i89; + long i90; + long i91; + long i92; + long i93; + long i94; + long i95; + long i96; + long i97; + long i98; + long i99; + long i100; + long i101; + long i102; + long i103; + long i104; + long i105; + long i106; + long i107; + long i108; + long i109; + long i110; + long i111; + long i112; + long i113; + long i114; + long i115; + long i116; + long i117; + long i118; + long i119; + long i120; + long i121; + long i122; + long i123; + long i124; + long i125; + long i126; + long i127; + long i128; + long i129; + long i130; + long i131; + long i132; + long i133; + long i134; + long i135; + long i136; + long i137; + long i138; + long i139; + long i140; + long i141; + long i142; + long i143; + long i144; + long i145; + long i146; + long i147; + long i148; + long i149; + long i150; + long i151; + long i152; + long i153; + long i154; + long i155; + long i156; + long i157; + long i158; + long i159; + long i160; + long i161; + long i162; + long i163; + long i164; + long i165; + long i166; + long i167; + long i168; + long i169; + long i170; + long i171; + long i172; + long i173; + long i174; + long i175; + long i176; + long i177; + long i178; + long i179; + long i180; + long i181; + long i182; + long i183; + long i184; + long i185; + long i186; + long i187; + long i188; + long i189; + long i190; + long i191; + long i192; + long i193; + long i194; + long i195; + long i196; + long i197; + long i198; + long i199; + long i200; + long i201; + long i202; + long i203; + long i204; + long i205; + long i206; + long i207; + long i208; + long i209; + long i210; + long i211; + long i212; + long i213; + long i214; + long i215; + long i216; + long i217; + long i218; + long i219; + long i220; + long i221; + long i222; + long i223; + long i224; + long i225; + long i226; + long i227; + long i228; + long i229; + long i230; + long i231; + long i232; + long i233; + long i234; + long i235; + long i236; + long i237; + long i238; + long i239; + long i240; + long i241; + long i242; + long i243; + long i244; + long i245; + long i246; + long i247; + long i248; + long i249; + long i250; + long i251; + long i252; + long i253; + } + static class Class4096 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + long i6; + long i7; + long i8; + long i9; + long i10; + long i11; + long i12; + long i13; + long i14; + long i15; + long i16; + long i17; + long i18; + long i19; + long i20; + long i21; + long i22; + long i23; + long i24; + long i25; + long i26; + long i27; + long i28; + long i29; + long i30; + long i31; + long i32; + long i33; + long i34; + long i35; + long i36; + long i37; + long i38; + long i39; + long i40; + long i41; + long i42; + long i43; + long i44; + long i45; + long i46; + long i47; + long i48; + long i49; + long i50; + long i51; + long i52; + long i53; + long i54; + long i55; + long i56; + long i57; + long i58; + long i59; + long i60; + long i61; + long i62; + long i63; + long i64; + long i65; + long i66; + long i67; + long i68; + long i69; + long i70; + long i71; + long i72; + long i73; + long i74; + long i75; + long i76; + long i77; + long i78; + long i79; + long i80; + long i81; + long i82; + long i83; + long i84; + long i85; + long i86; + long i87; + long i88; + long i89; + long i90; + long i91; + long i92; + long i93; + long i94; + long i95; + long i96; + long i97; + long i98; + long i99; + long i100; + long i101; + long i102; + long i103; + long i104; + long i105; + long i106; + long i107; + long i108; + long i109; + long i110; + long i111; + long i112; + long i113; + long i114; + long i115; + long i116; + long i117; + long i118; + long i119; + long i120; + long i121; + long i122; + long i123; + long i124; + long i125; + long i126; + long i127; + long i128; + long i129; + long i130; + long i131; + long i132; + long i133; + long i134; + long i135; + long i136; + long i137; + long i138; + long i139; + long i140; + long i141; + long i142; + long i143; + long i144; + long i145; + long i146; + long i147; + long i148; + long i149; + long i150; + long i151; + long i152; + long i153; + long i154; + long i155; + long i156; + long i157; + long i158; + long i159; + long i160; + long i161; + long i162; + long i163; + long i164; + long i165; + long i166; + long i167; + long i168; + long i169; + long i170; + long i171; + long i172; + long i173; + long i174; + long i175; + long i176; + long i177; + long i178; + long i179; + long i180; + long i181; + long i182; + long i183; + long i184; + long i185; + long i186; + long i187; + long i188; + long i189; + long i190; + long i191; + long i192; + long i193; + long i194; + long i195; + long i196; + long i197; + long i198; + long i199; + long i200; + long i201; + long i202; + long i203; + long i204; + long i205; + long i206; + long i207; + long i208; + long i209; + long i210; + long i211; + long i212; + long i213; + long i214; + long i215; + long i216; + long i217; + long i218; + long i219; + long i220; + long i221; + long i222; + long i223; + long i224; + long i225; + long i226; + long i227; + long i228; + long i229; + long i230; + long i231; + long i232; + long i233; + long i234; + long i235; + long i236; + long i237; + long i238; + long i239; + long i240; + long i241; + long i242; + long i243; + long i244; + long i245; + long i246; + long i247; + long i248; + long i249; + long i250; + long i251; + long i252; + long i253; + long i254; + long i255; + long i256; + long i257; + long i258; + long i259; + long i260; + long i261; + long i262; + long i263; + long i264; + long i265; + long i266; + long i267; + long i268; + long i269; + long i270; + long i271; + long i272; + long i273; + long i274; + long i275; + long i276; + long i277; + long i278; + long i279; + long i280; + long i281; + long i282; + long i283; + long i284; + long i285; + long i286; + long i287; + long i288; + long i289; + long i290; + long i291; + long i292; + long i293; + long i294; + long i295; + long i296; + long i297; + long i298; + long i299; + long i300; + long i301; + long i302; + long i303; + long i304; + long i305; + long i306; + long i307; + long i308; + long i309; + long i310; + long i311; + long i312; + long i313; + long i314; + long i315; + long i316; + long i317; + long i318; + long i319; + long i320; + long i321; + long i322; + long i323; + long i324; + long i325; + long i326; + long i327; + long i328; + long i329; + long i330; + long i331; + long i332; + long i333; + long i334; + long i335; + long i336; + long i337; + long i338; + long i339; + long i340; + long i341; + long i342; + long i343; + long i344; + long i345; + long i346; + long i347; + long i348; + long i349; + long i350; + long i351; + long i352; + long i353; + long i354; + long i355; + long i356; + long i357; + long i358; + long i359; + long i360; + long i361; + long i362; + long i363; + long i364; + long i365; + long i366; + long i367; + long i368; + long i369; + long i370; + long i371; + long i372; + long i373; + long i374; + long i375; + long i376; + long i377; + long i378; + long i379; + long i380; + long i381; + long i382; + long i383; + long i384; + long i385; + long i386; + long i387; + long i388; + long i389; + long i390; + long i391; + long i392; + long i393; + long i394; + long i395; + long i396; + long i397; + long i398; + long i399; + long i400; + long i401; + long i402; + long i403; + long i404; + long i405; + long i406; + long i407; + long i408; + long i409; + long i410; + long i411; + long i412; + long i413; + long i414; + long i415; + long i416; + long i417; + long i418; + long i419; + long i420; + long i421; + long i422; + long i423; + long i424; + long i425; + long i426; + long i427; + long i428; + long i429; + long i430; + long i431; + long i432; + long i433; + long i434; + long i435; + long i436; + long i437; + long i438; + long i439; + long i440; + long i441; + long i442; + long i443; + long i444; + long i445; + long i446; + long i447; + long i448; + long i449; + long i450; + long i451; + long i452; + long i453; + long i454; + long i455; + long i456; + long i457; + long i458; + long i459; + long i460; + long i461; + long i462; + long i463; + long i464; + long i465; + long i466; + long i467; + long i468; + long i469; + long i470; + long i471; + long i472; + long i473; + long i474; + long i475; + long i476; + long i477; + long i478; + long i479; + long i480; + long i481; + long i482; + long i483; + long i484; + long i485; + long i486; + long i487; + long i488; + long i489; + long i490; + long i491; + long i492; + long i493; + long i494; + long i495; + long i496; + long i497; + long i498; + long i499; + long i500; + long i501; + long i502; + long i503; + long i504; + long i505; + long i506; + long i507; + long i508; + long i509; + } + static class Class8192 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + long i6; + long i7; + long i8; + long i9; + long i10; + long i11; + long i12; + long i13; + long i14; + long i15; + long i16; + long i17; + long i18; + long i19; + long i20; + long i21; + long i22; + long i23; + long i24; + long i25; + long i26; + long i27; + long i28; + long i29; + long i30; + long i31; + long i32; + long i33; + long i34; + long i35; + long i36; + long i37; + long i38; + long i39; + long i40; + long i41; + long i42; + long i43; + long i44; + long i45; + long i46; + long i47; + long i48; + long i49; + long i50; + long i51; + long i52; + long i53; + long i54; + long i55; + long i56; + long i57; + long i58; + long i59; + long i60; + long i61; + long i62; + long i63; + long i64; + long i65; + long i66; + long i67; + long i68; + long i69; + long i70; + long i71; + long i72; + long i73; + long i74; + long i75; + long i76; + long i77; + long i78; + long i79; + long i80; + long i81; + long i82; + long i83; + long i84; + long i85; + long i86; + long i87; + long i88; + long i89; + long i90; + long i91; + long i92; + long i93; + long i94; + long i95; + long i96; + long i97; + long i98; + long i99; + long i100; + long i101; + long i102; + long i103; + long i104; + long i105; + long i106; + long i107; + long i108; + long i109; + long i110; + long i111; + long i112; + long i113; + long i114; + long i115; + long i116; + long i117; + long i118; + long i119; + long i120; + long i121; + long i122; + long i123; + long i124; + long i125; + long i126; + long i127; + long i128; + long i129; + long i130; + long i131; + long i132; + long i133; + long i134; + long i135; + long i136; + long i137; + long i138; + long i139; + long i140; + long i141; + long i142; + long i143; + long i144; + long i145; + long i146; + long i147; + long i148; + long i149; + long i150; + long i151; + long i152; + long i153; + long i154; + long i155; + long i156; + long i157; + long i158; + long i159; + long i160; + long i161; + long i162; + long i163; + long i164; + long i165; + long i166; + long i167; + long i168; + long i169; + long i170; + long i171; + long i172; + long i173; + long i174; + long i175; + long i176; + long i177; + long i178; + long i179; + long i180; + long i181; + long i182; + long i183; + long i184; + long i185; + long i186; + long i187; + long i188; + long i189; + long i190; + long i191; + long i192; + long i193; + long i194; + long i195; + long i196; + long i197; + long i198; + long i199; + long i200; + long i201; + long i202; + long i203; + long i204; + long i205; + long i206; + long i207; + long i208; + long i209; + long i210; + long i211; + long i212; + long i213; + long i214; + long i215; + long i216; + long i217; + long i218; + long i219; + long i220; + long i221; + long i222; + long i223; + long i224; + long i225; + long i226; + long i227; + long i228; + long i229; + long i230; + long i231; + long i232; + long i233; + long i234; + long i235; + long i236; + long i237; + long i238; + long i239; + long i240; + long i241; + long i242; + long i243; + long i244; + long i245; + long i246; + long i247; + long i248; + long i249; + long i250; + long i251; + long i252; + long i253; + long i254; + long i255; + long i256; + long i257; + long i258; + long i259; + long i260; + long i261; + long i262; + long i263; + long i264; + long i265; + long i266; + long i267; + long i268; + long i269; + long i270; + long i271; + long i272; + long i273; + long i274; + long i275; + long i276; + long i277; + long i278; + long i279; + long i280; + long i281; + long i282; + long i283; + long i284; + long i285; + long i286; + long i287; + long i288; + long i289; + long i290; + long i291; + long i292; + long i293; + long i294; + long i295; + long i296; + long i297; + long i298; + long i299; + long i300; + long i301; + long i302; + long i303; + long i304; + long i305; + long i306; + long i307; + long i308; + long i309; + long i310; + long i311; + long i312; + long i313; + long i314; + long i315; + long i316; + long i317; + long i318; + long i319; + long i320; + long i321; + long i322; + long i323; + long i324; + long i325; + long i326; + long i327; + long i328; + long i329; + long i330; + long i331; + long i332; + long i333; + long i334; + long i335; + long i336; + long i337; + long i338; + long i339; + long i340; + long i341; + long i342; + long i343; + long i344; + long i345; + long i346; + long i347; + long i348; + long i349; + long i350; + long i351; + long i352; + long i353; + long i354; + long i355; + long i356; + long i357; + long i358; + long i359; + long i360; + long i361; + long i362; + long i363; + long i364; + long i365; + long i366; + long i367; + long i368; + long i369; + long i370; + long i371; + long i372; + long i373; + long i374; + long i375; + long i376; + long i377; + long i378; + long i379; + long i380; + long i381; + long i382; + long i383; + long i384; + long i385; + long i386; + long i387; + long i388; + long i389; + long i390; + long i391; + long i392; + long i393; + long i394; + long i395; + long i396; + long i397; + long i398; + long i399; + long i400; + long i401; + long i402; + long i403; + long i404; + long i405; + long i406; + long i407; + long i408; + long i409; + long i410; + long i411; + long i412; + long i413; + long i414; + long i415; + long i416; + long i417; + long i418; + long i419; + long i420; + long i421; + long i422; + long i423; + long i424; + long i425; + long i426; + long i427; + long i428; + long i429; + long i430; + long i431; + long i432; + long i433; + long i434; + long i435; + long i436; + long i437; + long i438; + long i439; + long i440; + long i441; + long i442; + long i443; + long i444; + long i445; + long i446; + long i447; + long i448; + long i449; + long i450; + long i451; + long i452; + long i453; + long i454; + long i455; + long i456; + long i457; + long i458; + long i459; + long i460; + long i461; + long i462; + long i463; + long i464; + long i465; + long i466; + long i467; + long i468; + long i469; + long i470; + long i471; + long i472; + long i473; + long i474; + long i475; + long i476; + long i477; + long i478; + long i479; + long i480; + long i481; + long i482; + long i483; + long i484; + long i485; + long i486; + long i487; + long i488; + long i489; + long i490; + long i491; + long i492; + long i493; + long i494; + long i495; + long i496; + long i497; + long i498; + long i499; + long i500; + long i501; + long i502; + long i503; + long i504; + long i505; + long i506; + long i507; + long i508; + long i509; + long i510; + long i511; + long i512; + long i513; + long i514; + long i515; + long i516; + long i517; + long i518; + long i519; + long i520; + long i521; + long i522; + long i523; + long i524; + long i525; + long i526; + long i527; + long i528; + long i529; + long i530; + long i531; + long i532; + long i533; + long i534; + long i535; + long i536; + long i537; + long i538; + long i539; + long i540; + long i541; + long i542; + long i543; + long i544; + long i545; + long i546; + long i547; + long i548; + long i549; + long i550; + long i551; + long i552; + long i553; + long i554; + long i555; + long i556; + long i557; + long i558; + long i559; + long i560; + long i561; + long i562; + long i563; + long i564; + long i565; + long i566; + long i567; + long i568; + long i569; + long i570; + long i571; + long i572; + long i573; + long i574; + long i575; + long i576; + long i577; + long i578; + long i579; + long i580; + long i581; + long i582; + long i583; + long i584; + long i585; + long i586; + long i587; + long i588; + long i589; + long i590; + long i591; + long i592; + long i593; + long i594; + long i595; + long i596; + long i597; + long i598; + long i599; + long i600; + long i601; + long i602; + long i603; + long i604; + long i605; + long i606; + long i607; + long i608; + long i609; + long i610; + long i611; + long i612; + long i613; + long i614; + long i615; + long i616; + long i617; + long i618; + long i619; + long i620; + long i621; + long i622; + long i623; + long i624; + long i625; + long i626; + long i627; + long i628; + long i629; + long i630; + long i631; + long i632; + long i633; + long i634; + long i635; + long i636; + long i637; + long i638; + long i639; + long i640; + long i641; + long i642; + long i643; + long i644; + long i645; + long i646; + long i647; + long i648; + long i649; + long i650; + long i651; + long i652; + long i653; + long i654; + long i655; + long i656; + long i657; + long i658; + long i659; + long i660; + long i661; + long i662; + long i663; + long i664; + long i665; + long i666; + long i667; + long i668; + long i669; + long i670; + long i671; + long i672; + long i673; + long i674; + long i675; + long i676; + long i677; + long i678; + long i679; + long i680; + long i681; + long i682; + long i683; + long i684; + long i685; + long i686; + long i687; + long i688; + long i689; + long i690; + long i691; + long i692; + long i693; + long i694; + long i695; + long i696; + long i697; + long i698; + long i699; + long i700; + long i701; + long i702; + long i703; + long i704; + long i705; + long i706; + long i707; + long i708; + long i709; + long i710; + long i711; + long i712; + long i713; + long i714; + long i715; + long i716; + long i717; + long i718; + long i719; + long i720; + long i721; + long i722; + long i723; + long i724; + long i725; + long i726; + long i727; + long i728; + long i729; + long i730; + long i731; + long i732; + long i733; + long i734; + long i735; + long i736; + long i737; + long i738; + long i739; + long i740; + long i741; + long i742; + long i743; + long i744; + long i745; + long i746; + long i747; + long i748; + long i749; + long i750; + long i751; + long i752; + long i753; + long i754; + long i755; + long i756; + long i757; + long i758; + long i759; + long i760; + long i761; + long i762; + long i763; + long i764; + long i765; + long i766; + long i767; + long i768; + long i769; + long i770; + long i771; + long i772; + long i773; + long i774; + long i775; + long i776; + long i777; + long i778; + long i779; + long i780; + long i781; + long i782; + long i783; + long i784; + long i785; + long i786; + long i787; + long i788; + long i789; + long i790; + long i791; + long i792; + long i793; + long i794; + long i795; + long i796; + long i797; + long i798; + long i799; + long i800; + long i801; + long i802; + long i803; + long i804; + long i805; + long i806; + long i807; + long i808; + long i809; + long i810; + long i811; + long i812; + long i813; + long i814; + long i815; + long i816; + long i817; + long i818; + long i819; + long i820; + long i821; + long i822; + long i823; + long i824; + long i825; + long i826; + long i827; + long i828; + long i829; + long i830; + long i831; + long i832; + long i833; + long i834; + long i835; + long i836; + long i837; + long i838; + long i839; + long i840; + long i841; + long i842; + long i843; + long i844; + long i845; + long i846; + long i847; + long i848; + long i849; + long i850; + long i851; + long i852; + long i853; + long i854; + long i855; + long i856; + long i857; + long i858; + long i859; + long i860; + long i861; + long i862; + long i863; + long i864; + long i865; + long i866; + long i867; + long i868; + long i869; + long i870; + long i871; + long i872; + long i873; + long i874; + long i875; + long i876; + long i877; + long i878; + long i879; + long i880; + long i881; + long i882; + long i883; + long i884; + long i885; + long i886; + long i887; + long i888; + long i889; + long i890; + long i891; + long i892; + long i893; + long i894; + long i895; + long i896; + long i897; + long i898; + long i899; + long i900; + long i901; + long i902; + long i903; + long i904; + long i905; + long i906; + long i907; + long i908; + long i909; + long i910; + long i911; + long i912; + long i913; + long i914; + long i915; + long i916; + long i917; + long i918; + long i919; + long i920; + long i921; + long i922; + long i923; + long i924; + long i925; + long i926; + long i927; + long i928; + long i929; + long i930; + long i931; + long i932; + long i933; + long i934; + long i935; + long i936; + long i937; + long i938; + long i939; + long i940; + long i941; + long i942; + long i943; + long i944; + long i945; + long i946; + long i947; + long i948; + long i949; + long i950; + long i951; + long i952; + long i953; + long i954; + long i955; + long i956; + long i957; + long i958; + long i959; + long i960; + long i961; + long i962; + long i963; + long i964; + long i965; + long i966; + long i967; + long i968; + long i969; + long i970; + long i971; + long i972; + long i973; + long i974; + long i975; + long i976; + long i977; + long i978; + long i979; + long i980; + long i981; + long i982; + long i983; + long i984; + long i985; + long i986; + long i987; + long i988; + long i989; + long i990; + long i991; + long i992; + long i993; + long i994; + long i995; + long i996; + long i997; + long i998; + long i999; + long i1000; + long i1001; + long i1002; + long i1003; + long i1004; + long i1005; + long i1006; + long i1007; + long i1008; + long i1009; + long i1010; + long i1011; + long i1012; + long i1013; + long i1014; + long i1015; + long i1016; + long i1017; + long i1018; + long i1019; + long i1020; + long i1021; + } + static class Class16384 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + long i6; + long i7; + long i8; + long i9; + long i10; + long i11; + long i12; + long i13; + long i14; + long i15; + long i16; + long i17; + long i18; + long i19; + long i20; + long i21; + long i22; + long i23; + long i24; + long i25; + long i26; + long i27; + long i28; + long i29; + long i30; + long i31; + long i32; + long i33; + long i34; + long i35; + long i36; + long i37; + long i38; + long i39; + long i40; + long i41; + long i42; + long i43; + long i44; + long i45; + long i46; + long i47; + long i48; + long i49; + long i50; + long i51; + long i52; + long i53; + long i54; + long i55; + long i56; + long i57; + long i58; + long i59; + long i60; + long i61; + long i62; + long i63; + long i64; + long i65; + long i66; + long i67; + long i68; + long i69; + long i70; + long i71; + long i72; + long i73; + long i74; + long i75; + long i76; + long i77; + long i78; + long i79; + long i80; + long i81; + long i82; + long i83; + long i84; + long i85; + long i86; + long i87; + long i88; + long i89; + long i90; + long i91; + long i92; + long i93; + long i94; + long i95; + long i96; + long i97; + long i98; + long i99; + long i100; + long i101; + long i102; + long i103; + long i104; + long i105; + long i106; + long i107; + long i108; + long i109; + long i110; + long i111; + long i112; + long i113; + long i114; + long i115; + long i116; + long i117; + long i118; + long i119; + long i120; + long i121; + long i122; + long i123; + long i124; + long i125; + long i126; + long i127; + long i128; + long i129; + long i130; + long i131; + long i132; + long i133; + long i134; + long i135; + long i136; + long i137; + long i138; + long i139; + long i140; + long i141; + long i142; + long i143; + long i144; + long i145; + long i146; + long i147; + long i148; + long i149; + long i150; + long i151; + long i152; + long i153; + long i154; + long i155; + long i156; + long i157; + long i158; + long i159; + long i160; + long i161; + long i162; + long i163; + long i164; + long i165; + long i166; + long i167; + long i168; + long i169; + long i170; + long i171; + long i172; + long i173; + long i174; + long i175; + long i176; + long i177; + long i178; + long i179; + long i180; + long i181; + long i182; + long i183; + long i184; + long i185; + long i186; + long i187; + long i188; + long i189; + long i190; + long i191; + long i192; + long i193; + long i194; + long i195; + long i196; + long i197; + long i198; + long i199; + long i200; + long i201; + long i202; + long i203; + long i204; + long i205; + long i206; + long i207; + long i208; + long i209; + long i210; + long i211; + long i212; + long i213; + long i214; + long i215; + long i216; + long i217; + long i218; + long i219; + long i220; + long i221; + long i222; + long i223; + long i224; + long i225; + long i226; + long i227; + long i228; + long i229; + long i230; + long i231; + long i232; + long i233; + long i234; + long i235; + long i236; + long i237; + long i238; + long i239; + long i240; + long i241; + long i242; + long i243; + long i244; + long i245; + long i246; + long i247; + long i248; + long i249; + long i250; + long i251; + long i252; + long i253; + long i254; + long i255; + long i256; + long i257; + long i258; + long i259; + long i260; + long i261; + long i262; + long i263; + long i264; + long i265; + long i266; + long i267; + long i268; + long i269; + long i270; + long i271; + long i272; + long i273; + long i274; + long i275; + long i276; + long i277; + long i278; + long i279; + long i280; + long i281; + long i282; + long i283; + long i284; + long i285; + long i286; + long i287; + long i288; + long i289; + long i290; + long i291; + long i292; + long i293; + long i294; + long i295; + long i296; + long i297; + long i298; + long i299; + long i300; + long i301; + long i302; + long i303; + long i304; + long i305; + long i306; + long i307; + long i308; + long i309; + long i310; + long i311; + long i312; + long i313; + long i314; + long i315; + long i316; + long i317; + long i318; + long i319; + long i320; + long i321; + long i322; + long i323; + long i324; + long i325; + long i326; + long i327; + long i328; + long i329; + long i330; + long i331; + long i332; + long i333; + long i334; + long i335; + long i336; + long i337; + long i338; + long i339; + long i340; + long i341; + long i342; + long i343; + long i344; + long i345; + long i346; + long i347; + long i348; + long i349; + long i350; + long i351; + long i352; + long i353; + long i354; + long i355; + long i356; + long i357; + long i358; + long i359; + long i360; + long i361; + long i362; + long i363; + long i364; + long i365; + long i366; + long i367; + long i368; + long i369; + long i370; + long i371; + long i372; + long i373; + long i374; + long i375; + long i376; + long i377; + long i378; + long i379; + long i380; + long i381; + long i382; + long i383; + long i384; + long i385; + long i386; + long i387; + long i388; + long i389; + long i390; + long i391; + long i392; + long i393; + long i394; + long i395; + long i396; + long i397; + long i398; + long i399; + long i400; + long i401; + long i402; + long i403; + long i404; + long i405; + long i406; + long i407; + long i408; + long i409; + long i410; + long i411; + long i412; + long i413; + long i414; + long i415; + long i416; + long i417; + long i418; + long i419; + long i420; + long i421; + long i422; + long i423; + long i424; + long i425; + long i426; + long i427; + long i428; + long i429; + long i430; + long i431; + long i432; + long i433; + long i434; + long i435; + long i436; + long i437; + long i438; + long i439; + long i440; + long i441; + long i442; + long i443; + long i444; + long i445; + long i446; + long i447; + long i448; + long i449; + long i450; + long i451; + long i452; + long i453; + long i454; + long i455; + long i456; + long i457; + long i458; + long i459; + long i460; + long i461; + long i462; + long i463; + long i464; + long i465; + long i466; + long i467; + long i468; + long i469; + long i470; + long i471; + long i472; + long i473; + long i474; + long i475; + long i476; + long i477; + long i478; + long i479; + long i480; + long i481; + long i482; + long i483; + long i484; + long i485; + long i486; + long i487; + long i488; + long i489; + long i490; + long i491; + long i492; + long i493; + long i494; + long i495; + long i496; + long i497; + long i498; + long i499; + long i500; + long i501; + long i502; + long i503; + long i504; + long i505; + long i506; + long i507; + long i508; + long i509; + long i510; + long i511; + long i512; + long i513; + long i514; + long i515; + long i516; + long i517; + long i518; + long i519; + long i520; + long i521; + long i522; + long i523; + long i524; + long i525; + long i526; + long i527; + long i528; + long i529; + long i530; + long i531; + long i532; + long i533; + long i534; + long i535; + long i536; + long i537; + long i538; + long i539; + long i540; + long i541; + long i542; + long i543; + long i544; + long i545; + long i546; + long i547; + long i548; + long i549; + long i550; + long i551; + long i552; + long i553; + long i554; + long i555; + long i556; + long i557; + long i558; + long i559; + long i560; + long i561; + long i562; + long i563; + long i564; + long i565; + long i566; + long i567; + long i568; + long i569; + long i570; + long i571; + long i572; + long i573; + long i574; + long i575; + long i576; + long i577; + long i578; + long i579; + long i580; + long i581; + long i582; + long i583; + long i584; + long i585; + long i586; + long i587; + long i588; + long i589; + long i590; + long i591; + long i592; + long i593; + long i594; + long i595; + long i596; + long i597; + long i598; + long i599; + long i600; + long i601; + long i602; + long i603; + long i604; + long i605; + long i606; + long i607; + long i608; + long i609; + long i610; + long i611; + long i612; + long i613; + long i614; + long i615; + long i616; + long i617; + long i618; + long i619; + long i620; + long i621; + long i622; + long i623; + long i624; + long i625; + long i626; + long i627; + long i628; + long i629; + long i630; + long i631; + long i632; + long i633; + long i634; + long i635; + long i636; + long i637; + long i638; + long i639; + long i640; + long i641; + long i642; + long i643; + long i644; + long i645; + long i646; + long i647; + long i648; + long i649; + long i650; + long i651; + long i652; + long i653; + long i654; + long i655; + long i656; + long i657; + long i658; + long i659; + long i660; + long i661; + long i662; + long i663; + long i664; + long i665; + long i666; + long i667; + long i668; + long i669; + long i670; + long i671; + long i672; + long i673; + long i674; + long i675; + long i676; + long i677; + long i678; + long i679; + long i680; + long i681; + long i682; + long i683; + long i684; + long i685; + long i686; + long i687; + long i688; + long i689; + long i690; + long i691; + long i692; + long i693; + long i694; + long i695; + long i696; + long i697; + long i698; + long i699; + long i700; + long i701; + long i702; + long i703; + long i704; + long i705; + long i706; + long i707; + long i708; + long i709; + long i710; + long i711; + long i712; + long i713; + long i714; + long i715; + long i716; + long i717; + long i718; + long i719; + long i720; + long i721; + long i722; + long i723; + long i724; + long i725; + long i726; + long i727; + long i728; + long i729; + long i730; + long i731; + long i732; + long i733; + long i734; + long i735; + long i736; + long i737; + long i738; + long i739; + long i740; + long i741; + long i742; + long i743; + long i744; + long i745; + long i746; + long i747; + long i748; + long i749; + long i750; + long i751; + long i752; + long i753; + long i754; + long i755; + long i756; + long i757; + long i758; + long i759; + long i760; + long i761; + long i762; + long i763; + long i764; + long i765; + long i766; + long i767; + long i768; + long i769; + long i770; + long i771; + long i772; + long i773; + long i774; + long i775; + long i776; + long i777; + long i778; + long i779; + long i780; + long i781; + long i782; + long i783; + long i784; + long i785; + long i786; + long i787; + long i788; + long i789; + long i790; + long i791; + long i792; + long i793; + long i794; + long i795; + long i796; + long i797; + long i798; + long i799; + long i800; + long i801; + long i802; + long i803; + long i804; + long i805; + long i806; + long i807; + long i808; + long i809; + long i810; + long i811; + long i812; + long i813; + long i814; + long i815; + long i816; + long i817; + long i818; + long i819; + long i820; + long i821; + long i822; + long i823; + long i824; + long i825; + long i826; + long i827; + long i828; + long i829; + long i830; + long i831; + long i832; + long i833; + long i834; + long i835; + long i836; + long i837; + long i838; + long i839; + long i840; + long i841; + long i842; + long i843; + long i844; + long i845; + long i846; + long i847; + long i848; + long i849; + long i850; + long i851; + long i852; + long i853; + long i854; + long i855; + long i856; + long i857; + long i858; + long i859; + long i860; + long i861; + long i862; + long i863; + long i864; + long i865; + long i866; + long i867; + long i868; + long i869; + long i870; + long i871; + long i872; + long i873; + long i874; + long i875; + long i876; + long i877; + long i878; + long i879; + long i880; + long i881; + long i882; + long i883; + long i884; + long i885; + long i886; + long i887; + long i888; + long i889; + long i890; + long i891; + long i892; + long i893; + long i894; + long i895; + long i896; + long i897; + long i898; + long i899; + long i900; + long i901; + long i902; + long i903; + long i904; + long i905; + long i906; + long i907; + long i908; + long i909; + long i910; + long i911; + long i912; + long i913; + long i914; + long i915; + long i916; + long i917; + long i918; + long i919; + long i920; + long i921; + long i922; + long i923; + long i924; + long i925; + long i926; + long i927; + long i928; + long i929; + long i930; + long i931; + long i932; + long i933; + long i934; + long i935; + long i936; + long i937; + long i938; + long i939; + long i940; + long i941; + long i942; + long i943; + long i944; + long i945; + long i946; + long i947; + long i948; + long i949; + long i950; + long i951; + long i952; + long i953; + long i954; + long i955; + long i956; + long i957; + long i958; + long i959; + long i960; + long i961; + long i962; + long i963; + long i964; + long i965; + long i966; + long i967; + long i968; + long i969; + long i970; + long i971; + long i972; + long i973; + long i974; + long i975; + long i976; + long i977; + long i978; + long i979; + long i980; + long i981; + long i982; + long i983; + long i984; + long i985; + long i986; + long i987; + long i988; + long i989; + long i990; + long i991; + long i992; + long i993; + long i994; + long i995; + long i996; + long i997; + long i998; + long i999; + long i1000; + long i1001; + long i1002; + long i1003; + long i1004; + long i1005; + long i1006; + long i1007; + long i1008; + long i1009; + long i1010; + long i1011; + long i1012; + long i1013; + long i1014; + long i1015; + long i1016; + long i1017; + long i1018; + long i1019; + long i1020; + long i1021; + long i1022; + long i1023; + long i1024; + long i1025; + long i1026; + long i1027; + long i1028; + long i1029; + long i1030; + long i1031; + long i1032; + long i1033; + long i1034; + long i1035; + long i1036; + long i1037; + long i1038; + long i1039; + long i1040; + long i1041; + long i1042; + long i1043; + long i1044; + long i1045; + long i1046; + long i1047; + long i1048; + long i1049; + long i1050; + long i1051; + long i1052; + long i1053; + long i1054; + long i1055; + long i1056; + long i1057; + long i1058; + long i1059; + long i1060; + long i1061; + long i1062; + long i1063; + long i1064; + long i1065; + long i1066; + long i1067; + long i1068; + long i1069; + long i1070; + long i1071; + long i1072; + long i1073; + long i1074; + long i1075; + long i1076; + long i1077; + long i1078; + long i1079; + long i1080; + long i1081; + long i1082; + long i1083; + long i1084; + long i1085; + long i1086; + long i1087; + long i1088; + long i1089; + long i1090; + long i1091; + long i1092; + long i1093; + long i1094; + long i1095; + long i1096; + long i1097; + long i1098; + long i1099; + long i1100; + long i1101; + long i1102; + long i1103; + long i1104; + long i1105; + long i1106; + long i1107; + long i1108; + long i1109; + long i1110; + long i1111; + long i1112; + long i1113; + long i1114; + long i1115; + long i1116; + long i1117; + long i1118; + long i1119; + long i1120; + long i1121; + long i1122; + long i1123; + long i1124; + long i1125; + long i1126; + long i1127; + long i1128; + long i1129; + long i1130; + long i1131; + long i1132; + long i1133; + long i1134; + long i1135; + long i1136; + long i1137; + long i1138; + long i1139; + long i1140; + long i1141; + long i1142; + long i1143; + long i1144; + long i1145; + long i1146; + long i1147; + long i1148; + long i1149; + long i1150; + long i1151; + long i1152; + long i1153; + long i1154; + long i1155; + long i1156; + long i1157; + long i1158; + long i1159; + long i1160; + long i1161; + long i1162; + long i1163; + long i1164; + long i1165; + long i1166; + long i1167; + long i1168; + long i1169; + long i1170; + long i1171; + long i1172; + long i1173; + long i1174; + long i1175; + long i1176; + long i1177; + long i1178; + long i1179; + long i1180; + long i1181; + long i1182; + long i1183; + long i1184; + long i1185; + long i1186; + long i1187; + long i1188; + long i1189; + long i1190; + long i1191; + long i1192; + long i1193; + long i1194; + long i1195; + long i1196; + long i1197; + long i1198; + long i1199; + long i1200; + long i1201; + long i1202; + long i1203; + long i1204; + long i1205; + long i1206; + long i1207; + long i1208; + long i1209; + long i1210; + long i1211; + long i1212; + long i1213; + long i1214; + long i1215; + long i1216; + long i1217; + long i1218; + long i1219; + long i1220; + long i1221; + long i1222; + long i1223; + long i1224; + long i1225; + long i1226; + long i1227; + long i1228; + long i1229; + long i1230; + long i1231; + long i1232; + long i1233; + long i1234; + long i1235; + long i1236; + long i1237; + long i1238; + long i1239; + long i1240; + long i1241; + long i1242; + long i1243; + long i1244; + long i1245; + long i1246; + long i1247; + long i1248; + long i1249; + long i1250; + long i1251; + long i1252; + long i1253; + long i1254; + long i1255; + long i1256; + long i1257; + long i1258; + long i1259; + long i1260; + long i1261; + long i1262; + long i1263; + long i1264; + long i1265; + long i1266; + long i1267; + long i1268; + long i1269; + long i1270; + long i1271; + long i1272; + long i1273; + long i1274; + long i1275; + long i1276; + long i1277; + long i1278; + long i1279; + long i1280; + long i1281; + long i1282; + long i1283; + long i1284; + long i1285; + long i1286; + long i1287; + long i1288; + long i1289; + long i1290; + long i1291; + long i1292; + long i1293; + long i1294; + long i1295; + long i1296; + long i1297; + long i1298; + long i1299; + long i1300; + long i1301; + long i1302; + long i1303; + long i1304; + long i1305; + long i1306; + long i1307; + long i1308; + long i1309; + long i1310; + long i1311; + long i1312; + long i1313; + long i1314; + long i1315; + long i1316; + long i1317; + long i1318; + long i1319; + long i1320; + long i1321; + long i1322; + long i1323; + long i1324; + long i1325; + long i1326; + long i1327; + long i1328; + long i1329; + long i1330; + long i1331; + long i1332; + long i1333; + long i1334; + long i1335; + long i1336; + long i1337; + long i1338; + long i1339; + long i1340; + long i1341; + long i1342; + long i1343; + long i1344; + long i1345; + long i1346; + long i1347; + long i1348; + long i1349; + long i1350; + long i1351; + long i1352; + long i1353; + long i1354; + long i1355; + long i1356; + long i1357; + long i1358; + long i1359; + long i1360; + long i1361; + long i1362; + long i1363; + long i1364; + long i1365; + long i1366; + long i1367; + long i1368; + long i1369; + long i1370; + long i1371; + long i1372; + long i1373; + long i1374; + long i1375; + long i1376; + long i1377; + long i1378; + long i1379; + long i1380; + long i1381; + long i1382; + long i1383; + long i1384; + long i1385; + long i1386; + long i1387; + long i1388; + long i1389; + long i1390; + long i1391; + long i1392; + long i1393; + long i1394; + long i1395; + long i1396; + long i1397; + long i1398; + long i1399; + long i1400; + long i1401; + long i1402; + long i1403; + long i1404; + long i1405; + long i1406; + long i1407; + long i1408; + long i1409; + long i1410; + long i1411; + long i1412; + long i1413; + long i1414; + long i1415; + long i1416; + long i1417; + long i1418; + long i1419; + long i1420; + long i1421; + long i1422; + long i1423; + long i1424; + long i1425; + long i1426; + long i1427; + long i1428; + long i1429; + long i1430; + long i1431; + long i1432; + long i1433; + long i1434; + long i1435; + long i1436; + long i1437; + long i1438; + long i1439; + long i1440; + long i1441; + long i1442; + long i1443; + long i1444; + long i1445; + long i1446; + long i1447; + long i1448; + long i1449; + long i1450; + long i1451; + long i1452; + long i1453; + long i1454; + long i1455; + long i1456; + long i1457; + long i1458; + long i1459; + long i1460; + long i1461; + long i1462; + long i1463; + long i1464; + long i1465; + long i1466; + long i1467; + long i1468; + long i1469; + long i1470; + long i1471; + long i1472; + long i1473; + long i1474; + long i1475; + long i1476; + long i1477; + long i1478; + long i1479; + long i1480; + long i1481; + long i1482; + long i1483; + long i1484; + long i1485; + long i1486; + long i1487; + long i1488; + long i1489; + long i1490; + long i1491; + long i1492; + long i1493; + long i1494; + long i1495; + long i1496; + long i1497; + long i1498; + long i1499; + long i1500; + long i1501; + long i1502; + long i1503; + long i1504; + long i1505; + long i1506; + long i1507; + long i1508; + long i1509; + long i1510; + long i1511; + long i1512; + long i1513; + long i1514; + long i1515; + long i1516; + long i1517; + long i1518; + long i1519; + long i1520; + long i1521; + long i1522; + long i1523; + long i1524; + long i1525; + long i1526; + long i1527; + long i1528; + long i1529; + long i1530; + long i1531; + long i1532; + long i1533; + long i1534; + long i1535; + long i1536; + long i1537; + long i1538; + long i1539; + long i1540; + long i1541; + long i1542; + long i1543; + long i1544; + long i1545; + long i1546; + long i1547; + long i1548; + long i1549; + long i1550; + long i1551; + long i1552; + long i1553; + long i1554; + long i1555; + long i1556; + long i1557; + long i1558; + long i1559; + long i1560; + long i1561; + long i1562; + long i1563; + long i1564; + long i1565; + long i1566; + long i1567; + long i1568; + long i1569; + long i1570; + long i1571; + long i1572; + long i1573; + long i1574; + long i1575; + long i1576; + long i1577; + long i1578; + long i1579; + long i1580; + long i1581; + long i1582; + long i1583; + long i1584; + long i1585; + long i1586; + long i1587; + long i1588; + long i1589; + long i1590; + long i1591; + long i1592; + long i1593; + long i1594; + long i1595; + long i1596; + long i1597; + long i1598; + long i1599; + long i1600; + long i1601; + long i1602; + long i1603; + long i1604; + long i1605; + long i1606; + long i1607; + long i1608; + long i1609; + long i1610; + long i1611; + long i1612; + long i1613; + long i1614; + long i1615; + long i1616; + long i1617; + long i1618; + long i1619; + long i1620; + long i1621; + long i1622; + long i1623; + long i1624; + long i1625; + long i1626; + long i1627; + long i1628; + long i1629; + long i1630; + long i1631; + long i1632; + long i1633; + long i1634; + long i1635; + long i1636; + long i1637; + long i1638; + long i1639; + long i1640; + long i1641; + long i1642; + long i1643; + long i1644; + long i1645; + long i1646; + long i1647; + long i1648; + long i1649; + long i1650; + long i1651; + long i1652; + long i1653; + long i1654; + long i1655; + long i1656; + long i1657; + long i1658; + long i1659; + long i1660; + long i1661; + long i1662; + long i1663; + long i1664; + long i1665; + long i1666; + long i1667; + long i1668; + long i1669; + long i1670; + long i1671; + long i1672; + long i1673; + long i1674; + long i1675; + long i1676; + long i1677; + long i1678; + long i1679; + long i1680; + long i1681; + long i1682; + long i1683; + long i1684; + long i1685; + long i1686; + long i1687; + long i1688; + long i1689; + long i1690; + long i1691; + long i1692; + long i1693; + long i1694; + long i1695; + long i1696; + long i1697; + long i1698; + long i1699; + long i1700; + long i1701; + long i1702; + long i1703; + long i1704; + long i1705; + long i1706; + long i1707; + long i1708; + long i1709; + long i1710; + long i1711; + long i1712; + long i1713; + long i1714; + long i1715; + long i1716; + long i1717; + long i1718; + long i1719; + long i1720; + long i1721; + long i1722; + long i1723; + long i1724; + long i1725; + long i1726; + long i1727; + long i1728; + long i1729; + long i1730; + long i1731; + long i1732; + long i1733; + long i1734; + long i1735; + long i1736; + long i1737; + long i1738; + long i1739; + long i1740; + long i1741; + long i1742; + long i1743; + long i1744; + long i1745; + long i1746; + long i1747; + long i1748; + long i1749; + long i1750; + long i1751; + long i1752; + long i1753; + long i1754; + long i1755; + long i1756; + long i1757; + long i1758; + long i1759; + long i1760; + long i1761; + long i1762; + long i1763; + long i1764; + long i1765; + long i1766; + long i1767; + long i1768; + long i1769; + long i1770; + long i1771; + long i1772; + long i1773; + long i1774; + long i1775; + long i1776; + long i1777; + long i1778; + long i1779; + long i1780; + long i1781; + long i1782; + long i1783; + long i1784; + long i1785; + long i1786; + long i1787; + long i1788; + long i1789; + long i1790; + long i1791; + long i1792; + long i1793; + long i1794; + long i1795; + long i1796; + long i1797; + long i1798; + long i1799; + long i1800; + long i1801; + long i1802; + long i1803; + long i1804; + long i1805; + long i1806; + long i1807; + long i1808; + long i1809; + long i1810; + long i1811; + long i1812; + long i1813; + long i1814; + long i1815; + long i1816; + long i1817; + long i1818; + long i1819; + long i1820; + long i1821; + long i1822; + long i1823; + long i1824; + long i1825; + long i1826; + long i1827; + long i1828; + long i1829; + long i1830; + long i1831; + long i1832; + long i1833; + long i1834; + long i1835; + long i1836; + long i1837; + long i1838; + long i1839; + long i1840; + long i1841; + long i1842; + long i1843; + long i1844; + long i1845; + long i1846; + long i1847; + long i1848; + long i1849; + long i1850; + long i1851; + long i1852; + long i1853; + long i1854; + long i1855; + long i1856; + long i1857; + long i1858; + long i1859; + long i1860; + long i1861; + long i1862; + long i1863; + long i1864; + long i1865; + long i1866; + long i1867; + long i1868; + long i1869; + long i1870; + long i1871; + long i1872; + long i1873; + long i1874; + long i1875; + long i1876; + long i1877; + long i1878; + long i1879; + long i1880; + long i1881; + long i1882; + long i1883; + long i1884; + long i1885; + long i1886; + long i1887; + long i1888; + long i1889; + long i1890; + long i1891; + long i1892; + long i1893; + long i1894; + long i1895; + long i1896; + long i1897; + long i1898; + long i1899; + long i1900; + long i1901; + long i1902; + long i1903; + long i1904; + long i1905; + long i1906; + long i1907; + long i1908; + long i1909; + long i1910; + long i1911; + long i1912; + long i1913; + long i1914; + long i1915; + long i1916; + long i1917; + long i1918; + long i1919; + long i1920; + long i1921; + long i1922; + long i1923; + long i1924; + long i1925; + long i1926; + long i1927; + long i1928; + long i1929; + long i1930; + long i1931; + long i1932; + long i1933; + long i1934; + long i1935; + long i1936; + long i1937; + long i1938; + long i1939; + long i1940; + long i1941; + long i1942; + long i1943; + long i1944; + long i1945; + long i1946; + long i1947; + long i1948; + long i1949; + long i1950; + long i1951; + long i1952; + long i1953; + long i1954; + long i1955; + long i1956; + long i1957; + long i1958; + long i1959; + long i1960; + long i1961; + long i1962; + long i1963; + long i1964; + long i1965; + long i1966; + long i1967; + long i1968; + long i1969; + long i1970; + long i1971; + long i1972; + long i1973; + long i1974; + long i1975; + long i1976; + long i1977; + long i1978; + long i1979; + long i1980; + long i1981; + long i1982; + long i1983; + long i1984; + long i1985; + long i1986; + long i1987; + long i1988; + long i1989; + long i1990; + long i1991; + long i1992; + long i1993; + long i1994; + long i1995; + long i1996; + long i1997; + long i1998; + long i1999; + long i2000; + long i2001; + long i2002; + long i2003; + long i2004; + long i2005; + long i2006; + long i2007; + long i2008; + long i2009; + long i2010; + long i2011; + long i2012; + long i2013; + long i2014; + long i2015; + long i2016; + long i2017; + long i2018; + long i2019; + long i2020; + long i2021; + long i2022; + long i2023; + long i2024; + long i2025; + long i2026; + long i2027; + long i2028; + long i2029; + long i2030; + long i2031; + long i2032; + long i2033; + long i2034; + long i2035; + long i2036; + long i2037; + long i2038; + long i2039; + long i2040; + long i2041; + long i2042; + long i2043; + long i2044; + long i2045; + } + static class Class65536 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + long i6; + long i7; + long i8; + long i9; + long i10; + long i11; + long i12; + long i13; + long i14; + long i15; + long i16; + long i17; + long i18; + long i19; + long i20; + long i21; + long i22; + long i23; + long i24; + long i25; + long i26; + long i27; + long i28; + long i29; + long i30; + long i31; + long i32; + long i33; + long i34; + long i35; + long i36; + long i37; + long i38; + long i39; + long i40; + long i41; + long i42; + long i43; + long i44; + long i45; + long i46; + long i47; + long i48; + long i49; + long i50; + long i51; + long i52; + long i53; + long i54; + long i55; + long i56; + long i57; + long i58; + long i59; + long i60; + long i61; + long i62; + long i63; + long i64; + long i65; + long i66; + long i67; + long i68; + long i69; + long i70; + long i71; + long i72; + long i73; + long i74; + long i75; + long i76; + long i77; + long i78; + long i79; + long i80; + long i81; + long i82; + long i83; + long i84; + long i85; + long i86; + long i87; + long i88; + long i89; + long i90; + long i91; + long i92; + long i93; + long i94; + long i95; + long i96; + long i97; + long i98; + long i99; + long i100; + long i101; + long i102; + long i103; + long i104; + long i105; + long i106; + long i107; + long i108; + long i109; + long i110; + long i111; + long i112; + long i113; + long i114; + long i115; + long i116; + long i117; + long i118; + long i119; + long i120; + long i121; + long i122; + long i123; + long i124; + long i125; + long i126; + long i127; + long i128; + long i129; + long i130; + long i131; + long i132; + long i133; + long i134; + long i135; + long i136; + long i137; + long i138; + long i139; + long i140; + long i141; + long i142; + long i143; + long i144; + long i145; + long i146; + long i147; + long i148; + long i149; + long i150; + long i151; + long i152; + long i153; + long i154; + long i155; + long i156; + long i157; + long i158; + long i159; + long i160; + long i161; + long i162; + long i163; + long i164; + long i165; + long i166; + long i167; + long i168; + long i169; + long i170; + long i171; + long i172; + long i173; + long i174; + long i175; + long i176; + long i177; + long i178; + long i179; + long i180; + long i181; + long i182; + long i183; + long i184; + long i185; + long i186; + long i187; + long i188; + long i189; + long i190; + long i191; + long i192; + long i193; + long i194; + long i195; + long i196; + long i197; + long i198; + long i199; + long i200; + long i201; + long i202; + long i203; + long i204; + long i205; + long i206; + long i207; + long i208; + long i209; + long i210; + long i211; + long i212; + long i213; + long i214; + long i215; + long i216; + long i217; + long i218; + long i219; + long i220; + long i221; + long i222; + long i223; + long i224; + long i225; + long i226; + long i227; + long i228; + long i229; + long i230; + long i231; + long i232; + long i233; + long i234; + long i235; + long i236; + long i237; + long i238; + long i239; + long i240; + long i241; + long i242; + long i243; + long i244; + long i245; + long i246; + long i247; + long i248; + long i249; + long i250; + long i251; + long i252; + long i253; + long i254; + long i255; + long i256; + long i257; + long i258; + long i259; + long i260; + long i261; + long i262; + long i263; + long i264; + long i265; + long i266; + long i267; + long i268; + long i269; + long i270; + long i271; + long i272; + long i273; + long i274; + long i275; + long i276; + long i277; + long i278; + long i279; + long i280; + long i281; + long i282; + long i283; + long i284; + long i285; + long i286; + long i287; + long i288; + long i289; + long i290; + long i291; + long i292; + long i293; + long i294; + long i295; + long i296; + long i297; + long i298; + long i299; + long i300; + long i301; + long i302; + long i303; + long i304; + long i305; + long i306; + long i307; + long i308; + long i309; + long i310; + long i311; + long i312; + long i313; + long i314; + long i315; + long i316; + long i317; + long i318; + long i319; + long i320; + long i321; + long i322; + long i323; + long i324; + long i325; + long i326; + long i327; + long i328; + long i329; + long i330; + long i331; + long i332; + long i333; + long i334; + long i335; + long i336; + long i337; + long i338; + long i339; + long i340; + long i341; + long i342; + long i343; + long i344; + long i345; + long i346; + long i347; + long i348; + long i349; + long i350; + long i351; + long i352; + long i353; + long i354; + long i355; + long i356; + long i357; + long i358; + long i359; + long i360; + long i361; + long i362; + long i363; + long i364; + long i365; + long i366; + long i367; + long i368; + long i369; + long i370; + long i371; + long i372; + long i373; + long i374; + long i375; + long i376; + long i377; + long i378; + long i379; + long i380; + long i381; + long i382; + long i383; + long i384; + long i385; + long i386; + long i387; + long i388; + long i389; + long i390; + long i391; + long i392; + long i393; + long i394; + long i395; + long i396; + long i397; + long i398; + long i399; + long i400; + long i401; + long i402; + long i403; + long i404; + long i405; + long i406; + long i407; + long i408; + long i409; + long i410; + long i411; + long i412; + long i413; + long i414; + long i415; + long i416; + long i417; + long i418; + long i419; + long i420; + long i421; + long i422; + long i423; + long i424; + long i425; + long i426; + long i427; + long i428; + long i429; + long i430; + long i431; + long i432; + long i433; + long i434; + long i435; + long i436; + long i437; + long i438; + long i439; + long i440; + long i441; + long i442; + long i443; + long i444; + long i445; + long i446; + long i447; + long i448; + long i449; + long i450; + long i451; + long i452; + long i453; + long i454; + long i455; + long i456; + long i457; + long i458; + long i459; + long i460; + long i461; + long i462; + long i463; + long i464; + long i465; + long i466; + long i467; + long i468; + long i469; + long i470; + long i471; + long i472; + long i473; + long i474; + long i475; + long i476; + long i477; + long i478; + long i479; + long i480; + long i481; + long i482; + long i483; + long i484; + long i485; + long i486; + long i487; + long i488; + long i489; + long i490; + long i491; + long i492; + long i493; + long i494; + long i495; + long i496; + long i497; + long i498; + long i499; + long i500; + long i501; + long i502; + long i503; + long i504; + long i505; + long i506; + long i507; + long i508; + long i509; + long i510; + long i511; + long i512; + long i513; + long i514; + long i515; + long i516; + long i517; + long i518; + long i519; + long i520; + long i521; + long i522; + long i523; + long i524; + long i525; + long i526; + long i527; + long i528; + long i529; + long i530; + long i531; + long i532; + long i533; + long i534; + long i535; + long i536; + long i537; + long i538; + long i539; + long i540; + long i541; + long i542; + long i543; + long i544; + long i545; + long i546; + long i547; + long i548; + long i549; + long i550; + long i551; + long i552; + long i553; + long i554; + long i555; + long i556; + long i557; + long i558; + long i559; + long i560; + long i561; + long i562; + long i563; + long i564; + long i565; + long i566; + long i567; + long i568; + long i569; + long i570; + long i571; + long i572; + long i573; + long i574; + long i575; + long i576; + long i577; + long i578; + long i579; + long i580; + long i581; + long i582; + long i583; + long i584; + long i585; + long i586; + long i587; + long i588; + long i589; + long i590; + long i591; + long i592; + long i593; + long i594; + long i595; + long i596; + long i597; + long i598; + long i599; + long i600; + long i601; + long i602; + long i603; + long i604; + long i605; + long i606; + long i607; + long i608; + long i609; + long i610; + long i611; + long i612; + long i613; + long i614; + long i615; + long i616; + long i617; + long i618; + long i619; + long i620; + long i621; + long i622; + long i623; + long i624; + long i625; + long i626; + long i627; + long i628; + long i629; + long i630; + long i631; + long i632; + long i633; + long i634; + long i635; + long i636; + long i637; + long i638; + long i639; + long i640; + long i641; + long i642; + long i643; + long i644; + long i645; + long i646; + long i647; + long i648; + long i649; + long i650; + long i651; + long i652; + long i653; + long i654; + long i655; + long i656; + long i657; + long i658; + long i659; + long i660; + long i661; + long i662; + long i663; + long i664; + long i665; + long i666; + long i667; + long i668; + long i669; + long i670; + long i671; + long i672; + long i673; + long i674; + long i675; + long i676; + long i677; + long i678; + long i679; + long i680; + long i681; + long i682; + long i683; + long i684; + long i685; + long i686; + long i687; + long i688; + long i689; + long i690; + long i691; + long i692; + long i693; + long i694; + long i695; + long i696; + long i697; + long i698; + long i699; + long i700; + long i701; + long i702; + long i703; + long i704; + long i705; + long i706; + long i707; + long i708; + long i709; + long i710; + long i711; + long i712; + long i713; + long i714; + long i715; + long i716; + long i717; + long i718; + long i719; + long i720; + long i721; + long i722; + long i723; + long i724; + long i725; + long i726; + long i727; + long i728; + long i729; + long i730; + long i731; + long i732; + long i733; + long i734; + long i735; + long i736; + long i737; + long i738; + long i739; + long i740; + long i741; + long i742; + long i743; + long i744; + long i745; + long i746; + long i747; + long i748; + long i749; + long i750; + long i751; + long i752; + long i753; + long i754; + long i755; + long i756; + long i757; + long i758; + long i759; + long i760; + long i761; + long i762; + long i763; + long i764; + long i765; + long i766; + long i767; + long i768; + long i769; + long i770; + long i771; + long i772; + long i773; + long i774; + long i775; + long i776; + long i777; + long i778; + long i779; + long i780; + long i781; + long i782; + long i783; + long i784; + long i785; + long i786; + long i787; + long i788; + long i789; + long i790; + long i791; + long i792; + long i793; + long i794; + long i795; + long i796; + long i797; + long i798; + long i799; + long i800; + long i801; + long i802; + long i803; + long i804; + long i805; + long i806; + long i807; + long i808; + long i809; + long i810; + long i811; + long i812; + long i813; + long i814; + long i815; + long i816; + long i817; + long i818; + long i819; + long i820; + long i821; + long i822; + long i823; + long i824; + long i825; + long i826; + long i827; + long i828; + long i829; + long i830; + long i831; + long i832; + long i833; + long i834; + long i835; + long i836; + long i837; + long i838; + long i839; + long i840; + long i841; + long i842; + long i843; + long i844; + long i845; + long i846; + long i847; + long i848; + long i849; + long i850; + long i851; + long i852; + long i853; + long i854; + long i855; + long i856; + long i857; + long i858; + long i859; + long i860; + long i861; + long i862; + long i863; + long i864; + long i865; + long i866; + long i867; + long i868; + long i869; + long i870; + long i871; + long i872; + long i873; + long i874; + long i875; + long i876; + long i877; + long i878; + long i879; + long i880; + long i881; + long i882; + long i883; + long i884; + long i885; + long i886; + long i887; + long i888; + long i889; + long i890; + long i891; + long i892; + long i893; + long i894; + long i895; + long i896; + long i897; + long i898; + long i899; + long i900; + long i901; + long i902; + long i903; + long i904; + long i905; + long i906; + long i907; + long i908; + long i909; + long i910; + long i911; + long i912; + long i913; + long i914; + long i915; + long i916; + long i917; + long i918; + long i919; + long i920; + long i921; + long i922; + long i923; + long i924; + long i925; + long i926; + long i927; + long i928; + long i929; + long i930; + long i931; + long i932; + long i933; + long i934; + long i935; + long i936; + long i937; + long i938; + long i939; + long i940; + long i941; + long i942; + long i943; + long i944; + long i945; + long i946; + long i947; + long i948; + long i949; + long i950; + long i951; + long i952; + long i953; + long i954; + long i955; + long i956; + long i957; + long i958; + long i959; + long i960; + long i961; + long i962; + long i963; + long i964; + long i965; + long i966; + long i967; + long i968; + long i969; + long i970; + long i971; + long i972; + long i973; + long i974; + long i975; + long i976; + long i977; + long i978; + long i979; + long i980; + long i981; + long i982; + long i983; + long i984; + long i985; + long i986; + long i987; + long i988; + long i989; + long i990; + long i991; + long i992; + long i993; + long i994; + long i995; + long i996; + long i997; + long i998; + long i999; + long i1000; + long i1001; + long i1002; + long i1003; + long i1004; + long i1005; + long i1006; + long i1007; + long i1008; + long i1009; + long i1010; + long i1011; + long i1012; + long i1013; + long i1014; + long i1015; + long i1016; + long i1017; + long i1018; + long i1019; + long i1020; + long i1021; + long i1022; + long i1023; + long i1024; + long i1025; + long i1026; + long i1027; + long i1028; + long i1029; + long i1030; + long i1031; + long i1032; + long i1033; + long i1034; + long i1035; + long i1036; + long i1037; + long i1038; + long i1039; + long i1040; + long i1041; + long i1042; + long i1043; + long i1044; + long i1045; + long i1046; + long i1047; + long i1048; + long i1049; + long i1050; + long i1051; + long i1052; + long i1053; + long i1054; + long i1055; + long i1056; + long i1057; + long i1058; + long i1059; + long i1060; + long i1061; + long i1062; + long i1063; + long i1064; + long i1065; + long i1066; + long i1067; + long i1068; + long i1069; + long i1070; + long i1071; + long i1072; + long i1073; + long i1074; + long i1075; + long i1076; + long i1077; + long i1078; + long i1079; + long i1080; + long i1081; + long i1082; + long i1083; + long i1084; + long i1085; + long i1086; + long i1087; + long i1088; + long i1089; + long i1090; + long i1091; + long i1092; + long i1093; + long i1094; + long i1095; + long i1096; + long i1097; + long i1098; + long i1099; + long i1100; + long i1101; + long i1102; + long i1103; + long i1104; + long i1105; + long i1106; + long i1107; + long i1108; + long i1109; + long i1110; + long i1111; + long i1112; + long i1113; + long i1114; + long i1115; + long i1116; + long i1117; + long i1118; + long i1119; + long i1120; + long i1121; + long i1122; + long i1123; + long i1124; + long i1125; + long i1126; + long i1127; + long i1128; + long i1129; + long i1130; + long i1131; + long i1132; + long i1133; + long i1134; + long i1135; + long i1136; + long i1137; + long i1138; + long i1139; + long i1140; + long i1141; + long i1142; + long i1143; + long i1144; + long i1145; + long i1146; + long i1147; + long i1148; + long i1149; + long i1150; + long i1151; + long i1152; + long i1153; + long i1154; + long i1155; + long i1156; + long i1157; + long i1158; + long i1159; + long i1160; + long i1161; + long i1162; + long i1163; + long i1164; + long i1165; + long i1166; + long i1167; + long i1168; + long i1169; + long i1170; + long i1171; + long i1172; + long i1173; + long i1174; + long i1175; + long i1176; + long i1177; + long i1178; + long i1179; + long i1180; + long i1181; + long i1182; + long i1183; + long i1184; + long i1185; + long i1186; + long i1187; + long i1188; + long i1189; + long i1190; + long i1191; + long i1192; + long i1193; + long i1194; + long i1195; + long i1196; + long i1197; + long i1198; + long i1199; + long i1200; + long i1201; + long i1202; + long i1203; + long i1204; + long i1205; + long i1206; + long i1207; + long i1208; + long i1209; + long i1210; + long i1211; + long i1212; + long i1213; + long i1214; + long i1215; + long i1216; + long i1217; + long i1218; + long i1219; + long i1220; + long i1221; + long i1222; + long i1223; + long i1224; + long i1225; + long i1226; + long i1227; + long i1228; + long i1229; + long i1230; + long i1231; + long i1232; + long i1233; + long i1234; + long i1235; + long i1236; + long i1237; + long i1238; + long i1239; + long i1240; + long i1241; + long i1242; + long i1243; + long i1244; + long i1245; + long i1246; + long i1247; + long i1248; + long i1249; + long i1250; + long i1251; + long i1252; + long i1253; + long i1254; + long i1255; + long i1256; + long i1257; + long i1258; + long i1259; + long i1260; + long i1261; + long i1262; + long i1263; + long i1264; + long i1265; + long i1266; + long i1267; + long i1268; + long i1269; + long i1270; + long i1271; + long i1272; + long i1273; + long i1274; + long i1275; + long i1276; + long i1277; + long i1278; + long i1279; + long i1280; + long i1281; + long i1282; + long i1283; + long i1284; + long i1285; + long i1286; + long i1287; + long i1288; + long i1289; + long i1290; + long i1291; + long i1292; + long i1293; + long i1294; + long i1295; + long i1296; + long i1297; + long i1298; + long i1299; + long i1300; + long i1301; + long i1302; + long i1303; + long i1304; + long i1305; + long i1306; + long i1307; + long i1308; + long i1309; + long i1310; + long i1311; + long i1312; + long i1313; + long i1314; + long i1315; + long i1316; + long i1317; + long i1318; + long i1319; + long i1320; + long i1321; + long i1322; + long i1323; + long i1324; + long i1325; + long i1326; + long i1327; + long i1328; + long i1329; + long i1330; + long i1331; + long i1332; + long i1333; + long i1334; + long i1335; + long i1336; + long i1337; + long i1338; + long i1339; + long i1340; + long i1341; + long i1342; + long i1343; + long i1344; + long i1345; + long i1346; + long i1347; + long i1348; + long i1349; + long i1350; + long i1351; + long i1352; + long i1353; + long i1354; + long i1355; + long i1356; + long i1357; + long i1358; + long i1359; + long i1360; + long i1361; + long i1362; + long i1363; + long i1364; + long i1365; + long i1366; + long i1367; + long i1368; + long i1369; + long i1370; + long i1371; + long i1372; + long i1373; + long i1374; + long i1375; + long i1376; + long i1377; + long i1378; + long i1379; + long i1380; + long i1381; + long i1382; + long i1383; + long i1384; + long i1385; + long i1386; + long i1387; + long i1388; + long i1389; + long i1390; + long i1391; + long i1392; + long i1393; + long i1394; + long i1395; + long i1396; + long i1397; + long i1398; + long i1399; + long i1400; + long i1401; + long i1402; + long i1403; + long i1404; + long i1405; + long i1406; + long i1407; + long i1408; + long i1409; + long i1410; + long i1411; + long i1412; + long i1413; + long i1414; + long i1415; + long i1416; + long i1417; + long i1418; + long i1419; + long i1420; + long i1421; + long i1422; + long i1423; + long i1424; + long i1425; + long i1426; + long i1427; + long i1428; + long i1429; + long i1430; + long i1431; + long i1432; + long i1433; + long i1434; + long i1435; + long i1436; + long i1437; + long i1438; + long i1439; + long i1440; + long i1441; + long i1442; + long i1443; + long i1444; + long i1445; + long i1446; + long i1447; + long i1448; + long i1449; + long i1450; + long i1451; + long i1452; + long i1453; + long i1454; + long i1455; + long i1456; + long i1457; + long i1458; + long i1459; + long i1460; + long i1461; + long i1462; + long i1463; + long i1464; + long i1465; + long i1466; + long i1467; + long i1468; + long i1469; + long i1470; + long i1471; + long i1472; + long i1473; + long i1474; + long i1475; + long i1476; + long i1477; + long i1478; + long i1479; + long i1480; + long i1481; + long i1482; + long i1483; + long i1484; + long i1485; + long i1486; + long i1487; + long i1488; + long i1489; + long i1490; + long i1491; + long i1492; + long i1493; + long i1494; + long i1495; + long i1496; + long i1497; + long i1498; + long i1499; + long i1500; + long i1501; + long i1502; + long i1503; + long i1504; + long i1505; + long i1506; + long i1507; + long i1508; + long i1509; + long i1510; + long i1511; + long i1512; + long i1513; + long i1514; + long i1515; + long i1516; + long i1517; + long i1518; + long i1519; + long i1520; + long i1521; + long i1522; + long i1523; + long i1524; + long i1525; + long i1526; + long i1527; + long i1528; + long i1529; + long i1530; + long i1531; + long i1532; + long i1533; + long i1534; + long i1535; + long i1536; + long i1537; + long i1538; + long i1539; + long i1540; + long i1541; + long i1542; + long i1543; + long i1544; + long i1545; + long i1546; + long i1547; + long i1548; + long i1549; + long i1550; + long i1551; + long i1552; + long i1553; + long i1554; + long i1555; + long i1556; + long i1557; + long i1558; + long i1559; + long i1560; + long i1561; + long i1562; + long i1563; + long i1564; + long i1565; + long i1566; + long i1567; + long i1568; + long i1569; + long i1570; + long i1571; + long i1572; + long i1573; + long i1574; + long i1575; + long i1576; + long i1577; + long i1578; + long i1579; + long i1580; + long i1581; + long i1582; + long i1583; + long i1584; + long i1585; + long i1586; + long i1587; + long i1588; + long i1589; + long i1590; + long i1591; + long i1592; + long i1593; + long i1594; + long i1595; + long i1596; + long i1597; + long i1598; + long i1599; + long i1600; + long i1601; + long i1602; + long i1603; + long i1604; + long i1605; + long i1606; + long i1607; + long i1608; + long i1609; + long i1610; + long i1611; + long i1612; + long i1613; + long i1614; + long i1615; + long i1616; + long i1617; + long i1618; + long i1619; + long i1620; + long i1621; + long i1622; + long i1623; + long i1624; + long i1625; + long i1626; + long i1627; + long i1628; + long i1629; + long i1630; + long i1631; + long i1632; + long i1633; + long i1634; + long i1635; + long i1636; + long i1637; + long i1638; + long i1639; + long i1640; + long i1641; + long i1642; + long i1643; + long i1644; + long i1645; + long i1646; + long i1647; + long i1648; + long i1649; + long i1650; + long i1651; + long i1652; + long i1653; + long i1654; + long i1655; + long i1656; + long i1657; + long i1658; + long i1659; + long i1660; + long i1661; + long i1662; + long i1663; + long i1664; + long i1665; + long i1666; + long i1667; + long i1668; + long i1669; + long i1670; + long i1671; + long i1672; + long i1673; + long i1674; + long i1675; + long i1676; + long i1677; + long i1678; + long i1679; + long i1680; + long i1681; + long i1682; + long i1683; + long i1684; + long i1685; + long i1686; + long i1687; + long i1688; + long i1689; + long i1690; + long i1691; + long i1692; + long i1693; + long i1694; + long i1695; + long i1696; + long i1697; + long i1698; + long i1699; + long i1700; + long i1701; + long i1702; + long i1703; + long i1704; + long i1705; + long i1706; + long i1707; + long i1708; + long i1709; + long i1710; + long i1711; + long i1712; + long i1713; + long i1714; + long i1715; + long i1716; + long i1717; + long i1718; + long i1719; + long i1720; + long i1721; + long i1722; + long i1723; + long i1724; + long i1725; + long i1726; + long i1727; + long i1728; + long i1729; + long i1730; + long i1731; + long i1732; + long i1733; + long i1734; + long i1735; + long i1736; + long i1737; + long i1738; + long i1739; + long i1740; + long i1741; + long i1742; + long i1743; + long i1744; + long i1745; + long i1746; + long i1747; + long i1748; + long i1749; + long i1750; + long i1751; + long i1752; + long i1753; + long i1754; + long i1755; + long i1756; + long i1757; + long i1758; + long i1759; + long i1760; + long i1761; + long i1762; + long i1763; + long i1764; + long i1765; + long i1766; + long i1767; + long i1768; + long i1769; + long i1770; + long i1771; + long i1772; + long i1773; + long i1774; + long i1775; + long i1776; + long i1777; + long i1778; + long i1779; + long i1780; + long i1781; + long i1782; + long i1783; + long i1784; + long i1785; + long i1786; + long i1787; + long i1788; + long i1789; + long i1790; + long i1791; + long i1792; + long i1793; + long i1794; + long i1795; + long i1796; + long i1797; + long i1798; + long i1799; + long i1800; + long i1801; + long i1802; + long i1803; + long i1804; + long i1805; + long i1806; + long i1807; + long i1808; + long i1809; + long i1810; + long i1811; + long i1812; + long i1813; + long i1814; + long i1815; + long i1816; + long i1817; + long i1818; + long i1819; + long i1820; + long i1821; + long i1822; + long i1823; + long i1824; + long i1825; + long i1826; + long i1827; + long i1828; + long i1829; + long i1830; + long i1831; + long i1832; + long i1833; + long i1834; + long i1835; + long i1836; + long i1837; + long i1838; + long i1839; + long i1840; + long i1841; + long i1842; + long i1843; + long i1844; + long i1845; + long i1846; + long i1847; + long i1848; + long i1849; + long i1850; + long i1851; + long i1852; + long i1853; + long i1854; + long i1855; + long i1856; + long i1857; + long i1858; + long i1859; + long i1860; + long i1861; + long i1862; + long i1863; + long i1864; + long i1865; + long i1866; + long i1867; + long i1868; + long i1869; + long i1870; + long i1871; + long i1872; + long i1873; + long i1874; + long i1875; + long i1876; + long i1877; + long i1878; + long i1879; + long i1880; + long i1881; + long i1882; + long i1883; + long i1884; + long i1885; + long i1886; + long i1887; + long i1888; + long i1889; + long i1890; + long i1891; + long i1892; + long i1893; + long i1894; + long i1895; + long i1896; + long i1897; + long i1898; + long i1899; + long i1900; + long i1901; + long i1902; + long i1903; + long i1904; + long i1905; + long i1906; + long i1907; + long i1908; + long i1909; + long i1910; + long i1911; + long i1912; + long i1913; + long i1914; + long i1915; + long i1916; + long i1917; + long i1918; + long i1919; + long i1920; + long i1921; + long i1922; + long i1923; + long i1924; + long i1925; + long i1926; + long i1927; + long i1928; + long i1929; + long i1930; + long i1931; + long i1932; + long i1933; + long i1934; + long i1935; + long i1936; + long i1937; + long i1938; + long i1939; + long i1940; + long i1941; + long i1942; + long i1943; + long i1944; + long i1945; + long i1946; + long i1947; + long i1948; + long i1949; + long i1950; + long i1951; + long i1952; + long i1953; + long i1954; + long i1955; + long i1956; + long i1957; + long i1958; + long i1959; + long i1960; + long i1961; + long i1962; + long i1963; + long i1964; + long i1965; + long i1966; + long i1967; + long i1968; + long i1969; + long i1970; + long i1971; + long i1972; + long i1973; + long i1974; + long i1975; + long i1976; + long i1977; + long i1978; + long i1979; + long i1980; + long i1981; + long i1982; + long i1983; + long i1984; + long i1985; + long i1986; + long i1987; + long i1988; + long i1989; + long i1990; + long i1991; + long i1992; + long i1993; + long i1994; + long i1995; + long i1996; + long i1997; + long i1998; + long i1999; + long i2000; + long i2001; + long i2002; + long i2003; + long i2004; + long i2005; + long i2006; + long i2007; + long i2008; + long i2009; + long i2010; + long i2011; + long i2012; + long i2013; + long i2014; + long i2015; + long i2016; + long i2017; + long i2018; + long i2019; + long i2020; + long i2021; + long i2022; + long i2023; + long i2024; + long i2025; + long i2026; + long i2027; + long i2028; + long i2029; + long i2030; + long i2031; + long i2032; + long i2033; + long i2034; + long i2035; + long i2036; + long i2037; + long i2038; + long i2039; + long i2040; + long i2041; + long i2042; + long i2043; + long i2044; + long i2045; + long i2046; + long i2047; + long i2048; + long i2049; + long i2050; + long i2051; + long i2052; + long i2053; + long i2054; + long i2055; + long i2056; + long i2057; + long i2058; + long i2059; + long i2060; + long i2061; + long i2062; + long i2063; + long i2064; + long i2065; + long i2066; + long i2067; + long i2068; + long i2069; + long i2070; + long i2071; + long i2072; + long i2073; + long i2074; + long i2075; + long i2076; + long i2077; + long i2078; + long i2079; + long i2080; + long i2081; + long i2082; + long i2083; + long i2084; + long i2085; + long i2086; + long i2087; + long i2088; + long i2089; + long i2090; + long i2091; + long i2092; + long i2093; + long i2094; + long i2095; + long i2096; + long i2097; + long i2098; + long i2099; + long i2100; + long i2101; + long i2102; + long i2103; + long i2104; + long i2105; + long i2106; + long i2107; + long i2108; + long i2109; + long i2110; + long i2111; + long i2112; + long i2113; + long i2114; + long i2115; + long i2116; + long i2117; + long i2118; + long i2119; + long i2120; + long i2121; + long i2122; + long i2123; + long i2124; + long i2125; + long i2126; + long i2127; + long i2128; + long i2129; + long i2130; + long i2131; + long i2132; + long i2133; + long i2134; + long i2135; + long i2136; + long i2137; + long i2138; + long i2139; + long i2140; + long i2141; + long i2142; + long i2143; + long i2144; + long i2145; + long i2146; + long i2147; + long i2148; + long i2149; + long i2150; + long i2151; + long i2152; + long i2153; + long i2154; + long i2155; + long i2156; + long i2157; + long i2158; + long i2159; + long i2160; + long i2161; + long i2162; + long i2163; + long i2164; + long i2165; + long i2166; + long i2167; + long i2168; + long i2169; + long i2170; + long i2171; + long i2172; + long i2173; + long i2174; + long i2175; + long i2176; + long i2177; + long i2178; + long i2179; + long i2180; + long i2181; + long i2182; + long i2183; + long i2184; + long i2185; + long i2186; + long i2187; + long i2188; + long i2189; + long i2190; + long i2191; + long i2192; + long i2193; + long i2194; + long i2195; + long i2196; + long i2197; + long i2198; + long i2199; + long i2200; + long i2201; + long i2202; + long i2203; + long i2204; + long i2205; + long i2206; + long i2207; + long i2208; + long i2209; + long i2210; + long i2211; + long i2212; + long i2213; + long i2214; + long i2215; + long i2216; + long i2217; + long i2218; + long i2219; + long i2220; + long i2221; + long i2222; + long i2223; + long i2224; + long i2225; + long i2226; + long i2227; + long i2228; + long i2229; + long i2230; + long i2231; + long i2232; + long i2233; + long i2234; + long i2235; + long i2236; + long i2237; + long i2238; + long i2239; + long i2240; + long i2241; + long i2242; + long i2243; + long i2244; + long i2245; + long i2246; + long i2247; + long i2248; + long i2249; + long i2250; + long i2251; + long i2252; + long i2253; + long i2254; + long i2255; + long i2256; + long i2257; + long i2258; + long i2259; + long i2260; + long i2261; + long i2262; + long i2263; + long i2264; + long i2265; + long i2266; + long i2267; + long i2268; + long i2269; + long i2270; + long i2271; + long i2272; + long i2273; + long i2274; + long i2275; + long i2276; + long i2277; + long i2278; + long i2279; + long i2280; + long i2281; + long i2282; + long i2283; + long i2284; + long i2285; + long i2286; + long i2287; + long i2288; + long i2289; + long i2290; + long i2291; + long i2292; + long i2293; + long i2294; + long i2295; + long i2296; + long i2297; + long i2298; + long i2299; + long i2300; + long i2301; + long i2302; + long i2303; + long i2304; + long i2305; + long i2306; + long i2307; + long i2308; + long i2309; + long i2310; + long i2311; + long i2312; + long i2313; + long i2314; + long i2315; + long i2316; + long i2317; + long i2318; + long i2319; + long i2320; + long i2321; + long i2322; + long i2323; + long i2324; + long i2325; + long i2326; + long i2327; + long i2328; + long i2329; + long i2330; + long i2331; + long i2332; + long i2333; + long i2334; + long i2335; + long i2336; + long i2337; + long i2338; + long i2339; + long i2340; + long i2341; + long i2342; + long i2343; + long i2344; + long i2345; + long i2346; + long i2347; + long i2348; + long i2349; + long i2350; + long i2351; + long i2352; + long i2353; + long i2354; + long i2355; + long i2356; + long i2357; + long i2358; + long i2359; + long i2360; + long i2361; + long i2362; + long i2363; + long i2364; + long i2365; + long i2366; + long i2367; + long i2368; + long i2369; + long i2370; + long i2371; + long i2372; + long i2373; + long i2374; + long i2375; + long i2376; + long i2377; + long i2378; + long i2379; + long i2380; + long i2381; + long i2382; + long i2383; + long i2384; + long i2385; + long i2386; + long i2387; + long i2388; + long i2389; + long i2390; + long i2391; + long i2392; + long i2393; + long i2394; + long i2395; + long i2396; + long i2397; + long i2398; + long i2399; + long i2400; + long i2401; + long i2402; + long i2403; + long i2404; + long i2405; + long i2406; + long i2407; + long i2408; + long i2409; + long i2410; + long i2411; + long i2412; + long i2413; + long i2414; + long i2415; + long i2416; + long i2417; + long i2418; + long i2419; + long i2420; + long i2421; + long i2422; + long i2423; + long i2424; + long i2425; + long i2426; + long i2427; + long i2428; + long i2429; + long i2430; + long i2431; + long i2432; + long i2433; + long i2434; + long i2435; + long i2436; + long i2437; + long i2438; + long i2439; + long i2440; + long i2441; + long i2442; + long i2443; + long i2444; + long i2445; + long i2446; + long i2447; + long i2448; + long i2449; + long i2450; + long i2451; + long i2452; + long i2453; + long i2454; + long i2455; + long i2456; + long i2457; + long i2458; + long i2459; + long i2460; + long i2461; + long i2462; + long i2463; + long i2464; + long i2465; + long i2466; + long i2467; + long i2468; + long i2469; + long i2470; + long i2471; + long i2472; + long i2473; + long i2474; + long i2475; + long i2476; + long i2477; + long i2478; + long i2479; + long i2480; + long i2481; + long i2482; + long i2483; + long i2484; + long i2485; + long i2486; + long i2487; + long i2488; + long i2489; + long i2490; + long i2491; + long i2492; + long i2493; + long i2494; + long i2495; + long i2496; + long i2497; + long i2498; + long i2499; + long i2500; + long i2501; + long i2502; + long i2503; + long i2504; + long i2505; + long i2506; + long i2507; + long i2508; + long i2509; + long i2510; + long i2511; + long i2512; + long i2513; + long i2514; + long i2515; + long i2516; + long i2517; + long i2518; + long i2519; + long i2520; + long i2521; + long i2522; + long i2523; + long i2524; + long i2525; + long i2526; + long i2527; + long i2528; + long i2529; + long i2530; + long i2531; + long i2532; + long i2533; + long i2534; + long i2535; + long i2536; + long i2537; + long i2538; + long i2539; + long i2540; + long i2541; + long i2542; + long i2543; + long i2544; + long i2545; + long i2546; + long i2547; + long i2548; + long i2549; + long i2550; + long i2551; + long i2552; + long i2553; + long i2554; + long i2555; + long i2556; + long i2557; + long i2558; + long i2559; + long i2560; + long i2561; + long i2562; + long i2563; + long i2564; + long i2565; + long i2566; + long i2567; + long i2568; + long i2569; + long i2570; + long i2571; + long i2572; + long i2573; + long i2574; + long i2575; + long i2576; + long i2577; + long i2578; + long i2579; + long i2580; + long i2581; + long i2582; + long i2583; + long i2584; + long i2585; + long i2586; + long i2587; + long i2588; + long i2589; + long i2590; + long i2591; + long i2592; + long i2593; + long i2594; + long i2595; + long i2596; + long i2597; + long i2598; + long i2599; + long i2600; + long i2601; + long i2602; + long i2603; + long i2604; + long i2605; + long i2606; + long i2607; + long i2608; + long i2609; + long i2610; + long i2611; + long i2612; + long i2613; + long i2614; + long i2615; + long i2616; + long i2617; + long i2618; + long i2619; + long i2620; + long i2621; + long i2622; + long i2623; + long i2624; + long i2625; + long i2626; + long i2627; + long i2628; + long i2629; + long i2630; + long i2631; + long i2632; + long i2633; + long i2634; + long i2635; + long i2636; + long i2637; + long i2638; + long i2639; + long i2640; + long i2641; + long i2642; + long i2643; + long i2644; + long i2645; + long i2646; + long i2647; + long i2648; + long i2649; + long i2650; + long i2651; + long i2652; + long i2653; + long i2654; + long i2655; + long i2656; + long i2657; + long i2658; + long i2659; + long i2660; + long i2661; + long i2662; + long i2663; + long i2664; + long i2665; + long i2666; + long i2667; + long i2668; + long i2669; + long i2670; + long i2671; + long i2672; + long i2673; + long i2674; + long i2675; + long i2676; + long i2677; + long i2678; + long i2679; + long i2680; + long i2681; + long i2682; + long i2683; + long i2684; + long i2685; + long i2686; + long i2687; + long i2688; + long i2689; + long i2690; + long i2691; + long i2692; + long i2693; + long i2694; + long i2695; + long i2696; + long i2697; + long i2698; + long i2699; + long i2700; + long i2701; + long i2702; + long i2703; + long i2704; + long i2705; + long i2706; + long i2707; + long i2708; + long i2709; + long i2710; + long i2711; + long i2712; + long i2713; + long i2714; + long i2715; + long i2716; + long i2717; + long i2718; + long i2719; + long i2720; + long i2721; + long i2722; + long i2723; + long i2724; + long i2725; + long i2726; + long i2727; + long i2728; + long i2729; + long i2730; + long i2731; + long i2732; + long i2733; + long i2734; + long i2735; + long i2736; + long i2737; + long i2738; + long i2739; + long i2740; + long i2741; + long i2742; + long i2743; + long i2744; + long i2745; + long i2746; + long i2747; + long i2748; + long i2749; + long i2750; + long i2751; + long i2752; + long i2753; + long i2754; + long i2755; + long i2756; + long i2757; + long i2758; + long i2759; + long i2760; + long i2761; + long i2762; + long i2763; + long i2764; + long i2765; + long i2766; + long i2767; + long i2768; + long i2769; + long i2770; + long i2771; + long i2772; + long i2773; + long i2774; + long i2775; + long i2776; + long i2777; + long i2778; + long i2779; + long i2780; + long i2781; + long i2782; + long i2783; + long i2784; + long i2785; + long i2786; + long i2787; + long i2788; + long i2789; + long i2790; + long i2791; + long i2792; + long i2793; + long i2794; + long i2795; + long i2796; + long i2797; + long i2798; + long i2799; + long i2800; + long i2801; + long i2802; + long i2803; + long i2804; + long i2805; + long i2806; + long i2807; + long i2808; + long i2809; + long i2810; + long i2811; + long i2812; + long i2813; + long i2814; + long i2815; + long i2816; + long i2817; + long i2818; + long i2819; + long i2820; + long i2821; + long i2822; + long i2823; + long i2824; + long i2825; + long i2826; + long i2827; + long i2828; + long i2829; + long i2830; + long i2831; + long i2832; + long i2833; + long i2834; + long i2835; + long i2836; + long i2837; + long i2838; + long i2839; + long i2840; + long i2841; + long i2842; + long i2843; + long i2844; + long i2845; + long i2846; + long i2847; + long i2848; + long i2849; + long i2850; + long i2851; + long i2852; + long i2853; + long i2854; + long i2855; + long i2856; + long i2857; + long i2858; + long i2859; + long i2860; + long i2861; + long i2862; + long i2863; + long i2864; + long i2865; + long i2866; + long i2867; + long i2868; + long i2869; + long i2870; + long i2871; + long i2872; + long i2873; + long i2874; + long i2875; + long i2876; + long i2877; + long i2878; + long i2879; + long i2880; + long i2881; + long i2882; + long i2883; + long i2884; + long i2885; + long i2886; + long i2887; + long i2888; + long i2889; + long i2890; + long i2891; + long i2892; + long i2893; + long i2894; + long i2895; + long i2896; + long i2897; + long i2898; + long i2899; + long i2900; + long i2901; + long i2902; + long i2903; + long i2904; + long i2905; + long i2906; + long i2907; + long i2908; + long i2909; + long i2910; + long i2911; + long i2912; + long i2913; + long i2914; + long i2915; + long i2916; + long i2917; + long i2918; + long i2919; + long i2920; + long i2921; + long i2922; + long i2923; + long i2924; + long i2925; + long i2926; + long i2927; + long i2928; + long i2929; + long i2930; + long i2931; + long i2932; + long i2933; + long i2934; + long i2935; + long i2936; + long i2937; + long i2938; + long i2939; + long i2940; + long i2941; + long i2942; + long i2943; + long i2944; + long i2945; + long i2946; + long i2947; + long i2948; + long i2949; + long i2950; + long i2951; + long i2952; + long i2953; + long i2954; + long i2955; + long i2956; + long i2957; + long i2958; + long i2959; + long i2960; + long i2961; + long i2962; + long i2963; + long i2964; + long i2965; + long i2966; + long i2967; + long i2968; + long i2969; + long i2970; + long i2971; + long i2972; + long i2973; + long i2974; + long i2975; + long i2976; + long i2977; + long i2978; + long i2979; + long i2980; + long i2981; + long i2982; + long i2983; + long i2984; + long i2985; + long i2986; + long i2987; + long i2988; + long i2989; + long i2990; + long i2991; + long i2992; + long i2993; + long i2994; + long i2995; + long i2996; + long i2997; + long i2998; + long i2999; + long i3000; + long i3001; + long i3002; + long i3003; + long i3004; + long i3005; + long i3006; + long i3007; + long i3008; + long i3009; + long i3010; + long i3011; + long i3012; + long i3013; + long i3014; + long i3015; + long i3016; + long i3017; + long i3018; + long i3019; + long i3020; + long i3021; + long i3022; + long i3023; + long i3024; + long i3025; + long i3026; + long i3027; + long i3028; + long i3029; + long i3030; + long i3031; + long i3032; + long i3033; + long i3034; + long i3035; + long i3036; + long i3037; + long i3038; + long i3039; + long i3040; + long i3041; + long i3042; + long i3043; + long i3044; + long i3045; + long i3046; + long i3047; + long i3048; + long i3049; + long i3050; + long i3051; + long i3052; + long i3053; + long i3054; + long i3055; + long i3056; + long i3057; + long i3058; + long i3059; + long i3060; + long i3061; + long i3062; + long i3063; + long i3064; + long i3065; + long i3066; + long i3067; + long i3068; + long i3069; + long i3070; + long i3071; + long i3072; + long i3073; + long i3074; + long i3075; + long i3076; + long i3077; + long i3078; + long i3079; + long i3080; + long i3081; + long i3082; + long i3083; + long i3084; + long i3085; + long i3086; + long i3087; + long i3088; + long i3089; + long i3090; + long i3091; + long i3092; + long i3093; + long i3094; + long i3095; + long i3096; + long i3097; + long i3098; + long i3099; + long i3100; + long i3101; + long i3102; + long i3103; + long i3104; + long i3105; + long i3106; + long i3107; + long i3108; + long i3109; + long i3110; + long i3111; + long i3112; + long i3113; + long i3114; + long i3115; + long i3116; + long i3117; + long i3118; + long i3119; + long i3120; + long i3121; + long i3122; + long i3123; + long i3124; + long i3125; + long i3126; + long i3127; + long i3128; + long i3129; + long i3130; + long i3131; + long i3132; + long i3133; + long i3134; + long i3135; + long i3136; + long i3137; + long i3138; + long i3139; + long i3140; + long i3141; + long i3142; + long i3143; + long i3144; + long i3145; + long i3146; + long i3147; + long i3148; + long i3149; + long i3150; + long i3151; + long i3152; + long i3153; + long i3154; + long i3155; + long i3156; + long i3157; + long i3158; + long i3159; + long i3160; + long i3161; + long i3162; + long i3163; + long i3164; + long i3165; + long i3166; + long i3167; + long i3168; + long i3169; + long i3170; + long i3171; + long i3172; + long i3173; + long i3174; + long i3175; + long i3176; + long i3177; + long i3178; + long i3179; + long i3180; + long i3181; + long i3182; + long i3183; + long i3184; + long i3185; + long i3186; + long i3187; + long i3188; + long i3189; + long i3190; + long i3191; + long i3192; + long i3193; + long i3194; + long i3195; + long i3196; + long i3197; + long i3198; + long i3199; + long i3200; + long i3201; + long i3202; + long i3203; + long i3204; + long i3205; + long i3206; + long i3207; + long i3208; + long i3209; + long i3210; + long i3211; + long i3212; + long i3213; + long i3214; + long i3215; + long i3216; + long i3217; + long i3218; + long i3219; + long i3220; + long i3221; + long i3222; + long i3223; + long i3224; + long i3225; + long i3226; + long i3227; + long i3228; + long i3229; + long i3230; + long i3231; + long i3232; + long i3233; + long i3234; + long i3235; + long i3236; + long i3237; + long i3238; + long i3239; + long i3240; + long i3241; + long i3242; + long i3243; + long i3244; + long i3245; + long i3246; + long i3247; + long i3248; + long i3249; + long i3250; + long i3251; + long i3252; + long i3253; + long i3254; + long i3255; + long i3256; + long i3257; + long i3258; + long i3259; + long i3260; + long i3261; + long i3262; + long i3263; + long i3264; + long i3265; + long i3266; + long i3267; + long i3268; + long i3269; + long i3270; + long i3271; + long i3272; + long i3273; + long i3274; + long i3275; + long i3276; + long i3277; + long i3278; + long i3279; + long i3280; + long i3281; + long i3282; + long i3283; + long i3284; + long i3285; + long i3286; + long i3287; + long i3288; + long i3289; + long i3290; + long i3291; + long i3292; + long i3293; + long i3294; + long i3295; + long i3296; + long i3297; + long i3298; + long i3299; + long i3300; + long i3301; + long i3302; + long i3303; + long i3304; + long i3305; + long i3306; + long i3307; + long i3308; + long i3309; + long i3310; + long i3311; + long i3312; + long i3313; + long i3314; + long i3315; + long i3316; + long i3317; + long i3318; + long i3319; + long i3320; + long i3321; + long i3322; + long i3323; + long i3324; + long i3325; + long i3326; + long i3327; + long i3328; + long i3329; + long i3330; + long i3331; + long i3332; + long i3333; + long i3334; + long i3335; + long i3336; + long i3337; + long i3338; + long i3339; + long i3340; + long i3341; + long i3342; + long i3343; + long i3344; + long i3345; + long i3346; + long i3347; + long i3348; + long i3349; + long i3350; + long i3351; + long i3352; + long i3353; + long i3354; + long i3355; + long i3356; + long i3357; + long i3358; + long i3359; + long i3360; + long i3361; + long i3362; + long i3363; + long i3364; + long i3365; + long i3366; + long i3367; + long i3368; + long i3369; + long i3370; + long i3371; + long i3372; + long i3373; + long i3374; + long i3375; + long i3376; + long i3377; + long i3378; + long i3379; + long i3380; + long i3381; + long i3382; + long i3383; + long i3384; + long i3385; + long i3386; + long i3387; + long i3388; + long i3389; + long i3390; + long i3391; + long i3392; + long i3393; + long i3394; + long i3395; + long i3396; + long i3397; + long i3398; + long i3399; + long i3400; + long i3401; + long i3402; + long i3403; + long i3404; + long i3405; + long i3406; + long i3407; + long i3408; + long i3409; + long i3410; + long i3411; + long i3412; + long i3413; + long i3414; + long i3415; + long i3416; + long i3417; + long i3418; + long i3419; + long i3420; + long i3421; + long i3422; + long i3423; + long i3424; + long i3425; + long i3426; + long i3427; + long i3428; + long i3429; + long i3430; + long i3431; + long i3432; + long i3433; + long i3434; + long i3435; + long i3436; + long i3437; + long i3438; + long i3439; + long i3440; + long i3441; + long i3442; + long i3443; + long i3444; + long i3445; + long i3446; + long i3447; + long i3448; + long i3449; + long i3450; + long i3451; + long i3452; + long i3453; + long i3454; + long i3455; + long i3456; + long i3457; + long i3458; + long i3459; + long i3460; + long i3461; + long i3462; + long i3463; + long i3464; + long i3465; + long i3466; + long i3467; + long i3468; + long i3469; + long i3470; + long i3471; + long i3472; + long i3473; + long i3474; + long i3475; + long i3476; + long i3477; + long i3478; + long i3479; + long i3480; + long i3481; + long i3482; + long i3483; + long i3484; + long i3485; + long i3486; + long i3487; + long i3488; + long i3489; + long i3490; + long i3491; + long i3492; + long i3493; + long i3494; + long i3495; + long i3496; + long i3497; + long i3498; + long i3499; + long i3500; + long i3501; + long i3502; + long i3503; + long i3504; + long i3505; + long i3506; + long i3507; + long i3508; + long i3509; + long i3510; + long i3511; + long i3512; + long i3513; + long i3514; + long i3515; + long i3516; + long i3517; + long i3518; + long i3519; + long i3520; + long i3521; + long i3522; + long i3523; + long i3524; + long i3525; + long i3526; + long i3527; + long i3528; + long i3529; + long i3530; + long i3531; + long i3532; + long i3533; + long i3534; + long i3535; + long i3536; + long i3537; + long i3538; + long i3539; + long i3540; + long i3541; + long i3542; + long i3543; + long i3544; + long i3545; + long i3546; + long i3547; + long i3548; + long i3549; + long i3550; + long i3551; + long i3552; + long i3553; + long i3554; + long i3555; + long i3556; + long i3557; + long i3558; + long i3559; + long i3560; + long i3561; + long i3562; + long i3563; + long i3564; + long i3565; + long i3566; + long i3567; + long i3568; + long i3569; + long i3570; + long i3571; + long i3572; + long i3573; + long i3574; + long i3575; + long i3576; + long i3577; + long i3578; + long i3579; + long i3580; + long i3581; + long i3582; + long i3583; + long i3584; + long i3585; + long i3586; + long i3587; + long i3588; + long i3589; + long i3590; + long i3591; + long i3592; + long i3593; + long i3594; + long i3595; + long i3596; + long i3597; + long i3598; + long i3599; + long i3600; + long i3601; + long i3602; + long i3603; + long i3604; + long i3605; + long i3606; + long i3607; + long i3608; + long i3609; + long i3610; + long i3611; + long i3612; + long i3613; + long i3614; + long i3615; + long i3616; + long i3617; + long i3618; + long i3619; + long i3620; + long i3621; + long i3622; + long i3623; + long i3624; + long i3625; + long i3626; + long i3627; + long i3628; + long i3629; + long i3630; + long i3631; + long i3632; + long i3633; + long i3634; + long i3635; + long i3636; + long i3637; + long i3638; + long i3639; + long i3640; + long i3641; + long i3642; + long i3643; + long i3644; + long i3645; + long i3646; + long i3647; + long i3648; + long i3649; + long i3650; + long i3651; + long i3652; + long i3653; + long i3654; + long i3655; + long i3656; + long i3657; + long i3658; + long i3659; + long i3660; + long i3661; + long i3662; + long i3663; + long i3664; + long i3665; + long i3666; + long i3667; + long i3668; + long i3669; + long i3670; + long i3671; + long i3672; + long i3673; + long i3674; + long i3675; + long i3676; + long i3677; + long i3678; + long i3679; + long i3680; + long i3681; + long i3682; + long i3683; + long i3684; + long i3685; + long i3686; + long i3687; + long i3688; + long i3689; + long i3690; + long i3691; + long i3692; + long i3693; + long i3694; + long i3695; + long i3696; + long i3697; + long i3698; + long i3699; + long i3700; + long i3701; + long i3702; + long i3703; + long i3704; + long i3705; + long i3706; + long i3707; + long i3708; + long i3709; + long i3710; + long i3711; + long i3712; + long i3713; + long i3714; + long i3715; + long i3716; + long i3717; + long i3718; + long i3719; + long i3720; + long i3721; + long i3722; + long i3723; + long i3724; + long i3725; + long i3726; + long i3727; + long i3728; + long i3729; + long i3730; + long i3731; + long i3732; + long i3733; + long i3734; + long i3735; + long i3736; + long i3737; + long i3738; + long i3739; + long i3740; + long i3741; + long i3742; + long i3743; + long i3744; + long i3745; + long i3746; + long i3747; + long i3748; + long i3749; + long i3750; + long i3751; + long i3752; + long i3753; + long i3754; + long i3755; + long i3756; + long i3757; + long i3758; + long i3759; + long i3760; + long i3761; + long i3762; + long i3763; + long i3764; + long i3765; + long i3766; + long i3767; + long i3768; + long i3769; + long i3770; + long i3771; + long i3772; + long i3773; + long i3774; + long i3775; + long i3776; + long i3777; + long i3778; + long i3779; + long i3780; + long i3781; + long i3782; + long i3783; + long i3784; + long i3785; + long i3786; + long i3787; + long i3788; + long i3789; + long i3790; + long i3791; + long i3792; + long i3793; + long i3794; + long i3795; + long i3796; + long i3797; + long i3798; + long i3799; + long i3800; + long i3801; + long i3802; + long i3803; + long i3804; + long i3805; + long i3806; + long i3807; + long i3808; + long i3809; + long i3810; + long i3811; + long i3812; + long i3813; + long i3814; + long i3815; + long i3816; + long i3817; + long i3818; + long i3819; + long i3820; + long i3821; + long i3822; + long i3823; + long i3824; + long i3825; + long i3826; + long i3827; + long i3828; + long i3829; + long i3830; + long i3831; + long i3832; + long i3833; + long i3834; + long i3835; + long i3836; + long i3837; + long i3838; + long i3839; + long i3840; + long i3841; + long i3842; + long i3843; + long i3844; + long i3845; + long i3846; + long i3847; + long i3848; + long i3849; + long i3850; + long i3851; + long i3852; + long i3853; + long i3854; + long i3855; + long i3856; + long i3857; + long i3858; + long i3859; + long i3860; + long i3861; + long i3862; + long i3863; + long i3864; + long i3865; + long i3866; + long i3867; + long i3868; + long i3869; + long i3870; + long i3871; + long i3872; + long i3873; + long i3874; + long i3875; + long i3876; + long i3877; + long i3878; + long i3879; + long i3880; + long i3881; + long i3882; + long i3883; + long i3884; + long i3885; + long i3886; + long i3887; + long i3888; + long i3889; + long i3890; + long i3891; + long i3892; + long i3893; + long i3894; + long i3895; + long i3896; + long i3897; + long i3898; + long i3899; + long i3900; + long i3901; + long i3902; + long i3903; + long i3904; + long i3905; + long i3906; + long i3907; + long i3908; + long i3909; + long i3910; + long i3911; + long i3912; + long i3913; + long i3914; + long i3915; + long i3916; + long i3917; + long i3918; + long i3919; + long i3920; + long i3921; + long i3922; + long i3923; + long i3924; + long i3925; + long i3926; + long i3927; + long i3928; + long i3929; + long i3930; + long i3931; + long i3932; + long i3933; + long i3934; + long i3935; + long i3936; + long i3937; + long i3938; + long i3939; + long i3940; + long i3941; + long i3942; + long i3943; + long i3944; + long i3945; + long i3946; + long i3947; + long i3948; + long i3949; + long i3950; + long i3951; + long i3952; + long i3953; + long i3954; + long i3955; + long i3956; + long i3957; + long i3958; + long i3959; + long i3960; + long i3961; + long i3962; + long i3963; + long i3964; + long i3965; + long i3966; + long i3967; + long i3968; + long i3969; + long i3970; + long i3971; + long i3972; + long i3973; + long i3974; + long i3975; + long i3976; + long i3977; + long i3978; + long i3979; + long i3980; + long i3981; + long i3982; + long i3983; + long i3984; + long i3985; + long i3986; + long i3987; + long i3988; + long i3989; + long i3990; + long i3991; + long i3992; + long i3993; + long i3994; + long i3995; + long i3996; + long i3997; + long i3998; + long i3999; + long i4000; + long i4001; + long i4002; + long i4003; + long i4004; + long i4005; + long i4006; + long i4007; + long i4008; + long i4009; + long i4010; + long i4011; + long i4012; + long i4013; + long i4014; + long i4015; + long i4016; + long i4017; + long i4018; + long i4019; + long i4020; + long i4021; + long i4022; + long i4023; + long i4024; + long i4025; + long i4026; + long i4027; + long i4028; + long i4029; + long i4030; + long i4031; + long i4032; + long i4033; + long i4034; + long i4035; + long i4036; + long i4037; + long i4038; + long i4039; + long i4040; + long i4041; + long i4042; + long i4043; + long i4044; + long i4045; + long i4046; + long i4047; + long i4048; + long i4049; + long i4050; + long i4051; + long i4052; + long i4053; + long i4054; + long i4055; + long i4056; + long i4057; + long i4058; + long i4059; + long i4060; + long i4061; + long i4062; + long i4063; + long i4064; + long i4065; + long i4066; + long i4067; + long i4068; + long i4069; + long i4070; + long i4071; + long i4072; + long i4073; + long i4074; + long i4075; + long i4076; + long i4077; + long i4078; + long i4079; + long i4080; + long i4081; + long i4082; + long i4083; + long i4084; + long i4085; + long i4086; + long i4087; + long i4088; + long i4089; + long i4090; + long i4091; + long i4092; + long i4093; + long i4094; + long i4095; + long i4096; + long i4097; + long i4098; + long i4099; + long i4100; + long i4101; + long i4102; + long i4103; + long i4104; + long i4105; + long i4106; + long i4107; + long i4108; + long i4109; + long i4110; + long i4111; + long i4112; + long i4113; + long i4114; + long i4115; + long i4116; + long i4117; + long i4118; + long i4119; + long i4120; + long i4121; + long i4122; + long i4123; + long i4124; + long i4125; + long i4126; + long i4127; + long i4128; + long i4129; + long i4130; + long i4131; + long i4132; + long i4133; + long i4134; + long i4135; + long i4136; + long i4137; + long i4138; + long i4139; + long i4140; + long i4141; + long i4142; + long i4143; + long i4144; + long i4145; + long i4146; + long i4147; + long i4148; + long i4149; + long i4150; + long i4151; + long i4152; + long i4153; + long i4154; + long i4155; + long i4156; + long i4157; + long i4158; + long i4159; + long i4160; + long i4161; + long i4162; + long i4163; + long i4164; + long i4165; + long i4166; + long i4167; + long i4168; + long i4169; + long i4170; + long i4171; + long i4172; + long i4173; + long i4174; + long i4175; + long i4176; + long i4177; + long i4178; + long i4179; + long i4180; + long i4181; + long i4182; + long i4183; + long i4184; + long i4185; + long i4186; + long i4187; + long i4188; + long i4189; + long i4190; + long i4191; + long i4192; + long i4193; + long i4194; + long i4195; + long i4196; + long i4197; + long i4198; + long i4199; + long i4200; + long i4201; + long i4202; + long i4203; + long i4204; + long i4205; + long i4206; + long i4207; + long i4208; + long i4209; + long i4210; + long i4211; + long i4212; + long i4213; + long i4214; + long i4215; + long i4216; + long i4217; + long i4218; + long i4219; + long i4220; + long i4221; + long i4222; + long i4223; + long i4224; + long i4225; + long i4226; + long i4227; + long i4228; + long i4229; + long i4230; + long i4231; + long i4232; + long i4233; + long i4234; + long i4235; + long i4236; + long i4237; + long i4238; + long i4239; + long i4240; + long i4241; + long i4242; + long i4243; + long i4244; + long i4245; + long i4246; + long i4247; + long i4248; + long i4249; + long i4250; + long i4251; + long i4252; + long i4253; + long i4254; + long i4255; + long i4256; + long i4257; + long i4258; + long i4259; + long i4260; + long i4261; + long i4262; + long i4263; + long i4264; + long i4265; + long i4266; + long i4267; + long i4268; + long i4269; + long i4270; + long i4271; + long i4272; + long i4273; + long i4274; + long i4275; + long i4276; + long i4277; + long i4278; + long i4279; + long i4280; + long i4281; + long i4282; + long i4283; + long i4284; + long i4285; + long i4286; + long i4287; + long i4288; + long i4289; + long i4290; + long i4291; + long i4292; + long i4293; + long i4294; + long i4295; + long i4296; + long i4297; + long i4298; + long i4299; + long i4300; + long i4301; + long i4302; + long i4303; + long i4304; + long i4305; + long i4306; + long i4307; + long i4308; + long i4309; + long i4310; + long i4311; + long i4312; + long i4313; + long i4314; + long i4315; + long i4316; + long i4317; + long i4318; + long i4319; + long i4320; + long i4321; + long i4322; + long i4323; + long i4324; + long i4325; + long i4326; + long i4327; + long i4328; + long i4329; + long i4330; + long i4331; + long i4332; + long i4333; + long i4334; + long i4335; + long i4336; + long i4337; + long i4338; + long i4339; + long i4340; + long i4341; + long i4342; + long i4343; + long i4344; + long i4345; + long i4346; + long i4347; + long i4348; + long i4349; + long i4350; + long i4351; + long i4352; + long i4353; + long i4354; + long i4355; + long i4356; + long i4357; + long i4358; + long i4359; + long i4360; + long i4361; + long i4362; + long i4363; + long i4364; + long i4365; + long i4366; + long i4367; + long i4368; + long i4369; + long i4370; + long i4371; + long i4372; + long i4373; + long i4374; + long i4375; + long i4376; + long i4377; + long i4378; + long i4379; + long i4380; + long i4381; + long i4382; + long i4383; + long i4384; + long i4385; + long i4386; + long i4387; + long i4388; + long i4389; + long i4390; + long i4391; + long i4392; + long i4393; + long i4394; + long i4395; + long i4396; + long i4397; + long i4398; + long i4399; + long i4400; + long i4401; + long i4402; + long i4403; + long i4404; + long i4405; + long i4406; + long i4407; + long i4408; + long i4409; + long i4410; + long i4411; + long i4412; + long i4413; + long i4414; + long i4415; + long i4416; + long i4417; + long i4418; + long i4419; + long i4420; + long i4421; + long i4422; + long i4423; + long i4424; + long i4425; + long i4426; + long i4427; + long i4428; + long i4429; + long i4430; + long i4431; + long i4432; + long i4433; + long i4434; + long i4435; + long i4436; + long i4437; + long i4438; + long i4439; + long i4440; + long i4441; + long i4442; + long i4443; + long i4444; + long i4445; + long i4446; + long i4447; + long i4448; + long i4449; + long i4450; + long i4451; + long i4452; + long i4453; + long i4454; + long i4455; + long i4456; + long i4457; + long i4458; + long i4459; + long i4460; + long i4461; + long i4462; + long i4463; + long i4464; + long i4465; + long i4466; + long i4467; + long i4468; + long i4469; + long i4470; + long i4471; + long i4472; + long i4473; + long i4474; + long i4475; + long i4476; + long i4477; + long i4478; + long i4479; + long i4480; + long i4481; + long i4482; + long i4483; + long i4484; + long i4485; + long i4486; + long i4487; + long i4488; + long i4489; + long i4490; + long i4491; + long i4492; + long i4493; + long i4494; + long i4495; + long i4496; + long i4497; + long i4498; + long i4499; + long i4500; + long i4501; + long i4502; + long i4503; + long i4504; + long i4505; + long i4506; + long i4507; + long i4508; + long i4509; + long i4510; + long i4511; + long i4512; + long i4513; + long i4514; + long i4515; + long i4516; + long i4517; + long i4518; + long i4519; + long i4520; + long i4521; + long i4522; + long i4523; + long i4524; + long i4525; + long i4526; + long i4527; + long i4528; + long i4529; + long i4530; + long i4531; + long i4532; + long i4533; + long i4534; + long i4535; + long i4536; + long i4537; + long i4538; + long i4539; + long i4540; + long i4541; + long i4542; + long i4543; + long i4544; + long i4545; + long i4546; + long i4547; + long i4548; + long i4549; + long i4550; + long i4551; + long i4552; + long i4553; + long i4554; + long i4555; + long i4556; + long i4557; + long i4558; + long i4559; + long i4560; + long i4561; + long i4562; + long i4563; + long i4564; + long i4565; + long i4566; + long i4567; + long i4568; + long i4569; + long i4570; + long i4571; + long i4572; + long i4573; + long i4574; + long i4575; + long i4576; + long i4577; + long i4578; + long i4579; + long i4580; + long i4581; + long i4582; + long i4583; + long i4584; + long i4585; + long i4586; + long i4587; + long i4588; + long i4589; + long i4590; + long i4591; + long i4592; + long i4593; + long i4594; + long i4595; + long i4596; + long i4597; + long i4598; + long i4599; + long i4600; + long i4601; + long i4602; + long i4603; + long i4604; + long i4605; + long i4606; + long i4607; + long i4608; + long i4609; + long i4610; + long i4611; + long i4612; + long i4613; + long i4614; + long i4615; + long i4616; + long i4617; + long i4618; + long i4619; + long i4620; + long i4621; + long i4622; + long i4623; + long i4624; + long i4625; + long i4626; + long i4627; + long i4628; + long i4629; + long i4630; + long i4631; + long i4632; + long i4633; + long i4634; + long i4635; + long i4636; + long i4637; + long i4638; + long i4639; + long i4640; + long i4641; + long i4642; + long i4643; + long i4644; + long i4645; + long i4646; + long i4647; + long i4648; + long i4649; + long i4650; + long i4651; + long i4652; + long i4653; + long i4654; + long i4655; + long i4656; + long i4657; + long i4658; + long i4659; + long i4660; + long i4661; + long i4662; + long i4663; + long i4664; + long i4665; + long i4666; + long i4667; + long i4668; + long i4669; + long i4670; + long i4671; + long i4672; + long i4673; + long i4674; + long i4675; + long i4676; + long i4677; + long i4678; + long i4679; + long i4680; + long i4681; + long i4682; + long i4683; + long i4684; + long i4685; + long i4686; + long i4687; + long i4688; + long i4689; + long i4690; + long i4691; + long i4692; + long i4693; + long i4694; + long i4695; + long i4696; + long i4697; + long i4698; + long i4699; + long i4700; + long i4701; + long i4702; + long i4703; + long i4704; + long i4705; + long i4706; + long i4707; + long i4708; + long i4709; + long i4710; + long i4711; + long i4712; + long i4713; + long i4714; + long i4715; + long i4716; + long i4717; + long i4718; + long i4719; + long i4720; + long i4721; + long i4722; + long i4723; + long i4724; + long i4725; + long i4726; + long i4727; + long i4728; + long i4729; + long i4730; + long i4731; + long i4732; + long i4733; + long i4734; + long i4735; + long i4736; + long i4737; + long i4738; + long i4739; + long i4740; + long i4741; + long i4742; + long i4743; + long i4744; + long i4745; + long i4746; + long i4747; + long i4748; + long i4749; + long i4750; + long i4751; + long i4752; + long i4753; + long i4754; + long i4755; + long i4756; + long i4757; + long i4758; + long i4759; + long i4760; + long i4761; + long i4762; + long i4763; + long i4764; + long i4765; + long i4766; + long i4767; + long i4768; + long i4769; + long i4770; + long i4771; + long i4772; + long i4773; + long i4774; + long i4775; + long i4776; + long i4777; + long i4778; + long i4779; + long i4780; + long i4781; + long i4782; + long i4783; + long i4784; + long i4785; + long i4786; + long i4787; + long i4788; + long i4789; + long i4790; + long i4791; + long i4792; + long i4793; + long i4794; + long i4795; + long i4796; + long i4797; + long i4798; + long i4799; + long i4800; + long i4801; + long i4802; + long i4803; + long i4804; + long i4805; + long i4806; + long i4807; + long i4808; + long i4809; + long i4810; + long i4811; + long i4812; + long i4813; + long i4814; + long i4815; + long i4816; + long i4817; + long i4818; + long i4819; + long i4820; + long i4821; + long i4822; + long i4823; + long i4824; + long i4825; + long i4826; + long i4827; + long i4828; + long i4829; + long i4830; + long i4831; + long i4832; + long i4833; + long i4834; + long i4835; + long i4836; + long i4837; + long i4838; + long i4839; + long i4840; + long i4841; + long i4842; + long i4843; + long i4844; + long i4845; + long i4846; + long i4847; + long i4848; + long i4849; + long i4850; + long i4851; + long i4852; + long i4853; + long i4854; + long i4855; + long i4856; + long i4857; + long i4858; + long i4859; + long i4860; + long i4861; + long i4862; + long i4863; + long i4864; + long i4865; + long i4866; + long i4867; + long i4868; + long i4869; + long i4870; + long i4871; + long i4872; + long i4873; + long i4874; + long i4875; + long i4876; + long i4877; + long i4878; + long i4879; + long i4880; + long i4881; + long i4882; + long i4883; + long i4884; + long i4885; + long i4886; + long i4887; + long i4888; + long i4889; + long i4890; + long i4891; + long i4892; + long i4893; + long i4894; + long i4895; + long i4896; + long i4897; + long i4898; + long i4899; + long i4900; + long i4901; + long i4902; + long i4903; + long i4904; + long i4905; + long i4906; + long i4907; + long i4908; + long i4909; + long i4910; + long i4911; + long i4912; + long i4913; + long i4914; + long i4915; + long i4916; + long i4917; + long i4918; + long i4919; + long i4920; + long i4921; + long i4922; + long i4923; + long i4924; + long i4925; + long i4926; + long i4927; + long i4928; + long i4929; + long i4930; + long i4931; + long i4932; + long i4933; + long i4934; + long i4935; + long i4936; + long i4937; + long i4938; + long i4939; + long i4940; + long i4941; + long i4942; + long i4943; + long i4944; + long i4945; + long i4946; + long i4947; + long i4948; + long i4949; + long i4950; + long i4951; + long i4952; + long i4953; + long i4954; + long i4955; + long i4956; + long i4957; + long i4958; + long i4959; + long i4960; + long i4961; + long i4962; + long i4963; + long i4964; + long i4965; + long i4966; + long i4967; + long i4968; + long i4969; + long i4970; + long i4971; + long i4972; + long i4973; + long i4974; + long i4975; + long i4976; + long i4977; + long i4978; + long i4979; + long i4980; + long i4981; + long i4982; + long i4983; + long i4984; + long i4985; + long i4986; + long i4987; + long i4988; + long i4989; + long i4990; + long i4991; + long i4992; + long i4993; + long i4994; + long i4995; + long i4996; + long i4997; + long i4998; + long i4999; + long i5000; + long i5001; + long i5002; + long i5003; + long i5004; + long i5005; + long i5006; + long i5007; + long i5008; + long i5009; + long i5010; + long i5011; + long i5012; + long i5013; + long i5014; + long i5015; + long i5016; + long i5017; + long i5018; + long i5019; + long i5020; + long i5021; + long i5022; + long i5023; + long i5024; + long i5025; + long i5026; + long i5027; + long i5028; + long i5029; + long i5030; + long i5031; + long i5032; + long i5033; + long i5034; + long i5035; + long i5036; + long i5037; + long i5038; + long i5039; + long i5040; + long i5041; + long i5042; + long i5043; + long i5044; + long i5045; + long i5046; + long i5047; + long i5048; + long i5049; + long i5050; + long i5051; + long i5052; + long i5053; + long i5054; + long i5055; + long i5056; + long i5057; + long i5058; + long i5059; + long i5060; + long i5061; + long i5062; + long i5063; + long i5064; + long i5065; + long i5066; + long i5067; + long i5068; + long i5069; + long i5070; + long i5071; + long i5072; + long i5073; + long i5074; + long i5075; + long i5076; + long i5077; + long i5078; + long i5079; + long i5080; + long i5081; + long i5082; + long i5083; + long i5084; + long i5085; + long i5086; + long i5087; + long i5088; + long i5089; + long i5090; + long i5091; + long i5092; + long i5093; + long i5094; + long i5095; + long i5096; + long i5097; + long i5098; + long i5099; + long i5100; + long i5101; + long i5102; + long i5103; + long i5104; + long i5105; + long i5106; + long i5107; + long i5108; + long i5109; + long i5110; + long i5111; + long i5112; + long i5113; + long i5114; + long i5115; + long i5116; + long i5117; + long i5118; + long i5119; + long i5120; + long i5121; + long i5122; + long i5123; + long i5124; + long i5125; + long i5126; + long i5127; + long i5128; + long i5129; + long i5130; + long i5131; + long i5132; + long i5133; + long i5134; + long i5135; + long i5136; + long i5137; + long i5138; + long i5139; + long i5140; + long i5141; + long i5142; + long i5143; + long i5144; + long i5145; + long i5146; + long i5147; + long i5148; + long i5149; + long i5150; + long i5151; + long i5152; + long i5153; + long i5154; + long i5155; + long i5156; + long i5157; + long i5158; + long i5159; + long i5160; + long i5161; + long i5162; + long i5163; + long i5164; + long i5165; + long i5166; + long i5167; + long i5168; + long i5169; + long i5170; + long i5171; + long i5172; + long i5173; + long i5174; + long i5175; + long i5176; + long i5177; + long i5178; + long i5179; + long i5180; + long i5181; + long i5182; + long i5183; + long i5184; + long i5185; + long i5186; + long i5187; + long i5188; + long i5189; + long i5190; + long i5191; + long i5192; + long i5193; + long i5194; + long i5195; + long i5196; + long i5197; + long i5198; + long i5199; + long i5200; + long i5201; + long i5202; + long i5203; + long i5204; + long i5205; + long i5206; + long i5207; + long i5208; + long i5209; + long i5210; + long i5211; + long i5212; + long i5213; + long i5214; + long i5215; + long i5216; + long i5217; + long i5218; + long i5219; + long i5220; + long i5221; + long i5222; + long i5223; + long i5224; + long i5225; + long i5226; + long i5227; + long i5228; + long i5229; + long i5230; + long i5231; + long i5232; + long i5233; + long i5234; + long i5235; + long i5236; + long i5237; + long i5238; + long i5239; + long i5240; + long i5241; + long i5242; + long i5243; + long i5244; + long i5245; + long i5246; + long i5247; + long i5248; + long i5249; + long i5250; + long i5251; + long i5252; + long i5253; + long i5254; + long i5255; + long i5256; + long i5257; + long i5258; + long i5259; + long i5260; + long i5261; + long i5262; + long i5263; + long i5264; + long i5265; + long i5266; + long i5267; + long i5268; + long i5269; + long i5270; + long i5271; + long i5272; + long i5273; + long i5274; + long i5275; + long i5276; + long i5277; + long i5278; + long i5279; + long i5280; + long i5281; + long i5282; + long i5283; + long i5284; + long i5285; + long i5286; + long i5287; + long i5288; + long i5289; + long i5290; + long i5291; + long i5292; + long i5293; + long i5294; + long i5295; + long i5296; + long i5297; + long i5298; + long i5299; + long i5300; + long i5301; + long i5302; + long i5303; + long i5304; + long i5305; + long i5306; + long i5307; + long i5308; + long i5309; + long i5310; + long i5311; + long i5312; + long i5313; + long i5314; + long i5315; + long i5316; + long i5317; + long i5318; + long i5319; + long i5320; + long i5321; + long i5322; + long i5323; + long i5324; + long i5325; + long i5326; + long i5327; + long i5328; + long i5329; + long i5330; + long i5331; + long i5332; + long i5333; + long i5334; + long i5335; + long i5336; + long i5337; + long i5338; + long i5339; + long i5340; + long i5341; + long i5342; + long i5343; + long i5344; + long i5345; + long i5346; + long i5347; + long i5348; + long i5349; + long i5350; + long i5351; + long i5352; + long i5353; + long i5354; + long i5355; + long i5356; + long i5357; + long i5358; + long i5359; + long i5360; + long i5361; + long i5362; + long i5363; + long i5364; + long i5365; + long i5366; + long i5367; + long i5368; + long i5369; + long i5370; + long i5371; + long i5372; + long i5373; + long i5374; + long i5375; + long i5376; + long i5377; + long i5378; + long i5379; + long i5380; + long i5381; + long i5382; + long i5383; + long i5384; + long i5385; + long i5386; + long i5387; + long i5388; + long i5389; + long i5390; + long i5391; + long i5392; + long i5393; + long i5394; + long i5395; + long i5396; + long i5397; + long i5398; + long i5399; + long i5400; + long i5401; + long i5402; + long i5403; + long i5404; + long i5405; + long i5406; + long i5407; + long i5408; + long i5409; + long i5410; + long i5411; + long i5412; + long i5413; + long i5414; + long i5415; + long i5416; + long i5417; + long i5418; + long i5419; + long i5420; + long i5421; + long i5422; + long i5423; + long i5424; + long i5425; + long i5426; + long i5427; + long i5428; + long i5429; + long i5430; + long i5431; + long i5432; + long i5433; + long i5434; + long i5435; + long i5436; + long i5437; + long i5438; + long i5439; + long i5440; + long i5441; + long i5442; + long i5443; + long i5444; + long i5445; + long i5446; + long i5447; + long i5448; + long i5449; + long i5450; + long i5451; + long i5452; + long i5453; + long i5454; + long i5455; + long i5456; + long i5457; + long i5458; + long i5459; + long i5460; + long i5461; + long i5462; + long i5463; + long i5464; + long i5465; + long i5466; + long i5467; + long i5468; + long i5469; + long i5470; + long i5471; + long i5472; + long i5473; + long i5474; + long i5475; + long i5476; + long i5477; + long i5478; + long i5479; + long i5480; + long i5481; + long i5482; + long i5483; + long i5484; + long i5485; + long i5486; + long i5487; + long i5488; + long i5489; + long i5490; + long i5491; + long i5492; + long i5493; + long i5494; + long i5495; + long i5496; + long i5497; + long i5498; + long i5499; + long i5500; + long i5501; + long i5502; + long i5503; + long i5504; + long i5505; + long i5506; + long i5507; + long i5508; + long i5509; + long i5510; + long i5511; + long i5512; + long i5513; + long i5514; + long i5515; + long i5516; + long i5517; + long i5518; + long i5519; + long i5520; + long i5521; + long i5522; + long i5523; + long i5524; + long i5525; + long i5526; + long i5527; + long i5528; + long i5529; + long i5530; + long i5531; + long i5532; + long i5533; + long i5534; + long i5535; + long i5536; + long i5537; + long i5538; + long i5539; + long i5540; + long i5541; + long i5542; + long i5543; + long i5544; + long i5545; + long i5546; + long i5547; + long i5548; + long i5549; + long i5550; + long i5551; + long i5552; + long i5553; + long i5554; + long i5555; + long i5556; + long i5557; + long i5558; + long i5559; + long i5560; + long i5561; + long i5562; + long i5563; + long i5564; + long i5565; + long i5566; + long i5567; + long i5568; + long i5569; + long i5570; + long i5571; + long i5572; + long i5573; + long i5574; + long i5575; + long i5576; + long i5577; + long i5578; + long i5579; + long i5580; + long i5581; + long i5582; + long i5583; + long i5584; + long i5585; + long i5586; + long i5587; + long i5588; + long i5589; + long i5590; + long i5591; + long i5592; + long i5593; + long i5594; + long i5595; + long i5596; + long i5597; + long i5598; + long i5599; + long i5600; + long i5601; + long i5602; + long i5603; + long i5604; + long i5605; + long i5606; + long i5607; + long i5608; + long i5609; + long i5610; + long i5611; + long i5612; + long i5613; + long i5614; + long i5615; + long i5616; + long i5617; + long i5618; + long i5619; + long i5620; + long i5621; + long i5622; + long i5623; + long i5624; + long i5625; + long i5626; + long i5627; + long i5628; + long i5629; + long i5630; + long i5631; + long i5632; + long i5633; + long i5634; + long i5635; + long i5636; + long i5637; + long i5638; + long i5639; + long i5640; + long i5641; + long i5642; + long i5643; + long i5644; + long i5645; + long i5646; + long i5647; + long i5648; + long i5649; + long i5650; + long i5651; + long i5652; + long i5653; + long i5654; + long i5655; + long i5656; + long i5657; + long i5658; + long i5659; + long i5660; + long i5661; + long i5662; + long i5663; + long i5664; + long i5665; + long i5666; + long i5667; + long i5668; + long i5669; + long i5670; + long i5671; + long i5672; + long i5673; + long i5674; + long i5675; + long i5676; + long i5677; + long i5678; + long i5679; + long i5680; + long i5681; + long i5682; + long i5683; + long i5684; + long i5685; + long i5686; + long i5687; + long i5688; + long i5689; + long i5690; + long i5691; + long i5692; + long i5693; + long i5694; + long i5695; + long i5696; + long i5697; + long i5698; + long i5699; + long i5700; + long i5701; + long i5702; + long i5703; + long i5704; + long i5705; + long i5706; + long i5707; + long i5708; + long i5709; + long i5710; + long i5711; + long i5712; + long i5713; + long i5714; + long i5715; + long i5716; + long i5717; + long i5718; + long i5719; + long i5720; + long i5721; + long i5722; + long i5723; + long i5724; + long i5725; + long i5726; + long i5727; + long i5728; + long i5729; + long i5730; + long i5731; + long i5732; + long i5733; + long i5734; + long i5735; + long i5736; + long i5737; + long i5738; + long i5739; + long i5740; + long i5741; + long i5742; + long i5743; + long i5744; + long i5745; + long i5746; + long i5747; + long i5748; + long i5749; + long i5750; + long i5751; + long i5752; + long i5753; + long i5754; + long i5755; + long i5756; + long i5757; + long i5758; + long i5759; + long i5760; + long i5761; + long i5762; + long i5763; + long i5764; + long i5765; + long i5766; + long i5767; + long i5768; + long i5769; + long i5770; + long i5771; + long i5772; + long i5773; + long i5774; + long i5775; + long i5776; + long i5777; + long i5778; + long i5779; + long i5780; + long i5781; + long i5782; + long i5783; + long i5784; + long i5785; + long i5786; + long i5787; + long i5788; + long i5789; + long i5790; + long i5791; + long i5792; + long i5793; + long i5794; + long i5795; + long i5796; + long i5797; + long i5798; + long i5799; + long i5800; + long i5801; + long i5802; + long i5803; + long i5804; + long i5805; + long i5806; + long i5807; + long i5808; + long i5809; + long i5810; + long i5811; + long i5812; + long i5813; + long i5814; + long i5815; + long i5816; + long i5817; + long i5818; + long i5819; + long i5820; + long i5821; + long i5822; + long i5823; + long i5824; + long i5825; + long i5826; + long i5827; + long i5828; + long i5829; + long i5830; + long i5831; + long i5832; + long i5833; + long i5834; + long i5835; + long i5836; + long i5837; + long i5838; + long i5839; + long i5840; + long i5841; + long i5842; + long i5843; + long i5844; + long i5845; + long i5846; + long i5847; + long i5848; + long i5849; + long i5850; + long i5851; + long i5852; + long i5853; + long i5854; + long i5855; + long i5856; + long i5857; + long i5858; + long i5859; + long i5860; + long i5861; + long i5862; + long i5863; + long i5864; + long i5865; + long i5866; + long i5867; + long i5868; + long i5869; + long i5870; + long i5871; + long i5872; + long i5873; + long i5874; + long i5875; + long i5876; + long i5877; + long i5878; + long i5879; + long i5880; + long i5881; + long i5882; + long i5883; + long i5884; + long i5885; + long i5886; + long i5887; + long i5888; + long i5889; + long i5890; + long i5891; + long i5892; + long i5893; + long i5894; + long i5895; + long i5896; + long i5897; + long i5898; + long i5899; + long i5900; + long i5901; + long i5902; + long i5903; + long i5904; + long i5905; + long i5906; + long i5907; + long i5908; + long i5909; + long i5910; + long i5911; + long i5912; + long i5913; + long i5914; + long i5915; + long i5916; + long i5917; + long i5918; + long i5919; + long i5920; + long i5921; + long i5922; + long i5923; + long i5924; + long i5925; + long i5926; + long i5927; + long i5928; + long i5929; + long i5930; + long i5931; + long i5932; + long i5933; + long i5934; + long i5935; + long i5936; + long i5937; + long i5938; + long i5939; + long i5940; + long i5941; + long i5942; + long i5943; + long i5944; + long i5945; + long i5946; + long i5947; + long i5948; + long i5949; + long i5950; + long i5951; + long i5952; + long i5953; + long i5954; + long i5955; + long i5956; + long i5957; + long i5958; + long i5959; + long i5960; + long i5961; + long i5962; + long i5963; + long i5964; + long i5965; + long i5966; + long i5967; + long i5968; + long i5969; + long i5970; + long i5971; + long i5972; + long i5973; + long i5974; + long i5975; + long i5976; + long i5977; + long i5978; + long i5979; + long i5980; + long i5981; + long i5982; + long i5983; + long i5984; + long i5985; + long i5986; + long i5987; + long i5988; + long i5989; + long i5990; + long i5991; + long i5992; + long i5993; + long i5994; + long i5995; + long i5996; + long i5997; + long i5998; + long i5999; + long i6000; + long i6001; + long i6002; + long i6003; + long i6004; + long i6005; + long i6006; + long i6007; + long i6008; + long i6009; + long i6010; + long i6011; + long i6012; + long i6013; + long i6014; + long i6015; + long i6016; + long i6017; + long i6018; + long i6019; + long i6020; + long i6021; + long i6022; + long i6023; + long i6024; + long i6025; + long i6026; + long i6027; + long i6028; + long i6029; + long i6030; + long i6031; + long i6032; + long i6033; + long i6034; + long i6035; + long i6036; + long i6037; + long i6038; + long i6039; + long i6040; + long i6041; + long i6042; + long i6043; + long i6044; + long i6045; + long i6046; + long i6047; + long i6048; + long i6049; + long i6050; + long i6051; + long i6052; + long i6053; + long i6054; + long i6055; + long i6056; + long i6057; + long i6058; + long i6059; + long i6060; + long i6061; + long i6062; + long i6063; + long i6064; + long i6065; + long i6066; + long i6067; + long i6068; + long i6069; + long i6070; + long i6071; + long i6072; + long i6073; + long i6074; + long i6075; + long i6076; + long i6077; + long i6078; + long i6079; + long i6080; + long i6081; + long i6082; + long i6083; + long i6084; + long i6085; + long i6086; + long i6087; + long i6088; + long i6089; + long i6090; + long i6091; + long i6092; + long i6093; + long i6094; + long i6095; + long i6096; + long i6097; + long i6098; + long i6099; + long i6100; + long i6101; + long i6102; + long i6103; + long i6104; + long i6105; + long i6106; + long i6107; + long i6108; + long i6109; + long i6110; + long i6111; + long i6112; + long i6113; + long i6114; + long i6115; + long i6116; + long i6117; + long i6118; + long i6119; + long i6120; + long i6121; + long i6122; + long i6123; + long i6124; + long i6125; + long i6126; + long i6127; + long i6128; + long i6129; + long i6130; + long i6131; + long i6132; + long i6133; + long i6134; + long i6135; + long i6136; + long i6137; + long i6138; + long i6139; + long i6140; + long i6141; + long i6142; + long i6143; + long i6144; + long i6145; + long i6146; + long i6147; + long i6148; + long i6149; + long i6150; + long i6151; + long i6152; + long i6153; + long i6154; + long i6155; + long i6156; + long i6157; + long i6158; + long i6159; + long i6160; + long i6161; + long i6162; + long i6163; + long i6164; + long i6165; + long i6166; + long i6167; + long i6168; + long i6169; + long i6170; + long i6171; + long i6172; + long i6173; + long i6174; + long i6175; + long i6176; + long i6177; + long i6178; + long i6179; + long i6180; + long i6181; + long i6182; + long i6183; + long i6184; + long i6185; + long i6186; + long i6187; + long i6188; + long i6189; + long i6190; + long i6191; + long i6192; + long i6193; + long i6194; + long i6195; + long i6196; + long i6197; + long i6198; + long i6199; + long i6200; + long i6201; + long i6202; + long i6203; + long i6204; + long i6205; + long i6206; + long i6207; + long i6208; + long i6209; + long i6210; + long i6211; + long i6212; + long i6213; + long i6214; + long i6215; + long i6216; + long i6217; + long i6218; + long i6219; + long i6220; + long i6221; + long i6222; + long i6223; + long i6224; + long i6225; + long i6226; + long i6227; + long i6228; + long i6229; + long i6230; + long i6231; + long i6232; + long i6233; + long i6234; + long i6235; + long i6236; + long i6237; + long i6238; + long i6239; + long i6240; + long i6241; + long i6242; + long i6243; + long i6244; + long i6245; + long i6246; + long i6247; + long i6248; + long i6249; + long i6250; + long i6251; + long i6252; + long i6253; + long i6254; + long i6255; + long i6256; + long i6257; + long i6258; + long i6259; + long i6260; + long i6261; + long i6262; + long i6263; + long i6264; + long i6265; + long i6266; + long i6267; + long i6268; + long i6269; + long i6270; + long i6271; + long i6272; + long i6273; + long i6274; + long i6275; + long i6276; + long i6277; + long i6278; + long i6279; + long i6280; + long i6281; + long i6282; + long i6283; + long i6284; + long i6285; + long i6286; + long i6287; + long i6288; + long i6289; + long i6290; + long i6291; + long i6292; + long i6293; + long i6294; + long i6295; + long i6296; + long i6297; + long i6298; + long i6299; + long i6300; + long i6301; + long i6302; + long i6303; + long i6304; + long i6305; + long i6306; + long i6307; + long i6308; + long i6309; + long i6310; + long i6311; + long i6312; + long i6313; + long i6314; + long i6315; + long i6316; + long i6317; + long i6318; + long i6319; + long i6320; + long i6321; + long i6322; + long i6323; + long i6324; + long i6325; + long i6326; + long i6327; + long i6328; + long i6329; + long i6330; + long i6331; + long i6332; + long i6333; + long i6334; + long i6335; + long i6336; + long i6337; + long i6338; + long i6339; + long i6340; + long i6341; + long i6342; + long i6343; + long i6344; + long i6345; + long i6346; + long i6347; + long i6348; + long i6349; + long i6350; + long i6351; + long i6352; + long i6353; + long i6354; + long i6355; + long i6356; + long i6357; + long i6358; + long i6359; + long i6360; + long i6361; + long i6362; + long i6363; + long i6364; + long i6365; + long i6366; + long i6367; + long i6368; + long i6369; + long i6370; + long i6371; + long i6372; + long i6373; + long i6374; + long i6375; + long i6376; + long i6377; + long i6378; + long i6379; + long i6380; + long i6381; + long i6382; + long i6383; + long i6384; + long i6385; + long i6386; + long i6387; + long i6388; + long i6389; + long i6390; + long i6391; + long i6392; + long i6393; + long i6394; + long i6395; + long i6396; + long i6397; + long i6398; + long i6399; + long i6400; + long i6401; + long i6402; + long i6403; + long i6404; + long i6405; + long i6406; + long i6407; + long i6408; + long i6409; + long i6410; + long i6411; + long i6412; + long i6413; + long i6414; + long i6415; + long i6416; + long i6417; + long i6418; + long i6419; + long i6420; + long i6421; + long i6422; + long i6423; + long i6424; + long i6425; + long i6426; + long i6427; + long i6428; + long i6429; + long i6430; + long i6431; + long i6432; + long i6433; + long i6434; + long i6435; + long i6436; + long i6437; + long i6438; + long i6439; + long i6440; + long i6441; + long i6442; + long i6443; + long i6444; + long i6445; + long i6446; + long i6447; + long i6448; + long i6449; + long i6450; + long i6451; + long i6452; + long i6453; + long i6454; + long i6455; + long i6456; + long i6457; + long i6458; + long i6459; + long i6460; + long i6461; + long i6462; + long i6463; + long i6464; + long i6465; + long i6466; + long i6467; + long i6468; + long i6469; + long i6470; + long i6471; + long i6472; + long i6473; + long i6474; + long i6475; + long i6476; + long i6477; + long i6478; + long i6479; + long i6480; + long i6481; + long i6482; + long i6483; + long i6484; + long i6485; + long i6486; + long i6487; + long i6488; + long i6489; + long i6490; + long i6491; + long i6492; + long i6493; + long i6494; + long i6495; + long i6496; + long i6497; + long i6498; + long i6499; + long i6500; + long i6501; + long i6502; + long i6503; + long i6504; + long i6505; + long i6506; + long i6507; + long i6508; + long i6509; + long i6510; + long i6511; + long i6512; + long i6513; + long i6514; + long i6515; + long i6516; + long i6517; + long i6518; + long i6519; + long i6520; + long i6521; + long i6522; + long i6523; + long i6524; + long i6525; + long i6526; + long i6527; + long i6528; + long i6529; + long i6530; + long i6531; + long i6532; + long i6533; + long i6534; + long i6535; + long i6536; + long i6537; + long i6538; + long i6539; + long i6540; + long i6541; + long i6542; + long i6543; + long i6544; + long i6545; + long i6546; + long i6547; + long i6548; + long i6549; + long i6550; + long i6551; + long i6552; + long i6553; + long i6554; + long i6555; + long i6556; + long i6557; + long i6558; + long i6559; + long i6560; + long i6561; + long i6562; + long i6563; + long i6564; + long i6565; + long i6566; + long i6567; + long i6568; + long i6569; + long i6570; + long i6571; + long i6572; + long i6573; + long i6574; + long i6575; + long i6576; + long i6577; + long i6578; + long i6579; + long i6580; + long i6581; + long i6582; + long i6583; + long i6584; + long i6585; + long i6586; + long i6587; + long i6588; + long i6589; + long i6590; + long i6591; + long i6592; + long i6593; + long i6594; + long i6595; + long i6596; + long i6597; + long i6598; + long i6599; + long i6600; + long i6601; + long i6602; + long i6603; + long i6604; + long i6605; + long i6606; + long i6607; + long i6608; + long i6609; + long i6610; + long i6611; + long i6612; + long i6613; + long i6614; + long i6615; + long i6616; + long i6617; + long i6618; + long i6619; + long i6620; + long i6621; + long i6622; + long i6623; + long i6624; + long i6625; + long i6626; + long i6627; + long i6628; + long i6629; + long i6630; + long i6631; + long i6632; + long i6633; + long i6634; + long i6635; + long i6636; + long i6637; + long i6638; + long i6639; + long i6640; + long i6641; + long i6642; + long i6643; + long i6644; + long i6645; + long i6646; + long i6647; + long i6648; + long i6649; + long i6650; + long i6651; + long i6652; + long i6653; + long i6654; + long i6655; + long i6656; + long i6657; + long i6658; + long i6659; + long i6660; + long i6661; + long i6662; + long i6663; + long i6664; + long i6665; + long i6666; + long i6667; + long i6668; + long i6669; + long i6670; + long i6671; + long i6672; + long i6673; + long i6674; + long i6675; + long i6676; + long i6677; + long i6678; + long i6679; + long i6680; + long i6681; + long i6682; + long i6683; + long i6684; + long i6685; + long i6686; + long i6687; + long i6688; + long i6689; + long i6690; + long i6691; + long i6692; + long i6693; + long i6694; + long i6695; + long i6696; + long i6697; + long i6698; + long i6699; + long i6700; + long i6701; + long i6702; + long i6703; + long i6704; + long i6705; + long i6706; + long i6707; + long i6708; + long i6709; + long i6710; + long i6711; + long i6712; + long i6713; + long i6714; + long i6715; + long i6716; + long i6717; + long i6718; + long i6719; + long i6720; + long i6721; + long i6722; + long i6723; + long i6724; + long i6725; + long i6726; + long i6727; + long i6728; + long i6729; + long i6730; + long i6731; + long i6732; + long i6733; + long i6734; + long i6735; + long i6736; + long i6737; + long i6738; + long i6739; + long i6740; + long i6741; + long i6742; + long i6743; + long i6744; + long i6745; + long i6746; + long i6747; + long i6748; + long i6749; + long i6750; + long i6751; + long i6752; + long i6753; + long i6754; + long i6755; + long i6756; + long i6757; + long i6758; + long i6759; + long i6760; + long i6761; + long i6762; + long i6763; + long i6764; + long i6765; + long i6766; + long i6767; + long i6768; + long i6769; + long i6770; + long i6771; + long i6772; + long i6773; + long i6774; + long i6775; + long i6776; + long i6777; + long i6778; + long i6779; + long i6780; + long i6781; + long i6782; + long i6783; + long i6784; + long i6785; + long i6786; + long i6787; + long i6788; + long i6789; + long i6790; + long i6791; + long i6792; + long i6793; + long i6794; + long i6795; + long i6796; + long i6797; + long i6798; + long i6799; + long i6800; + long i6801; + long i6802; + long i6803; + long i6804; + long i6805; + long i6806; + long i6807; + long i6808; + long i6809; + long i6810; + long i6811; + long i6812; + long i6813; + long i6814; + long i6815; + long i6816; + long i6817; + long i6818; + long i6819; + long i6820; + long i6821; + long i6822; + long i6823; + long i6824; + long i6825; + long i6826; + long i6827; + long i6828; + long i6829; + long i6830; + long i6831; + long i6832; + long i6833; + long i6834; + long i6835; + long i6836; + long i6837; + long i6838; + long i6839; + long i6840; + long i6841; + long i6842; + long i6843; + long i6844; + long i6845; + long i6846; + long i6847; + long i6848; + long i6849; + long i6850; + long i6851; + long i6852; + long i6853; + long i6854; + long i6855; + long i6856; + long i6857; + long i6858; + long i6859; + long i6860; + long i6861; + long i6862; + long i6863; + long i6864; + long i6865; + long i6866; + long i6867; + long i6868; + long i6869; + long i6870; + long i6871; + long i6872; + long i6873; + long i6874; + long i6875; + long i6876; + long i6877; + long i6878; + long i6879; + long i6880; + long i6881; + long i6882; + long i6883; + long i6884; + long i6885; + long i6886; + long i6887; + long i6888; + long i6889; + long i6890; + long i6891; + long i6892; + long i6893; + long i6894; + long i6895; + long i6896; + long i6897; + long i6898; + long i6899; + long i6900; + long i6901; + long i6902; + long i6903; + long i6904; + long i6905; + long i6906; + long i6907; + long i6908; + long i6909; + long i6910; + long i6911; + long i6912; + long i6913; + long i6914; + long i6915; + long i6916; + long i6917; + long i6918; + long i6919; + long i6920; + long i6921; + long i6922; + long i6923; + long i6924; + long i6925; + long i6926; + long i6927; + long i6928; + long i6929; + long i6930; + long i6931; + long i6932; + long i6933; + long i6934; + long i6935; + long i6936; + long i6937; + long i6938; + long i6939; + long i6940; + long i6941; + long i6942; + long i6943; + long i6944; + long i6945; + long i6946; + long i6947; + long i6948; + long i6949; + long i6950; + long i6951; + long i6952; + long i6953; + long i6954; + long i6955; + long i6956; + long i6957; + long i6958; + long i6959; + long i6960; + long i6961; + long i6962; + long i6963; + long i6964; + long i6965; + long i6966; + long i6967; + long i6968; + long i6969; + long i6970; + long i6971; + long i6972; + long i6973; + long i6974; + long i6975; + long i6976; + long i6977; + long i6978; + long i6979; + long i6980; + long i6981; + long i6982; + long i6983; + long i6984; + long i6985; + long i6986; + long i6987; + long i6988; + long i6989; + long i6990; + long i6991; + long i6992; + long i6993; + long i6994; + long i6995; + long i6996; + long i6997; + long i6998; + long i6999; + long i7000; + long i7001; + long i7002; + long i7003; + long i7004; + long i7005; + long i7006; + long i7007; + long i7008; + long i7009; + long i7010; + long i7011; + long i7012; + long i7013; + long i7014; + long i7015; + long i7016; + long i7017; + long i7018; + long i7019; + long i7020; + long i7021; + long i7022; + long i7023; + long i7024; + long i7025; + long i7026; + long i7027; + long i7028; + long i7029; + long i7030; + long i7031; + long i7032; + long i7033; + long i7034; + long i7035; + long i7036; + long i7037; + long i7038; + long i7039; + long i7040; + long i7041; + long i7042; + long i7043; + long i7044; + long i7045; + long i7046; + long i7047; + long i7048; + long i7049; + long i7050; + long i7051; + long i7052; + long i7053; + long i7054; + long i7055; + long i7056; + long i7057; + long i7058; + long i7059; + long i7060; + long i7061; + long i7062; + long i7063; + long i7064; + long i7065; + long i7066; + long i7067; + long i7068; + long i7069; + long i7070; + long i7071; + long i7072; + long i7073; + long i7074; + long i7075; + long i7076; + long i7077; + long i7078; + long i7079; + long i7080; + long i7081; + long i7082; + long i7083; + long i7084; + long i7085; + long i7086; + long i7087; + long i7088; + long i7089; + long i7090; + long i7091; + long i7092; + long i7093; + long i7094; + long i7095; + long i7096; + long i7097; + long i7098; + long i7099; + long i7100; + long i7101; + long i7102; + long i7103; + long i7104; + long i7105; + long i7106; + long i7107; + long i7108; + long i7109; + long i7110; + long i7111; + long i7112; + long i7113; + long i7114; + long i7115; + long i7116; + long i7117; + long i7118; + long i7119; + long i7120; + long i7121; + long i7122; + long i7123; + long i7124; + long i7125; + long i7126; + long i7127; + long i7128; + long i7129; + long i7130; + long i7131; + long i7132; + long i7133; + long i7134; + long i7135; + long i7136; + long i7137; + long i7138; + long i7139; + long i7140; + long i7141; + long i7142; + long i7143; + long i7144; + long i7145; + long i7146; + long i7147; + long i7148; + long i7149; + long i7150; + long i7151; + long i7152; + long i7153; + long i7154; + long i7155; + long i7156; + long i7157; + long i7158; + long i7159; + long i7160; + long i7161; + long i7162; + long i7163; + long i7164; + long i7165; + long i7166; + long i7167; + long i7168; + long i7169; + long i7170; + long i7171; + long i7172; + long i7173; + long i7174; + long i7175; + long i7176; + long i7177; + long i7178; + long i7179; + long i7180; + long i7181; + long i7182; + long i7183; + long i7184; + long i7185; + long i7186; + long i7187; + long i7188; + long i7189; + long i7190; + long i7191; + long i7192; + long i7193; + long i7194; + long i7195; + long i7196; + long i7197; + long i7198; + long i7199; + long i7200; + long i7201; + long i7202; + long i7203; + long i7204; + long i7205; + long i7206; + long i7207; + long i7208; + long i7209; + long i7210; + long i7211; + long i7212; + long i7213; + long i7214; + long i7215; + long i7216; + long i7217; + long i7218; + long i7219; + long i7220; + long i7221; + long i7222; + long i7223; + long i7224; + long i7225; + long i7226; + long i7227; + long i7228; + long i7229; + long i7230; + long i7231; + long i7232; + long i7233; + long i7234; + long i7235; + long i7236; + long i7237; + long i7238; + long i7239; + long i7240; + long i7241; + long i7242; + long i7243; + long i7244; + long i7245; + long i7246; + long i7247; + long i7248; + long i7249; + long i7250; + long i7251; + long i7252; + long i7253; + long i7254; + long i7255; + long i7256; + long i7257; + long i7258; + long i7259; + long i7260; + long i7261; + long i7262; + long i7263; + long i7264; + long i7265; + long i7266; + long i7267; + long i7268; + long i7269; + long i7270; + long i7271; + long i7272; + long i7273; + long i7274; + long i7275; + long i7276; + long i7277; + long i7278; + long i7279; + long i7280; + long i7281; + long i7282; + long i7283; + long i7284; + long i7285; + long i7286; + long i7287; + long i7288; + long i7289; + long i7290; + long i7291; + long i7292; + long i7293; + long i7294; + long i7295; + long i7296; + long i7297; + long i7298; + long i7299; + long i7300; + long i7301; + long i7302; + long i7303; + long i7304; + long i7305; + long i7306; + long i7307; + long i7308; + long i7309; + long i7310; + long i7311; + long i7312; + long i7313; + long i7314; + long i7315; + long i7316; + long i7317; + long i7318; + long i7319; + long i7320; + long i7321; + long i7322; + long i7323; + long i7324; + long i7325; + long i7326; + long i7327; + long i7328; + long i7329; + long i7330; + long i7331; + long i7332; + long i7333; + long i7334; + long i7335; + long i7336; + long i7337; + long i7338; + long i7339; + long i7340; + long i7341; + long i7342; + long i7343; + long i7344; + long i7345; + long i7346; + long i7347; + long i7348; + long i7349; + long i7350; + long i7351; + long i7352; + long i7353; + long i7354; + long i7355; + long i7356; + long i7357; + long i7358; + long i7359; + long i7360; + long i7361; + long i7362; + long i7363; + long i7364; + long i7365; + long i7366; + long i7367; + long i7368; + long i7369; + long i7370; + long i7371; + long i7372; + long i7373; + long i7374; + long i7375; + long i7376; + long i7377; + long i7378; + long i7379; + long i7380; + long i7381; + long i7382; + long i7383; + long i7384; + long i7385; + long i7386; + long i7387; + long i7388; + long i7389; + long i7390; + long i7391; + long i7392; + long i7393; + long i7394; + long i7395; + long i7396; + long i7397; + long i7398; + long i7399; + long i7400; + long i7401; + long i7402; + long i7403; + long i7404; + long i7405; + long i7406; + long i7407; + long i7408; + long i7409; + long i7410; + long i7411; + long i7412; + long i7413; + long i7414; + long i7415; + long i7416; + long i7417; + long i7418; + long i7419; + long i7420; + long i7421; + long i7422; + long i7423; + long i7424; + long i7425; + long i7426; + long i7427; + long i7428; + long i7429; + long i7430; + long i7431; + long i7432; + long i7433; + long i7434; + long i7435; + long i7436; + long i7437; + long i7438; + long i7439; + long i7440; + long i7441; + long i7442; + long i7443; + long i7444; + long i7445; + long i7446; + long i7447; + long i7448; + long i7449; + long i7450; + long i7451; + long i7452; + long i7453; + long i7454; + long i7455; + long i7456; + long i7457; + long i7458; + long i7459; + long i7460; + long i7461; + long i7462; + long i7463; + long i7464; + long i7465; + long i7466; + long i7467; + long i7468; + long i7469; + long i7470; + long i7471; + long i7472; + long i7473; + long i7474; + long i7475; + long i7476; + long i7477; + long i7478; + long i7479; + long i7480; + long i7481; + long i7482; + long i7483; + long i7484; + long i7485; + long i7486; + long i7487; + long i7488; + long i7489; + long i7490; + long i7491; + long i7492; + long i7493; + long i7494; + long i7495; + long i7496; + long i7497; + long i7498; + long i7499; + long i7500; + long i7501; + long i7502; + long i7503; + long i7504; + long i7505; + long i7506; + long i7507; + long i7508; + long i7509; + long i7510; + long i7511; + long i7512; + long i7513; + long i7514; + long i7515; + long i7516; + long i7517; + long i7518; + long i7519; + long i7520; + long i7521; + long i7522; + long i7523; + long i7524; + long i7525; + long i7526; + long i7527; + long i7528; + long i7529; + long i7530; + long i7531; + long i7532; + long i7533; + long i7534; + long i7535; + long i7536; + long i7537; + long i7538; + long i7539; + long i7540; + long i7541; + long i7542; + long i7543; + long i7544; + long i7545; + long i7546; + long i7547; + long i7548; + long i7549; + long i7550; + long i7551; + long i7552; + long i7553; + long i7554; + long i7555; + long i7556; + long i7557; + long i7558; + long i7559; + long i7560; + long i7561; + long i7562; + long i7563; + long i7564; + long i7565; + long i7566; + long i7567; + long i7568; + long i7569; + long i7570; + long i7571; + long i7572; + long i7573; + long i7574; + long i7575; + long i7576; + long i7577; + long i7578; + long i7579; + long i7580; + long i7581; + long i7582; + long i7583; + long i7584; + long i7585; + long i7586; + long i7587; + long i7588; + long i7589; + long i7590; + long i7591; + long i7592; + long i7593; + long i7594; + long i7595; + long i7596; + long i7597; + long i7598; + long i7599; + long i7600; + long i7601; + long i7602; + long i7603; + long i7604; + long i7605; + long i7606; + long i7607; + long i7608; + long i7609; + long i7610; + long i7611; + long i7612; + long i7613; + long i7614; + long i7615; + long i7616; + long i7617; + long i7618; + long i7619; + long i7620; + long i7621; + long i7622; + long i7623; + long i7624; + long i7625; + long i7626; + long i7627; + long i7628; + long i7629; + long i7630; + long i7631; + long i7632; + long i7633; + long i7634; + long i7635; + long i7636; + long i7637; + long i7638; + long i7639; + long i7640; + long i7641; + long i7642; + long i7643; + long i7644; + long i7645; + long i7646; + long i7647; + long i7648; + long i7649; + long i7650; + long i7651; + long i7652; + long i7653; + long i7654; + long i7655; + long i7656; + long i7657; + long i7658; + long i7659; + long i7660; + long i7661; + long i7662; + long i7663; + long i7664; + long i7665; + long i7666; + long i7667; + long i7668; + long i7669; + long i7670; + long i7671; + long i7672; + long i7673; + long i7674; + long i7675; + long i7676; + long i7677; + long i7678; + long i7679; + long i7680; + long i7681; + long i7682; + long i7683; + long i7684; + long i7685; + long i7686; + long i7687; + long i7688; + long i7689; + long i7690; + long i7691; + long i7692; + long i7693; + long i7694; + long i7695; + long i7696; + long i7697; + long i7698; + long i7699; + long i7700; + long i7701; + long i7702; + long i7703; + long i7704; + long i7705; + long i7706; + long i7707; + long i7708; + long i7709; + long i7710; + long i7711; + long i7712; + long i7713; + long i7714; + long i7715; + long i7716; + long i7717; + long i7718; + long i7719; + long i7720; + long i7721; + long i7722; + long i7723; + long i7724; + long i7725; + long i7726; + long i7727; + long i7728; + long i7729; + long i7730; + long i7731; + long i7732; + long i7733; + long i7734; + long i7735; + long i7736; + long i7737; + long i7738; + long i7739; + long i7740; + long i7741; + long i7742; + long i7743; + long i7744; + long i7745; + long i7746; + long i7747; + long i7748; + long i7749; + long i7750; + long i7751; + long i7752; + long i7753; + long i7754; + long i7755; + long i7756; + long i7757; + long i7758; + long i7759; + long i7760; + long i7761; + long i7762; + long i7763; + long i7764; + long i7765; + long i7766; + long i7767; + long i7768; + long i7769; + long i7770; + long i7771; + long i7772; + long i7773; + long i7774; + long i7775; + long i7776; + long i7777; + long i7778; + long i7779; + long i7780; + long i7781; + long i7782; + long i7783; + long i7784; + long i7785; + long i7786; + long i7787; + long i7788; + long i7789; + long i7790; + long i7791; + long i7792; + long i7793; + long i7794; + long i7795; + long i7796; + long i7797; + long i7798; + long i7799; + long i7800; + long i7801; + long i7802; + long i7803; + long i7804; + long i7805; + long i7806; + long i7807; + long i7808; + long i7809; + long i7810; + long i7811; + long i7812; + long i7813; + long i7814; + long i7815; + long i7816; + long i7817; + long i7818; + long i7819; + long i7820; + long i7821; + long i7822; + long i7823; + long i7824; + long i7825; + long i7826; + long i7827; + long i7828; + long i7829; + long i7830; + long i7831; + long i7832; + long i7833; + long i7834; + long i7835; + long i7836; + long i7837; + long i7838; + long i7839; + long i7840; + long i7841; + long i7842; + long i7843; + long i7844; + long i7845; + long i7846; + long i7847; + long i7848; + long i7849; + long i7850; + long i7851; + long i7852; + long i7853; + long i7854; + long i7855; + long i7856; + long i7857; + long i7858; + long i7859; + long i7860; + long i7861; + long i7862; + long i7863; + long i7864; + long i7865; + long i7866; + long i7867; + long i7868; + long i7869; + long i7870; + long i7871; + long i7872; + long i7873; + long i7874; + long i7875; + long i7876; + long i7877; + long i7878; + long i7879; + long i7880; + long i7881; + long i7882; + long i7883; + long i7884; + long i7885; + long i7886; + long i7887; + long i7888; + long i7889; + long i7890; + long i7891; + long i7892; + long i7893; + long i7894; + long i7895; + long i7896; + long i7897; + long i7898; + long i7899; + long i7900; + long i7901; + long i7902; + long i7903; + long i7904; + long i7905; + long i7906; + long i7907; + long i7908; + long i7909; + long i7910; + long i7911; + long i7912; + long i7913; + long i7914; + long i7915; + long i7916; + long i7917; + long i7918; + long i7919; + long i7920; + long i7921; + long i7922; + long i7923; + long i7924; + long i7925; + long i7926; + long i7927; + long i7928; + long i7929; + long i7930; + long i7931; + long i7932; + long i7933; + long i7934; + long i7935; + long i7936; + long i7937; + long i7938; + long i7939; + long i7940; + long i7941; + long i7942; + long i7943; + long i7944; + long i7945; + long i7946; + long i7947; + long i7948; + long i7949; + long i7950; + long i7951; + long i7952; + long i7953; + long i7954; + long i7955; + long i7956; + long i7957; + long i7958; + long i7959; + long i7960; + long i7961; + long i7962; + long i7963; + long i7964; + long i7965; + long i7966; + long i7967; + long i7968; + long i7969; + long i7970; + long i7971; + long i7972; + long i7973; + long i7974; + long i7975; + long i7976; + long i7977; + long i7978; + long i7979; + long i7980; + long i7981; + long i7982; + long i7983; + long i7984; + long i7985; + long i7986; + long i7987; + long i7988; + long i7989; + long i7990; + long i7991; + long i7992; + long i7993; + long i7994; + long i7995; + long i7996; + long i7997; + long i7998; + long i7999; + long i8000; + long i8001; + long i8002; + long i8003; + long i8004; + long i8005; + long i8006; + long i8007; + long i8008; + long i8009; + long i8010; + long i8011; + long i8012; + long i8013; + long i8014; + long i8015; + long i8016; + long i8017; + long i8018; + long i8019; + long i8020; + long i8021; + long i8022; + long i8023; + long i8024; + long i8025; + long i8026; + long i8027; + long i8028; + long i8029; + long i8030; + long i8031; + long i8032; + long i8033; + long i8034; + long i8035; + long i8036; + long i8037; + long i8038; + long i8039; + long i8040; + long i8041; + long i8042; + long i8043; + long i8044; + long i8045; + long i8046; + long i8047; + long i8048; + long i8049; + long i8050; + long i8051; + long i8052; + long i8053; + long i8054; + long i8055; + long i8056; + long i8057; + long i8058; + long i8059; + long i8060; + long i8061; + long i8062; + long i8063; + long i8064; + long i8065; + long i8066; + long i8067; + long i8068; + long i8069; + long i8070; + long i8071; + long i8072; + long i8073; + long i8074; + long i8075; + long i8076; + long i8077; + long i8078; + long i8079; + long i8080; + long i8081; + long i8082; + long i8083; + long i8084; + long i8085; + long i8086; + long i8087; + long i8088; + long i8089; + long i8090; + long i8091; + long i8092; + long i8093; + long i8094; + long i8095; + long i8096; + long i8097; + long i8098; + long i8099; + long i8100; + long i8101; + long i8102; + long i8103; + long i8104; + long i8105; + long i8106; + long i8107; + long i8108; + long i8109; + long i8110; + long i8111; + long i8112; + long i8113; + long i8114; + long i8115; + long i8116; + long i8117; + long i8118; + long i8119; + long i8120; + long i8121; + long i8122; + long i8123; + long i8124; + long i8125; + long i8126; + long i8127; + long i8128; + long i8129; + long i8130; + long i8131; + long i8132; + long i8133; + long i8134; + long i8135; + long i8136; + long i8137; + long i8138; + long i8139; + long i8140; + long i8141; + long i8142; + long i8143; + long i8144; + long i8145; + long i8146; + long i8147; + long i8148; + long i8149; + long i8150; + long i8151; + long i8152; + long i8153; + long i8154; + long i8155; + long i8156; + long i8157; + long i8158; + long i8159; + long i8160; + long i8161; + long i8162; + long i8163; + long i8164; + long i8165; + long i8166; + long i8167; + long i8168; + long i8169; + long i8170; + long i8171; + long i8172; + long i8173; + long i8174; + long i8175; + long i8176; + long i8177; + long i8178; + long i8179; + long i8180; + long i8181; + long i8182; + long i8183; + long i8184; + long i8185; + long i8186; + long i8187; + long i8188; + long i8189; + } + static class Class131072 extends BaseClass { + long i0; + long i1; + long i2; + long i3; + long i4; + long i5; + long i6; + long i7; + long i8; + long i9; + long i10; + long i11; + long i12; + long i13; + long i14; + long i15; + long i16; + long i17; + long i18; + long i19; + long i20; + long i21; + long i22; + long i23; + long i24; + long i25; + long i26; + long i27; + long i28; + long i29; + long i30; + long i31; + long i32; + long i33; + long i34; + long i35; + long i36; + long i37; + long i38; + long i39; + long i40; + long i41; + long i42; + long i43; + long i44; + long i45; + long i46; + long i47; + long i48; + long i49; + long i50; + long i51; + long i52; + long i53; + long i54; + long i55; + long i56; + long i57; + long i58; + long i59; + long i60; + long i61; + long i62; + long i63; + long i64; + long i65; + long i66; + long i67; + long i68; + long i69; + long i70; + long i71; + long i72; + long i73; + long i74; + long i75; + long i76; + long i77; + long i78; + long i79; + long i80; + long i81; + long i82; + long i83; + long i84; + long i85; + long i86; + long i87; + long i88; + long i89; + long i90; + long i91; + long i92; + long i93; + long i94; + long i95; + long i96; + long i97; + long i98; + long i99; + long i100; + long i101; + long i102; + long i103; + long i104; + long i105; + long i106; + long i107; + long i108; + long i109; + long i110; + long i111; + long i112; + long i113; + long i114; + long i115; + long i116; + long i117; + long i118; + long i119; + long i120; + long i121; + long i122; + long i123; + long i124; + long i125; + long i126; + long i127; + long i128; + long i129; + long i130; + long i131; + long i132; + long i133; + long i134; + long i135; + long i136; + long i137; + long i138; + long i139; + long i140; + long i141; + long i142; + long i143; + long i144; + long i145; + long i146; + long i147; + long i148; + long i149; + long i150; + long i151; + long i152; + long i153; + long i154; + long i155; + long i156; + long i157; + long i158; + long i159; + long i160; + long i161; + long i162; + long i163; + long i164; + long i165; + long i166; + long i167; + long i168; + long i169; + long i170; + long i171; + long i172; + long i173; + long i174; + long i175; + long i176; + long i177; + long i178; + long i179; + long i180; + long i181; + long i182; + long i183; + long i184; + long i185; + long i186; + long i187; + long i188; + long i189; + long i190; + long i191; + long i192; + long i193; + long i194; + long i195; + long i196; + long i197; + long i198; + long i199; + long i200; + long i201; + long i202; + long i203; + long i204; + long i205; + long i206; + long i207; + long i208; + long i209; + long i210; + long i211; + long i212; + long i213; + long i214; + long i215; + long i216; + long i217; + long i218; + long i219; + long i220; + long i221; + long i222; + long i223; + long i224; + long i225; + long i226; + long i227; + long i228; + long i229; + long i230; + long i231; + long i232; + long i233; + long i234; + long i235; + long i236; + long i237; + long i238; + long i239; + long i240; + long i241; + long i242; + long i243; + long i244; + long i245; + long i246; + long i247; + long i248; + long i249; + long i250; + long i251; + long i252; + long i253; + long i254; + long i255; + long i256; + long i257; + long i258; + long i259; + long i260; + long i261; + long i262; + long i263; + long i264; + long i265; + long i266; + long i267; + long i268; + long i269; + long i270; + long i271; + long i272; + long i273; + long i274; + long i275; + long i276; + long i277; + long i278; + long i279; + long i280; + long i281; + long i282; + long i283; + long i284; + long i285; + long i286; + long i287; + long i288; + long i289; + long i290; + long i291; + long i292; + long i293; + long i294; + long i295; + long i296; + long i297; + long i298; + long i299; + long i300; + long i301; + long i302; + long i303; + long i304; + long i305; + long i306; + long i307; + long i308; + long i309; + long i310; + long i311; + long i312; + long i313; + long i314; + long i315; + long i316; + long i317; + long i318; + long i319; + long i320; + long i321; + long i322; + long i323; + long i324; + long i325; + long i326; + long i327; + long i328; + long i329; + long i330; + long i331; + long i332; + long i333; + long i334; + long i335; + long i336; + long i337; + long i338; + long i339; + long i340; + long i341; + long i342; + long i343; + long i344; + long i345; + long i346; + long i347; + long i348; + long i349; + long i350; + long i351; + long i352; + long i353; + long i354; + long i355; + long i356; + long i357; + long i358; + long i359; + long i360; + long i361; + long i362; + long i363; + long i364; + long i365; + long i366; + long i367; + long i368; + long i369; + long i370; + long i371; + long i372; + long i373; + long i374; + long i375; + long i376; + long i377; + long i378; + long i379; + long i380; + long i381; + long i382; + long i383; + long i384; + long i385; + long i386; + long i387; + long i388; + long i389; + long i390; + long i391; + long i392; + long i393; + long i394; + long i395; + long i396; + long i397; + long i398; + long i399; + long i400; + long i401; + long i402; + long i403; + long i404; + long i405; + long i406; + long i407; + long i408; + long i409; + long i410; + long i411; + long i412; + long i413; + long i414; + long i415; + long i416; + long i417; + long i418; + long i419; + long i420; + long i421; + long i422; + long i423; + long i424; + long i425; + long i426; + long i427; + long i428; + long i429; + long i430; + long i431; + long i432; + long i433; + long i434; + long i435; + long i436; + long i437; + long i438; + long i439; + long i440; + long i441; + long i442; + long i443; + long i444; + long i445; + long i446; + long i447; + long i448; + long i449; + long i450; + long i451; + long i452; + long i453; + long i454; + long i455; + long i456; + long i457; + long i458; + long i459; + long i460; + long i461; + long i462; + long i463; + long i464; + long i465; + long i466; + long i467; + long i468; + long i469; + long i470; + long i471; + long i472; + long i473; + long i474; + long i475; + long i476; + long i477; + long i478; + long i479; + long i480; + long i481; + long i482; + long i483; + long i484; + long i485; + long i486; + long i487; + long i488; + long i489; + long i490; + long i491; + long i492; + long i493; + long i494; + long i495; + long i496; + long i497; + long i498; + long i499; + long i500; + long i501; + long i502; + long i503; + long i504; + long i505; + long i506; + long i507; + long i508; + long i509; + long i510; + long i511; + long i512; + long i513; + long i514; + long i515; + long i516; + long i517; + long i518; + long i519; + long i520; + long i521; + long i522; + long i523; + long i524; + long i525; + long i526; + long i527; + long i528; + long i529; + long i530; + long i531; + long i532; + long i533; + long i534; + long i535; + long i536; + long i537; + long i538; + long i539; + long i540; + long i541; + long i542; + long i543; + long i544; + long i545; + long i546; + long i547; + long i548; + long i549; + long i550; + long i551; + long i552; + long i553; + long i554; + long i555; + long i556; + long i557; + long i558; + long i559; + long i560; + long i561; + long i562; + long i563; + long i564; + long i565; + long i566; + long i567; + long i568; + long i569; + long i570; + long i571; + long i572; + long i573; + long i574; + long i575; + long i576; + long i577; + long i578; + long i579; + long i580; + long i581; + long i582; + long i583; + long i584; + long i585; + long i586; + long i587; + long i588; + long i589; + long i590; + long i591; + long i592; + long i593; + long i594; + long i595; + long i596; + long i597; + long i598; + long i599; + long i600; + long i601; + long i602; + long i603; + long i604; + long i605; + long i606; + long i607; + long i608; + long i609; + long i610; + long i611; + long i612; + long i613; + long i614; + long i615; + long i616; + long i617; + long i618; + long i619; + long i620; + long i621; + long i622; + long i623; + long i624; + long i625; + long i626; + long i627; + long i628; + long i629; + long i630; + long i631; + long i632; + long i633; + long i634; + long i635; + long i636; + long i637; + long i638; + long i639; + long i640; + long i641; + long i642; + long i643; + long i644; + long i645; + long i646; + long i647; + long i648; + long i649; + long i650; + long i651; + long i652; + long i653; + long i654; + long i655; + long i656; + long i657; + long i658; + long i659; + long i660; + long i661; + long i662; + long i663; + long i664; + long i665; + long i666; + long i667; + long i668; + long i669; + long i670; + long i671; + long i672; + long i673; + long i674; + long i675; + long i676; + long i677; + long i678; + long i679; + long i680; + long i681; + long i682; + long i683; + long i684; + long i685; + long i686; + long i687; + long i688; + long i689; + long i690; + long i691; + long i692; + long i693; + long i694; + long i695; + long i696; + long i697; + long i698; + long i699; + long i700; + long i701; + long i702; + long i703; + long i704; + long i705; + long i706; + long i707; + long i708; + long i709; + long i710; + long i711; + long i712; + long i713; + long i714; + long i715; + long i716; + long i717; + long i718; + long i719; + long i720; + long i721; + long i722; + long i723; + long i724; + long i725; + long i726; + long i727; + long i728; + long i729; + long i730; + long i731; + long i732; + long i733; + long i734; + long i735; + long i736; + long i737; + long i738; + long i739; + long i740; + long i741; + long i742; + long i743; + long i744; + long i745; + long i746; + long i747; + long i748; + long i749; + long i750; + long i751; + long i752; + long i753; + long i754; + long i755; + long i756; + long i757; + long i758; + long i759; + long i760; + long i761; + long i762; + long i763; + long i764; + long i765; + long i766; + long i767; + long i768; + long i769; + long i770; + long i771; + long i772; + long i773; + long i774; + long i775; + long i776; + long i777; + long i778; + long i779; + long i780; + long i781; + long i782; + long i783; + long i784; + long i785; + long i786; + long i787; + long i788; + long i789; + long i790; + long i791; + long i792; + long i793; + long i794; + long i795; + long i796; + long i797; + long i798; + long i799; + long i800; + long i801; + long i802; + long i803; + long i804; + long i805; + long i806; + long i807; + long i808; + long i809; + long i810; + long i811; + long i812; + long i813; + long i814; + long i815; + long i816; + long i817; + long i818; + long i819; + long i820; + long i821; + long i822; + long i823; + long i824; + long i825; + long i826; + long i827; + long i828; + long i829; + long i830; + long i831; + long i832; + long i833; + long i834; + long i835; + long i836; + long i837; + long i838; + long i839; + long i840; + long i841; + long i842; + long i843; + long i844; + long i845; + long i846; + long i847; + long i848; + long i849; + long i850; + long i851; + long i852; + long i853; + long i854; + long i855; + long i856; + long i857; + long i858; + long i859; + long i860; + long i861; + long i862; + long i863; + long i864; + long i865; + long i866; + long i867; + long i868; + long i869; + long i870; + long i871; + long i872; + long i873; + long i874; + long i875; + long i876; + long i877; + long i878; + long i879; + long i880; + long i881; + long i882; + long i883; + long i884; + long i885; + long i886; + long i887; + long i888; + long i889; + long i890; + long i891; + long i892; + long i893; + long i894; + long i895; + long i896; + long i897; + long i898; + long i899; + long i900; + long i901; + long i902; + long i903; + long i904; + long i905; + long i906; + long i907; + long i908; + long i909; + long i910; + long i911; + long i912; + long i913; + long i914; + long i915; + long i916; + long i917; + long i918; + long i919; + long i920; + long i921; + long i922; + long i923; + long i924; + long i925; + long i926; + long i927; + long i928; + long i929; + long i930; + long i931; + long i932; + long i933; + long i934; + long i935; + long i936; + long i937; + long i938; + long i939; + long i940; + long i941; + long i942; + long i943; + long i944; + long i945; + long i946; + long i947; + long i948; + long i949; + long i950; + long i951; + long i952; + long i953; + long i954; + long i955; + long i956; + long i957; + long i958; + long i959; + long i960; + long i961; + long i962; + long i963; + long i964; + long i965; + long i966; + long i967; + long i968; + long i969; + long i970; + long i971; + long i972; + long i973; + long i974; + long i975; + long i976; + long i977; + long i978; + long i979; + long i980; + long i981; + long i982; + long i983; + long i984; + long i985; + long i986; + long i987; + long i988; + long i989; + long i990; + long i991; + long i992; + long i993; + long i994; + long i995; + long i996; + long i997; + long i998; + long i999; + long i1000; + long i1001; + long i1002; + long i1003; + long i1004; + long i1005; + long i1006; + long i1007; + long i1008; + long i1009; + long i1010; + long i1011; + long i1012; + long i1013; + long i1014; + long i1015; + long i1016; + long i1017; + long i1018; + long i1019; + long i1020; + long i1021; + long i1022; + long i1023; + long i1024; + long i1025; + long i1026; + long i1027; + long i1028; + long i1029; + long i1030; + long i1031; + long i1032; + long i1033; + long i1034; + long i1035; + long i1036; + long i1037; + long i1038; + long i1039; + long i1040; + long i1041; + long i1042; + long i1043; + long i1044; + long i1045; + long i1046; + long i1047; + long i1048; + long i1049; + long i1050; + long i1051; + long i1052; + long i1053; + long i1054; + long i1055; + long i1056; + long i1057; + long i1058; + long i1059; + long i1060; + long i1061; + long i1062; + long i1063; + long i1064; + long i1065; + long i1066; + long i1067; + long i1068; + long i1069; + long i1070; + long i1071; + long i1072; + long i1073; + long i1074; + long i1075; + long i1076; + long i1077; + long i1078; + long i1079; + long i1080; + long i1081; + long i1082; + long i1083; + long i1084; + long i1085; + long i1086; + long i1087; + long i1088; + long i1089; + long i1090; + long i1091; + long i1092; + long i1093; + long i1094; + long i1095; + long i1096; + long i1097; + long i1098; + long i1099; + long i1100; + long i1101; + long i1102; + long i1103; + long i1104; + long i1105; + long i1106; + long i1107; + long i1108; + long i1109; + long i1110; + long i1111; + long i1112; + long i1113; + long i1114; + long i1115; + long i1116; + long i1117; + long i1118; + long i1119; + long i1120; + long i1121; + long i1122; + long i1123; + long i1124; + long i1125; + long i1126; + long i1127; + long i1128; + long i1129; + long i1130; + long i1131; + long i1132; + long i1133; + long i1134; + long i1135; + long i1136; + long i1137; + long i1138; + long i1139; + long i1140; + long i1141; + long i1142; + long i1143; + long i1144; + long i1145; + long i1146; + long i1147; + long i1148; + long i1149; + long i1150; + long i1151; + long i1152; + long i1153; + long i1154; + long i1155; + long i1156; + long i1157; + long i1158; + long i1159; + long i1160; + long i1161; + long i1162; + long i1163; + long i1164; + long i1165; + long i1166; + long i1167; + long i1168; + long i1169; + long i1170; + long i1171; + long i1172; + long i1173; + long i1174; + long i1175; + long i1176; + long i1177; + long i1178; + long i1179; + long i1180; + long i1181; + long i1182; + long i1183; + long i1184; + long i1185; + long i1186; + long i1187; + long i1188; + long i1189; + long i1190; + long i1191; + long i1192; + long i1193; + long i1194; + long i1195; + long i1196; + long i1197; + long i1198; + long i1199; + long i1200; + long i1201; + long i1202; + long i1203; + long i1204; + long i1205; + long i1206; + long i1207; + long i1208; + long i1209; + long i1210; + long i1211; + long i1212; + long i1213; + long i1214; + long i1215; + long i1216; + long i1217; + long i1218; + long i1219; + long i1220; + long i1221; + long i1222; + long i1223; + long i1224; + long i1225; + long i1226; + long i1227; + long i1228; + long i1229; + long i1230; + long i1231; + long i1232; + long i1233; + long i1234; + long i1235; + long i1236; + long i1237; + long i1238; + long i1239; + long i1240; + long i1241; + long i1242; + long i1243; + long i1244; + long i1245; + long i1246; + long i1247; + long i1248; + long i1249; + long i1250; + long i1251; + long i1252; + long i1253; + long i1254; + long i1255; + long i1256; + long i1257; + long i1258; + long i1259; + long i1260; + long i1261; + long i1262; + long i1263; + long i1264; + long i1265; + long i1266; + long i1267; + long i1268; + long i1269; + long i1270; + long i1271; + long i1272; + long i1273; + long i1274; + long i1275; + long i1276; + long i1277; + long i1278; + long i1279; + long i1280; + long i1281; + long i1282; + long i1283; + long i1284; + long i1285; + long i1286; + long i1287; + long i1288; + long i1289; + long i1290; + long i1291; + long i1292; + long i1293; + long i1294; + long i1295; + long i1296; + long i1297; + long i1298; + long i1299; + long i1300; + long i1301; + long i1302; + long i1303; + long i1304; + long i1305; + long i1306; + long i1307; + long i1308; + long i1309; + long i1310; + long i1311; + long i1312; + long i1313; + long i1314; + long i1315; + long i1316; + long i1317; + long i1318; + long i1319; + long i1320; + long i1321; + long i1322; + long i1323; + long i1324; + long i1325; + long i1326; + long i1327; + long i1328; + long i1329; + long i1330; + long i1331; + long i1332; + long i1333; + long i1334; + long i1335; + long i1336; + long i1337; + long i1338; + long i1339; + long i1340; + long i1341; + long i1342; + long i1343; + long i1344; + long i1345; + long i1346; + long i1347; + long i1348; + long i1349; + long i1350; + long i1351; + long i1352; + long i1353; + long i1354; + long i1355; + long i1356; + long i1357; + long i1358; + long i1359; + long i1360; + long i1361; + long i1362; + long i1363; + long i1364; + long i1365; + long i1366; + long i1367; + long i1368; + long i1369; + long i1370; + long i1371; + long i1372; + long i1373; + long i1374; + long i1375; + long i1376; + long i1377; + long i1378; + long i1379; + long i1380; + long i1381; + long i1382; + long i1383; + long i1384; + long i1385; + long i1386; + long i1387; + long i1388; + long i1389; + long i1390; + long i1391; + long i1392; + long i1393; + long i1394; + long i1395; + long i1396; + long i1397; + long i1398; + long i1399; + long i1400; + long i1401; + long i1402; + long i1403; + long i1404; + long i1405; + long i1406; + long i1407; + long i1408; + long i1409; + long i1410; + long i1411; + long i1412; + long i1413; + long i1414; + long i1415; + long i1416; + long i1417; + long i1418; + long i1419; + long i1420; + long i1421; + long i1422; + long i1423; + long i1424; + long i1425; + long i1426; + long i1427; + long i1428; + long i1429; + long i1430; + long i1431; + long i1432; + long i1433; + long i1434; + long i1435; + long i1436; + long i1437; + long i1438; + long i1439; + long i1440; + long i1441; + long i1442; + long i1443; + long i1444; + long i1445; + long i1446; + long i1447; + long i1448; + long i1449; + long i1450; + long i1451; + long i1452; + long i1453; + long i1454; + long i1455; + long i1456; + long i1457; + long i1458; + long i1459; + long i1460; + long i1461; + long i1462; + long i1463; + long i1464; + long i1465; + long i1466; + long i1467; + long i1468; + long i1469; + long i1470; + long i1471; + long i1472; + long i1473; + long i1474; + long i1475; + long i1476; + long i1477; + long i1478; + long i1479; + long i1480; + long i1481; + long i1482; + long i1483; + long i1484; + long i1485; + long i1486; + long i1487; + long i1488; + long i1489; + long i1490; + long i1491; + long i1492; + long i1493; + long i1494; + long i1495; + long i1496; + long i1497; + long i1498; + long i1499; + long i1500; + long i1501; + long i1502; + long i1503; + long i1504; + long i1505; + long i1506; + long i1507; + long i1508; + long i1509; + long i1510; + long i1511; + long i1512; + long i1513; + long i1514; + long i1515; + long i1516; + long i1517; + long i1518; + long i1519; + long i1520; + long i1521; + long i1522; + long i1523; + long i1524; + long i1525; + long i1526; + long i1527; + long i1528; + long i1529; + long i1530; + long i1531; + long i1532; + long i1533; + long i1534; + long i1535; + long i1536; + long i1537; + long i1538; + long i1539; + long i1540; + long i1541; + long i1542; + long i1543; + long i1544; + long i1545; + long i1546; + long i1547; + long i1548; + long i1549; + long i1550; + long i1551; + long i1552; + long i1553; + long i1554; + long i1555; + long i1556; + long i1557; + long i1558; + long i1559; + long i1560; + long i1561; + long i1562; + long i1563; + long i1564; + long i1565; + long i1566; + long i1567; + long i1568; + long i1569; + long i1570; + long i1571; + long i1572; + long i1573; + long i1574; + long i1575; + long i1576; + long i1577; + long i1578; + long i1579; + long i1580; + long i1581; + long i1582; + long i1583; + long i1584; + long i1585; + long i1586; + long i1587; + long i1588; + long i1589; + long i1590; + long i1591; + long i1592; + long i1593; + long i1594; + long i1595; + long i1596; + long i1597; + long i1598; + long i1599; + long i1600; + long i1601; + long i1602; + long i1603; + long i1604; + long i1605; + long i1606; + long i1607; + long i1608; + long i1609; + long i1610; + long i1611; + long i1612; + long i1613; + long i1614; + long i1615; + long i1616; + long i1617; + long i1618; + long i1619; + long i1620; + long i1621; + long i1622; + long i1623; + long i1624; + long i1625; + long i1626; + long i1627; + long i1628; + long i1629; + long i1630; + long i1631; + long i1632; + long i1633; + long i1634; + long i1635; + long i1636; + long i1637; + long i1638; + long i1639; + long i1640; + long i1641; + long i1642; + long i1643; + long i1644; + long i1645; + long i1646; + long i1647; + long i1648; + long i1649; + long i1650; + long i1651; + long i1652; + long i1653; + long i1654; + long i1655; + long i1656; + long i1657; + long i1658; + long i1659; + long i1660; + long i1661; + long i1662; + long i1663; + long i1664; + long i1665; + long i1666; + long i1667; + long i1668; + long i1669; + long i1670; + long i1671; + long i1672; + long i1673; + long i1674; + long i1675; + long i1676; + long i1677; + long i1678; + long i1679; + long i1680; + long i1681; + long i1682; + long i1683; + long i1684; + long i1685; + long i1686; + long i1687; + long i1688; + long i1689; + long i1690; + long i1691; + long i1692; + long i1693; + long i1694; + long i1695; + long i1696; + long i1697; + long i1698; + long i1699; + long i1700; + long i1701; + long i1702; + long i1703; + long i1704; + long i1705; + long i1706; + long i1707; + long i1708; + long i1709; + long i1710; + long i1711; + long i1712; + long i1713; + long i1714; + long i1715; + long i1716; + long i1717; + long i1718; + long i1719; + long i1720; + long i1721; + long i1722; + long i1723; + long i1724; + long i1725; + long i1726; + long i1727; + long i1728; + long i1729; + long i1730; + long i1731; + long i1732; + long i1733; + long i1734; + long i1735; + long i1736; + long i1737; + long i1738; + long i1739; + long i1740; + long i1741; + long i1742; + long i1743; + long i1744; + long i1745; + long i1746; + long i1747; + long i1748; + long i1749; + long i1750; + long i1751; + long i1752; + long i1753; + long i1754; + long i1755; + long i1756; + long i1757; + long i1758; + long i1759; + long i1760; + long i1761; + long i1762; + long i1763; + long i1764; + long i1765; + long i1766; + long i1767; + long i1768; + long i1769; + long i1770; + long i1771; + long i1772; + long i1773; + long i1774; + long i1775; + long i1776; + long i1777; + long i1778; + long i1779; + long i1780; + long i1781; + long i1782; + long i1783; + long i1784; + long i1785; + long i1786; + long i1787; + long i1788; + long i1789; + long i1790; + long i1791; + long i1792; + long i1793; + long i1794; + long i1795; + long i1796; + long i1797; + long i1798; + long i1799; + long i1800; + long i1801; + long i1802; + long i1803; + long i1804; + long i1805; + long i1806; + long i1807; + long i1808; + long i1809; + long i1810; + long i1811; + long i1812; + long i1813; + long i1814; + long i1815; + long i1816; + long i1817; + long i1818; + long i1819; + long i1820; + long i1821; + long i1822; + long i1823; + long i1824; + long i1825; + long i1826; + long i1827; + long i1828; + long i1829; + long i1830; + long i1831; + long i1832; + long i1833; + long i1834; + long i1835; + long i1836; + long i1837; + long i1838; + long i1839; + long i1840; + long i1841; + long i1842; + long i1843; + long i1844; + long i1845; + long i1846; + long i1847; + long i1848; + long i1849; + long i1850; + long i1851; + long i1852; + long i1853; + long i1854; + long i1855; + long i1856; + long i1857; + long i1858; + long i1859; + long i1860; + long i1861; + long i1862; + long i1863; + long i1864; + long i1865; + long i1866; + long i1867; + long i1868; + long i1869; + long i1870; + long i1871; + long i1872; + long i1873; + long i1874; + long i1875; + long i1876; + long i1877; + long i1878; + long i1879; + long i1880; + long i1881; + long i1882; + long i1883; + long i1884; + long i1885; + long i1886; + long i1887; + long i1888; + long i1889; + long i1890; + long i1891; + long i1892; + long i1893; + long i1894; + long i1895; + long i1896; + long i1897; + long i1898; + long i1899; + long i1900; + long i1901; + long i1902; + long i1903; + long i1904; + long i1905; + long i1906; + long i1907; + long i1908; + long i1909; + long i1910; + long i1911; + long i1912; + long i1913; + long i1914; + long i1915; + long i1916; + long i1917; + long i1918; + long i1919; + long i1920; + long i1921; + long i1922; + long i1923; + long i1924; + long i1925; + long i1926; + long i1927; + long i1928; + long i1929; + long i1930; + long i1931; + long i1932; + long i1933; + long i1934; + long i1935; + long i1936; + long i1937; + long i1938; + long i1939; + long i1940; + long i1941; + long i1942; + long i1943; + long i1944; + long i1945; + long i1946; + long i1947; + long i1948; + long i1949; + long i1950; + long i1951; + long i1952; + long i1953; + long i1954; + long i1955; + long i1956; + long i1957; + long i1958; + long i1959; + long i1960; + long i1961; + long i1962; + long i1963; + long i1964; + long i1965; + long i1966; + long i1967; + long i1968; + long i1969; + long i1970; + long i1971; + long i1972; + long i1973; + long i1974; + long i1975; + long i1976; + long i1977; + long i1978; + long i1979; + long i1980; + long i1981; + long i1982; + long i1983; + long i1984; + long i1985; + long i1986; + long i1987; + long i1988; + long i1989; + long i1990; + long i1991; + long i1992; + long i1993; + long i1994; + long i1995; + long i1996; + long i1997; + long i1998; + long i1999; + long i2000; + long i2001; + long i2002; + long i2003; + long i2004; + long i2005; + long i2006; + long i2007; + long i2008; + long i2009; + long i2010; + long i2011; + long i2012; + long i2013; + long i2014; + long i2015; + long i2016; + long i2017; + long i2018; + long i2019; + long i2020; + long i2021; + long i2022; + long i2023; + long i2024; + long i2025; + long i2026; + long i2027; + long i2028; + long i2029; + long i2030; + long i2031; + long i2032; + long i2033; + long i2034; + long i2035; + long i2036; + long i2037; + long i2038; + long i2039; + long i2040; + long i2041; + long i2042; + long i2043; + long i2044; + long i2045; + long i2046; + long i2047; + long i2048; + long i2049; + long i2050; + long i2051; + long i2052; + long i2053; + long i2054; + long i2055; + long i2056; + long i2057; + long i2058; + long i2059; + long i2060; + long i2061; + long i2062; + long i2063; + long i2064; + long i2065; + long i2066; + long i2067; + long i2068; + long i2069; + long i2070; + long i2071; + long i2072; + long i2073; + long i2074; + long i2075; + long i2076; + long i2077; + long i2078; + long i2079; + long i2080; + long i2081; + long i2082; + long i2083; + long i2084; + long i2085; + long i2086; + long i2087; + long i2088; + long i2089; + long i2090; + long i2091; + long i2092; + long i2093; + long i2094; + long i2095; + long i2096; + long i2097; + long i2098; + long i2099; + long i2100; + long i2101; + long i2102; + long i2103; + long i2104; + long i2105; + long i2106; + long i2107; + long i2108; + long i2109; + long i2110; + long i2111; + long i2112; + long i2113; + long i2114; + long i2115; + long i2116; + long i2117; + long i2118; + long i2119; + long i2120; + long i2121; + long i2122; + long i2123; + long i2124; + long i2125; + long i2126; + long i2127; + long i2128; + long i2129; + long i2130; + long i2131; + long i2132; + long i2133; + long i2134; + long i2135; + long i2136; + long i2137; + long i2138; + long i2139; + long i2140; + long i2141; + long i2142; + long i2143; + long i2144; + long i2145; + long i2146; + long i2147; + long i2148; + long i2149; + long i2150; + long i2151; + long i2152; + long i2153; + long i2154; + long i2155; + long i2156; + long i2157; + long i2158; + long i2159; + long i2160; + long i2161; + long i2162; + long i2163; + long i2164; + long i2165; + long i2166; + long i2167; + long i2168; + long i2169; + long i2170; + long i2171; + long i2172; + long i2173; + long i2174; + long i2175; + long i2176; + long i2177; + long i2178; + long i2179; + long i2180; + long i2181; + long i2182; + long i2183; + long i2184; + long i2185; + long i2186; + long i2187; + long i2188; + long i2189; + long i2190; + long i2191; + long i2192; + long i2193; + long i2194; + long i2195; + long i2196; + long i2197; + long i2198; + long i2199; + long i2200; + long i2201; + long i2202; + long i2203; + long i2204; + long i2205; + long i2206; + long i2207; + long i2208; + long i2209; + long i2210; + long i2211; + long i2212; + long i2213; + long i2214; + long i2215; + long i2216; + long i2217; + long i2218; + long i2219; + long i2220; + long i2221; + long i2222; + long i2223; + long i2224; + long i2225; + long i2226; + long i2227; + long i2228; + long i2229; + long i2230; + long i2231; + long i2232; + long i2233; + long i2234; + long i2235; + long i2236; + long i2237; + long i2238; + long i2239; + long i2240; + long i2241; + long i2242; + long i2243; + long i2244; + long i2245; + long i2246; + long i2247; + long i2248; + long i2249; + long i2250; + long i2251; + long i2252; + long i2253; + long i2254; + long i2255; + long i2256; + long i2257; + long i2258; + long i2259; + long i2260; + long i2261; + long i2262; + long i2263; + long i2264; + long i2265; + long i2266; + long i2267; + long i2268; + long i2269; + long i2270; + long i2271; + long i2272; + long i2273; + long i2274; + long i2275; + long i2276; + long i2277; + long i2278; + long i2279; + long i2280; + long i2281; + long i2282; + long i2283; + long i2284; + long i2285; + long i2286; + long i2287; + long i2288; + long i2289; + long i2290; + long i2291; + long i2292; + long i2293; + long i2294; + long i2295; + long i2296; + long i2297; + long i2298; + long i2299; + long i2300; + long i2301; + long i2302; + long i2303; + long i2304; + long i2305; + long i2306; + long i2307; + long i2308; + long i2309; + long i2310; + long i2311; + long i2312; + long i2313; + long i2314; + long i2315; + long i2316; + long i2317; + long i2318; + long i2319; + long i2320; + long i2321; + long i2322; + long i2323; + long i2324; + long i2325; + long i2326; + long i2327; + long i2328; + long i2329; + long i2330; + long i2331; + long i2332; + long i2333; + long i2334; + long i2335; + long i2336; + long i2337; + long i2338; + long i2339; + long i2340; + long i2341; + long i2342; + long i2343; + long i2344; + long i2345; + long i2346; + long i2347; + long i2348; + long i2349; + long i2350; + long i2351; + long i2352; + long i2353; + long i2354; + long i2355; + long i2356; + long i2357; + long i2358; + long i2359; + long i2360; + long i2361; + long i2362; + long i2363; + long i2364; + long i2365; + long i2366; + long i2367; + long i2368; + long i2369; + long i2370; + long i2371; + long i2372; + long i2373; + long i2374; + long i2375; + long i2376; + long i2377; + long i2378; + long i2379; + long i2380; + long i2381; + long i2382; + long i2383; + long i2384; + long i2385; + long i2386; + long i2387; + long i2388; + long i2389; + long i2390; + long i2391; + long i2392; + long i2393; + long i2394; + long i2395; + long i2396; + long i2397; + long i2398; + long i2399; + long i2400; + long i2401; + long i2402; + long i2403; + long i2404; + long i2405; + long i2406; + long i2407; + long i2408; + long i2409; + long i2410; + long i2411; + long i2412; + long i2413; + long i2414; + long i2415; + long i2416; + long i2417; + long i2418; + long i2419; + long i2420; + long i2421; + long i2422; + long i2423; + long i2424; + long i2425; + long i2426; + long i2427; + long i2428; + long i2429; + long i2430; + long i2431; + long i2432; + long i2433; + long i2434; + long i2435; + long i2436; + long i2437; + long i2438; + long i2439; + long i2440; + long i2441; + long i2442; + long i2443; + long i2444; + long i2445; + long i2446; + long i2447; + long i2448; + long i2449; + long i2450; + long i2451; + long i2452; + long i2453; + long i2454; + long i2455; + long i2456; + long i2457; + long i2458; + long i2459; + long i2460; + long i2461; + long i2462; + long i2463; + long i2464; + long i2465; + long i2466; + long i2467; + long i2468; + long i2469; + long i2470; + long i2471; + long i2472; + long i2473; + long i2474; + long i2475; + long i2476; + long i2477; + long i2478; + long i2479; + long i2480; + long i2481; + long i2482; + long i2483; + long i2484; + long i2485; + long i2486; + long i2487; + long i2488; + long i2489; + long i2490; + long i2491; + long i2492; + long i2493; + long i2494; + long i2495; + long i2496; + long i2497; + long i2498; + long i2499; + long i2500; + long i2501; + long i2502; + long i2503; + long i2504; + long i2505; + long i2506; + long i2507; + long i2508; + long i2509; + long i2510; + long i2511; + long i2512; + long i2513; + long i2514; + long i2515; + long i2516; + long i2517; + long i2518; + long i2519; + long i2520; + long i2521; + long i2522; + long i2523; + long i2524; + long i2525; + long i2526; + long i2527; + long i2528; + long i2529; + long i2530; + long i2531; + long i2532; + long i2533; + long i2534; + long i2535; + long i2536; + long i2537; + long i2538; + long i2539; + long i2540; + long i2541; + long i2542; + long i2543; + long i2544; + long i2545; + long i2546; + long i2547; + long i2548; + long i2549; + long i2550; + long i2551; + long i2552; + long i2553; + long i2554; + long i2555; + long i2556; + long i2557; + long i2558; + long i2559; + long i2560; + long i2561; + long i2562; + long i2563; + long i2564; + long i2565; + long i2566; + long i2567; + long i2568; + long i2569; + long i2570; + long i2571; + long i2572; + long i2573; + long i2574; + long i2575; + long i2576; + long i2577; + long i2578; + long i2579; + long i2580; + long i2581; + long i2582; + long i2583; + long i2584; + long i2585; + long i2586; + long i2587; + long i2588; + long i2589; + long i2590; + long i2591; + long i2592; + long i2593; + long i2594; + long i2595; + long i2596; + long i2597; + long i2598; + long i2599; + long i2600; + long i2601; + long i2602; + long i2603; + long i2604; + long i2605; + long i2606; + long i2607; + long i2608; + long i2609; + long i2610; + long i2611; + long i2612; + long i2613; + long i2614; + long i2615; + long i2616; + long i2617; + long i2618; + long i2619; + long i2620; + long i2621; + long i2622; + long i2623; + long i2624; + long i2625; + long i2626; + long i2627; + long i2628; + long i2629; + long i2630; + long i2631; + long i2632; + long i2633; + long i2634; + long i2635; + long i2636; + long i2637; + long i2638; + long i2639; + long i2640; + long i2641; + long i2642; + long i2643; + long i2644; + long i2645; + long i2646; + long i2647; + long i2648; + long i2649; + long i2650; + long i2651; + long i2652; + long i2653; + long i2654; + long i2655; + long i2656; + long i2657; + long i2658; + long i2659; + long i2660; + long i2661; + long i2662; + long i2663; + long i2664; + long i2665; + long i2666; + long i2667; + long i2668; + long i2669; + long i2670; + long i2671; + long i2672; + long i2673; + long i2674; + long i2675; + long i2676; + long i2677; + long i2678; + long i2679; + long i2680; + long i2681; + long i2682; + long i2683; + long i2684; + long i2685; + long i2686; + long i2687; + long i2688; + long i2689; + long i2690; + long i2691; + long i2692; + long i2693; + long i2694; + long i2695; + long i2696; + long i2697; + long i2698; + long i2699; + long i2700; + long i2701; + long i2702; + long i2703; + long i2704; + long i2705; + long i2706; + long i2707; + long i2708; + long i2709; + long i2710; + long i2711; + long i2712; + long i2713; + long i2714; + long i2715; + long i2716; + long i2717; + long i2718; + long i2719; + long i2720; + long i2721; + long i2722; + long i2723; + long i2724; + long i2725; + long i2726; + long i2727; + long i2728; + long i2729; + long i2730; + long i2731; + long i2732; + long i2733; + long i2734; + long i2735; + long i2736; + long i2737; + long i2738; + long i2739; + long i2740; + long i2741; + long i2742; + long i2743; + long i2744; + long i2745; + long i2746; + long i2747; + long i2748; + long i2749; + long i2750; + long i2751; + long i2752; + long i2753; + long i2754; + long i2755; + long i2756; + long i2757; + long i2758; + long i2759; + long i2760; + long i2761; + long i2762; + long i2763; + long i2764; + long i2765; + long i2766; + long i2767; + long i2768; + long i2769; + long i2770; + long i2771; + long i2772; + long i2773; + long i2774; + long i2775; + long i2776; + long i2777; + long i2778; + long i2779; + long i2780; + long i2781; + long i2782; + long i2783; + long i2784; + long i2785; + long i2786; + long i2787; + long i2788; + long i2789; + long i2790; + long i2791; + long i2792; + long i2793; + long i2794; + long i2795; + long i2796; + long i2797; + long i2798; + long i2799; + long i2800; + long i2801; + long i2802; + long i2803; + long i2804; + long i2805; + long i2806; + long i2807; + long i2808; + long i2809; + long i2810; + long i2811; + long i2812; + long i2813; + long i2814; + long i2815; + long i2816; + long i2817; + long i2818; + long i2819; + long i2820; + long i2821; + long i2822; + long i2823; + long i2824; + long i2825; + long i2826; + long i2827; + long i2828; + long i2829; + long i2830; + long i2831; + long i2832; + long i2833; + long i2834; + long i2835; + long i2836; + long i2837; + long i2838; + long i2839; + long i2840; + long i2841; + long i2842; + long i2843; + long i2844; + long i2845; + long i2846; + long i2847; + long i2848; + long i2849; + long i2850; + long i2851; + long i2852; + long i2853; + long i2854; + long i2855; + long i2856; + long i2857; + long i2858; + long i2859; + long i2860; + long i2861; + long i2862; + long i2863; + long i2864; + long i2865; + long i2866; + long i2867; + long i2868; + long i2869; + long i2870; + long i2871; + long i2872; + long i2873; + long i2874; + long i2875; + long i2876; + long i2877; + long i2878; + long i2879; + long i2880; + long i2881; + long i2882; + long i2883; + long i2884; + long i2885; + long i2886; + long i2887; + long i2888; + long i2889; + long i2890; + long i2891; + long i2892; + long i2893; + long i2894; + long i2895; + long i2896; + long i2897; + long i2898; + long i2899; + long i2900; + long i2901; + long i2902; + long i2903; + long i2904; + long i2905; + long i2906; + long i2907; + long i2908; + long i2909; + long i2910; + long i2911; + long i2912; + long i2913; + long i2914; + long i2915; + long i2916; + long i2917; + long i2918; + long i2919; + long i2920; + long i2921; + long i2922; + long i2923; + long i2924; + long i2925; + long i2926; + long i2927; + long i2928; + long i2929; + long i2930; + long i2931; + long i2932; + long i2933; + long i2934; + long i2935; + long i2936; + long i2937; + long i2938; + long i2939; + long i2940; + long i2941; + long i2942; + long i2943; + long i2944; + long i2945; + long i2946; + long i2947; + long i2948; + long i2949; + long i2950; + long i2951; + long i2952; + long i2953; + long i2954; + long i2955; + long i2956; + long i2957; + long i2958; + long i2959; + long i2960; + long i2961; + long i2962; + long i2963; + long i2964; + long i2965; + long i2966; + long i2967; + long i2968; + long i2969; + long i2970; + long i2971; + long i2972; + long i2973; + long i2974; + long i2975; + long i2976; + long i2977; + long i2978; + long i2979; + long i2980; + long i2981; + long i2982; + long i2983; + long i2984; + long i2985; + long i2986; + long i2987; + long i2988; + long i2989; + long i2990; + long i2991; + long i2992; + long i2993; + long i2994; + long i2995; + long i2996; + long i2997; + long i2998; + long i2999; + long i3000; + long i3001; + long i3002; + long i3003; + long i3004; + long i3005; + long i3006; + long i3007; + long i3008; + long i3009; + long i3010; + long i3011; + long i3012; + long i3013; + long i3014; + long i3015; + long i3016; + long i3017; + long i3018; + long i3019; + long i3020; + long i3021; + long i3022; + long i3023; + long i3024; + long i3025; + long i3026; + long i3027; + long i3028; + long i3029; + long i3030; + long i3031; + long i3032; + long i3033; + long i3034; + long i3035; + long i3036; + long i3037; + long i3038; + long i3039; + long i3040; + long i3041; + long i3042; + long i3043; + long i3044; + long i3045; + long i3046; + long i3047; + long i3048; + long i3049; + long i3050; + long i3051; + long i3052; + long i3053; + long i3054; + long i3055; + long i3056; + long i3057; + long i3058; + long i3059; + long i3060; + long i3061; + long i3062; + long i3063; + long i3064; + long i3065; + long i3066; + long i3067; + long i3068; + long i3069; + long i3070; + long i3071; + long i3072; + long i3073; + long i3074; + long i3075; + long i3076; + long i3077; + long i3078; + long i3079; + long i3080; + long i3081; + long i3082; + long i3083; + long i3084; + long i3085; + long i3086; + long i3087; + long i3088; + long i3089; + long i3090; + long i3091; + long i3092; + long i3093; + long i3094; + long i3095; + long i3096; + long i3097; + long i3098; + long i3099; + long i3100; + long i3101; + long i3102; + long i3103; + long i3104; + long i3105; + long i3106; + long i3107; + long i3108; + long i3109; + long i3110; + long i3111; + long i3112; + long i3113; + long i3114; + long i3115; + long i3116; + long i3117; +