Skip to content

Commit 342fa1d

Browse files
committed
[GR-68890] Fix native Unsafe allocateInstance tracing.
PullRequest: graal/21950
2 parents c588bdc + 3865b64 commit 342fa1d

File tree

4 files changed

+61
-43
lines changed

4 files changed

+61
-43
lines changed

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationTypeDescriptor.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.lang.reflect.Proxy;
2828
import java.util.Arrays;
2929
import java.util.Collection;
30-
import java.util.stream.Stream;
3130

3231
import com.oracle.svm.util.StringUtil;
3332

@@ -51,13 +50,16 @@ enum Kind {
5150
}
5251

5352
static ConfigurationTypeDescriptor fromClass(Class<?> clazz) {
54-
Stream<String> interfacesStream = Arrays.stream(clazz.getInterfaces())
55-
.map(Class::getTypeName);
53+
Class<?>[] interfaces = clazz.getInterfaces();
54+
String[] interfaceNames = new String[interfaces.length];
55+
for (int i = 0; i < interfaces.length; i++) {
56+
interfaceNames[i] = interfaces[i].getTypeName();
57+
}
5658
if (Proxy.isProxyClass(clazz)) {
57-
return ProxyConfigurationTypeDescriptor.fromInterfaceReflectionNames(interfacesStream.toList());
59+
return ProxyConfigurationTypeDescriptor.fromInterfaceReflectionNames(Arrays.asList(interfaceNames));
5860
} else if (LambdaUtils.isLambdaClass(clazz)) {
5961
String declaringClass = StringUtil.split(clazz.getTypeName(), LambdaUtils.LAMBDA_CLASS_NAME_SUBSTRING)[0];
60-
return LambdaConfigurationTypeDescriptor.fromReflectionNames(declaringClass, interfacesStream.toList());
62+
return LambdaConfigurationTypeDescriptor.fromReflectionNames(declaringClass, Arrays.asList(interfaceNames));
6163
} else {
6264
return NamedConfigurationTypeDescriptor.fromReflectionName(clazz.getTypeName());
6365
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/SubstrateAllocationSnippets.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.Arrays;
3737
import java.util.Map;
3838

39+
import com.oracle.svm.core.metadata.MetadataTracer;
3940
import org.graalvm.nativeimage.ImageSingletons;
4041
import org.graalvm.word.LocationIdentity;
4142
import org.graalvm.word.UnsignedWord;
@@ -122,10 +123,12 @@ public class SubstrateAllocationSnippets extends AllocationSnippets {
122123
public static final LocationIdentity[] GC_LOCATIONS = new LocationIdentity[]{TLAB_START_IDENTITY, TLAB_TOP_IDENTITY, TLAB_END_IDENTITY, IdentityHashCodeSupport.IDENTITY_HASHCODE_SALT_LOCATION};
123124

124125
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);
125127
private static final SubstrateForeignCallDescriptor SLOW_PATH_HUB_OR_UNSAFE_INSTANTIATE_ERROR = SnippetRuntime.findForeignCall(SubstrateAllocationSnippets.class,
126128
"slowPathHubOrUnsafeInstantiationError", NO_SIDE_EFFECT);
127129
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};
129132

130133
public void registerForeignCalls(SubstrateForeignCallsProvider foreignCalls) {
131134
foreignCalls.register(FOREIGN_CALLS);
@@ -309,6 +312,9 @@ protected Object newmultiarray(DynamicHub hub, @ConstantParameter int rank, @Con
309312
public DynamicHub validateNewInstanceClass(DynamicHub hub) {
310313
if (probability(EXTREMELY_FAST_PATH_PROBABILITY, hub != null)) {
311314
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+
}
312318
if (probability(EXTREMELY_FAST_PATH_PROBABILITY, nonNullHub.canUnsafeInstantiateAsInstanceFastPath())) {
313319
return nonNullHub;
314320
}
@@ -344,6 +350,15 @@ private static Object newMultiArrayRecursion(DynamicHub hub, int rank, Word dime
344350
return result;
345351
}
346352

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+
347362
@NodeIntrinsic(value = ForeignCallWithExceptionNode.class)
348363
private static native DynamicHub slowPathHubOrUnsafeInstantiationErrorStub(@ConstantNodeParameter ForeignCallDescriptor descriptor, Class<?> hub);
349364

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,6 @@ public static Throwable getSavedException(String className) {
510510
*/
511511
public static boolean canUnsafeInstantiateAsInstance(DynamicHub hub) {
512512
Class<?> clazz = DynamicHub.toClass(hub);
513-
if (MetadataTracer.enabled()) {
514-
MetadataTracer.singleton().traceUnsafeAllocatedType(clazz);
515-
}
516513
RuntimeConditionSet conditionSet = null;
517514
for (var singleton : layeredSingletons()) {
518515
conditionSet = singleton.unsafeInstantiatedClasses.get(clazz);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/metadata/MetadataTracer.java

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ private void shutdown() {
139139

140140
if (debugWriter != null) {
141141
debugWriter.close();
142+
debugWriter = null;
142143
}
143144
}
144145

@@ -236,8 +237,11 @@ public void traceUnsafeAllocatedType(Class<?> clazz) {
236237
* Marks the given proxy type as reachable from reflection.
237238
*/
238239
public void traceProxyType(Class<?>[] interfaces) {
239-
List<String> interfaceNames = Arrays.stream(interfaces).map(Class::getTypeName).toList();
240-
ProxyConfigurationTypeDescriptor descriptor = new ProxyConfigurationTypeDescriptor(interfaceNames);
240+
String[] interfaceNames = new String[interfaces.length];
241+
for (int i = 0; i < interfaces.length; i++) {
242+
interfaceNames[i] = interfaces[i].getTypeName();
243+
}
244+
ProxyConfigurationTypeDescriptor descriptor = new ProxyConfigurationTypeDescriptor(Arrays.asList(interfaceNames));
241245
traceReflectionTypeImpl(descriptor);
242246
}
243247

@@ -406,37 +410,6 @@ private void debugMethod(ConfigurationTypeDescriptor typeDescriptor, String meth
406410
debug("method registered for reflection", typeDescriptor + "." + methodName + internalSignature);
407411
}
408412

409-
/**
410-
* Disables tracing on the current thread from instantiation until {@link #close}.
411-
*/
412-
public sealed interface DisableTracing extends AutoCloseable {
413-
@Override
414-
void close();
415-
}
416-
417-
private final class DisableTracingImpl implements DisableTracing {
418-
final String oldReason;
419-
420-
private DisableTracingImpl(String reason) {
421-
this.oldReason = disableTracingReason.get();
422-
disableTracingReason.set(reason);
423-
}
424-
425-
@Override
426-
public void close() {
427-
disableTracingReason.set(oldReason);
428-
}
429-
}
430-
431-
private static final class DisableTracingNoOp implements DisableTracing {
432-
private static final DisableTracingNoOp INSTANCE = new DisableTracingNoOp();
433-
434-
@Override
435-
public void close() {
436-
// do nothing
437-
}
438-
}
439-
440413
/**
441414
* Disables tracing on the current thread from instantiation until {@link DisableTracing#close}.
442415
* Should be used in a try-with-resources block.
@@ -538,6 +511,37 @@ static RuntimeSupport.Hook checkImproperOptionUsageHook() {
538511
}
539512
};
540513
}
514+
515+
/**
516+
* Disables tracing on the current thread from instantiation until {@link #close}.
517+
*/
518+
public sealed interface DisableTracing extends AutoCloseable {
519+
@Override
520+
void close();
521+
}
522+
523+
private final class DisableTracingImpl implements DisableTracing {
524+
final String oldReason;
525+
526+
private DisableTracingImpl(String reason) {
527+
this.oldReason = disableTracingReason.get();
528+
disableTracingReason.set(reason);
529+
}
530+
531+
@Override
532+
public void close() {
533+
disableTracingReason.set(oldReason);
534+
}
535+
}
536+
537+
private static final class DisableTracingNoOp implements DisableTracing {
538+
private static final DisableTracingNoOp INSTANCE = new DisableTracingNoOp();
539+
540+
@Override
541+
public void close() {
542+
// do nothing
543+
}
544+
}
541545
}
542546

543547
record TraceOptions(Path path, boolean merge, Path debugLog) {
@@ -629,7 +633,7 @@ public List<Class<? extends Feature>> getRequiredFeatures() {
629633
}
630634

631635
@Override
632-
public void beforeAnalysis(BeforeAnalysisAccess access) {
636+
public void duringSetup(DuringSetupAccess access) {
633637
if (MetadataTracer.Options.MetadataTracingSupport.getValue()) {
634638
ImageSingletons.add(MetadataTracer.class, new MetadataTracer());
635639
RuntimeSupport.getRuntimeSupport().addInitializationHook(MetadataTracer.initializeMetadataTracingHook());

0 commit comments

Comments
 (0)