Skip to content

Commit 613d0c6

Browse files
author
Solène Husseini
committed
Update vararg handling to match JDK22
1 parent a22eac8 commit 613d0c6

File tree

3 files changed

+25
-49
lines changed

3 files changed

+25
-49
lines changed

substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/AbiUtils.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -511,9 +511,22 @@ protected CallingSequence makeCallingSequence(MethodType type, FunctionDescripto
511511
@Override
512512
protected List<Adapter.Adaptation> generateAdaptations(NativeEntryPointInfo nep) {
513513
var adaptations = super.generateAdaptations(nep);
514-
/* Drop the rax parametersAssignment */
515-
assert adaptations.get(adaptations.size() - 1) == null;
516-
adaptations.set(adaptations.size() - 1, Adapter.drop());
514+
var assignments = nep.parametersAssignment();
515+
516+
if (assignments.length > 0) {
517+
final int last = assignments.length - 1;
518+
if (assignments[last].equals(X86_64Architecture.Regs.rax)) {
519+
/*
520+
* This branch is only taken when the function is variadic, that is when rax is
521+
* passed as an additional pseudo-parameter, where it will contain the number of
522+
* XMM registers passed as arguments. However, we need to remove the rax
523+
* assignment since rax will already be assigned separately in
524+
* SubstrateAMD64RegisterConfig.getCallingConvention and later used in
525+
* SubstrateAMD64NodeLIRBuilder.visitInvokeArguments.
526+
*/
527+
adaptations.set(last, Adapter.drop());
528+
}
529+
}
517530
return adaptations;
518531
}
519532

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/CFunctionSnippets.java

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,12 @@
3030

3131
import org.graalvm.compiler.api.replacements.Snippet;
3232
import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
33-
import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
3433
import org.graalvm.compiler.graph.Node;
3534
import org.graalvm.compiler.nodes.FixedNode;
3635
import org.graalvm.compiler.nodes.FixedWithNextNode;
3736
import org.graalvm.compiler.nodes.Invoke;
3837
import org.graalvm.compiler.nodes.InvokeNode;
3938
import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
40-
import org.graalvm.compiler.nodes.ValueNode;
41-
import org.graalvm.compiler.nodes.extended.ForeignCallNode;
4239
import org.graalvm.compiler.nodes.extended.MembarNode;
4340
import org.graalvm.compiler.nodes.spi.LoweringTool;
4441
import org.graalvm.compiler.options.OptionValues;
@@ -50,7 +47,6 @@
5047
import org.graalvm.compiler.replacements.Snippets;
5148
import org.graalvm.nativeimage.Platforms;
5249
import org.graalvm.nativeimage.c.struct.SizeOf;
53-
import org.graalvm.nativeimage.c.type.CIntPointer;
5450
import org.graalvm.nativeimage.impl.InternalPlatform;
5551
import org.graalvm.word.LocationIdentity;
5652

@@ -62,7 +58,6 @@
6258
import com.oracle.svm.core.graal.nodes.VerificationMarkerNode;
6359
import com.oracle.svm.core.graal.stackvalue.LoweredStackValueNode;
6460
import com.oracle.svm.core.graal.stackvalue.StackValueNode.StackSlotIdentity;
65-
import com.oracle.svm.core.nodes.CFunctionCaptureNode;
6661
import com.oracle.svm.core.nodes.CFunctionEpilogueNode;
6762
import com.oracle.svm.core.nodes.CFunctionPrologueDataNode;
6863
import com.oracle.svm.core.nodes.CFunctionPrologueNode;
@@ -98,7 +93,6 @@
9893
public final class CFunctionSnippets extends SubstrateTemplates implements Snippets {
9994

10095
private final SnippetInfo prologue;
101-
private final SnippetInfo capture;
10296
private final SnippetInfo epilogue;
10397

10498
/**
@@ -123,14 +117,6 @@ private static CPrologueData prologueSnippet(@ConstantParameter int newThreadSta
123117
return CFunctionPrologueDataNode.cFunctionPrologueData(anchor, newThreadStatus);
124118
}
125119

126-
@Node.NodeIntrinsic(value = ForeignCallNode.class)
127-
public static native void callCaptureFunction(@Node.ConstantNodeParameter ForeignCallDescriptor descriptor, int states, CIntPointer captureBuffer);
128-
129-
@Snippet
130-
private static void captureSnippet(@ConstantParameter ForeignCallDescriptor captureFunction, int statesToCapture, CIntPointer captureBuffer) {
131-
callCaptureFunction(captureFunction, statesToCapture, captureBuffer);
132-
}
133-
134120
@Snippet
135121
private static void epilogueSnippet(@ConstantParameter int oldThreadStatus) {
136122
if (SubstrateOptions.MultiThreaded.getValue()) {
@@ -157,11 +143,9 @@ private static void epilogueSnippet(@ConstantParameter int oldThreadStatus) {
157143
super(options, providers);
158144

159145
this.prologue = snippet(providers, CFunctionSnippets.class, "prologueSnippet");
160-
this.capture = snippet(providers, CFunctionSnippets.class, "captureSnippet");
161146
this.epilogue = snippet(providers, CFunctionSnippets.class, "epilogueSnippet");
162147

163148
lowerings.put(CFunctionPrologueNode.class, new CFunctionPrologueLowering());
164-
lowerings.put(CFunctionCaptureNode.class, new CFunctionCaptureLowering());
165149
lowerings.put(CFunctionEpilogueNode.class, new CFunctionEpilogueLowering());
166150
}
167151

@@ -193,27 +177,6 @@ public void lower(CFunctionPrologueNode node, LoweringTool tool) {
193177
}
194178
}
195179

196-
class CFunctionCaptureLowering implements NodeLoweringProvider<CFunctionCaptureNode> {
197-
@Override
198-
public void lower(CFunctionCaptureNode node, LoweringTool tool) {
199-
if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) {
200-
return;
201-
}
202-
203-
ValueNode statesToCapture = node.getStatesToCapture();
204-
ForeignCallDescriptor captureFunction = node.getCaptureFunction();
205-
ValueNode buffer = node.getCaptureBuffer();
206-
Arguments args = new Arguments(capture, node.graph().getGuardsStage(), tool.getLoweringStage());
207-
args.addConst("captureFunction", captureFunction);
208-
args.add("statesToCapture", statesToCapture);
209-
args.add("captureBuffer", buffer);
210-
211-
SnippetTemplate template = template(tool, node, args);
212-
template.setMayRemoveLocation(true);
213-
template.instantiate(tool.getMetaAccess(), node, SnippetTemplate.DEFAULT_REPLACER, args);
214-
}
215-
}
216-
217180
class CFunctionEpilogueLowering implements NodeLoweringProvider<CFunctionEpilogueNode> {
218181
@Override
219182
public void lower(CFunctionEpilogueNode node, LoweringTool tool) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/nodes/CFunctionCaptureNode.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@
3737
import org.graalvm.compiler.nodeinfo.NodeInfo;
3838
import org.graalvm.compiler.nodes.FixedWithNextNode;
3939
import org.graalvm.compiler.nodes.ValueNode;
40+
import org.graalvm.compiler.nodes.extended.ForeignCallNode;
4041
import org.graalvm.compiler.nodes.memory.SingleMemoryKill;
4142
import org.graalvm.compiler.nodes.spi.Lowerable;
43+
import org.graalvm.compiler.nodes.spi.LoweringTool;
4244
import org.graalvm.word.LocationIdentity;
4345

4446
/**
@@ -76,15 +78,13 @@ public LocationIdentity getKilledLocationIdentity() {
7678
return LocationIdentity.any();
7779
}
7880

79-
public ForeignCallDescriptor getCaptureFunction() {
80-
return captureFunction;
81-
}
82-
83-
public ValueNode getStatesToCapture() {
84-
return statesToCapture;
85-
}
81+
@Override
82+
public void lower(LoweringTool tool) {
83+
if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) {
84+
return;
85+
}
8686

87-
public ValueNode getCaptureBuffer() {
88-
return captureBuffer;
87+
final ForeignCallNode call = graph().add(new ForeignCallNode(captureFunction, statesToCapture, captureBuffer));
88+
graph().replaceFixedWithFixed(this, call);
8989
}
9090
}

0 commit comments

Comments
 (0)