diff --git a/8195685.jdk9.patch b/8195685.jdk9.patch deleted file mode 100644 index 6e7077a..0000000 --- a/8195685.jdk9.patch +++ /dev/null @@ -1,286 +0,0 @@ -diff -r bb73b31e70e3 src/cpu/aarch64/vm/macroAssembler_aarch64.cpp ---- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Tue Dec 19 15:25:42 2017 -0800 -+++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Fri Jan 19 17:02:15 2018 +0000 -@@ -927,8 +927,12 @@ - RegisterOrConstant itable_index, - Register method_result, - Register scan_temp, -- Label& L_no_such_interface) { -- assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); -+ Label& L_no_such_interface, -+ bool return_method) { -+ assert_different_registers(recv_klass, intf_klass, scan_temp); -+ assert_different_registers(method_result, intf_klass, scan_temp); -+ assert(recv_klass != method_result || !return_method, -+ "recv_klass can be destroyed when method isn't needed"); - assert(itable_index.is_constant() || itable_index.as_register() == method_result, - "caller must use same register for non-constant itable index as for method"); - -@@ -946,12 +950,14 @@ - lea(scan_temp, Address(recv_klass, scan_temp, Address::lsl(3))); - add(scan_temp, scan_temp, vtable_base); - -- // Adjust recv_klass by scaled itable_index, so we can free itable_index. -- assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); -- // lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); -- lea(recv_klass, Address(recv_klass, itable_index, Address::lsl(3))); -- if (itentry_off) -- add(recv_klass, recv_klass, itentry_off); -+ if (return_method) { -+ // Adjust recv_klass by scaled itable_index, so we can free itable_index. -+ assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); -+ // lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); -+ lea(recv_klass, Address(recv_klass, itable_index, Address::lsl(3))); -+ if (itentry_off) -+ add(recv_klass, recv_klass, itentry_off); -+ } - - // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { - // if (scan->interface() == intf) { -@@ -985,8 +991,10 @@ - bind(found_method); - - // Got a hit. -- ldr(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes())); -- ldr(method_result, Address(recv_klass, scan_temp)); -+ if (return_method) { -+ ldrw(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes())); -+ ldr(method_result, Address(recv_klass, scan_temp, Address::uxtw(0))); -+ } - } - - // virtual method calling -diff -r bb73b31e70e3 src/cpu/aarch64/vm/macroAssembler_aarch64.hpp ---- a/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Tue Dec 19 15:25:42 2017 -0800 -+++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Fri Jan 19 17:02:15 2018 +0000 -@@ -870,7 +870,8 @@ - RegisterOrConstant itable_index, - Register method_result, - Register scan_temp, -- Label& no_such_interface); -+ Label& no_such_interface, -+ bool return_method = true); - - // virtual method calling - // n.b. x86 allows RegisterOrConstant for vtable_index -diff -r bb73b31e70e3 src/cpu/aarch64/vm/templateTable_aarch64.cpp ---- a/src/cpu/aarch64/vm/templateTable_aarch64.cpp Tue Dec 19 15:25:42 2017 -0800 -+++ b/src/cpu/aarch64/vm/templateTable_aarch64.cpp Fri Jan 19 17:02:15 2018 +0000 -@@ -3279,11 +3279,11 @@ - transition(vtos, vtos); - assert(byte_no == f1_byte, "use this argument"); - -- prepare_invoke(byte_no, r0, rmethod, // get f1 Klass*, f2 itable index -+ prepare_invoke(byte_no, r0, rmethod, // get f1 Klass*, f2 Method* - r2, r3); // recv, flags - - // r0: interface klass (from f1) -- // rmethod: itable index (from f2) -+ // rmethod: method (from f2) - // r2: receiver - // r3: flags - -@@ -3302,11 +3302,28 @@ - __ null_check(r2, oopDesc::klass_offset_in_bytes()); - __ load_klass(r3, r2); - -+ Label no_such_interface, no_such_method; -+ -+ // Receiver subtype check against REFC. -+ // Superklass in r0. Subklass in r3. Blows rscratch2, r13 -+ __ lookup_interface_method(// inputs: rec. class, interface, itable index -+ r3, r0, noreg, -+ // outputs: scan temp. reg, scan temp. reg -+ rscratch2, r13, -+ no_such_interface, -+ /*return_method=*/false); -+ - // profile this call - __ profile_virtual_call(r3, r13, r19); - -- Label no_such_interface, no_such_method; -- -+ // Get declaring interface class from method, and itable index -+ __ ldr(r0, Address(rmethod, Method::const_offset())); -+ __ ldr(r0, Address(r0, ConstMethod::constants_offset())); -+ __ ldr(r0, Address(r0, ConstantPool::pool_holder_offset_in_bytes())); -+ __ ldrw(rmethod, Address(rmethod, Method::itable_index_offset())); -+ __ subw(rmethod, rmethod, Method::itable_index_max); -+ __ negw(rmethod, rmethod); -+ - __ lookup_interface_method(// inputs: rec. class, interface, itable index - r3, r0, rmethod, - // outputs: method, scan temp. reg -diff -r bb73b31e70e3 src/cpu/aarch64/vm/vtableStubs_aarch64.cpp ---- a/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp Tue Dec 19 15:25:42 2017 -0800 -+++ b/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp Fri Jan 19 17:02:15 2018 +0000 -@@ -29,6 +29,7 @@ - #include "code/vtableStubs.hpp" - #include "interp_masm_aarch64.hpp" - #include "memory/resourceArea.hpp" -+#include "oops/compiledICHolder.hpp" - #include "oops/instanceKlass.hpp" - #include "oops/klassVtable.hpp" - #include "runtime/sharedRuntime.hpp" -@@ -140,28 +141,44 @@ - #endif - - // Entry arguments: -- // rscratch2: Interface -+ // rscratch2: CompiledICHolder - // j_rarg0: Receiver - -- // Free registers (non-args) are r0 (interface), rmethod - -+ // Most registers are in use; we'll use r0, rmethod, r10, r11 -+ const Register recv_klass_reg = r10; -+ const Register holder_klass_reg = r0; // declaring interface klass (DECC) -+ const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC) -+ const Register temp_reg = r11; -+ const Register icholder_reg = rscratch2; -+ -+ Label L_no_such_interface; -+ -+ __ ldr(resolved_klass_reg, Address(icholder_reg, CompiledICHolder::holder_klass_offset())); -+ __ ldr(holder_klass_reg, Address(icholder_reg, CompiledICHolder::holder_metadata_offset())); -+ - // get receiver (need to skip return address on top of stack) -- - assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0"); - // get receiver klass (also an implicit null-check) - address npe_addr = __ pc(); -+ __ load_klass(recv_klass_reg, j_rarg0); - -- // Most registers are in use; we'll use r0, rmethod, r10, r11 -- __ load_klass(r10, j_rarg0); -+ // Receiver subtype check against REFC. -+ // Destroys recv_klass_reg value. -+ __ lookup_interface_method(// inputs: rec. class, interface -+ recv_klass_reg, resolved_klass_reg, noreg, -+ // outputs: scan temp. reg1, scan temp. reg2 -+ recv_klass_reg, temp_reg, -+ L_no_such_interface, -+ /*return_method=*/false); - -- Label throw_icce; -- -- // Get Method* and entrypoint for compiler -+ // Get selected method from declaring class and itable index -+ __ load_klass(recv_klass_reg, j_rarg0); // restore recv_klass_reg - __ lookup_interface_method(// inputs: rec. class, interface, itable index -- r10, rscratch2, itable_index, -- // outputs: method, scan temp. reg -- rmethod, r11, -- throw_icce); -+ recv_klass_reg, holder_klass_reg, itable_index, -+ // outputs: method, scan temp. reg -+ rmethod, temp_reg, -+ L_no_such_interface); - - // method (rmethod): Method* - // j_rarg0: receiver -@@ -183,7 +200,7 @@ - __ ldr(rscratch1, Address(rmethod, Method::from_compiled_offset())); - __ br(rscratch1); - -- __ bind(throw_icce); -+ __ bind(L_no_such_interface); - __ far_jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); - - __ flush(); -@@ -205,11 +222,11 @@ - int size = DebugVtables ? 216 : 0; - if (CountCompiledCalls) - size += 6 * 4; -- // FIXME -+ // FIXME: vtable stubs only need 36 bytes - if (is_vtable_stub) - size += 52; - else -- size += 104; -+ size += 176; - return size; - - // In order to tune these parameters, run the JVM with VM options -@@ -217,33 +234,58 @@ - // actual itable stubs. Run it with -Xmx31G -XX:+UseCompressedOops. - // - // If Universe::narrow_klass_base is nonzero, decoding a compressed -- // class can take zeveral instructions. Run it with -Xmx31G -- // -XX:+UseCompressedOops. -+ // class can take zeveral instructions. - // - // The JVM98 app. _202_jess has a megamorphic interface call. - // The itable code looks like this: -- // Decoding VtableStub itbl[1]@12 -- // ldr w10, [x1,#8] -- // lsl x10, x10, #3 -- // ldr w11, [x10,#280] -- // add x11, x10, x11, uxtx #3 -- // add x11, x11, #0x1b8 -- // ldr x12, [x11] -- // cmp x9, x12 -- // b.eq success -- // loop: -- // cbz x12, throw_icce -- // add x11, x11, #0x10 -- // ldr x12, [x11] -- // cmp x9, x12 -- // b.ne loop -- // success: -- // ldr x11, [x11,#8] -- // ldr x12, [x10,x11] -- // ldr x8, [x12,#72] -- // br x8 -- // throw_icce: -- // b throw_ICCE_entry -+ -+ // ldr xmethod, [xscratch2,#CompiledICHolder::holder_klass_offset] -+ // ldr x0, [xscratch2] -+ // ldr w10, [x1,#oopDesc::klass_offset_in_bytes] -+ // mov xheapbase, #0x3c000000 // #narrow_klass_base -+ // movk xheapbase, #0x3f7, lsl #32 -+ // add x10, xheapbase, x10 -+ // mov xheapbase, #0xe7ff0000 // #heapbase -+ // movk xheapbase, #0x3f7, lsl #32 -+ // ldr w11, [x10,#vtable_length_offset] -+ // add x11, x10, x11, uxtx #3 -+ // add x11, x11, #itableMethodEntry::method_offset_in_bytes -+ // ldr x10, [x11] -+ // cmp xmethod, x10 -+ // b.eq found_method -+ // search: -+ // cbz x10, no_such_interface -+ // add x11, x11, #0x10 -+ // ldr x10, [x11] -+ // cmp xmethod, x10 -+ // b.ne search -+ // found_method: -+ // ldr w10, [x1,#oopDesc::klass_offset_in_bytes] -+ // mov xheapbase, #0x3c000000 // #narrow_klass_base -+ // movk xheapbase, #0x3f7, lsl #32 -+ // add x10, xheapbase, x10 -+ // mov xheapbase, #0xe7ff0000 // #heapbase -+ // movk xheapbase, #0x3f7, lsl #32 -+ // ldr w11, [x10,#vtable_length_offset] -+ // add x11, x10, x11, uxtx #3 -+ // add x11, x11, #itableMethodEntry::method_offset_in_bytes -+ // add x10, x10, #itentry_off -+ // ldr xmethod, [x11] -+ // cmp x0, xmethod -+ // b.eq found_method2 -+ // search2: -+ // cbz xmethod, 0x000003ffa872e6cc -+ // add x11, x11, #0x10 -+ // ldr xmethod, [x11] -+ // cmp x0, xmethod -+ // b.ne search2 -+ // found_method2: -+ // ldr w11, [x11,#itableOffsetEntry::offset_offset_in_bytes] -+ // ldr xmethod, [x10,w11,uxtw] -+ // ldr xscratch1, [xmethod,#Method::from_compiled_offset] -+ // br xscratch1 -+ // no_such_interface: -+ // b throw_ICCE_entry - - } diff --git a/JDK-8195685-cannot-build-with-8174962.patch b/JDK-8195685-cannot-build-with-8174962.patch new file mode 100644 index 0000000..8a34b35 --- /dev/null +++ b/JDK-8195685-cannot-build-with-8174962.patch @@ -0,0 +1,297 @@ +# HG changeset patch +# User aph +# Date 1516971866 -3600 +# Fri Jan 26 14:04:26 2018 +0100 +# Node ID a8b7d1fd5884bcfe816df11f16dd71aec7bdacdb +# Parent f6418daf023ea194db63519e3d13ca6c252028ed +8195685: AArch64: AArch64 cannot build with JDK-8174962 +Reviewed-by: adinn, njian + +diff --git a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp +--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp ++++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp +@@ -927,8 +927,12 @@ + RegisterOrConstant itable_index, + Register method_result, + Register scan_temp, +- Label& L_no_such_interface) { +- assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); ++ Label& L_no_such_interface, ++ bool return_method) { ++ assert_different_registers(recv_klass, intf_klass, scan_temp); ++ assert_different_registers(method_result, intf_klass, scan_temp); ++ assert(recv_klass != method_result || !return_method, ++ "recv_klass can be destroyed when method isn't needed"); + assert(itable_index.is_constant() || itable_index.as_register() == method_result, + "caller must use same register for non-constant itable index as for method"); + +@@ -946,12 +950,14 @@ + lea(scan_temp, Address(recv_klass, scan_temp, Address::lsl(3))); + add(scan_temp, scan_temp, vtable_base); + +- // Adjust recv_klass by scaled itable_index, so we can free itable_index. +- assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); +- // lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); +- lea(recv_klass, Address(recv_klass, itable_index, Address::lsl(3))); +- if (itentry_off) +- add(recv_klass, recv_klass, itentry_off); ++ if (return_method) { ++ // Adjust recv_klass by scaled itable_index, so we can free itable_index. ++ assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); ++ // lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); ++ lea(recv_klass, Address(recv_klass, itable_index, Address::lsl(3))); ++ if (itentry_off) ++ add(recv_klass, recv_klass, itentry_off); ++ } + + // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { + // if (scan->interface() == intf) { +@@ -985,8 +991,10 @@ + bind(found_method); + + // Got a hit. +- ldr(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes())); +- ldr(method_result, Address(recv_klass, scan_temp)); ++ if (return_method) { ++ ldrw(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes())); ++ ldr(method_result, Address(recv_klass, scan_temp, Address::uxtw(0))); ++ } + } + + // virtual method calling +diff --git a/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp b/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp +--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp ++++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp +@@ -870,7 +870,8 @@ + RegisterOrConstant itable_index, + Register method_result, + Register scan_temp, +- Label& no_such_interface); ++ Label& no_such_interface, ++ bool return_method = true); + + // virtual method calling + // n.b. x86 allows RegisterOrConstant for vtable_index +diff --git a/src/cpu/aarch64/vm/templateTable_aarch64.cpp b/src/cpu/aarch64/vm/templateTable_aarch64.cpp +--- a/src/cpu/aarch64/vm/templateTable_aarch64.cpp ++++ b/src/cpu/aarch64/vm/templateTable_aarch64.cpp +@@ -3279,11 +3279,11 @@ + transition(vtos, vtos); + assert(byte_no == f1_byte, "use this argument"); + +- prepare_invoke(byte_no, r0, rmethod, // get f1 Klass*, f2 itable index ++ prepare_invoke(byte_no, r0, rmethod, // get f1 Klass*, f2 Method* + r2, r3); // recv, flags + + // r0: interface klass (from f1) +- // rmethod: itable index (from f2) ++ // rmethod: method (from f2) + // r2: receiver + // r3: flags + +@@ -3302,11 +3302,28 @@ + __ null_check(r2, oopDesc::klass_offset_in_bytes()); + __ load_klass(r3, r2); + ++ Label no_such_interface, no_such_method; ++ ++ // Receiver subtype check against REFC. ++ // Superklass in r0. Subklass in r3. Blows rscratch2, r13 ++ __ lookup_interface_method(// inputs: rec. class, interface, itable index ++ r3, r0, noreg, ++ // outputs: scan temp. reg, scan temp. reg ++ rscratch2, r13, ++ no_such_interface, ++ /*return_method=*/false); ++ + // profile this call + __ profile_virtual_call(r3, r13, r19); + +- Label no_such_interface, no_such_method; +- ++ // Get declaring interface class from method, and itable index ++ __ ldr(r0, Address(rmethod, Method::const_offset())); ++ __ ldr(r0, Address(r0, ConstMethod::constants_offset())); ++ __ ldr(r0, Address(r0, ConstantPool::pool_holder_offset_in_bytes())); ++ __ ldrw(rmethod, Address(rmethod, Method::itable_index_offset())); ++ __ subw(rmethod, rmethod, Method::itable_index_max); ++ __ negw(rmethod, rmethod); ++ + __ lookup_interface_method(// inputs: rec. class, interface, itable index + r3, r0, rmethod, + // outputs: method, scan temp. reg +diff --git a/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp b/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp +--- a/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp ++++ b/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp +@@ -29,6 +29,7 @@ + #include "code/vtableStubs.hpp" + #include "interp_masm_aarch64.hpp" + #include "memory/resourceArea.hpp" ++#include "oops/compiledICHolder.hpp" + #include "oops/instanceKlass.hpp" + #include "oops/klassVtable.hpp" + #include "runtime/sharedRuntime.hpp" +@@ -140,28 +141,44 @@ + #endif + + // Entry arguments: +- // rscratch2: Interface ++ // rscratch2: CompiledICHolder + // j_rarg0: Receiver + +- // Free registers (non-args) are r0 (interface), rmethod + ++ // Most registers are in use; we'll use r0, rmethod, r10, r11 ++ const Register recv_klass_reg = r10; ++ const Register holder_klass_reg = r0; // declaring interface klass (DECC) ++ const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC) ++ const Register temp_reg = r11; ++ const Register icholder_reg = rscratch2; ++ ++ Label L_no_such_interface; ++ ++ __ ldr(resolved_klass_reg, Address(icholder_reg, CompiledICHolder::holder_klass_offset())); ++ __ ldr(holder_klass_reg, Address(icholder_reg, CompiledICHolder::holder_metadata_offset())); ++ + // get receiver (need to skip return address on top of stack) +- + assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0"); + // get receiver klass (also an implicit null-check) + address npe_addr = __ pc(); +- +- // Most registers are in use; we'll use r0, rmethod, r10, r11 +- __ load_klass(r10, j_rarg0); +- +- Label throw_icce; ++ __ load_klass(recv_klass_reg, j_rarg0); + +- // Get Method* and entrypoint for compiler ++ // Receiver subtype check against REFC. ++ // Destroys recv_klass_reg value. ++ __ lookup_interface_method(// inputs: rec. class, interface ++ recv_klass_reg, resolved_klass_reg, noreg, ++ // outputs: scan temp. reg1, scan temp. reg2 ++ recv_klass_reg, temp_reg, ++ L_no_such_interface, ++ /*return_method=*/false); ++ ++ // Get selected method from declaring class and itable index ++ __ load_klass(recv_klass_reg, j_rarg0); // restore recv_klass_reg + __ lookup_interface_method(// inputs: rec. class, interface, itable index +- r10, rscratch2, itable_index, +- // outputs: method, scan temp. reg +- rmethod, r11, +- throw_icce); ++ recv_klass_reg, holder_klass_reg, itable_index, ++ // outputs: method, scan temp. reg ++ rmethod, temp_reg, ++ L_no_such_interface); + + // method (rmethod): Method* + // j_rarg0: receiver +@@ -183,7 +200,7 @@ + __ ldr(rscratch1, Address(rmethod, Method::from_compiled_offset())); + __ br(rscratch1); + +- __ bind(throw_icce); ++ __ bind(L_no_such_interface); + __ far_jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); + + __ flush(); +@@ -205,11 +222,11 @@ + int size = DebugVtables ? 216 : 0; + if (CountCompiledCalls) + size += 6 * 4; +- // FIXME ++ // FIXME: vtable stubs only need 36 bytes + if (is_vtable_stub) + size += 52; + else +- size += 104; ++ size += 176; + return size; + + // In order to tune these parameters, run the JVM with VM options +@@ -217,33 +234,58 @@ + // actual itable stubs. Run it with -Xmx31G -XX:+UseCompressedOops. + // + // If Universe::narrow_klass_base is nonzero, decoding a compressed +- // class can take zeveral instructions. Run it with -Xmx31G +- // -XX:+UseCompressedOops. ++ // class can take zeveral instructions. + // + // The JVM98 app. _202_jess has a megamorphic interface call. + // The itable code looks like this: +- // Decoding VtableStub itbl[1]@12 +- // ldr w10, [x1,#8] +- // lsl x10, x10, #3 +- // ldr w11, [x10,#280] +- // add x11, x10, x11, uxtx #3 +- // add x11, x11, #0x1b8 +- // ldr x12, [x11] +- // cmp x9, x12 +- // b.eq success +- // loop: +- // cbz x12, throw_icce +- // add x11, x11, #0x10 +- // ldr x12, [x11] +- // cmp x9, x12 +- // b.ne loop +- // success: +- // ldr x11, [x11,#8] +- // ldr x12, [x10,x11] +- // ldr x8, [x12,#72] +- // br x8 +- // throw_icce: +- // b throw_ICCE_entry ++ ++ // ldr xmethod, [xscratch2,#CompiledICHolder::holder_klass_offset] ++ // ldr x0, [xscratch2] ++ // ldr w10, [x1,#oopDesc::klass_offset_in_bytes] ++ // mov xheapbase, #0x3c000000 // #narrow_klass_base ++ // movk xheapbase, #0x3f7, lsl #32 ++ // add x10, xheapbase, x10 ++ // mov xheapbase, #0xe7ff0000 // #heapbase ++ // movk xheapbase, #0x3f7, lsl #32 ++ // ldr w11, [x10,#vtable_length_offset] ++ // add x11, x10, x11, uxtx #3 ++ // add x11, x11, #itableMethodEntry::method_offset_in_bytes ++ // ldr x10, [x11] ++ // cmp xmethod, x10 ++ // b.eq found_method ++ // search: ++ // cbz x10, no_such_interface ++ // add x11, x11, #0x10 ++ // ldr x10, [x11] ++ // cmp xmethod, x10 ++ // b.ne search ++ // found_method: ++ // ldr w10, [x1,#oopDesc::klass_offset_in_bytes] ++ // mov xheapbase, #0x3c000000 // #narrow_klass_base ++ // movk xheapbase, #0x3f7, lsl #32 ++ // add x10, xheapbase, x10 ++ // mov xheapbase, #0xe7ff0000 // #heapbase ++ // movk xheapbase, #0x3f7, lsl #32 ++ // ldr w11, [x10,#vtable_length_offset] ++ // add x11, x10, x11, uxtx #3 ++ // add x11, x11, #itableMethodEntry::method_offset_in_bytes ++ // add x10, x10, #itentry_off ++ // ldr xmethod, [x11] ++ // cmp x0, xmethod ++ // b.eq found_method2 ++ // search2: ++ // cbz xmethod, 0x000003ffa872e6cc ++ // add x11, x11, #0x10 ++ // ldr xmethod, [x11] ++ // cmp x0, xmethod ++ // b.ne search2 ++ // found_method2: ++ // ldr w11, [x11,#itableOffsetEntry::offset_offset_in_bytes] ++ // ldr xmethod, [x10,w11,uxtw] ++ // ldr xscratch1, [xmethod,#Method::from_compiled_offset] ++ // br xscratch1 ++ // no_such_interface: ++ // b throw_ICCE_entry + + } + diff --git a/JDK-8195859-vtableStubs-gtest-fails-after-8174962.patch b/JDK-8195859-vtableStubs-gtest-fails-after-8174962.patch new file mode 100644 index 0000000..a4f588c --- /dev/null +++ b/JDK-8195859-vtableStubs-gtest-fails-after-8174962.patch @@ -0,0 +1,23 @@ +# HG changeset patch +# User adinn +# Date 1516891647 0 +# Thu Jan 25 14:47:27 2018 +0000 +# Node ID e321560ac819c05274c59f46f5cc28ccfd4b38ec +# Parent 77baeab90732e7cfb6eb1b754a768a197bca1ab5 +8195859: AArch64: vtableStubs gtest fails after 8174962 +Summary: gtest vtableStubs introduced by 8174962 fails on AArch64 with an invalid insn encoding +Reviewed-by: duke + +diff --git a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp +--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp ++++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp +@@ -1049,7 +1049,8 @@ + ldr(method_result, Address(method_result, vtable_offset_in_bytes)); + } else { + vtable_offset_in_bytes += vtable_index.as_constant() * wordSize; +- ldr(method_result, Address(recv_klass, vtable_offset_in_bytes)); ++ ldr(method_result, ++ form_address(rscratch1, recv_klass, vtable_offset_in_bytes)); + } + } + diff --git a/JDK-8196136-correct-register-use-8195685.patch b/JDK-8196136-correct-register-use-8195685.patch new file mode 100644 index 0000000..dbdc223 --- /dev/null +++ b/JDK-8196136-correct-register-use-8195685.patch @@ -0,0 +1,61 @@ +# HG changeset patch +# User adinn +# Date 1516881392 0 +# Thu Jan 25 11:56:32 2018 +0000 +# Node ID 51d97ee431ff04f126c436b25dc75de7e0d2d4dd +# Parent 2da4a52715d837b639edcfe37c66e5428c023abd +8196136: AArch64: Correct register use in patch for JDK-8195685 +Summary: itable stubs must not use java argument registers as scratch registers +Reviewed-by: aph + +diff --git a/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp b/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp +--- a/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp ++++ b/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp +@@ -63,8 +63,8 @@ + + #ifndef PRODUCT + if (CountCompiledCalls) { +- __ lea(r19, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr())); +- __ incrementw(Address(r19)); ++ __ lea(r16, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr())); ++ __ incrementw(Address(r16)); + } + #endif + +@@ -73,13 +73,13 @@ + + // get receiver klass + address npe_addr = __ pc(); +- __ load_klass(r19, j_rarg0); ++ __ load_klass(r16, j_rarg0); + + #ifndef PRODUCT + if (DebugVtables) { + Label L; + // check offset vs vtable length +- __ ldrw(rscratch1, Address(r19, Klass::vtable_length_offset())); ++ __ ldrw(rscratch1, Address(r16, Klass::vtable_length_offset())); + __ cmpw(rscratch1, vtable_index * vtableEntry::size()); + __ br(Assembler::GT, L); + __ enter(); +@@ -91,7 +91,7 @@ + } + #endif // PRODUCT + +- __ lookup_virtual_method(r19, vtable_index, rmethod); ++ __ lookup_virtual_method(r16, vtable_index, rmethod); + + if (DebugVtables) { + Label L; +@@ -145,9 +145,9 @@ + // j_rarg0: Receiver + + +- // Most registers are in use; we'll use r0, rmethod, r10, r11 ++ // Most registers are in use; we'll use r16, rmethod, r10, r11 + const Register recv_klass_reg = r10; +- const Register holder_klass_reg = r0; // declaring interface klass (DECC) ++ const Register holder_klass_reg = r16; // declaring interface klass (DECC) + const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC) + const Register temp_reg = r11; + const Register icholder_reg = rscratch2; diff --git a/java-9-openjdk.spec b/java-9-openjdk.spec index 46137bf..ef605f2 100644 --- a/java-9-openjdk.spec +++ b/java-9-openjdk.spec @@ -853,7 +853,7 @@ Provides: java-%{javaver}-%{origin}-accessiblity = %{epoch}:%{version}-%{release Name: java-%{majorver}-%{origin} Version: %{newjavaver}.%{buildver} -Release: 3%{?dist} +Release: 4%{?dist} # java-1.5.0-ibm from jpackage.org set Epoch to 1 for unknown reasons, # and this change was brought into RHEL-4. java-1.5.0-ibm packages # also included the epoch in their virtual provides. This created a @@ -932,8 +932,15 @@ Patch104: bootcycle_jobs.patch Patch400: ppc_stack_overflow_fix.patch Patch401: aarch64BuildFailure.patch -# Fix for: Aarch64 fails to build in 9.0.4+11 (January 2018 CPU) -Patch402: 8195685.jdk9.patch + +# Fix AArch64 build issues which got introduced with 9.0.4+11 (January 2018 CPU) +# +# JDK-8195685 AArch64 cannot build with JDK-8174962 +# JDK-8196136 AArch64: Correct register use in patch for JDK-8195685 +# JDK-8195859 AArch64: vtableStubs gtest fails after 8174962 +Patch402: JDK-8195685-cannot-build-with-8174962.patch +Patch403: JDK-8196136-correct-register-use-8195685.patch +Patch404: JDK-8195859-vtableStubs-gtest-fails-after-8174962.patch # Non-OpenJDK fixes Patch1000: enableCommentedOutSystemNss.patch @@ -1244,6 +1251,8 @@ sh %{SOURCE12} %patch401 -p1 pushd hotspot %patch402 -p1 +%patch403 -p1 +%patch404 -p1 popd popd # openjdk @@ -1828,6 +1837,10 @@ require "copy_jdk_configs.lua" %changelog +* Fri Jan 26 2018 Severin Gehwolf - 1:9.0.4.11-4 +- Update AArch64 patch series (3) from upstream which fix + FTBFS on AArch64 post-January CPU. + * Mon Jan 22 2018 Severin Gehwolf - 1:9.0.4.11-3 - Add Aarch64 patch for 8195685. Broken Aarch64 after 9.0.4.