Skip to content

Commit 7f2657b

Browse files
committed
Introduce helper to check if metadata tracing is enabled
1 parent 630dd93 commit 7f2657b

File tree

10 files changed

+34
-24
lines changed

10 files changed

+34
-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
@@ -356,7 +356,7 @@ private Object forName0(String className, ClassLoader classLoader) {
356356
/* Invalid class names always throw, no need for reflection data */
357357
return new ClassNotFoundException(className);
358358
}
359-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
359+
if (MetadataTracer.enabled()) {
360360
// NB: the early returns above ensure we do not trace calls with bad type args.
361361
MetadataTracer.singleton().traceReflectionType(className);
362362
}
@@ -445,7 +445,7 @@ public static Throwable getSavedException(String className) {
445445
*/
446446
public static boolean canUnsafeInstantiateAsInstance(DynamicHub hub) {
447447
Class<?> clazz = DynamicHub.toClass(hub);
448-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
448+
if (MetadataTracer.enabled()) {
449449
ConfigurationType type = MetadataTracer.singleton().traceReflectionType(clazz.getName());
450450
if (type != null) {
451451
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
@@ -70,7 +70,7 @@ static ObjectStreamClass lookup(Class<?> cl, boolean all) {
7070
}
7171

7272
if (Serializable.class.isAssignableFrom(cl) && !cl.isArray()) {
73-
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
73+
if (MetadataTracer.enabled()) {
7474
MetadataTracer.singleton().traceSerializationType(cl.getName());
7575
}
7676
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: 18 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,25 @@ public static class Options {
9797
*/
9898
private volatile ConfigurationSet config;
9999

100-
@Fold
101100
public static MetadataTracer singleton() {
102101
return ImageSingletons.lookup(MetadataTracer.class);
103102
}
104103

104+
/**
105+
* Returns whether tracing is enabled. Tracing code should be guarded by this condition.
106+
* <p>
107+
* This condition is force-inlined so that when tracing support is not included at build time
108+
* the condition folds to false and the tracing code itself will fold away.
109+
*/
110+
@AlwaysInline("tracing should fold away when disabled")
111+
public static boolean enabled() {
112+
return Options.MetadataTracingSupport.getValue() && singleton().enabledAtRunTime();
113+
}
114+
105115
/**
106116
* Returns whether tracing is enabled at run time (using {@code -XX:RecordMetadata}).
107117
*/
108-
public boolean enabled() {
118+
private boolean enabledAtRunTime() {
109119
VMError.guarantee(Options.MetadataTracingSupport.getValue());
110120
return options != null;
111121
}
@@ -140,7 +150,7 @@ public void traceProxyType(List<String> interfaceNames) {
140150
}
141151

142152
private ConfigurationType traceReflectionTypeImpl(ConfigurationTypeDescriptor typeDescriptor) {
143-
assert enabled();
153+
assert enabledAtRunTime();
144154
ConfigurationSet configurationSet = getConfigurationSetForTracing();
145155
if (configurationSet != null) {
146156
return configurationSet.getReflectionConfiguration().getOrCreateType(UnresolvedConfigurationCondition.alwaysTrue(), typeDescriptor);
@@ -155,7 +165,7 @@ private ConfigurationType traceReflectionTypeImpl(ConfigurationTypeDescriptor ty
155165
* (e.g., during shutdown).
156166
*/
157167
public ConfigurationType traceJNIType(String className) {
158-
assert enabled();
168+
assert enabledAtRunTime();
159169
ConfigurationType result = traceReflectionType(className);
160170
if (result != null) {
161171
result.setJniAccessible();
@@ -168,7 +178,7 @@ public ConfigurationType traceJNIType(String className) {
168178
* trace resource lookups covered by image metadata (including negative queries).
169179
*/
170180
public void traceResource(String resourceName, String moduleName) {
171-
assert enabled();
181+
assert enabledAtRunTime();
172182
ConfigurationSet configurationSet = getConfigurationSetForTracing();
173183
if (configurationSet != null) {
174184
configurationSet.getResourceConfiguration().addGlobPattern(UnresolvedConfigurationCondition.alwaysTrue(), resourceName, moduleName);
@@ -179,7 +189,7 @@ public void traceResource(String resourceName, String moduleName) {
179189
* Marks the given resource bundle within the given locale as reachable.
180190
*/
181191
public void traceResourceBundle(String baseName) {
182-
assert enabled();
192+
assert enabledAtRunTime();
183193
ConfigurationSet configurationSet = getConfigurationSetForTracing();
184194
if (configurationSet != null) {
185195
configurationSet.getResourceConfiguration().addBundle(UnresolvedConfigurationCondition.alwaysTrue(), baseName, List.of());
@@ -190,7 +200,7 @@ public void traceResourceBundle(String baseName) {
190200
* Marks the given type as serializable.
191201
*/
192202
public void traceSerializationType(String className) {
193-
assert enabled();
203+
assert enabledAtRunTime();
194204
ConfigurationType result = traceReflectionType(className);
195205
if (result != null) {
196206
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)