src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/SymbolicSnippetEncoder.java
author dlong
Thu, 31 Oct 2019 16:54:16 -0700
changeset 58877 aec7bf35d6f5
parent 58299 6df94ce3ab2f
permissions -rw-r--r--
8233273: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     1
/*
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     4
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     7
 * published by the Free Software Foundation.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     8
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    13
 * accompanied this code).
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    14
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    18
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    21
 * questions.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    22
 */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    23
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    24
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    25
package org.graalvm.compiler.hotspot;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    26
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    27
import static jdk.vm.ci.runtime.JVMCI.getRuntime;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    28
import static jdk.vm.ci.services.Services.IS_BUILDING_NATIVE_IMAGE;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    29
import static jdk.vm.ci.services.Services.IS_IN_NATIVE_IMAGE;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    30
import static org.graalvm.compiler.core.common.GraalOptions.UseEncodedGraphs;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    31
import static org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin.InlineInfo.createIntrinsicInlineInfo;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    32
import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING;
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
    33
import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.ROOT_COMPILATION;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    34
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    35
import java.util.ArrayList;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    36
import java.util.Arrays;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    37
import java.util.Collections;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    38
import java.util.HashMap;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    39
import java.util.HashSet;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    40
import java.util.List;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    41
import java.util.Map;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    42
import java.util.Objects;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    43
import java.util.Set;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    44
import java.util.concurrent.ConcurrentHashMap;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    45
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    46
import org.graalvm.compiler.api.replacements.Fold;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    47
import org.graalvm.compiler.api.replacements.MethodSubstitution;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    48
import org.graalvm.compiler.api.replacements.Snippet;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    49
import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    50
import org.graalvm.compiler.api.runtime.GraalJVMCICompiler;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    51
import org.graalvm.compiler.api.runtime.GraalRuntime;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    52
import org.graalvm.compiler.bytecode.BytecodeProvider;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    53
import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    54
import org.graalvm.compiler.core.common.type.AbstractObjectStamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    55
import org.graalvm.compiler.core.common.type.Stamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    56
import org.graalvm.compiler.core.common.type.StampPair;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    57
import org.graalvm.compiler.core.common.type.SymbolicJVMCIReference;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    58
import org.graalvm.compiler.debug.DebugContext;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    59
import org.graalvm.compiler.debug.GraalError;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    60
import org.graalvm.compiler.graph.Node;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    61
import org.graalvm.compiler.graph.NodeClass;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    62
import org.graalvm.compiler.graph.NodeMap;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    63
import org.graalvm.compiler.graph.NodeSourcePosition;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    64
import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    65
import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    66
import org.graalvm.compiler.java.BytecodeParser;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    67
import org.graalvm.compiler.java.GraphBuilderPhase;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    68
import org.graalvm.compiler.nodeinfo.Verbosity;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    69
import org.graalvm.compiler.nodes.CallTargetNode;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
    70
import org.graalvm.compiler.nodes.Cancellable;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    71
import org.graalvm.compiler.nodes.ConstantNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    72
import org.graalvm.compiler.nodes.EncodedGraph;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    73
import org.graalvm.compiler.nodes.FrameState;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    74
import org.graalvm.compiler.nodes.FullInfopointNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    75
import org.graalvm.compiler.nodes.GraphEncoder;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    76
import org.graalvm.compiler.nodes.ParameterNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    77
import org.graalvm.compiler.nodes.ProxyNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    78
import org.graalvm.compiler.nodes.StructuredGraph;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    79
import org.graalvm.compiler.nodes.ValueNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    80
import org.graalvm.compiler.nodes.cfg.Block;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    81
import org.graalvm.compiler.nodes.graphbuilderconf.GeneratedInvocationPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    82
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    83
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    84
import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    85
import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    86
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    87
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    88
import org.graalvm.compiler.nodes.graphbuilderconf.MethodSubstitutionPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    89
import org.graalvm.compiler.nodes.graphbuilderconf.NodePlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    90
import org.graalvm.compiler.nodes.graphbuilderconf.ParameterPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    91
import org.graalvm.compiler.nodes.java.AccessFieldNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    92
import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    93
import org.graalvm.compiler.nodes.virtual.VirtualObjectNode;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    94
import org.graalvm.compiler.options.OptionValues;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    95
import org.graalvm.compiler.phases.OptimisticOptimizations;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    96
import org.graalvm.compiler.phases.schedule.SchedulePhase;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    97
import org.graalvm.compiler.phases.util.Providers;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    98
import org.graalvm.compiler.replacements.ConstantBindingParameterPlugin;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
    99
import org.graalvm.compiler.replacements.PEGraphDecoder;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   100
import org.graalvm.compiler.replacements.ReplacementsImpl;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   101
import org.graalvm.compiler.replacements.SnippetCounter;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   102
import org.graalvm.compiler.replacements.SnippetIntegerHistogram;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   103
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   104
import jdk.vm.ci.code.TargetDescription;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   105
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   106
import jdk.vm.ci.hotspot.HotSpotResolvedJavaField;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   107
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   108
import jdk.vm.ci.hotspot.HotSpotResolvedJavaType;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   109
import jdk.vm.ci.hotspot.HotSpotSignature;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   110
import jdk.vm.ci.meta.Constant;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   111
import jdk.vm.ci.meta.ConstantReflectionProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   112
import jdk.vm.ci.meta.JavaConstant;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   113
import jdk.vm.ci.meta.JavaKind;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   114
import jdk.vm.ci.meta.MemoryAccessProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   115
import jdk.vm.ci.meta.MethodHandleAccessProvider;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   116
import jdk.vm.ci.meta.ResolvedJavaField;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   117
import jdk.vm.ci.meta.ResolvedJavaMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   118
import jdk.vm.ci.meta.ResolvedJavaType;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   119
import jdk.vm.ci.meta.UnresolvedJavaField;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   120
import jdk.vm.ci.meta.UnresolvedJavaMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   121
import jdk.vm.ci.meta.UnresolvedJavaType;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   122
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   123
/**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   124
 * This class performs graph encoding using {@link GraphEncoder} but also converts JVMCI type and
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   125
 * method references into a symbolic form that can be resolved at graph decode time using
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   126
 * {@link SymbolicJVMCIReference}.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   127
 */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   128
