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