# HG changeset patch # User twisti # Date 1428335316 25200 # Node ID c6ba61a3d05aafaaca9b63ec1d8c38bc23230ec1 # Parent 3648df5872232497b79cfafbd94d426d59830f70 Add getAddress/putAddress to Unsafe plugin. diff -r 3648df587223 -r c6ba61a3d05a graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/UnsafeSubstitutionsTest.java --- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/UnsafeSubstitutionsTest.java Mon Apr 06 13:45:08 2015 +0100 +++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/UnsafeSubstitutionsTest.java Mon Apr 06 08:48:36 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -101,10 +101,14 @@ testGraph("unsafePutShort"); testGraph("unsafePutChar"); testGraph("unsafePutInt"); + testGraph("unsafePutLong"); testGraph("unsafePutFloat"); testGraph("unsafePutDouble"); testGraph("unsafePutObject"); + testGraph("unsafeGetAddress"); + testGraph("unsafePutAddress"); + testGraph("unsafeDirectMemoryRead"); testGraph("unsafeDirectMemoryWrite"); @@ -129,12 +133,16 @@ test("unsafePutShort", unsafeArg, supply(() -> new Foo()), fooOffset("s"), (short) -93); test("unsafePutChar", unsafeArg, supply(() -> new Foo()), fooOffset("c"), 'A'); test("unsafePutInt", unsafeArg, supply(() -> new Foo()), fooOffset("i"), 42); + test("unsafePutLong", unsafeArg, supply(() -> new Foo()), fooOffset("l"), 4711L); test("unsafePutFloat", unsafeArg, supply(() -> new Foo()), fooOffset("f"), 58.0F); test("unsafePutDouble", unsafeArg, supply(() -> new Foo()), fooOffset("d"), -28736.243465D); test("unsafePutObject", unsafeArg, supply(() -> new Foo()), fooOffset("i"), "value1", "value2", "value3"); + test("unsafeGetAddress", unsafeArg, address); + test("unsafePutAddress", unsafeArg, address, 0xDEAD_BEEF_DEAD_BABEL); + test("unsafeDirectMemoryRead", unsafeArg, address); - test("unsafeDirectMemoryWrite", unsafeArg, address, 0xCAFEBABEDEADBABEL); + test("unsafeDirectMemoryWrite", unsafeArg, address, 0xCAFE_BABE_DEAD_BABEL); } unsafe.freeMemory(address); } @@ -304,6 +312,19 @@ } @SuppressWarnings("all") + public static long unsafeGetAddress(Unsafe unsafe, long offset) { + return unsafe.getAddress(offset); + } + + @SuppressWarnings("all") + public static long unsafePutAddress(Unsafe unsafe, long offset, long value) { + long res = 1; + unsafe.putAddress(offset, value); + res += unsafe.getAddress(offset); + return res; + } + + @SuppressWarnings("all") public static double unsafeDirectMemoryRead(Unsafe unsafe, long address) { // Unsafe.getBoolean(long) and Unsafe.getObject(long) do not exist // @formatter:off diff -r 3648df587223 -r c6ba61a3d05a graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java Mon Apr 06 13:45:08 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java Mon Apr 06 08:48:36 2015 -0700 @@ -104,6 +104,10 @@ } } + // Accesses to native memory addresses. + r.register2("getAddress", Receiver.class, long.class, new UnsafeGetPlugin(Kind.Long, false)); + r.register3("putAddress", Receiver.class, long.class, long.class, new UnsafePutPlugin(Kind.Long, false)); + for (Kind kind : new Kind[]{Kind.Int, Kind.Long, Kind.Object}) { Class javaClass = kind == Kind.Object ? Object.class : kind.toJavaClass(); r.register5("compareAndSwap" + kind.name(), Receiver.class, Object.class, long.class, javaClass, javaClass, new InvocationPlugin() {