/*
* Copyright (c) 2013-2015 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.toplist;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_NAME;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_REASON;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_PARSE_HIR;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_BC;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_BRANCH;
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_FAIL;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_INLINE_SUCCESS;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_KLASS;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PARSE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PARSE_DONE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PHASE;
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_METHOD;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_CALL;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_INTRINSIC;
import java.util.HashMap;
import java.util.Map;
import org.adoptopenjdk.jitwatch.compilation.CompilationUtil;
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.util.StringUtil;
public class InliningFailReasonTopListVisitable extends AbstractTopListVisitable
{
private final Map<String, Integer> reasonCountMap;
public InliningFailReasonTopListVisitable(IReadOnlyJITDataModel model, boolean sortHighToLow)
{
super(model, sortHighToLow);
reasonCountMap = new HashMap<>();
ignoreTags.add(TAG_BC);
ignoreTags.add(TAG_KLASS);
ignoreTags.add(TAG_TYPE);
ignoreTags.add(TAG_METHOD);
ignoreTags.add(TAG_CALL);
ignoreTags.add(TAG_INTRINSIC);
ignoreTags.add(TAG_UNCOMMON_TRAP);
ignoreTags.add(TAG_PARSE_DONE);
ignoreTags.add(TAG_BRANCH);
ignoreTags.add(TAG_CAST_UP);
ignoreTags.add(TAG_INLINE_SUCCESS);
ignoreTags.add(TAG_DIRECT_CALL);
ignoreTags.add(TAG_PREDICTED_CALL);
ignoreTags.add(TAG_DEPENDENCY);
}
@Override
public void visit(IMetaMember metaMember)
{
if (metaMember != null && metaMember.isCompiled())
{
try
{
for (Compilation compilation : metaMember.getCompilations())
{
CompilationUtil.visitParseTagsOfCompilation(compilation, this);
}
}
catch (LogParseException e)
{
logger.error("Error building inlining stats", e);
}
}
}
private void processParseTag(Tag parseTag)
{
for (Tag child : parseTag.getChildren())
{
String tagName = child.getName();
Map<String, String> attrs = child.getAttributes();
switch (tagName)
{
case TAG_INLINE_FAIL:
{
String reason = attrs.get(ATTR_REASON);
reason = StringUtil.replaceXMLEntities(reason);
if (reasonCountMap.containsKey(reason))
{
int count = reasonCountMap.get(reason);
reasonCountMap.put(reason, count + 1);
}
else
{
reasonCountMap.put(reason, 1);
}
break;
}
case TAG_PARSE:
{
processParseTag(child);
break;
}
case TAG_PHASE:
{
String phaseName = attrs.get(ATTR_NAME);
if (S_PARSE_HIR.equals(phaseName))
{
processParseTag(child);
}
else
{
logger.warn("Don't know how to handle phase {}", phaseName);
}
break;
}
default:
handleOther(child);
break;
}
}
}
@Override
public void postProcess()
{
for (Map.Entry<String, Integer> entry : reasonCountMap.entrySet())
{
topList.add(new StringTopListScore(entry.getKey(), entry.getValue().longValue()));
}
}
@Override
public void visitTag(Tag parseTag, IParseDictionary parseDictionary) throws LogParseException
{
processParseTag(parseTag);
}
}