Path: blob/master/runtime/jcl/common/jithelpers.c
6000 views
/*******************************************************************************1* Copyright (c) 1998, 2021 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 "jni.h"23#include "j9.h"24#include "j9cp.h"25#include "jclprots.h"26#include "j9modifiers_api.h"2728/*29* The following natives are called by the JITHelpers static initializer. They do not require special treatment by the JIT.30*/3132jint JNICALL33Java_com_ibm_jit_JITHelpers_javaLangClassJ9ClassOffset(JNIEnv *env, jclass ignored)34{35J9VMThread * vmThread = (J9VMThread *)env;36jint offset;3738vmThread->javaVM->internalVMFunctions->internalEnterVMFromJNI(vmThread);39offset = (jint) J9VMJAVALANGCLASS_VMREF_OFFSET(vmThread);40vmThread->javaVM->internalVMFunctions->internalExitVMToJNI(vmThread);4142return offset;43}4445jint JNICALL46Java_com_ibm_jit_JITHelpers_j9ObjectJ9ClassOffset(JNIEnv *env, jclass ignored)47{48return (jint) offsetof(J9Object, clazz);49}5051jint JNICALL52Java_com_ibm_jit_JITHelpers_j9ObjectFlagsMask32(JNIEnv *env, jclass ignored)53{54return (jint) (J9_REQUIRED_CLASS_ALIGNMENT - 1);55}5657jlong JNICALL58Java_com_ibm_jit_JITHelpers_j9ObjectFlagsMask64(JNIEnv *env, jclass ignored)59{60return (jlong)(J9_REQUIRED_CLASS_ALIGNMENT - 1);61}6263jint JNICALL64Java_com_ibm_jit_JITHelpers_javaLangThreadJ9ThreadOffset(JNIEnv *env, jclass ignored)65{66J9VMThread * vmThread = (J9VMThread *)env;67return (jint) J9VMJAVALANGTHREAD_THREADREF_OFFSET(vmThread);68}6970jint JNICALL71Java_com_ibm_jit_JITHelpers_j9ThreadJ9JavaVMOffset(JNIEnv *env, jclass ignored)72{73return (jint) offsetof(J9VMThread, javaVM);74}7576jint JNICALL77Java_com_ibm_jit_JITHelpers_j9ROMArrayClassArrayShapeOffset(JNIEnv *env, jclass ignored)78{79return (jint) offsetof(J9ROMArrayClass, arrayShape);80}8182jint JNICALL83Java_com_ibm_jit_JITHelpers_j9ClassBackfillOffsetOffset(JNIEnv *env, jclass ignored)84{85return (jint) offsetof(J9Class, backfillOffset);86}8788jint JNICALL89Java_com_ibm_jit_JITHelpers_arrayShapeElementCountMask(JNIEnv *env, jclass ignored)90{91return (jint) 0x0000FFFF;92}9394jint JNICALL95Java_com_ibm_jit_JITHelpers_j9JavaVMIdentityHashDataOffset(JNIEnv *env, jclass ignored)96{97return (jint) offsetof(J9JavaVM, identityHashData);98}99100jint JNICALL101Java_com_ibm_jit_JITHelpers_j9IdentityHashDataHashData1Offset(JNIEnv *env, jclass ignored)102{103return (jint) offsetof(J9IdentityHashData, hashData1);104}105106jint JNICALL107Java_com_ibm_jit_JITHelpers_j9IdentityHashDataHashData2Offset(JNIEnv *env, jclass ignored)108{109return (jint) offsetof(J9IdentityHashData, hashData2);110}111112jint JNICALL113Java_com_ibm_jit_JITHelpers_j9IdentityHashDataHashData3Offset(JNIEnv *env, jclass ignored)114{115return (jint) offsetof(J9IdentityHashData, hashData3);116}117118jint JNICALL119Java_com_ibm_jit_JITHelpers_j9IdentityHashDataHashSaltTableOffset(JNIEnv *env, jclass ignored)120{121return (jint) offsetof(J9IdentityHashData, hashSaltTable);122}123124jint JNICALL125Java_com_ibm_jit_JITHelpers_j9IdentityHashSaltPolicyStandard(JNIEnv *env, jclass ignored)126{127return (jint) J9_IDENTITY_HASH_SALT_POLICY_STANDARD;128}129130jint JNICALL131Java_com_ibm_jit_JITHelpers_j9IdentityHashSaltPolicyRegion(JNIEnv *env, jclass ignored)132{133return (jint) J9_IDENTITY_HASH_SALT_POLICY_REGION;134}135136jint JNICALL137Java_com_ibm_jit_JITHelpers_j9IdentityHashSaltPolicyNone(JNIEnv *env, jclass ignored)138{139return (jint) J9_IDENTITY_HASH_SALT_POLICY_NONE;140}141142jint JNICALL143Java_com_ibm_jit_JITHelpers_identityHashSaltPolicy(JNIEnv *env, jclass ignored)144{145J9VMThread * vmThread = (J9VMThread *)env;146J9IdentityHashData *hashData = vmThread->javaVM->identityHashData;147UDATA saltPolicy = hashData->hashSaltPolicy;148return (jint) saltPolicy;149}150151152jint JNICALL153Java_com_ibm_jit_JITHelpers_j9ContiguousArrayHeaderSize(JNIEnv *env, jclass ignored)154{155return (jint) J9VMTHREAD_CONTIGUOUS_HEADER_SIZE((J9VMThread*)env);156}157158jint JNICALL159Java_com_ibm_jit_JITHelpers_j9DiscontiguousArrayHeaderSize(JNIEnv *env, jclass ignored)160{161return (jint) J9VMTHREAD_DISCONTIGUOUS_HEADER_SIZE((J9VMThread*)env);162}163164jint JNICALL165Java_com_ibm_jit_JITHelpers_j9ObjectContiguousLengthOffset(JNIEnv *env, jclass ignored)166{167if (J9VMTHREAD_COMPRESS_OBJECT_REFERENCES((J9VMThread*)env)) {168return (jint) offsetof(J9IndexableObjectContiguousCompressed, size);169}170return (jint) offsetof(J9IndexableObjectContiguousFull, size);171}172173jint JNICALL174Java_com_ibm_jit_JITHelpers_j9ObjectDiscontiguousLengthOffset(JNIEnv *env, jclass ignored)175{176if (J9VMTHREAD_COMPRESS_OBJECT_REFERENCES((J9VMThread*)env)) {177return (jint) offsetof(J9IndexableObjectDiscontiguousCompressed, size);178}179return (jint) offsetof(J9IndexableObjectDiscontiguousFull, size);180}181182jboolean JNICALL183Java_com_ibm_jit_JITHelpers_isBigEndian(JNIEnv *env, jclass ignored)184{185#if defined(J9VM_ENV_LITTLE_ENDIAN)186return JNI_FALSE;187#else188return JNI_TRUE;189#endif190}191192/*193* The following natives are recognized and handled specially by the JIT.194*/195196jboolean JNICALL197Java_com_ibm_jit_JITHelpers_is32Bit(JNIEnv *env, jobject rcv)198{199#if defined(J9VM_ENV_DATA64)200return JNI_FALSE;201#else202return JNI_TRUE;203#endif204}205206jint JNICALL207Java_com_ibm_jit_JITHelpers_getNumBitsInReferenceField(JNIEnv *env, jobject rcv)208{209return (jint) (J9VMTHREAD_REFERENCE_SIZE((J9VMThread*)env) * 8);210}211212jint JNICALL213Java_com_ibm_jit_JITHelpers_getNumBytesInReferenceField(JNIEnv *env, jobject rcv)214{215return (jint) J9VMTHREAD_REFERENCE_SIZE((J9VMThread*)env);216}217218jint JNICALL219Java_com_ibm_jit_JITHelpers_getNumBitsInDescriptionWord(JNIEnv *env, jobject rcv)220{221return (jint) (sizeof(UDATA) * 8);222}223224jint JNICALL225Java_com_ibm_jit_JITHelpers_getNumBytesInDescriptionWord(JNIEnv *env, jobject rcv)226{227return (jint) sizeof(UDATA);228}229230jint JNICALL231Java_com_ibm_jit_JITHelpers_getNumBytesInJ9ObjectHeader(JNIEnv *env, jobject rcv)232{233return (jint) J9VMTHREAD_OBJECT_HEADER_SIZE((J9VMThread*)env);234}235236#if defined(J9VM_ENV_DATA64)237238jlong JNICALL239Java_com_ibm_jit_JITHelpers_getJ9ClassFromClass64(JNIEnv *env, jobject rcv, jclass c)240{241J9VMThread * vmThread = (J9VMThread *)env;242J9Class * clazz;243244vmThread->javaVM->internalVMFunctions->internalEnterVMFromJNI(vmThread);245clazz = J9VM_J9CLASS_FROM_HEAPCLASS(vmThread, J9_JNI_UNWRAP_REFERENCE(c));246vmThread->javaVM->internalVMFunctions->internalExitVMToJNI(vmThread);247return (jlong)(UDATA)clazz;248}249250jobject JNICALL251Java_com_ibm_jit_JITHelpers_getClassFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)252{253J9VMThread * vmThread = (J9VMThread *)env;254J9InternalVMFunctions * vmfns = vmThread->javaVM->internalVMFunctions;255jobject classRef;256257vmfns->internalEnterVMFromJNI(vmThread);258classRef = vmfns->j9jni_createLocalRef(env, J9VM_J9CLASS_TO_HEAPCLASS((J9Class*)(UDATA)j9clazz));259if (NULL == classRef) {260vmfns->setNativeOutOfMemoryError(vmThread, 0, 0);261}262vmfns->internalExitVMToJNI(vmThread);263return classRef;264}265266jlong JNICALL267Java_com_ibm_jit_JITHelpers_getTotalInstanceSizeFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)268{269J9Class * clazz = (J9Class *)(UDATA)j9clazz;270271return (jlong)clazz->totalInstanceSize;272}273274jlong JNICALL275Java_com_ibm_jit_JITHelpers_getInstanceDescriptionFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)276{277J9Class * clazz = (J9Class *)(UDATA)j9clazz;278279return (jlong)(UDATA)clazz->instanceDescription;280}281282jlong JNICALL283Java_com_ibm_jit_JITHelpers_getDescriptionWordFromPtr64(JNIEnv *env, jobject rcv, jlong descriptorPtr)284{285return *(jlong*)(UDATA)descriptorPtr;286}287288jlong JNICALL289Java_com_ibm_jit_JITHelpers_getRomClassFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)290{291J9Class * clazz = (J9Class *)(UDATA)j9clazz;292293return (jlong)(UDATA)clazz->romClass;294}295296jlong JNICALL297Java_com_ibm_jit_JITHelpers_getSuperClassesFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)298{299J9Class * clazz = (J9Class *)(UDATA)j9clazz;300301return (jlong)(UDATA)clazz->superclasses;302}303304jlong JNICALL305Java_com_ibm_jit_JITHelpers_getClassDepthAndFlagsFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)306{307J9Class * clazz = (J9Class *)(UDATA)j9clazz;308309return (jlong)clazz->classDepthAndFlags;310}311312jlong JNICALL313Java_com_ibm_jit_JITHelpers_getBackfillOffsetFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)314{315J9Class * clazz = (J9Class *)(UDATA)j9clazz;316317return (jlong)clazz->backfillOffset;318}319320jint JNICALL321Java_com_ibm_jit_JITHelpers_getArrayShapeFromRomClass64(JNIEnv *env, jobject rcv, jlong j9romclazz)322{323J9ROMArrayClass * romArrayClass = (J9ROMArrayClass *)(UDATA)j9romclazz;324325return (jint)romArrayClass->arrayShape;326}327328jint JNICALL329Java_com_ibm_jit_JITHelpers_getModifiersFromRomClass64(JNIEnv *env, jobject rcv, jlong j9romclazz)330{331J9ROMClass * romClass = (J9ROMClass *)(UDATA)j9romclazz;332333return (jint)romClass->modifiers;334}335336jint JNICALL337Java_com_ibm_jit_JITHelpers_getClassFlagsFromJ9Class64(JNIEnv *env, jobject rcv, jlong j9clazz)338{339J9Class *clazz = (J9Class *)(UDATA)j9clazz;340return clazz->classFlags;341}342#else343344jint JNICALL345Java_com_ibm_jit_JITHelpers_getJ9ClassFromClass32(JNIEnv *env, jobject rcv, jclass c)346{347J9VMThread * vmThread = (J9VMThread *)env;348J9Class * clazz;349350vmThread->javaVM->internalVMFunctions->internalEnterVMFromJNI(vmThread);351clazz = J9VM_J9CLASS_FROM_HEAPCLASS(vmThread, J9_JNI_UNWRAP_REFERENCE(c));352vmThread->javaVM->internalVMFunctions->internalExitVMToJNI(vmThread);353return (jint)(UDATA)clazz;354}355356jobject JNICALL357Java_com_ibm_jit_JITHelpers_getClassFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)358{359J9VMThread * vmThread = (J9VMThread *)env;360J9InternalVMFunctions * vmfns = vmThread->javaVM->internalVMFunctions;361jobject classRef;362363vmfns->internalEnterVMFromJNI(vmThread);364classRef = vmfns->j9jni_createLocalRef(env, J9VM_J9CLASS_TO_HEAPCLASS((J9Class*)(UDATA)j9clazz));365if (NULL == classRef) {366vmfns->setNativeOutOfMemoryError(vmThread, 0, 0);367}368vmfns->internalExitVMToJNI(vmThread);369return classRef;370}371372jint JNICALL373Java_com_ibm_jit_JITHelpers_getTotalInstanceSizeFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)374{375J9Class * clazz = (J9Class *)(UDATA)j9clazz;376377return (jint)clazz->totalInstanceSize;378}379380jint JNICALL381Java_com_ibm_jit_JITHelpers_getInstanceDescriptionFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)382{383J9Class * clazz = (J9Class *)(UDATA)j9clazz;384385return (jint)(UDATA)clazz->instanceDescription;386}387388jint JNICALL389Java_com_ibm_jit_JITHelpers_getDescriptionWordFromPtr32(JNIEnv *env, jobject rcv, jint descriptorPtr)390{391return *(jint*)(UDATA)descriptorPtr;392}393394jint JNICALL395Java_com_ibm_jit_JITHelpers_getRomClassFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)396{397J9Class * clazz = (J9Class *)(UDATA)j9clazz;398399return (jint)(UDATA)clazz->romClass;400}401402jint JNICALL403Java_com_ibm_jit_JITHelpers_getSuperClassesFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)404{405J9Class * clazz = (J9Class *)(UDATA)j9clazz;406407return (jint)(UDATA)clazz->superclasses;408}409410jint JNICALL411Java_com_ibm_jit_JITHelpers_getClassDepthAndFlagsFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)412{413J9Class * clazz = (J9Class *)(UDATA)j9clazz;414415return (jint)clazz->classDepthAndFlags;416}417418jint JNICALL419Java_com_ibm_jit_JITHelpers_getBackfillOffsetFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)420{421J9Class * clazz = (J9Class *)(UDATA)j9clazz;422423return (jint)clazz->backfillOffset;424}425426jint JNICALL427Java_com_ibm_jit_JITHelpers_getArrayShapeFromRomClass32(JNIEnv *env, jobject rcv, jint j9romclazz)428{429J9ROMArrayClass * romArrayClass = (J9ROMArrayClass *)(UDATA)j9romclazz;430431return (jint)romArrayClass->arrayShape;432}433434jint JNICALL435Java_com_ibm_jit_JITHelpers_getModifiersFromRomClass32(JNIEnv *env, jobject rcv, jint j9romclazz)436{437J9ROMClass * romClass = (J9ROMClass *)(UDATA)j9romclazz;438439return (jint)romClass->modifiers;440}441442jint JNICALL443Java_com_ibm_jit_JITHelpers_getClassFlagsFromJ9Class32(JNIEnv *env, jobject rcv, jint j9clazz)444{445J9Class *clazz = (J9Class *)(UDATA)j9clazz;446return clazz->classFlags;447}448449#endif450451452