[aarch64-port-dev ] RFR: 8195685: AArch64: AArch64 cannot build with JDK-8174962

Andrew Dinn adinn at redhat.com
Tue Jan 23 10:16:13 UTC 2018


On 23/01/18 08:46, Andrew Dinn wrote:
> I am afraid I messed up by pushing the patch for 8195685 to both
> jdkdev/jdk and jdkdev/hs. While the former was correct and approved by
> Vladimir the latter was a stupid neglect of the appropriate protocol on
> my part. Apologies for making such a mess.
The patch included below reverts the erroneous push of 8195685 to
jdk/hs. I'm not sure of the procedure to get this into the repo but
until that is resolved this can be used by anyone working on AArch64 to
get their hg tree back to a clean state.

regards,


Andrew Dinn
-----------
Senior Principal Software Engineer
Red Hat UK Ltd
Registered in England and Wales under Company Registration No. 03798903
Directors: Michael Cunningham, Michael ("Mike") O'Neill, Eric Shander

----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< ---
# HG changeset patch
# User adinn
# Date 1516702051 0
#      Tue Jan 23 10:07:31 2018 +0000
# Node ID a7e77acacaad73682a6dd70801502dad55450d41
# Parent  8f451978683ce3193c302f6140ecf05afee1754a
revert wrong commit of 8195685

diff -r 8f451978683c -r a7e77acacaad
src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp	Tue Jan 23
08:55:47 2018 +0100
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp	Tue Jan 23
10:07:31 2018 +0000
@@ -963,12 +963,8 @@
                                              RegisterOrConstant
itable_index,
                                              Register method_result,
                                              Register 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");
+                                             Label& L_no_such_interface) {
+  assert_different_registers(recv_klass, intf_klass, method_result,
scan_temp);
   assert(itable_index.is_constant() || itable_index.as_register() ==
method_result,
          "caller must use same register for non-constant itable index
as for method");

@@ -986,14 +982,12 @@
   lea(scan_temp, Address(recv_klass, scan_temp, Address::lsl(3)));
   add(scan_temp, scan_temp, vtable_base);

-  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);
-  }
+  // 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) {
@@ -1027,10 +1021,8 @@
   bind(found_method);

   // Got a hit.
-  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)));
-  }
+  ldr(scan_temp, Address(scan_temp,
itableOffsetEntry::offset_offset_in_bytes()));
+  ldr(method_result, Address(recv_klass, scan_temp));
 }

 // virtual method calling
diff -r 8f451978683c -r a7e77acacaad
src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp	Tue Jan 23
08:55:47 2018 +0100
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp	Tue Jan 23
10:07:31 2018 +0000
@@ -875,8 +875,7 @@
                                RegisterOrConstant itable_index,
                                Register method_result,
                                Register scan_temp,
-                               Label& no_such_interface,
-                   bool return_method = true);
+                               Label& no_such_interface);

   // virtual method calling
   // n.b. x86 allows RegisterOrConstant for vtable_index
diff -r 8f451978683c -r a7e77acacaad
src/hotspot/cpu/aarch64/templateTable_aarch64.cpp
--- a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp	Tue Jan 23
08:55:47 2018 +0100
+++ b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp	Tue Jan 23
10:07:31 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 Method*
+  prepare_invoke(byte_no, r0, rmethod,  // get f1 Klass*, f2 itable index
                  r2, r3); // recv, flags

   // r0: interface klass (from f1)
-  // rmethod: method (from f2)
+  // rmethod: itable index (from f2)
   // r2: receiver
   // r3: flags

@@ -3302,27 +3302,10 @@
   __ 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);

-  // 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);
+  Label no_such_interface, no_such_method;

   __ lookup_interface_method(// inputs: rec. class, interface, itable index
                              r3, r0, rmethod,
diff -r 8f451978683c -r a7e77acacaad
src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp
--- a/src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp	Tue Jan 23
08:55:47 2018 +0100
+++ b/src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp	Tue Jan 23
10:07:31 2018 +0000
@@ -29,7 +29,6 @@
 #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"
@@ -141,44 +140,28 @@
 #endif

   // Entry arguments:
-  //  rscratch2: CompiledICHolder
+  //  rscratch2: Interface
   //  j_rarg0: Receiver

-
-  // 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()));
+  // Free registers (non-args) are r0 (interface), rmethod

   // 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);

-  // 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);
+  // Most registers are in use; we'll use r0, rmethod, r10, r11
+  __ load_klass(r10, j_rarg0);

-  // Get selected method from declaring class and itable index
-  __ load_klass(recv_klass_reg, j_rarg0);   // restore recv_klass_reg
+  Label throw_icce;
+
+  // Get Method* and entrypoint for compiler
   __ lookup_interface_method(// inputs: rec. class, interface, itable index
-                       recv_klass_reg, holder_klass_reg, itable_index,
-                       // outputs: method, scan temp. reg
-                       rmethod, temp_reg,
-                       L_no_such_interface);
+                             r10, rscratch2, itable_index,
+                             // outputs: method, scan temp. reg
+                             rmethod, r11,
+                             throw_icce);

   // method (rmethod): Method*
   // j_rarg0: receiver
@@ -200,7 +183,7 @@
   __ ldr(rscratch1, Address(rmethod, Method::from_compiled_offset()));
   __ br(rscratch1);

-  __ bind(L_no_such_interface);
+  __ bind(throw_icce);
   __
far_jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry()));

   __ flush();
@@ -222,11 +205,11 @@
   int size = DebugVtables ? 216 : 0;
   if (CountCompiledCalls)
     size += 6 * 4;
-  // FIXME: vtable stubs only need 36 bytes
+  // FIXME
   if (is_vtable_stub)
     size += 52;
   else
-    size += 176;
+    size += 104;
   return size;

   // In order to tune these parameters, run the JVM with VM options
@@ -234,58 +217,33 @@
   // actual itable stubs.  Run it with -Xmx31G -XX:+UseCompressedOops.
   //
   // If Universe::narrow_klass_base is nonzero, decoding a compressed
-  // class can take zeveral instructions.
+  // class can take zeveral instructions.  Run it with -Xmx31G
+  // -XX:+UseCompressedOops.
   //
   // The JVM98 app. _202_jess has a megamorphic interface call.
   // The itable code looks like this:
-
-  //    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
+  // 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

 }

----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< ---
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 8195685.revert.patch
Type: text/x-patch
Size: 12201 bytes
Desc: not available
URL: <http://mail.openjdk.java.net/pipermail/jdk-dev/attachments/20180123/762b5b6b/8195685.revert-0001.patch>


More information about the jdk-dev mailing list