Search in sources :

Example 6 with DebugInfo

use of jdk.vm.ci.code.DebugInfo 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)

Example 7 with DebugInfo

use of jdk.vm.ci.code.DebugInfo in project graal by oracle.

the class CompilationResultBuilder method recordDirectCall.

public void recordDirectCall(int posBefore, int posAfter, InvokeTarget callTarget, LIRFrameState info) {
    DebugInfo debugInfo = info != null ? info.debugInfo() : null;
    compilationResult.recordCall(posBefore, posAfter - posBefore, callTarget, debugInfo, true);
}
Also used : DebugInfo(jdk.vm.ci.code.DebugInfo)

Example 8 with DebugInfo

use of jdk.vm.ci.code.DebugInfo in project graal by oracle.

the class FrameInfoVerifier method addDebugInfo.

protected FrameData addDebugInfo(ResolvedJavaMethod method, Infopoint infopoint, int totalFrameSize) {
    final boolean shouldIncludeMethod = customization.shouldInclude(method, infopoint);
    final boolean encodeSourceReferences = FrameInfoDecoder.encodeSourceReferences();
    if (!shouldIncludeMethod && !encodeSourceReferences) {
        return null;
    }
    final DebugInfo debugInfo = infopoint.debugInfo;
    final FrameData data = new FrameData();
    data.debugInfo = debugInfo;
    data.totalFrameSize = totalFrameSize;
    data.virtualObjects = new ValueInfo[countVirtualObjects(debugInfo)][];
    data.frame = addFrame(data, debugInfo.frame(), customization.isDeoptEntry(method, infopoint), shouldIncludeMethod);
    final boolean encodeDebugNames = shouldIncludeMethod && FrameInfoDecoder.encodeDebugNames();
    if (encodeDebugNames || FrameInfoDecoder.encodeSourceReferences()) {
        BytecodeFrame bytecodeFrame = data.debugInfo.frame();
        for (FrameInfoQueryResult resultFrame = data.frame; bytecodeFrame != null; resultFrame = resultFrame.caller) {
            customization.fillDebugNames(bytecodeFrame, resultFrame, encodeDebugNames && shouldIncludeMethod);
            bytecodeFrame = bytecodeFrame.caller();
        }
        for (FrameInfoQueryResult cur = data.frame; cur != null; cur = cur.caller) {
            sourceClassNames.addObject(cur.sourceClassName);
            sourceMethodNames.addObject(cur.sourceMethodName);
            sourceFileNames.addObject(cur.sourceFileName);
            if (encodeDebugNames) {
                for (ValueInfo valueInfo : cur.valueInfos) {
                    if (valueInfo.name == null) {
                        valueInfo.name = "";
                    }
                    names.addObject(valueInfo.name);
                }
            }
        }
    }
    allDebugInfos.add(data);
    return data;
}
Also used : BytecodeFrame(jdk.vm.ci.code.BytecodeFrame) ValueInfo(com.oracle.svm.core.code.FrameInfoQueryResult.ValueInfo) DebugInfo(jdk.vm.ci.code.DebugInfo)

Aggregations

DebugInfo (jdk.vm.ci.code.DebugInfo)8 Infopoint (jdk.vm.ci.code.site.Infopoint)3 DeoptEntryInfopoint (com.oracle.svm.core.deopt.DeoptEntryInfopoint)2 BytecodeFrame (jdk.vm.ci.code.BytecodeFrame)2 ValueInfo (com.oracle.svm.core.code.FrameInfoQueryResult.ValueInfo)1 ReferenceMapEncoder (com.oracle.svm.core.heap.ReferenceMapEncoder)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 Call (jdk.vm.ci.code.site.Call)1 ExceptionHandler (jdk.vm.ci.code.site.ExceptionHandler)1 Site (jdk.vm.ci.code.site.Site)1 SourceMapping (org.graalvm.compiler.code.SourceMapping)1 NodeSourcePosition (org.graalvm.compiler.graph.NodeSourcePosition)1