Skip to content

Commit f2492bd

Browse files
committed
[GR-43361] Fix CEntryPointCallStubMethod signature
PullRequest: graal/15769
2 parents 9283c9e + f4d19be commit f2492bd

File tree

1 file changed

+55
-27
lines changed

1 file changed

+55
-27
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CEntryPointCallStubMethod.java

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,6 @@
2828
import java.util.Arrays;
2929
import java.util.Iterator;
3030

31-
import jdk.graal.compiler.core.common.calc.FloatConvert;
32-
import jdk.graal.compiler.core.common.type.StampFactory;
33-
import jdk.graal.compiler.debug.DebugContext;
34-
import jdk.graal.compiler.graph.NodeSourcePosition;
35-
import jdk.graal.compiler.nodes.CallTargetNode.InvokeKind;
36-
import jdk.graal.compiler.nodes.ConstantNode;
37-
import jdk.graal.compiler.nodes.DeadEndNode;
38-
import jdk.graal.compiler.nodes.FrameState;
39-
import jdk.graal.compiler.nodes.InvokeWithExceptionNode;
40-
import jdk.graal.compiler.nodes.ParameterNode;
41-
import jdk.graal.compiler.nodes.StructuredGraph;
42-
import jdk.graal.compiler.nodes.ValueNode;
43-
import jdk.graal.compiler.nodes.calc.FloatConvertNode;
44-
import jdk.graal.compiler.nodes.calc.IntegerEqualsNode;
45-
import jdk.graal.compiler.nodes.calc.SignExtendNode;
46-
import jdk.graal.compiler.nodes.calc.ZeroExtendNode;
47-
import jdk.graal.compiler.nodes.extended.BranchProbabilityNode;
48-
import jdk.graal.compiler.nodes.java.ExceptionObjectNode;
4931
import org.graalvm.nativeimage.Isolate;
5032
import org.graalvm.nativeimage.IsolateThread;
5133
import org.graalvm.nativeimage.c.constant.CEnum;
@@ -58,6 +40,7 @@
5840
import com.oracle.graal.pointsto.infrastructure.WrappedJavaMethod;
5941
import com.oracle.graal.pointsto.meta.AnalysisMetaAccess;
6042
import com.oracle.graal.pointsto.meta.AnalysisMethod;
43+
import com.oracle.graal.pointsto.meta.AnalysisType;
6144
import com.oracle.graal.pointsto.meta.HostedProviders;
6245
import com.oracle.svm.core.SubstrateUtil;
6346
import com.oracle.svm.core.Uninterruptible;
@@ -81,32 +64,77 @@
8164
import com.oracle.svm.hosted.phases.CInterfaceEnumTool;
8265
import com.oracle.svm.hosted.phases.HostedGraphKit;
8366

67+
import jdk.graal.compiler.core.common.calc.FloatConvert;
68+
import jdk.graal.compiler.core.common.type.StampFactory;
69+
import jdk.graal.compiler.debug.DebugContext;
70+
import jdk.graal.compiler.graph.NodeSourcePosition;
71+
import jdk.graal.compiler.nodes.ConstantNode;
72+
import jdk.graal.compiler.nodes.DeadEndNode;
73+
import jdk.graal.compiler.nodes.FrameState;
74+
import jdk.graal.compiler.nodes.InvokeWithExceptionNode;
75+
import jdk.graal.compiler.nodes.ParameterNode;
76+
import jdk.graal.compiler.nodes.StructuredGraph;
77+
import jdk.graal.compiler.nodes.ValueNode;
78+
import jdk.graal.compiler.nodes.CallTargetNode.InvokeKind;
79+
import jdk.graal.compiler.nodes.calc.FloatConvertNode;
80+
import jdk.graal.compiler.nodes.calc.IntegerEqualsNode;
81+
import jdk.graal.compiler.nodes.calc.SignExtendNode;
82+
import jdk.graal.compiler.nodes.calc.ZeroExtendNode;
83+
import jdk.graal.compiler.nodes.extended.BranchProbabilityNode;
84+
import jdk.graal.compiler.nodes.java.ExceptionObjectNode;
8485
import jdk.vm.ci.code.BytecodeFrame;
8586
import jdk.vm.ci.meta.ConstantPool;
8687
import jdk.vm.ci.meta.JavaKind;
8788
import jdk.vm.ci.meta.JavaType;
8889
import jdk.vm.ci.meta.MetaAccessProvider;
8990
import jdk.vm.ci.meta.ResolvedJavaMethod;
9091
import jdk.vm.ci.meta.ResolvedJavaType;
92+
import jdk.vm.ci.meta.Signature;
9193

