Search in sources :

Example 1 with ForeignCallsProvider

use of org.graalvm.compiler.core.common.spi.ForeignCallsProvider in project graal by oracle.

the class ForeignCallDeoptimizeTest method registerInvocationPlugins.

@Override
protected void registerInvocationPlugins(InvocationPlugins invocationPlugins) {
    ForeignCallsProvider foreignCalls = ((HotSpotProviders) getProviders()).getForeignCalls();
    invocationPlugins.register(new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode arg) {
            ForeignCallNode node = new ForeignCallNode(foreignCalls, HotSpotForeignCallsProviderImpl.TEST_DEOPTIMIZE_CALL_INT, arg);
            b.addPush(JavaKind.Int, node);
            return true;
        }
    }, ForeignCallDeoptimizeTest.class, "testCallInt", int.class);
    super.registerInvocationPlugins(invocationPlugins);
}
Also used : ForeignCallsProvider(org.graalvm.compiler.core.common.spi.ForeignCallsProvider) ForeignCallNode(org.graalvm.compiler.nodes.extended.ForeignCallNode) GraphBuilderContext(org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext) HotSpotProviders(org.graalvm.compiler.hotspot.meta.HotSpotProviders) ValueNode(org.graalvm.compiler.nodes.ValueNode) InvocationPlugin(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin) ResolvedJavaMethod(jdk.vm.ci.meta.ResolvedJavaMethod)

Example 2 with ForeignCallsProvider

use of org.graalvm.compiler.core.common.spi.ForeignCallsProvider in project graal by oracle.

the class CompileQueue method parseAheadOfTimeCompiledMethods.

/**
 * Regular compiled methods. Only entry points and manually marked methods are compiled, all
 * transitively reachable methods are then identified by looking at the callees of already
 * parsed methods.
 */
private void parseAheadOfTimeCompiledMethods() {
    universe.getMethods().stream().filter(method -> method.isEntryPoint() || CompilationInfoSupport.singleton().isForcedCompilation(method)).forEach(method -> ensureParsed(method, new EntryPointReason()));
    SubstrateForeignCallsProvider foreignCallsProvider = (SubstrateForeignCallsProvider) runtimeConfig.getProviders().getForeignCalls();
    foreignCallsProvider.getForeignCalls().keySet().stream().map(descriptor -> (HostedMethod) descriptor.findMethod(runtimeConfig.getProviders().getMetaAccess())).filter(method -> method.wrapped.isRootMethod()).forEach(method -> ensureParsed(method, new EntryPointReason()));
}
Also used : HostedProviders(com.oracle.graal.pointsto.meta.HostedProviders) Arrays(java.util.Arrays) SubstrateOptions(com.oracle.svm.core.SubstrateOptions) StackValueNode(com.oracle.svm.core.graal.stackvalue.StackValueNode) CompletionExecutor(com.oracle.graal.pointsto.util.CompletionExecutor) GraalCompiler(org.graalvm.compiler.core.GraalCompiler) NativeImageOptions(com.oracle.svm.hosted.NativeImageOptions) Map(java.util.Map) MethodCallTargetNode(org.graalvm.compiler.nodes.java.MethodCallTargetNode) LIRSuites(org.graalvm.compiler.lir.phases.LIRSuites) DeoptEntryInfopoint(com.oracle.svm.core.deopt.DeoptEntryInfopoint) RuntimeConfiguration(com.oracle.svm.core.graal.meta.RuntimeConfiguration) Specialize(com.oracle.svm.core.annotate.Specialize) Fold(org.graalvm.compiler.api.replacements.Fold) Uninterruptible(com.oracle.svm.core.annotate.Uninterruptible) CompilationResultBuilderFactory(org.graalvm.compiler.lir.asm.CompilationResultBuilderFactory) DeoptTest(com.oracle.svm.core.annotate.DeoptTest) FrameState(org.graalvm.compiler.nodes.FrameState) Purpose(com.oracle.graal.pointsto.infrastructure.GraphProvider.Purpose) StrengthenStampsPhase(com.oracle.svm.hosted.phases.StrengthenStampsPhase) InterruptImageBuilding(com.oracle.svm.core.util.InterruptImageBuilding) LowTierContext(org.graalvm.compiler.phases.tiers.LowTierContext) LinearScanPhase(org.graalvm.compiler.lir.alloc.lsra.LinearScanPhase) CodeCacheProvider(jdk.vm.ci.code.CodeCacheProvider) HostedOptionValues(com.oracle.svm.core.option.HostedOptionValues) GraphBuilderConfiguration(org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration) StopTimer(com.oracle.graal.pointsto.util.Timer.StopTimer) GuardsStage(org.graalvm.compiler.nodes.StructuredGraph.GuardsStage) GraalOptions(org.graalvm.compiler.core.common.GraalOptions) StateSplit(org.graalvm.compiler.nodes.StateSplit) RestrictHeapAccess(com.oracle.svm.core.annotate.RestrictHeapAccess) ConstantNode(org.graalvm.compiler.nodes.ConstantNode) Description(org.graalvm.compiler.debug.DebugContext.Description) Backend(org.graalvm.compiler.core.target.Backend) OptimisticOptimizations(org.graalvm.compiler.phases.OptimisticOptimizations) GraalConfiguration(com.oracle.svm.core.graal.GraalConfiguration) ArrayList(java.util.ArrayList) FrameContext(org.graalvm.compiler.lir.asm.FrameContext) DeadStoreRemovalPhase(com.oracle.svm.core.graal.phases.DeadStoreRemovalPhase) CompilationResult(org.graalvm.compiler.code.CompilationResult) Verbosity(org.graalvm.compiler.core.common.CompilationIdentifier.Verbosity) PhaseContext(org.graalvm.compiler.phases.tiers.PhaseContext) InvocationPlugin(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin) HighTierContext(org.graalvm.compiler.phases.tiers.HighTierContext) GraphOrder(org.graalvm.compiler.phases.util.GraphOrder) DeoptTestNode(com.oracle.svm.core.graal.nodes.DeoptTestNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) DevirtualizeCallsPhase(com.oracle.svm.hosted.phases.DevirtualizeCallsPhase) DebugContextRunnable(com.oracle.graal.pointsto.util.CompletionExecutor.DebugContextRunnable) Suites(org.graalvm.compiler.phases.tiers.Suites) CompilationResultBuilder(org.graalvm.compiler.lir.asm.CompilationResultBuilder) AlwaysInlineAllCallees(com.oracle.svm.core.annotate.AlwaysInlineAllCallees) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) TreeMap(java.util.TreeMap) ForkJoinPool(java.util.concurrent.ForkJoinPool) Indent(org.graalvm.compiler.debug.Indent) DataBuilder(org.graalvm.compiler.lir.asm.DataBuilder) ForeignCallNode(org.graalvm.compiler.nodes.extended.ForeignCallNode) PartialEscapePhase(org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase) Providers(org.graalvm.compiler.phases.util.Providers) EarlyReadEliminationPhase(org.graalvm.compiler.virtual.phases.ea.EarlyReadEliminationPhase) BytecodeFrame(jdk.vm.ci.code.BytecodeFrame) Constant(jdk.vm.ci.meta.Constant) FeatureHandler(com.oracle.svm.hosted.FeatureHandler) NodeIntrinsic(org.graalvm.compiler.graph.Node.NodeIntrinsic) HostedUniverse(com.oracle.svm.hosted.meta.HostedUniverse) CompilationIdentifier(org.graalvm.compiler.core.common.CompilationIdentifier) EconomicMap(org.graalvm.collections.EconomicMap) ForeignCallsProvider(org.graalvm.compiler.core.common.spi.ForeignCallsProvider) Infopoint(jdk.vm.ci.code.site.Infopoint) PhaseSuite(org.graalvm.compiler.phases.PhaseSuite) DeoptEntryNode(com.oracle.svm.core.graal.nodes.DeoptEntryNode) DebugInfo(jdk.vm.ci.code.DebugInfo) DeletedMethod(com.oracle.svm.hosted.substitute.DeletedMethod) ResolvedJavaMethodBytecode(org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) RedundantMoveElimination(org.graalvm.compiler.lir.RedundantMoveElimination) VMError(com.oracle.svm.core.util.VMError) Objects(java.util.Objects) Bytecode(org.graalvm.compiler.bytecode.Bytecode) ValueNode(org.graalvm.compiler.nodes.ValueNode) List(java.util.List) FrameInfoEncoder(com.oracle.svm.core.code.FrameInfoEncoder) Modifier(java.lang.reflect.Modifier) SnippetReflectionProvider(org.graalvm.compiler.api.replacements.SnippetReflectionProvider) Annotation(java.lang.annotation.Annotation) Entry(java.util.Map.Entry) GraalError(org.graalvm.compiler.debug.GraalError) FixReadsPhase(org.graalvm.compiler.phases.common.FixReadsPhase) DataSection(org.graalvm.compiler.code.DataSection) StartNode(org.graalvm.compiler.nodes.StartNode) CanonicalizerPhase(org.graalvm.compiler.phases.common.CanonicalizerPhase) HashMap(java.util.HashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) InliningUtil(org.graalvm.compiler.phases.common.inlining.InliningUtil) HostedGraphBuilderPhase(com.oracle.svm.hosted.phases.HostedGraphBuilderPhase) Assembler(org.graalvm.compiler.asm.Assembler) SubstrateIntrinsicGraphBuilder(com.oracle.graal.pointsto.phases.SubstrateIntrinsicGraphBuilder) DebugContext(org.graalvm.compiler.debug.DebugContext) FrameMap(org.graalvm.compiler.lir.framemap.FrameMap) InvokeNode(org.graalvm.compiler.nodes.InvokeNode) HostedMethod(com.oracle.svm.hosted.meta.HostedMethod) ParameterNode(org.graalvm.compiler.nodes.ParameterNode) NativeImageGenerator(com.oracle.svm.hosted.NativeImageGenerator) NeverInlineTrivial(com.oracle.svm.core.annotate.NeverInlineTrivial) OptionValues(org.graalvm.compiler.options.OptionValues) SubstrateForeignCallsProvider(com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider) BytecodeExceptionMode(org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.BytecodeExceptionMode) ImageSingletons(org.graalvm.nativeimage.ImageSingletons) Timer(com.oracle.graal.pointsto.util.Timer) FloatingReadPhase(org.graalvm.compiler.phases.common.FloatingReadPhase) MidTierContext(org.graalvm.compiler.phases.tiers.MidTierContext) DeoptTester(com.oracle.svm.core.deopt.DeoptTester) InfopointReason(jdk.vm.ci.code.site.InfopointReason) Invoke(org.graalvm.compiler.nodes.Invoke) Call(jdk.vm.ci.code.site.Call) Node(org.graalvm.compiler.graph.Node) Comparator(java.util.Comparator) Collections(java.util.Collections) FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) SubstrateForeignCallsProvider(com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider)

