blob: 95c8aa0244f94071ac69fe9af90e8c1d5e8e2095 [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
Fred Shih37f05ef2014-07-16 18:38:08 -070020#include <deque>
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080021#include <string>
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070022#include <utility>
23#include <vector>
24
Mathieu Chartierbad02672014-08-25 13:08:22 -070025#include "base/allocator.h"
Mathieu Chartierc2e20622014-11-03 11:41:47 -080026#include "base/hash_set.h"
Elliott Hughes76160052012-12-12 16:31:20 -080027#include "base/macros.h"
Elliott Hughes76b61672012-12-12 17:47:30 -080028#include "base/mutex.h"
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070029#include "dex_file.h"
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -070030#include "gc_root.h"
Mathieu Chartier590fee92013-09-13 13:46:47 -070031#include "jni.h"
Brian Carlstrom58ae9412011-10-04 00:56:06 -070032#include "oat_file.h"
Mathieu Chartier83c8ee02014-01-28 14:50:23 -080033#include "object_callbacks.h"
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070034
35namespace art {
Mingyao Yang98d1cc82014-05-15 17:02:16 -070036
Ian Rogers1d54e732013-05-02 21:10:01 -070037namespace gc {
38namespace space {
39 class ImageSpace;
40} // namespace space
41} // namespace gc
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080042namespace mirror {
Ian Rogers33e95662013-05-20 20:29:14 -070043 class ClassLoader;
44 class DexCache;
45 class DexCacheTest_Open_Test;
46 class IfTable;
47 template<class T> class ObjectArray;
48 class StackTraceElement;
49} // namespace mirror
Ian Rogers1d54e732013-05-02 21:10:01 -070050
Andreas Gampe5a4b8a22014-09-11 08:30:08 -070051template<class T> class Handle;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070052class InternTable;
Mathieu Chartierc528dba2013-11-26 12:00:11 -080053template<class T> class ObjectLock;
Andreas Gampe7ba64962014-10-23 11:37:40 -070054class Runtime;
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -070055class ScopedObjectAccessAlreadyRunnable;
Mathieu Chartier2d2621a2014-10-23 16:48:06 -070056template<size_t kNumReferences> class PACKED(4) StackHandleScope;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070057
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080058typedef bool (ClassVisitor)(mirror::Class* c, void* arg);
Elliott Hughesa2155262011-11-16 16:26:58 -080059
Mathieu Chartier893263b2014-03-04 11:07:42 -080060enum VisitRootFlags : uint8_t;
61
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070062class ClassLinker {
63 public:
Ian Rogers6f3dbba2014-10-14 17:41:57 -070064 // Well known mirror::Class roots accessed via GetClassRoot.
65 enum ClassRoot {
66 kJavaLangClass,
67 kJavaLangObject,
68 kClassArrayClass,
69 kObjectArrayClass,
70 kJavaLangString,
71 kJavaLangDexCache,
72 kJavaLangRefReference,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070073 kJavaLangReflectArtMethod,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070074 kJavaLangReflectConstructor,
Mathieu Chartierdaaf3262015-03-24 13:30:28 -070075 kJavaLangReflectField,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070076 kJavaLangReflectMethod,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070077 kJavaLangReflectProxy,
78 kJavaLangStringArrayClass,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070079 kJavaLangReflectArtMethodArrayClass,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070080 kJavaLangReflectConstructorArrayClass,
Mathieu Chartierdaaf3262015-03-24 13:30:28 -070081 kJavaLangReflectFieldArrayClass,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070082 kJavaLangReflectMethodArrayClass,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070083 kJavaLangClassLoader,
84 kJavaLangThrowable,
85 kJavaLangClassNotFoundException,
86 kJavaLangStackTraceElement,
87 kPrimitiveBoolean,
88 kPrimitiveByte,
89 kPrimitiveChar,
90 kPrimitiveDouble,
91 kPrimitiveFloat,
92 kPrimitiveInt,
93 kPrimitiveLong,
94 kPrimitiveShort,
95 kPrimitiveVoid,
96 kBooleanArrayClass,
97 kByteArrayClass,
98 kCharArrayClass,
99 kDoubleArrayClass,
100 kFloatArrayClass,
101 kIntArrayClass,
102 kLongArrayClass,
103 kShortArrayClass,
104 kJavaLangStackTraceElementArrayClass,
105 kClassRootsMax,
106 };
107
Mathieu Chartier590fee92013-09-13 13:46:47 -0700108 explicit ClassLinker(InternTable* intern_table);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700109 ~ClassLinker();
Carl Shapiro565f5072011-07-10 13:39:43 -0700110
Alex Light64ad14d2014-08-19 14:23:13 -0700111 // Initialize class linker by bootstraping from dex files.
Richard Uhlerfbef44d2014-12-23 09:48:51 -0800112 void InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path)
Mathieu Chartier590fee92013-09-13 13:46:47 -0700113 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
114
115 // Initialize class linker from one or more images.
116 void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
117
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700118 // Finds a class by its descriptor, loading it if necessary.
Brian Carlstrom74eb46a2011-08-02 20:10:14 -0700119 // If class_loader is null, searches boot_class_path_.
Ian Rogers98379392014-02-24 16:53:16 -0800120 mirror::Class* FindClass(Thread* self, const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700121 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700122 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700123
Andreas Gampef865ea92015-04-13 22:14:19 -0700124 // Finds a class in the path class loader, loading it if necessary without using JNI. Hash
125 // function is supposed to be ComputeModifiedUtf8Hash(descriptor). Returns true if the
126 // class-loader chain could be handled, false otherwise, i.e., a non-supported class-loader
127 // was encountered while walking the parent chain (currently only BootClassLoader and
128 // PathClassLoader are supported).
129 bool FindClassInPathClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
130 Thread* self, const char* descriptor, size_t hash,
131 Handle<mirror::ClassLoader> class_loader,
132 mirror::Class** result)
Mathieu Chartierab0ed822014-09-11 14:21:41 -0700133 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
134
Ian Rogers98379392014-02-24 16:53:16 -0800135 // Finds a class by its descriptor using the "system" class loader, ie by searching the
136 // boot_class_path_.
137 mirror::Class* FindSystemClass(Thread* self, const char* descriptor)
138 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
139
140 // Finds the array class given for the element class.
Mathieu Chartierb74cd292014-05-29 14:31:33 -0700141 mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700142 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700143
Ian Rogers63557452014-06-04 16:57:15 -0700144 // Returns true if the class linker is initialized.
Ian Rogers7b078e82014-09-10 14:44:24 -0700145 bool IsInitialized() const {
146 return init_done_;
147 }
Mathieu Chartier590fee92013-09-13 13:46:47 -0700148
Brian Carlstromaded5f72011-10-07 17:15:04 -0700149 // Define a new a class based on a ClassDef from a DexFile
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800150 mirror::Class* DefineClass(Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700151 Handle<mirror::ClassLoader> class_loader,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800152 const DexFile& dex_file, const DexFile::ClassDef& dex_class_def)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700153 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700154
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700155 // Finds a class by its descriptor, returning null if it isn't wasn't loaded
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700156 // by the given 'class_loader'.
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800157 mirror::Class* LookupClass(Thread* self, const char* descriptor, size_t hash,
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800158 mirror::ClassLoader* class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700159 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
160 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700161
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800162 // Finds all the classes with the given descriptor, regardless of ClassLoader.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800163 void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700164 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
165 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800166
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800167 mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -0700168
Brian Carlstromae826982011-11-09 01:33:42 -0800169 // General class unloading is not supported, this is used to prune
170 // unwanted classes during image writing.
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800171 bool RemoveClass(const char* descriptor, mirror::ClassLoader* class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700172 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
173 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromae826982011-11-09 01:33:42 -0800174
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700175 void DumpAllClasses(int flags)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700176 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
177 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes9d5ccec2011-09-19 13:19:50 -0700178
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700179 void DumpForSigQuit(std::ostream& os)
Ian Rogers7b078e82014-09-10 14:44:24 -0700180 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
Elliott Hughescac6cc72011-11-03 20:31:21 -0700181
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700182 size_t NumLoadedClasses()
183 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
184 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughese27955c2011-08-26 15:21:24 -0700185
Brian Carlstromb63ec392011-08-27 17:38:27 -0700186 // Resolve a String with the given index from the DexFile, storing the
Brian Carlstromaded5f72011-10-07 17:15:04 -0700187 // result in the DexCache. The referrer is used to identify the
188 // target DexCache and ClassLoader to use for resolution.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800189 mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800190 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700191
192 // Resolve a String with the given index from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700193 // result in the DexCache.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800194 mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700195 Handle<mirror::DexCache> dex_cache)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700196 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700197
Brian Carlstromb63ec392011-08-27 17:38:27 -0700198 // Resolve a Type with the given index from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700199 // result in the DexCache. The referrer is used to identity the
200 // target DexCache and ClassLoader to use for resolution.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800201 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer)
Mathieu Chartier590fee92013-09-13 13:46:47 -0700202 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700203
Brian Carlstromb63ec392011-08-27 17:38:27 -0700204 // Resolve a Type with the given index from the DexFile, storing the
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700205 // result in the DexCache. The referrer is used to identify the
Brian Carlstromb63ec392011-08-27 17:38:27 -0700206 // target DexCache and ClassLoader to use for resolution.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800207 mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800208 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700209
Mathieu Chartierc7853442015-03-27 14:35:38 -0700210 mirror::Class* ResolveType(uint16_t type_idx, ArtField* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800211 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromb63ec392011-08-27 17:38:27 -0700212
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700213 // Resolve a type with the given ID from the DexFile, storing the
214 // result in DexCache. The ClassLoader is used to search for the
215 // type, since it may be referenced from but not contained within
216 // the given DexFile.
Mathieu Chartier590fee92013-09-13 13:46:47 -0700217 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700218 Handle<mirror::DexCache> dex_cache,
219 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700220 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700221
222 // Resolve a method with a given ID from the DexFile, storing the
223 // result in DexCache. The ClassLinker and ClassLoader are used as
224 // in ResolveType. What is unique is the method type argument which
225 // is used to determine if this method is a direct, static, or
226 // virtual method.
Brian Carlstromea46f952013-07-30 01:26:50 -0700227 mirror::ArtMethod* ResolveMethod(const DexFile& dex_file,
228 uint32_t method_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700229 Handle<mirror::DexCache> dex_cache,
230 Handle<mirror::ClassLoader> class_loader,
231 Handle<mirror::ArtMethod> referrer,
Brian Carlstromea46f952013-07-30 01:26:50 -0700232 InvokeType type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700233 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700234
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700235 mirror::ArtMethod* GetResolvedMethod(uint32_t method_idx, mirror::ArtMethod* referrer)
Mathieu Chartier0cd81352014-05-22 16:48:55 -0700236 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
237 mirror::ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, mirror::ArtMethod** referrer,
Brian Carlstromea46f952013-07-30 01:26:50 -0700238 InvokeType type)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800239 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom16192862011-09-12 17:50:06 -0700240
Mathieu Chartierc7853442015-03-27 14:35:38 -0700241 ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class)
Mathieu Chartier0cd81352014-05-22 16:48:55 -0700242 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700243 ArtField* GetResolvedField(uint32_t field_idx, mirror::DexCache* dex_cache)
244 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
245 ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer, bool is_static)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800246 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromb9edb842011-08-28 16:31:06 -0700247
Brian Carlstrom16192862011-09-12 17:50:06 -0700248 // Resolve a field with a given ID from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700249 // result in DexCache. The ClassLinker and ClassLoader are used as
250 // in ResolveType. What is unique is the is_static argument which is
251 // used to determine if we are resolving a static or non-static
252 // field.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700253 ArtField* ResolveField(const DexFile& dex_file,
Brian Carlstromea46f952013-07-30 01:26:50 -0700254 uint32_t field_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700255 Handle<mirror::DexCache> dex_cache,
256 Handle<mirror::ClassLoader> class_loader,
Brian Carlstromea46f952013-07-30 01:26:50 -0700257 bool is_static)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700258 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700259
Ian Rogersb067ac22011-12-13 18:05:09 -0800260 // Resolve a field with a given ID from the DexFile, storing the
261 // result in DexCache. The ClassLinker and ClassLoader are used as
262 // in ResolveType. No is_static argument is provided so that Java
263 // field resolution semantics are followed.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700264 ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700265 Handle<mirror::DexCache> dex_cache,
266 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700267 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersb067ac22011-12-13 18:05:09 -0800268
Ian Rogersad25ac52011-10-04 19:13:33 -0700269 // Get shorty from method index without resolution. Used to do handlerization.
Brian Carlstromea46f952013-07-30 01:26:50 -0700270 const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700271 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersad25ac52011-10-04 19:13:33 -0700272
Elliott Hughesf4c21c92011-08-19 17:31:31 -0700273 // Returns true on success, false if there's an exception pending.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700274 // can_run_clinit=false allows the compiler to attempt to init a class,
275 // given the restriction that no <clinit> execution is possible.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700276 bool EnsureInitialized(Thread* self, Handle<mirror::Class> c, bool can_init_fields,
Ian Rogers7b078e82014-09-10 14:44:24 -0700277 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700278 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700279
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700280 // Initializes classes that have instances in the image but that have
281 // <clinit> methods so they could not be initialized by the compiler.
Ian Rogersb726dcb2012-09-05 08:57:23 -0700282 void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700283
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 void RegisterDexFile(const DexFile& dex_file)
285 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700286 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700287 void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700288 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700289 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700290
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700291 const OatFile* RegisterOatFile(const OatFile* oat_file)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700292 LOCKS_EXCLUDED(dex_lock_);
Brian Carlstrom866c8622012-01-06 16:35:13 -0800293
Brian Carlstrom8a487412011-08-29 20:08:52 -0700294 const std::vector<const DexFile*>& GetBootClassPath() {
295 return boot_class_path_;
296 }
297
Sebastien Hertz0de11332015-05-13 12:14:05 +0200298 // Returns the first non-image oat file in the class path.
299 const OatFile* GetPrimaryOatFile()
300 LOCKS_EXCLUDED(dex_lock_);
301
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700302 void VisitClasses(ClassVisitor* visitor, void* arg)
Ian Rogersdbf3be02014-08-29 15:40:08 -0700303 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700304 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -0700305
306 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
307 // so that it can visit individual classes without holding the doesn't hold the
308 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
309 // can race with insertion and deletion of classes while the visitor is being called.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700310 void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg)
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700311 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughesa2155262011-11-16 16:26:58 -0800312
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700313 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700314 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
315 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700316 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700317 LOCKS_EXCLUDED(dex_lock_)
318 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700319
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700320 mirror::DexCache* FindDexCache(const DexFile& dex_file)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700321 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700322 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700323 bool IsDexFileRegistered(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700324 LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700325 void FixupDexCaches(mirror::ArtMethod* resolution_method)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700326 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700327 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom1d9f52b2011-10-13 10:50:45 -0700328
Richard Uhler66d874d2015-01-15 09:37:19 -0800329 // Finds or creates the oat file holding dex_location. Then loads and returns
330 // all corresponding dex files (there may be more than one dex file loaded
331 // in the case of multidex).
332 // This may return the original, unquickened dex files if the oat file could
333 // not be generated.
334 //
335 // Returns an empty vector if the dex files could not be loaded. In this
336 // case, there will be at least one error message returned describing why no
337 // dex files could not be loaded. The 'error_msgs' argument must not be
338 // null, regardless of whether there is an error or not.
339 //
340 // This method should not be called with the mutator_lock_ held, because it
341 // could end up starving GC if we need to generate or relocate any oat
342 // files.
343 std::vector<std::unique_ptr<const DexFile>> OpenDexFilesFromOat(
344 const char* dex_location, const char* oat_location,
345 std::vector<std::string>* error_msgs)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700346 LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
jeffhaof6174e82012-01-31 16:14:17 -0800347
Ian Rogersc0542af2014-09-03 16:16:56 -0700348 // Allocate an instance of a java.lang.Object.
349 mirror::Object* AllocObject(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
350
Elliott Hughes418d20f2011-09-22 14:00:39 -0700351 // TODO: replace this with multiple methods that allocate the correct managed type.
Shih-wei Liao44175362011-08-28 16:59:17 -0700352 template <class T>
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800353 mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700354 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Shih-wei Liao55df06b2011-08-26 14:39:27 -0700355
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800356 mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700357 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
jeffhao98eacac2011-09-14 16:11:53 -0700358
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800359 mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700360 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800361
Brian Carlstromea46f952013-07-30 01:26:50 -0700362 mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800363 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
364
365 mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
366 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
367
Mathieu Chartierc7853442015-03-27 14:35:38 -0700368 ArtField* AllocArtFieldArray(Thread* self, size_t length)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800369 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
370
371 mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
372 size_t length)
373 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
374
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700375 void VerifyClass(Thread* self, Handle<mirror::Class> klass)
Ian Rogers7b078e82014-09-10 14:44:24 -0700376 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800377 bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
378 mirror::Class::Status& oat_file_class_status)
379 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800380 void ResolveClassExceptionHandlerTypes(const DexFile& dex_file,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700381 Handle<mirror::Class> klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800382 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromea46f952013-07-30 01:26:50 -0700383 void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800384 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
385
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -0700386 mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name,
387 jobjectArray interfaces, jobject loader, jobjectArray methods,
388 jobjectArray throws)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800389 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800390 std::string GetDescriptorForProxy(mirror::Class* proxy_class)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800391 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800392 mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class,
393 mirror::ArtMethod* proxy_method)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700394 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700395 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400396
Ian Rogers19846512012-02-24 11:42:47 -0800397 // Get the oat code for a method when its class isn't yet initialized
Ian Rogersef7d42f2014-01-06 12:55:46 -0800398 const void* GetQuickOatCodeFor(mirror::ArtMethod* method)
399 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800400
Mathieu Chartiere35517a2012-10-30 18:49:55 -0700401 // Get the oat code for a method from a method index.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800402 const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx)
403 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere35517a2012-10-30 18:49:55 -0700404
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700405 // Get compiled code for a method, return null if no code
406 // exists. This is unlike Get..OatCodeFor which will return a bridge
407 // or interpreter entrypoint.
408 const void* GetOatMethodQuickCodeFor(mirror::ArtMethod* method)
409 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700410
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700411 pid_t GetClassesLockOwner(); // For SignalCatcher.
412 pid_t GetDexLockOwner(); // For SignalCatcher.
Brian Carlstrom24a3c2e2011-10-17 18:07:52 -0700413
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700414 mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700415
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700416 static const char* GetClassRootDescriptor(ClassRoot class_root);
Andreas Gampe2da88232014-02-27 12:26:20 -0800417
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700418 // Is the given entry point quick code to run the resolution stub?
419 bool IsQuickResolutionStub(const void* entry_point) const;
Jeff Hao88474b42013-10-23 16:24:40 -0700420
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700421 // Is the given entry point quick code to bridge into the interpreter?
422 bool IsQuickToInterpreterBridge(const void* entry_point) const;
423
424 // Is the given entry point quick code to run the generic JNI stub?
425 bool IsQuickGenericJniStub(const void* entry_point) const;
Vladimir Marko8a630572014-04-09 18:45:35 +0100426
Jeff Hao88474b42013-10-23 16:24:40 -0700427 InternTable* GetInternTable() const {
428 return intern_table_;
429 }
430
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700431 // Set the entrypoints up for method to the given code.
Elliott Hughes956af0f2014-12-11 14:34:28 -0800432 void SetEntryPointsToCompiledCode(mirror::ArtMethod* method, const void* method_code) const
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700433 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
434
435 // Set the entrypoints up for method to the enter the interpreter.
436 void SetEntryPointsToInterpreter(mirror::ArtMethod* method) const
437 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
438
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700439 // Attempts to insert a class into a class table. Returns null if
Ian Rogers848871b2013-08-05 10:56:33 -0700440 // the class was inserted, otherwise returns an existing class with
441 // the same descriptor and ClassLoader.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700442 mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash)
Ian Rogers848871b2013-08-05 10:56:33 -0700443 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
444 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
445
Mathieu Chartier590fee92013-09-13 13:46:47 -0700446 // Special code to allocate an art method, use this instead of class->AllocObject.
447 mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro61e019d2011-07-14 16:53:09 -0700448
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700449 mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700450 mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700451 DCHECK(class_roots != nullptr);
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700452 return class_roots;
453 }
454
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800455 // Move all of the image classes into the class table for faster lookups.
456 void MoveImageClassesToClassTable()
457 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
458 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
459 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
460 // that no more classes are ever added to the pre zygote table which makes it that the pages
461 // always remain shared dirty instead of private dirty.
462 void MoveClassTableToPreZygote()
463 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
464 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
465
Sebastien Hertz6963e442014-11-26 22:11:27 +0100466 // Returns true if the method can be called with its direct code pointer, false otherwise.
467 bool MayBeCalledWithDirectCodePointer(mirror::ArtMethod* m)
468 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
469
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700470 // Creates a GlobalRef PathClassLoader that can be used to load classes from the given dex files.
471 // Note: the objects are not completely set up. Do not use this outside of tests and the compiler.
472 jobject CreatePathClassLoader(Thread* self, std::vector<const DexFile*>& dex_files)
473 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
474
Mathieu Chartier590fee92013-09-13 13:46:47 -0700475 private:
Mathieu Chartiera89d7ed2014-12-05 10:57:13 -0800476 static void InitFromImageInterpretOnlyCallback(mirror::Object* obj, void* arg)
477 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
478
Ian Rogers97b52f82014-08-14 11:34:07 -0700479 const OatFile::OatMethod FindOatMethodFor(mirror::ArtMethod* method, bool* found)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700480 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
TDYa12785321912012-04-01 15:24:56 -0700481
Brian Carlstrom56d947f2013-07-15 13:14:23 -0700482 OatFile& GetImageOatFile(gc::space::ImageSpace* space)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700483 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700484 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700485
Ian Rogers98379392014-02-24 16:53:16 -0800486 void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700487
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700488 // For early bootstrapping by Init
Ian Rogers6fac4472014-02-25 17:01:10 -0800489 mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700490 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700491
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800492 // Alloc* convenience functions to avoid needing to pass in mirror::Class*
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700493 // values that are known to the ClassLinker such as
494 // kObjectArrayClass and kJavaLangString etc.
Ian Rogers6fac4472014-02-25 17:01:10 -0800495 mirror::Class* AllocClass(Thread* self, uint32_t class_size)
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800496 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800497 mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700498 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700499
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800500 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
501 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
502 mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700503 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom5b8e4c82011-09-18 01:38:59 -0700504
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700505
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800506 mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700507 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700508 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700509
Ian Rogers7b078e82014-09-10 14:44:24 -0700510 void AppendToBootClassPath(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700511 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700512 void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700513 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700514
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700515 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
516 // sufficient to hold all static fields.
517 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
518 const DexFile::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700519
Mathieu Chartierc7853442015-03-27 14:35:38 -0700520 // Setup the classloader, class def index, type idx so that we can insert this class in the class
521 // table.
522 void SetupClass(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
523 Handle<mirror::Class> klass, mirror::ClassLoader* class_loader)
524 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
525
Ian Rogers7b078e82014-09-10 14:44:24 -0700526 void LoadClass(Thread* self, const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700527 Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700528 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers13735952014-10-08 12:43:28 -0700529 void LoadClassMembers(Thread* self, const DexFile& dex_file, const uint8_t* class_data,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700530 Handle<mirror::Class> klass, const OatFile::OatClass* oat_class)
Vladimir Markod3c5beb2014-04-11 16:32:51 +0100531 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700532
Mathieu Chartierc7853442015-03-27 14:35:38 -0700533 void LoadField(const ClassDataItemIterator& it, Handle<mirror::Class> klass,
534 ArtField* dst)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800535 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700536
Brian Carlstromea46f952013-07-30 01:26:50 -0700537 mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file,
538 const ClassDataItemIterator& dex_method,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700539 Handle<mirror::Class> klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800540 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700541
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800542 void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800543
Ian Rogers97b52f82014-08-14 11:34:07 -0700544 // Finds the associated oat class for a dex_file and descriptor. Returns an invalid OatClass on
545 // error and sets found to false.
546 OatFile::OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found)
Ian Rogers33e95662013-05-20 20:29:14 -0700547 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800548
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700549 void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700550 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700551 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700552 bool IsDexFileRegisteredLocked(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700553 SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700554
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700555 bool InitializeClass(Thread* self, Handle<mirror::Class> klass, bool can_run_clinit,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800556 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700557 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700558 bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800559 ObjectLock<mirror::Class>& lock);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700560 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700561 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700562
Ian Rogers98379392014-02-24 16:53:16 -0800563 bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700564 Handle<mirror::ClassLoader> class_loader1,
565 Handle<mirror::ClassLoader> class_loader2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700566 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700567
Ian Rogers98379392014-02-24 16:53:16 -0800568 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800569 mirror::Class* klass1,
570 mirror::Class* klass2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700571 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700572
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700573 bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass,
574 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700575 mirror::Class** new_class)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700576 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700577
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700578 bool LinkSuperClass(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700579 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700580
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700581 bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700582 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700583
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700584 bool LinkMethods(Thread* self, Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700585 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
586 StackHandleScope<mirror::Class::kImtSize>* out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700587 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700588
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700589 bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700590 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700591
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700592 bool LinkInterfaceMethods(Thread* const self, Handle<mirror::Class> klass,
593 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
594 StackHandleScope<mirror::Class::kImtSize>* out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700595 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700596
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700597 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700598 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700599 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700600 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700601 bool LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_static, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700602 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700603 void LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700604 uint32_t class_def_method_index)
Dmitry Petrochenkof0972a42014-05-16 17:43:39 +0700605 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700606 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700607 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700608
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700609 // For use by ImageWriter to find DexCaches for its roots
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700610 ReaderWriterMutex* DexLock()
611 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) {
612 return &dex_lock_;
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700613 }
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700614 size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) {
615 return dex_caches_.size();
616 }
617 mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700618
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700619 const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700620 LOCKS_EXCLUDED(dex_lock_);
Andreas Gampe833a4852014-05-21 18:46:59 -0700621
Sebastien Hertz0de11332015-05-13 12:14:05 +0200622 // Returns the boot image oat file.
623 const OatFile* GetBootOatFile() SHARED_LOCKS_REQUIRED(dex_lock_);
624
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700625 mirror::ArtMethod* CreateProxyConstructor(Thread* self, Handle<mirror::Class> klass,
Brian Carlstromea46f952013-07-30 01:26:50 -0700626 mirror::Class* proxy_class)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700627 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700628 mirror::ArtMethod* CreateProxyMethod(Thread* self, Handle<mirror::Class> klass,
629 Handle<mirror::ArtMethod> prototype)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700630 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400631
Andreas Gampe48498592014-09-10 19:48:05 -0700632 // Ensures that methods have the kAccPreverified bit set. We use the kAccPreverfied bit on the
633 // class access flags to determine whether this has been done before.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700634 void EnsurePreverifiedMethods(Handle<mirror::Class> c)
Andreas Gampe48498592014-09-10 19:48:05 -0700635 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
636
Ian Rogersdbf3be02014-08-29 15:40:08 -0700637 mirror::Class* LookupClassFromTableLocked(const char* descriptor,
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800638 mirror::ClassLoader* class_loader,
Ian Rogersdbf3be02014-08-29 15:40:08 -0700639 size_t hash)
640 SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
641
642 mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash)
643 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
644 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
645
Ian Rogersdbf3be02014-08-29 15:40:08 -0700646 mirror::Class* LookupClassFromImage(const char* descriptor)
647 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
648
649 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
650 // before returning it to the caller. Its the responsibility of the thread that placed the class
651 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
652 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
653 // retire a class, the version of the class in the table is returned and this may differ from
654 // the class passed in.
655 mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass)
656 WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
657
658 void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class)
659 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
660
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700661 void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
662 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
663
664 // Return the quick generic JNI stub for testing.
665 const void* GetRuntimeQuickGenericJniStub() const;
666
Andreas Gampebfdcdc12015-04-22 18:10:36 -0700667 // Throw the class initialization failure recorded when first trying to initialize the given
668 // class.
669 // Note: Currently we only store the descriptor, so we cannot throw the exact throwable, only
670 // a recreation with a custom string.
671 void ThrowEarlierClassFailure(mirror::Class* c) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
672
Andreas Gampeb9aec2c2015-04-23 22:23:47 -0700673 // Check for duplicate class definitions of the given oat file against all open oat files.
674 bool HasCollisions(const OatFile* oat_file, std::string* error_msg) LOCKS_EXCLUDED(dex_lock_);
675
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700676 std::vector<const DexFile*> boot_class_path_;
Richard Uhlerfbef44d2014-12-23 09:48:51 -0800677 std::vector<std::unique_ptr<const DexFile>> opened_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700678
Ian Rogers1bf8d4d2013-05-30 00:18:49 -0700679 mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
Andreas Gampec8ccf682014-09-29 20:07:43 -0700680 std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700681 std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -0700682 std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -0700683
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800684 class ClassDescriptorHashEquals {
685 public:
686 // Same class loader and descriptor.
687 std::size_t operator()(const GcRoot<mirror::Class>& root) const NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700688 bool operator()(const GcRoot<mirror::Class>& a, const GcRoot<mirror::Class>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800689 NO_THREAD_SAFETY_ANALYSIS;
690 // Same class loader and descriptor.
691 std::size_t operator()(const std::pair<const char*, mirror::ClassLoader*>& element) const
692 NO_THREAD_SAFETY_ANALYSIS;
693 bool operator()(const GcRoot<mirror::Class>& a,
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700694 const std::pair<const char*, mirror::ClassLoader*>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800695 NO_THREAD_SAFETY_ANALYSIS;
696 // Same descriptor.
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700697 bool operator()(const GcRoot<mirror::Class>& a, const char* descriptor) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800698 NO_THREAD_SAFETY_ANALYSIS;
699 std::size_t operator()(const char* descriptor) const NO_THREAD_SAFETY_ANALYSIS;
700 };
701 class GcRootEmptyFn {
702 public:
703 void MakeEmpty(GcRoot<mirror::Class>& item) const {
704 item = GcRoot<mirror::Class>();
705 }
706 bool IsEmpty(const GcRoot<mirror::Class>& item) const {
707 return item.IsNull();
708 }
709 };
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700710
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800711 // hash set which hashes class descriptor, and compares descriptors nad class loaders. Results
712 // should be compared for a matching Class descriptor and class loader.
713 typedef HashSet<GcRoot<mirror::Class>, GcRootEmptyFn, ClassDescriptorHashEquals,
714 ClassDescriptorHashEquals, TrackingAllocator<GcRoot<mirror::Class>, kAllocatorTagClassTable>>
715 Table;
Hiroshi Yamauchia91a4bc2014-06-13 16:44:55 -0700716 // This contains strong roots. To enable concurrent root scanning of
717 // the class table, be careful to use a read barrier when accessing this.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700718 Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800719 Table pre_zygote_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
720 std::vector<GcRoot<mirror::Class>> new_class_roots_;
Elliott Hughesf8349362012-06-18 15:00:06 -0700721
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700722 // Do we need to search dex caches to find image classes?
723 bool dex_cache_image_class_lookup_required_;
724 // Number of times we've searched dex caches for a class. After a certain number of misses we move
725 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -0700726 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700727
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700728 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700729 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -0700730
Ian Rogers98379392014-02-24 16:53:16 -0800731 // The interface table used by all arrays.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700732 GcRoot<mirror::IfTable> array_iftable_;
Carl Shapiro565f5072011-07-10 13:39:43 -0700733
Ian Rogers98379392014-02-24 16:53:16 -0800734 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
735 // descriptors for the sake of performing FindClass.
736 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700737 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -0800738 size_t find_array_class_cache_next_victim_;
739
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700740 bool init_done_;
Mathieu Chartier893263b2014-03-04 11:07:42 -0800741 bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_);
742 bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700743
Elliott Hughescf4c6c42011-09-01 15:16:42 -0700744 InternTable* intern_table_;
745
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700746 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
747 // patch point within the image. TODO: make these proper relocations.
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700748 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -0700749 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -0800750 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +0100751 const void* quick_to_interpreter_bridge_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700752
Mathieu Chartier2d721012014-11-10 11:08:06 -0800753 // Image pointer size.
754 size_t image_pointer_size_;
755
Brian Carlstrom34f426c2011-10-04 12:58:02 -0700756 friend class ImageWriter; // for GetClassRoots
Alex Lighta59dd802014-07-02 16:28:08 -0700757 friend class ImageDumper; // for FindOpenedOatFileFromOatLocation
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700758 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700759 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
760
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700761 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
762};
763
764} // namespace art
765
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700766#endif // ART_RUNTIME_CLASS_LINKER_H_