[aarch64-port-dev ] C1: Fix offset overflow when profiling

Andrew Haley aph at redhat.com
Wed Mar 26 10:40:41 UTC 2014


Another offset overflow, revealed during testing.  Hopefully, this is
the last one.

Andrew.



# HG changeset patch
# User aph
# Date 1395830309 14400
#      Wed Mar 26 06:38:29 2014 -0400
# Node ID 378b010e4b60a7a6023576001f20155971412b37
# Parent  08ea774e52a8d87ac4536459c2537ecb7e54e30d
C1: Fix offset overflow when profiling.

diff -r 08ea774e52a8 -r 378b010e4b60 src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
--- a/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp    Tue Mar 25 09:40:50 2014 -0400
+++ b/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp    Wed Mar 26 06:38:29 2014 -0400
@@ -1378,12 +1378,14 @@
       // Object is null; update MDO and exit
       Register mdo  = klass_RInfo;
       __ mov_metadata(mdo, md->constant_encoding());
-      Address data_addr(mdo, md->byte_offset_of_slot(data, DataLayout::header_offset()));
+      Address data_addr
+       = __ form_address(rscratch2, mdo,
+                         md->byte_offset_of_slot(data, DataLayout::DataLayout::header_offset()),
+                         LogBytesPerWord);
       int header_bits = DataLayout::flag_mask_to_header_mask(BitData::null_seen_byte_constant());
-      __ lea(rscratch2, data_addr);
-      __ ldrw(rscratch1, Address(rscratch2));
-      __ orrw(rscratch1, rscratch1, header_bits);
-      __ strw(rscratch1, Address(rscratch2));
+      __ ldr(rscratch1, data_addr);
+      __ orr(rscratch1, rscratch1, header_bits);
+      __ str(rscratch1, data_addr);
       __ b(*obj_is_null);
       __ bind(not_null);
     } else {
@@ -1455,7 +1457,10 @@

     __ bind(profile_cast_failure);
     __ mov_metadata(mdo, md->constant_encoding());
-    Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
+    Address counter_addr
+      = __ form_address(rscratch2, mdo,
+                       md->byte_offset_of_slot(data, CounterData::count_offset()),
+                       LogBytesPerWord);
     __ ldr(rscratch1, counter_addr);
     __ sub(rscratch1, rscratch1, DataLayout::counter_increment);
     __ str(rscratch1, counter_addr);
@@ -2613,7 +2618,7 @@
          __ lea(rscratch2, recv_addr);
           __ str(rscratch1, Address(rscratch2));
           Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
-         __ addptr(counter_addr, DataLayout::counter_increment);
+         __ addptr(data_addr, DataLayout::counter_increment);
           return;
         }
       }


More information about the aarch64-port-dev mailing list