Example 3 with ForeignCallsProvider

use of org.graalvm.compiler.core.common.spi.ForeignCallsProvider in project graal by oracle.

the class SharedRuntimeConfigurationBuilder method build.

public SharedRuntimeConfigurationBuilder build() {
    wordTypes = new WordTypes(metaAccess, FrameAccess.getWordKind());
    Providers p = createProviders(null, null, null, null, null, null, null, null);
    StampProvider stampProvider = createStampProvider(p);
    p = createProviders(null, null, null, null, null, null, stampProvider, null);
    ConstantReflectionProvider constantReflection = createConstantReflectionProvider(p);
    ConstantFieldProvider constantFieldProvider = createConstantFieldProvider(p);
    createProviders(null, constantReflection, constantFieldProvider, null, null, null, stampProvider, null);
    SnippetReflectionProvider snippetReflection = createSnippetReflectionProvider();
    createProviders(null, constantReflection, constantFieldProvider, null, null, null, stampProvider, snippetReflection);
    ForeignCallsProvider foreignCalls = createForeignCallsProvider();
    p = createProviders(null, constantReflection, constantFieldProvider, foreignCalls, null, null, stampProvider, snippetReflection);
    LoweringProvider lowerer = createLoweringProvider(p);
    p = createProviders(null, constantReflection, constantFieldProvider, foreignCalls, lowerer, null, stampProvider, snippetReflection);
    Replacements replacements = createReplacements(p, snippetReflection);
    p = createProviders(null, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, stampProvider, snippetReflection);
    EnumMap<ConfigKind, Backend> backends = new EnumMap<>(ConfigKind.class);
    for (ConfigKind config : ConfigKind.values()) {
        RegisterConfig registerConfig = new SubstrateAMD64RegisterConfig(config, metaAccess, ConfigurationValues.getTarget());
        CodeCacheProvider codeCacheProvider = createCodeCacheProvider(registerConfig);
        Providers newProviders = createProviders(codeCacheProvider, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, stampProvider, snippetReflection);
        backends.put(config, GraalConfiguration.instance().createBackend(newProviders));
    }
    runtimeConfig = new RuntimeConfiguration(p, snippetReflection, backends, wordTypes);
    return this;
}
Also used : ForeignCallsProvider(org.graalvm.compiler.core.common.spi.ForeignCallsProvider) SubstrateForeignCallsProvider(com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider) SubstrateStampProvider(com.oracle.svm.core.graal.meta.SubstrateStampProvider) StampProvider(org.graalvm.compiler.nodes.spi.StampProvider) RegisterConfig(jdk.vm.ci.code.RegisterConfig) SubstrateAMD64RegisterConfig(com.oracle.svm.core.graal.code.amd64.SubstrateAMD64RegisterConfig) Replacements(org.graalvm.compiler.nodes.spi.Replacements) WordTypes(org.graalvm.compiler.word.WordTypes) SubstrateAMD64RegisterConfig(com.oracle.svm.core.graal.code.amd64.SubstrateAMD64RegisterConfig) LoweringProvider(org.graalvm.compiler.nodes.spi.LoweringProvider) SubstrateLoweringProvider(com.oracle.svm.core.graal.meta.SubstrateLoweringProvider) ConfigKind(com.oracle.svm.core.graal.code.amd64.SubstrateAMD64RegisterConfig.ConfigKind) Providers(org.graalvm.compiler.phases.util.Providers) SubstrateCodeCacheProvider(com.oracle.svm.core.graal.meta.SubstrateCodeCacheProvider) CodeCacheProvider(jdk.vm.ci.code.CodeCacheProvider) RuntimeConfiguration(com.oracle.svm.core.graal.meta.RuntimeConfiguration) SubstrateSnippetReflectionProvider(com.oracle.svm.core.graal.meta.SubstrateSnippetReflectionProvider) SnippetReflectionProvider(org.graalvm.compiler.api.replacements.SnippetReflectionProvider) Backend(org.graalvm.compiler.core.target.Backend) ConstantReflectionProvider(jdk.vm.ci.meta.ConstantReflectionProvider) EnumMap(java.util.EnumMap) ConstantFieldProvider(org.graalvm.compiler.core.common.spi.ConstantFieldProvider)

