Skip to content

Commit 586afd5

Browse files
committed
Introduce helper to check if metadata tracing is enabled
1 parent 8a4c8d0 commit 586afd5

File tree

10 files changed

+41
-24
lines changed

10 files changed

+41
-24
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ private Object forName0(String className, ClassLoader classLoader) {
411411
/* Invalid class names always throw, no need for reflection data */
412412
return new ClassNotFoundException(className);
413413
}
414-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
414+
if (MetadataTracer.enabled()) {
415415
// NB: the early returns above ensure we do not trace calls with bad type args.
416416
MetadataTracer.singleton().traceReflectionType(className);
417417
}
@@ -500,7 +500,7 @@ public static Throwable getSavedException(String className) {
500500
*/
501501
public static boolean canUnsafeInstantiateAsInstance(DynamicHub hub) {
502502
Class<?> clazz = DynamicHub.toClass(hub);
503-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
503+
if (MetadataTracer.enabled()) {
504504
ConfigurationType type = MetadataTracer.singleton().traceReflectionType(clazz.getName());
505505
if (type != null) {
506506
type.setUnsafeAllocated();

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ private ReflectionMetadata reflectionMetadata() {
709709
}
710710

711711
private void checkClassFlag(int mask, String methodName) {
712-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
712+
if (MetadataTracer.enabled()) {
713713
traceClassFlagQuery(mask);
714714
}
715715
if (throwMissingRegistrationErrors() && !(isClassFlagSet(mask) && getConditions().satisfied())) {
@@ -1315,7 +1315,7 @@ private void checkField(String fieldName, Field field, boolean publicOnly) throw
13151315
boolean throwMissingErrors = throwMissingRegistrationErrors();
13161316
Class<?> clazz = DynamicHub.toClass(this);
13171317

1318-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
1318+
if (MetadataTracer.enabled()) {
13191319
traceFieldLookup(fieldName, field, publicOnly);
13201320
}
13211321

@@ -1397,7 +1397,7 @@ private boolean checkExecutableExists(String methodName, Class<?>[] parameterTyp
13971397
boolean throwMissingErrors = throwMissingRegistrationErrors();
13981398
Class<?> clazz = DynamicHub.toClass(this);
13991399

1400-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
1400+
if (MetadataTracer.enabled()) {
14011401
traceMethodLookup(methodName, parameterTypes, method, publicOnly);
14021402
}
14031403

@@ -1973,7 +1973,7 @@ public DynamicHub arrayType() {
19731973
if (toClass(this) == void.class) {
19741974
throw new UnsupportedOperationException(new IllegalArgumentException());
19751975
}
1976-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
1976+
if (MetadataTracer.enabled()) {
19771977
MetadataTracer.singleton().traceReflectionType(arrayTypeName());
19781978
}
19791979
if (companion.arrayHub == null) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaIOSubstitutions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ static ObjectStreamClass lookup(Class<?> cl, boolean all) {
6565
}
6666

6767
if (Serializable.class.isAssignableFrom(cl) && !cl.isArray()) {
68-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
68+
if (MetadataTracer.enabled()) {
6969
MetadataTracer.singleton().traceSerializationType(cl.getName());
7070
}
7171
if (!DynamicHub.fromClass(cl).isRegisteredForSerialization()) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaLangReflectSubstitutions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ private static void set(Object a, int index, Object value) {
387387
@Substitute
388388
private static Object newArray(Class<?> componentType, int length)
389389
throws NegativeArraySizeException {
390-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
390+
if (MetadataTracer.enabled()) {
391391
MetadataTracer.singleton().traceReflectionType(componentType.arrayType().getName());
392392
}
393393
return KnownIntrinsics.unvalidatedNewArray(componentType, length);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ public static ResourceStorageEntryBase getAtRuntime(Module module, String resour
498498

499499
@AlwaysInline("tracing should fold away when disabled")
500500
private static void traceResource(String resourceName, String moduleName) {
501-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
501+
if (MetadataTracer.enabled()) {
502502
MetadataTracer.singleton().traceResource(resourceName, moduleName);
503503
}
504504
}
@@ -510,7 +510,7 @@ private static void traceResourceMissingMetadata(String resourceName, String mod
510510

511511
@AlwaysInline("tracing should fold away when disabled")
512512
private static void traceResourceMissingMetadata(String resourceName, String moduleName, boolean probe) {
513-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled() && !probe) {
513+
if (MetadataTracer.enabled() && !probe) {
514514
// Do not trace missing metadata for probing queries, otherwise we'll trace an entry for
515515
// every module. The caller is responsible for tracing missing entries if it uses
516516
// probing.

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ public boolean isRegisteredBundleLookup(String baseName, Locale locale, Object c
294294
/* Those cases will throw a NullPointerException before any lookup */
295295
return true;
296296
}
297-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
297+
if (MetadataTracer.enabled()) {
298298
MetadataTracer.singleton().traceResourceBundle(baseName);
299299
}
300300
if (registeredBundles.containsKey(baseName)) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/access/JNIReflectionDictionary.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public static Class<?> getClassObjectByName(CharSequence name) {
184184
JNIAccessibleClass clazz = dictionary.classesByName.get(name);
185185
if (clazz == null && !ClassNameSupport.isValidJNIName(name.toString())) {
186186
clazz = NEGATIVE_CLASS_LOOKUP;
187-
} else if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
187+
} else if (MetadataTracer.enabled()) {
188188
// trace if class exists (positive query) or name is valid (negative query)
189189
MetadataTracer.singleton().traceJNIType(ClassNameSupport.jniNameToTypeName(name.toString()));
190190
}
@@ -273,7 +273,7 @@ public static JNIMethodId getDeclaredMethodID(Class<?> classObject, JNIAccessibl
273273
}
274274

275275
private static JNIAccessibleMethod getDeclaredMethod(Class<?> classObject, JNIAccessibleMethodDescriptor descriptor, String dumpLabel) {
276-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
276+
if (MetadataTracer.enabled()) {
277277
ConfigurationType clazzType = MetadataTracer.singleton().traceJNIType(classObject.getName());
278278
if (clazzType != null) {
279279
clazzType.addMethod(descriptor.getNameConvertToString(), descriptor.getSignatureConvertToString(), ConfigurationMemberInfo.ConfigurationMemberDeclaration.DECLARED);
@@ -334,7 +334,7 @@ private static JNIAccessibleMethod checkMethod(JNIAccessibleMethod method, Class
334334
}
335335

336336
private static JNIAccessibleField getDeclaredField(Class<?> classObject, CharSequence name, boolean isStatic, String dumpLabel) {
337-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
337+
if (MetadataTracer.enabled()) {
338338
ConfigurationType clazzType = MetadataTracer.singleton().traceJNIType(classObject.getName());
339339
if (clazzType != null) {
340340
clazzType.addField(name.toString(), ConfigurationMemberInfo.ConfigurationMemberDeclaration.DECLARED, false);

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

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.oracle.svm.configure.config.ConfigurationFileCollection;
4545
import com.oracle.svm.configure.config.ConfigurationSet;
4646
import com.oracle.svm.configure.config.ConfigurationType;
47+
import com.oracle.svm.core.AlwaysInline;
4748
import com.oracle.svm.core.SubstrateUtil;
4849
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
4950
import com.oracle.svm.core.feature.InternalFeature;
@@ -56,7 +57,6 @@
5657
import com.oracle.svm.core.thread.VMOperation;
5758
import com.oracle.svm.core.util.VMError;
5859

59-
import jdk.graal.compiler.api.replacements.Fold;
6060
import jdk.graal.compiler.options.Option;
6161
import jdk.graal.compiler.options.OptionStability;
6262

@@ -97,15 +97,32 @@ public static class Options {
9797
*/
9898
private volatile ConfigurationSet config;
9999

100-
@Fold
100+
/**
101+
* Returns the singleton object, which is only available if tracing is enabled at build time.
102+
* <p>
103+
* We use {@code @AlwaysInline} and not {@code @Fold} because the latter eagerly evaluates the
104+
* method, which fails when the singleton is unavailable.
105+
*/
106+
@AlwaysInline("avoid null check on singleton")
101107
public static MetadataTracer singleton() {
102108
return ImageSingletons.lookup(MetadataTracer.class);
103109
}
104110

111+
/**
112+
* Returns whether tracing is enabled. Tracing code should be guarded by this condition.
113+
* <p>
114+
* This condition is force-inlined so that when tracing support is not included at build time
115+
* the condition folds to false and the tracing code itself will fold away.
116+
*/
117+
@AlwaysInline("tracing should fold away when disabled")
118+
public static boolean enabled() {
119+
return Options.MetadataTracingSupport.getValue() && singleton().enabledAtRunTime();
120+
}
121+
105122
/**
106123
* Returns whether tracing is enabled at run time (using {@code -XX:RecordMetadata}).
107124
*/
108-
public boolean enabled() {
125+
private boolean enabledAtRunTime() {
109126
VMError.guarantee(Options.MetadataTracingSupport.getValue());
110127
return options != null;
111128
}
@@ -140,7 +157,7 @@ public void traceProxyType(List<String> interfaceNames) {
140157
}
141158

142159
private ConfigurationType traceReflectionTypeImpl(ConfigurationTypeDescriptor typeDescriptor) {
143-
assert enabled();
160+
assert enabledAtRunTime();
144161
ConfigurationSet configurationSet = getConfigurationSetForTracing();
145162
if (configurationSet != null) {
146163
return configurationSet.getReflectionConfiguration().getOrCreateType(UnresolvedConfigurationCondition.alwaysTrue(), typeDescriptor);
@@ -155,7 +172,7 @@ private ConfigurationType traceReflectionTypeImpl(ConfigurationTypeDescriptor ty
155172
* (e.g., during shutdown).
156173
*/
157174
public ConfigurationType traceJNIType(String className) {
158-
assert enabled();
175+
assert enabledAtRunTime();
159176
ConfigurationType result = traceReflectionType(className);
160177
if (result != null) {
161178
result.setJniAccessible();
@@ -168,7 +185,7 @@ public ConfigurationType traceJNIType(String className) {
168185
* trace resource lookups covered by image metadata (including negative queries).
169186
*/
170187
public void traceResource(String resourceName, String moduleName) {
171-
assert enabled();
188+
assert enabledAtRunTime();
172189
ConfigurationSet configurationSet = getConfigurationSetForTracing();
173190
if (configurationSet != null) {
174191
configurationSet.getResourceConfiguration().addGlobPattern(UnresolvedConfigurationCondition.alwaysTrue(), resourceName, moduleName);
@@ -179,7 +196,7 @@ public void traceResource(String resourceName, String moduleName) {
179196
* Marks the given resource bundle within the given locale as reachable.
180197
*/
181198
public void traceResourceBundle(String baseName) {
182-
assert enabled();
199+
assert enabledAtRunTime();
183200
ConfigurationSet configurationSet = getConfigurationSetForTracing();
184201
if (configurationSet != null) {
185202
configurationSet.getResourceConfiguration().addBundle(UnresolvedConfigurationCondition.alwaysTrue(), baseName, List.of());
@@ -190,7 +207,7 @@ public void traceResourceBundle(String baseName) {
190207
* Marks the given type as serializable.
191208
*/
192209
public void traceSerializationType(String className) {
193-
assert enabled();
210+
assert enabledAtRunTime();
194211
ConfigurationType result = traceReflectionType(className);
195212
if (result != null) {
196213
result.setSerializable();

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ private static ClassLoader getCommonClassLoaderOrFail(ClassLoader loader, Class<
191191

192192
@Override
193193
public Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) {
194-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
194+
if (MetadataTracer.enabled()) {
195195
List<String> interfaceNames = new ArrayList<>(interfaces.length);
196196
for (Class<?> iface : interfaces) {
197197
interfaceNames.add(iface.getName());

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/serialize/SerializationSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ public static Object getSerializationConstructorAccessor(Class<?> serializationT
267267
return constructorAccessor;
268268
}
269269
} else {
270-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
270+
if (MetadataTracer.enabled()) {
271271
MetadataTracer.singleton().traceSerializationType(declaringClass.getName());
272272
}
273273
for (var singleton : layeredSingletons()) {

0 commit comments

Comments
 (0)