blob: 70670d4a1f18e74d9f3e61770984ac1049a0c1e5 [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
Mathieu Chartierc5dd3192015-12-09 16:38:30 -080020#include <set>
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080021#include <string>
Alex Lighteb7c1442015-08-31 13:17:42 -070022#include <unordered_map>
Mathieu Chartierc5dd3192015-12-09 16:38:30 -080023#include <unordered_set>
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070024#include <utility>
25#include <vector>
26
Andreas Gampe542451c2016-07-26 09:02:02 -070027#include "base/enums.h"
Elliott Hughes76160052012-12-12 16:31:20 -080028#include "base/macros.h"
Elliott Hughes76b61672012-12-12 17:47:30 -080029#include "base/mutex.h"
David Sehr999646d2018-02-16 10:22:33 -080030#include "dex/dex_cache_resolved_classes.h"
David Sehr9e734c72018-01-04 17:56:19 -080031#include "dex/dex_file.h"
32#include "dex/dex_file_types.h"
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -070033#include "gc_root.h"
Andreas Gampe0f01b582017-01-18 15:22:37 -080034#include "handle.h"
Mathieu Chartier590fee92013-09-13 13:46:47 -070035#include "jni.h"
Vladimir Marko97d7e1c2016-10-04 14:44:28 +010036#include "mirror/class.h"
Andreas Gampe6d7abbd2017-04-24 13:19:09 -070037#include "verifier/verifier_enums.h"
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070038
39namespace art {
Mingyao Yang98d1cc82014-05-15 17:02:16 -070040
Ian Rogers1d54e732013-05-02 21:10:01 -070041namespace gc {
42namespace space {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080043class ImageSpace;
Ian Rogers1d54e732013-05-02 21:10:01 -070044} // namespace space
45} // namespace gc
Vladimir Marko74527972016-11-29 15:57:32 +000046
47namespace linker {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080048struct CompilationHelper;
49class ImageWriter;
50class OatWriter;
Vladimir Marko74527972016-11-29 15:57:32 +000051} // namespace linker
52
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080053namespace mirror {
Igor Murashkin2ffb7032017-11-08 13:35:21 -080054class ClassLoader;
55class DexCache;
56class DexCachePointerArray;
57class DexCacheMethodHandlesTest_Open_Test;
58class DexCacheTest_Open_Test;
59class IfTable;
60class MethodHandle;
61class MethodHandlesLookup;
62class MethodType;
63template<class T> class ObjectArray;
64class StackTraceElement;
65template <typename T> struct NativeDexCachePair;
66using MethodDexCachePair = NativeDexCachePair<ArtMethod>;
67using MethodDexCacheType = std::atomic<MethodDexCachePair>;
Ian Rogers33e95662013-05-20 20:29:14 -070068} // namespace mirror
Ian Rogers1d54e732013-05-02 21:10:01 -070069
Andreas Gampec1ac9ee2017-07-24 22:35:49 -070070class ClassHierarchyAnalysis;
Vladimir Markob5406092018-05-24 11:09:38 +010071enum class ClassRoot : uint32_t;
Andreas Gampe2af99022017-04-25 08:32:59 -070072class ClassTable;
Andreas Gampe5a4b8a22014-09-11 08:30:08 -070073template<class T> class Handle;
Vladimir Marko97d7e1c2016-10-04 14:44:28 +010074class ImtConflictTable;
75template<typename T> class LengthPrefixedArray;
Hiroshi Yamauchi679b1cf2015-05-21 12:05:27 -070076template<class T> class MutableHandle;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070077class InternTable;
Andreas Gamped482e732017-04-24 17:59:09 -070078class LinearAlloc;
Vladimir Marko1998cd02017-01-13 13:02:58 +000079class OatFile;
Mathieu Chartierc528dba2013-11-26 12:00:11 -080080template<class T> class ObjectLock;
Andreas Gampe7ba64962014-10-23 11:37:40 -070081class Runtime;
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -070082class ScopedObjectAccessAlreadyRunnable;
Mathieu Chartier2d2621a2014-10-23 16:48:06 -070083template<size_t kNumReferences> class PACKED(4) StackHandleScope;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070084
Mathieu Chartier893263b2014-03-04 11:07:42 -080085enum VisitRootFlags : uint8_t;
86
Mathieu Chartier1aa8ec22016-02-01 10:34:47 -080087class ClassVisitor {
88 public:
89 virtual ~ClassVisitor() {}
90 // Return true to continue visiting.
Mathieu Chartier28357fa2016-10-18 16:27:40 -070091 virtual bool operator()(ObjPtr<mirror::Class> klass) = 0;
Mathieu Chartier1aa8ec22016-02-01 10:34:47 -080092};
93
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -070094class ClassLoaderVisitor {
95 public:
96 virtual ~ClassLoaderVisitor() {}
Mathieu Chartier28357fa2016-10-18 16:27:40 -070097 virtual void Visit(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070098 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) = 0;
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -070099};
100
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700101class ClassLinker {
102 public:
Mathieu Chartier743aac32018-03-23 14:25:08 -0700103 static constexpr bool kAppImageMayContainStrings = false;
104
Mathieu Chartier590fee92013-09-13 13:46:47 -0700105 explicit ClassLinker(InternTable* intern_table);
Chang Xing605fe242017-07-20 15:57:21 -0700106 virtual ~ClassLinker();
Carl Shapiro565f5072011-07-10 13:39:43 -0700107
Alex Light64ad14d2014-08-19 14:23:13 -0700108 // Initialize class linker by bootstraping from dex files.
Andreas Gampe3db9c5d2015-11-17 11:52:46 -0800109 bool InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path,
110 std::string* error_msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700111 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800112 REQUIRES(!Locks::dex_lock_);
Mathieu Chartier590fee92013-09-13 13:46:47 -0700113
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800114 // Initialize class linker from one or more boot images.
115 bool InitFromBootImage(std::string* error_msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700116 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800117 REQUIRES(!Locks::dex_lock_);
Mathieu Chartier590fee92013-09-13 13:46:47 -0700118
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800119 // Add an image space to the class linker, may fix up classloader fields and dex cache fields.
120 // The dex files that were newly opened for the space are placed in the out argument
121 // out_dex_files. Returns true if the operation succeeded.
122 // The space must be already added to the heap before calling AddImageSpace since we need to
123 // properly handle read barriers and object marking.
124 bool AddImageSpace(gc::space::ImageSpace* space,
125 Handle<mirror::ClassLoader> class_loader,
126 jobjectArray dex_elements,
127 const char* dex_location,
128 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
129 std::string* error_msg)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800130 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700131 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800132
Mathieu Chartier0b4cbd02016-03-08 16:49:58 -0800133 bool OpenImageDexFiles(gc::space::ImageSpace* space,
134 std::vector<std::unique_ptr<const DexFile>>* out_dex_files,
135 std::string* error_msg)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800136 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700137 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier0b4cbd02016-03-08 16:49:58 -0800138
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700139 // Finds a class by its descriptor, loading it if necessary.
Brian Carlstrom74eb46a2011-08-02 20:10:14 -0700140 // If class_loader is null, searches boot_class_path_.
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700141 mirror::Class* FindClass(Thread* self,
142 const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700143 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700144 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800145 REQUIRES(!Locks::dex_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700146
Ian Rogers98379392014-02-24 16:53:16 -0800147 // Finds a class by its descriptor using the "system" class loader, ie by searching the
148 // boot_class_path_.
149 mirror::Class* FindSystemClass(Thread* self, const char* descriptor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700150 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800151 REQUIRES(!Locks::dex_lock_) {
152 return FindClass(self, descriptor, ScopedNullHandle<mirror::ClassLoader>());
153 }
Ian Rogers98379392014-02-24 16:53:16 -0800154
155 // Finds the array class given for the element class.
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700156 mirror::Class* FindArrayClass(Thread* self, ObjPtr<mirror::Class>* element_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700157 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800158 REQUIRES(!Locks::dex_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700159
Ian Rogers63557452014-06-04 16:57:15 -0700160 // Returns true if the class linker is initialized.
Ian Rogers7b078e82014-09-10 14:44:24 -0700161 bool IsInitialized() const {
162 return init_done_;
163 }
Mathieu Chartier590fee92013-09-13 13:46:47 -0700164
Brian Carlstromaded5f72011-10-07 17:15:04 -0700165 // Define a new a class based on a ClassDef from a DexFile
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700166 mirror::Class* DefineClass(Thread* self,
167 const char* descriptor,
168 size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700169 Handle<mirror::ClassLoader> class_loader,
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700170 const DexFile& dex_file,
171 const DexFile::ClassDef& dex_class_def)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700172 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800173 REQUIRES(!Locks::dex_lock_);
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700174
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700175 // Finds a class by its descriptor, returning null if it isn't wasn't loaded
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700176 // by the given 'class_loader'.
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700177 mirror::Class* LookupClass(Thread* self,
178 const char* descriptor,
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700179 ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier90443472015-07-16 20:32:27 -0700180 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampe2ff3b972017-06-05 18:14:53 -0700181 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700182
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800183 // Finds all the classes with the given descriptor, regardless of ClassLoader.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700184 void LookupClasses(const char* descriptor, std::vector<ObjPtr<mirror::Class>>& classes)
Mathieu Chartier90443472015-07-16 20:32:27 -0700185 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700186 REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800187
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700188 mirror::Class* FindPrimitiveClass(char type) REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -0700189
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700190 void DumpForSigQuit(std::ostream& os) REQUIRES(!Locks::classlinker_classes_lock_);
Elliott Hughescac6cc72011-11-03 20:31:21 -0700191
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700192 size_t NumLoadedClasses()
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700193 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700194 REQUIRES_SHARED(Locks::mutator_lock_);
Elliott Hughese27955c2011-08-26 15:21:24 -0700195
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000196 // Resolve a String with the given index from the DexFile associated with the given DexCache,
197 // storing the result in the DexCache.
198 ObjPtr<mirror::String> ResolveString(dex::StringIndex string_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000199 Handle<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700200 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700201
Vladimir Markoa64b52d2017-12-08 16:27:49 +0000202 // Find a String with the given index from the DexFile associated with the given DexCache,
203 // storing the result in the DexCache if found. Return null if not found.
204 ObjPtr<mirror::String> LookupString(dex::StringIndex string_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000205 ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700206 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocac5a7e2016-02-22 10:39:50 +0000207
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000208 // Resolve a Type with the given index from the DexFile associated with the given `referrer`,
209 // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
210 // and ClassLoader to use for resolution.
211 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ObjPtr<mirror::Class> referrer)
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_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700214
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000215 // Resolve a type with the given index from the DexFile associated with the given `referrer`,
216 // storing the result in the DexCache. The `referrer` is used to identify the target DexCache
217 // and ClassLoader to use for resolution.
Vladimir Marko28e012a2017-12-07 11:22:59 +0000218 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx, ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700219 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800220 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700221
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000222 // Resolve a type with the given index from the DexFile associated with the given DexCache
223 // and ClassLoader, storing the result in DexCache. The ClassLoader is used to search for
224 // the type, since it may be referenced from but not contained within the DexFile.
225 ObjPtr<mirror::Class> ResolveType(dex::TypeIndex type_idx,
Vladimir Marko28e012a2017-12-07 11:22:59 +0000226 Handle<mirror::DexCache> dex_cache,
227 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700228 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800229 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700230
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000231 // Look up a resolved type with the given index from the DexFile associated with the given
232 // `referrer`, storing the result in the DexCache. The `referrer` is used to identify the
233 // target DexCache and ClassLoader to use for lookup.
234 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
235 ObjPtr<mirror::Class> referrer)
236 REQUIRES_SHARED(Locks::mutator_lock_);
237
238 // Look up a resolved type with the given index from the DexFile associated with the given
239 // `referrer`, storing the result in the DexCache. The `referrer` is used to identify the
240 // target DexCache and ClassLoader to use for lookup.
241 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx, ArtMethod* referrer)
242 REQUIRES_SHARED(Locks::mutator_lock_);
243
244 // Look up a resolved type with the given index from the DexFile associated with the given
245 // DexCache and ClassLoader. The ClassLoader is used to search for the type, since it may
246 // be referenced from but not contained within the DexFile.
247 ObjPtr<mirror::Class> LookupResolvedType(dex::TypeIndex type_idx,
248 ObjPtr<mirror::DexCache> dex_cache,
249 ObjPtr<mirror::ClassLoader> class_loader)
250 REQUIRES_SHARED(Locks::mutator_lock_);
251
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800252 // Determine whether a dex cache result should be trusted, or an IncompatibleClassChangeError
Vladimir Markoba118822017-06-12 15:41:56 +0100253 // check and IllegalAccessError check should be performed even after a hit.
254 enum class ResolveMode { // private.
255 kNoChecks,
256 kCheckICCEAndIAE
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800257 };
258
Vladimir Marko07bfbac2017-07-06 14:55:02 +0100259 // Look up a previously resolved method with the given index.
260 ArtMethod* LookupResolvedMethod(uint32_t method_idx,
261 ObjPtr<mirror::DexCache> dex_cache,
262 ObjPtr<mirror::ClassLoader> class_loader)
263 REQUIRES_SHARED(Locks::mutator_lock_);
264
Nicolas Geoffrayea179f42018-02-08 22:30:18 +0000265 // Find a method with the given index from class `klass`, and update the dex cache.
266 ArtMethod* FindResolvedMethod(ObjPtr<mirror::Class> klass,
267 ObjPtr<mirror::DexCache> dex_cache,
268 ObjPtr<mirror::ClassLoader> class_loader,
269 uint32_t method_idx)
270 REQUIRES_SHARED(Locks::mutator_lock_);
271
David Brazdil54a99cf2018-04-05 16:57:32 +0100272 // Find a method using the wrong lookup mechanism. If `klass` is an interface,
273 // search for a class method. If it is a class, search for an interface method.
274 // This is useful when throwing IncompatibleClassChangeError.
275 ArtMethod* FindIncompatibleMethod(ObjPtr<mirror::Class> klass,
276 ObjPtr<mirror::DexCache> dex_cache,
277 ObjPtr<mirror::ClassLoader> class_loader,
278 uint32_t method_idx)
279 REQUIRES_SHARED(Locks::mutator_lock_);
280
Vladimir Marko89011192017-12-11 13:45:05 +0000281 // Resolve a method with a given ID from the DexFile associated with the given DexCache
282 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader are
283 // used as in ResolveType. What is unique is the method type argument which is used to
284 // determine if this method is a direct, static, or virtual method.
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800285 template <ResolveMode kResolveMode>
Vladimir Marko89011192017-12-11 13:45:05 +0000286 ArtMethod* ResolveMethod(uint32_t method_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700287 Handle<mirror::DexCache> dex_cache,
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700288 Handle<mirror::ClassLoader> class_loader,
289 ArtMethod* referrer,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700290 InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700291 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800292 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700293
Vladimir Markoba118822017-06-12 15:41:56 +0100294 template <InvokeType type, ResolveMode kResolveMode>
Mathieu Chartiere401d142015-04-22 13:56:20 -0700295 ArtMethod* GetResolvedMethod(uint32_t method_idx, ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700296 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightfedd91d2016-01-07 14:49:16 -0800297
Andreas Gampe42ef8ab2015-12-03 17:27:32 -0800298 template <ResolveMode kResolveMode>
Mathieu Chartiere401d142015-04-22 13:56:20 -0700299 ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, ArtMethod* referrer, InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700300 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800301 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Vladimir Marko89011192017-12-11 13:45:05 +0000302 ArtMethod* ResolveMethodWithoutInvokeType(uint32_t method_idx,
Jeff Hao0042c6d2015-07-29 20:14:10 -0700303 Handle<mirror::DexCache> dex_cache,
304 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700305 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800306 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom16192862011-09-12 17:50:06 -0700307
Vladimir Markof44d36c2017-03-14 14:18:46 +0000308 ArtField* LookupResolvedField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700309 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700310 ArtField* ResolveField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700311 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800312 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstromb9edb842011-08-28 16:31:06 -0700313
Vladimir Markoe11dd502017-12-08 14:09:45 +0000314 // Resolve a field with a given ID from the DexFile associated with the given DexCache
315 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
316 // are used as in ResolveType. What is unique is the is_static argument which is used
317 // to determine if we are resolving a static or non-static field.
318 ArtField* ResolveField(uint32_t field_idx,
Mathieu Chartier90443472015-07-16 20:32:27 -0700319 Handle<mirror::DexCache> dex_cache,
Vladimir Markoe11dd502017-12-08 14:09:45 +0000320 Handle<mirror::ClassLoader> class_loader,
321 bool is_static)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700322 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800323 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700324
Vladimir Markoe11dd502017-12-08 14:09:45 +0000325 // Resolve a field with a given ID from the DexFile associated with the given DexCache
326 // and ClassLoader, storing the result in DexCache. The ClassLinker and ClassLoader
327 // are used as in ResolveType. No is_static argument is provided so that Java
Ian Rogersb067ac22011-12-13 18:05:09 -0800328 // field resolution semantics are followed.
Vladimir Markoe11dd502017-12-08 14:09:45 +0000329 ArtField* ResolveFieldJLS(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700330 Handle<mirror::DexCache> dex_cache,
331 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700332 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800333 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogersb067ac22011-12-13 18:05:09 -0800334
David Brazdild5274382018-05-04 11:28:03 +0100335 // Find a field with a given ID from the DexFile associated with the given DexCache
336 // and ClassLoader, storing the result in DexCache. The declaring class is assumed
337 // to have been already resolved into `klass`. The `is_static` argument is used to
338 // determine if we are resolving a static or non-static field.
339 ArtField* FindResolvedField(ObjPtr<mirror::Class> klass,
340 ObjPtr<mirror::DexCache> dex_cache,
341 ObjPtr<mirror::ClassLoader> class_loader,
342 uint32_t field_idx,
343 bool is_static)
344 REQUIRES_SHARED(Locks::mutator_lock_);
345
346 // Find a field with a given ID from the DexFile associated with the given DexCache
347 // and ClassLoader, storing the result in DexCache. The declaring class is assumed
348 // to have been already resolved into `klass`. No is_static argument is provided
349 // so that Java field resolution semantics are followed.
350 ArtField* FindResolvedFieldJLS(ObjPtr<mirror::Class> klass,
351 ObjPtr<mirror::DexCache> dex_cache,
352 ObjPtr<mirror::ClassLoader> class_loader,
353 uint32_t field_idx)
354 REQUIRES_SHARED(Locks::mutator_lock_);
355
Vladimir Markoaf940202017-12-08 15:01:18 +0000356 // Resolve a method type with a given ID from the DexFile associated with a given DexCache
357 // and ClassLoader, storing the result in the DexCache.
358 ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
Orion Hodson16b2adf2018-05-14 08:53:38 +0100359 dex::ProtoIndex proto_idx,
Vladimir Markoaf940202017-12-08 15:01:18 +0000360 Handle<mirror::DexCache> dex_cache,
361 Handle<mirror::ClassLoader> class_loader)
Narayan Kamath25352fc2016-08-03 12:46:58 +0100362 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800363 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Ian Rogersad25ac52011-10-04 19:13:33 -0700364
Vladimir Markoaf940202017-12-08 15:01:18 +0000365 ObjPtr<mirror::MethodType> ResolveMethodType(Thread* self,
Orion Hodson16b2adf2018-05-14 08:53:38 +0100366 dex::ProtoIndex proto_idx,
Vladimir Markoaf940202017-12-08 15:01:18 +0000367 ArtMethod* referrer)
Orion Hodson2e599942017-09-22 16:17:41 +0100368 REQUIRES_SHARED(Locks::mutator_lock_);
369
Orion Hodsonc069a302017-01-18 09:23:12 +0000370 // Resolve a method handle with a given ID from the DexFile. The
371 // result is not cached in the DexCache as the instance will only be
372 // used once in most circumstances.
Vladimir Markoaf940202017-12-08 15:01:18 +0000373 ObjPtr<mirror::MethodHandle> ResolveMethodHandle(Thread* self,
374 uint32_t method_handle_idx,
375 ArtMethod* referrer)
Orion Hodsonc069a302017-01-18 09:23:12 +0000376 REQUIRES_SHARED(Locks::mutator_lock_);
377
Elliott Hughesf4c21c92011-08-19 17:31:31 -0700378 // Returns true on success, false if there's an exception pending.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700379 // can_run_clinit=false allows the compiler to attempt to init a class,
380 // given the restriction that no <clinit> execution is possible.
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700381 bool EnsureInitialized(Thread* self,
382 Handle<mirror::Class> c,
383 bool can_init_fields,
Ian Rogers7b078e82014-09-10 14:44:24 -0700384 bool can_init_parents)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700385 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800386 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700387
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700388 // Initializes classes that have instances in the image but that have
389 // <clinit> methods so they could not be initialized by the compiler.
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700390 void RunRootClinits()
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700391 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800392 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700393
Alex Light07f06212017-06-01 14:01:43 -0700394 // Directly register an already existing dex cache. RegisterDexFile should be preferred since that
395 // reduplicates DexCaches when possible. The DexCache given to this function must already be fully
396 // initialized and not already registered.
397 void RegisterExistingDexCache(ObjPtr<mirror::DexCache> cache,
398 ObjPtr<mirror::ClassLoader> class_loader)
399 REQUIRES(!Locks::dex_lock_)
400 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocd556b02017-02-03 11:47:34 +0000401 ObjPtr<mirror::DexCache> RegisterDexFile(const DexFile& dex_file,
402 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800403 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700404 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700405
Brian Carlstrom8a487412011-08-29 20:08:52 -0700406 const std::vector<const DexFile*>& GetBootClassPath() {
407 return boot_class_path_;
408 }
409
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700410 void VisitClasses(ClassVisitor* visitor)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700411 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700412 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -0700413
414 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
415 // so that it can visit individual classes without holding the doesn't hold the
416 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
417 // can race with insertion and deletion of classes while the visitor is being called.
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700418 void VisitClassesWithoutClassesLock(ClassVisitor* visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700419 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800420 REQUIRES(!Locks::dex_lock_);
Elliott Hughesa2155262011-11-16 16:26:58 -0800421
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700422 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
Andreas Gamped98b4ed2016-11-04 20:27:24 -0700423 REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700424 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700425 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800426 REQUIRES(!Locks::dex_lock_, !Locks::classlinker_classes_lock_, !Locks::trace_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700427 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700428
Vladimir Markocd556b02017-02-03 11:47:34 +0000429 bool IsDexFileRegistered(Thread* self, const DexFile& dex_file)
430 REQUIRES(!Locks::dex_lock_)
431 REQUIRES_SHARED(Locks::mutator_lock_);
432 ObjPtr<mirror::DexCache> FindDexCache(Thread* self, const DexFile& dex_file)
433 REQUIRES(!Locks::dex_lock_)
434 REQUIRES_SHARED(Locks::mutator_lock_);
435 ClassTable* FindClassTable(Thread* self, ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800436 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700437 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom1d9f52b2011-10-13 10:50:45 -0700438
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700439 LengthPrefixedArray<ArtField>* AllocArtFieldArray(Thread* self,
440 LinearAlloc* allocator,
441 size_t length);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800442
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700443 LengthPrefixedArray<ArtMethod>* AllocArtMethodArray(Thread* self,
444 LinearAlloc* allocator,
445 size_t length);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700446
447 mirror::PointerArray* AllocPointerArray(Thread* self, size_t length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700448 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700449 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800450
451 mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700452 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700453 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800454
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700455 mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
456 size_t length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700457 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700458 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800459
Andreas Gampe6d7abbd2017-04-24 13:19:09 -0700460 verifier::FailureKind VerifyClass(
Nicolas Geoffray08025182016-10-25 17:20:18 +0100461 Thread* self,
462 Handle<mirror::Class> klass,
463 verifier::HardFailLogMode log_level = verifier::HardFailLogMode::kLogNone)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700464 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800465 REQUIRES(!Locks::dex_lock_);
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700466 bool VerifyClassUsingOatFile(const DexFile& dex_file,
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700467 ObjPtr<mirror::Class> klass,
Vladimir Marko2c64a832018-01-04 11:31:56 +0000468 ClassStatus& oat_file_class_status)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700469 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800470 REQUIRES(!Locks::dex_lock_);
Alex Light5a559862016-01-29 12:24:48 -0800471 void ResolveClassExceptionHandlerTypes(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700472 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800473 REQUIRES(!Locks::dex_lock_);
Alex Light5a559862016-01-29 12:24:48 -0800474 void ResolveMethodExceptionHandlerTypes(ArtMethod* klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700475 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800476 REQUIRES(!Locks::dex_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800477
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700478 mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa,
479 jstring name,
480 jobjectArray interfaces,
481 jobject loader,
482 jobjectArray methods,
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -0700483 jobjectArray throws)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700484 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700485 std::string GetDescriptorForProxy(ObjPtr<mirror::Class> proxy_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700486 REQUIRES_SHARED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400487
Alex Lightfc49fec2018-01-16 22:28:36 +0000488 // Get the oat code for a method when its class isn't yet initialized.
489 const void* GetQuickOatCodeFor(ArtMethod* method)
490 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800491
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700492 pid_t GetClassesLockOwner(); // For SignalCatcher.
493 pid_t GetDexLockOwner(); // For SignalCatcher.
Brian Carlstrom24a3c2e2011-10-17 18:07:52 -0700494
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700495 // Is the given entry point quick code to run the resolution stub?
496 bool IsQuickResolutionStub(const void* entry_point) const;
Jeff Hao88474b42013-10-23 16:24:40 -0700497
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700498 // Is the given entry point quick code to bridge into the interpreter?
499 bool IsQuickToInterpreterBridge(const void* entry_point) const;
500
501 // Is the given entry point quick code to run the generic JNI stub?
502 bool IsQuickGenericJniStub(const void* entry_point) const;
Vladimir Marko8a630572014-04-09 18:45:35 +0100503
David Sehra49e0532017-08-25 08:05:29 -0700504 // Is the given entry point the JNI dlsym lookup stub?
505 bool IsJniDlsymLookupStub(const void* entry_point) const;
506
Vladimir Marko97d7e1c2016-10-04 14:44:28 +0100507 const void* GetQuickToInterpreterBridgeTrampoline() const {
508 return quick_to_interpreter_bridge_trampoline_;
509 }
510
Jeff Hao88474b42013-10-23 16:24:40 -0700511 InternTable* GetInternTable() const {
512 return intern_table_;
513 }
514
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700515 // Set the entrypoints up for method to the enter the interpreter.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700516 void SetEntryPointsToInterpreter(ArtMethod* method) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700517 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700518
Alex Lightdb01a092017-04-03 15:39:55 -0700519 // Set the entrypoints up for an obsolete method.
520 void SetEntryPointsForObsoleteMethod(ArtMethod* method) const
521 REQUIRES_SHARED(Locks::mutator_lock_);
522
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700523 // Attempts to insert a class into a class table. Returns null if
Ian Rogers848871b2013-08-05 10:56:33 -0700524 // the class was inserted, otherwise returns an existing class with
525 // the same descriptor and ClassLoader.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700526 mirror::Class* InsertClass(const char* descriptor, ObjPtr<mirror::Class> klass, size_t hash)
Mathieu Chartier90443472015-07-16 20:32:27 -0700527 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700528 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers848871b2013-08-05 10:56:33 -0700529
Vladimir Marko1998cd02017-01-13 13:02:58 +0000530 // Add an oat file with .bss GC roots to be visited again at the end of GC
531 // for collector types that need it.
532 void WriteBarrierForBootOatFileBssRoots(const OatFile* oat_file)
533 REQUIRES(!Locks::classlinker_classes_lock_)
534 REQUIRES_SHARED(Locks::mutator_lock_);
535
Vladimir Markob5406092018-05-24 11:09:38 +0100536 template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700537 mirror::ObjectArray<mirror::Class>* GetClassRoots() REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Markob5406092018-05-24 11:09:38 +0100538 mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read<kReadBarrierOption>();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700539 DCHECK(class_roots != nullptr);
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700540 return class_roots;
541 }
542
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800543 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
544 // that no more classes are ever added to the pre zygote table which makes it that the pages
545 // always remain shared dirty instead of private dirty.
546 void MoveClassTableToPreZygote()
Mathieu Chartier90443472015-07-16 20:32:27 -0700547 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700548 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800549
Calin Juravle7865ac72017-06-28 11:03:12 -0700550 // Creates a GlobalRef PathClassLoader or DelegateLastClassLoader (specified by loader_class)
551 // that can be used to load classes from the given dex files. The parent of the class loader
552 // will be set to `parent_loader`. If `parent_loader` is null the parent will be
553 // the boot class loader.
554 // If class_loader points to a different class than PathClassLoader or DelegateLastClassLoader
555 // this method will abort.
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700556 // 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 -0700557 jobject CreateWellKnownClassLoader(Thread* self,
558 const std::vector<const DexFile*>& dex_files,
559 jclass loader_class,
560 jobject parent_loader)
561 REQUIRES_SHARED(Locks::mutator_lock_)
562 REQUIRES(!Locks::dex_lock_);
563
564 // Calls CreateWellKnownClassLoader(self,
565 // dex_files,
566 // WellKnownClasses::dalvik_system_PathClassLoader,
567 // nullptr)
Jeff Haof0192c82016-03-28 20:39:50 -0700568 jobject CreatePathClassLoader(Thread* self, const std::vector<const DexFile*>& dex_files)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700569 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800570 REQUIRES(!Locks::dex_lock_);
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700571
Andreas Gampe542451c2016-07-26 09:02:02 -0700572 PointerSize GetImagePointerSize() const {
Mathieu Chartiere401d142015-04-22 13:56:20 -0700573 return image_pointer_size_;
574 }
575
576 // Used by image writer for checking.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700577 bool ClassInClassTable(ObjPtr<mirror::Class> klass)
Mathieu Chartier673ed3d2015-08-28 14:56:43 -0700578 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700579 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiera89d7ed2014-12-05 10:57:13 -0800580
Andreas Gampe8ac75952015-06-02 21:01:45 -0700581 // Clear the ArrayClass cache. This is necessary when cleaning up for the image, as the cache
582 // entries are roots, but potentially not image classes.
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700583 void DropFindArrayClassCache() REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe8ac75952015-06-02 21:01:45 -0700584
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700585 // Clean up class loaders, this needs to happen after JNI weak globals are cleared.
586 void CleanupClassLoaders()
Mathieu Chartier00310e02015-10-17 12:46:42 -0700587 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700588 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700589
Mathieu Chartier32cc9ee2015-10-15 09:19:15 -0700590 // Unlike GetOrCreateAllocatorForClassLoader, GetAllocatorForClassLoader asserts that the
591 // allocator for this class loader is already created.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700592 LinearAlloc* GetAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700593 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700594
Mathieu Chartierd57d4542015-10-14 10:55:30 -0700595 // Return the linear alloc for a class loader if it is already allocated, otherwise allocate and
596 // set it. TODO: Consider using a lock other than classlinker_classes_lock_.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700597 LinearAlloc* GetOrCreateAllocatorForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier00310e02015-10-17 12:46:42 -0700598 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700599 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier00310e02015-10-17 12:46:42 -0700600
Mathieu Chartier6d25cf62016-04-12 16:54:48 -0700601 // May be called with null class_loader due to legacy code. b/27954959
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700602 void InsertDexFileInToClassLoader(ObjPtr<mirror::Object> dex_file,
603 ObjPtr<mirror::ClassLoader> class_loader)
Mathieu Chartier00310e02015-10-17 12:46:42 -0700604 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700605 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierd57d4542015-10-14 10:55:30 -0700606
Tamas Berghammerdd5e5e92016-02-12 16:29:00 +0000607 static bool ShouldUseInterpreterEntrypoint(ArtMethod* method, const void* quick_code)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700608 REQUIRES_SHARED(Locks::mutator_lock_);
Tamas Berghammerdd5e5e92016-02-12 16:29:00 +0000609
Mathieu Chartierc5dd3192015-12-09 16:38:30 -0800610 std::set<DexCacheResolvedClasses> GetResolvedClasses(bool ignore_boot_classes)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800611 REQUIRES(!Locks::dex_lock_);
Mathieu Chartierc5dd3192015-12-09 16:38:30 -0800612
Jeff Haof0192c82016-03-28 20:39:50 -0700613 static bool IsBootClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700614 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700615 REQUIRES_SHARED(Locks::mutator_lock_);
Jeff Haof0192c82016-03-28 20:39:50 -0700616
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700617 ArtMethod* AddMethodToConflictTable(ObjPtr<mirror::Class> klass,
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -0700618 ArtMethod* conflict_method,
619 ArtMethod* interface_method,
620 ArtMethod* method,
621 bool force_new_conflict_method)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700622 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -0700623
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700624 // Create a conflict table with a specified capacity.
625 ImtConflictTable* CreateImtConflictTable(size_t count, LinearAlloc* linear_alloc);
626
627 // Static version for when the class linker is not yet created.
628 static ImtConflictTable* CreateImtConflictTable(size_t count,
629 LinearAlloc* linear_alloc,
Andreas Gampe542451c2016-07-26 09:02:02 -0700630 PointerSize pointer_size);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700631
632
633 // Create the IMT and conflict tables for a class.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700634 void FillIMTAndConflictTables(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700635
Mathieu Chartier72041a02017-07-14 18:23:25 -0700636 // Visit all of the class tables. This is used by dex2oat to allow pruning dex caches.
637 template <class Visitor>
638 void VisitClassTables(const Visitor& visitor)
Mathieu Chartier696632e2016-06-03 17:47:32 -0700639 REQUIRES(!Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700640 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere42888f2016-04-14 10:49:19 -0700641
Jeff Haoc92a7a12016-06-06 11:09:20 -0700642 // Throw the class initialization failure recorded when first trying to initialize the given
643 // class.
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700644 void ThrowEarlierClassFailure(ObjPtr<mirror::Class> c, bool wrap_in_no_class_def = false)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700645 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800646 REQUIRES(!Locks::dex_lock_);
Jeff Haoc92a7a12016-06-06 11:09:20 -0700647
Mathieu Chartier65975772016-08-05 10:46:36 -0700648 // Get the actual holding class for a copied method. Pretty slow, don't call often.
649 mirror::Class* GetHoldingClassOfCopiedMethod(ArtMethod* method)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700650 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier65975772016-08-05 10:46:36 -0700651
Andreas Gampe70f16392017-01-16 14:20:10 -0800652 // Returns null if not found.
Andreas Gampe2af99022017-04-25 08:32:59 -0700653 // This returns a pointer to the class-table, without requiring any locking - including the
654 // boot class-table. It is the caller's responsibility to access this under lock, if required.
Andreas Gampe70f16392017-01-16 14:20:10 -0800655 ClassTable* ClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampe2af99022017-04-25 08:32:59 -0700656 REQUIRES_SHARED(Locks::mutator_lock_)
657 NO_THREAD_SAFETY_ANALYSIS;
Andreas Gampe70f16392017-01-16 14:20:10 -0800658
Andreas Gampece7732b2017-01-17 15:50:26 -0800659 void AppendToBootClassPath(Thread* self, const DexFile& dex_file)
660 REQUIRES_SHARED(Locks::mutator_lock_)
661 REQUIRES(!Locks::dex_lock_);
662
Mathieu Chartier06bed302017-07-13 13:23:18 -0700663 // Visit all of the class loaders in the class linker.
664 void VisitClassLoaders(ClassLoaderVisitor* visitor) const
665 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
666
Jeff Hao0cb17282017-07-12 14:51:49 -0700667 // Checks that a class and its superclass from another class loader have the same virtual methods.
668 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
669 REQUIRES_SHARED(Locks::mutator_lock_);
670
Andreas Gampec1ac9ee2017-07-24 22:35:49 -0700671 ClassHierarchyAnalysis* GetClassHierarchyAnalysis() {
672 return cha_.get();
673 }
674
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800675 struct DexCacheData {
Vladimir Markocd556b02017-02-03 11:47:34 +0000676 // Construct an invalid data object.
677 DexCacheData()
678 : weak_root(nullptr),
679 dex_file(nullptr),
Vladimir Markocd556b02017-02-03 11:47:34 +0000680 class_table(nullptr) { }
681
682 // Check if the data is valid.
683 bool IsValid() const {
684 return dex_file != nullptr;
685 }
686
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800687 // Weak root to the DexCache. Note: Do not decode this unnecessarily or else class unloading may
688 // not work properly.
689 jweak weak_root;
Vladimir Markod1ee20f2017-08-17 09:21:16 +0000690 // The following field caches the DexCache's field here to avoid unnecessary jweak decode that
691 // triggers read barriers (and marks them alive unnecessarily and messes with class unloading.)
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800692 const DexFile* dex_file;
Vladimir Markocd556b02017-02-03 11:47:34 +0000693 // Identify the associated class loader's class table. This is used to make sure that
694 // the Java call to native DexCache.setResolvedType() inserts the resolved type in that
695 // class table. It is also used to make sure we don't register the same dex cache with
696 // multiple class loaders.
697 ClassTable* class_table;
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -0800698 };
699
Chang Xing605fe242017-07-20 15:57:21 -0700700 protected:
701 virtual bool InitializeClass(Thread* self,
702 Handle<mirror::Class> klass,
703 bool can_run_clinit,
704 bool can_init_parents)
705 REQUIRES_SHARED(Locks::mutator_lock_)
706 REQUIRES(!Locks::dex_lock_);
707
Mathieu Chartier9e050df2017-08-09 10:05:47 -0700708 virtual verifier::FailureKind PerformClassVerification(Thread* self,
709 Handle<mirror::Class> klass,
710 verifier::HardFailLogMode log_level,
711 std::string* error_msg)
712 REQUIRES_SHARED(Locks::mutator_lock_);
713
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700714 private:
Vladimir Marko921094a2017-01-12 18:37:06 +0000715 class LinkInterfaceMethodsHelper;
716
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700717 struct ClassLoaderData {
Mathieu Chartierc3fcd412015-09-25 16:54:59 -0700718 jweak weak_root; // Weak root to enable class unloading.
Mathieu Chartier951ec2c2015-09-22 08:50:05 -0700719 ClassTable* class_table;
720 LinearAlloc* allocator;
721 };
722
Alex Lightf1f10492015-10-07 16:08:36 -0700723 // Ensures that the supertype of 'klass' ('supertype') is verified. Returns false and throws
724 // appropriate exceptions if verification failed hard. Returns true for successful verification or
725 // soft-failures.
726 bool AttemptSupertypeVerification(Thread* self,
727 Handle<mirror::Class> klass,
728 Handle<mirror::Class> supertype)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800729 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700730 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightf1f10492015-10-07 16:08:36 -0700731
Alexey Grebenkinab2ce842018-02-01 19:09:59 +0300732 void DeleteClassLoader(Thread* self, const ClassLoaderData& data, bool cleanup_cha)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700733 REQUIRES_SHARED(Locks::mutator_lock_);
Nicolas Geoffray1dad3f62015-10-23 14:59:54 +0100734
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700735 void VisitClassesInternal(ClassVisitor* visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700736 REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700737
738 // Returns the number of zygote and image classes.
Mathieu Chartier6b069532015-08-05 15:08:12 -0700739 size_t NumZygoteClasses() const
740 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700741 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700742
743 // Returns the number of non zygote nor image classes.
Mathieu Chartier6b069532015-08-05 15:08:12 -0700744 size_t NumNonZygoteClasses() const
745 REQUIRES(Locks::classlinker_classes_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700746 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700747
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700748 void FinishInit(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700749 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800750 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700751
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700752 // For early bootstrapping by Init
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700753 mirror::Class* AllocClass(Thread* self,
754 ObjPtr<mirror::Class> java_lang_Class,
755 uint32_t class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700756 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700757 REQUIRES(!Roles::uninterruptible_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700758
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800759 // Alloc* convenience functions to avoid needing to pass in mirror::Class*
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700760 // values that are known to the ClassLinker such as
761 // kObjectArrayClass and kJavaLangString etc.
Ian Rogers6fac4472014-02-25 17:01:10 -0800762 mirror::Class* AllocClass(Thread* self, uint32_t class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700763 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700764 REQUIRES(!Roles::uninterruptible_);
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700765
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700766 mirror::DexCache* AllocDexCache(ObjPtr<mirror::String>* out_location,
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700767 Thread* self,
768 const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700769 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700770 REQUIRES(!Roles::uninterruptible_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700771
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700772 // Used for tests and AppendToBootClassPath.
773 mirror::DexCache* AllocAndInitializeDexCache(Thread* self,
774 const DexFile& dex_file,
775 LinearAlloc* linear_alloc)
776 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800777 REQUIRES(!Locks::dex_lock_)
Mathieu Chartier6c60d842016-09-15 10:24:43 -0700778 REQUIRES(!Roles::uninterruptible_);
779
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800780 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700781 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700782 REQUIRES(!Roles::uninterruptible_);
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700783 mirror::Class* InitializePrimitiveClass(ObjPtr<mirror::Class> primitive_class,
784 Primitive::Type type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700785 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700786 REQUIRES(!Roles::uninterruptible_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700787
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700788 mirror::Class* CreateArrayClass(Thread* self,
789 const char* descriptor,
790 size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700791 Handle<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700792 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800793 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700794
Vladimir Markocd556b02017-02-03 11:47:34 +0000795 void AppendToBootClassPath(const DexFile& dex_file, ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700796 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800797 REQUIRES(!Locks::dex_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700798
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700799 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
800 // sufficient to hold all static fields.
801 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
802 const DexFile::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700803
Mathieu Chartierc7853442015-03-27 14:35:38 -0700804 // Setup the classloader, class def index, type idx so that we can insert this class in the class
805 // table.
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700806 void SetupClass(const DexFile& dex_file,
807 const DexFile::ClassDef& dex_class_def,
808 Handle<mirror::Class> klass,
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700809 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700810 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700811
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700812 void LoadClass(Thread* self,
813 const DexFile& dex_file,
814 const DexFile::ClassDef& dex_class_def,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700815 Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700816 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700817 void LoadClassMembers(Thread* self,
818 const DexFile& dex_file,
819 const uint8_t* class_data,
Vladimir Marko97d7e1c2016-10-04 14:44:28 +0100820 Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700821 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700822
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700823 void LoadField(const ClassDataItemIterator& it, Handle<mirror::Class> klass, ArtField* dst)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700824 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700825
Mathieu Chartier268764d2016-09-13 12:09:38 -0700826 void LoadMethod(const DexFile& dex_file,
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700827 const ClassDataItemIterator& it,
Igor Murashkinb1d8c312015-08-04 11:18:43 -0700828 Handle<mirror::Class> klass, ArtMethod* dst)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700829 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700830
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700831 void FixupStaticTrampolines(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800832
Nicolas Geoffray7d8d8ff2016-11-02 12:38:05 +0000833 // Finds a class in a Path- or DexClassLoader, loading it if necessary without using JNI. Hash
Andreas Gampe34ee6842014-12-02 15:43:52 -0800834 // function is supposed to be ComputeModifiedUtf8Hash(descriptor). Returns true if the
835 // class-loader chain could be handled, false otherwise, i.e., a non-supported class-loader
836 // was encountered while walking the parent chain (currently only BootClassLoader and
837 // PathClassLoader are supported).
Nicolas Geoffray7d8d8ff2016-11-02 12:38:05 +0000838 bool FindClassInBaseDexClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
839 Thread* self,
840 const char* descriptor,
841 size_t hash,
842 Handle<mirror::ClassLoader> class_loader,
843 ObjPtr<mirror::Class>* result)
Andreas Gampe34ee6842014-12-02 15:43:52 -0800844 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800845 REQUIRES(!Locks::dex_lock_);
Andreas Gampe34ee6842014-12-02 15:43:52 -0800846
Calin Juravle415dc3d2017-06-28 11:03:12 -0700847 // Finds the class in the classpath of the given class loader. It only searches the class loader
848 // dex files and does not recurse into its parent.
849 // The method checks that the provided class loader is either a PathClassLoader or a
850 // DexClassLoader.
851 // If the class is found the method returns the resolved class. Otherwise it returns null.
852 ObjPtr<mirror::Class> FindClassInBaseDexClassLoaderClassPath(
853 ScopedObjectAccessAlreadyRunnable& soa,
854 const char* descriptor,
855 size_t hash,
856 Handle<mirror::ClassLoader> class_loader)
857 REQUIRES_SHARED(Locks::mutator_lock_)
858 REQUIRES(!Locks::dex_lock_);
859
860 // Finds the class in the boot class loader.
861 // If the class is found the method returns the resolved class. Otherwise it returns null.
862 ObjPtr<mirror::Class> FindClassInBootClassLoaderClassPath(Thread* self,
863 const char* descriptor,
864 size_t hash)
865 REQUIRES_SHARED(Locks::mutator_lock_)
866 REQUIRES(!Locks::dex_lock_);
867
Vladimir Marko666ee3d2017-12-11 18:37:36 +0000868 // Implementation of LookupResolvedType() called when the type was not found in the dex cache.
869 ObjPtr<mirror::Class> DoLookupResolvedType(dex::TypeIndex type_idx,
870 ObjPtr<mirror::DexCache> dex_cache,
871 ObjPtr<mirror::ClassLoader> class_loader)
872 REQUIRES_SHARED(Locks::mutator_lock_);
873
874 // Implementation of ResolveType() called when the type was not found in the dex cache.
875 ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx,
876 Handle<mirror::DexCache> dex_cache,
877 Handle<mirror::ClassLoader> class_loader)
878 REQUIRES_SHARED(Locks::mutator_lock_)
879 REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_);
880
Andreas Gampe34ee6842014-12-02 15:43:52 -0800881 // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
882 // by the given 'class_loader'. Uses the provided hash for the descriptor.
883 mirror::Class* LookupClass(Thread* self,
884 const char* descriptor,
885 size_t hash,
886 ObjPtr<mirror::ClassLoader> class_loader)
887 REQUIRES(!Locks::classlinker_classes_lock_)
888 REQUIRES_SHARED(Locks::mutator_lock_);
889
Vladimir Markof44d36c2017-03-14 14:18:46 +0000890 // Find a field by its field index.
891 ArtField* LookupResolvedField(uint32_t field_idx,
892 ObjPtr<mirror::DexCache> dex_cache,
893 ObjPtr<mirror::ClassLoader> class_loader,
894 bool is_static)
895 REQUIRES_SHARED(Locks::mutator_lock_);
896
Vladimir Markocd556b02017-02-03 11:47:34 +0000897 void RegisterDexFileLocked(const DexFile& dex_file,
898 ObjPtr<mirror::DexCache> dex_cache,
899 ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800900 REQUIRES(Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700901 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocd556b02017-02-03 11:47:34 +0000902 DexCacheData FindDexCacheDataLocked(const DexFile& dex_file)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800903 REQUIRES(Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700904 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Markocd556b02017-02-03 11:47:34 +0000905 static ObjPtr<mirror::DexCache> DecodeDexCache(Thread* self, const DexCacheData& data)
906 REQUIRES_SHARED(Locks::mutator_lock_);
907 // Called to ensure that the dex cache has been registered with the same class loader.
908 // If yes, returns the dex cache, otherwise throws InternalError and returns null.
909 ObjPtr<mirror::DexCache> EnsureSameClassLoader(Thread* self,
910 ObjPtr<mirror::DexCache> dex_cache,
911 const DexCacheData& data,
912 ObjPtr<mirror::ClassLoader> class_loader)
913 REQUIRES(!Locks::dex_lock_)
914 REQUIRES_SHARED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700915
Alex Lighteb7c1442015-08-31 13:17:42 -0700916 bool InitializeDefaultInterfaceRecursive(Thread* self,
917 Handle<mirror::Class> klass,
918 bool can_run_clinit,
919 bool can_init_parents)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800920 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700921 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700922 bool WaitForInitializeClass(Handle<mirror::Class> klass,
923 Thread* self,
Igor Murashkinb1d8c312015-08-04 11:18:43 -0700924 ObjectLock<mirror::Class>& lock);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700925
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700926 bool IsSameDescriptorInDifferentClassContexts(Thread* self,
927 const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700928 Handle<mirror::ClassLoader> class_loader1,
929 Handle<mirror::ClassLoader> class_loader2)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700930 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700931
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700932 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self,
933 ArtMethod* method,
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700934 ObjPtr<mirror::Class> klass1,
935 ObjPtr<mirror::Class> klass2)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700936 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700937
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700938 bool LinkClass(Thread* self,
939 const char* descriptor,
940 Handle<mirror::Class> klass,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700941 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Igor Murashkinb1d8c312015-08-04 11:18:43 -0700942 MutableHandle<mirror::Class>* h_new_class_out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700943 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -0700944 REQUIRES(!Locks::classlinker_classes_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700945
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700946 bool LinkSuperClass(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700947 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700948
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700949 bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700950 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -0800951 REQUIRES(!Locks::dex_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700952
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -0700953 bool LinkMethods(Thread* self,
954 Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700955 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +0000956 bool* out_new_conflict,
Igor Murashkinb1d8c312015-08-04 11:18:43 -0700957 ArtMethod** out_imt)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700958 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700959
Orion Hodsonf8db2c32017-07-07 20:07:12 +0100960 mirror::MethodHandle* ResolveMethodHandleForField(Thread* self,
961 const DexFile::MethodHandleItem& method_handle,
962 ArtMethod* referrer)
963 REQUIRES_SHARED(Locks::mutator_lock_);
964
965 mirror::MethodHandle* ResolveMethodHandleForMethod(Thread* self,
Orion Hodsonf8db2c32017-07-07 20:07:12 +0100966 const DexFile::MethodHandleItem& method_handle,
967 ArtMethod* referrer)
968 REQUIRES_SHARED(Locks::mutator_lock_);
969
Alex Light9139e002015-10-09 15:59:48 -0700970 // A wrapper class representing the result of a method translation used for linking methods and
971 // updating superclass default methods. For each method in a classes vtable there are 4 states it
972 // could be in:
973 // 1) No translation is necessary. In this case there is no MethodTranslation object for it. This
974 // is the standard case and is true when the method is not overridable by a default method,
975 // the class defines a concrete implementation of the method, the default method implementation
976 // remains the same, or an abstract method stayed abstract.
977 // 2) The method must be translated to a different default method. We note this with
978 // CreateTranslatedMethod.
979 // 3) The method must be replaced with a conflict method. This happens when a superclass
980 // implements an interface with a default method and this class implements an unrelated
981 // interface that also defines that default method. We note this with CreateConflictingMethod.
982 // 4) The method must be replaced with an abstract miranda method. This happens when a superclass
983 // implements an interface with a default method and this class implements a subinterface of
984 // the superclass's interface which declares the default method abstract. We note this with
985 // CreateAbstractMethod.
986 //
987 // When a method translation is unnecessary (case #1), we don't put it into the
988 // default_translation maps. So an instance of MethodTranslation must be in one of #2-#4.
989 class MethodTranslation {
990 public:
991 // This slot must become a default conflict method.
992 static MethodTranslation CreateConflictingMethod() {
993 return MethodTranslation(Type::kConflict, /*translation*/nullptr);
994 }
995
996 // This slot must become an abstract method.
997 static MethodTranslation CreateAbstractMethod() {
998 return MethodTranslation(Type::kAbstract, /*translation*/nullptr);
999 }
1000
1001 // Use the given method as the current value for this vtable slot during translation.
1002 static MethodTranslation CreateTranslatedMethod(ArtMethod* new_method) {
1003 return MethodTranslation(Type::kTranslation, new_method);
1004 }
1005
1006 // Returns true if this is a method that must become a conflict method.
1007 bool IsInConflict() const {
1008 return type_ == Type::kConflict;
1009 }
1010
1011 // Returns true if this is a method that must become an abstract method.
1012 bool IsAbstract() const {
1013 return type_ == Type::kAbstract;
1014 }
1015
1016 // Returns true if this is a method that must become a different method.
1017 bool IsTranslation() const {
1018 return type_ == Type::kTranslation;
1019 }
1020
1021 // Get the translated version of this method.
1022 ArtMethod* GetTranslation() const {
1023 DCHECK(IsTranslation());
1024 DCHECK(translation_ != nullptr);
1025 return translation_;
1026 }
1027
1028 private:
1029 enum class Type {
1030 kTranslation,
1031 kConflict,
1032 kAbstract,
1033 };
1034
1035 MethodTranslation(Type type, ArtMethod* translation)
1036 : translation_(translation), type_(type) {}
1037
1038 ArtMethod* const translation_;
1039 const Type type_;
1040 };
1041
Alex Lighteb7c1442015-08-31 13:17:42 -07001042 // Links the virtual methods for the given class and records any default methods that will need to
1043 // be updated later.
1044 //
1045 // Arguments:
1046 // * self - The current thread.
1047 // * klass - class, whose vtable will be filled in.
1048 // * default_translations - Vtable index to new method map.
1049 // Any vtable entries that need to be updated with new default methods
1050 // are stored into the default_translations map. The default_translations
1051 // map is keyed on the vtable index that needs to be updated. We use this
1052 // map because if we override a default method with another default
1053 // method we need to update the vtable to point to the new method.
1054 // Unfortunately since we copy the ArtMethod* we cannot just do a simple
1055 // scan, we therefore store the vtable index's that might need to be
1056 // updated with the method they will turn into.
1057 // TODO This whole default_translations thing is very dirty. There should be a better way.
Alex Light9139e002015-10-09 15:59:48 -07001058 bool LinkVirtualMethods(
1059 Thread* self,
1060 Handle<mirror::Class> klass,
1061 /*out*/std::unordered_map<size_t, MethodTranslation>* default_translations)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001062 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001063
Alex Lighteb7c1442015-08-31 13:17:42 -07001064 // Sets up the interface lookup table (IFTable) in the correct order to allow searching for
1065 // default methods.
1066 bool SetupInterfaceLookupTable(Thread* self,
1067 Handle<mirror::Class> klass,
1068 Handle<mirror::ObjectArray<mirror::Class>> interfaces)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001069 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighteb7c1442015-08-31 13:17:42 -07001070
Alex Light9139e002015-10-09 15:59:48 -07001071
1072 enum class DefaultMethodSearchResult {
1073 kDefaultFound,
1074 kAbstractFound,
1075 kDefaultConflict
1076 };
1077
Alex Lighteb7c1442015-08-31 13:17:42 -07001078 // Find the default method implementation for 'interface_method' in 'klass', if one exists.
1079 //
1080 // Arguments:
1081 // * self - The current thread.
1082 // * target_method - The method we are trying to find a default implementation for.
1083 // * klass - The class we are searching for a definition of target_method.
1084 // * out_default_method - The pointer we will store the found default method to on success.
Alex Lighteb7c1442015-08-31 13:17:42 -07001085 //
1086 // Return value:
Alex Light9139e002015-10-09 15:59:48 -07001087 // * kDefaultFound - There were no conflicting method implementations found in the class while
1088 // searching for target_method. The default method implementation is stored into
1089 // out_default_method.
1090 // * kAbstractFound - There were no conflicting method implementations found in the class while
1091 // searching for target_method but no default implementation was found either.
1092 // out_default_method is set to null and the method should be considered not
1093 // implemented.
1094 // * kDefaultConflict - Conflicting method implementations were found when searching for
1095 // target_method. The value of *out_default_method is null.
1096 DefaultMethodSearchResult FindDefaultMethodImplementation(
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001097 Thread* self,
1098 ArtMethod* target_method,
1099 Handle<mirror::Class> klass,
1100 /*out*/ArtMethod** out_default_method) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001101 REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighteb7c1442015-08-31 13:17:42 -07001102
1103 // Sets the imt entries and fixes up the vtable for the given class by linking all the interface
1104 // methods. See LinkVirtualMethods for an explanation of what default_translations is.
Alex Light9139e002015-10-09 15:59:48 -07001105 bool LinkInterfaceMethods(
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001106 Thread* self,
1107 Handle<mirror::Class> klass,
1108 const std::unordered_map<size_t, MethodTranslation>& default_translations,
1109 bool* out_new_conflict,
1110 ArtMethod** out_imt)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001111 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001112
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001113 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001114 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001115 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001116 REQUIRES_SHARED(Locks::mutator_lock_);
Igor Murashkinb1d8c312015-08-04 11:18:43 -07001117 bool LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_static, size_t* class_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001118 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -07001119 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001120 REQUIRES_SHARED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001121
Mathieu Chartiere401d142015-04-22 13:56:20 -07001122 void CheckProxyConstructor(ArtMethod* constructor) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001123 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001124 void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001125 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001126
Andreas Gampecc1b5352016-12-01 16:58:38 -08001127 size_t GetDexCacheCount() REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -07001128 return dex_caches_.size();
1129 }
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -08001130 const std::list<DexCacheData>& GetDexCachesData()
Andreas Gampecc1b5352016-12-01 16:58:38 -08001131 REQUIRES_SHARED(Locks::mutator_lock_, Locks::dex_lock_) {
Mathieu Chartier673ed3d2015-08-28 14:56:43 -07001132 return dex_caches_;
1133 }
Brian Carlstrom58ae9412011-10-04 00:56:06 -07001134
Mathieu Chartiere401d142015-04-22 13:56:20 -07001135 void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001136 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001137 void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001138 REQUIRES_SHARED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -04001139
Mathieu Chartier5b830502016-03-02 10:30:23 -08001140 // Register a class loader and create its class table and allocator. Should not be called if
1141 // these are already created.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001142 void RegisterClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001143 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier5b830502016-03-02 10:30:23 -08001144 REQUIRES(Locks::classlinker_classes_lock_);
1145
Nicolas Geoffray3a090922015-11-24 09:17:30 +00001146 // Insert a new class table if not found.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001147 ClassTable* InsertClassTableForClassLoader(ObjPtr<mirror::ClassLoader> class_loader)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001148 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001149 REQUIRES(Locks::classlinker_classes_lock_);
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001150
Ian Rogersdbf3be02014-08-29 15:40:08 -07001151 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
1152 // before returning it to the caller. Its the responsibility of the thread that placed the class
1153 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
1154 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
1155 // retire a class, the version of the class in the table is returned and this may differ from
1156 // the class passed in.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001157 mirror::Class* EnsureResolved(Thread* self, const char* descriptor, ObjPtr<mirror::Class> klass)
Mathieu Chartierc77f3ab2015-09-03 19:41:50 -07001158 WARN_UNUSED
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001159 REQUIRES_SHARED(Locks::mutator_lock_)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001160 REQUIRES(!Locks::dex_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -07001161
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001162 void FixupTemporaryDeclaringClass(ObjPtr<mirror::Class> temp_class,
1163 ObjPtr<mirror::Class> new_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001164 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -07001165
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001166 void SetClassRoot(ClassRoot class_root, ObjPtr<mirror::Class> klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001167 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001168
1169 // Return the quick generic JNI stub for testing.
1170 const void* GetRuntimeQuickGenericJniStub() const;
1171
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001172 bool CanWeInitializeClass(ObjPtr<mirror::Class> klass,
1173 bool can_init_statics,
1174 bool can_init_parents)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001175 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001176
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001177 void UpdateClassMethods(ObjPtr<mirror::Class> klass,
Alex Lighte64300b2015-12-15 15:02:47 -08001178 LengthPrefixedArray<ArtMethod>* new_methods)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001179 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier54d220e2015-07-30 16:20:06 -07001180 REQUIRES(!Locks::classlinker_classes_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001181
Andreas Gampe7ba5a672016-02-04 21:45:01 -08001182 // Check that c1 == FindSystemClass(self, descriptor). Abort with class dumps otherwise.
1183 void CheckSystemClass(Thread* self, Handle<mirror::Class> c1, const char* descriptor)
Andreas Gampecc1b5352016-12-01 16:58:38 -08001184 REQUIRES(!Locks::dex_lock_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001185 REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe7ba5a672016-02-04 21:45:01 -08001186
Vladimir Marko921094a2017-01-12 18:37:06 +00001187 // Allocate method arrays for interfaces.
1188 bool AllocateIfTableMethodArrays(Thread* self,
1189 Handle<mirror::Class> klass,
1190 Handle<mirror::IfTable> iftable)
1191 REQUIRES_SHARED(Locks::mutator_lock_);
1192
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001193 // Sets imt_ref appropriately for LinkInterfaceMethods.
1194 // If there is no method in the imt location of imt_ref it will store the given method there.
1195 // Otherwise it will set the conflict method which will figure out which method to use during
1196 // runtime.
1197 void SetIMTRef(ArtMethod* unimplemented_method,
1198 ArtMethod* imt_conflict_method,
1199 ArtMethod* current_method,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001200 /*out*/bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001201 /*out*/ArtMethod** imt_ref) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001202
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001203 void FillIMTFromIfTable(ObjPtr<mirror::IfTable> if_table,
Mathieu Chartiere42888f2016-04-14 10:49:19 -07001204 ArtMethod* unimplemented_method,
1205 ArtMethod* imt_conflict_method,
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001206 ObjPtr<mirror::Class> klass,
Mathieu Chartiere42888f2016-04-14 10:49:19 -07001207 bool create_conflict_tables,
1208 bool ignore_copied_methods,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001209 /*out*/bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001210 /*out*/ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001211
1212 void FillImtFromSuperClass(Handle<mirror::Class> klass,
1213 ArtMethod* unimplemented_method,
1214 ArtMethod* imt_conflict_method,
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00001215 bool* new_conflict,
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001216 ArtMethod** imt) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier7f98c9a2016-04-14 10:49:19 -07001217
Vladimir Markoba118822017-06-12 15:41:56 +01001218 // Check invoke type against the referenced class. Throws IncompatibleClassChangeError
1219 // (if `kThrowOnError`) and returns true on mismatch (kInterface on a non-interface class,
1220 // kVirtual on interface, kDefault on interface for dex files not supporting default methods),
1221 // otherwise returns false.
1222 template <bool kThrowOnError, typename ClassGetter>
1223 static bool CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_cache,
1224 InvokeType type,
1225 ClassGetter class_getter)
1226 REQUIRES_SHARED(Locks::mutator_lock_);
1227 // Helper that feeds the above function with `ClassGetter` doing `LookupResolvedType()`.
1228 template <bool kThrow>
1229 bool CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_cache,
1230 InvokeType type,
1231 uint32_t method_idx,
1232 ObjPtr<mirror::ClassLoader> class_loader)
1233 REQUIRES_SHARED(Locks::mutator_lock_);
1234
Brian Carlstrom4a96b602011-07-26 16:40:23 -07001235 std::vector<const DexFile*> boot_class_path_;
Mathieu Chartierfbc31082016-01-24 11:59:56 -08001236 std::vector<std::unique_ptr<const DexFile>> boot_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07001237
Hiroshi Yamauchi04302db2015-11-11 23:45:34 -08001238 // JNI weak globals and side data to allow dex caches to get unloaded. We lazily delete weak
1239 // globals when we register new dex files.
Andreas Gampecc1b5352016-12-01 16:58:38 -08001240 std::list<DexCacheData> dex_caches_ GUARDED_BY(Locks::dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -07001241
Mathieu Chartier9b1c71e2015-09-02 18:51:54 -07001242 // This contains the class loaders which have class tables. It is populated by
Mathieu Chartier951ec2c2015-09-22 08:50:05 -07001243 // InsertClassTableForClassLoader.
1244 std::list<ClassLoaderData> class_loaders_
Mathieu Chartier6b069532015-08-05 15:08:12 -07001245 GUARDED_BY(Locks::classlinker_classes_lock_);
1246
1247 // Boot class path table. Since the class loader for this is null.
Andreas Gampe2af99022017-04-25 08:32:59 -07001248 std::unique_ptr<ClassTable> boot_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001249
Mathieu Chartiercc5ebdf2015-07-27 11:19:43 -07001250 // New class roots, only used by CMS since the GC needs to mark these in the pause.
1251 std::vector<GcRoot<mirror::Class>> new_class_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -07001252
Vladimir Marko1998cd02017-01-13 13:02:58 +00001253 // Boot image oat files with new .bss GC roots to be visited in the pause by CMS.
1254 std::vector<const OatFile*> new_bss_roots_boot_oat_files_
1255 GUARDED_BY(Locks::classlinker_classes_lock_);
1256
Ian Rogers7dfb28c2013-08-22 08:18:36 -07001257 // Number of times we've searched dex caches for a class. After a certain number of misses we move
1258 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -07001259 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -07001260
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001261 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001262 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -07001263
Ian Rogers98379392014-02-24 16:53:16 -08001264 // The interface table used by all arrays.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001265 GcRoot<mirror::IfTable> array_iftable_;
Carl Shapiro565f5072011-07-10 13:39:43 -07001266
Ian Rogers98379392014-02-24 16:53:16 -08001267 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
1268 // descriptors for the sake of performing FindClass.
1269 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -07001270 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -08001271 size_t find_array_class_cache_next_victim_;
1272
Brian Carlstrom75cb3b42011-07-28 02:13:36 -07001273 bool init_done_;
Vladimir Marko1998cd02017-01-13 13:02:58 +00001274 bool log_new_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -07001275
Elliott Hughescf4c6c42011-09-01 15:16:42 -07001276 InternTable* intern_table_;
1277
Mingyao Yang98d1cc82014-05-15 17:02:16 -07001278 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
1279 // patch point within the image. TODO: make these proper relocations.
Jeff Hao0aba0ba2013-06-03 14:49:28 -07001280 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -07001281 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -08001282 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +01001283 const void* quick_to_interpreter_bridge_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -07001284
Mathieu Chartier2d721012014-11-10 11:08:06 -08001285 // Image pointer size.
Andreas Gampe542451c2016-07-26 09:02:02 -07001286 PointerSize image_pointer_size_;
Mathieu Chartier2d721012014-11-10 11:08:06 -08001287
Andreas Gampec1ac9ee2017-07-24 22:35:49 -07001288 std::unique_ptr<ClassHierarchyAnalysis> cha_;
1289
Mathieu Chartier65975772016-08-05 10:46:36 -07001290 class FindVirtualMethodHolderVisitor;
Andreas Gampe2af99022017-04-25 08:32:59 -07001291
1292 friend class AppImageClassLoadersAndDexCachesHelper;
Mathieu Chartierf9c6fc62015-10-07 11:44:05 -07001293 friend class ImageDumper; // for DexLock
Vladimir Marko74527972016-11-29 15:57:32 +00001294 friend struct linker::CompilationHelper; // For Compile in ImageTest.
1295 friend class linker::ImageWriter; // for GetClassRoots
1296 friend class linker::OatWriter; // for boot image string/class table slot address lookup.
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001297 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Andreas Gampe5f4a09a2015-09-28 13:16:33 -07001298 friend class JniInternalTest; // for GetRuntimeQuickGenericJniStub
Andreas Gampe2af99022017-04-25 08:32:59 -07001299 friend class VMClassLoader; // for LookupClass and FindClassInBaseDexClassLoader.
Mathieu Chartier76172162016-01-26 14:54:06 -08001300 ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName); // for DexLock, and RegisterDexFileLocked
Narayan Kamath25352fc2016-08-03 12:46:58 +01001301 ART_FRIEND_TEST(mirror::DexCacheMethodHandlesTest, Open); // for AllocDexCache
Ian Rogers6f3dbba2014-10-14 17:41:57 -07001302 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001303 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
1304};
1305
Andreas Gampe0f01b582017-01-18 15:22:37 -08001306class ClassLoadCallback {
1307 public:
1308 virtual ~ClassLoadCallback() {}
1309
Alex Lightb0f11922017-01-23 14:25:17 -08001310 // If set we will replace initial_class_def & initial_dex_file with the final versions. The
1311 // callback author is responsible for ensuring these are allocated in such a way they can be
1312 // cleaned up if another transformation occurs. Note that both must be set or null/unchanged on
1313 // return.
1314 // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1315 // different object. It is the listener's responsibility to handle this.
1316 // Note: This callback is rarely useful so a default implementation has been given that does
1317 // nothing.
1318 virtual void ClassPreDefine(const char* descriptor ATTRIBUTE_UNUSED,
1319 Handle<mirror::Class> klass ATTRIBUTE_UNUSED,
1320 Handle<mirror::ClassLoader> class_loader ATTRIBUTE_UNUSED,
1321 const DexFile& initial_dex_file ATTRIBUTE_UNUSED,
1322 const DexFile::ClassDef& initial_class_def ATTRIBUTE_UNUSED,
1323 /*out*/DexFile const** final_dex_file ATTRIBUTE_UNUSED,
Alex Light4b0cedf2017-01-24 11:15:20 -08001324 /*out*/DexFile::ClassDef const** final_class_def ATTRIBUTE_UNUSED)
Alex Lightb0f11922017-01-23 14:25:17 -08001325 REQUIRES_SHARED(Locks::mutator_lock_) {}
1326
Andreas Gampe0f01b582017-01-18 15:22:37 -08001327 // A class has been loaded.
1328 // Note: the class may be temporary, in which case a following ClassPrepare event will be a
1329 // different object. It is the listener's responsibility to handle this.
1330 virtual void ClassLoad(Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1331
1332 // A class has been prepared, i.e., resolved. As the ClassLoad event might have been for a
1333 // temporary class, provide both the former and the current class.
1334 virtual void ClassPrepare(Handle<mirror::Class> temp_klass,
1335 Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_) = 0;
1336};
1337
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001338} // namespace art
1339
Brian Carlstromfc0e3212013-07-17 14:40:12 -07001340#endif // ART_RUNTIME_CLASS_LINKER_H_