28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_16;
29
30 import org.graalvm.compiler.core.common.PermanentBailoutException;
31 import org.graalvm.compiler.graph.Node;
32 import org.graalvm.compiler.graph.NodeClass;
33 import org.graalvm.compiler.graph.spi.Canonicalizable;
34 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
35 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
36 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
37 import org.graalvm.compiler.hotspot.nodes.DeoptimizingStubCall;
38 import org.graalvm.compiler.hotspot.word.KlassPointer;
39 import org.graalvm.compiler.lir.LIRFrameState;
40 import org.graalvm.compiler.nodeinfo.NodeInfo;
41 import org.graalvm.compiler.nodes.NodeView;
42 import org.graalvm.compiler.nodes.ValueNode;
43 import org.graalvm.compiler.nodes.spi.LIRLowerable;
44 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
45 import org.graalvm.compiler.nodes.util.GraphUtil;
46 import org.graalvm.compiler.word.Word;
47
48 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
49 import jdk.vm.ci.hotspot.HotSpotObjectConstant;
50 import jdk.vm.ci.meta.Constant;
51 import jdk.vm.ci.meta.Value;
52
53 /**
54 * A call to the VM via a regular stub.
55 */
56 @NodeInfo(cycles = CYCLES_UNKNOWN, size = SIZE_16)
57 public class ResolveConstantStubCall extends DeoptimizingStubCall implements Canonicalizable, LIRLowerable {
58 public static final NodeClass<ResolveConstantStubCall> TYPE = NodeClass.create(ResolveConstantStubCall.class);
59
60 @OptionalInput protected ValueNode value;
61 @Input protected ValueNode string;
62 protected Constant constant;
63 protected HotSpotConstantLoadAction action;
64
65 public ResolveConstantStubCall(ValueNode value, ValueNode string) {
66 super(TYPE, value.stamp(NodeView.DEFAULT));
67 this.value = value;
83 public static native KlassPointer resolveKlass(KlassPointer value, Word symbol);
84
85 @NodeIntrinsic
86 public static native KlassPointer resolveKlass(KlassPointer value, Word symbol, @ConstantNodeParameter HotSpotConstantLoadAction action);
87
88 @Override
89 public Node canonical(CanonicalizerTool tool) {
90 if (value != null) {
91 constant = GraphUtil.foldIfConstantAndRemove(this, value);
92 }
93 return this;
94 }
95
96 @Override
97 public void generate(NodeLIRBuilderTool gen) {
98 assert constant != null : "Expected the value to fold: " + value;
99 Value stringValue = gen.operand(string);
100 Value result;
101 LIRFrameState fs = gen.state(this);
102 assert fs != null : "The stateAfter is null";
103 if (constant instanceof HotSpotObjectConstant) {
104 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitObjectConstantRetrieval(constant, stringValue, fs);
105 } else if (constant instanceof HotSpotMetaspaceConstant) {
106 if (action == HotSpotConstantLoadAction.RESOLVE) {
107 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitMetaspaceConstantRetrieval(constant, stringValue, fs);
108 } else {
109 assert action == HotSpotConstantLoadAction.INITIALIZE;
110 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitKlassInitializationAndRetrieval(constant, stringValue, fs);
111 }
112 } else {
113 throw new PermanentBailoutException("Unsupported constant type: " + constant);
114 }
115 gen.setResult(this, result);
116 }
117 }
|
28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_16;
29
30 import org.graalvm.compiler.core.common.PermanentBailoutException;
31 import org.graalvm.compiler.graph.Node;
32 import org.graalvm.compiler.graph.NodeClass;
33 import org.graalvm.compiler.graph.spi.Canonicalizable;
34 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
35 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
36 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
37 import org.graalvm.compiler.hotspot.nodes.DeoptimizingStubCall;
38 import org.graalvm.compiler.hotspot.word.KlassPointer;
39 import org.graalvm.compiler.lir.LIRFrameState;
40 import org.graalvm.compiler.nodeinfo.NodeInfo;
41 import org.graalvm.compiler.nodes.NodeView;
42 import org.graalvm.compiler.nodes.ValueNode;
43 import org.graalvm.compiler.nodes.spi.LIRLowerable;
44 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
45 import org.graalvm.compiler.nodes.util.GraphUtil;
46 import org.graalvm.compiler.word.Word;
47
48 import jdk.vm.ci.hotspot.HotSpotConstantPoolObject;
49 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
50 import jdk.vm.ci.hotspot.HotSpotObjectConstant;
51 import jdk.vm.ci.meta.Constant;
52 import jdk.vm.ci.meta.Value;
53
54 /**
55 * A call to the VM via a regular stub.
56 */
57 @NodeInfo(cycles = CYCLES_UNKNOWN, size = SIZE_16)
58 public class ResolveConstantStubCall extends DeoptimizingStubCall implements Canonicalizable, LIRLowerable {
59 public static final NodeClass<ResolveConstantStubCall> TYPE = NodeClass.create(ResolveConstantStubCall.class);
60
61 @OptionalInput protected ValueNode value;
62 @Input protected ValueNode string;
63 protected Constant constant;
64 protected HotSpotConstantLoadAction action;
65
66 public ResolveConstantStubCall(ValueNode value, ValueNode string) {
67 super(TYPE, value.stamp(NodeView.DEFAULT));
68 this.value = value;
84 public static native KlassPointer resolveKlass(KlassPointer value, Word symbol);
85
86 @NodeIntrinsic
87 public static native KlassPointer resolveKlass(KlassPointer value, Word symbol, @ConstantNodeParameter HotSpotConstantLoadAction action);
88
89 @Override
90 public Node canonical(CanonicalizerTool tool) {
91 if (value != null) {
92 constant = GraphUtil.foldIfConstantAndRemove(this, value);
93 }
94 return this;
95 }
96
97 @Override
98 public void generate(NodeLIRBuilderTool gen) {
99 assert constant != null : "Expected the value to fold: " + value;
100 Value stringValue = gen.operand(string);
101 Value result;
102 LIRFrameState fs = gen.state(this);
103 assert fs != null : "The stateAfter is null";
104 if (constant instanceof HotSpotObjectConstant || constant instanceof HotSpotConstantPoolObject) {
105 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitObjectConstantRetrieval(constant, stringValue, fs);
106 } else if (constant instanceof HotSpotMetaspaceConstant) {
107 if (action == HotSpotConstantLoadAction.RESOLVE) {
108 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitMetaspaceConstantRetrieval(constant, stringValue, fs);
109 } else {
110 assert action == HotSpotConstantLoadAction.INITIALIZE;
111 result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitKlassInitializationAndRetrieval(constant, stringValue, fs);
112 }
113 } else {
114 throw new PermanentBailoutException("Unsupported constant type: " + constant);
115 }
116 gen.setResult(this, result);
117 }
118 }
|