Skip to content
Merged
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 @@ -354,6 +354,9 @@ public static final long getTearDownFailureNanos() {
@Option(help = "Use callee saved registers to reduce spilling for low-frequency calls to stubs (if callee saved registers are supported by the architecture)")//
public static final HostedOptionKey<Boolean> UseCalleeSavedRegisters = new HostedOptionKey<>(true);

@Option(help = "Use compressed frame encoding for frames without local values.", type = OptionType.Expert)//
public static final HostedOptionKey<Boolean> UseCompressedFrameEncodings = new HostedOptionKey<>(true);

@Option(help = "Report error if <typename>[:<UsageKind>{,<UsageKind>}] is discovered during analysis (valid values for UsageKind: InHeap, Allocated, Reachable).", type = OptionType.Debug)//
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> ReportAnalysisForbiddenType = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,6 @@ public static UnsignedWord getNativeMetadataSize(CodeInfo info) {
.add(NonmovableArrays.byteSizeOf(impl.getFrameInfoObjectConstants()))
.add(NonmovableArrays.byteSizeOf(impl.getFrameInfoSourceClasses()))
.add(NonmovableArrays.byteSizeOf(impl.getFrameInfoSourceMethodNames()))
.add(NonmovableArrays.byteSizeOf(impl.getFrameInfoNames()))
.add(NonmovableArrays.byteSizeOf(impl.getDeoptimizationStartOffsets()))
.add(NonmovableArrays.byteSizeOf(impl.getDeoptimizationEncodings()))
.add(NonmovableArrays.byteSizeOf(impl.getDeoptimizationObjectConstants()))
Expand All @@ -239,21 +238,39 @@ public static CodePointer absoluteIP(CodeInfo info, long relativeIP) {
return (CodePointer) ((UnsignedWord) cast(info).getCodeStart()).add(WordFactory.unsigned(relativeIP));
}

public static long initFrameInfoReader(CodeInfo info, CodePointer ip, ReusableTypeReader frameInfoReader) {
public static class FrameInfoState {
public long entryOffset;
public boolean isFirstFrame;
public boolean isDone;
public int firstValue;

public FrameInfoState() {
reset();
}

public void reset() {
entryOffset = -1;
isFirstFrame = true;
isDone = false;
firstValue = -1;
}
}

public static void initFrameInfoReader(CodeInfo info, CodePointer ip, ReusableTypeReader frameInfoReader, FrameInfoState state) {
long entryOffset = CodeInfoDecoder.lookupCodeInfoEntryOffset(info, relativeIP(info, ip));
state.entryOffset = entryOffset;
if (entryOffset >= 0) {
if (!CodeInfoDecoder.initFrameInfoReader(info, entryOffset, frameInfoReader)) {
return -1;
state.entryOffset = -1;
}
}
return entryOffset;
}

public static FrameInfoQueryResult nextFrameInfo(CodeInfo info, long entryOffset, ReusableTypeReader frameInfoReader,
FrameInfoDecoder.FrameInfoQueryResultAllocator resultAllocator, ValueInfoAllocator valueInfoAllocator, boolean fetchFirstFrame) {
int entryFlags = CodeInfoDecoder.loadEntryFlags(info, entryOffset);
public static FrameInfoQueryResult nextFrameInfo(CodeInfo info, ReusableTypeReader frameInfoReader,
FrameInfoDecoder.FrameInfoQueryResultAllocator resultAllocator, ValueInfoAllocator valueInfoAllocator, FrameInfoState state) {
int entryFlags = CodeInfoDecoder.loadEntryFlags(info, state.entryOffset);
boolean isDeoptEntry = CodeInfoDecoder.extractFI(entryFlags) == CodeInfoDecoder.FI_DEOPT_ENTRY_INDEX_S4;
return FrameInfoDecoder.decodeFrameInfo(isDeoptEntry, frameInfoReader, info, resultAllocator, valueInfoAllocator, fetchFirstFrame);
return FrameInfoDecoder.decodeFrameInfo(isDeoptEntry, frameInfoReader, info, resultAllocator, valueInfoAllocator, state);
}

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -307,12 +324,11 @@ public static void setCodeInfo(CodeInfo info, NonmovableArray<Byte> index, Nonmo

@Uninterruptible(reason = "Nonmovable object arrays are not visible to GC until installed.")
public static void setEncodings(CodeInfo info, NonmovableObjectArray<Object> objectConstants,
NonmovableObjectArray<Class<?>> sourceClasses, NonmovableObjectArray<String> sourceMethodNames, NonmovableObjectArray<String> names) {
NonmovableObjectArray<Class<?>> sourceClasses, NonmovableObjectArray<String> sourceMethodNames) {
CodeInfoImpl impl = cast(info);
impl.setFrameInfoObjectConstants(objectConstants);
impl.setFrameInfoSourceClasses(sourceClasses);
impl.setFrameInfoSourceMethodNames(sourceMethodNames);
impl.setFrameInfoNames(names);
if (!SubstrateUtil.HOSTED) {
// notify the GC about the frame metadata that is now live
Heap.getHeap().getRuntimeCodeInfoGCSupport().registerFrameMetadata(impl);
Expand Down Expand Up @@ -370,10 +386,6 @@ public static NonmovableObjectArray<String> getFrameInfoSourceMethodNames(CodeIn
return cast(info).getFrameInfoSourceMethodNames();
}

public static NonmovableObjectArray<String> getFrameInfoNames(CodeInfo info) {
return cast(info).getFrameInfoNames();
}

@Uninterruptible(reason = "Called from uninterruptible code", mayBeInlined = true)
private static CodeInfoImpl cast(UntetheredCodeInfo info) {
assert isValid(info);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
// Checkstyle: stop
import java.lang.reflect.Executable;
// Checkstyle: resume
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.graalvm.compiler.api.replacements.Fold;
Expand Down Expand Up @@ -367,7 +367,7 @@ private static FrameInfoQueryResult loadFrameInfo(CodeInfo info, long entryOffse
}
int frameInfoIndex = NonmovableByteArrayReader.getS4(CodeInfoAccess.getCodeInfoEncodings(info), offsetFI(entryOffset, entryFlags));
return FrameInfoDecoder.decodeFrameInfo(isDeoptEntry, new ReusableTypeReader(CodeInfoAccess.getFrameInfoEncodings(info), frameInfoIndex), info,
FrameInfoDecoder.HeapBasedFrameInfoQueryResultAllocator, FrameInfoDecoder.HeapBasedValueInfoAllocator, true);
FrameInfoDecoder.HeapBasedFrameInfoQueryResultAllocator, FrameInfoDecoder.HeapBasedValueInfoAllocator);
}

@AlwaysInline("Make IP-lookup loop call free")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private Encoders() {
this.objectConstants = FrequencyEncoder.createEqualityEncoder();
this.sourceClasses = FrequencyEncoder.createEqualityEncoder();
this.sourceMethodNames = FrequencyEncoder.createEqualityEncoder();
if (FrameInfoDecoder.encodeDebugNames() || FrameInfoDecoder.encodeSourceReferences()) {
if (FrameInfoDecoder.encodeSourceReferences()) {
this.names = FrequencyEncoder.createEqualityEncoder();
} else {
this.names = null;
Expand All @@ -127,28 +127,22 @@ private void encodeAllAndInstall(CodeInfo target, ReferenceAdjuster adjuster) {
JavaConstant[] encodedJavaConstants = objectConstants.encodeAll(new JavaConstant[objectConstants.getLength()]);
Class<?>[] sourceClassesArray = null;
String[] sourceMethodNamesArray = null;
String[] namesArray = null;
final boolean encodeDebugNames = FrameInfoDecoder.encodeDebugNames();
if (encodeDebugNames || FrameInfoDecoder.encodeSourceReferences()) {
if (FrameInfoDecoder.encodeSourceReferences()) {
sourceClassesArray = sourceClasses.encodeAll(new Class<?>[sourceClasses.getLength()]);
sourceMethodNamesArray = sourceMethodNames.encodeAll(new String[sourceMethodNames.getLength()]);
}
if (encodeDebugNames) {
namesArray = names.encodeAll(new String[names.getLength()]);
}
install(target, encodedJavaConstants, sourceClassesArray, sourceMethodNamesArray, namesArray, adjuster);
install(target, encodedJavaConstants, sourceClassesArray, sourceMethodNamesArray, adjuster);
}

@Uninterruptible(reason = "Nonmovable object arrays are not visible to GC until installed in target.")
private static void install(CodeInfo target, JavaConstant[] objectConstantsArray, Class<?>[] sourceClassesArray,
String[] sourceMethodNamesArray, String[] namesArray, ReferenceAdjuster adjuster) {
String[] sourceMethodNamesArray, ReferenceAdjuster adjuster) {

NonmovableObjectArray<Object> frameInfoObjectConstants = adjuster.copyOfObjectConstantArray(objectConstantsArray);
NonmovableObjectArray<Class<?>> frameInfoSourceClasses = (sourceClassesArray != null) ? adjuster.copyOfObjectArray(sourceClassesArray) : NonmovableArrays.nullArray();
NonmovableObjectArray<String> frameInfoSourceMethodNames = (sourceMethodNamesArray != null) ? adjuster.copyOfObjectArray(sourceMethodNamesArray) : NonmovableArrays.nullArray();
NonmovableObjectArray<String> frameInfoNames = (namesArray != null) ? adjuster.copyOfObjectArray(namesArray) : NonmovableArrays.nullArray();

CodeInfoAccess.setEncodings(target, frameInfoObjectConstants, frameInfoSourceClasses, frameInfoSourceMethodNames, frameInfoNames);
CodeInfoAccess.setEncodings(target, frameInfoObjectConstants, frameInfoSourceClasses, frameInfoSourceMethodNames);
}
}

Expand Down Expand Up @@ -334,7 +328,7 @@ private void encodeIPData() {
writeSizeEncoding(encodingBuffer, data, entryFlags);
writeExceptionOffset(encodingBuffer, data, entryFlags);
writeReferenceMapIndex(encodingBuffer, data, entryFlags);
writeDeoptFrameInfo(encodingBuffer, data, entryFlags);
writeEncodedFrameInfo(encodingBuffer, data, entryFlags);
}

codeInfoIndex = NonmovableArrays.createByteArray(TypeConversion.asU4(indexBuffer.getBytesWritten()));
Expand Down Expand Up @@ -439,7 +433,7 @@ private static void writeReferenceMapIndex(UnsafeArrayTypeWriter writeBuffer, IP
private static int flagsForDeoptFrameInfo(IPData data) {
if (data.frameData == null) {
return CodeInfoDecoder.FI_NO_DEOPT;
} else if (TypeConversion.isS4(data.frameData.indexInEncodings)) {
} else if (TypeConversion.isS4(data.frameData.encodedFrameInfoIndex)) {
if (data.frameData.frame.isDeoptEntry) {
return CodeInfoDecoder.FI_DEOPT_ENTRY_INDEX_S4;
} else {
Expand All @@ -450,11 +444,11 @@ private static int flagsForDeoptFrameInfo(IPData data) {
}
}

private static void writeDeoptFrameInfo(UnsafeArrayTypeWriter writeBuffer, IPData data, int entryFlags) {
private static void writeEncodedFrameInfo(UnsafeArrayTypeWriter writeBuffer, IPData data, int entryFlags) {
switch (CodeInfoDecoder.extractFI(entryFlags)) {
case CodeInfoDecoder.FI_DEOPT_ENTRY_INDEX_S4:
case CodeInfoDecoder.FI_INFO_ONLY_INDEX_S4:
writeBuffer.putS4(data.frameData.indexInEncodings);
writeBuffer.putS4(data.frameData.encodedFrameInfoIndex);
break;
}
}
Expand Down Expand Up @@ -519,7 +513,7 @@ static void verifyMethod(SharedMethod method, CompilationResult compilation, int

private static void verifyFrame(CompilationResult compilation, BytecodeFrame expectedFrame, FrameInfoQueryResult actualFrame, BitSet visitedVirtualObjects) {
assert (expectedFrame == null) == (actualFrame == null);
if (expectedFrame == null || !actualFrame.needLocalValues) {
if (expectedFrame == null || !actualFrame.hasLocalValueInfo()) {
return;
}
verifyFrame(compilation, expectedFrame.caller(), actualFrame.getCaller(), visitedVirtualObjects);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,12 +194,6 @@ interface CodeInfoImpl extends CodeInfo {
@RawField
void setFrameInfoSourceMethodNames(NonmovableObjectArray<String> frameInfoSourceMethodNames);

@RawField
NonmovableObjectArray<String> getFrameInfoNames();

@RawField
void setFrameInfoNames(NonmovableObjectArray<String> frameInfoNames);

@RawField
int getState();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,6 @@ public static long frameInfoSourceMethodNames() {
return OffsetOf.get(CodeInfoImpl.class, "FrameInfoSourceMethodNames");
}

public static long frameInfoNames() {
return OffsetOf.get(CodeInfoImpl.class, "FrameInfoNames");
}

public static long deoptimizationObjectConstants() {
return OffsetOf.get(CodeInfoImpl.class, "DeoptimizationObjectConstants");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,5 @@ public void afterCompilation(AfterCompilationAccess config) {
config.registerAsImmutable(imageInfo.frameInfoObjectConstants);
config.registerAsImmutable(imageInfo.frameInfoSourceClasses);
config.registerAsImmutable(imageInfo.frameInfoSourceMethodNames);
config.registerAsImmutable(imageInfo.frameInfoNames);
}
}
Loading