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()]);
}
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);
}
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;
}
Aggregations