RFR(XXS) 8197857 fieldDescriptor prints incorrect 32-bit representation of compressed oops
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Tue Feb 13 20:30:33 UTC 2018
This looks good but this is very odd output. I don't know why we print
this. I wouldn't object if it were removed.
Otherwise, I hate to do this to a trivial change but would this also
print this better?
// Print a hint as to the underlying integer representation. This can
be wrong for
// pointers on an LP64 machine
if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(|| (!UseCompressedOops
&& !is_java_primitive(ft))) ) {
st->print(" (%x %x)", obj->int_field(offset()),
obj->int_field(offset()+sizeof(jint)));
} else if (as_int < 0 || as_int > 9) {
st->print(" (%x)", as_int);
}
Thanks,
Coleen
On 2/13/18 12:28 PM, Ioi Lam wrote:
> https://bugs.openjdk.java.net/browse/JDK-8197857
>
>
> When UseCompressedOops is enabled for 64-bit VMs,
> fieldDescriptor::print_on_for
> prints two 32-bit integers for each object field. E.g.
>
> - 'asTypeCache' 'Ljava/lang/invoke/MethodHandle;' @24 NULL (0 8221b591)
> - final 'argL0' 'Ljava/lang/Object;' @28 a
> 'LambHello$$Lambda$1'{0x00000004110dac88} (8221b591 1)
>
> However, compressed oops occupy the space of only a single 32-bit
> integer, so the superfluous output is confusing.
>
> The above should be printed as
>
> - 'asTypeCache' 'Ljava/lang/invoke/MethodHandle;' @24 NULL (0)
> - final 'argL0' 'Ljava/lang/Object;' @28 a
> 'LambHello$$Lambda$1'{0x00000004110dac88} (8221b591)
>
> Patch:
> =======================================
>
> --- a/src/hotspot/share/runtime/fieldDescriptor.cpp Mon Feb 12
> 09:12:59 2018 -0800
> +++ b/src/hotspot/share/runtime/fieldDescriptor.cpp Tue Feb 13
> 09:24:26 2018 -0800
> @@ -201,6 +201,13 @@
> }
> // Print a hint as to the underlying integer representation. This
> can be wrong for
> // pointers on an LP64 machine
> +
> +#ifdef _LP64
> + if ((ft == T_OBJECT || ft == T_ARRAY) && UseCompressedOops) {
> + st->print(" (%x)", obj->int_field(offset()));
> + }
> + else // <- intended
> +#endif
> if (ft == T_LONG || ft == T_DOUBLE LP64_ONLY(||
> !is_java_primitive(ft)) ) {
> st->print(" (%x %x)", obj->int_field(offset()),
> obj->int_field(offset()+sizeof(jint)));
> } else if (as_int < 0 || as_int > 9) {
>
More information about the hotspot-dev
mailing list