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