public class SymbolicSnippetEncoder {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   129
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   130
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   131
     * This is a customized HotSpotReplacementsImpl intended only for parsing snippets and method
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   132
     * substitutions for graph encoding.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   133
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   134
    private final HotSpotSnippetReplacementsImpl snippetReplacements;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   135
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   136
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   137
     * The set of all snippet methods that have been encoded.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   138
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   139
    private final Set<ResolvedJavaMethod> snippetMethods = Collections.synchronizedSet(new HashSet<>());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   140
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   141
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   142
     * A mapping from the method substitution method to the original method name. The string key and
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   143
     * values are produced using {@link #methodKey(ResolvedJavaMethod)}.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   144
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   145
    private final Map<String, String> originalMethods = new ConcurrentHashMap<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   146
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   147
    private final HotSpotReplacementsImpl originalReplacements;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   148
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   149
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   150
     * The current count of graphs encoded. Used to detect when new graphs have been enqueued for
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   151
     * encoding.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   152
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   153
    private int encodedGraphs = 0;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   154
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   155
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   156
     * All the graphs parsed so far.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   157
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   158
    private Map<String, StructuredGraph> preparedSnippetGraphs = new HashMap<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   159
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   160
    private Set<MethodSubstitutionPlugin> knownPlugins = new HashSet<>();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   161
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   162
    private Set<InvocationPlugin> conditionalPlugins = new HashSet<>();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   163
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   164
    private int preparedPlugins = 0;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   165
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   166
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   167
     * The invocation plugins which were delayed during graph preparation.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   168
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   169
    private Set<ResolvedJavaMethod> delayedInvocationPluginMethods = new HashSet<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   170
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   171
    void addDelayedInvocationPluginMethod(ResolvedJavaMethod method) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   172
        delayedInvocationPluginMethods.add(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   173
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   174
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   175
    Set<ResolvedJavaMethod> getSnippetMethods() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   176
        return snippetMethods;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   177
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   178
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   179
    protected class SnippetInlineInvokePlugin implements InlineInvokePlugin {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   180
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   181
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   182
        public InlineInfo shouldInlineInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   183
            if (method.getAnnotation(Fold.class) != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   184
                delayedInvocationPluginMethods.add(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   185
                return InlineInfo.DO_NOT_INLINE_NO_EXCEPTION;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   186
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   187
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   188
            if (snippetReplacements.getIntrinsifyingPlugin(method) != null) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   189
                delayedInvocationPluginMethods.add(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   190
                return InlineInfo.DO_NOT_INLINE_NO_EXCEPTION;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   191
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   192
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   193
            // Force inlining when parsing replacements
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   194
            return createIntrinsicInlineInfo(method, snippetReplacements.getDefaultReplacementBytecodeProvider());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   195
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   196
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   197
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   198
        public void notifyAfterInline(ResolvedJavaMethod methodToInline) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   199
            assert methodToInline.getAnnotation(Fold.class) == null : methodToInline;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   200
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   201
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   202
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   203
    public static class SnippetInvocationPlugins extends InvocationPlugins {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   204
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   205
        SnippetInvocationPlugins(InvocationPlugins invocationPlugins) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   206
            super(invocationPlugins);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   207
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   208
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   209
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   210
        public InvocationPlugin lookupInvocation(ResolvedJavaMethod method) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   211
            if (method.getAnnotation(Fold.class) != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   212
                return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   213
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   214
            return super.lookupInvocation(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   215
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   216
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   217
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   218
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   219
     * This plugin disables the snippet counter machinery.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   220
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   221
    private class SnippetCounterPlugin implements NodePlugin {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   222
        String snippetCounterName = 'L' + SnippetCounter.class.getName().replace('.', '/') + ';';
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   223
        String snippetIntegerHistogramName = 'L' + SnippetIntegerHistogram.class.getName().replace('.', '/') + ';';
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   224
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   225
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   226
        public boolean handleLoadField(GraphBuilderContext b, ValueNode object, ResolvedJavaField field) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   227
            if (field.getName().equals("group") && field.getDeclaringClass().getName().equals(snippetCounterName)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   228
                b.addPush(JavaKind.Object, ConstantNode.forConstant(JavaConstant.NULL_POINTER, b.getMetaAccess()));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   229
                return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   230
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   231
            if (field.getType().getName().equals(snippetCounterName)) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   232
                b.addPush(JavaKind.Object, ConstantNode.forConstant(snippetReplacements.snippetReflection.forObject(SnippetCounter.DISABLED_COUNTER), b.getMetaAccess()));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   233
                return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   234
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   235
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   236
            if (field.getType().getName().equals(snippetIntegerHistogramName)) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   237
                b.addPush(JavaKind.Object, ConstantNode.forConstant(snippetReplacements.snippetReflection.forObject(SnippetIntegerHistogram.DISABLED_COUNTER), b.getMetaAccess()));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   238
                return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   239
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   240
            return false;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   241
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   242
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   243
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   244
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   245
     * Generate a String name for a method including all type information. Used as a symbolic key
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   246
     * for lookup.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   247
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   248
    private static String methodKey(ResolvedJavaMethod method) {
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   249
        return method.format("%H.%n(%P)");
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   250
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   251
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   252
    SymbolicSnippetEncoder(HotSpotReplacementsImpl replacements) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   253
        this.originalReplacements = replacements;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   254
        GraphBuilderConfiguration.Plugins plugins = replacements.getGraphBuilderPlugins();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   255
        SnippetInvocationPlugins invocationPlugins = new SnippetInvocationPlugins(plugins.getInvocationPlugins());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   256
        GraphBuilderConfiguration.Plugins copy = new GraphBuilderConfiguration.Plugins(plugins, invocationPlugins);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   257
        copy.clearInlineInvokePlugins();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   258
        copy.appendInlineInvokePlugin(new SnippetInlineInvokePlugin());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   259
        copy.appendNodePlugin(new SnippetCounterPlugin());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   260
        HotSpotProviders providers = (HotSpotProviders) replacements.getProviders().copyWith(new HotSpotSubstrateConstantReflectionProvider(replacements.getProviders().getConstantReflection()));
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   261
        this.snippetReplacements = new HotSpotSnippetReplacementsImpl(replacements, providers.copyWith(copy));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   262
        this.snippetReplacements.setGraphBuilderPlugins(copy);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   263
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   264
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   265
    synchronized void registerMethodSubstitution(MethodSubstitutionPlugin plugin) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   266
        knownPlugins.add(plugin);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   267
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   268
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   269
    void registerConditionalPlugin(InvocationPlugin plugin) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   270
        conditionalPlugins.add(plugin);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   271
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   272
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   273
    synchronized void checkRegistered(MethodSubstitutionPlugin plugin) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   274
        if (!knownPlugins.contains(plugin)) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   275
            throw new GraalError("missing plugin should have been registered during construction");
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   276
        }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   277
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   278
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   279
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   280
     * Compiles the snippet and stores the graph.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   281
     */
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   282
    private synchronized void registerMethodSubstitution(MethodSubstitutionPlugin plugin, ResolvedJavaMethod original, IntrinsicContext.CompilationContext context, OptionValues options) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   283
        ResolvedJavaMethod method = plugin.getSubstitute(snippetReplacements.getProviders().getMetaAccess());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   284
        assert method.getAnnotation(MethodSubstitution.class) != null : "MethodSubstitution must be annotated with @" + MethodSubstitution.class.getSimpleName();
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   285
        String originalMethodString = plugin.originalMethodAsString();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   286
        StructuredGraph subst = buildGraph(method, original, originalMethodString, null, true, false, context, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   287
        snippetMethods.add(method);
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   288
        originalMethods.put(methodKey(method), originalMethodString);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   289
        preparedSnippetGraphs.put(plugin.toString() + context, subst);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   290
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   291
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   292
    static class EncodedSnippets {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   293
        private byte[] snippetEncoding;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   294
        private Object[] snippetObjects;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   295
        private NodeClass<?>[] snippetNodeClasses;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   296
        private Map<String, Integer> snippetStartOffsets;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   297
        private Map<String, String> originalMethods;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   298
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   299
        EncodedSnippets(byte[] snippetEncoding, Object[] snippetObjects, NodeClass<?>[] snippetNodeClasses, Map<String, Integer> snippetStartOffsets, Map<String, String> originalMethods) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   300
            this.snippetEncoding = snippetEncoding;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   301
            this.snippetObjects = snippetObjects;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   302
            this.snippetNodeClasses = snippetNodeClasses;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   303
            this.snippetStartOffsets = snippetStartOffsets;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   304
            this.originalMethods = originalMethods;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   305
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   306
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   307
        StructuredGraph getMethodSubstitutionGraph(MethodSubstitutionPlugin plugin, ResolvedJavaMethod original, ReplacementsImpl replacements, IntrinsicContext.CompilationContext context,
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   308
                        StructuredGraph.AllowAssumptions allowAssumptions, Cancellable cancellable, OptionValues options) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   309
            Integer startOffset = snippetStartOffsets.get(plugin.toString() + context);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   310
            if (startOffset == null) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   311
                throw GraalError.shouldNotReachHere("plugin graph not found: " + plugin + " with " + context);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   312
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   313
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   314
            ResolvedJavaType accessingClass = replacements.getProviders().getMetaAccess().lookupJavaType(plugin.getDeclaringClass());
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   315
            return decodeGraph(original, accessingClass, startOffset, replacements, context, allowAssumptions, cancellable, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   316
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   317
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   318
        @SuppressWarnings("try")
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   319
        private StructuredGraph decodeGraph(ResolvedJavaMethod method,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   320
                        ResolvedJavaType accessingClass,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   321
                        int startOffset,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   322
                        ReplacementsImpl replacements,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   323
                        IntrinsicContext.CompilationContext context,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   324
                        StructuredGraph.AllowAssumptions allowAssumptions,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   325
                        Cancellable cancellable,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   326
                        OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   327
            Providers providers = replacements.getProviders();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   328
            EncodedGraph encodedGraph = new SymbolicEncodedGraph(snippetEncoding, startOffset, snippetObjects, snippetNodeClasses,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   329
                            methodKey(method), accessingClass, method.getDeclaringClass());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   330
            try (DebugContext debug = replacements.openDebugContext("SVMSnippet_", method, options)) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
   331
                StructuredGraph result = new StructuredGraph.Builder(options, debug, allowAssumptions).cancellable(cancellable).method(method).setIsSubstitution(true).build();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   332
                PEGraphDecoder graphDecoder = new SubstitutionGraphDecoder(providers, result, replacements, null, method, context, encodedGraph);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   333
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   334
                graphDecoder.decode(method, result.isSubstitution(), encodedGraph.trackNodeSourcePosition());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   335
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   336
                assert result.verify();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   337
                return result;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   338
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   339
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   340
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   341
        StructuredGraph getEncodedSnippet(ResolvedJavaMethod method, ReplacementsImpl replacements, Object[] args, StructuredGraph.AllowAssumptions allowAssumptions, OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   342
            Integer startOffset = null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   343
            if (snippetStartOffsets != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   344
                startOffset = snippetStartOffsets.get(methodKey(method));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   345
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   346
            if (startOffset == null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   347
                if (IS_IN_NATIVE_IMAGE) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   348
                    throw GraalError.shouldNotReachHere("snippet not found: " + method.format("%H.%n(%p)"));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   349
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   350
                    return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   351
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   352
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   353
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   354
            SymbolicEncodedGraph encodedGraph = new SymbolicEncodedGraph(snippetEncoding, startOffset, snippetObjects, snippetNodeClasses,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   355
                            originalMethods.get(methodKey(method)), method.getDeclaringClass());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   356
            return decodeSnippetGraph(encodedGraph, method, replacements, args, allowAssumptions, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   357
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   358
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   359
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   360
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   361
    private static class SubstitutionGraphDecoder extends PEGraphDecoder {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   362
        private final ResolvedJavaMethod method;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   363
        private final EncodedGraph encodedGraph;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   364
        private IntrinsicContext intrinsic;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   365
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   366
        SubstitutionGraphDecoder(Providers providers, StructuredGraph result, ReplacementsImpl replacements, ParameterPlugin parameterPlugin, ResolvedJavaMethod method,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   367
                        IntrinsicContext.CompilationContext context, EncodedGraph encodedGraph) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   368
            super(providers.getCodeCache().getTarget().arch, result, providers, null,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   369
                            replacements.getGraphBuilderPlugins().getInvocationPlugins(), new InlineInvokePlugin[0], parameterPlugin,
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   370
                            null, null, null, null);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   371
            this.method = method;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   372
            this.encodedGraph = encodedGraph;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   373
            intrinsic = new IntrinsicContext(method, null, replacements.getDefaultReplacementBytecodeProvider(), context, false);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   374
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   375
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   376
        @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   377
        protected EncodedGraph lookupEncodedGraph(ResolvedJavaMethod lookupMethod,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   378
                        MethodSubstitutionPlugin plugin,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   379
                        BytecodeProvider intrinsicBytecodeProvider,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   380
                        boolean isSubstitution,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   381
                        boolean trackNodeSourcePosition) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   382
            if (lookupMethod.equals(method)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   383
                return encodedGraph;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   384
            } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   385
                throw GraalError.shouldNotReachHere(method.format("%H.%n(%p)"));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   386
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   387
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   388
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   389
        @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   390
        protected IntrinsicContext getIntrinsic() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   391
            return intrinsic;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   392
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   393
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   394
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   395
    private StructuredGraph buildGraph(ResolvedJavaMethod method, ResolvedJavaMethod original, String originalMethodString, Object receiver, boolean requireInlining, boolean trackNodeSourcePosition,
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   396
                    IntrinsicContext.CompilationContext context, OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   397
        assert method.hasBytecodes() : "Snippet must not be abstract or native";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   398
        Object[] args = null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   399
        if (receiver != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   400
            args = new Object[method.getSignature().getParameterCount(true)];
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   401
            args[0] = receiver;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   402
        }
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   403
        // To get dumping out from this context during image building, it's necessary to pass the
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   404
        // dumping options directly to the VM, otherwise they aren't available during initialization
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   405
        // of the backend. Use this:
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   406
        //
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   407
        // -J-Dgraal.Dump=SymbolicSnippetEncoder_:2 -J-Dgraal.PrintGraph=File
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   408
        // -J-Dgraal.DebugStubsAndSnippets=true
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   409
        try (DebugContext debug = openDebugContext("SymbolicSnippetEncoder_", method, options)) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   410
            StructuredGraph graph = snippetReplacements.makeGraph(debug, snippetReplacements.getDefaultReplacementBytecodeProvider(), method, args, original, trackNodeSourcePosition, null, context);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   411
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   412
            // Check if all methods which should be inlined are really inlined.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   413
            for (MethodCallTargetNode callTarget : graph.getNodes(MethodCallTargetNode.TYPE)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   414
                ResolvedJavaMethod callee = callTarget.targetMethod();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   415
                if (requireInlining && !delayedInvocationPluginMethods.contains(callee) && !Objects.equals(callee, original)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   416
                    throw GraalError.shouldNotReachHere("method " + callee.format("%H.%n") + " not inlined in snippet " + method.getName() + " (maybe not final?)");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   417
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   418
            }
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   419
            assert verifySnippetEncodeDecode(debug, method, original, originalMethodString, trackNodeSourcePosition, graph);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   420
            debug.dump(DebugContext.VERBOSE_LEVEL, graph, "After buildGraph");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   421
            return graph;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   422
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   423
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   424
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   425
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   426
    private static StructuredGraph decodeSnippetGraph(SymbolicEncodedGraph encodedGraph, ResolvedJavaMethod method, ReplacementsImpl replacements, Object[] args,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   427
                    StructuredGraph.AllowAssumptions allowAssumptions, OptionValues options) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   428
        Providers providers = replacements.getProviders();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   429
        ParameterPlugin parameterPlugin = null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   430
        if (args != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   431
            parameterPlugin = new ConstantBindingParameterPlugin(args, providers.getMetaAccess(), replacements.snippetReflection);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   432
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   433
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   434
        try (DebugContext debug = replacements.openDebugContext("SVMSnippet_", method, options)) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   435
            // @formatter:off
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   436
            StructuredGraph result = new StructuredGraph.Builder(options, debug, allowAssumptions)
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   437
                    .method(method)
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   438
                    .trackNodeSourcePosition(encodedGraph.trackNodeSourcePosition())
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   439
                    .setIsSubstitution(true)
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   440
                    .build();
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   441
            // @formatter:on
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   442
            try (DebugContext.Scope scope = debug.scope("DecodeSnippetGraph", result)) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   443
                PEGraphDecoder graphDecoder = new SubstitutionGraphDecoder(providers, result, replacements, parameterPlugin, method, INLINE_AFTER_PARSING, encodedGraph);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   444
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   445
                graphDecoder.decode(method, result.isSubstitution(), encodedGraph.trackNodeSourcePosition());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   446
                debug.dump(DebugContext.VERBOSE_LEVEL, result, "After decoding");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   447
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   448
                assert result.verify();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   449
                return result;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   450
            } catch (Throwable t) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   451
                throw debug.handle(t);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   452
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   453
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   454
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   455
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   456
    @SuppressWarnings("try")
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   457
    private boolean verifySnippetEncodeDecode(DebugContext debug, ResolvedJavaMethod method, ResolvedJavaMethod original, String originalMethodString, boolean trackNodeSourcePosition,
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   458
                    StructuredGraph graph) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   459
        // Verify the encoding and decoding process
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   460
        EncodedGraph encodedGraph = GraphEncoder.encodeSingleGraph(graph, HotSpotJVMCIRuntime.runtime().getHostJVMCIBackend().getTarget().arch);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   461
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   462
        HotSpotProviders originalProvider = (HotSpotProviders) snippetReplacements.getProviders();
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   463
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   464
        SnippetReflectionProvider snippetReflection = originalProvider.getSnippetReflection();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   465
        SymbolicSnippetEncoder.HotSpotSubstrateConstantReflectionProvider constantReflection = new SymbolicSnippetEncoder.HotSpotSubstrateConstantReflectionProvider(
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   466
                        originalProvider.getConstantReflection());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   467
        HotSpotProviders newProviders = new HotSpotProviders(originalProvider.getMetaAccess(), originalProvider.getCodeCache(), constantReflection,
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   468
                        originalProvider.getConstantFieldProvider(), originalProvider.getForeignCalls(), originalProvider.getLowerer(), null, originalProvider.getSuites(),
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   469
                        originalProvider.getRegisters(), snippetReflection, originalProvider.getWordTypes(), originalProvider.getGraphBuilderPlugins(), originalProvider.getGC());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   470
        HotSpotSnippetReplacementsImpl filteringReplacements = new HotSpotSnippetReplacementsImpl(newProviders, snippetReflection,
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   471
                        originalProvider.getReplacements().getDefaultReplacementBytecodeProvider(), originalProvider.getCodeCache().getTarget());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   472
        filteringReplacements.setGraphBuilderPlugins(originalProvider.getReplacements().getGraphBuilderPlugins());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   473
        try (DebugContext.Scope scaope = debug.scope("VerifySnippetEncodeDecode", graph)) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   474
            for (int i = 0; i < encodedGraph.getNumObjects(); i++) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   475
                filterSnippetObject(encodedGraph.getObject(i));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   476
            }
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   477
            StructuredGraph snippet = filteringReplacements.makeGraph(debug, filteringReplacements.getDefaultReplacementBytecodeProvider(), method, null, original,
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   478
                            trackNodeSourcePosition, null);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   479
            SymbolicEncodedGraph symbolicGraph = new SymbolicEncodedGraph(encodedGraph, method.getDeclaringClass(), originalMethodString);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   480
            StructuredGraph decodedSnippet = decodeSnippetGraph(symbolicGraph, original != null ? original : method, originalReplacements, null,
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   481
                            StructuredGraph.AllowAssumptions.ifNonNull(graph.getAssumptions()), graph.getOptions());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   482
            String snippetString = getCanonicalGraphString(snippet, true, false);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   483
            String decodedSnippetString = getCanonicalGraphString(decodedSnippet, true, false);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   484
            if (snippetString.equals(decodedSnippetString)) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   485
                debug.log("Snippet decode for %s produces exactly same graph", method);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   486
                debug.dump(DebugContext.VERBOSE_LEVEL, decodedSnippet, "Decoded snippet graph for %s", method);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   487
            } else {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   488
                debug.log("Snippet decode for %s produces different graph", method);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   489
                debug.log("%s", compareGraphStrings(snippet, snippetString, decodedSnippet, decodedSnippetString));
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   490
                debug.dump(DebugContext.VERBOSE_LEVEL, snippet, "Snippet graph for %s", method);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   491
                debug.dump(DebugContext.VERBOSE_LEVEL, graph, "Encoded snippet graph for %s", method);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   492
                debug.dump(DebugContext.VERBOSE_LEVEL, decodedSnippet, "Decoded snippet graph for %s", method);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   493
            }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   494
        } catch (Throwable t) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   495
            throw debug.handle(t);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   496
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   497
        return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   498
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   499
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   500
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   501
     * If there are new graphs waiting to be encoded, reencode all the graphs and return the result.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   502
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   503
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   504
    private synchronized EncodedSnippets maybeEncodeSnippets(OptionValues options) {
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   505
        Set<MethodSubstitutionPlugin> plugins = this.knownPlugins;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   506
        if (preparedPlugins != plugins.size()) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   507
            for (MethodSubstitutionPlugin plugin : plugins) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   508
                ResolvedJavaMethod original = plugin.getOriginalMethod(originalReplacements.getProviders().getMetaAccess());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   509
                registerMethodSubstitution(plugin, original, INLINE_AFTER_PARSING, options);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   510
                if (!original.isNative()) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   511
                    registerMethodSubstitution(plugin, original, ROOT_COMPILATION, options);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   512
                }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   513
            }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   514
            preparedPlugins = plugins.size();
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   515
        }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   516
        Map<String, StructuredGraph> graphs = this.preparedSnippetGraphs;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   517
        if (encodedGraphs != graphs.size()) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   518
            DebugContext debug = openDebugContext("SnippetEncoder", null, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   519
            try (DebugContext.Scope scope = debug.scope("SnippetSupportEncode")) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   520
                encodedGraphs = graphs.size();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   521
                for (StructuredGraph graph : graphs.values()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   522
                    for (Node node : graph.getNodes()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   523
                        node.setNodeSourcePosition(null);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   524
                    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   525
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   526
                return encodeSnippets(debug);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   527
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   528
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   529
        return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   530
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   531
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   532
    synchronized void registerSnippet(ResolvedJavaMethod method, ResolvedJavaMethod original, Object receiver, boolean trackNodeSourcePosition, OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   533
        if (IS_BUILDING_NATIVE_IMAGE || UseEncodedGraphs.getValue(options)) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   534
            assert method.getAnnotation(Snippet.class) != null : "Snippet must be annotated with @" + Snippet.class.getSimpleName();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   535
            String key = methodKey(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   536
            if (!preparedSnippetGraphs.containsKey(key)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   537
                if (original != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   538
                    originalMethods.put(key, methodKey(original));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   539
                }
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
   540
                StructuredGraph snippet = buildGraph(method, original, null, receiver, true, trackNodeSourcePosition, INLINE_AFTER_PARSING, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   541
                snippetMethods.add(method);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   542
                preparedSnippetGraphs.put(key, snippet);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   543
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   544
        }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   545
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   546
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   547
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   548
    private synchronized EncodedSnippets encodeSnippets(DebugContext debug) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   549
        GraphEncoder encoder = new GraphEncoder(HotSpotJVMCIRuntime.runtime().getHostJVMCIBackend().getTarget().arch, debug);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   550
        for (StructuredGraph graph : preparedSnippetGraphs.values()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   551
            encoder.prepare(graph);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   552
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   553
        encoder.finishPrepare();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   554
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   555
        byte[] snippetEncoding;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   556
        Object[] snippetObjects;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   557
        NodeClass<?>[] snippetNodeClasses;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   558
        Map<String, Integer> snippetStartOffsets;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   559
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   560
        snippetStartOffsets = new HashMap<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   561
        for (Map.Entry<String, StructuredGraph> entry : preparedSnippetGraphs.entrySet()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   562
            snippetStartOffsets.put(entry.getKey(), encoder.encode(entry.getValue()));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   563
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   564
        snippetEncoding = encoder.getEncoding();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   565
        snippetObjects = encoder.getObjects();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   566
        snippetNodeClasses = encoder.getNodeClasses();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   567
        for (int i = 0; i < snippetObjects.length; i++) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   568
            Object o = filterSnippetObject(snippetObjects[i]);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   569
            debug.log("snippetObjects[%d] = %s -> %s", i, o != null ? o.getClass().getSimpleName() : null, o);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   570
            snippetObjects[i] = o;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   571
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   572
        debug.log("Encoded %d snippet preparedSnippetGraphs using %d bytes with %d objects", snippetStartOffsets.size(), snippetEncoding.length, snippetObjects.length);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   573
        return new EncodedSnippets(snippetEncoding, snippetObjects, snippetNodeClasses, snippetStartOffsets, originalMethods);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   574
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   575
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   576
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   577
     * Encode any outstanding graphs and return true if any work was done.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   578
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   579
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   580
    public boolean encode(OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   581
        EncodedSnippets encodedSnippets = maybeEncodeSnippets(options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   582
        if (encodedSnippets != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   583
            HotSpotReplacementsImpl.setEncodedSnippets(encodedSnippets);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   584
            return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   585
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   586
        return false;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   587
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   588
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   589
    private DebugContext openDebugContext(String idPrefix, ResolvedJavaMethod method, OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   590
        return snippetReplacements.openDebugContext(idPrefix, method, options);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   591
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   592
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   593
    static class SymbolicEncodedGraph extends EncodedGraph {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   594
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   595
        private final ResolvedJavaType[] accessingClasses;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   596
        private final String originalMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   597
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   598
        SymbolicEncodedGraph(byte[] encoding, int startOffset, Object[] objects, NodeClass<?>[] types, String originalMethod, ResolvedJavaType... accessingClasses) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   599
            super(encoding, startOffset, objects, types, null, null, null, false, false);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   600
            this.accessingClasses = accessingClasses;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   601
            this.originalMethod = originalMethod;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   602
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   603
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   604
        SymbolicEncodedGraph(EncodedGraph encodedGraph, ResolvedJavaType declaringClass, String originalMethod) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   605
            this(encodedGraph.getEncoding(), encodedGraph.getStartOffset(), encodedGraph.getObjects(), encodedGraph.getNodeClasses(),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   606
                            originalMethod, declaringClass);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   607
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   608
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   609
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   610
        public Object getObject(int i) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   611
            Object o = objects[i];
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   612
            Object replacement = null;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   613
            if (o instanceof SymbolicJVMCIReference) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   614
                for (ResolvedJavaType type : accessingClasses) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   615
                    try {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   616
                        replacement = ((SymbolicJVMCIReference<?>) o).resolve(type);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   617
                        break;
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 54601
diff changeset
   618
                    } catch (NoClassDefFoundError e) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   619
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   620
                }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   621
            } else if (o instanceof UnresolvedJavaType) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   622
                for (ResolvedJavaType type : accessingClasses) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   623
                    try {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   624
                        replacement = ((UnresolvedJavaType) o).resolve(type);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   625
                        break;
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 54601
diff changeset
   626
                    } catch (NoClassDefFoundError e) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   627
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   628
                }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   629
            } else if (o instanceof UnresolvedJavaMethod) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   630
                throw new InternalError(o.toString());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   631
            } else if (o instanceof UnresolvedJavaField) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   632
                for (ResolvedJavaType type : accessingClasses) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   633
                    try {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   634
                        replacement = ((UnresolvedJavaField) o).resolve(type);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   635
                        break;
54724
62f373a53296 8222665: Update Graal
jwilhelm
parents: 54601
diff changeset
   636
                    } catch (NoClassDefFoundError e) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   637
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   638
                }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   639
            } else if (o instanceof GraalCapability) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   640
                replacement = ((GraalCapability) o).resolve(((GraalJVMCICompiler) getRuntime().getCompiler()).getGraalRuntime());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   641
            } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   642
                return o;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   643
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   644
            if (replacement != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   645
                objects[i] = o = replacement;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   646
            } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   647
                throw new GraalError("Can't resolve " + o);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   648
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   649
            return o;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   650
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   651
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   652
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   653
        public boolean isCallToOriginal(ResolvedJavaMethod callTarget) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   654
            if (originalMethod != null && originalMethod.equals(methodKey(callTarget))) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   655
                return true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   656
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   657
            return super.isCallToOriginal(callTarget);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   658
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   659
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   660
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   661
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   662
     * Symbolic reference to an object which can be retrieved from
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   663
     * {@link GraalRuntime#getCapability(Class)}.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   664
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   665
    static class GraalCapability {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   666
        final Class<?> capabilityClass;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   667
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   668
        GraalCapability(Class<?> capabilityClass) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   669
            this.capabilityClass = capabilityClass;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   670
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   671
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   672
        public Object resolve(GraalRuntime runtime) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   673
            Object capability = runtime.getCapability(this.capabilityClass);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   674
            if (capability != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   675
                assert capability.getClass() == capabilityClass;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   676
                return capability;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   677
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   678
            throw new InternalError(this.capabilityClass.getName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   679
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   680
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   681
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   682
    static class SymbolicResolvedJavaMethod implements SymbolicJVMCIReference<ResolvedJavaMethod> {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   683
        final UnresolvedJavaType type;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   684
        final String methodName;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   685
        final String signature;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   686
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   687
        SymbolicResolvedJavaMethod(ResolvedJavaMethod method) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   688
            this.type = UnresolvedJavaType.create(method.getDeclaringClass().getName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   689
            this.methodName = method.getName();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   690
            this.signature = method.getSignature().toMethodDescriptor();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   691
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   692
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   693
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   694
        public String toString() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   695
            return "SymbolicResolvedJavaMethod{" +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   696
                            "declaringType='" + type.getName() + '\'' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   697
                            ", methodName='" + methodName + '\'' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   698
                            ", signature='" + signature + '\'' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   699
                            '}';
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   700
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   701
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   702
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   703
        public ResolvedJavaMethod resolve(ResolvedJavaType accessingClass) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   704
            ResolvedJavaType resolvedType = type.resolve(accessingClass);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   705
            if (resolvedType == null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   706
                throw new InternalError("Could not resolve " + this + " in context of " + accessingClass.toJavaName());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   707
            }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   708
            for (ResolvedJavaMethod method : methodName.equals("<init>") ? resolvedType.getDeclaredConstructors() : resolvedType.getDeclaredMethods()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   709
                if (method.getName().equals(methodName) && method.getSignature().toMethodDescriptor().equals(signature)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   710
                    return method;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   711
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   712
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   713
            throw new InternalError("Could not resolve " + this + " in context of " + accessingClass.toJavaName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   714
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   715
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   716
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   717
    static class SymbolicResolvedJavaField implements SymbolicJVMCIReference<ResolvedJavaField> {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   718
        final UnresolvedJavaType declaringType;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   719
        final String name;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   720
        final UnresolvedJavaType signature;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   721
        private final boolean isStatic;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   722
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   723
        SymbolicResolvedJavaField(ResolvedJavaField field) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   724
            this.declaringType = UnresolvedJavaType.create(field.getDeclaringClass().getName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   725
            this.name = field.getName();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   726
            this.signature = UnresolvedJavaType.create(field.getType().getName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   727
            this.isStatic = field.isStatic();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   728
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   729
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   730
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   731
        public ResolvedJavaField resolve(ResolvedJavaType accessingClass) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   732
            ResolvedJavaType resolvedType = declaringType.resolve(accessingClass);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   733
            ResolvedJavaType resolvedFieldType = signature.resolve(accessingClass);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   734
            ResolvedJavaField[] fields = isStatic ? resolvedType.getStaticFields() : resolvedType.getInstanceFields(true);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   735
            for (ResolvedJavaField field : fields) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   736
                if (field.getName().equals(name)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   737
                    if (field.getType().equals(resolvedFieldType)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   738
                        return field;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   739
                    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   740
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   741
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   742
            throw new InternalError("Could not resolve " + this + " in context of " + accessingClass.toJavaName());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   743
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   744
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   745
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   746
        public String toString() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   747
            return "SymbolicResolvedJavaField{" +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   748
                            signature.getName() + ' ' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   749
                            declaringType.getName() + '.' +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   750
                            name +
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   751
                            '}';
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   752
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   753
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   754
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   755
    static class SymbolicResolvedJavaMethodBytecode implements SymbolicJVMCIReference<ResolvedJavaMethodBytecode> {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   756
        SymbolicResolvedJavaMethod method;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   757
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   758
        SymbolicResolvedJavaMethodBytecode(ResolvedJavaMethodBytecode bytecode) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   759
            method = new SymbolicResolvedJavaMethod(bytecode.getMethod());
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   760
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   761
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   762
        @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   763
        public ResolvedJavaMethodBytecode resolve(ResolvedJavaType accessingClass) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   764
            return new ResolvedJavaMethodBytecode(method.resolve(accessingClass));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   765
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   766
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   767
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   768
    static class SymbolicStampPair implements SymbolicJVMCIReference<StampPair> {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   769
        Object trustedStamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   770
        Object uncheckdStamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   771
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   772
        SymbolicStampPair(StampPair stamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   773
            this.trustedStamp = maybeMakeSymbolic(stamp.getTrustedStamp());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   774
            this.uncheckdStamp = maybeMakeSymbolic(stamp.getUncheckedStamp());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   775
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   776
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   777
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   778
        public StampPair resolve(ResolvedJavaType accessingClass) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   779
            return StampPair.create(resolveStamp(accessingClass, trustedStamp), resolveStamp(accessingClass, uncheckdStamp));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   780
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   781
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   782
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   783
    private static Object maybeMakeSymbolic(Stamp trustedStamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   784
        if (trustedStamp != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   785
            SymbolicJVMCIReference<?> symbolicJVMCIReference = trustedStamp.makeSymbolic();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   786
            if (symbolicJVMCIReference != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   787
                return symbolicJVMCIReference;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   788
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   789
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   790
        return trustedStamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   791
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   792
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   793
    private static Stamp resolveStamp(ResolvedJavaType accessingClass, Object stamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   794
        if (stamp == null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   795
            return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   796
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   797
        if (stamp instanceof Stamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   798
            return (Stamp) stamp;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   799
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   800
        return (Stamp) ((SymbolicJVMCIReference<?>) stamp).resolve(accessingClass);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   801
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   802
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   803
    public static class HotSpotSubstrateConstantReflectionProvider implements ConstantReflectionProvider {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   804
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   805
        private final ConstantReflectionProvider constantReflection;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   806
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   807
        HotSpotSubstrateConstantReflectionProvider(ConstantReflectionProvider constantReflection) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   808
            this.constantReflection = constantReflection;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   809
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   810
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   811
        HashSet<JavaConstant> safeConstants = new HashSet<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   812
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   813
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   814
        public Boolean constantEquals(Constant x, Constant y) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   815
            return constantReflection.constantEquals(x, y);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   816
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   817
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   818
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   819
        public Integer readArrayLength(JavaConstant array) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   820
            return constantReflection.readArrayLength(array);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   821
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   822
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   823
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   824
        public JavaConstant readArrayElement(JavaConstant array, int index) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   825
            return constantReflection.readArrayElement(array, index);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   826
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   827
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   828
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   829
        public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   830
            JavaConstant javaConstant = constantReflection.readFieldValue(field, receiver);
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   831
            if (!safeConstants.contains(receiver) &&
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   832
                            !field.getDeclaringClass().getName().contains("graalvm") &&
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   833
                            !field.getDeclaringClass().getName().contains("jdk/vm/ci/") &&
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   834
                            !field.getDeclaringClass().getName().contains("jdk/internal/vm/compiler") &&
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   835
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   836
                            !field.getName().equals("TYPE")) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   837
                // Only permit constant reflection on compiler classes. This is necessary primarily
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   838
                // because of the boxing snippets which are compiled as snippets but are really just
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   839
                // regular JDK java sources that are being compiled like a snippet. These shouldn't
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   840
                // permit constant folding during graph preparation as that embeds constants from
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   841
                // the runtime into a compiler graph.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   842
                return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   843
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   844
            if (javaConstant.getJavaKind() == JavaKind.Object) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   845
                safeConstants.add(javaConstant);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   846
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   847
            return javaConstant;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   848
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   849
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   850
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   851
        public JavaConstant boxPrimitive(JavaConstant source) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   852
            return constantReflection.boxPrimitive(source);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   853
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   854
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   855
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   856
        public JavaConstant unboxPrimitive(JavaConstant source) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   857
            return constantReflection.unboxPrimitive(source);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   858
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   859
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   860
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   861
        public JavaConstant forString(String value) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   862
            return constantReflection.forString(value);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   863
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   864
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   865
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   866
        public ResolvedJavaType asJavaType(Constant constant) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   867
            return constantReflection.asJavaType(constant);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   868
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   869
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   870
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   871
        public MethodHandleAccessProvider getMethodHandleAccess() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   872
            return constantReflection.getMethodHandleAccess();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   873
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   874
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   875
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   876
        public MemoryAccessProvider getMemoryAccessProvider() {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   877
            return constantReflection.getMemoryAccessProvider();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   878
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   879
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   880
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   881
        public JavaConstant asJavaClass(ResolvedJavaType type) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   882
            return constantReflection.asJavaClass(type);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   883
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   884
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   885
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   886
        public Constant asObjectHub(ResolvedJavaType type) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   887
            return constantReflection.asObjectHub(type);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   888
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   889
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   890
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   891
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   892
     * Objects embedded in encoded graphs might need to converted into a symbolic form so convert
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   893
     * the object or pass it through.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   894
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   895
    private static Object filterSnippetObject(Object o) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   896
        if (o instanceof HotSpotResolvedJavaMethod) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   897
            return new SymbolicResolvedJavaMethod((HotSpotResolvedJavaMethod) o);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   898
        } else if (o instanceof HotSpotResolvedJavaField) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   899
            return new SymbolicResolvedJavaField((HotSpotResolvedJavaField) o);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   900
        } else if (o instanceof HotSpotResolvedJavaType) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   901
            return UnresolvedJavaType.create(((ResolvedJavaType) o).getName());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   902
        } else if (o instanceof NodeSourcePosition) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   903
            // Filter these out for now. These can't easily be handled because these positions
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   904
            // description snippet methods which might not be available in the runtime.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   905
            return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   906
        } else if (o instanceof HotSpotForeignCallsProvider || o instanceof GraalHotSpotVMConfig) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   907
            return new GraalCapability(o.getClass());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   908
        } else if (o instanceof Stamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   909
            SymbolicJVMCIReference<?> ref = ((Stamp) o).makeSymbolic();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   910
            if (ref != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   911
                return ref;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   912
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   913
            return o;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   914
        } else if (o instanceof StampPair) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   915
            if (((StampPair) o).getTrustedStamp() instanceof AbstractObjectStamp) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   916
                return new SymbolicStampPair((StampPair) o);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   917
            }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   918
        } else if (o instanceof ResolvedJavaMethodBytecode) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   919
            return new SymbolicResolvedJavaMethodBytecode((ResolvedJavaMethodBytecode) o);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   920
        } else if (o instanceof HotSpotSignature) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   921
            throw new GraalError(o.toString());
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   922
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   923
        return o;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   924
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   925
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   926
    private static String compareGraphStrings(StructuredGraph expectedGraph, String expectedString, StructuredGraph actualGraph, String actualString) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   927
        if (!expectedString.equals(actualString)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   928
            String[] expectedLines = expectedString.split("\n");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   929
            String[] actualLines = actualString.split("\n");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   930
            int diffIndex = -1;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   931
            int limit = Math.min(actualLines.length, expectedLines.length);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   932
            String marker = " <<<";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   933
            for (int i = 0; i < limit; i++) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   934
                if (!expectedLines[i].equals(actualLines[i])) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   935
                    diffIndex = i;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   936
                    break;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   937
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   938
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   939
            if (diffIndex == -1) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   940
                // Prefix is the same so add some space after the prefix
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   941
                diffIndex = limit;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   942
                if (actualLines.length == limit) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   943
                    actualLines = Arrays.copyOf(actualLines, limit + 1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   944
                    actualLines[diffIndex] = "";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   945
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   946
                    assert expectedLines.length == limit;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   947
                    expectedLines = Arrays.copyOf(expectedLines, limit + 1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   948
                    expectedLines[diffIndex] = "";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   949
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   950
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   951
            // Place a marker next to the first line that differs
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   952
            expectedLines[diffIndex] = expectedLines[diffIndex] + marker;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   953
            actualLines[diffIndex] = actualLines[diffIndex] + marker;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   954
            String ediff = String.join("\n", expectedLines);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   955
            String adiff = String.join("\n", actualLines);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   956
            return "mismatch in preparedSnippetGraphs:\n========= expected (" + expectedGraph + ") =========\n" + ediff + "\n\n========= actual (" + actualGraph + ") =========\n" + adiff;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   957
        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   958
            return "mismatch in preparedSnippetGraphs";
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   959
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   960
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   961
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   962
    private static String getCanonicalGraphString(StructuredGraph graph, boolean excludeVirtual, boolean checkConstants) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   963
        SchedulePhase schedule = new SchedulePhase(SchedulePhase.SchedulingStrategy.EARLIEST);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   964
        schedule.apply(graph);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   965
        StructuredGraph.ScheduleResult scheduleResult = graph.getLastSchedule();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   966
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   967
        NodeMap<Integer> canonicalId = graph.createNodeMap();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   968
        int nextId = 0;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   969
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   970
        List<String> constantsLines = new ArrayList<>();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   971
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   972
        StringBuilder result = new StringBuilder();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   973
        for (Block block : scheduleResult.getCFG().getBlocks()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   974
            result.append("Block ").append(block).append(' ');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   975
            if (block == scheduleResult.getCFG().getStartBlock()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   976
                result.append("* ");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   977
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   978
            result.append("-> ");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   979
            for (Block succ : block.getSuccessors()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   980
                result.append(succ).append(' ');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   981
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   982
            result.append('\n');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   983
            for (Node node : scheduleResult.getBlockToNodesMap().get(block)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   984
                if (node instanceof ValueNode && node.isAlive()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   985
                    if (!excludeVirtual || !(node instanceof VirtualObjectNode || node instanceof ProxyNode || node instanceof FullInfopointNode || node instanceof ParameterNode)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   986
                        if (node instanceof ConstantNode) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   987
                            if (checkConstants) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   988
                                String name = node.toString(Verbosity.Name);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   989
                                if (excludeVirtual) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   990
                                    constantsLines.add(name);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   991
                                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   992
                                    constantsLines.add(name + "    (" + filteredUsageCount(node) + ")");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   993
                                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   994
                            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   995
                        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   996
                            int id;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   997
                            if (canonicalId.get(node) != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   998
                                id = canonicalId.get(node);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
   999
                            } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1000
                                id = nextId++;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1001
                                canonicalId.set(node, id);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1002
                            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1003
                            String name = node.getClass().getSimpleName();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1004
                            result.append("  ").append(id).append('|').append(name);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1005
                            if (node instanceof AccessFieldNode) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1006
                                result.append('#');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1007
                                result.append(((AccessFieldNode) node).field());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1008
                            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1009
                            if (!excludeVirtual) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1010
                                result.append("    (");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1011
                                result.append(filteredUsageCount(node));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1012
                                result.append(')');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1013
                            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1014
                            result.append('\n');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1015
                        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1016
                    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1017
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1018
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1019
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1020
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1021
        StringBuilder constantsLinesResult = new StringBuilder();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1022
        if (checkConstants) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1023
            constantsLinesResult.append(constantsLines.size()).append(" constants:\n");
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1024
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1025
        Collections.sort(constantsLines);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1026
        for (String s : constantsLines) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1027
            constantsLinesResult.append(s);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1028
            constantsLinesResult.append('\n');
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1029
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1030
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1031
        return constantsLinesResult.toString() + result.toString();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1032
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1033
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1034
    private static int filteredUsageCount(Node node) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1035
        return node.usages().filter(n -> !(n instanceof FrameState)).count();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1036
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1037
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1038
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1039
     * This horror show of classes exists solely get {@link HotSpotSnippetBytecodeParser} to be used
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1040
     * as the parser for these snippets.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1041
     */
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1042
    class HotSpotSnippetReplacementsImpl extends HotSpotReplacementsImpl {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1043
        HotSpotSnippetReplacementsImpl(HotSpotReplacementsImpl replacements, Providers providers) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1044
            super(replacements, providers);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1045
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1046
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1047
        HotSpotSnippetReplacementsImpl(Providers providers, SnippetReflectionProvider snippetReflection, BytecodeProvider bytecodeProvider, TargetDescription target) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1048
            super(providers, snippetReflection, bytecodeProvider, target);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1049
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1050
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1051
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1052
        protected GraphMaker createGraphMaker(ResolvedJavaMethod substitute, ResolvedJavaMethod original) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1053
            return new SnippetGraphMaker(this, substitute, original);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1054
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1055
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1056
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1057
    class SnippetGraphMaker extends ReplacementsImpl.GraphMaker {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1058
        SnippetGraphMaker(ReplacementsImpl replacements, ResolvedJavaMethod substitute, ResolvedJavaMethod substitutedMethod) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1059
            super(replacements, substitute, substitutedMethod);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1060
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1061
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1062
        @Override
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1063
        protected GraphBuilderPhase.Instance createGraphBuilder(Providers providers, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts,
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1064
                        IntrinsicContext initialIntrinsicContext) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1065
            return new HotSpotSnippetGraphBuilderPhase(providers, graphBuilderConfig, optimisticOpts, initialIntrinsicContext);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1066
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1067
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1068
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1069
    class HotSpotSnippetGraphBuilderPhase extends GraphBuilderPhase.Instance {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1070
        HotSpotSnippetGraphBuilderPhase(Providers theProviders, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, IntrinsicContext initialIntrinsicContext) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1071
            super(theProviders, graphBuilderConfig, optimisticOpts, initialIntrinsicContext);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1072
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1073
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1074
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1075
        protected BytecodeParser createBytecodeParser(StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI, IntrinsicContext intrinsicContext) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1076
            return new HotSpotSnippetBytecodeParser(this, graph, parent, method, entryBCI, intrinsicContext);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1077
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1078
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1079
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1080
    class HotSpotSnippetBytecodeParser extends BytecodeParser {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1081
        HotSpotSnippetBytecodeParser(GraphBuilderPhase.Instance graphBuilderInstance, StructuredGraph graph, BytecodeParser parent, ResolvedJavaMethod method, int entryBCI,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1082
                        IntrinsicContext intrinsicContext) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1083
            super(graphBuilderInstance, graph, parent, method, entryBCI, intrinsicContext);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1084
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1085
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1086
        @Override
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1087
        public boolean canDeferPlugin(GeneratedInvocationPlugin plugin) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1088
            // Fold is always deferred but NodeIntrinsics may have to wait if all their arguments
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1089
            // aren't constant yet.
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1090
            return plugin.isGeneratedFromFoldOrNodeIntrinsic();
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1091
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1092
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1093
        @Override
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1094
        protected boolean canInlinePartialIntrinsicExit() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1095
            return false;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1096
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1097
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1098
        @Override
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
  1099
        protected boolean tryInvocationPlugin(CallTargetNode.InvokeKind invokeKind, ValueNode[] args, ResolvedJavaMethod targetMethod, JavaKind resultType) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1100
            if (intrinsicContext != null && intrinsicContext.isCallToOriginal(targetMethod)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1101
                return false;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1102
            }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1103
            if (targetMethod.getAnnotation(Fold.class) != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1104
                // Always defer Fold until decode time but NodeIntrinsics may fold if they are able.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1105
                return false;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1106
            }
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1107
            InvocationPlugin plugin = graphBuilderConfig.getPlugins().getInvocationPlugins().lookupInvocation(targetMethod);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1108
            if (conditionalPlugins.contains(plugin)) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1109
                // Because supporting arbitrary plugins in the context of encoded graphs is complex
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1110
                // we disallow it. This limitation can be worked around through the use of method
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1111
                // substitutions.
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1112
                throw new GraalError("conditional plugins are unsupported in snippets and method substitutions: " + targetMethod + " " + plugin);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 58299
diff changeset
  1113
            }
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54724
diff changeset
  1114
            return super.tryInvocationPlugin(invokeKind, args, targetMethod, resultType);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1115
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1116
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents:
diff changeset
  1117
}