use of jdk.vm.ci.meta.ResolvedJavaType in project graal by oracle.
the class CInterfaceEnumTool method invokeEnumLookup.
private InvokeNode invokeEnumLookup(GraphBuilderTool b, CallTargetFactory callTargetFactory, FrameStateBuilder frameState, int bci, EnumInfo enumInfo, JavaKind parameterKind, ValueNode arg) {
ValueNode[] args = new ValueNode[2];
args[0] = ConstantNode.forConstant(snippetReflection.forObject(enumInfo.getRuntimeData()), b.getMetaAccess(), b.getGraph());
assert !Modifier.isStatic(convertCToJavaMethod.getModifiers()) && convertCToJavaMethod.getSignature().getParameterCount(false) == 1;
JavaKind expectedKind = convertCToJavaMethod.getSignature().getParameterType(0, null).getJavaKind();
args[1] = CInterfaceInvocationPlugin.adaptPrimitiveType(b.getGraph(), arg, parameterKind, expectedKind, false);
ResolvedJavaType convertReturnType = (ResolvedJavaType) convertCToJavaMethod.getSignature().getReturnType(null);
StampPair returnStamp = StampFactory.forDeclaredType(null, convertReturnType, false);
MethodCallTargetNode callTargetNode = b.append(callTargetFactory.createMethodCallTarget(InvokeKind.Virtual, convertCToJavaMethod, args, returnStamp, bci));
Stamp invokeStamp = StampFactory.object(TypeReference.createWithoutAssumptions(convertReturnType));
InvokeNode invoke = b.append(new InvokeNode(callTargetNode, bci, invokeStamp));
frameState.push(convertReturnType.getJavaKind(), invoke);
FrameState stateWithInvoke = frameState.create(bci, invoke);
frameState.pop(convertReturnType.getJavaKind());
invoke.setStateAfter(stateWithInvoke);
return invoke;
}
use of jdk.vm.ci.meta.ResolvedJavaType in project graal by oracle.
the class CInterfaceInvocationPlugin method replaceFunctionPointerInvoke.
private boolean replaceFunctionPointerInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args, CallingConvention.Type callType) {
if (!functionPointerType.isAssignableFrom(method.getDeclaringClass())) {
throw UserError.abort(new CInterfaceError("function pointer invocation method " + method.format("%H.%n(%p)") + " must be in a type that extends " + CFunctionPointer.class.getSimpleName(), method).getMessage());
}
assert b.getInvokeKind() == InvokeKind.Interface;
JavaType[] parameterTypes = method.getSignature().toParameterTypes(null);
if (callType == SubstrateCallingConventionType.NativeCall) {
Predicate<JavaType> isValid = t -> t.getJavaKind().isPrimitive() || wordTypes.isWord(t);
UserError.guarantee(Stream.of(parameterTypes).allMatch(isValid) && isValid.test(method.getSignature().getReturnType(null)), "C function pointer invocation method must have only primitive types or word types for its parameters and return value: " + method.format("%H.%n(%p)"));
/*
* We currently do not support automatic conversions for @CEnum because it entails
* introducing additional invokes without real BCIs in a BytecodeParser context, which
* does not work too well.
*/
}
// We "discard" the receiver from the signature by pretending we are a static method
assert args.length >= 1;
ValueNode methodAddress = args[0];
ValueNode[] argsWithoutReceiver = Arrays.copyOfRange(args, 1, args.length);
assert argsWithoutReceiver.length == parameterTypes.length;
Stamp returnStamp;
if (wordTypes.isWord(b.getInvokeReturnType())) {
returnStamp = wordTypes.getWordStamp((ResolvedJavaType) b.getInvokeReturnType());
} else {
returnStamp = b.getInvokeReturnStamp(null).getTrustedStamp();
}
CallTargetNode indirectCallTargetNode = b.add(new IndirectCallTargetNode(methodAddress, argsWithoutReceiver, StampPair.createSingle(returnStamp), parameterTypes, method, callType, InvokeKind.Static));
if (callType == SubstrateCallingConventionType.JavaCall) {
b.handleReplacedInvoke(indirectCallTargetNode, b.getInvokeReturnType().getJavaKind());
} else if (callType == SubstrateCallingConventionType.NativeCall) {
// Native code cannot throw exceptions, omit exception edge
InvokeNode invokeNode = new InvokeNode(indirectCallTargetNode, b.bci());
if (pushKind(method) != JavaKind.Void) {
b.addPush(pushKind(method), invokeNode);
} else {
b.add(invokeNode);
}
} else {
throw shouldNotReachHere("Unsupported type of call: " + callType);
}
return true;
}
use of jdk.vm.ci.meta.ResolvedJavaType in project graal by oracle.
the class JNIFunctionTablesFeature method beforeAnalysis.
@Override
public void beforeAnalysis(BeforeAnalysisAccess arg) {
BeforeAnalysisAccessImpl access = (BeforeAnalysisAccessImpl) arg;
AnalysisMetaAccess metaAccess = access.getMetaAccess();
JNIFunctionTables.create();
NativeLibraries nativeLibraries = access.getNativeLibraries();
AnalysisType invokeInterface = metaAccess.lookupJavaType(JNIInvokeInterface.class);
invokeInterfaceMetadata = (StructInfo) nativeLibraries.findElementInfo(invokeInterface);
AnalysisType functionTable = metaAccess.lookupJavaType(JNINativeInterface.class);
functionTableMetadata = (StructInfo) nativeLibraries.findElementInfo(functionTable);
// Manually add functions as entry points so this is only done when JNI features are enabled
AnalysisType invokes = metaAccess.lookupJavaType(JNIInvocationInterface.class);
AnalysisType exports = metaAccess.lookupJavaType(JNIInvocationInterface.Exports.class);
AnalysisType functions = metaAccess.lookupJavaType(JNIFunctions.class);
Stream<AnalysisMethod> analysisMethods = Stream.of(invokes, functions, exports).flatMap(t -> Stream.of(t.getDeclaredMethods()));
Stream<AnalysisMethod> unimplementedMethods = Stream.of((AnalysisMethod) getSingleMethod(metaAccess, UnimplementedWithJNIEnvArgument.class), (AnalysisMethod) getSingleMethod(metaAccess, UnimplementedWithJavaVMArgument.class));
Stream.concat(analysisMethods, unimplementedMethods).forEach(method -> {
CEntryPoint annotation = method.getAnnotation(CEntryPoint.class);
assert annotation != null : "only entry points allowed in class";
CEntryPointCallStubSupport.singleton().registerStubForMethod(method, () -> CEntryPointData.create(method));
});
ArrayList<ResolvedJavaMethod> generated = new ArrayList<>();
MetaAccessProvider wrappedMetaAccess = metaAccess.getWrapped();
ResolvedJavaType generatedMethodClass = wrappedMetaAccess.lookupJavaType(JNIFunctions.class);
ConstantPool constantPool = generatedMethodClass.getDeclaredMethods()[0].getConstantPool();
// Generate JNI field accessors
EnumSet<JavaKind> fldKinds = jniKinds.clone();
fldKinds.remove(JavaKind.Void);
for (JavaKind kind : fldKinds) {
boolean[] trueFalse = { true, false };
for (boolean isSetter : trueFalse) {
for (boolean isStatic : trueFalse) {
JNIFieldAccessorMethod method = new JNIFieldAccessorMethod(kind, isSetter, isStatic, generatedMethodClass, constantPool, wrappedMetaAccess);
AnalysisMethod analysisMethod = access.getUniverse().lookup(method);
access.getBigBang().addRootMethod(analysisMethod).registerAsEntryPoint(method.createEntryPointData());
generated.add(method);
}
}
}
// Generate JNI primitive array operations
EnumSet<JavaKind> primitiveArrayKinds = jniKinds.clone();
primitiveArrayKinds.remove(JavaKind.Void);
primitiveArrayKinds.remove(JavaKind.Object);
for (JavaKind kind : primitiveArrayKinds) {
for (Operation op : Operation.values()) {
JNIPrimitiveArrayOperationMethod method = new JNIPrimitiveArrayOperationMethod(kind, op, generatedMethodClass, constantPool, wrappedMetaAccess);
AnalysisMethod analysisMethod = access.getUniverse().lookup(method);
access.getBigBang().addRootMethod(analysisMethod).registerAsEntryPoint(method.createEntryPointData());
generated.add(method);
}
}
generatedMethods = generated.toArray(new ResolvedJavaMethod[0]);
}
use of jdk.vm.ci.meta.ResolvedJavaType in project graal by oracle.
the class ClassfileBytecodeProvider method getClassfile.
/**
* Gets a {@link Classfile} created by parsing the class file bytes for {@code c}.
*
* @throws NoClassDefFoundError if the class file cannot be found
*/
private synchronized Classfile getClassfile(Class<?> c) {
assert !c.isPrimitive() && !c.isArray() : c;
Classfile classfile = classfiles.get(c);
if (classfile == null) {
try {
ResolvedJavaType type = metaAccess.lookupJavaType(c);
InputStream in = GraalServices.getClassfileAsStream(c);
if (in != null) {
DataInputStream stream = new DataInputStream(in);
classfile = new Classfile(type, stream, this);
classfiles.put(c, classfile);
return classfile;
}
throw new NoClassDefFoundError(c.getName());
} catch (IOException e) {
throw (NoClassDefFoundError) new NoClassDefFoundError(c.getName()).initCause(e);
}
}
return classfile;
}
use of jdk.vm.ci.meta.ResolvedJavaType in project graal by oracle.
the class BasicArrayCopyNode method isExact.
/*
* Returns true if this copy doesn't require store checks. Trivially true for primitive arrays.
*/
public boolean isExact() {
ResolvedJavaType srcType = StampTool.typeOrNull(getSource().stamp(NodeView.DEFAULT));
ResolvedJavaType destType = StampTool.typeOrNull(getDestination().stamp(NodeView.DEFAULT));
if (srcType == null || !srcType.isArray() || destType == null || !destType.isArray()) {
return false;
}
if ((srcType.getComponentType().getJavaKind().isPrimitive() && destType.getComponentType().equals(srcType.getComponentType())) || getSource() == getDestination()) {
return true;
}
if (StampTool.isExactType(getDestination().stamp(NodeView.DEFAULT))) {
if (destType != null && destType.isAssignableFrom(srcType)) {
return true;
}
}
return false;
}
Aggregations