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