xref: /aosp_15_r20/art/runtime/entrypoints/entrypoint_utils.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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