|
36 | 36 | import java.util.Arrays; |
37 | 37 | import java.util.Map; |
38 | 38 |
|
| 39 | +import com.oracle.svm.core.metadata.MetadataTracer; |
39 | 40 | import org.graalvm.nativeimage.ImageSingletons; |
40 | 41 | import org.graalvm.word.LocationIdentity; |
41 | 42 | import org.graalvm.word.UnsignedWord; |
@@ -122,10 +123,12 @@ public class SubstrateAllocationSnippets extends AllocationSnippets { |
122 | 123 | public static final LocationIdentity[] GC_LOCATIONS = new LocationIdentity[]{TLAB_START_IDENTITY, TLAB_TOP_IDENTITY, TLAB_END_IDENTITY, IdentityHashCodeSupport.IDENTITY_HASHCODE_SALT_LOCATION}; |
123 | 124 |
|
124 | 125 | private static final SubstrateForeignCallDescriptor NEW_MULTI_ARRAY = SnippetRuntime.findForeignCall(SubstrateAllocationSnippets.class, "newMultiArrayStub", NO_SIDE_EFFECT); |
| 126 | + private static final SubstrateForeignCallDescriptor TRACE_UNSAFE_ALLOCATION = SnippetRuntime.findForeignCall(SubstrateAllocationSnippets.class, "traceUnsafeAllocation", NO_SIDE_EFFECT); |
125 | 127 | private static final SubstrateForeignCallDescriptor SLOW_PATH_HUB_OR_UNSAFE_INSTANTIATE_ERROR = SnippetRuntime.findForeignCall(SubstrateAllocationSnippets.class, |
126 | 128 | "slowPathHubOrUnsafeInstantiationError", NO_SIDE_EFFECT); |
127 | 129 | private static final SubstrateForeignCallDescriptor ARRAY_HUB_ERROR = SnippetRuntime.findForeignCall(SubstrateAllocationSnippets.class, "arrayHubErrorStub", NO_SIDE_EFFECT); |
128 | | - private static final SubstrateForeignCallDescriptor[] FOREIGN_CALLS = new SubstrateForeignCallDescriptor[]{NEW_MULTI_ARRAY, SLOW_PATH_HUB_OR_UNSAFE_INSTANTIATE_ERROR, ARRAY_HUB_ERROR}; |
| 130 | + private static final SubstrateForeignCallDescriptor[] FOREIGN_CALLS = new SubstrateForeignCallDescriptor[]{NEW_MULTI_ARRAY, TRACE_UNSAFE_ALLOCATION, SLOW_PATH_HUB_OR_UNSAFE_INSTANTIATE_ERROR, |
| 131 | + ARRAY_HUB_ERROR}; |
129 | 132 |
|
130 | 133 | public void registerForeignCalls(SubstrateForeignCallsProvider foreignCalls) { |
131 | 134 | foreignCalls.register(FOREIGN_CALLS); |
@@ -309,6 +312,9 @@ protected Object newmultiarray(DynamicHub hub, @ConstantParameter int rank, @Con |
309 | 312 | public DynamicHub validateNewInstanceClass(DynamicHub hub) { |
310 | 313 | if (probability(EXTREMELY_FAST_PATH_PROBABILITY, hub != null)) { |
311 | 314 | DynamicHub nonNullHub = (DynamicHub) PiNode.piCastNonNull(hub, SnippetAnchorNode.anchor()); |
| 315 | + if (probability(EXTREMELY_FAST_PATH_PROBABILITY, MetadataTracer.enabled())) { |
| 316 | + traceUnsafeAllocationStub(TRACE_UNSAFE_ALLOCATION, DynamicHub.toClass(nonNullHub)); |
| 317 | + } |
312 | 318 | if (probability(EXTREMELY_FAST_PATH_PROBABILITY, nonNullHub.canUnsafeInstantiateAsInstanceFastPath())) { |
313 | 319 | return nonNullHub; |
314 | 320 | } |
@@ -344,6 +350,15 @@ private static Object newMultiArrayRecursion(DynamicHub hub, int rank, Word dime |
344 | 350 | return result; |
345 | 351 | } |
346 | 352 |
|
| 353 | + @NodeIntrinsic(value = ForeignCallWithExceptionNode.class) |
| 354 | + private static native DynamicHub traceUnsafeAllocationStub(@ConstantNodeParameter ForeignCallDescriptor descriptor, Class<?> hub); |
| 355 | + |
| 356 | + /** Foreign call: {@link #TRACE_UNSAFE_ALLOCATION}. */ |
| 357 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 358 | + private static void traceUnsafeAllocation(DynamicHub hub) { |
| 359 | + MetadataTracer.singleton().traceUnsafeAllocatedType(DynamicHub.toClass(hub)); |
| 360 | + } |
| 361 | + |
347 | 362 | @NodeIntrinsic(value = ForeignCallWithExceptionNode.class) |
348 | 363 | private static native DynamicHub slowPathHubOrUnsafeInstantiationErrorStub(@ConstantNodeParameter ForeignCallDescriptor descriptor, Class<?> hub); |
349 | 364 |
|
|
0 commit comments