Path: blob/master/runtime/codert_vm/cnathelp.cpp
5985 views
/*******************************************************************************1* Copyright (c) 1991, 2022 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* 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-exception20*******************************************************************************/2122#include "j9.h"23#include "j9protos.h"24#include "j9consts.h"25#include "stackwalk.h"26#include "j9vmnls.h"27#include "objhelp.h"28#include "jitprotos.h"29#include "VMHelpers.hpp"30#include "VMAccess.hpp"31#include "AtomicSupport.hpp"32#include "JITInterface.hpp"33#include "ObjectAccessBarrierAPI.hpp"34#include "MethodMetaData.h"35#include "ut_j9codertvm.h"3637#if defined(OSX) && defined(AARCH64)38#include <pthread.h> // for pthread_jit_write_protect_np39#endif4041#undef DEBUG4243extern "C" {4445void* J9FASTCALL46old_slow_jitThrowNullPointerException(J9VMThread *currentThread);4748J9_EXTERN_BUILDER_SYMBOL(throwCurrentExceptionFromJIT);49J9_EXTERN_BUILDER_SYMBOL(handlePopFramesFromJIT);50#define J9_JITHELPER_ACTION_THROW J9_BUILDER_SYMBOL(throwCurrentExceptionFromJIT)51#define J9_JITHELPER_ACTION_POP_FRAMES J9_BUILDER_SYMBOL(handlePopFramesFromJIT)5253J9_EXTERN_BUILDER_SYMBOL(jitRunOnJavaStack);54#define JIT_RUN_ON_JAVA_STACK(x) (currentThread->tempSlot = (UDATA)(x), J9_BUILDER_SYMBOL(jitRunOnJavaStack))5556#if defined(J9ZOS390) && !defined(J9VM_ENV_DATA64)57/* There is a bug in ZOS xlC which fails to mask one of the PCs if this is done inline */58static VMINLINE bool59samePCs(void *pc1, void *pc2)60{61UDATA x = (UDATA)pc1 ^ (UDATA)pc2;62return (0 == x) || (0x80000000 == x);63}64#else /* J9ZOS390 && !J9VM_ENV_DATA64 */65#define samePCs(pc1, pc2) (MASK_PC(pc1) == MASK_PC(pc2))66#endif /* J9ZOS390 && !J9VM_ENV_DATA64 */6768/**69* Fix the java and decompilation stacks for cases where exceptions can be70* thrown from insde a JIT synthetic exception handler. There must be a71* resolve frame on the top of the java stack with a valid JIT PC.72*73* @param currentThread[in] the current J9VMThread74*/75static void76fixStackForSyntheticHandler(J9VMThread *currentThread)77{78/* If the top decompilation record is for the current compiled frame, re-link the resolve frame79* and decompilation record to keep the stack walkable.80*/81J9JITDecompilationInfo *decomp = currentThread->decompilationStack;82if (NULL != decomp) {83J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;84void *jitPC = MASK_PC(resolveFrame->returnAddress);85J9JITExceptionTable *metaData = jitGetExceptionTableFromPC(currentThread, (UDATA)jitPC);86Assert_CodertVM_false(NULL == metaData);87UDATA *oldSP = (UDATA*)(resolveFrame + 1);88UDATA *bp = oldSP + getJitTotalFrameSize(metaData);89if (bp == decomp->bp) {90/* Use a value which is guaranteed to fail metadata lookup. This makes91* the stack walker get the PC from the decompilation stack.92*/93resolveFrame->returnAddress = NULL;94decomp->pcAddress = (U_8**)&(resolveFrame->returnAddress);95decomp->pc = (U_8*)jitPC;96}97}98}99100/**101* Determine the vTable offset for an interface send to a particular102* receiver. If iTableOffset indicates a direct method, an assertion will103* fire.104*105* @param currentThread[in] the current J9VMThread106* @param receiverClass[in] the J9Class of the receiver107* @param interfaceClass[in] the J9Class of the interface108* @param iTableOffset[in] the iTable offset109*110* @returns the vTable index (0 indicates the mapping failed)111*/112static VMINLINE UDATA113convertITableOffsetToVTableOffset(J9VMThread *currentThread, J9Class *receiverClass, J9Class *interfaceClass, UDATA iTableOffset)114{115UDATA vTableOffset = 0;116J9ITable * iTable = receiverClass->lastITable;117if (interfaceClass == iTable->interfaceClass) {118goto foundITable;119}120121iTable = (J9ITable*)receiverClass->iTable;122while (NULL != iTable) {123if (interfaceClass == iTable->interfaceClass) {124receiverClass->lastITable = iTable;125foundITable:126if (J9_UNEXPECTED(J9_ARE_ANY_BITS_SET(iTableOffset, J9_ITABLE_OFFSET_TAG_BITS))) {127/* Direct methods should not reach here - no possibility of obtaining a vTableOffset */128Assert_CodertVM_false(J9_ARE_ANY_BITS_SET(iTableOffset, J9_ITABLE_OFFSET_DIRECT));129/* Object method in the vTable */130vTableOffset = iTableOffset & ~J9_ITABLE_OFFSET_TAG_BITS;131} else {132/* Standard interface method */133vTableOffset = *(UDATA*)(((UDATA)iTable) + iTableOffset);134}135goto done;136}137iTable = iTable->next;138}139done:140return vTableOffset;141}142143static VMINLINE void*144buildJITResolveFrameWithPC(J9VMThread *currentThread, UDATA flags, UDATA parmCount, bool checkScavengeOnResolve, UDATA spAdjust, void *oldPC)145{146VM_JITInterface::disableRuntimeInstrumentation(currentThread);147oldPC = VM_VMHelpers::buildJITResolveFrameWithPC(currentThread, flags, parmCount, spAdjust, oldPC);148#if defined(J9VM_JIT_GC_ON_RESOLVE_SUPPORT) && defined(J9VM_GC_GENERATIONAL)149if (checkScavengeOnResolve) {150if (J9_ARE_ANY_BITS_SET(currentThread->javaVM->jitConfig->runtimeFlags, J9JIT_SCAVENGE_ON_RESOLVE)) {151jitCheckScavengeOnResolve(currentThread);152}153}154#endif /* J9VM_JIT_GC_ON_RESOLVE_SUPPORT && J9VM_GC_GENERATIONAL */155return oldPC;156}157158void159buildBranchJITResolveFrame(J9VMThread *currentThread, void *pc, UDATA flags)160{161buildJITResolveFrameWithPC(currentThread, flags | J9_SSF_JIT_RESOLVE, 0, false, 0, pc);162}163164static VMINLINE void*165restoreJITResolveFrame(J9VMThread *currentThread, void *oldPC, bool checkAsync = true, bool checkException = true)166{167void* addr = NULL;168J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;169if (checkAsync) {170if (VM_VMHelpers::immediateAsyncPending(currentThread)) {171if (J9_CHECK_ASYNC_POP_FRAMES == currentThread->javaVM->internalVMFunctions->javaCheckAsyncMessages(currentThread, FALSE)) {172addr = J9_JITHELPER_ACTION_POP_FRAMES;173goto done;174}175}176}177if (checkException) {178if (VM_VMHelpers::exceptionPending(currentThread)) {179addr = J9_JITHELPER_ACTION_THROW;180goto done;181}182}183if (NULL != oldPC) {184void *newPC = resolveFrame->returnAddress;185if (!samePCs(oldPC, newPC)) {186addr = JIT_RUN_ON_JAVA_STACK(newPC);187goto done;188}189}190currentThread->jitException = resolveFrame->savedJITException;191currentThread->sp = (UDATA*)(resolveFrame + 1);192VM_JITInterface::enableRuntimeInstrumentation(currentThread);193done:194return addr;195}196197void198restoreBranchJITResolveFrame(J9VMThread *currentThread)199{200restoreJITResolveFrame(currentThread, NULL, false, false);201}202203extern void jitAddPicToPatchOnClassUnload(void *classPointer, void *addressToBePatched);204205J9_EXTERN_BUILDER_SYMBOL(jitTranslateNewInstanceMethod);206J9_EXTERN_BUILDER_SYMBOL(jitInterpretNewInstanceMethod);207J9_EXTERN_BUILDER_SYMBOL(icallVMprJavaSendStatic1);208209#define STATIC_FIELD_REF_BIT(bit) ((IDATA)(bit) << ((8 * sizeof(UDATA)) - J9_REQUIRED_CLASS_SHIFT))210211#if defined(J9VM_ARCH_X86)212213/* x86 common */214215#define JIT_RETURN_ADDRESS ((void*)(currentThread->sp[0]))216217#if defined(J9VM_ENV_DATA64)218219/* x86-64 */220221#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.named.rdi222#define JIT_J2I_METHOD_REGISTER gpr.named.rdi223#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.named.rax224225#else /*J9VM_ENV_DATA64 */226227/* x86-32*/228229#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.named.edi230#define JIT_J2I_METHOD_REGISTER gpr.named.edi231#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.named.eax232#define JIT_LO_U64_RETURN_REGISTER gpr.named.eax233#define JIT_HI_U64_RETURN_REGISTER gpr.named.edx234235#endif /* J9VM_ENV_DATA64 */236237#elif defined(J9VM_ARCH_POWER)238239#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.numbered[12]240#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.numbered[3]241#define JIT_RETURN_ADDRESS_REGISTER lr242#define JIT_J2I_METHOD_REGISTER gpr.numbered[3]243#if defined(J9VM_ENV_LITTLE_ENDIAN)244#define JIT_LO_U64_RETURN_REGISTER gpr.numbered[3]245#define JIT_HI_U64_RETURN_REGISTER gpr.numbered[4]246#else247#define JIT_LO_U64_RETURN_REGISTER gpr.numbered[4]248#define JIT_HI_U64_RETURN_REGISTER gpr.numbered[3]249#endif250251#elif defined(J9VM_ARCH_S390)252253#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.numbered[0]254#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.numbered[2]255#define JIT_RETURN_ADDRESS_REGISTER gpr.numbered[14]256#define JIT_J2I_METHOD_REGISTER gpr.numbered[1]257#define JIT_LO_U64_RETURN_REGISTER gpr.numbered[3]258#define JIT_HI_U64_RETURN_REGISTER gpr.numbered[2]259260#elif defined(J9VM_ARCH_ARM)261262#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.numbered[11]263#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.numbered[0]264#define JIT_RETURN_ADDRESS_REGISTER gpr.numbered[14]265#define JIT_J2I_METHOD_REGISTER gpr.numbered[0]266#define JIT_LO_U64_RETURN_REGISTER gpr.numbered[0]267#define JIT_HI_U64_RETURN_REGISTER gpr.numbered[1]268269#elif defined(J9VM_ARCH_AARCH64)270271#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.numbered[9]272#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.numbered[0]273#define JIT_RETURN_ADDRESS_REGISTER gpr.numbered[30]274#define JIT_J2I_METHOD_REGISTER gpr.numbered[0]275276#elif defined(J9VM_ARCH_RISCV)277278#define JIT_STACK_OVERFLOW_SIZE_REGISTER gpr.named.T6279#define JIT_UDATA_RETURN_VALUE_REGISTER gpr.named.A0280#define JIT_RETURN_ADDRESS_REGISTER gpr.named.RA281#define JIT_J2I_METHOD_REGISTER gpr.named.A0282283#else284#error UNKNOWN PROCESSOR285#endif286287#if defined(J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP)288/* Entirely stack-based arguments */289#define JIT_PARM(number) (currentThread->sp[(number) - 1])290#define JIT_DIRECT_CALL_PARM(number) (currentThread->sp[parmCount - (number)])291#define SET_JIT_DIRECT_CALL_PARM(number, value) JIT_DIRECT_CALL_PARM(number) = (UDATA)(value)292#else /* J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP */293/* Register-based arguments (with stack fallback if necessary) */294#if defined(JIT_RETURN_ADDRESS_REGISTER)295#define JIT_RETURN_ADDRESS ((void*)jitRegisters->JIT_RETURN_ADDRESS_REGISTER)296#endif /* JIT_RETURN_ADDRESS_REGISTER */297#define JIT_PARM_IN_REGISTER(number) (jitRegisters->gpr.numbered[jitArgumentRegisterNumbers[(number) - 1]])298#define JIT_PARM_IN_MEMORY(number) (currentThread->sp[parmCount - (number)])299#define JIT_PARM(number) ((number <= J9SW_ARGUMENT_REGISTER_COUNT) ? JIT_PARM_IN_REGISTER(number) : JIT_PARM_IN_MEMORY(number))300#define JIT_DIRECT_CALL_PARM(number) JIT_PARM(number)301#define SET_JIT_DIRECT_CALL_PARM(number, value) \302do { \303if (number <= J9SW_ARGUMENT_REGISTER_COUNT) { \304JIT_PARM_IN_REGISTER(number) = (UDATA)(value); \305} else { \306JIT_PARM_IN_MEMORY(number) = (UDATA)(value); \307} \308} while(0)309#endif /* J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP */310311#define JIT_STACK_OVERFLOW_SIZE (jitRegisters->JIT_STACK_OVERFLOW_SIZE_REGISTER)312313#define JIT_CLASS_PARM(number) ((J9Class*)JIT_PARM(number))314#define JIT_INT_PARM(number) ((I_32)JIT_PARM(number))315316#define DECLARE_JIT_PARM(type, name, number) type const name = (type)JIT_PARM(number)317#define DECLARE_JIT_CLASS_PARM(name, number) J9Class* const name = JIT_CLASS_PARM(number)318#define DECLARE_JIT_INT_PARM(name, number) I_32 const name = JIT_INT_PARM(number)319320#define JIT_RETURN_UDATA(value) currentThread->returnValue = (UDATA)(value)321322#if defined(J9VM_ENV_DATA64)323#define DECLARE_JIT_U64_PARM(name, number) U_64 const name = (U_64)JIT_PARM(number)324#define JIT_RETURN_U64(value) JIT_RETURN_UDATA(value)325#else /* J9VM_ENV_DATA64 */326#define DECLARE_JIT_U64_PARM(name, number) U_64 const name = *(U_64*)&JIT_PARM(number)327#define JIT_RETURN_U64(value) \328do { \329((J9JITRegisters*)(currentThread->entryLocalStorage->jitGlobalStorageBase))->JIT_HI_U64_RETURN_REGISTER = (UDATA)((value) >> 32); \330((J9JITRegisters*)(currentThread->entryLocalStorage->jitGlobalStorageBase))->JIT_LO_U64_RETURN_REGISTER = (UDATA)((value) & 0xFFFFFFFF); \331} while(0)332#endif /* J9VM_ENV_DATA64 */333334#if defined(J9VM_ARCH_X86)335#define PRESERVE_RETURN_ADDRESS() void* const x86ReturnAddress = currentThread->jitReturnAddress336#define RESTORE_RETURN_ADDRESS() currentThread->jitReturnAddress = x86ReturnAddress337#else338#define PRESERVE_RETURN_ADDRESS() do {} while(0)339#define RESTORE_RETURN_ADDRESS() do {} while(0)340#endif341342#if defined(DEBUG)343#define JIT_HELPER_PROLOGUE() printf("\n" J9_GET_CALLSITE() "\n")344#else345#define JIT_HELPER_PROLOGUE() do {} while(0)346#endif347348#if defined(J9SW_JIT_HELPERS_PASS_PARAMETERS_ON_STACK)349#define SET_PARM_COUNT(count) currentThread->floatTemp4 = (void*)count350#else351#define SET_PARM_COUNT(count) do {} while(0)352#endif /* J9SW_JIT_HELPERS_PASS_PARAMETERS_ON_STACK */353354#define OLD_JIT_HELPER_PROLOGUE(count) \355J9JITRegisters* const jitRegisters = (J9JITRegisters*)(currentThread->entryLocalStorage->jitGlobalStorageBase); \356UDATA const parmCount = (count); \357SET_PARM_COUNT(count); \358JIT_HELPER_PROLOGUE()359360#define OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(count) \361PRESERVE_RETURN_ADDRESS(); \362OLD_JIT_HELPER_PROLOGUE(count)363364#define SLOW_JIT_HELPER_PROLOGUE() \365UDATA const parmCount = (UDATA)currentThread->floatTemp4; \366PRESERVE_RETURN_ADDRESS(); \367JIT_HELPER_PROLOGUE()368369#define SLOW_JIT_HELPER_EPILOGUE() RESTORE_RETURN_ADDRESS()370371#if defined(J9VM_ARCH_X86) && !defined(J9VM_ENV_DATA64)372/* x86-32*/373extern void clearFPStack(void);374#define TIDY_BEFORE_THROW() clearFPStack()375#else /* defined(J9VM_ARCH_X86) && !defined(J9VM_ENV_DATA64) */376#define TIDY_BEFORE_THROW()377#endif /* defined(J9VM_ARCH_X86) && !defined(J9VM_ENV_DATA64) */378379static VMINLINE void*380setCurrentExceptionFromJIT(J9VMThread *currentThread, UDATA exceptionNumber, j9object_t detailMessage)381{382TIDY_BEFORE_THROW();383currentThread->javaVM->internalVMFunctions->setCurrentException(currentThread, exceptionNumber, (UDATA*)detailMessage);384return J9_JITHELPER_ACTION_THROW;385}386387static VMINLINE void*388setNegativeArraySizeExceptionFromJIT(J9VMThread *currentThread, I_32 size)389{390TIDY_BEFORE_THROW();391currentThread->javaVM->internalVMFunctions->setNegativeArraySizeException(currentThread, size);392return J9_JITHELPER_ACTION_THROW;393}394395static VMINLINE void*396setCurrentExceptionNLSFromJIT(J9VMThread *currentThread, UDATA exceptionNumber, U_32 moduleName, U_32 messageNumber)397{398TIDY_BEFORE_THROW();399currentThread->javaVM->internalVMFunctions->setCurrentExceptionNLS(currentThread, exceptionNumber, moduleName, messageNumber);400return J9_JITHELPER_ACTION_THROW;401}402403static VMINLINE void*404setCurrentExceptionUTFFromJIT(J9VMThread *currentThread, UDATA exceptionNumber, const char* errorUTF)405{406TIDY_BEFORE_THROW();407currentThread->javaVM->internalVMFunctions->setCurrentExceptionUTF(currentThread, exceptionNumber, errorUTF);408return J9_JITHELPER_ACTION_THROW;409}410411static VMINLINE void*412setNativeOutOfMemoryErrorFromJIT(J9VMThread *currentThread, U_32 moduleName, U_32 messageNumber)413{414TIDY_BEFORE_THROW();415currentThread->javaVM->internalVMFunctions->setNativeOutOfMemoryError(currentThread, moduleName, messageNumber);416return J9_JITHELPER_ACTION_THROW;417}418419static VMINLINE void*420setHeapOutOfMemoryErrorFromJIT(J9VMThread *currentThread)421{422TIDY_BEFORE_THROW();423currentThread->javaVM->internalVMFunctions->setHeapOutOfMemoryError(currentThread);424return J9_JITHELPER_ACTION_THROW;425}426427static VMINLINE void*428setClassCastExceptionFromJIT(J9VMThread *currentThread, J9Class *instanceClass, J9Class *castClass)429{430TIDY_BEFORE_THROW();431currentThread->javaVM->internalVMFunctions->setClassCastException(currentThread, instanceClass, castClass);432return J9_JITHELPER_ACTION_THROW;433}434435static VMINLINE void*436buildJITResolveFrame(J9VMThread *currentThread, UDATA flags, UDATA helperParmCount, bool checkScavengeOnResolve = true, UDATA spAdjust = 0)437{438void *oldPC = currentThread->jitReturnAddress;439return buildJITResolveFrameWithPC(currentThread, flags, helperParmCount, checkScavengeOnResolve, spAdjust, oldPC);440}441442static VMINLINE void*443buildJITResolveFrameForRuntimeHelper(J9VMThread *currentThread, UDATA helperParmCount)444{445return buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE_RUNTIME_HELPER, helperParmCount);446}447448static VMINLINE void*449buildJITResolveFrameForTrapHandler(J9VMThread *currentThread)450{451/* Trap PC stored in jitException */452void *oldPC = (void*)currentThread->jitException;453currentThread->jitException = NULL;454return buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE, 0, true, 0, oldPC);455}456457static VMINLINE void458buildJITResolveFrameForRuntimeCheck(J9VMThread *currentThread)459{460void *oldPC = currentThread->jitReturnAddress;461#if defined(J9VM_ARCH_X86)462U_8 *pc = (U_8*)oldPC;463U_32 offset = *(U_32*)pc;464pc -= offset; /* compute addr of throwing instruction */465pc += 1; /* move forward by a byte as codegen uses the beginning of instructions */466oldPC = (void*)pc;467#endif /* J9VM_ARCH_X86 */468buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE, 0, true, 0, oldPC);469}470471472static VMINLINE bool473fast_jitNewObjectImpl(J9VMThread *currentThread, J9Class *objectClass, bool checkClassInit, bool nonZeroTLH)474{475bool slowPathRequired = false;476if (checkClassInit) {477if (J9_UNEXPECTED(VM_VMHelpers::classRequiresInitialization(currentThread, objectClass))) {478goto slow;479}480}481if (J9_UNEXPECTED(!J9ROMCLASS_ALLOCATES_VIA_NEW(objectClass->romClass))) {482goto slow;483}484{485UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;486if (nonZeroTLH) {487allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;488}489j9object_t obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateObjectNoGC(currentThread, objectClass, allocationFlags);490if (J9_UNEXPECTED(NULL == obj)) {491goto slow;492}493JIT_RETURN_UDATA(obj);494}495done:496return slowPathRequired;497slow:498currentThread->floatTemp1 = (void*)objectClass;499slowPathRequired = true;500goto done;501}502503static VMINLINE bool504fast_jitNewValueImpl(J9VMThread *currentThread, J9Class *objectClass, bool checkClassInit, bool nonZeroTLH)505{506bool slowPathRequired = false;507if (checkClassInit) {508if (J9_UNEXPECTED(VM_VMHelpers::classRequiresInitialization(currentThread, objectClass))) {509goto slow;510}511}512if (J9_UNEXPECTED(!J9_IS_J9CLASS_VALUETYPE(objectClass))) {513goto slow;514}515{516UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;517if (nonZeroTLH) {518allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;519}520j9object_t obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateObjectNoGC(currentThread, objectClass, allocationFlags);521if (J9_UNEXPECTED(NULL == obj)) {522goto slow;523}524JIT_RETURN_UDATA(obj);525}526done:527return slowPathRequired;528slow:529currentThread->floatTemp1 = (void*)objectClass;530slowPathRequired = true;531goto done;532}533534static VMINLINE void*535slow_jitNewObjectImpl(J9VMThread *currentThread, bool checkClassInit, bool nonZeroTLH)536{537SLOW_JIT_HELPER_PROLOGUE();538J9Class *objectClass = (J9Class*)currentThread->floatTemp1;539j9object_t obj = NULL;540void *oldPC = currentThread->jitReturnAddress;541void *addr = NULL;542UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;543if (nonZeroTLH) {544allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;545}546if (!J9ROMCLASS_ALLOCATES_VIA_NEW(objectClass->romClass)) {547buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);548addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINSTANTIATIONERROR | J9_EX_CTOR_CLASS, J9VM_J9CLASS_TO_HEAPCLASS(objectClass));549goto done;550}551if (checkClassInit) {552if (VM_VMHelpers::classRequiresInitialization(currentThread, objectClass)) {553buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);554currentThread->javaVM->internalVMFunctions->initializeClass(currentThread, objectClass);555addr = restoreJITResolveFrame(currentThread, oldPC);556if (NULL != addr) {557goto done;558}559}560}561buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);562obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateObject(currentThread, objectClass, allocationFlags);563if (NULL == obj) {564addr = setHeapOutOfMemoryErrorFromJIT(currentThread);565goto done;566}567currentThread->floatTemp1 = (void*)obj; // in case of decompile568addr = restoreJITResolveFrame(currentThread, oldPC, false, false);569if (NULL != addr) {570goto done;571}572JIT_RETURN_UDATA(obj);573done:574SLOW_JIT_HELPER_EPILOGUE();575return addr;576}577578static VMINLINE void*579slow_jitNewValueImpl(J9VMThread *currentThread, bool checkClassInit, bool nonZeroTLH)580{581SLOW_JIT_HELPER_PROLOGUE();582J9Class *objectClass = (J9Class*)currentThread->floatTemp1;583j9object_t obj = NULL;584void *oldPC = currentThread->jitReturnAddress;585void *addr = NULL;586UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;587if (nonZeroTLH) {588allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;589}590if (!J9_IS_J9CLASS_VALUETYPE(objectClass)) {591buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);592addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINSTANTIATIONERROR | J9_EX_CTOR_CLASS, J9VM_J9CLASS_TO_HEAPCLASS(objectClass));593goto done;594}595if (checkClassInit) {596if (VM_VMHelpers::classRequiresInitialization(currentThread, objectClass)) {597buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);598currentThread->javaVM->internalVMFunctions->initializeClass(currentThread, objectClass);599addr = restoreJITResolveFrame(currentThread, oldPC);600if (NULL != addr) {601goto done;602}603}604}605buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);606obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateObject(currentThread, objectClass, allocationFlags);607if (NULL == obj) {608addr = setHeapOutOfMemoryErrorFromJIT(currentThread);609goto done;610}611currentThread->floatTemp1 = (void*)obj; // in case of decompile612addr = restoreJITResolveFrame(currentThread, oldPC, false, false);613if (NULL != addr) {614goto done;615}616JIT_RETURN_UDATA(obj);617done:618SLOW_JIT_HELPER_EPILOGUE();619return addr;620}621622623void* J9FASTCALL624old_slow_jitNewObject(J9VMThread *currentThread)625{626return slow_jitNewObjectImpl(currentThread, true, false);627}628629void* J9FASTCALL630old_slow_jitNewValue(J9VMThread *currentThread)631{632return slow_jitNewValueImpl(currentThread, true, false);633}634635void* J9FASTCALL636old_fast_jitNewObject(J9VMThread *currentThread)637{638OLD_JIT_HELPER_PROLOGUE(1);639DECLARE_JIT_CLASS_PARM(objectClass, 1);640void *slowPath = NULL;641if (fast_jitNewObjectImpl(currentThread, objectClass, true, false)) {642slowPath = (void*)old_slow_jitNewObject;643}644return slowPath;645}646647void* J9FASTCALL648old_slow_jitNewObjectNoZeroInit(J9VMThread *currentThread)649{650return slow_jitNewObjectImpl(currentThread, true, true);651}652653void* J9FASTCALL654old_slow_jitNewValueNoZeroInit(J9VMThread *currentThread)655{656return slow_jitNewValueImpl(currentThread, true, true);657}658659void* J9FASTCALL660old_fast_jitNewObjectNoZeroInit(J9VMThread *currentThread)661{662OLD_JIT_HELPER_PROLOGUE(1);663DECLARE_JIT_CLASS_PARM(objectClass, 1);664void *slowPath = NULL;665if (fast_jitNewObjectImpl(currentThread, objectClass, true, true)) {666slowPath = (void*)old_slow_jitNewObjectNoZeroInit;667}668return slowPath;669}670671void* J9FASTCALL672old_slow_jitGetFlattenableField(J9VMThread *currentThread)673{674SLOW_JIT_HELPER_PROLOGUE();675J9RAMFieldRef* cpEntry = (J9RAMFieldRef*) currentThread->floatTemp1;676j9object_t receiver = (j9object_t) currentThread->floatTemp2;677j9object_t returnObject = NULL;678void *rc = NULL;679void *oldPC = currentThread->jitReturnAddress;680681if (NULL == receiver) {682buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);683rc = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);684goto done;685}686687buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);688returnObject = currentThread->javaVM->internalVMFunctions->getFlattenableField(currentThread, cpEntry, receiver, FALSE);689if (NULL == returnObject) {690rc = setHeapOutOfMemoryErrorFromJIT(currentThread);691goto done;692}693694currentThread->floatTemp1 = (void*)returnObject; // in case of decompile695rc = restoreJITResolveFrame(currentThread, oldPC, false, false);696if (NULL != rc) {697goto done;698}699700JIT_RETURN_UDATA(returnObject);701702done:703SLOW_JIT_HELPER_EPILOGUE();704return rc;705}706707void* J9FASTCALL708old_fast_jitGetFlattenableField(J9VMThread *currentThread)709{710OLD_JIT_HELPER_PROLOGUE(2);711DECLARE_JIT_PARM(J9RAMFieldRef*, cpEntry, 1);712DECLARE_JIT_PARM(j9object_t, receiver, 2);713j9object_t returnObject = NULL;714void *rc = NULL;715716if (NULL == receiver) {717goto slow;718}719720returnObject = currentThread->javaVM->internalVMFunctions->getFlattenableField(currentThread, cpEntry, receiver, TRUE);721if (J9_UNEXPECTED(NULL == returnObject)) {722goto slow;723}724JIT_RETURN_UDATA(returnObject);725726done:727return rc;728729slow:730currentThread->floatTemp1 = (void*)cpEntry;731currentThread->floatTemp2 = (void*)receiver;732rc = (void *) old_slow_jitGetFlattenableField;733goto done;734}735736void* J9FASTCALL737old_slow_jitCloneValueType(J9VMThread *currentThread)738{739SLOW_JIT_HELPER_PROLOGUE();740j9object_t reciever = (j9object_t)currentThread->floatTemp1;741j9object_t returnObject = NULL;742void *rc = NULL;743void *oldPC = currentThread->jitReturnAddress;744J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;745746if (NULL == reciever) {747buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);748rc = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);749goto done;750}751752buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);753returnObject = vmFuncs->cloneValueType(currentThread, J9OBJECT_CLAZZ(currentThread, reciever), reciever, FALSE);754if (J9_UNEXPECTED(NULL == returnObject)) {755rc = setHeapOutOfMemoryErrorFromJIT(currentThread);756goto done;757}758759currentThread->floatTemp1 = (void*)returnObject; // in case of decompile760rc = restoreJITResolveFrame(currentThread, oldPC, false, false);761if (NULL != rc) {762goto done;763}764765JIT_RETURN_UDATA(returnObject);766767done:768SLOW_JIT_HELPER_EPILOGUE();769return rc;770771}772773void* J9FASTCALL774old_fast_jitCloneValueType(J9VMThread *currentThread)775{776OLD_JIT_HELPER_PROLOGUE(1);777DECLARE_JIT_PARM(j9object_t, reciever, 1);778j9object_t returnObject = NULL;779void *rc = NULL;780J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;781782if (NULL == reciever) {783goto slow;784}785786returnObject = vmFuncs->cloneValueType(currentThread, J9OBJECT_CLAZZ(currentThread, reciever), reciever, TRUE);787if (J9_UNEXPECTED(NULL == returnObject)) {788goto slow;789}790791JIT_RETURN_UDATA(returnObject);792793done:794return rc;795796slow:797currentThread->floatTemp1 = (void*)reciever;798rc = (void*)old_slow_jitCloneValueType;799goto done;800}801802void* J9FASTCALL803old_slow_jitWithFlattenableField(J9VMThread *currentThread)804{805SLOW_JIT_HELPER_PROLOGUE();806J9RAMFieldRef* cpEntry = (J9RAMFieldRef*) currentThread->floatTemp1;807j9object_t receiver = (j9object_t) currentThread->floatTemp2;808j9object_t paramObject = (j9object_t) currentThread->floatTemp3;809j9object_t returnObject = NULL;810void *rc = NULL;811void *oldPC = currentThread->jitReturnAddress;812J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;813814if (NULL == receiver) {815buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);816rc = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);817goto done;818}819820buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);821returnObject = vmFuncs->cloneValueType(currentThread, J9OBJECT_CLAZZ(currentThread, receiver), receiver, FALSE);822if (J9_UNEXPECTED(NULL == returnObject)) {823rc = setHeapOutOfMemoryErrorFromJIT(currentThread);824goto done;825}826827vmFuncs->putFlattenableField(currentThread, cpEntry, returnObject, paramObject);828829currentThread->floatTemp1 = (void*)returnObject; // in case of decompile830rc = restoreJITResolveFrame(currentThread, oldPC, false, false);831if (NULL != rc) {832goto done;833}834835JIT_RETURN_UDATA(returnObject);836837done:838SLOW_JIT_HELPER_EPILOGUE();839return rc;840841}842843void* J9FASTCALL844old_fast_jitWithFlattenableField(J9VMThread *currentThread)845{846OLD_JIT_HELPER_PROLOGUE(3);847DECLARE_JIT_PARM(J9RAMFieldRef*, cpEntry, 1);848DECLARE_JIT_PARM(j9object_t, receiver, 2);849DECLARE_JIT_PARM(j9object_t, paramObject, 3);850j9object_t returnObject = NULL;851void *rc = NULL;852J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;853854if (NULL == receiver) {855goto slow;856}857858returnObject = vmFuncs->cloneValueType(currentThread, J9OBJECT_CLAZZ(currentThread, receiver), receiver, TRUE);859if (J9_UNEXPECTED(NULL == returnObject)) {860goto slow;861}862863vmFuncs->putFlattenableField(currentThread, cpEntry, returnObject, paramObject);864865JIT_RETURN_UDATA(returnObject);866867done:868return rc;869870slow:871currentThread->floatTemp1 = (void*)cpEntry;872currentThread->floatTemp2 = (void*)receiver;873currentThread->floatTemp3 = (void*)paramObject;874rc = (void *) old_slow_jitWithFlattenableField;875goto done;876}877878void* J9FASTCALL879old_slow_jitPutFlattenableField(J9VMThread *currentThread)880{881/* can only get here if we are throwing an exception */882SLOW_JIT_HELPER_PROLOGUE();883void *rc = NULL;884885buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);886rc = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);887888SLOW_JIT_HELPER_EPILOGUE();889return rc;890}891892void* J9FASTCALL893old_fast_jitPutFlattenableField(J9VMThread *currentThread)894{895OLD_JIT_HELPER_PROLOGUE(3);896DECLARE_JIT_PARM(J9RAMFieldRef*, cpEntry, 1);897DECLARE_JIT_PARM(j9object_t, receiver, 2);898DECLARE_JIT_PARM(j9object_t, paramObject, 3);899j9object_t returnObject = NULL;900void *rc = NULL;901902if (NULL == receiver) {903goto slow;904}905906currentThread->javaVM->internalVMFunctions->putFlattenableField(currentThread, cpEntry, receiver, paramObject);907908done:909return rc;910911slow:912rc = (void *) old_slow_jitPutFlattenableField;913goto done;914}915916void* J9FASTCALL917old_slow_jitGetFlattenableStaticField(J9VMThread *currentThread)918{919return NULL;920}921922void* J9FASTCALL923old_fast_jitGetFlattenableStaticField(J9VMThread *currentThread)924{925return NULL;926}927928void* J9FASTCALL929old_slow_jitPutFlattenableStaticField(J9VMThread *currentThread)930{931return NULL;932}933934void* J9FASTCALL935old_fast_jitPutFlattenableStaticField(J9VMThread *currentThread)936{937return NULL;938}939940void* J9FASTCALL941old_slow_jitLoadFlattenableArrayElement(J9VMThread *currentThread)942{943SLOW_JIT_HELPER_PROLOGUE();944j9object_t arrayObject = (j9object_t)currentThread->floatTemp1;945U_32 index = *(U_32 *)¤tThread->floatTemp2;946void *addr = NULL;947void *oldPC = currentThread->jitReturnAddress;948if (NULL == arrayObject) {949buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);950addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);951} else {952j9object_t value = NULL;953U_32 arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, arrayObject);954if (index >= arrayLength) {955buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);956addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);957} else {958buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);959value = currentThread->javaVM->internalVMFunctions->loadFlattenableArrayElement(currentThread, arrayObject, index, false);960if (NULL == value) {961addr = setHeapOutOfMemoryErrorFromJIT(currentThread);962goto done;963}964currentThread->floatTemp1 = (void*)value; // in case of decompile965addr = restoreJITResolveFrame(currentThread, oldPC, false, false);966if (NULL != addr) {967goto done;968}969JIT_RETURN_UDATA(value);970}971}972done:973SLOW_JIT_HELPER_EPILOGUE();974return addr;975}976977void* J9FASTCALL978old_fast_jitLoadFlattenableArrayElement(J9VMThread *currentThread)979{980OLD_JIT_HELPER_PROLOGUE(2);981DECLARE_JIT_PARM(j9object_t, arrayObject, 1);982DECLARE_JIT_PARM(U_32, index, 2);983bool slowPathUsed = false;984void *slowPath = NULL;985j9object_t value = NULL;986U_32 arrayLength = 0;987if (NULL == arrayObject) {988goto slow;989}990arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, arrayObject);991if (index >= arrayLength) {992goto slow;993}994value = (j9object_t) currentThread->javaVM->internalVMFunctions->loadFlattenableArrayElement(currentThread, arrayObject, index, true);995if (NULL == value) {996J9ArrayClass *arrayObjectClass = (J9ArrayClass *)J9OBJECT_CLAZZ(currentThread, arrayObject);997if (J9_IS_J9CLASS_VALUETYPE(arrayObjectClass->componentType)) {998goto slow;999}1000}1001JIT_RETURN_UDATA(value);1002done:1003return slowPath;1004slow:1005slowPathUsed = true;1006currentThread->floatTemp1 = (void *)arrayObject;1007currentThread->floatTemp2 = *(void **)&index;1008slowPath = (void*)old_slow_jitLoadFlattenableArrayElement;1009goto done;1010}10111012void* J9FASTCALL1013old_slow_jitStoreFlattenableArrayElement(J9VMThread *currentThread)1014{1015SLOW_JIT_HELPER_PROLOGUE();1016j9object_t arrayref = (j9object_t)currentThread->floatTemp1;1017U_32 index = *(U_32 *)¤tThread->floatTemp2;1018j9object_t value = (j9object_t)currentThread->floatTemp3;1019U_32 arrayLength = 0;1020void *addr = NULL;1021buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1022if (NULL == arrayref) {1023addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);1024} else {1025arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, arrayref);1026if (index >= arrayLength) {1027addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);1028} else {1029if (false == VM_VMHelpers::objectArrayStoreAllowed(currentThread, arrayref, value)) {1030addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);1031} else {1032J9ArrayClass *arrayrefClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, arrayref);1033addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);1034}1035}1036}1037SLOW_JIT_HELPER_EPILOGUE();1038return addr;1039}10401041void* J9FASTCALL1042old_fast_jitStoreFlattenableArrayElement(J9VMThread *currentThread)1043{1044OLD_JIT_HELPER_PROLOGUE(3);1045DECLARE_JIT_PARM(j9object_t, arrayref, 1);1046DECLARE_JIT_PARM(U_32, index, 2);1047DECLARE_JIT_PARM(j9object_t, value, 3);10481049bool slowPathUsed = false;1050void *slowPath = NULL;1051U_32 arrayLength = 0;1052J9ArrayClass *arrayrefClass = NULL;1053if (NULL == arrayref) {1054goto slow;1055}1056arrayLength = J9INDEXABLEOBJECT_SIZE(currentThread, arrayref);1057if (index >= arrayLength) {1058goto slow;1059}1060if (false == VM_VMHelpers::objectArrayStoreAllowed(currentThread, arrayref, value)) {1061goto slow;1062}1063arrayrefClass = (J9ArrayClass *) J9OBJECT_CLAZZ(currentThread, arrayref);1064if ((J9_IS_J9CLASS_VALUETYPE(arrayrefClass->componentType)) && (NULL == value)) {1065goto slow;1066}1067currentThread->javaVM->internalVMFunctions->storeFlattenableArrayElement(currentThread, arrayref, index, value);1068done:1069return slowPath;1070slow:1071slowPathUsed = true;1072currentThread->floatTemp1 = (void *)arrayref;1073currentThread->floatTemp2 = *(void **)&index;1074currentThread->floatTemp3 = (void *)value;1075slowPath = (void*)old_slow_jitStoreFlattenableArrayElement;1076goto done;1077}10781079static VMINLINE bool1080fast_jitANewArrayImpl(J9VMThread *currentThread, J9Class *elementClass, I_32 size, bool nonZeroTLH)1081{1082bool slowPathRequired = false;1083J9Class * const arrayClass = elementClass->arrayClass;1084if (J9_UNEXPECTED(NULL == arrayClass)) {1085goto slow;1086}1087if (J9_UNEXPECTED(size < 0)) {1088goto slow;1089}1090{1091UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;1092if (nonZeroTLH) {1093allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;1094}1095j9object_t obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateIndexableObjectNoGC(currentThread, arrayClass, (U_32)size, allocationFlags);1096if (J9_UNEXPECTED(NULL == obj)) {1097goto slow;1098}1099JIT_RETURN_UDATA(obj);1100}1101done:1102return slowPathRequired;1103slow:1104currentThread->floatTemp1 = (void*)(UDATA)elementClass;1105currentThread->floatTemp2 = (void*)(UDATA)size;1106slowPathRequired = true;1107goto done;1108}11091110static VMINLINE void*1111slow_jitANewArrayImpl(J9VMThread *currentThread, bool nonZeroTLH)1112{1113SLOW_JIT_HELPER_PROLOGUE();1114J9Class *elementClass = (J9Class*)currentThread->floatTemp1;1115I_32 size = (I_32)(UDATA)currentThread->floatTemp2;1116J9Class *arrayClass = elementClass->arrayClass;1117j9object_t obj = NULL;1118void *oldPC = currentThread->jitReturnAddress;1119void *addr = NULL;1120UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;1121if (nonZeroTLH) {1122allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;1123}1124if (size < 0) {1125buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1126addr = setNegativeArraySizeExceptionFromJIT(currentThread, size);1127goto done;1128}1129if (NULL == arrayClass) {1130buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1131J9JavaVM *vm = currentThread->javaVM;1132arrayClass = vm->internalVMFunctions->internalCreateArrayClass(currentThread, (J9ROMArrayClass*)J9ROMIMAGEHEADER_FIRSTCLASS(vm->arrayROMClasses), elementClass);1133addr = restoreJITResolveFrame(currentThread, oldPC);1134if (NULL != addr) {1135goto done;1136}1137}1138buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);1139obj = currentThread->javaVM->memoryManagerFunctions->J9AllocateIndexableObject(currentThread, arrayClass, (U_32)size, allocationFlags);1140if (NULL == obj) {1141addr = setHeapOutOfMemoryErrorFromJIT(currentThread);1142goto done;1143}1144currentThread->floatTemp1 = (void*)obj; // in case of decompile1145addr = restoreJITResolveFrame(currentThread, oldPC, false, false);1146if (NULL != addr) {1147goto done;1148}1149JIT_RETURN_UDATA(obj);1150done:1151SLOW_JIT_HELPER_EPILOGUE();1152return addr;1153}11541155void* J9FASTCALL1156old_slow_jitANewArray(J9VMThread *currentThread)1157{1158return slow_jitANewArrayImpl(currentThread, false);1159}11601161void* J9FASTCALL1162old_fast_jitANewArray(J9VMThread *currentThread)1163{1164OLD_JIT_HELPER_PROLOGUE(2);1165DECLARE_JIT_CLASS_PARM(elementClass, 1);1166DECLARE_JIT_INT_PARM(size, 2);1167void *slowPath = NULL;1168if (fast_jitANewArrayImpl(currentThread, elementClass, size, false)) {1169slowPath = (void*)old_slow_jitANewArray;1170}1171return slowPath;1172}11731174void* J9FASTCALL1175old_slow_jitANewArrayNoZeroInit(J9VMThread *currentThread)1176{1177return slow_jitANewArrayImpl(currentThread, true);1178}11791180void* J9FASTCALL1181old_fast_jitANewArrayNoZeroInit(J9VMThread *currentThread)1182{1183OLD_JIT_HELPER_PROLOGUE(2);1184DECLARE_JIT_CLASS_PARM(elementClass, 1);1185DECLARE_JIT_INT_PARM(size, 2);1186void *slowPath = NULL;1187if (fast_jitANewArrayImpl(currentThread, elementClass, size, true)) {1188slowPath = (void*)old_slow_jitANewArrayNoZeroInit;1189}1190return slowPath;1191}11921193static VMINLINE bool1194fast_jitNewArrayImpl(J9VMThread *currentThread, I_32 arrayType, I_32 size, bool nonZeroTLH)1195{1196bool slowPathRequired = true;1197currentThread->floatTemp1 = (void*)(UDATA)arrayType;1198currentThread->floatTemp2 = (void*)(UDATA)size;1199if (size >= 0) {1200J9JavaVM *vm = currentThread->javaVM;1201J9Class *arrayClass = (&(vm->booleanArrayClass))[arrayType - 4];1202UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;1203if (nonZeroTLH) {1204allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;1205}1206j9object_t obj = vm->memoryManagerFunctions->J9AllocateIndexableObjectNoGC(currentThread, arrayClass, (U_32)size, allocationFlags);1207if (NULL != obj) {1208slowPathRequired = false;1209JIT_RETURN_UDATA(obj);1210}1211}1212return slowPathRequired;1213}12141215static VMINLINE void*1216slow_jitNewArrayImpl(J9VMThread *currentThread, bool nonZeroTLH)1217{1218SLOW_JIT_HELPER_PROLOGUE();1219I_32 arrayType = (I_32)(UDATA)currentThread->floatTemp1;1220I_32 size = (I_32)(UDATA)currentThread->floatTemp2;1221J9JavaVM *vm = currentThread->javaVM;1222J9Class *arrayClass = (&(vm->booleanArrayClass))[arrayType - 4];1223j9object_t obj = NULL;1224void *oldPC = currentThread->jitReturnAddress;1225void *addr = NULL;1226UDATA allocationFlags = J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE;1227if (nonZeroTLH) {1228allocationFlags |= J9_GC_ALLOCATE_OBJECT_NON_ZERO_TLH;1229}1230if (size < 0) {1231buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1232addr = setNegativeArraySizeExceptionFromJIT(currentThread, size);1233goto done;1234}1235buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);1236obj = vm->memoryManagerFunctions->J9AllocateIndexableObject(currentThread, arrayClass, (U_32)size, allocationFlags);1237if (NULL == obj) {1238addr = setHeapOutOfMemoryErrorFromJIT(currentThread);1239goto done;1240}1241currentThread->floatTemp1 = (void*)obj; // in case of decompile1242addr = restoreJITResolveFrame(currentThread, oldPC, false, false);1243if (NULL != addr) {1244goto done;1245}1246JIT_RETURN_UDATA(obj);1247done:1248SLOW_JIT_HELPER_EPILOGUE();1249return addr;1250}12511252void* J9FASTCALL1253old_slow_jitNewArray(J9VMThread *currentThread)1254{1255return slow_jitNewArrayImpl(currentThread, false);1256}12571258void* J9FASTCALL1259old_fast_jitNewArray(J9VMThread *currentThread)1260{1261OLD_JIT_HELPER_PROLOGUE(2);1262DECLARE_JIT_INT_PARM(arrayType, 1);1263DECLARE_JIT_INT_PARM(size, 2);1264void *slowPath = NULL;1265if (fast_jitNewArrayImpl(currentThread, arrayType, size, false)) {1266slowPath = (void*)old_slow_jitNewArray;1267}1268return slowPath;1269}12701271void* J9FASTCALL1272old_slow_jitNewArrayNoZeroInit(J9VMThread *currentThread)1273{1274return slow_jitNewArrayImpl(currentThread, true);1275}12761277void* J9FASTCALL1278old_fast_jitNewArrayNoZeroInit(J9VMThread *currentThread)1279{1280OLD_JIT_HELPER_PROLOGUE(2);1281DECLARE_JIT_INT_PARM(arrayType, 1);1282DECLARE_JIT_INT_PARM(size, 2);1283void *slowPath = NULL;1284if (fast_jitNewArrayImpl(currentThread, arrayType, size, true)) {1285slowPath = (void*)old_slow_jitNewArrayNoZeroInit;1286}1287return slowPath;1288}12891290void* J9FASTCALL1291old_slow_jitAMultiNewArray(J9VMThread *currentThread)1292{1293OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);1294DECLARE_JIT_CLASS_PARM(elementClass, 1);1295DECLARE_JIT_INT_PARM(dimensions, 2);1296DECLARE_JIT_PARM(I_32*, dimensionsArray, 3);1297j9object_t obj = NULL;1298void *oldPC = currentThread->jitReturnAddress;1299void *addr = NULL;1300buildJITResolveFrameWithPC(currentThread, J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE | J9_SSF_JIT_RESOLVE, parmCount, true, 0, oldPC);1301obj = currentThread->javaVM->internalVMFunctions->helperMultiANewArray(currentThread, (J9ArrayClass*)elementClass, (UDATA)dimensions, dimensionsArray, J9_GC_ALLOCATE_OBJECT_INSTRUMENTABLE);1302currentThread->floatTemp1 = (void*)obj; // in case of decompile1303addr = restoreJITResolveFrame(currentThread, oldPC);1304if (NULL != addr) {1305goto done;1306}1307JIT_RETURN_UDATA(obj);1308done:1309SLOW_JIT_HELPER_EPILOGUE();1310return addr;1311}13121313void* J9FASTCALL1314old_slow_jitStackOverflow(J9VMThread *currentThread)1315{1316OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(0);1317UDATA frameSize = JIT_STACK_OVERFLOW_SIZE;1318void *oldPC = currentThread->jitReturnAddress;1319void *addr = NULL;1320UDATA sp = (UDATA)currentThread->sp;1321UDATA checkSP = sp - frameSize;1322if ((checkSP > sp) || VM_VMHelpers::shouldGrowForSP(currentThread, (UDATA*)checkSP)) {1323buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_STACK_OVERFLOW, parmCount, true, 0, oldPC);1324checkSP = (UDATA)currentThread->sp - frameSize;1325UDATA currentUsed = (UDATA)currentThread->stackObject->end - checkSP;1326J9JavaVM *vm = currentThread->javaVM;1327UDATA maxStackSize = vm->stackSize;1328if (currentUsed > maxStackSize) {1329throwStackOverflow:1330if (currentThread->privateFlags & J9_PRIVATE_FLAGS_STACK_OVERFLOW) {1331vm->internalVMFunctions->fatalRecursiveStackOverflow(currentThread);1332}1333addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGSTACKOVERFLOWERROR, NULL);1334goto done;1335}1336currentUsed += vm->stackSizeIncrement;1337if (currentUsed > maxStackSize) {1338currentUsed = maxStackSize;1339}1340UDATA growRC = vm->internalVMFunctions->growJavaStack(currentThread, currentUsed);1341if (0 != growRC) {1342goto throwStackOverflow;1343}1344addr = restoreJITResolveFrame(currentThread, oldPC, false, false);1345if (NULL != addr) {1346goto done;1347}1348}1349if (VM_VMHelpers::asyncMessagePending(currentThread)) {1350buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_STACK_OVERFLOW, parmCount, true, 0, oldPC);1351UDATA asyncAction = currentThread->javaVM->internalVMFunctions->javaCheckAsyncMessages(currentThread, TRUE);1352switch(asyncAction) {1353case J9_CHECK_ASYNC_THROW_EXCEPTION:1354addr = J9_JITHELPER_ACTION_THROW;1355goto done;1356case J9_CHECK_ASYNC_POP_FRAMES:1357addr = J9_JITHELPER_ACTION_POP_FRAMES;1358goto done;1359}1360addr = restoreJITResolveFrame(currentThread, oldPC);1361}1362done:1363SLOW_JIT_HELPER_EPILOGUE();1364return addr;1365}13661367void* J9FASTCALL1368old_slow_jitResolveString(J9VMThread *currentThread)1369{1370OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);1371DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);1372DECLARE_JIT_INT_PARM(cpIndex, 2);1373DECLARE_JIT_PARM(void*, jitEIP, 3);1374void *addr = NULL;1375J9RAMStringRef *ramCPEntry = (J9RAMStringRef*)ramConstantPool + cpIndex;1376j9object_t volatile *stringObjectPtr = (j9object_t volatile *)&ramCPEntry->stringObject;1377if (NULL == *stringObjectPtr) {1378buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);1379currentThread->javaVM->internalVMFunctions->resolveStringRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);1380addr = restoreJITResolveFrame(currentThread, jitEIP);1381if (NULL != addr) {1382goto done;1383}1384}1385JIT_RETURN_UDATA(stringObjectPtr);1386done:1387SLOW_JIT_HELPER_EPILOGUE();1388return addr;1389}13901391void J9FASTCALL1392fast_jitAcquireVMAccess(J9VMThread *currentThread)1393{1394JIT_HELPER_PROLOGUE();1395#if defined(J9VM_INTERP_ATOMIC_FREE_JNI)1396VM_VMAccess::inlineEnterVMFromJNI(currentThread);1397#else /* J9VM_INTERP_ATOMIC_FREE_JNI */1398VM_VMAccess::inlineAcquireVMAccessExhaustiveCheck(currentThread);1399#endif /* J9VM_INTERP_ATOMIC_FREE_JNI */1400}14011402void J9FASTCALL1403fast_jitReleaseVMAccess(J9VMThread *currentThread)1404{1405JIT_HELPER_PROLOGUE();1406#if defined(J9VM_INTERP_ATOMIC_FREE_JNI)1407VM_VMAccess::inlineExitVMToJNI(currentThread);1408#else /* J9VM_INTERP_ATOMIC_FREE_JNI */1409VM_VMAccess::inlineReleaseVMAccess(currentThread);1410#endif /* J9VM_INTERP_ATOMIC_FREE_JNI */1411}14121413void* J9FASTCALL1414old_slow_jitCheckAsyncMessages(J9VMThread *currentThread)1415{1416OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(0);1417void *addr = NULL;1418if (VM_VMHelpers::asyncMessagePending(currentThread)) {1419void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount, false);1420if (J9_CHECK_ASYNC_POP_FRAMES == currentThread->javaVM->internalVMFunctions->javaCheckAsyncMessages(currentThread, FALSE)) {1421addr = J9_JITHELPER_ACTION_POP_FRAMES;1422goto done;1423}1424addr = restoreJITResolveFrame(currentThread, oldPC, false, false);1425}1426done:1427SLOW_JIT_HELPER_EPILOGUE();1428return addr;1429}14301431void* J9FASTCALL1432impl_jitClassCastException(J9VMThread *currentThread)1433{1434SLOW_JIT_HELPER_PROLOGUE();1435J9Class* castClass = (J9Class*)currentThread->floatTemp1;1436J9Class* instanceClass = (J9Class*)currentThread->floatTemp2;1437buildJITResolveFrameForRuntimeHelper(currentThread, 0);1438void* exception = setClassCastExceptionFromJIT(currentThread, instanceClass, castClass);1439SLOW_JIT_HELPER_EPILOGUE();1440return exception;1441}14421443void* J9FASTCALL1444old_slow_jitCheckCast(J9VMThread *currentThread)1445{1446SLOW_JIT_HELPER_PROLOGUE();1447J9Class *castClass = (J9Class*)currentThread->floatTemp1;1448j9object_t object = (j9object_t)currentThread->floatTemp2;1449J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);1450buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1451return setClassCastExceptionFromJIT(currentThread, instanceClass, castClass);1452}14531454void* J9FASTCALL1455old_fast_jitCheckCast(J9VMThread *currentThread)1456{1457void *slowPath = NULL;1458OLD_JIT_HELPER_PROLOGUE(2);1459DECLARE_JIT_CLASS_PARM(castClass, 1);1460DECLARE_JIT_PARM(j9object_t, object, 2);1461/* null can be cast to anything, except if castClass is a VT */1462if (NULL != object) {1463J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);1464if (!VM_VMHelpers::inlineCheckCast(instanceClass, castClass)) {1465currentThread->floatTemp1 = (void*)castClass;1466currentThread->floatTemp2 = (void*)object;1467slowPath = (void*)old_slow_jitCheckCast;1468}1469}1470#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)1471else if (J9_IS_J9CLASS_VALUETYPE(castClass)) {1472slowPath = (void*)old_slow_jitThrowNullPointerException;1473}1474#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */1475return slowPath;1476}14771478void* J9FASTCALL1479old_slow_jitCheckCastForArrayStore(J9VMThread *currentThread)1480{1481SLOW_JIT_HELPER_PROLOGUE();1482buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1483return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);1484}14851486void* J9FASTCALL1487old_fast_jitCheckCastForArrayStore(J9VMThread *currentThread)1488{1489void *slowPath = NULL;1490OLD_JIT_HELPER_PROLOGUE(2);1491DECLARE_JIT_CLASS_PARM(castClass, 1);1492DECLARE_JIT_PARM(j9object_t, object, 2);1493/* null can be cast to anything, except if castClass is a VT */1494if (NULL != object) {1495J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);1496if (!VM_VMHelpers::inlineCheckCast(instanceClass, castClass)) {1497slowPath = (void*)old_slow_jitCheckCastForArrayStore;1498}1499}1500#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)1501else if (J9_IS_J9CLASS_VALUETYPE(castClass)) {1502slowPath = (void*)old_slow_jitThrowNullPointerException;1503}1504#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */1505return slowPath;1506}15071508void J9FASTCALL1509old_fast_jitCheckIfFinalizeObject(J9VMThread *currentThread)1510{1511OLD_JIT_HELPER_PROLOGUE(1);1512DECLARE_JIT_PARM(j9object_t, object, 1);1513VM_VMHelpers::checkIfFinalizeObject(currentThread, object);1514}15151516void J9FASTCALL1517old_fast_jitCollapseJNIReferenceFrame(J9VMThread *currentThread)1518{1519JIT_HELPER_PROLOGUE();1520/* The direct JNI code has dropped all pushed JNI refs from the stack, and has called this routine on the java stack */1521UDATA *bp = ((UDATA *)(((J9SFJNINativeMethodFrame*)currentThread->sp) + 1)) - 1;1522currentThread->javaVM->internalVMFunctions->returnFromJNI(currentThread, bp);1523}15241525void* J9FASTCALL1526old_slow_jitHandleArrayIndexOutOfBoundsTrap(J9VMThread *currentThread)1527{1528JIT_HELPER_PROLOGUE();1529buildJITResolveFrameForTrapHandler(currentThread);1530return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);1531}15321533void* J9FASTCALL1534old_slow_jitHandleIntegerDivideByZeroTrap(J9VMThread *currentThread)1535{1536JIT_HELPER_PROLOGUE();1537buildJITResolveFrameForTrapHandler(currentThread);1538return setCurrentExceptionNLSFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARITHMETICEXCEPTION, J9NLS_VM_DIVIDE_BY_ZERO);1539}15401541void* J9FASTCALL1542old_slow_jitHandleNullPointerExceptionTrap(J9VMThread *currentThread)1543{1544JIT_HELPER_PROLOGUE();1545buildJITResolveFrameForTrapHandler(currentThread);1546return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);1547}15481549void* J9FASTCALL1550old_slow_jitHandleInternalErrorTrap(J9VMThread *currentThread)1551{1552JIT_HELPER_PROLOGUE();1553buildJITResolveFrameForTrapHandler(currentThread);1554return setCurrentExceptionUTFFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINTERNALERROR, "SIGBUS");1555}15561557void J9FASTCALL1558old_fast_jitInstanceOf(J9VMThread *currentThread)1559{1560OLD_JIT_HELPER_PROLOGUE(2);1561DECLARE_JIT_CLASS_PARM(castClass, 1);1562DECLARE_JIT_PARM(j9object_t, object, 2);1563UDATA isInstance = 0;1564/* null isn't an instance of anything */1565if (NULL != object) {1566J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);1567if (VM_VMHelpers::inlineCheckCast(instanceClass, castClass)) {1568isInstance = 1;1569}1570}1571JIT_RETURN_UDATA(isInstance);1572}15731574void* J9FASTCALL1575old_slow_jitLookupInterfaceMethod(J9VMThread *currentThread)1576{1577SLOW_JIT_HELPER_PROLOGUE();1578J9Class *receiverClass = (J9Class*)currentThread->floatTemp1;1579UDATA *indexAndLiteralsEA = (UDATA*)currentThread->floatTemp2;1580void *jitEIP = (void*)currentThread->floatTemp3;1581J9Class *interfaceClass = ((J9Class**)indexAndLiteralsEA)[0];1582UDATA iTableOffset = indexAndLiteralsEA[1];1583UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);1584buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_INTERFACE_LOOKUP, parmCount, true, 0, jitEIP);1585if (0 == vTableOffset) {1586setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINCOMPATIBLECLASSCHANGEERROR, NULL);1587} else {1588J9Method* method = *(J9Method**)((UDATA)receiverClass + vTableOffset);1589TIDY_BEFORE_THROW();1590currentThread->javaVM->internalVMFunctions->setIllegalAccessErrorNonPublicInvokeInterface(currentThread, method);1591}1592return J9_JITHELPER_ACTION_THROW;1593}15941595void* J9FASTCALL1596old_fast_jitLookupInterfaceMethod(J9VMThread *currentThread)1597{1598void *slowPath = (void*)old_slow_jitLookupInterfaceMethod;1599OLD_JIT_HELPER_PROLOGUE(3);1600DECLARE_JIT_CLASS_PARM(receiverClass, 1);1601DECLARE_JIT_PARM(UDATA*, indexAndLiteralsEA, 2);1602DECLARE_JIT_PARM(void*, jitEIP, 3);1603currentThread->floatTemp1 = (void*)receiverClass;1604currentThread->floatTemp2 = (void*)indexAndLiteralsEA;1605currentThread->floatTemp3 = (void*)jitEIP;1606J9Class *interfaceClass = ((J9Class**)indexAndLiteralsEA)[0];1607UDATA iTableOffset = indexAndLiteralsEA[1];1608UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);1609if (0 != vTableOffset) {1610J9Method* method = *(J9Method**)((UDATA)receiverClass + vTableOffset);1611if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccPublic)) {1612slowPath = NULL;1613JIT_RETURN_UDATA(vTableOffset);1614}1615}1616return slowPath;1617}16181619void J9FASTCALL1620old_fast_jitLookupDynamicInterfaceMethod(J9VMThread *currentThread)1621{1622OLD_JIT_HELPER_PROLOGUE(3);1623DECLARE_JIT_CLASS_PARM(receiverClass, 1);1624DECLARE_JIT_CLASS_PARM(interfaceClass, 2);1625DECLARE_JIT_PARM(UDATA, iTableIndex, 3);1626UDATA iTableOffset = sizeof(struct J9ITable) + (iTableIndex * sizeof(UDATA));1627UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);1628Assert_CodertVM_false(0 == vTableOffset);1629JIT_RETURN_UDATA(vTableOffset);1630}16311632void* J9FASTCALL1633old_slow_jitLookupDynamicPublicInterfaceMethod(J9VMThread *currentThread)1634{1635SLOW_JIT_HELPER_PROLOGUE();1636J9Method *method = (J9Method*)currentThread->floatTemp1;1637buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1638TIDY_BEFORE_THROW();1639currentThread->javaVM->internalVMFunctions->setIllegalAccessErrorNonPublicInvokeInterface(currentThread, method);1640return J9_JITHELPER_ACTION_THROW;1641}16421643void* J9FASTCALL1644old_fast_jitLookupDynamicPublicInterfaceMethod(J9VMThread *currentThread)1645{1646void *slowPath = (void*)old_slow_jitLookupDynamicPublicInterfaceMethod;1647OLD_JIT_HELPER_PROLOGUE(3);1648DECLARE_JIT_CLASS_PARM(receiverClass, 1);1649DECLARE_JIT_CLASS_PARM(interfaceClass, 2);1650DECLARE_JIT_PARM(UDATA, iTableIndex, 3);1651UDATA iTableOffset = sizeof(struct J9ITable) + (iTableIndex * sizeof(UDATA));1652UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);1653Assert_CodertVM_false(0 == vTableOffset);1654/* The receiver's implementation is required to be public */1655J9Method *method = *(J9Method**)((UDATA)receiverClass + vTableOffset);1656if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccPublic)) {1657slowPath = NULL;1658JIT_RETURN_UDATA(vTableOffset);1659} else {1660currentThread->floatTemp1 = (void*)method;1661}1662return slowPath;1663}16641665void J9FASTCALL1666old_fast_jitMethodIsNative(J9VMThread *currentThread)1667{1668OLD_JIT_HELPER_PROLOGUE(1);1669DECLARE_JIT_PARM(J9Method*, method, 1);1670UDATA isNative = 0;1671if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccNative)) {1672isNative = 1;1673}1674JIT_RETURN_UDATA(isNative);1675}16761677void J9FASTCALL1678old_fast_jitMethodIsSync(J9VMThread *currentThread)1679{1680OLD_JIT_HELPER_PROLOGUE(1);1681DECLARE_JIT_PARM(J9Method*, method, 1);1682UDATA isSync = 0;1683if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccSynchronized)) {1684isSync = 1;1685}1686JIT_RETURN_UDATA(isSync);1687}16881689static VMINLINE bool1690fast_jitMonitorEnterImpl(J9VMThread *currentThread, j9object_t syncObject, bool forMethod)1691{1692bool slowPathRequired = false;1693UDATA monstatus = currentThread->javaVM->internalVMFunctions->objectMonitorEnterNonBlocking(currentThread, syncObject);1694if (monstatus <= J9_OBJECT_MONITOR_BLOCKING) {1695slowPathRequired = true;1696currentThread->floatTemp1 = (void*)monstatus;1697#if JAVA_SPEC_VERSION >= 161698currentThread->floatTemp2 = (void*)syncObject;1699#endif /* JAVA_SPEC_VERSION >= 16 */1700}1701return slowPathRequired;1702}17031704static VMINLINE void*1705slow_jitMonitorEnterImpl(J9VMThread *currentThread, bool forMethod)1706{1707SLOW_JIT_HELPER_PROLOGUE();1708void *addr = NULL;1709UDATA flags = J9_STACK_FLAGS_JIT_RESOLVE_FRAME | (forMethod ? J9_STACK_FLAGS_JIT_METHOD_MONITOR_ENTER_RESOLVE : J9_STACK_FLAGS_JIT_MONITOR_ENTER_RESOLVE);1710IDATA monstatus = (IDATA)(UDATA)currentThread->floatTemp1;1711void *oldPC = buildJITResolveFrame(currentThread, flags, parmCount);1712if (monstatus < J9_OBJECT_MONITOR_BLOCKING) {1713if (forMethod) {1714/* Only mark the outer frame for failed method monitor enter - inline frames have correct maps */1715void * stackMap = NULL;1716void * inlineMap = NULL;1717J9JavaVM *vm = currentThread->javaVM;1718J9JITExceptionTable *metaData = vm->jitConfig->jitGetExceptionTableFromPC(currentThread, (UDATA)oldPC);1719Assert_CodertVM_false(NULL == metaData);1720jitGetMapsFromPC(currentThread, vm, metaData, (UDATA)oldPC, &stackMap, &inlineMap);1721Assert_CodertVM_false(NULL == inlineMap);1722if ((NULL == getJitInlinedCallInfo(metaData)) || (NULL == getFirstInlinedCallSite(metaData, inlineMap))) {1723J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;1724resolveFrame->specialFrameFlags = (resolveFrame->specialFrameFlags & ~J9_STACK_FLAGS_JIT_FRAME_SUB_TYPE_MASK) | J9_STACK_FLAGS_JIT_FAILED_METHOD_MONITOR_ENTER_RESOLVE;1725}1726}1727#if JAVA_SPEC_VERSION >= 161728if (J9_OBJECT_MONITOR_VALUE_TYPE_IMSE == monstatus) {1729j9object_t syncObject = (j9object_t)currentThread->floatTemp2;1730J9Class* badClass = J9OBJECT_CLAZZ(currentThread, syncObject);1731J9UTF8 *className = J9ROMCLASS_CLASSNAME(badClass->romClass);1732TIDY_BEFORE_THROW();1733#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)1734if (J9_IS_J9CLASS_VALUETYPE(badClass)) {1735currentThread->javaVM->internalVMFunctions->setCurrentExceptionNLSWithArgs(currentThread, J9NLS_VM_ERROR_BYTECODE_OBJECTREF_CANNOT_BE_VALUE_TYPE,1736J9VMCONSTANTPOOL_JAVALANGILLEGALMONITORSTATEEXCEPTION, J9UTF8_LENGTH(className), J9UTF8_DATA(className));1737} else1738#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */1739{1740Assert_CodertVM_true(J9_ARE_ALL_BITS_SET(currentThread->javaVM->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_VALUE_BASED_EXCEPTION));1741currentThread->javaVM->internalVMFunctions->setCurrentExceptionNLSWithArgs(currentThread, J9NLS_VM_ERROR_BYTECODE_OBJECTREF_CANNOT_BE_VALUE_BASED,1742J9VMCONSTANTPOOL_JAVALANGVIRTUALMACHINEERROR, J9UTF8_LENGTH(className), J9UTF8_DATA(className));1743}1744addr = J9_JITHELPER_ACTION_THROW;1745goto done;1746}1747#endif /* JAVA_SPEC_VERSION >= 16 */1748if (J9_OBJECT_MONITOR_OOM == monstatus) {1749addr = setNativeOutOfMemoryErrorFromJIT(currentThread, J9NLS_VM_FAILED_TO_ALLOCATE_MONITOR);1750goto done;1751}1752} else {1753currentThread->javaVM->internalVMFunctions->objectMonitorEnterBlocking(currentThread);1754/* Do not check asyncs for synchronized block (non-method) entry, since we now have the monitor,1755* but are not inside an exception range which will unlock the monitor if the checkAsync throws an exception.1756*/1757addr = restoreJITResolveFrame(currentThread, oldPC, forMethod, false);1758}1759done:1760SLOW_JIT_HELPER_EPILOGUE();1761return addr;1762}17631764void* J9FASTCALL1765old_slow_jitMethodMonitorEntry(J9VMThread *currentThread)1766{1767return slow_jitMonitorEnterImpl(currentThread, true);1768}17691770void* J9FASTCALL1771old_fast_jitMethodMonitorEntry(J9VMThread *currentThread)1772{1773OLD_JIT_HELPER_PROLOGUE(1);1774DECLARE_JIT_PARM(j9object_t, syncObject, 1);1775void *slowPath = NULL;1776if (fast_jitMonitorEnterImpl(currentThread, syncObject, true)) {1777slowPath = (void*)old_slow_jitMethodMonitorEntry;1778}1779return slowPath;1780}17811782void* J9FASTCALL1783old_slow_jitMonitorEntry(J9VMThread *currentThread)1784{1785return slow_jitMonitorEnterImpl(currentThread, false);1786}17871788void* J9FASTCALL1789old_fast_jitMonitorEntry(J9VMThread *currentThread)1790{1791OLD_JIT_HELPER_PROLOGUE(1);1792DECLARE_JIT_PARM(j9object_t, syncObject, 1);1793void *slowPath = NULL;1794if (fast_jitMonitorEnterImpl(currentThread, syncObject, false)) {1795slowPath = (void*)old_slow_jitMonitorEntry;1796}1797return slowPath;1798}17991800static VMINLINE bool1801fast_jitMonitorExitImpl(J9VMThread *currentThread, j9object_t syncObject, bool forMethod)1802{1803bool slowPathRequired = true;1804currentThread->floatTemp1 = (void*)syncObject;1805currentThread->floatTemp2 = (void*)J9THREAD_WOULD_BLOCK;1806J9JavaVM *vm = currentThread->javaVM;1807/* If there is a possibility that a hook will be reported from the helper, we need to build a frame */1808if (!J9_EVENT_IS_RESERVED(vm->hookInterface, J9HOOK_VM_MONITOR_CONTENDED_EXIT)) {1809IDATA monstatus = vm->internalVMFunctions->objectMonitorExit(currentThread, syncObject);1810if (0 == monstatus) {1811slowPathRequired = false;1812} else {1813currentThread->floatTemp2 = (void*)J9THREAD_ILLEGAL_MONITOR_STATE;1814}1815}1816return slowPathRequired;1817}18181819static VMINLINE void*1820slow_jitMonitorExitImpl(J9VMThread *currentThread, bool forMethod)1821{1822SLOW_JIT_HELPER_PROLOGUE();1823j9object_t syncObject = (j9object_t)currentThread->floatTemp1;1824IDATA monstatus = (IDATA)(UDATA)currentThread->floatTemp2;1825J9JavaVM *vm = currentThread->javaVM;1826J9InternalVMFunctions *vmFuncs = vm->internalVMFunctions;1827void *oldPC = NULL;1828void *addr = NULL;1829/* J9THREAD_WOULD_BLOCK indicates that the exit hook was reserved */1830if (J9THREAD_WOULD_BLOCK == monstatus) {1831oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1832fixStackForSyntheticHandler(currentThread);1833monstatus = vmFuncs->objectMonitorExit(currentThread, syncObject);1834}1835if (0 != monstatus) {1836if (NULL == oldPC) {1837oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1838fixStackForSyntheticHandler(currentThread);1839}1840addr = setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALMONITORSTATEEXCEPTION, NULL);1841goto done;1842}1843if (NULL != oldPC) {1844addr = restoreJITResolveFrame(currentThread, oldPC);1845}1846done:1847SLOW_JIT_HELPER_EPILOGUE();1848return addr;1849}18501851void* J9FASTCALL1852old_slow_jitMethodMonitorExit(J9VMThread *currentThread)1853{1854return slow_jitMonitorExitImpl(currentThread, true);1855}18561857void* J9FASTCALL1858old_slow_jitThrowIncompatibleReceiver(J9VMThread *currentThread)1859{1860OLD_JIT_HELPER_PROLOGUE(2);1861DECLARE_JIT_CLASS_PARM(receiverClass, 1);1862DECLARE_JIT_CLASS_PARM(currentClass, 2);1863buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);1864TIDY_BEFORE_THROW();1865currentThread->javaVM->internalVMFunctions->setIllegalAccessErrorReceiverNotSameOrSubtypeOfCurrentClass(currentThread, receiverClass, currentClass);1866return J9_JITHELPER_ACTION_THROW;1867}18681869void* J9FASTCALL1870old_fast_jitMethodMonitorExit(J9VMThread *currentThread)1871{1872OLD_JIT_HELPER_PROLOGUE(1);1873DECLARE_JIT_PARM(j9object_t, syncObject, 1);1874void *slowPath = NULL;1875if (fast_jitMonitorExitImpl(currentThread, syncObject, true)) {1876slowPath = (void*)old_slow_jitMethodMonitorExit;1877}1878return slowPath;1879}18801881void* J9FASTCALL1882old_slow_jitMonitorExit(J9VMThread *currentThread)1883{1884return slow_jitMonitorExitImpl(currentThread, false);1885}18861887void* J9FASTCALL1888old_fast_jitMonitorExit(J9VMThread *currentThread)1889{1890OLD_JIT_HELPER_PROLOGUE(1);1891DECLARE_JIT_PARM(j9object_t, syncObject, 1);1892void *slowPath = NULL;1893if (fast_jitMonitorExitImpl(currentThread, syncObject, false)) {1894slowPath = (void*)old_slow_jitMonitorExit;1895}1896return slowPath;1897}18981899static VMINLINE void*1900jitReportMethodEnterImpl(J9VMThread *currentThread, J9Method *method, j9object_t receiver, bool isStatic)1901{1902SLOW_JIT_HELPER_PROLOGUE();1903J9JavaVM *vm = currentThread->javaVM;1904void *addr = NULL;1905bool hooked = J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_METHOD_ENTER);1906bool traced = VM_VMHelpers::methodBeingTraced(vm, method);1907if (hooked || traced) {1908void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);1909j9object_t* receiverAddress = NULL;1910if (!isStatic) {1911/* The current value of the jitException slot is preserved in the resolve frame, so it can be safely overwritten */1912receiverAddress = &(currentThread->jitException);1913*receiverAddress = receiver;1914}1915if (traced) {1916UTSI_TRACEMETHODENTER_FROMVM(vm, currentThread, method, (void*)receiverAddress, 1);1917}1918if (hooked) {1919ALWAYS_TRIGGER_J9HOOK_VM_METHOD_ENTER(vm->hookInterface, currentThread, method, (void*)receiverAddress, 1);1920}1921addr = restoreJITResolveFrame(currentThread, oldPC, true, false);1922}1923SLOW_JIT_HELPER_EPILOGUE();1924return addr;1925}19261927void* J9FASTCALL1928old_slow_jitReportMethodEnter(J9VMThread *currentThread)1929{1930OLD_JIT_HELPER_PROLOGUE(2);1931DECLARE_JIT_PARM(J9Method*, method, 1);1932DECLARE_JIT_PARM(j9object_t, receiver, 2);1933return jitReportMethodEnterImpl(currentThread, method, receiver, false);1934}19351936void* J9FASTCALL1937old_slow_jitReportStaticMethodEnter(J9VMThread *currentThread)1938{1939OLD_JIT_HELPER_PROLOGUE(1);1940DECLARE_JIT_PARM(J9Method*, method, 1);1941return jitReportMethodEnterImpl(currentThread, method, NULL, true);1942}19431944void* J9FASTCALL1945old_slow_jitReportMethodExit(J9VMThread *currentThread)1946{1947OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);1948DECLARE_JIT_PARM(J9Method*, method, 1);1949DECLARE_JIT_PARM(void*, returnValueAddress, 2);1950J9JavaVM *vm = currentThread->javaVM;1951void *addr = NULL;1952bool hooked = J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_METHOD_RETURN);1953bool traced = VM_VMHelpers::methodBeingTraced(vm, method);1954if (hooked || traced) {1955void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);1956if (traced) {1957UTSI_TRACEMETHODEXIT_FROMVM(vm, currentThread, method, NULL, returnValueAddress, 1);1958}1959if (hooked) {1960ALWAYS_TRIGGER_J9HOOK_VM_METHOD_RETURN(vm->hookInterface, currentThread, method, FALSE, returnValueAddress, 1);1961}1962addr = restoreJITResolveFrame(currentThread, oldPC, true, false);1963}1964SLOW_JIT_HELPER_EPILOGUE();1965return addr;1966}19671968void* J9FASTCALL1969old_slow_jitResolveClass(J9VMThread *currentThread)1970{1971OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);1972DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);1973DECLARE_JIT_INT_PARM(cpIndex, 2);1974DECLARE_JIT_PARM(void*, jitEIP, 3);1975void *addr = NULL;1976J9Class *clazz = NULL;1977// remove until matching fix comes from TR1978// clazz = ((J9RAMClassRef*)ramConstantPool)[cpIndex].value;1979if (NULL == clazz) {1980buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);1981clazz = currentThread->javaVM->internalVMFunctions->resolveClassRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);1982addr = restoreJITResolveFrame(currentThread, jitEIP);1983if (NULL != addr) {1984goto done;1985}1986}1987JIT_RETURN_UDATA(clazz);1988done:1989SLOW_JIT_HELPER_EPILOGUE();1990return addr;1991}19921993void* J9FASTCALL1994old_slow_jitResolveClassFromStaticField(J9VMThread *currentThread)1995{1996OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);1997DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);1998DECLARE_JIT_INT_PARM(cpIndex, 2);1999DECLARE_JIT_PARM(void*, jitEIP, 3);2000void *addr = NULL;2001J9RAMStaticFieldRef *ramStaticFieldRef = (J9RAMStaticFieldRef*)ramConstantPool + cpIndex;2002IDATA flagsAndClass = ramStaticFieldRef->flagsAndClass;2003UDATA valueOffset = ramStaticFieldRef->valueOffset;2004if (J9_UNEXPECTED(!VM_VMHelpers::staticFieldRefIsResolved(flagsAndClass, valueOffset))) {2005buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2006J9RAMStaticFieldRef localRef;2007currentThread->javaVM->internalVMFunctions->resolveStaticFieldRefInto(currentThread, NULL, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE, NULL, &localRef);2008addr = restoreJITResolveFrame(currentThread, jitEIP);2009if (NULL != addr) {2010goto done;2011}2012flagsAndClass = localRef.flagsAndClass;2013}2014JIT_RETURN_UDATA(((UDATA)flagsAndClass) << J9_REQUIRED_CLASS_SHIFT);2015done:2016SLOW_JIT_HELPER_EPILOGUE();2017return addr;2018}20192020void J9FASTCALL2021old_fast_jitResolvedFieldIsVolatile(J9VMThread *currentThread)2022{2023OLD_JIT_HELPER_PROLOGUE(3);2024DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2025DECLARE_JIT_PARM(UDATA, cpIndex, 2);2026DECLARE_JIT_PARM(UDATA, isStatic, 3);2027UDATA isVolatile = 0;2028if (isStatic) {2029if (J9_ARE_ANY_BITS_SET(((J9RAMStaticFieldRef*)ramConstantPool)[cpIndex].flagsAndClass, STATIC_FIELD_REF_BIT(J9StaticFieldRefVolatile))) {2030isVolatile = 1;2031}2032} else {2033if (J9_ARE_ANY_BITS_SET(((J9RAMFieldRef*)ramConstantPool)[cpIndex].flags, J9AccVolatile)) {2034isVolatile = 1;2035}2036}2037JIT_RETURN_UDATA(isVolatile);2038}20392040static VMINLINE void*2041old_slow_jitResolveFieldImpl(J9VMThread *currentThread, UDATA parmCount, J9ConstantPool *ramConstantPool, UDATA cpIndex, void *jitEIP, bool isSetter, bool direct)2042{2043J9Method *method = NULL;2044UDATA resolveFlags = J9_RESOLVE_FLAG_RUNTIME_RESOLVE;2045J9JavaVM *vm = currentThread->javaVM;2046buildJITResolveFrameWithPC(currentThread, direct ? J9_SSF_JIT_RESOLVE : J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2047if (isSetter) {2048J9StackWalkState *walkState = currentThread->stackWalkState;2049walkState->walkThread = currentThread;2050walkState->skipCount = 0;2051walkState->flags = J9_STACKWALK_VISIBLE_ONLY | J9_STACKWALK_COUNT_SPECIFIED;2052walkState->maxFrames = 1;2053vm->walkStackFrames(currentThread, walkState);2054method = walkState->method;2055resolveFlags |= J9_RESOLVE_FLAG_FIELD_SETTER;2056}2057UDATA valueOffset = vm->internalVMFunctions->resolveInstanceFieldRef(currentThread, method, ramConstantPool, cpIndex, resolveFlags, NULL);2058void *addr = restoreJITResolveFrame(currentThread, jitEIP);2059if (NULL != addr) {2060goto done;2061}2062valueOffset += J9VMTHREAD_OBJECT_HEADER_SIZE(currentThread);2063JIT_RETURN_UDATA(valueOffset);2064done:2065return addr;2066}20672068void* J9FASTCALL2069old_slow_jitResolveField(J9VMThread *currentThread)2070{2071OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2072DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2073DECLARE_JIT_INT_PARM(cpIndex, 2);2074DECLARE_JIT_PARM(void*, jitEIP, 3);2075void *addr = old_slow_jitResolveFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, false, false);2076SLOW_JIT_HELPER_EPILOGUE();2077return addr;2078}20792080void* J9FASTCALL2081old_slow_jitResolveFieldSetter(J9VMThread *currentThread)2082{2083OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2084DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2085DECLARE_JIT_INT_PARM(cpIndex, 2);2086DECLARE_JIT_PARM(void*, jitEIP, 3);2087void *addr = old_slow_jitResolveFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, true, false);2088SLOW_JIT_HELPER_EPILOGUE();2089return addr;2090}20912092void* J9FASTCALL2093old_slow_jitResolveFieldDirect(J9VMThread *currentThread)2094{2095OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);2096DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2097DECLARE_JIT_INT_PARM(cpIndex, 2);2098void *jitEIP = currentThread->jitReturnAddress;2099void *addr = old_slow_jitResolveFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, false, true);2100SLOW_JIT_HELPER_EPILOGUE();2101return addr;2102}21032104void* J9FASTCALL2105old_slow_jitResolveFieldSetterDirect(J9VMThread *currentThread)2106{2107OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);2108DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2109DECLARE_JIT_INT_PARM(cpIndex, 2);2110void *jitEIP = currentThread->jitReturnAddress;2111void *addr = old_slow_jitResolveFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, true, true);2112SLOW_JIT_HELPER_EPILOGUE();2113return addr;2114}21152116static VMINLINE void*2117old_slow_jitResolveStaticFieldImpl(J9VMThread *currentThread, UDATA parmCount, J9ConstantPool *ramConstantPool, UDATA cpIndex, void *jitEIP, bool isSetter, bool direct)2118{2119J9JavaVM *vm = currentThread->javaVM;2120J9Method *method = NULL;2121UDATA resolveFlags = J9_RESOLVE_FLAG_RUNTIME_RESOLVE | J9_RESOLVE_FLAG_CHECK_CLINIT;2122buildJITResolveFrameWithPC(currentThread, direct ? J9_SSF_JIT_RESOLVE : J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2123if (isSetter) {2124J9StackWalkState *walkState = currentThread->stackWalkState;2125walkState->walkThread = currentThread;2126walkState->skipCount = 0;2127walkState->flags = J9_STACKWALK_VISIBLE_ONLY | J9_STACKWALK_COUNT_SPECIFIED;2128walkState->maxFrames = 1;2129vm->walkStackFrames(currentThread, walkState);2130method = walkState->method;2131resolveFlags |= J9_RESOLVE_FLAG_FIELD_SETTER;2132}2133UDATA field = (UDATA)vm->internalVMFunctions->resolveStaticFieldRef(currentThread, method, ramConstantPool, cpIndex, resolveFlags, NULL);2134if ((UDATA)-1 == field) {2135/* fetch result from floatTemp - stashed there in clinit case */2136J9RAMStaticFieldRef *fakeRef = (J9RAMStaticFieldRef*)¤tThread->floatTemp1;2137/* Resolve call indicated success - no need for extra putstatic checks, and the ref2138* must contain valid resolved information.2139*/2140field = (UDATA)VM_VMHelpers::staticFieldAddressFromResolvedRef(fakeRef->flagsAndClass, fakeRef->valueOffset);2141/* Direct resolves do not patch the code cache, so do not need the clinit tag */2142if (!direct) {2143/* tag result as being from a clinit */2144field |= J9_RESOLVE_STATIC_FIELD_TAG_FROM_CLINIT;2145}2146}2147void *addr = restoreJITResolveFrame(currentThread, jitEIP);2148if (NULL == addr) {2149JIT_RETURN_UDATA(field);2150}2151return addr;2152}21532154void* J9FASTCALL2155old_slow_jitResolveStaticField(J9VMThread *currentThread)2156{2157OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2158DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2159DECLARE_JIT_INT_PARM(cpIndex, 2);2160DECLARE_JIT_PARM(void*, jitEIP, 3);2161void *addr = old_slow_jitResolveStaticFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, false, false);2162SLOW_JIT_HELPER_EPILOGUE();2163return addr;2164}21652166void* J9FASTCALL2167old_slow_jitResolveStaticFieldSetter(J9VMThread *currentThread)2168{2169OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2170DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2171DECLARE_JIT_INT_PARM(cpIndex, 2);2172DECLARE_JIT_PARM(void*, jitEIP, 3);2173void *addr = old_slow_jitResolveStaticFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, true, false);2174SLOW_JIT_HELPER_EPILOGUE();2175return addr;2176}21772178void* J9FASTCALL2179old_slow_jitResolveStaticFieldDirect(J9VMThread *currentThread)2180{2181OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);2182DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2183DECLARE_JIT_INT_PARM(cpIndex, 2);2184void *jitEIP = currentThread->jitReturnAddress;2185void *addr = old_slow_jitResolveStaticFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, false, true);2186SLOW_JIT_HELPER_EPILOGUE();2187return addr;2188}21892190void* J9FASTCALL2191old_slow_jitResolveStaticFieldSetterDirect(J9VMThread *currentThread)2192{2193OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);2194DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2195DECLARE_JIT_INT_PARM(cpIndex, 2);2196void *jitEIP = currentThread->jitReturnAddress;2197void *addr = old_slow_jitResolveStaticFieldImpl(currentThread, parmCount, ramConstantPool, cpIndex, jitEIP, true, true);2198SLOW_JIT_HELPER_EPILOGUE();2199return addr;2200}22012202void* J9FASTCALL2203old_slow_jitResolveInterfaceMethod(J9VMThread *currentThread)2204{2205OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);2206DECLARE_JIT_PARM(UDATA*, indexAndLiteralsEA, 1);2207DECLARE_JIT_PARM(void*, jitEIP, 2);2208void *addr = NULL;2209retry:2210J9ConstantPool *ramConstantPool = ((J9ConstantPool**)indexAndLiteralsEA)[0];2211UDATA cpIndex = indexAndLiteralsEA[1];2212J9RAMInterfaceMethodRef *ramMethodRef = (J9RAMInterfaceMethodRef*)ramConstantPool + cpIndex;2213J9Class* const interfaceClass = (J9Class*)ramMethodRef->interfaceClass;2214UDATA const methodIndexAndArgCount = ramMethodRef->methodIndexAndArgCount;2215if (!J9RAMINTERFACEMETHODREF_RESOLVED(interfaceClass, methodIndexAndArgCount)) {2216buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_INTERFACE_METHOD, parmCount, true, 0, jitEIP);2217currentThread->javaVM->internalVMFunctions->resolveInterfaceMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2218addr = restoreJITResolveFrame(currentThread, jitEIP);2219if (NULL != addr) {2220goto done;2221}2222goto retry;2223} else {2224#if defined(OSX) && defined(AARCH64)2225pthread_jit_write_protect_np(0);2226#endif2227indexAndLiteralsEA[2] = (UDATA)interfaceClass;2228UDATA methodIndex = methodIndexAndArgCount >> J9_ITABLE_INDEX_SHIFT;2229UDATA iTableOffset = 0;2230if (J9_ARE_ANY_BITS_SET(methodIndexAndArgCount, J9_ITABLE_INDEX_METHOD_INDEX)) {2231/* Direct method - methodIndex is an index into the method list of either Object or interfaceClass */2232J9Class *methodClass = interfaceClass;2233if (J9_ARE_ANY_BITS_SET(methodIndexAndArgCount, J9_ITABLE_INDEX_OBJECT)) {2234methodClass = J9VMJAVALANGOBJECT_OR_NULL(currentThread->javaVM);2235}2236iTableOffset = ((UDATA)(methodClass->ramMethods + methodIndex)) | J9_ITABLE_OFFSET_DIRECT;2237} else if (J9_ARE_ANY_BITS_SET(methodIndexAndArgCount, J9_ITABLE_INDEX_OBJECT)) {2238/* Virtual Object method - methodIndex is the vTable offset */2239iTableOffset = methodIndex | J9_ITABLE_OFFSET_VIRTUAL;2240} else {2241/* Standard interface method - methodIndex is an index into the iTable */2242iTableOffset = (methodIndex * sizeof(UDATA)) + sizeof(J9ITable);2243}2244indexAndLiteralsEA[3] = iTableOffset;2245#if defined(OSX) && defined(AARCH64)2246pthread_jit_write_protect_np(1);2247#endif2248JIT_RETURN_UDATA(1);2249}2250done:2251SLOW_JIT_HELPER_EPILOGUE();2252return addr;2253}22542255void* J9FASTCALL2256old_slow_jitResolveSpecialMethod(J9VMThread *currentThread)2257{2258OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2259DECLARE_JIT_PARM(void*, jitEIP, 1);2260DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 2);2261DECLARE_JIT_INT_PARM(cpIndex, 3);2262J9Method *method = NULL;2263buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_SPECIAL_METHOD, parmCount, true, 0, jitEIP);2264/* 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 */2265if (J9_ARE_ANY_BITS_SET(cpIndex, J9_SPECIAL_SPLIT_TABLE_INDEX_FLAG)) {2266method = currentThread->javaVM->internalVMFunctions->resolveSpecialSplitMethodRef(currentThread, ramConstantPool, cpIndex & J9_SPLIT_TABLE_INDEX_MASK, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2267} else {2268method = currentThread->javaVM->internalVMFunctions->resolveSpecialMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2269}2270void *addr = restoreJITResolveFrame(currentThread, jitEIP);2271if (NULL == addr) {2272JIT_RETURN_UDATA(method);2273}2274SLOW_JIT_HELPER_EPILOGUE();2275return addr;2276}22772278void* J9FASTCALL2279old_slow_jitResolveStaticMethod(J9VMThread *currentThread)2280{2281OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2282DECLARE_JIT_PARM(void*, jitEIP, 1);2283DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 2);2284DECLARE_JIT_INT_PARM(cpIndex, 3);2285UDATA method = 0;2286buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_STATIC_METHOD, parmCount, true, 0, jitEIP);2287/* 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 */2288if (J9_ARE_ANY_BITS_SET(cpIndex, J9_STATIC_SPLIT_TABLE_INDEX_FLAG)) {2289method = (UDATA)currentThread->javaVM->internalVMFunctions->resolveStaticSplitMethodRef(currentThread, ramConstantPool, cpIndex & J9_SPLIT_TABLE_INDEX_MASK, J9_RESOLVE_FLAG_RUNTIME_RESOLVE | J9_RESOLVE_FLAG_CHECK_CLINIT);2290} else {2291method = (UDATA)currentThread->javaVM->internalVMFunctions->resolveStaticMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE | J9_RESOLVE_FLAG_CHECK_CLINIT);2292}2293if ((UDATA)-1 == method) {2294/* fetch result from floatTemp - stashed there in clinit case */2295J9RAMStaticMethodRef *fakeRef = (J9RAMStaticMethodRef*)¤tThread->floatTemp1;2296method = (UDATA)fakeRef->method;2297/* tag result as being from a clinit */2298method |= J9_RESOLVE_STATIC_FIELD_TAG_FROM_CLINIT;2299}2300void *addr = restoreJITResolveFrame(currentThread, jitEIP);2301if (NULL == addr) {2302JIT_RETURN_UDATA(method);2303}2304SLOW_JIT_HELPER_EPILOGUE();2305return addr;2306}23072308void* J9FASTCALL2309old_slow_jitResolveVirtualMethod(J9VMThread *currentThread)2310{2311OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);2312DECLARE_JIT_PARM(UDATA*, indexAndLiteralsEA, 1);2313DECLARE_JIT_PARM(void*, jitEIP, 2);2314void *addr = NULL;2315retry:2316J9ConstantPool *ramConstantPool = ((J9ConstantPool**)indexAndLiteralsEA)[0];2317UDATA cpIndex = indexAndLiteralsEA[1];2318J9RAMVirtualMethodRef *ramMethodRef = (J9RAMVirtualMethodRef*)ramConstantPool + cpIndex;2319UDATA vTableOffset = ramMethodRef->methodIndexAndArgCount >> 8;2320if (J9VTABLE_INITIAL_VIRTUAL_OFFSET == vTableOffset) {2321buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_VIRTUAL_METHOD, parmCount, true, 0, jitEIP);2322currentThread->javaVM->internalVMFunctions->resolveVirtualMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE, NULL);2323addr = restoreJITResolveFrame(currentThread, jitEIP);2324if (NULL != addr) {2325goto done;2326}2327goto retry;2328}2329if (J9VTABLE_INVOKE_PRIVATE_OFFSET == vTableOffset) {2330UDATA method = ((UDATA)ramMethodRef->method) | J9_VTABLE_INDEX_DIRECT_METHOD_FLAG;2331JIT_RETURN_UDATA(method);2332goto done;2333}2334JIT_RETURN_UDATA(sizeof(J9Class) - vTableOffset);2335done:2336SLOW_JIT_HELPER_EPILOGUE();2337return addr;2338}23392340void* J9FASTCALL2341old_slow_jitResolveMethodType(J9VMThread *currentThread)2342{2343OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2344DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2345DECLARE_JIT_INT_PARM(cpIndex, 2);2346DECLARE_JIT_PARM(void*, jitEIP, 3);2347void *addr = NULL;2348retry:2349J9RAMMethodTypeRef *ramRef = (J9RAMMethodTypeRef*)ramConstantPool + cpIndex;2350j9object_t *methodTypePtr = &ramRef->type;2351if (NULL == *methodTypePtr) {2352buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2353currentThread->javaVM->internalVMFunctions->resolveMethodTypeRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2354addr = restoreJITResolveFrame(currentThread, jitEIP);2355if (NULL != addr) {2356goto done;2357}2358goto retry;2359}2360JIT_RETURN_UDATA(methodTypePtr);2361done:2362SLOW_JIT_HELPER_EPILOGUE();2363return addr;2364}23652366void* J9FASTCALL2367old_slow_jitResolveMethodHandle(J9VMThread *currentThread)2368{2369OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2370DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2371DECLARE_JIT_INT_PARM(cpIndex, 2);2372DECLARE_JIT_PARM(void*, jitEIP, 3);2373void *addr = NULL;2374retry:2375J9RAMMethodHandleRef *ramRef = (J9RAMMethodHandleRef*)ramConstantPool + cpIndex;2376j9object_t *methodHandlePtr = &ramRef->methodHandle;2377if (NULL == *methodHandlePtr) {2378buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2379currentThread->javaVM->internalVMFunctions->resolveMethodHandleRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2380addr = restoreJITResolveFrame(currentThread, jitEIP);2381if (NULL != addr) {2382goto done;2383}2384goto retry;2385}2386JIT_RETURN_UDATA(methodHandlePtr);2387done:2388SLOW_JIT_HELPER_EPILOGUE();2389return addr;2390}23912392void* J9FASTCALL2393old_slow_jitResolveInvokeDynamic(J9VMThread *currentThread)2394{2395OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2396DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2397DECLARE_JIT_INT_PARM(index, 2);2398DECLARE_JIT_PARM(void*, jitEIP, 3);2399void *addr = NULL;2400retry:2401J9Class *methodClass = ramConstantPool->ramClass;2402j9object_t *callsitePtr = methodClass->callSites + index;2403if (NULL == *callsitePtr) {2404buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2405currentThread->javaVM->internalVMFunctions->resolveInvokeDynamic(currentThread, ramConstantPool, index, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2406addr = restoreJITResolveFrame(currentThread, jitEIP);2407if (NULL != addr) {2408goto done;2409}2410goto retry;2411}2412JIT_RETURN_UDATA(callsitePtr);2413done:2414SLOW_JIT_HELPER_EPILOGUE();2415return addr;2416}24172418void* J9FASTCALL2419old_slow_jitResolveConstantDynamic(J9VMThread *currentThread)2420{2421OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2422DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2423DECLARE_JIT_INT_PARM(cpIndex, 2);2424DECLARE_JIT_PARM(void*, jitEIP, 3);2425void *addr = NULL;2426J9JavaVM *vm = currentThread->javaVM;2427retry:2428J9RAMConstantDynamicRef *ramCPEntry = (J9RAMConstantDynamicRef*)ramConstantPool + cpIndex;2429j9object_t *constantDynamicValue = &ramCPEntry->value;24302431/* Check if the value is resolved, Void.Class exception represents a valid null reference */2432if ((NULL == *constantDynamicValue) && (ramCPEntry->exception != vm->voidReflectClass->classObject)) {2433/* If entry resolved to an exception previously, same exception will be set by resolution code */2434buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2435vm->internalVMFunctions->resolveConstantDynamic(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2436addr = restoreJITResolveFrame(currentThread, jitEIP);2437if (NULL != addr) {2438goto done;2439}2440goto retry;2441}2442JIT_RETURN_UDATA(constantDynamicValue);2443done:2444SLOW_JIT_HELPER_EPILOGUE();2445return addr;2446}24472448void* J9FASTCALL2449old_slow_jitResolveHandleMethod(J9VMThread *currentThread)2450{2451OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2452DECLARE_JIT_PARM(J9ConstantPool*, ramConstantPool, 1);2453DECLARE_JIT_INT_PARM(cpIndex, 2);2454DECLARE_JIT_PARM(void*, jitEIP, 3);2455void *addr = NULL;2456J9JavaVM *vm = currentThread->javaVM;24572458#if defined(J9VM_OPT_OPENJDK_METHODHANDLE)2459J9RAMMethodRef *ramMethodRef = ((J9RAMMethodRef*)ramConstantPool) + cpIndex;2460UDATA invokeCacheIndex = ramMethodRef->methodIndexAndArgCount >> 8;2461retry:2462j9object_t *invokeCacheArray = &((J9_CLASS_FROM_CP(ramConstantPool)->invokeCache)[invokeCacheIndex]);2463if (NULL == *invokeCacheArray) {2464buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2465/* add new resolve code which calls sendResolveInvokeHandle -> MHN.linkMethod()2466* store the memberName/appendix values in invokeCache[invokeCacheIndex]2467*/2468vm->internalVMFunctions->resolveOpenJDKInvokeHandle(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2469addr = restoreJITResolveFrame(currentThread, jitEIP);2470if (NULL != addr) {2471goto done;2472}2473goto retry;2474}2475JIT_RETURN_UDATA(invokeCacheArray);2476#else /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */2477j9object_t *methodTypePtr = NULL;2478j9object_t *methodTypeTablePtr = NULL;2479UDATA methodTypeIndex = 0;2480J9Class *methodClass = ramConstantPool->ramClass;2481J9ROMConstantPoolItem *romConstantPool = ramConstantPool->romConstantPool;2482J9ROMMethodRef *romMethodRef = (J9ROMMethodRef *)&(ramConstantPool->romConstantPool[cpIndex]);2483U_32 classRefCPIndex = romMethodRef->classRefCPIndex;2484J9RAMClassRef *ramClassRef = ((J9RAMClassRef *)ramConstantPool) + classRefCPIndex;2485J9Class *targetClass = ramClassRef->value;24862487/* Ensure that the call site class ref is resolved */2488if (NULL == targetClass) {2489buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2490targetClass = vm->internalVMFunctions->resolveClassRef(currentThread, ramConstantPool, classRefCPIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE);2491addr = restoreJITResolveFrame(currentThread, jitEIP);2492if (NULL != addr) {2493goto done;2494}2495}24962497if (J9VMJAVALANGINVOKEMETHODHANDLE_OR_NULL(vm) == targetClass) {2498/* MethodHandle */2499J9RAMMethodRef *ramRef = (J9RAMMethodRef *)&(ramConstantPool[cpIndex]);2500methodTypeIndex = ramRef->methodIndexAndArgCount >> 8;2501methodTypeTablePtr = methodClass->methodTypes;2502} else {2503/* VarHandle */2504J9ROMClass *romClass = methodClass->romClass;2505methodTypeIndex = VM_VMHelpers::lookupVarHandleMethodTypeCacheIndex(romClass, cpIndex);2506methodTypeTablePtr = methodClass->varHandleMethodTypes;2507}25082509retry:2510methodTypePtr = &(methodTypeTablePtr[methodTypeIndex]);25112512if (NULL == *methodTypePtr) {2513/* Resolve the call site if unresolved */2514buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_DATA, parmCount, true, 0, jitEIP);2515vm->internalVMFunctions->resolveVirtualMethodRef(currentThread, ramConstantPool, cpIndex, J9_RESOLVE_FLAG_RUNTIME_RESOLVE, NULL);2516addr = restoreJITResolveFrame(currentThread, jitEIP);2517if (NULL != addr) {2518goto done;2519}2520goto retry;2521}25222523JIT_RETURN_UDATA(methodTypePtr);2524#endif /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */2525done:2526SLOW_JIT_HELPER_EPILOGUE();2527return addr;2528}25292530void* J9FASTCALL2531old_slow_jitResolveFlattenableField(J9VMThread *currentThread)2532{2533void *addr = NULL;25342535#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)2536OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2537DECLARE_JIT_PARM(J9Method*, method, 1);2538DECLARE_JIT_INT_PARM(cpIndex, 2);2539DECLARE_JIT_INT_PARM(resolveType, 3);2540J9ConstantPool * const ramConstantPool = J9_CP_FROM_METHOD(method);2541J9RAMFieldRef * const ramFieldRef = ((J9RAMFieldRef *)ramConstantPool) + cpIndex;2542UDATA const flags = ramFieldRef->flags;2543UDATA const valueOffset = ramFieldRef->valueOffset;2544bool resolved = VM_VMHelpers::instanceFieldRefIsResolved(flags, valueOffset);2545if (resolved && (J9TR_FLAT_RESOLVE_PUTFIELD == resolveType)) {2546resolved = VM_VMHelpers::resolvedInstanceFieldRefIsPutResolved(flags, method, ramConstantPool);2547}2548if (!resolved) {2549UDATA resolveFlags = J9_RESOLVE_FLAG_RUNTIME_RESOLVE;2550switch(resolveType) {2551case J9TR_FLAT_RESOLVE_WITHFIELD:2552resolveFlags |= J9_RESOLVE_FLAG_WITH_FIELD;2553break;2554case J9TR_FLAT_RESOLVE_GETFIELD:2555break;2556case J9TR_FLAT_RESOLVE_PUTFIELD:2557resolveFlags |= J9_RESOLVE_FLAG_FIELD_SETTER;2558break;2559default:2560Assert_CodertVM_unreachable();2561break;2562}2563void *oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);2564currentThread->javaVM->internalVMFunctions->resolveInstanceFieldRef(currentThread, method, ramConstantPool, cpIndex, resolveFlags, NULL);2565addr = restoreJITResolveFrame(currentThread, oldPC);2566}2567SLOW_JIT_HELPER_EPILOGUE();2568#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */25692570return addr;2571}25722573void* J9FASTCALL2574old_slow_jitRetranslateCaller(J9VMThread *currentThread)2575{2576OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);2577DECLARE_JIT_PARM(J9Method*, method, 1);2578DECLARE_JIT_PARM(void*, oldJITStartAddr, 2);2579J9JavaVM *vm = currentThread->javaVM;2580J9JITConfig *jitConfig = vm->jitConfig;2581void *oldPC = currentThread->jitReturnAddress;2582buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_RUNTIME_HELPER, parmCount, false, 0, oldPC);2583UDATA oldState = currentThread->omrVMThread->vmState;2584currentThread->omrVMThread->vmState = J9VMSTATE_JIT;2585UDATA jitStartPC = jitConfig->entryPoint(jitConfig, currentThread, method, oldJITStartAddr);2586currentThread->omrVMThread->vmState = oldState;2587void *addr = restoreJITResolveFrame(currentThread, oldPC, true, false);2588if (NULL == addr) {2589JIT_RETURN_UDATA(jitStartPC);2590}2591SLOW_JIT_HELPER_EPILOGUE();2592return addr;2593}25942595void* J9FASTCALL2596old_slow_jitRetranslateCallerWithPreparation(J9VMThread *currentThread)2597{2598OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2599DECLARE_JIT_PARM(J9Method*, method, 1);2600DECLARE_JIT_PARM(void*, oldJITStartAddr, 2);2601DECLARE_JIT_PARM(UDATA, reason, 3);2602J9JavaVM *vm = currentThread->javaVM;2603J9JITConfig *jitConfig = vm->jitConfig;2604void *oldPC = currentThread->jitReturnAddress;2605buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_RUNTIME_HELPER, parmCount, false, 0, oldPC);2606UDATA oldState = currentThread->omrVMThread->vmState;2607currentThread->omrVMThread->vmState = J9VMSTATE_JIT;2608UDATA jitStartPC = jitConfig->retranslateWithPreparation(jitConfig, currentThread, method, oldJITStartAddr, reason);2609currentThread->omrVMThread->vmState = oldState;2610void *addr = restoreJITResolveFrame(currentThread, oldPC, true, false);2611if (NULL == addr) {2612JIT_RETURN_UDATA(jitStartPC);2613}2614SLOW_JIT_HELPER_EPILOGUE();2615return addr;2616}26172618J9_EXTERN_BUILDER_SYMBOL(jitDecompileAtCurrentPC);26192620void* J9FASTCALL2621old_slow_jitRetranslateMethod(J9VMThread *currentThread)2622{2623OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);2624DECLARE_JIT_PARM(J9Method*, method, 1);2625DECLARE_JIT_PARM(void*, oldJITStartAddr, 2);2626DECLARE_JIT_PARM(void*, jitEIP, 3);2627J9JavaVM *vm = currentThread->javaVM;2628J9JITConfig *jitConfig = vm->jitConfig;2629UDATA jitStartPC = 0;26302631buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE_RECOMPILATION, parmCount, true, 0, jitEIP);26322633/* The return address of the recompiled method is either:2634* No special handling required2635* - a jitted caller2636* - the interpreter (something in the return table)2637* Special handling required2638* - a decompile point2639*/2640bool callerAlreadyBeingDecompiled = false;2641if (NULL == jitGetExceptionTableFromPC(currentThread, (UDATA)jitEIP)) {2642U_8 **returnTable = (U_8**)jitConfig->i2jReturnTable;2643callerAlreadyBeingDecompiled = true;2644for (UDATA i = 0; i < J9SW_JIT_RETURN_TABLE_SIZE; ++i) {2645if (jitEIP == returnTable[i]) {2646callerAlreadyBeingDecompiled = false;2647break;2648}2649}2650}2651if (callerAlreadyBeingDecompiled) {2652/* The caller is already being decompiled. The only way this can occur is if:2653*2654* - the caller is jitted2655* - caller invokes a non-compiled method2656* - interpreter submits target for compilation2657* - during compilation, a decomp is added for the caller2658* - target is successfully compiled2659* - decomp record is updated such that the savedPCAddres points to where the jitted method would save the RA2660* - interp transitions to the newly-compiled method with the return address pointing to a decompilation2661*2662* The decompilation assumes that the target method would run (so it's jitDecompileOnReturn*).2663* This is incorrect at this point, since we won't run the target method, so change the decompile to2664* jitDecompileAtCurrentPC (to re-run the invoke after decomp), and change the savedPCAddress in the decomp2665* record to point to the returnAddress field of the recently pushed resolve frame to keep the stack walker happy.2666*/2667J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;2668U_8 **savedPCAddress = (U_8**)&resolveFrame->returnAddress;2669*savedPCAddress = (U_8*)J9_BUILDER_SYMBOL(jitDecompileAtCurrentPC);2670currentThread->decompilationStack->pcAddress = savedPCAddress;2671} else {2672UDATA oldState = currentThread->omrVMThread->vmState;2673currentThread->omrVMThread->vmState = J9VMSTATE_JIT;2674jitStartPC = jitConfig->entryPoint(jitConfig, currentThread, method, oldJITStartAddr);2675currentThread->omrVMThread->vmState = oldState;2676}2677void *addr = restoreJITResolveFrame(currentThread, jitEIP, true, false);2678if (NULL == addr) {2679JIT_RETURN_UDATA(jitStartPC);2680}2681SLOW_JIT_HELPER_EPILOGUE();2682return addr;2683}26842685void* J9FASTCALL2686old_slow_jitThrowCurrentException(J9VMThread *currentThread)2687{2688OLD_JIT_HELPER_PROLOGUE(0);2689buildJITResolveFrameForRuntimeCheck(currentThread);2690return J9_JITHELPER_ACTION_THROW;2691}26922693void* J9FASTCALL2694old_slow_jitThrowException(J9VMThread *currentThread)2695{2696OLD_JIT_HELPER_PROLOGUE(1);2697DECLARE_JIT_PARM(j9object_t, exception, 1);2698VM_VMHelpers::setExceptionPending(currentThread, exception);2699buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);2700return J9_JITHELPER_ACTION_THROW;2701}27022703void* J9FASTCALL2704old_slow_jitThrowUnreportedException(J9VMThread *currentThread)2705{2706OLD_JIT_HELPER_PROLOGUE(1);2707DECLARE_JIT_PARM(j9object_t, exception, 1);2708buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);2709fixStackForSyntheticHandler(currentThread);2710VM_VMHelpers::setExceptionPending(currentThread, exception, false);2711return J9_JITHELPER_ACTION_THROW;2712}27132714void* J9FASTCALL2715old_slow_jitThrowAbstractMethodError(J9VMThread *currentThread)2716{2717OLD_JIT_HELPER_PROLOGUE(0);2718buildJITResolveFrameForRuntimeCheck(currentThread);2719return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGABSTRACTMETHODERROR, NULL);2720}27212722void* J9FASTCALL2723old_slow_jitThrowArithmeticException(J9VMThread *currentThread)2724{2725OLD_JIT_HELPER_PROLOGUE(0);2726buildJITResolveFrameForRuntimeCheck(currentThread);2727return setCurrentExceptionNLSFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARITHMETICEXCEPTION, J9NLS_VM_DIVIDE_BY_ZERO);2728}27292730void* J9FASTCALL2731old_slow_jitThrowArrayIndexOutOfBounds(J9VMThread *currentThread)2732{2733OLD_JIT_HELPER_PROLOGUE(0);2734buildJITResolveFrameForRuntimeCheck(currentThread);2735return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYINDEXOUTOFBOUNDSEXCEPTION, NULL);2736}27372738void* J9FASTCALL2739impl_jitReferenceArrayCopy(J9VMThread *currentThread, UDATA lengthInBytes)2740{2741JIT_HELPER_PROLOGUE();2742void* exception = NULL;2743if (-1 != currentThread->javaVM->memoryManagerFunctions->referenceArrayCopy(2744currentThread,2745(J9IndexableObject*)currentThread->floatTemp1,2746(J9IndexableObject*)currentThread->floatTemp2,2747(fj9object_t*)currentThread->floatTemp3,2748(fj9object_t*)currentThread->floatTemp4,2749(I_32)(lengthInBytes / J9VMTHREAD_REFERENCE_SIZE(currentThread))2750)) {2751exception = (void*)-1;2752}2753return exception;2754}27552756void* J9FASTCALL2757old_slow_jitThrowArrayStoreException(J9VMThread *currentThread)2758{2759OLD_JIT_HELPER_PROLOGUE(0);2760buildJITResolveFrameForRuntimeCheck(currentThread);2761return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);2762}27632764void* J9FASTCALL2765old_slow_jitThrowArrayStoreExceptionWithIP(J9VMThread *currentThread)2766{2767OLD_JIT_HELPER_PROLOGUE(1);2768DECLARE_JIT_PARM(void*, jitEIP, 1);2769buildJITResolveFrameWithPC(currentThread, J9_SSF_JIT_RESOLVE, parmCount, true, 0, jitEIP);2770return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);2771}27722773void* J9FASTCALL2774old_slow_jitThrowExceptionInInitializerError(J9VMThread *currentThread)2775{2776OLD_JIT_HELPER_PROLOGUE(0);2777buildJITResolveFrameForRuntimeCheck(currentThread);2778return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGEXCEPTIONININITIALIZERERROR, NULL);2779}27802781void* J9FASTCALL2782old_slow_jitThrowIllegalAccessError(J9VMThread *currentThread)2783{2784OLD_JIT_HELPER_PROLOGUE(0);2785buildJITResolveFrameForRuntimeCheck(currentThread);2786return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALACCESSERROR, NULL);2787}27882789void* J9FASTCALL2790old_slow_jitThrowIncompatibleClassChangeError(J9VMThread *currentThread)2791{2792OLD_JIT_HELPER_PROLOGUE(0);2793buildJITResolveFrameForRuntimeCheck(currentThread);2794return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINCOMPATIBLECLASSCHANGEERROR, NULL);2795}27962797void* J9FASTCALL2798old_slow_jitThrowInstantiationException(J9VMThread *currentThread)2799{2800OLD_JIT_HELPER_PROLOGUE(0);2801buildJITResolveFrameForRuntimeCheck(currentThread);2802return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINSTANTIATIONEXCEPTION, NULL);2803}28042805void* J9FASTCALL2806old_slow_jitThrowNullPointerException(J9VMThread *currentThread)2807{2808OLD_JIT_HELPER_PROLOGUE(0);2809buildJITResolveFrameForRuntimeCheck(currentThread);2810return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);2811}28122813void* J9FASTCALL2814old_slow_jitThrowWrongMethodTypeException(J9VMThread *currentThread)2815{2816OLD_JIT_HELPER_PROLOGUE(0);2817buildJITResolveFrameForRuntimeCheck(currentThread);2818return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGINVOKEWRONGMETHODTYPEEXCEPTION, NULL);2819}28202821void* J9FASTCALL2822old_slow_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread)2823{2824SLOW_JIT_HELPER_PROLOGUE();2825buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);2826return setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGARRAYSTOREEXCEPTION, NULL);2827}28282829static VMINLINE bool2830fast_jitTypeCheckArrayStoreImpl(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)2831{2832bool slowPathRequired = false;2833if ((NULL != destinationObject) && (NULL != objectBeingStored)) {2834J9Class *objectClass = J9OBJECT_CLAZZ(currentThread, objectBeingStored);2835J9Class *componentType = ((J9ArrayClass*)J9OBJECT_CLAZZ(currentThread, destinationObject))->componentType;2836/* Quick check -- is this a store of a C into a C[]? */2837if (objectClass != componentType) {2838/* Quick check -- is this a store of a C into a java.lang.Object[]? */2839if (0 != VM_VMHelpers::getClassDepth(componentType)) {2840if (!VM_VMHelpers::inlineCheckCast(objectClass, componentType)) {2841slowPathRequired = true;2842}2843}2844}2845}2846return slowPathRequired;2847}28482849void* J9FASTCALL2850old_fast_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread)2851{2852void *slowPath = NULL;2853OLD_JIT_HELPER_PROLOGUE(2);2854DECLARE_JIT_PARM(j9object_t, destinationObject, 1);2855DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);2856if (fast_jitTypeCheckArrayStoreImpl(currentThread, destinationObject, objectBeingStored)) {2857slowPath = (void*)old_slow_jitTypeCheckArrayStoreWithNullCheck;2858}2859return slowPath;2860}28612862void J9FASTCALL2863old_fast_jitAcmpeqHelper(J9VMThread *currentThread)2864{2865OLD_JIT_HELPER_PROLOGUE(2);2866DECLARE_JIT_PARM(j9object_t, lhs, 1);2867DECLARE_JIT_PARM(j9object_t, rhs, 2);28682869JIT_RETURN_UDATA(currentThread->javaVM->internalVMFunctions->valueTypeCapableAcmp(currentThread, lhs, rhs));2870}28712872void J9FASTCALL2873old_fast_jitAcmpneHelper(J9VMThread *currentThread)2874{2875OLD_JIT_HELPER_PROLOGUE(2);2876DECLARE_JIT_PARM(j9object_t, lhs, 1);2877DECLARE_JIT_PARM(j9object_t, rhs, 2);28782879JIT_RETURN_UDATA(!currentThread->javaVM->internalVMFunctions->valueTypeCapableAcmp(currentThread, lhs, rhs));2880}28812882void* J9FASTCALL2883old_fast_jitTypeCheckArrayStore(J9VMThread *currentThread)2884{2885/* Not omitting NULL check */2886return old_fast_jitTypeCheckArrayStoreWithNullCheck(currentThread);2887}28882889void* J9FASTCALL2890old_slow_jitTypeCheckArrayStore(J9VMThread *currentThread)2891{2892return old_slow_jitTypeCheckArrayStoreWithNullCheck(currentThread);2893}28942895void J9FASTCALL2896fast_jitWriteBarrierBatchStore(J9VMThread *currentThread, j9object_t destinationObject)2897{2898currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierBatch(currentThread, destinationObject);2899}29002901void J9FASTCALL2902old_fast_jitWriteBarrierBatchStore(J9VMThread *currentThread)2903{2904OLD_JIT_HELPER_PROLOGUE(1);2905DECLARE_JIT_PARM(j9object_t, destinationObject, 1);2906fast_jitWriteBarrierBatchStore(currentThread, destinationObject);2907}29082909void J9FASTCALL2910fast_jitWriteBarrierBatchStoreWithRange(J9VMThread *currentThread, j9object_t destinationObject, UDATA destinationPtr, UDATA range)2911{2912currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierBatch(currentThread, destinationObject);2913}29142915void J9FASTCALL2916old_fast_jitWriteBarrierBatchStoreWithRange(J9VMThread *currentThread)2917{2918OLD_JIT_HELPER_PROLOGUE(3);2919DECLARE_JIT_PARM(j9object_t, destinationObject, 1);2920DECLARE_JIT_PARM(UDATA, destinationPtr, 2);2921DECLARE_JIT_PARM(UDATA, range, 3);2922fast_jitWriteBarrierBatchStoreWithRange(currentThread, destinationObject, destinationPtr, range);2923}29242925void J9FASTCALL2926fast_jitWriteBarrierJ9ClassBatchStore(J9VMThread *currentThread, J9Class *destinationClass)2927{2928currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierClassBatch(currentThread, destinationClass);2929}29302931void J9FASTCALL2932old_fast_jitWriteBarrierJ9ClassBatchStore(J9VMThread *currentThread)2933{2934OLD_JIT_HELPER_PROLOGUE(1);2935DECLARE_JIT_CLASS_PARM(destinationClass, 1);2936fast_jitWriteBarrierJ9ClassBatchStore(currentThread, destinationClass);2937}29382939void J9FASTCALL2940fast_jitWriteBarrierJ9ClassStore(J9VMThread *currentThread, J9Class *destinationClass, j9object_t objectBeingStored)2941{2942currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierPostClass(currentThread, destinationClass, objectBeingStored);2943}29442945void J9FASTCALL2946old_fast_jitWriteBarrierJ9ClassStore(J9VMThread *currentThread)2947{2948OLD_JIT_HELPER_PROLOGUE(2);2949DECLARE_JIT_CLASS_PARM(destinationClass, 1);2950DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);2951fast_jitWriteBarrierJ9ClassStore(currentThread, destinationClass, objectBeingStored);2952}29532954void J9FASTCALL2955fast_jitWriteBarrierStore(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)2956{2957currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierPost(currentThread, destinationObject, objectBeingStored);2958}29592960void J9FASTCALL2961old_fast_jitWriteBarrierStore(J9VMThread *currentThread)2962{2963OLD_JIT_HELPER_PROLOGUE(2);2964DECLARE_JIT_PARM(j9object_t, destinationObject, 1);2965DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);2966fast_jitWriteBarrierStore(currentThread, destinationObject, objectBeingStored);2967}29682969void J9FASTCALL2970fast_jitWriteBarrierStoreGenerational(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)2971{2972MM_ObjectAccessBarrierAPI::internalPostObjectStoreGenerationalNoValueCheck(currentThread, destinationObject);2973}29742975void J9FASTCALL2976old_fast_jitWriteBarrierStoreGenerational(J9VMThread *currentThread)2977{2978OLD_JIT_HELPER_PROLOGUE(2);2979DECLARE_JIT_PARM(j9object_t, destinationObject, 1);2980DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);2981fast_jitWriteBarrierStoreGenerational(currentThread, destinationObject, objectBeingStored);2982}29832984void J9FASTCALL2985fast_jitWriteBarrierStoreGenerationalAndConcurrentMark(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)2986{2987MM_ObjectAccessBarrierAPI::internalPostObjectStoreCardTableAndGenerational(currentThread, destinationObject, objectBeingStored);2988}29892990void J9FASTCALL2991old_fast_jitWriteBarrierStoreGenerationalAndConcurrentMark(J9VMThread *currentThread)2992{2993OLD_JIT_HELPER_PROLOGUE(2);2994DECLARE_JIT_PARM(j9object_t, destinationObject, 1);2995DECLARE_JIT_PARM(j9object_t, objectBeingStored, 2);2996fast_jitWriteBarrierStoreGenerationalAndConcurrentMark(currentThread, destinationObject, objectBeingStored);2997}29982999void J9FASTCALL3000fast_jitWriteBarrierClassStoreMetronome(J9VMThread *currentThread, j9object_t destinationClassObject, J9Object** destinationAddress, j9object_t objectBeingStored)3001{3002currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierPreClass(currentThread, destinationClassObject, destinationAddress, objectBeingStored);3003}30043005void J9FASTCALL3006old_fast_jitWriteBarrierClassStoreMetronome(J9VMThread *currentThread)3007{3008OLD_JIT_HELPER_PROLOGUE(3);3009DECLARE_JIT_PARM(j9object_t, destinationClassObject, 1);3010DECLARE_JIT_PARM(J9Object**, destinationAddress, 2);3011DECLARE_JIT_PARM(j9object_t, objectBeingStored, 3);3012fast_jitWriteBarrierClassStoreMetronome(currentThread, destinationClassObject, destinationAddress, objectBeingStored);3013}30143015void J9FASTCALL3016fast_jitWriteBarrierStoreMetronome(J9VMThread *currentThread, j9object_t destinationObject, fj9object_t* destinationAddress, j9object_t objectBeingStored)3017{3018currentThread->javaVM->memoryManagerFunctions->J9WriteBarrierPre(currentThread, destinationObject, destinationAddress, objectBeingStored);3019}30203021void J9FASTCALL3022old_fast_jitWriteBarrierStoreMetronome(J9VMThread *currentThread)3023{3024OLD_JIT_HELPER_PROLOGUE(3);3025DECLARE_JIT_PARM(j9object_t, destinationObject, 1);3026DECLARE_JIT_PARM(fj9object_t*, destinationAddress, 2);3027DECLARE_JIT_PARM(j9object_t, objectBeingStored, 3);3028fast_jitWriteBarrierStoreMetronome(currentThread, destinationObject, destinationAddress, objectBeingStored);3029}30303031void J9FASTCALL3032old_slow_jitCallJitAddPicToPatchOnClassUnload(J9VMThread *currentThread)3033{3034OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);3035DECLARE_JIT_PARM(void*, classPointer, 1);3036DECLARE_JIT_PARM(void*, addressToBePatched, 2);3037jitAddPicToPatchOnClassUnload(classPointer, addressToBePatched);3038SLOW_JIT_HELPER_EPILOGUE();3039}30403041typedef void (*twoVoidFunc)(void*, void*);30423043void J9FASTCALL3044old_slow_jitCallCFunction(J9VMThread *currentThread)3045{3046OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);3047DECLARE_JIT_PARM(twoVoidFunc, functionPointer, 1);3048DECLARE_JIT_PARM(void*, argumentPointer, 2);3049DECLARE_JIT_PARM(void*, returnValuePointer, 3);3050functionPointer(argumentPointer, returnValuePointer);3051SLOW_JIT_HELPER_EPILOGUE();3052}30533054void3055fast_jitPreJNICallOffloadCheck(J9VMThread *currentThread)3056{3057#if defined(J9VM_OPT_JAVA_OFFLOAD_SUPPORT)3058OLD_JIT_HELPER_PROLOGUE(0);3059#if defined(J9VM_PORT_ZOS_CEEHDLRSUPPORT)3060J9JavaVM *vm = currentThread->javaVM;3061if (J9_ARE_ANY_BITS_SET(vm->sigFlags, J9_SIG_ZOS_CEEHDLR)) {3062J9VMEntryLocalStorage *els = currentThread->entryLocalStorage;3063/* Save the old vmstate then set it to 'J9VMSTATE_JNI_FROM_JIT' and store the FPRs 8-15 */3064els->calloutVMState = setVMState(currentThread, J9VMSTATE_JNI_FROM_JIT);3065}3066#endif /* J9VM_PORT_ZOS_CEEHDLRSUPPORT */3067VM_VMHelpers::beforeJNICall(currentThread);3068#endif /* J9VM_OPT_JAVA_OFFLOAD_SUPPORT */3069}30703071void3072fast_jitPostJNICallOffloadCheck(J9VMThread *currentThread)3073{3074#if defined(J9VM_OPT_JAVA_OFFLOAD_SUPPORT)3075OLD_JIT_HELPER_PROLOGUE(0);3076#if defined(J9VM_PORT_ZOS_CEEHDLRSUPPORT)3077J9JavaVM *vm = currentThread->javaVM;3078J9VMEntryLocalStorage *els = currentThread->entryLocalStorage;3079if (J9_ARE_ANY_BITS_SET(vm->sigFlags, J9_SIG_ZOS_CEEHDLR)) {3080setVMState(currentThread, els->calloutVMState);3081/* verify that the native didn't resume execution after an LE condition and illegally return to Java */3082if (J9_ARE_ANY_BITS_SET(currentThread->privateFlags, J9_PRIVATE_FLAGS_STACKS_OUT_OF_SYNC)) {3083vm->internalVMFunctions->javaAndCStacksMustBeInSync(currentThread, TRUE);3084}3085}3086#endif /* J9VM_PORT_ZOS_CEEHDLRSUPPORT */3087VM_VMHelpers::afterJNICall(currentThread);3088#endif /* J9VM_OPT_JAVA_OFFLOAD_SUPPORT */3089}30903091void J9FASTCALL3092old_fast_jitObjectHashCode(J9VMThread *currentThread)3093{3094OLD_JIT_HELPER_PROLOGUE(1);3095DECLARE_JIT_PARM(j9object_t, object, 1);3096J9JavaVM *vm = currentThread->javaVM;3097JIT_RETURN_UDATA((IDATA)vm->memoryManagerFunctions->j9gc_objaccess_getObjectHashCode(vm, (J9Object*)object));3098}30993100static VMINLINE void*3101old_slow_jitInduceOSRAtCurrentPCImpl(J9VMThread *currentThread, void *oldPC)3102{3103induceOSROnCurrentThread(currentThread);3104/* If the OSR was successful, a decompilation will have been added to the resolve frame */3105J9SFJITResolveFrame *resolveFrame = (J9SFJITResolveFrame*)currentThread->sp;3106void *newPC = resolveFrame->returnAddress;3107if (samePCs(oldPC, newPC)) {3108/* If execution reaches this point (no decompilation added), then there was an out of memory error */3109newPC = setNativeOutOfMemoryErrorFromJIT(currentThread, 0, 0);3110} else {3111newPC = JIT_RUN_ON_JAVA_STACK(newPC);3112}3113return newPC;3114}31153116void* J9FASTCALL3117old_slow_jitInduceOSRAtCurrentPCAndRecompile(J9VMThread *currentThread)3118{3119OLD_JIT_HELPER_PROLOGUE(0);3120void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE_INDUCE_OSR, parmCount);31213122J9StackWalkState walkState;3123/* The stack currently has a resolve frame on top, followed by the JIT frame we3124* wish to OSR. Walk the stack down to the JIT frame to gather the data required3125* for decompilation.3126*/3127J9JavaVM *vm = currentThread->javaVM;3128J9JITConfig *jitConfig = vm->jitConfig;3129walkState.walkThread = currentThread;3130walkState.maxFrames = 2;3131walkState.flags = J9_STACKWALK_SKIP_INLINES | J9_STACKWALK_COUNT_SPECIFIED;3132vm->walkStackFrames(currentThread, &walkState);3133J9Method *method = walkState.method;3134J9JITExceptionTable *metaData = walkState.jitInfo;3135void *oldJITStartAddr = (void *) metaData->startPC;3136jitConfig->retranslateWithPreparationForMethodRedefinition(jitConfig, currentThread, method, oldJITStartAddr);31373138return old_slow_jitInduceOSRAtCurrentPCImpl(currentThread, oldPC);3139}31403141void* J9FASTCALL3142old_slow_jitInduceOSRAtCurrentPC(J9VMThread *currentThread)3143{3144OLD_JIT_HELPER_PROLOGUE(0);3145void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE_INDUCE_OSR, parmCount);3146return old_slow_jitInduceOSRAtCurrentPCImpl(currentThread, oldPC);3147}31483149void J9FASTCALL3150old_slow_jitInterpretNewInstanceMethod(J9VMThread *currentThread)3151{3152/* JIT has passed two parameters, but only the first one matters to this call.3153* The parmCount has to be 1 in order for JIT_PARM_IN_MEMORY to function correctly3154* in the register case.3155*/3156OLD_JIT_HELPER_PROLOGUE(1);3157J9JavaVM *vm = currentThread->javaVM;3158#if defined(J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP)3159/* Arguments are on stack in invoke order:3160*3161* sp[0] = callerClass3162* sp[1] = objectClass3163*3164* Going to the interpreter, we need to discard callerClass in order to run the static method3165* J9VMInternals.newInstanceImpl(Class objectClass), so the stack needs to look like:3166*3167* sp[0] = objectClass3168*/3169currentThread->sp += 1;3170#else /* J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP */3171/* Arguments are in registers.3172*3173* Copy the objectClassObject argument to the stack for the static interpreter dispatch.3174*/3175JIT_PARM_IN_MEMORY(1) = JIT_DIRECT_CALL_PARM(1);3176#endif /* J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP */3177currentThread->tempSlot = (UDATA)J9_BUILDER_SYMBOL(icallVMprJavaSendStatic1);3178jitRegisters->JIT_J2I_METHOD_REGISTER = (UDATA)J9VMJAVALANGJ9VMINTERNALS_NEWINSTANCEIMPL_METHOD(vm);3179}31803181void* J9FASTCALL3182old_slow_jitNewInstanceImplAccessCheck(J9VMThread *currentThread)3183{3184void *addr = NULL;3185OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);3186DECLARE_JIT_PARM(j9object_t, thisClassObject, 1);3187DECLARE_JIT_PARM(j9object_t, callerClassObject, 2);3188DECLARE_JIT_PARM(J9Method*, defaultConstructor, 3);3189J9Class *thisClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, thisClassObject);3190J9Class *callerClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, callerClassObject);3191J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(defaultConstructor);3192J9InternalVMFunctions *vmFuncs = currentThread->javaVM->internalVMFunctions;3193void *oldPC = buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE_RUNTIME_HELPER, parmCount);3194IDATA checkResult = vmFuncs->checkVisibility(currentThread, callerClass, thisClass, thisClass->romClass->modifiers, J9_LOOK_REFLECT_CALL);3195if (checkResult < J9_VISIBILITY_ALLOWED) {3196illegalAccess:3197if (VM_VMHelpers::immediateAsyncPending(currentThread)) {3198goto done;3199}3200if (VM_VMHelpers::exceptionPending(currentThread)) {3201goto done;3202}3203J9UTF8 *classNameUTF = J9ROMCLASS_CLASSNAME(thisClass->romClass);3204J9UTF8 *nameUTF = J9ROMMETHOD_NAME(romMethod);3205J9UTF8 *sigUTF = J9ROMMETHOD_SIGNATURE(romMethod);3206j9object_t detailMessage = currentThread->javaVM->internalVMFunctions->catUtfToString4(3207currentThread,3208J9UTF8_DATA(classNameUTF),3209J9UTF8_LENGTH(classNameUTF),3210(U_8*)".",32111,3212J9UTF8_DATA(nameUTF),3213J9UTF8_LENGTH(nameUTF),3214J9UTF8_DATA(sigUTF),3215J9UTF8_LENGTH(sigUTF));3216if (NULL != detailMessage) {3217setCurrentExceptionFromJIT(currentThread, J9VMCONSTANTPOOL_JAVALANGILLEGALACCESSEXCEPTION, detailMessage);3218}3219goto done;3220}32213222/* See if the method is visible - don't use checkVisibility here because newInstance3223* has different rules for protected method visibility.3224*/3225if (!J9_ARE_ANY_BITS_SET(romMethod->modifiers, J9AccPublic)) {3226if (J9_ARE_ANY_BITS_SET(romMethod->modifiers, J9AccPrivate)) {3227/* Private methods are visible only within their declaring class3228* unless the two classes are in the same nest (JDK11 and beyond).3229*/3230#if JAVA_SPEC_VERSION >= 113231if (NULL == thisClass->nestHost) {3232if (J9_VISIBILITY_ALLOWED != vmFuncs->loadAndVerifyNestHost(currentThread, thisClass, 0)) {3233goto illegalAccess;3234}3235}3236if (NULL == callerClass->nestHost) {3237if (J9_VISIBILITY_ALLOWED != vmFuncs->loadAndVerifyNestHost(currentThread, callerClass, 0)) {3238goto illegalAccess;3239}3240}3241if (thisClass->nestHost != callerClass->nestHost)3242#endif /* JAVA_SPEC_VERSION >= 11 */3243{3244if (thisClass != callerClass) {3245goto illegalAccess;3246}3247}3248} else {3249/* Protected and default are treated the same when called from newInstance() */3250if (thisClass->packageID != callerClass->packageID) {3251goto illegalAccess;3252}3253}3254}3255done:3256addr = restoreJITResolveFrame(currentThread, oldPC);3257SLOW_JIT_HELPER_EPILOGUE();3258return addr;3259}32603261void J9FASTCALL3262old_slow_jitTranslateNewInstanceMethod(J9VMThread *currentThread)3263{3264OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);3265j9object_t objectClassObject = (j9object_t)JIT_DIRECT_CALL_PARM(1);3266j9object_t callerClassObject = (j9object_t)JIT_DIRECT_CALL_PARM(2);3267J9Class *objectClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, objectClassObject);3268J9Class *callerClass = J9VM_J9CLASS_FROM_HEAPCLASS(currentThread, callerClassObject);3269redo:3270UDATA preCount = objectClass->newInstanceCount;3271if ((IDATA)preCount >= 0) {3272UDATA postCount = preCount - 1;3273UDATA result = VM_AtomicSupport::lockCompareExchange((UDATA*)&objectClass->newInstanceCount, preCount, postCount);3274if (result != preCount) {3275goto redo;3276}3277if ((IDATA)postCount < 0) {3278buildJITResolveFrame(currentThread, J9_SSF_JIT_RESOLVE, parmCount);3279PUSH_OBJECT_IN_SPECIAL_FRAME(currentThread, objectClassObject);3280PUSH_OBJECT_IN_SPECIAL_FRAME(currentThread, callerClassObject);3281UDATA oldState = currentThread->omrVMThread->vmState;3282currentThread->omrVMThread->vmState = J9VMSTATE_JIT;3283J9JavaVM *vm = currentThread->javaVM;3284J9JITConfig *jitConfig = vm->jitConfig;3285jitConfig->entryPointForNewInstance(jitConfig, currentThread, objectClass);3286currentThread->omrVMThread->vmState = oldState;3287callerClassObject = POP_OBJECT_IN_SPECIAL_FRAME(currentThread);3288objectClassObject = POP_OBJECT_IN_SPECIAL_FRAME(currentThread);3289/* The newInstance prototype optimization is disabled under FSD, so there is no3290* possibility of decompilation occurring. If it is ever enabled, something3291* will need to be done here.3292*/3293restoreJITResolveFrame(currentThread, NULL, false, false);3294SET_JIT_DIRECT_CALL_PARM(1, objectClassObject);3295SET_JIT_DIRECT_CALL_PARM(2, callerClassObject);3296}3297}3298void *address = (void*)objectClass->romableAotITable;3299/* To handle async compilation - if the newInstance slot has not been updated, run the interp version */3300if (J9_BUILDER_SYMBOL(jitTranslateNewInstanceMethod) == address) {3301address = J9_BUILDER_SYMBOL(jitInterpretNewInstanceMethod);3302}3303currentThread->tempSlot = (UDATA)address;3304SLOW_JIT_HELPER_EPILOGUE();3305}33063307#if !defined(J9VM_ENV_DATA64)33083309void J9FASTCALL3310old_fast_jitVolatileReadLong(J9VMThread *currentThread)3311{3312OLD_JIT_HELPER_PROLOGUE(1);3313DECLARE_JIT_PARM(U_64*, address, 1);3314U_64 value = longVolatileRead(currentThread, address);3315JIT_RETURN_U64(value);3316}33173318void J9FASTCALL3319old_fast_jitVolatileWriteLong(J9VMThread *currentThread)3320{3321OLD_JIT_HELPER_PROLOGUE(3);3322DECLARE_JIT_PARM(U_64*, address, 1);3323DECLARE_JIT_U64_PARM(value, 2);3324longVolatileWrite(currentThread, address, (U_64*)&value);3325}33263327void J9FASTCALL3328old_fast_jitVolatileReadDouble(J9VMThread *currentThread)3329{3330OLD_JIT_HELPER_PROLOGUE(1);3331DECLARE_JIT_PARM(U_64*, address, 1);3332U_64 value = longVolatileRead(currentThread, address);3333jitRegisters->fpr[0] = value;3334}33353336void J9FASTCALL3337old_fast_jitVolatileWriteDouble(J9VMThread *currentThread)3338{3339OLD_JIT_HELPER_PROLOGUE(1);3340DECLARE_JIT_PARM(U_64*, address, 1);3341longVolatileWrite(currentThread, address, &(jitRegisters->fpr[0]));3342}33433344#endif /* !J9VM_ENV_DATA64 */33453346#if defined(J9SW_NEEDS_JIT_2_INTERP_THUNKS)33473348void J9FASTCALL3349old_slow_icallVMprJavaSendPatchupVirtual(J9VMThread *currentThread)3350{3351UDATA const interfaceVTableIndex = currentThread->tempSlot;3352j9object_t const receiver = (j9object_t)currentThread->returnValue2;3353J9JavaVM *vm = currentThread->javaVM;3354J9JITConfig *jitConfig = vm->jitConfig;3355void *jitReturnAddress = currentThread->jitReturnAddress;3356UDATA jitVTableOffset = VM_JITInterface::jitVTableIndex(jitReturnAddress, interfaceVTableIndex);3357J9Class *clazz = J9OBJECT_CLAZZ(currentThread, receiver);3358UDATA interpVTableOffset = sizeof(J9Class) - jitVTableOffset;3359J9Method *method = *(J9Method**)((UDATA)clazz + interpVTableOffset);3360J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method);3361J9ROMNameAndSignature *nas = &romMethod->nameAndSignature;3362UDATA const thunk = (UDATA)jitConfig->thunkLookUpNameAndSig(jitConfig, nas);3363UDATA const patchup = (UDATA)jitConfig->patchupVirtual;3364UDATA *jitVTableSlot = (UDATA*)((UDATA)clazz + jitVTableOffset);3365VM_AtomicSupport::lockCompareExchange(jitVTableSlot, patchup, thunk);3366currentThread->tempSlot = thunk;3367}33683369#endif /* J9SW_NEEDS_JIT_2_INTERP_THUNKS */33703371/* New-style helpers */33723373#if !defined(J9VM_ENV_DATA64)33743375U_64 J9FASTCALL3376fast_jitVolatileReadLong(J9VMThread *currentThread, U_64 *address)3377{3378JIT_HELPER_PROLOGUE();3379return longVolatileRead(currentThread, address);3380}33813382void J9FASTCALL3383fast_jitVolatileWriteLong(J9VMThread *currentThread, U_64* address, U_64 value)3384{3385JIT_HELPER_PROLOGUE();3386longVolatileWrite(currentThread, address, &value);3387}33883389jdouble J9FASTCALL3390fast_jitVolatileReadDouble(J9VMThread *currentThread, U_64* address)3391{3392JIT_HELPER_PROLOGUE();3393U_64 value = longVolatileRead(currentThread, address);3394return *(jdouble*)&value;3395}33963397void J9FASTCALL3398fast_jitVolatileWriteDouble(J9VMThread *currentThread, U_64 *address, jdouble value)3399{3400JIT_HELPER_PROLOGUE();3401longVolatileWrite(currentThread, address, (U_64*)&value);3402}34033404#endif /* !J9VM_ENV_DATA64 */34053406void J9FASTCALL3407fast_jitCheckIfFinalizeObject(J9VMThread *currentThread, j9object_t object)3408{3409JIT_HELPER_PROLOGUE();3410VM_VMHelpers::checkIfFinalizeObject(currentThread, object);3411}34123413void J9FASTCALL3414fast_jitCollapseJNIReferenceFrame(J9VMThread *currentThread)3415{3416JIT_HELPER_PROLOGUE();3417/* The direct JNI code has dropped all pushed JNI refs from the stack, and has called this routine on the java stack */3418UDATA *bp = ((UDATA *)(((J9SFJNINativeMethodFrame*)currentThread->sp) + 1)) - 1;3419currentThread->javaVM->internalVMFunctions->returnFromJNI(currentThread, bp);3420}34213422UDATA J9FASTCALL3423#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3424/* TODO Will be cleaned once all platforms adopt the correct parameter order */3425fast_jitInstanceOf(J9VMThread *currentThread, j9object_t object, J9Class *castClass)3426#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3427fast_jitInstanceOf(J9VMThread *currentThread, J9Class *castClass, j9object_t object)3428#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3429{3430JIT_HELPER_PROLOGUE();3431UDATA isInstance = 0;3432/* null isn't an instance of anything */3433if (NULL != object) {3434J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);3435if (VM_VMHelpers::inlineCheckCast(instanceClass, castClass)) {3436isInstance = 1;3437}3438}3439return isInstance;3440}34413442UDATA J9FASTCALL3443#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3444/* TODO Will be cleaned once all platforms adopt the correct parameter order */3445fast_jitCheckAssignable(J9VMThread *currentThread, J9Class *clazz, J9Class *castClass)3446#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3447fast_jitCheckAssignable(J9VMThread *currentThread, J9Class *castClass, J9Class *clazz)3448#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3449{3450JIT_HELPER_PROLOGUE();3451return VM_VMHelpers::inlineCheckCast(clazz, castClass) ? 1 : 0;3452}34533454UDATA J9FASTCALL3455fast_jitObjectHashCode(J9VMThread *currentThread, j9object_t object)3456{3457JIT_HELPER_PROLOGUE();3458J9JavaVM *vm = currentThread->javaVM;3459return (UDATA)(IDATA)vm->memoryManagerFunctions->j9gc_objaccess_getObjectHashCode(vm, (J9Object*)object);3460}34613462void* J9FASTCALL3463fast_jitNewValue(J9VMThread *currentThread, J9Class *objectClass)3464{3465// extern void* slow_jitNewObject(J9VMThread *currentThread);3466JIT_HELPER_PROLOGUE();3467void *slowPath = NULL;3468if (J9_UNEXPECTED(fast_jitNewValueImpl(currentThread, objectClass, true, false))) {3469SET_PARM_COUNT(0);3470slowPath = (void*) old_slow_jitNewValue;3471}3472return slowPath;3473}34743475void* J9FASTCALL3476fast_jitNewValueNoZeroInit(J9VMThread *currentThread, J9Class *objectClass)3477{3478// extern void* slow_jitNewObjectNoZeroInit(J9VMThread *currentThread);3479JIT_HELPER_PROLOGUE();3480void *slowPath = NULL;3481if (J9_UNEXPECTED(fast_jitNewValueImpl(currentThread, objectClass, true, true))) {3482SET_PARM_COUNT(0);3483slowPath = (void*)old_slow_jitNewValueNoZeroInit;3484}3485return slowPath;3486}34873488void* J9FASTCALL3489fast_jitNewObject(J9VMThread *currentThread, J9Class *objectClass)3490{3491// extern void* slow_jitNewObject(J9VMThread *currentThread);3492JIT_HELPER_PROLOGUE();3493void *slowPath = NULL;3494if (J9_UNEXPECTED(fast_jitNewObjectImpl(currentThread, objectClass, true, false))) {3495SET_PARM_COUNT(0);3496slowPath = (void*)old_slow_jitNewObject;3497}3498return slowPath;3499}35003501void* J9FASTCALL3502fast_jitNewObjectNoZeroInit(J9VMThread *currentThread, J9Class *objectClass)3503{3504// extern void* slow_jitNewObjectNoZeroInit(J9VMThread *currentThread);3505JIT_HELPER_PROLOGUE();3506void *slowPath = NULL;3507if (J9_UNEXPECTED(fast_jitNewObjectImpl(currentThread, objectClass, true, true))) {3508SET_PARM_COUNT(0);3509slowPath = (void*)old_slow_jitNewObjectNoZeroInit;3510}3511return slowPath;3512}35133514void* J9FASTCALL3515#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3516/* TODO Will be cleaned once all platforms adopt the correct parameter order */3517fast_jitANewArray(J9VMThread *currentThread, I_32 size, J9Class *elementClass)3518#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3519fast_jitANewArray(J9VMThread *currentThread, J9Class *elementClass, I_32 size)3520#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3521{3522// extern void* slow_jitANewArray(J9VMThread *currentThread);3523JIT_HELPER_PROLOGUE();3524void *slowPath = NULL;3525if (J9_UNEXPECTED(fast_jitANewArrayImpl(currentThread, elementClass, size, false))) {3526SET_PARM_COUNT(0);3527slowPath = (void*)old_slow_jitANewArray;3528}3529return slowPath;3530}35313532void* J9FASTCALL3533#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3534/* TODO Will be cleaned once all platforms adopt the correct parameter order */3535fast_jitANewArrayNoZeroInit(J9VMThread *currentThread, I_32 size, J9Class *elementClass)3536#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3537fast_jitANewArrayNoZeroInit(J9VMThread *currentThread, J9Class *elementClass, I_32 size)3538#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3539{3540// extern void* slow_jitANewArrayNoZeroInit(J9VMThread *currentThread);3541JIT_HELPER_PROLOGUE();3542void *slowPath = NULL;3543if (J9_UNEXPECTED(fast_jitANewArrayImpl(currentThread, elementClass, size, true))) {3544SET_PARM_COUNT(0);3545slowPath = (void*)old_slow_jitANewArrayNoZeroInit;3546}3547return slowPath;3548}35493550void* J9FASTCALL3551#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3552/* TODO Will be cleaned once all platforms adopt the correct parameter order */3553fast_jitNewArray(J9VMThread *currentThread, I_32 size, I_32 arrayType)3554#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3555fast_jitNewArray(J9VMThread *currentThread, I_32 arrayType, I_32 size)3556#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3557{3558// extern void* slow_jitNewArray(J9VMThread *currentThread);3559JIT_HELPER_PROLOGUE();3560void *slowPath = NULL;3561if (J9_UNEXPECTED(fast_jitNewArrayImpl(currentThread, arrayType, size, false))) {3562SET_PARM_COUNT(0);3563slowPath = (void*)old_slow_jitNewArray;3564}3565return slowPath;3566}35673568void* J9FASTCALL3569#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3570/* TODO Will be cleaned once all platforms adopt the correct parameter order */3571fast_jitNewArrayNoZeroInit(J9VMThread *currentThread, I_32 size, I_32 arrayType)3572#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3573fast_jitNewArrayNoZeroInit(J9VMThread *currentThread, I_32 arrayType, I_32 size)3574#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3575{3576// extern void* slow_jitNewArrayNoZeroInit(J9VMThread *currentThread);3577JIT_HELPER_PROLOGUE();3578void *slowPath = NULL;3579if (J9_UNEXPECTED(fast_jitNewArrayImpl(currentThread, arrayType, size, true))) {3580SET_PARM_COUNT(0);3581slowPath = (void*)old_slow_jitNewArrayNoZeroInit;3582}3583return slowPath;3584}35853586void* J9FASTCALL3587#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3588/* TODO Will be cleaned once all platforms adopt the correct parameter order */3589fast_jitCheckCast(J9VMThread *currentThread, j9object_t object, J9Class *castClass)3590#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3591fast_jitCheckCast(J9VMThread *currentThread, J9Class *castClass, j9object_t object)3592#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3593{3594// extern void* slow_jitCheckCast(J9VMThread *currentThread);3595JIT_HELPER_PROLOGUE();3596void *slowPath = NULL;3597/* null can be cast to anything, except if castClass is a VT */3598if (NULL != object) {3599J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);3600if (J9_UNEXPECTED(!VM_VMHelpers::inlineCheckCast(instanceClass, castClass))) {3601SET_PARM_COUNT(0);3602currentThread->floatTemp1 = (void*)castClass;3603currentThread->floatTemp2 = (void*)object;3604slowPath = (void*)old_slow_jitCheckCast;3605}3606}3607#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)3608else if (J9_IS_J9CLASS_VALUETYPE(castClass)) {3609slowPath = (void*)old_slow_jitThrowNullPointerException;3610}3611#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */3612return slowPath;3613}36143615void* J9FASTCALL3616#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3617/* TODO Will be cleaned once all platforms adopt the correct parameter order */3618fast_jitCheckCastForArrayStore(J9VMThread *currentThread, j9object_t object, J9Class *castClass)3619#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3620fast_jitCheckCastForArrayStore(J9VMThread *currentThread, J9Class *castClass, j9object_t object)3621#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3622{3623// extern void* slow_jitCheckCastForArrayStore(J9VMThread *currentThread);3624JIT_HELPER_PROLOGUE();3625void *slowPath = NULL;3626/* null can be cast to anything, except if castClass is a VT */3627if (NULL != object) {3628J9Class *instanceClass = J9OBJECT_CLAZZ(currentThread, object);3629if (J9_UNEXPECTED(!VM_VMHelpers::inlineCheckCast(instanceClass, castClass))) {3630SET_PARM_COUNT(0);3631slowPath = (void*)old_slow_jitCheckCastForArrayStore;3632}3633}3634#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)3635else if (J9_IS_J9CLASS_VALUETYPE(castClass)) {3636slowPath = (void*)old_slow_jitThrowNullPointerException;3637}3638#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */3639return slowPath;3640}36413642void* J9FASTCALL3643#if defined(J9VM_ARCH_X86)3644/* TODO Will be cleaned once all platforms adopt the correct parameter order */3645fast_jitLookupInterfaceMethod(J9VMThread *currentThread, void *jitEIP, J9Class *receiverClass, UDATA *indexAndLiteralsEA)3646#else /* J9VM_ARCH_X86 */3647fast_jitLookupInterfaceMethod(J9VMThread *currentThread, J9Class *receiverClass, UDATA *indexAndLiteralsEA, void *jitEIP)3648#endif /* J9VM_ARCH_X86 */3649{3650// extern void* slow_jitLookupInterfaceMethod(J9VMThread *currentThread);3651JIT_HELPER_PROLOGUE();3652SET_PARM_COUNT(0);3653void *slowPath = (void*)old_slow_jitLookupInterfaceMethod;3654currentThread->floatTemp1 = (void*)receiverClass;3655currentThread->floatTemp2 = (void*)indexAndLiteralsEA;3656currentThread->floatTemp3 = (void*)jitEIP;3657J9Class *interfaceClass = ((J9Class**)indexAndLiteralsEA)[0];3658UDATA iTableOffset = indexAndLiteralsEA[1];3659UDATA vTableOffset = convertITableOffsetToVTableOffset(currentThread, receiverClass, interfaceClass, iTableOffset);3660if (0 != vTableOffset) {3661J9Method* method = *(J9Method**)((UDATA)receiverClass + vTableOffset);3662if (J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(method)->modifiers, J9AccPublic)) {3663slowPath = NULL;3664JIT_RETURN_UDATA(vTableOffset);3665}3666}3667return slowPath;3668}36693670void* J9FASTCALL3671fast_jitMethodMonitorEntry(J9VMThread *currentThread, j9object_t syncObject)3672{3673// extern void* slow_jitMethodMonitorEntry(J9VMThread *currentThread);3674JIT_HELPER_PROLOGUE();3675void *slowPath = NULL;3676if (J9_UNEXPECTED(fast_jitMonitorEnterImpl(currentThread, syncObject, true))) {3677SET_PARM_COUNT(0);3678slowPath = (void*)old_slow_jitMethodMonitorEntry;3679}3680return slowPath;3681}36823683void* J9FASTCALL3684fast_jitMonitorEntry(J9VMThread *currentThread, j9object_t syncObject)3685{3686// extern void* slow_jitMonitorEntry(J9VMThread *currentThread);3687JIT_HELPER_PROLOGUE();3688void *slowPath = NULL;3689if (J9_UNEXPECTED(fast_jitMonitorEnterImpl(currentThread, syncObject, false))) {3690SET_PARM_COUNT(0);3691slowPath = (void*)old_slow_jitMonitorEntry;3692}3693return slowPath;3694}36953696void* J9FASTCALL3697fast_jitMethodMonitorExit(J9VMThread *currentThread, j9object_t syncObject)3698{3699// extern void* slow_jitMethodMonitorExit(J9VMThread *currentThread);3700JIT_HELPER_PROLOGUE();3701void *slowPath = NULL;3702if (J9_UNEXPECTED(fast_jitMonitorExitImpl(currentThread, syncObject, true))) {3703SET_PARM_COUNT(0);3704slowPath = (void*)old_slow_jitMethodMonitorExit;3705}3706return slowPath;3707}37083709void* J9FASTCALL3710fast_jitMonitorExit(J9VMThread *currentThread, j9object_t syncObject)3711{3712// extern void* slow_jitMonitorExit(J9VMThread *currentThread);3713JIT_HELPER_PROLOGUE();3714void *slowPath = NULL;3715if (J9_UNEXPECTED(fast_jitMonitorExitImpl(currentThread, syncObject, false))) {3716SET_PARM_COUNT(0);3717slowPath = (void*)old_slow_jitMonitorExit;3718}3719return slowPath;3720}37213722void* J9FASTCALL3723#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3724/* TODO Will be cleaned once all platforms adopt the correct parameter order */3725fast_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread, j9object_t objectBeingStored, j9object_t destinationObject)3726#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3727fast_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)3728#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3729{3730// extern void* slow_jitTypeCheckArrayStoreWithNullCheck(J9VMThread *currentThread);3731JIT_HELPER_PROLOGUE();3732void *slowPath = NULL;3733if (J9_UNEXPECTED(fast_jitTypeCheckArrayStoreImpl(currentThread, destinationObject, objectBeingStored))) {3734SET_PARM_COUNT(0);3735slowPath = (void*)old_slow_jitTypeCheckArrayStoreWithNullCheck;3736}3737return slowPath;3738}37393740BOOLEAN J9FASTCALL3741#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3742/* TODO Will be cleaned once all platforms adopt the correct parameter order */3743fast_jitAcmpeqHelper(J9VMThread *currentThread, j9object_t lhs, j9object_t rhs)3744#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3745fast_jitAcmpeqHelper(J9VMThread *currentThread, j9object_t rhs, j9object_t lhs)3746#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3747{3748JIT_HELPER_PROLOGUE();37493750return currentThread->javaVM->internalVMFunctions->valueTypeCapableAcmp(currentThread, lhs, rhs);3751}37523753BOOLEAN J9FASTCALL3754#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3755/* TODO Will be cleaned once all platforms adopt the correct parameter order */3756fast_jitAcmpneHelper(J9VMThread *currentThread, j9object_t lhs, j9object_t rhs)3757#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3758fast_jitAcmpneHelper(J9VMThread *currentThread, j9object_t rhs, j9object_t lhs)3759#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3760{3761JIT_HELPER_PROLOGUE();37623763return !currentThread->javaVM->internalVMFunctions->valueTypeCapableAcmp(currentThread, lhs, rhs);3764}37653766void* J9FASTCALL3767#if defined(J9VM_ARCH_X86) || defined(J9VM_ARCH_S390)3768/* TODO Will be cleaned once all platforms adopt the correct parameter order */3769fast_jitTypeCheckArrayStore(J9VMThread *currentThread, j9object_t objectBeingStored, j9object_t destinationObject)3770#else /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3771fast_jitTypeCheckArrayStore(J9VMThread *currentThread, j9object_t destinationObject, j9object_t objectBeingStored)3772#endif /* J9VM_ARCH_X86 || J9VM_ARCH_S390*/3773{3774JIT_HELPER_PROLOGUE();3775/* Not omitting NULL check */3776return fast_jitTypeCheckArrayStoreWithNullCheck(currentThread, destinationObject, objectBeingStored);3777}37783779void* J9FASTCALL3780old_slow_jitReportFinalFieldModified(J9VMThread *currentThread)3781{3782OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(1);3783DECLARE_JIT_PARM(J9Class*, fieldClass, 1);37843785void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);3786VM_VMHelpers::reportFinalFieldModified(currentThread, fieldClass);3787void* addr = restoreJITResolveFrame(currentThread, oldPC, true, false);37883789SLOW_JIT_HELPER_EPILOGUE();3790return addr;3791}37923793void* J9FASTCALL3794old_slow_jitReportInstanceFieldRead(J9VMThread *currentThread)3795{3796OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);3797DECLARE_JIT_PARM(J9JITWatchedInstanceFieldData*, dataBlock, 1);3798DECLARE_JIT_PARM(j9object_t, object, 2);3799J9JavaVM *vm = currentThread->javaVM;3800void *addr = NULL;38013802if (J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_GET_FIELD)) {3803if (J9_ARE_ANY_BITS_SET(J9OBJECT_CLAZZ(currentThread, object)->classFlags, J9ClassHasWatchedFields)) {3804void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);3805ALWAYS_TRIGGER_J9HOOK_VM_GET_FIELD(vm->hookInterface, currentThread, dataBlock->method, dataBlock->location, object, dataBlock->offset);3806addr = restoreJITResolveFrame(currentThread, oldPC, true, false);3807}3808}38093810SLOW_JIT_HELPER_EPILOGUE();3811return addr;3812}38133814void* J9FASTCALL3815old_slow_jitReportInstanceFieldWrite(J9VMThread *currentThread)3816{3817OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(3);3818DECLARE_JIT_PARM(J9JITWatchedInstanceFieldData*, dataBlock, 1);3819DECLARE_JIT_PARM(j9object_t, object, 2);3820DECLARE_JIT_PARM(void*, valuePointer, 3);3821J9JavaVM *vm = currentThread->javaVM;3822void *addr = NULL;38233824if (J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_PUT_FIELD)) {3825if (J9_ARE_ANY_BITS_SET(J9OBJECT_CLAZZ(currentThread, object)->classFlags, J9ClassHasWatchedFields)) {3826void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);3827ALWAYS_TRIGGER_J9HOOK_VM_PUT_FIELD(vm->hookInterface, currentThread, dataBlock->method, dataBlock->location, object, dataBlock->offset, *(U_64*)valuePointer);3828addr = restoreJITResolveFrame(currentThread, oldPC, true, false);3829}3830}38313832SLOW_JIT_HELPER_EPILOGUE();3833return addr;3834}38353836void* J9FASTCALL3837old_slow_jitReportStaticFieldRead(J9VMThread *currentThread)3838{3839OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(1);3840DECLARE_JIT_PARM(J9JITWatchedStaticFieldData*, dataBlock, 1);3841J9JavaVM *vm = currentThread->javaVM;3842void *addr = NULL;38433844if (J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_GET_STATIC_FIELD)) {3845J9Class *fieldClass = dataBlock->fieldClass;3846if (J9_ARE_ANY_BITS_SET(fieldClass->classFlags, J9ClassHasWatchedFields)) {3847void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);3848/* Ensure that this call blocks before reporting the event if another thread3849* is initializing the class.3850*/3851if (J9_UNEXPECTED(VM_VMHelpers::classRequiresInitialization(currentThread, fieldClass))) {3852vm->internalVMFunctions->initializeClass(currentThread, fieldClass);3853if (VM_VMHelpers::exceptionPending(currentThread)) {3854goto restore;3855}3856if (VM_VMHelpers::immediateAsyncPending(currentThread)) {3857goto restore;3858}3859}3860ALWAYS_TRIGGER_J9HOOK_VM_GET_STATIC_FIELD(vm->hookInterface, currentThread, dataBlock->method, dataBlock->location, fieldClass, dataBlock->fieldAddress);3861restore:3862addr = restoreJITResolveFrame(currentThread, oldPC, true, true);3863}3864}38653866SLOW_JIT_HELPER_EPILOGUE();3867return addr;3868}38693870void* J9FASTCALL3871old_slow_jitReportStaticFieldWrite(J9VMThread *currentThread)3872{3873OLD_SLOW_ONLY_JIT_HELPER_PROLOGUE(2);3874DECLARE_JIT_PARM(J9JITWatchedStaticFieldData*, dataBlock, 1);3875DECLARE_JIT_PARM(void*, valuePointer, 2);3876J9JavaVM *vm = currentThread->javaVM;3877void *addr = NULL;38783879if (J9_EVENT_IS_HOOKED(vm->hookInterface, J9HOOK_VM_PUT_STATIC_FIELD)) {3880J9Class *fieldClass = dataBlock->fieldClass;3881if (J9_ARE_ANY_BITS_SET(fieldClass->classFlags, J9ClassHasWatchedFields)) {3882/* Read the data now, as the incoming pointer is potentially into the3883* java stack, which would be invalidated by the class initialization below.3884* Ensure the read does not get reordered below by the compiler.3885*/3886U_64 value = *(U_64 volatile *)valuePointer;3887VM_AtomicSupport::compilerReorderingBarrier();3888void* oldPC = buildJITResolveFrameForRuntimeHelper(currentThread, parmCount);3889/* Ensure that this call blocks before reporting the event if another thread3890* is initializing the class.3891*/3892if (J9_UNEXPECTED(VM_VMHelpers::classRequiresInitialization(currentThread, fieldClass))) {3893vm->internalVMFunctions->initializeClass(currentThread, fieldClass);3894if (VM_VMHelpers::exceptionPending(currentThread)) {3895goto restore;3896}3897if (VM_VMHelpers::immediateAsyncPending(currentThread)) {3898goto restore;3899}3900}3901ALWAYS_TRIGGER_J9HOOK_VM_PUT_STATIC_FIELD(vm->hookInterface, currentThread, dataBlock->method, dataBlock->location, fieldClass, dataBlock->fieldAddress, value);3902restore:3903addr = restoreJITResolveFrame(currentThread, oldPC, true, false);3904}3905}39063907SLOW_JIT_HELPER_EPILOGUE();3908return addr;3909}39103911void3912initPureCFunctionTable(J9JavaVM *vm)3913{3914J9JITConfig *jitConfig = vm->jitConfig;39153916jitConfig->old_fast_jitNewObject = (void*)old_fast_jitNewObject;3917jitConfig->old_slow_jitNewObject = (void*)old_slow_jitNewObject;3918jitConfig->old_fast_jitNewObjectNoZeroInit = (void*)old_fast_jitNewObjectNoZeroInit;3919jitConfig->old_slow_jitNewObjectNoZeroInit = (void*)old_slow_jitNewObjectNoZeroInit;3920jitConfig->old_fast_jitANewArray = (void*)old_fast_jitANewArray;3921jitConfig->old_slow_jitANewArray = (void*)old_slow_jitANewArray;3922jitConfig->old_fast_jitANewArrayNoZeroInit = (void*)old_fast_jitANewArrayNoZeroInit;3923jitConfig->old_slow_jitANewArrayNoZeroInit = (void*)old_slow_jitANewArrayNoZeroInit;3924jitConfig->old_fast_jitNewArray = (void*)old_fast_jitNewArray;3925jitConfig->old_slow_jitNewArray = (void*)old_slow_jitNewArray;3926jitConfig->old_fast_jitNewArrayNoZeroInit = (void*)old_fast_jitNewArrayNoZeroInit;3927jitConfig->old_slow_jitNewArrayNoZeroInit = (void*)old_slow_jitNewArrayNoZeroInit;3928jitConfig->old_slow_jitAMultiNewArray = (void*)old_slow_jitAMultiNewArray;3929jitConfig->old_slow_jitStackOverflow = (void*)old_slow_jitStackOverflow;3930jitConfig->old_slow_jitResolveString = (void*)old_slow_jitResolveString;3931jitConfig->fast_jitAcquireVMAccess = (void*)fast_jitAcquireVMAccess;3932jitConfig->fast_jitReleaseVMAccess = (void*)fast_jitReleaseVMAccess;3933jitConfig->old_slow_jitCheckAsyncMessages = (void*)old_slow_jitCheckAsyncMessages;3934jitConfig->old_fast_jitCheckCast = (void*)old_fast_jitCheckCast;3935jitConfig->old_slow_jitCheckCast = (void*)old_slow_jitCheckCast;3936jitConfig->old_fast_jitCheckCastForArrayStore = (void*)old_fast_jitCheckCastForArrayStore;3937jitConfig->old_slow_jitCheckCastForArrayStore = (void*)old_slow_jitCheckCastForArrayStore;3938jitConfig->old_fast_jitCheckIfFinalizeObject = (void*)old_fast_jitCheckIfFinalizeObject;3939jitConfig->old_fast_jitCollapseJNIReferenceFrame = (void*)old_fast_jitCollapseJNIReferenceFrame;3940jitConfig->old_slow_jitHandleArrayIndexOutOfBoundsTrap = (void*)old_slow_jitHandleArrayIndexOutOfBoundsTrap;3941jitConfig->old_slow_jitHandleIntegerDivideByZeroTrap = (void*)old_slow_jitHandleIntegerDivideByZeroTrap;3942jitConfig->old_slow_jitHandleNullPointerExceptionTrap = (void*)old_slow_jitHandleNullPointerExceptionTrap;3943jitConfig->old_slow_jitHandleInternalErrorTrap = (void*)old_slow_jitHandleInternalErrorTrap;3944jitConfig->old_fast_jitInstanceOf = (void*)old_fast_jitInstanceOf;3945jitConfig->old_fast_jitLookupInterfaceMethod = (void*)old_fast_jitLookupInterfaceMethod;3946jitConfig->old_slow_jitLookupInterfaceMethod = (void*)old_slow_jitLookupInterfaceMethod;3947jitConfig->old_fast_jitLookupDynamicInterfaceMethod = (void*)old_fast_jitLookupDynamicInterfaceMethod;3948jitConfig->old_fast_jitLookupDynamicPublicInterfaceMethod = (void*)old_fast_jitLookupDynamicPublicInterfaceMethod;3949jitConfig->old_slow_jitLookupDynamicPublicInterfaceMethod = (void*)old_slow_jitLookupDynamicPublicInterfaceMethod;3950jitConfig->old_fast_jitMethodIsNative = (void*)old_fast_jitMethodIsNative;3951jitConfig->old_fast_jitMethodIsSync = (void*)old_fast_jitMethodIsSync;3952jitConfig->old_fast_jitMethodMonitorEntry = (void*)old_fast_jitMethodMonitorEntry;3953jitConfig->old_slow_jitMethodMonitorEntry = (void*)old_slow_jitMethodMonitorEntry;3954jitConfig->old_fast_jitMonitorEntry = (void*)old_fast_jitMonitorEntry;3955jitConfig->old_slow_jitMonitorEntry = (void*)old_slow_jitMonitorEntry;3956jitConfig->old_fast_jitMethodMonitorExit = (void*)old_fast_jitMethodMonitorExit;3957jitConfig->old_slow_jitMethodMonitorExit = (void*)old_slow_jitMethodMonitorExit;3958jitConfig->old_slow_jitThrowIncompatibleReceiver = (void*)old_slow_jitThrowIncompatibleReceiver;3959jitConfig->old_fast_jitMonitorExit = (void*)old_fast_jitMonitorExit;3960jitConfig->old_slow_jitMonitorExit = (void*)old_slow_jitMonitorExit;3961jitConfig->old_slow_jitReportMethodEnter = (void*)old_slow_jitReportMethodEnter;3962jitConfig->old_slow_jitReportStaticMethodEnter = (void*)old_slow_jitReportStaticMethodEnter;3963jitConfig->old_slow_jitReportMethodExit = (void*)old_slow_jitReportMethodExit;3964jitConfig->old_slow_jitResolveClass = (void*)old_slow_jitResolveClass;3965jitConfig->old_slow_jitResolveClassFromStaticField = (void*)old_slow_jitResolveClassFromStaticField;3966jitConfig->old_fast_jitResolvedFieldIsVolatile = (void*)old_fast_jitResolvedFieldIsVolatile;3967jitConfig->old_slow_jitResolveField = (void*)old_slow_jitResolveField;3968jitConfig->old_slow_jitResolveFieldSetter = (void*)old_slow_jitResolveFieldSetter;3969jitConfig->old_slow_jitResolveFieldDirect = (void*)old_slow_jitResolveFieldDirect;3970jitConfig->old_slow_jitResolveFieldSetterDirect = (void*)old_slow_jitResolveFieldSetterDirect;3971jitConfig->old_slow_jitResolveStaticField = (void*)old_slow_jitResolveStaticField;3972jitConfig->old_slow_jitResolveStaticFieldSetter = (void*)old_slow_jitResolveStaticFieldSetter;3973jitConfig->old_slow_jitResolveStaticFieldDirect = (void*)old_slow_jitResolveStaticFieldDirect;3974jitConfig->old_slow_jitResolveStaticFieldSetterDirect = (void*)old_slow_jitResolveStaticFieldSetterDirect;3975jitConfig->old_slow_jitResolveInterfaceMethod = (void*)old_slow_jitResolveInterfaceMethod;3976jitConfig->old_slow_jitResolveSpecialMethod = (void*)old_slow_jitResolveSpecialMethod;3977jitConfig->old_slow_jitResolveStaticMethod = (void*)old_slow_jitResolveStaticMethod;3978jitConfig->old_slow_jitResolveVirtualMethod = (void*)old_slow_jitResolveVirtualMethod;3979jitConfig->old_slow_jitResolveMethodType = (void*)old_slow_jitResolveMethodType;3980jitConfig->old_slow_jitResolveMethodHandle = (void*)old_slow_jitResolveMethodHandle;3981jitConfig->old_slow_jitResolveInvokeDynamic = (void*)old_slow_jitResolveInvokeDynamic;3982jitConfig->old_slow_jitResolveConstantDynamic = (void*)old_slow_jitResolveConstantDynamic;3983jitConfig->old_slow_jitResolveHandleMethod = (void*)old_slow_jitResolveHandleMethod;3984jitConfig->old_slow_jitResolveFlattenableField = (void*)old_slow_jitResolveFlattenableField;3985jitConfig->old_slow_jitRetranslateCaller = (void*)old_slow_jitRetranslateCaller;3986jitConfig->old_slow_jitRetranslateCallerWithPreparation = (void*)old_slow_jitRetranslateCallerWithPreparation;3987jitConfig->old_slow_jitRetranslateMethod = (void*)old_slow_jitRetranslateMethod;3988jitConfig->old_slow_jitThrowCurrentException = (void*)old_slow_jitThrowCurrentException;3989jitConfig->old_slow_jitThrowException = (void*)old_slow_jitThrowException;3990jitConfig->old_slow_jitThrowUnreportedException = (void*)old_slow_jitThrowUnreportedException;3991jitConfig->old_slow_jitThrowAbstractMethodError = (void*)old_slow_jitThrowAbstractMethodError;3992jitConfig->old_slow_jitThrowArithmeticException = (void*)old_slow_jitThrowArithmeticException;3993jitConfig->old_slow_jitThrowArrayIndexOutOfBounds = (void*)old_slow_jitThrowArrayIndexOutOfBounds;3994jitConfig->old_slow_jitThrowArrayStoreException = (void*)old_slow_jitThrowArrayStoreException;3995jitConfig->old_slow_jitThrowArrayStoreExceptionWithIP = (void*)old_slow_jitThrowArrayStoreExceptionWithIP;3996jitConfig->old_slow_jitThrowExceptionInInitializerError = (void*)old_slow_jitThrowExceptionInInitializerError;3997jitConfig->old_slow_jitThrowIllegalAccessError = (void*)old_slow_jitThrowIllegalAccessError;3998jitConfig->old_slow_jitThrowIncompatibleClassChangeError = (void*)old_slow_jitThrowIncompatibleClassChangeError;3999jitConfig->old_slow_jitThrowInstantiationException = (void*)old_slow_jitThrowInstantiationException;4000jitConfig->old_slow_jitThrowNullPointerException = (void*)old_slow_jitThrowNullPointerException;4001jitConfig->old_slow_jitThrowWrongMethodTypeException = (void*)old_slow_jitThrowWrongMethodTypeException;4002jitConfig->old_fast_jitTypeCheckArrayStoreWithNullCheck = (void*)old_fast_jitTypeCheckArrayStoreWithNullCheck;4003jitConfig->old_slow_jitTypeCheckArrayStoreWithNullCheck = (void*)old_slow_jitTypeCheckArrayStoreWithNullCheck;4004jitConfig->old_fast_jitTypeCheckArrayStore = (void*)old_fast_jitTypeCheckArrayStore;4005jitConfig->old_slow_jitTypeCheckArrayStore = (void*)old_slow_jitTypeCheckArrayStore;4006jitConfig->old_fast_jitWriteBarrierBatchStore = (void*)old_fast_jitWriteBarrierBatchStore;4007jitConfig->old_fast_jitWriteBarrierBatchStoreWithRange = (void*)old_fast_jitWriteBarrierBatchStoreWithRange;4008jitConfig->old_fast_jitWriteBarrierJ9ClassBatchStore = (void*)old_fast_jitWriteBarrierJ9ClassBatchStore;4009jitConfig->old_fast_jitWriteBarrierJ9ClassStore = (void*)old_fast_jitWriteBarrierJ9ClassStore;4010jitConfig->old_fast_jitWriteBarrierStore = (void*)old_fast_jitWriteBarrierStore;4011jitConfig->old_fast_jitWriteBarrierStoreGenerational = (void*)old_fast_jitWriteBarrierStoreGenerational;4012jitConfig->old_fast_jitWriteBarrierStoreGenerationalAndConcurrentMark = (void*)old_fast_jitWriteBarrierStoreGenerationalAndConcurrentMark;4013jitConfig->old_fast_jitWriteBarrierClassStoreMetronome = (void*)old_fast_jitWriteBarrierClassStoreMetronome;4014jitConfig->old_fast_jitWriteBarrierStoreMetronome = (void*)old_fast_jitWriteBarrierStoreMetronome;4015jitConfig->old_slow_jitCallJitAddPicToPatchOnClassUnload = (void*)old_slow_jitCallJitAddPicToPatchOnClassUnload;4016jitConfig->old_slow_jitCallCFunction = (void*)old_slow_jitCallCFunction;4017jitConfig->fast_jitPreJNICallOffloadCheck = (void*)fast_jitPreJNICallOffloadCheck;4018jitConfig->fast_jitPostJNICallOffloadCheck = (void*)fast_jitPostJNICallOffloadCheck;4019jitConfig->old_fast_jitObjectHashCode = (void*)old_fast_jitObjectHashCode;4020jitConfig->old_slow_jitInduceOSRAtCurrentPC = (void*)old_slow_jitInduceOSRAtCurrentPC;4021jitConfig->old_slow_jitInduceOSRAtCurrentPCAndRecompile = (void*)old_slow_jitInduceOSRAtCurrentPCAndRecompile;4022jitConfig->old_slow_jitInterpretNewInstanceMethod = (void*)old_slow_jitInterpretNewInstanceMethod;4023jitConfig->old_slow_jitNewInstanceImplAccessCheck = (void*)old_slow_jitNewInstanceImplAccessCheck;4024jitConfig->old_slow_jitTranslateNewInstanceMethod = (void*)old_slow_jitTranslateNewInstanceMethod;4025jitConfig->old_slow_jitReportFinalFieldModified = (void*)old_slow_jitReportFinalFieldModified;4026jitConfig->old_fast_jitGetFlattenableField = (void*) old_fast_jitGetFlattenableField;4027jitConfig->old_fast_jitCloneValueType = (void*) old_fast_jitCloneValueType;4028jitConfig->old_fast_jitWithFlattenableField = (void*) old_fast_jitWithFlattenableField;4029jitConfig->old_fast_jitPutFlattenableField = (void*) old_fast_jitPutFlattenableField;4030jitConfig->old_fast_jitGetFlattenableStaticField = (void*) old_fast_jitGetFlattenableStaticField;4031jitConfig->old_fast_jitPutFlattenableStaticField = (void*) old_fast_jitPutFlattenableStaticField;4032jitConfig->old_fast_jitLoadFlattenableArrayElement = (void*) old_fast_jitLoadFlattenableArrayElement;4033jitConfig->old_fast_jitStoreFlattenableArrayElement = (void*) old_fast_jitStoreFlattenableArrayElement;4034jitConfig->old_fast_jitAcmpeqHelper = (void*)old_fast_jitAcmpeqHelper;4035jitConfig->old_fast_jitAcmpneHelper = (void*)old_fast_jitAcmpneHelper;4036jitConfig->fast_jitNewValue = (void*)fast_jitNewValue;4037jitConfig->fast_jitNewValueNoZeroInit = (void*)fast_jitNewValueNoZeroInit;4038jitConfig->fast_jitNewObject = (void*)fast_jitNewObject;4039jitConfig->fast_jitNewObjectNoZeroInit = (void*)fast_jitNewObjectNoZeroInit;4040jitConfig->fast_jitANewArray = (void*)fast_jitANewArray;4041jitConfig->fast_jitANewArrayNoZeroInit = (void*)fast_jitANewArrayNoZeroInit;4042jitConfig->fast_jitNewArray = (void*)fast_jitNewArray;4043jitConfig->fast_jitNewArrayNoZeroInit = (void*)fast_jitNewArrayNoZeroInit;4044jitConfig->fast_jitCheckCast = (void*)fast_jitCheckCast;4045jitConfig->fast_jitCheckCastForArrayStore = (void*)fast_jitCheckCastForArrayStore;4046jitConfig->fast_jitMethodMonitorEntry = (void*)fast_jitMethodMonitorEntry;4047jitConfig->fast_jitMonitorEntry = (void*)fast_jitMonitorEntry;4048jitConfig->fast_jitMethodMonitorExit = (void*)fast_jitMethodMonitorExit;4049jitConfig->fast_jitMonitorExit = (void*)fast_jitMonitorExit;4050jitConfig->fast_jitTypeCheckArrayStore = (void*)fast_jitTypeCheckArrayStore;4051jitConfig->fast_jitTypeCheckArrayStoreWithNullCheck = (void*)fast_jitTypeCheckArrayStoreWithNullCheck;4052#if !defined(J9VM_ENV_DATA64)4053jitConfig->old_fast_jitVolatileReadLong = (void*)old_fast_jitVolatileReadLong;4054jitConfig->old_fast_jitVolatileWriteLong = (void*)old_fast_jitVolatileWriteLong;4055jitConfig->old_fast_jitVolatileReadDouble = (void*)old_fast_jitVolatileReadDouble;4056jitConfig->old_fast_jitVolatileWriteDouble = (void*)old_fast_jitVolatileWriteDouble;4057#endif /* !J9VM_ENV_DATA64 */4058#if defined(J9SW_NEEDS_JIT_2_INTERP_THUNKS)4059jitConfig->old_slow_icallVMprJavaSendPatchupVirtual = (void*)old_slow_icallVMprJavaSendPatchupVirtual;4060#endif /* J9SW_NEEDS_JIT_2_INTERP_THUNKS */4061jitConfig->c_jitDecompileOnReturn = (void*)c_jitDecompileOnReturn;4062jitConfig->c_jitDecompileAtExceptionCatch = (void*)c_jitDecompileAtExceptionCatch;4063jitConfig->c_jitReportExceptionCatch = (void*)c_jitReportExceptionCatch;4064jitConfig->c_jitDecompileAtCurrentPC = (void*)c_jitDecompileAtCurrentPC;4065jitConfig->c_jitDecompileBeforeReportMethodEnter = (void*)c_jitDecompileBeforeReportMethodEnter;4066jitConfig->c_jitDecompileBeforeMethodMonitorEnter = (void*)c_jitDecompileBeforeMethodMonitorEnter;4067jitConfig->c_jitDecompileAfterAllocation = (void*)c_jitDecompileAfterAllocation;4068jitConfig->c_jitDecompileAfterMonitorEnter = (void*)c_jitDecompileAfterMonitorEnter;4069jitConfig->old_slow_jitReportInstanceFieldRead = (void*)old_slow_jitReportInstanceFieldRead;4070jitConfig->old_slow_jitReportInstanceFieldWrite = (void*)old_slow_jitReportInstanceFieldWrite;4071jitConfig->old_slow_jitReportStaticFieldRead = (void*)old_slow_jitReportStaticFieldRead;4072jitConfig->old_slow_jitReportStaticFieldWrite = (void*)old_slow_jitReportStaticFieldWrite;4073}40744075} /* extern "C" */407640774078