bug in hashCode() for values?

mandy chung mandy.chung at oracle.com
Fri Jun 22 18:29:03 UTC 2018


Frederic,

Attached is a simple test reproducing it.  It fails when 
Unsafe::getObject on a field of value type.

Mandy

On 6/22/18 3:05 AM, Roland Westrelin wrote:
> 
> With this patch applied:
> 
> http://cr.openjdk.java.net/~roland/8205340/webrev.00/
> 
> compiler/valhalla/valuetypes/TestIntrinsics.java fails with:
> 
> #  SIGSEGV (0xb) at pc=0x00007f6505fd8462, pid=16347, tid=16348
> #
> # JRE version: OpenJDK Runtime Environment (11.0) (slowdebug build 11-internal+0-adhoc.roland.valhalla)
> # Java VM: OpenJDK 64-Bit Server VM (slowdebug 11-internal+0-adhoc.roland.valhalla, mixed mode, compressed oops, g1 gc, linux-amd64)
> # Problematic frame:
> # V  [libjvm.so+0x31f462]  oopDesc::klass() const+0x1e
> 
> and that crash triggers with -Xint. The crash occurs in Unsafe_GetObject
> with stack trace:
> 
> 1 - frame( sp=0x00007f8cf9946530, unextended_sp=0x00007f8cf9946530, fp=0x00007f8cf99465a0, pc=0x00007f8ce4c4685e)
> jdk.internal.misc.Unsafe.getObject(Native Method)
>   2 - frame( sp=0x00007f8cf99465b0, unextended_sp=0x00007f8cf99465c0, fp=0x00007f8cf9946630, pc=0x00007f8ce4c38300)
> java.lang.invoke.LambdaForm$MH/0x00000008000b0840.invoke
>   3 - frame( sp=0x00007f8cf9946640, unextended_sp=0x00007f8cf9946668, fp=0x00007f8cf99466c8, pc=0x00007f8ce4c38300)
> java.lang.invoke.LambdaForm$MH/0x00000008000cdc40.invoke
>   4 - frame( sp=0x00007f8cf99466d8, unextended_sp=0x00007f8cf99466f0, fp=0x00007f8cf9946750, pc=0x00007f8ce4c38300)
> java.lang.invoke.LambdaForm$MH/0x00000008000cb440.invoke_MT
>   5 - frame( sp=0x00007f8cf9946760, unextended_sp=0x00007f8cf9946768, fp=0x00007f8cf99467e0, pc=0x00007f8ce4c38300)
> java.lang.invoke.ValueBootstrapMethods$ValueBsmFactory.getFieldValue(ValueBootstrapMethods.java:186)
>   6 - frame( sp=0x00007f8cf99467f0, unextended_sp=0x00007f8cf99467e8, fp=0x00007f8cf9946860, pc=0x00007f8ce4c38300)
> java.lang.invoke.LambdaForm$DMH/0x00000008000a4840.invokeStatic
>   7 - frame( sp=0x00007f8cf9946870, unextended_sp=0x00007f8cf9946878, fp=0x00007f8cf99468f0, pc=0x00007f8ce4c38300)
> java.lang.invoke.LambdaForm$MH/0x00000008000b3440.invoke
>   8 - frame( sp=0x00007f8cf9946900, unextended_sp=0x00007f8cf9946910, fp=0x00007f8cf9946988, pc=0x00007f8ce4c38300)
> java.lang.invoke.LambdaForm$MH/0x00000008000c9c40.invoke
>   9 - frame( sp=0x00007f8cf9946998, unextended_sp=0x00007f8cf99469e8, fp=0x00007f8cf9946a48, pc=0x00007f8ce4c38300)
> java.lang.invoke.LambdaForm$MH/0x00000008000cb440.invoke_MT
> 10 - frame( sp=0x00007f8cf9946a58, unextended_sp=0x00007f8cf9946a60, fp=0x00007f8cf9946ac8, pc=0x00007f8ce4c38300)
> java.lang.invoke.ValueBootstrapMethods.invoke(ValueBootstrapMethods.java:262)
> 11 - frame( sp=0x00007f8cf9946ad8, unextended_sp=0x00007f8cf9946ae0, fp=0x00007f8cf9946b40, pc=0x00007f8ce4c38300)
> java.lang.invoke.ValueBootstrapMethods.valueHashCode(ValueBootstrapMethods.java:224)
> 12 - frame( sp=0x00007f8cf9946b50, unextended_sp=0x00007f8cf9946b58, fp=0x00007f8cf9946bb8, pc=0x00007f8ce4c37fc0)
> java.lang.invoke.ValueBootstrapMethods.hashCode(ValueBootstrapMethods.java:204)
> 13 - frame( sp=0x00007f8cf9946bc8, unextended_sp=0x00007f8cf9946bc0, fp=0x00007f8cf9946c28, pc=0x00007f8ce4c37fc0)
> java.lang.invoke.LambdaForm$DMH/0x00000008000c1840.invokeStatic
> 14 - frame( sp=0x00007f8cf9946c38, unextended_sp=0x00007f8cf9946c40, fp=0x00007f8cf9946ca8, pc=0x00007f8ce4c37fc0)
> java.lang.invoke.LambdaForm$MH/0x00000008000ca840.invoke
> 15 - frame( sp=0x00007f8cf9946cb8, unextended_sp=0x00007f8cf9946cc8, fp=0x00007f8cf9946d28, pc=0x00007f8ce4c37fc0)
> java.lang.invoke.LambdaForm$MH/0x00000008000cb040.linkToTargetMethod
> 16 - frame( sp=0x00007f8cf9946d38, unextended_sp=0x00007f8cf9946d38, fp=0x00007f8cf9946d98, pc=0x00007f8ce4c3804a)
> compiler.valhalla.valuetypes.MyValue1.hashCode(MyValue1.java:26)
> 17 - frame( sp=0x00007f8cf9946da8, unextended_sp=0x00007f8cf9946da8, fp=0x00007f8cf9946e00, pc=0x00007f8ce4c37fc0)
> compiler.valhalla.valuetypes.TestIntrinsics.test6(TestIntrinsics.java:142)
> 
> Roland.
> 
-------------- next part --------------

public class ValueHashCode {
    static final __ByValue class Point {
        public final int x;
        public final int y;

        Point() {
            x = 10;
            y = 20;
        }

        public static Point makePoint(int x, int y) {
            Point p = __MakeDefault Point();
            p = __WithField(p.x, x);
            p = __WithField(p.y, y);
            return p;
        }
    }

    static final __ByValue class Point2 {
        final Point p;
        final int i;
        Point2 () {
            p = Point.makePoint(0,0);
            i = 0;
        }
        public static Point2 make(int x, int y, int i) {
            Point2 p = __MakeDefault Point2();
            p = __WithField(p.p, Point.makePoint(x,y));
            p = __WithField(p.i, i);
            return p;
        }
    }
    public static void main(String... args) {
        Point2 p = Point2.make(10, 20, 30);
        p.hashCode();
    }
 }


More information about the valhalla-dev mailing list