31 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
32 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
33 import org.graalvm.compiler.hotspot.nodes.aot.EncodedSymbolNode;
34 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
35 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassStubCall;
36 import org.graalvm.compiler.hotspot.nodes.aot.LoadConstantIndirectlyNode;
37 import org.graalvm.compiler.hotspot.nodes.aot.LoadMethodCountersIndirectlyNode;
38 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
39 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantStubCall;
40 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
41 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersStubCall;
42 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
43 import org.graalvm.compiler.hotspot.word.KlassPointer;
44 import org.graalvm.compiler.hotspot.word.MethodCountersPointer;
45 import org.graalvm.compiler.hotspot.word.MethodPointer;
46 import org.graalvm.compiler.nodes.ConstantNode;
47 import org.graalvm.compiler.nodes.StructuredGraph;
48 import org.graalvm.compiler.nodes.ValueNode;
49 import org.graalvm.compiler.nodes.spi.LoweringTool;
50 import org.graalvm.compiler.nodes.util.GraphUtil;
51 import org.graalvm.compiler.replacements.SnippetTemplate;
52 import org.graalvm.compiler.replacements.SnippetTemplate.AbstractTemplates;
53 import org.graalvm.compiler.replacements.SnippetTemplate.Arguments;
54 import org.graalvm.compiler.replacements.SnippetTemplate.SnippetInfo;
55 import org.graalvm.compiler.replacements.Snippets;
56
57 import jdk.vm.ci.code.TargetDescription;
58 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
59 import jdk.vm.ci.hotspot.HotSpotObjectConstant;
60 import jdk.vm.ci.meta.Constant;
61
62 public class ResolveConstantSnippets implements Snippets {
63
64 @Snippet
65 public static Object resolveObjectConstant(Object constant) {
66 Object result = LoadConstantIndirectlyNode.loadObject(constant);
67 if (probability(VERY_SLOW_PATH_PROBABILITY, result == null)) {
68 result = ResolveConstantStubCall.resolveObject(constant, EncodedSymbolNode.encode(constant));
69 }
70 return result;
96 }
97 return result;
98 }
99
100 @Snippet
101 public static KlassPointer pureInitializeKlass(KlassPointer constant) {
102 KlassPointer result = LoadConstantIndirectlyNode.loadKlass(constant, HotSpotConstantLoadAction.INITIALIZE);
103 if (probability(VERY_SLOW_PATH_PROBABILITY, result.isNull())) {
104 result = ResolveConstantStubCall.resolveKlass(constant, EncodedSymbolNode.encode(constant), HotSpotConstantLoadAction.INITIALIZE);
105 }
106 return result;
107 }
108
109 public static class Templates extends AbstractTemplates {
110 private final SnippetInfo resolveObjectConstant = snippet(ResolveConstantSnippets.class, "resolveObjectConstant");
111 private final SnippetInfo resolveKlassConstant = snippet(ResolveConstantSnippets.class, "resolveKlassConstant");
112 private final SnippetInfo resolveMethodAndLoadCounters = snippet(ResolveConstantSnippets.class, "resolveMethodAndLoadCounters");
113 private final SnippetInfo initializeKlass = snippet(ResolveConstantSnippets.class, "initializeKlass");
114 private final SnippetInfo pureInitializeKlass = snippet(ResolveConstantSnippets.class, "pureInitializeKlass");
115
116 public Templates(HotSpotProviders providers, TargetDescription target) {
117 super(providers, providers.getSnippetReflection(), target);
118 }
119
120 public void lower(ResolveConstantNode resolveConstantNode, LoweringTool tool) {
121 StructuredGraph graph = resolveConstantNode.graph();
122
123 ValueNode value = resolveConstantNode.value();
124 assert value.isConstant() : "Expected a constant: " + value;
125 Constant constant = value.asConstant();
126 SnippetInfo snippet = null;
127
128 if (constant instanceof HotSpotMetaspaceConstant) {
129 HotSpotMetaspaceConstant hotspotMetaspaceConstant = (HotSpotMetaspaceConstant) constant;
130 if (hotspotMetaspaceConstant.asResolvedJavaType() != null) {
131 if (resolveConstantNode.action() == HotSpotConstantLoadAction.RESOLVE) {
132 snippet = resolveKlassConstant;
133 } else {
134 assert resolveConstantNode.action() == HotSpotConstantLoadAction.INITIALIZE;
135 snippet = pureInitializeKlass;
136 }
137 }
|
31 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
32 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
33 import org.graalvm.compiler.hotspot.nodes.aot.EncodedSymbolNode;
34 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
35 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassStubCall;
36 import org.graalvm.compiler.hotspot.nodes.aot.LoadConstantIndirectlyNode;
37 import org.graalvm.compiler.hotspot.nodes.aot.LoadMethodCountersIndirectlyNode;
38 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
39 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantStubCall;
40 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
41 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersStubCall;
42 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
43 import org.graalvm.compiler.hotspot.word.KlassPointer;
44 import org.graalvm.compiler.hotspot.word.MethodCountersPointer;
45 import org.graalvm.compiler.hotspot.word.MethodPointer;
46 import org.graalvm.compiler.nodes.ConstantNode;
47 import org.graalvm.compiler.nodes.StructuredGraph;
48 import org.graalvm.compiler.nodes.ValueNode;
49 import org.graalvm.compiler.nodes.spi.LoweringTool;
50 import org.graalvm.compiler.nodes.util.GraphUtil;
51 import org.graalvm.compiler.options.OptionValues;
52 import org.graalvm.compiler.replacements.SnippetTemplate;
53 import org.graalvm.compiler.replacements.SnippetTemplate.AbstractTemplates;
54 import org.graalvm.compiler.replacements.SnippetTemplate.Arguments;
55 import org.graalvm.compiler.replacements.SnippetTemplate.SnippetInfo;
56 import org.graalvm.compiler.replacements.Snippets;
57
58 import jdk.vm.ci.code.TargetDescription;
59 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
60 import jdk.vm.ci.hotspot.HotSpotObjectConstant;
61 import jdk.vm.ci.meta.Constant;
62
63 public class ResolveConstantSnippets implements Snippets {
64
65 @Snippet
66 public static Object resolveObjectConstant(Object constant) {
67 Object result = LoadConstantIndirectlyNode.loadObject(constant);
68 if (probability(VERY_SLOW_PATH_PROBABILITY, result == null)) {
69 result = ResolveConstantStubCall.resolveObject(constant, EncodedSymbolNode.encode(constant));
70 }
71 return result;
97 }
98 return result;
99 }
100
101 @Snippet
102 public static KlassPointer pureInitializeKlass(KlassPointer constant) {
103 KlassPointer result = LoadConstantIndirectlyNode.loadKlass(constant, HotSpotConstantLoadAction.INITIALIZE);
104 if (probability(VERY_SLOW_PATH_PROBABILITY, result.isNull())) {
105 result = ResolveConstantStubCall.resolveKlass(constant, EncodedSymbolNode.encode(constant), HotSpotConstantLoadAction.INITIALIZE);
106 }
107 return result;
108 }
109
110 public static class Templates extends AbstractTemplates {
111 private final SnippetInfo resolveObjectConstant = snippet(ResolveConstantSnippets.class, "resolveObjectConstant");
112 private final SnippetInfo resolveKlassConstant = snippet(ResolveConstantSnippets.class, "resolveKlassConstant");
113 private final SnippetInfo resolveMethodAndLoadCounters = snippet(ResolveConstantSnippets.class, "resolveMethodAndLoadCounters");
114 private final SnippetInfo initializeKlass = snippet(ResolveConstantSnippets.class, "initializeKlass");
115 private final SnippetInfo pureInitializeKlass = snippet(ResolveConstantSnippets.class, "pureInitializeKlass");
116
117 public Templates(OptionValues options, HotSpotProviders providers, TargetDescription target) {
118 super(options, providers, providers.getSnippetReflection(), target);
119 }
120
121 public void lower(ResolveConstantNode resolveConstantNode, LoweringTool tool) {
122 StructuredGraph graph = resolveConstantNode.graph();
123
124 ValueNode value = resolveConstantNode.value();
125 assert value.isConstant() : "Expected a constant: " + value;
126 Constant constant = value.asConstant();
127 SnippetInfo snippet = null;
128
129 if (constant instanceof HotSpotMetaspaceConstant) {
130 HotSpotMetaspaceConstant hotspotMetaspaceConstant = (HotSpotMetaspaceConstant) constant;
131 if (hotspotMetaspaceConstant.asResolvedJavaType() != null) {
132 if (resolveConstantNode.action() == HotSpotConstantLoadAction.RESOLVE) {
133 snippet = resolveKlassConstant;
134 } else {
135 assert resolveConstantNode.action() == HotSpotConstantLoadAction.INITIALIZE;
136 snippet = pureInitializeKlass;
137 }
138 }
|