Skip to content

Commit 505b9c6

Browse files
committed
[GR-39555] [GR-29486] [GR-40730] [GR-28111] [GR-40837] Use static slots to access the frame in Espresso.
PullRequest: graal/12174
2 parents 6c638a3 + 39daf4a commit 505b9c6

File tree

57 files changed

+1000
-744
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1000
-744
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/EspressoScope.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import com.oracle.truffle.espresso.descriptors.Types;
4747
import com.oracle.truffle.espresso.meta.EspressoError;
4848
import com.oracle.truffle.espresso.meta.JavaKind;
49-
import com.oracle.truffle.espresso.nodes.BytecodeNode;
49+
import com.oracle.truffle.espresso.nodes.EspressoFrame;
5050
import com.oracle.truffle.espresso.runtime.StaticObject;
5151

5252
public final class EspressoScope {
@@ -145,15 +145,15 @@ Object readMember(String member) throws UnknownIdentifierException {
145145

146146
// @formatter:off
147147
switch (slotInfo.getKind()) {
148-
case Boolean: return BytecodeNode.getLocalInt(frame, slotInfo.getSlot()) != 0;
149-
case Byte: return (byte) BytecodeNode.getLocalInt(frame, slotInfo.getSlot());
150-
case Short: return (short) BytecodeNode.getLocalInt(frame, slotInfo.getSlot());
151-
case Char: return (char) BytecodeNode.getLocalInt(frame, slotInfo.getSlot());
152-
case Int: return BytecodeNode.getLocalInt(frame, slotInfo.getSlot());
153-
case Float: return BytecodeNode.getLocalFloat(frame, slotInfo.getSlot());
154-
case Long: return BytecodeNode.getLocalLong(frame, slotInfo.getSlot());
155-
case Double: return BytecodeNode.getLocalDouble(frame, slotInfo.getSlot());
156-
case Object: return BytecodeNode.getLocalObject(frame, slotInfo.getSlot());
148+
case Boolean: return EspressoFrame.getLocalInt(frame, slotInfo.getSlot()) != 0;
149+
case Byte: return (byte) EspressoFrame.getLocalInt(frame, slotInfo.getSlot());
150+
case Short: return (short) EspressoFrame.getLocalInt(frame, slotInfo.getSlot());
151+
case Char: return (char) EspressoFrame.getLocalInt(frame, slotInfo.getSlot());
152+
case Int: return EspressoFrame.getLocalInt(frame, slotInfo.getSlot());
153+
case Float: return EspressoFrame.getLocalFloat(frame, slotInfo.getSlot());
154+
case Long: return EspressoFrame.getLocalLong(frame, slotInfo.getSlot());
155+
case Double: return EspressoFrame.getLocalDouble(frame, slotInfo.getSlot());
156+
case Object: return EspressoFrame.getLocalObject(frame, slotInfo.getSlot());
157157
default:
158158
CompilerAsserts.neverPartOfCompilation();
159159
throw EspressoError.shouldNotReachHere();
@@ -196,15 +196,15 @@ void writeMember(String member, Object value, @CachedLibrary("value") InteropLib
196196

197197
// @formatter:off
198198
switch (slotInfo.getKind()) {
199-
case Boolean: BytecodeNode.setLocalInt(frame, slotInfo.getSlot(), interop.asBoolean(value) ? 1 : 0); break;
200-
case Byte: BytecodeNode.setLocalInt(frame, slotInfo.getSlot(), interop.asByte(value)); break;
201-
case Short: BytecodeNode.setLocalInt(frame, slotInfo.getSlot(), interop.asShort(value)); break;
202-
case Char: BytecodeNode.setLocalInt(frame, slotInfo.getSlot(), interop.asString(value).charAt(0)); break;
203-
case Int: BytecodeNode.setLocalInt(frame, slotInfo.getSlot(), interop.asInt(value)); break;
204-
case Float: BytecodeNode.setLocalFloat(frame, slotInfo.getSlot(), interop.asFloat(value)); break;
205-
case Long: BytecodeNode.setLocalLong(frame, slotInfo.getSlot(), interop.asLong(value)); break;
206-
case Double: BytecodeNode.setLocalDouble(frame, slotInfo.getSlot(), interop.asDouble(value)); break;
207-
case Object: BytecodeNode.setLocalObject(frame, slotInfo.getSlot(), (StaticObject) value); break;
199+
case Boolean: EspressoFrame.setLocalInt(frame, slotInfo.getSlot(), interop.asBoolean(value) ? 1 : 0); break;
200+
case Byte: EspressoFrame.setLocalInt(frame, slotInfo.getSlot(), interop.asByte(value)); break;
201+
case Short: EspressoFrame.setLocalInt(frame, slotInfo.getSlot(), interop.asShort(value)); break;
202+
case Char: EspressoFrame.setLocalInt(frame, slotInfo.getSlot(), interop.asString(value).charAt(0)); break;
203+
case Int: EspressoFrame.setLocalInt(frame, slotInfo.getSlot(), interop.asInt(value)); break;
204+
case Float: EspressoFrame.setLocalFloat(frame, slotInfo.getSlot(), interop.asFloat(value)); break;
205+
case Long: EspressoFrame.setLocalLong(frame, slotInfo.getSlot(), interop.asLong(value)); break;
206+
case Double: EspressoFrame.setLocalDouble(frame, slotInfo.getSlot(), interop.asDouble(value)); break;
207+
case Object: EspressoFrame.setLocalObject(frame, slotInfo.getSlot(), (StaticObject) value); break;
208208
default:
209209
CompilerAsserts.neverPartOfCompilation();
210210
throw EspressoError.shouldNotReachHere();

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/analysis/liveness/actions/MultiAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import com.oracle.truffle.api.frame.VirtualFrame;
3030
import com.oracle.truffle.api.nodes.ExplodeLoop;
3131
import com.oracle.truffle.espresso.analysis.liveness.LocalVariableAction;
32-
import com.oracle.truffle.espresso.nodes.BytecodeNode;
32+
import com.oracle.truffle.espresso.nodes.EspressoFrame;
3333

3434
public final class MultiAction extends LocalVariableAction {
3535
@CompilationFinal(dimensions = 1) private final int[] actions;
@@ -42,7 +42,7 @@ public MultiAction(int[] actions) {
4242
@ExplodeLoop
4343
public void execute(VirtualFrame frame) {
4444
for (int local : actions) {
45-
BytecodeNode.freeLocal(frame, local);
45+
EspressoFrame.clearLocal(frame, local);
4646
}
4747
}
4848

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/analysis/liveness/actions/NullOutAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
import com.oracle.truffle.api.frame.VirtualFrame;
2727
import com.oracle.truffle.espresso.analysis.liveness.LocalVariableAction;
28-
import com.oracle.truffle.espresso.nodes.BytecodeNode;
28+
import com.oracle.truffle.espresso.nodes.EspressoFrame;
2929

3030
public final class NullOutAction extends LocalVariableAction {
3131
private static final int MAX_CACHE = 256;
@@ -57,7 +57,7 @@ private NullOutAction(int local) {
5757

5858
@Override
5959
public void execute(VirtualFrame frame) {
60-
BytecodeNode.freeLocal(frame, local);
60+
EspressoFrame.clearLocal(frame, local);
6161
}
6262

6363
@Override

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/classfile/constantpool/DynamicConstant.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.oracle.truffle.espresso.meta.EspressoError;
3939
import com.oracle.truffle.espresso.meta.Meta;
4040
import com.oracle.truffle.espresso.nodes.BytecodeNode;
41+
import com.oracle.truffle.espresso.nodes.EspressoFrame;
4142
import com.oracle.truffle.espresso.nodes.methodhandle.MHLinkToNode;
4243
import com.oracle.truffle.espresso.runtime.EspressoException;
4344
import com.oracle.truffle.espresso.runtime.StaticObject;
@@ -181,7 +182,7 @@ public ResolvedObject(StaticObject resolved) {
181182

182183
@Override
183184
public void putResolved(VirtualFrame frame, int top, BytecodeNode node) {
184-
BytecodeNode.putObject(frame, top, resolved);
185+
EspressoFrame.putObject(frame, top, resolved);
185186
}
186187

187188
@Override
@@ -204,7 +205,7 @@ public ResolvedInt(int resolved) {
204205

205206
@Override
206207
public void putResolved(VirtualFrame frame, int top, BytecodeNode node) {
207-
BytecodeNode.putInt(frame, top, resolved);
208+
EspressoFrame.putInt(frame, top, resolved);
208209
}
209210

210211
@Override
@@ -227,7 +228,7 @@ public ResolvedLong(long resolved) {
227228

228229
@Override
229230
public void putResolved(VirtualFrame frame, int top, BytecodeNode node) {
230-
BytecodeNode.putLong(frame, top, resolved);
231+
EspressoFrame.putLong(frame, top, resolved);
231232
}
232233

233234
@Override
@@ -250,7 +251,7 @@ public ResolvedDouble(double resolved) {
250251

251252
@Override
252253
public void putResolved(VirtualFrame frame, int top, BytecodeNode node) {
253-
BytecodeNode.putDouble(frame, top, resolved);
254+
EspressoFrame.putDouble(frame, top, resolved);
254255
}
255256

256257
@Override
@@ -273,7 +274,7 @@ public ResolvedFloat(float resolved) {
273274

274275
@Override
275276
public void putResolved(VirtualFrame frame, int top, BytecodeNode node) {
276-
BytecodeNode.putFloat(frame, top, resolved);
277+
EspressoFrame.putFloat(frame, top, resolved);
277278
}
278279

279280
@Override

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/descriptors/Types.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,4 +390,19 @@ public static ByteSequence getRuntimePackage(ByteSequence symbol) {
390390
}
391391
return symbol.subSequence(1, lastSlash - 1);
392392
}
393+
394+
/**
395+
* Returns the number of stack slots used by the specified type.
396+
*/
397+
public static int slotCount(Symbol<Type> type) {
398+
switch (type.byteAt(0)) {
399+
case 'V': // void
400+
return 0;
401+
case 'D': // double
402+
case 'J': // long
403+
return 2;
404+
default: // ZBCSIF[L
405+
return 1;
406+
}
407+
}
393408
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/Method.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@
9090
import com.oracle.truffle.espresso.meta.Meta;
9191
import com.oracle.truffle.espresso.meta.MetaUtil;
9292
import com.oracle.truffle.espresso.meta.ModifiersProvider;
93-
import com.oracle.truffle.espresso.nodes.BytecodeNode;
9493
import com.oracle.truffle.espresso.nodes.EspressoRootNode;
95-
import com.oracle.truffle.espresso.nodes.NativeMethodNode;
9694
import com.oracle.truffle.espresso.nodes.interop.AbstractLookupNode;
9795
import com.oracle.truffle.espresso.nodes.methodhandle.MethodHandleIntrinsicNode;
9896
import com.oracle.truffle.espresso.runtime.Attribute;
@@ -342,7 +340,7 @@ private CallTarget lookupLibJavaCallTarget() {
342340
// Look in libjava
343341
TruffleObject nativeMethod = lookupAndBind(getVM().getJavaLibrary(), mangledName);
344342
if (nativeMethod != null) {
345-
return EspressoRootNode.create(null, new NativeMethodNode(nativeMethod, getMethodVersion())).getCallTarget();
343+
return EspressoRootNode.createNative(getMethodVersion(), nativeMethod).getCallTarget();
346344
}
347345
}
348346
}
@@ -355,7 +353,7 @@ private CallTarget lookupAgents() {
355353
String mangledName = Mangle.mangleMethod(this, withSignature);
356354
TruffleObject nativeMethod = getContext().bindToAgent(this, mangledName);
357355
if (nativeMethod != null) {
358-
return EspressoRootNode.create(null, new NativeMethodNode(nativeMethod, getMethodVersion())).getCallTarget();
356+
return EspressoRootNode.createNative(getMethodVersion(), nativeMethod).getCallTarget();
359357
}
360358
}
361359
return null;
@@ -381,7 +379,7 @@ private CallTarget lookupJniCallTarget(Method findNative, boolean fullSignature)
381379
}
382380
TruffleObject symbol = getVM().getFunction(handle);
383381
TruffleObject nativeMethod = bind(symbol);
384-
return EspressoRootNode.create(null, new NativeMethodNode(nativeMethod, this.getMethodVersion())).getCallTarget();
382+
return EspressoRootNode.createNative(this.getMethodVersion(), nativeMethod).getCallTarget();
385383
}
386384

387385
public boolean isConstructor() {
@@ -794,8 +792,7 @@ public MethodHandleIntrinsicNode spawnIntrinsicNode(EspressoLanguage language, M
794792

795793
public Method forceSplit() {
796794
Method result = new Method(this, getCodeAttribute());
797-
BytecodeNode bytecodeNode = new BytecodeNode(result.getMethodVersion());
798-
EspressoRootNode root = EspressoRootNode.create(bytecodeNode.getFrameDescriptor(), bytecodeNode);
795+
EspressoRootNode root = EspressoRootNode.createForBytecodes(result.getMethodVersion());
799796
result.getMethodVersion().callTarget = root.getCallTarget();
800797
return result;
801798
}
@@ -1275,8 +1272,7 @@ private CallTarget findCallTarget() {
12751272
throw meta.throwExceptionWithMessage(meta.java_lang_AbstractMethodError,
12761273
"Calling abstract method: " + getMethod().getDeclaringKlass().getType() + "." + getName() + " -> " + getRawSignature());
12771274
}
1278-
BytecodeNode bytecodeNode = new BytecodeNode(this);
1279-
EspressoRootNode rootNode = EspressoRootNode.create(bytecodeNode.getFrameDescriptor(), bytecodeNode);
1275+
EspressoRootNode rootNode = EspressoRootNode.createForBytecodes(this);
12801276
target = rootNode.getCallTarget();
12811277
}
12821278
return target;

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/jni/JniEnv.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,7 @@
6767
import com.oracle.truffle.espresso.meta.EspressoError;
6868
import com.oracle.truffle.espresso.meta.JavaKind;
6969
import com.oracle.truffle.espresso.meta.Meta;
70-
import com.oracle.truffle.espresso.nodes.EspressoMethodNode;
7170
import com.oracle.truffle.espresso.nodes.EspressoRootNode;
72-
import com.oracle.truffle.espresso.nodes.IntrinsifiedNativeMethodNode;
73-
import com.oracle.truffle.espresso.nodes.NativeMethodNode;
7471
import com.oracle.truffle.espresso.runtime.EspressoContext;
7572
import com.oracle.truffle.espresso.runtime.EspressoException;
7673
import com.oracle.truffle.espresso.runtime.EspressoProperties;
@@ -2078,7 +2075,7 @@ public int RegisterNative(@JavaType(Class.class) StaticObject clazz, @Pointer Tr
20782075
if (factory == null) {
20792076
NativeSignature ns = Method.buildJniNativeSignature(targetMethod.getParsedSignature());
20802077
final TruffleObject boundNative = getNativeAccess().bindSymbol(closure, ns);
2081-
factory = createJniRootNodeFactory(() -> new NativeMethodNode(boundNative, targetMethod.getMethodVersion()), targetMethod);
2078+
factory = createJniRootNodeFactory(() -> EspressoRootNode.createNative(targetMethod.getMethodVersion(), boundNative), targetMethod);
20822079
}
20832080

20842081
Symbol<Type> classType = clazz.getMirrorKlass(getMeta()).getType();
@@ -2091,29 +2088,29 @@ private Substitutions.EspressoRootNodeFactory lookupKnownVmMethods(@Pointer Truf
20912088
long jvmMethodAddress = InteropLibrary.getUncached().asPointer(closure);
20922089
CallableFromNative.Factory knownVmMethod = getVM().lookupKnownVmMethod(jvmMethodAddress);
20932090
if (knownVmMethod != null) {
2094-
if (!IntrinsifiedNativeMethodNode.validParameterCount(knownVmMethod, targetMethod)) {
2091+
if (!CallableFromNative.validParameterCount(knownVmMethod, targetMethod.getMethodVersion())) {
20952092
getLogger().warning("Implicit intrinsification of VM method does not have matching parameter counts:");
20962093
getLogger().warning("VM method " + knownVmMethod.methodName() + " has " + knownVmMethod.parameterCount() + " parameters,");
20972094
getLogger().warning(
20982095
"Bound to " + (targetMethod.isStatic() ? "static" : "instance") + " method " + targetMethod.getNameAsString() + " which has " + targetMethod.getParameterCount() +
20992096
" parameters");
21002097
return null;
21012098
}
2102-
return createJniRootNodeFactory(() -> new IntrinsifiedNativeMethodNode(knownVmMethod, targetMethod, getVM()), targetMethod);
2099+
return createJniRootNodeFactory(() -> EspressoRootNode.createIntrinsifiedNative(targetMethod.getMethodVersion(), knownVmMethod, getVM()), targetMethod);
21032100
}
21042101
} catch (UnsupportedMessageException e) {
21052102
// ignore
21062103
}
21072104
return null;
21082105
}
21092106

2110-
private static Substitutions.EspressoRootNodeFactory createJniRootNodeFactory(Supplier<EspressoMethodNode> methodNodeSupplier, Method targetMethod) {
2107+
private static Substitutions.EspressoRootNodeFactory createJniRootNodeFactory(Supplier<EspressoRootNode> methodRootNodeSupplier, Method targetMethod) {
21112108
return new Substitutions.EspressoRootNodeFactory() {
21122109
@Override
21132110
public EspressoRootNode createNodeIfValid(Method methodToSubstitute, boolean forceValid) {
21142111
if (forceValid || methodToSubstitute == targetMethod) {
21152112
// Runtime substitutions apply only to the given method.
2116-
return EspressoRootNode.create(null, methodNodeSupplier.get());
2113+
return methodRootNodeSupplier.get();
21172114
}
21182115

21192116
Substitutions.getLogger().warning(new Supplier<String>() {

0 commit comments

Comments
 (0)