1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2012 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_ENTRYPOINTS_ENTRYPOINT_UTILS_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_ENTRYPOINTS_ENTRYPOINT_UTILS_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <jni.h> 21*795d594fSAndroid Build Coastguard Worker #include <stdint.h> 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker #include "base/callee_save_type.h" 24*795d594fSAndroid Build Coastguard Worker #include "base/locks.h" 25*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 26*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file_types.h" 27*795d594fSAndroid Build Coastguard Worker #include "dex/dex_instruction.h" 28*795d594fSAndroid Build Coastguard Worker #include "gc/allocator_type.h" 29*795d594fSAndroid Build Coastguard Worker #include "handle.h" 30*795d594fSAndroid Build Coastguard Worker #include "jvalue.h" 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker namespace mirror { 35*795d594fSAndroid Build Coastguard Worker class Array; 36*795d594fSAndroid Build Coastguard Worker class Class; 37*795d594fSAndroid Build Coastguard Worker class MethodHandle; 38*795d594fSAndroid Build Coastguard Worker class MethodType; 39*795d594fSAndroid Build Coastguard Worker class Object; 40*795d594fSAndroid Build Coastguard Worker class String; 41*795d594fSAndroid Build Coastguard Worker } // namespace mirror 42*795d594fSAndroid Build Coastguard Worker 43*795d594fSAndroid Build Coastguard Worker class ArtField; 44*795d594fSAndroid Build Coastguard Worker class ArtMethod; 45*795d594fSAndroid Build Coastguard Worker class HandleScope; 46*795d594fSAndroid Build Coastguard Worker enum InvokeType : uint32_t; 47*795d594fSAndroid Build Coastguard Worker class MethodReference; 48*795d594fSAndroid Build Coastguard Worker class OatQuickMethodHeader; 49*795d594fSAndroid Build Coastguard Worker class ScopedObjectAccessAlreadyRunnable; 50*795d594fSAndroid Build Coastguard Worker class Thread; 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker // Given the context of a calling Method, use its DexCache to resolve a type to a Class. If it 53*795d594fSAndroid Build Coastguard Worker // cannot be resolved, throw an error. If it can, use it to create an instance. 54*795d594fSAndroid Build Coastguard Worker template <bool kInstrumented = true> 55*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE inline ObjPtr<mirror::Object> AllocObjectFromCode(ObjPtr<mirror::Class> klass, 56*795d594fSAndroid Build Coastguard Worker Thread* self, 57*795d594fSAndroid Build Coastguard Worker gc::AllocatorType allocator_type) 58*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 59*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker // Given the context of a calling Method and a resolved class, create an instance. 62*795d594fSAndroid Build Coastguard Worker template <bool kInstrumented> 63*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE 64*795d594fSAndroid Build Coastguard Worker inline ObjPtr<mirror::Object> AllocObjectFromCodeResolved(ObjPtr<mirror::Class> klass, 65*795d594fSAndroid Build Coastguard Worker Thread* self, 66*795d594fSAndroid Build Coastguard Worker gc::AllocatorType allocator_type) 67*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 68*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker // Given the context of a calling Method and an initialized class, create an instance. 71*795d594fSAndroid Build Coastguard Worker template <bool kInstrumented> 72*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE 73*795d594fSAndroid Build Coastguard Worker inline ObjPtr<mirror::Object> AllocObjectFromCodeInitialized(ObjPtr<mirror::Class> klass, 74*795d594fSAndroid Build Coastguard Worker Thread* self, 75*795d594fSAndroid Build Coastguard Worker gc::AllocatorType allocator_type) 76*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 77*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 78*795d594fSAndroid Build Coastguard Worker 79*795d594fSAndroid Build Coastguard Worker 80*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE inline ObjPtr<mirror::Class> CheckArrayAlloc(dex::TypeIndex type_idx, 81*795d594fSAndroid Build Coastguard Worker int32_t component_count, 82*795d594fSAndroid Build Coastguard Worker ArtMethod* method, 83*795d594fSAndroid Build Coastguard Worker bool* slow_path) 84*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 85*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker // Given the context of a calling Method, use its DexCache to resolve a type to an array Class. If 88*795d594fSAndroid Build Coastguard Worker // it cannot be resolved, throw an error. If it can, use it to create an array. 89*795d594fSAndroid Build Coastguard Worker // When verification/compiler hasn't been able to verify access, optionally perform an access 90*795d594fSAndroid Build Coastguard Worker // check. 91*795d594fSAndroid Build Coastguard Worker template <bool kInstrumented = true> 92*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE inline ObjPtr<mirror::Array> AllocArrayFromCode(dex::TypeIndex type_idx, 93*795d594fSAndroid Build Coastguard Worker int32_t component_count, 94*795d594fSAndroid Build Coastguard Worker ArtMethod* method, 95*795d594fSAndroid Build Coastguard Worker Thread* self, 96*795d594fSAndroid Build Coastguard Worker gc::AllocatorType allocator_type) 97*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 98*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker template <bool kInstrumented> 101*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE 102*795d594fSAndroid Build Coastguard Worker inline ObjPtr<mirror::Array> AllocArrayFromCodeResolved(ObjPtr<mirror::Class> klass, 103*795d594fSAndroid Build Coastguard Worker int32_t component_count, 104*795d594fSAndroid Build Coastguard Worker Thread* self, 105*795d594fSAndroid Build Coastguard Worker gc::AllocatorType allocator_type) 106*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 107*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker enum FindFieldFlags { 110*795d594fSAndroid Build Coastguard Worker InstanceBit = 1 << 0, 111*795d594fSAndroid Build Coastguard Worker StaticBit = 1 << 1, 112*795d594fSAndroid Build Coastguard Worker ObjectBit = 1 << 2, 113*795d594fSAndroid Build Coastguard Worker PrimitiveBit = 1 << 3, 114*795d594fSAndroid Build Coastguard Worker ReadBit = 1 << 4, 115*795d594fSAndroid Build Coastguard Worker WriteBit = 1 << 5, 116*795d594fSAndroid Build Coastguard Worker }; 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker // Type of find field operation for fast and slow case. 119*795d594fSAndroid Build Coastguard Worker enum FindFieldType { 120*795d594fSAndroid Build Coastguard Worker InstanceObjectRead = InstanceBit | ObjectBit | ReadBit, 121*795d594fSAndroid Build Coastguard Worker InstanceObjectWrite = InstanceBit | ObjectBit | WriteBit, 122*795d594fSAndroid Build Coastguard Worker InstancePrimitiveRead = InstanceBit | PrimitiveBit | ReadBit, 123*795d594fSAndroid Build Coastguard Worker InstancePrimitiveWrite = InstanceBit | PrimitiveBit | WriteBit, 124*795d594fSAndroid Build Coastguard Worker StaticObjectRead = StaticBit | ObjectBit | ReadBit, 125*795d594fSAndroid Build Coastguard Worker StaticObjectWrite = StaticBit | ObjectBit | WriteBit, 126*795d594fSAndroid Build Coastguard Worker StaticPrimitiveRead = StaticBit | PrimitiveBit | ReadBit, 127*795d594fSAndroid Build Coastguard Worker StaticPrimitiveWrite = StaticBit | PrimitiveBit | WriteBit, 128*795d594fSAndroid Build Coastguard Worker }; 129*795d594fSAndroid Build Coastguard Worker 130*795d594fSAndroid Build Coastguard Worker template<bool access_check> 131*795d594fSAndroid Build Coastguard Worker inline ArtMethod* FindSuperMethodToCall(uint32_t method_idx, 132*795d594fSAndroid Build Coastguard Worker ArtMethod* resolved_method, 133*795d594fSAndroid Build Coastguard Worker ArtMethod* referrer, 134*795d594fSAndroid Build Coastguard Worker Thread* self) 135*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 136*795d594fSAndroid Build Coastguard Worker 137*795d594fSAndroid Build Coastguard Worker template<FindFieldType type, bool access_check> 138*795d594fSAndroid Build Coastguard Worker inline ArtField* FindFieldFromCode(uint32_t field_idx, 139*795d594fSAndroid Build Coastguard Worker ArtMethod* referrer, 140*795d594fSAndroid Build Coastguard Worker Thread* self, 141*795d594fSAndroid Build Coastguard Worker size_t expected_size) 142*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 143*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 144*795d594fSAndroid Build Coastguard Worker 145*795d594fSAndroid Build Coastguard Worker template<InvokeType type> 146*795d594fSAndroid Build Coastguard Worker inline ArtMethod* FindMethodToCall(Thread* self, 147*795d594fSAndroid Build Coastguard Worker ArtMethod* referrer, 148*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object>* this_object, 149*795d594fSAndroid Build Coastguard Worker const Instruction& inst, 150*795d594fSAndroid Build Coastguard Worker bool only_lookup_tls_cache, 151*795d594fSAndroid Build Coastguard Worker /*out*/ bool* string_init) 152*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 153*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker inline ObjPtr<mirror::Class> ResolveVerifyAndClinit(dex::TypeIndex type_idx, 156*795d594fSAndroid Build Coastguard Worker ArtMethod* referrer, 157*795d594fSAndroid Build Coastguard Worker Thread* self, 158*795d594fSAndroid Build Coastguard Worker bool can_run_clinit, 159*795d594fSAndroid Build Coastguard Worker bool verify_access) 160*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 161*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 162*795d594fSAndroid Build Coastguard Worker 163*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::MethodHandle> ResolveMethodHandleFromCode(ArtMethod* referrer, 164*795d594fSAndroid Build Coastguard Worker uint32_t method_handle_idx) 165*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 166*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 167*795d594fSAndroid Build Coastguard Worker 168*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::MethodType> ResolveMethodTypeFromCode(ArtMethod* referrer, dex::ProtoIndex proto_idx) 169*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 170*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker void CheckReferenceResult(Handle<mirror::Object> o, Thread* self) 173*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 174*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 175*795d594fSAndroid Build Coastguard Worker 176*795d594fSAndroid Build Coastguard Worker JValue InvokeProxyInvocationHandler(ScopedObjectAccessAlreadyRunnable& soa, 177*795d594fSAndroid Build Coastguard Worker const char* shorty, 178*795d594fSAndroid Build Coastguard Worker jobject rcvr_jobj, 179*795d594fSAndroid Build Coastguard Worker jobject interface_art_method_jobj, 180*795d594fSAndroid Build Coastguard Worker std::vector<jvalue>& args) 181*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 182*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 183*795d594fSAndroid Build Coastguard Worker 184*795d594fSAndroid Build Coastguard Worker EXPORT bool FillArrayData(ObjPtr<mirror::Object> obj, const Instruction::ArrayDataPayload* payload) 185*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 186*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker template <typename INT_TYPE, typename FLOAT_TYPE> 189*795d594fSAndroid Build Coastguard Worker inline INT_TYPE art_float_to_integral(FLOAT_TYPE f); 190*795d594fSAndroid Build Coastguard Worker 191*795d594fSAndroid Build Coastguard Worker ArtMethod* GetCalleeSaveMethodCallerAndDexPc(ArtMethod** sp, 192*795d594fSAndroid Build Coastguard Worker CalleeSaveType type, 193*795d594fSAndroid Build Coastguard Worker /* out */ uint32_t* dex_pc, 194*795d594fSAndroid Build Coastguard Worker bool do_caller_check = false) 195*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker struct CallerAndOuterMethod { 198*795d594fSAndroid Build Coastguard Worker ArtMethod* caller; 199*795d594fSAndroid Build Coastguard Worker ArtMethod* outer_method; 200*795d594fSAndroid Build Coastguard Worker }; 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker CallerAndOuterMethod GetCalleeSaveMethodCallerAndOuterMethod(Thread* self, CalleeSaveType type) 203*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker ArtMethod* GetCalleeSaveOuterMethod(Thread* self, CalleeSaveType type) 206*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker // Returns the synchronization object for a native method for a GenericJni frame 209*795d594fSAndroid Build Coastguard Worker // we have just created or are about to exit. The synchronization object is 210*795d594fSAndroid Build Coastguard Worker // the class object for static methods and the `this` object otherwise. 211*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> GetGenericJniSynchronizationObject(Thread* self, ArtMethod* called) 212*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 213*795d594fSAndroid Build Coastguard Worker 214*795d594fSAndroid Build Coastguard Worker // Update .bss method entrypoint if the `outer_method` has a valid OatFile, and either 215*795d594fSAndroid Build Coastguard Worker // A) the `callee_reference` has the same OatFile as `outer_method`, or 216*795d594fSAndroid Build Coastguard Worker // B) the `callee_reference` comes from a BCP DexFile that was present during `outer_method`'s 217*795d594fSAndroid Build Coastguard Worker // OatFile compilation. 218*795d594fSAndroid Build Coastguard Worker // In both cases, we require that the oat file has a .bss entry for the `callee_reference`. 219*795d594fSAndroid Build Coastguard Worker void MaybeUpdateBssMethodEntry(ArtMethod* callee, 220*795d594fSAndroid Build Coastguard Worker MethodReference callee_reference, 221*795d594fSAndroid Build Coastguard Worker ArtMethod* outer_method) REQUIRES_SHARED(Locks::mutator_lock_); 222*795d594fSAndroid Build Coastguard Worker 223*795d594fSAndroid Build Coastguard Worker } // namespace art 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_ENTRYPOINTS_ENTRYPOINT_UTILS_H_ 226