23
23
24
24
#include "jvm.h"
25
25
#include "jvmti.h"
26
+ #include "jmm_common.h"
26
27
#include "structs.h"
27
28
28
29
#include <jni.h>
31
32
#include <string.h>
32
33
33
34
#define JNI_STRUCT_MEMBER_LIST (V ) \
34
- V(JavaVMAttachArgs, version) \
35
- V(JavaVMAttachArgs, name) \
36
- V(JavaVMAttachArgs, group) \
35
+ V(JavaVMAttachArgs, version) \
36
+ V(JavaVMAttachArgs, name) \
37
+ V(JavaVMAttachArgs, group)
37
38
38
39
#define JVM_STRUCT_MEMBER_LIST (V ) \
39
40
V(jdk_version_info, jdk_version)
171
172
V(_jvmtiEventCallbacks, VMObjectAlloc) \
172
173
V(_jvmtiEventCallbacks, reserved85) \
173
174
V(_jvmtiEventCallbacks, SampledObjectAlloc)
174
-
175
+
176
+ #define JMM_STRUCT_BITFIELD_MEMBER_LIST (V ) \
177
+ V(jmmOptionalSupport, isLowMemoryDetectionSupported) \
178
+ V(jmmOptionalSupport, isCompilationTimeMonitoringSupported) \
179
+ V(jmmOptionalSupport, isThreadContentionMonitoringSupported) \
180
+ V(jmmOptionalSupport, isCurrentThreadCpuTimeSupported) \
181
+ V(jmmOptionalSupport, isOtherThreadCpuTimeSupported) \
182
+ V(jmmOptionalSupport, isObjectMonitorUsageSupported) \
183
+ V(jmmOptionalSupport, isSynchronizerUsageSupported) \
184
+ V(jmmOptionalSupport, isThreadAllocatedMemorySupported) \
185
+ V(jmmOptionalSupport, isRemoteDiagnosticCommandsSupported)
186
+
175
187
#define MEMBER_INFO_STRUCT_MEMBER_LIST (V ) \
176
188
V(member_info, id) \
177
189
V(member_info, offset) \
178
190
V(member_info, next)
179
-
191
+
180
192
#define JNI_STRUCT_LIST (V ) \
181
- V(JavaVMAttachArgs) \
182
- V(JavaVMAttachArgs) \
183
- V(JavaVMAttachArgs) \
193
+ V(JavaVMAttachArgs)
184
194
185
195
#define JVM_STRUCT_LIST (V ) \
186
196
V(jdk_version_info)
187
-
197
+
188
198
#define JVMTI_STRUCT_LIST (V ) \
189
199
V(_jvmtiThreadInfo) \
190
200
V(_jvmtiMonitorStackDepthInfo) \
208
218
V(_jvmtiTimerInfo) \
209
219
V(_jvmtiAddrLocationMap) \
210
220
V(_jvmtiEventCallbacks)
211
-
221
+
222
+ #define JMM_STRUCT_LIST (V ) \
223
+ V(jmmOptionalSupport)
224
+
212
225
#define MEMBER_INFO_STRUCT_LIST (V ) \
213
226
V(member_info)
214
227
215
228
#define STRUCT_LIST_LIST (V ) \
216
- JNI_STRUCT_LIST(V) \
217
- JVM_STRUCT_LIST(V) \
229
+ JNI_STRUCT_LIST(V) \
230
+ JVM_STRUCT_LIST(V) \
218
231
JVMTI_STRUCT_LIST(V) \
232
+ JMM_STRUCT_LIST(V) \
219
233
MEMBER_INFO_STRUCT_LIST(V)
220
-
234
+
221
235
#define STRUCT_MEMBER_LIST_LIST (V ) \
222
- JNI_STRUCT_MEMBER_LIST(V) \
223
- JVM_STRUCT_MEMBER_LIST(V) \
236
+ JNI_STRUCT_MEMBER_LIST(V) \
237
+ JVM_STRUCT_MEMBER_LIST(V) \
224
238
JVMTI_STRUCT_MEMBER_LIST(V) \
225
239
MEMBER_INFO_STRUCT_MEMBER_LIST(V)
226
240
241
+ #define STRUCT_BITFIELD_MEMBER_LIST_LIST (V ) \
242
+ JMM_STRUCT_BITFIELD_MEMBER_LIST(V)
243
+
227
244
void add_member_info (member_info * * info , char * id , size_t offset ) {
228
- member_info * current = malloc (sizeof (struct member_info ));
229
- current -> id = id ;
230
- current -> offset = offset ;
231
- current -> next = (* info );
232
- * info = current ;
245
+ member_info * current = malloc (sizeof (struct member_info ));
246
+ current -> id = id ;
247
+ current -> offset = offset ;
248
+ current -> next = (* info );
249
+ * info = current ;
233
250
}
234
251
235
252
size_t lookup_member_info (member_info * * info , char * id ) {
236
- for (member_info * current = * info ; current != NULL ; current = current -> next ) {
237
- if (strcmp (id , current -> id ) == 0 ) {
238
- return current -> offset ;
239
- }
240
- }
241
- return -1 ;
253
+ for (member_info * current = * info ; current != NULL ; current = current -> next ) {
254
+ if (strcmp (id , current -> id ) == 0 ) {
255
+ return current -> offset ;
256
+ }
257
+ }
258
+ return -1 ;
242
259
}
243
260
244
261
void free_member_info (member_info * * info ) {
@@ -256,21 +273,62 @@ void free_member_info(member_info** info) {
256
273
JNIEXPORT void JNICALL initializeStructs (void (* notify_member_offset_init )(void * )) {
257
274
member_info * * info = malloc (sizeof (struct member_info * ));
258
275
(* info ) = NULL ;
259
-
276
+
260
277
#define MEMBER_INFO__ (STRUCT_NAME , MEMBER_NAME ) \
261
278
add_member_info(info, #STRUCT_NAME "." #MEMBER_NAME, offsetof(struct STRUCT_NAME, MEMBER_NAME));
262
-
279
+
263
280
STRUCT_MEMBER_LIST_LIST (MEMBER_INFO__ )
264
281
#undef MEMBER_INFO__
265
282
283
+ // from com.oracle.svm.hosted.c.codegen.QueryCodeWriter#visitStructBitfieldInfo
284
+ #define MEMBER_INFO__ (STRUCT_NAME , MEMBER_NAME ) \
285
+ { \
286
+ struct _w { \
287
+ STRUCT_NAME s; \
288
+ jlong pad; \
289
+ } w; \
290
+ char *p; \
291
+ size_t byte_offset; \
292
+ unsigned char start_bit = 0, end_bit = 0; \
293
+ jlong v; \
294
+ jlong all_bits_set = -1; \
295
+ memset(&w, 0x0, sizeof(w)); \
296
+ w.s.MEMBER_NAME = all_bits_set; \
297
+ p = (char*)&w.s; \
298
+ byte_offset = 0; \
299
+ while (byte_offset < sizeof(w.s) && *(p + byte_offset) == 0) { \
300
+ byte_offset++; \
301
+ } \
302
+ if (byte_offset >= sizeof(w.s)) { \
303
+ start_bit = end_bit = -1;\
304
+ } else { \
305
+ v = *((jlong*) (p + byte_offset)); \
306
+ while ((v & 0x1) == 0) { \
307
+ start_bit++; \
308
+ v = v >> 1; \
309
+ } \
310
+ end_bit = start_bit; \
311
+ while (v != 1) { \
312
+ end_bit++; \
313
+ v = v >> 1; \
314
+ } \
315
+ } \
316
+ add_member_info(info, #STRUCT_NAME "." #MEMBER_NAME, byte_offset); \
317
+ add_member_info(info, #STRUCT_NAME "." #MEMBER_NAME ".StartBit", start_bit); \
318
+ add_member_info(info, #STRUCT_NAME "." #MEMBER_NAME ".EndBit", end_bit + 1); \
319
+ }
320
+
321
+ STRUCT_BITFIELD_MEMBER_LIST_LIST (MEMBER_INFO__ )
322
+ #undef MEMBER_INFO__
323
+
266
324
#define STRUCT_INFO__ (STRUCT_NAME ) \
267
325
add_member_info(info, #STRUCT_NAME, sizeof(struct STRUCT_NAME));
268
326
269
327
STRUCT_LIST_LIST (STRUCT_INFO__ )
270
328
#undef STRUCT_INFO__
271
-
329
+
272
330
notify_member_offset_init (info );
273
-
331
+
274
332
free_member_info (info );
275
333
}
276
334
0 commit comments