From b316d44fdb91ec27772ee260bb2854296db02e33 Mon Sep 17 00:00:00 2001 From: Codrut Stancu Date: Tue, 25 Feb 2025 14:05:40 +0100 Subject: [PATCH] Sort fields by kind and name to ensure stable order. --- .../src/com/oracle/graal/pointsto/api/HostVM.java | 4 ++++ .../com/oracle/graal/pointsto/meta/AnalysisField.java | 1 + .../com/oracle/graal/pointsto/meta/AnalysisType.java | 11 ++++++++++- .../src/com/oracle/svm/hosted/SVMHost.java | 9 +++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/api/HostVM.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/api/HostVM.java index b3e03cb5906a..09a89f1f05e0 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/api/HostVM.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/api/HostVM.java @@ -299,6 +299,10 @@ public boolean platformSupported(AnnotatedElement element) { return true; } + public boolean sortFields() { + return false; + } + public void clearInThread() { } diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisField.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisField.java index 46357c43ccf7..d3b2fc6b1cca 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisField.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisField.java @@ -408,6 +408,7 @@ public String getName() { } public void setPosition(int newPosition) { + AnalysisError.guarantee(position == -1 || newPosition == position, "Position already set for field %s, old position: %d, new position: %d", this, position, newPosition); this.position = newPosition; } 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 9333b6823302..0b7f4145db2f 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 @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -1227,8 +1228,16 @@ private ResolvedJavaField[] initializeInstanceFields(boolean includeSuperclasses return result; } + static final Comparator FIELD_COMPARATOR = Comparator.comparing(ResolvedJavaField::getJavaKind).thenComparing(ResolvedJavaField::getName); + private ResolvedJavaField[] convertFields(ResolvedJavaField[] originals, List list, boolean listIncludesSuperClassesFields) { - for (ResolvedJavaField original : originals) { + ResolvedJavaField[] localOriginals = originals; + if (universe.hostVM.sortFields()) { + /* Clone the originals; it is a reference to the wrapped type's instanceFields array. */ + localOriginals = originals.clone(); + Arrays.sort(localOriginals, FIELD_COMPARATOR); + } + for (ResolvedJavaField original : localOriginals) { if (!original.isInternal() && universe.hostVM.platformSupported(original)) { try { AnalysisField aField = universe.lookup(original); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java index 932e4a447ae1..102936e10e56 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java @@ -933,6 +933,15 @@ private void initializeExcludedFields() { excludedFields.add(ReflectionUtil.lookupField(NativeLibraries.class, "nativeLibraryLockMap")); } + @Override + public boolean sortFields() { + /* + * If building layered images sort the fields by kind and name to ensure stable order. + * Sorting fields in general may lead to some issues. (GR-62599) + */ + return ImageLayerBuildingSupport.buildingImageLayer(); + } + /** * This method cannot use an {@link AnalysisField} because it is used before the analysis is set * up.