# HG changeset patch # User ecaspole # Date 1564581326 14400 # Node ID 6945659985312f952ef3c8f1047364f467e41297 # Parent f9d9bed12d1a14c00b327206446b8ae458596849 8228674: LogCompilation: Improvements to log compare feature Summary: Show compiler and level in compare output Reviewed-by: kvn, thartmann diff -r f9d9bed12d1a -r 694565998531 src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/CallSite.java --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/CallSite.java Wed Jul 31 06:54:50 2019 -0400 +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/CallSite.java Wed Jul 31 09:55:26 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -185,7 +185,10 @@ stream.print(" @ " + getBci() + " " + m + " " + getReason()); } stream.print(getIntrinsicOrEmptyString()); - stream.printf(" (end time: %6.4f", getTimeStamp()); + if (LogCompilation.compare == false) { + // The timestamp is not useful for log comparison + stream.printf(" (end time: %6.4f", getTimeStamp()); + } if (getEndNodes() > 0) { stream.printf(" nodes: %d live: %d", getEndNodes(), getEndLiveNodes()); } diff -r f9d9bed12d1a -r 694565998531 src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Compilation.java --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Compilation.java Wed Jul 31 06:54:50 2019 -0400 +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Compilation.java Wed Jul 31 09:55:26 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -83,9 +83,9 @@ private String special; /** - * The name of the compiler performing this compilation. + * The compilation level for this task. */ - private String compiler; + private long level; /** * Start time stamp. @@ -152,12 +152,12 @@ return start; } - public void setCompiler(String compiler) { - this.compiler = compiler; - } - public String getCompiler() { - return compiler; + assert getNMethod() != null || getFailureReason() != null : "Null nmethod for Compilation:" + getId() + " " + getMethod(); + if (getNMethod() != null) { + getNMethod().getCompiler(); + } + return ""; } @Override @@ -194,7 +194,7 @@ stream.println(getSpecial()); } else { int bc = isOsr() ? getBCI() : -1; - stream.print(getId() + getMethod().decodeFlags(bc) + " " + compiler + " " + getMethod().format(bc)); + stream.print(getId() + getMethod().decodeFlags(bc) + " " + getCompiler() + " " + getMethod().format(bc)); } } @@ -222,7 +222,7 @@ } } int bc = isOsr() ? getBCI() : -1; - stream.print(getMethod().decodeFlags(bc) + " " + compiler + " " + getMethod().format(bc)); + stream.print(getMethod().decodeFlags(bc) + " " + getCompiler() + " " + getMethod().format(bc)); stream.println(); if (getFailureReason() != null) { stream.println("COMPILE SKIPPED: " + getFailureReason() + " (not retryable)"); @@ -365,4 +365,21 @@ public Compilation getCompilation() { return this; } + + /** + * @return the level + */ + public long getLevel() { + return level; + } + + /** + * @param level the level to set + */ + public void setLevel(long level) { + this.level = level; + if (getMethod() != null) { + getMethod().setLevel(level); + } + } } diff -r f9d9bed12d1a -r 694565998531 src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogCompilation.java --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogCompilation.java Wed Jul 31 06:54:50 2019 -0400 +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogCompilation.java Wed Jul 31 09:55:26 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,6 +66,11 @@ } /** + * compare controls how some output is formatted + */ + public static boolean compare = false; + + /** * Process command line arguments, parse log files and trigger desired * functionality. */ @@ -76,7 +81,6 @@ boolean cleanup = false; boolean trapHistory = false; boolean printTimeStamps = false; - boolean compare = false; boolean printID = true; int index = 0; @@ -254,24 +258,29 @@ * {@linkplain #compareLogs() comparing logs}. */ static class MethodBCIPair { - public MethodBCIPair(Method m, int b, String c) { + public MethodBCIPair(Method m, int b, String c, long l) { method = m; bci = b; compiler = c; + level = l; } Method method; int bci; String compiler; + long level; public boolean equals(Object other) { if (!(other instanceof MethodBCIPair)) { return false; } MethodBCIPair otherp = (MethodBCIPair)other; + assert otherp.compiler != null : "otherp null compiler: " + otherp; + assert method.getCompiler() != compiler : "Compiler doesnt match"; return (otherp.bci == bci && otherp.method.equals(method) && - otherp.compiler.equals(compiler)); + otherp.compiler.equals(compiler) && + otherp.level == level); } public int hashCode() { @@ -282,7 +291,7 @@ if (bci != -1) { return method + "@" + bci + " (" + compiler + ")"; } else { - return method + " (" + compiler + ")"; + return method + " (" + compiler + "(" + level + "))"; } } } @@ -322,8 +331,23 @@ for (LogEvent c : events) { if (c instanceof Compilation) { Compilation comp = (Compilation) c; - MethodBCIPair key = new MethodBCIPair(comp.getMethod(), comp.getBCI(), - comp.getCompiler()); + assert (comp.getNMethod() != null || comp.getFailureReason() != null ): "NMethod is null in compare: " + comp; + String compiler = comp.getNMethod() != null ? comp.getNMethod().getCompiler() : + (comp.getCompiler() != null ? comp.getCompiler() : ""); + assert compiler != null : "Compiler is null in compare: " + comp; + long level = -99; + if (comp.getLevel() == 0) { + if (comp.getNMethod() != null) { + level = comp.getNMethod().getLevel(); + } + if (level == 0) { + level = comp.getMethod().getLevel(); + } + } else { + level = comp.getLevel(); + } + assert level != -99 || comp.getFailureReason() != null : "Failed Compile"; + MethodBCIPair key = new MethodBCIPair(comp.getMethod(), comp.getBCI(), compiler, level); MethodBCIPair e = methods.get(key); if (e == null) { methods.put(key, key); diff -r f9d9bed12d1a -r 694565998531 src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogParser.java --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogParser.java Wed Jul 31 06:54:50 2019 -0400 +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogParser.java Wed Jul 31 09:55:26 2019 -0400 @@ -866,11 +866,11 @@ compile.setBCount(search(atts, "backedge_count", "0")); compile.setBCI(Integer.parseInt(search(atts, "osr_bci", "-1"))); String compiler = atts.getValue("compiler"); - if (compiler == null) { - compiler = ""; + assert compiler == null : "Compiler is not specified in task"; + long level = parseLong(search(atts, "level", "0")); + if (level != 0) { + compile.setLevel(level); } - compile.setCompiler(compiler); - // Extract the name of the compiled method. String[] parts = spacePattern.split(atts.getValue("method")); String methodName = parts[0] + "::" + parts[1]; @@ -896,6 +896,7 @@ m.setSignature(parts[2]); m.setFlags("0"); m.setBytes(search(atts, "bytes", "unknown")); + m.setLevel(compile.getLevel()); compile.setMethod(m); events.add(compile); compiles.put(id, compile); @@ -932,6 +933,12 @@ m.setIICount(search(atts, "iicount")); m.setFlags(search(atts, "flags")); } + String compiler = search(atts, "compiler", ""); + m.setCompiler(compiler); + long level = parseLong(search(atts, "level", "0")); + if (level != 0) { + m.setLevel(level); + } methods.put(id, m); } else if (qname.equals("call")) { if (methodHandleSite != null) { @@ -1100,6 +1107,8 @@ if (level != null) { nm.setLevel(parseLong(level)); } + String compiler = search(atts, "compiler", ""); + nm.setCompiler(compiler); nmethods.put(id, nm); events.add(nm); } else if (qname.equals("parse")) { diff -r f9d9bed12d1a -r 694565998531 src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Method.java --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Method.java Wed Jul 31 06:54:50 2019 -0400 +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Method.java Wed Jul 31 09:55:26 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -71,6 +71,16 @@ private String flags; /** + * The name of the compiler performing this compilation. + */ + private String compiler; + + /** + * The nmethod's compilation level. + */ + private long level; + + /** * Decode the {@link flags} numerical string to a format for console * output. The result does not honour all possible flags but includes * information about OSR compilation. @@ -186,4 +196,33 @@ public int hashCode() { return holder.hashCode() ^ name.hashCode(); } + + /** + * @return the compiler + */ + public String getCompiler() { + return compiler; + } + + /** + * @param compiler the compiler to set + */ + public void setCompiler(String compiler) { + this.compiler = compiler; + } + + /** + * @return the level + */ + public long getLevel() { + return level; + } + + /** + * @param level the level to set + */ + public void setLevel(long level) { + assert this.level == 0 || this.level == level; + this.level = level; + } } diff -r f9d9bed12d1a -r 694565998531 src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/NMethod.java --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/NMethod.java Wed Jul 31 06:54:50 2019 -0400 +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/NMethod.java Wed Jul 31 09:55:26 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,6 +47,11 @@ */ private long level; + /** + * The name of the compiler performing this compilation. + */ + private String compiler; + NMethod(double s, String i, long a, long sz) { super(s, i); address = a; @@ -85,6 +90,21 @@ * @param level the level to set */ public void setLevel(long level) { + assert this.level == 0 || this.level == level; this.level = level; } + + /** + * @return the compiler + */ + public String getCompiler() { + return compiler; + } + + /** + * @param compiler the compiler to set + */ + public void setCompiler(String compiler) { + this.compiler = compiler; + } } diff -r f9d9bed12d1a -r 694565998531 src/utils/LogCompilation/src/test/java/com/sun/hotspot/tools/compiler/TestCompare.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/utils/LogCompilation/src/test/java/com/sun/hotspot/tools/compiler/TestCompare.java Wed Jul 31 09:55:26 2019 -0400 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +package com.sun.hotspot.tools.compiler; + +import java.util.Arrays; +import java.util.Collection; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(value = Parameterized.class) +public class TestCompare { + + String logFile; + + static final String setupArgsTieredVersion[] = { + "java", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+LogCompilation", + "-XX:LogFile=target/tiered_version.log", + "-version" + }; + + static final String setupArgsTieredVersion2[] = { + "java", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+LogCompilation", + "-XX:LogFile=target/tiered_version.log.2", + "-version" + }; + + static final String setupArgsNoTiered[] = { + "java", + "-XX:-TieredCompilation", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+LogCompilation", + "-XX:LogFile=target/no_tiered_short.log" + }; + + static final String setupArgsNoTiered2[] = { + "java", + "-XX:-TieredCompilation", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+LogCompilation", + "-XX:LogFile=target/no_tiered_short.log.2" + }; + + static final String allSetupArgs[][] = { + setupArgsTieredVersion, + setupArgsTieredVersion2, + setupArgsNoTiered, + setupArgsNoTiered2 + }; + + @Parameters + public static Collection data() { + Object[][] data = new Object[][]{ + // Take care these match whats created in the setup method + {"./target/tiered_version.log"}, + {"./target/no_tiered_short.log"} + }; + assert data.length == (allSetupArgs.length/2) : "Files dont match args. Need 2 inputs per test case."; + return Arrays.asList(data); + } + + @BeforeClass + public static void setup() { + try { + for (String[] setupArgs : allSetupArgs) { + Process p = Runtime.getRuntime().exec(setupArgs); + p.waitFor(); + } + } catch (Exception e) { + System.out.println(e + ": exec failed:" + setupArgsNoTiered[0]); + } + } + + public TestCompare(String logFile) { + this.logFile = logFile; + } + + @Test + public void testDashC() throws Exception { + String[] args = {"-C", + logFile, + logFile + ".2" + }; + + LogCompilation.main(args); + } + +}