blob: b60cba43d0e158bfb008bd5e7e7f82b212d0981c [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
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080020#include <string>
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070021#include <utility>
22#include <vector>
23
Mathieu Chartierbad02672014-08-25 13:08:22 -070024#include "base/allocator.h"
Mathieu Chartierc2e20622014-11-03 11:41:47 -080025#include "base/hash_set.h"
Elliott Hughes76160052012-12-12 16:31:20 -080026#include "base/macros.h"
Elliott Hughes76b61672012-12-12 17:47:30 -080027#include "base/mutex.h"
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070028#include "dex_file.h"
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -070029#include "gc_root.h"
Mathieu Chartier590fee92013-09-13 13:46:47 -070030#include "jni.h"
Brian Carlstrom58ae9412011-10-04 00:56:06 -070031#include "oat_file.h"
Mathieu Chartier83c8ee02014-01-28 14:50:23 -080032#include "object_callbacks.h"
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070033
34namespace art {
Mingyao Yang98d1cc82014-05-15 17:02:16 -070035
Ian Rogers1d54e732013-05-02 21:10:01 -070036namespace gc {
37namespace space {
38 class ImageSpace;
39} // namespace space
40} // namespace gc
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080041namespace mirror {
Ian Rogers33e95662013-05-20 20:29:14 -070042 class ClassLoader;
43 class DexCache;
Mathieu Chartiere401d142015-04-22 13:56:20 -070044 class DexCachePointerArray;
Ian Rogers33e95662013-05-20 20:29:14 -070045 class DexCacheTest_Open_Test;
46 class IfTable;
47 template<class T> class ObjectArray;
48 class StackTraceElement;
49} // namespace mirror
Ian Rogers1d54e732013-05-02 21:10:01 -070050
Andreas Gampe5a4b8a22014-09-11 08:30:08 -070051template<class T> class Handle;
Hiroshi Yamauchi679b1cf2015-05-21 12:05:27 -070052template<class T> class MutableHandle;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070053class InternTable;
Mathieu Chartierc528dba2013-11-26 12:00:11 -080054template<class T> class ObjectLock;
Andreas Gampe7ba64962014-10-23 11:37:40 -070055class Runtime;
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -070056class ScopedObjectAccessAlreadyRunnable;
Mathieu Chartier2d2621a2014-10-23 16:48:06 -070057template<size_t kNumReferences> class PACKED(4) StackHandleScope;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070058
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080059typedef bool (ClassVisitor)(mirror::Class* c, void* arg);
Elliott Hughesa2155262011-11-16 16:26:58 -080060
Mathieu Chartier893263b2014-03-04 11:07:42 -080061enum VisitRootFlags : uint8_t;
62
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070063class ClassLinker {
64 public:
Ian Rogers6f3dbba2014-10-14 17:41:57 -070065 // Well known mirror::Class roots accessed via GetClassRoot.
66 enum ClassRoot {
67 kJavaLangClass,
68 kJavaLangObject,
69 kClassArrayClass,
70 kObjectArrayClass,
71 kJavaLangString,
72 kJavaLangDexCache,
73 kJavaLangRefReference,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070074 kJavaLangReflectConstructor,
Mathieu Chartierdaaf3262015-03-24 13:30:28 -070075 kJavaLangReflectField,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070076 kJavaLangReflectMethod,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070077 kJavaLangReflectProxy,
78 kJavaLangStringArrayClass,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070079 kJavaLangReflectConstructorArrayClass,
Mathieu Chartierdaaf3262015-03-24 13:30:28 -070080 kJavaLangReflectFieldArrayClass,
Mathieu Chartierfc58af42015-04-16 18:00:39 -070081 kJavaLangReflectMethodArrayClass,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070082 kJavaLangClassLoader,
83 kJavaLangThrowable,
84 kJavaLangClassNotFoundException,
85 kJavaLangStackTraceElement,
86 kPrimitiveBoolean,
87 kPrimitiveByte,
88 kPrimitiveChar,
89 kPrimitiveDouble,
90 kPrimitiveFloat,
91 kPrimitiveInt,
92 kPrimitiveLong,
93 kPrimitiveShort,
94 kPrimitiveVoid,
95 kBooleanArrayClass,
96 kByteArrayClass,
97 kCharArrayClass,
98 kDoubleArrayClass,
99 kFloatArrayClass,
100 kIntArrayClass,
101 kLongArrayClass,
102 kShortArrayClass,
103 kJavaLangStackTraceElementArrayClass,
104 kClassRootsMax,
105 };
106
Mathieu Chartier590fee92013-09-13 13:46:47 -0700107 explicit ClassLinker(InternTable* intern_table);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700108 ~ClassLinker();
Carl Shapiro565f5072011-07-10 13:39:43 -0700109
Alex Light64ad14d2014-08-19 14:23:13 -0700110 // Initialize class linker by bootstraping from dex files.
Richard Uhlerfbef44d2014-12-23 09:48:51 -0800111 void InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path)
Mathieu Chartier590fee92013-09-13 13:46:47 -0700112 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
113
114 // Initialize class linker from one or more images.
115 void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
116
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700117 // Finds a class by its descriptor, loading it if necessary.
Brian Carlstrom74eb46a2011-08-02 20:10:14 -0700118 // If class_loader is null, searches boot_class_path_.
Ian Rogers98379392014-02-24 16:53:16 -0800119 mirror::Class* FindClass(Thread* self, const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700120 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700121 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700122
Andreas Gampef865ea92015-04-13 22:14:19 -0700123 // Finds a class in the path class loader, loading it if necessary without using JNI. Hash
124 // function is supposed to be ComputeModifiedUtf8Hash(descriptor). Returns true if the
125 // class-loader chain could be handled, false otherwise, i.e., a non-supported class-loader
126 // was encountered while walking the parent chain (currently only BootClassLoader and
127 // PathClassLoader are supported).
128 bool FindClassInPathClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
129 Thread* self, const char* descriptor, size_t hash,
130 Handle<mirror::ClassLoader> class_loader,
131 mirror::Class** result)
Mathieu Chartierab0ed822014-09-11 14:21:41 -0700132 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
133
Ian Rogers98379392014-02-24 16:53:16 -0800134 // Finds a class by its descriptor using the "system" class loader, ie by searching the
135 // boot_class_path_.
136 mirror::Class* FindSystemClass(Thread* self, const char* descriptor)
137 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
138
139 // Finds the array class given for the element class.
Mathieu Chartierb74cd292014-05-29 14:31:33 -0700140 mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700141 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700142
Ian Rogers63557452014-06-04 16:57:15 -0700143 // Returns true if the class linker is initialized.
Ian Rogers7b078e82014-09-10 14:44:24 -0700144 bool IsInitialized() const {
145 return init_done_;
146 }
Mathieu Chartier590fee92013-09-13 13:46:47 -0700147
Brian Carlstromaded5f72011-10-07 17:15:04 -0700148 // Define a new a class based on a ClassDef from a DexFile
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800149 mirror::Class* DefineClass(Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700150 Handle<mirror::ClassLoader> class_loader,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800151 const DexFile& dex_file, const DexFile::ClassDef& dex_class_def)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700152 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700153
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700154 // Finds a class by its descriptor, returning null if it isn't wasn't loaded
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700155 // by the given 'class_loader'.
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800156 mirror::Class* LookupClass(Thread* self, const char* descriptor, size_t hash,
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800157 mirror::ClassLoader* class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700158 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
159 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700160
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800161 // Finds all the classes with the given descriptor, regardless of ClassLoader.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800162 void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700163 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
164 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800165
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800166 mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -0700167
Brian Carlstromae826982011-11-09 01:33:42 -0800168 // General class unloading is not supported, this is used to prune
169 // unwanted classes during image writing.
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800170 bool RemoveClass(const char* descriptor, mirror::ClassLoader* class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700171 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
172 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromae826982011-11-09 01:33:42 -0800173
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700174 void DumpAllClasses(int flags)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700175 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
176 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes9d5ccec2011-09-19 13:19:50 -0700177
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700178 void DumpForSigQuit(std::ostream& os)
Ian Rogers7b078e82014-09-10 14:44:24 -0700179 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
Elliott Hughescac6cc72011-11-03 20:31:21 -0700180
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700181 size_t NumLoadedClasses()
182 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
183 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughese27955c2011-08-26 15:21:24 -0700184
Brian Carlstromb63ec392011-08-27 17:38:27 -0700185 // Resolve a String with the given index from the DexFile, storing the
Brian Carlstromaded5f72011-10-07 17:15:04 -0700186 // result in the DexCache. The referrer is used to identify the
187 // target DexCache and ClassLoader to use for resolution.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700188 mirror::String* ResolveString(uint32_t string_idx, ArtMethod* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800189 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700190
191 // Resolve a String with the given index from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700192 // result in the DexCache.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800193 mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700194 Handle<mirror::DexCache> dex_cache)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700195 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700196
Brian Carlstromb63ec392011-08-27 17:38:27 -0700197 // Resolve a Type with the given index from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700198 // result in the DexCache. The referrer is used to identity the
199 // target DexCache and ClassLoader to use for resolution.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800200 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer)
Mathieu Chartier590fee92013-09-13 13:46:47 -0700201 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700202
Brian Carlstromb63ec392011-08-27 17:38:27 -0700203 // Resolve a Type with the given index from the DexFile, storing the
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700204 // result in the DexCache. The referrer is used to identify the
Brian Carlstromb63ec392011-08-27 17:38:27 -0700205 // target DexCache and ClassLoader to use for resolution.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700206 mirror::Class* ResolveType(uint16_t type_idx, ArtMethod* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800207 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700208
Mathieu Chartierc7853442015-03-27 14:35:38 -0700209 mirror::Class* ResolveType(uint16_t type_idx, ArtField* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800210 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromb63ec392011-08-27 17:38:27 -0700211
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700212 // Resolve a type with the given ID from the DexFile, storing the
213 // result in DexCache. The ClassLoader is used to search for the
214 // type, since it may be referenced from but not contained within
215 // the given DexFile.
Mathieu Chartier590fee92013-09-13 13:46:47 -0700216 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700217 Handle<mirror::DexCache> dex_cache,
218 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700219 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700220
221 // Resolve a method with a given ID from the DexFile, storing the
222 // result in DexCache. The ClassLinker and ClassLoader are used as
223 // in ResolveType. What is unique is the method type argument which
224 // is used to determine if this method is a direct, static, or
225 // virtual method.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700226 ArtMethod* ResolveMethod(const DexFile& dex_file, uint32_t method_idx,
227 Handle<mirror::DexCache> dex_cache,
228 Handle<mirror::ClassLoader> class_loader, ArtMethod* referrer,
229 InvokeType type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700230 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700231
Mathieu Chartiere401d142015-04-22 13:56:20 -0700232 ArtMethod* GetResolvedMethod(uint32_t method_idx, ArtMethod* referrer)
Mathieu Chartier0cd81352014-05-22 16:48:55 -0700233 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700234 ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, ArtMethod* referrer, InvokeType type)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800235 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom16192862011-09-12 17:50:06 -0700236
Mathieu Chartierc7853442015-03-27 14:35:38 -0700237 ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class)
Mathieu Chartier0cd81352014-05-22 16:48:55 -0700238 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700239 ArtField* GetResolvedField(uint32_t field_idx, mirror::DexCache* dex_cache)
240 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700241 ArtField* ResolveField(uint32_t field_idx, ArtMethod* referrer, bool is_static)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800242 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromb9edb842011-08-28 16:31:06 -0700243
Brian Carlstrom16192862011-09-12 17:50:06 -0700244 // Resolve a field with a given ID from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700245 // result in DexCache. The ClassLinker and ClassLoader are used as
246 // in ResolveType. What is unique is the is_static argument which is
247 // used to determine if we are resolving a static or non-static
248 // field.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700249 ArtField* ResolveField(const DexFile& dex_file,
Brian Carlstromea46f952013-07-30 01:26:50 -0700250 uint32_t field_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700251 Handle<mirror::DexCache> dex_cache,
252 Handle<mirror::ClassLoader> class_loader,
Brian Carlstromea46f952013-07-30 01:26:50 -0700253 bool is_static)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700254 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700255
Ian Rogersb067ac22011-12-13 18:05:09 -0800256 // Resolve a field with a given ID from the DexFile, storing the
257 // result in DexCache. The ClassLinker and ClassLoader are used as
258 // in ResolveType. No is_static argument is provided so that Java
259 // field resolution semantics are followed.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700260 ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700261 Handle<mirror::DexCache> dex_cache,
262 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700263 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersb067ac22011-12-13 18:05:09 -0800264
Ian Rogersad25ac52011-10-04 19:13:33 -0700265 // Get shorty from method index without resolution. Used to do handlerization.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700266 const char* MethodShorty(uint32_t method_idx, ArtMethod* referrer, uint32_t* length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700267 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersad25ac52011-10-04 19:13:33 -0700268
Elliott Hughesf4c21c92011-08-19 17:31:31 -0700269 // Returns true on success, false if there's an exception pending.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700270 // can_run_clinit=false allows the compiler to attempt to init a class,
271 // given the restriction that no <clinit> execution is possible.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700272 bool EnsureInitialized(Thread* self, Handle<mirror::Class> c, bool can_init_fields,
Ian Rogers7b078e82014-09-10 14:44:24 -0700273 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700274 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700275
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700276 // Initializes classes that have instances in the image but that have
277 // <clinit> methods so they could not be initialized by the compiler.
Ian Rogersb726dcb2012-09-05 08:57:23 -0700278 void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700279
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700280 void RegisterDexFile(const DexFile& dex_file)
281 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700282 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700283 void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700285 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700286
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700287 const OatFile* RegisterOatFile(const OatFile* oat_file)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700288 LOCKS_EXCLUDED(dex_lock_);
Brian Carlstrom866c8622012-01-06 16:35:13 -0800289
Brian Carlstrom8a487412011-08-29 20:08:52 -0700290 const std::vector<const DexFile*>& GetBootClassPath() {
291 return boot_class_path_;
292 }
293
Sebastien Hertz0de11332015-05-13 12:14:05 +0200294 // Returns the first non-image oat file in the class path.
295 const OatFile* GetPrimaryOatFile()
296 LOCKS_EXCLUDED(dex_lock_);
297
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700298 void VisitClasses(ClassVisitor* visitor, void* arg)
Ian Rogersdbf3be02014-08-29 15:40:08 -0700299 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700300 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -0700301
302 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
303 // so that it can visit individual classes without holding the doesn't hold the
304 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
305 // can race with insertion and deletion of classes while the visitor is being called.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700306 void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg)
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700307 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughesa2155262011-11-16 16:26:58 -0800308
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700309 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700310 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
311 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700312 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700313 LOCKS_EXCLUDED(dex_lock_)
314 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700315
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700316 mirror::DexCache* FindDexCache(const DexFile& dex_file)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700317 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700318 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700319 bool IsDexFileRegistered(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700320 LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700321 void FixupDexCaches(ArtMethod* resolution_method)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700322 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700323 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom1d9f52b2011-10-13 10:50:45 -0700324
Richard Uhler66d874d2015-01-15 09:37:19 -0800325 // Finds or creates the oat file holding dex_location. Then loads and returns
326 // all corresponding dex files (there may be more than one dex file loaded
327 // in the case of multidex).
328 // This may return the original, unquickened dex files if the oat file could
329 // not be generated.
330 //
331 // Returns an empty vector if the dex files could not be loaded. In this
332 // case, there will be at least one error message returned describing why no
333 // dex files could not be loaded. The 'error_msgs' argument must not be
334 // null, regardless of whether there is an error or not.
335 //
336 // This method should not be called with the mutator_lock_ held, because it
337 // could end up starving GC if we need to generate or relocate any oat
338 // files.
339 std::vector<std::unique_ptr<const DexFile>> OpenDexFilesFromOat(
340 const char* dex_location, const char* oat_location,
341 std::vector<std::string>* error_msgs)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700342 LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
jeffhaof6174e82012-01-31 16:14:17 -0800343
Ian Rogersc0542af2014-09-03 16:16:56 -0700344 // Allocate an instance of a java.lang.Object.
345 mirror::Object* AllocObject(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
346
Elliott Hughes418d20f2011-09-22 14:00:39 -0700347 // TODO: replace this with multiple methods that allocate the correct managed type.
Shih-wei Liao44175362011-08-28 16:59:17 -0700348 template <class T>
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800349 mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700350 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Shih-wei Liao55df06b2011-08-26 14:39:27 -0700351
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800352 mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700353 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
jeffhao98eacac2011-09-14 16:11:53 -0700354
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800355 mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700356 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800357
Mathieu Chartiere401d142015-04-22 13:56:20 -0700358 ArtMethod* AllocArtMethodArray(Thread* self, size_t length);
359
360 mirror::PointerArray* AllocPointerArray(Thread* self, size_t length)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800361 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
362
363 mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
364 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
365
Mathieu Chartierc7853442015-03-27 14:35:38 -0700366 ArtField* AllocArtFieldArray(Thread* self, size_t length)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800367 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
368
369 mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
370 size_t length)
371 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
372
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700373 void VerifyClass(Thread* self, Handle<mirror::Class> klass)
Ian Rogers7b078e82014-09-10 14:44:24 -0700374 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800375 bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
376 mirror::Class::Status& oat_file_class_status)
377 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800378 void ResolveClassExceptionHandlerTypes(const DexFile& dex_file,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700379 Handle<mirror::Class> klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800380 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700381 void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, ArtMethod* klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800382 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
383
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -0700384 mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name,
385 jobjectArray interfaces, jobject loader, jobjectArray methods,
386 jobjectArray throws)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800387 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800388 std::string GetDescriptorForProxy(mirror::Class* proxy_class)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800389 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700390 ArtMethod* FindMethodForProxy(mirror::Class* proxy_class, ArtMethod* proxy_method)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700391 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700392 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400393
Ian Rogers19846512012-02-24 11:42:47 -0800394 // Get the oat code for a method when its class isn't yet initialized
Mathieu Chartiere401d142015-04-22 13:56:20 -0700395 const void* GetQuickOatCodeFor(ArtMethod* method)
Ian Rogersef7d42f2014-01-06 12:55:46 -0800396 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800397
Mathieu Chartiere35517a2012-10-30 18:49:55 -0700398 // Get the oat code for a method from a method index.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700399 const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx,
400 uint32_t method_idx)
Ian Rogersef7d42f2014-01-06 12:55:46 -0800401 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere35517a2012-10-30 18:49:55 -0700402
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700403 // Get compiled code for a method, return null if no code
404 // exists. This is unlike Get..OatCodeFor which will return a bridge
405 // or interpreter entrypoint.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700406 const void* GetOatMethodQuickCodeFor(ArtMethod* method)
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700407 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700408
Nicolas Geoffray9523a3e2015-07-17 11:51:28 +0000409 const OatFile::OatMethod FindOatMethodFor(ArtMethod* method, bool* found)
410 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
411
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700412 pid_t GetClassesLockOwner(); // For SignalCatcher.
413 pid_t GetDexLockOwner(); // For SignalCatcher.
Brian Carlstrom24a3c2e2011-10-17 18:07:52 -0700414
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700415 mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700416
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700417 static const char* GetClassRootDescriptor(ClassRoot class_root);
Andreas Gampe2da88232014-02-27 12:26:20 -0800418
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700419 // Is the given entry point quick code to run the resolution stub?
420 bool IsQuickResolutionStub(const void* entry_point) const;
Jeff Hao88474b42013-10-23 16:24:40 -0700421
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700422 // Is the given entry point quick code to bridge into the interpreter?
423 bool IsQuickToInterpreterBridge(const void* entry_point) const;
424
425 // Is the given entry point quick code to run the generic JNI stub?
426 bool IsQuickGenericJniStub(const void* entry_point) const;
Vladimir Marko8a630572014-04-09 18:45:35 +0100427
Jeff Hao88474b42013-10-23 16:24:40 -0700428 InternTable* GetInternTable() const {
429 return intern_table_;
430 }
431
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700432 // Set the entrypoints up for method to the given code.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700433 void SetEntryPointsToCompiledCode(ArtMethod* method, const void* method_code) const
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700434 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
435
436 // Set the entrypoints up for method to the enter the interpreter.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700437 void SetEntryPointsToInterpreter(ArtMethod* method) const
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700438 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
439
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700440 // Attempts to insert a class into a class table. Returns null if
Ian Rogers848871b2013-08-05 10:56:33 -0700441 // the class was inserted, otherwise returns an existing class with
442 // the same descriptor and ClassLoader.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700443 mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash)
Ian Rogers848871b2013-08-05 10:56:33 -0700444 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
445 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
446
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700447 mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700448 mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700449 DCHECK(class_roots != nullptr);
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700450 return class_roots;
451 }
452
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800453 // Move all of the image classes into the class table for faster lookups.
454 void MoveImageClassesToClassTable()
455 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
456 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
457 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
458 // that no more classes are ever added to the pre zygote table which makes it that the pages
459 // always remain shared dirty instead of private dirty.
460 void MoveClassTableToPreZygote()
461 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
462 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
463
Sebastien Hertz6963e442014-11-26 22:11:27 +0100464 // Returns true if the method can be called with its direct code pointer, false otherwise.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700465 bool MayBeCalledWithDirectCodePointer(ArtMethod* m)
Sebastien Hertz6963e442014-11-26 22:11:27 +0100466 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
467
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700468 // Creates a GlobalRef PathClassLoader that can be used to load classes from the given dex files.
469 // Note: the objects are not completely set up. Do not use this outside of tests and the compiler.
470 jobject CreatePathClassLoader(Thread* self, std::vector<const DexFile*>& dex_files)
471 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
472
Mathieu Chartiere401d142015-04-22 13:56:20 -0700473 size_t GetImagePointerSize() const {
474 DCHECK(ValidPointerSize(image_pointer_size_)) << image_pointer_size_;
475 return image_pointer_size_;
476 }
477
478 // Used by image writer for checking.
479 bool ClassInClassTable(mirror::Class* klass)
480 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
Mathieu Chartiera89d7ed2014-12-05 10:57:13 -0800481 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
482
Mathieu Chartiere401d142015-04-22 13:56:20 -0700483 ArtMethod* CreateRuntimeMethod();
484
Andreas Gampe8ac75952015-06-02 21:01:45 -0700485 // Clear the ArrayClass cache. This is necessary when cleaning up for the image, as the cache
486 // entries are roots, but potentially not image classes.
487 void DropFindArrayClassCache() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
488
Mathieu Chartiere401d142015-04-22 13:56:20 -0700489 private:
Brian Carlstrom56d947f2013-07-15 13:14:23 -0700490 OatFile& GetImageOatFile(gc::space::ImageSpace* space)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700491 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700492 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700493
Ian Rogers98379392014-02-24 16:53:16 -0800494 void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700495
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700496 // For early bootstrapping by Init
Ian Rogers6fac4472014-02-25 17:01:10 -0800497 mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700498 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700499
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800500 // Alloc* convenience functions to avoid needing to pass in mirror::Class*
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700501 // values that are known to the ClassLinker such as
502 // kObjectArrayClass and kJavaLangString etc.
Ian Rogers6fac4472014-02-25 17:01:10 -0800503 mirror::Class* AllocClass(Thread* self, uint32_t class_size)
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800504 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800505 mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700506 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700507
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800508 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
509 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
510 mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700511 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom5b8e4c82011-09-18 01:38:59 -0700512
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700513
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800514 mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700515 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700516 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700517
Ian Rogers7b078e82014-09-10 14:44:24 -0700518 void AppendToBootClassPath(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700519 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700520 void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700521 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700522
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700523 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
524 // sufficient to hold all static fields.
525 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
526 const DexFile::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700527
Mathieu Chartierc7853442015-03-27 14:35:38 -0700528 // Setup the classloader, class def index, type idx so that we can insert this class in the class
529 // table.
530 void SetupClass(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
531 Handle<mirror::Class> klass, mirror::ClassLoader* class_loader)
532 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
533
Ian Rogers7b078e82014-09-10 14:44:24 -0700534 void LoadClass(Thread* self, const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700535 Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700536 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers13735952014-10-08 12:43:28 -0700537 void LoadClassMembers(Thread* self, const DexFile& dex_file, const uint8_t* class_data,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700538 Handle<mirror::Class> klass, const OatFile::OatClass* oat_class)
Vladimir Markod3c5beb2014-04-11 16:32:51 +0100539 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700540
Mathieu Chartierc7853442015-03-27 14:35:38 -0700541 void LoadField(const ClassDataItemIterator& it, Handle<mirror::Class> klass,
542 ArtField* dst)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800543 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700544
Mathieu Chartiere401d142015-04-22 13:56:20 -0700545 void LoadMethod(Thread* self, const DexFile& dex_file, const ClassDataItemIterator& it,
546 Handle<mirror::Class> klass, ArtMethod* dst)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800547 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700548
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800549 void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800550
Ian Rogers97b52f82014-08-14 11:34:07 -0700551 // Finds the associated oat class for a dex_file and descriptor. Returns an invalid OatClass on
552 // error and sets found to false.
553 OatFile::OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found)
Ian Rogers33e95662013-05-20 20:29:14 -0700554 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800555
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700556 void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700557 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700558 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700559 bool IsDexFileRegisteredLocked(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700560 SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700561
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700562 bool InitializeClass(Thread* self, Handle<mirror::Class> klass, bool can_run_clinit,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800563 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700564 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700565 bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800566 ObjectLock<mirror::Class>& lock);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700567 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700568 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700569
Ian Rogers98379392014-02-24 16:53:16 -0800570 bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700571 Handle<mirror::ClassLoader> class_loader1,
572 Handle<mirror::ClassLoader> class_loader2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700573 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700574
Mathieu Chartiere401d142015-04-22 13:56:20 -0700575 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, ArtMethod* method,
576 mirror::Class* klass1, mirror::Class* klass2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700577 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700578
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700579 bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass,
580 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Hiroshi Yamauchi679b1cf2015-05-21 12:05:27 -0700581 MutableHandle<mirror::Class>* h_new_class_out)
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 LinkSuperClass(Handle<mirror::Class> klass)
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 LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700588 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700589
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700590 bool LinkMethods(Thread* self, Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700591 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700592 ArtMethod** out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700593 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700594
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700595 bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700596 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700597
Mathieu Chartiere401d142015-04-22 13:56:20 -0700598 bool LinkInterfaceMethods(Thread* self, Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700599 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700600 ArtMethod** out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700601 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700602
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700603 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700604 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700605 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700606 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700607 bool LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_static, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700608 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700609 void LinkCode(ArtMethod* method, const OatFile::OatClass* oat_class,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700610 uint32_t class_def_method_index)
Dmitry Petrochenkof0972a42014-05-16 17:43:39 +0700611 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700612 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700613 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700614
Mathieu Chartiere401d142015-04-22 13:56:20 -0700615 void CheckProxyConstructor(ArtMethod* constructor) const
616 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
617 void CheckProxyMethod(ArtMethod* method, ArtMethod* prototype) const
618 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
619
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700620 // For use by ImageWriter to find DexCaches for its roots
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700621 ReaderWriterMutex* DexLock()
622 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) {
623 return &dex_lock_;
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700624 }
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700625 size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) {
626 return dex_caches_.size();
627 }
628 mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700629
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700630 const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700631 LOCKS_EXCLUDED(dex_lock_);
Andreas Gampe833a4852014-05-21 18:46:59 -0700632
Sebastien Hertz0de11332015-05-13 12:14:05 +0200633 // Returns the boot image oat file.
634 const OatFile* GetBootOatFile() SHARED_LOCKS_REQUIRED(dex_lock_);
635
Mathieu Chartiere401d142015-04-22 13:56:20 -0700636 void CreateProxyConstructor(Handle<mirror::Class> klass, ArtMethod* out)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700637 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700638 void CreateProxyMethod(Handle<mirror::Class> klass, ArtMethod* prototype, ArtMethod* out)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700639 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400640
Andreas Gampe48498592014-09-10 19:48:05 -0700641 // Ensures that methods have the kAccPreverified bit set. We use the kAccPreverfied bit on the
642 // class access flags to determine whether this has been done before.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700643 void EnsurePreverifiedMethods(Handle<mirror::Class> c)
Andreas Gampe48498592014-09-10 19:48:05 -0700644 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
645
Ian Rogersdbf3be02014-08-29 15:40:08 -0700646 mirror::Class* LookupClassFromTableLocked(const char* descriptor,
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800647 mirror::ClassLoader* class_loader,
Ian Rogersdbf3be02014-08-29 15:40:08 -0700648 size_t hash)
649 SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
650
651 mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash)
652 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
653 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
654
Ian Rogersdbf3be02014-08-29 15:40:08 -0700655 mirror::Class* LookupClassFromImage(const char* descriptor)
656 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
657
658 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
659 // before returning it to the caller. Its the responsibility of the thread that placed the class
660 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
661 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
662 // retire a class, the version of the class in the table is returned and this may differ from
663 // the class passed in.
664 mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass)
665 WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
666
667 void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class)
668 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
669
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700670 void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
671 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
672
673 // Return the quick generic JNI stub for testing.
674 const void* GetRuntimeQuickGenericJniStub() const;
675
Andreas Gampebfdcdc12015-04-22 18:10:36 -0700676 // Throw the class initialization failure recorded when first trying to initialize the given
677 // class.
678 // Note: Currently we only store the descriptor, so we cannot throw the exact throwable, only
679 // a recreation with a custom string.
680 void ThrowEarlierClassFailure(mirror::Class* c) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
681
Andreas Gampeb9aec2c2015-04-23 22:23:47 -0700682 // Check for duplicate class definitions of the given oat file against all open oat files.
683 bool HasCollisions(const OatFile* oat_file, std::string* error_msg) LOCKS_EXCLUDED(dex_lock_);
684
Mathieu Chartiere401d142015-04-22 13:56:20 -0700685 bool HasInitWithString(Thread* self, ClassLinker* class_linker, const char* descriptor)
686 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
687
688 bool CanWeInitializeClass(mirror::Class* klass, bool can_init_statics, bool can_init_parents)
689 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
690
691 void UpdateClassVirtualMethods(mirror::Class* klass, ArtMethod* new_methods,
692 size_t new_num_methods)
693 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
694
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700695 std::vector<const DexFile*> boot_class_path_;
Richard Uhlerfbef44d2014-12-23 09:48:51 -0800696 std::vector<std::unique_ptr<const DexFile>> opened_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700697
Ian Rogers1bf8d4d2013-05-30 00:18:49 -0700698 mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
Andreas Gampec8ccf682014-09-29 20:07:43 -0700699 std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700700 std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -0700701 std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -0700702
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800703 class ClassDescriptorHashEquals {
704 public:
705 // Same class loader and descriptor.
706 std::size_t operator()(const GcRoot<mirror::Class>& root) const NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700707 bool operator()(const GcRoot<mirror::Class>& a, const GcRoot<mirror::Class>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800708 NO_THREAD_SAFETY_ANALYSIS;
709 // Same class loader and descriptor.
710 std::size_t operator()(const std::pair<const char*, mirror::ClassLoader*>& element) const
711 NO_THREAD_SAFETY_ANALYSIS;
712 bool operator()(const GcRoot<mirror::Class>& a,
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700713 const std::pair<const char*, mirror::ClassLoader*>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800714 NO_THREAD_SAFETY_ANALYSIS;
715 // Same descriptor.
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700716 bool operator()(const GcRoot<mirror::Class>& a, const char* descriptor) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800717 NO_THREAD_SAFETY_ANALYSIS;
718 std::size_t operator()(const char* descriptor) const NO_THREAD_SAFETY_ANALYSIS;
719 };
720 class GcRootEmptyFn {
721 public:
722 void MakeEmpty(GcRoot<mirror::Class>& item) const {
723 item = GcRoot<mirror::Class>();
724 }
725 bool IsEmpty(const GcRoot<mirror::Class>& item) const {
726 return item.IsNull();
727 }
728 };
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700729
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800730 // hash set which hashes class descriptor, and compares descriptors nad class loaders. Results
731 // should be compared for a matching Class descriptor and class loader.
732 typedef HashSet<GcRoot<mirror::Class>, GcRootEmptyFn, ClassDescriptorHashEquals,
733 ClassDescriptorHashEquals, TrackingAllocator<GcRoot<mirror::Class>, kAllocatorTagClassTable>>
734 Table;
Hiroshi Yamauchia91a4bc2014-06-13 16:44:55 -0700735 // This contains strong roots. To enable concurrent root scanning of
736 // the class table, be careful to use a read barrier when accessing this.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700737 Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800738 Table pre_zygote_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
739 std::vector<GcRoot<mirror::Class>> new_class_roots_;
Elliott Hughesf8349362012-06-18 15:00:06 -0700740
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700741 // Do we need to search dex caches to find image classes?
742 bool dex_cache_image_class_lookup_required_;
743 // Number of times we've searched dex caches for a class. After a certain number of misses we move
744 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -0700745 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700746
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700747 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700748 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -0700749
Ian Rogers98379392014-02-24 16:53:16 -0800750 // The interface table used by all arrays.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700751 GcRoot<mirror::IfTable> array_iftable_;
Carl Shapiro565f5072011-07-10 13:39:43 -0700752
Ian Rogers98379392014-02-24 16:53:16 -0800753 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
754 // descriptors for the sake of performing FindClass.
755 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700756 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -0800757 size_t find_array_class_cache_next_victim_;
758
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700759 bool init_done_;
Mathieu Chartier893263b2014-03-04 11:07:42 -0800760 bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_);
761 bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700762
Elliott Hughescf4c6c42011-09-01 15:16:42 -0700763 InternTable* intern_table_;
764
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700765 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
766 // patch point within the image. TODO: make these proper relocations.
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700767 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -0700768 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -0800769 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +0100770 const void* quick_to_interpreter_bridge_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700771
Mathieu Chartier2d721012014-11-10 11:08:06 -0800772 // Image pointer size.
773 size_t image_pointer_size_;
774
Brian Carlstrom34f426c2011-10-04 12:58:02 -0700775 friend class ImageWriter; // for GetClassRoots
Alex Lighta59dd802014-07-02 16:28:08 -0700776 friend class ImageDumper; // for FindOpenedOatFileFromOatLocation
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700777 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700778 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
779
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700780 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
781};
782
783} // namespace art
784
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700785#endif // ART_RUNTIME_CLASS_LINKER_H_