quick_entrypoints.h revision 693ff61274cd2c9b8eb7e68c370f84a911b8ca52
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 1757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#ifndef ART_SRC_OAT_RUNTIME_OAT_SUPPORT_ENTRYPOINTS_H_ 1857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#define ART_SRC_OAT_RUNTIME_OAT_SUPPORT_ENTRYPOINTS_H_ 1957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "runtime.h" 2157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#define ENTRYPOINT_OFFSET(x) \ 23748474146da0c6484fa3dca0a700f612d47550c3Elliott Hughes (static_cast<uintptr_t>(OFFSETOF_MEMBER(Thread, entrypoints_)) + \ 24748474146da0c6484fa3dca0a700f612d47550c3Elliott Hughes static_cast<uintptr_t>(OFFSETOF_MEMBER(EntryPoints, x))) 2557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2657b86d47b66322693a070185fadfb43cb9c12eabIan Rogersnamespace art { 272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass AbstractMethod; 2957b86d47b66322693a070185fadfb43cb9c12eabIan Rogersclass Class; 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass Object; 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 327b9d996e4cd7d154bb1a244d67139aff0c363cf2Elliott Hughesclass DvmDex; 3357b86d47b66322693a070185fadfb43cb9c12eabIan Rogersclass Thread; 3457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 35df1ce91ba97bc79a0637e5504b39318fb1c9f577Ian Rogersstruct PACKED(4) EntryPoints { 3657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Alloc 3757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pAllocArrayFromCode)(uint32_t, void*, int32_t); 3857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pAllocArrayFromCodeWithAccessCheck)(uint32_t, void*, int32_t); 3957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pAllocObjectFromCode)(uint32_t, void*); 4057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pAllocObjectFromCodeWithAccessCheck)(uint32_t, void*); 4157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pCheckAndAllocArrayFromCode)(uint32_t, void*, int32_t); 4257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pCheckAndAllocArrayFromCodeWithAccessCheck)(uint32_t, void*, int32_t); 4357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 4457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Cast 452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t (*pInstanceofNonTrivialFromCode)(const mirror::Class*, const mirror::Class*); 4657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pCanPutArrayElementFromCode)(void*, void*); 4757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pCheckCastFromCode)(void*, void*); 4857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 4957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Debug 502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void (*pDebugMe)(mirror::AbstractMethod*, uint32_t); 5157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pUpdateDebuggerFromCode)(void*, void*, int32_t, void*); 5257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 5357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // DexCache 5457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pInitializeStaticStorage)(uint32_t, void*); 5557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pInitializeTypeAndVerifyAccessFromCode)(uint32_t, void*); 5657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pInitializeTypeFromCode)(uint32_t, void*); 5757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pResolveStringFromCode)(void*, uint32_t); 5857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 5957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Field 6057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSet32Instance)(uint32_t, void*, int32_t); // field_idx, obj, src 6157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSet32Static)(uint32_t, int32_t); 6257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSet64Instance)(uint32_t, void*, int64_t); 6357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSet64Static)(uint32_t, int64_t); 6457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSetObjInstance)(uint32_t, void*, void*); 6557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int (*pSetObjStatic)(uint32_t, void*); 6657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pGet32Instance)(uint32_t, void*); 6757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int32_t (*pGet32Static)(uint32_t); 6857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int64_t (*pGet64Instance)(uint32_t, void*); 6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers int64_t (*pGet64Static)(uint32_t); 7057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pGetObjInstance)(uint32_t, void*); 7157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pGetObjStatic)(uint32_t); 7257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 7357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // FillArray 7457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pHandleFillArrayDataFromCode)(void*, void*); 7557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 7657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // JNI 7757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void* (*pFindNativeMethod)(Thread* thread); 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 8757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pLockObjectFromCode)(void*); 8857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pUnlockObjectFromCode)(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 1192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const void* (*pUnresolvedDirectMethodTrampolineFromCode)(mirror::AbstractMethod*, 1202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::AbstractMethod**, Thread*, 12157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers Runtime::TrampolineType); 12257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeDirectTrampolineWithAccessCheck)(uint32_t, void*); 12357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeInterfaceTrampoline)(uint32_t, void*); 12457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeInterfaceTrampolineWithAccessCheck)(uint32_t, void*); 12557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeStaticTrampolineWithAccessCheck)(uint32_t, void*); 12657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeSuperTrampolineWithAccessCheck)(uint32_t, void*); 12757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pInvokeVirtualTrampolineWithAccessCheck)(uint32_t, void*); 12857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 12957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Thread 13057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pCheckSuspendFromCode)(Thread*); // Stub that is called when the suspend count is non-zero 13157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pTestSuspendFromCode)(); // Stub that is periodically called to test the suspend count 13257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 13357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers // Throws 13457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pDeliverException)(void*); 1352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void (*pThrowAbstractMethodErrorFromCode)(mirror::AbstractMethod* m, Thread* thread, 1362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::AbstractMethod** sp); 13757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pThrowArrayBoundsFromCode)(int32_t, int32_t); 13857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pThrowDivZeroFromCode)(); 13957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pThrowNoSuchMethodFromCode)(int32_t); 14057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pThrowNullPointerFromCode)(); 14157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers void (*pThrowStackOverflowFromCode)(void*); 14257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}; 14357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 144693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers// JNI entrypoints. 145693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern void* FindNativeMethod(Thread* thread) LOCKS_EXCLUDED(Locks::mutator_lock_); 146693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern uint32_t JniMethodStart(Thread* self) 147693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers UNLOCK_FUNCTION(Locks::mutator_lock_) __attribute__ ((hot)); 148693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern uint32_t JniMethodStartSynchronized(jobject to_lock, Thread* self) 149693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers UNLOCK_FUNCTION(Locks::mutator_lock_) __attribute__ ((hot)); 150693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern void JniMethodEnd(uint32_t saved_local_ref_cookie, Thread* self) 151693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers SHARED_LOCK_FUNCTION(Locks::mutator_lock_) __attribute__ ((hot)); 152693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern void JniMethodEndSynchronized(uint32_t saved_local_ref_cookie, jobject locked, 153693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers Thread* self) 154693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers SHARED_LOCK_FUNCTION(Locks::mutator_lock_) __attribute__ ((hot)); 155693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern mirror::Object* JniMethodEndWithReference(jobject result, uint32_t saved_local_ref_cookie, 156693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers Thread* self) 157693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers SHARED_LOCK_FUNCTION(Locks::mutator_lock_) __attribute__ ((hot)); 158693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers 159693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogersextern mirror::Object* JniMethodEndWithReferenceSynchronized(jobject result, 160693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers uint32_t saved_local_ref_cookie, 161693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers jobject locked, Thread* self) 162693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers SHARED_LOCK_FUNCTION(Locks::mutator_lock_) __attribute__ ((hot)); 163693ff61274cd2c9b8eb7e68c370f84a911b8ca52Ian Rogers 16457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Initialize an entry point data structure. 16557b86d47b66322693a070185fadfb43cb9c12eabIan Rogersvoid InitEntryPoints(EntryPoints* points); 16657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 16757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Change the debugger entry point in the data structure. 16857b86d47b66322693a070185fadfb43cb9c12eabIan Rogersvoid ChangeDebuggerEntryPoint(EntryPoints* points, bool enabled); 16957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 170306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers// The return_pc of instrumentation exit stub. 171306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogersuintptr_t GetInstrumentationExitPc(); 172306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers 173306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers// Entry point for deoptimization. 174306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogersuintptr_t GetDeoptimizationEntryPoint(); 17557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 176725a957985171d712d5c048cc3d00ff14968784bjeffhao// Return address of instrumentation stub. 177725a957985171d712d5c048cc3d00ff14968784bjeffhaovoid* GetInstrumentationEntryPoint(); 17857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 1797db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers// Return address of interpreter stub. 1807db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogersvoid* GetInterpreterEntryPoint(); 1817db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 18257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} // namespace art 18357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 18457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#endif // ART_SRC_OAT_RUNTIME_OAT_SUPPORT_ENTRYPOINTS_H_ 185