blob: 24274624277802c08da4900ff822d8a341491463 [file] [log] [blame]
Elliott Hughes418d20f2011-09-22 14:00:39 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070016
Brian Carlstromfc0e3212013-07-17 14:40:12 -070017#ifndef ART_RUNTIME_CLASS_LINKER_H_
18#define ART_RUNTIME_CLASS_LINKER_H_
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070019
Fred Shih37f05ef2014-07-16 18:38:08 -070020#include <deque>
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080021#include <string>
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070022#include <utility>
23#include <vector>
24
Mathieu Chartierbad02672014-08-25 13:08:22 -070025#include "base/allocator.h"
Mathieu Chartierc2e20622014-11-03 11:41:47 -080026#include "base/hash_set.h"
Elliott Hughes76160052012-12-12 16:31:20 -080027#include "base/macros.h"
Elliott Hughes76b61672012-12-12 17:47:30 -080028#include "base/mutex.h"
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070029#include "dex_file.h"
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -070030#include "gc_root.h"
Mathieu Chartier590fee92013-09-13 13:46:47 -070031#include "jni.h"
Brian Carlstrom58ae9412011-10-04 00:56:06 -070032#include "oat_file.h"
Mathieu Chartier83c8ee02014-01-28 14:50:23 -080033#include "object_callbacks.h"
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070034
35namespace art {
Mingyao Yang98d1cc82014-05-15 17:02:16 -070036
Ian Rogers1d54e732013-05-02 21:10:01 -070037namespace gc {
38namespace space {
39 class ImageSpace;
40} // namespace space
41} // namespace gc
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080042namespace mirror {
Ian Rogers33e95662013-05-20 20:29:14 -070043 class ClassLoader;
44 class DexCache;
45 class DexCacheTest_Open_Test;
46 class IfTable;
47 template<class T> class ObjectArray;
48 class StackTraceElement;
49} // namespace mirror
Ian Rogers1d54e732013-05-02 21:10:01 -070050
Andreas Gampe5a4b8a22014-09-11 08:30:08 -070051template<class T> class Handle;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070052class InternTable;
Mathieu Chartierc528dba2013-11-26 12:00:11 -080053template<class T> class ObjectLock;
Andreas Gampe7ba64962014-10-23 11:37:40 -070054class Runtime;
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -070055class ScopedObjectAccessAlreadyRunnable;
Mathieu Chartier2d2621a2014-10-23 16:48:06 -070056template<size_t kNumReferences> class PACKED(4) StackHandleScope;
Elliott Hughescf4c6c42011-09-01 15:16:42 -070057
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080058typedef bool (ClassVisitor)(mirror::Class* c, void* arg);
Elliott Hughesa2155262011-11-16 16:26:58 -080059
Mathieu Chartier893263b2014-03-04 11:07:42 -080060enum VisitRootFlags : uint8_t;
61
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070062class ClassLinker {
63 public:
Ian Rogers6f3dbba2014-10-14 17:41:57 -070064 // Well known mirror::Class roots accessed via GetClassRoot.
65 enum ClassRoot {
66 kJavaLangClass,
67 kJavaLangObject,
68 kClassArrayClass,
69 kObjectArrayClass,
70 kJavaLangString,
71 kJavaLangDexCache,
72 kJavaLangRefReference,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070073 kJavaLangReflectArtMethod,
Mathieu Chartierdaaf3262015-03-24 13:30:28 -070074 kJavaLangReflectField,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070075 kJavaLangReflectProxy,
76 kJavaLangStringArrayClass,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070077 kJavaLangReflectArtMethodArrayClass,
Mathieu Chartierdaaf3262015-03-24 13:30:28 -070078 kJavaLangReflectFieldArrayClass,
Ian Rogers6f3dbba2014-10-14 17:41:57 -070079 kJavaLangClassLoader,
80 kJavaLangThrowable,
81 kJavaLangClassNotFoundException,
82 kJavaLangStackTraceElement,
83 kPrimitiveBoolean,
84 kPrimitiveByte,
85 kPrimitiveChar,
86 kPrimitiveDouble,
87 kPrimitiveFloat,
88 kPrimitiveInt,
89 kPrimitiveLong,
90 kPrimitiveShort,
91 kPrimitiveVoid,
92 kBooleanArrayClass,
93 kByteArrayClass,
94 kCharArrayClass,
95 kDoubleArrayClass,
96 kFloatArrayClass,
97 kIntArrayClass,
98 kLongArrayClass,
99 kShortArrayClass,
100 kJavaLangStackTraceElementArrayClass,
101 kClassRootsMax,
102 };
103
Mathieu Chartier590fee92013-09-13 13:46:47 -0700104 explicit ClassLinker(InternTable* intern_table);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700105 ~ClassLinker();
Carl Shapiro565f5072011-07-10 13:39:43 -0700106
Alex Light64ad14d2014-08-19 14:23:13 -0700107 // Initialize class linker by bootstraping from dex files.
Richard Uhlerfbef44d2014-12-23 09:48:51 -0800108 void InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path)
Mathieu Chartier590fee92013-09-13 13:46:47 -0700109 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
110
111 // Initialize class linker from one or more images.
112 void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
113
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700114 // Finds a class by its descriptor, loading it if necessary.
Brian Carlstrom74eb46a2011-08-02 20:10:14 -0700115 // If class_loader is null, searches boot_class_path_.
Ian Rogers98379392014-02-24 16:53:16 -0800116 mirror::Class* FindClass(Thread* self, const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700117 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700118 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700119
Ian Rogers32427292014-11-19 14:05:21 -0800120 // Find a class in the path class loader, loading it if necessary without using JNI. Hash
121 // function is supposed to be ComputeModifiedUtf8Hash(descriptor).
Mathieu Chartierab0ed822014-09-11 14:21:41 -0700122 mirror::Class* FindClassInPathClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800123 Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700124 Handle<mirror::ClassLoader> class_loader)
Mathieu Chartierab0ed822014-09-11 14:21:41 -0700125 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
126
Ian Rogers98379392014-02-24 16:53:16 -0800127 // Finds a class by its descriptor using the "system" class loader, ie by searching the
128 // boot_class_path_.
129 mirror::Class* FindSystemClass(Thread* self, const char* descriptor)
130 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
131
132 // Finds the array class given for the element class.
Mathieu Chartierb74cd292014-05-29 14:31:33 -0700133 mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700134 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700135
Ian Rogers63557452014-06-04 16:57:15 -0700136 // Returns true if the class linker is initialized.
Ian Rogers7b078e82014-09-10 14:44:24 -0700137 bool IsInitialized() const {
138 return init_done_;
139 }
Mathieu Chartier590fee92013-09-13 13:46:47 -0700140
Brian Carlstromaded5f72011-10-07 17:15:04 -0700141 // Define a new a class based on a ClassDef from a DexFile
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800142 mirror::Class* DefineClass(Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700143 Handle<mirror::ClassLoader> class_loader,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800144 const DexFile& dex_file, const DexFile::ClassDef& dex_class_def)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700145 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes64bf5a32011-09-20 14:43:12 -0700146
147 // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
148 // by the given 'class_loader'.
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800149 mirror::Class* LookupClass(Thread* self, const char* descriptor, size_t hash,
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800150 mirror::ClassLoader* class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700151 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
152 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700153
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800154 // Finds all the classes with the given descriptor, regardless of ClassLoader.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800155 void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700156 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
157 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes6fa602d2011-12-02 17:54:25 -0800158
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800159 mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughesd8ddfd52011-08-15 14:32:53 -0700160
Brian Carlstromae826982011-11-09 01:33:42 -0800161 // General class unloading is not supported, this is used to prune
162 // unwanted classes during image writing.
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800163 bool RemoveClass(const char* descriptor, mirror::ClassLoader* class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700164 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
165 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromae826982011-11-09 01:33:42 -0800166
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700167 void DumpAllClasses(int flags)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700168 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
169 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes9d5ccec2011-09-19 13:19:50 -0700170
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700171 void DumpForSigQuit(std::ostream& os)
Ian Rogers7b078e82014-09-10 14:44:24 -0700172 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
Elliott Hughescac6cc72011-11-03 20:31:21 -0700173
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700174 size_t NumLoadedClasses()
175 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
176 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughese27955c2011-08-26 15:21:24 -0700177
Brian Carlstromb63ec392011-08-27 17:38:27 -0700178 // Resolve a String with the given index from the DexFile, storing the
Brian Carlstromaded5f72011-10-07 17:15:04 -0700179 // result in the DexCache. The referrer is used to identify the
180 // target DexCache and ClassLoader to use for resolution.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800181 mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800182 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700183
184 // Resolve a String with the given index from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700185 // result in the DexCache.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800186 mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700187 Handle<mirror::DexCache> dex_cache)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700188 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700189
Brian Carlstromb63ec392011-08-27 17:38:27 -0700190 // Resolve a Type with the given index from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700191 // result in the DexCache. The referrer is used to identity the
192 // target DexCache and ClassLoader to use for resolution.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800193 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer)
Mathieu Chartier590fee92013-09-13 13:46:47 -0700194 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700195
Brian Carlstromb63ec392011-08-27 17:38:27 -0700196 // Resolve a Type with the given index from the DexFile, storing the
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700197 // result in the DexCache. The referrer is used to identify the
Brian Carlstromb63ec392011-08-27 17:38:27 -0700198 // target DexCache and ClassLoader to use for resolution.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800199 mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800200 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700201
Mathieu Chartierc7853442015-03-27 14:35:38 -0700202 mirror::Class* ResolveType(uint16_t type_idx, ArtField* referrer)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800203 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromb63ec392011-08-27 17:38:27 -0700204
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700205 // Resolve a type with the given ID from the DexFile, storing the
206 // result in DexCache. The ClassLoader is used to search for the
207 // type, since it may be referenced from but not contained within
208 // the given DexFile.
Mathieu Chartier590fee92013-09-13 13:46:47 -0700209 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700210 Handle<mirror::DexCache> dex_cache,
211 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700212 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700213
214 // Resolve a method with a given ID from the DexFile, storing the
215 // result in DexCache. The ClassLinker and ClassLoader are used as
216 // in ResolveType. What is unique is the method type argument which
217 // is used to determine if this method is a direct, static, or
218 // virtual method.
Brian Carlstromea46f952013-07-30 01:26:50 -0700219 mirror::ArtMethod* ResolveMethod(const DexFile& dex_file,
220 uint32_t method_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700221 Handle<mirror::DexCache> dex_cache,
222 Handle<mirror::ClassLoader> class_loader,
223 Handle<mirror::ArtMethod> referrer,
Brian Carlstromea46f952013-07-30 01:26:50 -0700224 InvokeType type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700225 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700226
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700227 mirror::ArtMethod* GetResolvedMethod(uint32_t method_idx, mirror::ArtMethod* referrer)
Mathieu Chartier0cd81352014-05-22 16:48:55 -0700228 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
229 mirror::ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, mirror::ArtMethod** referrer,
Brian Carlstromea46f952013-07-30 01:26:50 -0700230 InvokeType type)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800231 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom16192862011-09-12 17:50:06 -0700232
Mathieu Chartierc7853442015-03-27 14:35:38 -0700233 ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class)
Mathieu Chartier0cd81352014-05-22 16:48:55 -0700234 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700235 ArtField* GetResolvedField(uint32_t field_idx, mirror::DexCache* dex_cache)
236 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
237 ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer, bool is_static)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800238 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromb9edb842011-08-28 16:31:06 -0700239
Brian Carlstrom16192862011-09-12 17:50:06 -0700240 // Resolve a field with a given ID from the DexFile, storing the
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700241 // result in DexCache. The ClassLinker and ClassLoader are used as
242 // in ResolveType. What is unique is the is_static argument which is
243 // used to determine if we are resolving a static or non-static
244 // field.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700245 ArtField* ResolveField(const DexFile& dex_file,
Brian Carlstromea46f952013-07-30 01:26:50 -0700246 uint32_t field_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700247 Handle<mirror::DexCache> dex_cache,
248 Handle<mirror::ClassLoader> class_loader,
Brian Carlstromea46f952013-07-30 01:26:50 -0700249 bool is_static)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700250 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700251
Ian Rogersb067ac22011-12-13 18:05:09 -0800252 // Resolve a field with a given ID from the DexFile, storing the
253 // result in DexCache. The ClassLinker and ClassLoader are used as
254 // in ResolveType. No is_static argument is provided so that Java
255 // field resolution semantics are followed.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700256 ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700257 Handle<mirror::DexCache> dex_cache,
258 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700259 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersb067ac22011-12-13 18:05:09 -0800260
Ian Rogersad25ac52011-10-04 19:13:33 -0700261 // Get shorty from method index without resolution. Used to do handlerization.
Brian Carlstromea46f952013-07-30 01:26:50 -0700262 const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700263 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersad25ac52011-10-04 19:13:33 -0700264
Elliott Hughesf4c21c92011-08-19 17:31:31 -0700265 // Returns true on success, false if there's an exception pending.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700266 // can_run_clinit=false allows the compiler to attempt to init a class,
267 // given the restriction that no <clinit> execution is possible.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700268 bool EnsureInitialized(Thread* self, Handle<mirror::Class> c, bool can_init_fields,
Ian Rogers7b078e82014-09-10 14:44:24 -0700269 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700270 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700271
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700272 // Initializes classes that have instances in the image but that have
273 // <clinit> methods so they could not be initialized by the compiler.
Ian Rogersb726dcb2012-09-05 08:57:23 -0700274 void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughes2a20cfd2011-09-23 19:30:41 -0700275
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700276 void RegisterDexFile(const DexFile& dex_file)
277 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700278 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700279 void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700280 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700281 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700282
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700283 const OatFile* RegisterOatFile(const OatFile* oat_file)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 LOCKS_EXCLUDED(dex_lock_);
Brian Carlstrom866c8622012-01-06 16:35:13 -0800285
Brian Carlstrom8a487412011-08-29 20:08:52 -0700286 const std::vector<const DexFile*>& GetBootClassPath() {
287 return boot_class_path_;
288 }
289
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700290 void VisitClasses(ClassVisitor* visitor, void* arg)
Ian Rogersdbf3be02014-08-29 15:40:08 -0700291 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700292 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersdbf3be02014-08-29 15:40:08 -0700293
294 // Less efficient variant of VisitClasses that copies the class_table_ into secondary storage
295 // so that it can visit individual classes without holding the doesn't hold the
296 // Locks::classlinker_classes_lock_. As the Locks::classlinker_classes_lock_ isn't held this code
297 // can race with insertion and deletion of classes while the visitor is being called.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700298 void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg)
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700299 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Elliott Hughesa2155262011-11-16 16:26:58 -0800300
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700301 void VisitClassRoots(RootVisitor* visitor, VisitRootFlags flags)
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700302 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
303 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierbb87e0f2015-04-03 11:21:55 -0700304 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags)
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700305 LOCKS_EXCLUDED(dex_lock_)
306 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700307
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700308 mirror::DexCache* FindDexCache(const DexFile& dex_file)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700309 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700310 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700311 bool IsDexFileRegistered(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700312 LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700313 void FixupDexCaches(mirror::ArtMethod* resolution_method)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700314 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700315 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom1d9f52b2011-10-13 10:50:45 -0700316
Richard Uhler66d874d2015-01-15 09:37:19 -0800317 // Finds or creates the oat file holding dex_location. Then loads and returns
318 // all corresponding dex files (there may be more than one dex file loaded
319 // in the case of multidex).
320 // This may return the original, unquickened dex files if the oat file could
321 // not be generated.
322 //
323 // Returns an empty vector if the dex files could not be loaded. In this
324 // case, there will be at least one error message returned describing why no
325 // dex files could not be loaded. The 'error_msgs' argument must not be
326 // null, regardless of whether there is an error or not.
327 //
328 // This method should not be called with the mutator_lock_ held, because it
329 // could end up starving GC if we need to generate or relocate any oat
330 // files.
331 std::vector<std::unique_ptr<const DexFile>> OpenDexFilesFromOat(
332 const char* dex_location, const char* oat_location,
333 std::vector<std::string>* error_msgs)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700334 LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
jeffhaof6174e82012-01-31 16:14:17 -0800335
Ian Rogersc0542af2014-09-03 16:16:56 -0700336 // Allocate an instance of a java.lang.Object.
337 mirror::Object* AllocObject(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
338
Elliott Hughes418d20f2011-09-22 14:00:39 -0700339 // TODO: replace this with multiple methods that allocate the correct managed type.
Shih-wei Liao44175362011-08-28 16:59:17 -0700340 template <class T>
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800341 mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700342 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Shih-wei Liao55df06b2011-08-26 14:39:27 -0700343
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800344 mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700345 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
jeffhao98eacac2011-09-14 16:11:53 -0700346
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800347 mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700348 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800349
Brian Carlstromea46f952013-07-30 01:26:50 -0700350 mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800351 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
352
353 mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
354 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
355
Mathieu Chartierc7853442015-03-27 14:35:38 -0700356 ArtField* AllocArtFieldArray(Thread* self, size_t length)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800357 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
358
359 mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
360 size_t length)
361 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
362
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700363 void VerifyClass(Thread* self, Handle<mirror::Class> klass)
Ian Rogers7b078e82014-09-10 14:44:24 -0700364 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800365 bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
366 mirror::Class::Status& oat_file_class_status)
367 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800368 void ResolveClassExceptionHandlerTypes(const DexFile& dex_file,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700369 Handle<mirror::Class> klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800370 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstromea46f952013-07-30 01:26:50 -0700371 void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800372 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
373
Mathieu Chartier2b7c4d12014-05-19 10:52:16 -0700374 mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name,
375 jobjectArray interfaces, jobject loader, jobjectArray methods,
376 jobjectArray throws)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800377 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800378 std::string GetDescriptorForProxy(mirror::Class* proxy_class)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800379 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800380 mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class,
381 mirror::ArtMethod* proxy_method)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700382 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700383 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400384
Ian Rogers19846512012-02-24 11:42:47 -0800385 // Get the oat code for a method when its class isn't yet initialized
Ian Rogersef7d42f2014-01-06 12:55:46 -0800386 const void* GetQuickOatCodeFor(mirror::ArtMethod* method)
387 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800388
Mathieu Chartiere35517a2012-10-30 18:49:55 -0700389 // Get the oat code for a method from a method index.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800390 const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx)
391 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Mathieu Chartiere35517a2012-10-30 18:49:55 -0700392
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700393 // Get compiled code for a method, return null if no code
394 // exists. This is unlike Get..OatCodeFor which will return a bridge
395 // or interpreter entrypoint.
396 const void* GetOatMethodQuickCodeFor(mirror::ArtMethod* method)
397 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchi9bdec882014-08-15 17:11:12 -0700398
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700399 pid_t GetClassesLockOwner(); // For SignalCatcher.
400 pid_t GetDexLockOwner(); // For SignalCatcher.
Brian Carlstrom24a3c2e2011-10-17 18:07:52 -0700401
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700402 mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700403
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700404 static const char* GetClassRootDescriptor(ClassRoot class_root);
Andreas Gampe2da88232014-02-27 12:26:20 -0800405
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700406 // Is the given entry point quick code to run the resolution stub?
407 bool IsQuickResolutionStub(const void* entry_point) const;
Jeff Hao88474b42013-10-23 16:24:40 -0700408
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700409 // Is the given entry point quick code to bridge into the interpreter?
410 bool IsQuickToInterpreterBridge(const void* entry_point) const;
411
412 // Is the given entry point quick code to run the generic JNI stub?
413 bool IsQuickGenericJniStub(const void* entry_point) const;
Vladimir Marko8a630572014-04-09 18:45:35 +0100414
Jeff Hao88474b42013-10-23 16:24:40 -0700415 InternTable* GetInternTable() const {
416 return intern_table_;
417 }
418
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700419 // Set the entrypoints up for method to the given code.
Elliott Hughes956af0f2014-12-11 14:34:28 -0800420 void SetEntryPointsToCompiledCode(mirror::ArtMethod* method, const void* method_code) const
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700421 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
422
423 // Set the entrypoints up for method to the enter the interpreter.
424 void SetEntryPointsToInterpreter(mirror::ArtMethod* method) const
425 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
426
Ian Rogers848871b2013-08-05 10:56:33 -0700427 // Attempts to insert a class into a class table. Returns NULL if
428 // the class was inserted, otherwise returns an existing class with
429 // the same descriptor and ClassLoader.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700430 mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash)
Ian Rogers848871b2013-08-05 10:56:33 -0700431 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
432 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
433
Mathieu Chartier590fee92013-09-13 13:46:47 -0700434 // Special code to allocate an art method, use this instead of class->AllocObject.
435 mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro61e019d2011-07-14 16:53:09 -0700436
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700437 mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700438 mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read();
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700439 DCHECK(class_roots != NULL);
440 return class_roots;
441 }
442
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800443 // Move all of the image classes into the class table for faster lookups.
444 void MoveImageClassesToClassTable()
445 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
446 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
447 // Move the class table to the pre-zygote table to reduce memory usage. This works by ensuring
448 // that no more classes are ever added to the pre zygote table which makes it that the pages
449 // always remain shared dirty instead of private dirty.
450 void MoveClassTableToPreZygote()
451 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
452 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
453
Sebastien Hertz6963e442014-11-26 22:11:27 +0100454 // Returns true if the method can be called with its direct code pointer, false otherwise.
455 bool MayBeCalledWithDirectCodePointer(mirror::ArtMethod* m)
456 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
457
Andreas Gampe81c6f8d2015-03-25 17:19:53 -0700458 // Creates a GlobalRef PathClassLoader that can be used to load classes from the given dex files.
459 // Note: the objects are not completely set up. Do not use this outside of tests and the compiler.
460 jobject CreatePathClassLoader(Thread* self, std::vector<const DexFile*>& dex_files)
461 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
462
Mathieu Chartier590fee92013-09-13 13:46:47 -0700463 private:
Mathieu Chartiera89d7ed2014-12-05 10:57:13 -0800464 static void InitFromImageInterpretOnlyCallback(mirror::Object* obj, void* arg)
465 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
466
Ian Rogers97b52f82014-08-14 11:34:07 -0700467 const OatFile::OatMethod FindOatMethodFor(mirror::ArtMethod* method, bool* found)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700468 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
TDYa12785321912012-04-01 15:24:56 -0700469
Brian Carlstrom56d947f2013-07-15 13:14:23 -0700470 OatFile& GetImageOatFile(gc::space::ImageSpace* space)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700471 LOCKS_EXCLUDED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700472 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700473
Ian Rogers98379392014-02-24 16:53:16 -0800474 void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma663ea52011-08-19 23:33:41 -0700475
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700476 // For early bootstrapping by Init
Ian Rogers6fac4472014-02-25 17:01:10 -0800477 mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700478 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700479
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800480 // Alloc* convenience functions to avoid needing to pass in mirror::Class*
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700481 // values that are known to the ClassLinker such as
482 // kObjectArrayClass and kJavaLangString etc.
Ian Rogers6fac4472014-02-25 17:01:10 -0800483 mirror::Class* AllocClass(Thread* self, uint32_t class_size)
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800484 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800485 mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700486 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersbdb03912011-09-14 00:55:44 -0700487
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800488 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
489 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
490 mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700491 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom5b8e4c82011-09-18 01:38:59 -0700492
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700493
Mathieu Chartiere7c9a8c2014-11-06 16:35:45 -0800494 mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, size_t hash,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700495 Handle<mirror::ClassLoader> class_loader)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700496 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstroma331b3c2011-07-18 17:47:56 -0700497
Ian Rogers7b078e82014-09-10 14:44:24 -0700498 void AppendToBootClassPath(Thread* self, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700499 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700500 void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700501 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700502
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700503 // Precomputes size needed for Class, in the case of a non-temporary class this size must be
504 // sufficient to hold all static fields.
505 uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
506 const DexFile::ClassDef& dex_class_def);
Brian Carlstrom4873d462011-08-21 15:23:39 -0700507
Mathieu Chartierc7853442015-03-27 14:35:38 -0700508 // Setup the classloader, class def index, type idx so that we can insert this class in the class
509 // table.
510 void SetupClass(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
511 Handle<mirror::Class> klass, mirror::ClassLoader* class_loader)
512 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
513
Ian Rogers7b078e82014-09-10 14:44:24 -0700514 void LoadClass(Thread* self, const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700515 Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700516 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers13735952014-10-08 12:43:28 -0700517 void LoadClassMembers(Thread* self, const DexFile& dex_file, const uint8_t* class_data,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700518 Handle<mirror::Class> klass, const OatFile::OatClass* oat_class)
Vladimir Markod3c5beb2014-04-11 16:32:51 +0100519 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700520
Mathieu Chartierc7853442015-03-27 14:35:38 -0700521 void LoadField(const ClassDataItemIterator& it, Handle<mirror::Class> klass,
522 ArtField* dst)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800523 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700524
Brian Carlstromea46f952013-07-30 01:26:50 -0700525 mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file,
526 const ClassDataItemIterator& dex_method,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700527 Handle<mirror::Class> klass)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800528 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Brian Carlstrom934486c2011-07-12 23:42:50 -0700529
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800530 void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800531
Ian Rogers97b52f82014-08-14 11:34:07 -0700532 // Finds the associated oat class for a dex_file and descriptor. Returns an invalid OatClass on
533 // error and sets found to false.
534 OatFile::OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found)
Ian Rogers33e95662013-05-20 20:29:14 -0700535 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers19846512012-02-24 11:42:47 -0800536
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700537 void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache)
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700538 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700539 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700540 bool IsDexFileRegisteredLocked(const DexFile& dex_file)
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700541 SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700542
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700543 bool InitializeClass(Thread* self, Handle<mirror::Class> klass, bool can_run_clinit,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800544 bool can_init_parents)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700545 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700546 bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self,
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800547 ObjectLock<mirror::Class>& lock);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700548 bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700549 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700550
Ian Rogers98379392014-02-24 16:53:16 -0800551 bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor,
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700552 Handle<mirror::ClassLoader> class_loader1,
553 Handle<mirror::ClassLoader> class_loader2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700554 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700555
Ian Rogers98379392014-02-24 16:53:16 -0800556 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800557 mirror::Class* klass1,
558 mirror::Class* klass2)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700559 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700560
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700561 bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass,
562 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700563 mirror::Class** new_class)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700564 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700565
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700566 bool LinkSuperClass(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700567 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700568
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700569 bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700570 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700571
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700572 bool LinkMethods(Thread* self, Handle<mirror::Class> klass,
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700573 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
574 StackHandleScope<mirror::Class::kImtSize>* out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700575 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700576
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700577 bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700578 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700579
Mathieu Chartier2d2621a2014-10-23 16:48:06 -0700580 bool LinkInterfaceMethods(Thread* const self, Handle<mirror::Class> klass,
581 Handle<mirror::ObjectArray<mirror::Class>> interfaces,
582 StackHandleScope<mirror::Class::kImtSize>* out_imt)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700583 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700584
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700585 bool LinkStaticFields(Thread* self, Handle<mirror::Class> klass, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700586 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700587 bool LinkInstanceFields(Thread* self, Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700588 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700589 bool LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_static, size_t* class_size)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700590 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700591 void LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class,
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700592 uint32_t class_def_method_index)
Dmitry Petrochenkof0972a42014-05-16 17:43:39 +0700593 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700594 void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700595 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700596
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700597 // For use by ImageWriter to find DexCaches for its roots
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700598 ReaderWriterMutex* DexLock()
599 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) {
600 return &dex_lock_;
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700601 }
Hiroshi Yamauchie9e3e692014-06-24 14:31:37 -0700602 size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) {
603 return dex_caches_.size();
604 }
605 mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
Brian Carlstrom58ae9412011-10-04 00:56:06 -0700606
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700607 const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700608 LOCKS_EXCLUDED(dex_lock_);
Andreas Gampe833a4852014-05-21 18:46:59 -0700609
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700610 mirror::ArtMethod* CreateProxyConstructor(Thread* self, Handle<mirror::Class> klass,
Brian Carlstromea46f952013-07-30 01:26:50 -0700611 mirror::Class* proxy_class)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700612 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700613 mirror::ArtMethod* CreateProxyMethod(Thread* self, Handle<mirror::Class> klass,
614 Handle<mirror::ArtMethod> prototype)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700615 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jesse Wilson95caa792011-10-12 18:14:17 -0400616
Andreas Gampe48498592014-09-10 19:48:05 -0700617 // Ensures that methods have the kAccPreverified bit set. We use the kAccPreverfied bit on the
618 // class access flags to determine whether this has been done before.
Andreas Gampe5a4b8a22014-09-11 08:30:08 -0700619 void EnsurePreverifiedMethods(Handle<mirror::Class> c)
Andreas Gampe48498592014-09-10 19:48:05 -0700620 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
621
Ian Rogersdbf3be02014-08-29 15:40:08 -0700622 mirror::Class* LookupClassFromTableLocked(const char* descriptor,
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800623 mirror::ClassLoader* class_loader,
Ian Rogersdbf3be02014-08-29 15:40:08 -0700624 size_t hash)
625 SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
626
627 mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash)
628 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
629 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
630
Ian Rogersdbf3be02014-08-29 15:40:08 -0700631 mirror::Class* LookupClassFromImage(const char* descriptor)
632 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
633
634 // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
635 // before returning it to the caller. Its the responsibility of the thread that placed the class
636 // in the table to make it resolved. The thread doing resolution must notify on the class' lock
637 // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
638 // retire a class, the version of the class in the table is returned and this may differ from
639 // the class passed in.
640 mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass)
641 WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
642
643 void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class)
644 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
645
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700646 void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
647 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
648
649 // Return the quick generic JNI stub for testing.
650 const void* GetRuntimeQuickGenericJniStub() const;
651
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700652 std::vector<const DexFile*> boot_class_path_;
Richard Uhlerfbef44d2014-12-23 09:48:51 -0800653 std::vector<std::unique_ptr<const DexFile>> opened_dex_files_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700654
Ian Rogers1bf8d4d2013-05-30 00:18:49 -0700655 mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
Andreas Gampec8ccf682014-09-29 20:07:43 -0700656 std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700657 std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_);
Elliott Hughesf8349362012-06-18 15:00:06 -0700658 std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
Brian Carlstrom47d237a2011-10-18 15:08:33 -0700659
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800660 class ClassDescriptorHashEquals {
661 public:
662 // Same class loader and descriptor.
663 std::size_t operator()(const GcRoot<mirror::Class>& root) const NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700664 bool operator()(const GcRoot<mirror::Class>& a, const GcRoot<mirror::Class>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800665 NO_THREAD_SAFETY_ANALYSIS;
666 // Same class loader and descriptor.
667 std::size_t operator()(const std::pair<const char*, mirror::ClassLoader*>& element) const
668 NO_THREAD_SAFETY_ANALYSIS;
669 bool operator()(const GcRoot<mirror::Class>& a,
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700670 const std::pair<const char*, mirror::ClassLoader*>& b) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800671 NO_THREAD_SAFETY_ANALYSIS;
672 // Same descriptor.
Mathieu Chartier47f867a2015-03-18 10:39:00 -0700673 bool operator()(const GcRoot<mirror::Class>& a, const char* descriptor) const
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800674 NO_THREAD_SAFETY_ANALYSIS;
675 std::size_t operator()(const char* descriptor) const NO_THREAD_SAFETY_ANALYSIS;
676 };
677 class GcRootEmptyFn {
678 public:
679 void MakeEmpty(GcRoot<mirror::Class>& item) const {
680 item = GcRoot<mirror::Class>();
681 }
682 bool IsEmpty(const GcRoot<mirror::Class>& item) const {
683 return item.IsNull();
684 }
685 };
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700686
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800687 // hash set which hashes class descriptor, and compares descriptors nad class loaders. Results
688 // should be compared for a matching Class descriptor and class loader.
689 typedef HashSet<GcRoot<mirror::Class>, GcRootEmptyFn, ClassDescriptorHashEquals,
690 ClassDescriptorHashEquals, TrackingAllocator<GcRoot<mirror::Class>, kAllocatorTagClassTable>>
691 Table;
Hiroshi Yamauchia91a4bc2014-06-13 16:44:55 -0700692 // This contains strong roots. To enable concurrent root scanning of
693 // the class table, be careful to use a read barrier when accessing this.
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700694 Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
Mathieu Chartierc2e20622014-11-03 11:41:47 -0800695 Table pre_zygote_class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
696 std::vector<GcRoot<mirror::Class>> new_class_roots_;
Elliott Hughesf8349362012-06-18 15:00:06 -0700697
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700698 // Do we need to search dex caches to find image classes?
699 bool dex_cache_image_class_lookup_required_;
700 // Number of times we've searched dex caches for a class. After a certain number of misses we move
701 // the classes into the class_table_ to avoid dex cache based searches.
Ian Rogers68b56852014-08-29 20:19:11 -0700702 Atomic<uint32_t> failed_dex_cache_class_lookups_;
Ian Rogers7dfb28c2013-08-22 08:18:36 -0700703
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700704 // Well known mirror::Class roots.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700705 GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
Brian Carlstrom913af1b2011-07-23 21:41:13 -0700706
Ian Rogers98379392014-02-24 16:53:16 -0800707 // The interface table used by all arrays.
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700708 GcRoot<mirror::IfTable> array_iftable_;
Carl Shapiro565f5072011-07-10 13:39:43 -0700709
Ian Rogers98379392014-02-24 16:53:16 -0800710 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
711 // descriptors for the sake of performing FindClass.
712 static constexpr size_t kFindArrayCacheSize = 16;
Hiroshi Yamauchi94f7b492014-07-22 18:08:23 -0700713 GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
Ian Rogers98379392014-02-24 16:53:16 -0800714 size_t find_array_class_cache_next_victim_;
715
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700716 bool init_done_;
Mathieu Chartier893263b2014-03-04 11:07:42 -0800717 bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_);
718 bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
Brian Carlstrom75cb3b42011-07-28 02:13:36 -0700719
Elliott Hughescf4c6c42011-09-01 15:16:42 -0700720 InternTable* intern_table_;
721
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700722 // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
723 // patch point within the image. TODO: make these proper relocations.
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700724 const void* quick_resolution_trampoline_;
Jeff Hao88474b42013-10-23 16:24:40 -0700725 const void* quick_imt_conflict_trampoline_;
Andreas Gampe2da88232014-02-27 12:26:20 -0800726 const void* quick_generic_jni_trampoline_;
Vladimir Marko8a630572014-04-09 18:45:35 +0100727 const void* quick_to_interpreter_bridge_trampoline_;
Jeff Hao0aba0ba2013-06-03 14:49:28 -0700728
Mathieu Chartier2d721012014-11-10 11:08:06 -0800729 // Image pointer size.
730 size_t image_pointer_size_;
731
Brian Carlstrom34f426c2011-10-04 12:58:02 -0700732 friend class ImageWriter; // for GetClassRoots
Alex Lighta59dd802014-07-02 16:28:08 -0700733 friend class ImageDumper; // for FindOpenedOatFileFromOatLocation
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700734 friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700735 ART_FRIEND_TEST(mirror::DexCacheTest, Open); // for AllocDexCache
736
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700737 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
738};
739
740} // namespace art
741
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700742#endif // ART_RUNTIME_CLASS_LINKER_H_