--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProviderImpl.java 2017-03-20 17:38:40.000000000 -0700 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProviderImpl.java 2017-03-20 17:38:40.000000000 -0700 @@ -22,13 +22,13 @@ */ package org.graalvm.compiler.hotspot.meta; -import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.PRESERVES_REGISTERS; -import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.SAFEPOINT; import static jdk.vm.ci.hotspot.HotSpotCallingConventionType.JavaCall; import static jdk.vm.ci.hotspot.HotSpotCallingConventionType.JavaCallee; +import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.PRESERVES_REGISTERS; +import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.SAFEPOINT; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.graalvm.compiler.core.common.LIRKind; import org.graalvm.compiler.core.common.LocationIdentity; @@ -40,8 +40,10 @@ import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; import org.graalvm.compiler.hotspot.stubs.ForeignCallStub; import org.graalvm.compiler.hotspot.stubs.Stub; +import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.word.Word; import org.graalvm.compiler.word.WordTypes; +import org.graalvm.util.EconomicMap; import jdk.vm.ci.code.CallingConvention; import jdk.vm.ci.code.CodeCacheProvider; @@ -64,7 +66,7 @@ protected final HotSpotJVMCIRuntimeProvider jvmciRuntime; protected final HotSpotGraalRuntimeProvider runtime; - protected final Map foreignCalls = new HashMap<>(); + protected final EconomicMap foreignCalls = EconomicMap.create(); protected final MetaAccessProvider metaAccess; protected final CodeCacheProvider codeCache; protected final WordTypes wordTypes; @@ -144,9 +146,9 @@ * cannot be re-executed. * @param killedLocations the memory locations killed by the foreign call */ - public void linkForeignCall(HotSpotProviders providers, ForeignCallDescriptor descriptor, long address, boolean prependThread, Transition transition, boolean reexecutable, - LocationIdentity... killedLocations) { - ForeignCallStub stub = new ForeignCallStub(jvmciRuntime, providers, address, descriptor, prependThread, transition, reexecutable, killedLocations); + public void linkForeignCall(OptionValues options, HotSpotProviders providers, ForeignCallDescriptor descriptor, long address, boolean prependThread, Transition transition, + boolean reexecutable, LocationIdentity... killedLocations) { + ForeignCallStub stub = new ForeignCallStub(options, jvmciRuntime, providers, address, descriptor, prependThread, transition, reexecutable, killedLocations); HotSpotForeignCallLinkage linkage = stub.getLinkage(); HotSpotForeignCallLinkage targetLinkage = stub.getTargetLinkage(); linkage.setCompiledStub(stub); @@ -198,4 +200,17 @@ public LIRKind getValueKind(JavaKind javaKind) { return LIRKind.fromJavaKind(codeCache.getTarget().arch, javaKind); } + + @Override + public List getStubs() { + List stubs = new ArrayList<>(); + for (HotSpotForeignCallLinkage linkage : foreignCalls.getValues()) { + if (linkage.isCompiledStub()) { + Stub stub = linkage.getStub(); + assert stub != null; + stubs.add(stub); + } + } + return stubs; + } }