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