Mercurial > hg > graal-compiler
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() {