# HG changeset patch # User Roland Schatz # Date 1416502878 -3600 # Node ID d7cc487d13259b4acd937a1305e60a4f59f92b7f # Parent b8a622c3e99f73bc9fd259790fca86542be8d962 Move HotSpot specific functionality to new subinterface of ConstantReflectionProvider. diff -r b8a622c3e99f -r d7cc487d1325 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MemoryAccessProvider.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MemoryAccessProvider.java Thu Nov 20 17:00:19 2014 +0100 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MemoryAccessProvider.java Thu Nov 20 18:01:18 2014 +0100 @@ -50,12 +50,11 @@ JavaConstant readPrimitiveConstant(Kind kind, Constant base, long displacement, int bits); /** - * Reads a pointer value using a base address and a displacement. + * Reads a Java {@link Object} value using a base address and a displacement. * - * @param type the {@link PointerType} of the returned {@link Constant} object * @param base the base address from which the value is read * @param displacement the displacement within the object in bytes * @return the read value encapsulated in a {@link Constant} object */ - Constant readPointerConstant(PointerType type, Constant base, long displacement); + JavaConstant readObjectConstant(Constant base, long displacement); } diff -r b8a622c3e99f -r d7cc487d1325 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/PointerType.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/PointerType.java Thu Nov 20 17:00:19 2014 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2014, 2014, 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.api.meta; - -public enum PointerType { - Object, - Type, - Method -} diff -r b8a622c3e99f -r d7cc487d1325 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java Thu Nov 20 17:00:19 2014 +0100 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java Thu Nov 20 18:01:18 2014 +0100 @@ -76,6 +76,6 @@ @Override public Constant readConstant(MemoryAccessProvider provider, Constant base, long displacement) { - return provider.readPointerConstant(PointerType.Object, base, displacement); + return provider.readObjectConstant(base, displacement); } } diff -r b8a622c3e99f -r d7cc487d1325 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMemoryAccessProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMemoryAccessProvider.java Thu Nov 20 18:01:18 2014 +0100 @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014, 2014, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.hotspot.meta; + +import com.oracle.graal.api.meta.*; +import com.oracle.graal.hotspot.HotSpotVMConfig.CompressEncoding; + +/** + * HotSpot specific extension of {@link MemoryAccessProvider}. + */ +public interface HotSpotMemoryAccessProvider extends MemoryAccessProvider { + + JavaConstant readNarrowOopConstant(Constant base, long displacement, CompressEncoding encoding); + + Constant readKlassPointerConstant(Constant base, long displacement); + + Constant readNarrowKlassPointerConstant(Constant base, long displacement, CompressEncoding encoding); + + Constant readMethodPointerConstant(Constant base, long displacement); +} diff -r b8a622c3e99f -r d7cc487d1325 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMemoryAccessProviderImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMemoryAccessProviderImpl.java Thu Nov 20 17:00:19 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMemoryAccessProviderImpl.java Thu Nov 20 18:01:18 2014 +0100 @@ -28,11 +28,12 @@ import com.oracle.graal.compiler.common.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; +import com.oracle.graal.hotspot.HotSpotVMConfig.CompressEncoding; /** * HotSpot implementation of {@link MemoryAccessProvider}. */ -public class HotSpotMemoryAccessProviderImpl implements MemoryAccessProvider { +public class HotSpotMemoryAccessProviderImpl implements HotSpotMemoryAccessProvider { protected final HotSpotGraalRuntime runtime; @@ -141,36 +142,36 @@ } } - public Constant readPointerConstant(PointerType type, Constant base, long displacement) { - switch (type) { - case Object: - return HotSpotObjectConstantImpl.forObject(readRawObject(base, displacement, false)); - case Type: - long klass = readRawValue(base, displacement, runtime.getTarget().wordSize * 8); - HotSpotResolvedObjectType metaKlass = HotSpotResolvedObjectTypeImpl.fromMetaspaceKlass(klass); - return HotSpotMetaspaceConstantImpl.forMetaspaceObject(runtime.getTarget().wordKind, klass, metaKlass, false); - case Method: - long method = readRawValue(base, displacement, runtime.getTarget().wordSize * 8); - HotSpotResolvedJavaMethod metaMethod = HotSpotResolvedJavaMethodImpl.fromMetaspace(method); - return HotSpotMetaspaceConstantImpl.forMetaspaceObject(runtime.getTarget().wordKind, method, metaMethod, false); - default: - throw GraalInternalError.shouldNotReachHere(); - } + @Override + public JavaConstant readObjectConstant(Constant base, long displacement) { + return HotSpotObjectConstantImpl.forObject(readRawObject(base, displacement, false)); + } + + @Override + public JavaConstant readNarrowOopConstant(Constant base, long displacement, CompressEncoding encoding) { + assert encoding.equals(runtime.getConfig().getOopEncoding()) : "unexpected oop encoding: " + encoding + " != " + runtime.getConfig().getOopEncoding(); + return HotSpotObjectConstantImpl.forObject(readRawObject(base, displacement, true), true); } - public Constant readNarrowPointerConstant(PointerType type, Constant base, long displacement) { - switch (type) { - case Object: - return HotSpotObjectConstantImpl.forObject(readRawObject(base, displacement, true), true); - case Type: - int compressed = (int) readRawValue(base, displacement, 32); - long klass = runtime.getConfig().getKlassEncoding().uncompress(compressed); - HotSpotResolvedObjectType metaKlass = HotSpotResolvedObjectTypeImpl.fromMetaspaceKlass(klass); - return HotSpotMetaspaceConstantImpl.forMetaspaceObject(Kind.Int, compressed, metaKlass, true); - case Method: - // there are no compressed method pointers - default: - throw GraalInternalError.shouldNotReachHere(); - } + @Override + public Constant readKlassPointerConstant(Constant base, long displacement) { + long klass = readRawValue(base, displacement, runtime.getTarget().wordSize * 8); + HotSpotResolvedObjectType metaKlass = HotSpotResolvedObjectTypeImpl.fromMetaspaceKlass(klass); + return HotSpotMetaspaceConstantImpl.forMetaspaceObject(runtime.getTarget().wordKind, klass, metaKlass, false); + } + + @Override + public Constant readNarrowKlassPointerConstant(Constant base, long displacement, CompressEncoding encoding) { + int compressed = (int) readRawValue(base, displacement, 32); + long klass = encoding.uncompress(compressed); + HotSpotResolvedObjectType metaKlass = HotSpotResolvedObjectTypeImpl.fromMetaspaceKlass(klass); + return HotSpotMetaspaceConstantImpl.forMetaspaceObject(Kind.Int, compressed, metaKlass, true); + } + + @Override + public Constant readMethodPointerConstant(Constant base, long displacement) { + long method = readRawValue(base, displacement, runtime.getTarget().wordSize * 8); + HotSpotResolvedJavaMethod metaMethod = HotSpotResolvedJavaMethodImpl.fromMetaspace(method); + return HotSpotMetaspaceConstantImpl.forMetaspaceObject(runtime.getTarget().wordKind, method, metaMethod, false); } } diff -r b8a622c3e99f -r d7cc487d1325 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/KlassPointerStamp.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/KlassPointerStamp.java Thu Nov 20 17:00:19 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/KlassPointerStamp.java Thu Nov 20 18:01:18 2014 +0100 @@ -92,10 +92,11 @@ @Override public Constant readConstant(MemoryAccessProvider provider, Constant base, long displacement) { + HotSpotMemoryAccessProvider hsProvider = (HotSpotMemoryAccessProvider) provider; if (isCompressed()) { - return ((HotSpotMemoryAccessProviderImpl) provider).readNarrowPointerConstant(PointerType.Type, base, displacement); + return hsProvider.readNarrowKlassPointerConstant(base, displacement, encoding); } else { - return provider.readPointerConstant(PointerType.Type, base, displacement); + return hsProvider.readKlassPointerConstant(base, displacement); } } diff -r b8a622c3e99f -r d7cc487d1325 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MethodPointerStamp.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MethodPointerStamp.java Thu Nov 20 17:00:19 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MethodPointerStamp.java Thu Nov 20 18:01:18 2014 +0100 @@ -24,6 +24,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; +import com.oracle.graal.hotspot.meta.*; public final class MethodPointerStamp extends MetaspacePointerStamp { @@ -49,7 +50,8 @@ @Override public Constant readConstant(MemoryAccessProvider provider, Constant base, long displacement) { - return provider.readPointerConstant(PointerType.Method, base, displacement); + HotSpotMemoryAccessProvider hsProvider = (HotSpotMemoryAccessProvider) provider; + return hsProvider.readMethodPointerConstant(base, displacement); } @Override diff -r b8a622c3e99f -r d7cc487d1325 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java Thu Nov 20 17:00:19 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java Thu Nov 20 18:01:18 2014 +0100 @@ -81,7 +81,8 @@ @Override public Constant readConstant(MemoryAccessProvider provider, Constant base, long displacement) { - return ((HotSpotMemoryAccessProviderImpl) provider).readNarrowPointerConstant(PointerType.Object, base, displacement); + HotSpotMemoryAccessProvider hsProvider = (HotSpotMemoryAccessProvider) provider; + return hsProvider.readNarrowOopConstant(base, displacement, encoding); } @Override