[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