/*
* 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.escapeanalysis;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_CAST_UP;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_DEPENDENCY;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_DIRECT_CALL;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_INLINE_SUCCESS;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_INTRINSIC;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_KLASS;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_OBSERVE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PARSE_DONE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PHASE_DONE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PREDICTED_CALL;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_TYPE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_UNCOMMON_TRAP;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_VIRTUAL_CALL;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_ASSERT_NULL;
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.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 abstract class AbstractEscapeAnalysisWalker extends AbstractReportBuilder
{
private BytecodeAnnotationBuilder bcAnnotationBuilder;
public AbstractEscapeAnalysisWalker(IReadOnlyJITDataModel model)
{
super(model);
ignoreTags.add(TAG_KLASS);
ignoreTags.add(TAG_TYPE);
ignoreTags.add(TAG_DEPENDENCY);
ignoreTags.add(TAG_PARSE_DONE);
ignoreTags.add(TAG_DIRECT_CALL);
ignoreTags.add(TAG_PHASE_DONE);
ignoreTags.add(TAG_INLINE_SUCCESS);
ignoreTags.add(TAG_UNCOMMON_TRAP);
ignoreTags.add(TAG_INTRINSIC);
ignoreTags.add(TAG_PREDICTED_CALL);
ignoreTags.add(TAG_VIRTUAL_CALL);
ignoreTags.add(TAG_CAST_UP);
ignoreTags.add(TAG_OBSERVE);
ignoreTags.add(TAG_ASSERT_NULL);
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();
boolean inlineAtBCI = hasInlineSuccessAnnotation(lineAnnotations);
for (LineAnnotation la : lineAnnotations)
{
if (filterLineAnnotation(la))
{
ReportType type = inlineAtBCI ? ReportType.ELIMINATED_ALLOCATION_INLINE
: ReportType.ELIMINATED_ALLOCATION_DIRECT;
Report report = new Report(currentMember, compilation.getIndex(), bci, la.getAnnotation(), type,
0, la.getMetaData());
reportList.add(report);
}
}
}
}
}
catch (AnnotationException e)
{
e.printStackTrace();
}
}
}
}
protected abstract boolean filterLineAnnotation(LineAnnotation la);
private boolean hasInlineSuccessAnnotation(List<LineAnnotation> annotations)
{
boolean result = false;
for (LineAnnotation la : annotations)
{
switch (la.getType())
{
case INLINE_SUCCESS:
result = true;
break;
default:
break;
}
}
return result;
}
@Override
public void visitTag(Tag parseTag, IParseDictionary parseDictionary) throws LogParseException
{
}
}