use of org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin in project graal by oracle.
the class SubstrateGraphBuilderPlugins method registerPinnedAllocatorPlugins.
private static void registerPinnedAllocatorPlugins(ConstantReflectionProvider constantReflection, InvocationPlugins plugins) {
Registration r = new Registration(plugins, PinnedAllocator.class);
r.register2("newInstance", Receiver.class, Class.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver pinnedAllocator, ValueNode instanceClassNode) {
ResolvedJavaType instanceClass = typeValue(constantReflection, b, targetMethod, instanceClassNode, "instanceClass");
ValueNode pinnedAllocatorNode = pinnedAllocator.get();
b.addPush(JavaKind.Object, new NewPinnedInstanceNode(instanceClass, pinnedAllocatorNode));
return true;
}
});
r.register3("newArray", Receiver.class, Class.class, int.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver pinnedAllocator, ValueNode componentTypeNode, ValueNode length) {
ResolvedJavaType componentType = typeValue(constantReflection, b, targetMethod, componentTypeNode, "componentType");
ValueNode pinnedAllocatorNode = pinnedAllocator.get();
b.addPush(JavaKind.Object, new NewPinnedArrayNode(componentType, length, pinnedAllocatorNode));
return true;
}
});
}
use of org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin in project graal by oracle.
the class SubstrateGraphBuilderPlugins method registerSizeOfPlugins.
private static void registerSizeOfPlugins(SnippetReflectionProvider snippetReflection, InvocationPlugins plugins) {
Registration r = new Registration(plugins, SizeOf.class);
r.register1("get", Class.class, new InvocationPlugin() {
@SuppressWarnings("unchecked")
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unused, ValueNode classNode) {
Class<? extends PointerBase> clazz = constantObjectParameter(b, snippetReflection, targetMethod, 0, Class.class, classNode);
int result = SizeOf.get(clazz);
b.notifyReplacedCall(targetMethod, b.addPush(JavaKind.Int, ConstantNode.forInt(result)));
return true;
}
});
r.register1("unsigned", Class.class, new InvocationPlugin() {
@SuppressWarnings("unchecked")
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unused, ValueNode classNode) {
Class<? extends PointerBase> clazz = constantObjectParameter(b, snippetReflection, targetMethod, 0, Class.class, classNode);
UnsignedWord result = SizeOf.unsigned(clazz);
b.notifyReplacedCall(targetMethod, b.addPush(JavaKind.Object, ConstantNode.forConstant(snippetReflection.forObject(result), b.getMetaAccess())));
return true;
}
});
}
use of org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin in project graal by oracle.
the class VMThreadMTFeature method registerAccessors.
private void registerAccessors(Registration r, Class<?> valueClass, boolean isVolatile) {
String suffix = isVolatile ? "Volatile" : "";
/* get() method without the VMThread parameter. */
r.register1("get" + suffix, Receiver.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
ValueNode threadNode = currentThread(b, false);
return handleGet(b, targetMethod, receiver, threadNode, isVolatile);
}
});
/* get() method with the VMThread parameter. */
r.register2("get" + suffix, Receiver.class, IsolateThread.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode threadNode) {
return handleGet(b, targetMethod, receiver, threadNode, isVolatile);
}
});
/* set() method without the VMThread parameter. */
r.register2("set" + suffix, Receiver.class, valueClass, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode valueNode) {
ValueNode threadNode = currentThread(b, false);
return handleSet(b, receiver, threadNode, valueNode, isVolatile);
}
});
/* set() method with the VMThread parameter. */
r.register3("set" + suffix, Receiver.class, IsolateThread.class, valueClass, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode threadNode, ValueNode valueNode) {
return handleSet(b, receiver, threadNode, valueNode, isVolatile);
}
});
}
use of org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin in project graal by oracle.
the class VMThreadSTFeature method registerInvocationPlugins.
/**
* Intrinsify the {@code get()} and {@code set()} methods during bytecode parsing. We know that
* every subclass of VMThreadLocal has the same methods. Only the signatures differ based on the
* type of value.
* <p>
* The value is stored in the two arrays that are in the image heap: a Object[] array for thread
* local object variables, and a byte[] array for all thread local primitive variables.
* Therefore, we need the proper read/write barriers. The {@link IsolateThread} parameter is
* ignored.
*/
@Override
public void registerInvocationPlugins(Providers providers, SnippetReflectionProvider snippetReflection, InvocationPlugins invocationPlugins, boolean hosted) {
for (Class<? extends FastThreadLocal> threadLocalClass : VMThreadLocalInfo.THREAD_LOCAL_CLASSES) {
Registration r = new Registration(invocationPlugins, threadLocalClass);
Class<?> valueClass = VMThreadLocalInfo.getValueClass(threadLocalClass);
registerAccessors(r, valueClass, false);
registerAccessors(r, valueClass, true);
/* compareAndSet() method without the VMThread parameter. */
r.register3("compareAndSet", Receiver.class, valueClass, valueClass, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode expect, ValueNode update) {
return handleCompareAndSet(b, targetMethod, receiver, expect, update);
}
});
/* get() method with the VMThread parameter. */
r.register4("compareAndSet", Receiver.class, IsolateThread.class, valueClass, valueClass, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode threadNode, ValueNode expect, ValueNode update) {
return handleCompareAndSet(b, targetMethod, receiver, expect, update);
}
});
}
Class<?>[] typesWithGetAddress = new Class<?>[] { FastThreadLocalBytes.class, FastThreadLocalWord.class };
for (Class<?> type : typesWithGetAddress) {
Registration r = new Registration(invocationPlugins, type);
/* getAddress() method without the VMThread parameter. */
r.register1("getAddress", Receiver.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
return handleGetAddress(b, targetMethod, receiver);
}
});
/* getAddress() method with the VMThread parameter. */
r.register2("getAddress", Receiver.class, IsolateThread.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode threadNode) {
return handleGetAddress(b, targetMethod, receiver);
}
});
}
}
use of org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin in project graal by oracle.
the class DataPatchInConstantsTest method registerInvocationPlugins.
@Override
protected void registerInvocationPlugins(InvocationPlugins invocationPlugins) {
Registration r = new Registration(invocationPlugins, DataPatchInConstantsTest.class);
r.register1("loadThroughPatch", Object.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode arg) {
b.addPush(JavaKind.Object, new LoadThroughPatchNode(arg));
return true;
}
});
r.register1("loadThroughCompressedPatch", Object.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode arg) {
ValueNode compressed = b.add(HotSpotCompressionNode.compress(arg, runtime().getVMConfig().getOopEncoding()));
ValueNode patch = b.add(new LoadThroughPatchNode(compressed));
b.addPush(JavaKind.Object, HotSpotCompressionNode.uncompress(patch, runtime().getVMConfig().getOopEncoding()));
return true;
}
});
super.registerInvocationPlugins(invocationPlugins);
}
Aggregations