blob: eaaf128527b350b52c29d6755f81ac9d2f2dba6b [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>
Vladimir Marko86c87522020-05-11 16:55:55 +010021#include <map>
Mathieu Chartierc5dd3192015-12-09 16:38:30 -080022#include <set>
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080023#include <string>
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +000024#include <type_traits>
David Srbecky6fbcc292021-02-23 01:05:32 +000025#include <unordered_map>
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 Marko782fb712020-12-23 12:47:31 +000030#include "base/hash_map.h"
Vladimir Markobf121912019-06-04 13:49:05 +010031#include "base/mutex.h"
32#include "base/intrusive_forward_list.h"
Andreas Gampe7fbc4a52018-11-28 08:26:47 -080033#include "base/locks.h"
Elliott Hughes76160052012-12-12 16:31:20 -080034#include "base/macros.h"
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -070035#include "dex/class_accessor.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"
Vladimir Marko43354742021-02-03 15:37:01 +000041#include "mirror/object.h"
Andreas Gampe6d7abbd2017-04-24 13:19:09 -070042#include "verifier/verifier_enums.h"
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070043
44namespace art {
Mingyao Yang98d1cc82014-05-15 17:02:16 -070045
Vladimir Marko86c87522020-05-11 16:55:55 +010046class ArtField;
47class ArtMethod;
48class ClassHierarchyAnalysis;
49enum class ClassRoot : uint32_t;
50class ClassTable;
51class DexFile;
52template<class T> class Handle;
53class ImtConflictTable;
54template<typename T> class LengthPrefixedArray;
55template<class T> class MutableHandle;
56class InternTable;
57class LinearAlloc;
58class OatFile;
59template<class T> class ObjectLock;
60class Runtime;
61class ScopedObjectAccessAlreadyRunnable;
Calin Juravle33787682019-07-26 14:27:18 -070062class SdkChecker;
Vladimir Marko86c87522020-05-11 16:55:55 +010063template<size_t kNumReferences> class PACKED(4) StackHandleScope;
64class Thread;
65
66enum VisitRootFlags : uint8_t;
67
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080068namespace dex {
69struct ClassDef;
Andreas Gampe62629592019-01-03 16:08:31 -080070struct MethodHandleItem;
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080071} // namespace dex
72
Ian Rogers1d54e732013-05-02 21:10:01 -070073namespace gc {
74namespace space {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080075class ImageSpace;
Ian Rogers1d54e732013-05-02 21:10:01 -070076} // namespace space
77} // namespace gc
Vladimir Marko74527972016-11-29 15:57:32 +000078
79namespace linker {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080080struct CompilationHelper;
81class ImageWriter;
82class OatWriter;
Vladimir Marko74527972016-11-29 15:57:32 +000083} // namespace linker
84
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080085namespace mirror {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080086class ClassLoader;
87class DexCache;
88class DexCachePointerArray;
89class DexCacheMethodHandlesTest_Open_Test;
90class DexCacheTest_Open_Test;
91class IfTable;
92class MethodHandle;
93class MethodHandlesLookup;
94class MethodType;
95template<class T> class ObjectArray;
96class StackTraceElement;
Ian Rogers33e95662013-05-20 20:29:14 -070097} // namespace mirror
Ian Rogers1d54e732013-05-02 21:10:01 -070098
Nicolas Geoffray5b0b2e12021-03-19 14:48:40 +000099namespace verifier {
100class VerifierDeps;
101}
102
Mathieu Chartier1aa8ec22016-02-01 10:34:47 -0800103class ClassVisitor {
104 public:
105 virtual ~ClassVisitor() {}
106 // Return true to continue visiting.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700107 virtual bool operator()(ObjPtr<mirror::Class> klass) = 0;
Mathieu Chartier1aa8ec22016-02-01 10:34:47 -0800108};
109
Alex Light3f0dca12020-01-27 17:20:28 -0800110template <typename Func>
111class ClassFuncVisitor final : public ClassVisitor {
112 public:
113 explicit ClassFuncVisitor(Func func) : func_(func) {}
114 bool operator()(ObjPtr<mirror::Class> klass) override REQUIRES_SHARED(Locks::mutator_lock_) {
115 return func_(klass);
116 }
117
118 private:
119 Func func_;
120};
121
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -0700122class ClassLoaderVisitor {
123 public:
124 virtual ~ClassLoaderVisitor() {}
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700125 virtual void Visit(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700126 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -0700127};
128
Alex Lightabd8f052019-12-06 10:49:17 -0800129template <typename Func>
130class ClassLoaderFuncVisitor final : public ClassLoaderVisitor {
131 public:
132 explicit ClassLoaderFuncVisitor(Func func) : func_(func) {}
133 void Visit(ObjPtr<mirror::ClassLoader> cl) override REQUIRES_SHARED(Locks::mutator_lock_) {
134 func_(cl);
135 }
136
137 private:
138 Func func_;
139};
140
Alexey Grebenkin252a4e42018-04-02 18:18:01 +0300141class AllocatorVisitor {
142 public:
143 virtual ~AllocatorVisitor() {}
144 // Return true to continue visiting.
145 virtual bool Visit(LinearAlloc* alloc)
146 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
147};
148
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700149class ClassLinker {
150 public:
Chris Wailes55c880e2018-10-24 13:10:35 -0700151 static constexpr bool kAppImageMayContainStrings = true;
Mathieu Chartier0933cc52018-03-23 14:25:08 -0700152
Andreas Gampe87658f32019-04-18 18:39:02 +0000153 explicit ClassLinker(InternTable* intern_table,
154 bool fast_class_not_found_exceptions = true);
Chang Xing605fe242017-07-20 15:57:21 -0700155 virtual ~ClassLinker();
Carl Shapiro565f5072011-07-10 13:39:43 -0700156
Alex Light64ad14d2014-08-19 14:23:13 -0700157 // Initialize class linker by bootstraping from dex files.
Andreas Gampe3db9c5d2015-11-17 11:52:46 -0800158 bool InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path,
159 std::string* error_msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700160 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800161 REQUIRES(!Locks::dex_lock_);
Mathieu Chartier590fee92013-09-13 13:46:47 -0700162
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800163 // Initialize class linker from one or more boot images.
164 bool InitFromBootImage(std::string* error_msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700165 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800166 REQUIRES(!Locks::dex_lock_);
Mathieu Chartier590fee92013-09-13 13:46:47 -0700167
Vladimir Marko0ace5632018-12-14 11:11:47 +0000168 // Add boot class path dex files that were not included in the boot image.
169 // ClassLinker takes ownership of these dex files.
170 void AddExtraBootDexFiles(Thread* self,
171 std::vector<std::unique_ptr<const DexFile>>&& additional_dex_files)
172 REQUIRES_SHARED(Locks::mutator_lock_);
173
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800174 // Add an image space to the class linker, may fix up classloader fields and dex cache fields.
175 // The dex files that were newly opened for the space are placed in the out argument
176 // out_dex_files. Returns true if the operation succeeded.
177 // The space must be already added to the heap before calling AddImageSpace since we need to
178 // properly handle read barriers and object marking.
179 bool AddImageSpace(gc::space::ImageSpace* space,
180 Handle<mirror::ClassLoader> class_loader,
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800181 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
182 std::string* error_msg)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800183 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700184 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800185
Mathieu Chartier0b4cbd02016-03-08 16:49:58 -0800186 bool OpenImageDexFiles(gc::space::ImageSpace* space,
187 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
188 std::string* error_msg)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800189 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700190 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier0b4cbd02016-03-08 16:49:58 -0800191
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700192 // Finds a class by its descriptor, loading it if necessary.
Brian Carlstrom74eb46a2011-08-02 20:10:14 -0700193 // If class_loader is null, searches boot_class_path_.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100194 ObjPtr<mirror::Class> FindClass(Thread* self,
195 const char* descriptor,
196 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700197 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800198 REQUIRES(!Locks::dex_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700199
Ian Rogers98379392014-02-24 16:53:16 -0800200 // Finds a class by its descriptor using the "system" class loader, ie by searching the
201 // boot_class_path_.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100202 ObjPtr<mirror::Class> FindSystemClass(Thread* self, const char* descriptor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700203 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800204 REQUIRES(!Locks::dex_lock_) {
205 return FindClass(self, descriptor, ScopedNullHandle<mirror::ClassLoader>());
206 }
Ian Rogers98379392014-02-24 16:53:16 -0800207
208 // Finds the array class given for the element class.
Vladimir Markobcf17522018-06-01 13:14:32 +0100209 ObjPtr<mirror::Class> FindArrayClass(Thread* self, ObjPtr<mirror::Class> element_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700210 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800211 REQUIRES(!Locks::dex_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700212
Ian Rogers63557452014-06-04 16:57:15 -0700213 // Returns true if the class linker is initialized.
Ian Rogers7b078e82014-09-10 14:44:24 -0700214 bool IsInitialized() const {
215 return init_done_;
216 }
Mathieu Chartier590fee92013-09-13 13:46:47 -0700217
Brian Carlstromaded5f72011-10-07 17:15:04 -0700218 // Define a new a class based on a ClassDef from a DexFile
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100219 ObjPtr<mirror::Class> DefineClass(Thread* self,
220 const char* descriptor,
221 size_t hash,
222 Handle<mirror::ClassLoader> class_loader,
223 const DexFile& dex_file,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800224 const dex::ClassDef& dex_class_def)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700225 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800226 REQUIRES(!Locks::dex_lock_);
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700227
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700228 // Finds a class by its descriptor, returning null if it isn't wasn't loaded
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700229 // by the given 'class_loader'.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100230 ObjPtr<mirror::Class> LookupClass(Thread* self,
231 const char* descriptor,
232 ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier90443472015-07-16 20:32:27 -0700233 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampe2ff3b972017-06-05 18:14:53 -0700234 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700235
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800236 // Finds all the classes with the given descriptor, regardless of ClassLoader.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700237 void LookupClasses(const char* descriptor, std::vector<ObjPtr<mirror::Class>>& classes)
Mathieu Chartier90443472015-07-16 20:32:27 -0700238 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700239 REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800240
Vladimir Marko9186b182018-11-06 14:55:54 +0000241 ObjPtr<mirror::Class> LookupPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100242 ObjPtr<mirror::Class> FindPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -0700243
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700244 void DumpForSigQuit(std::ostream& os) REQUIRES(!Locks::classlinker_classes_lock_);
Elliott Hughescac6cc72011-11-03 20:31:21 -0700245
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700246 size_t NumLoadedClasses()
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700247 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700248 REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughese27955c2011-08-26 15:21:24 -0700249
Vladimir Marko18090d12018-06-01 16:53:12 +0100250 // Resolve a String with the given index from the DexFile associated with the given `referrer`,
251 // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
252 // to use for resolution.
253 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
254 ArtField* referrer)
255 REQUIRES_SHARED(Locks::mutator_lock_);
256 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
257 ArtMethod* referrer)
258 REQUIRES_SHARED(Locks::mutator_lock_);
259
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000260 // Resolve a String with the given index from the DexFile associated with the given DexCache,
261 // storing the result in the DexCache.
262 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000263 Handle<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700264 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700265
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000266 // Find a String with the given index from the DexFile associated with the given DexCache,
267 // storing the result in the DexCache if found. Return null if not found.
268 ObjPtr<mirror::String> LookupString(dex::StringIndex string_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000269 ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700270 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocac5a7e2016-02-22 10:39:50 +0000271
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000272 // Resolve a Type with the given index from the DexFile associated with the given `referrer`,
273 // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
274 // and ClassLoader to use for resolution.
275 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ObjPtr<mirror::Class> referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700276 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800277 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100278 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtField* referrer)
279 REQUIRES_SHARED(Locks::mutator_lock_)
280 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko28e012a2017-12-07 11:22:59 +0000281 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700282 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800283 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700284
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000285 // Resolve a type with the given index from the DexFile associated with the given DexCache
286 // and ClassLoader, storing the result in DexCache. The ClassLoader is used to search for
287 // the type, since it may be referenced from but not contained within the DexFile.
288 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000289 Handle<mirror::DexCache> dex_cache,
290 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700291 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800292 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700293
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000294 // Look up a resolved type with the given index from the DexFile associated with the given
295 // `referrer`, storing the result in the DexCache. The `referrer` is used to identify the
296 // target DexCache and ClassLoader to use for lookup.
297 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
298 ObjPtr<mirror::Class> referrer)
299 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100300 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtField* referrer)
301 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000302 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtMethod* referrer)
303 REQUIRES_SHARED(Locks::mutator_lock_);
304
305 // Look up a resolved type with the given index from the DexFile associated with the given
306 // DexCache and ClassLoader. The ClassLoader is used to search for the type, since it may
307 // be referenced from but not contained within the DexFile.
308 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
309 ObjPtr<mirror::DexCache> dex_cache,
310 ObjPtr<mirror::ClassLoader> class_loader)
311 REQUIRES_SHARED(Locks::mutator_lock_);
312
Vladimir Markoc63d9672021-03-31 15:50:39 +0100313 // Look up a resolved type with the given descriptor associated with the given ClassLoader.
314 ObjPtr<mirror::Class> LookupResolvedType(const char* descriptor,
315 ObjPtr<mirror::ClassLoader> class_loader)
316 REQUIRES_SHARED(Locks::mutator_lock_);
317
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800318 // Determine whether a dex cache result should be trusted, or an IncompatibleClassChangeError
Vladimir Markoba118822017-06-12 15:41:56 +0100319 // check and IllegalAccessError check should be performed even after a hit.
320 enum class ResolveMode { // private.
321 kNoChecks,
322 kCheckICCEAndIAE
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800323 };
324
Vladimir Marko07bfbac2017-07-06 14:55:02 +0100325 // Look up a previously resolved method with the given index.
326 ArtMethod* LookupResolvedMethod(uint32_t method_idx,
327 ObjPtr<mirror::DexCache> dex_cache,
328 ObjPtr<mirror::ClassLoader> class_loader)
329 REQUIRES_SHARED(Locks::mutator_lock_);
330
Nicolas Geoffrayea179f42018-02-08 22:30:18 +0000331 // Find a method with the given index from class `klass`, and update the dex cache.
332 ArtMethod* FindResolvedMethod(ObjPtr<mirror::Class> klass,
333 ObjPtr<mirror::DexCache> dex_cache,
334 ObjPtr<mirror::ClassLoader> class_loader,
335 uint32_t method_idx)
336 REQUIRES_SHARED(Locks::mutator_lock_);
337
David Brazdil4525e0b2018-04-05 16:57:32 +0100338 // Find a method using the wrong lookup mechanism. If `klass` is an interface,
339 // search for a class method. If it is a class, search for an interface method.
340 // This is useful when throwing IncompatibleClassChangeError.
341 ArtMethod* FindIncompatibleMethod(ObjPtr<mirror::Class> klass,
342 ObjPtr<mirror::DexCache> dex_cache,
343 ObjPtr<mirror::ClassLoader> class_loader,
344 uint32_t method_idx)
345 REQUIRES_SHARED(Locks::mutator_lock_);
346
Vladimir Marko89011192017-12-11 13:45:05 +0000347 // Resolve a method with a given ID from the DexFile associated with the given DexCache
348 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader are
349 // used as in ResolveType. What is unique is the method type argument which is used to
350 // determine if this method is a direct, static, or virtual method.
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800351 template <ResolveMode kResolveMode>
Vladimir Marko89011192017-12-11 13:45:05 +0000352 ArtMethod* ResolveMethod(uint32_t method_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700353 Handle<mirror::DexCache> dex_cache,
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700354 Handle<mirror::ClassLoader> class_loader,
355 ArtMethod* referrer,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700356 InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700357 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800358 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700359
Vladimir Markoba118822017-06-12 15:41:56 +0100360 template <InvokeType type, ResolveMode kResolveMode>
Mathieu Chartiere401d142015-04-22 13:56:20 -0700361 ArtMethod* GetResolvedMethod(uint32_t method_idx, ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700362 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightfedd91d2016-01-07 14:49:16 -0800363
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800364 template <ResolveMode kResolveMode>
David Srbecky9cc67b12018-10-25 10:10:35 +0000365 ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, ArtMethod* referrer, InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700366 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800367 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko89011192017-12-11 13:45:05 +0000368 ArtMethod* ResolveMethodWithoutInvokeType(uint32_t method_idx,
Jeff Hao0042c6d2015-07-29 20:14:10 -0700369 Handle<mirror::DexCache> dex_cache,
370 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700371 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800372 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom16192862011-09-12 17:50:06 -0700373
Vladimir Markof44d36c2017-03-14 14:18:46 +0000374 ArtField* LookupResolvedField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700375 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700376 ArtField* ResolveField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700377 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800378 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstromb9edb842011-08-28 16:31:06 -0700379
Vladimir Markoe11dd502017-12-08 14:09:45 +0000380 // Resolve a field with a given ID from the DexFile associated with the given DexCache
381 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
382 // are used as in ResolveType. What is unique is the is_static argument which is used
383 // to determine if we are resolving a static or non-static field.
384 ArtField* ResolveField(uint32_t field_idx,
Mathieu Chartier90443472015-07-16 20:32:27 -0700385 Handle<mirror::DexCache> dex_cache,
Vladimir Markoe11dd502017-12-08 14:09:45 +0000386 Handle<mirror::ClassLoader> class_loader,
387 bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700388 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800389 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700390
Vladimir Markoe11dd502017-12-08 14:09:45 +0000391 // Resolve a field with a given ID from the DexFile associated with the given DexCache
392 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
393 // are used as in ResolveType. No is_static argument is provided so that Java
Ian Rogersb067ac22011-12-13 18:05:09 -0800394 // field resolution semantics are followed.
Vladimir Markoe11dd502017-12-08 14:09:45 +0000395 ArtField* ResolveFieldJLS(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700396 Handle<mirror::DexCache> dex_cache,
397 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700398 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800399 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogersb067ac22011-12-13 18:05:09 -0800400
David Brazdil1ab0fa82018-05-04 11:28:03 +0100401 // Find a field with a given ID from the DexFile associated with the given DexCache
402 // and ClassLoader, storing the result in DexCache. The declaring class is assumed
403 // to have been already resolved into `klass`. The `is_static` argument is used to
404 // determine if we are resolving a static or non-static field.
405 ArtField* FindResolvedField(ObjPtr<mirror::Class> klass,
406 ObjPtr<mirror::DexCache> dex_cache,
407 ObjPtr<mirror::ClassLoader> class_loader,
408 uint32_t field_idx,
409 bool is_static)
410 REQUIRES_SHARED(Locks::mutator_lock_);
411
412 // Find a field with a given ID from the DexFile associated with the given DexCache
413 // and ClassLoader, storing the result in DexCache. The declaring class is assumed
414 // to have been already resolved into `klass`. No is_static argument is provided
415 // so that Java field resolution semantics are followed.
416 ArtField* FindResolvedFieldJLS(ObjPtr<mirror::Class> klass,
417 ObjPtr<mirror::DexCache> dex_cache,
418 ObjPtr<mirror::ClassLoader> class_loader,
419 uint32_t field_idx)
420 REQUIRES_SHARED(Locks::mutator_lock_);
421
Vladimir Markoaf940202017-12-08 15:01:18 +0000422 // Resolve a method type with a given ID from the DexFile associated with a given DexCache
423 // and ClassLoader, storing the result in the DexCache.
424 ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
Orion Hodson06d10a72018-05-14 08:53:38 +0100425 dex::ProtoIndex proto_idx,
Vladimir Markoaf940202017-12-08 15:01:18 +0000426 Handle<mirror::DexCache> dex_cache,
427 Handle<mirror::ClassLoader> class_loader)
Narayan Kamath25352fc2016-08-03 12:46:58 +0100428 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800429 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogersad25ac52011-10-04 19:13:33 -0700430
Vladimir Markoaf940202017-12-08 15:01:18 +0000431 ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
Orion Hodson06d10a72018-05-14 08:53:38 +0100432 dex::ProtoIndex proto_idx,
Vladimir Markoaf940202017-12-08 15:01:18 +0000433 ArtMethod* referrer)
Orion Hodson2e599942017-09-22 16:17:41 +0100434 REQUIRES_SHARED(Locks::mutator_lock_);
435
Orion Hodsonc069a302017-01-18 09:23:12 +0000436 // Resolve a method handle with a given ID from the DexFile. The
437 // result is not cached in the DexCache as the instance will only be
438 // used once in most circumstances.
Vladimir Markoaf940202017-12-08 15:01:18 +0000439 ObjPtr<mirror::MethodHandle> ResolveMethodHandle(Thread* self,
440 uint32_t method_handle_idx,
441 ArtMethod* referrer)
Orion Hodsonc069a302017-01-18 09:23:12 +0000442 REQUIRES_SHARED(Locks::mutator_lock_);
443
Elliott Hughesf4c21c92011-08-19 17:31:31 -0700444 // Returns true on success, false if there's an exception pending.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700445 // can_run_clinit=false allows the compiler to attempt to init a class,
446 // given the restriction that no <clinit> execution is possible.
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700447 bool EnsureInitialized(Thread* self,
448 Handle<mirror::Class> c,
449 bool can_init_fields,
Ian Rogers7b078e82014-09-10 14:44:24 -0700450 bool can_init_parents)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700451 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800452 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700453
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700454 // Initializes classes that have instances in the image but that have
455 // <clinit> methods so they could not be initialized by the compiler.
Vladimir Markodcfcce42018-06-27 10:00:28 +0000456 void RunRootClinits(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700457 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800458 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700459
Alex Light07f06212017-06-01 14:01:43 -0700460 // Directly register an already existing dex cache. RegisterDexFile should be preferred since that
461 // reduplicates DexCaches when possible. The DexCache given to this function must already be fully
462 // initialized and not already registered.
463 void RegisterExistingDexCache(ObjPtr<mirror::DexCache> cache,
464 ObjPtr<mirror::ClassLoader> class_loader)
465 REQUIRES(!Locks::dex_lock_)
466 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocd556b02017-02-03 11:47:34 +0000467 ObjPtr<mirror::DexCache> RegisterDexFile(const DexFile& dex_file,
468 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800469 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700470 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700471
Brian Carlstrom8a487412011-08-29 20:08:52 -0700472 const std::vector<const DexFile*>& GetBootClassPath() {
473 return boot_class_path_;
474 }
475
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700476 void VisitClasses(ClassVisitor* visitor)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700477 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700478 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -0700479
480 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
481 // so that it can visit individual classes without holding the doesn't hold the
482 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
483 // can race with insertion and deletion of classes while the visitor is being called.
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700484 void VisitClassesWithoutClassesLock(ClassVisitor* visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700485 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800486 REQUIRES(!Locks::dex_lock_);
Elliott Hughesa2155262011-11-16 16:26:58 -0800487
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700488 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
Andreas Gamped98b4ed2016-11-04 20:27:24 -0700489 REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700490 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700491 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800492 REQUIRES(!Locks::dex_lock_, !Locks::classlinker_classes_lock_, !Locks::trace_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700493 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightabd8f052019-12-06 10:49:17 -0800494 // Visits all dex-files accessible by any class-loader or the BCP.
495 template<typename Visitor>
496 void VisitKnownDexFiles(Thread* self, Visitor visitor) REQUIRES(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700497
Vladimir Markocd556b02017-02-03 11:47:34 +0000498 bool IsDexFileRegistered(Thread* self, const DexFile& dex_file)
499 REQUIRES(!Locks::dex_lock_)
500 REQUIRES_SHARED(Locks::mutator_lock_);
501 ObjPtr<mirror::DexCache> FindDexCache(Thread* self, const DexFile& dex_file)
502 REQUIRES(!Locks::dex_lock_)
503 REQUIRES_SHARED(Locks::mutator_lock_);
504 ClassTable* FindClassTable(Thread* self, ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800505 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700506 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom1d9f52b2011-10-13 10:50:45 -0700507
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700508 LengthPrefixedArray<ArtField>* AllocArtFieldArray(Thread* self,
509 LinearAlloc* allocator,
510 size_t length);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800511
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700512 LengthPrefixedArray<ArtMethod>* AllocArtMethodArray(Thread* self,
513 LinearAlloc* allocator,
514 size_t length);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700515
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +0000516 // Convenience AllocClass() overload that uses mirror::Class::InitializeClassVisitor
517 // for the class initialization and uses the `java_lang_Class` from class roots
518 // instead of an explicit argument.
519 ObjPtr<mirror::Class> AllocClass(Thread* self, uint32_t class_size)
520 REQUIRES_SHARED(Locks::mutator_lock_)
521 REQUIRES(!Roles::uninterruptible_);
522
523 // Setup the classloader, class def index, type idx so that we can insert this class in the class
524 // table.
525 void SetupClass(const DexFile& dex_file,
526 const dex::ClassDef& dex_class_def,
527 Handle<mirror::Class> klass,
528 ObjPtr<mirror::ClassLoader> class_loader)
529 REQUIRES_SHARED(Locks::mutator_lock_);
530
531 void LoadClass(Thread* self,
532 const DexFile& dex_file,
533 const dex::ClassDef& dex_class_def,
534 Handle<mirror::Class> klass)
535 REQUIRES_SHARED(Locks::mutator_lock_);
536
537 // Link the class and place it into the class-table using the given descriptor. NB if the
538 // descriptor is null the class will not be placed in any class-table. This is useful implementing
539 // obsolete classes and should not be used otherwise.
540 bool LinkClass(Thread* self,
541 const char* descriptor,
542 Handle<mirror::Class> klass,
543 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
544 MutableHandle<mirror::Class>* h_new_class_out)
545 REQUIRES_SHARED(Locks::mutator_lock_)
546 REQUIRES(!Locks::classlinker_classes_lock_);
547
Vladimir Markobcf17522018-06-01 13:14:32 +0100548 ObjPtr<mirror::PointerArray> AllocPointerArray(Thread* self, size_t length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700549 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700550 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800551
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100552 ObjPtr<mirror::IfTable> AllocIfTable(Thread* self, size_t ifcount)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700553 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700554 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800555
Vladimir Markobcf17522018-06-01 13:14:32 +0100556 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> AllocStackTraceElementArray(Thread* self,
557 size_t length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700558 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700559 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800560
Andreas Gampe6d7abbd2017-04-24 13:19:09 -0700561 verifier::FailureKind VerifyClass(
Nicolas Geoffray08025182016-10-25 17:20:18 +0100562 Thread* self,
Nicolas Geoffray5b0b2e12021-03-19 14:48:40 +0000563 verifier::VerifierDeps* verifier_deps,
Nicolas Geoffray08025182016-10-25 17:20:18 +0100564 Handle<mirror::Class> klass,
565 verifier::HardFailLogMode log_level = verifier::HardFailLogMode::kLogNone)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700566 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800567 REQUIRES(!Locks::dex_lock_);
Nicolas Geoffray6df45112021-02-07 21:51:58 +0000568 bool VerifyClassUsingOatFile(Thread* self,
569 const DexFile& dex_file,
570 Handle<mirror::Class> klass,
Vladimir Marko2c64a832018-01-04 11:31:56 +0000571 ClassStatus& oat_file_class_status)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700572 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800573 REQUIRES(!Locks::dex_lock_);
Alex Light5a559862016-01-29 12:24:48 -0800574 void ResolveClassExceptionHandlerTypes(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700575 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800576 REQUIRES(!Locks::dex_lock_);
Alex Light5a559862016-01-29 12:24:48 -0800577 void ResolveMethodExceptionHandlerTypes(ArtMethod* klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700578 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800579 REQUIRES(!Locks::dex_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800580
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100581 ObjPtr<mirror::Class> CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa,
582 jstring name,
583 jobjectArray interfaces,
584 jobject loader,
585 jobjectArray methods,
586 jobjectArray throws)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700587 REQUIRES_SHARED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400588
Alex Lightfc49fec2018-01-16 22:28:36 +0000589 // Get the oat code for a method when its class isn't yet initialized.
590 const void* GetQuickOatCodeFor(ArtMethod* method)
591 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800592
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700593 pid_t GetClassesLockOwner(); // For SignalCatcher.
594 pid_t GetDexLockOwner(); // For SignalCatcher.
Brian Carlstrom24a3c2e2011-10-17 18:07:52 -0700595
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700596 // Is the given entry point quick code to run the resolution stub?
597 bool IsQuickResolutionStub(const void* entry_point) const;
Jeff Hao88474b42013-10-23 16:24:40 -0700598
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700599 // Is the given entry point quick code to bridge into the interpreter?
600 bool IsQuickToInterpreterBridge(const void* entry_point) const;
601
602 // Is the given entry point quick code to run the generic JNI stub?
603 bool IsQuickGenericJniStub(const void* entry_point) const;
Vladimir Marko8a630572014-04-09 18:45:35 +0100604
David Sehra49e0532017-08-25 08:05:29 -0700605 // Is the given entry point the JNI dlsym lookup stub?
606 bool IsJniDlsymLookupStub(const void* entry_point) const;
607
Vladimir Markofa458ac2020-02-12 14:08:07 +0000608 // Is the given entry point the JNI dlsym lookup critical stub?
609 bool IsJniDlsymLookupCriticalStub(const void* entry_point) const;
610
Nicolas Geoffrayc39af942021-01-25 08:43:57 +0000611 // Is the given entry point the nterp trampoline?
612 bool IsNterpTrampoline(const void* entry_point) const {
613 return nterp_trampoline_ == entry_point;
614 }
615
Vladimir Marko97d7e1c2016-10-04 14:44:28 +0100616 const void* GetQuickToInterpreterBridgeTrampoline() const {
617 return quick_to_interpreter_bridge_trampoline_;
618 }
619
Jeff Hao88474b42013-10-23 16:24:40 -0700620 InternTable* GetInternTable() const {
621 return intern_table_;
622 }
623
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700624 // Set the entrypoints up for method to the enter the interpreter.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700625 void SetEntryPointsToInterpreter(ArtMethod* method) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700626 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700627
Alex Lightdb01a092017-04-03 15:39:55 -0700628 // Set the entrypoints up for an obsolete method.
629 void SetEntryPointsForObsoleteMethod(ArtMethod* method) const
630 REQUIRES_SHARED(Locks::mutator_lock_);
631
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700632 // Attempts to insert a class into a class table. Returns null if
Ian Rogers848871b2013-08-05 10:56:33 -0700633 // the class was inserted, otherwise returns an existing class with
634 // the same descriptor and ClassLoader.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100635 ObjPtr<mirror::Class> InsertClass(const char* descriptor,
636 ObjPtr<mirror::Class> klass,
637 size_t hash)
Mathieu Chartier90443472015-07-16 20:32:27 -0700638 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700639 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers848871b2013-08-05 10:56:33 -0700640
Vladimir Marko1998cd02017-01-13 13:02:58 +0000641 // Add an oat file with .bss GC roots to be visited again at the end of GC
642 // for collector types that need it.
643 void WriteBarrierForBootOatFileBssRoots(const OatFile* oat_file)
644 REQUIRES(!Locks::classlinker_classes_lock_)
645 REQUIRES_SHARED(Locks::mutator_lock_);
646
Vladimir Markob4eb1b12018-05-24 11:09:38 +0100647 template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampe88dbad32018-06-26 19:54:12 -0700648 ObjPtr<mirror::ObjectArray<mirror::Class>> GetClassRoots() REQUIRES_SHARED(Locks::mutator_lock_);
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700649
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800650 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
651 // that no more classes are ever added to the pre zygote table which makes it that the pages
652 // always remain shared dirty instead of private dirty.
653 void MoveClassTableToPreZygote()
Mathieu Chartier90443472015-07-16 20:32:27 -0700654 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700655 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800656
Calin Juravle7865ac72017-06-28 11:03:12 -0700657 // Creates a GlobalRef PathClassLoader or DelegateLastClassLoader (specified by loader_class)
658 // that can be used to load classes from the given dex files. The parent of the class loader
659 // will be set to `parent_loader`. If `parent_loader` is null the parent will be
660 // the boot class loader.
661 // If class_loader points to a different class than PathClassLoader or DelegateLastClassLoader
662 // this method will abort.
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700663 // 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 -0700664 jobject CreateWellKnownClassLoader(Thread* self,
665 const std::vector<const DexFile*>& dex_files,
666 jclass loader_class,
Nicolas Geoffraye1672732018-11-30 01:09:49 +0000667 jobject parent_loader,
Brad Stenning9c924e82021-10-11 19:09:00 -0700668 jobject shared_libraries = nullptr,
669 jobject shared_libraries_after = nullptr)
Calin Juravle7865ac72017-06-28 11:03:12 -0700670 REQUIRES_SHARED(Locks::mutator_lock_)
671 REQUIRES(!Locks::dex_lock_);
672
673 // Calls CreateWellKnownClassLoader(self,
674 // dex_files,
675 // WellKnownClasses::dalvik_system_PathClassLoader,
676 // nullptr)
Jeff Haof0192c82016-03-28 20:39:50 -0700677 jobject CreatePathClassLoader(Thread* self, const std::vector<const DexFile*>& dex_files)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700678 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800679 REQUIRES(!Locks::dex_lock_);
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700680
Nicolas Geoffray6b9fd8c2018-11-16 10:25:42 +0000681 // Non-GlobalRef version of CreateWellKnownClassLoader
682 ObjPtr<mirror::ClassLoader> CreateWellKnownClassLoader(
683 Thread* self,
684 const std::vector<const DexFile*>& dex_files,
685 Handle<mirror::Class> loader_class,
Nicolas Geoffraye1672732018-11-30 01:09:49 +0000686 Handle<mirror::ClassLoader> parent_loader,
Brad Stenning9c924e82021-10-11 19:09:00 -0700687 Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries,
688 Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries_after)
Nicolas Geoffray6b9fd8c2018-11-16 10:25:42 +0000689 REQUIRES_SHARED(Locks::mutator_lock_)
690 REQUIRES(!Locks::dex_lock_);
691
Andreas Gampe542451c2016-07-26 09:02:02 -0700692 PointerSize GetImagePointerSize() const {
Mathieu Chartiere401d142015-04-22 13:56:20 -0700693 return image_pointer_size_;
694 }
695
Andreas Gampe8ac75952015-06-02 21:01:45 -0700696 // Clear the ArrayClass cache. This is necessary when cleaning up for the image, as the cache
697 // entries are roots, but potentially not image classes.
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700698 void DropFindArrayClassCache() REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe8ac75952015-06-02 21:01:45 -0700699
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700700 // Clean up class loaders, this needs to happen after JNI weak globals are cleared.
701 void CleanupClassLoaders()
Mathieu Chartier00310e02015-10-17 12:46:42 -0700702 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700703 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700704
Mathieu Chartier32cc9ee2015-10-15 09:19:15 -0700705 // Unlike GetOrCreateAllocatorForClassLoader, GetAllocatorForClassLoader asserts that the
706 // allocator for this class loader is already created.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700707 LinearAlloc* GetAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700708 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700709
Mathieu Chartierd57d4542015-10-14 10:55:30 -0700710 // Return the linear alloc for a class loader if it is already allocated, otherwise allocate and
711 // set it. TODO: Consider using a lock other than classlinker_classes_lock_.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700712 LinearAlloc* GetOrCreateAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier00310e02015-10-17 12:46:42 -0700713 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700714 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier00310e02015-10-17 12:46:42 -0700715
Mathieu Chartier6d25cf62016-04-12 16:54:48 -0700716 // May be called with null class_loader due to legacy code. b/27954959
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700717 void InsertDexFileInToClassLoader(ObjPtr<mirror::Object> dex_file,
718 ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier00310e02015-10-17 12:46:42 -0700719 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700720 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierd57d4542015-10-14 10:55:30 -0700721
Tamas Berghammerdd5e5e92016-02-12 16:29:00 +0000722 static bool ShouldUseInterpreterEntrypoint(ArtMethod* method, const void* quick_code)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700723 REQUIRES_SHARED(Locks::mutator_lock_);
Tamas Berghammerdd5e5e92016-02-12 16:29:00 +0000724
Jeff Haof0192c82016-03-28 20:39:50 -0700725 static bool IsBootClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700726 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700727 REQUIRES_SHARED(Locks::mutator_lock_);
Jeff Haof0192c82016-03-28 20:39:50 -0700728
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700729 ArtMethod* AddMethodToConflictTable(ObjPtr<mirror::Class> klass,
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -0700730 ArtMethod* conflict_method,
731 ArtMethod* interface_method,
Nicolas Geoffray47213e42020-12-30 15:12:00 +0000732 ArtMethod* method)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700733 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -0700734
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700735 // Create a conflict table with a specified capacity.
736 ImtConflictTable* CreateImtConflictTable(size_t count, LinearAlloc* linear_alloc);
737
738 // Static version for when the class linker is not yet created.
739 static ImtConflictTable* CreateImtConflictTable(size_t count,
740 LinearAlloc* linear_alloc,
Andreas Gampe542451c2016-07-26 09:02:02 -0700741 PointerSize pointer_size);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700742
743
744 // Create the IMT and conflict tables for a class.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700745 void FillIMTAndConflictTables(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700746
Mathieu Chartier72041a02017-07-14 18:23:25 -0700747 // Visit all of the class tables. This is used by dex2oat to allow pruning dex caches.
748 template <class Visitor>
749 void VisitClassTables(const Visitor& visitor)
Mathieu Chartier696632e2016-06-03 17:47:32 -0700750 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700751 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700752
Alexey Grebenkin252a4e42018-04-02 18:18:01 +0300753 // Visit all of the allocators that belong to classloaders except boot classloader.
754 // This is used by 616-cha-unloading test to confirm memory reuse.
755 void VisitAllocators(AllocatorVisitor* visitor) const
756 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
757
Jeff Haoc92a7a12016-06-06 11:09:20 -0700758 // Throw the class initialization failure recorded when first trying to initialize the given
759 // class.
Andreas Gampe7b3063b2019-01-07 14:12:52 -0800760 void ThrowEarlierClassFailure(ObjPtr<mirror::Class> c,
761 bool wrap_in_no_class_def = false,
762 bool log = false)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700763 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800764 REQUIRES(!Locks::dex_lock_);
Jeff Haoc92a7a12016-06-06 11:09:20 -0700765
Mathieu Chartier65975772016-08-05 10:46:36 -0700766 // Get the actual holding class for a copied method. Pretty slow, don't call often.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100767 ObjPtr<mirror::Class> GetHoldingClassOfCopiedMethod(ArtMethod* method)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700768 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier65975772016-08-05 10:46:36 -0700769
Andreas Gampe70f16392017-01-16 14:20:10 -0800770 // Returns null if not found.
Andreas Gampe2af99022017-04-25 08:32:59 -0700771 // This returns a pointer to the class-table, without requiring any locking - including the
772 // boot class-table. It is the caller's responsibility to access this under lock, if required.
Andreas Gampe70f16392017-01-16 14:20:10 -0800773 ClassTable* ClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampe2af99022017-04-25 08:32:59 -0700774 REQUIRES_SHARED(Locks::mutator_lock_)
775 NO_THREAD_SAFETY_ANALYSIS;
Andreas Gampe70f16392017-01-16 14:20:10 -0800776
Mathieu Chartier0a19e212019-11-27 14:35:24 -0800777 void AppendToBootClassPath(Thread* self, const DexFile* dex_file)
Andreas Gampece7732b2017-01-17 15:50:26 -0800778 REQUIRES_SHARED(Locks::mutator_lock_)
779 REQUIRES(!Locks::dex_lock_);
780
Mathieu Chartier06bed302017-07-13 13:23:18 -0700781 // Visit all of the class loaders in the class linker.
782 void VisitClassLoaders(ClassLoaderVisitor* visitor) const
783 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
784
Jeff Hao0cb17282017-07-12 14:51:49 -0700785 // Checks that a class and its superclass from another class loader have the same virtual methods.
786 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
787 REQUIRES_SHARED(Locks::mutator_lock_);
788
Andreas Gampec1ac9ee2017-07-24 22:35:49 -0700789 ClassHierarchyAnalysis* GetClassHierarchyAnalysis() {
790 return cha_.get();
791 }
792
Vladimir Markobf121912019-06-04 13:49:05 +0100793 void MakeInitializedClassesVisiblyInitialized(Thread* self, bool wait);
794
Vladimir Marko86c87522020-05-11 16:55:55 +0100795 // Registers the native method and returns the new entry point. NB The returned entry point
796 // might be different from the native_method argument if some MethodCallback modifies it.
797 const void* RegisterNative(Thread* self, ArtMethod* method, const void* native_method)
798 REQUIRES_SHARED(Locks::mutator_lock_) WARN_UNUSED;
799
800 // Unregister native code for a method.
801 void UnregisterNative(Thread* self, ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
802
803 // Get the registered native method entrypoint, if any, otherwise null.
804 const void* GetRegisteredNative(Thread* self, ArtMethod* method)
805 REQUIRES_SHARED(Locks::mutator_lock_)
806 REQUIRES(!critical_native_code_with_clinit_check_lock_);
807
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800808 struct DexCacheData {
Vladimir Markocd556b02017-02-03 11:47:34 +0000809 // Construct an invalid data object.
David Srbecky6fbcc292021-02-23 01:05:32 +0000810 DexCacheData() : weak_root(nullptr), class_table(nullptr) {
811 static std::atomic_uint64_t s_registration_count(0);
812 registration_index = s_registration_count.fetch_add(1, std::memory_order_seq_cst);
Vladimir Markocd556b02017-02-03 11:47:34 +0000813 }
David Srbecky6fbcc292021-02-23 01:05:32 +0000814 DexCacheData(DexCacheData&&) = default;
Vladimir Markocd556b02017-02-03 11:47:34 +0000815
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800816 // Weak root to the DexCache. Note: Do not decode this unnecessarily or else class unloading may
817 // not work properly.
818 jweak weak_root;
Vladimir Markocd556b02017-02-03 11:47:34 +0000819 // Identify the associated class loader's class table. This is used to make sure that
820 // the Java call to native DexCache.setResolvedType() inserts the resolved type in that
821 // class table. It is also used to make sure we don't register the same dex cache with
822 // multiple class loaders.
823 ClassTable* class_table;
David Srbecky6fbcc292021-02-23 01:05:32 +0000824 // Monotonically increasing integer which records the order in which DexFiles were registered.
825 // Used only to preserve determinism when creating compiled image.
826 uint64_t registration_index;
827
828 private:
829 DISALLOW_COPY_AND_ASSIGN(DexCacheData);
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800830 };
831
Alex Lightfb119572019-09-18 15:04:53 -0700832 // Forces a class to be marked as initialized without actually running initializers. Should only
833 // be used by plugin code when creating new classes directly.
834 void ForceClassInitialized(Thread* self, Handle<mirror::Class> klass)
835 REQUIRES_SHARED(Locks::mutator_lock_)
836 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
837
Calin Juravle33787682019-07-26 14:27:18 -0700838 // Verifies if the method is accesible according to the SdkChecker (if installed).
Calin Juravle2c2724c2021-01-14 19:54:23 -0800839 virtual bool DenyAccessBasedOnPublicSdk(ArtMethod* art_method) const
Calin Juravle33787682019-07-26 14:27:18 -0700840 REQUIRES_SHARED(Locks::mutator_lock_);
841 // Verifies if the field is accesible according to the SdkChecker (if installed).
Calin Juravle2c2724c2021-01-14 19:54:23 -0800842 virtual bool DenyAccessBasedOnPublicSdk(ArtField* art_field) const
Calin Juravle33787682019-07-26 14:27:18 -0700843 REQUIRES_SHARED(Locks::mutator_lock_);
844 // Verifies if the descriptor is accesible according to the SdkChecker (if installed).
Calin Juravle2c2724c2021-01-14 19:54:23 -0800845 virtual bool DenyAccessBasedOnPublicSdk(const char* type_descriptor) const;
846 // Enable or disable public sdk checks.
847 virtual void SetEnablePublicSdkChecks(bool enabled);
Calin Juravle33787682019-07-26 14:27:18 -0700848
Chang Xing605fe242017-07-20 15:57:21 -0700849 protected:
850 virtual bool InitializeClass(Thread* self,
851 Handle<mirror::Class> klass,
852 bool can_run_clinit,
853 bool can_init_parents)
854 REQUIRES_SHARED(Locks::mutator_lock_)
855 REQUIRES(!Locks::dex_lock_);
856
Mathieu Chartier9e050df2017-08-09 10:05:47 -0700857 virtual verifier::FailureKind PerformClassVerification(Thread* self,
Nicolas Geoffray5b0b2e12021-03-19 14:48:40 +0000858 verifier::VerifierDeps* verifier_deps,
Mathieu Chartier9e050df2017-08-09 10:05:47 -0700859 Handle<mirror::Class> klass,
860 verifier::HardFailLogMode log_level,
861 std::string* error_msg)
862 REQUIRES_SHARED(Locks::mutator_lock_);
863
Chang Xing0c2c2222017-08-04 14:36:17 -0700864 virtual bool CanAllocClass() REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::dex_lock_) {
865 return true;
866 }
867
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700868 private:
Vladimir Marko42bee502021-01-28 14:58:35 +0000869 class LinkFieldsHelper;
Vladimir Marko921094a2017-01-12 18:37:06 +0000870 class LinkInterfaceMethodsHelper;
Vladimir Marko782fb712020-12-23 12:47:31 +0000871 class MethodTranslation;
Vladimir Markobf121912019-06-04 13:49:05 +0100872 class VisiblyInitializedCallback;
Vladimir Marko921094a2017-01-12 18:37:06 +0000873
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700874 struct ClassLoaderData {
Mathieu Chartierc3fcd412015-09-25 16:54:59 -0700875 jweak weak_root; // Weak root to enable class unloading.
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700876 ClassTable* class_table;
877 LinearAlloc* allocator;
878 };
879
Vladimir Markobf121912019-06-04 13:49:05 +0100880 void VisiblyInitializedCallbackDone(Thread* self, VisiblyInitializedCallback* callback);
881 VisiblyInitializedCallback* MarkClassInitialized(Thread* self, Handle<mirror::Class> klass)
882 REQUIRES_SHARED(Locks::mutator_lock_);
883
Alex Lightf1f10492015-10-07 16:08:36 -0700884 // Ensures that the supertype of 'klass' ('supertype') is verified. Returns false and throws
885 // appropriate exceptions if verification failed hard. Returns true for successful verification or
886 // soft-failures.
887 bool AttemptSupertypeVerification(Thread* self,
Nicolas Geoffray5b0b2e12021-03-19 14:48:40 +0000888 verifier::VerifierDeps* verifier_deps,
Alex Lightf1f10492015-10-07 16:08:36 -0700889 Handle<mirror::Class> klass,
890 Handle<mirror::Class> supertype)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800891 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700892 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightf1f10492015-10-07 16:08:36 -0700893
Alexey Grebenkinbe4c2bd2018-02-01 19:09:59 +0300894 void DeleteClassLoader(Thread* self, const ClassLoaderData& data, bool cleanup_cha)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700895 REQUIRES_SHARED(Locks::mutator_lock_);
Nicolas Geoffray1dad3f62015-10-23 14:59:54 +0100896
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700897 void VisitClassesInternal(ClassVisitor* visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700898 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700899
900 // Returns the number of zygote and image classes.
Mathieu Chartier6b069532015-08-05 15:08:12 -0700901 size_t NumZygoteClasses() const
902 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700903 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700904
905 // Returns the number of non zygote nor image classes.
Mathieu Chartier6b069532015-08-05 15:08:12 -0700906 size_t NumNonZygoteClasses() const
907 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700908 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700909
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700910 void FinishInit(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700911 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800912 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700913
Roland Levillain0e840272018-08-23 19:55:30 +0100914 // If we do not allow moving classes (`art::kMovingClass` is false) or if
915 // parameter `kMovable` is false (or both), the class object is allocated in
916 // the non-moving space.
Vladimir Marko70e2a762019-07-12 16:49:00 +0100917 template <bool kMovable = true, class PreFenceVisitor>
918 ObjPtr<mirror::Class> AllocClass(Thread* self,
919 ObjPtr<mirror::Class> java_lang_Class,
920 uint32_t class_size,
921 const PreFenceVisitor& pre_fence_visitor)
922 REQUIRES_SHARED(Locks::mutator_lock_)
923 REQUIRES(!Roles::uninterruptible_);
924
925 // Convenience AllocClass() overload that uses mirror::Class::InitializeClassVisitor
926 // for the class initialization.
Roland Levillain0e840272018-08-23 19:55:30 +0100927 template <bool kMovable = true>
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100928 ObjPtr<mirror::Class> AllocClass(Thread* self,
929 ObjPtr<mirror::Class> java_lang_Class,
930 uint32_t class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700931 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700932 REQUIRES(!Roles::uninterruptible_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700933
Vladimir Marko70e2a762019-07-12 16:49:00 +0100934 // Allocate a primitive array class and store it in appropriate class root.
935 void AllocPrimitiveArrayClass(Thread* self,
936 ClassRoot primitive_root,
937 ClassRoot array_root)
938 REQUIRES_SHARED(Locks::mutator_lock_)
939 REQUIRES(!Roles::uninterruptible_);
940
941 // Finish setup of an array class.
942 void FinishArrayClassSetup(ObjPtr<mirror::Class> array_class)
943 REQUIRES_SHARED(Locks::mutator_lock_)
944 REQUIRES(!Roles::uninterruptible_);
945
946 // Finish setup of a core array class (Object[], Class[], String[] and
947 // primitive arrays) and insert it into the class table.
948 void FinishCoreArrayClassSetup(ClassRoot array_root)
Roland Levillain0e840272018-08-23 19:55:30 +0100949 REQUIRES_SHARED(Locks::mutator_lock_)
950 REQUIRES(!Roles::uninterruptible_);
951
David Srbecky86d6cd52020-12-02 18:13:10 +0000952 ObjPtr<mirror::DexCache> AllocDexCache(Thread* self, const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700953 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700954 REQUIRES(!Roles::uninterruptible_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700955
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700956 // Used for tests and AppendToBootClassPath.
Vladimir Markobcf17522018-06-01 13:14:32 +0100957 ObjPtr<mirror::DexCache> AllocAndInitializeDexCache(Thread* self,
958 const DexFile& dex_file,
David Srbecky33df0e32021-09-30 14:36:32 +0000959 ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700960 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800961 REQUIRES(!Locks::dex_lock_)
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700962 REQUIRES(!Roles::uninterruptible_);
963
Vladimir Marko70e2a762019-07-12 16:49:00 +0100964 // Create a primitive class and store it in the appropriate class root.
965 void CreatePrimitiveClass(Thread* self, Primitive::Type type, ClassRoot primitive_root)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700966 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700967 REQUIRES(!Roles::uninterruptible_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700968
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100969 ObjPtr<mirror::Class> CreateArrayClass(Thread* self,
970 const char* descriptor,
971 size_t hash,
972 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700973 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800974 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700975
Mathieu Chartier0a19e212019-11-27 14:35:24 -0800976 void AppendToBootClassPath(const DexFile* dex_file, ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700977 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800978 REQUIRES(!Locks::dex_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700979
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700980 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
981 // sufficient to hold all static fields.
982 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800983 const dex::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700984
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -0700985 void LoadField(const ClassAccessor::Field& field, Handle<mirror::Class> klass, ArtField* dst)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700986 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700987
Mathieu Chartier268764d2016-09-13 12:09:38 -0700988 void LoadMethod(const DexFile& dex_file,
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -0700989 const ClassAccessor::Method& method,
990 Handle<mirror::Class> klass,
991 ArtMethod* dst)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700992 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700993
Vladimir Marko86c87522020-05-11 16:55:55 +0100994 void FixupStaticTrampolines(Thread* self, ObjPtr<mirror::Class> klass)
995 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800996
Nicolas Geoffray7d8d8ff2016-11-02 12:38:05 +0000997 // Finds a class in a Path- or DexClassLoader, loading it if necessary without using JNI. Hash
Andreas Gampe34ee6842014-12-02 15:43:52 -0800998 // function is supposed to be ComputeModifiedUtf8Hash(descriptor). Returns true if the
999 // class-loader chain could be handled, false otherwise, i.e., a non-supported class-loader
1000 // was encountered while walking the parent chain (currently only BootClassLoader and
1001 // PathClassLoader are supported).
Nicolas Geoffray7d8d8ff2016-11-02 12:38:05 +00001002 bool FindClassInBaseDexClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
1003 Thread* self,
1004 const char* descriptor,
1005 size_t hash,
1006 Handle<mirror::ClassLoader> class_loader,
Vladimir Markobcf17522018-06-01 13:14:32 +01001007 /*out*/ ObjPtr<mirror::Class>* result)
Andreas Gampe34ee6842014-12-02 15:43:52 -08001008 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001009 REQUIRES(!Locks::dex_lock_);
Andreas Gampe34ee6842014-12-02 15:43:52 -08001010
Nicolas Geoffray80a560c2018-10-26 13:48:51 +01001011 bool FindClassInSharedLibraries(ScopedObjectAccessAlreadyRunnable& soa,
1012 Thread* self,
1013 const char* descriptor,
1014 size_t hash,
1015 Handle<mirror::ClassLoader> class_loader,
1016 /*out*/ ObjPtr<mirror::Class>* result)
1017 REQUIRES_SHARED(Locks::mutator_lock_)
1018 REQUIRES(!Locks::dex_lock_);
1019
Brad Stenning9c924e82021-10-11 19:09:00 -07001020 bool FindClassInSharedLibrariesHelper(ScopedObjectAccessAlreadyRunnable& soa,
1021 Thread* self,
1022 const char* descriptor,
1023 size_t hash,
1024 Handle<mirror::ClassLoader> class_loader,
1025 ArtField* field,
1026 /*out*/ ObjPtr<mirror::Class>* result)
1027 REQUIRES_SHARED(Locks::mutator_lock_)
1028 REQUIRES(!Locks::dex_lock_);
1029
1030 bool FindClassInSharedLibrariesAfter(ScopedObjectAccessAlreadyRunnable& soa,
1031 Thread* self,
1032 const char* descriptor,
1033 size_t hash,
1034 Handle<mirror::ClassLoader> class_loader,
1035 /*out*/ ObjPtr<mirror::Class>* result)
1036 REQUIRES_SHARED(Locks::mutator_lock_)
1037 REQUIRES(!Locks::dex_lock_);
1038
Calin Juravle415dc3d2017-06-28 11:03:12 -07001039 // Finds the class in the classpath of the given class loader. It only searches the class loader
1040 // dex files and does not recurse into its parent.
1041 // The method checks that the provided class loader is either a PathClassLoader or a
1042 // DexClassLoader.
Nicolas Geoffraye8445e52021-09-23 14:10:05 +01001043 // If the class is found the method updates `result`.
1044 // The method always returns true, to notify to the caller a
1045 // BaseDexClassLoader has a known lookup.
1046 bool FindClassInBaseDexClassLoaderClassPath(
Calin Juravle415dc3d2017-06-28 11:03:12 -07001047 ScopedObjectAccessAlreadyRunnable& soa,
1048 const char* descriptor,
1049 size_t hash,
Nicolas Geoffraye8445e52021-09-23 14:10:05 +01001050 Handle<mirror::ClassLoader> class_loader,
1051 /*out*/ ObjPtr<mirror::Class>* result)
Calin Juravle415dc3d2017-06-28 11:03:12 -07001052 REQUIRES_SHARED(Locks::mutator_lock_)
1053 REQUIRES(!Locks::dex_lock_);
1054
1055 // Finds the class in the boot class loader.
Nicolas Geoffraye8445e52021-09-23 14:10:05 +01001056 // If the class is found the method updates `result`.
1057 // The method always returns true, to notify to the caller the
1058 // boot class loader has a known lookup.
1059 bool FindClassInBootClassLoaderClassPath(Thread* self,
1060 const char* descriptor,
1061 size_t hash,
1062 /*out*/ ObjPtr<mirror::Class>* result)
Calin Juravle415dc3d2017-06-28 11:03:12 -07001063 REQUIRES_SHARED(Locks::mutator_lock_)
1064 REQUIRES(!Locks::dex_lock_);
1065
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001066 // Implementation of LookupResolvedType() called when the type was not found in the dex cache.
1067 ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
Vladimir Marko09c5ca42018-05-31 15:15:31 +01001068 ObjPtr<mirror::Class> referrer)
1069 REQUIRES_SHARED(Locks::mutator_lock_);
1070 ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001071 ObjPtr<mirror::DexCache> dex_cache,
1072 ObjPtr<mirror::ClassLoader> class_loader)
1073 REQUIRES_SHARED(Locks::mutator_lock_);
1074
Vladimir Marko18090d12018-06-01 16:53:12 +01001075 // Implementation of ResolveString() called when the string was not found in the dex cache.
1076 ObjPtr<mirror::String> DoResolveString(dex::StringIndex string_idx,
1077 ObjPtr<mirror::DexCache> dex_cache)
1078 REQUIRES_SHARED(Locks::mutator_lock_);
1079 ObjPtr<mirror::String> DoResolveString(dex::StringIndex string_idx,
1080 Handle<mirror::DexCache> dex_cache)
1081 REQUIRES_SHARED(Locks::mutator_lock_);
1082
1083 // Implementation of LookupString() called when the string was not found in the dex cache.
1084 ObjPtr<mirror::String> DoLookupString(dex::StringIndex string_idx,
1085 ObjPtr<mirror::DexCache> dex_cache)
1086 REQUIRES_SHARED(Locks::mutator_lock_);
1087
Andreas Gampeb0625e02019-05-01 12:43:31 -07001088 // Implementation of ResolveType() called when the type was not found in the dex cache. May be
1089 // used with ArtField*, ArtMethod* or ObjPtr<Class>.
1090 template <typename RefType>
1091 ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx, RefType referrer)
Vladimir Marko09c5ca42018-05-31 15:15:31 +01001092 REQUIRES_SHARED(Locks::mutator_lock_)
1093 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1094 ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx,
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001095 Handle<mirror::DexCache> dex_cache,
1096 Handle<mirror::ClassLoader> class_loader)
1097 REQUIRES_SHARED(Locks::mutator_lock_)
1098 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1099
Andreas Gampe34ee6842014-12-02 15:43:52 -08001100 // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
1101 // by the given 'class_loader'. Uses the provided hash for the descriptor.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +01001102 ObjPtr<mirror::Class> LookupClass(Thread* self,
1103 const char* descriptor,
1104 size_t hash,
1105 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampe34ee6842014-12-02 15:43:52 -08001106 REQUIRES(!Locks::classlinker_classes_lock_)
1107 REQUIRES_SHARED(Locks::mutator_lock_);
1108
Vladimir Markof44d36c2017-03-14 14:18:46 +00001109 // Find a field by its field index.
1110 ArtField* LookupResolvedField(uint32_t field_idx,
1111 ObjPtr<mirror::DexCache> dex_cache,
1112 ObjPtr<mirror::ClassLoader> class_loader,
1113 bool is_static)
1114 REQUIRES_SHARED(Locks::mutator_lock_);
1115
Vladimir Markocd556b02017-02-03 11:47:34 +00001116 void RegisterDexFileLocked(const DexFile& dex_file,
1117 ObjPtr<mirror::DexCache> dex_cache,
1118 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001119 REQUIRES(Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001120 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Light725da8f2020-02-19 14:46:33 -08001121 const DexCacheData* FindDexCacheDataLocked(const DexFile& dex_file)
David Srbecky6fbcc292021-02-23 01:05:32 +00001122 REQUIRES_SHARED(Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001123 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Light725da8f2020-02-19 14:46:33 -08001124 static ObjPtr<mirror::DexCache> DecodeDexCacheLocked(Thread* self, const DexCacheData* data)
1125 REQUIRES_SHARED(Locks::dex_lock_, Locks::mutator_lock_);
1126 bool IsSameClassLoader(ObjPtr<mirror::DexCache> dex_cache,
1127 const DexCacheData* data,
1128 ObjPtr<mirror::ClassLoader> class_loader)
1129 REQUIRES_SHARED(Locks::dex_lock_, Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -07001130
Alex Lighteb7c1442015-08-31 13:17:42 -07001131 bool InitializeDefaultInterfaceRecursive(Thread* self,
1132 Handle<mirror::Class> klass,
1133 bool can_run_clinit,
1134 bool can_init_parents)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001135 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001136 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001137 bool WaitForInitializeClass(Handle<mirror::Class> klass,
1138 Thread* self,
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001139 ObjectLock<mirror::Class>& lock);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001140
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001141 bool IsSameDescriptorInDifferentClassContexts(Thread* self,
1142 const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001143 Handle<mirror::ClassLoader> class_loader1,
1144 Handle<mirror::ClassLoader> class_loader2)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001145 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001146
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001147 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self,
1148 ArtMethod* method,
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001149 ObjPtr<mirror::Class> klass1,
1150 ObjPtr<mirror::Class> klass2)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001151 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001152
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001153 bool LinkSuperClass(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001154 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001155
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001156 bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001157 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001158 REQUIRES(!Locks::dex_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001159
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001160 bool LinkMethods(Thread* self,
1161 Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -07001162 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001163 bool* out_new_conflict,
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001164 ArtMethod** out_imt)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001165 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001166
Vladimir Marko5aead702019-03-27 11:00:36 +00001167 ObjPtr<mirror::MethodHandle> ResolveMethodHandleForField(
1168 Thread* self,
1169 const dex::MethodHandleItem& method_handle,
1170 ArtMethod* referrer) REQUIRES_SHARED(Locks::mutator_lock_);
Orion Hodsonf8db2c32017-07-07 20:07:12 +01001171
Vladimir Marko5aead702019-03-27 11:00:36 +00001172 ObjPtr<mirror::MethodHandle> ResolveMethodHandleForMethod(
1173 Thread* self,
1174 const dex::MethodHandleItem& method_handle,
1175 ArtMethod* referrer) REQUIRES_SHARED(Locks::mutator_lock_);
Orion Hodsonf8db2c32017-07-07 20:07:12 +01001176
Alex Lighteb7c1442015-08-31 13:17:42 -07001177 // Links the virtual methods for the given class and records any default methods that will need to
1178 // be updated later.
1179 //
1180 // Arguments:
1181 // * self - The current thread.
1182 // * klass - class, whose vtable will be filled in.
1183 // * default_translations - Vtable index to new method map.
1184 // Any vtable entries that need to be updated with new default methods
1185 // are stored into the default_translations map. The default_translations
1186 // map is keyed on the vtable index that needs to be updated. We use this
1187 // map because if we override a default method with another default
1188 // method we need to update the vtable to point to the new method.
1189 // Unfortunately since we copy the ArtMethod* we cannot just do a simple
1190 // scan, we therefore store the vtable index's that might need to be
1191 // updated with the method they will turn into.
1192 // TODO This whole default_translations thing is very dirty. There should be a better way.
Alex Light9139e002015-10-09 15:59:48 -07001193 bool LinkVirtualMethods(
1194 Thread* self,
1195 Handle<mirror::Class> klass,
Vladimir Marko782fb712020-12-23 12:47:31 +00001196 /*out*/HashMap<size_t, MethodTranslation>* default_translations)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001197 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001198
Alex Lighteb7c1442015-08-31 13:17:42 -07001199 // Sets up the interface lookup table (IFTable) in the correct order to allow searching for
1200 // default methods.
1201 bool SetupInterfaceLookupTable(Thread* self,
1202 Handle<mirror::Class> klass,
1203 Handle<mirror::ObjectArray<mirror::Class>> interfaces)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001204 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighteb7c1442015-08-31 13:17:42 -07001205
Alex Light9139e002015-10-09 15:59:48 -07001206
1207 enum class DefaultMethodSearchResult {
1208 kDefaultFound,
1209 kAbstractFound,
1210 kDefaultConflict
1211 };
1212
Alex Lighteb7c1442015-08-31 13:17:42 -07001213 // Find the default method implementation for 'interface_method' in 'klass', if one exists.
1214 //
1215 // Arguments:
1216 // * self - The current thread.
1217 // * target_method - The method we are trying to find a default implementation for.
1218 // * klass - The class we are searching for a definition of target_method.
1219 // * out_default_method - The pointer we will store the found default method to on success.
Alex Lighteb7c1442015-08-31 13:17:42 -07001220 //
1221 // Return value:
Alex Light9139e002015-10-09 15:59:48 -07001222 // * kDefaultFound - There were no conflicting method implementations found in the class while
1223 // searching for target_method. The default method implementation is stored into
1224 // out_default_method.
1225 // * kAbstractFound - There were no conflicting method implementations found in the class while
1226 // searching for target_method but no default implementation was found either.
1227 // out_default_method is set to null and the method should be considered not
1228 // implemented.
1229 // * kDefaultConflict - Conflicting method implementations were found when searching for
1230 // target_method. The value of *out_default_method is null.
1231 DefaultMethodSearchResult FindDefaultMethodImplementation(
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001232 Thread* self,
1233 ArtMethod* target_method,
1234 Handle<mirror::Class> klass,
1235 /*out*/ArtMethod** out_default_method) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001236 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighteb7c1442015-08-31 13:17:42 -07001237
1238 // Sets the imt entries and fixes up the vtable for the given class by linking all the interface
1239 // methods. See LinkVirtualMethods for an explanation of what default_translations is.
Alex Light9139e002015-10-09 15:59:48 -07001240 bool LinkInterfaceMethods(
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001241 Thread* self,
1242 Handle<mirror::Class> klass,
Vladimir Marko782fb712020-12-23 12:47:31 +00001243 const HashMap<size_t, MethodTranslation>& default_translations,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001244 bool* out_new_conflict,
1245 ArtMethod** out_imt)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001246 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001247
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001248 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001249 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001250 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001251 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001252 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001253 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001254
Mathieu Chartiere401d142015-04-22 13:56:20 -07001255 void CheckProxyConstructor(ArtMethod* constructor) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001256 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001257 void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001258 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001259
Andreas Gampecc1b5352016-12-01 16:58:38 -08001260 size_t GetDexCacheCount() REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -07001261 return dex_caches_.size();
1262 }
David Srbecky6fbcc292021-02-23 01:05:32 +00001263 const std::unordered_map<const DexFile*, DexCacheData>& GetDexCachesData()
Andreas Gampecc1b5352016-12-01 16:58:38 -08001264 REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
Mathieu Chartier673ed3d2015-08-28 14:56:43 -07001265 return dex_caches_;
1266 }
Brian Carlstrom58ae9412011-10-04 00:56:06 -07001267
Mathieu Chartiere401d142015-04-22 13:56:20 -07001268 void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001269 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001270 void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001271 REQUIRES_SHARED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -04001272
Mathieu Chartier5b830502016-03-02 10:30:23 -08001273 // Register a class loader and create its class table and allocator. Should not be called if
1274 // these are already created.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001275 void RegisterClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001276 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier5b830502016-03-02 10:30:23 -08001277 REQUIRES(Locks::classlinker_classes_lock_);
1278
Nicolas Geoffray3a090922015-11-24 09:17:30 +00001279 // Insert a new class table if not found.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001280 ClassTable* InsertClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001281 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001282 REQUIRES(Locks::classlinker_classes_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001283
Ian Rogersdbf3be02014-08-29 15:40:08 -07001284 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
1285 // before returning it to the caller. Its the responsibility of the thread that placed the class
1286 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
1287 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
1288 // retire a class, the version of the class in the table is returned and this may differ from
1289 // the class passed in.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +01001290 ObjPtr<mirror::Class> EnsureResolved(Thread* self,
1291 const char* descriptor,
1292 ObjPtr<mirror::Class> klass)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001293 WARN_UNUSED
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001294 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001295 REQUIRES(!Locks::dex_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -07001296
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001297 void FixupTemporaryDeclaringClass(ObjPtr<mirror::Class> temp_class,
1298 ObjPtr<mirror::Class> new_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001299 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -07001300
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001301 void SetClassRoot(ClassRoot class_root, ObjPtr<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001302 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001303
1304 // Return the quick generic JNI stub for testing.
1305 const void* GetRuntimeQuickGenericJniStub() const;
1306
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001307 bool CanWeInitializeClass(ObjPtr<mirror::Class> klass,
1308 bool can_init_statics,
1309 bool can_init_parents)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001310 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001311
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001312 void UpdateClassMethods(ObjPtr<mirror::Class> klass,
Alex Lighte64300b2015-12-15 15:02:47 -08001313 LengthPrefixedArray<ArtMethod>* new_methods)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001314 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier54d220e2015-07-30 16:20:06 -07001315 REQUIRES(!Locks::classlinker_classes_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001316
Andreas Gampe7ba5a672016-02-04 21:45:01 -08001317 // Check that c1 == FindSystemClass(self, descriptor). Abort with class dumps otherwise.
1318 void CheckSystemClass(Thread* self, Handle<mirror::Class> c1, const char* descriptor)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001319 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001320 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe7ba5a672016-02-04 21:45:01 -08001321
Vladimir Marko921094a2017-01-12 18:37:06 +00001322 // Allocate method arrays for interfaces.
1323 bool AllocateIfTableMethodArrays(Thread* self,
1324 Handle<mirror::Class> klass,
1325 Handle<mirror::IfTable> iftable)
1326 REQUIRES_SHARED(Locks::mutator_lock_);
1327
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001328 // Sets imt_ref appropriately for LinkInterfaceMethods.
1329 // If there is no method in the imt location of imt_ref it will store the given method there.
1330 // Otherwise it will set the conflict method which will figure out which method to use during
1331 // runtime.
1332 void SetIMTRef(ArtMethod* unimplemented_method,
1333 ArtMethod* imt_conflict_method,
1334 ArtMethod* current_method,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001335 /*out*/bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001336 /*out*/ArtMethod** imt_ref) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001337
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001338 void FillIMTFromIfTable(ObjPtr<mirror::IfTable> if_table,
Mathieu Chartiere42888f2016-04-14 10:49:19 -07001339 ArtMethod* unimplemented_method,
1340 ArtMethod* imt_conflict_method,
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001341 ObjPtr<mirror::Class> klass,
Mathieu Chartiere42888f2016-04-14 10:49:19 -07001342 bool create_conflict_tables,
1343 bool ignore_copied_methods,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001344 /*out*/bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001345 /*out*/ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001346
1347 void FillImtFromSuperClass(Handle<mirror::Class> klass,
1348 ArtMethod* unimplemented_method,
1349 ArtMethod* imt_conflict_method,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001350 bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001351 ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001352
Vladimir Markoba118822017-06-12 15:41:56 +01001353 // Check invoke type against the referenced class. Throws IncompatibleClassChangeError
1354 // (if `kThrowOnError`) and returns true on mismatch (kInterface on a non-interface class,
1355 // kVirtual on interface, kDefault on interface for dex files not supporting default methods),
1356 // otherwise returns false.
1357 template <bool kThrowOnError, typename ClassGetter>
1358 static bool CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_cache,
1359 InvokeType type,
1360 ClassGetter class_getter)
1361 REQUIRES_SHARED(Locks::mutator_lock_);
1362 // Helper that feeds the above function with `ClassGetter` doing `LookupResolvedType()`.
1363 template <bool kThrow>
1364 bool CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_cache,
1365 InvokeType type,
1366 uint32_t method_idx,
1367 ObjPtr<mirror::ClassLoader> class_loader)
1368 REQUIRES_SHARED(Locks::mutator_lock_);
1369
Vladimir Marko02610552018-06-04 14:38:00 +01001370 ObjPtr<mirror::IfTable> GetArrayIfTable() REQUIRES_SHARED(Locks::mutator_lock_);
1371
Brian Carlstrom4a96b602011-07-26 16:40:23 -07001372 std::vector<const DexFile*> boot_class_path_;
Mathieu Chartierfbc31082016-01-24 11:59:56 -08001373 std::vector<std::unique_ptr<const DexFile>> boot_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07001374
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -08001375 // JNI weak globals and side data to allow dex caches to get unloaded. We lazily delete weak
1376 // globals when we register new dex files.
David Srbecky6fbcc292021-02-23 01:05:32 +00001377 std::unordered_map<const DexFile*, DexCacheData> dex_caches_ GUARDED_BY(Locks::dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -07001378
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -07001379 // This contains the class loaders which have class tables. It is populated by
Mathieu Chartier951ec2c2015-09-22 08:50:05 -07001380 // InsertClassTableForClassLoader.
1381 std::list<ClassLoaderData> class_loaders_
Mathieu Chartier6b069532015-08-05 15:08:12 -07001382 GUARDED_BY(Locks::classlinker_classes_lock_);
1383
1384 // Boot class path table. Since the class loader for this is null.
Andreas Gampe2af99022017-04-25 08:32:59 -07001385 std::unique_ptr<ClassTable> boot_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001386
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001387 // New class roots, only used by CMS since the GC needs to mark these in the pause.
1388 std::vector<GcRoot<mirror::Class>> new_class_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -07001389
Vladimir Marko1998cd02017-01-13 13:02:58 +00001390 // Boot image oat files with new .bss GC roots to be visited in the pause by CMS.
1391 std::vector<const OatFile*> new_bss_roots_boot_oat_files_
1392 GUARDED_BY(Locks::classlinker_classes_lock_);
1393
Ian Rogers7dfb28c2013-08-22 08:18:36 -07001394 // Number of times we've searched dex caches for a class. After a certain number of misses we move
1395 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -07001396 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -07001397
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001398 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001399 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -07001400
Vladimir Marko43354742021-02-03 15:37:01 +00001401 // Method hashes for virtual methods from java.lang.Object used
1402 // to avoid recalculating them for each class we link.
1403 uint32_t object_virtual_method_hashes_[mirror::Object::kVTableLength];
1404
Ian Rogers98379392014-02-24 16:53:16 -08001405 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
1406 // descriptors for the sake of performing FindClass.
1407 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001408 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -08001409 size_t find_array_class_cache_next_victim_;
1410
Brian Carlstrom75cb3b42011-07-28 02:13:36 -07001411 bool init_done_;
Vladimir Marko1998cd02017-01-13 13:02:58 +00001412 bool log_new_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -07001413
Elliott Hughescf4c6c42011-09-01 15:16:42 -07001414 InternTable* intern_table_;
1415
Andreas Gampe87658f32019-04-18 18:39:02 +00001416 const bool fast_class_not_found_exceptions_;
1417
Mingyao Yang98d1cc82014-05-15 17:02:16 -07001418 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
1419 // patch point within the image. TODO: make these proper relocations.
Vladimir Marko7dac8642019-11-06 17:09:30 +00001420 const void* jni_dlsym_lookup_trampoline_;
Vladimir Markofa458ac2020-02-12 14:08:07 +00001421 const void* jni_dlsym_lookup_critical_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -07001422 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -07001423 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -08001424 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +01001425 const void* quick_to_interpreter_bridge_trampoline_;
Nicolas Geoffrayc39af942021-01-25 08:43:57 +00001426 const void* nterp_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -07001427
Mathieu Chartier2d721012014-11-10 11:08:06 -08001428 // Image pointer size.
Andreas Gampe542451c2016-07-26 09:02:02 -07001429 PointerSize image_pointer_size_;
Mathieu Chartier2d721012014-11-10 11:08:06 -08001430
Vladimir Markobf121912019-06-04 13:49:05 +01001431 // Classes to transition from ClassStatus::kInitialized to ClassStatus::kVisiblyInitialized.
1432 Mutex visibly_initialized_callback_lock_;
1433 std::unique_ptr<VisiblyInitializedCallback> visibly_initialized_callback_
1434 GUARDED_BY(visibly_initialized_callback_lock_);
1435 IntrusiveForwardList<VisiblyInitializedCallback> running_visibly_initialized_callbacks_
1436 GUARDED_BY(visibly_initialized_callback_lock_);
1437
Vladimir Marko86c87522020-05-11 16:55:55 +01001438 // Registered native code for @CriticalNative methods of classes that are not visibly
1439 // initialized. These code pointers cannot be stored in ArtMethod as that would risk
1440 // skipping the class initialization check for direct calls from compiled code.
1441 Mutex critical_native_code_with_clinit_check_lock_;
1442 std::map<ArtMethod*, void*> critical_native_code_with_clinit_check_
1443 GUARDED_BY(critical_native_code_with_clinit_check_lock_);
1444
Andreas Gampec1ac9ee2017-07-24 22:35:49 -07001445 std::unique_ptr<ClassHierarchyAnalysis> cha_;
1446
Mathieu Chartier65975772016-08-05 10:46:36 -07001447 class FindVirtualMethodHolderVisitor;
Andreas Gampe2af99022017-04-25 08:32:59 -07001448
Mathieu Chartier74ccee62018-10-10 10:30:29 -07001449 friend class AppImageLoadingHelper;
Mathieu Chartierf9c6fc62015-10-07 11:44:05 -07001450 friend class ImageDumper; // for DexLock
Vladimir Marko74527972016-11-29 15:57:32 +00001451 friend struct linker::CompilationHelper; // For Compile in ImageTest.
1452 friend class linker::ImageWriter; // for GetClassRoots
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001453 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Andreas Gampe5f4a09a2015-09-28 13:16:33 -07001454 friend class JniInternalTest; // for GetRuntimeQuickGenericJniStub
Andreas Gampe2af99022017-04-25 08:32:59 -07001455 friend class VMClassLoader; // for LookupClass and FindClassInBaseDexClassLoader.
Mathieu Chartier76172162016-01-26 14:54:06 -08001456 ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName); // for DexLock, and RegisterDexFileLocked
Narayan Kamath25352fc2016-08-03 12:46:58 +01001457 ART_FRIEND_TEST(mirror::DexCacheMethodHandlesTest, Open); // for AllocDexCache
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001458 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001459 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
1460};
1461
Andreas Gampe0f01b582017-01-18 15:22:37 -08001462class ClassLoadCallback {
1463 public:
1464 virtual ~ClassLoadCallback() {}
1465
Alex Light270db1c2019-12-03 12:20:01 +00001466 // Called immediately before beginning class-definition and immediately before returning from it.
1467 virtual void BeginDefineClass() REQUIRES_SHARED(Locks::mutator_lock_) {}
1468 virtual void EndDefineClass() REQUIRES_SHARED(Locks::mutator_lock_) {}
1469
Alex Lightb0f11922017-01-23 14:25:17 -08001470 // If set we will replace initial_class_def & initial_dex_file with the final versions. The
1471 // callback author is responsible for ensuring these are allocated in such a way they can be
1472 // cleaned up if another transformation occurs. Note that both must be set or null/unchanged on
1473 // return.
1474 // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1475 // different object. It is the listener's responsibility to handle this.
1476 // Note: This callback is rarely useful so a default implementation has been given that does
1477 // nothing.
1478 virtual void ClassPreDefine(const char* descriptor ATTRIBUTE_UNUSED,
1479 Handle<mirror::Class> klass ATTRIBUTE_UNUSED,
1480 Handle<mirror::ClassLoader> class_loader ATTRIBUTE_UNUSED,
1481 const DexFile& initial_dex_file ATTRIBUTE_UNUSED,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -08001482 const dex::ClassDef& initial_class_def ATTRIBUTE_UNUSED,
Alex Lightb0f11922017-01-23 14:25:17 -08001483 /*out*/DexFile const** final_dex_file ATTRIBUTE_UNUSED,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -08001484 /*out*/dex::ClassDef const** final_class_def ATTRIBUTE_UNUSED)
Alex Lightb0f11922017-01-23 14:25:17 -08001485 REQUIRES_SHARED(Locks::mutator_lock_) {}
1486
Andreas Gampe0f01b582017-01-18 15:22:37 -08001487 // A class has been loaded.
1488 // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1489 // different object. It is the listener's responsibility to handle this.
1490 virtual void ClassLoad(Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1491
1492 // A class has been prepared, i.e., resolved. As the ClassLoad event might have been for a
1493 // temporary class, provide both the former and the current class.
1494 virtual void ClassPrepare(Handle<mirror::Class> temp_klass,
1495 Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1496};
1497
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001498} // namespace art
1499
Brian Carlstromfc0e3212013-07-17 14:40:12 -07001500#endif // ART_RUNTIME_CLASS_LINKER_H_