changeset 20173:c6ba61a3d05a

Add getAddress/putAddress to Unsafe plugin.
author twisti
date Mon, 06 Apr 2015 08:48:36 -0700
parents 3648df587223
children 56f721367c0d e7ece52e1ff3
files graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/UnsafeSubstitutionsTest.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java
diffstat 2 files changed, 27 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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() {