28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_16;
29
30 import org.graalvm.compiler.graph.Node;
31 import org.graalvm.compiler.graph.NodeClass;
32 import org.graalvm.compiler.graph.spi.Canonicalizable;
33 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
34 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
35 import org.graalvm.compiler.hotspot.word.KlassPointer;
36 import org.graalvm.compiler.lir.LIRFrameState;
37 import org.graalvm.compiler.nodeinfo.InputType;
38 import org.graalvm.compiler.nodeinfo.NodeInfo;
39 import org.graalvm.compiler.nodes.DeoptimizingNode;
40 import org.graalvm.compiler.nodes.FrameState;
41 import org.graalvm.compiler.nodes.NodeView;
42 import org.graalvm.compiler.nodes.ValueNode;
43 import org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint;
44 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
45 import org.graalvm.compiler.nodes.spi.LIRLowerable;
46 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
47 import org.graalvm.compiler.nodes.util.GraphUtil;
48 import jdk.internal.vm.compiler.word.LocationIdentity;
49
50 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
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(allowedUsageTypes = {InputType.Memory}, cycles = CYCLES_UNKNOWN, size = SIZE_16)
58 public class InitializeKlassStubCall extends AbstractMemoryCheckpoint implements LIRLowerable, Canonicalizable, DeoptimizingNode.DeoptBefore, MemoryCheckpoint.Single {
59 public static final NodeClass<InitializeKlassStubCall> TYPE = NodeClass.create(InitializeKlassStubCall.class);
60
61 @OptionalInput protected ValueNode value;
62 @Input protected ValueNode string;
63 @OptionalInput(InputType.State) protected FrameState stateBefore;
64 protected Constant constant;
65
66 protected InitializeKlassStubCall(ValueNode value, ValueNode string) {
67 super(TYPE, value.stamp(NodeView.DEFAULT));
68 this.value = value;
69 this.string = string;
70 }
71
72 @NodeIntrinsic
73 public static native KlassPointer initializeKlass(KlassPointer value, Object string);
74
75 @Override
76 public Node canonical(CanonicalizerTool tool) {
77 if (value != null) {
78 constant = GraphUtil.foldIfConstantAndRemove(this, value);
79 }
80 return this;
81 }
82
83 @Override
84 public void generate(NodeLIRBuilderTool gen) {
85 assert constant != null : "Expected the value to fold: " + value;
86 Value stringValue = gen.operand(string);
87 LIRFrameState fs = gen.state(this);
88 assert fs != null : "Frame state should be set";
89 assert constant instanceof HotSpotMetaspaceConstant;
90 Value result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitKlassInitializationAndRetrieval(constant, stringValue, fs);
91 gen.setResult(this, result);
92 }
93
|
28 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_16;
29
30 import org.graalvm.compiler.graph.Node;
31 import org.graalvm.compiler.graph.NodeClass;
32 import org.graalvm.compiler.graph.spi.Canonicalizable;
33 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
34 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
35 import org.graalvm.compiler.hotspot.word.KlassPointer;
36 import org.graalvm.compiler.lir.LIRFrameState;
37 import org.graalvm.compiler.nodeinfo.InputType;
38 import org.graalvm.compiler.nodeinfo.NodeInfo;
39 import org.graalvm.compiler.nodes.DeoptimizingNode;
40 import org.graalvm.compiler.nodes.FrameState;
41 import org.graalvm.compiler.nodes.NodeView;
42 import org.graalvm.compiler.nodes.ValueNode;
43 import org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint;
44 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
45 import org.graalvm.compiler.nodes.spi.LIRLowerable;
46 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
47 import org.graalvm.compiler.nodes.util.GraphUtil;
48 import org.graalvm.compiler.word.Word;
49 import jdk.internal.vm.compiler.word.LocationIdentity;
50
51 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
52 import jdk.vm.ci.meta.Constant;
53 import jdk.vm.ci.meta.Value;
54
55 /**
56 * A call to the VM via a regular stub.
57 */
58 @NodeInfo(allowedUsageTypes = {InputType.Memory}, cycles = CYCLES_UNKNOWN, size = SIZE_16)
59 public class InitializeKlassStubCall extends AbstractMemoryCheckpoint implements LIRLowerable, Canonicalizable, DeoptimizingNode.DeoptBefore, MemoryCheckpoint.Single {
60 public static final NodeClass<InitializeKlassStubCall> TYPE = NodeClass.create(InitializeKlassStubCall.class);
61
62 @OptionalInput protected ValueNode value;
63 @Input protected ValueNode string;
64 @OptionalInput(InputType.State) protected FrameState stateBefore;
65 protected Constant constant;
66
67 protected InitializeKlassStubCall(ValueNode value, ValueNode string) {
68 super(TYPE, value.stamp(NodeView.DEFAULT));
69 this.value = value;
70 this.string = string;
71 }
72
73 @NodeIntrinsic
74 public static native KlassPointer initializeKlass(KlassPointer value, Word string);
75
76 @Override
77 public Node canonical(CanonicalizerTool tool) {
78 if (value != null) {
79 constant = GraphUtil.foldIfConstantAndRemove(this, value);
80 }
81 return this;
82 }
83
84 @Override
85 public void generate(NodeLIRBuilderTool gen) {
86 assert constant != null : "Expected the value to fold: " + value;
87 Value stringValue = gen.operand(string);
88 LIRFrameState fs = gen.state(this);
89 assert fs != null : "Frame state should be set";
90 assert constant instanceof HotSpotMetaspaceConstant;
91 Value result = ((HotSpotLIRGenerator) gen.getLIRGeneratorTool()).emitKlassInitializationAndRetrieval(constant, stringValue, fs);
92 gen.setResult(this, result);
93 }
94
|