public final class CodeInfoAccess extends Object
CodeInfo
object. This helper class is necessary to ensure that CodeInfo
objects are used
correctly, as they are garbage collected even though they live in unmanaged memory. For that
purpose, every CodeInfo
object has a tether object. The garbage collector can free a
CodeInfo
object if its tether object is unreachable at a safepoint, that is, in any
method that is not annotated with Uninterruptible
.
For better type-safety (i.e., to indicate if the tether of a CodeInfo
object was already
acquired), we distinguish between UntetheredCodeInfo
and CodeInfo
.
UntetheredCodeInfo
objects could be freed at any safepoint. To prevent that, it is
possible to call CodeInfoAccess.acquireTether(UntetheredCodeInfo)
from uninterruptible code to create a
strong reference to the tether object, which prevents the garbage collector from freeing the
object. Subsequently, the UntetheredCodeInfo
should be
converted
to a CodeInfo
object.
CodeInfo
objects can be safely passed to interruptible code as their tether was already
acquired (calling a separate method with Uninterruptible.calleeMustBe()
== false is
recommended). When no further data needs to be accessed, the tether must be
released
. For concrete code examples, see the
usages of these methods.
Callers of these methods must take into account that frames on the stack can be deoptimized at
any safepoint check. When a method is deoptimized, its code can also be
invalidated, successive
lookups of instruction pointers within the deoptimized
code will fail. So, only the initially looked up CodeInfo
object must be used.
Modifier and Type | Method and Description |
---|---|
static org.graalvm.nativeimage.c.function.CodePointer |
absoluteIP(CodeInfo info,
long relativeIP) |
static Object |
acquireTether(UntetheredCodeInfo info) |
static boolean |
contains(CodeInfo info,
org.graalvm.nativeimage.c.function.CodePointer ip) |
static CodeInfo |
convert(UntetheredCodeInfo untetheredInfo)
Try to avoid using this method.
|
static CodeInfo |
convert(UntetheredCodeInfo untetheredInfo,
Object tether) |
static org.graalvm.word.UnsignedWord |
getCodeAndDataMemorySize(CodeInfo info) |
static NonmovableArray<Byte> |
getCodeInfoEncodings(CodeInfo info) |
static NonmovableArray<Byte> |
getCodeInfoIndex(CodeInfo info) |
static org.graalvm.word.UnsignedWord |
getCodeSize(CodeInfo info) |
static org.graalvm.nativeimage.c.function.CodePointer |
getCodeStart(CodeInfo info) |
static org.graalvm.word.UnsignedWord |
getDataOffset(CodeInfo info) |
static org.graalvm.word.UnsignedWord |
getDataSize(CodeInfo info) |
static NonmovableArray<Byte> |
getFrameInfoEncodings(CodeInfo info) |
static NonmovableObjectArray<String> |
getFrameInfoNames(CodeInfo info) |
static NonmovableObjectArray<Object> |
getFrameInfoObjectConstants(CodeInfo info) |
static NonmovableObjectArray<Class<?>> |
getFrameInfoSourceClasses(CodeInfo info) |
static NonmovableObjectArray<String> |
getFrameInfoSourceMethodNames(CodeInfo info) |
static String |
getName(CodeInfo info) |
static org.graalvm.word.UnsignedWord |
getNativeMetadataSize(CodeInfo info) |
static NonmovableArray<Byte> |
getStackReferenceMapEncoding(CodeInfo info) |
static int |
getState(CodeInfo info) |
static int |
getTier(CodeInfo info) |
static long |
initFrameInfoReader(CodeInfo info,
org.graalvm.nativeimage.c.function.CodePointer ip,
ReusableTypeReader frameInfoReader) |
static boolean |
isValid(UntetheredCodeInfo info) |
static Log |
log(CodeInfo info,
Log log) |
static void |
lookupCodeInfo(CodeInfo info,
long ip,
CodeInfoQueryResult codeInfoQueryResult) |
static void |
lookupCodeInfo(CodeInfo info,
long ip,
SimpleCodeInfoQueryResult codeInfoQueryResult) |
static long |
lookupDeoptimizationEntrypoint(CodeInfo info,
long method,
long encodedBci,
CodeInfoQueryResult codeInfo) |
static long |
lookupStackReferenceMapIndex(CodeInfo info,
long ip) |
static long |
lookupTotalFrameSize(CodeInfo info,
long ip) |
static FrameInfoQueryResult |
nextFrameInfo(CodeInfo info,
long entryOffset,
ReusableTypeReader frameInfoReader,
FrameInfoDecoder.FrameInfoQueryResultAllocator resultAllocator,
FrameInfoDecoder.ValueInfoAllocator valueInfoAllocator,
boolean fetchFirstFrame) |
static long |
relativeIP(CodeInfo info,
org.graalvm.nativeimage.c.function.CodePointer ip) |
static void |
releaseTether(UntetheredCodeInfo info,
Object tether) |
static void |
releaseTetherUnsafe(UntetheredCodeInfo info,
Object tether)
Try to avoid using this method.
|
static void |
setCodeInfo(CodeInfo info,
NonmovableArray<Byte> index,
NonmovableArray<Byte> encodings,
NonmovableArray<Byte> referenceMapEncoding) |
static void |
setFrameInfo(CodeInfo info,
NonmovableArray<Byte> encodings,
NonmovableObjectArray<Object> objectConstants,
NonmovableObjectArray<Class<?>> sourceClasses,
NonmovableObjectArray<String> sourceMethodNames,
NonmovableObjectArray<String> names) |
static void |
setState(CodeInfo info,
int state) |
public static Object acquireTether(UntetheredCodeInfo info)
public static void releaseTether(UntetheredCodeInfo info, Object tether)
public static void releaseTetherUnsafe(UntetheredCodeInfo info, Object tether)
CodeInfoAccess.releaseTether(UntetheredCodeInfo, Object)
but with less verification.public static CodeInfo convert(UntetheredCodeInfo untetheredInfo, Object tether)
public static CodeInfo convert(UntetheredCodeInfo untetheredInfo)
CodeInfoAccess.convert(UntetheredCodeInfo, Object)
but with less verification.public static boolean isValid(UntetheredCodeInfo info)
public static void setState(CodeInfo info, int state)
public static int getState(CodeInfo info)
public static org.graalvm.nativeimage.c.function.CodePointer getCodeStart(CodeInfo info)
CodeInfoImpl.getCodeStart()
public static org.graalvm.word.UnsignedWord getCodeSize(CodeInfo info)
CodeInfoImpl.getCodeSize()
public static org.graalvm.word.UnsignedWord getDataSize(CodeInfo info)
CodeInfoImpl.getDataSize()
public static org.graalvm.word.UnsignedWord getDataOffset(CodeInfo info)
CodeInfoImpl.getDataOffset()
public static org.graalvm.word.UnsignedWord getCodeAndDataMemorySize(CodeInfo info)
CodeInfoImpl.getCodeAndDataMemorySize()
public static org.graalvm.word.UnsignedWord getNativeMetadataSize(CodeInfo info)
public static boolean contains(CodeInfo info, org.graalvm.nativeimage.c.function.CodePointer ip)
public static long relativeIP(CodeInfo info, org.graalvm.nativeimage.c.function.CodePointer ip)
public static org.graalvm.nativeimage.c.function.CodePointer absoluteIP(CodeInfo info, long relativeIP)
public static long initFrameInfoReader(CodeInfo info, org.graalvm.nativeimage.c.function.CodePointer ip, ReusableTypeReader frameInfoReader)
public static FrameInfoQueryResult nextFrameInfo(CodeInfo info, long entryOffset, ReusableTypeReader frameInfoReader, FrameInfoDecoder.FrameInfoQueryResultAllocator resultAllocator, FrameInfoDecoder.ValueInfoAllocator valueInfoAllocator, boolean fetchFirstFrame)
public static long lookupDeoptimizationEntrypoint(CodeInfo info, long method, long encodedBci, CodeInfoQueryResult codeInfo)
public static long lookupTotalFrameSize(CodeInfo info, long ip)
public static NonmovableArray<Byte> getStackReferenceMapEncoding(CodeInfo info)
public static long lookupStackReferenceMapIndex(CodeInfo info, long ip)
public static void lookupCodeInfo(CodeInfo info, long ip, CodeInfoQueryResult codeInfoQueryResult)
public static void lookupCodeInfo(CodeInfo info, long ip, SimpleCodeInfoQueryResult codeInfoQueryResult)
public static void setFrameInfo(CodeInfo info, NonmovableArray<Byte> encodings, NonmovableObjectArray<Object> objectConstants, NonmovableObjectArray<Class<?>> sourceClasses, NonmovableObjectArray<String> sourceMethodNames, NonmovableObjectArray<String> names)
public static void setCodeInfo(CodeInfo info, NonmovableArray<Byte> index, NonmovableArray<Byte> encodings, NonmovableArray<Byte> referenceMapEncoding)
public static int getTier(CodeInfo info)
public static NonmovableArray<Byte> getCodeInfoIndex(CodeInfo info)
public static NonmovableArray<Byte> getCodeInfoEncodings(CodeInfo info)
public static NonmovableArray<Byte> getFrameInfoEncodings(CodeInfo info)
public static NonmovableObjectArray<Object> getFrameInfoObjectConstants(CodeInfo info)
public static NonmovableObjectArray<Class<?>> getFrameInfoSourceClasses(CodeInfo info)
public static NonmovableObjectArray<String> getFrameInfoSourceMethodNames(CodeInfo info)
public static NonmovableObjectArray<String> getFrameInfoNames(CodeInfo info)