157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers/* 257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Copyright (C) 2012 The Android Open Source Project 357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * you may not use this file except in compliance with the License. 657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * You may obtain a copy of the License at 757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 1057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Unless required by applicable law or agreed to in writing, software 1157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 1257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * See the License for the specific language governing permissions and 1457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * limitations under the License. 1557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 1657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 17166db04e259ca51838c311891598664deeed85adIan Rogers#ifndef ART_RUNTIME_ENTRYPOINTS_QUICK_QUICK_ENTRYPOINTS_H_ 18166db04e259ca51838c311891598664deeed85adIan Rogers#define ART_RUNTIME_ENTRYPOINTS_QUICK_QUICK_ENTRYPOINTS_H_ 1957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 20848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers#include <jni.h> 21848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers 22848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers#include "base/macros.h" 23848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers#include "offsets.h" 2457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 257655f29fabc0a12765de828914a18314382e5a35Ian Rogers#define QUICK_ENTRYPOINT_OFFSET(x) \ 26848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers ThreadOffset(static_cast<uintptr_t>(OFFSETOF_MEMBER(Thread, quick_entrypoints_)) + \ 27848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers static_cast<uintptr_t>(OFFSETOF_MEMBER(QuickEntryPoints, x))) 2857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2957b86d47b66322693a070185fadfb43cb9c12eabIan Rogersnamespace art { 30848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 32ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromclass ArtMethod; 33ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromclass Class; 34ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromclass Object; 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 36848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers 3757b86d47b66322693a070185fadfb43cb9c12eabIan Rogersclass Thread; 3857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 39166db04e259ca51838c311891598664deeed85adIan Rogers// Pointers to functions that are called by quick compiler generated code via thread-local storage. 40166db04e259ca51838c311891598664deeed85adIan Rogersstruct PACKED(4) QuickEntryPoints { 4157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Alloc 42848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pAllocArray)(uint32_t, void*, int32_t); 43848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pAllocArrayWithAccessCheck)(uint32_t, void*, int32_t); 44848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pAllocObject)(uint32_t, void*); 45848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pAllocObjectWithAccessCheck)(uint32_t, void*); 46848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pCheckAndAllocArray)(uint32_t, void*, int32_t); 47848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pCheckAndAllocArrayWithAccessCheck)(uint32_t, void*, int32_t); 4857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 4957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Cast 50848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers uint32_t (*pInstanceofNonTrivial)(const mirror::Class*, const mirror::Class*); 51848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pCanPutArrayElement)(void*, void*); 52848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pCheckCast)(void*, void*); 5357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 5457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // DexCache 5557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pInitializeStaticStorage)(uint32_t, void*); 56848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pInitializeTypeAndVerifyAccess)(uint32_t, void*); 57848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pInitializeType)(uint32_t, void*); 58848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void* (*pResolveString)(void*, uint32_t); 5957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 6057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Field 6157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSet32Instance)(uint32_t, void*, int32_t); // field_idx, obj, src 6257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSet32Static)(uint32_t, int32_t); 6357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSet64Instance)(uint32_t, void*, int64_t); 6457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSet64Static)(uint32_t, int64_t); 6557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSetObjInstance)(uint32_t, void*, void*); 6657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSetObjStatic)(uint32_t, void*); 6757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pGet32Instance)(uint32_t, void*); 6857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pGet32Static)(uint32_t); 6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int64_t (*pGet64Instance)(uint32_t, void*); 7057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int64_t (*pGet64Static)(uint32_t); 7157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pGetObjInstance)(uint32_t, void*); 7257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pGetObjStatic)(uint32_t); 7357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 7457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // FillArray 75848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pHandleFillArrayData)(void*, void*); 7657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 7757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // JNI 7800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers uint32_t (*pJniMethodStart)(Thread*); 7900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers uint32_t (*pJniMethodStartSynchronized)(jobject to_lock, Thread* self); 8000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void (*pJniMethodEnd)(uint32_t cookie, Thread* self); 8100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers void (*pJniMethodEndSynchronized)(uint32_t cookie, jobject locked, Thread* self); 822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* (*pJniMethodEndWithReference)(jobject result, uint32_t cookie, Thread* self); 832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* (*pJniMethodEndWithReferenceSynchronized)(jobject result, uint32_t cookie, 8400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers jobject locked, Thread* self); 8557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 8657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Locks 87848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pLockObject)(void*); 88848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pUnlockObject)(void*); 8957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 9057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Math 9157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pCmpgDouble)(double, double); 9257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pCmpgFloat)(float, float); 9357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pCmplDouble)(double, double); 9457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pCmplFloat)(float, float); 9557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers double (*pFmod)(double, double); 960183dd7297709ef0beb31e120fc34fdd12f61915Ian Rogers double (*pSqrt)(double); 9757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers double (*pL2d)(int64_t); 9857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers float (*pFmodf)(float, float); 9957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers float (*pL2f)(int64_t); 10057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pD2iz)(double); 10157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pF2iz)(float); 10257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pIdivmod)(int32_t, int32_t); 10357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int64_t (*pD2l)(double); 10457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int64_t (*pF2l)(float); 10555bd45f4ea40b9a0af323f813d07f23d7a8ed397Ian Rogers int64_t (*pLdiv)(int64_t, int64_t); 10657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int64_t (*pLdivmod)(int64_t, int64_t); 10757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int64_t (*pLmul)(int64_t, int64_t); 10857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers uint64_t (*pShlLong)(uint64_t, uint32_t); 10957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers uint64_t (*pShrLong)(uint64_t, uint32_t); 11057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers uint64_t (*pUshrLong)(uint64_t, uint32_t); 11157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 11257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Intrinsics 11357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pIndexOf)(void*, uint32_t, uint32_t, uint32_t); 11457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pMemcmp16)(void*, void*, int32_t); 11557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pStringCompareTo)(void*, void*); 11657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pMemcpy)(void*, const void*, size_t); 11757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 11857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Invocation 119ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void (*pQuickResolutionTrampoline)(mirror::ArtMethod*); 120ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void (*pQuickToInterpreterBridge)(mirror::ArtMethod*); 12157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeDirectTrampolineWithAccessCheck)(uint32_t, void*); 12257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeInterfaceTrampoline)(uint32_t, void*); 12357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeInterfaceTrampolineWithAccessCheck)(uint32_t, void*); 12457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeStaticTrampolineWithAccessCheck)(uint32_t, void*); 12557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeSuperTrampolineWithAccessCheck)(uint32_t, void*); 12657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeVirtualTrampolineWithAccessCheck)(uint32_t, void*); 12757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 12857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Thread 129848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pCheckSuspend)(Thread*); // Stub that is called when the suspend count is non-zero 130848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pTestSuspend)(); // Stub that is periodically called to test the suspend count 13157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 13257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Throws 13357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pDeliverException)(void*); 134848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pThrowArrayBounds)(int32_t, int32_t); 135848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pThrowDivZero)(); 136848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pThrowNoSuchMethod)(int32_t); 137848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pThrowNullPointer)(); 138848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers void (*pThrowStackOverflow)(void*); 13957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}; 14057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 14163937db1cec24d065e2b4cdb7a41809528b5085bAnwar Ghuloum 142693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers// JNI entrypoints. 143848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogersextern uint32_t JniMethodStart(Thread* self) UNLOCK_FUNCTION(Locks::mutator_lock_) HOT_ATTR; 144693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern uint32_t JniMethodStartSynchronized(jobject to_lock, Thread* self) 14563937db1cec24d065e2b4cdb7a41809528b5085bAnwar Ghuloum UNLOCK_FUNCTION(Locks::mutator_lock_) HOT_ATTR; 146693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern void JniMethodEnd(uint32_t saved_local_ref_cookie, Thread* self) 14763937db1cec24d065e2b4cdb7a41809528b5085bAnwar Ghuloum SHARED_LOCK_FUNCTION(Locks::mutator_lock_) HOT_ATTR; 148693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern void JniMethodEndSynchronized(uint32_t saved_local_ref_cookie, jobject locked, 149693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers Thread* self) 15063937db1cec24d065e2b4cdb7a41809528b5085bAnwar Ghuloum SHARED_LOCK_FUNCTION(Locks::mutator_lock_) HOT_ATTR; 151693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern mirror::Object* JniMethodEndWithReference(jobject result, uint32_t saved_local_ref_cookie, 152693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers Thread* self) 15363937db1cec24d065e2b4cdb7a41809528b5085bAnwar Ghuloum SHARED_LOCK_FUNCTION(Locks::mutator_lock_) HOT_ATTR; 154693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers 155693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern mirror::Object* JniMethodEndWithReferenceSynchronized(jobject result, 156693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers uint32_t saved_local_ref_cookie, 157693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers jobject locked, Thread* self) 15863937db1cec24d065e2b4cdb7a41809528b5085bAnwar Ghuloum SHARED_LOCK_FUNCTION(Locks::mutator_lock_) HOT_ATTR; 159693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers 16057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} // namespace art 16157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 162166db04e259ca51838c311891598664deeed85adIan Rogers#endif // ART_RUNTIME_ENTRYPOINTS_QUICK_QUICK_ENTRYPOINTS_H_ 163