From a5ef94ddcbfd51e5d38fb1a1dab64b652dafa18c Mon Sep 17 00:00:00 2001 From: Maja Skoko Date: Wed, 17 May 2023 17:46:56 +0200 Subject: [PATCH 1/3] Fields sorting in HostedUniverse. --- .../src/com/oracle/svm/hosted/meta/HostedUniverse.java | 2 ++ .../src/com/oracle/svm/hosted/meta/UniverseBuilder.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedUniverse.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedUniverse.java index e940c2b73cf0..f5ec592685eb 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedUniverse.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedUniverse.java @@ -630,5 +630,7 @@ public int compare(HostedMethod o1, HostedMethod o2) { * keeps the order unchanged and therefore keeps the field order we get from the hosting VM. */ static final Comparator FIELD_COMPARATOR_RELAXED = Comparator.comparing(HostedField::getJavaKind).reversed(); + static final Comparator FIELD_COMPARATOR_RELAXED_WITH_NAME = Comparator.comparing(HostedField::getJavaKind).reversed() + .thenComparing(m -> m.getDeclaringClass().wrapped.getComparableName()).thenComparing(HostedField::getName); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/UniverseBuilder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/UniverseBuilder.java index 812b61c95bac..68da148e8199 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/UniverseBuilder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/UniverseBuilder.java @@ -197,7 +197,7 @@ public void build(DebugContext debug) { hUniverse.orderedMethods = new ArrayList<>(hUniverse.methods.values()); Collections.sort(hUniverse.orderedMethods, HostedUniverse.METHOD_COMPARATOR); hUniverse.orderedFields = new ArrayList<>(hUniverse.fields.values()); - Collections.sort(hUniverse.orderedFields, HostedUniverse.FIELD_COMPARATOR_RELAXED); + Collections.sort(hUniverse.orderedFields, HostedUniverse.FIELD_COMPARATOR_RELAXED_WITH_NAME); profilingInformationBuildTask.join(); } } @@ -637,7 +637,7 @@ private void layoutStaticFields() { } // Sort so that a) all Object fields are consecutive, and b) bigger types come first. - Collections.sort(fields, HostedUniverse.FIELD_COMPARATOR_RELAXED); + Collections.sort(fields, HostedUniverse.FIELD_COMPARATOR_RELAXED_WITH_NAME); ObjectLayout layout = ConfigurationValues.getObjectLayout(); From 97e4309369ea857bbfb99122d651e33e104a0df6 Mon Sep 17 00:00:00 2001 From: Maja Skoko Date: Wed, 7 Jun 2023 11:38:23 +0200 Subject: [PATCH 2/3] Deterministic sort for compilations with non-unique name. --- .../com/oracle/svm/hosted/image/NativeImageCodeCache.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java index 41c19cefd759..d87b4234dc88 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java @@ -165,9 +165,13 @@ public Pair getLastCompilation() { return orderedCompilations.get(orderedCompilations.size() - 1); } + protected static Comparator> compilationsComparator() { + Comparator> nameComparator = Comparator.comparing(o -> AnalysisMethod.comparingMethodNames(o.getLeft().wrapped)); + return nameComparator.thenComparing(o -> o.getRight().getTargetCodeSize()); + } + protected List> computeCompilationOrder(Map compilationMap) { - return compilationMap.entrySet().stream().map(e -> Pair.create(e.getKey(), e.getValue())).sorted(Comparator.comparing(o -> o.getLeft().wrapped.format("%H.%n(%P):%R"))) - .collect(Collectors.toList()); + return compilationMap.entrySet().stream().map(e -> Pair.create(e.getKey(), e.getValue())).sorted(compilationsComparator()).collect(Collectors.toList()); } public List> getOrderedCompilations() { From a904175ff2094c4b4224b2d38ee131f784fd2494 Mon Sep 17 00:00:00 2001 From: Maja Skoko Date: Mon, 3 Jul 2023 12:13:00 +0200 Subject: [PATCH 3/3] Comparing analysis methods and types. --- .../oracle/graal/pointsto/meta/AnalysisMethod.java | 14 ++++++++++++++ .../oracle/graal/pointsto/meta/AnalysisType.java | 10 ++++++++++ .../oracle/graal/pointsto/reports/ReportUtils.java | 2 +- .../svm/hosted/image/NativeImageCodeCache.java | 2 +- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMethod.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMethod.java index 64c5ea8d67cb..46f048b4309d 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMethod.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisMethod.java @@ -1030,4 +1030,18 @@ public boolean getReturnsAllInstantiatedTypes() { protected abstract AnalysisMethod createMultiMethod(AnalysisMethod analysisMethod, MultiMethodKey newMultiMethodKey); public abstract boolean isImplementationInvokable(); + + /** + * + * Lambda function names are still not completely deterministic e.g. in name + * Lambda$7ad16f47b695d909/0x00000007c0b4c630.accept(java.lang.Object):void hash part is not + * deterministic yet. In order to avoid comparing based on that part, we need to eliminate hash + * part from name of lambda function. To read more about Lambda names check GH issue + * https://github.com/openjdk/jdk/pull/10024/. + * + */ + public static String comparableMethodSignature(AnalysisMethod method) { + String signature = method.format("%H.%n(%P):%R"); + return signature.contains("$$Lambda") ? signature.replaceAll("/[0-9a-fA-Fx]*\\.", ".") : signature; + } } diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java index ee7d6eddebdb..198b0ae6cec7 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java @@ -874,6 +874,16 @@ public final String getName() { return wrapped.getName(); } + public final String getComparableName() { + /* + * Avoiding non-deterministic hash part of lambda names. Example of such class name e.g. + * Ljava/util/Spliterator$OfDouble$$Lambda$d28f9317da054138.0x00000007c1a64860; For more + * about Lambda names check GH issue https://github.com/openjdk/jdk/pull/10024/. + */ + String name = getName(); + return name.contains("$$Lambda") ? name.replaceAll("\\.0x[0-9a-fA-Fx]*", "") : name; + } + @Override public String toJavaName() { return qualifiedName; diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/reports/ReportUtils.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/reports/ReportUtils.java index fff11832cf30..847240fb17f1 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/reports/ReportUtils.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/reports/ReportUtils.java @@ -61,7 +61,7 @@ public class ReportUtils { public static final Comparator methodComparator = Comparator.comparing(m -> m.format("%H.%n(%P):%R")); static final Comparator fieldComparator = Comparator.comparing(f -> f.format("%H.%n")); static final Comparator invokeInfoBCIComparator = Comparator.comparing(i -> i.getPosition().getBCI()); - static final Comparator invokeInfoComparator = invokeInfoBCIComparator.thenComparing(i -> comparingMethodNames(i.getTargetMethod())); + static final Comparator invokeInfoComparator = invokeInfoBCIComparator.thenComparing(i -> AnalysisMethod.comparableMethodSignature(i.getTargetMethod())); static final Comparator positionMethodComparator = Comparator.comparing(pos -> pos.getMethod().format("%H.%n(%P):%R")); static final Comparator positionComparator = positionMethodComparator.thenComparing(pos -> pos.getBCI()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java index d87b4234dc88..c7a7625ac730 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageCodeCache.java @@ -166,7 +166,7 @@ public Pair getLastCompilation() { } protected static Comparator> compilationsComparator() { - Comparator> nameComparator = Comparator.comparing(o -> AnalysisMethod.comparingMethodNames(o.getLeft().wrapped)); + Comparator> nameComparator = Comparator.comparing(o -> AnalysisMethod.comparableMethodSignature(o.getLeft().wrapped)); return nameComparator.thenComparing(o -> o.getRight().getTargetCodeSize()); }