Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/codert_vm/cnathelp.cpp
5985 views
1
/*******************************************************************************
2
* Copyright (c) 1991, 2022 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 "j9.h"
24
#include "j9protos.h"
25
#include "j9consts.h"
26
#include "stackwalk.h"
27
#include "j9vmnls.h"
28
#include "objhelp.h"
29
#include "jitprotos.h"
30
#include "VMHelpers.hpp"
31
#include "VMAccess.hpp"
32
#include "AtomicSupport.hpp"
33
#include "JITInterface.hpp"
34
#include "ObjectAccessBarrierAPI.hpp"
35
#include "MethodMetaData.h"
36
#include "ut_j9codertvm.h"
37
38
#if defined(OSX) && defined(AARCH64)
39
#include <pthread.h> // for pthread_jit_write_protect_np
40
#endif
41
42
#undef DEBUG
43
44
extern "C" {
45
46
void* J9FASTCALL
47
old_slow_jitThrowNullPointerException(J9VMThread *currentThread);
48
49
J9_EXTERN_BUILDER_SYMBOL(throwCurrentExceptionFromJIT);
50
J9_EXTERN_BUILDER_SYMBOL(handlePopFramesFromJIT);
51
#define J9_JITHELPER_ACTION_THROW J9_BUILDER_SYMBOL(throwCurrentExceptionFromJIT)
52
#define J9_JITHELPER_ACTION_POP_FRAMES J9_BUILDER_SYMBOL(handlePopFramesFromJIT)
53
54
J9_EXTERN_BUILDER_SYMBOL(jitRunOnJavaStack);
55
#define JIT_RUN_ON_JAVA_STACK(x) (currentThread->tempSlot = (UDATA)(x), J9_BUILDER_SYMBOL(jitRunOnJavaStack))
56
57
#if defined(J9ZOS390) && !defined(J9VM_ENV_DATA64)
58
/* There is a bug in ZOS xlC which fails to mask one of the PCs if this is done inline */
59
static VMINLINE bool
60
samePCs(void *pc1, void *pc2)
61
{
62
UDATA x = (UDATA)pc1 ^ (UDATA)pc2;
63
return (0 == x) || (0x80000000 == x);
64
}
65
#else /* J9ZOS390 && !J9VM_ENV_DATA64 */
66
#define samePCs(pc1, pc2) (MASK_PC(pc1) == MASK_PC(pc2))
67
#endif /* J9ZOS390 && !J9VM_ENV_DATA64 */
68
69
/**
70
* Fix the java and decompilation stacks for cases where exceptions can be
71
* thrown from insde a JIT synthetic exception handler. There must be a
72
* resolve frame on the top of the java stack with a valid JIT PC.
73
*
74
* @param currentThread[in] the current J9VMThread
75
*/
76
static void
77
fixStackForSyntheticHandler(J9VMThread *currentThread)
78
{
79
/* If the top decompilation record is for the current compiled frame, re-link the resolve frame
80
* and decompilation record to keep the stack walkable.
81
*/
82
J9JITDecompilationInfo *decomp = currentThread->decompilationStack;
83
if (NULL != decomp) {
84
J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;
85
void *jitPC = MASK_PC(resolveFrame->returnAddress);
86
J9JITExceptionTable *metaData = jitGetExceptionTableFromPC(currentThread, (UDATA)jitPC);
87
Assert_CodertVM_false(NULL == metaData);
88
UDATA *oldSP = (UDATA*)(resolveFrame + 1);
89
UDATA *bp = oldSP + getJitTotalFrameSize(metaData);
90
if (bp == decomp->bp) {
91
/* Use a value which is guaranteed to fail metadata lookup. This makes
92
* the stack walker get the PC from the decompilation stack.
93
*/
94
resolveFrame->returnAddress = NULL;
95
decomp->pcAddress = (U_8**)&(resolveFrame->returnAddress);
96
decomp->pc = (U_8*)jitPC;
97
}
98
}
99
}
100
101
/**
102
* Determine the vTable offset for an interface send to a particular
103
* receiver. If iTableOffset indicates a direct method, an assertion will
104
* fire.
105
*
106
* @param currentThread[in] the current J9VMThread
107
* @param receiverClass[in] the J9Class of the receiver
108
* @param interfaceClass[in] the J9Class of the interface
109
* @param iTableOffset[in] the iTable offset
110
*
111
* @returns the vTable index (0 indicates the mapping failed)
112
*/
113
static VMINLINE UDATA
114
convertITableOffsetToVTableOffset(J9VMThread *currentThread, J9Class *receiverClass, J9Class *interfaceClass, UDATA iTableOffset)
115
{
116
UDATA vTableOffset = 0;
117
J9ITable * iTable = receiverClass->lastITable;
118
if (interfaceClass == iTable->interfaceClass) {
119
goto foundITable;
120
}
121
122
iTable = (J9ITable*)receiverClass->iTable;
123
while (NULL != iTable) {
124
if (interfaceClass == iTable->interfaceClass) {
125
receiverClass->lastITable = iTable;
126
foundITable:
127
if (J9_UNEXPECTED(J9_ARE_ANY_BITS_SET(iTableOffset, J9_ITABLE_OFFSET_TAG_BITS))) {
128
/* Direct methods should not reach here - no possibility of obtaining a vTableOffset */
129
Assert_CodertVM_false(J9_ARE_ANY_BITS_SET(iTableOffset, J9_ITABLE_OFFSET_DIRECT));
130
/* Object method in the vTable */
131
vTableOffset = iTableOffset & ~J9_ITABLE_OFFSET_TAG_BITS;
132
} else {
133
/* Standard interface method */
134
vTableOffset = *(UDATA*)(((UDATA)iTable) + iTableOffset);
135
}
136
goto done;
137
}
138
iTable = iTable->next;
139
}
140
done:
141
return vTableOffset;
142
}
143
144
static VMINLINE void*
145
buildJITResolveFrameWithPC(J9VMThread *currentThread, UDATA flags, UDATA parmCount, bool checkScavengeOnResolve, UDATA spAdjust, void *oldPC)
146
{
147
VM_JITInterface::disableRuntimeInstrumentation(currentThread);
148
oldPC = VM_VMHelpers::buildJITResolveFrameWithPC(currentThread, flags, parmCount, spAdjust, oldPC);
149
#if defined(J9VM_JIT_GC_ON_RESOLVE_SUPPORT) && defined(J9VM_GC_GENERATIONAL)
150
if (checkScavengeOnResolve) {
151
if (J9_ARE_ANY_BITS_SET(currentThread->javaVM->jitConfig->runtimeFlags, J9JIT_SCAVENGE_ON_RESOLVE)) {
152
jitCheckScavengeOnResolve(currentThread);
153
}
154
}
155
#endif /* J9VM_JIT_GC_ON_RESOLVE_SUPPORT && J9VM_GC_GENERATIONAL */
156
return oldPC;
157
}
158
159
void
160
buildBranchJITResolveFrame(J9VMThread *currentThread, void *pc, UDATA flags)
161
{
162
buildJITResolveFrameWithPC(currentThread, flags | J9_SSF_JIT_RESOLVE, 0, false, 0, pc);
163
}
164
165
static VMINLINE void*
166
restoreJITResolveFrame(J9VMThread *currentThread, void *oldPC, bool checkAsync = true, bool checkException = true)
167
{
168
void* addr = NULL;
169
J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;
170
if (checkAsync) {
171
if (VM_VMHelpers::immediateAsyncPending(currentThread)) {
172
if (J9_CHECK_ASYNC_POP_FRAMES == currentThread->javaVM->internalVMFunctions->javaCheckAsyncMessages(currentThread, FALSE)) {
173
addr = J9_JITHELPER_ACTION_POP_FRAMES;
174
goto done;
175
}
176
}
177
}
178
if (checkException) {
179
if (VM_VMHelpers::exceptionPending(currentThread)) {
180
addr = J9_JITHELPER_ACTION_THROW;
181
goto done;
182
}
183
}
184
if (NULL != oldPC) {
185
void *newPC = resolveFrame->returnAddress;
186
if (!samePCs(oldPC, newPC)) {
187
addr = JIT_RUN_ON_JAVA_STACK(newPC);
188
goto done;
189
}
190
}
191
currentThread->jitException = resolveFrame->savedJITException;
192
currentThread->sp = (UDATA*)(resolveFrame + 1);
193
VM_JITInterface::enableRuntimeInstrumentation(currentThread);
194
done:
195
return addr;
196
}
197
198
void
199
restoreBranchJITResolveFrame(J9VMThread *currentThread)
200
{
201
restoreJITResolveFrame(currentThread, NULL, false, false);
202
}
203
204
extern void jitAddPicToPatchOnClassUnload(void *classPointer, void *addressToBePatched);
205
206
J9_EXTERN_BUILDER_SYMBOL(jitTranslateNewInstanceMethod);
207
J9_EXTERN_BUILDER_SYMBOL(jitInterpretNewInstanceMethod);
208
J9_EXTERN_BUILDER_SYMBOL(icallVMprJavaSendStatic1);
209
210
#define STATIC_FIELD_REF_BIT(bit) ((IDATA)(bit) << ((8 * sizeof(UDATA)) - J9_REQUIRED_CLASS_SHIFT))
211
212
#if defined(J9VM_ARCH_X86)
213
214
/* x86 common */
215
216
#define JIT_RETURN_ADDRESS ((void*)(currentThread->sp[0]))
217
218
#if defined(J9VM_ENV_DATA64)
219
220
/* x86-64 */
221
222
#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.named.rdi
223
#define JIT_J2I_METHOD_REGISTER gpr.named.rdi
224
#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.named.rax
225
226
#else /*J9VM_ENV_DATA64 */
227
228
/* x86-32*/
229
230
#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.named.edi
231
#define JIT_J2I_METHOD_REGISTER gpr.named.edi
232
#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.named.eax
233
#define JIT_LO_U64_RETURN_REGISTER gpr.named.eax
234
#define JIT_HI_U64_RETURN_REGISTER gpr.named.edx
235
236
#endif /* J9VM_ENV_DATA64 */
237
238
#elif defined(J9VM_ARCH_POWER)
239
240
#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.numbered[12]
241
#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.numbered[3]
242
#define JIT_RETURN_ADDRESS_REGISTER lr
243
#define JIT_J2I_METHOD_REGISTER gpr.numbered[3]
244
#if defined(J9VM_ENV_LITTLE_ENDIAN)
245
#define JIT_LO_U64_RETURN_REGISTER gpr.numbered[3]
246
#define JIT_HI_U64_RETURN_REGISTER gpr.numbered[4]
247
#else
248
#define JIT_LO_U64_RETURN_REGISTER gpr.numbered[4]
249
#define JIT_HI_U64_RETURN_REGISTER gpr.numbered[3]
250
#endif
251
252
#elif defined(J9VM_ARCH_S390)
253
254
#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.numbered[0]
255
#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.numbered[2]
256
#define JIT_RETURN_ADDRESS_REGISTER gpr.numbered[14]
257
#define JIT_J2I_METHOD_REGISTER gpr.numbered[1]
258
#define JIT_LO_U64_RETURN_REGISTER gpr.numbered[3]
259
#define JIT_HI_U64_RETURN_REGISTER gpr.numbered[2]
260
261
#elif defined(J9VM_ARCH_ARM)
262
263
#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.numbered[11]
264
#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.numbered[0]
265
#define JIT_RETURN_ADDRESS_REGISTER gpr.numbered[14]
266
#define JIT_J2I_METHOD_REGISTER gpr.numbered[0]
267
#define JIT_LO_U64_RETURN_REGISTER gpr.numbered[0]
268
#define JIT_HI_U64_RETURN_REGISTER gpr.numbered[1]
269
270
#elif defined(J9VM_ARCH_AARCH64)
271
272
#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.numbered[9]
273
#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.numbered[0]
274
#define JIT_RETURN_ADDRESS_REGISTER gpr.numbered[30]
275
#define JIT_J2I_METHOD_REGISTER gpr.numbered[0]
276
277
#elif defined(J9VM_ARCH_RISCV)
278
279
#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.named.T6
280
#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.named.A0
281
#define JIT_RETURN_ADDRESS_REGISTER gpr.named.RA
282
#define JIT_J2I_METHOD_REGISTER gpr.named.A0
283
284
#else
285
#error UNKNOWN PROCESSOR
286
#endif
287
288
#if defined(J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP)
289
/* Entirely stack-based arguments */
290
#define JIT_PARM(number) (currentThread->sp[(number) - 1])
291
#define JIT_DIRECT_CALL_PARM(number) (currentThread->sp[parmCount - (number)])
292
#define SET_JIT_DIRECT_CALL_PARM(number, value) JIT_DIRECT_CALL_PARM(number) = (UDATA)(value)
293
#else /* J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP */
294
/* Register-based arguments (with stack fallback if necessary) */
295
#if defined(JIT_RETURN_ADDRESS_REGISTER)
296
#define JIT_RETURN_ADDRESS ((void*)jitRegisters->JIT_RETURN_ADDRESS_REGISTER)
297
#endif /* JIT_RETURN_ADDRESS_REGISTER */
298
#define JIT_PARM_IN_REGISTER(number) (jitRegisters->gpr.numbered[jitArgumentRegisterNumbers[(number) - 1]])
299
#define JIT_PARM_IN_MEMORY(number) (currentThread->sp[parmCount - (number)])
300
#define JIT_PARM(number) ((number <= J9SW_ARGUMENT_REGISTER_COUNT) ? JIT_PARM_IN_REGISTER(number) : JIT_PARM_IN_MEMORY(number))
301
#define JIT_DIRECT_CALL_PARM(number) JIT_PARM(number)
302
#define SET_JIT_DIRECT_CALL_PARM(number, value) \
303
do { \
304
if (number <= J9SW_ARGUMENT_REGISTER_COUNT) { \
305
JIT_PARM_IN_REGISTER(number) = (UDATA)(value); \
306
} else { \
307
JIT_PARM_IN_MEMORY(number) = (UDATA)(value); \
308
} \
309
} while(0)
310
#endif /* J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP */
311
312
#define JIT_STACK_OVERFLOW_SIZE (jitRegisters->JIT_STACK_OVERFLOW_SIZE_REGISTER)
313
314
#define JIT_CLASS_PARM(number) ((J9Class*)JIT_PARM(number))
315
#define JIT_INT_PARM(number) ((I_32)JIT_PARM(number))
316
317
#define DECLARE_JIT_PARM(type, name, number) type const name = (type)JIT_PARM(number)
318
#define DECLARE_JIT_CLASS_PARM(name, number) J9Class* const name = JIT_CLASS_PARM(number)
319
#define DECLARE_JIT_INT_PARM(name, number) I_32 const name = JIT_INT_PARM(number)
320
321
#define JIT_RETURN_UDATA(value) currentThread->returnValue = (UDATA)(value)
322
323
#if defined(J9VM_ENV_DATA64)
324
#define DECLARE_JIT_U64_PARM(name, number) U_64 const name = (U_64)JIT_PARM(number)
325
#define JIT_RETURN_U64(value) JIT_RETURN_UDATA(value)
326
#else /* J9VM_ENV_DATA64 */
327
#define DECLARE_JIT_U64_PARM(name, number) U_64 const name = *(U_64*)&JIT_PARM(number)
328
#define JIT_RETURN_U64(value) \
329
do { \
330
((J9JITRegisters*)(currentThread->entryLocalStorage->jitGlobalStorageBase))->JIT_HI_U64_RETURN_REGISTER = (UDATA)((value) >> 32); \
331
((J9JITRegisters*)(currentThread->entryLocalStorage->jitGlobalStorageBase))->JIT_LO_U64_RETURN_REGISTER = (UDATA)((value) & 0xFFFFFFFF); \
332
} while(0)
333
#endif /* J9VM_ENV_DATA64 */
334
335
#if defined(J9VM_ARCH_X86)
336
#define PRESERVE_RETURN_ADDRESS() void* const x86ReturnAddress = currentThread->jitReturnAddress
337
#define RESTORE_RETURN_ADDRESS() currentThread->jitReturnAddress = x86ReturnAddress
338
#else
339
#define PRESERVE_RETURN_ADDRESS() do {} while(0)
340
#define RESTORE_RETURN_ADDRESS() do {} while(0)
341
#endif
342
343
#if defined(DEBUG)
344
#define JIT_HELPER_PROLOGUE() printf("\n" J9_GET_CALLSITE() "\n")
345
#else
346
#define JIT_HELPER_PROLOGUE() do {} while(0)
347
#endif
348
349
#if defined(J9SW_JIT_HELPERS_PASS_PARAMETERS_ON_STACK)
350
#define SET_PARM_COUNT(count) currentThread->floatTemp4 = (void*)count
351
#else
352
#define SET_PARM_COUNT(count) do {} while(0)
353
#endif /* J9SW_JIT_HELPERS_PASS_PARAMETERS_ON_STACK */
354
355
#define OLD_JIT_HELPER_PROLOGUE(count) \
356
J9JITRegisters* const jitRegisters = (J9JITRegisters*)(currentThread->entryLocalStorage->jitGlobalStorageBase); \
357
UDATA const parmCount = (count); \
358
SET_PARM_COUNT(count); \
359
JIT_HELPER_PROLOGUE()
360
361
#define OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(count) \
362
PRESERVE_RETURN_ADDRESS(); \
363
OLD_JIT_HELPER_PROLOGUE(count)
364
365
#define SLOW_JIT_HELPER_PROLOGUE() \
366
UDATA const parmCount = (UDATA)currentThread->floatTemp4; \
367
PRESERVE_RETURN_ADDRESS(); \
368
JIT_HELPER_PROLOGUE()
369
370
#define SLOW_JIT_HELPER_EPILOGUE() RESTORE_RETURN_ADDRESS()
371
372
#if defined(J9VM_ARCH_X86) && !defined(J9VM_ENV_DATA64)
373
/* x86-32*/
374
extern void clearFPStack(void);
375
#define TIDY_BEFORE_THROW() clearFPStack()
376
#else /* defined(J9VM_ARCH_X86) && !defined(J9VM_ENV_DATA64) */
377
#define TIDY_BEFORE_THROW()
378
#endif /* defined(J9VM_ARCH_X86) && !defined(J9VM_ENV_DATA64) */
379
380
static VMINLINE void*
381
setCurrentExceptionFromJIT(J9VMThread *currentThread, UDATA exceptionNumber, j9object_t detailMessage)
382
{
383
TIDY_BEFORE_THROW();
384
currentThread->javaVM->internalVMFunctions->setCurrentException(currentThread, exceptionNumber, (UDATA*)detailMessage);
385
return J9_JITHELPER_ACTION_THROW;
386
}
387
388
static VMINLINE void*
389
setNegativeArraySizeExceptionFromJIT(J9VMThread *currentThread, I_32 size)
390
{
391
TIDY_BEFORE_THROW();
392
currentThread->javaVM->internalVMFunctions->setNegativeArraySizeException(currentThread, size);
393
return J9_JITHELPER_ACTION_THROW;
394
}
395
396
static VMINLINE void*
397
setCurrentExceptionNLSFromJIT(J9VMThread *currentThread, UDATA exceptionNumber, U_32 moduleName, U_32 messageNumber)
398
{
399
TIDY_BEFORE_THROW();
400
currentThread->javaVM->internalVMFunctions->setCurrentExceptionNLS(currentThread, exceptionNumber, moduleName, messageNumber);
401
return J9_JITHELPER_ACTION_THROW;
402
}
403
404
static VMINLINE void*
405
setCurrentExceptionUTFFromJIT(J9VMThread *currentThread, UDATA exceptionNumber, const char* errorUTF)
406
{
407
TIDY_BEFORE_THROW();
408
currentThread->javaVM->internalVMFunctions->setCurrentExceptionUTF(currentThread, exceptionNumber, errorUTF);
409
return J9_JITHELPER_ACTION_THROW;
410
}
411
412
static VMINLINE void*
413
setNativeOutOfMemoryErrorFromJIT(J9VMThread *currentThread, U_32 moduleName, U_32 messageNumber)
414
{
415
TIDY_BEFORE_THROW();
416
currentThread->javaVM->internalVMFunctions->setNativeOutOfMemoryError(currentThread, moduleName, messageNumber);
417
return J9_JITHELPER_ACTION_THROW;
418
}
419
420
static VMINLINE void*
421
setHeapOutOfMemoryErrorFromJIT(J9VMThread *currentThread)
422
{
423
TIDY_BEFORE_THROW();
424
currentThread->javaVM->internalVMFunctions->setHeapOutOfMemoryError(currentThread);
425
return J9_JITHELPER_ACTION_THROW;
426
}
427
428
static VMINLINE void*
429
setClassCastExceptionFromJIT(J9VMThread *currentThread, J9Class *instanceClass, J9Class *castClass)
430
{
431
TIDY_BEFORE_THROW();
432
currentThread->javaVM->internalVMFunctions->setClassCastException(currentThread, instanceClass, castClass);
433
return J9_JITHELPER_ACTION_THROW;
434
}
435
436
static VMINLINE void*
437
buildJITResolveFrame(J9VMThread *currentThread, UDATA flags, UDATA helperParmCount, bool checkScavengeOnResolve = true, UDATA spAdjust = 0)
438
{
439
void *oldPC = currentThread->jitReturnAddress;
440
return buildJITResolveFrameWithPC(currentThread, flags, helperParmCount, checkScavengeOnResolve, spAdjust, oldPC);
441
}
442
443
static VMINLINE void*
444
buildJITResolveFrameForRuntimeHelper(J9VMThread *currentThread, UDATA helperParmCount)
445
{
446
return buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE_RUNTIME_HELPER, helperParmCount);
447
}
448
449
static VMINLINE void*
450
buildJITResolveFrameForTrapHandler(J9VMThread *currentThread)
451
{
452
/* Trap PC stored in jitException */
453
void *oldPC = (void*)currentThread->jitException;
454
currentThread->jitException = NULL;
455
return buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE, 0, true, 0, oldPC);
456
}
457
458
static VMINLINE void
459
buildJITResolveFrameForRuntimeCheck(J9VMThread *currentThread)
460
{
461
void *oldPC = currentThread->jitReturnAddress;
462
#if defined(J9VM_ARCH_X86)
463
U_8 *pc = (U_8*)oldPC;
464
U_32 offset = *(U_32*)pc;
465
pc -= offset; /* compute addr of throwing instruction */
466
pc += 1; /* move forward by a byte as codegen uses the beginning of instructions */
467
oldPC = (void*)pc;
468
#endif /* J9VM_ARCH_X86 */
469
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE, 0, true, 0, oldPC);
470
}
471
472
473
static VMINLINE bool
474
fast_jitNewObjectImpl(J9VMThread *currentThread, J9Class *objectClass, bool checkClassInit, bool nonZeroTLH)
475
{
476
bool slowPathRequired = false;
477
if (checkClassInit) {
478
if (J9_UNEXPECTED(VM_VMHelpers::classRequiresInitialization(currentThread, objectClass))) {
479
goto slow;
480
}
481
}
482
if (J9_UNEXPECTED(!J9ROMCLASS_ALLOCATES_VIA_NEW(objectClass->romClass))) {
483
goto slow;
484
}
485
{
486
UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;
487
if (nonZeroTLH) {
488
allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;
489
}
490
j9object_t obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateObjectNoGC(currentThread, objectClass, allocationFlags);
491
if (J9_UNEXPECTED(NULL == obj)) {
492
goto slow;
493
}
494
JIT_RETURN_UDATA(obj);
495
}
496
done:
497
return slowPathRequired;
498
slow:
499
currentThread->floatTemp1 = (void*)objectClass;
500
slowPathRequired = true;
501
goto done;
502
}
503
504
static VMINLINE bool
505
fast_jitNewValueImpl(J9VMThread *currentThread, J9Class *objectClass, bool checkClassInit, bool nonZeroTLH)
506
{
507
bool slowPathRequired = false;
508
if (checkClassInit) {
509
if (J9_UNEXPECTED(VM_VMHelpers::classRequiresInitialization(currentThread, objectClass))) {
510
goto slow;
511
}
512
}
513
if (J9_UNEXPECTED(!J9_IS_J9CLASS_VALUETYPE(objectClass))) {
514
goto slow;
515
}
516
{
517
UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;
518
if (nonZeroTLH) {
519
allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;
520
}
521
j9object_t obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateObjectNoGC(currentThread, objectClass, allocationFlags);
522
if (J9_UNEXPECTED(NULL == obj)) {
523
goto slow;
524
}
525
JIT_RETURN_UDATA(obj);
526
}
527
done:
528
return slowPathRequired;
529
slow:
530
currentThread->floatTemp1 = (void*)objectClass;
531
slowPathRequired = true;
532
goto done;
533
}
534
535
static VMINLINE void*
536
slow_jitNewObjectImpl(J9VMThread *currentThread, bool checkClassInit, bool nonZeroTLH)
537
{
538
SLOW_JIT_HELPER_PROLOGUE();
539
J9Class *objectClass = (J9Class*)currentThread->floatTemp1;
540
j9object_t obj = NULL;
541
void *oldPC = currentThread->jitReturnAddress;
542
void *addr = NULL;
543
UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;
544
if (nonZeroTLH) {
545
allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;
546
}
547
if (!J9ROMCLASS_ALLOCATES_VIA_NEW(objectClass->romClass)) {
548
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
549
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINSTANTIATIONERROR | J9_EX_CTOR_CLASS, J9VM_J9CLASS_TO_HEAPCLASS(objectClass));
550
goto done;
551
}
552
if (checkClassInit) {
553
if (VM_VMHelpers::classRequiresInitialization(currentThread, objectClass)) {
554
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
555
currentThread->javaVM->internalVMFunctions->initializeClass(currentThread, objectClass);
556
addr = restoreJITResolveFrame(currentThread, oldPC);
557
if (NULL != addr) {
558
goto done;
559
}
560
}
561
}
562
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
563
obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateObject(currentThread, objectClass, allocationFlags);
564
if (NULL == obj) {
565
addr = setHeapOutOfMemoryErrorFromJIT(currentThread);
566
goto done;
567
}
568
currentThread->floatTemp1 = (void*)obj; // in case of decompile
569
addr = restoreJITResolveFrame(currentThread, oldPC, false, false);
570
if (NULL != addr) {
571
goto done;
572
}
573
JIT_RETURN_UDATA(obj);
574
done:
575
SLOW_JIT_HELPER_EPILOGUE();
576
return addr;
577
}
578
579
static VMINLINE void*
580
slow_jitNewValueImpl(J9VMThread *currentThread, bool checkClassInit, bool nonZeroTLH)
581
{
582
SLOW_JIT_HELPER_PROLOGUE();
583
J9Class *objectClass = (J9Class*)currentThread->floatTemp1;
584
j9object_t obj = NULL;
585
void *oldPC = currentThread->jitReturnAddress;
586
void *addr = NULL;
587
UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;
588
if (nonZeroTLH) {
589
allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;
590
}
591
if (!J9_IS_J9CLASS_VALUETYPE(objectClass)) {
592
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
593
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINSTANTIATIONERROR | J9_EX_CTOR_CLASS, J9VM_J9CLASS_TO_HEAPCLASS(objectClass));
594
goto done;
595
}
596
if (checkClassInit) {
597
if (VM_VMHelpers::classRequiresInitialization(currentThread, objectClass)) {
598
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
599
currentThread->javaVM->internalVMFunctions->initializeClass(currentThread, objectClass);
600
addr = restoreJITResolveFrame(currentThread, oldPC);
601
if (NULL != addr) {
602
goto done;
603
}
604
}
605
}
606
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
607
obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateObject(currentThread, objectClass, allocationFlags);
608
if (NULL == obj) {
609
addr = setHeapOutOfMemoryErrorFromJIT(currentThread);
610
goto done;
611
}
612
currentThread->floatTemp1 = (void*)obj; // in case of decompile
613
addr = restoreJITResolveFrame(currentThread, oldPC, false, false);
614
if (NULL != addr) {
615
goto done;
616
}
617
JIT_RETURN_UDATA(obj);
618
done:
619
SLOW_JIT_HELPER_EPILOGUE();
620
return addr;
621
}
622
623
624
void* J9FASTCALL
625
old_slow_jitNewObject(J9VMThread *currentThread)
626
{
627
return slow_jitNewObjectImpl(currentThread, true, false);
628
}
629
630
void* J9FASTCALL
631
old_slow_jitNewValue(J9VMThread *currentThread)
632
{
633
return slow_jitNewValueImpl(currentThread, true, false);
634
}
635
636
void* J9FASTCALL
637
old_fast_jitNewObject(J9VMThread *currentThread)
638
{
639
OLD_JIT_HELPER_PROLOGUE(1);
640
DECLARE_JIT_CLASS_PARM(objectClass, 1);
641
void *slowPath = NULL;
642
if (fast_jitNewObjectImpl(currentThread, objectClass, true, false)) {
643
slowPath = (void*)old_slow_jitNewObject;
644
}
645
return slowPath;
646
}
647
648
void* J9FASTCALL
649
old_slow_jitNewObjectNoZeroInit(J9VMThread *currentThread)
650
{
651
return slow_jitNewObjectImpl(currentThread, true, true);
652
}
653
654
void* J9FASTCALL
655
old_slow_jitNewValueNoZeroInit(J9VMThread *currentThread)
656
{
657
return slow_jitNewValueImpl(currentThread, true, true);
658
}
659
660
void* J9FASTCALL
661
old_fast_jitNewObjectNoZeroInit(J9VMThread *currentThread)
662
{
663
OLD_JIT_HELPER_PROLOGUE(1);
664
DECLARE_JIT_CLASS_PARM(objectClass, 1);
665
void *slowPath = NULL;
666
if (fast_jitNewObjectImpl(currentThread, objectClass, true, true)) {
667
slowPath = (void*)old_slow_jitNewObjectNoZeroInit;
668
}
669
return slowPath;
670
}
671
672
void* J9FASTCALL
673
old_slow_jitGetFlattenableField(J9VMThread *currentThread)
674
{
675
SLOW_JIT_HELPER_PROLOGUE();
676
J9RAMFieldRef* cpEntry = (J9RAMFieldRef*) currentThread->floatTemp1;
677
j9object_t receiver = (j9object_t) currentThread->floatTemp2;
678
j9object_t returnObject = NULL;
679
void *rc = NULL;
680
void *oldPC = currentThread->jitReturnAddress;
681
682
if (NULL == receiver) {
683
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
684
rc = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
685
goto done;
686
}
687
688
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
689
returnObject = currentThread->javaVM->internalVMFunctions->getFlattenableField(currentThread, cpEntry, receiver, FALSE);
690
if (NULL == returnObject) {
691
rc = setHeapOutOfMemoryErrorFromJIT(currentThread);
692
goto done;
693
}
694
695
currentThread->floatTemp1 = (void*)returnObject; // in case of decompile
696
rc = restoreJITResolveFrame(currentThread, oldPC, false, false);
697
if (NULL != rc) {
698
goto done;
699
}
700
701
JIT_RETURN_UDATA(returnObject);
702
703
done:
704
SLOW_JIT_HELPER_EPILOGUE();
705
return rc;
706
}
707
708
void* J9FASTCALL
709
old_fast_jitGetFlattenableField(J9VMThread *currentThread)
710
{
711
OLD_JIT_HELPER_PROLOGUE(2);
712
DECLARE_JIT_PARM(J9RAMFieldRef*, cpEntry, 1);
713
DECLARE_JIT_PARM(j9object_t, receiver, 2);
714
j9object_t returnObject = NULL;
715
void *rc = NULL;
716
717
if (NULL == receiver) {
718
goto slow;
719
}
720
721
returnObject = currentThread->javaVM->internalVMFunctions->getFlattenableField(currentThread, cpEntry, receiver, TRUE);
722
if (J9_UNEXPECTED(NULL == returnObject)) {
723
goto slow;
724
}
725
JIT_RETURN_UDATA(returnObject);
726
727
done:
728
return rc;
729
730
slow:
731
currentThread->floatTemp1 = (void*)cpEntry;
732
currentThread->floatTemp2 = (void*)receiver;
733
rc = (void *) old_slow_jitGetFlattenableField;
734
goto done;
735
}
736
737
void* J9FASTCALL
738
old_slow_jitCloneValueType(J9VMThread *currentThread)
739
{
740
SLOW_JIT_HELPER_PROLOGUE();
741
j9object_t reciever = (j9object_t)currentThread->floatTemp1;
742
j9object_t returnObject = NULL;
743
void *rc = NULL;
744
void *oldPC = currentThread->jitReturnAddress;
745
J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;
746
747
if (NULL == reciever) {
748
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
749
rc = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
750
goto done;
751
}
752
753
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
754
returnObject = vmFuncs->cloneValueType(currentThread, J9OBJECT_CLAZZ(currentThread, reciever), reciever, FALSE);
755
if (J9_UNEXPECTED(NULL == returnObject)) {
756
rc = setHeapOutOfMemoryErrorFromJIT(currentThread);
757
goto done;
758
}
759
760
currentThread->floatTemp1 = (void*)returnObject; // in case of decompile
761
rc = restoreJITResolveFrame(currentThread, oldPC, false, false);
762
if (NULL != rc) {
763
goto done;
764
}
765
766
JIT_RETURN_UDATA(returnObject);
767
768
done:
769
SLOW_JIT_HELPER_EPILOGUE();
770
return rc;
771
772
}
773
774
void* J9FASTCALL
775
old_fast_jitCloneValueType(J9VMThread *currentThread)
776
{
777
OLD_JIT_HELPER_PROLOGUE(1);
778
DECLARE_JIT_PARM(j9object_t, reciever, 1);
779
j9object_t returnObject = NULL;
780
void *rc = NULL;
781
J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;
782
783
if (NULL == reciever) {
784
goto slow;
785
}
786
787
returnObject = vmFuncs->cloneValueType(currentThread, J9OBJECT_CLAZZ(currentThread, reciever), reciever, TRUE);
788
if (J9_UNEXPECTED(NULL == returnObject)) {
789
goto slow;
790
}
791
792
JIT_RETURN_UDATA(returnObject);
793
794
done:
795
return rc;
796
797
slow:
798
currentThread->floatTemp1 = (void*)reciever;
799
rc = (void*)old_slow_jitCloneValueType;
800
goto done;
801
}
802
803
void* J9FASTCALL
804
old_slow_jitWithFlattenableField(J9VMThread *currentThread)
805
{
806
SLOW_JIT_HELPER_PROLOGUE();
807
J9RAMFieldRef* cpEntry = (J9RAMFieldRef*) currentThread->floatTemp1;
808
j9object_t receiver = (j9object_t) currentThread->floatTemp2;
809
j9object_t paramObject = (j9object_t) currentThread->floatTemp3;
810
j9object_t returnObject = NULL;
811
void *rc = NULL;
812
void *oldPC = currentThread->jitReturnAddress;
813
J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;
814
815
if (NULL == receiver) {
816
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
817
rc = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
818
goto done;
819
}
820
821
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
822
returnObject = vmFuncs->cloneValueType(currentThread, J9OBJECT_CLAZZ(currentThread, receiver), receiver, FALSE);
823
if (J9_UNEXPECTED(NULL == returnObject)) {
824
rc = setHeapOutOfMemoryErrorFromJIT(currentThread);
825
goto done;
826
}
827
828
vmFuncs->putFlattenableField(currentThread, cpEntry, returnObject, paramObject);
829
830
currentThread->floatTemp1 = (void*)returnObject; // in case of decompile
831
rc = restoreJITResolveFrame(currentThread, oldPC, false, false);
832
if (NULL != rc) {
833
goto done;
834
}
835
836
JIT_RETURN_UDATA(returnObject);
837
838
done:
839
SLOW_JIT_HELPER_EPILOGUE();
840
return rc;
841
842
}
843
844
void* J9FASTCALL
845
old_fast_jitWithFlattenableField(J9VMThread *currentThread)
846
{
847
OLD_JIT_HELPER_PROLOGUE(3);
848
DECLARE_JIT_PARM(J9RAMFieldRef*, cpEntry, 1);
849
DECLARE_JIT_PARM(j9object_t, receiver, 2);
850
DECLARE_JIT_PARM(j9object_t, paramObject, 3);
851
j9object_t returnObject = NULL;
852
void *rc = NULL;
853
J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;
854
855
if (NULL == receiver) {
856
goto slow;
857
}
858
859
returnObject = vmFuncs->cloneValueType(currentThread, J9OBJECT_CLAZZ(currentThread, receiver), receiver, TRUE);
860
if (J9_UNEXPECTED(NULL == returnObject)) {
861
goto slow;
862
}
863
864
vmFuncs->putFlattenableField(currentThread, cpEntry, returnObject, paramObject);
865
866
JIT_RETURN_UDATA(returnObject);
867
868
done:
869
return rc;
870
871
slow:
872
currentThread->floatTemp1 = (void*)cpEntry;
873
currentThread->floatTemp2 = (void*)receiver;
874
currentThread->floatTemp3 = (void*)paramObject;
875
rc = (void *) old_slow_jitWithFlattenableField;
876
goto done;
877
}
878
879
void* J9FASTCALL
880
old_slow_jitPutFlattenableField(J9VMThread *currentThread)
881
{
882
/* can only get here if we are throwing an exception */
883
SLOW_JIT_HELPER_PROLOGUE();
884
void *rc = NULL;
885
886
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
887
rc = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
888
889
SLOW_JIT_HELPER_EPILOGUE();
890
return rc;
891
}
892
893
void* J9FASTCALL
894
old_fast_jitPutFlattenableField(J9VMThread *currentThread)
895
{
896
OLD_JIT_HELPER_PROLOGUE(3);
897
DECLARE_JIT_PARM(J9RAMFieldRef*, cpEntry, 1);
898
DECLARE_JIT_PARM(j9object_t, receiver, 2);
899
DECLARE_JIT_PARM(j9object_t, paramObject, 3);
900
j9object_t returnObject = NULL;
901
void *rc = NULL;
902
903
if (NULL == receiver) {
904
goto slow;
905
}
906
907
currentThread->javaVM->internalVMFunctions->putFlattenableField(currentThread, cpEntry, receiver, paramObject);
908
909
done:
910
return rc;
911
912
slow:
913
rc = (void *) old_slow_jitPutFlattenableField;
914
goto done;
915
}
916
917
void* J9FASTCALL
918
old_slow_jitGetFlattenableStaticField(J9VMThread *currentThread)
919
{
920
return NULL;
921
}
922
923
void* J9FASTCALL
924
old_fast_jitGetFlattenableStaticField(J9VMThread *currentThread)
925
{
926
return NULL;
927
}
928
929
void* J9FASTCALL
930
old_slow_jitPutFlattenableStaticField(J9VMThread *currentThread)
931
{
932
return NULL;
933
}
934
935
void* J9FASTCALL
936
old_fast_jitPutFlattenableStaticField(J9VMThread *currentThread)
937
{
938
return NULL;
939
}
940
941
void* J9FASTCALL
942
old_slow_jitLoadFlattenableArrayElement(J9VMThread *currentThread)
943
{
944
SLOW_JIT_HELPER_PROLOGUE();
945
j9object_t arrayObject = (j9object_t)currentThread->floatTemp1;
946
U_32 index = *(U_32 *)&currentThread->floatTemp2;
947
void *addr = NULL;
948
void *oldPC = currentThread->jitReturnAddress;
949
if (NULL == arrayObject) {
950
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
951
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
952
} else {
953
j9object_t value = NULL;
954
U_32 arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, arrayObject);
955
if (index >= arrayLength) {
956
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
957
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
958
} else {
959
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
960
value = currentThread->javaVM->internalVMFunctions->loadFlattenableArrayElement(currentThread, arrayObject, index, false);
961
if (NULL == value) {
962
addr = setHeapOutOfMemoryErrorFromJIT(currentThread);
963
goto done;
964
}
965
currentThread->floatTemp1 = (void*)value; // in case of decompile
966
addr = restoreJITResolveFrame(currentThread, oldPC, false, false);
967
if (NULL != addr) {
968
goto done;
969
}
970
JIT_RETURN_UDATA(value);
971
}
972
}
973
done:
974
SLOW_JIT_HELPER_EPILOGUE();
975
return addr;
976
}
977
978
void* J9FASTCALL
979
old_fast_jitLoadFlattenableArrayElement(J9VMThread *currentThread)
980
{
981
OLD_JIT_HELPER_PROLOGUE(2);
982
DECLARE_JIT_PARM(j9object_t, arrayObject, 1);
983
DECLARE_JIT_PARM(U_32, index, 2);
984
bool slowPathUsed = false;
985
void *slowPath = NULL;
986
j9object_t value = NULL;
987
U_32 arrayLength = 0;
988
if (NULL == arrayObject) {
989
goto slow;
990
}
991
arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, arrayObject);
992
if (index >= arrayLength) {
993
goto slow;
994
}
995
value = (j9object_t) currentThread->javaVM->internalVMFunctions->loadFlattenableArrayElement(currentThread, arrayObject, index, true);
996
if (NULL == value) {
997
J9ArrayClass *arrayObjectClass = (J9ArrayClass *)J9OBJECT_CLAZZ(currentThread, arrayObject);
998
if (J9_IS_J9CLASS_VALUETYPE(arrayObjectClass->componentType)) {
999
goto slow;
1000
}
1001
}
1002
JIT_RETURN_UDATA(value);
1003
done:
1004
return slowPath;
1005
slow:
1006
slowPathUsed = true;
1007
currentThread->floatTemp1 = (void *)arrayObject;
1008
currentThread->floatTemp2 = *(void **)&index;
1009
slowPath = (void*)old_slow_jitLoadFlattenableArrayElement;
1010
goto done;
1011
}
1012
1013
void* J9FASTCALL
1014
old_slow_jitStoreFlattenableArrayElement(J9VMThread *currentThread)
1015
{
1016
SLOW_JIT_HELPER_PROLOGUE();
1017
j9object_t arrayref = (j9object_t)currentThread->floatTemp1;
1018
U_32 index = *(U_32 *)&currentThread->floatTemp2;
1019
j9object_t value = (j9object_t)currentThread->floatTemp3;
1020
U_32 arrayLength = 0;
1021
void *addr = NULL;
1022
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1023
if (NULL == arrayref) {
1024
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
1025
} else {
1026
arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, arrayref);
1027
if (index >= arrayLength) {
1028
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
1029
} else {
1030
if (false == VM_VMHelpers::objectArrayStoreAllowed(currentThread, arrayref, value)) {
1031
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
1032
} else {
1033
J9ArrayClass *arrayrefClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, arrayref);
1034
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
1035
}
1036
}
1037
}
1038
SLOW_JIT_HELPER_EPILOGUE();
1039
return addr;
1040
}
1041
1042
void* J9FASTCALL
1043
old_fast_jitStoreFlattenableArrayElement(J9VMThread *currentThread)
1044
{
1045
OLD_JIT_HELPER_PROLOGUE(3);
1046
DECLARE_JIT_PARM(j9object_t, arrayref, 1);
1047
DECLARE_JIT_PARM(U_32, index, 2);
1048
DECLARE_JIT_PARM(j9object_t, value, 3);
1049
1050
bool slowPathUsed = false;
1051
void *slowPath = NULL;
1052
U_32 arrayLength = 0;
1053
J9ArrayClass *arrayrefClass = NULL;
1054
if (NULL == arrayref) {
1055
goto slow;
1056
}
1057
arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, arrayref);
1058
if (index >= arrayLength) {
1059
goto slow;
1060
}
1061
if (false == VM_VMHelpers::objectArrayStoreAllowed(currentThread, arrayref, value)) {
1062
goto slow;
1063
}
1064
arrayrefClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, arrayref);
1065
if ((J9_IS_J9CLASS_VALUETYPE(arrayrefClass->componentType)) && (NULL == value)) {
1066
goto slow;
1067
}
1068
currentThread->javaVM->internalVMFunctions->storeFlattenableArrayElement(currentThread, arrayref, index, value);
1069
done:
1070
return slowPath;
1071
slow:
1072
slowPathUsed = true;
1073
currentThread->floatTemp1 = (void *)arrayref;
1074
currentThread->floatTemp2 = *(void **)&index;
1075
currentThread->floatTemp3 = (void *)value;
1076
slowPath = (void*)old_slow_jitStoreFlattenableArrayElement;
1077
goto done;
1078
}
1079
1080
static VMINLINE bool
1081
fast_jitANewArrayImpl(J9VMThread *currentThread, J9Class *elementClass, I_32 size, bool nonZeroTLH)
1082
{
1083
bool slowPathRequired = false;
1084
J9Class * const arrayClass = elementClass->arrayClass;
1085
if (J9_UNEXPECTED(NULL == arrayClass)) {
1086
goto slow;
1087
}
1088
if (J9_UNEXPECTED(size < 0)) {
1089
goto slow;
1090
}
1091
{
1092
UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;
1093
if (nonZeroTLH) {
1094
allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;
1095
}
1096
j9object_t obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateIndexableObjectNoGC(currentThread, arrayClass, (U_32)size, allocationFlags);
1097
if (J9_UNEXPECTED(NULL == obj)) {
1098
goto slow;
1099
}
1100
JIT_RETURN_UDATA(obj);
1101
}
1102
done:
1103
return slowPathRequired;
1104
slow:
1105
currentThread->floatTemp1 = (void*)(UDATA)elementClass;
1106
currentThread->floatTemp2 = (void*)(UDATA)size;
1107
slowPathRequired = true;
1108
goto done;
1109
}
1110
1111
static VMINLINE void*
1112
slow_jitANewArrayImpl(J9VMThread *currentThread, bool nonZeroTLH)
1113
{
1114
SLOW_JIT_HELPER_PROLOGUE();
1115
J9Class *elementClass = (J9Class*)currentThread->floatTemp1;
1116
I_32 size = (I_32)(UDATA)currentThread->floatTemp2;
1117
J9Class *arrayClass = elementClass->arrayClass;
1118
j9object_t obj = NULL;
1119
void *oldPC = currentThread->jitReturnAddress;
1120
void *addr = NULL;
1121
UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;
1122
if (nonZeroTLH) {
1123
allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;
1124
}
1125
if (size < 0) {
1126
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1127
addr = setNegativeArraySizeExceptionFromJIT(currentThread, size);
1128
goto done;
1129
}
1130
if (NULL == arrayClass) {
1131
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1132
J9JavaVM *vm = currentThread->javaVM;
1133
arrayClass = vm->internalVMFunctions->internalCreateArrayClass(currentThread, (J9ROMArrayClass*)J9ROMIMAGEHEADER_FIRSTCLASS(vm->arrayROMClasses), elementClass);
1134
addr = restoreJITResolveFrame(currentThread, oldPC);
1135
if (NULL != addr) {
1136
goto done;
1137
}
1138
}
1139
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
1140
obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateIndexableObject(currentThread, arrayClass, (U_32)size, allocationFlags);
1141
if (NULL == obj) {
1142
addr = setHeapOutOfMemoryErrorFromJIT(currentThread);
1143
goto done;
1144
}
1145
currentThread->floatTemp1 = (void*)obj; // in case of decompile
1146
addr = restoreJITResolveFrame(currentThread, oldPC, false, false);
1147
if (NULL != addr) {
1148
goto done;
1149
}
1150
JIT_RETURN_UDATA(obj);
1151
done:
1152
SLOW_JIT_HELPER_EPILOGUE();
1153
return addr;
1154
}
1155
1156
void* J9FASTCALL
1157
old_slow_jitANewArray(J9VMThread *currentThread)
1158
{
1159
return slow_jitANewArrayImpl(currentThread, false);
1160
}
1161
1162
void* J9FASTCALL
1163
old_fast_jitANewArray(J9VMThread *currentThread)
1164
{
1165
OLD_JIT_HELPER_PROLOGUE(2);
1166
DECLARE_JIT_CLASS_PARM(elementClass, 1);
1167
DECLARE_JIT_INT_PARM(size, 2);
1168
void *slowPath = NULL;
1169
if (fast_jitANewArrayImpl(currentThread, elementClass, size, false)) {
1170
slowPath = (void*)old_slow_jitANewArray;
1171
}
1172
return slowPath;
1173
}
1174
1175
void* J9FASTCALL
1176
old_slow_jitANewArrayNoZeroInit(J9VMThread *currentThread)
1177
{
1178
return slow_jitANewArrayImpl(currentThread, true);
1179
}
1180
1181
void* J9FASTCALL
1182
old_fast_jitANewArrayNoZeroInit(J9VMThread *currentThread)
1183
{
1184
OLD_JIT_HELPER_PROLOGUE(2);
1185
DECLARE_JIT_CLASS_PARM(elementClass, 1);
1186
DECLARE_JIT_INT_PARM(size, 2);
1187
void *slowPath = NULL;
1188
if (fast_jitANewArrayImpl(currentThread, elementClass, size, true)) {
1189
slowPath = (void*)old_slow_jitANewArrayNoZeroInit;
1190
}
1191
return slowPath;
1192
}
1193
1194
static VMINLINE bool
1195
fast_jitNewArrayImpl(J9VMThread *currentThread, I_32 arrayType, I_32 size, bool nonZeroTLH)
1196
{
1197
bool slowPathRequired = true;
1198
currentThread->floatTemp1 = (void*)(UDATA)arrayType;
1199
currentThread->floatTemp2 = (void*)(UDATA)size;
1200
if (size >= 0) {
1201
J9JavaVM *vm = currentThread->javaVM;
1202
J9Class *arrayClass = (&(vm->booleanArrayClass))[arrayType - 4];
1203
UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;
1204
if (nonZeroTLH) {
1205
allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;
1206
}
1207
j9object_t obj = vm->memoryManagerFunctions->J9AllocateIndexableObjectNoGC(currentThread, arrayClass, (U_32)size, allocationFlags);
1208
if (NULL != obj) {
1209
slowPathRequired = false;
1210
JIT_RETURN_UDATA(obj);
1211
}
1212
}
1213
return slowPathRequired;
1214
}
1215
1216
static VMINLINE void*
1217
slow_jitNewArrayImpl(J9VMThread *currentThread, bool nonZeroTLH)
1218
{
1219
SLOW_JIT_HELPER_PROLOGUE();
1220
I_32 arrayType = (I_32)(UDATA)currentThread->floatTemp1;
1221
I_32 size = (I_32)(UDATA)currentThread->floatTemp2;
1222
J9JavaVM *vm = currentThread->javaVM;
1223
J9Class *arrayClass = (&(vm->booleanArrayClass))[arrayType - 4];
1224
j9object_t obj = NULL;
1225
void *oldPC = currentThread->jitReturnAddress;
1226
void *addr = NULL;
1227
UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;
1228
if (nonZeroTLH) {
1229
allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;
1230
}
1231
if (size < 0) {
1232
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1233
addr = setNegativeArraySizeExceptionFromJIT(currentThread, size);
1234
goto done;
1235
}
1236
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
1237
obj = vm->memoryManagerFunctions->J9AllocateIndexableObject(currentThread, arrayClass, (U_32)size, allocationFlags);
1238
if (NULL == obj) {
1239
addr = setHeapOutOfMemoryErrorFromJIT(currentThread);
1240
goto done;
1241
}
1242
currentThread->floatTemp1 = (void*)obj; // in case of decompile
1243
addr = restoreJITResolveFrame(currentThread, oldPC, false, false);
1244
if (NULL != addr) {
1245
goto done;
1246
}
1247
JIT_RETURN_UDATA(obj);
1248
done:
1249
SLOW_JIT_HELPER_EPILOGUE();
1250
return addr;
1251
}
1252
1253
void* J9FASTCALL
1254
old_slow_jitNewArray(J9VMThread *currentThread)
1255
{
1256
return slow_jitNewArrayImpl(currentThread, false);
1257
}
1258
1259
void* J9FASTCALL
1260
old_fast_jitNewArray(J9VMThread *currentThread)
1261
{
1262
OLD_JIT_HELPER_PROLOGUE(2);
1263
DECLARE_JIT_INT_PARM(arrayType, 1);
1264
DECLARE_JIT_INT_PARM(size, 2);
1265
void *slowPath = NULL;
1266
if (fast_jitNewArrayImpl(currentThread, arrayType, size, false)) {
1267
slowPath = (void*)old_slow_jitNewArray;
1268
}
1269
return slowPath;
1270
}
1271
1272
void* J9FASTCALL
1273
old_slow_jitNewArrayNoZeroInit(J9VMThread *currentThread)
1274
{
1275
return slow_jitNewArrayImpl(currentThread, true);
1276
}
1277
1278
void* J9FASTCALL
1279
old_fast_jitNewArrayNoZeroInit(J9VMThread *currentThread)
1280
{
1281
OLD_JIT_HELPER_PROLOGUE(2);
1282
DECLARE_JIT_INT_PARM(arrayType, 1);
1283
DECLARE_JIT_INT_PARM(size, 2);
1284
void *slowPath = NULL;
1285
if (fast_jitNewArrayImpl(currentThread, arrayType, size, true)) {
1286
slowPath = (void*)old_slow_jitNewArrayNoZeroInit;
1287
}
1288
return slowPath;
1289
}
1290
1291
void* J9FASTCALL
1292
old_slow_jitAMultiNewArray(J9VMThread *currentThread)
1293
{
1294
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
1295
DECLARE_JIT_CLASS_PARM(elementClass, 1);
1296
DECLARE_JIT_INT_PARM(dimensions, 2);
1297
DECLARE_JIT_PARM(I_32*, dimensionsArray, 3);
1298
j9object_t obj = NULL;
1299
void *oldPC = currentThread->jitReturnAddress;
1300
void *addr = NULL;
1301
buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);
1302
obj = currentThread->javaVM->internalVMFunctions->helperMultiANewArray(currentThread, (J9ArrayClass*)elementClass, (UDATA)dimensions, dimensionsArray, J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE);
1303
currentThread->floatTemp1 = (void*)obj; // in case of decompile
1304
addr = restoreJITResolveFrame(currentThread, oldPC);
1305
if (NULL != addr) {
1306
goto done;
1307
}
1308
JIT_RETURN_UDATA(obj);
1309
done:
1310
SLOW_JIT_HELPER_EPILOGUE();
1311
return addr;
1312
}
1313
1314
void* J9FASTCALL
1315
old_slow_jitStackOverflow(J9VMThread *currentThread)
1316
{
1317
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(0);
1318
UDATA frameSize = JIT_STACK_OVERFLOW_SIZE;
1319
void *oldPC = currentThread->jitReturnAddress;
1320
void *addr = NULL;
1321
UDATA sp = (UDATA)currentThread->sp;
1322
UDATA checkSP = sp - frameSize;
1323
if ((checkSP > sp) || VM_VMHelpers::shouldGrowForSP(currentThread, (UDATA*)checkSP)) {
1324
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_STACK_OVERFLOW, parmCount, true, 0, oldPC);
1325
checkSP = (UDATA)currentThread->sp - frameSize;
1326
UDATA currentUsed = (UDATA)currentThread->stackObject->end - checkSP;
1327
J9JavaVM *vm = currentThread->javaVM;
1328
UDATA maxStackSize = vm->stackSize;
1329
if (currentUsed > maxStackSize) {
1330
throwStackOverflow:
1331
if (currentThread->privateFlags & J9_PRIVATE_FLAGS_STACK_OVERFLOW) {
1332
vm->internalVMFunctions->fatalRecursiveStackOverflow(currentThread);
1333
}
1334
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGSTACKOVERFLOWERROR, NULL);
1335
goto done;
1336
}
1337
currentUsed += vm->stackSizeIncrement;
1338
if (currentUsed > maxStackSize) {
1339
currentUsed = maxStackSize;
1340
}
1341
UDATA growRC = vm->internalVMFunctions->growJavaStack(currentThread, currentUsed);
1342
if (0 != growRC) {
1343
goto throwStackOverflow;
1344
}
1345
addr = restoreJITResolveFrame(currentThread, oldPC, false, false);
1346
if (NULL != addr) {
1347
goto done;
1348
}
1349
}
1350
if (VM_VMHelpers::asyncMessagePending(currentThread)) {
1351
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_STACK_OVERFLOW, parmCount, true, 0, oldPC);
1352
UDATA asyncAction = currentThread->javaVM->internalVMFunctions->javaCheckAsyncMessages(currentThread, TRUE);
1353
switch(asyncAction) {
1354
case J9_CHECK_ASYNC_THROW_EXCEPTION:
1355
addr = J9_JITHELPER_ACTION_THROW;
1356
goto done;
1357
case J9_CHECK_ASYNC_POP_FRAMES:
1358
addr = J9_JITHELPER_ACTION_POP_FRAMES;
1359
goto done;
1360
}
1361
addr = restoreJITResolveFrame(currentThread, oldPC);
1362
}
1363
done:
1364
SLOW_JIT_HELPER_EPILOGUE();
1365
return addr;
1366
}
1367
1368
void* J9FASTCALL
1369
old_slow_jitResolveString(J9VMThread *currentThread)
1370
{
1371
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
1372
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
1373
DECLARE_JIT_INT_PARM(cpIndex, 2);
1374
DECLARE_JIT_PARM(void*, jitEIP, 3);
1375
void *addr = NULL;
1376
J9RAMStringRef *ramCPEntry = (J9RAMStringRef*)ramConstantPool + cpIndex;
1377
j9object_t volatile *stringObjectPtr = (j9object_t volatile *)&ramCPEntry->stringObject;
1378
if (NULL == *stringObjectPtr) {
1379
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
1380
currentThread->javaVM->internalVMFunctions->resolveStringRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
1381
addr = restoreJITResolveFrame(currentThread, jitEIP);
1382
if (NULL != addr) {
1383
goto done;
1384
}
1385
}
1386
JIT_RETURN_UDATA(stringObjectPtr);
1387
done:
1388
SLOW_JIT_HELPER_EPILOGUE();
1389
return addr;
1390
}
1391
1392
void J9FASTCALL
1393
fast_jitAcquireVMAccess(J9VMThread *currentThread)
1394
{
1395
JIT_HELPER_PROLOGUE();
1396
#if defined(J9VM_INTERP_ATOMIC_FREE_JNI)
1397
VM_VMAccess::inlineEnterVMFromJNI(currentThread);
1398
#else /* J9VM_INTERP_ATOMIC_FREE_JNI */
1399
VM_VMAccess::inlineAcquireVMAccessExhaustiveCheck(currentThread);
1400
#endif /* J9VM_INTERP_ATOMIC_FREE_JNI */
1401
}
1402
1403
void J9FASTCALL
1404
fast_jitReleaseVMAccess(J9VMThread *currentThread)
1405
{
1406
JIT_HELPER_PROLOGUE();
1407
#if defined(J9VM_INTERP_ATOMIC_FREE_JNI)
1408
VM_VMAccess::inlineExitVMToJNI(currentThread);
1409
#else /* J9VM_INTERP_ATOMIC_FREE_JNI */
1410
VM_VMAccess::inlineReleaseVMAccess(currentThread);
1411
#endif /* J9VM_INTERP_ATOMIC_FREE_JNI */
1412
}
1413
1414
void* J9FASTCALL
1415
old_slow_jitCheckAsyncMessages(J9VMThread *currentThread)
1416
{
1417
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(0);
1418
void *addr = NULL;
1419
if (VM_VMHelpers::asyncMessagePending(currentThread)) {
1420
void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount, false);
1421
if (J9_CHECK_ASYNC_POP_FRAMES == currentThread->javaVM->internalVMFunctions->javaCheckAsyncMessages(currentThread, FALSE)) {
1422
addr = J9_JITHELPER_ACTION_POP_FRAMES;
1423
goto done;
1424
}
1425
addr = restoreJITResolveFrame(currentThread, oldPC, false, false);
1426
}
1427
done:
1428
SLOW_JIT_HELPER_EPILOGUE();
1429
return addr;
1430
}
1431
1432
void* J9FASTCALL
1433
impl_jitClassCastException(J9VMThread *currentThread)
1434
{
1435
SLOW_JIT_HELPER_PROLOGUE();
1436
J9Class* castClass = (J9Class*)currentThread->floatTemp1;
1437
J9Class* instanceClass = (J9Class*)currentThread->floatTemp2;
1438
buildJITResolveFrameForRuntimeHelper(currentThread, 0);
1439
void* exception = setClassCastExceptionFromJIT(currentThread, instanceClass, castClass);
1440
SLOW_JIT_HELPER_EPILOGUE();
1441
return exception;
1442
}
1443
1444
void* J9FASTCALL
1445
old_slow_jitCheckCast(J9VMThread *currentThread)
1446
{
1447
SLOW_JIT_HELPER_PROLOGUE();
1448
J9Class *castClass = (J9Class*)currentThread->floatTemp1;
1449
j9object_t object = (j9object_t)currentThread->floatTemp2;
1450
J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);
1451
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1452
return setClassCastExceptionFromJIT(currentThread, instanceClass, castClass);
1453
}
1454
1455
void* J9FASTCALL
1456
old_fast_jitCheckCast(J9VMThread *currentThread)
1457
{
1458
void *slowPath = NULL;
1459
OLD_JIT_HELPER_PROLOGUE(2);
1460
DECLARE_JIT_CLASS_PARM(castClass, 1);
1461
DECLARE_JIT_PARM(j9object_t, object, 2);
1462
/* null can be cast to anything, except if castClass is a VT */
1463
if (NULL != object) {
1464
J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);
1465
if (!VM_VMHelpers::inlineCheckCast(instanceClass, castClass)) {
1466
currentThread->floatTemp1 = (void*)castClass;
1467
currentThread->floatTemp2 = (void*)object;
1468
slowPath = (void*)old_slow_jitCheckCast;
1469
}
1470
}
1471
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
1472
else if (J9_IS_J9CLASS_VALUETYPE(castClass)) {
1473
slowPath = (void*)old_slow_jitThrowNullPointerException;
1474
}
1475
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
1476
return slowPath;
1477
}
1478
1479
void* J9FASTCALL
1480
old_slow_jitCheckCastForArrayStore(J9VMThread *currentThread)
1481
{
1482
SLOW_JIT_HELPER_PROLOGUE();
1483
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1484
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
1485
}
1486
1487
void* J9FASTCALL
1488
old_fast_jitCheckCastForArrayStore(J9VMThread *currentThread)
1489
{
1490
void *slowPath = NULL;
1491
OLD_JIT_HELPER_PROLOGUE(2);
1492
DECLARE_JIT_CLASS_PARM(castClass, 1);
1493
DECLARE_JIT_PARM(j9object_t, object, 2);
1494
/* null can be cast to anything, except if castClass is a VT */
1495
if (NULL != object) {
1496
J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);
1497
if (!VM_VMHelpers::inlineCheckCast(instanceClass, castClass)) {
1498
slowPath = (void*)old_slow_jitCheckCastForArrayStore;
1499
}
1500
}
1501
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
1502
else if (J9_IS_J9CLASS_VALUETYPE(castClass)) {
1503
slowPath = (void*)old_slow_jitThrowNullPointerException;
1504
}
1505
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
1506
return slowPath;
1507
}
1508
1509
void J9FASTCALL
1510
old_fast_jitCheckIfFinalizeObject(J9VMThread *currentThread)
1511
{
1512
OLD_JIT_HELPER_PROLOGUE(1);
1513
DECLARE_JIT_PARM(j9object_t, object, 1);
1514
VM_VMHelpers::checkIfFinalizeObject(currentThread, object);
1515
}
1516
1517
void J9FASTCALL
1518
old_fast_jitCollapseJNIReferenceFrame(J9VMThread *currentThread)
1519
{
1520
JIT_HELPER_PROLOGUE();
1521
/* The direct JNI code has dropped all pushed JNI refs from the stack, and has called this routine on the java stack */
1522
UDATA *bp = ((UDATA *)(((J9SFJNINativeMethodFrame*)currentThread->sp) + 1)) - 1;
1523
currentThread->javaVM->internalVMFunctions->returnFromJNI(currentThread, bp);
1524
}
1525
1526
void* J9FASTCALL
1527
old_slow_jitHandleArrayIndexOutOfBoundsTrap(J9VMThread *currentThread)
1528
{
1529
JIT_HELPER_PROLOGUE();
1530
buildJITResolveFrameForTrapHandler(currentThread);
1531
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
1532
}
1533
1534
void* J9FASTCALL
1535
old_slow_jitHandleIntegerDivideByZeroTrap(J9VMThread *currentThread)
1536
{
1537
JIT_HELPER_PROLOGUE();
1538
buildJITResolveFrameForTrapHandler(currentThread);
1539
return setCurrentExceptionNLSFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARITHMETICEXCEPTION, J9NLS_VM_DIVIDE_BY_ZERO);
1540
}
1541
1542
void* J9FASTCALL
1543
old_slow_jitHandleNullPointerExceptionTrap(J9VMThread *currentThread)
1544
{
1545
JIT_HELPER_PROLOGUE();
1546
buildJITResolveFrameForTrapHandler(currentThread);
1547
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
1548
}
1549
1550
void* J9FASTCALL
1551
old_slow_jitHandleInternalErrorTrap(J9VMThread *currentThread)
1552
{
1553
JIT_HELPER_PROLOGUE();
1554
buildJITResolveFrameForTrapHandler(currentThread);
1555
return setCurrentExceptionUTFFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINTERNALERROR, "SIGBUS");
1556
}
1557
1558
void J9FASTCALL
1559
old_fast_jitInstanceOf(J9VMThread *currentThread)
1560
{
1561
OLD_JIT_HELPER_PROLOGUE(2);
1562
DECLARE_JIT_CLASS_PARM(castClass, 1);
1563
DECLARE_JIT_PARM(j9object_t, object, 2);
1564
UDATA isInstance = 0;
1565
/* null isn't an instance of anything */
1566
if (NULL != object) {
1567
J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);
1568
if (VM_VMHelpers::inlineCheckCast(instanceClass, castClass)) {
1569
isInstance = 1;
1570
}
1571
}
1572
JIT_RETURN_UDATA(isInstance);
1573
}
1574
1575
void* J9FASTCALL
1576
old_slow_jitLookupInterfaceMethod(J9VMThread *currentThread)
1577
{
1578
SLOW_JIT_HELPER_PROLOGUE();
1579
J9Class *receiverClass = (J9Class*)currentThread->floatTemp1;
1580
UDATA *indexAndLiteralsEA = (UDATA*)currentThread->floatTemp2;
1581
void *jitEIP = (void*)currentThread->floatTemp3;
1582
J9Class *interfaceClass = ((J9Class**)indexAndLiteralsEA)[0];
1583
UDATA iTableOffset = indexAndLiteralsEA[1];
1584
UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);
1585
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_INTERFACE_LOOKUP, parmCount, true, 0, jitEIP);
1586
if (0 == vTableOffset) {
1587
setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINCOMPATIBLECLASSCHANGEERROR, NULL);
1588
} else {
1589
J9Method* method = *(J9Method**)((UDATA)receiverClass + vTableOffset);
1590
TIDY_BEFORE_THROW();
1591
currentThread->javaVM->internalVMFunctions->setIllegalAccessErrorNonPublicInvokeInterface(currentThread, method);
1592
}
1593
return J9_JITHELPER_ACTION_THROW;
1594
}
1595
1596
void* J9FASTCALL
1597
old_fast_jitLookupInterfaceMethod(J9VMThread *currentThread)
1598
{
1599
void *slowPath = (void*)old_slow_jitLookupInterfaceMethod;
1600
OLD_JIT_HELPER_PROLOGUE(3);
1601
DECLARE_JIT_CLASS_PARM(receiverClass, 1);
1602
DECLARE_JIT_PARM(UDATA*, indexAndLiteralsEA, 2);
1603
DECLARE_JIT_PARM(void*, jitEIP, 3);
1604
currentThread->floatTemp1 = (void*)receiverClass;
1605
currentThread->floatTemp2 = (void*)indexAndLiteralsEA;
1606
currentThread->floatTemp3 = (void*)jitEIP;
1607
J9Class *interfaceClass = ((J9Class**)indexAndLiteralsEA)[0];
1608
UDATA iTableOffset = indexAndLiteralsEA[1];
1609
UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);
1610
if (0 != vTableOffset) {
1611
J9Method* method = *(J9Method**)((UDATA)receiverClass + vTableOffset);
1612
if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccPublic)) {
1613
slowPath = NULL;
1614
JIT_RETURN_UDATA(vTableOffset);
1615
}
1616
}
1617
return slowPath;
1618
}
1619
1620
void J9FASTCALL
1621
old_fast_jitLookupDynamicInterfaceMethod(J9VMThread *currentThread)
1622
{
1623
OLD_JIT_HELPER_PROLOGUE(3);
1624
DECLARE_JIT_CLASS_PARM(receiverClass, 1);
1625
DECLARE_JIT_CLASS_PARM(interfaceClass, 2);
1626
DECLARE_JIT_PARM(UDATA, iTableIndex, 3);
1627
UDATA iTableOffset = sizeof(struct J9ITable) + (iTableIndex * sizeof(UDATA));
1628
UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);
1629
Assert_CodertVM_false(0 == vTableOffset);
1630
JIT_RETURN_UDATA(vTableOffset);
1631
}
1632
1633
void* J9FASTCALL
1634
old_slow_jitLookupDynamicPublicInterfaceMethod(J9VMThread *currentThread)
1635
{
1636
SLOW_JIT_HELPER_PROLOGUE();
1637
J9Method *method = (J9Method*)currentThread->floatTemp1;
1638
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1639
TIDY_BEFORE_THROW();
1640
currentThread->javaVM->internalVMFunctions->setIllegalAccessErrorNonPublicInvokeInterface(currentThread, method);
1641
return J9_JITHELPER_ACTION_THROW;
1642
}
1643
1644
void* J9FASTCALL
1645
old_fast_jitLookupDynamicPublicInterfaceMethod(J9VMThread *currentThread)
1646
{
1647
void *slowPath = (void*)old_slow_jitLookupDynamicPublicInterfaceMethod;
1648
OLD_JIT_HELPER_PROLOGUE(3);
1649
DECLARE_JIT_CLASS_PARM(receiverClass, 1);
1650
DECLARE_JIT_CLASS_PARM(interfaceClass, 2);
1651
DECLARE_JIT_PARM(UDATA, iTableIndex, 3);
1652
UDATA iTableOffset = sizeof(struct J9ITable) + (iTableIndex * sizeof(UDATA));
1653
UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);
1654
Assert_CodertVM_false(0 == vTableOffset);
1655
/* The receiver's implementation is required to be public */
1656
J9Method *method = *(J9Method**)((UDATA)receiverClass + vTableOffset);
1657
if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccPublic)) {
1658
slowPath = NULL;
1659
JIT_RETURN_UDATA(vTableOffset);
1660
} else {
1661
currentThread->floatTemp1 = (void*)method;
1662
}
1663
return slowPath;
1664
}
1665
1666
void J9FASTCALL
1667
old_fast_jitMethodIsNative(J9VMThread *currentThread)
1668
{
1669
OLD_JIT_HELPER_PROLOGUE(1);
1670
DECLARE_JIT_PARM(J9Method*, method, 1);
1671
UDATA isNative = 0;
1672
if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccNative)) {
1673
isNative = 1;
1674
}
1675
JIT_RETURN_UDATA(isNative);
1676
}
1677
1678
void J9FASTCALL
1679
old_fast_jitMethodIsSync(J9VMThread *currentThread)
1680
{
1681
OLD_JIT_HELPER_PROLOGUE(1);
1682
DECLARE_JIT_PARM(J9Method*, method, 1);
1683
UDATA isSync = 0;
1684
if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccSynchronized)) {
1685
isSync = 1;
1686
}
1687
JIT_RETURN_UDATA(isSync);
1688
}
1689
1690
static VMINLINE bool
1691
fast_jitMonitorEnterImpl(J9VMThread *currentThread, j9object_t syncObject, bool forMethod)
1692
{
1693
bool slowPathRequired = false;
1694
UDATA monstatus = currentThread->javaVM->internalVMFunctions->objectMonitorEnterNonBlocking(currentThread, syncObject);
1695
if (monstatus <= J9_OBJECT_MONITOR_BLOCKING) {
1696
slowPathRequired = true;
1697
currentThread->floatTemp1 = (void*)monstatus;
1698
#if JAVA_SPEC_VERSION >= 16
1699
currentThread->floatTemp2 = (void*)syncObject;
1700
#endif /* JAVA_SPEC_VERSION >= 16 */
1701
}
1702
return slowPathRequired;
1703
}
1704
1705
static VMINLINE void*
1706
slow_jitMonitorEnterImpl(J9VMThread *currentThread, bool forMethod)
1707
{
1708
SLOW_JIT_HELPER_PROLOGUE();
1709
void *addr = NULL;
1710
UDATA flags = J9_STACK_FLAGS_JIT_RESOLVE_FRAME | (forMethod ? J9_STACK_FLAGS_JIT_METHOD_MONITOR_ENTER_RESOLVE : J9_STACK_FLAGS_JIT_MONITOR_ENTER_RESOLVE);
1711
IDATA monstatus = (IDATA)(UDATA)currentThread->floatTemp1;
1712
void *oldPC = buildJITResolveFrame(currentThread, flags, parmCount);
1713
if (monstatus < J9_OBJECT_MONITOR_BLOCKING) {
1714
if (forMethod) {
1715
/* Only mark the outer frame for failed method monitor enter - inline frames have correct maps */
1716
void * stackMap = NULL;
1717
void * inlineMap = NULL;
1718
J9JavaVM *vm = currentThread->javaVM;
1719
J9JITExceptionTable *metaData = vm->jitConfig->jitGetExceptionTableFromPC(currentThread, (UDATA)oldPC);
1720
Assert_CodertVM_false(NULL == metaData);
1721
jitGetMapsFromPC(currentThread, vm, metaData, (UDATA)oldPC, &stackMap, &inlineMap);
1722
Assert_CodertVM_false(NULL == inlineMap);
1723
if ((NULL == getJitInlinedCallInfo(metaData)) || (NULL == getFirstInlinedCallSite(metaData, inlineMap))) {
1724
J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;
1725
resolveFrame->specialFrameFlags = (resolveFrame->specialFrameFlags & ~J9_STACK_FLAGS_JIT_FRAME_SUB_TYPE_MASK) | J9_STACK_FLAGS_JIT_FAILED_METHOD_MONITOR_ENTER_RESOLVE;
1726
}
1727
}
1728
#if JAVA_SPEC_VERSION >= 16
1729
if (J9_OBJECT_MONITOR_VALUE_TYPE_IMSE == monstatus) {
1730
j9object_t syncObject = (j9object_t)currentThread->floatTemp2;
1731
J9Class* badClass = J9OBJECT_CLAZZ(currentThread, syncObject);
1732
J9UTF8 *className = J9ROMCLASS_CLASSNAME(badClass->romClass);
1733
TIDY_BEFORE_THROW();
1734
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
1735
if (J9_IS_J9CLASS_VALUETYPE(badClass)) {
1736
currentThread->javaVM->internalVMFunctions->setCurrentExceptionNLSWithArgs(currentThread, J9NLS_VM_ERROR_BYTECODE_OBJECTREF_CANNOT_BE_VALUE_TYPE,
1737
J9VMCONSTANTPOOL_JAVALANGILLEGALMONITORSTATEEXCEPTION, J9UTF8_LENGTH(className), J9UTF8_DATA(className));
1738
} else
1739
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
1740
{
1741
Assert_CodertVM_true(J9_ARE_ALL_BITS_SET(currentThread->javaVM->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_VALUE_BASED_EXCEPTION));
1742
currentThread->javaVM->internalVMFunctions->setCurrentExceptionNLSWithArgs(currentThread, J9NLS_VM_ERROR_BYTECODE_OBJECTREF_CANNOT_BE_VALUE_BASED,
1743
J9VMCONSTANTPOOL_JAVALANGVIRTUALMACHINEERROR, J9UTF8_LENGTH(className), J9UTF8_DATA(className));
1744
}
1745
addr = J9_JITHELPER_ACTION_THROW;
1746
goto done;
1747
}
1748
#endif /* JAVA_SPEC_VERSION >= 16 */
1749
if (J9_OBJECT_MONITOR_OOM == monstatus) {
1750
addr = setNativeOutOfMemoryErrorFromJIT(currentThread, J9NLS_VM_FAILED_TO_ALLOCATE_MONITOR);
1751
goto done;
1752
}
1753
} else {
1754
currentThread->javaVM->internalVMFunctions->objectMonitorEnterBlocking(currentThread);
1755
/* Do not check asyncs for synchronized block (non-method) entry, since we now have the monitor,
1756
* but are not inside an exception range which will unlock the monitor if the checkAsync throws an exception.
1757
*/
1758
addr = restoreJITResolveFrame(currentThread, oldPC, forMethod, false);
1759
}
1760
done:
1761
SLOW_JIT_HELPER_EPILOGUE();
1762
return addr;
1763
}
1764
1765
void* J9FASTCALL
1766
old_slow_jitMethodMonitorEntry(J9VMThread *currentThread)
1767
{
1768
return slow_jitMonitorEnterImpl(currentThread, true);
1769
}
1770
1771
void* J9FASTCALL
1772
old_fast_jitMethodMonitorEntry(J9VMThread *currentThread)
1773
{
1774
OLD_JIT_HELPER_PROLOGUE(1);
1775
DECLARE_JIT_PARM(j9object_t, syncObject, 1);
1776
void *slowPath = NULL;
1777
if (fast_jitMonitorEnterImpl(currentThread, syncObject, true)) {
1778
slowPath = (void*)old_slow_jitMethodMonitorEntry;
1779
}
1780
return slowPath;
1781
}
1782
1783
void* J9FASTCALL
1784
old_slow_jitMonitorEntry(J9VMThread *currentThread)
1785
{
1786
return slow_jitMonitorEnterImpl(currentThread, false);
1787
}
1788
1789
void* J9FASTCALL
1790
old_fast_jitMonitorEntry(J9VMThread *currentThread)
1791
{
1792
OLD_JIT_HELPER_PROLOGUE(1);
1793
DECLARE_JIT_PARM(j9object_t, syncObject, 1);
1794
void *slowPath = NULL;
1795
if (fast_jitMonitorEnterImpl(currentThread, syncObject, false)) {
1796
slowPath = (void*)old_slow_jitMonitorEntry;
1797
}
1798
return slowPath;
1799
}
1800
1801
static VMINLINE bool
1802
fast_jitMonitorExitImpl(J9VMThread *currentThread, j9object_t syncObject, bool forMethod)
1803
{
1804
bool slowPathRequired = true;
1805
currentThread->floatTemp1 = (void*)syncObject;
1806
currentThread->floatTemp2 = (void*)J9THREAD_WOULD_BLOCK;
1807
J9JavaVM *vm = currentThread->javaVM;
1808
/* If there is a possibility that a hook will be reported from the helper, we need to build a frame */
1809
if (!J9_EVENT_IS_RESERVED(vm->hookInterface, J9HOOK_VM_MONITOR_CONTENDED_EXIT)) {
1810
IDATA monstatus = vm->internalVMFunctions->objectMonitorExit(currentThread, syncObject);
1811
if (0 == monstatus) {
1812
slowPathRequired = false;
1813
} else {
1814
currentThread->floatTemp2 = (void*)J9THREAD_ILLEGAL_MONITOR_STATE;
1815
}
1816
}
1817
return slowPathRequired;
1818
}
1819
1820
static VMINLINE void*
1821
slow_jitMonitorExitImpl(J9VMThread *currentThread, bool forMethod)
1822
{
1823
SLOW_JIT_HELPER_PROLOGUE();
1824
j9object_t syncObject = (j9object_t)currentThread->floatTemp1;
1825
IDATA monstatus = (IDATA)(UDATA)currentThread->floatTemp2;
1826
J9JavaVM *vm = currentThread->javaVM;
1827
J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;
1828
void *oldPC = NULL;
1829
void *addr = NULL;
1830
/* J9THREAD_WOULD_BLOCK indicates that the exit hook was reserved */
1831
if (J9THREAD_WOULD_BLOCK == monstatus) {
1832
oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1833
fixStackForSyntheticHandler(currentThread);
1834
monstatus = vmFuncs->objectMonitorExit(currentThread, syncObject);
1835
}
1836
if (0 != monstatus) {
1837
if (NULL == oldPC) {
1838
oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1839
fixStackForSyntheticHandler(currentThread);
1840
}
1841
addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALMONITORSTATEEXCEPTION, NULL);
1842
goto done;
1843
}
1844
if (NULL != oldPC) {
1845
addr = restoreJITResolveFrame(currentThread, oldPC);
1846
}
1847
done:
1848
SLOW_JIT_HELPER_EPILOGUE();
1849
return addr;
1850
}
1851
1852
void* J9FASTCALL
1853
old_slow_jitMethodMonitorExit(J9VMThread *currentThread)
1854
{
1855
return slow_jitMonitorExitImpl(currentThread, true);
1856
}
1857
1858
void* J9FASTCALL
1859
old_slow_jitThrowIncompatibleReceiver(J9VMThread *currentThread)
1860
{
1861
OLD_JIT_HELPER_PROLOGUE(2);
1862
DECLARE_JIT_CLASS_PARM(receiverClass, 1);
1863
DECLARE_JIT_CLASS_PARM(currentClass, 2);
1864
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
1865
TIDY_BEFORE_THROW();
1866
currentThread->javaVM->internalVMFunctions->setIllegalAccessErrorReceiverNotSameOrSubtypeOfCurrentClass(currentThread, receiverClass, currentClass);
1867
return J9_JITHELPER_ACTION_THROW;
1868
}
1869
1870
void* J9FASTCALL
1871
old_fast_jitMethodMonitorExit(J9VMThread *currentThread)
1872
{
1873
OLD_JIT_HELPER_PROLOGUE(1);
1874
DECLARE_JIT_PARM(j9object_t, syncObject, 1);
1875
void *slowPath = NULL;
1876
if (fast_jitMonitorExitImpl(currentThread, syncObject, true)) {
1877
slowPath = (void*)old_slow_jitMethodMonitorExit;
1878
}
1879
return slowPath;
1880
}
1881
1882
void* J9FASTCALL
1883
old_slow_jitMonitorExit(J9VMThread *currentThread)
1884
{
1885
return slow_jitMonitorExitImpl(currentThread, false);
1886
}
1887
1888
void* J9FASTCALL
1889
old_fast_jitMonitorExit(J9VMThread *currentThread)
1890
{
1891
OLD_JIT_HELPER_PROLOGUE(1);
1892
DECLARE_JIT_PARM(j9object_t, syncObject, 1);
1893
void *slowPath = NULL;
1894
if (fast_jitMonitorExitImpl(currentThread, syncObject, false)) {
1895
slowPath = (void*)old_slow_jitMonitorExit;
1896
}
1897
return slowPath;
1898
}
1899
1900
static VMINLINE void*
1901
jitReportMethodEnterImpl(J9VMThread *currentThread, J9Method *method, j9object_t receiver, bool isStatic)
1902
{
1903
SLOW_JIT_HELPER_PROLOGUE();
1904
J9JavaVM *vm = currentThread->javaVM;
1905
void *addr = NULL;
1906
bool hooked = J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_METHOD_ENTER);
1907
bool traced = VM_VMHelpers::methodBeingTraced(vm, method);
1908
if (hooked || traced) {
1909
void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);
1910
j9object_t* receiverAddress = NULL;
1911
if (!isStatic) {
1912
/* The current value of the jitException slot is preserved in the resolve frame, so it can be safely overwritten */
1913
receiverAddress = &(currentThread->jitException);
1914
*receiverAddress = receiver;
1915
}
1916
if (traced) {
1917
UTSI_TRACEMETHODENTER_FROMVM(vm, currentThread, method, (void*)receiverAddress, 1);
1918
}
1919
if (hooked) {
1920
ALWAYS_TRIGGER_J9HOOK_VM_METHOD_ENTER(vm->hookInterface, currentThread, method, (void*)receiverAddress, 1);
1921
}
1922
addr = restoreJITResolveFrame(currentThread, oldPC, true, false);
1923
}
1924
SLOW_JIT_HELPER_EPILOGUE();
1925
return addr;
1926
}
1927
1928
void* J9FASTCALL
1929
old_slow_jitReportMethodEnter(J9VMThread *currentThread)
1930
{
1931
OLD_JIT_HELPER_PROLOGUE(2);
1932
DECLARE_JIT_PARM(J9Method*, method, 1);
1933
DECLARE_JIT_PARM(j9object_t, receiver, 2);
1934
return jitReportMethodEnterImpl(currentThread, method, receiver, false);
1935
}
1936
1937
void* J9FASTCALL
1938
old_slow_jitReportStaticMethodEnter(J9VMThread *currentThread)
1939
{
1940
OLD_JIT_HELPER_PROLOGUE(1);
1941
DECLARE_JIT_PARM(J9Method*, method, 1);
1942
return jitReportMethodEnterImpl(currentThread, method, NULL, true);
1943
}
1944
1945
void* J9FASTCALL
1946
old_slow_jitReportMethodExit(J9VMThread *currentThread)
1947
{
1948
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
1949
DECLARE_JIT_PARM(J9Method*, method, 1);
1950
DECLARE_JIT_PARM(void*, returnValueAddress, 2);
1951
J9JavaVM *vm = currentThread->javaVM;
1952
void *addr = NULL;
1953
bool hooked = J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_METHOD_RETURN);
1954
bool traced = VM_VMHelpers::methodBeingTraced(vm, method);
1955
if (hooked || traced) {
1956
void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);
1957
if (traced) {
1958
UTSI_TRACEMETHODEXIT_FROMVM(vm, currentThread, method, NULL, returnValueAddress, 1);
1959
}
1960
if (hooked) {
1961
ALWAYS_TRIGGER_J9HOOK_VM_METHOD_RETURN(vm->hookInterface, currentThread, method, FALSE, returnValueAddress, 1);
1962
}
1963
addr = restoreJITResolveFrame(currentThread, oldPC, true, false);
1964
}
1965
SLOW_JIT_HELPER_EPILOGUE();
1966
return addr;
1967
}
1968
1969
void* J9FASTCALL
1970
old_slow_jitResolveClass(J9VMThread *currentThread)
1971
{
1972
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
1973
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
1974
DECLARE_JIT_INT_PARM(cpIndex, 2);
1975
DECLARE_JIT_PARM(void*, jitEIP, 3);
1976
void *addr = NULL;
1977
J9Class *clazz = NULL;
1978
// remove until matching fix comes from TR
1979
// clazz = ((J9RAMClassRef*)ramConstantPool)[cpIndex].value;
1980
if (NULL == clazz) {
1981
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
1982
clazz = currentThread->javaVM->internalVMFunctions->resolveClassRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
1983
addr = restoreJITResolveFrame(currentThread, jitEIP);
1984
if (NULL != addr) {
1985
goto done;
1986
}
1987
}
1988
JIT_RETURN_UDATA(clazz);
1989
done:
1990
SLOW_JIT_HELPER_EPILOGUE();
1991
return addr;
1992
}
1993
1994
void* J9FASTCALL
1995
old_slow_jitResolveClassFromStaticField(J9VMThread *currentThread)
1996
{
1997
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
1998
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
1999
DECLARE_JIT_INT_PARM(cpIndex, 2);
2000
DECLARE_JIT_PARM(void*, jitEIP, 3);
2001
void *addr = NULL;
2002
J9RAMStaticFieldRef *ramStaticFieldRef = (J9RAMStaticFieldRef*)ramConstantPool + cpIndex;
2003
IDATA flagsAndClass = ramStaticFieldRef->flagsAndClass;
2004
UDATA valueOffset = ramStaticFieldRef->valueOffset;
2005
if (J9_UNEXPECTED(!VM_VMHelpers::staticFieldRefIsResolved(flagsAndClass, valueOffset))) {
2006
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2007
J9RAMStaticFieldRef localRef;
2008
currentThread->javaVM->internalVMFunctions->resolveStaticFieldRefInto(currentThread, NULL, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE, NULL, &localRef);
2009
addr = restoreJITResolveFrame(currentThread, jitEIP);
2010
if (NULL != addr) {
2011
goto done;
2012
}
2013
flagsAndClass = localRef.flagsAndClass;
2014
}
2015
JIT_RETURN_UDATA(((UDATA)flagsAndClass) << J9_REQUIRED_CLASS_SHIFT);
2016
done:
2017
SLOW_JIT_HELPER_EPILOGUE();
2018
return addr;
2019
}
2020
2021
void J9FASTCALL
2022
old_fast_jitResolvedFieldIsVolatile(J9VMThread *currentThread)
2023
{
2024
OLD_JIT_HELPER_PROLOGUE(3);
2025
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2026
DECLARE_JIT_PARM(UDATA, cpIndex, 2);
2027
DECLARE_JIT_PARM(UDATA, isStatic, 3);
2028
UDATA isVolatile = 0;
2029
if (isStatic) {
2030
if (J9_ARE_ANY_BITS_SET(((J9RAMStaticFieldRef*)ramConstantPool)[cpIndex].flagsAndClass, STATIC_FIELD_REF_BIT(J9StaticFieldRefVolatile))) {
2031
isVolatile = 1;
2032
}
2033
} else {
2034
if (J9_ARE_ANY_BITS_SET(((J9RAMFieldRef*)ramConstantPool)[cpIndex].flags, J9AccVolatile)) {
2035
isVolatile = 1;
2036
}
2037
}
2038
JIT_RETURN_UDATA(isVolatile);
2039
}
2040
2041
static VMINLINE void*
2042
old_slow_jitResolveFieldImpl(J9VMThread *currentThread, UDATA parmCount, J9ConstantPool *ramConstantPool, UDATA cpIndex, void *jitEIP, bool isSetter, bool direct)
2043
{
2044
J9Method *method = NULL;
2045
UDATA resolveFlags = J9_RESOLVE_FLAG_RUNTIME_RESOLVE;
2046
J9JavaVM *vm = currentThread->javaVM;
2047
buildJITResolveFrameWithPC(currentThread, direct ? J9_SSF_JIT_RESOLVE : J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2048
if (isSetter) {
2049
J9StackWalkState *walkState = currentThread->stackWalkState;
2050
walkState->walkThread = currentThread;
2051
walkState->skipCount = 0;
2052
walkState->flags = J9_STACKWALK_VISIBLE_ONLY | J9_STACKWALK_COUNT_SPECIFIED;
2053
walkState->maxFrames = 1;
2054
vm->walkStackFrames(currentThread, walkState);
2055
method = walkState->method;
2056
resolveFlags |= J9_RESOLVE_FLAG_FIELD_SETTER;
2057
}
2058
UDATA valueOffset = vm->internalVMFunctions->resolveInstanceFieldRef(currentThread, method, ramConstantPool, cpIndex, resolveFlags, NULL);
2059
void *addr = restoreJITResolveFrame(currentThread, jitEIP);
2060
if (NULL != addr) {
2061
goto done;
2062
}
2063
valueOffset += J9VMTHREAD_OBJECT_HEADER_SIZE(currentThread);
2064
JIT_RETURN_UDATA(valueOffset);
2065
done:
2066
return addr;
2067
}
2068
2069
void* J9FASTCALL
2070
old_slow_jitResolveField(J9VMThread *currentThread)
2071
{
2072
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2073
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2074
DECLARE_JIT_INT_PARM(cpIndex, 2);
2075
DECLARE_JIT_PARM(void*, jitEIP, 3);
2076
void *addr = old_slow_jitResolveFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, false, false);
2077
SLOW_JIT_HELPER_EPILOGUE();
2078
return addr;
2079
}
2080
2081
void* J9FASTCALL
2082
old_slow_jitResolveFieldSetter(J9VMThread *currentThread)
2083
{
2084
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2085
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2086
DECLARE_JIT_INT_PARM(cpIndex, 2);
2087
DECLARE_JIT_PARM(void*, jitEIP, 3);
2088
void *addr = old_slow_jitResolveFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, true, false);
2089
SLOW_JIT_HELPER_EPILOGUE();
2090
return addr;
2091
}
2092
2093
void* J9FASTCALL
2094
old_slow_jitResolveFieldDirect(J9VMThread *currentThread)
2095
{
2096
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
2097
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2098
DECLARE_JIT_INT_PARM(cpIndex, 2);
2099
void *jitEIP = currentThread->jitReturnAddress;
2100
void *addr = old_slow_jitResolveFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, false, true);
2101
SLOW_JIT_HELPER_EPILOGUE();
2102
return addr;
2103
}
2104
2105
void* J9FASTCALL
2106
old_slow_jitResolveFieldSetterDirect(J9VMThread *currentThread)
2107
{
2108
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
2109
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2110
DECLARE_JIT_INT_PARM(cpIndex, 2);
2111
void *jitEIP = currentThread->jitReturnAddress;
2112
void *addr = old_slow_jitResolveFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, true, true);
2113
SLOW_JIT_HELPER_EPILOGUE();
2114
return addr;
2115
}
2116
2117
static VMINLINE void*
2118
old_slow_jitResolveStaticFieldImpl(J9VMThread *currentThread, UDATA parmCount, J9ConstantPool *ramConstantPool, UDATA cpIndex, void *jitEIP, bool isSetter, bool direct)
2119
{
2120
J9JavaVM *vm = currentThread->javaVM;
2121
J9Method *method = NULL;
2122
UDATA resolveFlags = J9_RESOLVE_FLAG_RUNTIME_RESOLVE | J9_RESOLVE_FLAG_CHECK_CLINIT;
2123
buildJITResolveFrameWithPC(currentThread, direct ? J9_SSF_JIT_RESOLVE : J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2124
if (isSetter) {
2125
J9StackWalkState *walkState = currentThread->stackWalkState;
2126
walkState->walkThread = currentThread;
2127
walkState->skipCount = 0;
2128
walkState->flags = J9_STACKWALK_VISIBLE_ONLY | J9_STACKWALK_COUNT_SPECIFIED;
2129
walkState->maxFrames = 1;
2130
vm->walkStackFrames(currentThread, walkState);
2131
method = walkState->method;
2132
resolveFlags |= J9_RESOLVE_FLAG_FIELD_SETTER;
2133
}
2134
UDATA field = (UDATA)vm->internalVMFunctions->resolveStaticFieldRef(currentThread, method, ramConstantPool, cpIndex, resolveFlags, NULL);
2135
if ((UDATA)-1 == field) {
2136
/* fetch result from floatTemp - stashed there in clinit case */
2137
J9RAMStaticFieldRef *fakeRef = (J9RAMStaticFieldRef*)&currentThread->floatTemp1;
2138
/* Resolve call indicated success - no need for extra putstatic checks, and the ref
2139
* must contain valid resolved information.
2140
*/
2141
field = (UDATA)VM_VMHelpers::staticFieldAddressFromResolvedRef(fakeRef->flagsAndClass, fakeRef->valueOffset);
2142
/* Direct resolves do not patch the code cache, so do not need the clinit tag */
2143
if (!direct) {
2144
/* tag result as being from a clinit */
2145
field |= J9_RESOLVE_STATIC_FIELD_TAG_FROM_CLINIT;
2146
}
2147
}
2148
void *addr = restoreJITResolveFrame(currentThread, jitEIP);
2149
if (NULL == addr) {
2150
JIT_RETURN_UDATA(field);
2151
}
2152
return addr;
2153
}
2154
2155
void* J9FASTCALL
2156
old_slow_jitResolveStaticField(J9VMThread *currentThread)
2157
{
2158
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2159
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2160
DECLARE_JIT_INT_PARM(cpIndex, 2);
2161
DECLARE_JIT_PARM(void*, jitEIP, 3);
2162
void *addr = old_slow_jitResolveStaticFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, false, false);
2163
SLOW_JIT_HELPER_EPILOGUE();
2164
return addr;
2165
}
2166
2167
void* J9FASTCALL
2168
old_slow_jitResolveStaticFieldSetter(J9VMThread *currentThread)
2169
{
2170
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2171
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2172
DECLARE_JIT_INT_PARM(cpIndex, 2);
2173
DECLARE_JIT_PARM(void*, jitEIP, 3);
2174
void *addr = old_slow_jitResolveStaticFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, true, false);
2175
SLOW_JIT_HELPER_EPILOGUE();
2176
return addr;
2177
}
2178
2179
void* J9FASTCALL
2180
old_slow_jitResolveStaticFieldDirect(J9VMThread *currentThread)
2181
{
2182
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
2183
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2184
DECLARE_JIT_INT_PARM(cpIndex, 2);
2185
void *jitEIP = currentThread->jitReturnAddress;
2186
void *addr = old_slow_jitResolveStaticFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, false, true);
2187
SLOW_JIT_HELPER_EPILOGUE();
2188
return addr;
2189
}
2190
2191
void* J9FASTCALL
2192
old_slow_jitResolveStaticFieldSetterDirect(J9VMThread *currentThread)
2193
{
2194
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
2195
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2196
DECLARE_JIT_INT_PARM(cpIndex, 2);
2197
void *jitEIP = currentThread->jitReturnAddress;
2198
void *addr = old_slow_jitResolveStaticFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, true, true);
2199
SLOW_JIT_HELPER_EPILOGUE();
2200
return addr;
2201
}
2202
2203
void* J9FASTCALL
2204
old_slow_jitResolveInterfaceMethod(J9VMThread *currentThread)
2205
{
2206
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
2207
DECLARE_JIT_PARM(UDATA*, indexAndLiteralsEA, 1);
2208
DECLARE_JIT_PARM(void*, jitEIP, 2);
2209
void *addr = NULL;
2210
retry:
2211
J9ConstantPool *ramConstantPool = ((J9ConstantPool**)indexAndLiteralsEA)[0];
2212
UDATA cpIndex = indexAndLiteralsEA[1];
2213
J9RAMInterfaceMethodRef *ramMethodRef = (J9RAMInterfaceMethodRef*)ramConstantPool + cpIndex;
2214
J9Class* const interfaceClass = (J9Class*)ramMethodRef->interfaceClass;
2215
UDATA const methodIndexAndArgCount = ramMethodRef->methodIndexAndArgCount;
2216
if (!J9RAMINTERFACEMETHODREF_RESOLVED(interfaceClass, methodIndexAndArgCount)) {
2217
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_INTERFACE_METHOD, parmCount, true, 0, jitEIP);
2218
currentThread->javaVM->internalVMFunctions->resolveInterfaceMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2219
addr = restoreJITResolveFrame(currentThread, jitEIP);
2220
if (NULL != addr) {
2221
goto done;
2222
}
2223
goto retry;
2224
} else {
2225
#if defined(OSX) && defined(AARCH64)
2226
pthread_jit_write_protect_np(0);
2227
#endif
2228
indexAndLiteralsEA[2] = (UDATA)interfaceClass;
2229
UDATA methodIndex = methodIndexAndArgCount >> J9_ITABLE_INDEX_SHIFT;
2230
UDATA iTableOffset = 0;
2231
if (J9_ARE_ANY_BITS_SET(methodIndexAndArgCount, J9_ITABLE_INDEX_METHOD_INDEX)) {
2232
/* Direct method - methodIndex is an index into the method list of either Object or interfaceClass */
2233
J9Class *methodClass = interfaceClass;
2234
if (J9_ARE_ANY_BITS_SET(methodIndexAndArgCount, J9_ITABLE_INDEX_OBJECT)) {
2235
methodClass = J9VMJAVALANGOBJECT_OR_NULL(currentThread->javaVM);
2236
}
2237
iTableOffset = ((UDATA)(methodClass->ramMethods + methodIndex)) | J9_ITABLE_OFFSET_DIRECT;
2238
} else if (J9_ARE_ANY_BITS_SET(methodIndexAndArgCount, J9_ITABLE_INDEX_OBJECT)) {
2239
/* Virtual Object method - methodIndex is the vTable offset */
2240
iTableOffset = methodIndex | J9_ITABLE_OFFSET_VIRTUAL;
2241
} else {
2242
/* Standard interface method - methodIndex is an index into the iTable */
2243
iTableOffset = (methodIndex * sizeof(UDATA)) + sizeof(J9ITable);
2244
}
2245
indexAndLiteralsEA[3] = iTableOffset;
2246
#if defined(OSX) && defined(AARCH64)
2247
pthread_jit_write_protect_np(1);
2248
#endif
2249
JIT_RETURN_UDATA(1);
2250
}
2251
done:
2252
SLOW_JIT_HELPER_EPILOGUE();
2253
return addr;
2254
}
2255
2256
void* J9FASTCALL
2257
old_slow_jitResolveSpecialMethod(J9VMThread *currentThread)
2258
{
2259
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2260
DECLARE_JIT_PARM(void*, jitEIP, 1);
2261
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 2);
2262
DECLARE_JIT_INT_PARM(cpIndex, 3);
2263
J9Method *method = NULL;
2264
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_SPECIAL_METHOD, parmCount, true, 0, jitEIP);
2265
/* If cpIndex has the J9_SPECIAL_SPLIT_TABLE_INDEX_FLAG bit set, it is an index into split table, otherwise it is an index in constant pool */
2266
if (J9_ARE_ANY_BITS_SET(cpIndex, J9_SPECIAL_SPLIT_TABLE_INDEX_FLAG)) {
2267
method = currentThread->javaVM->internalVMFunctions->resolveSpecialSplitMethodRef(currentThread, ramConstantPool, cpIndex & J9_SPLIT_TABLE_INDEX_MASK, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2268
} else {
2269
method = currentThread->javaVM->internalVMFunctions->resolveSpecialMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2270
}
2271
void *addr = restoreJITResolveFrame(currentThread, jitEIP);
2272
if (NULL == addr) {
2273
JIT_RETURN_UDATA(method);
2274
}
2275
SLOW_JIT_HELPER_EPILOGUE();
2276
return addr;
2277
}
2278
2279
void* J9FASTCALL
2280
old_slow_jitResolveStaticMethod(J9VMThread *currentThread)
2281
{
2282
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2283
DECLARE_JIT_PARM(void*, jitEIP, 1);
2284
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 2);
2285
DECLARE_JIT_INT_PARM(cpIndex, 3);
2286
UDATA method = 0;
2287
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_STATIC_METHOD, parmCount, true, 0, jitEIP);
2288
/* If cpIndex has the J9_STATIC_SPLIT_TABLE_INDEX_FLAG bit set, it is an index into split table, otherwise it is an index in constant pool */
2289
if (J9_ARE_ANY_BITS_SET(cpIndex, J9_STATIC_SPLIT_TABLE_INDEX_FLAG)) {
2290
method = (UDATA)currentThread->javaVM->internalVMFunctions->resolveStaticSplitMethodRef(currentThread, ramConstantPool, cpIndex & J9_SPLIT_TABLE_INDEX_MASK, J9_RESOLVE_FLAG_RUNTIME_RESOLVE | J9_RESOLVE_FLAG_CHECK_CLINIT);
2291
} else {
2292
method = (UDATA)currentThread->javaVM->internalVMFunctions->resolveStaticMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE | J9_RESOLVE_FLAG_CHECK_CLINIT);
2293
}
2294
if ((UDATA)-1 == method) {
2295
/* fetch result from floatTemp - stashed there in clinit case */
2296
J9RAMStaticMethodRef *fakeRef = (J9RAMStaticMethodRef*)&currentThread->floatTemp1;
2297
method = (UDATA)fakeRef->method;
2298
/* tag result as being from a clinit */
2299
method |= J9_RESOLVE_STATIC_FIELD_TAG_FROM_CLINIT;
2300
}
2301
void *addr = restoreJITResolveFrame(currentThread, jitEIP);
2302
if (NULL == addr) {
2303
JIT_RETURN_UDATA(method);
2304
}
2305
SLOW_JIT_HELPER_EPILOGUE();
2306
return addr;
2307
}
2308
2309
void* J9FASTCALL
2310
old_slow_jitResolveVirtualMethod(J9VMThread *currentThread)
2311
{
2312
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
2313
DECLARE_JIT_PARM(UDATA*, indexAndLiteralsEA, 1);
2314
DECLARE_JIT_PARM(void*, jitEIP, 2);
2315
void *addr = NULL;
2316
retry:
2317
J9ConstantPool *ramConstantPool = ((J9ConstantPool**)indexAndLiteralsEA)[0];
2318
UDATA cpIndex = indexAndLiteralsEA[1];
2319
J9RAMVirtualMethodRef *ramMethodRef = (J9RAMVirtualMethodRef*)ramConstantPool + cpIndex;
2320
UDATA vTableOffset = ramMethodRef->methodIndexAndArgCount >> 8;
2321
if (J9VTABLE_INITIAL_VIRTUAL_OFFSET == vTableOffset) {
2322
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_VIRTUAL_METHOD, parmCount, true, 0, jitEIP);
2323
currentThread->javaVM->internalVMFunctions->resolveVirtualMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE, NULL);
2324
addr = restoreJITResolveFrame(currentThread, jitEIP);
2325
if (NULL != addr) {
2326
goto done;
2327
}
2328
goto retry;
2329
}
2330
if (J9VTABLE_INVOKE_PRIVATE_OFFSET == vTableOffset) {
2331
UDATA method = ((UDATA)ramMethodRef->method) | J9_VTABLE_INDEX_DIRECT_METHOD_FLAG;
2332
JIT_RETURN_UDATA(method);
2333
goto done;
2334
}
2335
JIT_RETURN_UDATA(sizeof(J9Class) - vTableOffset);
2336
done:
2337
SLOW_JIT_HELPER_EPILOGUE();
2338
return addr;
2339
}
2340
2341
void* J9FASTCALL
2342
old_slow_jitResolveMethodType(J9VMThread *currentThread)
2343
{
2344
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2345
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2346
DECLARE_JIT_INT_PARM(cpIndex, 2);
2347
DECLARE_JIT_PARM(void*, jitEIP, 3);
2348
void *addr = NULL;
2349
retry:
2350
J9RAMMethodTypeRef *ramRef = (J9RAMMethodTypeRef*)ramConstantPool + cpIndex;
2351
j9object_t *methodTypePtr = &ramRef->type;
2352
if (NULL == *methodTypePtr) {
2353
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2354
currentThread->javaVM->internalVMFunctions->resolveMethodTypeRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2355
addr = restoreJITResolveFrame(currentThread, jitEIP);
2356
if (NULL != addr) {
2357
goto done;
2358
}
2359
goto retry;
2360
}
2361
JIT_RETURN_UDATA(methodTypePtr);
2362
done:
2363
SLOW_JIT_HELPER_EPILOGUE();
2364
return addr;
2365
}
2366
2367
void* J9FASTCALL
2368
old_slow_jitResolveMethodHandle(J9VMThread *currentThread)
2369
{
2370
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2371
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2372
DECLARE_JIT_INT_PARM(cpIndex, 2);
2373
DECLARE_JIT_PARM(void*, jitEIP, 3);
2374
void *addr = NULL;
2375
retry:
2376
J9RAMMethodHandleRef *ramRef = (J9RAMMethodHandleRef*)ramConstantPool + cpIndex;
2377
j9object_t *methodHandlePtr = &ramRef->methodHandle;
2378
if (NULL == *methodHandlePtr) {
2379
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2380
currentThread->javaVM->internalVMFunctions->resolveMethodHandleRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2381
addr = restoreJITResolveFrame(currentThread, jitEIP);
2382
if (NULL != addr) {
2383
goto done;
2384
}
2385
goto retry;
2386
}
2387
JIT_RETURN_UDATA(methodHandlePtr);
2388
done:
2389
SLOW_JIT_HELPER_EPILOGUE();
2390
return addr;
2391
}
2392
2393
void* J9FASTCALL
2394
old_slow_jitResolveInvokeDynamic(J9VMThread *currentThread)
2395
{
2396
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2397
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2398
DECLARE_JIT_INT_PARM(index, 2);
2399
DECLARE_JIT_PARM(void*, jitEIP, 3);
2400
void *addr = NULL;
2401
retry:
2402
J9Class *methodClass = ramConstantPool->ramClass;
2403
j9object_t *callsitePtr = methodClass->callSites + index;
2404
if (NULL == *callsitePtr) {
2405
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2406
currentThread->javaVM->internalVMFunctions->resolveInvokeDynamic(currentThread, ramConstantPool, index, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2407
addr = restoreJITResolveFrame(currentThread, jitEIP);
2408
if (NULL != addr) {
2409
goto done;
2410
}
2411
goto retry;
2412
}
2413
JIT_RETURN_UDATA(callsitePtr);
2414
done:
2415
SLOW_JIT_HELPER_EPILOGUE();
2416
return addr;
2417
}
2418
2419
void* J9FASTCALL
2420
old_slow_jitResolveConstantDynamic(J9VMThread *currentThread)
2421
{
2422
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2423
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2424
DECLARE_JIT_INT_PARM(cpIndex, 2);
2425
DECLARE_JIT_PARM(void*, jitEIP, 3);
2426
void *addr = NULL;
2427
J9JavaVM *vm = currentThread->javaVM;
2428
retry:
2429
J9RAMConstantDynamicRef *ramCPEntry = (J9RAMConstantDynamicRef*)ramConstantPool + cpIndex;
2430
j9object_t *constantDynamicValue = &ramCPEntry->value;
2431
2432
/* Check if the value is resolved, Void.Class exception represents a valid null reference */
2433
if ((NULL == *constantDynamicValue) && (ramCPEntry->exception != vm->voidReflectClass->classObject)) {
2434
/* If entry resolved to an exception previously, same exception will be set by resolution code */
2435
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2436
vm->internalVMFunctions->resolveConstantDynamic(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2437
addr = restoreJITResolveFrame(currentThread, jitEIP);
2438
if (NULL != addr) {
2439
goto done;
2440
}
2441
goto retry;
2442
}
2443
JIT_RETURN_UDATA(constantDynamicValue);
2444
done:
2445
SLOW_JIT_HELPER_EPILOGUE();
2446
return addr;
2447
}
2448
2449
void* J9FASTCALL
2450
old_slow_jitResolveHandleMethod(J9VMThread *currentThread)
2451
{
2452
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2453
DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);
2454
DECLARE_JIT_INT_PARM(cpIndex, 2);
2455
DECLARE_JIT_PARM(void*, jitEIP, 3);
2456
void *addr = NULL;
2457
J9JavaVM *vm = currentThread->javaVM;
2458
2459
#if defined(J9VM_OPT_OPENJDK_METHODHANDLE)
2460
J9RAMMethodRef *ramMethodRef = ((J9RAMMethodRef*)ramConstantPool) + cpIndex;
2461
UDATA invokeCacheIndex = ramMethodRef->methodIndexAndArgCount >> 8;
2462
retry:
2463
j9object_t *invokeCacheArray = &((J9_CLASS_FROM_CP(ramConstantPool)->invokeCache)[invokeCacheIndex]);
2464
if (NULL == *invokeCacheArray) {
2465
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2466
/* add new resolve code which calls sendResolveInvokeHandle -> MHN.linkMethod()
2467
* store the memberName/appendix values in invokeCache[invokeCacheIndex]
2468
*/
2469
vm->internalVMFunctions->resolveOpenJDKInvokeHandle(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2470
addr = restoreJITResolveFrame(currentThread, jitEIP);
2471
if (NULL != addr) {
2472
goto done;
2473
}
2474
goto retry;
2475
}
2476
JIT_RETURN_UDATA(invokeCacheArray);
2477
#else /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
2478
j9object_t *methodTypePtr = NULL;
2479
j9object_t *methodTypeTablePtr = NULL;
2480
UDATA methodTypeIndex = 0;
2481
J9Class *methodClass = ramConstantPool->ramClass;
2482
J9ROMConstantPoolItem *romConstantPool = ramConstantPool->romConstantPool;
2483
J9ROMMethodRef *romMethodRef = (J9ROMMethodRef *)&(ramConstantPool->romConstantPool[cpIndex]);
2484
U_32 classRefCPIndex = romMethodRef->classRefCPIndex;
2485
J9RAMClassRef *ramClassRef = ((J9RAMClassRef *)ramConstantPool) + classRefCPIndex;
2486
J9Class *targetClass = ramClassRef->value;
2487
2488
/* Ensure that the call site class ref is resolved */
2489
if (NULL == targetClass) {
2490
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2491
targetClass = vm->internalVMFunctions->resolveClassRef(currentThread, ramConstantPool, classRefCPIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);
2492
addr = restoreJITResolveFrame(currentThread, jitEIP);
2493
if (NULL != addr) {
2494
goto done;
2495
}
2496
}
2497
2498
if (J9VMJAVALANGINVOKEMETHODHANDLE_OR_NULL(vm) == targetClass) {
2499
/* MethodHandle */
2500
J9RAMMethodRef *ramRef = (J9RAMMethodRef *)&(ramConstantPool[cpIndex]);
2501
methodTypeIndex = ramRef->methodIndexAndArgCount >> 8;
2502
methodTypeTablePtr = methodClass->methodTypes;
2503
} else {
2504
/* VarHandle */
2505
J9ROMClass *romClass = methodClass->romClass;
2506
methodTypeIndex = VM_VMHelpers::lookupVarHandleMethodTypeCacheIndex(romClass, cpIndex);
2507
methodTypeTablePtr = methodClass->varHandleMethodTypes;
2508
}
2509
2510
retry:
2511
methodTypePtr = &(methodTypeTablePtr[methodTypeIndex]);
2512
2513
if (NULL == *methodTypePtr) {
2514
/* Resolve the call site if unresolved */
2515
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);
2516
vm->internalVMFunctions->resolveVirtualMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE, NULL);
2517
addr = restoreJITResolveFrame(currentThread, jitEIP);
2518
if (NULL != addr) {
2519
goto done;
2520
}
2521
goto retry;
2522
}
2523
2524
JIT_RETURN_UDATA(methodTypePtr);
2525
#endif /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
2526
done:
2527
SLOW_JIT_HELPER_EPILOGUE();
2528
return addr;
2529
}
2530
2531
void* J9FASTCALL
2532
old_slow_jitResolveFlattenableField(J9VMThread *currentThread)
2533
{
2534
void *addr = NULL;
2535
2536
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
2537
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2538
DECLARE_JIT_PARM(J9Method*, method, 1);
2539
DECLARE_JIT_INT_PARM(cpIndex, 2);
2540
DECLARE_JIT_INT_PARM(resolveType, 3);
2541
J9ConstantPool * const ramConstantPool = J9_CP_FROM_METHOD(method);
2542
J9RAMFieldRef * const ramFieldRef = ((J9RAMFieldRef *)ramConstantPool) + cpIndex;
2543
UDATA const flags = ramFieldRef->flags;
2544
UDATA const valueOffset = ramFieldRef->valueOffset;
2545
bool resolved = VM_VMHelpers::instanceFieldRefIsResolved(flags, valueOffset);
2546
if (resolved && (J9TR_FLAT_RESOLVE_PUTFIELD == resolveType)) {
2547
resolved = VM_VMHelpers::resolvedInstanceFieldRefIsPutResolved(flags, method, ramConstantPool);
2548
}
2549
if (!resolved) {
2550
UDATA resolveFlags = J9_RESOLVE_FLAG_RUNTIME_RESOLVE;
2551
switch(resolveType) {
2552
case J9TR_FLAT_RESOLVE_WITHFIELD:
2553
resolveFlags |= J9_RESOLVE_FLAG_WITH_FIELD;
2554
break;
2555
case J9TR_FLAT_RESOLVE_GETFIELD:
2556
break;
2557
case J9TR_FLAT_RESOLVE_PUTFIELD:
2558
resolveFlags |= J9_RESOLVE_FLAG_FIELD_SETTER;
2559
break;
2560
default:
2561
Assert_CodertVM_unreachable();
2562
break;
2563
}
2564
void *oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
2565
currentThread->javaVM->internalVMFunctions->resolveInstanceFieldRef(currentThread, method, ramConstantPool, cpIndex, resolveFlags, NULL);
2566
addr = restoreJITResolveFrame(currentThread, oldPC);
2567
}
2568
SLOW_JIT_HELPER_EPILOGUE();
2569
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
2570
2571
return addr;
2572
}
2573
2574
void* J9FASTCALL
2575
old_slow_jitRetranslateCaller(J9VMThread *currentThread)
2576
{
2577
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
2578
DECLARE_JIT_PARM(J9Method*, method, 1);
2579
DECLARE_JIT_PARM(void*, oldJITStartAddr, 2);
2580
J9JavaVM *vm = currentThread->javaVM;
2581
J9JITConfig *jitConfig = vm->jitConfig;
2582
void *oldPC = currentThread->jitReturnAddress;
2583
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_RUNTIME_HELPER, parmCount, false, 0, oldPC);
2584
UDATA oldState = currentThread->omrVMThread->vmState;
2585
currentThread->omrVMThread->vmState = J9VMSTATE_JIT;
2586
UDATA jitStartPC = jitConfig->entryPoint(jitConfig, currentThread, method, oldJITStartAddr);
2587
currentThread->omrVMThread->vmState = oldState;
2588
void *addr = restoreJITResolveFrame(currentThread, oldPC, true, false);
2589
if (NULL == addr) {
2590
JIT_RETURN_UDATA(jitStartPC);
2591
}
2592
SLOW_JIT_HELPER_EPILOGUE();
2593
return addr;
2594
}
2595
2596
void* J9FASTCALL
2597
old_slow_jitRetranslateCallerWithPreparation(J9VMThread *currentThread)
2598
{
2599
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2600
DECLARE_JIT_PARM(J9Method*, method, 1);
2601
DECLARE_JIT_PARM(void*, oldJITStartAddr, 2);
2602
DECLARE_JIT_PARM(UDATA, reason, 3);
2603
J9JavaVM *vm = currentThread->javaVM;
2604
J9JITConfig *jitConfig = vm->jitConfig;
2605
void *oldPC = currentThread->jitReturnAddress;
2606
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_RUNTIME_HELPER, parmCount, false, 0, oldPC);
2607
UDATA oldState = currentThread->omrVMThread->vmState;
2608
currentThread->omrVMThread->vmState = J9VMSTATE_JIT;
2609
UDATA jitStartPC = jitConfig->retranslateWithPreparation(jitConfig, currentThread, method, oldJITStartAddr, reason);
2610
currentThread->omrVMThread->vmState = oldState;
2611
void *addr = restoreJITResolveFrame(currentThread, oldPC, true, false);
2612
if (NULL == addr) {
2613
JIT_RETURN_UDATA(jitStartPC);
2614
}
2615
SLOW_JIT_HELPER_EPILOGUE();
2616
return addr;
2617
}
2618
2619
J9_EXTERN_BUILDER_SYMBOL(jitDecompileAtCurrentPC);
2620
2621
void* J9FASTCALL
2622
old_slow_jitRetranslateMethod(J9VMThread *currentThread)
2623
{
2624
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
2625
DECLARE_JIT_PARM(J9Method*, method, 1);
2626
DECLARE_JIT_PARM(void*, oldJITStartAddr, 2);
2627
DECLARE_JIT_PARM(void*, jitEIP, 3);
2628
J9JavaVM *vm = currentThread->javaVM;
2629
J9JITConfig *jitConfig = vm->jitConfig;
2630
UDATA jitStartPC = 0;
2631
2632
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_RECOMPILATION, parmCount, true, 0, jitEIP);
2633
2634
/* The return address of the recompiled method is either:
2635
* No special handling required
2636
* - a jitted caller
2637
* - the interpreter (something in the return table)
2638
* Special handling required
2639
* - a decompile point
2640
*/
2641
bool callerAlreadyBeingDecompiled = false;
2642
if (NULL == jitGetExceptionTableFromPC(currentThread, (UDATA)jitEIP)) {
2643
U_8 **returnTable = (U_8**)jitConfig->i2jReturnTable;
2644
callerAlreadyBeingDecompiled = true;
2645
for (UDATA i = 0; i < J9SW_JIT_RETURN_TABLE_SIZE; ++i) {
2646
if (jitEIP == returnTable[i]) {
2647
callerAlreadyBeingDecompiled = false;
2648
break;
2649
}
2650
}
2651
}
2652
if (callerAlreadyBeingDecompiled) {
2653
/* The caller is already being decompiled. The only way this can occur is if:
2654
*
2655
* - the caller is jitted
2656
* - caller invokes a non-compiled method
2657
* - interpreter submits target for compilation
2658
* - during compilation, a decomp is added for the caller
2659
* - target is successfully compiled
2660
* - decomp record is updated such that the savedPCAddres points to where the jitted method would save the RA
2661
* - interp transitions to the newly-compiled method with the return address pointing to a decompilation
2662
*
2663
* The decompilation assumes that the target method would run (so it's jitDecompileOnReturn*).
2664
* This is incorrect at this point, since we won't run the target method, so change the decompile to
2665
* jitDecompileAtCurrentPC (to re-run the invoke after decomp), and change the savedPCAddress in the decomp
2666
* record to point to the returnAddress field of the recently pushed resolve frame to keep the stack walker happy.
2667
*/
2668
J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;
2669
U_8 **savedPCAddress = (U_8**)&resolveFrame->returnAddress;
2670
*savedPCAddress = (U_8*)J9_BUILDER_SYMBOL(jitDecompileAtCurrentPC);
2671
currentThread->decompilationStack->pcAddress = savedPCAddress;
2672
} else {
2673
UDATA oldState = currentThread->omrVMThread->vmState;
2674
currentThread->omrVMThread->vmState = J9VMSTATE_JIT;
2675
jitStartPC = jitConfig->entryPoint(jitConfig, currentThread, method, oldJITStartAddr);
2676
currentThread->omrVMThread->vmState = oldState;
2677
}
2678
void *addr = restoreJITResolveFrame(currentThread, jitEIP, true, false);
2679
if (NULL == addr) {
2680
JIT_RETURN_UDATA(jitStartPC);
2681
}
2682
SLOW_JIT_HELPER_EPILOGUE();
2683
return addr;
2684
}
2685
2686
void* J9FASTCALL
2687
old_slow_jitThrowCurrentException(J9VMThread *currentThread)
2688
{
2689
OLD_JIT_HELPER_PROLOGUE(0);
2690
buildJITResolveFrameForRuntimeCheck(currentThread);
2691
return J9_JITHELPER_ACTION_THROW;
2692
}
2693
2694
void* J9FASTCALL
2695
old_slow_jitThrowException(J9VMThread *currentThread)
2696
{
2697
OLD_JIT_HELPER_PROLOGUE(1);
2698
DECLARE_JIT_PARM(j9object_t, exception, 1);
2699
VM_VMHelpers::setExceptionPending(currentThread, exception);
2700
buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);
2701
return J9_JITHELPER_ACTION_THROW;
2702
}
2703
2704
void* J9FASTCALL
2705
old_slow_jitThrowUnreportedException(J9VMThread *currentThread)
2706
{
2707
OLD_JIT_HELPER_PROLOGUE(1);
2708
DECLARE_JIT_PARM(j9object_t, exception, 1);
2709
buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);
2710
fixStackForSyntheticHandler(currentThread);
2711
VM_VMHelpers::setExceptionPending(currentThread, exception, false);
2712
return J9_JITHELPER_ACTION_THROW;
2713
}
2714
2715
void* J9FASTCALL
2716
old_slow_jitThrowAbstractMethodError(J9VMThread *currentThread)
2717
{
2718
OLD_JIT_HELPER_PROLOGUE(0);
2719
buildJITResolveFrameForRuntimeCheck(currentThread);
2720
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGABSTRACTMETHODERROR, NULL);
2721
}
2722
2723
void* J9FASTCALL
2724
old_slow_jitThrowArithmeticException(J9VMThread *currentThread)
2725
{
2726
OLD_JIT_HELPER_PROLOGUE(0);
2727
buildJITResolveFrameForRuntimeCheck(currentThread);
2728
return setCurrentExceptionNLSFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARITHMETICEXCEPTION, J9NLS_VM_DIVIDE_BY_ZERO);
2729
}
2730
2731
void* J9FASTCALL
2732
old_slow_jitThrowArrayIndexOutOfBounds(J9VMThread *currentThread)
2733
{
2734
OLD_JIT_HELPER_PROLOGUE(0);
2735
buildJITResolveFrameForRuntimeCheck(currentThread);
2736
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);
2737
}
2738
2739
void* J9FASTCALL
2740
impl_jitReferenceArrayCopy(J9VMThread *currentThread, UDATA lengthInBytes)
2741
{
2742
JIT_HELPER_PROLOGUE();
2743
void* exception = NULL;
2744
if (-1 != currentThread->javaVM->memoryManagerFunctions->referenceArrayCopy(
2745
currentThread,
2746
(J9IndexableObject*)currentThread->floatTemp1,
2747
(J9IndexableObject*)currentThread->floatTemp2,
2748
(fj9object_t*)currentThread->floatTemp3,
2749
(fj9object_t*)currentThread->floatTemp4,
2750
(I_32)(lengthInBytes / J9VMTHREAD_REFERENCE_SIZE(currentThread))
2751
)) {
2752
exception = (void*)-1;
2753
}
2754
return exception;
2755
}
2756
2757
void* J9FASTCALL
2758
old_slow_jitThrowArrayStoreException(J9VMThread *currentThread)
2759
{
2760
OLD_JIT_HELPER_PROLOGUE(0);
2761
buildJITResolveFrameForRuntimeCheck(currentThread);
2762
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
2763
}
2764
2765
void* J9FASTCALL
2766
old_slow_jitThrowArrayStoreExceptionWithIP(J9VMThread *currentThread)
2767
{
2768
OLD_JIT_HELPER_PROLOGUE(1);
2769
DECLARE_JIT_PARM(void*, jitEIP, 1);
2770
buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE, parmCount, true, 0, jitEIP);
2771
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
2772
}
2773
2774
void* J9FASTCALL
2775
old_slow_jitThrowExceptionInInitializerError(J9VMThread *currentThread)
2776
{
2777
OLD_JIT_HELPER_PROLOGUE(0);
2778
buildJITResolveFrameForRuntimeCheck(currentThread);
2779
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGEXCEPTIONININITIALIZERERROR, NULL);
2780
}
2781
2782
void* J9FASTCALL
2783
old_slow_jitThrowIllegalAccessError(J9VMThread *currentThread)
2784
{
2785
OLD_JIT_HELPER_PROLOGUE(0);
2786
buildJITResolveFrameForRuntimeCheck(currentThread);
2787
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALACCESSERROR, NULL);
2788
}
2789
2790
void* J9FASTCALL
2791
old_slow_jitThrowIncompatibleClassChangeError(J9VMThread *currentThread)
2792
{
2793
OLD_JIT_HELPER_PROLOGUE(0);
2794
buildJITResolveFrameForRuntimeCheck(currentThread);
2795
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINCOMPATIBLECLASSCHANGEERROR, NULL);
2796
}
2797
2798
void* J9FASTCALL
2799
old_slow_jitThrowInstantiationException(J9VMThread *currentThread)
2800
{
2801
OLD_JIT_HELPER_PROLOGUE(0);
2802
buildJITResolveFrameForRuntimeCheck(currentThread);
2803
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINSTANTIATIONEXCEPTION, NULL);
2804
}
2805
2806
void* J9FASTCALL
2807
old_slow_jitThrowNullPointerException(J9VMThread *currentThread)
2808
{
2809
OLD_JIT_HELPER_PROLOGUE(0);
2810
buildJITResolveFrameForRuntimeCheck(currentThread);
2811
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
2812
}
2813
2814
void* J9FASTCALL
2815
old_slow_jitThrowWrongMethodTypeException(J9VMThread *currentThread)
2816
{
2817
OLD_JIT_HELPER_PROLOGUE(0);
2818
buildJITResolveFrameForRuntimeCheck(currentThread);
2819
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINVOKEWRONGMETHODTYPEEXCEPTION, NULL);
2820
}
2821
2822
void* J9FASTCALL
2823
old_slow_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread)
2824
{
2825
SLOW_JIT_HELPER_PROLOGUE();
2826
buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
2827
return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);
2828
}
2829
2830
static VMINLINE bool
2831
fast_jitTypeCheckArrayStoreImpl(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)
2832
{
2833
bool slowPathRequired = false;
2834
if ((NULL != destinationObject) && (NULL != objectBeingStored)) {
2835
J9Class *objectClass = J9OBJECT_CLAZZ(currentThread, objectBeingStored);
2836
J9Class *componentType = ((J9ArrayClass*)J9OBJECT_CLAZZ(currentThread, destinationObject))->componentType;
2837
/* Quick check -- is this a store of a C into a C[]? */
2838
if (objectClass != componentType) {
2839
/* Quick check -- is this a store of a C into a java.lang.Object[]? */
2840
if (0 != VM_VMHelpers::getClassDepth(componentType)) {
2841
if (!VM_VMHelpers::inlineCheckCast(objectClass, componentType)) {
2842
slowPathRequired = true;
2843
}
2844
}
2845
}
2846
}
2847
return slowPathRequired;
2848
}
2849
2850
void* J9FASTCALL
2851
old_fast_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread)
2852
{
2853
void *slowPath = NULL;
2854
OLD_JIT_HELPER_PROLOGUE(2);
2855
DECLARE_JIT_PARM(j9object_t, destinationObject, 1);
2856
DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);
2857
if (fast_jitTypeCheckArrayStoreImpl(currentThread, destinationObject, objectBeingStored)) {
2858
slowPath = (void*)old_slow_jitTypeCheckArrayStoreWithNullCheck;
2859
}
2860
return slowPath;
2861
}
2862
2863
void J9FASTCALL
2864
old_fast_jitAcmpeqHelper(J9VMThread *currentThread)
2865
{
2866
OLD_JIT_HELPER_PROLOGUE(2);
2867
DECLARE_JIT_PARM(j9object_t, lhs, 1);
2868
DECLARE_JIT_PARM(j9object_t, rhs, 2);
2869
2870
JIT_RETURN_UDATA(currentThread->javaVM->internalVMFunctions->valueTypeCapableAcmp(currentThread, lhs, rhs));
2871
}
2872
2873
void J9FASTCALL
2874
old_fast_jitAcmpneHelper(J9VMThread *currentThread)
2875
{
2876
OLD_JIT_HELPER_PROLOGUE(2);
2877
DECLARE_JIT_PARM(j9object_t, lhs, 1);
2878
DECLARE_JIT_PARM(j9object_t, rhs, 2);
2879
2880
JIT_RETURN_UDATA(!currentThread->javaVM->internalVMFunctions->valueTypeCapableAcmp(currentThread, lhs, rhs));
2881
}
2882
2883
void* J9FASTCALL
2884
old_fast_jitTypeCheckArrayStore(J9VMThread *currentThread)
2885
{
2886
/* Not omitting NULL check */
2887
return old_fast_jitTypeCheckArrayStoreWithNullCheck(currentThread);
2888
}
2889
2890
void* J9FASTCALL
2891
old_slow_jitTypeCheckArrayStore(J9VMThread *currentThread)
2892
{
2893
return old_slow_jitTypeCheckArrayStoreWithNullCheck(currentThread);
2894
}
2895
2896
void J9FASTCALL
2897
fast_jitWriteBarrierBatchStore(J9VMThread *currentThread, j9object_t destinationObject)
2898
{
2899
currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierBatch(currentThread, destinationObject);
2900
}
2901
2902
void J9FASTCALL
2903
old_fast_jitWriteBarrierBatchStore(J9VMThread *currentThread)
2904
{
2905
OLD_JIT_HELPER_PROLOGUE(1);
2906
DECLARE_JIT_PARM(j9object_t, destinationObject, 1);
2907
fast_jitWriteBarrierBatchStore(currentThread, destinationObject);
2908
}
2909
2910
void J9FASTCALL
2911
fast_jitWriteBarrierBatchStoreWithRange(J9VMThread *currentThread, j9object_t destinationObject, UDATA destinationPtr, UDATA range)
2912
{
2913
currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierBatch(currentThread, destinationObject);
2914
}
2915
2916
void J9FASTCALL
2917
old_fast_jitWriteBarrierBatchStoreWithRange(J9VMThread *currentThread)
2918
{
2919
OLD_JIT_HELPER_PROLOGUE(3);
2920
DECLARE_JIT_PARM(j9object_t, destinationObject, 1);
2921
DECLARE_JIT_PARM(UDATA, destinationPtr, 2);
2922
DECLARE_JIT_PARM(UDATA, range, 3);
2923
fast_jitWriteBarrierBatchStoreWithRange(currentThread, destinationObject, destinationPtr, range);
2924
}
2925
2926
void J9FASTCALL
2927
fast_jitWriteBarrierJ9ClassBatchStore(J9VMThread *currentThread, J9Class *destinationClass)
2928
{
2929
currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierClassBatch(currentThread, destinationClass);
2930
}
2931
2932
void J9FASTCALL
2933
old_fast_jitWriteBarrierJ9ClassBatchStore(J9VMThread *currentThread)
2934
{
2935
OLD_JIT_HELPER_PROLOGUE(1);
2936
DECLARE_JIT_CLASS_PARM(destinationClass, 1);
2937
fast_jitWriteBarrierJ9ClassBatchStore(currentThread, destinationClass);
2938
}
2939
2940
void J9FASTCALL
2941
fast_jitWriteBarrierJ9ClassStore(J9VMThread *currentThread, J9Class *destinationClass, j9object_t objectBeingStored)
2942
{
2943
currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierPostClass(currentThread, destinationClass, objectBeingStored);
2944
}
2945
2946
void J9FASTCALL
2947
old_fast_jitWriteBarrierJ9ClassStore(J9VMThread *currentThread)
2948
{
2949
OLD_JIT_HELPER_PROLOGUE(2);
2950
DECLARE_JIT_CLASS_PARM(destinationClass, 1);
2951
DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);
2952
fast_jitWriteBarrierJ9ClassStore(currentThread, destinationClass, objectBeingStored);
2953
}
2954
2955
void J9FASTCALL
2956
fast_jitWriteBarrierStore(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)
2957
{
2958
currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierPost(currentThread, destinationObject, objectBeingStored);
2959
}
2960
2961
void J9FASTCALL
2962
old_fast_jitWriteBarrierStore(J9VMThread *currentThread)
2963
{
2964
OLD_JIT_HELPER_PROLOGUE(2);
2965
DECLARE_JIT_PARM(j9object_t, destinationObject, 1);
2966
DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);
2967
fast_jitWriteBarrierStore(currentThread, destinationObject, objectBeingStored);
2968
}
2969
2970
void J9FASTCALL
2971
fast_jitWriteBarrierStoreGenerational(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)
2972
{
2973
MM_ObjectAccessBarrierAPI::internalPostObjectStoreGenerationalNoValueCheck(currentThread, destinationObject);
2974
}
2975
2976
void J9FASTCALL
2977
old_fast_jitWriteBarrierStoreGenerational(J9VMThread *currentThread)
2978
{
2979
OLD_JIT_HELPER_PROLOGUE(2);
2980
DECLARE_JIT_PARM(j9object_t, destinationObject, 1);
2981
DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);
2982
fast_jitWriteBarrierStoreGenerational(currentThread, destinationObject, objectBeingStored);
2983
}
2984
2985
void J9FASTCALL
2986
fast_jitWriteBarrierStoreGenerationalAndConcurrentMark(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)
2987
{
2988
MM_ObjectAccessBarrierAPI::internalPostObjectStoreCardTableAndGenerational(currentThread, destinationObject, objectBeingStored);
2989
}
2990
2991
void J9FASTCALL
2992
old_fast_jitWriteBarrierStoreGenerationalAndConcurrentMark(J9VMThread *currentThread)
2993
{
2994
OLD_JIT_HELPER_PROLOGUE(2);
2995
DECLARE_JIT_PARM(j9object_t, destinationObject, 1);
2996
DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);
2997
fast_jitWriteBarrierStoreGenerationalAndConcurrentMark(currentThread, destinationObject, objectBeingStored);
2998
}
2999
3000
void J9FASTCALL
3001
fast_jitWriteBarrierClassStoreMetronome(J9VMThread *currentThread, j9object_t destinationClassObject, J9Object** destinationAddress, j9object_t objectBeingStored)
3002
{
3003
currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierPreClass(currentThread, destinationClassObject, destinationAddress, objectBeingStored);
3004
}
3005
3006
void J9FASTCALL
3007
old_fast_jitWriteBarrierClassStoreMetronome(J9VMThread *currentThread)
3008
{
3009
OLD_JIT_HELPER_PROLOGUE(3);
3010
DECLARE_JIT_PARM(j9object_t, destinationClassObject, 1);
3011
DECLARE_JIT_PARM(J9Object**, destinationAddress, 2);
3012
DECLARE_JIT_PARM(j9object_t, objectBeingStored, 3);
3013
fast_jitWriteBarrierClassStoreMetronome(currentThread, destinationClassObject, destinationAddress, objectBeingStored);
3014
}
3015
3016
void J9FASTCALL
3017
fast_jitWriteBarrierStoreMetronome(J9VMThread *currentThread, j9object_t destinationObject, fj9object_t* destinationAddress, j9object_t objectBeingStored)
3018
{
3019
currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierPre(currentThread, destinationObject, destinationAddress, objectBeingStored);
3020
}
3021
3022
void J9FASTCALL
3023
old_fast_jitWriteBarrierStoreMetronome(J9VMThread *currentThread)
3024
{
3025
OLD_JIT_HELPER_PROLOGUE(3);
3026
DECLARE_JIT_PARM(j9object_t, destinationObject, 1);
3027
DECLARE_JIT_PARM(fj9object_t*, destinationAddress, 2);
3028
DECLARE_JIT_PARM(j9object_t, objectBeingStored, 3);
3029
fast_jitWriteBarrierStoreMetronome(currentThread, destinationObject, destinationAddress, objectBeingStored);
3030
}
3031
3032
void J9FASTCALL
3033
old_slow_jitCallJitAddPicToPatchOnClassUnload(J9VMThread *currentThread)
3034
{
3035
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
3036
DECLARE_JIT_PARM(void*, classPointer, 1);
3037
DECLARE_JIT_PARM(void*, addressToBePatched, 2);
3038
jitAddPicToPatchOnClassUnload(classPointer, addressToBePatched);
3039
SLOW_JIT_HELPER_EPILOGUE();
3040
}
3041
3042
typedef void (*twoVoidFunc)(void*, void*);
3043
3044
void J9FASTCALL
3045
old_slow_jitCallCFunction(J9VMThread *currentThread)
3046
{
3047
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
3048
DECLARE_JIT_PARM(twoVoidFunc, functionPointer, 1);
3049
DECLARE_JIT_PARM(void*, argumentPointer, 2);
3050
DECLARE_JIT_PARM(void*, returnValuePointer, 3);
3051
functionPointer(argumentPointer, returnValuePointer);
3052
SLOW_JIT_HELPER_EPILOGUE();
3053
}
3054
3055
void
3056
fast_jitPreJNICallOffloadCheck(J9VMThread *currentThread)
3057
{
3058
#if defined(J9VM_OPT_JAVA_OFFLOAD_SUPPORT)
3059
OLD_JIT_HELPER_PROLOGUE(0);
3060
#if defined(J9VM_PORT_ZOS_CEEHDLRSUPPORT)
3061
J9JavaVM *vm = currentThread->javaVM;
3062
if (J9_ARE_ANY_BITS_SET(vm->sigFlags, J9_SIG_ZOS_CEEHDLR)) {
3063
J9VMEntryLocalStorage *els = currentThread->entryLocalStorage;
3064
/* Save the old vmstate then set it to 'J9VMSTATE_JNI_FROM_JIT' and store the FPRs 8-15 */
3065
els->calloutVMState = setVMState(currentThread, J9VMSTATE_JNI_FROM_JIT);
3066
}
3067
#endif /* J9VM_PORT_ZOS_CEEHDLRSUPPORT */
3068
VM_VMHelpers::beforeJNICall(currentThread);
3069
#endif /* J9VM_OPT_JAVA_OFFLOAD_SUPPORT */
3070
}
3071
3072
void
3073
fast_jitPostJNICallOffloadCheck(J9VMThread *currentThread)
3074
{
3075
#if defined(J9VM_OPT_JAVA_OFFLOAD_SUPPORT)
3076
OLD_JIT_HELPER_PROLOGUE(0);
3077
#if defined(J9VM_PORT_ZOS_CEEHDLRSUPPORT)
3078
J9JavaVM *vm = currentThread->javaVM;
3079
J9VMEntryLocalStorage *els = currentThread->entryLocalStorage;
3080
if (J9_ARE_ANY_BITS_SET(vm->sigFlags, J9_SIG_ZOS_CEEHDLR)) {
3081
setVMState(currentThread, els->calloutVMState);
3082
/* verify that the native didn't resume execution after an LE condition and illegally return to Java */
3083
if (J9_ARE_ANY_BITS_SET(currentThread->privateFlags, J9_PRIVATE_FLAGS_STACKS_OUT_OF_SYNC)) {
3084
vm->internalVMFunctions->javaAndCStacksMustBeInSync(currentThread, TRUE);
3085
}
3086
}
3087
#endif /* J9VM_PORT_ZOS_CEEHDLRSUPPORT */
3088
VM_VMHelpers::afterJNICall(currentThread);
3089
#endif /* J9VM_OPT_JAVA_OFFLOAD_SUPPORT */
3090
}
3091
3092
void J9FASTCALL
3093
old_fast_jitObjectHashCode(J9VMThread *currentThread)
3094
{
3095
OLD_JIT_HELPER_PROLOGUE(1);
3096
DECLARE_JIT_PARM(j9object_t, object, 1);
3097
J9JavaVM *vm = currentThread->javaVM;
3098
JIT_RETURN_UDATA((IDATA)vm->memoryManagerFunctions->j9gc_objaccess_getObjectHashCode(vm, (J9Object*)object));
3099
}
3100
3101
static VMINLINE void*
3102
old_slow_jitInduceOSRAtCurrentPCImpl(J9VMThread *currentThread, void *oldPC)
3103
{
3104
induceOSROnCurrentThread(currentThread);
3105
/* If the OSR was successful, a decompilation will have been added to the resolve frame */
3106
J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;
3107
void *newPC = resolveFrame->returnAddress;
3108
if (samePCs(oldPC, newPC)) {
3109
/* If execution reaches this point (no decompilation added), then there was an out of memory error */
3110
newPC = setNativeOutOfMemoryErrorFromJIT(currentThread, 0, 0);
3111
} else {
3112
newPC = JIT_RUN_ON_JAVA_STACK(newPC);
3113
}
3114
return newPC;
3115
}
3116
3117
void* J9FASTCALL
3118
old_slow_jitInduceOSRAtCurrentPCAndRecompile(J9VMThread *currentThread)
3119
{
3120
OLD_JIT_HELPER_PROLOGUE(0);
3121
void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE_INDUCE_OSR, parmCount);
3122
3123
J9StackWalkState walkState;
3124
/* The stack currently has a resolve frame on top, followed by the JIT frame we
3125
* wish to OSR. Walk the stack down to the JIT frame to gather the data required
3126
* for decompilation.
3127
*/
3128
J9JavaVM *vm = currentThread->javaVM;
3129
J9JITConfig *jitConfig = vm->jitConfig;
3130
walkState.walkThread = currentThread;
3131
walkState.maxFrames = 2;
3132
walkState.flags = J9_STACKWALK_SKIP_INLINES | J9_STACKWALK_COUNT_SPECIFIED;
3133
vm->walkStackFrames(currentThread, &walkState);
3134
J9Method *method = walkState.method;
3135
J9JITExceptionTable *metaData = walkState.jitInfo;
3136
void *oldJITStartAddr = (void *) metaData->startPC;
3137
jitConfig->retranslateWithPreparationForMethodRedefinition(jitConfig, currentThread, method, oldJITStartAddr);
3138
3139
return old_slow_jitInduceOSRAtCurrentPCImpl(currentThread, oldPC);
3140
}
3141
3142
void* J9FASTCALL
3143
old_slow_jitInduceOSRAtCurrentPC(J9VMThread *currentThread)
3144
{
3145
OLD_JIT_HELPER_PROLOGUE(0);
3146
void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE_INDUCE_OSR, parmCount);
3147
return old_slow_jitInduceOSRAtCurrentPCImpl(currentThread, oldPC);
3148
}
3149
3150
void J9FASTCALL
3151
old_slow_jitInterpretNewInstanceMethod(J9VMThread *currentThread)
3152
{
3153
/* JIT has passed two parameters, but only the first one matters to this call.
3154
* The parmCount has to be 1 in order for JIT_PARM_IN_MEMORY to function correctly
3155
* in the register case.
3156
*/
3157
OLD_JIT_HELPER_PROLOGUE(1);
3158
J9JavaVM *vm = currentThread->javaVM;
3159
#if defined(J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP)
3160
/* Arguments are on stack in invoke order:
3161
*
3162
* sp[0] = callerClass
3163
* sp[1] = objectClass
3164
*
3165
* Going to the interpreter, we need to discard callerClass in order to run the static method
3166
* J9VMInternals.newInstanceImpl(Class objectClass), so the stack needs to look like:
3167
*
3168
* sp[0] = objectClass
3169
*/
3170
currentThread->sp += 1;
3171
#else /* J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP */
3172
/* Arguments are in registers.
3173
*
3174
* Copy the objectClassObject argument to the stack for the static interpreter dispatch.
3175
*/
3176
JIT_PARM_IN_MEMORY(1) = JIT_DIRECT_CALL_PARM(1);
3177
#endif /* J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP */
3178
currentThread->tempSlot = (UDATA)J9_BUILDER_SYMBOL(icallVMprJavaSendStatic1);
3179
jitRegisters->JIT_J2I_METHOD_REGISTER = (UDATA)J9VMJAVALANGJ9VMINTERNALS_NEWINSTANCEIMPL_METHOD(vm);
3180
}
3181
3182
void* J9FASTCALL
3183
old_slow_jitNewInstanceImplAccessCheck(J9VMThread *currentThread)
3184
{
3185
void *addr = NULL;
3186
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
3187
DECLARE_JIT_PARM(j9object_t, thisClassObject, 1);
3188
DECLARE_JIT_PARM(j9object_t, callerClassObject, 2);
3189
DECLARE_JIT_PARM(J9Method*, defaultConstructor, 3);
3190
J9Class *thisClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, thisClassObject);
3191
J9Class *callerClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, callerClassObject);
3192
J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(defaultConstructor);
3193
J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;
3194
void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE_RUNTIME_HELPER, parmCount);
3195
IDATA checkResult = vmFuncs->checkVisibility(currentThread, callerClass, thisClass, thisClass->romClass->modifiers, J9_LOOK_REFLECT_CALL);
3196
if (checkResult < J9_VISIBILITY_ALLOWED) {
3197
illegalAccess:
3198
if (VM_VMHelpers::immediateAsyncPending(currentThread)) {
3199
goto done;
3200
}
3201
if (VM_VMHelpers::exceptionPending(currentThread)) {
3202
goto done;
3203
}
3204
J9UTF8 *classNameUTF = J9ROMCLASS_CLASSNAME(thisClass->romClass);
3205
J9UTF8 *nameUTF = J9ROMMETHOD_NAME(romMethod);
3206
J9UTF8 *sigUTF = J9ROMMETHOD_SIGNATURE(romMethod);
3207
j9object_t detailMessage = currentThread->javaVM->internalVMFunctions->catUtfToString4(
3208
currentThread,
3209
J9UTF8_DATA(classNameUTF),
3210
J9UTF8_LENGTH(classNameUTF),
3211
(U_8*)".",
3212
1,
3213
J9UTF8_DATA(nameUTF),
3214
J9UTF8_LENGTH(nameUTF),
3215
J9UTF8_DATA(sigUTF),
3216
J9UTF8_LENGTH(sigUTF));
3217
if (NULL != detailMessage) {
3218
setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALACCESSEXCEPTION, detailMessage);
3219
}
3220
goto done;
3221
}
3222
3223
/* See if the method is visible - don't use checkVisibility here because newInstance
3224
* has different rules for protected method visibility.
3225
*/
3226
if (!J9_ARE_ANY_BITS_SET(romMethod->modifiers, J9AccPublic)) {
3227
if (J9_ARE_ANY_BITS_SET(romMethod->modifiers, J9AccPrivate)) {
3228
/* Private methods are visible only within their declaring class
3229
* unless the two classes are in the same nest (JDK11 and beyond).
3230
*/
3231
#if JAVA_SPEC_VERSION >= 11
3232
if (NULL == thisClass->nestHost) {
3233
if (J9_VISIBILITY_ALLOWED != vmFuncs->loadAndVerifyNestHost(currentThread, thisClass, 0)) {
3234
goto illegalAccess;
3235
}
3236
}
3237
if (NULL == callerClass->nestHost) {
3238
if (J9_VISIBILITY_ALLOWED != vmFuncs->loadAndVerifyNestHost(currentThread, callerClass, 0)) {
3239
goto illegalAccess;
3240
}
3241
}
3242
if (thisClass->nestHost != callerClass->nestHost)
3243
#endif /* JAVA_SPEC_VERSION >= 11 */
3244
{
3245
if (thisClass != callerClass) {
3246
goto illegalAccess;
3247
}
3248
}
3249
} else {
3250
/* Protected and default are treated the same when called from newInstance() */
3251
if (thisClass->packageID != callerClass->packageID) {
3252
goto illegalAccess;
3253
}
3254
}
3255
}
3256
done:
3257
addr = restoreJITResolveFrame(currentThread, oldPC);
3258
SLOW_JIT_HELPER_EPILOGUE();
3259
return addr;
3260
}
3261
3262
void J9FASTCALL
3263
old_slow_jitTranslateNewInstanceMethod(J9VMThread *currentThread)
3264
{
3265
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
3266
j9object_t objectClassObject = (j9object_t)JIT_DIRECT_CALL_PARM(1);
3267
j9object_t callerClassObject = (j9object_t)JIT_DIRECT_CALL_PARM(2);
3268
J9Class *objectClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, objectClassObject);
3269
J9Class *callerClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, callerClassObject);
3270
redo:
3271
UDATA preCount = objectClass->newInstanceCount;
3272
if ((IDATA)preCount >= 0) {
3273
UDATA postCount = preCount - 1;
3274
UDATA result = VM_AtomicSupport::lockCompareExchange((UDATA*)&objectClass->newInstanceCount, preCount, postCount);
3275
if (result != preCount) {
3276
goto redo;
3277
}
3278
if ((IDATA)postCount < 0) {
3279
buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);
3280
PUSH_OBJECT_IN_SPECIAL_FRAME(currentThread, objectClassObject);
3281
PUSH_OBJECT_IN_SPECIAL_FRAME(currentThread, callerClassObject);
3282
UDATA oldState = currentThread->omrVMThread->vmState;
3283
currentThread->omrVMThread->vmState = J9VMSTATE_JIT;
3284
J9JavaVM *vm = currentThread->javaVM;
3285
J9JITConfig *jitConfig = vm->jitConfig;
3286
jitConfig->entryPointForNewInstance(jitConfig, currentThread, objectClass);
3287
currentThread->omrVMThread->vmState = oldState;
3288
callerClassObject = POP_OBJECT_IN_SPECIAL_FRAME(currentThread);
3289
objectClassObject = POP_OBJECT_IN_SPECIAL_FRAME(currentThread);
3290
/* The newInstance prototype optimization is disabled under FSD, so there is no
3291
* possibility of decompilation occurring. If it is ever enabled, something
3292
* will need to be done here.
3293
*/
3294
restoreJITResolveFrame(currentThread, NULL, false, false);
3295
SET_JIT_DIRECT_CALL_PARM(1, objectClassObject);
3296
SET_JIT_DIRECT_CALL_PARM(2, callerClassObject);
3297
}
3298
}
3299
void *address = (void*)objectClass->romableAotITable;
3300
/* To handle async compilation - if the newInstance slot has not been updated, run the interp version */
3301
if (J9_BUILDER_SYMBOL(jitTranslateNewInstanceMethod) == address) {
3302
address = J9_BUILDER_SYMBOL(jitInterpretNewInstanceMethod);
3303
}
3304
currentThread->tempSlot = (UDATA)address;
3305
SLOW_JIT_HELPER_EPILOGUE();
3306
}
3307
3308
#if !defined(J9VM_ENV_DATA64)
3309
3310
void J9FASTCALL
3311
old_fast_jitVolatileReadLong(J9VMThread *currentThread)
3312
{
3313
OLD_JIT_HELPER_PROLOGUE(1);
3314
DECLARE_JIT_PARM(U_64*, address, 1);
3315
U_64 value = longVolatileRead(currentThread, address);
3316
JIT_RETURN_U64(value);
3317
}
3318
3319
void J9FASTCALL
3320
old_fast_jitVolatileWriteLong(J9VMThread *currentThread)
3321
{
3322
OLD_JIT_HELPER_PROLOGUE(3);
3323
DECLARE_JIT_PARM(U_64*, address, 1);
3324
DECLARE_JIT_U64_PARM(value, 2);
3325
longVolatileWrite(currentThread, address, (U_64*)&value);
3326
}
3327
3328
void J9FASTCALL
3329
old_fast_jitVolatileReadDouble(J9VMThread *currentThread)
3330
{
3331
OLD_JIT_HELPER_PROLOGUE(1);
3332
DECLARE_JIT_PARM(U_64*, address, 1);
3333
U_64 value = longVolatileRead(currentThread, address);
3334
jitRegisters->fpr[0] = value;
3335
}
3336
3337
void J9FASTCALL
3338
old_fast_jitVolatileWriteDouble(J9VMThread *currentThread)
3339
{
3340
OLD_JIT_HELPER_PROLOGUE(1);
3341
DECLARE_JIT_PARM(U_64*, address, 1);
3342
longVolatileWrite(currentThread, address, &(jitRegisters->fpr[0]));
3343
}
3344
3345
#endif /* !J9VM_ENV_DATA64 */
3346
3347
#if defined(J9SW_NEEDS_JIT_2_INTERP_THUNKS)
3348
3349
void J9FASTCALL
3350
old_slow_icallVMprJavaSendPatchupVirtual(J9VMThread *currentThread)
3351
{
3352
UDATA const interfaceVTableIndex = currentThread->tempSlot;
3353
j9object_t const receiver = (j9object_t)currentThread->returnValue2;
3354
J9JavaVM *vm = currentThread->javaVM;
3355
J9JITConfig *jitConfig = vm->jitConfig;
3356
void *jitReturnAddress = currentThread->jitReturnAddress;
3357
UDATA jitVTableOffset = VM_JITInterface::jitVTableIndex(jitReturnAddress, interfaceVTableIndex);
3358
J9Class *clazz = J9OBJECT_CLAZZ(currentThread, receiver);
3359
UDATA interpVTableOffset = sizeof(J9Class) - jitVTableOffset;
3360
J9Method *method = *(J9Method**)((UDATA)clazz + interpVTableOffset);
3361
J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method);
3362
J9ROMNameAndSignature *nas = &romMethod->nameAndSignature;
3363
UDATA const thunk = (UDATA)jitConfig->thunkLookUpNameAndSig(jitConfig, nas);
3364
UDATA const patchup = (UDATA)jitConfig->patchupVirtual;
3365
UDATA *jitVTableSlot = (UDATA*)((UDATA)clazz + jitVTableOffset);
3366
VM_AtomicSupport::lockCompareExchange(jitVTableSlot, patchup, thunk);
3367
currentThread->tempSlot = thunk;
3368
}
3369
3370
#endif /* J9SW_NEEDS_JIT_2_INTERP_THUNKS */
3371
3372
/* New-style helpers */
3373
3374
#if !defined(J9VM_ENV_DATA64)
3375
3376
U_64 J9FASTCALL
3377
fast_jitVolatileReadLong(J9VMThread *currentThread, U_64 *address)
3378
{
3379
JIT_HELPER_PROLOGUE();
3380
return longVolatileRead(currentThread, address);
3381
}
3382
3383
void J9FASTCALL
3384
fast_jitVolatileWriteLong(J9VMThread *currentThread, U_64* address, U_64 value)
3385
{
3386
JIT_HELPER_PROLOGUE();
3387
longVolatileWrite(currentThread, address, &value);
3388
}
3389
3390
jdouble J9FASTCALL
3391
fast_jitVolatileReadDouble(J9VMThread *currentThread, U_64* address)
3392
{
3393
JIT_HELPER_PROLOGUE();
3394
U_64 value = longVolatileRead(currentThread, address);
3395
return *(jdouble*)&value;
3396
}
3397
3398
void J9FASTCALL
3399
fast_jitVolatileWriteDouble(J9VMThread *currentThread, U_64 *address, jdouble value)
3400
{
3401
JIT_HELPER_PROLOGUE();
3402
longVolatileWrite(currentThread, address, (U_64*)&value);
3403
}
3404
3405
#endif /* !J9VM_ENV_DATA64 */
3406
3407
void J9FASTCALL
3408
fast_jitCheckIfFinalizeObject(J9VMThread *currentThread, j9object_t object)
3409
{
3410
JIT_HELPER_PROLOGUE();
3411
VM_VMHelpers::checkIfFinalizeObject(currentThread, object);
3412
}
3413
3414
void J9FASTCALL
3415
fast_jitCollapseJNIReferenceFrame(J9VMThread *currentThread)
3416
{
3417
JIT_HELPER_PROLOGUE();
3418
/* The direct JNI code has dropped all pushed JNI refs from the stack, and has called this routine on the java stack */
3419
UDATA *bp = ((UDATA *)(((J9SFJNINativeMethodFrame*)currentThread->sp) + 1)) - 1;
3420
currentThread->javaVM->internalVMFunctions->returnFromJNI(currentThread, bp);
3421
}
3422
3423
UDATA J9FASTCALL
3424
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3425
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3426
fast_jitInstanceOf(J9VMThread *currentThread, j9object_t object, J9Class *castClass)
3427
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3428
fast_jitInstanceOf(J9VMThread *currentThread, J9Class *castClass, j9object_t object)
3429
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3430
{
3431
JIT_HELPER_PROLOGUE();
3432
UDATA isInstance = 0;
3433
/* null isn't an instance of anything */
3434
if (NULL != object) {
3435
J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);
3436
if (VM_VMHelpers::inlineCheckCast(instanceClass, castClass)) {
3437
isInstance = 1;
3438
}
3439
}
3440
return isInstance;
3441
}
3442
3443
UDATA J9FASTCALL
3444
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3445
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3446
fast_jitCheckAssignable(J9VMThread *currentThread, J9Class *clazz, J9Class *castClass)
3447
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3448
fast_jitCheckAssignable(J9VMThread *currentThread, J9Class *castClass, J9Class *clazz)
3449
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3450
{
3451
JIT_HELPER_PROLOGUE();
3452
return VM_VMHelpers::inlineCheckCast(clazz, castClass) ? 1 : 0;
3453
}
3454
3455
UDATA J9FASTCALL
3456
fast_jitObjectHashCode(J9VMThread *currentThread, j9object_t object)
3457
{
3458
JIT_HELPER_PROLOGUE();
3459
J9JavaVM *vm = currentThread->javaVM;
3460
return (UDATA)(IDATA)vm->memoryManagerFunctions->j9gc_objaccess_getObjectHashCode(vm, (J9Object*)object);
3461
}
3462
3463
void* J9FASTCALL
3464
fast_jitNewValue(J9VMThread *currentThread, J9Class *objectClass)
3465
{
3466
// extern void* slow_jitNewObject(J9VMThread *currentThread);
3467
JIT_HELPER_PROLOGUE();
3468
void *slowPath = NULL;
3469
if (J9_UNEXPECTED(fast_jitNewValueImpl(currentThread, objectClass, true, false))) {
3470
SET_PARM_COUNT(0);
3471
slowPath = (void*) old_slow_jitNewValue;
3472
}
3473
return slowPath;
3474
}
3475
3476
void* J9FASTCALL
3477
fast_jitNewValueNoZeroInit(J9VMThread *currentThread, J9Class *objectClass)
3478
{
3479
// extern void* slow_jitNewObjectNoZeroInit(J9VMThread *currentThread);
3480
JIT_HELPER_PROLOGUE();
3481
void *slowPath = NULL;
3482
if (J9_UNEXPECTED(fast_jitNewValueImpl(currentThread, objectClass, true, true))) {
3483
SET_PARM_COUNT(0);
3484
slowPath = (void*)old_slow_jitNewValueNoZeroInit;
3485
}
3486
return slowPath;
3487
}
3488
3489
void* J9FASTCALL
3490
fast_jitNewObject(J9VMThread *currentThread, J9Class *objectClass)
3491
{
3492
// extern void* slow_jitNewObject(J9VMThread *currentThread);
3493
JIT_HELPER_PROLOGUE();
3494
void *slowPath = NULL;
3495
if (J9_UNEXPECTED(fast_jitNewObjectImpl(currentThread, objectClass, true, false))) {
3496
SET_PARM_COUNT(0);
3497
slowPath = (void*)old_slow_jitNewObject;
3498
}
3499
return slowPath;
3500
}
3501
3502
void* J9FASTCALL
3503
fast_jitNewObjectNoZeroInit(J9VMThread *currentThread, J9Class *objectClass)
3504
{
3505
// extern void* slow_jitNewObjectNoZeroInit(J9VMThread *currentThread);
3506
JIT_HELPER_PROLOGUE();
3507
void *slowPath = NULL;
3508
if (J9_UNEXPECTED(fast_jitNewObjectImpl(currentThread, objectClass, true, true))) {
3509
SET_PARM_COUNT(0);
3510
slowPath = (void*)old_slow_jitNewObjectNoZeroInit;
3511
}
3512
return slowPath;
3513
}
3514
3515
void* J9FASTCALL
3516
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3517
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3518
fast_jitANewArray(J9VMThread *currentThread, I_32 size, J9Class *elementClass)
3519
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3520
fast_jitANewArray(J9VMThread *currentThread, J9Class *elementClass, I_32 size)
3521
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3522
{
3523
// extern void* slow_jitANewArray(J9VMThread *currentThread);
3524
JIT_HELPER_PROLOGUE();
3525
void *slowPath = NULL;
3526
if (J9_UNEXPECTED(fast_jitANewArrayImpl(currentThread, elementClass, size, false))) {
3527
SET_PARM_COUNT(0);
3528
slowPath = (void*)old_slow_jitANewArray;
3529
}
3530
return slowPath;
3531
}
3532
3533
void* J9FASTCALL
3534
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3535
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3536
fast_jitANewArrayNoZeroInit(J9VMThread *currentThread, I_32 size, J9Class *elementClass)
3537
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3538
fast_jitANewArrayNoZeroInit(J9VMThread *currentThread, J9Class *elementClass, I_32 size)
3539
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3540
{
3541
// extern void* slow_jitANewArrayNoZeroInit(J9VMThread *currentThread);
3542
JIT_HELPER_PROLOGUE();
3543
void *slowPath = NULL;
3544
if (J9_UNEXPECTED(fast_jitANewArrayImpl(currentThread, elementClass, size, true))) {
3545
SET_PARM_COUNT(0);
3546
slowPath = (void*)old_slow_jitANewArrayNoZeroInit;
3547
}
3548
return slowPath;
3549
}
3550
3551
void* J9FASTCALL
3552
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3553
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3554
fast_jitNewArray(J9VMThread *currentThread, I_32 size, I_32 arrayType)
3555
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3556
fast_jitNewArray(J9VMThread *currentThread, I_32 arrayType, I_32 size)
3557
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3558
{
3559
// extern void* slow_jitNewArray(J9VMThread *currentThread);
3560
JIT_HELPER_PROLOGUE();
3561
void *slowPath = NULL;
3562
if (J9_UNEXPECTED(fast_jitNewArrayImpl(currentThread, arrayType, size, false))) {
3563
SET_PARM_COUNT(0);
3564
slowPath = (void*)old_slow_jitNewArray;
3565
}
3566
return slowPath;
3567
}
3568
3569
void* J9FASTCALL
3570
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3571
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3572
fast_jitNewArrayNoZeroInit(J9VMThread *currentThread, I_32 size, I_32 arrayType)
3573
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3574
fast_jitNewArrayNoZeroInit(J9VMThread *currentThread, I_32 arrayType, I_32 size)
3575
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3576
{
3577
// extern void* slow_jitNewArrayNoZeroInit(J9VMThread *currentThread);
3578
JIT_HELPER_PROLOGUE();
3579
void *slowPath = NULL;
3580
if (J9_UNEXPECTED(fast_jitNewArrayImpl(currentThread, arrayType, size, true))) {
3581
SET_PARM_COUNT(0);
3582
slowPath = (void*)old_slow_jitNewArrayNoZeroInit;
3583
}
3584
return slowPath;
3585
}
3586
3587
void* J9FASTCALL
3588
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3589
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3590
fast_jitCheckCast(J9VMThread *currentThread, j9object_t object, J9Class *castClass)
3591
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3592
fast_jitCheckCast(J9VMThread *currentThread, J9Class *castClass, j9object_t object)
3593
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3594
{
3595
// extern void* slow_jitCheckCast(J9VMThread *currentThread);
3596
JIT_HELPER_PROLOGUE();
3597
void *slowPath = NULL;
3598
/* null can be cast to anything, except if castClass is a VT */
3599
if (NULL != object) {
3600
J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);
3601
if (J9_UNEXPECTED(!VM_VMHelpers::inlineCheckCast(instanceClass, castClass))) {
3602
SET_PARM_COUNT(0);
3603
currentThread->floatTemp1 = (void*)castClass;
3604
currentThread->floatTemp2 = (void*)object;
3605
slowPath = (void*)old_slow_jitCheckCast;
3606
}
3607
}
3608
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
3609
else if (J9_IS_J9CLASS_VALUETYPE(castClass)) {
3610
slowPath = (void*)old_slow_jitThrowNullPointerException;
3611
}
3612
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
3613
return slowPath;
3614
}
3615
3616
void* J9FASTCALL
3617
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3618
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3619
fast_jitCheckCastForArrayStore(J9VMThread *currentThread, j9object_t object, J9Class *castClass)
3620
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3621
fast_jitCheckCastForArrayStore(J9VMThread *currentThread, J9Class *castClass, j9object_t object)
3622
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3623
{
3624
// extern void* slow_jitCheckCastForArrayStore(J9VMThread *currentThread);
3625
JIT_HELPER_PROLOGUE();
3626
void *slowPath = NULL;
3627
/* null can be cast to anything, except if castClass is a VT */
3628
if (NULL != object) {
3629
J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);
3630
if (J9_UNEXPECTED(!VM_VMHelpers::inlineCheckCast(instanceClass, castClass))) {
3631
SET_PARM_COUNT(0);
3632
slowPath = (void*)old_slow_jitCheckCastForArrayStore;
3633
}
3634
}
3635
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
3636
else if (J9_IS_J9CLASS_VALUETYPE(castClass)) {
3637
slowPath = (void*)old_slow_jitThrowNullPointerException;
3638
}
3639
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
3640
return slowPath;
3641
}
3642
3643
void* J9FASTCALL
3644
#if defined(J9VM_ARCH_X86)
3645
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3646
fast_jitLookupInterfaceMethod(J9VMThread *currentThread, void *jitEIP, J9Class *receiverClass, UDATA *indexAndLiteralsEA)
3647
#else /* J9VM_ARCH_X86 */
3648
fast_jitLookupInterfaceMethod(J9VMThread *currentThread, J9Class *receiverClass, UDATA *indexAndLiteralsEA, void *jitEIP)
3649
#endif /* J9VM_ARCH_X86 */
3650
{
3651
// extern void* slow_jitLookupInterfaceMethod(J9VMThread *currentThread);
3652
JIT_HELPER_PROLOGUE();
3653
SET_PARM_COUNT(0);
3654
void *slowPath = (void*)old_slow_jitLookupInterfaceMethod;
3655
currentThread->floatTemp1 = (void*)receiverClass;
3656
currentThread->floatTemp2 = (void*)indexAndLiteralsEA;
3657
currentThread->floatTemp3 = (void*)jitEIP;
3658
J9Class *interfaceClass = ((J9Class**)indexAndLiteralsEA)[0];
3659
UDATA iTableOffset = indexAndLiteralsEA[1];
3660
UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);
3661
if (0 != vTableOffset) {
3662
J9Method* method = *(J9Method**)((UDATA)receiverClass + vTableOffset);
3663
if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccPublic)) {
3664
slowPath = NULL;
3665
JIT_RETURN_UDATA(vTableOffset);
3666
}
3667
}
3668
return slowPath;
3669
}
3670
3671
void* J9FASTCALL
3672
fast_jitMethodMonitorEntry(J9VMThread *currentThread, j9object_t syncObject)
3673
{
3674
// extern void* slow_jitMethodMonitorEntry(J9VMThread *currentThread);
3675
JIT_HELPER_PROLOGUE();
3676
void *slowPath = NULL;
3677
if (J9_UNEXPECTED(fast_jitMonitorEnterImpl(currentThread, syncObject, true))) {
3678
SET_PARM_COUNT(0);
3679
slowPath = (void*)old_slow_jitMethodMonitorEntry;
3680
}
3681
return slowPath;
3682
}
3683
3684
void* J9FASTCALL
3685
fast_jitMonitorEntry(J9VMThread *currentThread, j9object_t syncObject)
3686
{
3687
// extern void* slow_jitMonitorEntry(J9VMThread *currentThread);
3688
JIT_HELPER_PROLOGUE();
3689
void *slowPath = NULL;
3690
if (J9_UNEXPECTED(fast_jitMonitorEnterImpl(currentThread, syncObject, false))) {
3691
SET_PARM_COUNT(0);
3692
slowPath = (void*)old_slow_jitMonitorEntry;
3693
}
3694
return slowPath;
3695
}
3696
3697
void* J9FASTCALL
3698
fast_jitMethodMonitorExit(J9VMThread *currentThread, j9object_t syncObject)
3699
{
3700
// extern void* slow_jitMethodMonitorExit(J9VMThread *currentThread);
3701
JIT_HELPER_PROLOGUE();
3702
void *slowPath = NULL;
3703
if (J9_UNEXPECTED(fast_jitMonitorExitImpl(currentThread, syncObject, true))) {
3704
SET_PARM_COUNT(0);
3705
slowPath = (void*)old_slow_jitMethodMonitorExit;
3706
}
3707
return slowPath;
3708
}
3709
3710
void* J9FASTCALL
3711
fast_jitMonitorExit(J9VMThread *currentThread, j9object_t syncObject)
3712
{
3713
// extern void* slow_jitMonitorExit(J9VMThread *currentThread);
3714
JIT_HELPER_PROLOGUE();
3715
void *slowPath = NULL;
3716
if (J9_UNEXPECTED(fast_jitMonitorExitImpl(currentThread, syncObject, false))) {
3717
SET_PARM_COUNT(0);
3718
slowPath = (void*)old_slow_jitMonitorExit;
3719
}
3720
return slowPath;
3721
}
3722
3723
void* J9FASTCALL
3724
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3725
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3726
fast_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread, j9object_t objectBeingStored, j9object_t destinationObject)
3727
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3728
fast_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)
3729
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3730
{
3731
// extern void* slow_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread);
3732
JIT_HELPER_PROLOGUE();
3733
void *slowPath = NULL;
3734
if (J9_UNEXPECTED(fast_jitTypeCheckArrayStoreImpl(currentThread, destinationObject, objectBeingStored))) {
3735
SET_PARM_COUNT(0);
3736
slowPath = (void*)old_slow_jitTypeCheckArrayStoreWithNullCheck;
3737
}
3738
return slowPath;
3739
}
3740
3741
BOOLEAN J9FASTCALL
3742
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3743
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3744
fast_jitAcmpeqHelper(J9VMThread *currentThread, j9object_t lhs, j9object_t rhs)
3745
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3746
fast_jitAcmpeqHelper(J9VMThread *currentThread, j9object_t rhs, j9object_t lhs)
3747
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3748
{
3749
JIT_HELPER_PROLOGUE();
3750
3751
return currentThread->javaVM->internalVMFunctions->valueTypeCapableAcmp(currentThread, lhs, rhs);
3752
}
3753
3754
BOOLEAN J9FASTCALL
3755
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3756
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3757
fast_jitAcmpneHelper(J9VMThread *currentThread, j9object_t lhs, j9object_t rhs)
3758
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3759
fast_jitAcmpneHelper(J9VMThread *currentThread, j9object_t rhs, j9object_t lhs)
3760
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3761
{
3762
JIT_HELPER_PROLOGUE();
3763
3764
return !currentThread->javaVM->internalVMFunctions->valueTypeCapableAcmp(currentThread, lhs, rhs);
3765
}
3766
3767
void* J9FASTCALL
3768
#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)
3769
/* TODO Will be cleaned once all platforms adopt the correct parameter order */
3770
fast_jitTypeCheckArrayStore(J9VMThread *currentThread, j9object_t objectBeingStored, j9object_t destinationObject)
3771
#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3772
fast_jitTypeCheckArrayStore(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)
3773
#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/
3774
{
3775
JIT_HELPER_PROLOGUE();
3776
/* Not omitting NULL check */
3777
return fast_jitTypeCheckArrayStoreWithNullCheck(currentThread, destinationObject, objectBeingStored);
3778
}
3779
3780
void* J9FASTCALL
3781
old_slow_jitReportFinalFieldModified(J9VMThread *currentThread)
3782
{
3783
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(1);
3784
DECLARE_JIT_PARM(J9Class*, fieldClass, 1);
3785
3786
void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
3787
VM_VMHelpers::reportFinalFieldModified(currentThread, fieldClass);
3788
void* addr = restoreJITResolveFrame(currentThread, oldPC, true, false);
3789
3790
SLOW_JIT_HELPER_EPILOGUE();
3791
return addr;
3792
}
3793
3794
void* J9FASTCALL
3795
old_slow_jitReportInstanceFieldRead(J9VMThread *currentThread)
3796
{
3797
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
3798
DECLARE_JIT_PARM(J9JITWatchedInstanceFieldData*, dataBlock, 1);
3799
DECLARE_JIT_PARM(j9object_t, object, 2);
3800
J9JavaVM *vm = currentThread->javaVM;
3801
void *addr = NULL;
3802
3803
if (J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_GET_FIELD)) {
3804
if (J9_ARE_ANY_BITS_SET(J9OBJECT_CLAZZ(currentThread, object)->classFlags, J9ClassHasWatchedFields)) {
3805
void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
3806
ALWAYS_TRIGGER_J9HOOK_VM_GET_FIELD(vm->hookInterface, currentThread, dataBlock->method, dataBlock->location, object, dataBlock->offset);
3807
addr = restoreJITResolveFrame(currentThread, oldPC, true, false);
3808
}
3809
}
3810
3811
SLOW_JIT_HELPER_EPILOGUE();
3812
return addr;
3813
}
3814
3815
void* J9FASTCALL
3816
old_slow_jitReportInstanceFieldWrite(J9VMThread *currentThread)
3817
{
3818
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);
3819
DECLARE_JIT_PARM(J9JITWatchedInstanceFieldData*, dataBlock, 1);
3820
DECLARE_JIT_PARM(j9object_t, object, 2);
3821
DECLARE_JIT_PARM(void*, valuePointer, 3);
3822
J9JavaVM *vm = currentThread->javaVM;
3823
void *addr = NULL;
3824
3825
if (J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_PUT_FIELD)) {
3826
if (J9_ARE_ANY_BITS_SET(J9OBJECT_CLAZZ(currentThread, object)->classFlags, J9ClassHasWatchedFields)) {
3827
void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
3828
ALWAYS_TRIGGER_J9HOOK_VM_PUT_FIELD(vm->hookInterface, currentThread, dataBlock->method, dataBlock->location, object, dataBlock->offset, *(U_64*)valuePointer);
3829
addr = restoreJITResolveFrame(currentThread, oldPC, true, false);
3830
}
3831
}
3832
3833
SLOW_JIT_HELPER_EPILOGUE();
3834
return addr;
3835
}
3836
3837
void* J9FASTCALL
3838
old_slow_jitReportStaticFieldRead(J9VMThread *currentThread)
3839
{
3840
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(1);
3841
DECLARE_JIT_PARM(J9JITWatchedStaticFieldData*, dataBlock, 1);
3842
J9JavaVM *vm = currentThread->javaVM;
3843
void *addr = NULL;
3844
3845
if (J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_GET_STATIC_FIELD)) {
3846
J9Class *fieldClass = dataBlock->fieldClass;
3847
if (J9_ARE_ANY_BITS_SET(fieldClass->classFlags, J9ClassHasWatchedFields)) {
3848
void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
3849
/* Ensure that this call blocks before reporting the event if another thread
3850
* is initializing the class.
3851
*/
3852
if (J9_UNEXPECTED(VM_VMHelpers::classRequiresInitialization(currentThread, fieldClass))) {
3853
vm->internalVMFunctions->initializeClass(currentThread, fieldClass);
3854
if (VM_VMHelpers::exceptionPending(currentThread)) {
3855
goto restore;
3856
}
3857
if (VM_VMHelpers::immediateAsyncPending(currentThread)) {
3858
goto restore;
3859
}
3860
}
3861
ALWAYS_TRIGGER_J9HOOK_VM_GET_STATIC_FIELD(vm->hookInterface, currentThread, dataBlock->method, dataBlock->location, fieldClass, dataBlock->fieldAddress);
3862
restore:
3863
addr = restoreJITResolveFrame(currentThread, oldPC, true, true);
3864
}
3865
}
3866
3867
SLOW_JIT_HELPER_EPILOGUE();
3868
return addr;
3869
}
3870
3871
void* J9FASTCALL
3872
old_slow_jitReportStaticFieldWrite(J9VMThread *currentThread)
3873
{
3874
OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);
3875
DECLARE_JIT_PARM(J9JITWatchedStaticFieldData*, dataBlock, 1);
3876
DECLARE_JIT_PARM(void*, valuePointer, 2);
3877
J9JavaVM *vm = currentThread->javaVM;
3878
void *addr = NULL;
3879
3880
if (J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_PUT_STATIC_FIELD)) {
3881
J9Class *fieldClass = dataBlock->fieldClass;
3882
if (J9_ARE_ANY_BITS_SET(fieldClass->classFlags, J9ClassHasWatchedFields)) {
3883
/* Read the data now, as the incoming pointer is potentially into the
3884
* java stack, which would be invalidated by the class initialization below.
3885
* Ensure the read does not get reordered below by the compiler.
3886
*/
3887
U_64 value = *(U_64 volatile *)valuePointer;
3888
VM_AtomicSupport::compilerReorderingBarrier();
3889
void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);
3890
/* Ensure that this call blocks before reporting the event if another thread
3891
* is initializing the class.
3892
*/
3893
if (J9_UNEXPECTED(VM_VMHelpers::classRequiresInitialization(currentThread, fieldClass))) {
3894
vm->internalVMFunctions->initializeClass(currentThread, fieldClass);
3895
if (VM_VMHelpers::exceptionPending(currentThread)) {
3896
goto restore;
3897
}
3898
if (VM_VMHelpers::immediateAsyncPending(currentThread)) {
3899
goto restore;
3900
}
3901
}
3902
ALWAYS_TRIGGER_J9HOOK_VM_PUT_STATIC_FIELD(vm->hookInterface, currentThread, dataBlock->method, dataBlock->location, fieldClass, dataBlock->fieldAddress, value);
3903
restore:
3904
addr = restoreJITResolveFrame(currentThread, oldPC, true, false);
3905
}
3906
}
3907
3908
SLOW_JIT_HELPER_EPILOGUE();
3909
return addr;
3910
}
3911
3912
void
3913
initPureCFunctionTable(J9JavaVM *vm)
3914
{
3915
J9JITConfig *jitConfig = vm->jitConfig;
3916
3917
jitConfig->old_fast_jitNewObject = (void*)old_fast_jitNewObject;
3918
jitConfig->old_slow_jitNewObject = (void*)old_slow_jitNewObject;
3919
jitConfig->old_fast_jitNewObjectNoZeroInit = (void*)old_fast_jitNewObjectNoZeroInit;
3920
jitConfig->old_slow_jitNewObjectNoZeroInit = (void*)old_slow_jitNewObjectNoZeroInit;
3921
jitConfig->old_fast_jitANewArray = (void*)old_fast_jitANewArray;
3922
jitConfig->old_slow_jitANewArray = (void*)old_slow_jitANewArray;
3923
jitConfig->old_fast_jitANewArrayNoZeroInit = (void*)old_fast_jitANewArrayNoZeroInit;
3924
jitConfig->old_slow_jitANewArrayNoZeroInit = (void*)old_slow_jitANewArrayNoZeroInit;
3925
jitConfig->old_fast_jitNewArray = (void*)old_fast_jitNewArray;
3926
jitConfig->old_slow_jitNewArray = (void*)old_slow_jitNewArray;
3927
jitConfig->old_fast_jitNewArrayNoZeroInit = (void*)old_fast_jitNewArrayNoZeroInit;
3928
jitConfig->old_slow_jitNewArrayNoZeroInit = (void*)old_slow_jitNewArrayNoZeroInit;
3929
jitConfig->old_slow_jitAMultiNewArray = (void*)old_slow_jitAMultiNewArray;
3930
jitConfig->old_slow_jitStackOverflow = (void*)old_slow_jitStackOverflow;
3931
jitConfig->old_slow_jitResolveString = (void*)old_slow_jitResolveString;
3932
jitConfig->fast_jitAcquireVMAccess = (void*)fast_jitAcquireVMAccess;
3933
jitConfig->fast_jitReleaseVMAccess = (void*)fast_jitReleaseVMAccess;
3934
jitConfig->old_slow_jitCheckAsyncMessages = (void*)old_slow_jitCheckAsyncMessages;
3935
jitConfig->old_fast_jitCheckCast = (void*)old_fast_jitCheckCast;
3936
jitConfig->old_slow_jitCheckCast = (void*)old_slow_jitCheckCast;
3937
jitConfig->old_fast_jitCheckCastForArrayStore = (void*)old_fast_jitCheckCastForArrayStore;
3938
jitConfig->old_slow_jitCheckCastForArrayStore = (void*)old_slow_jitCheckCastForArrayStore;
3939
jitConfig->old_fast_jitCheckIfFinalizeObject = (void*)old_fast_jitCheckIfFinalizeObject;
3940
jitConfig->old_fast_jitCollapseJNIReferenceFrame = (void*)old_fast_jitCollapseJNIReferenceFrame;
3941
jitConfig->old_slow_jitHandleArrayIndexOutOfBoundsTrap = (void*)old_slow_jitHandleArrayIndexOutOfBoundsTrap;
3942
jitConfig->old_slow_jitHandleIntegerDivideByZeroTrap = (void*)old_slow_jitHandleIntegerDivideByZeroTrap;
3943
jitConfig->old_slow_jitHandleNullPointerExceptionTrap = (void*)old_slow_jitHandleNullPointerExceptionTrap;
3944
jitConfig->old_slow_jitHandleInternalErrorTrap = (void*)old_slow_jitHandleInternalErrorTrap;
3945
jitConfig->old_fast_jitInstanceOf = (void*)old_fast_jitInstanceOf;
3946
jitConfig->old_fast_jitLookupInterfaceMethod = (void*)old_fast_jitLookupInterfaceMethod;
3947
jitConfig->old_slow_jitLookupInterfaceMethod = (void*)old_slow_jitLookupInterfaceMethod;
3948
jitConfig->old_fast_jitLookupDynamicInterfaceMethod = (void*)old_fast_jitLookupDynamicInterfaceMethod;
3949
jitConfig->old_fast_jitLookupDynamicPublicInterfaceMethod = (void*)old_fast_jitLookupDynamicPublicInterfaceMethod;
3950
jitConfig->old_slow_jitLookupDynamicPublicInterfaceMethod = (void*)old_slow_jitLookupDynamicPublicInterfaceMethod;
3951
jitConfig->old_fast_jitMethodIsNative = (void*)old_fast_jitMethodIsNative;
3952
jitConfig->old_fast_jitMethodIsSync = (void*)old_fast_jitMethodIsSync;
3953
jitConfig->old_fast_jitMethodMonitorEntry = (void*)old_fast_jitMethodMonitorEntry;
3954
jitConfig->old_slow_jitMethodMonitorEntry = (void*)old_slow_jitMethodMonitorEntry;
3955
jitConfig->old_fast_jitMonitorEntry = (void*)old_fast_jitMonitorEntry;
3956
jitConfig->old_slow_jitMonitorEntry = (void*)old_slow_jitMonitorEntry;
3957
jitConfig->old_fast_jitMethodMonitorExit = (void*)old_fast_jitMethodMonitorExit;
3958
jitConfig->old_slow_jitMethodMonitorExit = (void*)old_slow_jitMethodMonitorExit;
3959
jitConfig->old_slow_jitThrowIncompatibleReceiver = (void*)old_slow_jitThrowIncompatibleReceiver;
3960
jitConfig->old_fast_jitMonitorExit = (void*)old_fast_jitMonitorExit;
3961
jitConfig->old_slow_jitMonitorExit = (void*)old_slow_jitMonitorExit;
3962
jitConfig->old_slow_jitReportMethodEnter = (void*)old_slow_jitReportMethodEnter;
3963
jitConfig->old_slow_jitReportStaticMethodEnter = (void*)old_slow_jitReportStaticMethodEnter;
3964
jitConfig->old_slow_jitReportMethodExit = (void*)old_slow_jitReportMethodExit;
3965
jitConfig->old_slow_jitResolveClass = (void*)old_slow_jitResolveClass;
3966
jitConfig->old_slow_jitResolveClassFromStaticField = (void*)old_slow_jitResolveClassFromStaticField;
3967
jitConfig->old_fast_jitResolvedFieldIsVolatile = (void*)old_fast_jitResolvedFieldIsVolatile;
3968
jitConfig->old_slow_jitResolveField = (void*)old_slow_jitResolveField;
3969
jitConfig->old_slow_jitResolveFieldSetter = (void*)old_slow_jitResolveFieldSetter;
3970
jitConfig->old_slow_jitResolveFieldDirect = (void*)old_slow_jitResolveFieldDirect;
3971
jitConfig->old_slow_jitResolveFieldSetterDirect = (void*)old_slow_jitResolveFieldSetterDirect;
3972
jitConfig->old_slow_jitResolveStaticField = (void*)old_slow_jitResolveStaticField;
3973
jitConfig->old_slow_jitResolveStaticFieldSetter = (void*)old_slow_jitResolveStaticFieldSetter;
3974
jitConfig->old_slow_jitResolveStaticFieldDirect = (void*)old_slow_jitResolveStaticFieldDirect;
3975
jitConfig->old_slow_jitResolveStaticFieldSetterDirect = (void*)old_slow_jitResolveStaticFieldSetterDirect;
3976
jitConfig->old_slow_jitResolveInterfaceMethod = (void*)old_slow_jitResolveInterfaceMethod;
3977
jitConfig->old_slow_jitResolveSpecialMethod = (void*)old_slow_jitResolveSpecialMethod;
3978
jitConfig->old_slow_jitResolveStaticMethod = (void*)old_slow_jitResolveStaticMethod;
3979
jitConfig->old_slow_jitResolveVirtualMethod = (void*)old_slow_jitResolveVirtualMethod;
3980
jitConfig->old_slow_jitResolveMethodType = (void*)old_slow_jitResolveMethodType;
3981
jitConfig->old_slow_jitResolveMethodHandle = (void*)old_slow_jitResolveMethodHandle;
3982
jitConfig->old_slow_jitResolveInvokeDynamic = (void*)old_slow_jitResolveInvokeDynamic;
3983
jitConfig->old_slow_jitResolveConstantDynamic = (void*)old_slow_jitResolveConstantDynamic;
3984
jitConfig->old_slow_jitResolveHandleMethod = (void*)old_slow_jitResolveHandleMethod;
3985
jitConfig->old_slow_jitResolveFlattenableField = (void*)old_slow_jitResolveFlattenableField;
3986
jitConfig->old_slow_jitRetranslateCaller = (void*)old_slow_jitRetranslateCaller;
3987
jitConfig->old_slow_jitRetranslateCallerWithPreparation = (void*)old_slow_jitRetranslateCallerWithPreparation;
3988
jitConfig->old_slow_jitRetranslateMethod = (void*)old_slow_jitRetranslateMethod;
3989
jitConfig->old_slow_jitThrowCurrentException = (void*)old_slow_jitThrowCurrentException;
3990
jitConfig->old_slow_jitThrowException = (void*)old_slow_jitThrowException;
3991
jitConfig->old_slow_jitThrowUnreportedException = (void*)old_slow_jitThrowUnreportedException;
3992
jitConfig->old_slow_jitThrowAbstractMethodError = (void*)old_slow_jitThrowAbstractMethodError;
3993
jitConfig->old_slow_jitThrowArithmeticException = (void*)old_slow_jitThrowArithmeticException;
3994
jitConfig->old_slow_jitThrowArrayIndexOutOfBounds = (void*)old_slow_jitThrowArrayIndexOutOfBounds;
3995
jitConfig->old_slow_jitThrowArrayStoreException = (void*)old_slow_jitThrowArrayStoreException;
3996
jitConfig->old_slow_jitThrowArrayStoreExceptionWithIP = (void*)old_slow_jitThrowArrayStoreExceptionWithIP;
3997
jitConfig->old_slow_jitThrowExceptionInInitializerError = (void*)old_slow_jitThrowExceptionInInitializerError;
3998
jitConfig->old_slow_jitThrowIllegalAccessError = (void*)old_slow_jitThrowIllegalAccessError;
3999
jitConfig->old_slow_jitThrowIncompatibleClassChangeError = (void*)old_slow_jitThrowIncompatibleClassChangeError;
4000
jitConfig->old_slow_jitThrowInstantiationException = (void*)old_slow_jitThrowInstantiationException;
4001
jitConfig->old_slow_jitThrowNullPointerException = (void*)old_slow_jitThrowNullPointerException;
4002
jitConfig->old_slow_jitThrowWrongMethodTypeException = (void*)old_slow_jitThrowWrongMethodTypeException;
4003
jitConfig->old_fast_jitTypeCheckArrayStoreWithNullCheck = (void*)old_fast_jitTypeCheckArrayStoreWithNullCheck;
4004
jitConfig->old_slow_jitTypeCheckArrayStoreWithNullCheck = (void*)old_slow_jitTypeCheckArrayStoreWithNullCheck;
4005
jitConfig->old_fast_jitTypeCheckArrayStore = (void*)old_fast_jitTypeCheckArrayStore;
4006
jitConfig->old_slow_jitTypeCheckArrayStore = (void*)old_slow_jitTypeCheckArrayStore;
4007
jitConfig->old_fast_jitWriteBarrierBatchStore = (void*)old_fast_jitWriteBarrierBatchStore;
4008
jitConfig->old_fast_jitWriteBarrierBatchStoreWithRange = (void*)old_fast_jitWriteBarrierBatchStoreWithRange;
4009
jitConfig->old_fast_jitWriteBarrierJ9ClassBatchStore = (void*)old_fast_jitWriteBarrierJ9ClassBatchStore;
4010
jitConfig->old_fast_jitWriteBarrierJ9ClassStore = (void*)old_fast_jitWriteBarrierJ9ClassStore;
4011
jitConfig->old_fast_jitWriteBarrierStore = (void*)old_fast_jitWriteBarrierStore;
4012
jitConfig->old_fast_jitWriteBarrierStoreGenerational = (void*)old_fast_jitWriteBarrierStoreGenerational;
4013
jitConfig->old_fast_jitWriteBarrierStoreGenerationalAndConcurrentMark = (void*)old_fast_jitWriteBarrierStoreGenerationalAndConcurrentMark;
4014
jitConfig->old_fast_jitWriteBarrierClassStoreMetronome = (void*)old_fast_jitWriteBarrierClassStoreMetronome;
4015
jitConfig->old_fast_jitWriteBarrierStoreMetronome = (void*)old_fast_jitWriteBarrierStoreMetronome;
4016
jitConfig->old_slow_jitCallJitAddPicToPatchOnClassUnload = (void*)old_slow_jitCallJitAddPicToPatchOnClassUnload;
4017
jitConfig->old_slow_jitCallCFunction = (void*)old_slow_jitCallCFunction;
4018
jitConfig->fast_jitPreJNICallOffloadCheck = (void*)fast_jitPreJNICallOffloadCheck;
4019
jitConfig->fast_jitPostJNICallOffloadCheck = (void*)fast_jitPostJNICallOffloadCheck;
4020
jitConfig->old_fast_jitObjectHashCode = (void*)old_fast_jitObjectHashCode;
4021
jitConfig->old_slow_jitInduceOSRAtCurrentPC = (void*)old_slow_jitInduceOSRAtCurrentPC;
4022
jitConfig->old_slow_jitInduceOSRAtCurrentPCAndRecompile = (void*)old_slow_jitInduceOSRAtCurrentPCAndRecompile;
4023
jitConfig->old_slow_jitInterpretNewInstanceMethod = (void*)old_slow_jitInterpretNewInstanceMethod;
4024
jitConfig->old_slow_jitNewInstanceImplAccessCheck = (void*)old_slow_jitNewInstanceImplAccessCheck;
4025
jitConfig->old_slow_jitTranslateNewInstanceMethod = (void*)old_slow_jitTranslateNewInstanceMethod;
4026
jitConfig->old_slow_jitReportFinalFieldModified = (void*)old_slow_jitReportFinalFieldModified;
4027
jitConfig->old_fast_jitGetFlattenableField = (void*) old_fast_jitGetFlattenableField;
4028
jitConfig->old_fast_jitCloneValueType = (void*) old_fast_jitCloneValueType;
4029
jitConfig->old_fast_jitWithFlattenableField = (void*) old_fast_jitWithFlattenableField;
4030
jitConfig->old_fast_jitPutFlattenableField = (void*) old_fast_jitPutFlattenableField;
4031
jitConfig->old_fast_jitGetFlattenableStaticField = (void*) old_fast_jitGetFlattenableStaticField;
4032
jitConfig->old_fast_jitPutFlattenableStaticField = (void*) old_fast_jitPutFlattenableStaticField;
4033
jitConfig->old_fast_jitLoadFlattenableArrayElement = (void*) old_fast_jitLoadFlattenableArrayElement;
4034
jitConfig->old_fast_jitStoreFlattenableArrayElement = (void*) old_fast_jitStoreFlattenableArrayElement;
4035
jitConfig->old_fast_jitAcmpeqHelper = (void*)old_fast_jitAcmpeqHelper;
4036
jitConfig->old_fast_jitAcmpneHelper = (void*)old_fast_jitAcmpneHelper;
4037
jitConfig->fast_jitNewValue = (void*)fast_jitNewValue;
4038
jitConfig->fast_jitNewValueNoZeroInit = (void*)fast_jitNewValueNoZeroInit;
4039
jitConfig->fast_jitNewObject = (void*)fast_jitNewObject;
4040
jitConfig->fast_jitNewObjectNoZeroInit = (void*)fast_jitNewObjectNoZeroInit;
4041
jitConfig->fast_jitANewArray = (void*)fast_jitANewArray;
4042
jitConfig->fast_jitANewArrayNoZeroInit = (void*)fast_jitANewArrayNoZeroInit;
4043
jitConfig->fast_jitNewArray = (void*)fast_jitNewArray;
4044
jitConfig->fast_jitNewArrayNoZeroInit = (void*)fast_jitNewArrayNoZeroInit;
4045
jitConfig->fast_jitCheckCast = (void*)fast_jitCheckCast;
4046
jitConfig->fast_jitCheckCastForArrayStore = (void*)fast_jitCheckCastForArrayStore;
4047
jitConfig->fast_jitMethodMonitorEntry = (void*)fast_jitMethodMonitorEntry;
4048
jitConfig->fast_jitMonitorEntry = (void*)fast_jitMonitorEntry;
4049
jitConfig->fast_jitMethodMonitorExit = (void*)fast_jitMethodMonitorExit;
4050
jitConfig->fast_jitMonitorExit = (void*)fast_jitMonitorExit;
4051
jitConfig->fast_jitTypeCheckArrayStore = (void*)fast_jitTypeCheckArrayStore;
4052
jitConfig->fast_jitTypeCheckArrayStoreWithNullCheck = (void*)fast_jitTypeCheckArrayStoreWithNullCheck;
4053
#if !defined(J9VM_ENV_DATA64)
4054
jitConfig->old_fast_jitVolatileReadLong = (void*)old_fast_jitVolatileReadLong;
4055
jitConfig->old_fast_jitVolatileWriteLong = (void*)old_fast_jitVolatileWriteLong;
4056
jitConfig->old_fast_jitVolatileReadDouble = (void*)old_fast_jitVolatileReadDouble;
4057
jitConfig->old_fast_jitVolatileWriteDouble = (void*)old_fast_jitVolatileWriteDouble;
4058
#endif /* !J9VM_ENV_DATA64 */
4059
#if defined(J9SW_NEEDS_JIT_2_INTERP_THUNKS)
4060
jitConfig->old_slow_icallVMprJavaSendPatchupVirtual = (void*)old_slow_icallVMprJavaSendPatchupVirtual;
4061
#endif /* J9SW_NEEDS_JIT_2_INTERP_THUNKS */
4062
jitConfig->c_jitDecompileOnReturn = (void*)c_jitDecompileOnReturn;
4063
jitConfig->c_jitDecompileAtExceptionCatch = (void*)c_jitDecompileAtExceptionCatch;
4064
jitConfig->c_jitReportExceptionCatch = (void*)c_jitReportExceptionCatch;
4065
jitConfig->c_jitDecompileAtCurrentPC = (void*)c_jitDecompileAtCurrentPC;
4066
jitConfig->c_jitDecompileBeforeReportMethodEnter = (void*)c_jitDecompileBeforeReportMethodEnter;
4067
jitConfig->c_jitDecompileBeforeMethodMonitorEnter = (void*)c_jitDecompileBeforeMethodMonitorEnter;
4068
jitConfig->c_jitDecompileAfterAllocation = (void*)c_jitDecompileAfterAllocation;
4069
jitConfig->c_jitDecompileAfterMonitorEnter = (void*)c_jitDecompileAfterMonitorEnter;
4070
jitConfig->old_slow_jitReportInstanceFieldRead = (void*)old_slow_jitReportInstanceFieldRead;
4071
jitConfig->old_slow_jitReportInstanceFieldWrite = (void*)old_slow_jitReportInstanceFieldWrite;
4072
jitConfig->old_slow_jitReportStaticFieldRead = (void*)old_slow_jitReportStaticFieldRead;
4073
jitConfig->old_slow_jitReportStaticFieldWrite = (void*)old_slow_jitReportStaticFieldWrite;
4074
}
4075
4076
} /* extern "C" */
4077
4078