@@ -928,13 +928,58 @@ bool os::print_function_and_library_name(outputStream* st,
928
928
return have_function_name || have_library_name;
929
929
}
930
930
931
- ATTRIBUTE_NO_ASAN static void print_hex_readable_pointer (outputStream* st, address p,
932
- int unitsize) {
933
- switch (unitsize) {
934
- case 1 : st->print (" %02x" , *(u1*)p); break ;
935
- case 2 : st->print (" %04x" , *(u2*)p); break ;
936
- case 4 : st->print (" %08x" , *(u4*)p); break ;
937
- case 8 : st->print (" %016" FORMAT64_MODIFIER " x" , *(u8*)p); break ;
931
+ ATTRIBUTE_NO_ASAN static bool read_safely_from (intptr_t * p, intptr_t * result) {
932
+ const intptr_t errval = 0x1717 ;
933
+ intptr_t i = SafeFetchN (p, errval);
934
+ if (i == errval) {
935
+ i = SafeFetchN (p, ~errval);
936
+ if (i == ~errval) {
937
+ return false ;
938
+ }
939
+ }
940
+ (*result) = i;
941
+ return true ;
942
+ }
943
+
944
+ static void print_hex_location (outputStream* st, address p, int unitsize) {
945
+ address pa = align_down (p, sizeof (intptr_t ));
946
+ #ifndef _LP64
947
+ // Special handling for printing qwords on 32-bit platforms
948
+ if (unitsize == 8 ) {
949
+ intptr_t i1, i2;
950
+ if (read_safely_from ((intptr_t *)pa, &i1) &&
951
+ read_safely_from ((intptr_t *)pa + 1 , &i2)) {
952
+ const uint64_t value =
953
+ LITTLE_ENDIAN_ONLY ((((uint64_t )i2) << 32 ) | i1)
954
+ BIG_ENDIAN_ONLY ((((uint64_t )i1) << 32 ) | i2);
955
+ st->print (" %016" FORMAT64_MODIFIER " x" , value);
956
+ } else {
957
+ st->print_raw (" ????????????????" );
958
+ }
959
+ return ;
960
+ }
961
+ #endif // 32-bit, qwords
962
+ intptr_t i = 0 ;
963
+ if (read_safely_from ((intptr_t *)pa, &i)) {
964
+ const int offset = (int )(p - (address)pa);
965
+ const int bitoffset =
966
+ LITTLE_ENDIAN_ONLY (offset * BitsPerByte)
967
+ BIG_ENDIAN_ONLY ((int )(sizeof (intptr_t ) - 1 - offset) * BitsPerByte);
968
+ const int bitfieldsize = unitsize * BitsPerByte;
969
+ intptr_t value = bitfield (i, bitoffset, bitfieldsize);
970
+ switch (unitsize) {
971
+ case 1 : st->print (" %02x" , (u1)value); break ;
972
+ case 2 : st->print (" %04x" , (u2)value); break ;
973
+ case 4 : st->print (" %08x" , (u4)value); break ;
974
+ case 8 : st->print (" %016" FORMAT64_MODIFIER " x" , (u8)value); break ;
975
+ }
976
+ } else {
977
+ switch (unitsize) {
978
+ case 1 : st->print_raw (" ??" ); break ;
979
+ case 2 : st->print_raw (" ????" ); break ;
980
+ case 4 : st->print_raw (" ????????" ); break ;
981
+ case 8 : st->print_raw (" ????????????????" ); break ;
982
+ }
938
983
}
939
984
}
940
985
@@ -955,11 +1000,7 @@ void os::print_hex_dump(outputStream* st, address start, address end, int unitsi
955
1000
// Print out the addresses as if we were starting from logical_start.
956
1001
st->print (PTR_FORMAT " : " , p2i (logical_p));
957
1002
while (p < end) {
958
- if (is_readable_pointer (p)) {
959
- print_hex_readable_pointer (st, p, unitsize);
960
- } else {
961
- st->print (" %*.*s" , 2 *unitsize, 2 *unitsize, " ????????????????" );
962
- }
1003
+ print_hex_location (st, p, unitsize);
963
1004
p += unitsize;
964
1005
logical_p += unitsize;
965
1006
cols++;
0 commit comments