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