blob: fa8b2e796bd08c9b7bca1a3adf4c566893741ab9 [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
483 private:
484 const OatFile::OatMethod FindOatMethodFor(ArtMethod* method, bool* found)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700485 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
TDYa12785321912012-04-01 15:24:56 -0700486
Brian Carlstrom56d947f2013-07-15 13:14:23 -0700487 OatFile& GetImageOatFile(gc::space::ImageSpace* space)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700488 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700489 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700490
Ian Rogers98379392014-02-24 16:53:16 -0800491 void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700492
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700493 // For early bootstrapping by Init
Ian Rogers6fac4472014-02-25 17:01:10 -0800494 mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700495 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700496
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800497 // Alloc* convenience functions to avoid needing to pass in mirror::Class*
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700498 // values that are known to the ClassLinker such as
499 // kObjectArrayClass and kJavaLangString etc.
Ian Rogers6fac4472014-02-25 17:01:10 -0800500 mirror::Class* AllocClass(Thread* self, uint32_t class_size)
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800501 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800502 mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700503 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700504
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800505 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
506 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
507 mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700508 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom5b8e4c82011-09-18 01:38:59 -0700509
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700510
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800511 mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700512 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700513 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700514
Ian Rogers7b078e82014-09-10 14:44:24 -0700515 void AppendToBootClassPath(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700516 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700517 void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700518 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700519
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700520 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
521 // sufficient to hold all static fields.
522 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
523 const DexFile::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700524
Mathieu Chartierc7853442015-03-27 14:35:38 -0700525 // Setup the classloader, class def index, type idx so that we can insert this class in the class
526 // table.
527 void SetupClass(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
528 Handle<mirror::Class> klass, mirror::ClassLoader* class_loader)
529 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
530
Ian Rogers7b078e82014-09-10 14:44:24 -0700531 void LoadClass(Thread* self, const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700532 Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700533 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers13735952014-10-08 12:43:28 -0700534 void LoadClassMembers(Thread* self, const DexFile& dex_file, const uint8_t* class_data,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700535 Handle<mirror::Class> klass, const OatFile::OatClass* oat_class)
Vladimir Markod3c5beb2014-04-11 16:32:51 +0100536 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700537
Mathieu Chartierc7853442015-03-27 14:35:38 -0700538 void LoadField(const ClassDataItemIterator& it, Handle<mirror::Class> klass,
539 ArtField* dst)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800540 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700541
Mathieu Chartiere401d142015-04-22 13:56:20 -0700542 void LoadMethod(Thread* self, const DexFile& dex_file, const ClassDataItemIterator& it,
543 Handle<mirror::Class> klass, ArtMethod* dst)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800544 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700545
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800546 void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800547
Ian Rogers97b52f82014-08-14 11:34:07 -0700548 // Finds the associated oat class for a dex_file and descriptor. Returns an invalid OatClass on
549 // error and sets found to false.
550 OatFile::OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found)
Ian Rogers33e95662013-05-20 20:29:14 -0700551 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800552
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700553 void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700554 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700555 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700556 bool IsDexFileRegisteredLocked(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700557 SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700558
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700559 bool InitializeClass(Thread* self, Handle<mirror::Class> klass, bool can_run_clinit,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800560 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700561 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700562 bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800563 ObjectLock<mirror::Class>& lock);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700564 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700565 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700566
Ian Rogers98379392014-02-24 16:53:16 -0800567 bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700568 Handle<mirror::ClassLoader> class_loader1,
569 Handle<mirror::ClassLoader> class_loader2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700570 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700571
Mathieu Chartiere401d142015-04-22 13:56:20 -0700572 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, ArtMethod* method,
573 mirror::Class* klass1, mirror::Class* klass2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700574 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700575
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700576 bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass,
577 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Hiroshi Yamauchi679b1cf2015-05-21 12:05:27 -0700578 MutableHandle<mirror::Class>* h_new_class_out)
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 LinkSuperClass(Handle<mirror::Class> klass)
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 LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700585 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700586
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700587 bool LinkMethods(Thread* self, Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700588 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700589 ArtMethod** out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700590 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700591
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700592 bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700593 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700594
Mathieu Chartiere401d142015-04-22 13:56:20 -0700595 bool LinkInterfaceMethods(Thread* self, Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700596 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700597 ArtMethod** out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700598 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700599
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700600 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700601 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700602 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700603 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700604 bool LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_static, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700605 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700606 void LinkCode(ArtMethod* method, const OatFile::OatClass* oat_class,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700607 uint32_t class_def_method_index)
Dmitry Petrochenkof0972a42014-05-16 17:43:39 +0700608 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700609 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700610 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700611
Mathieu Chartiere401d142015-04-22 13:56:20 -0700612 void CheckProxyConstructor(ArtMethod* constructor) const
613 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
614 void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const
615 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
616
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700617 // For use by ImageWriter to find DexCaches for its roots
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700618 ReaderWriterMutex* DexLock()
619 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) {
620 return &dex_lock_;
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700621 }
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700622 size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) {
623 return dex_caches_.size();
624 }
625 mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700626
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700627 const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700628 LOCKS_EXCLUDED(dex_lock_);
Andreas Gampe833a4852014-05-21 18:46:59 -0700629
Sebastien Hertz0de11332015-05-13 12:14:05 +0200630 // Returns the boot image oat file.
631 const OatFile* GetBootOatFile() SHARED_LOCKS_REQUIRED(dex_lock_);
632
Mathieu Chartiere401d142015-04-22 13:56:20 -0700633 void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700634 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700635 void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700636 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400637
Andreas Gampe48498592014-09-10 19:48:05 -0700638 // Ensures that methods have the kAccPreverified bit set. We use the kAccPreverfied bit on the
639 // class access flags to determine whether this has been done before.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700640 void EnsurePreverifiedMethods(Handle<mirror::Class> c)
Andreas Gampe48498592014-09-10 19:48:05 -0700641 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
642
Ian Rogersdbf3be02014-08-29 15:40:08 -0700643 mirror::Class* LookupClassFromTableLocked(const char* descriptor,
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800644 mirror::ClassLoader* class_loader,
Ian Rogersdbf3be02014-08-29 15:40:08 -0700645 size_t hash)
646 SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
647
648 mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash)
649 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
650 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
651
Ian Rogersdbf3be02014-08-29 15:40:08 -0700652 mirror::Class* LookupClassFromImage(const char* descriptor)
653 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
654
655 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
656 // before returning it to the caller. Its the responsibility of the thread that placed the class
657 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
658 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
659 // retire a class, the version of the class in the table is returned and this may differ from
660 // the class passed in.
661 mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass)
662 WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
663
664 void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class)
665 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
666
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700667 void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
668 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
669
670 // Return the quick generic JNI stub for testing.
671 const void* GetRuntimeQuickGenericJniStub() const;
672
Andreas Gampebfdcdc12015-04-22 18:10:36 -0700673 // Throw the class initialization failure recorded when first trying to initialize the given
674 // class.
675 // Note: Currently we only store the descriptor, so we cannot throw the exact throwable, only
676 // a recreation with a custom string.
677 void ThrowEarlierClassFailure(mirror::Class* c) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
678
Andreas Gampeb9aec2c2015-04-23 22:23:47 -0700679 // Check for duplicate class definitions of the given oat file against all open oat files.
680 bool HasCollisions(const OatFile* oat_file, std::string* error_msg) LOCKS_EXCLUDED(dex_lock_);
681
Mathieu Chartiere401d142015-04-22 13:56:20 -0700682 bool HasInitWithString(Thread* self, ClassLinker* class_linker, const char* descriptor)
683 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
684
685 bool CanWeInitializeClass(mirror::Class* klass, bool can_init_statics, bool can_init_parents)
686 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
687
688 void UpdateClassVirtualMethods(mirror::Class* klass, ArtMethod* new_methods,
689 size_t new_num_methods)
690 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
691
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700692 std::vector<const DexFile*> boot_class_path_;
Richard Uhlerfbef44d2014-12-23 09:48:51 -0800693 std::vector<std::unique_ptr<const DexFile>> opened_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700694
Ian Rogers1bf8d4d2013-05-30 00:18:49 -0700695 mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
Andreas Gampec8ccf682014-09-29 20:07:43 -0700696 std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700697 std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -0700698 std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -0700699
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800700 class ClassDescriptorHashEquals {
701 public:
702 // Same class loader and descriptor.
703 std::size_t operator()(const GcRoot<mirror::Class>& root) const NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700704 bool operator()(const GcRoot<mirror::Class>& a, const GcRoot<mirror::Class>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800705 NO_THREAD_SAFETY_ANALYSIS;
706 // Same class loader and descriptor.
707 std::size_t operator()(const std::pair<const char*, mirror::ClassLoader*>& element) const
708 NO_THREAD_SAFETY_ANALYSIS;
709 bool operator()(const GcRoot<mirror::Class>& a,
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700710 const std::pair<const char*, mirror::ClassLoader*>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800711 NO_THREAD_SAFETY_ANALYSIS;
712 // Same descriptor.
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700713 bool operator()(const GcRoot<mirror::Class>& a, const char* descriptor) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800714 NO_THREAD_SAFETY_ANALYSIS;
715 std::size_t operator()(const char* descriptor) const NO_THREAD_SAFETY_ANALYSIS;
716 };
717 class GcRootEmptyFn {
718 public:
719 void MakeEmpty(GcRoot<mirror::Class>& item) const {
720 item = GcRoot<mirror::Class>();
721 }
722 bool IsEmpty(const GcRoot<mirror::Class>& item) const {
723 return item.IsNull();
724 }
725 };
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700726
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800727 // hash set which hashes class descriptor, and compares descriptors nad class loaders. Results
728 // should be compared for a matching Class descriptor and class loader.
729 typedef HashSet<GcRoot<mirror::Class>, GcRootEmptyFn, ClassDescriptorHashEquals,
730 ClassDescriptorHashEquals, TrackingAllocator<GcRoot<mirror::Class>, kAllocatorTagClassTable>>
731 Table;
Hiroshi Yamauchia91a4bc2014-06-13 16:44:55 -0700732 // This contains strong roots. To enable concurrent root scanning of
733 // the class table, be careful to use a read barrier when accessing this.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700734 Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800735 Table pre_zygote_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
736 std::vector<GcRoot<mirror::Class>> new_class_roots_;
Elliott Hughesf8349362012-06-18 15:00:06 -0700737
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700738 // Do we need to search dex caches to find image classes?
739 bool dex_cache_image_class_lookup_required_;
740 // Number of times we've searched dex caches for a class. After a certain number of misses we move
741 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -0700742 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700743
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700744 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700745 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -0700746
Ian Rogers98379392014-02-24 16:53:16 -0800747 // The interface table used by all arrays.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700748 GcRoot<mirror::IfTable> array_iftable_;
Carl Shapiro565f5072011-07-10 13:39:43 -0700749
Ian Rogers98379392014-02-24 16:53:16 -0800750 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
751 // descriptors for the sake of performing FindClass.
752 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700753 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -0800754 size_t find_array_class_cache_next_victim_;
755
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700756 bool init_done_;
Mathieu Chartier893263b2014-03-04 11:07:42 -0800757 bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_);
758 bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700759
Elliott Hughescf4c6c42011-09-01 15:16:42 -0700760 InternTable* intern_table_;
761
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700762 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
763 // patch point within the image. TODO: make these proper relocations.
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700764 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -0700765 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -0800766 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +0100767 const void* quick_to_interpreter_bridge_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700768
Mathieu Chartier2d721012014-11-10 11:08:06 -0800769 // Image pointer size.
770 size_t image_pointer_size_;
771
Brian Carlstrom34f426c2011-10-04 12:58:02 -0700772 friend class ImageWriter; // for GetClassRoots
Alex Lighta59dd802014-07-02 16:28:08 -0700773 friend class ImageDumper; // for FindOpenedOatFileFromOatLocation
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700774 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700775 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
776
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700777 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
778};
779
780} // namespace art
781
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700782#endif // ART_RUNTIME_CLASS_LINKER_H_