All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.oracle.svm.truffle.HostedTruffleConstantFieldProvider Maven / Gradle / Ivy

/*
 * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.oracle.svm.truffle;

import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;

import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.nodes.Node.Child;
import com.oracle.truffle.api.nodes.Node.Children;

import jdk.graal.compiler.core.common.spi.ConstantFieldProvider;
import jdk.vm.ci.meta.ResolvedJavaField;

@Platforms(Platform.HOSTED_ONLY.class)
public final class HostedTruffleConstantFieldProvider implements ConstantFieldProvider {
    private final ConstantFieldProvider wrappedConstantFieldProvider;

    public HostedTruffleConstantFieldProvider(ConstantFieldProvider wrappedConstantFieldProvider) {
        this.wrappedConstantFieldProvider = wrappedConstantFieldProvider;
    }

    /**
     * The {@link CompilationFinal} annotation allows one to mark arrays as stable so that array
     * elements can be constant folded.
     * 

* However, the "stableness" of the array can be a dynamic property guarded by assumptions in * the runtime execution. In other words, it is possible for the array to be considered stable * in a Truffle guest compilation, and for the compilation to be invalidated when the array is * changed. Therefore, this constant folding must not happen during native image generation, as * invalidation of such code is impossible. *

* We disable the constant folding of such fields when preparing runtime graphs, so that during * partial evaluation the Truffle constant field provider delegate can do the correct constant * folding that takes stable array dimensions into account. *

* Similar restrictions are needed for the Node's {@link Child} and {@link Children} * annotations. */ @Override public T readConstantField(ResolvedJavaField field, ConstantFieldTool tool) { boolean hasTruffleFoldedAnnotation = field.isAnnotationPresent(CompilationFinal.class) || field.isAnnotationPresent(Child.class) || field.isAnnotationPresent(Children.class); if (hasTruffleFoldedAnnotation) { return null; } return wrappedConstantFieldProvider.readConstantField(field, tool); } @Override public boolean maybeFinal(ResolvedJavaField field) { return wrappedConstantFieldProvider.maybeFinal(field); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy