blob: a1ba4612707a070983c659c70a38a04229e264bb [file] [log] [blame]
Elliott Hughes418d20f2011-09-22 14:00:39 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070016
Brian Carlstromfc0e3212013-07-17 14:40:12 -070017#ifndef ART_RUNTIME_CLASS_LINKER_H_
18#define ART_RUNTIME_CLASS_LINKER_H_
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070019
Andreas Gampe49b74a82019-01-07 10:19:49 -080020#include <list>
Mathieu Chartierc5dd3192015-12-09 16:38:30 -080021#include <set>
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080022#include <string>
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +000023#include <type_traits>
Alex Lighteb7c1442015-08-31 13:17:42 -070024#include <unordered_map>
Mathieu Chartierc5dd3192015-12-09 16:38:30 -080025#include <unordered_set>
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070026#include <utility>
27#include <vector>
28
Andreas Gampe542451c2016-07-26 09:02:02 -070029#include "base/enums.h"
Vladimir Markobf121912019-06-04 13:49:05 +010030#include "base/mutex.h"
31#include "base/intrusive_forward_list.h"
Andreas Gampe7fbc4a52018-11-28 08:26:47 -080032#include "base/locks.h"
Elliott Hughes76160052012-12-12 16:31:20 -080033#include "base/macros.h"
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -070034#include "dex/class_accessor.h"
David Sehr999646d2018-02-16 10:22:33 -080035#include "dex/dex_cache_resolved_classes.h"
David Sehr9e734c72018-01-04 17:56:19 -080036#include "dex/dex_file_types.h"
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -070037#include "gc_root.h"
Andreas Gampe0f01b582017-01-18 15:22:37 -080038#include "handle.h"
Mathieu Chartier590fee92013-09-13 13:46:47 -070039#include "jni.h"
Vladimir Marko97d7e1c2016-10-04 14:44:28 +010040#include "mirror/class.h"
Andreas Gampe6d7abbd2017-04-24 13:19:09 -070041#include "verifier/verifier_enums.h"
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070042
43namespace art {
Mingyao Yang98d1cc82014-05-15 17:02:16 -070044
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080045namespace dex {
46struct ClassDef;
Andreas Gampe62629592019-01-03 16:08:31 -080047struct MethodHandleItem;
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080048} // namespace dex
49
Ian Rogers1d54e732013-05-02 21:10:01 -070050namespace gc {
51namespace space {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080052class ImageSpace;
Ian Rogers1d54e732013-05-02 21:10:01 -070053} // namespace space
54} // namespace gc
Vladimir Marko74527972016-11-29 15:57:32 +000055
56namespace linker {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080057struct CompilationHelper;
58class ImageWriter;
59class OatWriter;
Vladimir Marko74527972016-11-29 15:57:32 +000060} // namespace linker
61
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080062namespace mirror {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080063class ClassLoader;
64class DexCache;
65class DexCachePointerArray;
66class DexCacheMethodHandlesTest_Open_Test;
67class DexCacheTest_Open_Test;
68class IfTable;
69class MethodHandle;
70class MethodHandlesLookup;
71class MethodType;
72template<class T> class ObjectArray;
73class StackTraceElement;
74template <typename T> struct NativeDexCachePair;
75using MethodDexCachePair = NativeDexCachePair<ArtMethod>;
76using MethodDexCacheType = std::atomic<MethodDexCachePair>;
Ian Rogers33e95662013-05-20 20:29:14 -070077} // namespace mirror
Ian Rogers1d54e732013-05-02 21:10:01 -070078
Vladimir Marko09c5ca42018-05-31 15:15:31 +010079class ArtField;
80class ArtMethod;
Andreas Gampec1ac9ee2017-07-24 22:35:49 -070081class ClassHierarchyAnalysis;
Vladimir Markob4eb1b12018-05-24 11:09:38 +010082enum class ClassRoot : uint32_t;
Andreas Gampe2af99022017-04-25 08:32:59 -070083class ClassTable;
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080084class DexFile;
Andreas Gampe5a4b8a22014-09-11 08:30:08 -070085template<class T> class Handle;
Vladimir Marko97d7e1c2016-10-04 14:44:28 +010086class ImtConflictTable;
87template<typename T> class LengthPrefixedArray;
Hiroshi Yamauchi679b1cf2015-05-21 12:05:27 -070088template<class T> class MutableHandle;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070089class InternTable;
Andreas Gamped482e732017-04-24 17:59:09 -070090class LinearAlloc;
Vladimir Marko1998cd02017-01-13 13:02:58 +000091class OatFile;
Mathieu Chartierc528dba2013-11-26 12:00:11 -080092template<class T> class ObjectLock;
Andreas Gampe7ba64962014-10-23 11:37:40 -070093class Runtime;
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -070094class ScopedObjectAccessAlreadyRunnable;
Mathieu Chartier2d2621a2014-10-23 16:48:06 -070095template<size_t kNumReferences> class PACKED(4) StackHandleScope;
Andreas Gampe49b74a82019-01-07 10:19:49 -080096class Thread;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070097
Mathieu Chartier893263b2014-03-04 11:07:42 -080098enum VisitRootFlags : uint8_t;
99
Mathieu Chartier1aa8ec22016-02-01 10:34:47 -0800100class ClassVisitor {
101 public:
102 virtual ~ClassVisitor() {}
103 // Return true to continue visiting.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700104 virtual bool operator()(ObjPtr<mirror::Class> klass) = 0;
Mathieu Chartier1aa8ec22016-02-01 10:34:47 -0800105};
106
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -0700107class ClassLoaderVisitor {
108 public:
109 virtual ~ClassLoaderVisitor() {}
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700110 virtual void Visit(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700111 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -0700112};
113
Alexey Grebenkin252a4e42018-04-02 18:18:01 +0300114class AllocatorVisitor {
115 public:
116 virtual ~AllocatorVisitor() {}
117 // Return true to continue visiting.
118 virtual bool Visit(LinearAlloc* alloc)
119 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
120};
121
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700122class ClassLinker {
123 public:
Chris Wailes55c880e2018-10-24 13:10:35 -0700124 static constexpr bool kAppImageMayContainStrings = true;
Mathieu Chartier0933cc52018-03-23 14:25:08 -0700125
Andreas Gampe87658f32019-04-18 18:39:02 +0000126 explicit ClassLinker(InternTable* intern_table,
127 bool fast_class_not_found_exceptions = true);
Chang Xing605fe242017-07-20 15:57:21 -0700128 virtual ~ClassLinker();
Carl Shapiro565f5072011-07-10 13:39:43 -0700129
Alex Light64ad14d2014-08-19 14:23:13 -0700130 // Initialize class linker by bootstraping from dex files.
Andreas Gampe3db9c5d2015-11-17 11:52:46 -0800131 bool InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path,
132 std::string* error_msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700133 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800134 REQUIRES(!Locks::dex_lock_);
Mathieu Chartier590fee92013-09-13 13:46:47 -0700135
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800136 // Initialize class linker from one or more boot images.
137 bool InitFromBootImage(std::string* error_msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700138 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800139 REQUIRES(!Locks::dex_lock_);
Mathieu Chartier590fee92013-09-13 13:46:47 -0700140
Vladimir Marko0ace5632018-12-14 11:11:47 +0000141 // Add boot class path dex files that were not included in the boot image.
142 // ClassLinker takes ownership of these dex files.
143 void AddExtraBootDexFiles(Thread* self,
144 std::vector<std::unique_ptr<const DexFile>>&& additional_dex_files)
145 REQUIRES_SHARED(Locks::mutator_lock_);
146
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800147 // Add an image space to the class linker, may fix up classloader fields and dex cache fields.
148 // The dex files that were newly opened for the space are placed in the out argument
149 // out_dex_files. Returns true if the operation succeeded.
150 // The space must be already added to the heap before calling AddImageSpace since we need to
151 // properly handle read barriers and object marking.
152 bool AddImageSpace(gc::space::ImageSpace* space,
153 Handle<mirror::ClassLoader> class_loader,
154 jobjectArray dex_elements,
155 const char* dex_location,
156 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
157 std::string* error_msg)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800158 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700159 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800160
Mathieu Chartier0b4cbd02016-03-08 16:49:58 -0800161 bool OpenImageDexFiles(gc::space::ImageSpace* space,
162 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
163 std::string* error_msg)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800164 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700165 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier0b4cbd02016-03-08 16:49:58 -0800166
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700167 // Finds a class by its descriptor, loading it if necessary.
Brian Carlstrom74eb46a2011-08-02 20:10:14 -0700168 // If class_loader is null, searches boot_class_path_.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100169 ObjPtr<mirror::Class> FindClass(Thread* self,
170 const char* descriptor,
171 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700172 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800173 REQUIRES(!Locks::dex_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700174
Ian Rogers98379392014-02-24 16:53:16 -0800175 // Finds a class by its descriptor using the "system" class loader, ie by searching the
176 // boot_class_path_.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100177 ObjPtr<mirror::Class> FindSystemClass(Thread* self, const char* descriptor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700178 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800179 REQUIRES(!Locks::dex_lock_) {
180 return FindClass(self, descriptor, ScopedNullHandle<mirror::ClassLoader>());
181 }
Ian Rogers98379392014-02-24 16:53:16 -0800182
183 // Finds the array class given for the element class.
Vladimir Markobcf17522018-06-01 13:14:32 +0100184 ObjPtr<mirror::Class> FindArrayClass(Thread* self, ObjPtr<mirror::Class> element_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700185 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800186 REQUIRES(!Locks::dex_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700187
Ian Rogers63557452014-06-04 16:57:15 -0700188 // Returns true if the class linker is initialized.
Ian Rogers7b078e82014-09-10 14:44:24 -0700189 bool IsInitialized() const {
190 return init_done_;
191 }
Mathieu Chartier590fee92013-09-13 13:46:47 -0700192
Brian Carlstromaded5f72011-10-07 17:15:04 -0700193 // Define a new a class based on a ClassDef from a DexFile
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100194 ObjPtr<mirror::Class> DefineClass(Thread* self,
195 const char* descriptor,
196 size_t hash,
197 Handle<mirror::ClassLoader> class_loader,
198 const DexFile& dex_file,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800199 const dex::ClassDef& dex_class_def)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700200 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800201 REQUIRES(!Locks::dex_lock_);
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700202
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700203 // Finds a class by its descriptor, returning null if it isn't wasn't loaded
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700204 // by the given 'class_loader'.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100205 ObjPtr<mirror::Class> LookupClass(Thread* self,
206 const char* descriptor,
207 ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier90443472015-07-16 20:32:27 -0700208 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampe2ff3b972017-06-05 18:14:53 -0700209 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700210
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800211 // Finds all the classes with the given descriptor, regardless of ClassLoader.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700212 void LookupClasses(const char* descriptor, std::vector<ObjPtr<mirror::Class>>& classes)
Mathieu Chartier90443472015-07-16 20:32:27 -0700213 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700214 REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800215
Vladimir Marko9186b182018-11-06 14:55:54 +0000216 ObjPtr<mirror::Class> LookupPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100217 ObjPtr<mirror::Class> FindPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -0700218
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700219 void DumpForSigQuit(std::ostream& os) REQUIRES(!Locks::classlinker_classes_lock_);
Elliott Hughescac6cc72011-11-03 20:31:21 -0700220
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700221 size_t NumLoadedClasses()
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700222 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700223 REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughese27955c2011-08-26 15:21:24 -0700224
Vladimir Marko18090d12018-06-01 16:53:12 +0100225 // Resolve a String with the given index from the DexFile associated with the given `referrer`,
226 // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
227 // to use for resolution.
228 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
229 ArtField* referrer)
230 REQUIRES_SHARED(Locks::mutator_lock_);
231 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
232 ArtMethod* referrer)
233 REQUIRES_SHARED(Locks::mutator_lock_);
234
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000235 // Resolve a String with the given index from the DexFile associated with the given DexCache,
236 // storing the result in the DexCache.
237 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000238 Handle<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700239 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700240
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000241 // Find a String with the given index from the DexFile associated with the given DexCache,
242 // storing the result in the DexCache if found. Return null if not found.
243 ObjPtr<mirror::String> LookupString(dex::StringIndex string_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000244 ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700245 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocac5a7e2016-02-22 10:39:50 +0000246
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000247 // Resolve a Type with the given index from the DexFile associated with the given `referrer`,
248 // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
249 // and ClassLoader to use for resolution.
250 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ObjPtr<mirror::Class> referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700251 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800252 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100253 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtField* referrer)
254 REQUIRES_SHARED(Locks::mutator_lock_)
255 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko28e012a2017-12-07 11:22:59 +0000256 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700257 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800258 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700259
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000260 // Resolve a type with the given index from the DexFile associated with the given DexCache
261 // and ClassLoader, storing the result in DexCache. The ClassLoader is used to search for
262 // the type, since it may be referenced from but not contained within the DexFile.
263 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000264 Handle<mirror::DexCache> dex_cache,
265 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700266 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800267 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700268
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000269 // Look up a resolved type with the given index from the DexFile associated with the given
270 // `referrer`, storing the result in the DexCache. The `referrer` is used to identify the
271 // target DexCache and ClassLoader to use for lookup.
272 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
273 ObjPtr<mirror::Class> referrer)
274 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100275 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtField* referrer)
276 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000277 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtMethod* referrer)
278 REQUIRES_SHARED(Locks::mutator_lock_);
279
280 // Look up a resolved type with the given index from the DexFile associated with the given
281 // DexCache and ClassLoader. The ClassLoader is used to search for the type, since it may
282 // be referenced from but not contained within the DexFile.
283 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
284 ObjPtr<mirror::DexCache> dex_cache,
285 ObjPtr<mirror::ClassLoader> class_loader)
286 REQUIRES_SHARED(Locks::mutator_lock_);
287
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800288 // Determine whether a dex cache result should be trusted, or an IncompatibleClassChangeError
Vladimir Markoba118822017-06-12 15:41:56 +0100289 // check and IllegalAccessError check should be performed even after a hit.
290 enum class ResolveMode { // private.
291 kNoChecks,
292 kCheckICCEAndIAE
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800293 };
294
Vladimir Marko07bfbac2017-07-06 14:55:02 +0100295 // Look up a previously resolved method with the given index.
296 ArtMethod* LookupResolvedMethod(uint32_t method_idx,
297 ObjPtr<mirror::DexCache> dex_cache,
298 ObjPtr<mirror::ClassLoader> class_loader)
299 REQUIRES_SHARED(Locks::mutator_lock_);
300
Nicolas Geoffrayea179f42018-02-08 22:30:18 +0000301 // Find a method with the given index from class `klass`, and update the dex cache.
302 ArtMethod* FindResolvedMethod(ObjPtr<mirror::Class> klass,
303 ObjPtr<mirror::DexCache> dex_cache,
304 ObjPtr<mirror::ClassLoader> class_loader,
305 uint32_t method_idx)
306 REQUIRES_SHARED(Locks::mutator_lock_);
307
David Brazdil4525e0b2018-04-05 16:57:32 +0100308 // Find a method using the wrong lookup mechanism. If `klass` is an interface,
309 // search for a class method. If it is a class, search for an interface method.
310 // This is useful when throwing IncompatibleClassChangeError.
311 ArtMethod* FindIncompatibleMethod(ObjPtr<mirror::Class> klass,
312 ObjPtr<mirror::DexCache> dex_cache,
313 ObjPtr<mirror::ClassLoader> class_loader,
314 uint32_t method_idx)
315 REQUIRES_SHARED(Locks::mutator_lock_);
316
Vladimir Marko89011192017-12-11 13:45:05 +0000317 // Resolve a method with a given ID from the DexFile associated with the given DexCache
318 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader are
319 // used as in ResolveType. What is unique is the method type argument which is used to
320 // determine if this method is a direct, static, or virtual method.
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800321 template <ResolveMode kResolveMode>
Vladimir Marko89011192017-12-11 13:45:05 +0000322 ArtMethod* ResolveMethod(uint32_t method_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700323 Handle<mirror::DexCache> dex_cache,
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700324 Handle<mirror::ClassLoader> class_loader,
325 ArtMethod* referrer,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700326 InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700327 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800328 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700329
Vladimir Markoba118822017-06-12 15:41:56 +0100330 template <InvokeType type, ResolveMode kResolveMode>
Mathieu Chartiere401d142015-04-22 13:56:20 -0700331 ArtMethod* GetResolvedMethod(uint32_t method_idx, ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700332 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightfedd91d2016-01-07 14:49:16 -0800333
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800334 template <ResolveMode kResolveMode>
David Srbecky9cc67b12018-10-25 10:10:35 +0000335 ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, ArtMethod* referrer, InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700336 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800337 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko89011192017-12-11 13:45:05 +0000338 ArtMethod* ResolveMethodWithoutInvokeType(uint32_t method_idx,
Jeff Hao0042c6d2015-07-29 20:14:10 -0700339 Handle<mirror::DexCache> dex_cache,
340 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700341 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800342 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom16192862011-09-12 17:50:06 -0700343
Vladimir Markof44d36c2017-03-14 14:18:46 +0000344 ArtField* LookupResolvedField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700345 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700346 ArtField* ResolveField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700347 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800348 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstromb9edb842011-08-28 16:31:06 -0700349
Vladimir Markoe11dd502017-12-08 14:09:45 +0000350 // Resolve a field with a given ID from the DexFile associated with the given DexCache
351 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
352 // are used as in ResolveType. What is unique is the is_static argument which is used
353 // to determine if we are resolving a static or non-static field.
354 ArtField* ResolveField(uint32_t field_idx,
Mathieu Chartier90443472015-07-16 20:32:27 -0700355 Handle<mirror::DexCache> dex_cache,
Vladimir Markoe11dd502017-12-08 14:09:45 +0000356 Handle<mirror::ClassLoader> class_loader,
357 bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700358 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800359 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700360
Vladimir Markoe11dd502017-12-08 14:09:45 +0000361 // Resolve a field with a given ID from the DexFile associated with the given DexCache
362 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
363 // are used as in ResolveType. No is_static argument is provided so that Java
Ian Rogersb067ac22011-12-13 18:05:09 -0800364 // field resolution semantics are followed.
Vladimir Markoe11dd502017-12-08 14:09:45 +0000365 ArtField* ResolveFieldJLS(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700366 Handle<mirror::DexCache> dex_cache,
367 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700368 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800369 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogersb067ac22011-12-13 18:05:09 -0800370
David Brazdil1ab0fa82018-05-04 11:28:03 +0100371 // Find a field with a given ID from the DexFile associated with the given DexCache
372 // and ClassLoader, storing the result in DexCache. The declaring class is assumed
373 // to have been already resolved into `klass`. The `is_static` argument is used to
374 // determine if we are resolving a static or non-static field.
375 ArtField* FindResolvedField(ObjPtr<mirror::Class> klass,
376 ObjPtr<mirror::DexCache> dex_cache,
377 ObjPtr<mirror::ClassLoader> class_loader,
378 uint32_t field_idx,
379 bool is_static)
380 REQUIRES_SHARED(Locks::mutator_lock_);
381
382 // Find a field with a given ID from the DexFile associated with the given DexCache
383 // and ClassLoader, storing the result in DexCache. The declaring class is assumed
384 // to have been already resolved into `klass`. No is_static argument is provided
385 // so that Java field resolution semantics are followed.
386 ArtField* FindResolvedFieldJLS(ObjPtr<mirror::Class> klass,
387 ObjPtr<mirror::DexCache> dex_cache,
388 ObjPtr<mirror::ClassLoader> class_loader,
389 uint32_t field_idx)
390 REQUIRES_SHARED(Locks::mutator_lock_);
391
Vladimir Markoaf940202017-12-08 15:01:18 +0000392 // Resolve a method type with a given ID from the DexFile associated with a given DexCache
393 // and ClassLoader, storing the result in the DexCache.
394 ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
Orion Hodson06d10a72018-05-14 08:53:38 +0100395 dex::ProtoIndex proto_idx,
Vladimir Markoaf940202017-12-08 15:01:18 +0000396 Handle<mirror::DexCache> dex_cache,
397 Handle<mirror::ClassLoader> class_loader)
Narayan Kamath25352fc2016-08-03 12:46:58 +0100398 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800399 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogersad25ac52011-10-04 19:13:33 -0700400
Vladimir Markoaf940202017-12-08 15:01:18 +0000401 ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
Orion Hodson06d10a72018-05-14 08:53:38 +0100402 dex::ProtoIndex proto_idx,
Vladimir Markoaf940202017-12-08 15:01:18 +0000403 ArtMethod* referrer)
Orion Hodson2e599942017-09-22 16:17:41 +0100404 REQUIRES_SHARED(Locks::mutator_lock_);
405
Orion Hodsonc069a302017-01-18 09:23:12 +0000406 // Resolve a method handle with a given ID from the DexFile. The
407 // result is not cached in the DexCache as the instance will only be
408 // used once in most circumstances.
Vladimir Markoaf940202017-12-08 15:01:18 +0000409 ObjPtr<mirror::MethodHandle> ResolveMethodHandle(Thread* self,
410 uint32_t method_handle_idx,
411 ArtMethod* referrer)
Orion Hodsonc069a302017-01-18 09:23:12 +0000412 REQUIRES_SHARED(Locks::mutator_lock_);
413
Elliott Hughesf4c21c92011-08-19 17:31:31 -0700414 // Returns true on success, false if there's an exception pending.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700415 // can_run_clinit=false allows the compiler to attempt to init a class,
416 // given the restriction that no <clinit> execution is possible.
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700417 bool EnsureInitialized(Thread* self,
418 Handle<mirror::Class> c,
419 bool can_init_fields,
Ian Rogers7b078e82014-09-10 14:44:24 -0700420 bool can_init_parents)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700421 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800422 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700423
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700424 // Initializes classes that have instances in the image but that have
425 // <clinit> methods so they could not be initialized by the compiler.
Vladimir Markodcfcce42018-06-27 10:00:28 +0000426 void RunRootClinits(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700427 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800428 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700429
Alex Light07f06212017-06-01 14:01:43 -0700430 // Directly register an already existing dex cache. RegisterDexFile should be preferred since that
431 // reduplicates DexCaches when possible. The DexCache given to this function must already be fully
432 // initialized and not already registered.
433 void RegisterExistingDexCache(ObjPtr<mirror::DexCache> cache,
434 ObjPtr<mirror::ClassLoader> class_loader)
435 REQUIRES(!Locks::dex_lock_)
436 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocd556b02017-02-03 11:47:34 +0000437 ObjPtr<mirror::DexCache> RegisterDexFile(const DexFile& dex_file,
438 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800439 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700440 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700441
Brian Carlstrom8a487412011-08-29 20:08:52 -0700442 const std::vector<const DexFile*>& GetBootClassPath() {
443 return boot_class_path_;
444 }
445
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700446 void VisitClasses(ClassVisitor* visitor)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700447 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700448 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -0700449
450 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
451 // so that it can visit individual classes without holding the doesn't hold the
452 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
453 // can race with insertion and deletion of classes while the visitor is being called.
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700454 void VisitClassesWithoutClassesLock(ClassVisitor* visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700455 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800456 REQUIRES(!Locks::dex_lock_);
Elliott Hughesa2155262011-11-16 16:26:58 -0800457
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700458 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
Andreas Gamped98b4ed2016-11-04 20:27:24 -0700459 REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700460 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700461 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800462 REQUIRES(!Locks::dex_lock_, !Locks::classlinker_classes_lock_, !Locks::trace_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700463 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700464
Vladimir Markocd556b02017-02-03 11:47:34 +0000465 bool IsDexFileRegistered(Thread* self, const DexFile& dex_file)
466 REQUIRES(!Locks::dex_lock_)
467 REQUIRES_SHARED(Locks::mutator_lock_);
468 ObjPtr<mirror::DexCache> FindDexCache(Thread* self, const DexFile& dex_file)
469 REQUIRES(!Locks::dex_lock_)
470 REQUIRES_SHARED(Locks::mutator_lock_);
471 ClassTable* FindClassTable(Thread* self, ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800472 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700473 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom1d9f52b2011-10-13 10:50:45 -0700474
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700475 LengthPrefixedArray<ArtField>* AllocArtFieldArray(Thread* self,
476 LinearAlloc* allocator,
477 size_t length);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800478
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700479 LengthPrefixedArray<ArtMethod>* AllocArtMethodArray(Thread* self,
480 LinearAlloc* allocator,
481 size_t length);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700482
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +0000483 // Convenience AllocClass() overload that uses mirror::Class::InitializeClassVisitor
484 // for the class initialization and uses the `java_lang_Class` from class roots
485 // instead of an explicit argument.
486 ObjPtr<mirror::Class> AllocClass(Thread* self, uint32_t class_size)
487 REQUIRES_SHARED(Locks::mutator_lock_)
488 REQUIRES(!Roles::uninterruptible_);
489
490 // Setup the classloader, class def index, type idx so that we can insert this class in the class
491 // table.
492 void SetupClass(const DexFile& dex_file,
493 const dex::ClassDef& dex_class_def,
494 Handle<mirror::Class> klass,
495 ObjPtr<mirror::ClassLoader> class_loader)
496 REQUIRES_SHARED(Locks::mutator_lock_);
497
498 void LoadClass(Thread* self,
499 const DexFile& dex_file,
500 const dex::ClassDef& dex_class_def,
501 Handle<mirror::Class> klass)
502 REQUIRES_SHARED(Locks::mutator_lock_);
503
504 // Link the class and place it into the class-table using the given descriptor. NB if the
505 // descriptor is null the class will not be placed in any class-table. This is useful implementing
506 // obsolete classes and should not be used otherwise.
507 bool LinkClass(Thread* self,
508 const char* descriptor,
509 Handle<mirror::Class> klass,
510 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
511 MutableHandle<mirror::Class>* h_new_class_out)
512 REQUIRES_SHARED(Locks::mutator_lock_)
513 REQUIRES(!Locks::classlinker_classes_lock_);
514
Vladimir Markobcf17522018-06-01 13:14:32 +0100515 ObjPtr<mirror::PointerArray> AllocPointerArray(Thread* self, size_t length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700516 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700517 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800518
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100519 ObjPtr<mirror::IfTable> AllocIfTable(Thread* self, size_t ifcount)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700520 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700521 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800522
Vladimir Markobcf17522018-06-01 13:14:32 +0100523 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> AllocStackTraceElementArray(Thread* self,
524 size_t length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700525 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700526 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800527
Andreas Gampe6d7abbd2017-04-24 13:19:09 -0700528 verifier::FailureKind VerifyClass(
Nicolas Geoffray08025182016-10-25 17:20:18 +0100529 Thread* self,
530 Handle<mirror::Class> klass,
531 verifier::HardFailLogMode log_level = verifier::HardFailLogMode::kLogNone)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700532 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800533 REQUIRES(!Locks::dex_lock_);
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700534 bool VerifyClassUsingOatFile(const DexFile& dex_file,
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700535 ObjPtr<mirror::Class> klass,
Vladimir Marko2c64a832018-01-04 11:31:56 +0000536 ClassStatus& oat_file_class_status)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700537 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800538 REQUIRES(!Locks::dex_lock_);
Alex Light5a559862016-01-29 12:24:48 -0800539 void ResolveClassExceptionHandlerTypes(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700540 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800541 REQUIRES(!Locks::dex_lock_);
Alex Light5a559862016-01-29 12:24:48 -0800542 void ResolveMethodExceptionHandlerTypes(ArtMethod* klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700543 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800544 REQUIRES(!Locks::dex_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800545
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100546 ObjPtr<mirror::Class> CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa,
547 jstring name,
548 jobjectArray interfaces,
549 jobject loader,
550 jobjectArray methods,
551 jobjectArray throws)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700552 REQUIRES_SHARED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400553
Alex Lightfc49fec2018-01-16 22:28:36 +0000554 // Get the oat code for a method when its class isn't yet initialized.
555 const void* GetQuickOatCodeFor(ArtMethod* method)
556 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800557
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700558 pid_t GetClassesLockOwner(); // For SignalCatcher.
559 pid_t GetDexLockOwner(); // For SignalCatcher.
Brian Carlstrom24a3c2e2011-10-17 18:07:52 -0700560
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700561 // Is the given entry point quick code to run the resolution stub?
562 bool IsQuickResolutionStub(const void* entry_point) const;
Jeff Hao88474b42013-10-23 16:24:40 -0700563
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700564 // Is the given entry point quick code to bridge into the interpreter?
565 bool IsQuickToInterpreterBridge(const void* entry_point) const;
566
567 // Is the given entry point quick code to run the generic JNI stub?
568 bool IsQuickGenericJniStub(const void* entry_point) const;
Vladimir Marko8a630572014-04-09 18:45:35 +0100569
David Sehra49e0532017-08-25 08:05:29 -0700570 // Is the given entry point the JNI dlsym lookup stub?
571 bool IsJniDlsymLookupStub(const void* entry_point) const;
572
Vladimir Marko97d7e1c2016-10-04 14:44:28 +0100573 const void* GetQuickToInterpreterBridgeTrampoline() const {
574 return quick_to_interpreter_bridge_trampoline_;
575 }
576
Jeff Hao88474b42013-10-23 16:24:40 -0700577 InternTable* GetInternTable() const {
578 return intern_table_;
579 }
580
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700581 // Set the entrypoints up for method to the enter the interpreter.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700582 void SetEntryPointsToInterpreter(ArtMethod* method) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700583 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700584
Alex Lightdb01a092017-04-03 15:39:55 -0700585 // Set the entrypoints up for an obsolete method.
586 void SetEntryPointsForObsoleteMethod(ArtMethod* method) const
587 REQUIRES_SHARED(Locks::mutator_lock_);
588
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700589 // Attempts to insert a class into a class table. Returns null if
Ian Rogers848871b2013-08-05 10:56:33 -0700590 // the class was inserted, otherwise returns an existing class with
591 // the same descriptor and ClassLoader.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100592 ObjPtr<mirror::Class> InsertClass(const char* descriptor,
593 ObjPtr<mirror::Class> klass,
594 size_t hash)
Mathieu Chartier90443472015-07-16 20:32:27 -0700595 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700596 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers848871b2013-08-05 10:56:33 -0700597
Vladimir Marko1998cd02017-01-13 13:02:58 +0000598 // Add an oat file with .bss GC roots to be visited again at the end of GC
599 // for collector types that need it.
600 void WriteBarrierForBootOatFileBssRoots(const OatFile* oat_file)
601 REQUIRES(!Locks::classlinker_classes_lock_)
602 REQUIRES_SHARED(Locks::mutator_lock_);
603
Vladimir Markob4eb1b12018-05-24 11:09:38 +0100604 template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampe88dbad32018-06-26 19:54:12 -0700605 ObjPtr<mirror::ObjectArray<mirror::Class>> GetClassRoots() REQUIRES_SHARED(Locks::mutator_lock_);
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700606
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800607 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
608 // that no more classes are ever added to the pre zygote table which makes it that the pages
609 // always remain shared dirty instead of private dirty.
610 void MoveClassTableToPreZygote()
Mathieu Chartier90443472015-07-16 20:32:27 -0700611 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700612 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800613
Calin Juravle7865ac72017-06-28 11:03:12 -0700614 // Creates a GlobalRef PathClassLoader or DelegateLastClassLoader (specified by loader_class)
615 // that can be used to load classes from the given dex files. The parent of the class loader
616 // will be set to `parent_loader`. If `parent_loader` is null the parent will be
617 // the boot class loader.
618 // If class_loader points to a different class than PathClassLoader or DelegateLastClassLoader
619 // this method will abort.
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700620 // Note: the objects are not completely set up. Do not use this outside of tests and the compiler.
Calin Juravle7865ac72017-06-28 11:03:12 -0700621 jobject CreateWellKnownClassLoader(Thread* self,
622 const std::vector<const DexFile*>& dex_files,
623 jclass loader_class,
Nicolas Geoffraye1672732018-11-30 01:09:49 +0000624 jobject parent_loader,
625 jobject shared_libraries = nullptr)
Calin Juravle7865ac72017-06-28 11:03:12 -0700626 REQUIRES_SHARED(Locks::mutator_lock_)
627 REQUIRES(!Locks::dex_lock_);
628
629 // Calls CreateWellKnownClassLoader(self,
630 // dex_files,
631 // WellKnownClasses::dalvik_system_PathClassLoader,
632 // nullptr)
Jeff Haof0192c82016-03-28 20:39:50 -0700633 jobject CreatePathClassLoader(Thread* self, const std::vector<const DexFile*>& dex_files)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700634 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800635 REQUIRES(!Locks::dex_lock_);
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700636
Nicolas Geoffray6b9fd8c2018-11-16 10:25:42 +0000637 // Non-GlobalRef version of CreateWellKnownClassLoader
638 ObjPtr<mirror::ClassLoader> CreateWellKnownClassLoader(
639 Thread* self,
640 const std::vector<const DexFile*>& dex_files,
641 Handle<mirror::Class> loader_class,
Nicolas Geoffraye1672732018-11-30 01:09:49 +0000642 Handle<mirror::ClassLoader> parent_loader,
643 Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries)
Nicolas Geoffray6b9fd8c2018-11-16 10:25:42 +0000644 REQUIRES_SHARED(Locks::mutator_lock_)
645 REQUIRES(!Locks::dex_lock_);
646
Andreas Gampe542451c2016-07-26 09:02:02 -0700647 PointerSize GetImagePointerSize() const {
Mathieu Chartiere401d142015-04-22 13:56:20 -0700648 return image_pointer_size_;
649 }
650
651 // Used by image writer for checking.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700652 bool ClassInClassTable(ObjPtr<mirror::Class> klass)
Mathieu Chartier673ed3d2015-08-28 14:56:43 -0700653 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700654 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiera89d7ed2014-12-05 10:57:13 -0800655
Andreas Gampe8ac75952015-06-02 21:01:45 -0700656 // Clear the ArrayClass cache. This is necessary when cleaning up for the image, as the cache
657 // entries are roots, but potentially not image classes.
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700658 void DropFindArrayClassCache() REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe8ac75952015-06-02 21:01:45 -0700659
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700660 // Clean up class loaders, this needs to happen after JNI weak globals are cleared.
661 void CleanupClassLoaders()
Mathieu Chartier00310e02015-10-17 12:46:42 -0700662 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700663 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700664
Mathieu Chartier32cc9ee2015-10-15 09:19:15 -0700665 // Unlike GetOrCreateAllocatorForClassLoader, GetAllocatorForClassLoader asserts that the
666 // allocator for this class loader is already created.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700667 LinearAlloc* GetAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700668 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700669
Mathieu Chartierd57d4542015-10-14 10:55:30 -0700670 // Return the linear alloc for a class loader if it is already allocated, otherwise allocate and
671 // set it. TODO: Consider using a lock other than classlinker_classes_lock_.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700672 LinearAlloc* GetOrCreateAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier00310e02015-10-17 12:46:42 -0700673 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700674 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier00310e02015-10-17 12:46:42 -0700675
Mathieu Chartier6d25cf62016-04-12 16:54:48 -0700676 // May be called with null class_loader due to legacy code. b/27954959
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700677 void InsertDexFileInToClassLoader(ObjPtr<mirror::Object> dex_file,
678 ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier00310e02015-10-17 12:46:42 -0700679 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700680 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierd57d4542015-10-14 10:55:30 -0700681
Tamas Berghammerdd5e5e92016-02-12 16:29:00 +0000682 static bool ShouldUseInterpreterEntrypoint(ArtMethod* method, const void* quick_code)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700683 REQUIRES_SHARED(Locks::mutator_lock_);
Tamas Berghammerdd5e5e92016-02-12 16:29:00 +0000684
Mathieu Chartierc5dd3192015-12-09 16:38:30 -0800685 std::set<DexCacheResolvedClasses> GetResolvedClasses(bool ignore_boot_classes)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800686 REQUIRES(!Locks::dex_lock_);
Mathieu Chartierc5dd3192015-12-09 16:38:30 -0800687
Jeff Haof0192c82016-03-28 20:39:50 -0700688 static bool IsBootClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700689 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700690 REQUIRES_SHARED(Locks::mutator_lock_);
Jeff Haof0192c82016-03-28 20:39:50 -0700691
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700692 ArtMethod* AddMethodToConflictTable(ObjPtr<mirror::Class> klass,
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -0700693 ArtMethod* conflict_method,
694 ArtMethod* interface_method,
695 ArtMethod* method,
696 bool force_new_conflict_method)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700697 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -0700698
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700699 // Create a conflict table with a specified capacity.
700 ImtConflictTable* CreateImtConflictTable(size_t count, LinearAlloc* linear_alloc);
701
702 // Static version for when the class linker is not yet created.
703 static ImtConflictTable* CreateImtConflictTable(size_t count,
704 LinearAlloc* linear_alloc,
Andreas Gampe542451c2016-07-26 09:02:02 -0700705 PointerSize pointer_size);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700706
707
708 // Create the IMT and conflict tables for a class.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700709 void FillIMTAndConflictTables(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700710
Mathieu Chartier72041a02017-07-14 18:23:25 -0700711 // Visit all of the class tables. This is used by dex2oat to allow pruning dex caches.
712 template <class Visitor>
713 void VisitClassTables(const Visitor& visitor)
Mathieu Chartier696632e2016-06-03 17:47:32 -0700714 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700715 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700716
Alexey Grebenkin252a4e42018-04-02 18:18:01 +0300717 // Visit all of the allocators that belong to classloaders except boot classloader.
718 // This is used by 616-cha-unloading test to confirm memory reuse.
719 void VisitAllocators(AllocatorVisitor* visitor) const
720 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
721
Jeff Haoc92a7a12016-06-06 11:09:20 -0700722 // Throw the class initialization failure recorded when first trying to initialize the given
723 // class.
Andreas Gampe7b3063b2019-01-07 14:12:52 -0800724 void ThrowEarlierClassFailure(ObjPtr<mirror::Class> c,
725 bool wrap_in_no_class_def = false,
726 bool log = false)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700727 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800728 REQUIRES(!Locks::dex_lock_);
Jeff Haoc92a7a12016-06-06 11:09:20 -0700729
Mathieu Chartier65975772016-08-05 10:46:36 -0700730 // Get the actual holding class for a copied method. Pretty slow, don't call often.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100731 ObjPtr<mirror::Class> GetHoldingClassOfCopiedMethod(ArtMethod* method)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700732 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier65975772016-08-05 10:46:36 -0700733
Andreas Gampe70f16392017-01-16 14:20:10 -0800734 // Returns null if not found.
Andreas Gampe2af99022017-04-25 08:32:59 -0700735 // This returns a pointer to the class-table, without requiring any locking - including the
736 // boot class-table. It is the caller's responsibility to access this under lock, if required.
Andreas Gampe70f16392017-01-16 14:20:10 -0800737 ClassTable* ClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampe2af99022017-04-25 08:32:59 -0700738 REQUIRES_SHARED(Locks::mutator_lock_)
739 NO_THREAD_SAFETY_ANALYSIS;
Andreas Gampe70f16392017-01-16 14:20:10 -0800740
Andreas Gampece7732b2017-01-17 15:50:26 -0800741 void AppendToBootClassPath(Thread* self, const DexFile& dex_file)
742 REQUIRES_SHARED(Locks::mutator_lock_)
743 REQUIRES(!Locks::dex_lock_);
744
Mathieu Chartier06bed302017-07-13 13:23:18 -0700745 // Visit all of the class loaders in the class linker.
746 void VisitClassLoaders(ClassLoaderVisitor* visitor) const
747 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
748
Jeff Hao0cb17282017-07-12 14:51:49 -0700749 // Checks that a class and its superclass from another class loader have the same virtual methods.
750 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
751 REQUIRES_SHARED(Locks::mutator_lock_);
752
Andreas Gampec1ac9ee2017-07-24 22:35:49 -0700753 ClassHierarchyAnalysis* GetClassHierarchyAnalysis() {
754 return cha_.get();
755 }
756
Vladimir Markobf121912019-06-04 13:49:05 +0100757 void MakeInitializedClassesVisiblyInitialized(Thread* self, bool wait);
758
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800759 struct DexCacheData {
Vladimir Markocd556b02017-02-03 11:47:34 +0000760 // Construct an invalid data object.
761 DexCacheData()
762 : weak_root(nullptr),
763 dex_file(nullptr),
Vladimir Markocd556b02017-02-03 11:47:34 +0000764 class_table(nullptr) { }
765
766 // Check if the data is valid.
767 bool IsValid() const {
768 return dex_file != nullptr;
769 }
770
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800771 // Weak root to the DexCache. Note: Do not decode this unnecessarily or else class unloading may
772 // not work properly.
773 jweak weak_root;
Vladimir Markod1ee20f2017-08-17 09:21:16 +0000774 // The following field caches the DexCache's field here to avoid unnecessary jweak decode that
775 // triggers read barriers (and marks them alive unnecessarily and messes with class unloading.)
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800776 const DexFile* dex_file;
Vladimir Markocd556b02017-02-03 11:47:34 +0000777 // Identify the associated class loader's class table. This is used to make sure that
778 // the Java call to native DexCache.setResolvedType() inserts the resolved type in that
779 // class table. It is also used to make sure we don't register the same dex cache with
780 // multiple class loaders.
781 ClassTable* class_table;
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800782 };
783
Alex Lightfb119572019-09-18 15:04:53 -0700784 // Forces a class to be marked as initialized without actually running initializers. Should only
785 // be used by plugin code when creating new classes directly.
786 void ForceClassInitialized(Thread* self, Handle<mirror::Class> klass)
787 REQUIRES_SHARED(Locks::mutator_lock_)
788 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
789
Chang Xing605fe242017-07-20 15:57:21 -0700790 protected:
791 virtual bool InitializeClass(Thread* self,
792 Handle<mirror::Class> klass,
793 bool can_run_clinit,
794 bool can_init_parents)
795 REQUIRES_SHARED(Locks::mutator_lock_)
796 REQUIRES(!Locks::dex_lock_);
797
Mathieu Chartier9e050df2017-08-09 10:05:47 -0700798 virtual verifier::FailureKind PerformClassVerification(Thread* self,
799 Handle<mirror::Class> klass,
800 verifier::HardFailLogMode log_level,
801 std::string* error_msg)
802 REQUIRES_SHARED(Locks::mutator_lock_);
803
Chang Xing0c2c2222017-08-04 14:36:17 -0700804 virtual bool CanAllocClass() REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::dex_lock_) {
805 return true;
806 }
807
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700808 private:
Vladimir Marko921094a2017-01-12 18:37:06 +0000809 class LinkInterfaceMethodsHelper;
Vladimir Markobf121912019-06-04 13:49:05 +0100810 class VisiblyInitializedCallback;
Vladimir Marko921094a2017-01-12 18:37:06 +0000811
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700812 struct ClassLoaderData {
Mathieu Chartierc3fcd412015-09-25 16:54:59 -0700813 jweak weak_root; // Weak root to enable class unloading.
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700814 ClassTable* class_table;
815 LinearAlloc* allocator;
816 };
817
Vladimir Markobf121912019-06-04 13:49:05 +0100818 void VisiblyInitializedCallbackDone(Thread* self, VisiblyInitializedCallback* callback);
819 VisiblyInitializedCallback* MarkClassInitialized(Thread* self, Handle<mirror::Class> klass)
820 REQUIRES_SHARED(Locks::mutator_lock_);
821
Alex Lightf1f10492015-10-07 16:08:36 -0700822 // Ensures that the supertype of 'klass' ('supertype') is verified. Returns false and throws
823 // appropriate exceptions if verification failed hard. Returns true for successful verification or
824 // soft-failures.
825 bool AttemptSupertypeVerification(Thread* self,
826 Handle<mirror::Class> klass,
827 Handle<mirror::Class> supertype)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800828 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700829 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightf1f10492015-10-07 16:08:36 -0700830
Alexey Grebenkinbe4c2bd2018-02-01 19:09:59 +0300831 void DeleteClassLoader(Thread* self, const ClassLoaderData& data, bool cleanup_cha)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700832 REQUIRES_SHARED(Locks::mutator_lock_);
Nicolas Geoffray1dad3f62015-10-23 14:59:54 +0100833
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700834 void VisitClassesInternal(ClassVisitor* visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700835 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700836
837 // Returns the number of zygote and image classes.
Mathieu Chartier6b069532015-08-05 15:08:12 -0700838 size_t NumZygoteClasses() const
839 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700840 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700841
842 // Returns the number of non zygote nor image classes.
Mathieu Chartier6b069532015-08-05 15:08:12 -0700843 size_t NumNonZygoteClasses() const
844 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700845 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700846
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700847 void FinishInit(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700848 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800849 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700850
Roland Levillain0e840272018-08-23 19:55:30 +0100851 // If we do not allow moving classes (`art::kMovingClass` is false) or if
852 // parameter `kMovable` is false (or both), the class object is allocated in
853 // the non-moving space.
Vladimir Marko70e2a762019-07-12 16:49:00 +0100854 template <bool kMovable = true, class PreFenceVisitor>
855 ObjPtr<mirror::Class> AllocClass(Thread* self,
856 ObjPtr<mirror::Class> java_lang_Class,
857 uint32_t class_size,
858 const PreFenceVisitor& pre_fence_visitor)
859 REQUIRES_SHARED(Locks::mutator_lock_)
860 REQUIRES(!Roles::uninterruptible_);
861
862 // Convenience AllocClass() overload that uses mirror::Class::InitializeClassVisitor
863 // for the class initialization.
Roland Levillain0e840272018-08-23 19:55:30 +0100864 template <bool kMovable = true>
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100865 ObjPtr<mirror::Class> AllocClass(Thread* self,
866 ObjPtr<mirror::Class> java_lang_Class,
867 uint32_t class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700868 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700869 REQUIRES(!Roles::uninterruptible_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700870
Vladimir Marko70e2a762019-07-12 16:49:00 +0100871 // Allocate a primitive array class and store it in appropriate class root.
872 void AllocPrimitiveArrayClass(Thread* self,
873 ClassRoot primitive_root,
874 ClassRoot array_root)
875 REQUIRES_SHARED(Locks::mutator_lock_)
876 REQUIRES(!Roles::uninterruptible_);
877
878 // Finish setup of an array class.
879 void FinishArrayClassSetup(ObjPtr<mirror::Class> array_class)
880 REQUIRES_SHARED(Locks::mutator_lock_)
881 REQUIRES(!Roles::uninterruptible_);
882
883 // Finish setup of a core array class (Object[], Class[], String[] and
884 // primitive arrays) and insert it into the class table.
885 void FinishCoreArrayClassSetup(ClassRoot array_root)
Roland Levillain0e840272018-08-23 19:55:30 +0100886 REQUIRES_SHARED(Locks::mutator_lock_)
887 REQUIRES(!Roles::uninterruptible_);
888
Vladimir Markobcf17522018-06-01 13:14:32 +0100889 ObjPtr<mirror::DexCache> AllocDexCache(/*out*/ ObjPtr<mirror::String>* out_location,
890 Thread* self,
891 const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700892 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700893 REQUIRES(!Roles::uninterruptible_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700894
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700895 // Used for tests and AppendToBootClassPath.
Vladimir Markobcf17522018-06-01 13:14:32 +0100896 ObjPtr<mirror::DexCache> AllocAndInitializeDexCache(Thread* self,
897 const DexFile& dex_file,
898 LinearAlloc* linear_alloc)
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700899 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800900 REQUIRES(!Locks::dex_lock_)
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700901 REQUIRES(!Roles::uninterruptible_);
902
Vladimir Marko70e2a762019-07-12 16:49:00 +0100903 // Create a primitive class and store it in the appropriate class root.
904 void CreatePrimitiveClass(Thread* self, Primitive::Type type, ClassRoot primitive_root)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700905 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700906 REQUIRES(!Roles::uninterruptible_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700907
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100908 ObjPtr<mirror::Class> CreateArrayClass(Thread* self,
909 const char* descriptor,
910 size_t hash,
911 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700912 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800913 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700914
Vladimir Markocd556b02017-02-03 11:47:34 +0000915 void AppendToBootClassPath(const DexFile& dex_file, ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700916 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800917 REQUIRES(!Locks::dex_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700918
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700919 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
920 // sufficient to hold all static fields.
921 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800922 const dex::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700923
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -0700924 void LoadField(const ClassAccessor::Field& field, Handle<mirror::Class> klass, ArtField* dst)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700925 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700926
Mathieu Chartier268764d2016-09-13 12:09:38 -0700927 void LoadMethod(const DexFile& dex_file,
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -0700928 const ClassAccessor::Method& method,
929 Handle<mirror::Class> klass,
930 ArtMethod* dst)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700931 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700932
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700933 void FixupStaticTrampolines(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800934
Nicolas Geoffray7d8d8ff2016-11-02 12:38:05 +0000935 // Finds a class in a Path- or DexClassLoader, loading it if necessary without using JNI. Hash
Andreas Gampe34ee6842014-12-02 15:43:52 -0800936 // function is supposed to be ComputeModifiedUtf8Hash(descriptor). Returns true if the
937 // class-loader chain could be handled, false otherwise, i.e., a non-supported class-loader
938 // was encountered while walking the parent chain (currently only BootClassLoader and
939 // PathClassLoader are supported).
Nicolas Geoffray7d8d8ff2016-11-02 12:38:05 +0000940 bool FindClassInBaseDexClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
941 Thread* self,
942 const char* descriptor,
943 size_t hash,
944 Handle<mirror::ClassLoader> class_loader,
Vladimir Markobcf17522018-06-01 13:14:32 +0100945 /*out*/ ObjPtr<mirror::Class>* result)
Andreas Gampe34ee6842014-12-02 15:43:52 -0800946 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800947 REQUIRES(!Locks::dex_lock_);
Andreas Gampe34ee6842014-12-02 15:43:52 -0800948
Nicolas Geoffray80a560c2018-10-26 13:48:51 +0100949 bool FindClassInSharedLibraries(ScopedObjectAccessAlreadyRunnable& soa,
950 Thread* self,
951 const char* descriptor,
952 size_t hash,
953 Handle<mirror::ClassLoader> class_loader,
954 /*out*/ ObjPtr<mirror::Class>* result)
955 REQUIRES_SHARED(Locks::mutator_lock_)
956 REQUIRES(!Locks::dex_lock_);
957
Calin Juravle415dc3d2017-06-28 11:03:12 -0700958 // Finds the class in the classpath of the given class loader. It only searches the class loader
959 // dex files and does not recurse into its parent.
960 // The method checks that the provided class loader is either a PathClassLoader or a
961 // DexClassLoader.
962 // If the class is found the method returns the resolved class. Otherwise it returns null.
963 ObjPtr<mirror::Class> FindClassInBaseDexClassLoaderClassPath(
964 ScopedObjectAccessAlreadyRunnable& soa,
965 const char* descriptor,
966 size_t hash,
967 Handle<mirror::ClassLoader> class_loader)
968 REQUIRES_SHARED(Locks::mutator_lock_)
969 REQUIRES(!Locks::dex_lock_);
970
971 // Finds the class in the boot class loader.
972 // If the class is found the method returns the resolved class. Otherwise it returns null.
973 ObjPtr<mirror::Class> FindClassInBootClassLoaderClassPath(Thread* self,
974 const char* descriptor,
975 size_t hash)
976 REQUIRES_SHARED(Locks::mutator_lock_)
977 REQUIRES(!Locks::dex_lock_);
978
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000979 // Implementation of LookupResolvedType() called when the type was not found in the dex cache.
980 ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100981 ObjPtr<mirror::Class> referrer)
982 REQUIRES_SHARED(Locks::mutator_lock_);
983 ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000984 ObjPtr<mirror::DexCache> dex_cache,
985 ObjPtr<mirror::ClassLoader> class_loader)
986 REQUIRES_SHARED(Locks::mutator_lock_);
987
Vladimir Marko18090d12018-06-01 16:53:12 +0100988 // Implementation of ResolveString() called when the string was not found in the dex cache.
989 ObjPtr<mirror::String> DoResolveString(dex::StringIndex string_idx,
990 ObjPtr<mirror::DexCache> dex_cache)
991 REQUIRES_SHARED(Locks::mutator_lock_);
992 ObjPtr<mirror::String> DoResolveString(dex::StringIndex string_idx,
993 Handle<mirror::DexCache> dex_cache)
994 REQUIRES_SHARED(Locks::mutator_lock_);
995
996 // Implementation of LookupString() called when the string was not found in the dex cache.
997 ObjPtr<mirror::String> DoLookupString(dex::StringIndex string_idx,
998 ObjPtr<mirror::DexCache> dex_cache)
999 REQUIRES_SHARED(Locks::mutator_lock_);
1000
Andreas Gampeb0625e02019-05-01 12:43:31 -07001001 // Implementation of ResolveType() called when the type was not found in the dex cache. May be
1002 // used with ArtField*, ArtMethod* or ObjPtr<Class>.
1003 template <typename RefType>
1004 ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx, RefType referrer)
Vladimir Marko09c5ca42018-05-31 15:15:31 +01001005 REQUIRES_SHARED(Locks::mutator_lock_)
1006 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1007 ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx,
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001008 Handle<mirror::DexCache> dex_cache,
1009 Handle<mirror::ClassLoader> class_loader)
1010 REQUIRES_SHARED(Locks::mutator_lock_)
1011 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1012
Andreas Gampe34ee6842014-12-02 15:43:52 -08001013 // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
1014 // by the given 'class_loader'. Uses the provided hash for the descriptor.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +01001015 ObjPtr<mirror::Class> LookupClass(Thread* self,
1016 const char* descriptor,
1017 size_t hash,
1018 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampe34ee6842014-12-02 15:43:52 -08001019 REQUIRES(!Locks::classlinker_classes_lock_)
1020 REQUIRES_SHARED(Locks::mutator_lock_);
1021
Vladimir Markof44d36c2017-03-14 14:18:46 +00001022 // Find a field by its field index.
1023 ArtField* LookupResolvedField(uint32_t field_idx,
1024 ObjPtr<mirror::DexCache> dex_cache,
1025 ObjPtr<mirror::ClassLoader> class_loader,
1026 bool is_static)
1027 REQUIRES_SHARED(Locks::mutator_lock_);
1028
Vladimir Markocd556b02017-02-03 11:47:34 +00001029 void RegisterDexFileLocked(const DexFile& dex_file,
1030 ObjPtr<mirror::DexCache> dex_cache,
1031 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001032 REQUIRES(Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001033 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocd556b02017-02-03 11:47:34 +00001034 DexCacheData FindDexCacheDataLocked(const DexFile& dex_file)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001035 REQUIRES(Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001036 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocd556b02017-02-03 11:47:34 +00001037 static ObjPtr<mirror::DexCache> DecodeDexCache(Thread* self, const DexCacheData& data)
1038 REQUIRES_SHARED(Locks::mutator_lock_);
1039 // Called to ensure that the dex cache has been registered with the same class loader.
1040 // If yes, returns the dex cache, otherwise throws InternalError and returns null.
1041 ObjPtr<mirror::DexCache> EnsureSameClassLoader(Thread* self,
1042 ObjPtr<mirror::DexCache> dex_cache,
1043 const DexCacheData& data,
1044 ObjPtr<mirror::ClassLoader> class_loader)
1045 REQUIRES(!Locks::dex_lock_)
1046 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -07001047
Alex Lighteb7c1442015-08-31 13:17:42 -07001048 bool InitializeDefaultInterfaceRecursive(Thread* self,
1049 Handle<mirror::Class> klass,
1050 bool can_run_clinit,
1051 bool can_init_parents)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001052 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001053 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001054 bool WaitForInitializeClass(Handle<mirror::Class> klass,
1055 Thread* self,
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001056 ObjectLock<mirror::Class>& lock);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001057
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001058 bool IsSameDescriptorInDifferentClassContexts(Thread* self,
1059 const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001060 Handle<mirror::ClassLoader> class_loader1,
1061 Handle<mirror::ClassLoader> class_loader2)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001062 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001063
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001064 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self,
1065 ArtMethod* method,
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001066 ObjPtr<mirror::Class> klass1,
1067 ObjPtr<mirror::Class> klass2)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001068 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001069
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001070 bool LinkSuperClass(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001071 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001072
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001073 bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001074 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001075 REQUIRES(!Locks::dex_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001076
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001077 bool LinkMethods(Thread* self,
1078 Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -07001079 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001080 bool* out_new_conflict,
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001081 ArtMethod** out_imt)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001082 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001083
Vladimir Marko5aead702019-03-27 11:00:36 +00001084 ObjPtr<mirror::MethodHandle> ResolveMethodHandleForField(
1085 Thread* self,
1086 const dex::MethodHandleItem& method_handle,
1087 ArtMethod* referrer) REQUIRES_SHARED(Locks::mutator_lock_);
Orion Hodsonf8db2c32017-07-07 20:07:12 +01001088
Vladimir Marko5aead702019-03-27 11:00:36 +00001089 ObjPtr<mirror::MethodHandle> ResolveMethodHandleForMethod(
1090 Thread* self,
1091 const dex::MethodHandleItem& method_handle,
1092 ArtMethod* referrer) REQUIRES_SHARED(Locks::mutator_lock_);
Orion Hodsonf8db2c32017-07-07 20:07:12 +01001093
Alex Light9139e002015-10-09 15:59:48 -07001094 // A wrapper class representing the result of a method translation used for linking methods and
1095 // updating superclass default methods. For each method in a classes vtable there are 4 states it
1096 // could be in:
1097 // 1) No translation is necessary. In this case there is no MethodTranslation object for it. This
1098 // is the standard case and is true when the method is not overridable by a default method,
1099 // the class defines a concrete implementation of the method, the default method implementation
1100 // remains the same, or an abstract method stayed abstract.
1101 // 2) The method must be translated to a different default method. We note this with
1102 // CreateTranslatedMethod.
1103 // 3) The method must be replaced with a conflict method. This happens when a superclass
1104 // implements an interface with a default method and this class implements an unrelated
1105 // interface that also defines that default method. We note this with CreateConflictingMethod.
1106 // 4) The method must be replaced with an abstract miranda method. This happens when a superclass
1107 // implements an interface with a default method and this class implements a subinterface of
1108 // the superclass's interface which declares the default method abstract. We note this with
1109 // CreateAbstractMethod.
1110 //
1111 // When a method translation is unnecessary (case #1), we don't put it into the
1112 // default_translation maps. So an instance of MethodTranslation must be in one of #2-#4.
1113 class MethodTranslation {
1114 public:
1115 // This slot must become a default conflict method.
1116 static MethodTranslation CreateConflictingMethod() {
Andreas Gampe98ea9d92018-10-19 14:06:15 -07001117 return MethodTranslation(Type::kConflict, /*translation=*/nullptr);
Alex Light9139e002015-10-09 15:59:48 -07001118 }
1119
1120 // This slot must become an abstract method.
1121 static MethodTranslation CreateAbstractMethod() {
Andreas Gampe98ea9d92018-10-19 14:06:15 -07001122 return MethodTranslation(Type::kAbstract, /*translation=*/nullptr);
Alex Light9139e002015-10-09 15:59:48 -07001123 }
1124
1125 // Use the given method as the current value for this vtable slot during translation.
1126 static MethodTranslation CreateTranslatedMethod(ArtMethod* new_method) {
1127 return MethodTranslation(Type::kTranslation, new_method);
1128 }
1129
1130 // Returns true if this is a method that must become a conflict method.
1131 bool IsInConflict() const {
1132 return type_ == Type::kConflict;
1133 }
1134
1135 // Returns true if this is a method that must become an abstract method.
1136 bool IsAbstract() const {
1137 return type_ == Type::kAbstract;
1138 }
1139
1140 // Returns true if this is a method that must become a different method.
1141 bool IsTranslation() const {
1142 return type_ == Type::kTranslation;
1143 }
1144
1145 // Get the translated version of this method.
1146 ArtMethod* GetTranslation() const {
1147 DCHECK(IsTranslation());
1148 DCHECK(translation_ != nullptr);
1149 return translation_;
1150 }
1151
1152 private:
1153 enum class Type {
1154 kTranslation,
1155 kConflict,
1156 kAbstract,
1157 };
1158
1159 MethodTranslation(Type type, ArtMethod* translation)
1160 : translation_(translation), type_(type) {}
1161
1162 ArtMethod* const translation_;
1163 const Type type_;
1164 };
1165
Alex Lighteb7c1442015-08-31 13:17:42 -07001166 // Links the virtual methods for the given class and records any default methods that will need to
1167 // be updated later.
1168 //
1169 // Arguments:
1170 // * self - The current thread.
1171 // * klass - class, whose vtable will be filled in.
1172 // * default_translations - Vtable index to new method map.
1173 // Any vtable entries that need to be updated with new default methods
1174 // are stored into the default_translations map. The default_translations
1175 // map is keyed on the vtable index that needs to be updated. We use this
1176 // map because if we override a default method with another default
1177 // method we need to update the vtable to point to the new method.
1178 // Unfortunately since we copy the ArtMethod* we cannot just do a simple
1179 // scan, we therefore store the vtable index's that might need to be
1180 // updated with the method they will turn into.
1181 // TODO This whole default_translations thing is very dirty. There should be a better way.
Alex Light9139e002015-10-09 15:59:48 -07001182 bool LinkVirtualMethods(
1183 Thread* self,
1184 Handle<mirror::Class> klass,
1185 /*out*/std::unordered_map<size_t, MethodTranslation>* default_translations)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001186 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001187
Alex Lighteb7c1442015-08-31 13:17:42 -07001188 // Sets up the interface lookup table (IFTable) in the correct order to allow searching for
1189 // default methods.
1190 bool SetupInterfaceLookupTable(Thread* self,
1191 Handle<mirror::Class> klass,
1192 Handle<mirror::ObjectArray<mirror::Class>> interfaces)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001193 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighteb7c1442015-08-31 13:17:42 -07001194
Alex Light9139e002015-10-09 15:59:48 -07001195
1196 enum class DefaultMethodSearchResult {
1197 kDefaultFound,
1198 kAbstractFound,
1199 kDefaultConflict
1200 };
1201
Alex Lighteb7c1442015-08-31 13:17:42 -07001202 // Find the default method implementation for 'interface_method' in 'klass', if one exists.
1203 //
1204 // Arguments:
1205 // * self - The current thread.
1206 // * target_method - The method we are trying to find a default implementation for.
1207 // * klass - The class we are searching for a definition of target_method.
1208 // * out_default_method - The pointer we will store the found default method to on success.
Alex Lighteb7c1442015-08-31 13:17:42 -07001209 //
1210 // Return value:
Alex Light9139e002015-10-09 15:59:48 -07001211 // * kDefaultFound - There were no conflicting method implementations found in the class while
1212 // searching for target_method. The default method implementation is stored into
1213 // out_default_method.
1214 // * kAbstractFound - There were no conflicting method implementations found in the class while
1215 // searching for target_method but no default implementation was found either.
1216 // out_default_method is set to null and the method should be considered not
1217 // implemented.
1218 // * kDefaultConflict - Conflicting method implementations were found when searching for
1219 // target_method. The value of *out_default_method is null.
1220 DefaultMethodSearchResult FindDefaultMethodImplementation(
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001221 Thread* self,
1222 ArtMethod* target_method,
1223 Handle<mirror::Class> klass,
1224 /*out*/ArtMethod** out_default_method) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001225 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighteb7c1442015-08-31 13:17:42 -07001226
1227 // Sets the imt entries and fixes up the vtable for the given class by linking all the interface
1228 // methods. See LinkVirtualMethods for an explanation of what default_translations is.
Alex Light9139e002015-10-09 15:59:48 -07001229 bool LinkInterfaceMethods(
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001230 Thread* self,
1231 Handle<mirror::Class> klass,
1232 const std::unordered_map<size_t, MethodTranslation>& default_translations,
1233 bool* out_new_conflict,
1234 ArtMethod** out_imt)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001235 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001236
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001237 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001238 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001239 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001240 REQUIRES_SHARED(Locks::mutator_lock_);
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001241 bool LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_static, size_t* class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001242 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001243 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001244 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001245
Mathieu Chartiere401d142015-04-22 13:56:20 -07001246 void CheckProxyConstructor(ArtMethod* constructor) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001247 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001248 void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001249 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001250
Andreas Gampecc1b5352016-12-01 16:58:38 -08001251 size_t GetDexCacheCount() REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -07001252 return dex_caches_.size();
1253 }
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -08001254 const std::list<DexCacheData>& GetDexCachesData()
Andreas Gampecc1b5352016-12-01 16:58:38 -08001255 REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
Mathieu Chartier673ed3d2015-08-28 14:56:43 -07001256 return dex_caches_;
1257 }
Brian Carlstrom58ae9412011-10-04 00:56:06 -07001258
Mathieu Chartiere401d142015-04-22 13:56:20 -07001259 void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001260 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001261 void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001262 REQUIRES_SHARED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -04001263
Mathieu Chartier5b830502016-03-02 10:30:23 -08001264 // Register a class loader and create its class table and allocator. Should not be called if
1265 // these are already created.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001266 void RegisterClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001267 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier5b830502016-03-02 10:30:23 -08001268 REQUIRES(Locks::classlinker_classes_lock_);
1269
Nicolas Geoffray3a090922015-11-24 09:17:30 +00001270 // Insert a new class table if not found.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001271 ClassTable* InsertClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001272 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001273 REQUIRES(Locks::classlinker_classes_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001274
Ian Rogersdbf3be02014-08-29 15:40:08 -07001275 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
1276 // before returning it to the caller. Its the responsibility of the thread that placed the class
1277 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
1278 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
1279 // retire a class, the version of the class in the table is returned and this may differ from
1280 // the class passed in.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +01001281 ObjPtr<mirror::Class> EnsureResolved(Thread* self,
1282 const char* descriptor,
1283 ObjPtr<mirror::Class> klass)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001284 WARN_UNUSED
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001285 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001286 REQUIRES(!Locks::dex_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -07001287
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001288 void FixupTemporaryDeclaringClass(ObjPtr<mirror::Class> temp_class,
1289 ObjPtr<mirror::Class> new_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001290 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -07001291
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001292 void SetClassRoot(ClassRoot class_root, ObjPtr<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001293 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001294
1295 // Return the quick generic JNI stub for testing.
1296 const void* GetRuntimeQuickGenericJniStub() const;
1297
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001298 bool CanWeInitializeClass(ObjPtr<mirror::Class> klass,
1299 bool can_init_statics,
1300 bool can_init_parents)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001301 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001302
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001303 void UpdateClassMethods(ObjPtr<mirror::Class> klass,
Alex Lighte64300b2015-12-15 15:02:47 -08001304 LengthPrefixedArray<ArtMethod>* new_methods)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001305 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier54d220e2015-07-30 16:20:06 -07001306 REQUIRES(!Locks::classlinker_classes_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001307
Andreas Gampe7ba5a672016-02-04 21:45:01 -08001308 // Check that c1 == FindSystemClass(self, descriptor). Abort with class dumps otherwise.
1309 void CheckSystemClass(Thread* self, Handle<mirror::Class> c1, const char* descriptor)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001310 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001311 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe7ba5a672016-02-04 21:45:01 -08001312
Vladimir Marko921094a2017-01-12 18:37:06 +00001313 // Allocate method arrays for interfaces.
1314 bool AllocateIfTableMethodArrays(Thread* self,
1315 Handle<mirror::Class> klass,
1316 Handle<mirror::IfTable> iftable)
1317 REQUIRES_SHARED(Locks::mutator_lock_);
1318
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001319 // Sets imt_ref appropriately for LinkInterfaceMethods.
1320 // If there is no method in the imt location of imt_ref it will store the given method there.
1321 // Otherwise it will set the conflict method which will figure out which method to use during
1322 // runtime.
1323 void SetIMTRef(ArtMethod* unimplemented_method,
1324 ArtMethod* imt_conflict_method,
1325 ArtMethod* current_method,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001326 /*out*/bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001327 /*out*/ArtMethod** imt_ref) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001328
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001329 void FillIMTFromIfTable(ObjPtr<mirror::IfTable> if_table,
Mathieu Chartiere42888f2016-04-14 10:49:19 -07001330 ArtMethod* unimplemented_method,
1331 ArtMethod* imt_conflict_method,
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001332 ObjPtr<mirror::Class> klass,
Mathieu Chartiere42888f2016-04-14 10:49:19 -07001333 bool create_conflict_tables,
1334 bool ignore_copied_methods,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001335 /*out*/bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001336 /*out*/ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001337
1338 void FillImtFromSuperClass(Handle<mirror::Class> klass,
1339 ArtMethod* unimplemented_method,
1340 ArtMethod* imt_conflict_method,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001341 bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001342 ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001343
Vladimir Markoba118822017-06-12 15:41:56 +01001344 // Check invoke type against the referenced class. Throws IncompatibleClassChangeError
1345 // (if `kThrowOnError`) and returns true on mismatch (kInterface on a non-interface class,
1346 // kVirtual on interface, kDefault on interface for dex files not supporting default methods),
1347 // otherwise returns false.
1348 template <bool kThrowOnError, typename ClassGetter>
1349 static bool CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_cache,
1350 InvokeType type,
1351 ClassGetter class_getter)
1352 REQUIRES_SHARED(Locks::mutator_lock_);
1353 // Helper that feeds the above function with `ClassGetter` doing `LookupResolvedType()`.
1354 template <bool kThrow>
1355 bool CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_cache,
1356 InvokeType type,
1357 uint32_t method_idx,
1358 ObjPtr<mirror::ClassLoader> class_loader)
1359 REQUIRES_SHARED(Locks::mutator_lock_);
1360
Vladimir Marko02610552018-06-04 14:38:00 +01001361 ObjPtr<mirror::IfTable> GetArrayIfTable() REQUIRES_SHARED(Locks::mutator_lock_);
1362
Brian Carlstrom4a96b602011-07-26 16:40:23 -07001363 std::vector<const DexFile*> boot_class_path_;
Mathieu Chartierfbc31082016-01-24 11:59:56 -08001364 std::vector<std::unique_ptr<const DexFile>> boot_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07001365
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -08001366 // JNI weak globals and side data to allow dex caches to get unloaded. We lazily delete weak
1367 // globals when we register new dex files.
Andreas Gampecc1b5352016-12-01 16:58:38 -08001368 std::list<DexCacheData> dex_caches_ GUARDED_BY(Locks::dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -07001369
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -07001370 // This contains the class loaders which have class tables. It is populated by
Mathieu Chartier951ec2c2015-09-22 08:50:05 -07001371 // InsertClassTableForClassLoader.
1372 std::list<ClassLoaderData> class_loaders_
Mathieu Chartier6b069532015-08-05 15:08:12 -07001373 GUARDED_BY(Locks::classlinker_classes_lock_);
1374
1375 // Boot class path table. Since the class loader for this is null.
Andreas Gampe2af99022017-04-25 08:32:59 -07001376 std::unique_ptr<ClassTable> boot_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001377
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001378 // New class roots, only used by CMS since the GC needs to mark these in the pause.
1379 std::vector<GcRoot<mirror::Class>> new_class_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -07001380
Vladimir Marko1998cd02017-01-13 13:02:58 +00001381 // Boot image oat files with new .bss GC roots to be visited in the pause by CMS.
1382 std::vector<const OatFile*> new_bss_roots_boot_oat_files_
1383 GUARDED_BY(Locks::classlinker_classes_lock_);
1384
Ian Rogers7dfb28c2013-08-22 08:18:36 -07001385 // Number of times we've searched dex caches for a class. After a certain number of misses we move
1386 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -07001387 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -07001388
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001389 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001390 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -07001391
Ian Rogers98379392014-02-24 16:53:16 -08001392 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
1393 // descriptors for the sake of performing FindClass.
1394 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001395 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -08001396 size_t find_array_class_cache_next_victim_;
1397
Brian Carlstrom75cb3b42011-07-28 02:13:36 -07001398 bool init_done_;
Vladimir Marko1998cd02017-01-13 13:02:58 +00001399 bool log_new_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -07001400
Elliott Hughescf4c6c42011-09-01 15:16:42 -07001401 InternTable* intern_table_;
1402
Andreas Gampe87658f32019-04-18 18:39:02 +00001403 const bool fast_class_not_found_exceptions_;
1404
Mingyao Yang98d1cc82014-05-15 17:02:16 -07001405 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
1406 // patch point within the image. TODO: make these proper relocations.
Jeff Hao0aba0ba2013-06-03 14:49:28 -07001407 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -07001408 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -08001409 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +01001410 const void* quick_to_interpreter_bridge_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -07001411
Mathieu Chartier2d721012014-11-10 11:08:06 -08001412 // Image pointer size.
Andreas Gampe542451c2016-07-26 09:02:02 -07001413 PointerSize image_pointer_size_;
Mathieu Chartier2d721012014-11-10 11:08:06 -08001414
Vladimir Markobf121912019-06-04 13:49:05 +01001415 // Classes to transition from ClassStatus::kInitialized to ClassStatus::kVisiblyInitialized.
1416 Mutex visibly_initialized_callback_lock_;
1417 std::unique_ptr<VisiblyInitializedCallback> visibly_initialized_callback_
1418 GUARDED_BY(visibly_initialized_callback_lock_);
1419 IntrusiveForwardList<VisiblyInitializedCallback> running_visibly_initialized_callbacks_
1420 GUARDED_BY(visibly_initialized_callback_lock_);
1421
Andreas Gampec1ac9ee2017-07-24 22:35:49 -07001422 std::unique_ptr<ClassHierarchyAnalysis> cha_;
1423
Mathieu Chartier65975772016-08-05 10:46:36 -07001424 class FindVirtualMethodHolderVisitor;
Andreas Gampe2af99022017-04-25 08:32:59 -07001425
Mathieu Chartier74ccee62018-10-10 10:30:29 -07001426 friend class AppImageLoadingHelper;
Mathieu Chartierf9c6fc62015-10-07 11:44:05 -07001427 friend class ImageDumper; // for DexLock
Vladimir Marko74527972016-11-29 15:57:32 +00001428 friend struct linker::CompilationHelper; // For Compile in ImageTest.
1429 friend class linker::ImageWriter; // for GetClassRoots
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001430 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Andreas Gampe5f4a09a2015-09-28 13:16:33 -07001431 friend class JniInternalTest; // for GetRuntimeQuickGenericJniStub
Andreas Gampe2af99022017-04-25 08:32:59 -07001432 friend class VMClassLoader; // for LookupClass and FindClassInBaseDexClassLoader.
Mathieu Chartier76172162016-01-26 14:54:06 -08001433 ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName); // for DexLock, and RegisterDexFileLocked
Narayan Kamath25352fc2016-08-03 12:46:58 +01001434 ART_FRIEND_TEST(mirror::DexCacheMethodHandlesTest, Open); // for AllocDexCache
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001435 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001436 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
1437};
1438
Andreas Gampe0f01b582017-01-18 15:22:37 -08001439class ClassLoadCallback {
1440 public:
1441 virtual ~ClassLoadCallback() {}
1442
Alex Lightb0f11922017-01-23 14:25:17 -08001443 // If set we will replace initial_class_def & initial_dex_file with the final versions. The
1444 // callback author is responsible for ensuring these are allocated in such a way they can be
1445 // cleaned up if another transformation occurs. Note that both must be set or null/unchanged on
1446 // return.
1447 // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1448 // different object. It is the listener's responsibility to handle this.
1449 // Note: This callback is rarely useful so a default implementation has been given that does
1450 // nothing.
1451 virtual void ClassPreDefine(const char* descriptor ATTRIBUTE_UNUSED,
1452 Handle<mirror::Class> klass ATTRIBUTE_UNUSED,
1453 Handle<mirror::ClassLoader> class_loader ATTRIBUTE_UNUSED,
1454 const DexFile& initial_dex_file ATTRIBUTE_UNUSED,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -08001455 const dex::ClassDef& initial_class_def ATTRIBUTE_UNUSED,
Alex Lightb0f11922017-01-23 14:25:17 -08001456 /*out*/DexFile const** final_dex_file ATTRIBUTE_UNUSED,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -08001457 /*out*/dex::ClassDef const** final_class_def ATTRIBUTE_UNUSED)
Alex Lightb0f11922017-01-23 14:25:17 -08001458 REQUIRES_SHARED(Locks::mutator_lock_) {}
1459
Andreas Gampe0f01b582017-01-18 15:22:37 -08001460 // A class has been loaded.
1461 // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1462 // different object. It is the listener's responsibility to handle this.
1463 virtual void ClassLoad(Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1464
1465 // A class has been prepared, i.e., resolved. As the ClassLoad event might have been for a
1466 // temporary class, provide both the former and the current class.
1467 virtual void ClassPrepare(Handle<mirror::Class> temp_klass,
1468 Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1469};
1470
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001471} // namespace art
1472
Brian Carlstromfc0e3212013-07-17 14:40:12 -07001473#endif // ART_RUNTIME_CLASS_LINKER_H_