Skip to content

Commit 5e4607d

Browse files
Select exactly the right method for interpreter methods
When compiling with ECJ there are other methods in those classes.
1 parent aa79ad0 commit 5e4607d

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/InterpreterFeature.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@
4343
import org.graalvm.word.Pointer;
4444
import org.graalvm.word.WordBase;
4545

46+
import com.oracle.graal.pointsto.meta.AnalysisMetaAccess;
4647
import com.oracle.graal.pointsto.meta.AnalysisMethod;
48+
import com.oracle.graal.pointsto.meta.AnalysisType;
4749
import com.oracle.svm.core.InvalidMethodPointerHandler;
4850
import com.oracle.svm.core.ParsingReason;
4951
import com.oracle.svm.core.Uninterruptible;
@@ -54,10 +56,13 @@
5456
import com.oracle.svm.core.interpreter.InterpreterSupport;
5557
import com.oracle.svm.core.meta.MethodPointer;
5658
import com.oracle.svm.core.util.VMError;
59+
import com.oracle.svm.espresso.shared.meta.SignaturePolymorphicIntrinsic;
5760
import com.oracle.svm.hosted.FeatureImpl;
5861
import com.oracle.svm.hosted.code.SubstrateCompilationDirectives;
5962
import com.oracle.svm.hosted.meta.HostedMethod;
6063
import com.oracle.svm.interpreter.debug.DebuggerEventsFeature;
64+
import com.oracle.svm.interpreter.metadata.InterpreterResolvedJavaMethod;
65+
import com.oracle.svm.util.JVMCIReflectionUtil;
6166
import com.oracle.svm.util.ReflectionUtil;
6267

6368
import jdk.graal.compiler.api.replacements.Fold;
@@ -198,15 +203,21 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
198203
FeatureImpl.BeforeAnalysisAccessImpl accessImpl = (FeatureImpl.BeforeAnalysisAccessImpl) access;
199204

200205
BuildTimeInterpreterUniverse.freshSingletonInstance();
201-
AnalysisMethod interpreterRoot = accessImpl.getMetaAccess().lookupJavaType(Interpreter.Root.class).getDeclaredMethods(false)[0];
206+
AnalysisMetaAccess metaAccess = accessImpl.getMetaAccess();
207+
208+
AnalysisType interpreterRootType = metaAccess.lookupJavaType(Interpreter.Root.class);
209+
AnalysisMethod interpreterRoot = (AnalysisMethod) JVMCIReflectionUtil.getDeclaredMethod(metaAccess, interpreterRootType, "executeBodyFromBCI",
210+
InterpreterFrame.class, InterpreterResolvedJavaMethod.class, int.class, int.class, boolean.class);
202211

203212
LocalVariableTable interpreterVariableTable = interpreterRoot.getLocalVariableTable();
204213
int interpreterMethodSlot = findLocalSlotByName("method", interpreterVariableTable.getLocalsAt(0)); // parameter
205214
int interpreterFrameSlot = findLocalSlotByName("frame", interpreterVariableTable.getLocalsAt(0)); // parameter
206215
// Local variable, search all locals.
207216
int bciSlot = findLocalSlotByName("curBCI", interpreterVariableTable.getLocals());
208217

209-
AnalysisMethod intrinsicRoot = accessImpl.getMetaAccess().lookupJavaType(Interpreter.IntrinsicRoot.class).getDeclaredMethods(false)[0];
218+
AnalysisType intrinsicRootType = metaAccess.lookupJavaType(Interpreter.IntrinsicRoot.class);
219+
AnalysisMethod intrinsicRoot = (AnalysisMethod) JVMCIReflectionUtil.getDeclaredMethod(metaAccess, intrinsicRootType, "execute",
220+
InterpreterFrame.class, InterpreterResolvedJavaMethod.class, SignaturePolymorphicIntrinsic.class, boolean.class);
210221

211222
LocalVariableTable intrinsicVariableTable = intrinsicRoot.getLocalVariableTable();
212223
int intrinsicMethodSlot = findLocalSlotByName("method", intrinsicVariableTable.getLocalsAt(0)); // parameter
@@ -222,7 +233,7 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
222233
SubstrateCompilationDirectives.singleton().registerFrameInformationRequired(intrinsicRoot);
223234

224235
Method leaveMethod = ReflectionUtil.lookupMethod(InterpreterStubSection.class, "leaveInterpreterStub", CFunctionPointer.class, Pointer.class, long.class, long.class);
225-
leaveStub = accessImpl.getMetaAccess().lookupJavaMethod(leaveMethod);
236+
leaveStub = metaAccess.lookupJavaMethod(leaveMethod);
226237
accessImpl.registerAsRoot(leaveStub, true, "low level entry point");
227238
}
228239

0 commit comments

Comments
 (0)