Skip to content

Commit 82a41e5

Browse files
committed
Trace JNI accesses
1 parent 9184657 commit 82a41e5

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,19 @@ public boolean isClassInitializer() {
9898
return WRAPPED_CSTRING_EQUIVALENCE.equals(name, INITIALIZER_NAME);
9999
}
100100

101+
/**
102+
* Returns the method name as a String. Can be used if the descriptor is known to be a String
103+
* (i.e., it does not come from a JNI call); otherwise, use {@link #getNameConvertToString()}.
104+
*/
101105
public String getName() {
102106
return (String) name;
103107
}
104108

109+
/**
110+
* Returns the method signature as a String. Can be used if the descriptor is known to be a
111+
* String (i.e., it does not come from a JNI call); otherwise, use
112+
* {@link #getSignatureConvertToString()}.
113+
*/
105114
public String getSignature() {
106115
return (String) signature;
107116
}
@@ -113,6 +122,13 @@ public String getNameConvertToString() {
113122
return name.toString();
114123
}
115124

125+
/**
126+
* Performs a potentially costly conversion to string, only for slow paths.
127+
*/
128+
public String getSignatureConvertToString() {
129+
return signature.toString();
130+
}
131+
116132
public String getSignatureWithoutReturnType() {
117133
String signatureString = signature.toString();
118134
int parametersEnd = signatureString.lastIndexOf(')');

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
import org.graalvm.word.Pointer;
4343

4444
import com.oracle.svm.configure.ClassNameSupport;
45+
import com.oracle.svm.configure.config.ConfigurationMemberInfo;
46+
import com.oracle.svm.configure.config.ConfigurationType;
4547
import com.oracle.svm.core.SubstrateOptions;
4648
import com.oracle.svm.core.Uninterruptible;
4749
import com.oracle.svm.core.heap.Heap;
@@ -53,6 +55,7 @@
5355
import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton;
5456
import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton;
5557
import com.oracle.svm.core.log.Log;
58+
import com.oracle.svm.core.metadata.MetadataTracer;
5659
import com.oracle.svm.core.snippets.KnownIntrinsics;
5760
import com.oracle.svm.core.util.ImageHeapMap;
5861
import com.oracle.svm.core.util.Utf8.WrappedAsciiCString;
@@ -187,6 +190,9 @@ public static Class<?> getClassObjectByName(CharSequence name) {
187190
clazz = NEGATIVE_CLASS_LOOKUP;
188191
}
189192
}
193+
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && clazz != null && MetadataTracer.singleton().enabled()) {
194+
MetadataTracer.singleton().traceJNIType(ClassNameSupport.jniNameToTypeName(name.toString()));
195+
}
190196
clazz = checkClass(clazz, name);
191197
if (clazz != null) {
192198
return clazz.getClassObject();
@@ -279,6 +285,10 @@ private static JNIAccessibleMethod getDeclaredMethod(Class<?> classObject, JNIAc
279285
foundClass = true;
280286
JNIAccessibleMethod method = clazz.getMethod(descriptor);
281287
if (method != null) {
288+
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
289+
ConfigurationType clazzType = MetadataTracer.singleton().traceJNIType(classObject.getName());
290+
clazzType.addMethod(descriptor.getNameConvertToString(), descriptor.getSignatureConvertToString(), ConfigurationMemberInfo.ConfigurationMemberDeclaration.DECLARED);
291+
}
282292
return method;
283293
}
284294
}
@@ -334,6 +344,10 @@ private static JNIAccessibleField getDeclaredField(Class<?> classObject, CharSeq
334344
foundClass = true;
335345
JNIAccessibleField field = clazz.getField(name);
336346
if (field != null && (field.isStatic() == isStatic || field.isNegative())) {
347+
if (MetadataTracer.Options.MetadataTracingSupport.getValue() && MetadataTracer.singleton().enabled()) {
348+
ConfigurationType clazzType = MetadataTracer.singleton().traceJNIType(classObject.getName());
349+
clazzType.addField(name.toString(), ConfigurationMemberInfo.ConfigurationMemberDeclaration.DECLARED, false);
350+
}
337351
return field;
338352
}
339353
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ public ConfigurationType traceReflectionType(String className) {
8585
return config.getReflectionConfiguration().getOrCreateType(UnresolvedConfigurationCondition.alwaysTrue(), new NamedConfigurationTypeDescriptor(className));
8686
}
8787

88+
public ConfigurationType traceJNIType(String className) {
89+
assert enabled();
90+
ConfigurationType result = traceReflectionType(className);
91+
result.setJniAccessible();
92+
return result;
93+
}
94+
8895
public void traceResource(String resourceName, String moduleName) {
8996
assert enabled();
9097
config.getResourceConfiguration().addGlobPattern(UnresolvedConfigurationCondition.alwaysTrue(), resourceName, moduleName);

0 commit comments

Comments
 (0)