From 49f08bc8db19db75223e263cf42f0bdb3b94fe89 Mon Sep 17 00:00:00 2001 From: Chris Newland Date: Sat, 10 Jan 2015 23:02:21 +0000 Subject: [PATCH] Fixed bug parsing bytecode annotations when method is --- .../jitwatch/core/JITWatchConfig.java | 5 +- .../jitwatch/core/JITWatchConstants.java | 2 + .../jitwatch/jarscan/JarScan.java | 3 +- .../jitwatch/journal/JournalUtil.java | 54 +++++++++++-------- .../jitwatch/model/MemberSignatureParts.java | 6 +-- .../bytecode/BytecodeAnnotationBuilder.java | 10 ++++ .../jitwatch/ui/sandbox/SandboxStage.java | 3 +- .../adoptopenjdk/jitwatch/util/ParseUtil.java | 9 +--- src/main/resources/examples/SandboxTest.java | 7 --- .../resources/examples/SandboxTestLoad.java | 21 -------- .../examples/SimpleInliningTest.java | 28 ++++++++++ 11 files changed, 84 insertions(+), 64 deletions(-) delete mode 100644 src/main/resources/examples/SandboxTest.java delete mode 100644 src/main/resources/examples/SandboxTestLoad.java create mode 100644 src/main/resources/examples/SimpleInliningTest.java diff --git a/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConfig.java b/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConfig.java index b216eac9..a5b76aac 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConfig.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConfig.java @@ -305,7 +305,10 @@ public void unmarshalPropertiesToConfig() intelMode = loadBooleanFromProperty(loadedProps, KEY_SANDBOX_INTEL_MODE, false); - int tieredMode = Integer.parseInt(getProperty(loadedProps, KEY_SANDBOX_TIERED_MODE, "0")); + // TODO I'm forcing no tiered compilation in sandbox until this fix for the LogCompilation output goes live + // http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8049532 + // http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2014-June/014911.html + int tieredMode = Integer.parseInt(getProperty(loadedProps, KEY_SANDBOX_TIERED_MODE, "2")); switch (tieredMode) { diff --git a/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConstants.java b/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConstants.java index f423fe29..2893d8b1 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConstants.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/core/JITWatchConstants.java @@ -248,6 +248,8 @@ public static final Set getAutoGeneratedClassPrefixes() public static final String S_BYTECODE_LOCALVARIABLETABLE = "LocalVariableTable:"; public static final String S_BYTECODE_STACKMAPTABLE = "StackMapTable:"; + public static final String S_CONSTRUCTOR_INIT = ""; + public static final String S_STATIC_INIT = ""; public static final String S_BYTECODE_STATIC_INITIALISER_SIGNATURE = "static {}"; public static final String PUBLIC = "public"; diff --git a/src/main/java/org/adoptopenjdk/jitwatch/jarscan/JarScan.java b/src/main/java/org/adoptopenjdk/jitwatch/jarscan/JarScan.java index a9f49239..ef2eb100 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/jarscan/JarScan.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/jarscan/JarScan.java @@ -19,7 +19,6 @@ import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeInstruction; import org.adoptopenjdk.jitwatch.model.bytecode.ClassBC; import org.adoptopenjdk.jitwatch.model.bytecode.MemberBytecode; -import org.adoptopenjdk.jitwatch.util.ParseUtil; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.*; @@ -75,7 +74,7 @@ private static void process(List classLocations, String className, int m MemberSignatureParts msp = memberBytecode.getMemberSignatureParts(); - if (bcSize >= maxMethodBytes && !ParseUtil.STATIC_INIT.equals(msp.getMemberName())) + if (bcSize >= maxMethodBytes && !S_STATIC_INIT.equals(msp.getMemberName())) { writer.print(C_DOUBLE_QUOTE); writer.print(className); diff --git a/src/main/java/org/adoptopenjdk/jitwatch/journal/JournalUtil.java b/src/main/java/org/adoptopenjdk/jitwatch/journal/JournalUtil.java index 79d0e0e1..b7257141 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/journal/JournalUtil.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/journal/JournalUtil.java @@ -5,19 +5,8 @@ */ package org.adoptopenjdk.jitwatch.journal; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_BUILDIR; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_COMPILE_KIND; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_HOLDER; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_METHOD; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_NAME; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_PARSE; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C2N; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_DOT; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_SLASH; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.DEBUG_LOGGING; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_NMETHOD; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PARSE; -import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PHASE; +import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.*; + import java.util.List; @@ -74,6 +63,11 @@ public static void visitParseTagsOfLastTask(IMetaMember member, ILastTaskParseTa { List parseTags = parsePhase.getNamedChildren(TAG_PARSE); + if (DEBUG_LOGGING) + { + logger.debug("About to visit {} parse tags in last of Journal", parseTags.size()); + } + for (Tag parseTag : parseTags) { visitable.visitParseTag(parseTag, parseDictionary); @@ -141,8 +135,8 @@ public static boolean memberMatchesParseTag(IMetaMember member, Tag parseTag, IP } String klassAttrName = klassTag.getAttribute(ATTR_NAME); - String methodAttrName = methodTag.getAttribute(ATTR_NAME); - + String methodAttrName = methodTag.getAttribute(ATTR_NAME).replace(S_ENTITY_LT, S_OPEN_ANGLE).replace(S_ENTITY_GT, S_CLOSE_ANGLE); + if (klassAttrName != null) { klassAttrName = klassAttrName.replace(C_SLASH, C_DOT); @@ -153,13 +147,24 @@ public static boolean memberMatchesParseTag(IMetaMember member, Tag parseTag, IP if (DEBUG_LOGGING) { - logger.debug("memberName: {}", member.getMemberName()); - logger.debug("metaClass : {}", member.getMetaClass().getFullyQualifiedName()); + logger.debug("memberName: {}/{}", member.getMemberName(), methodAttrName); + logger.debug("metaClass : {}/{}", member.getMetaClass().getFullyQualifiedName(), klassAttrName); logger.debug("return : {}/{}", member.getReturnTypeName(), returnType); - logger.debug("params : {}/{}", StringUtil.arrayToString(member.getParamTypeNames()), StringUtil.listToString(paramTypes)); + logger.debug("params : {}/{}", StringUtil.arrayToString(member.getParamTypeNames()), + StringUtil.listToString(paramTypes)); } - boolean nameMatches = member.getMemberName().equals(methodAttrName); + boolean nameMatches; + + if (S_CONSTRUCTOR_INIT.equals(methodAttrName)) + { + nameMatches = member.getMemberName().equals(klassAttrName); + } + else + { + nameMatches = member.getMemberName().equals(methodAttrName); + } + boolean klassMatches = member.getMetaClass().getFullyQualifiedName().equals(klassAttrName); boolean returnMatches = member.getReturnTypeName().equals(returnType); @@ -172,7 +177,8 @@ public static boolean memberMatchesParseTag(IMetaMember member, Tag parseTag, IP String memberParamType = member.getParamTypeNames()[pos]; String tagParamType = paramTypes.get(pos); - //logger.debug("checking: {}/{}", memberParamType, tagParamType); + // logger.debug("checking: {}/{}", memberParamType, + // tagParamType); if (!memberParamType.equals(tagParamType)) { @@ -188,7 +194,13 @@ public static boolean memberMatchesParseTag(IMetaMember member, Tag parseTag, IP result = nameMatches && klassMatches && returnMatches && paramsMatch; - //logger.debug("result: {}", result); + if (DEBUG_LOGGING) + { + logger.debug("Matched name: {} klass: {} return: {} params: {}", nameMatches, klassMatches, returnMatches, + paramsMatch); + + logger.debug("Matches member:{} = {}", member, result); + } } } diff --git a/src/main/java/org/adoptopenjdk/jitwatch/model/MemberSignatureParts.java b/src/main/java/org/adoptopenjdk/jitwatch/model/MemberSignatureParts.java index e715ffa4..2e271dea 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/model/MemberSignatureParts.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/model/MemberSignatureParts.java @@ -94,7 +94,7 @@ private static void completeSignature(String origSig, MemberSignatureParts msp) if (msp.memberName != null) { // Constructors will return void for returnType - if (ParseUtil.CONSTRUCTOR_INIT.equals(msp.memberName) || msp.memberName.equals(msp.fullyQualifiedClassName)) + if (S_CONSTRUCTOR_INIT.equals(msp.memberName) || msp.memberName.equals(msp.fullyQualifiedClassName)) { msp.memberName = msp.fullyQualifiedClassName; msp.returnType = Void.TYPE.getName(); @@ -150,7 +150,7 @@ private static boolean isStaticInitialiser(String bytecodeSignature) { boolean isClinit = false; - if (bytecodeSignature != null && bytecodeSignature.startsWith(ParseUtil.STATIC_BYTECODE_SIGNATURE)) + if (bytecodeSignature != null && bytecodeSignature.startsWith(S_BYTECODE_STATIC_INITIALISER_SIGNATURE)) { isClinit = true; } @@ -177,7 +177,7 @@ public static MemberSignatureParts fromBytecodeSignature(String fqClassName, Str if (isStaticInitialiser(toParse)) { - msp.memberName = ParseUtil.STATIC_INIT; + msp.memberName = S_STATIC_INIT; msp.returnType = Void.TYPE.getName(); return msp; diff --git a/src/main/java/org/adoptopenjdk/jitwatch/model/bytecode/BytecodeAnnotationBuilder.java b/src/main/java/org/adoptopenjdk/jitwatch/model/bytecode/BytecodeAnnotationBuilder.java index 2d6cc0f9..8f239ed9 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/model/bytecode/BytecodeAnnotationBuilder.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/model/bytecode/BytecodeAnnotationBuilder.java @@ -107,6 +107,11 @@ public void visitParseTag(Tag parseTag, IParseDictionary parseDictionary) throws private void buildParseTagAnnotations(Tag parseTag, Map result, List instructions, CompilerName compilerName) throws AnnotationException { + if (DEBUG_LOGGING) + { + logger.debug("Building parse tag annotations"); + } + List children = parseTag.getChildren(); int currentBytecode = -1; @@ -128,6 +133,11 @@ private void buildParseTagAnnotations(Tag parseTag, Map { String name = child.getName(); Map tagAttrs = child.getAttrs(); + + if (DEBUG_LOGGING) + { + logger.debug("Examining child tag {}", child); + } switch (name) { diff --git a/src/main/java/org/adoptopenjdk/jitwatch/ui/sandbox/SandboxStage.java b/src/main/java/org/adoptopenjdk/jitwatch/ui/sandbox/SandboxStage.java index e11676d4..4b9efb3e 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/ui/sandbox/SandboxStage.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/ui/sandbox/SandboxStage.java @@ -408,8 +408,7 @@ private void loadDefaultEditors() { tabPane.getTabs().clear(); - addEditor(new File(Sandbox.SANDBOX_SOURCE_DIR.toFile(), "SandboxTest.java")); - addEditor(new File(Sandbox.SANDBOX_SOURCE_DIR.toFile(), "SandboxTestLoad.java")); + addEditor(new File(Sandbox.SANDBOX_SOURCE_DIR.toFile(), "SimpleInliningTest.java")); saveEditorPaneConfig(); } diff --git a/src/main/java/org/adoptopenjdk/jitwatch/util/ParseUtil.java b/src/main/java/org/adoptopenjdk/jitwatch/util/ParseUtil.java index b05e8c11..7540e6db 100644 --- a/src/main/java/org/adoptopenjdk/jitwatch/util/ParseUtil.java +++ b/src/main/java/org/adoptopenjdk/jitwatch/util/ParseUtil.java @@ -39,11 +39,6 @@ public final class ParseUtil private static final Pattern PATTERN_LOG_SIGNATURE = Pattern.compile("^([0-9\\p{L}\\.\\$_]+) " + METHOD_NAME_REGEX_GROUP + " (\\(.*\\))(.*)"); - public static final String SQUARE_BRACKET_PAIR = "[]"; - public static final String CONSTRUCTOR_INIT = ""; - public static final String STATIC_INIT = ""; - public static final String STATIC_BYTECODE_SIGNATURE = "static {}"; - public static final String NAME_SHORT = "short"; public static final String NAME_CHARACTER = "char"; public static final String NAME_BYTE = "byte"; @@ -193,7 +188,7 @@ public static String expandParameterType(String name) for (int i = 0; i < arrayDepth; i++) { - builder.append(SQUARE_BRACKET_PAIR); + builder.append(S_ARRAY_BRACKET_PAIR); } return builder.toString(); @@ -782,7 +777,7 @@ else if (mspTypeName != null) public static String getParamTypeWithoutArrayBrackets(String paramType) { - int bracketsIndex = paramType.indexOf(SQUARE_BRACKET_PAIR); + int bracketsIndex = paramType.indexOf(S_ARRAY_BRACKET_PAIR); if (bracketsIndex != -1) { diff --git a/src/main/resources/examples/SandboxTest.java b/src/main/resources/examples/SandboxTest.java deleted file mode 100644 index 1a51185b..00000000 --- a/src/main/resources/examples/SandboxTest.java +++ /dev/null @@ -1,7 +0,0 @@ -public class SandboxTest -{ - public int add(int a, int b) - { - return a + b; - } -} diff --git a/src/main/resources/examples/SandboxTestLoad.java b/src/main/resources/examples/SandboxTestLoad.java deleted file mode 100644 index baa599da..00000000 --- a/src/main/resources/examples/SandboxTestLoad.java +++ /dev/null @@ -1,21 +0,0 @@ -// The Sandbox is designed to get you started with learning -// about the HotSpot JIT compiler. It is not a substitute -// for a well-designed benchmarking framework such as JMH. -// http://openjdk.java.net/projects/code-tools/jmh - -public class SandboxTestLoad -{ - public static void main(String[] args) - { - SandboxTest test = new SandboxTest(); - - int sum = 0; - - for (int i = 0 ; i < 1_000_000; i++) - { - sum = test.add(sum, 1); - } - - System.out.println("Sum:" + sum); - } -} \ No newline at end of file diff --git a/src/main/resources/examples/SimpleInliningTest.java b/src/main/resources/examples/SimpleInliningTest.java new file mode 100644 index 00000000..978a00e2 --- /dev/null +++ b/src/main/resources/examples/SimpleInliningTest.java @@ -0,0 +1,28 @@ +// The Sandbox is designed to help you learn about the HotSpot JIT compilers. +// Please note that the JIT compilers may behave differently when isolating a method +// in the Sandbox compared to running your whole application. + +public class SimpleInliningTest +{ + public SimpleInliningTest() + { + int sum = 0; + + for (int i = 0 ; i < 1_000_000; i++) + { + sum = this.add(sum, 1); + } + + System.out.println("Sum:" + sum); + } + + public int add(int a, int b) + { + return a + b; + } + + public static void main(String[] args) + { + new SimpleInliningTest(); + } +} \ No newline at end of file