blob: 547753a6d628027ba546c75d9647b2400f2fb36e [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>
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070025#include <utility>
26#include <vector>
27
Andreas Gampe542451c2016-07-26 09:02:02 -070028#include "base/enums.h"
Vladimir Marko782fb712020-12-23 12:47:31 +000029#include "base/hash_map.h"
Vladimir Markobf121912019-06-04 13:49:05 +010030#include "base/mutex.h"
31#include "base/intrusive_forward_list.h"
Andreas Gampe7fbc4a52018-11-28 08:26:47 -080032#include "base/locks.h"
Elliott Hughes76160052012-12-12 16:31:20 -080033#include "base/macros.h"
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -070034#include "dex/class_accessor.h"
David Sehr9e734c72018-01-04 17:56:19 -080035#include "dex/dex_file_types.h"
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -070036#include "gc_root.h"
Andreas Gampe0f01b582017-01-18 15:22:37 -080037#include "handle.h"
Mathieu Chartier590fee92013-09-13 13:46:47 -070038#include "jni.h"
Vladimir Marko97d7e1c2016-10-04 14:44:28 +010039#include "mirror/class.h"
Vladimir Marko43354742021-02-03 15:37:01 +000040#include "mirror/object.h"
Andreas Gampe6d7abbd2017-04-24 13:19:09 -070041#include "verifier/verifier_enums.h"
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070042
43namespace art {
Mingyao Yang98d1cc82014-05-15 17:02:16 -070044
Vladimir Marko86c87522020-05-11 16:55:55 +010045class ArtField;
46class ArtMethod;
47class ClassHierarchyAnalysis;
48enum class ClassRoot : uint32_t;
49class ClassTable;
50class DexFile;
51template<class T> class Handle;
52class ImtConflictTable;
53template<typename T> class LengthPrefixedArray;
54template<class T> class MutableHandle;
55class InternTable;
56class LinearAlloc;
57class OatFile;
58template<class T> class ObjectLock;
59class Runtime;
60class ScopedObjectAccessAlreadyRunnable;
Calin Juravle33787682019-07-26 14:27:18 -070061class SdkChecker;
Vladimir Marko86c87522020-05-11 16:55:55 +010062template<size_t kNumReferences> class PACKED(4) StackHandleScope;
63class Thread;
64
65enum VisitRootFlags : uint8_t;
66
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080067namespace dex {
68struct ClassDef;
Andreas Gampe62629592019-01-03 16:08:31 -080069struct MethodHandleItem;
Andreas Gampe3f1dcd32018-12-28 09:39:56 -080070} // namespace dex
71
Ian Rogers1d54e732013-05-02 21:10:01 -070072namespace gc {
73namespace space {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080074class ImageSpace;
Ian Rogers1d54e732013-05-02 21:10:01 -070075} // namespace space
76} // namespace gc
Vladimir Marko74527972016-11-29 15:57:32 +000077
78namespace linker {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080079struct CompilationHelper;
80class ImageWriter;
81class OatWriter;
Vladimir Marko74527972016-11-29 15:57:32 +000082} // namespace linker
83
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080084namespace mirror {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080085class ClassLoader;
86class DexCache;
87class DexCachePointerArray;
88class DexCacheMethodHandlesTest_Open_Test;
89class DexCacheTest_Open_Test;
90class IfTable;
91class MethodHandle;
92class MethodHandlesLookup;
93class MethodType;
94template<class T> class ObjectArray;
95class StackTraceElement;
Orion Hodsonb9b7d912021-02-24 09:24:47 +000096template <typename T> struct NativeDexCachePair;
97using MethodDexCachePair = NativeDexCachePair<ArtMethod>;
98using MethodDexCacheType = std::atomic<MethodDexCachePair>;
Ian Rogers33e95662013-05-20 20:29:14 -070099} // namespace mirror
Ian Rogers1d54e732013-05-02 21:10:01 -0700100
Nicolas Geoffray5b0b2e12021-03-19 14:48:40 +0000101namespace verifier {
102class VerifierDeps;
103}
104
Mathieu Chartier1aa8ec22016-02-01 10:34:47 -0800105class ClassVisitor {
106 public:
107 virtual ~ClassVisitor() {}
108 // Return true to continue visiting.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700109 virtual bool operator()(ObjPtr<mirror::Class> klass) = 0;
Mathieu Chartier1aa8ec22016-02-01 10:34:47 -0800110};
111
Alex Light3f0dca12020-01-27 17:20:28 -0800112template <typename Func>
113class ClassFuncVisitor final : public ClassVisitor {
114 public:
115 explicit ClassFuncVisitor(Func func) : func_(func) {}
116 bool operator()(ObjPtr<mirror::Class> klass) override REQUIRES_SHARED(Locks::mutator_lock_) {
117 return func_(klass);
118 }
119
120 private:
121 Func func_;
122};
123
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -0700124class ClassLoaderVisitor {
125 public:
126 virtual ~ClassLoaderVisitor() {}
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700127 virtual void Visit(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700128 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -0700129};
130
Alex Lightabd8f052019-12-06 10:49:17 -0800131template <typename Func>
132class ClassLoaderFuncVisitor final : public ClassLoaderVisitor {
133 public:
134 explicit ClassLoaderFuncVisitor(Func func) : func_(func) {}
135 void Visit(ObjPtr<mirror::ClassLoader> cl) override REQUIRES_SHARED(Locks::mutator_lock_) {
136 func_(cl);
137 }
138
139 private:
140 Func func_;
141};
142
Alexey Grebenkin252a4e42018-04-02 18:18:01 +0300143class AllocatorVisitor {
144 public:
145 virtual ~AllocatorVisitor() {}
146 // Return true to continue visiting.
147 virtual bool Visit(LinearAlloc* alloc)
148 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
149};
150
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700151class ClassLinker {
152 public:
Chris Wailes55c880e2018-10-24 13:10:35 -0700153 static constexpr bool kAppImageMayContainStrings = true;
Mathieu Chartier0933cc52018-03-23 14:25:08 -0700154
Andreas Gampe87658f32019-04-18 18:39:02 +0000155 explicit ClassLinker(InternTable* intern_table,
156 bool fast_class_not_found_exceptions = true);
Chang Xing605fe242017-07-20 15:57:21 -0700157 virtual ~ClassLinker();
Carl Shapiro565f5072011-07-10 13:39:43 -0700158
Alex Light64ad14d2014-08-19 14:23:13 -0700159 // Initialize class linker by bootstraping from dex files.
Andreas Gampe3db9c5d2015-11-17 11:52:46 -0800160 bool InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path,
161 std::string* error_msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700162 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800163 REQUIRES(!Locks::dex_lock_);
Mathieu Chartier590fee92013-09-13 13:46:47 -0700164
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800165 // Initialize class linker from one or more boot images.
166 bool InitFromBootImage(std::string* error_msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700167 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800168 REQUIRES(!Locks::dex_lock_);
Mathieu Chartier590fee92013-09-13 13:46:47 -0700169
Vladimir Marko0ace5632018-12-14 11:11:47 +0000170 // Add boot class path dex files that were not included in the boot image.
171 // ClassLinker takes ownership of these dex files.
172 void AddExtraBootDexFiles(Thread* self,
173 std::vector<std::unique_ptr<const DexFile>>&& additional_dex_files)
174 REQUIRES_SHARED(Locks::mutator_lock_);
175
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800176 // Add an image space to the class linker, may fix up classloader fields and dex cache fields.
177 // The dex files that were newly opened for the space are placed in the out argument
178 // out_dex_files. Returns true if the operation succeeded.
179 // The space must be already added to the heap before calling AddImageSpace since we need to
180 // properly handle read barriers and object marking.
181 bool AddImageSpace(gc::space::ImageSpace* space,
182 Handle<mirror::ClassLoader> class_loader,
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800183 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
184 std::string* error_msg)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800185 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700186 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800187
Mathieu Chartier0b4cbd02016-03-08 16:49:58 -0800188 bool OpenImageDexFiles(gc::space::ImageSpace* space,
189 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
190 std::string* error_msg)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800191 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700192 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier0b4cbd02016-03-08 16:49:58 -0800193
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700194 // Finds a class by its descriptor, loading it if necessary.
Brian Carlstrom74eb46a2011-08-02 20:10:14 -0700195 // If class_loader is null, searches boot_class_path_.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100196 ObjPtr<mirror::Class> FindClass(Thread* self,
197 const char* descriptor,
198 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700199 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800200 REQUIRES(!Locks::dex_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700201
Ian Rogers98379392014-02-24 16:53:16 -0800202 // Finds a class by its descriptor using the "system" class loader, ie by searching the
203 // boot_class_path_.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100204 ObjPtr<mirror::Class> FindSystemClass(Thread* self, const char* descriptor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700205 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800206 REQUIRES(!Locks::dex_lock_) {
207 return FindClass(self, descriptor, ScopedNullHandle<mirror::ClassLoader>());
208 }
Ian Rogers98379392014-02-24 16:53:16 -0800209
210 // Finds the array class given for the element class.
Vladimir Markobcf17522018-06-01 13:14:32 +0100211 ObjPtr<mirror::Class> FindArrayClass(Thread* self, ObjPtr<mirror::Class> element_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700212 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800213 REQUIRES(!Locks::dex_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700214
Ian Rogers63557452014-06-04 16:57:15 -0700215 // Returns true if the class linker is initialized.
Ian Rogers7b078e82014-09-10 14:44:24 -0700216 bool IsInitialized() const {
217 return init_done_;
218 }
Mathieu Chartier590fee92013-09-13 13:46:47 -0700219
Brian Carlstromaded5f72011-10-07 17:15:04 -0700220 // Define a new a class based on a ClassDef from a DexFile
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100221 ObjPtr<mirror::Class> DefineClass(Thread* self,
222 const char* descriptor,
223 size_t hash,
224 Handle<mirror::ClassLoader> class_loader,
225 const DexFile& dex_file,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800226 const dex::ClassDef& dex_class_def)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700227 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800228 REQUIRES(!Locks::dex_lock_);
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700229
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700230 // Finds a class by its descriptor, returning null if it isn't wasn't loaded
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700231 // by the given 'class_loader'.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100232 ObjPtr<mirror::Class> LookupClass(Thread* self,
233 const char* descriptor,
234 ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier90443472015-07-16 20:32:27 -0700235 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampe2ff3b972017-06-05 18:14:53 -0700236 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700237
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800238 // Finds all the classes with the given descriptor, regardless of ClassLoader.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700239 void LookupClasses(const char* descriptor, std::vector<ObjPtr<mirror::Class>>& classes)
Mathieu Chartier90443472015-07-16 20:32:27 -0700240 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700241 REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800242
Vladimir Marko9186b182018-11-06 14:55:54 +0000243 ObjPtr<mirror::Class> LookupPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100244 ObjPtr<mirror::Class> FindPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -0700245
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700246 void DumpForSigQuit(std::ostream& os) REQUIRES(!Locks::classlinker_classes_lock_);
Elliott Hughescac6cc72011-11-03 20:31:21 -0700247
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700248 size_t NumLoadedClasses()
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700249 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700250 REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughese27955c2011-08-26 15:21:24 -0700251
Vladimir Marko18090d12018-06-01 16:53:12 +0100252 // Resolve a String with the given index from the DexFile associated with the given `referrer`,
253 // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
254 // to use for resolution.
255 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
256 ArtField* referrer)
257 REQUIRES_SHARED(Locks::mutator_lock_);
258 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
259 ArtMethod* referrer)
260 REQUIRES_SHARED(Locks::mutator_lock_);
261
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000262 // Resolve a String with the given index from the DexFile associated with the given DexCache,
263 // storing the result in the DexCache.
264 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000265 Handle<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700266 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700267
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000268 // Find a String with the given index from the DexFile associated with the given DexCache,
269 // storing the result in the DexCache if found. Return null if not found.
270 ObjPtr<mirror::String> LookupString(dex::StringIndex string_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000271 ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700272 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocac5a7e2016-02-22 10:39:50 +0000273
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000274 // Resolve a Type with the given index from the DexFile associated with the given `referrer`,
275 // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
276 // and ClassLoader to use for resolution.
277 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ObjPtr<mirror::Class> referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700278 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800279 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100280 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtField* referrer)
281 REQUIRES_SHARED(Locks::mutator_lock_)
282 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko28e012a2017-12-07 11:22:59 +0000283 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700284 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800285 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700286
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000287 // Resolve a type with the given index from the DexFile associated with the given DexCache
288 // and ClassLoader, storing the result in DexCache. The ClassLoader is used to search for
289 // the type, since it may be referenced from but not contained within the DexFile.
290 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000291 Handle<mirror::DexCache> dex_cache,
292 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700293 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800294 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700295
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000296 // Look up a resolved type with the given index from the DexFile associated with the given
297 // `referrer`, storing the result in the DexCache. The `referrer` is used to identify the
298 // target DexCache and ClassLoader to use for lookup.
299 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
300 ObjPtr<mirror::Class> referrer)
301 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100302 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtField* referrer)
303 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000304 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtMethod* referrer)
305 REQUIRES_SHARED(Locks::mutator_lock_);
306
307 // Look up a resolved type with the given index from the DexFile associated with the given
308 // DexCache and ClassLoader. The ClassLoader is used to search for the type, since it may
309 // be referenced from but not contained within the DexFile.
310 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
311 ObjPtr<mirror::DexCache> dex_cache,
312 ObjPtr<mirror::ClassLoader> class_loader)
313 REQUIRES_SHARED(Locks::mutator_lock_);
314
Vladimir Markoc63d9672021-03-31 15:50:39 +0100315 // Look up a resolved type with the given descriptor associated with the given ClassLoader.
316 ObjPtr<mirror::Class> LookupResolvedType(const char* descriptor,
317 ObjPtr<mirror::ClassLoader> class_loader)
318 REQUIRES_SHARED(Locks::mutator_lock_);
319
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800320 // Determine whether a dex cache result should be trusted, or an IncompatibleClassChangeError
Vladimir Markoba118822017-06-12 15:41:56 +0100321 // check and IllegalAccessError check should be performed even after a hit.
322 enum class ResolveMode { // private.
323 kNoChecks,
324 kCheckICCEAndIAE
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800325 };
326
Vladimir Marko07bfbac2017-07-06 14:55:02 +0100327 // Look up a previously resolved method with the given index.
328 ArtMethod* LookupResolvedMethod(uint32_t method_idx,
329 ObjPtr<mirror::DexCache> dex_cache,
330 ObjPtr<mirror::ClassLoader> class_loader)
331 REQUIRES_SHARED(Locks::mutator_lock_);
332
Nicolas Geoffrayea179f42018-02-08 22:30:18 +0000333 // Find a method with the given index from class `klass`, and update the dex cache.
334 ArtMethod* FindResolvedMethod(ObjPtr<mirror::Class> klass,
335 ObjPtr<mirror::DexCache> dex_cache,
336 ObjPtr<mirror::ClassLoader> class_loader,
337 uint32_t method_idx)
338 REQUIRES_SHARED(Locks::mutator_lock_);
339
David Brazdil4525e0b2018-04-05 16:57:32 +0100340 // Find a method using the wrong lookup mechanism. If `klass` is an interface,
341 // search for a class method. If it is a class, search for an interface method.
342 // This is useful when throwing IncompatibleClassChangeError.
343 ArtMethod* FindIncompatibleMethod(ObjPtr<mirror::Class> klass,
344 ObjPtr<mirror::DexCache> dex_cache,
345 ObjPtr<mirror::ClassLoader> class_loader,
346 uint32_t method_idx)
347 REQUIRES_SHARED(Locks::mutator_lock_);
348
Vladimir Marko89011192017-12-11 13:45:05 +0000349 // Resolve a method with a given ID from the DexFile associated with the given DexCache
350 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader are
351 // used as in ResolveType. What is unique is the method type argument which is used to
352 // determine if this method is a direct, static, or virtual method.
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800353 template <ResolveMode kResolveMode>
Vladimir Marko89011192017-12-11 13:45:05 +0000354 ArtMethod* ResolveMethod(uint32_t method_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700355 Handle<mirror::DexCache> dex_cache,
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700356 Handle<mirror::ClassLoader> class_loader,
357 ArtMethod* referrer,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700358 InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700359 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800360 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700361
Vladimir Markoba118822017-06-12 15:41:56 +0100362 template <InvokeType type, ResolveMode kResolveMode>
Mathieu Chartiere401d142015-04-22 13:56:20 -0700363 ArtMethod* GetResolvedMethod(uint32_t method_idx, ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700364 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightfedd91d2016-01-07 14:49:16 -0800365
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800366 template <ResolveMode kResolveMode>
David Srbecky9cc67b12018-10-25 10:10:35 +0000367 ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, ArtMethod* referrer, InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700368 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800369 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko89011192017-12-11 13:45:05 +0000370 ArtMethod* ResolveMethodWithoutInvokeType(uint32_t method_idx,
Jeff Hao0042c6d2015-07-29 20:14:10 -0700371 Handle<mirror::DexCache> dex_cache,
372 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700373 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800374 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom16192862011-09-12 17:50:06 -0700375
Vladimir Markof44d36c2017-03-14 14:18:46 +0000376 ArtField* LookupResolvedField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700377 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700378 ArtField* ResolveField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700379 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800380 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstromb9edb842011-08-28 16:31:06 -0700381
Vladimir Markoe11dd502017-12-08 14:09:45 +0000382 // Resolve a field with a given ID from the DexFile associated with the given DexCache
383 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
384 // are used as in ResolveType. What is unique is the is_static argument which is used
385 // to determine if we are resolving a static or non-static field.
386 ArtField* ResolveField(uint32_t field_idx,
Mathieu Chartier90443472015-07-16 20:32:27 -0700387 Handle<mirror::DexCache> dex_cache,
Vladimir Markoe11dd502017-12-08 14:09:45 +0000388 Handle<mirror::ClassLoader> class_loader,
389 bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700390 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800391 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700392
Vladimir Markoe11dd502017-12-08 14:09:45 +0000393 // Resolve a field with a given ID from the DexFile associated with the given DexCache
394 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
395 // are used as in ResolveType. No is_static argument is provided so that Java
Ian Rogersb067ac22011-12-13 18:05:09 -0800396 // field resolution semantics are followed.
Vladimir Markoe11dd502017-12-08 14:09:45 +0000397 ArtField* ResolveFieldJLS(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700398 Handle<mirror::DexCache> dex_cache,
399 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700400 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800401 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogersb067ac22011-12-13 18:05:09 -0800402
David Brazdil1ab0fa82018-05-04 11:28:03 +0100403 // Find a field with a given ID from the DexFile associated with the given DexCache
404 // and ClassLoader, storing the result in DexCache. The declaring class is assumed
405 // to have been already resolved into `klass`. The `is_static` argument is used to
406 // determine if we are resolving a static or non-static field.
407 ArtField* FindResolvedField(ObjPtr<mirror::Class> klass,
408 ObjPtr<mirror::DexCache> dex_cache,
409 ObjPtr<mirror::ClassLoader> class_loader,
410 uint32_t field_idx,
411 bool is_static)
412 REQUIRES_SHARED(Locks::mutator_lock_);
413
414 // Find a field with a given ID from the DexFile associated with the given DexCache
415 // and ClassLoader, storing the result in DexCache. The declaring class is assumed
416 // to have been already resolved into `klass`. No is_static argument is provided
417 // so that Java field resolution semantics are followed.
418 ArtField* FindResolvedFieldJLS(ObjPtr<mirror::Class> klass,
419 ObjPtr<mirror::DexCache> dex_cache,
420 ObjPtr<mirror::ClassLoader> class_loader,
421 uint32_t field_idx)
422 REQUIRES_SHARED(Locks::mutator_lock_);
423
Vladimir Markoaf940202017-12-08 15:01:18 +0000424 // Resolve a method type with a given ID from the DexFile associated with a given DexCache
425 // and ClassLoader, storing the result in the DexCache.
426 ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
Orion Hodson06d10a72018-05-14 08:53:38 +0100427 dex::ProtoIndex proto_idx,
Vladimir Markoaf940202017-12-08 15:01:18 +0000428 Handle<mirror::DexCache> dex_cache,
429 Handle<mirror::ClassLoader> class_loader)
Narayan Kamath25352fc2016-08-03 12:46:58 +0100430 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800431 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogersad25ac52011-10-04 19:13:33 -0700432
Vladimir Markoaf940202017-12-08 15:01:18 +0000433 ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
Orion Hodson06d10a72018-05-14 08:53:38 +0100434 dex::ProtoIndex proto_idx,
Vladimir Markoaf940202017-12-08 15:01:18 +0000435 ArtMethod* referrer)
Orion Hodson2e599942017-09-22 16:17:41 +0100436 REQUIRES_SHARED(Locks::mutator_lock_);
437
Orion Hodsonc069a302017-01-18 09:23:12 +0000438 // Resolve a method handle with a given ID from the DexFile. The
439 // result is not cached in the DexCache as the instance will only be
440 // used once in most circumstances.
Vladimir Markoaf940202017-12-08 15:01:18 +0000441 ObjPtr<mirror::MethodHandle> ResolveMethodHandle(Thread* self,
442 uint32_t method_handle_idx,
443 ArtMethod* referrer)
Orion Hodsonc069a302017-01-18 09:23:12 +0000444 REQUIRES_SHARED(Locks::mutator_lock_);
445
Elliott Hughesf4c21c92011-08-19 17:31:31 -0700446 // Returns true on success, false if there's an exception pending.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700447 // can_run_clinit=false allows the compiler to attempt to init a class,
448 // given the restriction that no <clinit> execution is possible.
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700449 bool EnsureInitialized(Thread* self,
450 Handle<mirror::Class> c,
451 bool can_init_fields,
Ian Rogers7b078e82014-09-10 14:44:24 -0700452 bool can_init_parents)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700453 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800454 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700455
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700456 // Initializes classes that have instances in the image but that have
457 // <clinit> methods so they could not be initialized by the compiler.
Vladimir Markodcfcce42018-06-27 10:00:28 +0000458 void RunRootClinits(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700459 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800460 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700461
Alex Light07f06212017-06-01 14:01:43 -0700462 // Directly register an already existing dex cache. RegisterDexFile should be preferred since that
463 // reduplicates DexCaches when possible. The DexCache given to this function must already be fully
464 // initialized and not already registered.
465 void RegisterExistingDexCache(ObjPtr<mirror::DexCache> cache,
466 ObjPtr<mirror::ClassLoader> class_loader)
467 REQUIRES(!Locks::dex_lock_)
468 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocd556b02017-02-03 11:47:34 +0000469 ObjPtr<mirror::DexCache> RegisterDexFile(const DexFile& dex_file,
470 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800471 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700472 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700473
Brian Carlstrom8a487412011-08-29 20:08:52 -0700474 const std::vector<const DexFile*>& GetBootClassPath() {
475 return boot_class_path_;
476 }
477
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700478 void VisitClasses(ClassVisitor* visitor)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700479 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700480 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -0700481
482 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
483 // so that it can visit individual classes without holding the doesn't hold the
484 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
485 // can race with insertion and deletion of classes while the visitor is being called.
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700486 void VisitClassesWithoutClassesLock(ClassVisitor* visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700487 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800488 REQUIRES(!Locks::dex_lock_);
Elliott Hughesa2155262011-11-16 16:26:58 -0800489
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700490 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
Andreas Gamped98b4ed2016-11-04 20:27:24 -0700491 REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700492 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700493 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800494 REQUIRES(!Locks::dex_lock_, !Locks::classlinker_classes_lock_, !Locks::trace_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700495 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightabd8f052019-12-06 10:49:17 -0800496 // Visits all dex-files accessible by any class-loader or the BCP.
497 template<typename Visitor>
498 void VisitKnownDexFiles(Thread* self, Visitor visitor) REQUIRES(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700499
Vladimir Markocd556b02017-02-03 11:47:34 +0000500 bool IsDexFileRegistered(Thread* self, const DexFile& dex_file)
501 REQUIRES(!Locks::dex_lock_)
502 REQUIRES_SHARED(Locks::mutator_lock_);
503 ObjPtr<mirror::DexCache> FindDexCache(Thread* self, const DexFile& dex_file)
504 REQUIRES(!Locks::dex_lock_)
505 REQUIRES_SHARED(Locks::mutator_lock_);
506 ClassTable* FindClassTable(Thread* self, ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800507 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700508 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom1d9f52b2011-10-13 10:50:45 -0700509
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700510 LengthPrefixedArray<ArtField>* AllocArtFieldArray(Thread* self,
511 LinearAlloc* allocator,
512 size_t length);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800513
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700514 LengthPrefixedArray<ArtMethod>* AllocArtMethodArray(Thread* self,
515 LinearAlloc* allocator,
516 size_t length);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700517
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +0000518 // Convenience AllocClass() overload that uses mirror::Class::InitializeClassVisitor
519 // for the class initialization and uses the `java_lang_Class` from class roots
520 // instead of an explicit argument.
521 ObjPtr<mirror::Class> AllocClass(Thread* self, uint32_t class_size)
522 REQUIRES_SHARED(Locks::mutator_lock_)
523 REQUIRES(!Roles::uninterruptible_);
524
525 // Setup the classloader, class def index, type idx so that we can insert this class in the class
526 // table.
527 void SetupClass(const DexFile& dex_file,
528 const dex::ClassDef& dex_class_def,
529 Handle<mirror::Class> klass,
530 ObjPtr<mirror::ClassLoader> class_loader)
531 REQUIRES_SHARED(Locks::mutator_lock_);
532
533 void LoadClass(Thread* self,
534 const DexFile& dex_file,
535 const dex::ClassDef& dex_class_def,
536 Handle<mirror::Class> klass)
537 REQUIRES_SHARED(Locks::mutator_lock_);
538
539 // Link the class and place it into the class-table using the given descriptor. NB if the
540 // descriptor is null the class will not be placed in any class-table. This is useful implementing
541 // obsolete classes and should not be used otherwise.
542 bool LinkClass(Thread* self,
543 const char* descriptor,
544 Handle<mirror::Class> klass,
545 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
546 MutableHandle<mirror::Class>* h_new_class_out)
547 REQUIRES_SHARED(Locks::mutator_lock_)
548 REQUIRES(!Locks::classlinker_classes_lock_);
549
Vladimir Markobcf17522018-06-01 13:14:32 +0100550 ObjPtr<mirror::PointerArray> AllocPointerArray(Thread* self, size_t length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700551 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700552 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800553
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100554 ObjPtr<mirror::IfTable> AllocIfTable(Thread* self, size_t ifcount)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700555 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700556 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800557
Vladimir Markobcf17522018-06-01 13:14:32 +0100558 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> AllocStackTraceElementArray(Thread* self,
559 size_t length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700560 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700561 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800562
Andreas Gampe6d7abbd2017-04-24 13:19:09 -0700563 verifier::FailureKind VerifyClass(
Nicolas Geoffray08025182016-10-25 17:20:18 +0100564 Thread* self,
Nicolas Geoffray5b0b2e12021-03-19 14:48:40 +0000565 verifier::VerifierDeps* verifier_deps,
Nicolas Geoffray08025182016-10-25 17:20:18 +0100566 Handle<mirror::Class> klass,
567 verifier::HardFailLogMode log_level = verifier::HardFailLogMode::kLogNone)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700568 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800569 REQUIRES(!Locks::dex_lock_);
Nicolas Geoffray6df45112021-02-07 21:51:58 +0000570 bool VerifyClassUsingOatFile(Thread* self,
571 const DexFile& dex_file,
572 Handle<mirror::Class> klass,
Vladimir Marko2c64a832018-01-04 11:31:56 +0000573 ClassStatus& oat_file_class_status)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700574 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800575 REQUIRES(!Locks::dex_lock_);
Alex Light5a559862016-01-29 12:24:48 -0800576 void ResolveClassExceptionHandlerTypes(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700577 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800578 REQUIRES(!Locks::dex_lock_);
Alex Light5a559862016-01-29 12:24:48 -0800579 void ResolveMethodExceptionHandlerTypes(ArtMethod* klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700580 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800581 REQUIRES(!Locks::dex_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800582
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100583 ObjPtr<mirror::Class> CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa,
584 jstring name,
585 jobjectArray interfaces,
586 jobject loader,
587 jobjectArray methods,
588 jobjectArray throws)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700589 REQUIRES_SHARED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400590
Alex Lightfc49fec2018-01-16 22:28:36 +0000591 // Get the oat code for a method when its class isn't yet initialized.
592 const void* GetQuickOatCodeFor(ArtMethod* method)
593 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800594
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700595 pid_t GetClassesLockOwner(); // For SignalCatcher.
596 pid_t GetDexLockOwner(); // For SignalCatcher.
Brian Carlstrom24a3c2e2011-10-17 18:07:52 -0700597
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700598 // Is the given entry point quick code to run the resolution stub?
599 bool IsQuickResolutionStub(const void* entry_point) const;
Jeff Hao88474b42013-10-23 16:24:40 -0700600
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700601 // Is the given entry point quick code to bridge into the interpreter?
602 bool IsQuickToInterpreterBridge(const void* entry_point) const;
603
604 // Is the given entry point quick code to run the generic JNI stub?
605 bool IsQuickGenericJniStub(const void* entry_point) const;
Vladimir Marko8a630572014-04-09 18:45:35 +0100606
David Sehra49e0532017-08-25 08:05:29 -0700607 // Is the given entry point the JNI dlsym lookup stub?
608 bool IsJniDlsymLookupStub(const void* entry_point) const;
609
Vladimir Markofa458ac2020-02-12 14:08:07 +0000610 // Is the given entry point the JNI dlsym lookup critical stub?
611 bool IsJniDlsymLookupCriticalStub(const void* entry_point) const;
612
Nicolas Geoffrayc39af942021-01-25 08:43:57 +0000613 // Is the given entry point the nterp trampoline?
614 bool IsNterpTrampoline(const void* entry_point) const {
615 return nterp_trampoline_ == entry_point;
616 }
617
Vladimir Marko97d7e1c2016-10-04 14:44:28 +0100618 const void* GetQuickToInterpreterBridgeTrampoline() const {
619 return quick_to_interpreter_bridge_trampoline_;
620 }
621
Jeff Hao88474b42013-10-23 16:24:40 -0700622 InternTable* GetInternTable() const {
623 return intern_table_;
624 }
625
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700626 // Set the entrypoints up for method to the enter the interpreter.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700627 void SetEntryPointsToInterpreter(ArtMethod* method) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700628 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700629
Alex Lightdb01a092017-04-03 15:39:55 -0700630 // Set the entrypoints up for an obsolete method.
631 void SetEntryPointsForObsoleteMethod(ArtMethod* method) const
632 REQUIRES_SHARED(Locks::mutator_lock_);
633
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700634 // Attempts to insert a class into a class table. Returns null if
Ian Rogers848871b2013-08-05 10:56:33 -0700635 // the class was inserted, otherwise returns an existing class with
636 // the same descriptor and ClassLoader.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100637 ObjPtr<mirror::Class> InsertClass(const char* descriptor,
638 ObjPtr<mirror::Class> klass,
639 size_t hash)
Mathieu Chartier90443472015-07-16 20:32:27 -0700640 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700641 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers848871b2013-08-05 10:56:33 -0700642
Vladimir Marko1998cd02017-01-13 13:02:58 +0000643 // Add an oat file with .bss GC roots to be visited again at the end of GC
644 // for collector types that need it.
645 void WriteBarrierForBootOatFileBssRoots(const OatFile* oat_file)
646 REQUIRES(!Locks::classlinker_classes_lock_)
647 REQUIRES_SHARED(Locks::mutator_lock_);
648
Vladimir Markob4eb1b12018-05-24 11:09:38 +0100649 template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampe88dbad32018-06-26 19:54:12 -0700650 ObjPtr<mirror::ObjectArray<mirror::Class>> GetClassRoots() REQUIRES_SHARED(Locks::mutator_lock_);
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700651
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800652 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
653 // that no more classes are ever added to the pre zygote table which makes it that the pages
654 // always remain shared dirty instead of private dirty.
655 void MoveClassTableToPreZygote()
Mathieu Chartier90443472015-07-16 20:32:27 -0700656 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700657 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800658
Calin Juravle7865ac72017-06-28 11:03:12 -0700659 // Creates a GlobalRef PathClassLoader or DelegateLastClassLoader (specified by loader_class)
660 // that can be used to load classes from the given dex files. The parent of the class loader
661 // will be set to `parent_loader`. If `parent_loader` is null the parent will be
662 // the boot class loader.
663 // If class_loader points to a different class than PathClassLoader or DelegateLastClassLoader
664 // this method will abort.
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700665 // 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 -0700666 jobject CreateWellKnownClassLoader(Thread* self,
667 const std::vector<const DexFile*>& dex_files,
668 jclass loader_class,
Nicolas Geoffraye1672732018-11-30 01:09:49 +0000669 jobject parent_loader,
670 jobject shared_libraries = nullptr)
Calin Juravle7865ac72017-06-28 11:03:12 -0700671 REQUIRES_SHARED(Locks::mutator_lock_)
672 REQUIRES(!Locks::dex_lock_);
673
674 // Calls CreateWellKnownClassLoader(self,
675 // dex_files,
676 // WellKnownClasses::dalvik_system_PathClassLoader,
677 // nullptr)
Jeff Haof0192c82016-03-28 20:39:50 -0700678 jobject CreatePathClassLoader(Thread* self, const std::vector<const DexFile*>& dex_files)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700679 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800680 REQUIRES(!Locks::dex_lock_);
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700681
Nicolas Geoffray6b9fd8c2018-11-16 10:25:42 +0000682 // Non-GlobalRef version of CreateWellKnownClassLoader
683 ObjPtr<mirror::ClassLoader> CreateWellKnownClassLoader(
684 Thread* self,
685 const std::vector<const DexFile*>& dex_files,
686 Handle<mirror::Class> loader_class,
Nicolas Geoffraye1672732018-11-30 01:09:49 +0000687 Handle<mirror::ClassLoader> parent_loader,
688 Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries)
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.
810 DexCacheData()
811 : weak_root(nullptr),
812 dex_file(nullptr),
Vladimir Markocd556b02017-02-03 11:47:34 +0000813 class_table(nullptr) { }
814
815 // Check if the data is valid.
816 bool IsValid() const {
817 return dex_file != nullptr;
818 }
819
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800820 // Weak root to the DexCache. Note: Do not decode this unnecessarily or else class unloading may
821 // not work properly.
822 jweak weak_root;
Vladimir Markod1ee20f2017-08-17 09:21:16 +0000823 // The following field caches the DexCache's field here to avoid unnecessary jweak decode that
824 // triggers read barriers (and marks them alive unnecessarily and messes with class unloading.)
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800825 const DexFile* dex_file;
Vladimir Markocd556b02017-02-03 11:47:34 +0000826 // Identify the associated class loader's class table. This is used to make sure that
827 // the Java call to native DexCache.setResolvedType() inserts the resolved type in that
828 // class table. It is also used to make sure we don't register the same dex cache with
829 // multiple class loaders.
830 ClassTable* class_table;
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800831 };
832
Alex Lightfb119572019-09-18 15:04:53 -0700833 // Forces a class to be marked as initialized without actually running initializers. Should only
834 // be used by plugin code when creating new classes directly.
835 void ForceClassInitialized(Thread* self, Handle<mirror::Class> klass)
836 REQUIRES_SHARED(Locks::mutator_lock_)
837 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
838
Calin Juravle33787682019-07-26 14:27:18 -0700839 // Verifies if the method is accesible according to the SdkChecker (if installed).
Calin Juravle2c2724c2021-01-14 19:54:23 -0800840 virtual bool DenyAccessBasedOnPublicSdk(ArtMethod* art_method) const
Calin Juravle33787682019-07-26 14:27:18 -0700841 REQUIRES_SHARED(Locks::mutator_lock_);
842 // Verifies if the field is accesible according to the SdkChecker (if installed).
Calin Juravle2c2724c2021-01-14 19:54:23 -0800843 virtual bool DenyAccessBasedOnPublicSdk(ArtField* art_field) const
Calin Juravle33787682019-07-26 14:27:18 -0700844 REQUIRES_SHARED(Locks::mutator_lock_);
845 // Verifies if the descriptor is accesible according to the SdkChecker (if installed).
Calin Juravle2c2724c2021-01-14 19:54:23 -0800846 virtual bool DenyAccessBasedOnPublicSdk(const char* type_descriptor) const;
847 // Enable or disable public sdk checks.
848 virtual void SetEnablePublicSdkChecks(bool enabled);
Calin Juravle33787682019-07-26 14:27:18 -0700849
Chang Xing605fe242017-07-20 15:57:21 -0700850 protected:
851 virtual bool InitializeClass(Thread* self,
852 Handle<mirror::Class> klass,
853 bool can_run_clinit,
854 bool can_init_parents)
855 REQUIRES_SHARED(Locks::mutator_lock_)
856 REQUIRES(!Locks::dex_lock_);
857
Mathieu Chartier9e050df2017-08-09 10:05:47 -0700858 virtual verifier::FailureKind PerformClassVerification(Thread* self,
Nicolas Geoffray5b0b2e12021-03-19 14:48:40 +0000859 verifier::VerifierDeps* verifier_deps,
Mathieu Chartier9e050df2017-08-09 10:05:47 -0700860 Handle<mirror::Class> klass,
861 verifier::HardFailLogMode log_level,
862 std::string* error_msg)
863 REQUIRES_SHARED(Locks::mutator_lock_);
864
Chang Xing0c2c2222017-08-04 14:36:17 -0700865 virtual bool CanAllocClass() REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::dex_lock_) {
866 return true;
867 }
868
Vladimir Markod1f73512020-04-02 10:50:35 +0100869 virtual bool IsUpdatableBootClassPathDescriptor(const char* descriptor);
870
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700871 private:
Vladimir Marko42bee502021-01-28 14:58:35 +0000872 class LinkFieldsHelper;
Vladimir Marko921094a2017-01-12 18:37:06 +0000873 class LinkInterfaceMethodsHelper;
Vladimir Marko782fb712020-12-23 12:47:31 +0000874 class MethodTranslation;
Vladimir Markobf121912019-06-04 13:49:05 +0100875 class VisiblyInitializedCallback;
Vladimir Marko921094a2017-01-12 18:37:06 +0000876
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700877 struct ClassLoaderData {
Mathieu Chartierc3fcd412015-09-25 16:54:59 -0700878 jweak weak_root; // Weak root to enable class unloading.
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700879 ClassTable* class_table;
880 LinearAlloc* allocator;
881 };
882
Vladimir Markobf121912019-06-04 13:49:05 +0100883 void VisiblyInitializedCallbackDone(Thread* self, VisiblyInitializedCallback* callback);
884 VisiblyInitializedCallback* MarkClassInitialized(Thread* self, Handle<mirror::Class> klass)
885 REQUIRES_SHARED(Locks::mutator_lock_);
886
Alex Lightf1f10492015-10-07 16:08:36 -0700887 // Ensures that the supertype of 'klass' ('supertype') is verified. Returns false and throws
888 // appropriate exceptions if verification failed hard. Returns true for successful verification or
889 // soft-failures.
890 bool AttemptSupertypeVerification(Thread* self,
Nicolas Geoffray5b0b2e12021-03-19 14:48:40 +0000891 verifier::VerifierDeps* verifier_deps,
Alex Lightf1f10492015-10-07 16:08:36 -0700892 Handle<mirror::Class> klass,
893 Handle<mirror::Class> supertype)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800894 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700895 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightf1f10492015-10-07 16:08:36 -0700896
Alexey Grebenkinbe4c2bd2018-02-01 19:09:59 +0300897 void DeleteClassLoader(Thread* self, const ClassLoaderData& data, bool cleanup_cha)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700898 REQUIRES_SHARED(Locks::mutator_lock_);
Nicolas Geoffray1dad3f62015-10-23 14:59:54 +0100899
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700900 void VisitClassesInternal(ClassVisitor* visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700901 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700902
903 // Returns the number of zygote and image classes.
Mathieu Chartier6b069532015-08-05 15:08:12 -0700904 size_t NumZygoteClasses() const
905 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700906 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700907
908 // Returns the number of non zygote nor image classes.
Mathieu Chartier6b069532015-08-05 15:08:12 -0700909 size_t NumNonZygoteClasses() const
910 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700911 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700912
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700913 void FinishInit(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700914 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800915 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700916
Roland Levillain0e840272018-08-23 19:55:30 +0100917 // If we do not allow moving classes (`art::kMovingClass` is false) or if
918 // parameter `kMovable` is false (or both), the class object is allocated in
919 // the non-moving space.
Vladimir Marko70e2a762019-07-12 16:49:00 +0100920 template <bool kMovable = true, class PreFenceVisitor>
921 ObjPtr<mirror::Class> AllocClass(Thread* self,
922 ObjPtr<mirror::Class> java_lang_Class,
923 uint32_t class_size,
924 const PreFenceVisitor& pre_fence_visitor)
925 REQUIRES_SHARED(Locks::mutator_lock_)
926 REQUIRES(!Roles::uninterruptible_);
927
928 // Convenience AllocClass() overload that uses mirror::Class::InitializeClassVisitor
929 // for the class initialization.
Roland Levillain0e840272018-08-23 19:55:30 +0100930 template <bool kMovable = true>
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100931 ObjPtr<mirror::Class> AllocClass(Thread* self,
932 ObjPtr<mirror::Class> java_lang_Class,
933 uint32_t class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700934 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700935 REQUIRES(!Roles::uninterruptible_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700936
Vladimir Marko70e2a762019-07-12 16:49:00 +0100937 // Allocate a primitive array class and store it in appropriate class root.
938 void AllocPrimitiveArrayClass(Thread* self,
939 ClassRoot primitive_root,
940 ClassRoot array_root)
941 REQUIRES_SHARED(Locks::mutator_lock_)
942 REQUIRES(!Roles::uninterruptible_);
943
944 // Finish setup of an array class.
945 void FinishArrayClassSetup(ObjPtr<mirror::Class> array_class)
946 REQUIRES_SHARED(Locks::mutator_lock_)
947 REQUIRES(!Roles::uninterruptible_);
948
949 // Finish setup of a core array class (Object[], Class[], String[] and
950 // primitive arrays) and insert it into the class table.
951 void FinishCoreArrayClassSetup(ClassRoot array_root)
Roland Levillain0e840272018-08-23 19:55:30 +0100952 REQUIRES_SHARED(Locks::mutator_lock_)
953 REQUIRES(!Roles::uninterruptible_);
954
David Srbecky86d6cd52020-12-02 18:13:10 +0000955 ObjPtr<mirror::DexCache> AllocDexCache(Thread* self, const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700956 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700957 REQUIRES(!Roles::uninterruptible_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700958
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700959 // Used for tests and AppendToBootClassPath.
Vladimir Markobcf17522018-06-01 13:14:32 +0100960 ObjPtr<mirror::DexCache> AllocAndInitializeDexCache(Thread* self,
961 const DexFile& dex_file,
Orion Hodsonb9b7d912021-02-24 09:24:47 +0000962 LinearAlloc* linear_alloc)
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700963 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800964 REQUIRES(!Locks::dex_lock_)
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700965 REQUIRES(!Roles::uninterruptible_);
966
Vladimir Marko70e2a762019-07-12 16:49:00 +0100967 // Create a primitive class and store it in the appropriate class root.
968 void CreatePrimitiveClass(Thread* self, Primitive::Type type, ClassRoot primitive_root)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700969 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700970 REQUIRES(!Roles::uninterruptible_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700971
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100972 ObjPtr<mirror::Class> CreateArrayClass(Thread* self,
973 const char* descriptor,
974 size_t hash,
975 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700976 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800977 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700978
Mathieu Chartier0a19e212019-11-27 14:35:24 -0800979 void AppendToBootClassPath(const DexFile* dex_file, ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700980 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800981 REQUIRES(!Locks::dex_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700982
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700983 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
984 // sufficient to hold all static fields.
985 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800986 const dex::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700987
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -0700988 void LoadField(const ClassAccessor::Field& field, Handle<mirror::Class> klass, ArtField* dst)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700989 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700990
Mathieu Chartier268764d2016-09-13 12:09:38 -0700991 void LoadMethod(const DexFile& dex_file,
Mathieu Chartier1f1cb9f2018-06-04 09:22:46 -0700992 const ClassAccessor::Method& method,
993 Handle<mirror::Class> klass,
994 ArtMethod* dst)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700995 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700996
Vladimir Marko86c87522020-05-11 16:55:55 +0100997 void FixupStaticTrampolines(Thread* self, ObjPtr<mirror::Class> klass)
998 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800999
Nicolas Geoffray7d8d8ff2016-11-02 12:38:05 +00001000 // Finds a class in a Path- or DexClassLoader, loading it if necessary without using JNI. Hash
Andreas Gampe34ee6842014-12-02 15:43:52 -08001001 // function is supposed to be ComputeModifiedUtf8Hash(descriptor). Returns true if the
1002 // class-loader chain could be handled, false otherwise, i.e., a non-supported class-loader
1003 // was encountered while walking the parent chain (currently only BootClassLoader and
1004 // PathClassLoader are supported).
Nicolas Geoffray7d8d8ff2016-11-02 12:38:05 +00001005 bool FindClassInBaseDexClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
1006 Thread* self,
1007 const char* descriptor,
1008 size_t hash,
1009 Handle<mirror::ClassLoader> class_loader,
Vladimir Markobcf17522018-06-01 13:14:32 +01001010 /*out*/ ObjPtr<mirror::Class>* result)
Andreas Gampe34ee6842014-12-02 15:43:52 -08001011 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001012 REQUIRES(!Locks::dex_lock_);
Andreas Gampe34ee6842014-12-02 15:43:52 -08001013
Nicolas Geoffray80a560c2018-10-26 13:48:51 +01001014 bool FindClassInSharedLibraries(ScopedObjectAccessAlreadyRunnable& soa,
1015 Thread* self,
1016 const char* descriptor,
1017 size_t hash,
1018 Handle<mirror::ClassLoader> class_loader,
1019 /*out*/ ObjPtr<mirror::Class>* result)
1020 REQUIRES_SHARED(Locks::mutator_lock_)
1021 REQUIRES(!Locks::dex_lock_);
1022
Calin Juravle415dc3d2017-06-28 11:03:12 -07001023 // Finds the class in the classpath of the given class loader. It only searches the class loader
1024 // dex files and does not recurse into its parent.
1025 // The method checks that the provided class loader is either a PathClassLoader or a
1026 // DexClassLoader.
1027 // If the class is found the method returns the resolved class. Otherwise it returns null.
1028 ObjPtr<mirror::Class> FindClassInBaseDexClassLoaderClassPath(
1029 ScopedObjectAccessAlreadyRunnable& soa,
1030 const char* descriptor,
1031 size_t hash,
1032 Handle<mirror::ClassLoader> class_loader)
1033 REQUIRES_SHARED(Locks::mutator_lock_)
1034 REQUIRES(!Locks::dex_lock_);
1035
1036 // Finds the class in the boot class loader.
1037 // If the class is found the method returns the resolved class. Otherwise it returns null.
1038 ObjPtr<mirror::Class> FindClassInBootClassLoaderClassPath(Thread* self,
1039 const char* descriptor,
1040 size_t hash)
1041 REQUIRES_SHARED(Locks::mutator_lock_)
1042 REQUIRES(!Locks::dex_lock_);
1043
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001044 // Implementation of LookupResolvedType() called when the type was not found in the dex cache.
1045 ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
Vladimir Marko09c5ca42018-05-31 15:15:31 +01001046 ObjPtr<mirror::Class> referrer)
1047 REQUIRES_SHARED(Locks::mutator_lock_);
1048 ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001049 ObjPtr<mirror::DexCache> dex_cache,
1050 ObjPtr<mirror::ClassLoader> class_loader)
1051 REQUIRES_SHARED(Locks::mutator_lock_);
1052
Vladimir Marko18090d12018-06-01 16:53:12 +01001053 // Implementation of ResolveString() called when the string was not found in the dex cache.
1054 ObjPtr<mirror::String> DoResolveString(dex::StringIndex string_idx,
1055 ObjPtr<mirror::DexCache> dex_cache)
1056 REQUIRES_SHARED(Locks::mutator_lock_);
1057 ObjPtr<mirror::String> DoResolveString(dex::StringIndex string_idx,
1058 Handle<mirror::DexCache> dex_cache)
1059 REQUIRES_SHARED(Locks::mutator_lock_);
1060
1061 // Implementation of LookupString() called when the string was not found in the dex cache.
1062 ObjPtr<mirror::String> DoLookupString(dex::StringIndex string_idx,
1063 ObjPtr<mirror::DexCache> dex_cache)
1064 REQUIRES_SHARED(Locks::mutator_lock_);
1065
Andreas Gampeb0625e02019-05-01 12:43:31 -07001066 // Implementation of ResolveType() called when the type was not found in the dex cache. May be
1067 // used with ArtField*, ArtMethod* or ObjPtr<Class>.
1068 template <typename RefType>
1069 ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx, RefType referrer)
Vladimir Marko09c5ca42018-05-31 15:15:31 +01001070 REQUIRES_SHARED(Locks::mutator_lock_)
1071 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1072 ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx,
Vladimir Marko666ee3d2017-12-11 18:37:36 +00001073 Handle<mirror::DexCache> dex_cache,
1074 Handle<mirror::ClassLoader> class_loader)
1075 REQUIRES_SHARED(Locks::mutator_lock_)
1076 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
1077
Andreas Gampe34ee6842014-12-02 15:43:52 -08001078 // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
1079 // by the given 'class_loader'. Uses the provided hash for the descriptor.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +01001080 ObjPtr<mirror::Class> LookupClass(Thread* self,
1081 const char* descriptor,
1082 size_t hash,
1083 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampe34ee6842014-12-02 15:43:52 -08001084 REQUIRES(!Locks::classlinker_classes_lock_)
1085 REQUIRES_SHARED(Locks::mutator_lock_);
1086
Vladimir Markof44d36c2017-03-14 14:18:46 +00001087 // Find a field by its field index.
1088 ArtField* LookupResolvedField(uint32_t field_idx,
1089 ObjPtr<mirror::DexCache> dex_cache,
1090 ObjPtr<mirror::ClassLoader> class_loader,
1091 bool is_static)
1092 REQUIRES_SHARED(Locks::mutator_lock_);
1093
Vladimir Markocd556b02017-02-03 11:47:34 +00001094 void RegisterDexFileLocked(const DexFile& dex_file,
1095 ObjPtr<mirror::DexCache> dex_cache,
1096 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001097 REQUIRES(Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001098 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Light725da8f2020-02-19 14:46:33 -08001099 const DexCacheData* FindDexCacheDataLocked(const DexFile& dex_file)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001100 REQUIRES(Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001101 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Light725da8f2020-02-19 14:46:33 -08001102 static ObjPtr<mirror::DexCache> DecodeDexCacheLocked(Thread* self, const DexCacheData* data)
1103 REQUIRES_SHARED(Locks::dex_lock_, Locks::mutator_lock_);
1104 bool IsSameClassLoader(ObjPtr<mirror::DexCache> dex_cache,
1105 const DexCacheData* data,
1106 ObjPtr<mirror::ClassLoader> class_loader)
1107 REQUIRES_SHARED(Locks::dex_lock_, Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -07001108
Alex Lighteb7c1442015-08-31 13:17:42 -07001109 bool InitializeDefaultInterfaceRecursive(Thread* self,
1110 Handle<mirror::Class> klass,
1111 bool can_run_clinit,
1112 bool can_init_parents)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001113 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001114 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001115 bool WaitForInitializeClass(Handle<mirror::Class> klass,
1116 Thread* self,
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001117 ObjectLock<mirror::Class>& lock);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001118
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001119 bool IsSameDescriptorInDifferentClassContexts(Thread* self,
1120 const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001121 Handle<mirror::ClassLoader> class_loader1,
1122 Handle<mirror::ClassLoader> class_loader2)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001123 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001124
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001125 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self,
1126 ArtMethod* method,
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001127 ObjPtr<mirror::Class> klass1,
1128 ObjPtr<mirror::Class> klass2)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001129 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001130
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001131 bool LinkSuperClass(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001132 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001133
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001134 bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001135 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001136 REQUIRES(!Locks::dex_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001137
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001138 bool LinkMethods(Thread* self,
1139 Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -07001140 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001141 bool* out_new_conflict,
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001142 ArtMethod** out_imt)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001143 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001144
Vladimir Marko5aead702019-03-27 11:00:36 +00001145 ObjPtr<mirror::MethodHandle> ResolveMethodHandleForField(
1146 Thread* self,
1147 const dex::MethodHandleItem& method_handle,
1148 ArtMethod* referrer) REQUIRES_SHARED(Locks::mutator_lock_);
Orion Hodsonf8db2c32017-07-07 20:07:12 +01001149
Vladimir Marko5aead702019-03-27 11:00:36 +00001150 ObjPtr<mirror::MethodHandle> ResolveMethodHandleForMethod(
1151 Thread* self,
1152 const dex::MethodHandleItem& method_handle,
1153 ArtMethod* referrer) REQUIRES_SHARED(Locks::mutator_lock_);
Orion Hodsonf8db2c32017-07-07 20:07:12 +01001154
Alex Lighteb7c1442015-08-31 13:17:42 -07001155 // Links the virtual methods for the given class and records any default methods that will need to
1156 // be updated later.
1157 //
1158 // Arguments:
1159 // * self - The current thread.
1160 // * klass - class, whose vtable will be filled in.
1161 // * default_translations - Vtable index to new method map.
1162 // Any vtable entries that need to be updated with new default methods
1163 // are stored into the default_translations map. The default_translations
1164 // map is keyed on the vtable index that needs to be updated. We use this
1165 // map because if we override a default method with another default
1166 // method we need to update the vtable to point to the new method.
1167 // Unfortunately since we copy the ArtMethod* we cannot just do a simple
1168 // scan, we therefore store the vtable index's that might need to be
1169 // updated with the method they will turn into.
1170 // TODO This whole default_translations thing is very dirty. There should be a better way.
Alex Light9139e002015-10-09 15:59:48 -07001171 bool LinkVirtualMethods(
1172 Thread* self,
1173 Handle<mirror::Class> klass,
Vladimir Marko782fb712020-12-23 12:47:31 +00001174 /*out*/HashMap<size_t, MethodTranslation>* default_translations)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001175 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001176
Alex Lighteb7c1442015-08-31 13:17:42 -07001177 // Sets up the interface lookup table (IFTable) in the correct order to allow searching for
1178 // default methods.
1179 bool SetupInterfaceLookupTable(Thread* self,
1180 Handle<mirror::Class> klass,
1181 Handle<mirror::ObjectArray<mirror::Class>> interfaces)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001182 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighteb7c1442015-08-31 13:17:42 -07001183
Alex Light9139e002015-10-09 15:59:48 -07001184
1185 enum class DefaultMethodSearchResult {
1186 kDefaultFound,
1187 kAbstractFound,
1188 kDefaultConflict
1189 };
1190
Alex Lighteb7c1442015-08-31 13:17:42 -07001191 // Find the default method implementation for 'interface_method' in 'klass', if one exists.
1192 //
1193 // Arguments:
1194 // * self - The current thread.
1195 // * target_method - The method we are trying to find a default implementation for.
1196 // * klass - The class we are searching for a definition of target_method.
1197 // * out_default_method - The pointer we will store the found default method to on success.
Alex Lighteb7c1442015-08-31 13:17:42 -07001198 //
1199 // Return value:
Alex Light9139e002015-10-09 15:59:48 -07001200 // * kDefaultFound - There were no conflicting method implementations found in the class while
1201 // searching for target_method. The default method implementation is stored into
1202 // out_default_method.
1203 // * kAbstractFound - There were no conflicting method implementations found in the class while
1204 // searching for target_method but no default implementation was found either.
1205 // out_default_method is set to null and the method should be considered not
1206 // implemented.
1207 // * kDefaultConflict - Conflicting method implementations were found when searching for
1208 // target_method. The value of *out_default_method is null.
1209 DefaultMethodSearchResult FindDefaultMethodImplementation(
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001210 Thread* self,
1211 ArtMethod* target_method,
1212 Handle<mirror::Class> klass,
1213 /*out*/ArtMethod** out_default_method) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001214 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighteb7c1442015-08-31 13:17:42 -07001215
1216 // Sets the imt entries and fixes up the vtable for the given class by linking all the interface
1217 // methods. See LinkVirtualMethods for an explanation of what default_translations is.
Alex Light9139e002015-10-09 15:59:48 -07001218 bool LinkInterfaceMethods(
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001219 Thread* self,
1220 Handle<mirror::Class> klass,
Vladimir Marko782fb712020-12-23 12:47:31 +00001221 const HashMap<size_t, MethodTranslation>& default_translations,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001222 bool* out_new_conflict,
1223 ArtMethod** out_imt)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001224 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001225
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001226 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001227 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001228 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001229 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001230 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001231 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001232
Mathieu Chartiere401d142015-04-22 13:56:20 -07001233 void CheckProxyConstructor(ArtMethod* constructor) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001234 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001235 void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001236 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001237
Andreas Gampecc1b5352016-12-01 16:58:38 -08001238 size_t GetDexCacheCount() REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -07001239 return dex_caches_.size();
1240 }
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -08001241 const std::list<DexCacheData>& GetDexCachesData()
Andreas Gampecc1b5352016-12-01 16:58:38 -08001242 REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
Mathieu Chartier673ed3d2015-08-28 14:56:43 -07001243 return dex_caches_;
1244 }
Brian Carlstrom58ae9412011-10-04 00:56:06 -07001245
Mathieu Chartiere401d142015-04-22 13:56:20 -07001246 void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001247 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001248 void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001249 REQUIRES_SHARED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -04001250
Mathieu Chartier5b830502016-03-02 10:30:23 -08001251 // Register a class loader and create its class table and allocator. Should not be called if
1252 // these are already created.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001253 void RegisterClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001254 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier5b830502016-03-02 10:30:23 -08001255 REQUIRES(Locks::classlinker_classes_lock_);
1256
Nicolas Geoffray3a090922015-11-24 09:17:30 +00001257 // Insert a new class table if not found.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001258 ClassTable* InsertClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001259 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001260 REQUIRES(Locks::classlinker_classes_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001261
Ian Rogersdbf3be02014-08-29 15:40:08 -07001262 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
1263 // before returning it to the caller. Its the responsibility of the thread that placed the class
1264 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
1265 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
1266 // retire a class, the version of the class in the table is returned and this may differ from
1267 // the class passed in.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +01001268 ObjPtr<mirror::Class> EnsureResolved(Thread* self,
1269 const char* descriptor,
1270 ObjPtr<mirror::Class> klass)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001271 WARN_UNUSED
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001272 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001273 REQUIRES(!Locks::dex_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -07001274
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001275 void FixupTemporaryDeclaringClass(ObjPtr<mirror::Class> temp_class,
1276 ObjPtr<mirror::Class> new_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001277 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -07001278
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001279 void SetClassRoot(ClassRoot class_root, ObjPtr<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001280 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001281
1282 // Return the quick generic JNI stub for testing.
1283 const void* GetRuntimeQuickGenericJniStub() const;
1284
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001285 bool CanWeInitializeClass(ObjPtr<mirror::Class> klass,
1286 bool can_init_statics,
1287 bool can_init_parents)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001288 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001289
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001290 void UpdateClassMethods(ObjPtr<mirror::Class> klass,
Alex Lighte64300b2015-12-15 15:02:47 -08001291 LengthPrefixedArray<ArtMethod>* new_methods)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001292 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier54d220e2015-07-30 16:20:06 -07001293 REQUIRES(!Locks::classlinker_classes_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001294
Andreas Gampe7ba5a672016-02-04 21:45:01 -08001295 // Check that c1 == FindSystemClass(self, descriptor). Abort with class dumps otherwise.
1296 void CheckSystemClass(Thread* self, Handle<mirror::Class> c1, const char* descriptor)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001297 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001298 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe7ba5a672016-02-04 21:45:01 -08001299
Vladimir Marko921094a2017-01-12 18:37:06 +00001300 // Allocate method arrays for interfaces.
1301 bool AllocateIfTableMethodArrays(Thread* self,
1302 Handle<mirror::Class> klass,
1303 Handle<mirror::IfTable> iftable)
1304 REQUIRES_SHARED(Locks::mutator_lock_);
1305
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001306 // Sets imt_ref appropriately for LinkInterfaceMethods.
1307 // If there is no method in the imt location of imt_ref it will store the given method there.
1308 // Otherwise it will set the conflict method which will figure out which method to use during
1309 // runtime.
1310 void SetIMTRef(ArtMethod* unimplemented_method,
1311 ArtMethod* imt_conflict_method,
1312 ArtMethod* current_method,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001313 /*out*/bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001314 /*out*/ArtMethod** imt_ref) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001315
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001316 void FillIMTFromIfTable(ObjPtr<mirror::IfTable> if_table,
Mathieu Chartiere42888f2016-04-14 10:49:19 -07001317 ArtMethod* unimplemented_method,
1318 ArtMethod* imt_conflict_method,
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001319 ObjPtr<mirror::Class> klass,
Mathieu Chartiere42888f2016-04-14 10:49:19 -07001320 bool create_conflict_tables,
1321 bool ignore_copied_methods,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001322 /*out*/bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001323 /*out*/ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001324
1325 void FillImtFromSuperClass(Handle<mirror::Class> klass,
1326 ArtMethod* unimplemented_method,
1327 ArtMethod* imt_conflict_method,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001328 bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001329 ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001330
Vladimir Markoba118822017-06-12 15:41:56 +01001331 // Check invoke type against the referenced class. Throws IncompatibleClassChangeError
1332 // (if `kThrowOnError`) and returns true on mismatch (kInterface on a non-interface class,
1333 // kVirtual on interface, kDefault on interface for dex files not supporting default methods),
1334 // otherwise returns false.
1335 template <bool kThrowOnError, typename ClassGetter>
1336 static bool CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_cache,
1337 InvokeType type,
1338 ClassGetter class_getter)
1339 REQUIRES_SHARED(Locks::mutator_lock_);
1340 // Helper that feeds the above function with `ClassGetter` doing `LookupResolvedType()`.
1341 template <bool kThrow>
1342 bool CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_cache,
1343 InvokeType type,
1344 uint32_t method_idx,
1345 ObjPtr<mirror::ClassLoader> class_loader)
1346 REQUIRES_SHARED(Locks::mutator_lock_);
1347
Vladimir Marko02610552018-06-04 14:38:00 +01001348 ObjPtr<mirror::IfTable> GetArrayIfTable() REQUIRES_SHARED(Locks::mutator_lock_);
1349
Brian Carlstrom4a96b602011-07-26 16:40:23 -07001350 std::vector<const DexFile*> boot_class_path_;
Mathieu Chartierfbc31082016-01-24 11:59:56 -08001351 std::vector<std::unique_ptr<const DexFile>> boot_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07001352
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -08001353 // JNI weak globals and side data to allow dex caches to get unloaded. We lazily delete weak
1354 // globals when we register new dex files.
Andreas Gampecc1b5352016-12-01 16:58:38 -08001355 std::list<DexCacheData> dex_caches_ GUARDED_BY(Locks::dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -07001356
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -07001357 // This contains the class loaders which have class tables. It is populated by
Mathieu Chartier951ec2c2015-09-22 08:50:05 -07001358 // InsertClassTableForClassLoader.
1359 std::list<ClassLoaderData> class_loaders_
Mathieu Chartier6b069532015-08-05 15:08:12 -07001360 GUARDED_BY(Locks::classlinker_classes_lock_);
1361
1362 // Boot class path table. Since the class loader for this is null.
Andreas Gampe2af99022017-04-25 08:32:59 -07001363 std::unique_ptr<ClassTable> boot_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001364
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001365 // New class roots, only used by CMS since the GC needs to mark these in the pause.
1366 std::vector<GcRoot<mirror::Class>> new_class_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -07001367
Vladimir Marko1998cd02017-01-13 13:02:58 +00001368 // Boot image oat files with new .bss GC roots to be visited in the pause by CMS.
1369 std::vector<const OatFile*> new_bss_roots_boot_oat_files_
1370 GUARDED_BY(Locks::classlinker_classes_lock_);
1371
Ian Rogers7dfb28c2013-08-22 08:18:36 -07001372 // Number of times we've searched dex caches for a class. After a certain number of misses we move
1373 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -07001374 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -07001375
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001376 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001377 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -07001378
Vladimir Marko43354742021-02-03 15:37:01 +00001379 // Method hashes for virtual methods from java.lang.Object used
1380 // to avoid recalculating them for each class we link.
1381 uint32_t object_virtual_method_hashes_[mirror::Object::kVTableLength];
1382
Ian Rogers98379392014-02-24 16:53:16 -08001383 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
1384 // descriptors for the sake of performing FindClass.
1385 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001386 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -08001387 size_t find_array_class_cache_next_victim_;
1388
Brian Carlstrom75cb3b42011-07-28 02:13:36 -07001389 bool init_done_;
Vladimir Marko1998cd02017-01-13 13:02:58 +00001390 bool log_new_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -07001391
Elliott Hughescf4c6c42011-09-01 15:16:42 -07001392 InternTable* intern_table_;
1393
Andreas Gampe87658f32019-04-18 18:39:02 +00001394 const bool fast_class_not_found_exceptions_;
1395
Mingyao Yang98d1cc82014-05-15 17:02:16 -07001396 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
1397 // patch point within the image. TODO: make these proper relocations.
Vladimir Marko7dac8642019-11-06 17:09:30 +00001398 const void* jni_dlsym_lookup_trampoline_;
Vladimir Markofa458ac2020-02-12 14:08:07 +00001399 const void* jni_dlsym_lookup_critical_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -07001400 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -07001401 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -08001402 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +01001403 const void* quick_to_interpreter_bridge_trampoline_;
Nicolas Geoffrayc39af942021-01-25 08:43:57 +00001404 const void* nterp_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -07001405
Mathieu Chartier2d721012014-11-10 11:08:06 -08001406 // Image pointer size.
Andreas Gampe542451c2016-07-26 09:02:02 -07001407 PointerSize image_pointer_size_;
Mathieu Chartier2d721012014-11-10 11:08:06 -08001408
Vladimir Markobf121912019-06-04 13:49:05 +01001409 // Classes to transition from ClassStatus::kInitialized to ClassStatus::kVisiblyInitialized.
1410 Mutex visibly_initialized_callback_lock_;
1411 std::unique_ptr<VisiblyInitializedCallback> visibly_initialized_callback_
1412 GUARDED_BY(visibly_initialized_callback_lock_);
1413 IntrusiveForwardList<VisiblyInitializedCallback> running_visibly_initialized_callbacks_
1414 GUARDED_BY(visibly_initialized_callback_lock_);
1415
Vladimir Marko86c87522020-05-11 16:55:55 +01001416 // Registered native code for @CriticalNative methods of classes that are not visibly
1417 // initialized. These code pointers cannot be stored in ArtMethod as that would risk
1418 // skipping the class initialization check for direct calls from compiled code.
1419 Mutex critical_native_code_with_clinit_check_lock_;
1420 std::map<ArtMethod*, void*> critical_native_code_with_clinit_check_
1421 GUARDED_BY(critical_native_code_with_clinit_check_lock_);
1422
Andreas Gampec1ac9ee2017-07-24 22:35:49 -07001423 std::unique_ptr<ClassHierarchyAnalysis> cha_;
1424
Mathieu Chartier65975772016-08-05 10:46:36 -07001425 class FindVirtualMethodHolderVisitor;
Andreas Gampe2af99022017-04-25 08:32:59 -07001426
Mathieu Chartier74ccee62018-10-10 10:30:29 -07001427 friend class AppImageLoadingHelper;
Mathieu Chartierf9c6fc62015-10-07 11:44:05 -07001428 friend class ImageDumper; // for DexLock
Vladimir Marko74527972016-11-29 15:57:32 +00001429 friend struct linker::CompilationHelper; // For Compile in ImageTest.
1430 friend class linker::ImageWriter; // for GetClassRoots
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001431 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Andreas Gampe5f4a09a2015-09-28 13:16:33 -07001432 friend class JniInternalTest; // for GetRuntimeQuickGenericJniStub
Andreas Gampe2af99022017-04-25 08:32:59 -07001433 friend class VMClassLoader; // for LookupClass and FindClassInBaseDexClassLoader.
Mathieu Chartier76172162016-01-26 14:54:06 -08001434 ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName); // for DexLock, and RegisterDexFileLocked
Narayan Kamath25352fc2016-08-03 12:46:58 +01001435 ART_FRIEND_TEST(mirror::DexCacheMethodHandlesTest, Open); // for AllocDexCache
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001436 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001437 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
1438};
1439
Andreas Gampe0f01b582017-01-18 15:22:37 -08001440class ClassLoadCallback {
1441 public:
1442 virtual ~ClassLoadCallback() {}
1443
Alex Light270db1c2019-12-03 12:20:01 +00001444 // Called immediately before beginning class-definition and immediately before returning from it.
1445 virtual void BeginDefineClass() REQUIRES_SHARED(Locks::mutator_lock_) {}
1446 virtual void EndDefineClass() REQUIRES_SHARED(Locks::mutator_lock_) {}
1447
Alex Lightb0f11922017-01-23 14:25:17 -08001448 // If set we will replace initial_class_def & initial_dex_file with the final versions. The
1449 // callback author is responsible for ensuring these are allocated in such a way they can be
1450 // cleaned up if another transformation occurs. Note that both must be set or null/unchanged on
1451 // return.
1452 // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1453 // different object. It is the listener's responsibility to handle this.
1454 // Note: This callback is rarely useful so a default implementation has been given that does
1455 // nothing.
1456 virtual void ClassPreDefine(const char* descriptor ATTRIBUTE_UNUSED,
1457 Handle<mirror::Class> klass ATTRIBUTE_UNUSED,
1458 Handle<mirror::ClassLoader> class_loader ATTRIBUTE_UNUSED,
1459 const DexFile& initial_dex_file ATTRIBUTE_UNUSED,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -08001460 const dex::ClassDef& initial_class_def ATTRIBUTE_UNUSED,
Alex Lightb0f11922017-01-23 14:25:17 -08001461 /*out*/DexFile const** final_dex_file ATTRIBUTE_UNUSED,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -08001462 /*out*/dex::ClassDef const** final_class_def ATTRIBUTE_UNUSED)
Alex Lightb0f11922017-01-23 14:25:17 -08001463 REQUIRES_SHARED(Locks::mutator_lock_) {}
1464
Andreas Gampe0f01b582017-01-18 15:22:37 -08001465 // A class has been loaded.
1466 // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1467 // different object. It is the listener's responsibility to handle this.
1468 virtual void ClassLoad(Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1469
1470 // A class has been prepared, i.e., resolved. As the ClassLoad event might have been for a
1471 // temporary class, provide both the former and the current class.
1472 virtual void ClassPrepare(Handle<mirror::Class> temp_klass,
1473 Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1474};
1475
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001476} // namespace art
1477
Brian Carlstromfc0e3212013-07-17 14:40:12 -07001478#endif // ART_RUNTIME_CLASS_LINKER_H_