src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeAccessNode.java
author dlong
Thu, 31 Oct 2019 16:54:16 -0700
changeset 58877 aec7bf35d6f5
parent 52910 583fd71c47d6
permissions -rw-r--r--
8233273: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     1
/*
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     4
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     8
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    13
 * accompanied this code).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    14
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    18
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    21
 * questions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    22
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 50609
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 50609
diff changeset
    24
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    25
package org.graalvm.compiler.nodes.extended;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    27
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    28
import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    29
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
    30
import java.nio.ByteOrder;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
    31
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    32
import org.graalvm.compiler.core.common.type.Stamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    33
import org.graalvm.compiler.graph.Node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    34
import org.graalvm.compiler.graph.NodeClass;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
import org.graalvm.compiler.graph.spi.Canonicalizable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    36
import org.graalvm.compiler.graph.spi.CanonicalizerTool;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    37
import org.graalvm.compiler.nodeinfo.NodeInfo;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    38
import org.graalvm.compiler.nodes.FixedWithNextNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import org.graalvm.compiler.nodes.NamedLocationIdentity;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    40
import org.graalvm.compiler.nodes.ValueNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
import org.graalvm.compiler.nodes.type.StampTool;
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
    42
import jdk.internal.vm.compiler.word.LocationIdentity;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import jdk.vm.ci.meta.Assumptions;
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
    45
import jdk.vm.ci.meta.ConstantReflectionProvider;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
    46
import jdk.vm.ci.meta.JavaConstant;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import jdk.vm.ci.meta.JavaKind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import jdk.vm.ci.meta.ResolvedJavaField;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
import jdk.vm.ci.meta.ResolvedJavaType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
@NodeInfo(cycles = CYCLES_2, size = SIZE_1)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
public abstract class UnsafeAccessNode extends FixedWithNextNode implements Canonicalizable {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    53
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
    public static final NodeClass<UnsafeAccessNode> TYPE = NodeClass.create(UnsafeAccessNode.class);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
    @Input ValueNode object;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    56
    @Input ValueNode offset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    57
    protected final JavaKind accessKind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
    protected final LocationIdentity locationIdentity;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    59
    protected final boolean forceAnyLocation;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    60
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    61
    protected UnsafeAccessNode(NodeClass<? extends UnsafeAccessNode> c, Stamp stamp, ValueNode object, ValueNode offset, JavaKind accessKind, LocationIdentity locationIdentity,
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    62
                    boolean forceAnyLocation) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
        super(c, stamp);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    64
        this.forceAnyLocation = forceAnyLocation;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
        assert accessKind != null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
        assert locationIdentity != null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
        this.object = object;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
        this.offset = offset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
        this.accessKind = accessKind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
        this.locationIdentity = locationIdentity;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
    public LocationIdentity getLocationIdentity() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
        return locationIdentity;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    75
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    76
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    77
    public boolean isAnyLocationForced() {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    78
        return forceAnyLocation;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    79
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    80
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
    public ValueNode object() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
        return object;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    84
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
    public ValueNode offset() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    86
        return offset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    87
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
    public JavaKind accessKind() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
        return accessKind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
    public Node canonical(CanonicalizerTool tool) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    95
        if (!isAnyLocationForced() && getLocationIdentity().isAny()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    96
            if (offset().isConstant()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    97
                long constantOffset = offset().asJavaConstant().asLong();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    99
                // Try to canonicalize to a field access.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   100
                ResolvedJavaType receiverType = StampTool.typeOrNull(object());
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   101
                if (receiverType != null) {
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   102
                    ResolvedJavaField field = getStaticFieldUnsafeAccess(tool.getConstantReflection());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   103
                    if (field == null) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   104
                        field = receiverType.findInstanceFieldWithOffset(constantOffset, accessKind());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   105
                    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   106
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   107
                    // No need for checking that the receiver is non-null. The field access
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   108
                    // includes the null check and if a field is found, the offset is so small that
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   109
                    // this is never a valid access of an arbitrary address.
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   110
                    if (field != null && field.getJavaKind() == this.accessKind()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   111
                        assert !graph().isAfterFloatingReadPhase() : "cannot add more precise memory location after floating read phase";
50609
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   112
                        // Unsafe accesses never have volatile semantics.
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   113
                        // Memory barriers are placed around such an unsafe access at construction
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   114
                        // time if necessary, unlike AccessFieldNodes which encapsulate their
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   115
                        // potential volatile semantics.
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   116
                        return cloneAsFieldAccess(graph().getAssumptions(), field, false);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   117
                    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   118
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
            ResolvedJavaType receiverType = StampTool.typeOrNull(object());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
            // Try to build a better location identity.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   122
            if (receiverType != null && receiverType.isArray()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
                LocationIdentity identity = NamedLocationIdentity.getArrayLocation(receiverType.getComponentType().getJavaKind());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
                assert !graph().isAfterFloatingReadPhase() : "cannot add more precise memory location after floating read phase";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
                return cloneAsArrayAccess(offset(), identity);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   128
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
        return this;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
50609
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   132
    protected ValueNode cloneAsFieldAccess(Assumptions assumptions, ResolvedJavaField field) {
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   133
        return cloneAsFieldAccess(assumptions, field, field.isVolatile());
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   134
    }
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   135
bf414874c28f 8204231: Update Graal
dlong
parents: 49873
diff changeset
   136
    protected abstract ValueNode cloneAsFieldAccess(Assumptions assumptions, ResolvedJavaField field, boolean volatileAccess);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
    protected abstract ValueNode cloneAsArrayAccess(ValueNode location, LocationIdentity identity);
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   139
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   140
    /**
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   141
     * In this method we check if the unsafe access is to a static field. This is the case when
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   142
     * {@code object} is a constant of type {@link Class} (static field's declaring class) and
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   143
     * {@code offset} is a constant (HotSpot-specific field offset from the declaring class).
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   144
     *
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   145
     * @return the static field, if any, that this node is reading
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   146
     */
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   147
    private ResolvedJavaField getStaticFieldUnsafeAccess(ConstantReflectionProvider constantReflection) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   148
        if (!object().isJavaConstant() || !offset().isJavaConstant() ||
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   149
                        object().isNullConstant() || offset().isNullConstant()) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   150
            return null;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   151
        }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   152
        JavaConstant objectConstant = object().asJavaConstant();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   153
        JavaConstant offsetConstant = offset().asJavaConstant();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   154
        assert objectConstant != null && offsetConstant != null : "Verified by the check at the beginning.";
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   155
        ResolvedJavaType staticReceiverType = constantReflection.asJavaType(objectConstant);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   156
        if (staticReceiverType == null) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   157
            // object is not of type Class so it is not a static field
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   158
            return null;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   159
        }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   160
        return findStaticFieldWithOffset(staticReceiverType, offsetConstant.asLong(), accessKind);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   161
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   162
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   163
    private static ResolvedJavaField findStaticFieldWithOffset(ResolvedJavaType type, long offset, JavaKind expectedEntryKind) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   164
        try {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   165
            ResolvedJavaField[] declaredFields = type.getStaticFields();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   166
            return findFieldWithOffset(offset, expectedEntryKind, declaredFields);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   167
        } catch (UnsupportedOperationException e) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   168
            return null;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   169
        }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   170
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   171
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   172
    /**
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   173
     * NOTE GR-18873: this is a copy-paste implementation derived from
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   174
     * {@code jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl#findStaticFieldWithOffset}.
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   175
     */
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   176
    private static ResolvedJavaField findFieldWithOffset(long offset, JavaKind expectedEntryKind, ResolvedJavaField[] declaredFields) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   177
        for (ResolvedJavaField field : declaredFields) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   178
            long resolvedFieldOffset = field.getOffset();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   179
            if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN &&
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   180
                            expectedEntryKind.isPrimitive() &&
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   181
                            !expectedEntryKind.equals(JavaKind.Void) &&
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   182
                            field.getJavaKind().isPrimitive()) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   183
                resolvedFieldOffset += field.getJavaKind().getByteCount() -
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   184
                                Math.min(field.getJavaKind().getByteCount(), 4 + expectedEntryKind.getByteCount());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   185
            }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   186
            if (resolvedFieldOffset == offset) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   187
                return field;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   188
            }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   189
        }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   190
        return null;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   191
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 52910
diff changeset
   192
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   193
}