Skip to content

Commit ca26baf

Browse files
committed
Add a StackValue to interact with the VaList
1 parent 2aa6a83 commit ca26baf

File tree

7 files changed

+210
-40
lines changed

7 files changed

+210
-40
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* Copyright (c) 2022, 2022, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
package com.oracle.svm.core.graal.nodes;
26+
27+
import static org.graalvm.compiler.nodeinfo.InputType.Memory;
28+
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_8;
29+
import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_8;
30+
31+
import org.graalvm.compiler.core.common.type.StampFactory;
32+
import org.graalvm.compiler.graph.Node;
33+
import org.graalvm.compiler.graph.NodeClass;
34+
import org.graalvm.compiler.nodeinfo.NodeInfo;
35+
import org.graalvm.compiler.nodes.FixedWithNextNode;
36+
import org.graalvm.compiler.nodes.ValueNode;
37+
import org.graalvm.compiler.nodes.memory.SingleMemoryKill;
38+
import org.graalvm.compiler.nodes.spi.Lowerable;
39+
import org.graalvm.compiler.nodes.spi.LoweringTool;
40+
import org.graalvm.word.LocationIdentity;
41+
42+
import jdk.vm.ci.meta.JavaKind;
43+
44+
/**
45+
* Puts the VaList in a StackValue, used as a layer to access and modify it.
46+
*/
47+
@NodeInfo(size = SIZE_8, cycles = CYCLES_8, allowedUsageTypes = {Memory})
48+
public class VaListInitializationNode extends FixedWithNextNode implements SingleMemoryKill, Lowerable {
49+
public static final NodeClass<VaListInitializationNode> TYPE = NodeClass.create(VaListInitializationNode.class);
50+
51+
@Node.Input
52+
protected ValueNode vaList;
53+
54+
public VaListInitializationNode(ValueNode vaList) {
55+
super(TYPE, StampFactory.forKind(JavaKind.Object));
56+
this.vaList = vaList;
57+
}
58+
59+
public ValueNode getVaList() {
60+
return vaList;
61+
}
62+
63+
@Override
64+
public void lower(LoweringTool tool) {
65+
if (tool.getLoweringStage() == LoweringTool.StandardLoweringStage.LOW_TIER) {
66+
tool.getLowerer().lower(this, tool);
67+
}
68+
}
69+
70+
@Override
71+
public LocationIdentity getKilledLocationIdentity() {
72+
return LocationIdentity.any();
73+
}
74+
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/nodes/VaListNextArgNode.java

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.graalvm.compiler.graph.NodeClass;
3333
import org.graalvm.compiler.nodeinfo.NodeInfo;
3434
import org.graalvm.compiler.nodes.FixedWithNextNode;
35-
import org.graalvm.compiler.nodes.ValueNode;
3635
import org.graalvm.compiler.nodes.memory.SingleMemoryKill;
3736
import org.graalvm.compiler.nodes.spi.Lowerable;
3837
import org.graalvm.compiler.nodes.spi.LoweringTool;
@@ -48,22 +47,9 @@
4847
public final class VaListNextArgNode extends FixedWithNextNode implements Lowerable, SingleMemoryKill {
4948
public static final NodeClass<VaListNextArgNode> TYPE = NodeClass.create(VaListNextArgNode.class);
5049

51-
@Input protected ValueNode vaList;
52-
private final int parameterIndex;
53-
54-
public VaListNextArgNode(JavaKind kind, ValueNode vaList, int parameterIndex) {
50+
public VaListNextArgNode(JavaKind kind) {
5551
super(TYPE, StampFactory.forKind(kind));
5652
assert kind.isPrimitive() && kind != JavaKind.Void;
57-
this.vaList = vaList;
58-
this.parameterIndex = parameterIndex;
59-
}
60-
61-
public ValueNode getVaList() {
62-
return vaList;
63-
}
64-
65-
public int getParameterIndex() {
66-
return parameterIndex;
6753
}
6854

6955
@Override
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright (c) 2022, 2022, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
package com.oracle.svm.core.graal.snippets;
26+
27+
import java.util.Map;
28+
29+
import org.graalvm.compiler.api.replacements.Snippet;
30+
import org.graalvm.compiler.graph.Node;
31+
import org.graalvm.compiler.nodes.spi.LoweringTool;
32+
import org.graalvm.compiler.options.OptionValues;
33+
import org.graalvm.compiler.phases.util.Providers;
34+
import org.graalvm.compiler.replacements.SnippetTemplate;
35+
import org.graalvm.compiler.replacements.SnippetTemplate.Arguments;
36+
import org.graalvm.compiler.replacements.SnippetTemplate.SnippetInfo;
37+
import org.graalvm.compiler.replacements.Snippets;
38+
import org.graalvm.word.Pointer;
39+
40+
import com.oracle.svm.core.FrameAccess;
41+
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
42+
import com.oracle.svm.core.feature.InternalFeature;
43+
import com.oracle.svm.core.graal.meta.RuntimeConfiguration;
44+
import com.oracle.svm.core.graal.nodes.VaListInitializationNode;
45+
import com.oracle.svm.core.graal.stackvalue.LoweredStackValueNode;
46+
import com.oracle.svm.core.graal.stackvalue.StackValueNode;
47+
48+
public final class VaListInitializationSnippets extends SubstrateTemplates implements Snippets {
49+
public static final StackValueNode.StackSlotIdentity vaListIdentity = new StackValueNode.StackSlotIdentity("VaListInitializationSnippets.vaListIdentity", true);
50+
51+
@Snippet
52+
private static void vaListInitialization(Pointer vaList) {
53+
Pointer vaListPointer = (Pointer) LoweredStackValueNode.loweredStackValue(FrameAccess.wordSize(), FrameAccess.wordSize(), vaListIdentity);
54+
vaListPointer.writeWord(0, vaList);
55+
}
56+
57+
@SuppressWarnings("unused")
58+
public static void registerLowerings(OptionValues options, Providers providers, Map<Class<? extends Node>, NodeLoweringProvider<?>> lowerings) {
59+
new VaListInitializationSnippets(options, providers, lowerings);
60+
}
61+
62+
VaListInitializationSnippets(OptionValues options, Providers providers, Map<Class<? extends Node>, NodeLoweringProvider<?>> lowerings) {
63+
super(options, providers);
64+
lowerings.put(VaListInitializationNode.class, new VaListSnippetsLowering());
65+
}
66+
67+
protected class VaListSnippetsLowering implements NodeLoweringProvider<VaListInitializationNode> {
68+
69+
private final SnippetInfo vaListInitialization = snippet(VaListInitializationSnippets.class, "vaListInitialization");
70+
71+
@Override
72+
public void lower(VaListInitializationNode node, LoweringTool tool) {
73+
Arguments args = new Arguments(vaListInitialization, node.graph().getGuardsStage(), tool.getLoweringStage());
74+
args.add("vaList", node.getVaList());
75+
template(node, args).instantiate(providers.getMetaAccess(), node, SnippetTemplate.DEFAULT_REPLACER, args);
76+
}
77+
}
78+
}
79+
80+
@AutomaticallyRegisteredFeature
81+
class VaListInitializationSnippetsFeature implements InternalFeature {
82+
83+
@Override
84+
@SuppressWarnings("unused")
85+
public void registerLowerings(RuntimeConfiguration runtimeConfig, OptionValues options, Providers providers,
86+
Map<Class<? extends Node>, NodeLoweringProvider<?>> lowerings, boolean hosted) {
87+
new VaListInitializationSnippets(options, providers, lowerings);
88+
}
89+
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/aarch64/PosixAArch64VaListSnippets.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@
3737
import org.graalvm.compiler.replacements.Snippets;
3838
import org.graalvm.word.Pointer;
3939

40+
import com.oracle.svm.core.FrameAccess;
4041
import com.oracle.svm.core.graal.nodes.VaListNextArgNode;
4142
import com.oracle.svm.core.graal.snippets.NodeLoweringProvider;
4243
import com.oracle.svm.core.graal.snippets.SubstrateTemplates;
44+
import com.oracle.svm.core.graal.snippets.VaListInitializationSnippets;
45+
import com.oracle.svm.core.graal.stackvalue.LoweredStackValueNode;
4346
import com.oracle.svm.core.util.VMError;
4447

4548
/**
@@ -104,7 +107,9 @@ private PosixAArch64VaListSnippets(OptionValues options, Providers providers) {
104107
}
105108

106109
@Snippet(allowMissingProbabilities = true)
107-
protected static double vaArgDoubleSnippet(Pointer vaList) {
110+
protected static double vaArgDoubleSnippet() {
111+
Pointer vaListPointer = (Pointer) LoweredStackValueNode.loweredStackValue(FrameAccess.wordSize(), FrameAccess.wordSize(), VaListInitializationSnippets.vaListIdentity);
112+
Pointer vaList = vaListPointer.readWord(0);
108113
int fpOffset = vaList.readInt(FP_OFFSET_LOCATION);
109114
if (fpOffset < MAX_FP_OFFSET) {
110115
Pointer regSaveArea = vaList.readWord(FP_TOP_LOCATION);
@@ -120,13 +125,15 @@ protected static double vaArgDoubleSnippet(Pointer vaList) {
120125
}
121126

122127
@Snippet
123-
protected static float vaArgFloatSnippet(Pointer vaList) {
128+
protected static float vaArgFloatSnippet() {
124129
// float is always promoted to double when passed in varargs
125-
return (float) vaArgDoubleSnippet(vaList);
130+
return (float) vaArgDoubleSnippet();
126131
}
127132

128133
@Snippet(allowMissingProbabilities = true)
129-
protected static long vaArgLongSnippet(Pointer vaList) {
134+
protected static long vaArgLongSnippet() {
135+
Pointer vaListPointer = (Pointer) LoweredStackValueNode.loweredStackValue(FrameAccess.wordSize(), FrameAccess.wordSize(), VaListInitializationSnippets.vaListIdentity);
136+
Pointer vaList = vaListPointer.readWord(0);
130137
int gpOffset = vaList.readInt(GP_OFFSET_LOCATION);
131138
if (gpOffset < MAX_GP_OFFSET) {
132139
Pointer regSaveArea = vaList.readWord(GP_TOP_LOCATION);
@@ -142,8 +149,8 @@ protected static long vaArgLongSnippet(Pointer vaList) {
142149
}
143150

144151
@Snippet
145-
protected static int vaArgIntSnippet(Pointer vaList) {
146-
return (int) vaArgLongSnippet(vaList);
152+
protected static int vaArgIntSnippet() {
153+
return (int) vaArgLongSnippet();
147154
}
148155

149156
@SuppressWarnings("unused")
@@ -185,7 +192,6 @@ public void lower(VaListNextArgNode node, LoweringTool tool) {
185192
throw VMError.shouldNotReachHere();
186193
}
187194
Arguments args = new Arguments(snippet, node.graph().getGuardsStage(), tool.getLoweringStage());
188-
args.add("vaList", node.getVaList());
189195
template(node, args).instantiate(providers.getMetaAccess(), node, SnippetTemplate.DEFAULT_REPLACER, args);
190196
}
191197
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/amd64/PosixAMD64VaListSnippets.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@
3737
import org.graalvm.compiler.replacements.Snippets;
3838
import org.graalvm.word.Pointer;
3939

40+
import com.oracle.svm.core.FrameAccess;
4041
import com.oracle.svm.core.graal.nodes.VaListNextArgNode;
4142
import com.oracle.svm.core.graal.snippets.NodeLoweringProvider;
4243
import com.oracle.svm.core.graal.snippets.SubstrateTemplates;
44+
import com.oracle.svm.core.graal.snippets.VaListInitializationSnippets;
45+
import com.oracle.svm.core.graal.stackvalue.LoweredStackValueNode;
4346
import com.oracle.svm.core.util.VMError;
4447

4548
/**
@@ -107,7 +110,9 @@ private PosixAMD64VaListSnippets(OptionValues options, Providers providers) {
107110
}
108111

109112
@Snippet(allowMissingProbabilities = true)
110-
protected static double vaArgDoubleSnippet(Pointer vaList) {
113+
protected static double vaArgDoubleSnippet() {
114+
Pointer vaListPointer = (Pointer) LoweredStackValueNode.loweredStackValue(FrameAccess.wordSize(), FrameAccess.wordSize(), VaListInitializationSnippets.vaListIdentity);
115+
Pointer vaList = vaListPointer.readWord(0);
111116
int fpOffset = vaList.readInt(FP_OFFSET_LOCATION);
112117
if (fpOffset < MAX_FP_OFFSET) {
113118
Pointer regSaveArea = vaList.readWord(REG_SAVE_AREA_LOCATION);
@@ -123,13 +128,15 @@ protected static double vaArgDoubleSnippet(Pointer vaList) {
123128
}
124129

125130
@Snippet
126-
protected static float vaArgFloatSnippet(Pointer vaList) {
131+
protected static float vaArgFloatSnippet() {
127132
// float is always promoted to double when passed in varargs
128-
return (float) vaArgDoubleSnippet(vaList);
133+
return (float) vaArgDoubleSnippet();
129134
}
130135

131136
@Snippet(allowMissingProbabilities = true)
132-
protected static long vaArgLongSnippet(Pointer vaList) {
137+
protected static long vaArgLongSnippet() {
138+
Pointer vaListPointer = (Pointer) LoweredStackValueNode.loweredStackValue(FrameAccess.wordSize(), FrameAccess.wordSize(), VaListInitializationSnippets.vaListIdentity);
139+
Pointer vaList = vaListPointer.readWord(0);
133140
int gpOffset = vaList.readInt(GP_OFFSET_LOCATION);
134141
if (gpOffset < MAX_GP_OFFSET) {
135142
Pointer regSaveArea = vaList.readWord(REG_SAVE_AREA_LOCATION);
@@ -145,8 +152,8 @@ protected static long vaArgLongSnippet(Pointer vaList) {
145152
}
146153

147154
@Snippet
148-
protected static int vaArgIntSnippet(Pointer vaList) {
149-
return (int) vaArgLongSnippet(vaList);
155+
protected static int vaArgIntSnippet() {
156+
return (int) vaArgLongSnippet();
150157
}
151158

152159
@SuppressWarnings("unused")
@@ -188,7 +195,6 @@ public void lower(VaListNextArgNode node, LoweringTool tool) {
188195
throw VMError.shouldNotReachHere();
189196
}
190197
Arguments args = new Arguments(snippet, node.graph().getGuardsStage(), tool.getLoweringStage());
191-
args.add("vaList", node.getVaList());
192198
template(node, args).instantiate(providers.getMetaAccess(), node, SnippetTemplate.DEFAULT_REPLACER, args);
193199
}
194200
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/riscv64/PosixRISCV64VaListSnippets.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@
3737
import org.graalvm.compiler.replacements.Snippets;
3838
import org.graalvm.word.Pointer;
3939

40+
import com.oracle.svm.core.FrameAccess;
4041
import com.oracle.svm.core.graal.nodes.VaListNextArgNode;
4142
import com.oracle.svm.core.graal.snippets.NodeLoweringProvider;
4243
import com.oracle.svm.core.graal.snippets.SubstrateTemplates;
44+
import com.oracle.svm.core.graal.snippets.VaListInitializationSnippets;
45+
import com.oracle.svm.core.graal.stackvalue.LoweredStackValueNode;
4346
import com.oracle.svm.core.util.VMError;
4447

4548
/**
@@ -68,24 +71,30 @@ private PosixRISCV64VaListSnippets(OptionValues options, Providers providers) {
6871
}
6972

7073
@Snippet
71-
protected static double vaArgDoubleSnippet(Pointer vaList, int offset) {
72-
return vaList.readDouble(offset);
74+
protected static double vaArgDoubleSnippet() {
75+
Pointer vaListPointer = (Pointer) LoweredStackValueNode.loweredStackValue(FrameAccess.wordSize(), FrameAccess.wordSize(), VaListInitializationSnippets.vaListIdentity);
76+
Pointer vaList = vaListPointer.readWord(0);
77+
vaListPointer.writeWord(0, vaList.add(8));
78+
return vaList.readDouble(0);
7379
}
7480

7581
@Snippet
76-
protected static float vaArgFloatSnippet(Pointer vaList, int offset) {
82+
protected static float vaArgFloatSnippet() {
7783
// float is always promoted to double when passed in varargs
78-
return (float) vaArgDoubleSnippet(vaList, offset);
84+
return (float) vaArgDoubleSnippet();
7985
}
8086

8187
@Snippet
82-
protected static long vaArgLongSnippet(Pointer vaList, int offset) {
83-
return vaList.readLong(offset);
88+
protected static long vaArgLongSnippet() {
89+
Pointer vaListPointer = (Pointer) LoweredStackValueNode.loweredStackValue(FrameAccess.wordSize(), FrameAccess.wordSize(), VaListInitializationSnippets.vaListIdentity);
90+
Pointer vaList = vaListPointer.readWord(0);
91+
vaListPointer.writeWord(0, vaList.add(8));
92+
return vaList.readLong(0);
8493
}
8594

8695
@Snippet
87-
protected static int vaArgIntSnippet(Pointer vaList, int offset) {
88-
return (int) vaArgLongSnippet(vaList, offset);
96+
protected static int vaArgIntSnippet() {
97+
return (int) vaArgLongSnippet();
8998
}
9099

91100
@SuppressWarnings("unused")
@@ -127,8 +136,6 @@ public void lower(VaListNextArgNode node, LoweringTool tool) {
127136
throw VMError.shouldNotReachHere();
128137
}
129138
Arguments args = new Arguments(snippet, node.graph().getGuardsStage(), tool.getLoweringStage());
130-
args.add("vaList", node.getVaList());
131-
args.add("offset", node.getParameterIndex() * 8);
132139
template(node, args).instantiate(providers.getMetaAccess(), node, SnippetTemplate.DEFAULT_REPLACER, args);
133140
}
134141
}

0 commit comments

Comments
 (0)