/* * Copyright (c) 2017 Chris Newland. * Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD * Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki */ package org.adoptopenjdk.jitwatch.report.inlining; import java.util.List; import java.util.Map; import java.util.Set; import org.adoptopenjdk.jitwatch.model.AnnotationException; import org.adoptopenjdk.jitwatch.model.Compilation; import org.adoptopenjdk.jitwatch.model.IMetaMember; import org.adoptopenjdk.jitwatch.model.IParseDictionary; import org.adoptopenjdk.jitwatch.model.IReadOnlyJITDataModel; import org.adoptopenjdk.jitwatch.model.LogParseException; import org.adoptopenjdk.jitwatch.model.Tag; import org.adoptopenjdk.jitwatch.model.bytecode.BCAnnotationType; import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeAnnotationBuilder; import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeAnnotationList; import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeAnnotations; import org.adoptopenjdk.jitwatch.model.bytecode.LineAnnotation; import org.adoptopenjdk.jitwatch.report.AbstractReportBuilder; import org.adoptopenjdk.jitwatch.report.Report; import org.adoptopenjdk.jitwatch.report.ReportType; public class InliningWalker extends AbstractReportBuilder { private BytecodeAnnotationBuilder bcAnnotationBuilder; private IMetaMember member; public InliningWalker(IReadOnlyJITDataModel model, IMetaMember member) { super(model); this.member = member; bcAnnotationBuilder = new BytecodeAnnotationBuilder(false); } @Override protected void findNonMemberReports() { } @Override public void visit(IMetaMember metaMember) { if (metaMember != null && metaMember.isCompiled()) { for (Compilation compilation : metaMember.getCompilations()) { try { BytecodeAnnotations annotations = bcAnnotationBuilder.buildBytecodeAnnotations(metaMember, compilation.getIndex(), model); Set<IMetaMember> membersWithAnnotations = annotations.getMembers(); for (IMetaMember currentMember : membersWithAnnotations) { BytecodeAnnotationList annotationsForMember = annotations.getAnnotationList(currentMember); for (Map.Entry<Integer, List<LineAnnotation>> entry : annotationsForMember.getEntries()) { List<LineAnnotation> lineAnnotations = entry.getValue(); int bci = entry.getKey(); for (LineAnnotation la : lineAnnotations) { if (filterLineAnnotation(la, member)) { ReportType reportType = (la.getType() == BCAnnotationType.INLINE_SUCCESS) ? ReportType.INLINE_SUCCESS : ReportType.INLINE_FAILURE; Report report = new Report(currentMember, compilation.getIndex(), bci, la.getAnnotation(), reportType, 0, la.getMetaData()); reportList.add(report); } } } } } catch (AnnotationException e) { e.printStackTrace(); } } } } private boolean filterLineAnnotation(LineAnnotation la, IMetaMember child) { boolean result = false; if (la.getType() == BCAnnotationType.INLINE_FAIL || la.getType() == BCAnnotationType.INLINE_SUCCESS) { Object metaData = la.getMetaData(); if (metaData != null && metaData instanceof IMetaMember) { if (child.equals(metaData)) { result = true; } } } return result; } @Override public void visitTag(Tag parseTag, IParseDictionary parseDictionary) throws LogParseException { } }