Search in sources :

Example 1 with SourceMapping

use of org.graalvm.compiler.code.SourceMapping in project graal by oracle.

the class HotSpotCompiledCodeBuilder method getSortedSites.

/**
 * HotSpot expects sites to be presented in ascending order of PC (see
 * {@code DebugInformationRecorder::add_new_pc_offset}). In addition, it expects
 * {@link Infopoint} PCs to be unique.
 */
private static Site[] getSortedSites(CodeCacheProvider codeCache, CompilationResult target) {
    List<Site> sites = new ArrayList<>(target.getExceptionHandlers().size() + target.getInfopoints().size() + target.getDataPatches().size() + target.getMarks().size() + target.getSourceMappings().size());
    sites.addAll(target.getExceptionHandlers());
    sites.addAll(target.getInfopoints());
    sites.addAll(target.getDataPatches());
    sites.addAll(target.getMarks());
    if (codeCache.shouldDebugNonSafepoints()) {
        /*
             * Translate the source mapping into appropriate info points. In HotSpot only one
             * position can really be represented and recording the end PC seems to give the best
             * results and corresponds with what C1 and C2 do. HotSpot doesn't like to see these
             * unless -XX:+DebugNonSafepoints is enabled, so don't emit them in that case.
             */
        List<Site> sourcePositionSites = new ArrayList<>();
        for (SourceMapping source : target.getSourceMappings()) {
            NodeSourcePosition sourcePosition = source.getSourcePosition();
            if (sourcePosition.isPlaceholder() || sourcePosition.isSubstitution()) {
                // HotSpot doesn't understand any of the special positions so just drop them.
                continue;
            }
            assert sourcePosition.verify();
            sourcePosition = sourcePosition.trim();
            /*
                 * Don't add BYTECODE_POSITION info points that would potentially create conflicts.
                 * Under certain conditions the site's pc is not the pc that gets recorded by
                 * HotSpot (see @code {CodeInstaller::site_Call}). So, avoid adding any source
                 * positions that can potentially map to the same pc. To do that make sure that the
                 * source mapping doesn't contain a pc of any important Site.
                 */
            if (sourcePosition != null && !anyMatch(sites, s -> source.contains(s.pcOffset))) {
                sourcePositionSites.add(new Infopoint(source.getEndOffset(), new DebugInfo(sourcePosition), InfopointReason.BYTECODE_POSITION));
            }
        }
        sites.addAll(sourcePositionSites);
    }
    SiteComparator c = new SiteComparator();
    Collections.sort(sites, c);
    if (c.sawCollidingInfopoints) {
        Infopoint lastInfopoint = null;
        List<Site> copy = new ArrayList<>(sites.size());
        for (Site site : sites) {
            if (site instanceof Infopoint) {
                Infopoint info = (Infopoint) site;
                if (lastInfopoint == null || lastInfopoint.pcOffset != info.pcOffset) {
                    lastInfopoint = info;
                    copy.add(info);
                } else {
                    // Omit this colliding infopoint
                    assert lastInfopoint.reason.compareTo(info.reason) <= 0;
                }
            } else {
                copy.add(site);
            }
        }
        sites = copy;
    }
    return sites.toArray(new Site[sites.size()]);
}
Also used : Site(jdk.vm.ci.code.site.Site) ArrayList(java.util.ArrayList) Infopoint(jdk.vm.ci.code.site.Infopoint) SourceMapping(org.graalvm.compiler.code.SourceMapping) DebugInfo(jdk.vm.ci.code.DebugInfo) NodeSourcePosition(org.graalvm.compiler.graph.NodeSourcePosition)

Aggregations

ArrayList (java.util.ArrayList)1 DebugInfo (jdk.vm.ci.code.DebugInfo)1 Infopoint (jdk.vm.ci.code.site.Infopoint)1 Site (jdk.vm.ci.code.site.Site)1 SourceMapping (org.graalvm.compiler.code.SourceMapping)1 NodeSourcePosition (org.graalvm.compiler.graph.NodeSourcePosition)1