package com.oracle.svm.hosted.thread;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
import org.graalvm.compiler.debug.DebugHandlersFactory;
import org.graalvm.compiler.graph.Node;
import org.graalvm.compiler.options.OptionValues;
import org.graalvm.compiler.phases.util.Providers;
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.hosted.Feature;
import com.oracle.svm.core.SubstrateOptions;
import com.oracle.svm.core.annotate.AutomaticFeature;
import com.oracle.svm.core.graal.GraalFeature;
import com.oracle.svm.core.graal.meta.RuntimeConfiguration;
import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider;
import com.oracle.svm.core.graal.snippets.CEntryPointSnippets;
import com.oracle.svm.core.graal.snippets.NodeLoweringProvider;
@AutomaticFeature
public class CEntryPointFeature implements GraalFeature {
private int vmThreadSize = -1;
@Override
public List<Class<? extends Feature>> getRequiredFeatures() {
if (SubstrateOptions.MultiThreaded.getValue()) {
return Arrays.asList(VMThreadMTFeature.class);
}
return Collections.emptyList();
}
@Override
public void beforeCompilation(BeforeCompilationAccess config) {
if (SubstrateOptions.MultiThreaded.getValue()) {
VMThreadMTFeature threadFeature = ImageSingletons.lookup(VMThreadMTFeature.class);
vmThreadSize = threadFeature.getVMThreadSize();
}
}
@Override
public void registerLowerings(RuntimeConfiguration runtimeConfig, OptionValues options, Iterable<DebugHandlersFactory> factories, Providers providers,
SnippetReflectionProvider snippetReflection, Map<Class<? extends Node>, NodeLoweringProvider<?>> lowerings, boolean hosted) {
CEntryPointSnippets.registerLowerings(options, factories, providers, snippetReflection, vmThreadSize, lowerings);
}
@Override
public void registerForeignCalls(RuntimeConfiguration runtimeConfig, Providers providers, SnippetReflectionProvider snippetReflection, SubstrateForeignCallsProvider foreignCalls, boolean hosted) {
CEntryPointSnippets.registerForeignCalls(providers, foreignCalls);
}
}