blob: d9935cbfda079d3875dbd2e0d1d310a1f2fbd14a [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;
Mathieu Chartiere401d142015-04-22 13:56:20 -070045 class DexCachePointerArray;
Ian Rogers33e95662013-05-20 20:29:14 -070046 class DexCacheTest_Open_Test;
47 class IfTable;
48 template<class T> class ObjectArray;
49 class StackTraceElement;
50} // namespace mirror
Ian Rogers1d54e732013-05-02 21:10:01 -070051
Andreas Gampe5a4b8a22014-09-11 08:30:08 -070052template<class T> class Handle;
Hiroshi Yamauchi679b1cf2015-05-21 12:05:27 -070053template<class T> class MutableHandle;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070054class InternTable;
Mathieu Chartierc528dba2013-11-26 12:00:11 -080055template<class T> class ObjectLock;
Andreas Gampe7ba64962014-10-23 11:37:40 -070056class Runtime;
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -070057class ScopedObjectAccessAlreadyRunnable;
Mathieu Chartier2d2621a2014-10-23 16:48:06 -070058template<size_t kNumReferences> class PACKED(4) StackHandleScope;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070059
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080060typedef bool (ClassVisitor)(mirror::Class* c, void* arg);
Elliott Hughesa2155262011-11-16 16:26:58 -080061
Mathieu Chartier893263b2014-03-04 11:07:42 -080062enum VisitRootFlags : uint8_t;
63
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070064class ClassLinker {
65 public:
Ian Rogers6f3dbba2014-10-14 17:41:57 -070066 // Well known mirror::Class roots accessed via GetClassRoot.
67 enum ClassRoot {
68 kJavaLangClass,
69 kJavaLangObject,
70 kClassArrayClass,
71 kObjectArrayClass,
72 kJavaLangString,
73 kJavaLangDexCache,
74 kJavaLangRefReference,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070075 kJavaLangReflectConstructor,
Mathieu Chartierdaaf3262015-03-24 13:30:28 -070076 kJavaLangReflectField,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070077 kJavaLangReflectMethod,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070078 kJavaLangReflectProxy,
79 kJavaLangStringArrayClass,
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.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700189 mirror::String* ResolveString(uint32_t string_idx, 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.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700207 mirror::Class* ResolveType(uint16_t type_idx, 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.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700227 ArtMethod* ResolveMethod(const DexFile& dex_file, uint32_t method_idx,
228 Handle<mirror::DexCache> dex_cache,
229 Handle<mirror::ClassLoader> class_loader, ArtMethod* referrer,
230 InvokeType type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700231 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700232
Mathieu Chartiere401d142015-04-22 13:56:20 -0700233 ArtMethod* GetResolvedMethod(uint32_t method_idx, ArtMethod* referrer)
Mathieu Chartier0cd81352014-05-22 16:48:55 -0700234 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700235 ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, ArtMethod* referrer, InvokeType type)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800236 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom16192862011-09-12 17:50:06 -0700237
Mathieu Chartierc7853442015-03-27 14:35:38 -0700238 ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class)
Mathieu Chartier0cd81352014-05-22 16:48:55 -0700239 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700240 ArtField* GetResolvedField(uint32_t field_idx, mirror::DexCache* dex_cache)
241 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700242 ArtField* ResolveField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800243 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromb9edb842011-08-28 16:31:06 -0700244
Brian Carlstrom16192862011-09-12 17:50:06 -0700245 // Resolve a field with a given ID from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700246 // result in DexCache. The ClassLinker and ClassLoader are used as
247 // in ResolveType. What is unique is the is_static argument which is
248 // used to determine if we are resolving a static or non-static
249 // field.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700250 ArtField* ResolveField(const DexFile& dex_file,
Brian Carlstromea46f952013-07-30 01:26:50 -0700251 uint32_t field_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700252 Handle<mirror::DexCache> dex_cache,
253 Handle<mirror::ClassLoader> class_loader,
Brian Carlstromea46f952013-07-30 01:26:50 -0700254 bool is_static)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700255 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700256
Ian Rogersb067ac22011-12-13 18:05:09 -0800257 // Resolve a field with a given ID from the DexFile, storing the
258 // result in DexCache. The ClassLinker and ClassLoader are used as
259 // in ResolveType. No is_static argument is provided so that Java
260 // field resolution semantics are followed.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700261 ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700262 Handle<mirror::DexCache> dex_cache,
263 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700264 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersb067ac22011-12-13 18:05:09 -0800265
Ian Rogersad25ac52011-10-04 19:13:33 -0700266 // Get shorty from method index without resolution. Used to do handlerization.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700267 const char* MethodShorty(uint32_t method_idx, ArtMethod* referrer, uint32_t* length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700268 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersad25ac52011-10-04 19:13:33 -0700269
Elliott Hughesf4c21c92011-08-19 17:31:31 -0700270 // Returns true on success, false if there's an exception pending.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700271 // can_run_clinit=false allows the compiler to attempt to init a class,
272 // given the restriction that no <clinit> execution is possible.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700273 bool EnsureInitialized(Thread* self, Handle<mirror::Class> c, bool can_init_fields,
Ian Rogers7b078e82014-09-10 14:44:24 -0700274 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700275 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700276
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700277 // Initializes classes that have instances in the image but that have
278 // <clinit> methods so they could not be initialized by the compiler.
Ian Rogersb726dcb2012-09-05 08:57:23 -0700279 void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700280
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700281 void RegisterDexFile(const DexFile& dex_file)
282 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700283 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700284 void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700285 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700286 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700287
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700288 const OatFile* RegisterOatFile(const OatFile* oat_file)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700289 LOCKS_EXCLUDED(dex_lock_);
Brian Carlstrom866c8622012-01-06 16:35:13 -0800290
Brian Carlstrom8a487412011-08-29 20:08:52 -0700291 const std::vector<const DexFile*>& GetBootClassPath() {
292 return boot_class_path_;
293 }
294
Sebastien Hertz0de11332015-05-13 12:14:05 +0200295 // Returns the first non-image oat file in the class path.
296 const OatFile* GetPrimaryOatFile()
297 LOCKS_EXCLUDED(dex_lock_);
298
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700299 void VisitClasses(ClassVisitor* visitor, void* arg)
Ian Rogersdbf3be02014-08-29 15:40:08 -0700300 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700301 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -0700302
303 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
304 // so that it can visit individual classes without holding the doesn't hold the
305 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
306 // can race with insertion and deletion of classes while the visitor is being called.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700307 void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg)
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700308 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughesa2155262011-11-16 16:26:58 -0800309
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700310 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700311 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
312 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700313 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700314 LOCKS_EXCLUDED(dex_lock_)
315 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700316
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700317 mirror::DexCache* FindDexCache(const DexFile& dex_file)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700318 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700319 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700320 bool IsDexFileRegistered(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700321 LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700322 void FixupDexCaches(ArtMethod* resolution_method)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700323 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700324 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom1d9f52b2011-10-13 10:50:45 -0700325
Richard Uhler66d874d2015-01-15 09:37:19 -0800326 // Finds or creates the oat file holding dex_location. Then loads and returns
327 // all corresponding dex files (there may be more than one dex file loaded
328 // in the case of multidex).
329 // This may return the original, unquickened dex files if the oat file could
330 // not be generated.
331 //
332 // Returns an empty vector if the dex files could not be loaded. In this
333 // case, there will be at least one error message returned describing why no
334 // dex files could not be loaded. The 'error_msgs' argument must not be
335 // null, regardless of whether there is an error or not.
336 //
337 // This method should not be called with the mutator_lock_ held, because it
338 // could end up starving GC if we need to generate or relocate any oat
339 // files.
340 std::vector<std::unique_ptr<const DexFile>> OpenDexFilesFromOat(
341 const char* dex_location, const char* oat_location,
342 std::vector<std::string>* error_msgs)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700343 LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
jeffhaof6174e82012-01-31 16:14:17 -0800344
Ian Rogersc0542af2014-09-03 16:16:56 -0700345 // Allocate an instance of a java.lang.Object.
346 mirror::Object* AllocObject(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
347
Elliott Hughes418d20f2011-09-22 14:00:39 -0700348 // TODO: replace this with multiple methods that allocate the correct managed type.
Shih-wei Liao44175362011-08-28 16:59:17 -0700349 template <class T>
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800350 mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700351 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Shih-wei Liao55df06b2011-08-26 14:39:27 -0700352
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800353 mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700354 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
jeffhao98eacac2011-09-14 16:11:53 -0700355
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800356 mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700357 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800358
Mathieu Chartiere401d142015-04-22 13:56:20 -0700359 ArtMethod* AllocArtMethodArray(Thread* self, size_t length);
360
361 mirror::PointerArray* AllocPointerArray(Thread* self, size_t length)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800362 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
363
364 mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
365 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
366
Mathieu Chartierc7853442015-03-27 14:35:38 -0700367 ArtField* AllocArtFieldArray(Thread* self, size_t length)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800368 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
369
370 mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
371 size_t length)
372 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
373
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700374 void VerifyClass(Thread* self, Handle<mirror::Class> klass)
Ian Rogers7b078e82014-09-10 14:44:24 -0700375 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800376 bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
377 mirror::Class::Status& oat_file_class_status)
378 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800379 void ResolveClassExceptionHandlerTypes(const DexFile& dex_file,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700380 Handle<mirror::Class> klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800381 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700382 void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, ArtMethod* klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800383 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
384
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -0700385 mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name,
386 jobjectArray interfaces, jobject loader, jobjectArray methods,
387 jobjectArray throws)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800388 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800389 std::string GetDescriptorForProxy(mirror::Class* proxy_class)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800390 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700391 ArtMethod* FindMethodForProxy(mirror::Class* proxy_class, ArtMethod* proxy_method)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700392 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700393 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400394
Ian Rogers19846512012-02-24 11:42:47 -0800395 // Get the oat code for a method when its class isn't yet initialized
Mathieu Chartiere401d142015-04-22 13:56:20 -0700396 const void* GetQuickOatCodeFor(ArtMethod* method)
Ian Rogersef7d42f2014-01-06 12:55:46 -0800397 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800398
Mathieu Chartiere35517a2012-10-30 18:49:55 -0700399 // Get the oat code for a method from a method index.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700400 const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx,
401 uint32_t method_idx)
Ian Rogersef7d42f2014-01-06 12:55:46 -0800402 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere35517a2012-10-30 18:49:55 -0700403
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700404 // Get compiled code for a method, return null if no code
405 // exists. This is unlike Get..OatCodeFor which will return a bridge
406 // or interpreter entrypoint.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700407 const void* GetOatMethodQuickCodeFor(ArtMethod* method)
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700408 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700409
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700410 pid_t GetClassesLockOwner(); // For SignalCatcher.
411 pid_t GetDexLockOwner(); // For SignalCatcher.
Brian Carlstrom24a3c2e2011-10-17 18:07:52 -0700412
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700413 mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700414
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700415 static const char* GetClassRootDescriptor(ClassRoot class_root);
Andreas Gampe2da88232014-02-27 12:26:20 -0800416
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700417 // Is the given entry point quick code to run the resolution stub?
418 bool IsQuickResolutionStub(const void* entry_point) const;
Jeff Hao88474b42013-10-23 16:24:40 -0700419
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700420 // Is the given entry point quick code to bridge into the interpreter?
421 bool IsQuickToInterpreterBridge(const void* entry_point) const;
422
423 // Is the given entry point quick code to run the generic JNI stub?
424 bool IsQuickGenericJniStub(const void* entry_point) const;
Vladimir Marko8a630572014-04-09 18:45:35 +0100425
Jeff Hao88474b42013-10-23 16:24:40 -0700426 InternTable* GetInternTable() const {
427 return intern_table_;
428 }
429
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700430 // Set the entrypoints up for method to the given code.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700431 void SetEntryPointsToCompiledCode(ArtMethod* method, const void* method_code) const
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700432 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
433
434 // Set the entrypoints up for method to the enter the interpreter.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700435 void SetEntryPointsToInterpreter(ArtMethod* method) const
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700436 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
437
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700438 // Attempts to insert a class into a class table. Returns null if
Ian Rogers848871b2013-08-05 10:56:33 -0700439 // the class was inserted, otherwise returns an existing class with
440 // the same descriptor and ClassLoader.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700441 mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash)
Ian Rogers848871b2013-08-05 10:56:33 -0700442 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
443 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
444
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700445 mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700446 mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700447 DCHECK(class_roots != nullptr);
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700448 return class_roots;
449 }
450
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800451 // Move all of the image classes into the class table for faster lookups.
452 void MoveImageClassesToClassTable()
453 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
454 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
455 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
456 // that no more classes are ever added to the pre zygote table which makes it that the pages
457 // always remain shared dirty instead of private dirty.
458 void MoveClassTableToPreZygote()
459 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
460 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
461
Sebastien Hertz6963e442014-11-26 22:11:27 +0100462 // Returns true if the method can be called with its direct code pointer, false otherwise.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700463 bool MayBeCalledWithDirectCodePointer(ArtMethod* m)
Sebastien Hertz6963e442014-11-26 22:11:27 +0100464 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
465
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700466 // Creates a GlobalRef PathClassLoader that can be used to load classes from the given dex files.
467 // Note: the objects are not completely set up. Do not use this outside of tests and the compiler.
468 jobject CreatePathClassLoader(Thread* self, std::vector<const DexFile*>& dex_files)
469 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
470
Mathieu Chartiere401d142015-04-22 13:56:20 -0700471 size_t GetImagePointerSize() const {
472 DCHECK(ValidPointerSize(image_pointer_size_)) << image_pointer_size_;
473 return image_pointer_size_;
474 }
475
476 // Used by image writer for checking.
477 bool ClassInClassTable(mirror::Class* klass)
478 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
Mathieu Chartiera89d7ed2014-12-05 10:57:13 -0800479 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
480
Mathieu Chartiere401d142015-04-22 13:56:20 -0700481 ArtMethod* CreateRuntimeMethod();
482
Andreas Gampe8ac75952015-06-02 21:01:45 -0700483 // Clear the ArrayClass cache. This is necessary when cleaning up for the image, as the cache
484 // entries are roots, but potentially not image classes.
485 void DropFindArrayClassCache() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
486
Mathieu Chartiere401d142015-04-22 13:56:20 -0700487 private:
488 const OatFile::OatMethod FindOatMethodFor(ArtMethod* method, bool* found)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700489 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
TDYa12785321912012-04-01 15:24:56 -0700490
Brian Carlstrom56d947f2013-07-15 13:14:23 -0700491 OatFile& GetImageOatFile(gc::space::ImageSpace* space)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700492 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700493 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700494
Ian Rogers98379392014-02-24 16:53:16 -0800495 void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700496
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700497 // For early bootstrapping by Init
Ian Rogers6fac4472014-02-25 17:01:10 -0800498 mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700499 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700500
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800501 // Alloc* convenience functions to avoid needing to pass in mirror::Class*
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700502 // values that are known to the ClassLinker such as
503 // kObjectArrayClass and kJavaLangString etc.
Ian Rogers6fac4472014-02-25 17:01:10 -0800504 mirror::Class* AllocClass(Thread* self, uint32_t class_size)
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800505 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800506 mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700507 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700508
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800509 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
510 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
511 mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700512 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom5b8e4c82011-09-18 01:38:59 -0700513
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700514
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800515 mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700516 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700517 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700518
Ian Rogers7b078e82014-09-10 14:44:24 -0700519 void AppendToBootClassPath(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700520 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700521 void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700522 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700523
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700524 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
525 // sufficient to hold all static fields.
526 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
527 const DexFile::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700528
Mathieu Chartierc7853442015-03-27 14:35:38 -0700529 // Setup the classloader, class def index, type idx so that we can insert this class in the class
530 // table.
531 void SetupClass(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
532 Handle<mirror::Class> klass, mirror::ClassLoader* class_loader)
533 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
534
Ian Rogers7b078e82014-09-10 14:44:24 -0700535 void LoadClass(Thread* self, const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700536 Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700537 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers13735952014-10-08 12:43:28 -0700538 void LoadClassMembers(Thread* self, const DexFile& dex_file, const uint8_t* class_data,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700539 Handle<mirror::Class> klass, const OatFile::OatClass* oat_class)
Vladimir Markod3c5beb2014-04-11 16:32:51 +0100540 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700541
Mathieu Chartierc7853442015-03-27 14:35:38 -0700542 void LoadField(const ClassDataItemIterator& it, Handle<mirror::Class> klass,
543 ArtField* dst)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800544 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700545
Mathieu Chartiere401d142015-04-22 13:56:20 -0700546 void LoadMethod(Thread* self, const DexFile& dex_file, const ClassDataItemIterator& it,
547 Handle<mirror::Class> klass, ArtMethod* dst)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800548 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700549
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800550 void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800551
Ian Rogers97b52f82014-08-14 11:34:07 -0700552 // Finds the associated oat class for a dex_file and descriptor. Returns an invalid OatClass on
553 // error and sets found to false.
554 OatFile::OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found)
Ian Rogers33e95662013-05-20 20:29:14 -0700555 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800556
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700557 void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700558 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700559 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700560 bool IsDexFileRegisteredLocked(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700561 SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700562
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700563 bool InitializeClass(Thread* self, Handle<mirror::Class> klass, bool can_run_clinit,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800564 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700565 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700566 bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800567 ObjectLock<mirror::Class>& lock);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700568 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700569 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700570
Ian Rogers98379392014-02-24 16:53:16 -0800571 bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700572 Handle<mirror::ClassLoader> class_loader1,
573 Handle<mirror::ClassLoader> class_loader2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700574 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700575
Mathieu Chartiere401d142015-04-22 13:56:20 -0700576 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, ArtMethod* method,
577 mirror::Class* klass1, mirror::Class* klass2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700578 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700579
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700580 bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass,
581 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Hiroshi Yamauchi679b1cf2015-05-21 12:05:27 -0700582 MutableHandle<mirror::Class>* h_new_class_out)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700583 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700584
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700585 bool LinkSuperClass(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700586 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700587
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700588 bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700589 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700590
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700591 bool LinkMethods(Thread* self, Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700592 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700593 ArtMethod** out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700594 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700595
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700596 bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700597 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700598
Mathieu Chartiere401d142015-04-22 13:56:20 -0700599 bool LinkInterfaceMethods(Thread* self, Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700600 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700601 ArtMethod** out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700602 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700603
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700604 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700605 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700606 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700607 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700608 bool LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_static, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700609 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700610 void LinkCode(ArtMethod* method, const OatFile::OatClass* oat_class,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700611 uint32_t class_def_method_index)
Dmitry Petrochenkof0972a42014-05-16 17:43:39 +0700612 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700613 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700614 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700615
Mathieu Chartiere401d142015-04-22 13:56:20 -0700616 void CheckProxyConstructor(ArtMethod* constructor) const
617 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
618 void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const
619 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
620
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700621 // For use by ImageWriter to find DexCaches for its roots
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700622 ReaderWriterMutex* DexLock()
623 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) {
624 return &dex_lock_;
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700625 }
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700626 size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) {
627 return dex_caches_.size();
628 }
629 mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700630
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700631 const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700632 LOCKS_EXCLUDED(dex_lock_);
Andreas Gampe833a4852014-05-21 18:46:59 -0700633
Sebastien Hertz0de11332015-05-13 12:14:05 +0200634 // Returns the boot image oat file.
635 const OatFile* GetBootOatFile() SHARED_LOCKS_REQUIRED(dex_lock_);
636
Mathieu Chartiere401d142015-04-22 13:56:20 -0700637 void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700638 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700639 void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700640 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400641
Andreas Gampe48498592014-09-10 19:48:05 -0700642 // Ensures that methods have the kAccPreverified bit set. We use the kAccPreverfied bit on the
643 // class access flags to determine whether this has been done before.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700644 void EnsurePreverifiedMethods(Handle<mirror::Class> c)
Andreas Gampe48498592014-09-10 19:48:05 -0700645 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
646
Ian Rogersdbf3be02014-08-29 15:40:08 -0700647 mirror::Class* LookupClassFromTableLocked(const char* descriptor,
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800648 mirror::ClassLoader* class_loader,
Ian Rogersdbf3be02014-08-29 15:40:08 -0700649 size_t hash)
650 SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
651
652 mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash)
653 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
654 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
655
Ian Rogersdbf3be02014-08-29 15:40:08 -0700656 mirror::Class* LookupClassFromImage(const char* descriptor)
657 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
658
659 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
660 // before returning it to the caller. Its the responsibility of the thread that placed the class
661 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
662 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
663 // retire a class, the version of the class in the table is returned and this may differ from
664 // the class passed in.
665 mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass)
666 WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
667
668 void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class)
669 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
670
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700671 void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
672 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
673
674 // Return the quick generic JNI stub for testing.
675 const void* GetRuntimeQuickGenericJniStub() const;
676
Andreas Gampebfdcdc12015-04-22 18:10:36 -0700677 // Throw the class initialization failure recorded when first trying to initialize the given
678 // class.
679 // Note: Currently we only store the descriptor, so we cannot throw the exact throwable, only
680 // a recreation with a custom string.
681 void ThrowEarlierClassFailure(mirror::Class* c) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
682
Andreas Gampeb9aec2c2015-04-23 22:23:47 -0700683 // Check for duplicate class definitions of the given oat file against all open oat files.
684 bool HasCollisions(const OatFile* oat_file, std::string* error_msg) LOCKS_EXCLUDED(dex_lock_);
685
Mathieu Chartiere401d142015-04-22 13:56:20 -0700686 bool HasInitWithString(Thread* self, ClassLinker* class_linker, const char* descriptor)
687 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
688
689 bool CanWeInitializeClass(mirror::Class* klass, bool can_init_statics, bool can_init_parents)
690 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
691
692 void UpdateClassVirtualMethods(mirror::Class* klass, ArtMethod* new_methods,
693 size_t new_num_methods)
694 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
695
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700696 std::vector<const DexFile*> boot_class_path_;
Richard Uhlerfbef44d2014-12-23 09:48:51 -0800697 std::vector<std::unique_ptr<const DexFile>> opened_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700698
Ian Rogers1bf8d4d2013-05-30 00:18:49 -0700699 mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
Andreas Gampec8ccf682014-09-29 20:07:43 -0700700 std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700701 std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -0700702 std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -0700703
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800704 class ClassDescriptorHashEquals {
705 public:
706 // Same class loader and descriptor.
707 std::size_t operator()(const GcRoot<mirror::Class>& root) const NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700708 bool operator()(const GcRoot<mirror::Class>& a, const GcRoot<mirror::Class>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800709 NO_THREAD_SAFETY_ANALYSIS;
710 // Same class loader and descriptor.
711 std::size_t operator()(const std::pair<const char*, mirror::ClassLoader*>& element) const
712 NO_THREAD_SAFETY_ANALYSIS;
713 bool operator()(const GcRoot<mirror::Class>& a,
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700714 const std::pair<const char*, mirror::ClassLoader*>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800715 NO_THREAD_SAFETY_ANALYSIS;
716 // Same descriptor.
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700717 bool operator()(const GcRoot<mirror::Class>& a, const char* descriptor) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800718 NO_THREAD_SAFETY_ANALYSIS;
719 std::size_t operator()(const char* descriptor) const NO_THREAD_SAFETY_ANALYSIS;
720 };
721 class GcRootEmptyFn {
722 public:
723 void MakeEmpty(GcRoot<mirror::Class>& item) const {
724 item = GcRoot<mirror::Class>();
725 }
726 bool IsEmpty(const GcRoot<mirror::Class>& item) const {
727 return item.IsNull();
728 }
729 };
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700730
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800731 // hash set which hashes class descriptor, and compares descriptors nad class loaders. Results
732 // should be compared for a matching Class descriptor and class loader.
733 typedef HashSet<GcRoot<mirror::Class>, GcRootEmptyFn, ClassDescriptorHashEquals,
734 ClassDescriptorHashEquals, TrackingAllocator<GcRoot<mirror::Class>, kAllocatorTagClassTable>>
735 Table;
Hiroshi Yamauchia91a4bc2014-06-13 16:44:55 -0700736 // This contains strong roots. To enable concurrent root scanning of
737 // the class table, be careful to use a read barrier when accessing this.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700738 Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800739 Table pre_zygote_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
740 std::vector<GcRoot<mirror::Class>> new_class_roots_;
Elliott Hughesf8349362012-06-18 15:00:06 -0700741
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700742 // Do we need to search dex caches to find image classes?
743 bool dex_cache_image_class_lookup_required_;
744 // Number of times we've searched dex caches for a class. After a certain number of misses we move
745 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -0700746 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700747
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700748 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700749 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -0700750
Ian Rogers98379392014-02-24 16:53:16 -0800751 // The interface table used by all arrays.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700752 GcRoot<mirror::IfTable> array_iftable_;
Carl Shapiro565f5072011-07-10 13:39:43 -0700753
Ian Rogers98379392014-02-24 16:53:16 -0800754 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
755 // descriptors for the sake of performing FindClass.
756 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700757 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -0800758 size_t find_array_class_cache_next_victim_;
759
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700760 bool init_done_;
Mathieu Chartier893263b2014-03-04 11:07:42 -0800761 bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_);
762 bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700763
Elliott Hughescf4c6c42011-09-01 15:16:42 -0700764 InternTable* intern_table_;
765
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700766 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
767 // patch point within the image. TODO: make these proper relocations.
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700768 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -0700769 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -0800770 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +0100771 const void* quick_to_interpreter_bridge_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700772
Mathieu Chartier2d721012014-11-10 11:08:06 -0800773 // Image pointer size.
774 size_t image_pointer_size_;
775
Brian Carlstrom34f426c2011-10-04 12:58:02 -0700776 friend class ImageWriter; // for GetClassRoots
Alex Lighta59dd802014-07-02 16:28:08 -0700777 friend class ImageDumper; // for FindOpenedOatFileFromOatLocation
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700778 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700779 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
780
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700781 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
782};
783
784} // namespace art
785
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700786#endif // ART_RUNTIME_CLASS_LINKER_H_