Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/jcl/common/jithelpers.c
6000 views
1
/*******************************************************************************
2
* Copyright (c) 1998, 2021 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include "jni.h"
24
#include "j9.h"
25
#include "j9cp.h"
26
#include "jclprots.h"
27
#include "j9modifiers_api.h"
28
29
/*
30
* The following natives are called by the JITHelpers static initializer. They do not require special treatment by the JIT.
31
*/
32
33
jint JNICALL
34
Java_com_ibm_jit_JITHelpers_javaLangClassJ9ClassOffset(JNIEnv *env, jclass ignored)
35
{
36
J9VMThread * vmThread = (J9VMThread *)env;
37
jint offset;
38
39
vmThread->javaVM->internalVMFunctions->internalEnterVMFromJNI(vmThread);
40
offset = (jint) J9VMJAVALANGCLASS_VMREF_OFFSET(vmThread);
41
vmThread->javaVM->internalVMFunctions->internalExitVMToJNI(vmThread);
42
43
return offset;
44
}
45
46
jint JNICALL
47
Java_com_ibm_jit_JITHelpers_j9ObjectJ9ClassOffset(JNIEnv *env, jclass ignored)
48
{
49
return (jint) offsetof(J9Object, clazz);
50
}
51
52
jint JNICALL
53
Java_com_ibm_jit_JITHelpers_j9ObjectFlagsMask32(JNIEnv *env, jclass ignored)
54
{
55
return (jint) (J9_REQUIRED_CLASS_ALIGNMENT - 1);
56
}
57
58
jlong JNICALL
59
Java_com_ibm_jit_JITHelpers_j9ObjectFlagsMask64(JNIEnv *env, jclass ignored)
60
{
61
return (jlong)(J9_REQUIRED_CLASS_ALIGNMENT - 1);
62
}
63
64
jint JNICALL
65
Java_com_ibm_jit_JITHelpers_javaLangThreadJ9ThreadOffset(JNIEnv *env, jclass ignored)
66
{
67
J9VMThread * vmThread = (J9VMThread *)env;
68
return (jint) J9VMJAVALANGTHREAD_THREADREF_OFFSET(vmThread);
69
}
70
71
jint JNICALL
72
Java_com_ibm_jit_JITHelpers_j9ThreadJ9JavaVMOffset(JNIEnv *env, jclass ignored)
73
{
74
return (jint) offsetof(J9VMThread, javaVM);
75
}
76
77
jint JNICALL
78
Java_com_ibm_jit_JITHelpers_j9ROMArrayClassArrayShapeOffset(JNIEnv *env, jclass ignored)
79
{
80
return (jint) offsetof(J9ROMArrayClass, arrayShape);
81
}
82
83
jint JNICALL
84
Java_com_ibm_jit_JITHelpers_j9ClassBackfillOffsetOffset(JNIEnv *env, jclass ignored)
85
{
86
return (jint) offsetof(J9Class, backfillOffset);
87
}
88
89
jint JNICALL
90
Java_com_ibm_jit_JITHelpers_arrayShapeElementCountMask(JNIEnv *env, jclass ignored)
91
{
92
return (jint) 0x0000FFFF;
93
}
94
95
jint JNICALL
96
Java_com_ibm_jit_JITHelpers_j9JavaVMIdentityHashDataOffset(JNIEnv *env, jclass ignored)
97
{
98
return (jint) offsetof(J9JavaVM, identityHashData);
99
}
100
101
jint JNICALL
102
Java_com_ibm_jit_JITHelpers_j9IdentityHashDataHashData1Offset(JNIEnv *env, jclass ignored)
103
{
104
return (jint) offsetof(J9IdentityHashData, hashData1);
105
}
106
107
jint JNICALL
108
Java_com_ibm_jit_JITHelpers_j9IdentityHashDataHashData2Offset(JNIEnv *env, jclass ignored)
109
{
110
return (jint) offsetof(J9IdentityHashData, hashData2);
111
}
112
113
jint JNICALL
114
Java_com_ibm_jit_JITHelpers_j9IdentityHashDataHashData3Offset(JNIEnv *env, jclass ignored)
115
{
116
return (jint) offsetof(J9IdentityHashData, hashData3);
117
}
118
119
jint JNICALL
120
Java_com_ibm_jit_JITHelpers_j9IdentityHashDataHashSaltTableOffset(JNIEnv *env, jclass ignored)
121
{
122
return (jint) offsetof(J9IdentityHashData, hashSaltTable);
123
}
124
125
jint JNICALL
126
Java_com_ibm_jit_JITHelpers_j9IdentityHashSaltPolicyStandard(JNIEnv *env, jclass ignored)
127
{
128
return (jint) J9_IDENTITY_HASH_SALT_POLICY_STANDARD;
129
}
130
131
jint JNICALL
132
Java_com_ibm_jit_JITHelpers_j9IdentityHashSaltPolicyRegion(JNIEnv *env, jclass ignored)
133
{
134
return (jint) J9_IDENTITY_HASH_SALT_POLICY_REGION;
135
}
136
137
jint JNICALL
138
Java_com_ibm_jit_JITHelpers_j9IdentityHashSaltPolicyNone(JNIEnv *env, jclass ignored)
139
{
140
return (jint) J9_IDENTITY_HASH_SALT_POLICY_NONE;
141
}
142
143
jint JNICALL
144
Java_com_ibm_jit_JITHelpers_identityHashSaltPolicy(JNIEnv *env, jclass ignored)
145
{
146
J9VMThread * vmThread = (J9VMThread *)env;
147
J9IdentityHashData *hashData = vmThread->javaVM->identityHashData;
148
UDATA saltPolicy = hashData->hashSaltPolicy;
149
return (jint) saltPolicy;
150
}
151
152
153
jint JNICALL
154
Java_com_ibm_jit_JITHelpers_j9ContiguousArrayHeaderSize(JNIEnv *env, jclass ignored)
155
{
156
return (jint) J9VMTHREAD_CONTIGUOUS_HEADER_SIZE((J9VMThread*)env);
157
}
158
159
jint JNICALL
160
Java_com_ibm_jit_JITHelpers_j9DiscontiguousArrayHeaderSize(JNIEnv *env, jclass ignored)
161
{
162
return (jint) J9VMTHREAD_DISCONTIGUOUS_HEADER_SIZE((J9VMThread*)env);
163
}
164
165
jint JNICALL
166
Java_com_ibm_jit_JITHelpers_j9ObjectContiguousLengthOffset(JNIEnv *env, jclass ignored)
167
{
168
if (J9VMTHREAD_COMPRESS_OBJECT_REFERENCES((J9VMThread*)env)) {
169
return (jint) offsetof(J9IndexableObjectContiguousCompressed, size);
170
}
171
return (jint) offsetof(J9IndexableObjectContiguousFull, size);
172
}
173
174
jint JNICALL
175
Java_com_ibm_jit_JITHelpers_j9ObjectDiscontiguousLengthOffset(JNIEnv *env, jclass ignored)
176
{
177
if (J9VMTHREAD_COMPRESS_OBJECT_REFERENCES((J9VMThread*)env)) {
178
return (jint) offsetof(J9IndexableObjectDiscontiguousCompressed, size);
179
}
180
return (jint) offsetof(J9IndexableObjectDiscontiguousFull, size);
181
}
182
183
jboolean JNICALL
184
Java_com_ibm_jit_JITHelpers_isBigEndian(JNIEnv *env, jclass ignored)
185
{
186
#if defined(J9VM_ENV_LITTLE_ENDIAN)
187
return JNI_FALSE;
188
#else
189
return JNI_TRUE;
190
#endif
191
}
192
193
/*
194
* The following natives are recognized and handled specially by the JIT.
195
*/
196
197
jboolean JNICALL
198
Java_com_ibm_jit_JITHelpers_is32Bit(JNIEnv *env, jobject rcv)
199
{
200
#if defined(J9VM_ENV_DATA64)
201
return JNI_FALSE;
202
#else
203
return JNI_TRUE;
204
#endif
205
}
206
207
jint JNICALL
208
Java_com_ibm_jit_JITHelpers_getNumBitsInReferenceField(JNIEnv *env, jobject rcv)
209
{
210
return (jint) (J9VMTHREAD_REFERENCE_SIZE((J9VMThread*)env) * 8);
211
}
212
213
jint JNICALL
214
Java_com_ibm_jit_JITHelpers_getNumBytesInReferenceField(JNIEnv *env, jobject rcv)
215
{
216
return (jint) J9VMTHREAD_REFERENCE_SIZE((J9VMThread*)env);
217
}
218
219
jint JNICALL
220
Java_com_ibm_jit_JITHelpers_getNumBitsInDescriptionWord(JNIEnv *env, jobject rcv)
221
{
222
return (jint) (sizeof(UDATA) * 8);
223
}
224
225
jint JNICALL
226
Java_com_ibm_jit_JITHelpers_getNumBytesInDescriptionWord(JNIEnv *env, jobject rcv)
227
{
228
return (jint) sizeof(UDATA);
229
}
230
231
jint JNICALL
232
Java_com_ibm_jit_JITHelpers_getNumBytesInJ9ObjectHeader(JNIEnv *env, jobject rcv)
233
{
234
return (jint) J9VMTHREAD_OBJECT_HEADER_SIZE((J9VMThread*)env);
235
}
236
237
#if defined(J9VM_ENV_DATA64)
238
239
jlong JNICALL
240
Java_com_ibm_jit_JITHelpers_getJ9ClassFromClass64(JNIEnv *env, jobject rcv, jclass c)
241
{
242
J9VMThread * vmThread = (J9VMThread *)env;
243
J9Class * clazz;
244
245
vmThread->javaVM->internalVMFunctions->internalEnterVMFromJNI(vmThread);
246
clazz = J9VM_J9CLASS_FROM_HEAPCLASS(vmThread, J9_JNI_UNWRAP_REFERENCE(c));
247
vmThread->javaVM->internalVMFunctions->internalExitVMToJNI(vmThread);
248
return (jlong)(UDATA)clazz;
249
}
250
251
jobject JNICALL
252
Java_com_ibm_jit_JITHelpers_getClassFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)
253
{
254
J9VMThread * vmThread = (J9VMThread *)env;
255
J9InternalVMFunctions * vmfns = vmThread->javaVM->internalVMFunctions;
256
jobject classRef;
257
258
vmfns->internalEnterVMFromJNI(vmThread);
259
classRef = vmfns->j9jni_createLocalRef(env, J9VM_J9CLASS_TO_HEAPCLASS((J9Class*)(UDATA)j9clazz));
260
if (NULL == classRef) {
261
vmfns->setNativeOutOfMemoryError(vmThread, 0, 0);
262
}
263
vmfns->internalExitVMToJNI(vmThread);
264
return classRef;
265
}
266
267
jlong JNICALL
268
Java_com_ibm_jit_JITHelpers_getTotalInstanceSizeFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)
269
{
270
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
271
272
return (jlong)clazz->totalInstanceSize;
273
}
274
275
jlong JNICALL
276
Java_com_ibm_jit_JITHelpers_getInstanceDescriptionFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)
277
{
278
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
279
280
return (jlong)(UDATA)clazz->instanceDescription;
281
}
282
283
jlong JNICALL
284
Java_com_ibm_jit_JITHelpers_getDescriptionWordFromPtr64(JNIEnv *env, jobject rcv, jlong descriptorPtr)
285
{
286
return *(jlong*)(UDATA)descriptorPtr;
287
}
288
289
jlong JNICALL
290
Java_com_ibm_jit_JITHelpers_getRomClassFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)
291
{
292
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
293
294
return (jlong)(UDATA)clazz->romClass;
295
}
296
297
jlong JNICALL
298
Java_com_ibm_jit_JITHelpers_getSuperClassesFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)
299
{
300
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
301
302
return (jlong)(UDATA)clazz->superclasses;
303
}
304
305
jlong JNICALL
306
Java_com_ibm_jit_JITHelpers_getClassDepthAndFlagsFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)
307
{
308
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
309
310
return (jlong)clazz->classDepthAndFlags;
311
}
312
313
jlong JNICALL
314
Java_com_ibm_jit_JITHelpers_getBackfillOffsetFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)
315
{
316
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
317
318
return (jlong)clazz->backfillOffset;
319
}
320
321
jint JNICALL
322
Java_com_ibm_jit_JITHelpers_getArrayShapeFromRomClass64(JNIEnv *env, jobject rcv, jlong j9romclazz)
323
{
324
J9ROMArrayClass * romArrayClass = (J9ROMArrayClass *)(UDATA)j9romclazz;
325
326
return (jint)romArrayClass->arrayShape;
327
}
328
329
jint JNICALL
330
Java_com_ibm_jit_JITHelpers_getModifiersFromRomClass64(JNIEnv *env, jobject rcv, jlong j9romclazz)
331
{
332
J9ROMClass * romClass = (J9ROMClass *)(UDATA)j9romclazz;
333
334
return (jint)romClass->modifiers;
335
}
336
337
jint JNICALL
338
Java_com_ibm_jit_JITHelpers_getClassFlagsFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)
339
{
340
J9Class *clazz = (J9Class *)(UDATA)j9clazz;
341
return clazz->classFlags;
342
}
343
#else
344
345
jint JNICALL
346
Java_com_ibm_jit_JITHelpers_getJ9ClassFromClass32(JNIEnv *env, jobject rcv, jclass c)
347
{
348
J9VMThread * vmThread = (J9VMThread *)env;
349
J9Class * clazz;
350
351
vmThread->javaVM->internalVMFunctions->internalEnterVMFromJNI(vmThread);
352
clazz = J9VM_J9CLASS_FROM_HEAPCLASS(vmThread, J9_JNI_UNWRAP_REFERENCE(c));
353
vmThread->javaVM->internalVMFunctions->internalExitVMToJNI(vmThread);
354
return (jint)(UDATA)clazz;
355
}
356
357
jobject JNICALL
358
Java_com_ibm_jit_JITHelpers_getClassFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)
359
{
360
J9VMThread * vmThread = (J9VMThread *)env;
361
J9InternalVMFunctions * vmfns = vmThread->javaVM->internalVMFunctions;
362
jobject classRef;
363
364
vmfns->internalEnterVMFromJNI(vmThread);
365
classRef = vmfns->j9jni_createLocalRef(env, J9VM_J9CLASS_TO_HEAPCLASS((J9Class*)(UDATA)j9clazz));
366
if (NULL == classRef) {
367
vmfns->setNativeOutOfMemoryError(vmThread, 0, 0);
368
}
369
vmfns->internalExitVMToJNI(vmThread);
370
return classRef;
371
}
372
373
jint JNICALL
374
Java_com_ibm_jit_JITHelpers_getTotalInstanceSizeFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)
375
{
376
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
377
378
return (jint)clazz->totalInstanceSize;
379
}
380
381
jint JNICALL
382
Java_com_ibm_jit_JITHelpers_getInstanceDescriptionFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)
383
{
384
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
385
386
return (jint)(UDATA)clazz->instanceDescription;
387
}
388
389
jint JNICALL
390
Java_com_ibm_jit_JITHelpers_getDescriptionWordFromPtr32(JNIEnv *env, jobject rcv, jint descriptorPtr)
391
{
392
return *(jint*)(UDATA)descriptorPtr;
393
}
394
395
jint JNICALL
396
Java_com_ibm_jit_JITHelpers_getRomClassFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)
397
{
398
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
399
400
return (jint)(UDATA)clazz->romClass;
401
}
402
403
jint JNICALL
404
Java_com_ibm_jit_JITHelpers_getSuperClassesFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)
405
{
406
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
407
408
return (jint)(UDATA)clazz->superclasses;
409
}
410
411
jint JNICALL
412
Java_com_ibm_jit_JITHelpers_getClassDepthAndFlagsFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)
413
{
414
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
415
416
return (jint)clazz->classDepthAndFlags;
417
}
418
419
jint JNICALL
420
Java_com_ibm_jit_JITHelpers_getBackfillOffsetFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)
421
{
422
J9Class * clazz = (J9Class *)(UDATA)j9clazz;
423
424
return (jint)clazz->backfillOffset;
425
}
426
427
jint JNICALL
428
Java_com_ibm_jit_JITHelpers_getArrayShapeFromRomClass32(JNIEnv *env, jobject rcv, jint j9romclazz)
429
{
430
J9ROMArrayClass * romArrayClass = (J9ROMArrayClass *)(UDATA)j9romclazz;
431
432
return (jint)romArrayClass->arrayShape;
433
}
434
435
jint JNICALL
436
Java_com_ibm_jit_JITHelpers_getModifiersFromRomClass32(JNIEnv *env, jobject rcv, jint j9romclazz)
437
{
438
J9ROMClass * romClass = (J9ROMClass *)(UDATA)j9romclazz;
439
440
return (jint)romClass->modifiers;
441
}
442
443
jint JNICALL
444
Java_com_ibm_jit_JITHelpers_getClassFlagsFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)
445
{
446
J9Class *clazz = (J9Class *)(UDATA)j9clazz;
447
return clazz->classFlags;
448
}
449
450
#endif
451
452