Example 4 with ForeignCallsProvider

use of org.graalvm.compiler.core.common.spi.ForeignCallsProvider in project graal by oracle.

the class NativeImageGenerator method doRun.

@SuppressWarnings("try")
private void doRun(Map<Method, CEntryPointData> entryPoints, Method mainEntryPoint, JavaMainSupport javaMainSupport, String imageName, AbstractBootImage.NativeImageKind k, SubstitutionProcessor harnessSubstitutions, ForkJoinPool compilationExecutor, ForkJoinPool analysisExecutor) {
    List<HostedMethod> hostedEntryPoints = new ArrayList<>();
    NativeLibraries nativeLibs;
    SVMHost svmHost;
    AnalysisMetaAccess aMetaAccess;
    SnippetReflectionProvider aSnippetReflection;
    HostedProviders aProviders;
    Throwable error = null;
    OptionValues options = HostedOptionValues.singleton();
    SnippetReflectionProvider originalSnippetReflection = GraalAccess.getOriginalSnippetReflection();
    try (DebugContext debug = DebugContext.create(options, new GraalDebugHandlersFactory(originalSnippetReflection))) {
        try (Indent indent = debug.logAndIndent("start analysis pass")) {
            try (StopTimer t = new Timer("setup").start()) {
                // TODO Make customizable via command line parameter.
                Platform platform = defaultPlatform();
                TargetDescription target = createTarget(platform);
                OSInterface osInterface = createOSInterface(loader);
                ObjectLayout objectLayout = new ObjectLayout(target, SubstrateAMD64Backend.getDeoptScatchSpace());
                CompressEncoding compressEncoding = new CompressEncoding(SubstrateOptions.UseHeapBaseRegister.getValue() ? 1 : 0, 0);
                ImageSingletons.add(Platform.class, platform);
                ImageSingletons.add(TargetDescription.class, target);
                ImageSingletons.add(OSInterface.class, osInterface);
                ImageSingletons.add(ObjectLayout.class, objectLayout);
                ImageSingletons.add(CompressEncoding.class, compressEncoding);
                if (javaMainSupport != null) {
                    ImageSingletons.add(JavaMainSupport.class, javaMainSupport);
                }
                Providers originalProviders = GraalAccess.getOriginalProviders();
                MetaAccessProvider originalMetaAccess = originalProviders.getMetaAccess();
                AnalysisPolicy analysisPolicy;
                if (PointstoOptions.AllocationSiteSensitiveHeap.getValue(options)) {
                    // context sensitive analysis
                    analysisPolicy = new SVMBytecodeAnalysisPolicy(options);
                } else {
                    // context insensitive analysis
                    analysisPolicy = new SVMDefaultAnalysisPolicy(options);
                }
                svmHost = new SVMHost(options, platform, analysisPolicy, loader.getClassLoader());
                featureHandler.registerFeatures(loader);
                AfterRegistrationAccessImpl access = new AfterRegistrationAccessImpl(featureHandler, loader, originalMetaAccess);
                featureHandler.forEachFeature(feature -> feature.afterRegistration(access));
                registerEntryPoints(entryPoints);
                /*
                     * Check if any configuration factory class was registered. If not, register the
                     * basic one.
                     */
                HostedConfiguration.setDefaultIfEmpty();
                GraalConfiguration.setDefaultIfEmpty();
                registerEntryPoints(entryPoints);
                CFunctionSubstitutionProcessor cfunctionSubstitutions = new CFunctionSubstitutionProcessor();
                AnnotationSubstitutionProcessor annotationSubstitutions = new DeclarativeSubstitutionProcessor(loader, originalMetaAccess);
                ImageSingletons.add(AnnotationSubstitutionProcessor.class, annotationSubstitutions);
                annotationSubstitutions.init();
                UnsafeAutomaticSubstitutionProcessor automaticSubstitutions = new UnsafeAutomaticSubstitutionProcessor(annotationSubstitutions);
                ImageSingletons.add(UnsafeAutomaticSubstitutionProcessor.class, automaticSubstitutions);
                automaticSubstitutions.init(originalMetaAccess);
                SubstitutionProcessor substitutions = SubstitutionProcessor.chainUpInOrder(harnessSubstitutions, new AnnotationSupport(originalMetaAccess, originalSnippetReflection), annotationSubstitutions, cfunctionSubstitutions, automaticSubstitutions);
                aUniverse = new AnalysisUniverse(svmHost, target, substitutions, originalMetaAccess, originalSnippetReflection, new SubstrateSnippetReflectionProvider());
                aMetaAccess = new AnalysisMetaAccess(aUniverse, originalMetaAccess);
                // native libraries
                AnalysisConstantReflectionProvider aConstantReflection = new AnalysisConstantReflectionProvider(svmHost, aUniverse, originalProviders.getConstantReflection());
                AnalysisConstantFieldProvider aConstantFieldProvider = new AnalysisConstantFieldProvider(aUniverse, aMetaAccess);
                aSnippetReflection = new HostedSnippetReflectionProvider(svmHost);
                nativeLibs = processNativeLibraryImports(aMetaAccess, aConstantReflection, aSnippetReflection);
                /*
                     * Install all snippets so that the types, methods, and fields used in the
                     * snippets get added to the universe.
                     */
                ForeignCallsProvider aForeignCalls = new SubstrateForeignCallsProvider();
                LoweringProvider aLoweringProvider = SubstrateLoweringProvider.create(aMetaAccess, null);
                StampProvider aStampProvider = new SubstrateStampProvider(aMetaAccess);
                WordTypes aWordTypes = new WordTypes(aMetaAccess, FrameAccess.getWordKind());
                aProviders = new HostedProviders(aMetaAccess, null, aConstantReflection, aConstantFieldProvider, aForeignCalls, aLoweringProvider, null, aStampProvider, aSnippetReflection, aWordTypes);
                BytecodeProvider bytecodeProvider = new ResolvedJavaMethodBytecodeProvider();
                SubstrateReplacements aReplacements = new SubstrateReplacements(options, aProviders, aSnippetReflection, bytecodeProvider, target, new SubstrateGraphMakerFactory(aWordTypes));
                aProviders = new HostedProviders(aMetaAccess, null, aConstantReflection, aConstantFieldProvider, aForeignCalls, aLoweringProvider, aReplacements, aStampProvider, aSnippetReflection, aWordTypes);
                bigbang = new Inflation(options, aUniverse, aProviders, svmHost, analysisExecutor);
                /*
                     * Eagerly register all target fields of recomputed value fields as unsafe
                     * accessed.
                     */
                annotationSubstitutions.processComputedValueFields(bigbang);
                try (Indent indent2 = debug.logAndIndent("process startup initializers")) {
                    DuringSetupAccessImpl config = new DuringSetupAccessImpl(featureHandler, loader, bigbang, svmHost);
                    featureHandler.forEachFeature(feature -> feature.duringSetup(config));
                }
                NativeImageGenerator.registerGraphBuilderPlugins(featureHandler, null, aProviders, aMetaAccess, aUniverse, null, null, nativeLibs, loader, true, true);
                registerReplacements(debug, featureHandler, null, aProviders, aProviders.getSnippetReflection(), true);
                /*
                     * Install feature supported substitutions.
                     */
                SubstitutionProcessor[] featureNativeSubstitutions = aUniverse.getFeatureNativeSubstitutions();
                if (featureNativeSubstitutions.length > 0) {
                    SubstitutionProcessor chain = SubstitutionProcessor.chainUpInOrder(featureNativeSubstitutions);
                    SubstitutionProcessor nativeSubstitutionProcessor = new NativeMethodSubstitutionProcessor(chain, aReplacements);
                    SubstitutionProcessor.extendsTheChain(substitutions, new SubstitutionProcessor[] { nativeSubstitutionProcessor });
                }
                SubstitutionProcessor.extendsTheChain(substitutions, aUniverse.getFeatureSubstitutions());
                /*
                     * System classes and fields are necessary to tell the static analysis that
                     * certain things really "exist". The most common reason for that is that there
                     * are no instances and allocations of these classes seen during the static
                     * analysis. The heap chunks are one good example.
                     */
                try (Indent indent2 = debug.logAndIndent("add initial classes/fields/methods")) {
                    bigbang.addSystemClass(Object.class, false, false).registerAsInHeap();
                    bigbang.addSystemField(DynamicHub.class, "vtable");
                    bigbang.addSystemClass(String.class, false, false).registerAsInHeap();
                    bigbang.addSystemClass(String[].class, false, false).registerAsInHeap();
                    bigbang.addSystemField(String.class, "value").registerAsInHeap();
                    bigbang.addSystemClass(long[].class, false, false).registerAsInHeap();
                    bigbang.addSystemClass(byte[].class, false, false).registerAsInHeap();
                    bigbang.addSystemClass(byte[][].class, false, false).registerAsInHeap();
                    bigbang.addSystemClass(Object[].class, false, false).registerAsInHeap();
                    bigbang.addSystemClass(CFunctionPointer[].class, false, false).registerAsInHeap();
                    bigbang.addSystemClass(PointerBase[].class, false, false).registerAsInHeap();
                    // Fields of BootImageInfo that get patched via relocation to addresses
                    // to the partitions of the native image heap.
                    bigbang.addSystemStaticField(NativeImageInfo.class, "firstReadOnlyPrimitiveObject").registerAsInHeap();
                    bigbang.addSystemStaticField(NativeImageInfo.class, "lastReadOnlyPrimitiveObject").registerAsInHeap();
                    bigbang.addSystemStaticField(NativeImageInfo.class, "firstReadOnlyReferenceObject").registerAsInHeap();
                    bigbang.addSystemStaticField(NativeImageInfo.class, "lastReadOnlyReferenceObject").registerAsInHeap();
                    bigbang.addSystemStaticField(NativeImageInfo.class, "firstWritablePrimitiveObject").registerAsInHeap();
                    bigbang.addSystemStaticField(NativeImageInfo.class, "lastWritablePrimitiveObject").registerAsInHeap();
                    bigbang.addSystemStaticField(NativeImageInfo.class, "firstWritableReferenceObject").registerAsInHeap();
                    bigbang.addSystemStaticField(NativeImageInfo.class, "lastWritableReferenceObject").registerAsInHeap();
                    // Graal uses it for type checks in the partial escape analysis phase.
                    bigbang.addSystemClass(Reference.class, false, false);
                    bigbang.addSystemClass(AllocationSite.class, false, false).registerAsInHeap();
                    bigbang.addSystemClass(AllocationCounter.class, false, false).registerAsInHeap();
                    bigbang.addSystemClass(AtomicReference.class, false, false).registerAsInHeap();
                    try {
                        /*
                             * TODO we want to get rid of these explicit registrations. All
                             * registered foreign calls should automatically be included in the
                             * static analysis.
                             */
                        bigbang.addRootMethod(ArraycopySnippets.class.getDeclaredMethod("doArraycopy", Object.class, int.class, Object.class, int.class, int.class));
                        bigbang.addRootMethod(Object.class.getDeclaredMethod("getClass"));
                        if (NativeImageOptions.DeoptimizeAll.getValue()) {
                            bigbang.addRootMethod(DeoptTester.class.getMethod("deoptTest"));
                        }
                    } catch (NoSuchMethodException ex) {
                        throw VMError.shouldNotReachHere(ex);
                    }
                    for (JavaKind kind : JavaKind.values()) {
                        if (kind.isPrimitive() && kind != JavaKind.Void) {
                            bigbang.addSystemClass(kind.toJavaClass(), false, true);
                            bigbang.addSystemField(kind.toBoxedJavaClass(), "value");
                            bigbang.addSystemMethod(kind.toBoxedJavaClass(), "valueOf", kind.toJavaClass());
                            bigbang.addSystemMethod(kind.toBoxedJavaClass(), kind.getJavaName() + "Value");
                        }
                    }
                    entryPoints.forEach((method, entryPointData) -> CEntryPointCallStubSupport.singleton().registerStubForMethod(method, () -> entryPointData));
                    for (StructuredGraph graph : aReplacements.getSnippetGraphs(GraalOptions.TrackNodeSourcePosition.getValue(options))) {
                        MethodTypeFlowBuilder.registerUsedElements(bigbang, graph, null);
                    }
                }
                try (Indent indent2 = debug.logAndIndent("process analysis initializers")) {
                    BeforeAnalysisAccessImpl config = new BeforeAnalysisAccessImpl(featureHandler, loader, bigbang, svmHost, nativeLibs);
                    featureHandler.forEachFeature(feature -> feature.beforeAnalysis(config));
                }
            }
            try (StopTimer t = new Timer("analysis").start()) {
                Timer processFeaturesTimer = new Timer("(features)", false);
                /*
                     * Iterate until analysis reaches a fixpoint
                     */
                DuringAnalysisAccessImpl config = new DuringAnalysisAccessImpl(featureHandler, loader, bigbang, svmHost, nativeLibs);
                int numIterations = 0;
                while (true) {
                    try (Indent indent2 = debug.logAndIndent("new analysis iteration")) {
                        /*
                             * Do the analysis (which itself is done in a similar iterative process)
                             */
                        boolean analysisChanged = bigbang.finish();
                        numIterations++;
                        if (numIterations > 1000) {
                            /*
                                 * Usually there are < 10 iterations. If we have so many iterations,
                                 * we probably have an endless loop (but at least we have a
                                 * performance problem because we re-start the analysis so often).
                                 */
                            throw VMError.shouldNotReachHere("Static analysis did not reach a fix point after " + numIterations + " iterations because a Feature keeps requesting new analysis iterations. The analysis itself " + (analysisChanged ? "DID" : "DID NOT") + " find a change in type states in the last iteration.");
                        }
                        /*
                             * Allow features to change the universe
                             */
                        try (StopTimer t2 = processFeaturesTimer.start()) {
                            int numTypes = aUniverse.getTypes().size();
                            int numMethods = aUniverse.getMethods().size();
                            int numFields = aUniverse.getFields().size();
                            featureHandler.forEachFeature(feature -> feature.duringAnalysis(config));
                            if (!config.getAndResetRequireAnalysisIteration()) {
                                if (numTypes != aUniverse.getTypes().size() || numMethods != aUniverse.getMethods().size() || numFields != aUniverse.getFields().size()) {
                                    throw UserError.abort("When a feature makes more types, methods, of fields reachable, it must require another analysis iteration via DuringAnalysisAccess.requireAnalysisIteration()");
                                }
                                break;
                            }
                        }
                    }
                }
                AfterAnalysisAccessImpl postConfig = new AfterAnalysisAccessImpl(featureHandler, loader, bigbang);
                featureHandler.forEachFeature(feature -> feature.afterAnalysis(postConfig));
                checkUniverse();
                bigbang.typeFlowTimer.print();
                bigbang.checkObjectsTimer.print();
                processFeaturesTimer.print();
                /* report the unsupported features by throwing UnsupportedFeatureException */
                bigbang.getUnsupportedFeatures().report(bigbang);
            } catch (UnsupportedFeatureException ufe) {
                if (NativeImageOptions.ReportUnsupportedFeaturesCause.getValue() && ufe.getCause() != null) {
                    System.err.println("Original exception: ");
                    ufe.getCause().printStackTrace();
                }
                throw UserError.abort(ufe.getMessage());
            }
        } catch (InterruptedException ie) {
            throw new InterruptImageBuilding();
        } catch (RuntimeException | Error e) {
            // Prevents swallowing exceptions when ReturnAfterAnalysis is true
            error = e;
            throw e;
        } finally {
            OnAnalysisExitAccess onExitConfig = new OnAnalysisExitAccessImpl(featureHandler, loader, bigbang);
            featureHandler.forEachFeature(feature -> {
                try {
                    feature.onAnalysisExit(onExitConfig);
                } catch (Exception ex) {
                    System.err.println("Exception during " + feature.getClass().getName() + ".onAnalysisExit()");
                }
            });
            if (AnalysisReportsOptions.PrintAnalysisCallTree.getValue(options)) {
                String reportName = imageName.substring(imageName.lastIndexOf("/") + 1);
                CallTreePrinter.print(bigbang, SubstrateOptions.Path.getValue(), reportName);
            }
            if (AnalysisReportsOptions.PrintImageObjectTree.getValue(options)) {
                String reportName = imageName.substring(imageName.lastIndexOf("/") + 1);
                ObjectTreePrinter.print(bigbang, SubstrateOptions.Path.getValue(), reportName);
            }
            if (PointstoOptions.ReportAnalysisStatistics.getValue(options)) {
                PointsToStats.report(bigbang, imageName.replace("images/", ""));
            }
            if (PointstoOptions.PrintSynchronizedAnalysis.getValue(options)) {
                TypeState allSynchronizedTypeState = bigbang.getAllSynchronizedTypeState();
                String typesString = // 
                allSynchronizedTypeState.closeToAllInstantiated(bigbang) ? // 
                "close to all instantiated" : StreamSupport.stream(allSynchronizedTypeState.types().spliterator(), false).map(AnalysisType::getName).collect(Collectors.joining(", "));
                System.out.println();
                System.out.println("AllSynchronizedTypes");
                System.out.println("Synchronized types #: " + allSynchronizedTypeState.typesCount());
                System.out.println("Types: " + typesString);
                System.out.println();
            }
        }
        if (error == null && NativeImageOptions.ReturnAfterAnalysis.getValue()) {
            return;
        }
        if (NativeImageOptions.ExitAfterAnalysis.getValue()) {
            throw new InterruptImageBuilding("interrupted image construction as ExitAfterAnalysis is set");
        }
        NativeImageHeap heap;
        HostedMethod mainEntryPointHostedStub;
        HostedMetaAccess hMetaAccess;
        SharedRuntimeConfigurationBuilder runtime;
        try (StopTimer t = new Timer("universe").start()) {
            hUniverse = new HostedUniverse(bigbang, svmHost);
            hMetaAccess = new HostedMetaAccess(hUniverse, aMetaAccess);
            new UniverseBuilder(aUniverse, aMetaAccess, hUniverse, hMetaAccess, HostedConfiguration.instance().createStaticAnalysisResultsBuilder(bigbang, hUniverse), bigbang.getUnsupportedFeatures()).build(debug);
            runtime = new HostedRuntimeConfigurationBuilder(options, svmHost, hUniverse, hMetaAccess, aProviders).build();
            registerGraphBuilderPlugins(featureHandler, runtime.getRuntimeConfig(), (HostedProviders) runtime.getRuntimeConfig().getProviders(), aMetaAccess, aUniverse, hMetaAccess, hUniverse, nativeLibs, loader, false, true);
            if (NativeImageOptions.PrintUniverse.getValue()) {
                printTypes();
            }
            /* Find the entry point methods in the hosted world. */
            for (AnalysisMethod m : aUniverse.getMethods()) {
                if (m.isEntryPoint()) {
                    HostedMethod found = hUniverse.lookup(m);
                    assert found != null;
                    hostedEntryPoints.add(found);
                }
            }
            /* Find main entry point */
            if (mainEntryPoint != null) {
                AnalysisMethod analysisStub = CEntryPointCallStubSupport.singleton().getStubForMethod(mainEntryPoint);
                mainEntryPointHostedStub = (HostedMethod) hMetaAccess.getUniverse().lookup(analysisStub);
                assert hostedEntryPoints.contains(mainEntryPointHostedStub);
            } else {
                mainEntryPointHostedStub = null;
            }
            if (hostedEntryPoints.size() == 0) {
                throw UserError.abort("Warning: no entry points found, i.e., no method annotated with @" + CEntryPoint.class.getSimpleName());
            }
            heap = new NativeImageHeap(aUniverse, hUniverse, hMetaAccess);
            BeforeCompilationAccessImpl config = new BeforeCompilationAccessImpl(featureHandler, loader, aUniverse, hUniverse, hMetaAccess, heap);
            featureHandler.forEachFeature(feature -> feature.beforeCompilation(config));
            bigbang.getUnsupportedFeatures().report(bigbang);
        } catch (UnsupportedFeatureException ufe) {
            throw UserError.abort(ufe.getMessage());
        }
        recordMethodsWithStackValues();
        recordRestrictHeapAccessCallees(aUniverse.getMethods());
        /*
             * After this point, all TypeFlow (and therefore also TypeState) objects are unreachable
             * and can be garbage collected. This is important to keep the overall memory footprint
             * low. However, this also means we no longer have complete call chain information. Only
             * the summarized information stored in the StaticAnalysisResult objects is available
             * after this point.
             */
        bigbang.cleanupAfterAnalysis();
        NativeImageCodeCache codeCache;
        CompileQueue compileQueue;
        try (StopTimer t = new Timer("compile").start()) {
            compileQueue = HostedConfiguration.instance().createCompileQueue(debug, featureHandler, hUniverse, runtime, NativeImageOptions.DeoptimizeAll.getValue(), aSnippetReflection, compilationExecutor);
            compileQueue.finish(debug);
            /* release memory taken by graphs for the image writing */
            hUniverse.getMethods().forEach(HostedMethod::clear);
            codeCache = new NativeImageCodeCache(compileQueue.getCompilations(), heap);
            codeCache.layoutMethods(debug);
            codeCache.layoutConstants();
            AfterCompilationAccessImpl config = new AfterCompilationAccessImpl(featureHandler, loader, aUniverse, hUniverse, hMetaAccess, heap);
            featureHandler.forEachFeature(feature -> feature.afterCompilation(config));
        }
        try (Indent indent = debug.logAndIndent("create native image")) {
            try (DebugContext.Scope buildScope = debug.scope("CreateBootImage")) {
                try (StopTimer t = new Timer("image").start()) {
                    // Start building the model of the native image heap.
                    heap.addInitialObjects(debug);
                    // Then build the model of the code cache, which can
                    // add objects to the native image heap.
                    codeCache.addConstantsToHeap(debug);
                    // Finish building the model of the native image heap.
                    heap.addTrailingObjects(debug);
                    AfterHeapLayoutAccessImpl config = new AfterHeapLayoutAccessImpl(featureHandler, loader, hMetaAccess);
                    featureHandler.forEachFeature(feature -> feature.afterHeapLayout(config));
                    this.image = AbstractBootImage.create(k, hUniverse, hMetaAccess, nativeLibs, heap, codeCache, hostedEntryPoints, mainEntryPointHostedStub);
                    image.build(debug);
                    if (NativeImageOptions.PrintUniverse.getValue()) {
                        /*
                             * This debug output must be printed _after_ and not _during_ image
                             * building, because it adds some PrintStream objects to static fields,
                             * which disrupts the heap.
                             */
                        codeCache.printCompilationResults();
                    }
                }
            }
        }
        BeforeImageWriteAccessImpl beforeConfig = new BeforeImageWriteAccessImpl(featureHandler, loader, imageName, image, runtime.getRuntimeConfig(), aUniverse, hUniverse, optionProvider, hMetaAccess);
        featureHandler.forEachFeature(feature -> feature.beforeImageWrite(beforeConfig));
        try (StopTimer t = new Timer("write").start()) {
            /*
                 * This will write the debug info too -- i.e. we may be writing more than one file,
                 * if the debug info is in a separate file. We need to push writing the file to the
                 * image implementation, because whether the debug info and image share a file or
                 * not is an implementation detail of the image.
                 */
            Path tmpDir = tempDirectory();
            Path imagePath = image.write(debug, generatedFiles(HostedOptionValues.singleton()), tmpDir, imageName, beforeConfig);
            AfterImageWriteAccessImpl afterConfig = new AfterImageWriteAccessImpl(featureHandler, loader, imagePath, tmpDir, image.getBootImageKind());
            featureHandler.forEachFeature(feature -> feature.afterImageWrite(afterConfig));
        }
    }
}
Also used : UnsafeAutomaticSubstitutionProcessor(com.oracle.svm.hosted.substitute.UnsafeAutomaticSubstitutionProcessor) AnalysisConstantReflectionProvider(com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider) Indent(org.graalvm.compiler.debug.Indent) AllocationCounter(com.oracle.svm.core.allocationprofile.AllocationCounter) OnAnalysisExitAccessImpl(com.oracle.svm.hosted.FeatureImpl.OnAnalysisExitAccessImpl) HostedOptionValues(com.oracle.svm.core.option.HostedOptionValues) RuntimeOptionValues(com.oracle.svm.core.option.RuntimeOptionValues) OptionValues(org.graalvm.compiler.options.OptionValues) Platform(org.graalvm.nativeimage.Platform) AfterCompilationAccessImpl(com.oracle.svm.hosted.FeatureImpl.AfterCompilationAccessImpl) ObjectLayout(com.oracle.svm.core.config.ObjectLayout) ArrayList(java.util.ArrayList) CompressEncoding(org.graalvm.compiler.core.common.CompressEncoding) WordTypes(org.graalvm.compiler.word.WordTypes) DeoptTester(com.oracle.svm.core.deopt.DeoptTester) HostedRuntimeConfigurationBuilder(com.oracle.svm.hosted.code.HostedRuntimeConfigurationBuilder) HostedProviders(com.oracle.graal.pointsto.meta.HostedProviders) HostedSnippetReflectionProvider(com.oracle.svm.hosted.meta.HostedSnippetReflectionProvider) OnAnalysisExitAccess(org.graalvm.nativeimage.Feature.OnAnalysisExitAccess) DuringSetupAccessImpl(com.oracle.svm.hosted.FeatureImpl.DuringSetupAccessImpl) ResolvedJavaMethodBytecodeProvider(org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecodeProvider) BeforeAnalysisAccessImpl(com.oracle.svm.hosted.FeatureImpl.BeforeAnalysisAccessImpl) AnalysisConstantFieldProvider(com.oracle.svm.hosted.ameta.AnalysisConstantFieldProvider) UnsupportedFeatureException(com.oracle.graal.pointsto.constraints.UnsupportedFeatureException) BytecodeProvider(org.graalvm.compiler.bytecode.BytecodeProvider) ResolvedJavaMethodBytecodeProvider(org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecodeProvider) DebugContext(org.graalvm.compiler.debug.DebugContext) NativeImageInfo(com.oracle.svm.core.heap.NativeImageInfo) HostedUniverse(com.oracle.svm.hosted.meta.HostedUniverse) GraalDebugHandlersFactory(org.graalvm.compiler.printer.GraalDebugHandlersFactory) UniverseBuilder(com.oracle.svm.hosted.meta.UniverseBuilder) SVMDefaultAnalysisPolicy(com.oracle.svm.hosted.analysis.SVMDefaultAnalysisPolicy) AnalysisMethod(com.oracle.graal.pointsto.meta.AnalysisMethod) SubstrateReplacements(com.oracle.svm.core.graal.meta.SubstrateReplacements) AfterAnalysisAccessImpl(com.oracle.svm.hosted.FeatureImpl.AfterAnalysisAccessImpl) HostedMethod(com.oracle.svm.hosted.meta.HostedMethod) StopTimer(com.oracle.graal.pointsto.util.Timer.StopTimer) AnalysisPolicy(com.oracle.graal.pointsto.AnalysisPolicy) SVMDefaultAnalysisPolicy(com.oracle.svm.hosted.analysis.SVMDefaultAnalysisPolicy) SVMBytecodeAnalysisPolicy(com.oracle.svm.hosted.analysis.SVMBytecodeAnalysisPolicy) DuringAnalysisAccessImpl(com.oracle.svm.hosted.FeatureImpl.DuringAnalysisAccessImpl) MetaAccessProvider(jdk.vm.ci.meta.MetaAccessProvider) SubstrateForeignCallsProvider(com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider) ForeignCallsProvider(org.graalvm.compiler.core.common.spi.ForeignCallsProvider) AnalysisType(com.oracle.graal.pointsto.meta.AnalysisType) AfterImageWriteAccessImpl(com.oracle.svm.hosted.FeatureImpl.AfterImageWriteAccessImpl) NativeLibraries(com.oracle.svm.hosted.c.NativeLibraries) BeforeImageWriteAccessImpl(com.oracle.svm.hosted.FeatureImpl.BeforeImageWriteAccessImpl) SubstrateTargetDescription(com.oracle.svm.core.graal.meta.SubstrateTargetDescription) TargetDescription(jdk.vm.ci.code.TargetDescription) AnnotationSupport(com.oracle.svm.hosted.annotation.AnnotationSupport) SubstrateForeignCallsProvider(com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider) SubstrateLoweringProvider(com.oracle.svm.core.graal.meta.SubstrateLoweringProvider) NodeLoweringProvider(com.oracle.svm.core.graal.snippets.NodeLoweringProvider) LoweringProvider(org.graalvm.compiler.nodes.spi.LoweringProvider) Providers(org.graalvm.compiler.phases.util.Providers) HostedProviders(com.oracle.graal.pointsto.meta.HostedProviders) SnippetReflectionProvider(org.graalvm.compiler.api.replacements.SnippetReflectionProvider) HostedSnippetReflectionProvider(com.oracle.svm.hosted.meta.HostedSnippetReflectionProvider) SubstrateSnippetReflectionProvider(com.oracle.svm.core.graal.meta.SubstrateSnippetReflectionProvider) Inflation(com.oracle.svm.hosted.analysis.Inflation) AfterRegistrationAccessImpl(com.oracle.svm.hosted.FeatureImpl.AfterRegistrationAccessImpl) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) ArraycopySnippets(com.oracle.svm.core.graal.jdk.ArraycopySnippets) InterruptImageBuilding(com.oracle.svm.core.util.InterruptImageBuilding) AnalysisUniverse(com.oracle.graal.pointsto.meta.AnalysisUniverse) JavaKind(jdk.vm.ci.meta.JavaKind) Path(java.nio.file.Path) SubstrateStampProvider(com.oracle.svm.core.graal.meta.SubstrateStampProvider) StampProvider(org.graalvm.compiler.nodes.spi.StampProvider) CompileQueue(com.oracle.svm.hosted.code.CompileQueue) SubstrateSnippetReflectionProvider(com.oracle.svm.core.graal.meta.SubstrateSnippetReflectionProvider) AfterHeapLayoutAccessImpl(com.oracle.svm.hosted.FeatureImpl.AfterHeapLayoutAccessImpl) CFunctionSubstitutionProcessor(com.oracle.svm.hosted.code.CFunctionSubstitutionProcessor) AnnotationSubstitutionProcessor(com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor) NativeImageHeap(com.oracle.svm.hosted.image.NativeImageHeap) NativeImageCodeCache(com.oracle.svm.hosted.image.NativeImageCodeCache) UserError(com.oracle.svm.core.util.UserError) VMError(com.oracle.svm.core.util.VMError) AnalysisMetaAccess(com.oracle.graal.pointsto.meta.AnalysisMetaAccess) AtomicReference(java.util.concurrent.atomic.AtomicReference) TypeState(com.oracle.graal.pointsto.typestate.TypeState) SubstrateGraphMakerFactory(com.oracle.svm.hosted.code.SubstrateGraphMakerFactory) CEntryPoint(org.graalvm.nativeimage.c.function.CEntryPoint) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) UnsupportedFeatureException(com.oracle.graal.pointsto.constraints.UnsupportedFeatureException) CancellationException(java.util.concurrent.CancellationException) InvocationTargetException(java.lang.reflect.InvocationTargetException) HostedMetaAccess(com.oracle.svm.hosted.meta.HostedMetaAccess) SharedRuntimeConfigurationBuilder(com.oracle.svm.hosted.code.SharedRuntimeConfigurationBuilder) SVMBytecodeAnalysisPolicy(com.oracle.svm.hosted.analysis.SVMBytecodeAnalysisPolicy) DeclarativeSubstitutionProcessor(com.oracle.svm.hosted.substitute.DeclarativeSubstitutionProcessor) StopTimer(com.oracle.graal.pointsto.util.Timer.StopTimer) Timer(com.oracle.graal.pointsto.util.Timer) NativeMethodSubstitutionProcessor(com.oracle.svm.hosted.code.NativeMethodSubstitutionProcessor) AllocationSite(com.oracle.svm.core.allocationprofile.AllocationSite) SubstrateStampProvider(com.oracle.svm.core.graal.meta.SubstrateStampProvider) AnnotationSubstitutionProcessor(com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor) DeclarativeSubstitutionProcessor(com.oracle.svm.hosted.substitute.DeclarativeSubstitutionProcessor) NativeMethodSubstitutionProcessor(com.oracle.svm.hosted.code.NativeMethodSubstitutionProcessor) SubstitutionProcessor(com.oracle.graal.pointsto.infrastructure.SubstitutionProcessor) UnsafeAutomaticSubstitutionProcessor(com.oracle.svm.hosted.substitute.UnsafeAutomaticSubstitutionProcessor) CFunctionSubstitutionProcessor(com.oracle.svm.hosted.code.CFunctionSubstitutionProcessor) OSInterface(com.oracle.svm.core.os.OSInterface) BeforeCompilationAccessImpl(com.oracle.svm.hosted.FeatureImpl.BeforeCompilationAccessImpl)

