2727import org .graalvm .compiler .word .Word ;
2828import org .graalvm .word .Pointer ;
2929
30- import com .oracle .svm .core .SubstrateOptions ;
3130import com .oracle .svm .core .annotate .Uninterruptible ;
3231import com .oracle .svm .core .annotate .UnknownObjectField ;
3332
@@ -42,18 +41,15 @@ public final class ImageHeapInfo {
4241 @ UnknownObjectField (types = Object .class ) public Object firstReadOnlyReferenceObject ;
4342 @ UnknownObjectField (types = Object .class ) public Object lastReadOnlyReferenceObject ;
4443
44+ @ UnknownObjectField (types = Object .class ) public Object firstReadOnlyRelocatableObject ;
45+ @ UnknownObjectField (types = Object .class ) public Object lastReadOnlyRelocatableObject ;
46+
4547 @ UnknownObjectField (types = Object .class ) public Object firstWritablePrimitiveObject ;
4648 @ UnknownObjectField (types = Object .class ) public Object lastWritablePrimitiveObject ;
4749
4850 @ UnknownObjectField (types = Object .class ) public Object firstWritableReferenceObject ;
4951 @ UnknownObjectField (types = Object .class ) public Object lastWritableReferenceObject ;
5052
51- @ UnknownObjectField (types = Object .class ) public Object firstReadOnlyObject ;
52- @ UnknownObjectField (types = Object .class ) public Object lastReadOnlyObject ;
53-
54- @ UnknownObjectField (types = Object .class ) public Object firstWritableObject ;
55- @ UnknownObjectField (types = Object .class ) public Object lastWritableObject ;
56-
5753 @ UnknownObjectField (types = Object .class ) public Object firstObject ;
5854 @ UnknownObjectField (types = Object .class ) public Object lastObject ;
5955
@@ -62,21 +58,26 @@ public ImageHeapInfo() {
6258
6359 @ SuppressWarnings ("hiding" )
6460 public void initialize (Object firstReadOnlyPrimitiveObject , Object lastReadOnlyPrimitiveObject , Object firstReadOnlyReferenceObject , Object lastReadOnlyReferenceObject ,
65- Object firstWritablePrimitiveObject , Object lastWritablePrimitiveObject , Object firstWritableReferenceObject , Object lastWritableReferenceObject ) {
61+ Object firstReadOnlyRelocatableObject , Object lastReadOnlyRelocatableObject , Object firstWritablePrimitiveObject , Object lastWritablePrimitiveObject ,
62+ Object firstWritableReferenceObject , Object lastWritableReferenceObject ) {
6663 this .firstReadOnlyPrimitiveObject = firstReadOnlyPrimitiveObject ;
6764 this .lastReadOnlyPrimitiveObject = lastReadOnlyPrimitiveObject ;
6865 this .firstReadOnlyReferenceObject = firstReadOnlyReferenceObject ;
6966 this .lastReadOnlyReferenceObject = lastReadOnlyReferenceObject ;
67+ this .firstReadOnlyRelocatableObject = firstReadOnlyRelocatableObject ;
68+ this .lastReadOnlyRelocatableObject = lastReadOnlyRelocatableObject ;
7069 this .firstWritablePrimitiveObject = firstWritablePrimitiveObject ;
7170 this .lastWritablePrimitiveObject = lastWritablePrimitiveObject ;
7271 this .firstWritableReferenceObject = firstWritableReferenceObject ;
7372 this .lastWritableReferenceObject = lastWritableReferenceObject ;
7473
7574 // Compute boundaries for checks considering partitions can be empty (first == last == null)
76- this .firstReadOnlyObject = (firstReadOnlyPrimitiveObject != null ) ? firstReadOnlyPrimitiveObject : firstReadOnlyReferenceObject ;
77- this .lastReadOnlyObject = (lastReadOnlyReferenceObject != null ) ? lastReadOnlyReferenceObject : lastReadOnlyPrimitiveObject ;
78- this .firstWritableObject = (firstWritablePrimitiveObject != null ) ? firstWritablePrimitiveObject : firstWritableReferenceObject ;
79- this .lastWritableObject = (lastWritableReferenceObject != null ) ? lastWritableReferenceObject : lastWritablePrimitiveObject ;
75+ Object firstReadOnlyObject = (firstReadOnlyPrimitiveObject != null ) ? firstReadOnlyPrimitiveObject
76+ : ((firstReadOnlyReferenceObject != null ) ? firstReadOnlyReferenceObject : firstReadOnlyRelocatableObject );
77+ Object lastReadOnlyObject = (lastReadOnlyRelocatableObject != null ) ? lastReadOnlyRelocatableObject
78+ : ((lastReadOnlyReferenceObject != null ) ? lastReadOnlyReferenceObject : lastReadOnlyPrimitiveObject );
79+ Object firstWritableObject = (firstWritablePrimitiveObject != null ) ? firstWritablePrimitiveObject : firstWritableReferenceObject ;
80+ Object lastWritableObject = (lastWritableReferenceObject != null ) ? lastWritableReferenceObject : lastWritablePrimitiveObject ;
8081 this .firstObject = (firstReadOnlyObject != null ) ? firstReadOnlyObject : firstWritableObject ;
8182 this .lastObject = (lastWritableObject != null ) ? lastWritableObject : lastReadOnlyObject ;
8283 }
@@ -107,6 +108,12 @@ public boolean isInReadOnlyReferencePartition(Pointer ptr) {
107108 return Word .objectToUntrackedPointer (firstReadOnlyReferenceObject ).belowOrEqual (ptr ) && ptr .belowOrEqual (Word .objectToUntrackedPointer (lastReadOnlyReferenceObject ));
108109 }
109110
111+ @ Uninterruptible (reason = "Called from uninterruptible code." , mayBeInlined = true )
112+ public boolean isInReadOnlyRelocatablePartition (Pointer ptr ) {
113+ assert ptr .isNonNull ();
114+ return Word .objectToUntrackedPointer (firstReadOnlyRelocatableObject ).belowOrEqual (ptr ) && ptr .belowOrEqual (Word .objectToUntrackedPointer (lastReadOnlyRelocatableObject ));
115+ }
116+
110117 @ Uninterruptible (reason = "Called from uninterruptible code." , mayBeInlined = true )
111118 public boolean isInWritableReferencePartition (Pointer ptr ) {
112119 assert ptr .isNonNull ();
@@ -123,15 +130,9 @@ public boolean isInImageHeap(Pointer objectPointer) {
123130 boolean result ;
124131 if (objectPointer .isNull ()) {
125132 result = false ;
126- } else if (SubstrateOptions .SpawnIsolates .getValue ()) {
127- result = objectPointer .aboveOrEqual (Word .objectToUntrackedPointer (firstObject )) && objectPointer .belowOrEqual (Word .objectToUntrackedPointer (lastObject ));
128133 } else {
129- result = objectPointer .aboveOrEqual (Word .objectToUntrackedPointer (firstReadOnlyObject )) &&
130- objectPointer .belowOrEqual (Word .objectToUntrackedPointer (lastReadOnlyObject )) ||
131- objectPointer .aboveOrEqual (Word .objectToUntrackedPointer (firstWritableObject )) &&
132- objectPointer .belowOrEqual (Word .objectToUntrackedPointer (lastWritableObject ));
134+ result = objectPointer .aboveOrEqual (Word .objectToUntrackedPointer (firstObject )) && objectPointer .belowOrEqual (Word .objectToUntrackedPointer (lastObject ));
133135 }
134-
135136 assert result == isInImageHeapSlow (objectPointer );
136137 return result ;
137138 }
@@ -142,6 +143,7 @@ public boolean isInImageHeapSlow(Pointer objectPointer) {
142143 if (objectPointer .isNonNull ()) {
143144 result |= isInReadOnlyPrimitivePartition (objectPointer );
144145 result |= isInReadOnlyReferencePartition (objectPointer );
146+ result |= isInReadOnlyRelocatablePartition (objectPointer );
145147 result |= isInWritablePrimitivePartition (objectPointer );
146148 result |= isInWritableReferencePartition (objectPointer );
147149 }
0 commit comments