use of com.oracle.svm.hosted.c.CInterfaceError in project graal by oracle.
the class CInterfaceInvocationPlugin method makeLocationIdentity.
private static LocationIdentity makeLocationIdentity(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args, AccessorInfo accessorInfo) {
LocationIdentity locationIdentity;
if (accessorInfo.hasLocationIdentityParameter()) {
ValueNode locationIdentityNode = args[accessorInfo.locationIdentityParameterNumber(true)];
if (!locationIdentityNode.isConstant()) {
throw UserError.abort(new CInterfaceError("locationIdentity is not a compile time constant for call to " + method.format("%H.%n(%p)") + " in " + b.getMethod().asStackTraceElement(b.bci()), method).getMessage());
}
locationIdentity = (LocationIdentity) SubstrateObjectConstant.asObject(locationIdentityNode.asConstant());
} else if (accessorInfo.hasUniqueLocationIdentity()) {
StructFieldInfo fieldInfo = (StructFieldInfo) accessorInfo.getParent();
assert fieldInfo.getLocationIdentity() != null;
locationIdentity = fieldInfo.getLocationIdentity();
} else {
locationIdentity = CInterfaceLocationIdentity.DEFAULT_LOCATION_IDENTITY;
}
return locationIdentity;
}
use of com.oracle.svm.hosted.c.CInterfaceError 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 com.oracle.svm.hosted.c.CInterfaceError in project graal by oracle.
the class RawStructureLayoutPlanner method visitRawStructureInfo.
@Override
protected void visitRawStructureInfo(RawStructureInfo info) {
if (info.isPlanned()) {
return;
}
ResolvedJavaType type = (ResolvedJavaType) info.getAnnotatedElement();
for (ResolvedJavaType t : type.getInterfaces()) {
if (!nativeLibs.isPointerBase(t)) {
throw UserError.abort("Type " + type + " must not implement " + t);
}
if (t.equals(nativeLibs.getPointerBaseType())) {
continue;
}
ElementInfo einfo = nativeLibs.findElementInfo(t);
if (!(einfo instanceof RawStructureInfo)) {
throw UserError.abort(new CInterfaceError("Illegal super type " + t + " found", type).getMessage());
}
RawStructureInfo rinfo = (RawStructureInfo) einfo;
rinfo.accept(this);
assert rinfo.isPlanned();
if (info.getParentInfo() != null) {
throw UserError.abort(new CInterfaceError("Only single inheritance of RawStructure types is supported", type).getMessage());
}
info.setParentInfo(rinfo);
}
for (ElementInfo child : new ArrayList<>(info.getChildren())) {
if (child instanceof StructFieldInfo) {
StructFieldInfo fieldInfo = (StructFieldInfo) child;
StructFieldInfo parentFieldInfo = findParentFieldInfo(fieldInfo, info.getParentInfo());
if (parentFieldInfo != null) {
fieldInfo.mergeChildrenAndDelete(parentFieldInfo);
} else {
computeSize(fieldInfo);
}
}
}
planLayout(info);
}
Aggregations