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