Example 5 with ForeignCallsProvider

use of org.graalvm.compiler.core.common.spi.ForeignCallsProvider in project graal by oracle.

the class GraalObjectReplacer method apply.

@Override
public Object apply(Object source) {
    if (source == null) {
        return null;
    }
    Object dest = source;
    if (source instanceof RelocatedPointer) {
        return dest;
    }
    if (source instanceof MetaAccessProvider) {
        dest = sMetaAccess;
    } else if (source instanceof GraalRuntime) {
        dest = sGraalRuntime;
    } else if (source instanceof AnalysisConstantReflectionProvider) {
        dest = sConstantReflectionProvider;
    } else if (source instanceof AnalysisConstantFieldProvider) {
        dest = sConstantFieldProvider;
    } else if (source instanceof ForeignCallsProvider) {
        dest = GraalSupport.getRuntimeConfig().getProviders().getForeignCalls();
    } else if (source instanceof HostedSnippetReflectionProvider) {
        dest = GraalSupport.getRuntimeConfig().getSnippetReflection();
    } else if (shouldBeReplaced(source)) {
        /*
             * The hash maps must be synchronized, because replace() may be called from
             * BigBang.finish(), which is multi-threaded.
             */
        synchronized (this) {
            if (source instanceof ResolvedJavaMethod) {
                dest = createMethod((ResolvedJavaMethod) source);
            } else if (source instanceof ResolvedJavaField) {
                dest = createField((ResolvedJavaField) source);
            } else if (source instanceof ResolvedJavaType) {
                dest = createType((ResolvedJavaType) source);
            } else if (source instanceof Signature) {
                dest = createSignature((Signature) source);
            } else if (source instanceof FieldLocationIdentity) {
                dest = fieldLocationIdentities.get(source);
                if (dest == null) {
                    SubstrateField destField = (SubstrateField) apply(((FieldLocationIdentity) source).getField());
                    dest = new SubstrateFieldLocationIdentity(destField);
                    fieldLocationIdentities.put((FieldLocationIdentity) source, (FieldLocationIdentity) dest);
                }
            }
        }
    }
    assert dest != null;
    String className = dest.getClass().getName();
    assert !className.contains(".hotspot.") || className.contains(".svm.jtt.hotspot.") : "HotSpot object in image " + className;
    assert !className.contains(".analysis.meta.") : "Analysis meta object in image " + className;
    assert !className.contains(".hosted.meta.") : "Hosted meta object in image " + className;
    return dest;
}
Also used : ForeignCallsProvider(org.graalvm.compiler.core.common.spi.ForeignCallsProvider) AnalysisConstantReflectionProvider(com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider) AnalysisConstantFieldProvider(com.oracle.svm.hosted.ameta.AnalysisConstantFieldProvider) RelocatedPointer(org.graalvm.nativeimage.c.function.RelocatedPointer) SubstrateField(com.oracle.svm.graal.meta.SubstrateField) ResolvedJavaType(jdk.vm.ci.meta.ResolvedJavaType) HostedSnippetReflectionProvider(com.oracle.svm.hosted.meta.HostedSnippetReflectionProvider) ResolvedJavaField(jdk.vm.ci.meta.ResolvedJavaField) GraalRuntime(org.graalvm.compiler.api.runtime.GraalRuntime) SubstrateGraalRuntime(com.oracle.svm.graal.SubstrateGraalRuntime) FieldLocationIdentity(org.graalvm.compiler.nodes.FieldLocationIdentity) SubstrateFieldLocationIdentity(com.oracle.svm.core.graal.nodes.SubstrateFieldLocationIdentity) SubstrateFieldLocationIdentity(com.oracle.svm.core.graal.nodes.SubstrateFieldLocationIdentity) Signature(jdk.vm.ci.meta.Signature) SubstrateSignature(com.oracle.svm.graal.meta.SubstrateSignature) MetaAccessProvider(jdk.vm.ci.meta.MetaAccessProvider) ResolvedJavaMethod(jdk.vm.ci.meta.ResolvedJavaMethod)

