use of com.oracle.svm.core.annotate.Uninterruptible in project graal by oracle.
the class UninterruptibleAnnotationChecker method checkUninterruptibleCallees.
/**
* Check that each method annotated with {@link Uninterruptible} calls only methods that are
* also annotated with {@link Uninterruptible}, or methods annotated with {@link CFunction} that
* specify "Transition = NO_TRANSITION".
*
* A caller can be annotated with "calleeMustBe = false" to allow calls to methods that are not
* annotated with {@link Uninterruptible}, to allow the few cases where that should be allowed.
*/
@SuppressWarnings("try")
private void checkUninterruptibleCallees(DebugContext debug) {
if (Options.PrintUninterruptibleCalleeDOTGraph.getValue()) {
System.out.println("/* DOT */ digraph uninterruptible {");
}
for (HostedMethod caller : methodCollection) {
try (DebugContext.Scope s = debug.scope("CheckUninterruptibleCallees", caller.compilationInfo.graph, caller, this)) {
Uninterruptible callerAnnotation = caller.getAnnotation(Uninterruptible.class);
StructuredGraph graph = caller.compilationInfo.getGraph();
if (callerAnnotation != null) {
if (callerAnnotation.calleeMustBe()) {
if (graph != null) {
for (Invoke invoke : graph.getInvokes()) {
HostedMethod callee = (HostedMethod) invoke.callTarget().targetMethod();
if (Options.PrintUninterruptibleCalleeDOTGraph.getValue()) {
printDotGraphEdge(caller, callee);
}
if (!isNotInterruptible(callee)) {
postUninterruptibleWarning("Unannotated callee: " + callee.format("%h.%n(%p)") + " called by annotated caller " + caller.format("%h.%n(%p)"));
}
}
}
} else {
// Print DOT graph edge even if callee need not be annotated.
if (graph != null) {
for (Invoke invoke : graph.getInvokes()) {
HostedMethod callee = (HostedMethod) invoke.callTarget().targetMethod();
if (Options.PrintUninterruptibleCalleeDOTGraph.getValue()) {
printDotGraphEdge(caller, callee);
}
}
}
}
}
} catch (Throwable t) {
throw debug.handle(t);
}
}
if (Options.PrintUninterruptibleCalleeDOTGraph.getValue()) {
System.out.println("/* DOT */ }");
}
}
use of com.oracle.svm.core.annotate.Uninterruptible in project graal by oracle.
the class UninterruptibleAnnotationChecker method checkUninterruptibleCallers.
/**
* Check that each method that calls a method annotated with {@linkplain Uninterruptible} that
* has "callerMustBeUninterrutible = true" is also annotated with {@linkplain Uninterruptible}.
*/
@SuppressWarnings("try")
private void checkUninterruptibleCallers(DebugContext debug) {
for (HostedMethod caller : methodCollection) {
try (DebugContext.Scope s = debug.scope("CheckUninterruptibleCallers", caller.compilationInfo.graph, caller, this)) {
Uninterruptible callerAnnotation = caller.getAnnotation(Uninterruptible.class);
StructuredGraph graph = caller.compilationInfo.getGraph();
if (callerAnnotation == null && graph != null) {
for (Invoke invoke : graph.getInvokes()) {
HostedMethod callee = (HostedMethod) invoke.callTarget().targetMethod();
if (isCallerMustBe(callee)) {
postUninterruptibleWarning("Unannotated caller: " + caller.format("%h.%n(%p)") + " calls annotated callee " + callee.format("%h.%n(%p)"));
}
}
}
} catch (Throwable t) {
throw debug.handle(t);
}
}
}
use of com.oracle.svm.core.annotate.Uninterruptible in project graal by oracle.
the class UninterruptibleAnnotationChecker method checkUninterruptibleAllocations.
/**
* Check that each method that is annotated with {@linkplain Uninterruptible} contains no
* allocations.
*/
@SuppressWarnings("try")
private void checkUninterruptibleAllocations(DebugContext debug) {
for (HostedMethod method : methodCollection) {
try (DebugContext.Scope s = debug.scope("CheckUninterruptibleAllocations", method.compilationInfo.graph, method, this)) {
Uninterruptible methodAnnotation = method.getAnnotation(Uninterruptible.class);
StructuredGraph graph = method.compilationInfo.getGraph();
if (methodAnnotation != null && graph != null) {
for (Node node : graph.getNodes()) {
if (node instanceof AbstractNewObjectNode) {
postUninterruptibleWarning("Annotated method: " + method.format("%h.%n(%p)") + " allocates.");
}
}
}
} catch (Throwable t) {
throw debug.handle(t);
}
}
}
use of com.oracle.svm.core.annotate.Uninterruptible in project graal by oracle.
the class ThreadLocalAllocation method allocateLargeArray.
@Uninterruptible(reason = "Holds uninitialized memory, modifies TLAB")
private static Object allocateLargeArray(DynamicHub hub, int length, UnsignedWord size, UnalignedHeapChunk.UnalignedHeader uChunk, ThreadLocalAllocation.Descriptor tlab, boolean rememberedSet) {
/* Register the new chunk in the TLAB linked list of unaligned chunks. */
uChunk.setNext(tlab.getUnalignedChunk());
tlab.setUnalignedChunk(uChunk);
/* Allocate the memory. We must have a chunk, otherwise we already threw an exception. */
Pointer memory = UnalignedHeapChunk.allocateMemory(uChunk, size);
assert memory.isNonNull();
/* Install the DynamicHub and length, and zero the elements. */
return KnownIntrinsics.formatArray(memory, hub.asClass(), length, rememberedSet, true);
}
use of com.oracle.svm.core.annotate.Uninterruptible in project graal by oracle.
the class ThreadLocalAllocation method resumeAllocationChunk.
/**
* Add a new allocation chunk at the front of the TLAB's aligned chunks.
*/
@Uninterruptible(reason = "Modifies TLAB.")
static void resumeAllocationChunk(Descriptor tlab) {
assert tlab.getAllocationTop(TOP_IDENTITY).isNull();
assert tlab.getAllocationTop(END_IDENTITY).isNull();
AlignedHeader alignedChunk = tlab.getAlignedChunk();
if (alignedChunk.isNonNull()) {
tlab.setAllocationTop(alignedChunk.getTop(), TOP_IDENTITY);
tlab.setAllocationEnd(alignedChunk.getEnd(), END_IDENTITY);
alignedChunk.setTop(WordFactory.nullPointer());
}
}
Aggregations