Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ abstract static class ConstantData {
* constant created in the current layer.
*/
private boolean isInBaseLayer;
/**
* A boolean telling if the constant was written in the image heap of the base layer.
*/
private boolean writtenInPreviousLayer;
/**
* An object representing a way to retrieve the value of the constant in the hosted
* universe.
Expand Down Expand Up @@ -212,6 +216,15 @@ public boolean isInBaseLayer() {
return constantData.isInBaseLayer;
}

public void markWrittenInPreviousLayer() {
AnalysisError.guarantee(isInBaseLayer(), "Constant must be in base layer to be marked as written in the base layer.");
constantData.writtenInPreviousLayer = true;
}

public boolean isWrittenInPreviousLayer() {
return constantData.writtenInPreviousLayer;
}

public JavaConstant getHostedObject() {
AnalysisError.guarantee(!CompressibleConstant.isCompressed(constantData.hostedObject), "References to hosted objects should never be compressed.");
return constantData.hostedObject;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ protected void calculate(BeforeImageWriteAccessImpl access) {
Set<byte[]> seenStringByteArrays = Collections.newSetFromMap(new IdentityHashMap<>());
final boolean reportStringBytesConstant = reportStringBytes;
for (ObjectInfo o : access.getImage().getHeap().getObjects()) {
if (o.getConstant().isInBaseLayer()) {
if (o.getConstant().isWrittenInPreviousLayer()) {
continue;
}
long objectSize = o.getSize();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -898,7 +898,7 @@ private static void printHistogram(ImageHeapPartition partition, Iterable<Object
long canonicalizedCount = 0L;
long canonicalizedSize = 0L;
for (ObjectInfo info : objects) {
if (info.getConstant().isInBaseLayer()) {
if (info.getConstant().isWrittenInPreviousLayer()) {
continue;
}
if (partition == info.getPartition()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ public int getObjectCount() {
}

public int getLayerObjectCount() {
return (int) objects.values().stream().filter(o -> !o.constant.isInBaseLayer()).count();
return (int) objects.values().stream().filter(o -> !o.constant.isWrittenInPreviousLayer()).count();
}

public ObjectInfo getObjectInfo(Object obj) {
Expand Down Expand Up @@ -418,7 +418,7 @@ private int computeIdentityHashCode(JavaConstant constant) {
public int countDynamicHubs() {
int count = 0;
for (ObjectInfo o : getObjects()) {
if (!o.constant.isInBaseLayer() && hMetaAccess.isInstanceOf(o.getConstant(), DynamicHub.class)) {
if (!o.constant.isWrittenInPreviousLayer() && hMetaAccess.isInstanceOf(o.getConstant(), DynamicHub.class)) {
count++;
}
}
Expand Down Expand Up @@ -648,7 +648,7 @@ private void addObjectToImageHeap(final JavaConstant constant, boolean immutable
* are reachable from regular constants in this layer.
*/
private static boolean processBaseLayerConstant(JavaConstant constant, ObjectInfo info) {
if (((ImageHeapConstant) constant).isInBaseLayer()) {
if (((ImageHeapConstant) constant).isWrittenInPreviousLayer()) {
info.setOffsetInPartition(HostedImageLayerBuildingSupport.singleton().getLoader().getObjectOffset(constant));
info.setHeapPartition(BASE_LAYER_PARTITION);
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,12 @@ public long writeHeap(DebugContext debug, RelocatableBuffer buffer) {
try (Indent perHeapIndent = debug.logAndIndent("NativeImageHeap.writeHeap:")) {
for (ObjectInfo info : heap.getObjects()) {
assert !heap.isBlacklisted(info.getObject());
if (info.getConstant().isInBaseLayer()) {
if (info.getConstant().isWrittenInPreviousLayer()) {
/*
* Base layer constants are only added to the heap model to store the absolute
* offset in the base layer heap. We don't need to actually write them; their
* absolute offset is used by the objects that reference them.
* Base layer constants already written in the base layer heap are only added to
* the heap model to store the absolute offset in the base layer heap. We don't
* need to actually write them; their absolute offset is used by the objects
* that reference them.
*/
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ private void doPrint() {

HeapHistogram totalHistogram = new HeapHistogram();
for (ObjectInfo info : heap.getObjects()) {
if (info.getConstant().isInBaseLayer()) {
if (info.getConstant().isWrittenInPreviousLayer()) {
continue;
}
totalHistogram.add(info, info.getSize());
Expand Down Expand Up @@ -162,7 +162,7 @@ private static Object readTruffleRuntimeCompilationSupportField(String name) {

public void processType(Class<?> clazz, String group, boolean addObject, ObjectFilter objectFilter, FieldFilter fieldFilter) {
for (ObjectInfo info : heap.getObjects()) {
if (!info.getConstant().isInBaseLayer() && clazz.isInstance(info.getObject())) {
if (!info.getConstant().isWrittenInPreviousLayer() && clazz.isInstance(info.getObject())) {
processObject(info, group, addObject, 1, objectFilter, fieldFilter);
}
}
Expand All @@ -185,8 +185,8 @@ public void processObject(Object object, String group, boolean addObject, Object
private void processObject(ObjectInfo info, String group, boolean addObject, int recursionLevel, ObjectFilter objectFilter, FieldFilter fieldFilter) {
assert info != null;
ImageHeapConstant ihc = info.getConstant();
if (ihc.isInBaseLayer()) {
/* Base layer objects don't count towards current layer's statistics. */
if (ihc.isWrittenInPreviousLayer()) {
/* Written base layer objects don't count towards current layer's statistics. */
return;
}
if (objectFilter != null && !objectFilter.test(info, recursionLevel)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1497,6 +1497,7 @@ private void addBaseLayerObject(int id, long objectOffset, Supplier<ImageHeapCon
}
if (objectOffset != -1) {
objectOffsets.put(ImageHeapConstant.getConstantID(heapObj), objectOffset);
heapObj.markWrittenInPreviousLayer();
}
return heapObj;
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -631,7 +631,7 @@ private static void persistMethodWrappedMember(PersistedAnalysisMethod.WrappedMe
Parameter[] params = member.getParameters();
TextList.Builder atb = b.initArgumentTypeNames(params.length);
for (int i = 0; i < params.length; i++) {
atb.set(i, new Text.Reader(params[i].getName()));
atb.set(i, new Text.Reader(params[i].getType().getName()));
}
}

Expand Down Expand Up @@ -810,9 +810,11 @@ private void persistConstantRelinkingInfo(PersistedConstant.Builder builder, Ima
Relinking.Builder relinkingBuilder = builder.getObject().getRelinking();
int id = ImageHeapConstant.getConstantID(imageHeapConstant);
ResolvedJavaType type = bb.getConstantReflectionProvider().asJavaType(hostedObject);
boolean tryStaticFinalFieldRelink = true;
if (type instanceof AnalysisType analysisType) {
relinkingBuilder.initClassConstant().setTypeId(analysisType.getId());
constantsToRelink.add(id);
tryStaticFinalFieldRelink = false;
} else if (clazz.equals(String.class)) {
StringConstant.Builder stringConstantBuilder = relinkingBuilder.initStringConstant();
String value = bb.getSnippetReflectionProvider().asObject(String.class, hostedObject);
Expand All @@ -822,14 +824,17 @@ private void persistConstantRelinkingInfo(PersistedConstant.Builder builder, Ima
*/
stringConstantBuilder.setValue(value);
constantsToRelink.add(id);
tryStaticFinalFieldRelink = false;
}
} else if (Enum.class.isAssignableFrom(clazz)) {
EnumConstant.Builder enumBuilder = relinkingBuilder.initEnumConstant();
Enum<?> value = bb.getSnippetReflectionProvider().asObject(Enum.class, hostedObject);
enumBuilder.setEnumClass(value.getDeclaringClass().getName());
enumBuilder.setEnumName(value.name());
constantsToRelink.add(id);
} else if (shouldRelinkConstant(imageHeapConstant) && imageHeapConstant.getOrigin() != null) {
tryStaticFinalFieldRelink = false;
}
if (tryStaticFinalFieldRelink && shouldRelinkConstant(imageHeapConstant) && imageHeapConstant.getOrigin() != null) {
AnalysisField field = imageHeapConstant.getOrigin();
if (shouldRelinkField(field)) {
Relinking.FieldConstant.Builder fieldConstantBuilder = relinkingBuilder.initFieldConstant();
Expand Down
Loading