Aggregations

ForeignCallsProvider (org.graalvm.compiler.core.common.spi.ForeignCallsProvider)5 SubstrateForeignCallsProvider (com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider)3 SnippetReflectionProvider (org.graalvm.compiler.api.replacements.SnippetReflectionProvider)3 Providers (org.graalvm.compiler.phases.util.Providers)3 HostedProviders (com.oracle.graal.pointsto.meta.HostedProviders)2 Timer (com.oracle.graal.pointsto.util.Timer)2 StopTimer (com.oracle.graal.pointsto.util.Timer.StopTimer)2 DeoptTester (com.oracle.svm.core.deopt.DeoptTester)2 RuntimeConfiguration (com.oracle.svm.core.graal.meta.RuntimeConfiguration)2 SubstrateLoweringProvider (com.oracle.svm.core.graal.meta.SubstrateLoweringProvider)2 SubstrateSnippetReflectionProvider (com.oracle.svm.core.graal.meta.SubstrateSnippetReflectionProvider)2 SubstrateStampProvider (com.oracle.svm.core.graal.meta.SubstrateStampProvider)2 HostedOptionValues (com.oracle.svm.core.option.HostedOptionValues)2 InterruptImageBuilding (com.oracle.svm.core.util.InterruptImageBuilding)2 VMError (com.oracle.svm.core.util.VMError)2 AnalysisConstantFieldProvider (com.oracle.svm.hosted.ameta.AnalysisConstantFieldProvider)2 AnalysisConstantReflectionProvider (com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider)2 HostedMethod (com.oracle.svm.hosted.meta.HostedMethod)2 HostedSnippetReflectionProvider (com.oracle.svm.hosted.meta.HostedSnippetReflectionProvider)2 HostedUniverse (com.oracle.svm.hosted.meta.HostedUniverse)2