9294
public final class CEntryPointCallStubMethod extends EntryPointCallStubMethod {
9395
static CEntryPointCallStubMethod create(AnalysisMethod targetMethod, CEntryPointData entryPointData, AnalysisMetaAccess metaAccess) {
94-
ResolvedJavaMethod unwrappedMethod = targetMethod.getWrapped();
9596
MetaAccessProvider unwrappedMetaAccess = metaAccess.getWrapped();
9697
ResolvedJavaType declaringClass = unwrappedMetaAccess.lookupJavaType(IsolateEnterStub.class);
9798
ConstantPool constantPool = IsolateEnterStub.getConstantPool(unwrappedMetaAccess);
98-
return new CEntryPointCallStubMethod(entryPointData, unwrappedMethod, declaringClass, constantPool);
99+
return new CEntryPointCallStubMethod(entryPointData, targetMethod, declaringClass, constantPool, metaAccess.getUniverse().getWordKind(), unwrappedMetaAccess);
99100
}
100101

101102
private static final JavaKind cEnumParameterKind = JavaKind.Int;
102103

103104
private final CEntryPointData entryPointData;
104105
private final ResolvedJavaMethod targetMethod;
106+
private final Signature targetSignature;
105107

106-
private CEntryPointCallStubMethod(CEntryPointData entryPointData, ResolvedJavaMethod targetMethod, ResolvedJavaType holderClass, ConstantPool holderConstantPool) {
107-
super(SubstrateUtil.uniqueStubName(targetMethod), holderClass, targetMethod.getSignature(), holderConstantPool);
108+
private CEntryPointCallStubMethod(CEntryPointData entryPointData, AnalysisMethod targetMethod, ResolvedJavaType holderClass, ConstantPool holderConstantPool, JavaKind wordKind,
109+
MetaAccessProvider metaAccess) {
110+
super(SubstrateUtil.uniqueStubName(targetMethod.getWrapped()), holderClass, createSignature(targetMethod, wordKind, metaAccess), holderConstantPool);
108111
this.entryPointData = entryPointData;
109-
this.targetMethod = targetMethod;
112+
this.targetMethod = targetMethod.getWrapped();
113+
this.targetSignature = targetMethod.getSignature();
114+
}
115+
116+
/**
117+
* This method creates a new signature for the stub in which all @CEnum values are converted
118+
* into their corresponding primitive type. In correspondence to how the @CEnum values are
119+
* actually handled, parameters are transformed to the type specified by cEnumParameterKind and
120+
* return type is transformed into the word type.
121+
*
122+
* @see CEnum
123+
* @see CEntryPointCallStubMethod#adaptParameterTypes(HostedProviders, NativeLibraries,
124+
* HostedGraphKit, JavaType[], JavaType[])
125+
* @see CEntryPointCallStubMethod#adaptReturnValue(ResolvedJavaMethod, HostedProviders, Purpose,
126+
* HostedGraphKit, ValueNode)
127+
*/
128+
private static SimpleSignature createSignature(AnalysisMethod targetMethod, JavaKind wordKind, MetaAccessProvider metaAccess) {
129+
JavaType[] paramTypes = Arrays.stream(targetMethod.toParameterTypes())
130+
.map(it -> ((AnalysisType) it))
131+
.map(type -> type.getAnnotation(CEnum.class) != null ? metaAccess.lookupJavaType(cEnumParameterKind.toJavaClass()) : type.getWrapped())
132+
.toArray(JavaType[]::new);
133+
ResolvedJavaType returnType = ((AnalysisType) targetMethod.getSignature().getReturnType(null)).getWrapped();
134+
if (returnType.getAnnotation(CEnum.class) != null) {
135+
returnType = metaAccess.lookupJavaType(wordKind.toJavaClass());
136+
}
137+
return new SimpleSignature(paramTypes, returnType);
110138
}
111139

112140
@Override
@@ -145,7 +173,7 @@ public StructuredGraph buildGraph(DebugContext debug, ResolvedJavaMethod method,
145173
NativeLibraries nativeLibraries = CEntryPointCallStubSupport.singleton().getNativeLibraries();
146174
HostedGraphKit kit = new HostedGraphKit(debug, providers, method, purpose);
147175

148-
JavaType[] parameterTypes = method.toParameterTypes();
176+
JavaType[] parameterTypes = targetSignature.toParameterTypes(null);
149177
JavaType[] parameterLoadTypes = Arrays.copyOf(parameterTypes, parameterTypes.length);
150178
EnumInfo[] parameterEnumInfos;
151179

@@ -336,8 +364,8 @@ private EnumInfo[] adaptParameterTypes(HostedProviders providers, NativeLibrarie
336364
assert !matchingNodes.hasNext() && parameterNode.usages().filter(n -> n != initialState).isEmpty();
337365
parameterNode.setStamp(StampFactory.forKind(cEnumParameterKind));
338366
} else {
339-
throw UserError.abort("Entry point method parameter types are restricted to primitive types, word types and enumerations (@%s): %s",
340-
CEnum.class.getSimpleName(), targetMethod);
367+
throw UserError.abort("Entry point method parameter types are restricted to primitive types, word types and enumerations (@%s): %s, given type was %s",
368+
CEnum.class.getSimpleName(), targetMethod, parameterTypes[i]);
341369
}
342370
}
343371
}
@@ -550,7 +578,7 @@ private ValueNode adaptReturnValue(ResolvedJavaMethod method, HostedProviders pr
550578
if (returnValue.getStackKind().isPrimitive()) {
551579
return returnValue;
552580
}
553-
JavaType returnType = method.getSignature().getReturnType(null);
581+
JavaType returnType = targetSignature.getReturnType(null);
554582
NativeLibraries nativeLibraries = CEntryPointCallStubSupport.singleton().getNativeLibraries();
555583
ElementInfo typeInfo = nativeLibraries.findElementInfo((ResolvedJavaType) returnType);
556584
if (typeInfo instanceof EnumInfo) {

0 commit comments

Comments
 (0)