use of jdk.vm.ci.code.site.Infopoint in project graal by oracle.
the class DeoptEntryOp method emitCode.
@Override
public void emitCode(CompilationResultBuilder crb) {
CompilationResult compilation = crb.compilationResult;
/* Search for the previous added info point. */
List<Infopoint> infoPoints = compilation.getInfopoints();
int size = infoPoints.size();
for (int idx = size - 1; idx >= 0; idx--) {
Infopoint infopoint = infoPoints.get(idx);
int entryOffset = CodeInfoEncoder.getEntryOffset(infopoint);
if (entryOffset >= 0) {
if (entryOffset == crb.asm.position()) {
crb.asm.ensureUniquePC();
break;
}
}
}
/* Register this location as a deopt infopoint. */
compilation.addInfopoint(new DeoptEntryInfopoint(crb.asm.position(), state.debugInfo()));
/* Add NOP so that the next infopoint (e.g., an invoke) gets a unique PC. */
crb.asm.ensureUniquePC();
}
use of jdk.vm.ci.code.site.Infopoint 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.site.Infopoint in project graal by oracle.
the class InfopointReasonTest method callInfopoints.
@Test
public void callInfopoints() {
final ResolvedJavaMethod method = getResolvedJavaMethod("testMethod");
final StructuredGraph graph = parseEager(method, AllowAssumptions.YES);
final CompilationResult cr = compileGraph(graph, graph.method(), getProviders(), getBackend(), getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL, graph.getProfilingInfo(), createSuites(graph.getOptions()), createLIRSuites(graph.getOptions()), new CompilationResult(graph.compilationId()), CompilationResultBuilderFactory.Default);
for (Infopoint sp : cr.getInfopoints()) {
assertNotNull(sp.reason);
if (sp instanceof Call) {
assertDeepEquals(InfopointReason.CALL, sp.reason);
}
}
}
Aggregations