class_linker.h revision c0542af3e2170143ba40d89136e284997e16bf64
1/*
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 */
16
17#ifndef ART_RUNTIME_CLASS_LINKER_H_
18#define ART_RUNTIME_CLASS_LINKER_H_
19
20#include <deque>
21#include <string>
22#include <utility>
23#include <vector>
24
25#include "base/allocator.h"
26#include "base/macros.h"
27#include "base/mutex.h"
28#include "dex_file.h"
29#include "gc_root.h"
30#include "gtest/gtest.h"
31#include "jni.h"
32#include "oat_file.h"
33#include "object_callbacks.h"
34
35namespace art {
36
37namespace gc {
38namespace space {
39  class ImageSpace;
40}  // namespace space
41}  // namespace gc
42namespace mirror {
43  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
50
51template<class T> class ConstHandle;
52class InternTable;
53template<class T> class ObjectLock;
54class ScopedObjectAccessAlreadyRunnable;
55template<class T> class Handle;
56
57typedef bool (ClassVisitor)(mirror::Class* c, void* arg);
58
59enum VisitRootFlags : uint8_t;
60
61class ClassLinker {
62 public:
63  explicit ClassLinker(InternTable* intern_table);
64  ~ClassLinker();
65
66  // Initialize class linker by bootstraping from dex files.
67  void InitWithoutImage(const std::vector<const DexFile*>& boot_class_path)
68      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
69
70  // Initialize class linker from one or more images.
71  void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
72
73  // Finds a class by its descriptor, loading it if necessary.
74  // If class_loader is null, searches boot_class_path_.
75  mirror::Class* FindClass(Thread* self, const char* descriptor,
76                           ConstHandle<mirror::ClassLoader> class_loader)
77      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
78
79  // Finds a class by its descriptor using the "system" class loader, ie by searching the
80  // boot_class_path_.
81  mirror::Class* FindSystemClass(Thread* self, const char* descriptor)
82      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
83
84  // Finds the array class given for the element class.
85  mirror::Class* FindArrayClass(Thread* self, mirror::Class** element_class)
86      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
87
88  // Returns true if the class linker is initialized.
89  bool IsInitialized() const;
90
91  // Define a new a class based on a ClassDef from a DexFile
92  mirror::Class* DefineClass(const char* descriptor,
93                             ConstHandle<mirror::ClassLoader> class_loader,
94                             const DexFile& dex_file, const DexFile::ClassDef& dex_class_def)
95      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
96
97  // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
98  // by the given 'class_loader'.
99  mirror::Class* LookupClass(const char* descriptor, const mirror::ClassLoader* class_loader)
100      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
101      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
102
103  // Finds all the classes with the given descriptor, regardless of ClassLoader.
104  void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes)
105      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
106      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
107
108  mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
109
110  // General class unloading is not supported, this is used to prune
111  // unwanted classes during image writing.
112  bool RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader)
113      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
114      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
115
116  void DumpAllClasses(int flags)
117      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
118      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
119
120  void DumpForSigQuit(std::ostream& os)
121      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
122      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
123
124  size_t NumLoadedClasses()
125      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
126      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
127
128  // Resolve a String with the given index from the DexFile, storing the
129  // result in the DexCache. The referrer is used to identify the
130  // target DexCache and ClassLoader to use for resolution.
131  mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer)
132      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
133
134  // Resolve a String with the given index from the DexFile, storing the
135  // result in the DexCache.
136  mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx,
137                                ConstHandle<mirror::DexCache> dex_cache)
138      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
139
140  // Resolve a Type with the given index from the DexFile, storing the
141  // result in the DexCache. The referrer is used to identity the
142  // target DexCache and ClassLoader to use for resolution.
143  mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer)
144      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
145
146  // Resolve a Type with the given index from the DexFile, storing the
147  // result in the DexCache. The referrer is used to identify the
148  // target DexCache and ClassLoader to use for resolution.
149  mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer)
150      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
151
152  mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtField* referrer)
153      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
154
155  // Resolve a type with the given ID from the DexFile, storing the
156  // result in DexCache. The ClassLoader is used to search for the
157  // type, since it may be referenced from but not contained within
158  // the given DexFile.
159  mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx,
160                             ConstHandle<mirror::DexCache> dex_cache,
161                             ConstHandle<mirror::ClassLoader> class_loader)
162      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
163
164  // Resolve a method with a given ID from the DexFile, storing the
165  // result in DexCache. The ClassLinker and ClassLoader are used as
166  // in ResolveType. What is unique is the method type argument which
167  // is used to determine if this method is a direct, static, or
168  // virtual method.
169  mirror::ArtMethod* ResolveMethod(const DexFile& dex_file,
170                                   uint32_t method_idx,
171                                   ConstHandle<mirror::DexCache> dex_cache,
172                                   ConstHandle<mirror::ClassLoader> class_loader,
173                                   ConstHandle<mirror::ArtMethod> referrer,
174                                   InvokeType type)
175      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
176
177  mirror::ArtMethod* GetResolvedMethod(uint32_t method_idx, mirror::ArtMethod* referrer,
178                                       InvokeType type)
179      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
180  mirror::ArtMethod* ResolveMethod(Thread* self, uint32_t method_idx, mirror::ArtMethod** referrer,
181                                   InvokeType type)
182      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
183
184  mirror::ArtField* GetResolvedField(uint32_t field_idx, mirror::Class* field_declaring_class)
185      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
186  mirror::ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer,
187                                 bool is_static)
188      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
189
190  // Resolve a field with a given ID from the DexFile, storing the
191  // result in DexCache. The ClassLinker and ClassLoader are used as
192  // in ResolveType. What is unique is the is_static argument which is
193  // used to determine if we are resolving a static or non-static
194  // field.
195  mirror::ArtField* ResolveField(const DexFile& dex_file,
196                                 uint32_t field_idx,
197                                 ConstHandle<mirror::DexCache> dex_cache,
198                                 ConstHandle<mirror::ClassLoader> class_loader,
199                                 bool is_static)
200      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
201
202  // Resolve a field with a given ID from the DexFile, storing the
203  // result in DexCache. The ClassLinker and ClassLoader are used as
204  // in ResolveType. No is_static argument is provided so that Java
205  // field resolution semantics are followed.
206  mirror::ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx,
207                                    ConstHandle<mirror::DexCache> dex_cache,
208                                    ConstHandle<mirror::ClassLoader> class_loader)
209      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
210
211  // Get shorty from method index without resolution. Used to do handlerization.
212  const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length)
213      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
214
215  // Returns true on success, false if there's an exception pending.
216  // can_run_clinit=false allows the compiler to attempt to init a class,
217  // given the restriction that no <clinit> execution is possible.
218  bool EnsureInitialized(ConstHandle<mirror::Class> c, bool can_init_fields, bool can_init_parents)
219      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
220
221  // Initializes classes that have instances in the image but that have
222  // <clinit> methods so they could not be initialized by the compiler.
223  void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
224
225  void RegisterDexFile(const DexFile& dex_file)
226      LOCKS_EXCLUDED(dex_lock_)
227      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
228  void RegisterDexFile(const DexFile& dex_file, ConstHandle<mirror::DexCache> dex_cache)
229      LOCKS_EXCLUDED(dex_lock_)
230      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
231
232  const OatFile* RegisterOatFile(const OatFile* oat_file)
233      LOCKS_EXCLUDED(dex_lock_);
234
235  const std::vector<const DexFile*>& GetBootClassPath() {
236    return boot_class_path_;
237  }
238
239  void VisitClasses(ClassVisitor* visitor, void* arg)
240      LOCKS_EXCLUDED(dex_lock_)
241      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
242  // Less efficient variant of VisitClasses that doesn't hold the classlinker_classes_lock_
243  // when calling the visitor.
244  void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg)
245      LOCKS_EXCLUDED(dex_lock_)
246      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
247
248  void VisitClassRoots(RootCallback* callback, void* arg, VisitRootFlags flags)
249      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
250      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
251  void VisitRoots(RootCallback* callback, void* arg, VisitRootFlags flags)
252      LOCKS_EXCLUDED(dex_lock_)
253      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
254
255  mirror::DexCache* FindDexCache(const DexFile& dex_file)
256      LOCKS_EXCLUDED(dex_lock_)
257      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
258  bool IsDexFileRegistered(const DexFile& dex_file)
259      LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
260  void FixupDexCaches(mirror::ArtMethod* resolution_method)
261      LOCKS_EXCLUDED(dex_lock_)
262      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
263
264  // Generate an oat file from a dex file
265  bool GenerateOatFile(const char* dex_filename,
266                       int oat_fd,
267                       const char* oat_cache_filename,
268                       std::string* error_msg)
269      LOCKS_EXCLUDED(Locks::mutator_lock_);
270
271  // Find or create the oat file holding dex_location. Then load all corresponding dex files
272  // (if multidex) into the given vector.
273  bool OpenDexFilesFromOat(const char* dex_location, const char* oat_location,
274                           std::vector<std::string>* error_msgs,
275                           std::vector<const DexFile*>* dex_files)
276      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
277
278  // Returns true if the given oat file has the same image checksum as the image it is paired with.
279  static bool VerifyOatImageChecksum(const OatFile* oat_file, const InstructionSet instruction_set);
280  // Returns true if the oat file checksums match with the image and the offsets are such that it
281  // could be loaded with it.
282  static bool VerifyOatChecksums(const OatFile* oat_file, const InstructionSet instruction_set,
283                                 std::string* error_msg);
284  // Returns true if oat file contains the dex file with the given location and checksum.
285  static bool VerifyOatAndDexFileChecksums(const OatFile* oat_file,
286                                           const char* dex_location,
287                                           uint32_t dex_location_checksum,
288                                           InstructionSet instruction_set,
289                                           std::string* error_msg);
290
291  // Allocate an instance of a java.lang.Object.
292  mirror::Object* AllocObject(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
293
294  // TODO: replace this with multiple methods that allocate the correct managed type.
295  template <class T>
296  mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
297      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
298
299  mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length)
300      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
301
302  mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length)
303      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
304
305  mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length)
306      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
307
308  mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
309      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
310
311  mirror::ObjectArray<mirror::ArtField>* AllocArtFieldArray(Thread* self, size_t length)
312      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
313
314  mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
315                                                                              size_t length)
316      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
317
318  void VerifyClass(ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
319  bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
320                               mirror::Class::Status& oat_file_class_status)
321      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
322  void ResolveClassExceptionHandlerTypes(const DexFile& dex_file,
323                                         ConstHandle<mirror::Class> klass)
324      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
325  void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass)
326      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
327
328  mirror::Class* CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name,
329                                  jobjectArray interfaces, jobject loader, jobjectArray methods,
330                                  jobjectArray throws)
331      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
332  std::string GetDescriptorForProxy(mirror::Class* proxy_class)
333      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
334  mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class,
335                                        mirror::ArtMethod* proxy_method)
336      LOCKS_EXCLUDED(dex_lock_)
337      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
338
339  // Get the oat code for a method when its class isn't yet initialized
340  const void* GetQuickOatCodeFor(mirror::ArtMethod* method)
341      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
342  const void* GetPortableOatCodeFor(mirror::ArtMethod* method, bool* have_portable_code)
343      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
344
345  // Get the oat code for a method from a method index.
346  const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx)
347      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
348  const void* GetPortableOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx)
349      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
350
351  // Get compiled code for a method, return null if no code
352  // exists. This is unlike Get..OatCodeFor which will return a bridge
353  // or interpreter entrypoint.
354  const void* GetOatMethodQuickCodeFor(mirror::ArtMethod* method)
355      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
356  const void* GetOatMethodPortableCodeFor(mirror::ArtMethod* method)
357      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
358
359  pid_t GetClassesLockOwner();  // For SignalCatcher.
360  pid_t GetDexLockOwner();  // For SignalCatcher.
361
362  const void* GetPortableResolutionTrampoline() const {
363    return portable_resolution_trampoline_;
364  }
365
366  const void* GetQuickGenericJniTrampoline() const {
367    return quick_generic_jni_trampoline_;
368  }
369
370  const void* GetQuickResolutionTrampoline() const {
371    return quick_resolution_trampoline_;
372  }
373
374  const void* GetPortableImtConflictTrampoline() const {
375    return portable_imt_conflict_trampoline_;
376  }
377
378  const void* GetQuickImtConflictTrampoline() const {
379    return quick_imt_conflict_trampoline_;
380  }
381
382  const void* GetQuickToInterpreterBridgeTrampoline() const {
383    return quick_to_interpreter_bridge_trampoline_;
384  }
385
386  InternTable* GetInternTable() const {
387    return intern_table_;
388  }
389
390  // Attempts to insert a class into a class table.  Returns NULL if
391  // the class was inserted, otherwise returns an existing class with
392  // the same descriptor and ClassLoader.
393  mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash)
394      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
395      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
396
397  // Special code to allocate an art method, use this instead of class->AllocObject.
398  mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
399
400  mirror::ObjectArray<mirror::Class>* GetClassRoots() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
401    mirror::ObjectArray<mirror::Class>* class_roots = class_roots_.Read();
402    DCHECK(class_roots != NULL);
403    return class_roots;
404  }
405
406 private:
407  const OatFile::OatMethod FindOatMethodFor(mirror::ArtMethod* method, bool* found)
408      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
409
410  OatFile& GetImageOatFile(gc::space::ImageSpace* space)
411      LOCKS_EXCLUDED(dex_lock_)
412      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
413
414  void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
415
416  // For early bootstrapping by Init
417  mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size)
418      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
419
420  // Alloc* convenience functions to avoid needing to pass in mirror::Class*
421  // values that are known to the ClassLinker such as
422  // kObjectArrayClass and kJavaLangString etc.
423  mirror::Class* AllocClass(Thread* self, uint32_t class_size)
424      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
425  mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
426      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
427  mirror::ArtField* AllocArtField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
428
429  mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
430      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
431  mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
432      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
433
434
435  mirror::Class* CreateArrayClass(Thread* self, const char* descriptor,
436                                  ConstHandle<mirror::ClassLoader> class_loader)
437      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
438
439  void AppendToBootClassPath(const DexFile& dex_file)
440      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
441  void AppendToBootClassPath(const DexFile& dex_file, ConstHandle<mirror::DexCache> dex_cache)
442      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
443
444  // Precomputes size needed for Class, in the case of a non-temporary class this size must be
445  // sufficient to hold all static fields.
446  uint32_t SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file,
447                                            const DexFile::ClassDef& dex_class_def);
448
449  void LoadClass(const DexFile& dex_file,
450                 const DexFile::ClassDef& dex_class_def,
451                 ConstHandle<mirror::Class> klass,
452                 mirror::ClassLoader* class_loader)
453      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
454  void LoadClassMembers(const DexFile& dex_file,
455                        const byte* class_data,
456                        ConstHandle<mirror::Class> klass,
457                        mirror::ClassLoader* class_loader,
458                        const OatFile::OatClass* oat_class)
459      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
460
461  void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it,
462                 ConstHandle<mirror::Class> klass, ConstHandle<mirror::ArtField> dst)
463      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
464
465  mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file,
466                                const ClassDataItemIterator& dex_method,
467                                ConstHandle<mirror::Class> klass)
468      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
469
470  void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
471
472  // Finds the associated oat class for a dex_file and descriptor. Returns an invalid OatClass on
473  // error and sets found to false.
474  OatFile::OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found)
475      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
476
477  void RegisterDexFileLocked(const DexFile& dex_file, ConstHandle<mirror::DexCache> dex_cache)
478      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
479      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
480  bool IsDexFileRegisteredLocked(const DexFile& dex_file)
481      SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_);
482
483  bool InitializeClass(ConstHandle<mirror::Class> klass, bool can_run_clinit,
484                       bool can_init_parents)
485      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
486  bool WaitForInitializeClass(ConstHandle<mirror::Class> klass, Thread* self,
487                              ObjectLock<mirror::Class>& lock);
488  bool ValidateSuperClassDescriptors(ConstHandle<mirror::Class> klass)
489      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
490
491  bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor,
492                                                ConstHandle<mirror::ClassLoader> class_loader1,
493                                                ConstHandle<mirror::ClassLoader> class_loader2)
494      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
495
496  bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method,
497                                                     mirror::Class* klass1,
498                                                     mirror::Class* klass2)
499      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
500
501  bool LinkClass(Thread* self, const char* descriptor, ConstHandle<mirror::Class> klass,
502                 ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces,
503                 mirror::Class** new_class)
504      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
505
506  bool LinkSuperClass(ConstHandle<mirror::Class> klass)
507      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
508
509  bool LoadSuperAndInterfaces(ConstHandle<mirror::Class> klass, const DexFile& dex_file)
510      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
511
512  bool LinkMethods(Thread* self, ConstHandle<mirror::Class> klass,
513                   ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces)
514      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
515
516  bool LinkVirtualMethods(Thread* self, ConstHandle<mirror::Class> klass)
517      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
518
519  bool LinkInterfaceMethods(ConstHandle<mirror::Class> klass,
520                            ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces)
521      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
522
523  bool LinkStaticFields(ConstHandle<mirror::Class> klass, size_t* class_size)
524      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
525  bool LinkInstanceFields(ConstHandle<mirror::Class> klass)
526      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
527  bool LinkFields(ConstHandle<mirror::Class> klass, bool is_static, size_t* class_size)
528      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
529  void LinkCode(ConstHandle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class,
530                const DexFile& dex_file, uint32_t dex_method_index, uint32_t method_index)
531      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
532  void CreateReferenceInstanceOffsets(ConstHandle<mirror::Class> klass)
533      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
534  void CreateReferenceStaticOffsets(ConstHandle<mirror::Class> klass)
535      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
536  void CreateReferenceOffsets(ConstHandle<mirror::Class> klass, bool is_static,
537                              uint32_t reference_offsets)
538      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
539
540  // For use by ImageWriter to find DexCaches for its roots
541  ReaderWriterMutex* DexLock()
542      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCK_RETURNED(dex_lock_) {
543    return &dex_lock_;
544  }
545  size_t GetDexCacheCount() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_) {
546    return dex_caches_.size();
547  }
548  mirror::DexCache* GetDexCache(size_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
549
550  const OatFile* FindOpenedOatFileForDexFile(const DexFile& dex_file)
551      LOCKS_EXCLUDED(dex_lock_)
552      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
553
554  // Find an opened oat file that contains dex_location. If oat_location is not nullptr, the file
555  // must have that location, else any oat location is accepted.
556  const OatFile* FindOpenedOatFile(const char* oat_location, const char* dex_location,
557                                   const uint32_t* const dex_location_checksum)
558      LOCKS_EXCLUDED(dex_lock_);
559
560  // Will open the oat file directly without relocating, even if we could/should do relocation.
561  const OatFile* FindOatFileFromOatLocation(const std::string& oat_location,
562                                            std::string* error_msg)
563      LOCKS_EXCLUDED(dex_lock_);
564
565  const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
566      LOCKS_EXCLUDED(dex_lock_);
567
568  const OatFile* OpenOatFileFromDexLocation(const std::string& dex_location,
569                                            InstructionSet isa,
570                                            bool* already_opened,
571                                            bool* obsolete_file_cleanup_failed,
572                                            std::vector<std::string>* error_msg)
573      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
574
575  const OatFile* GetInterpretedOnlyOat(const std::string& oat_path,
576                                       InstructionSet isa,
577                                       std::string* error_msg);
578
579  const OatFile* PatchAndRetrieveOat(const std::string& input, const std::string& output,
580                                     const std::string& image_location, InstructionSet isa,
581                                     std::string* error_msg)
582      LOCKS_EXCLUDED(Locks::mutator_lock_);
583
584  bool CheckOatFile(const OatFile* oat_file, InstructionSet isa,
585                    bool* checksum_verified, std::string* error_msg);
586  int32_t GetRequiredDelta(const OatFile* oat_file, InstructionSet isa);
587
588  // Note: will not register the oat file.
589  const OatFile* FindOatFileInOatLocationForDexFile(const char* dex_location,
590                                                    uint32_t dex_location_checksum,
591                                                    const char* oat_location,
592                                                    std::string* error_msg)
593      LOCKS_EXCLUDED(dex_lock_);
594
595  // Creates the oat file from the dex_location to the oat_location. Needs a file descriptor for
596  // the file to be written, which is assumed to be under a lock.
597  const OatFile* CreateOatFileForDexLocation(const char* dex_location,
598                                             int fd, const char* oat_location,
599                                             std::vector<std::string>* error_msgs)
600      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
601
602  // Finds an OatFile that contains a DexFile for the given a DexFile location.
603  //
604  // Note 1: this will not check open oat files, which are assumed to be stale when this is run.
605  // Note 2: Does not register the oat file. It is the caller's job to register if the file is to
606  //         be kept.
607  const OatFile* FindOatFileContainingDexFileFromDexLocation(const char* location,
608                                                             const uint32_t* const location_checksum,
609                                                             InstructionSet isa,
610                                                             std::vector<std::string>* error_msgs,
611                                                             bool* obsolete_file_cleanup_failed)
612      LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_);
613
614  // verify an oat file with the given dex file. Will return false when the dex file could not be
615  // verified. Will return true otherwise.
616  bool VerifyOatWithDexFile(const OatFile* oat_file, const char* dex_location,
617                            std::string* error_msg);
618
619  mirror::ArtMethod* CreateProxyConstructor(Thread* self, ConstHandle<mirror::Class> klass,
620                                            mirror::Class* proxy_class)
621      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
622  mirror::ArtMethod* CreateProxyMethod(Thread* self, ConstHandle<mirror::Class> klass,
623                                       ConstHandle<mirror::ArtMethod> prototype)
624      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
625
626  std::vector<const DexFile*> boot_class_path_;
627
628  mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
629  std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);;
630  std::vector<GcRoot<mirror::DexCache>> dex_caches_ GUARDED_BY(dex_lock_);
631  std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
632
633
634  // multimap from a string hash code of a class descriptor to
635  // mirror::Class* instances. Results should be compared for a matching
636  // Class::descriptor_ and Class::class_loader_.
637  typedef AllocationTrackingMultiMap<size_t, GcRoot<mirror::Class>, kAllocatorTagClassTable> Table;
638  // This contains strong roots. To enable concurrent root scanning of
639  // the class table, be careful to use a read barrier when accessing this.
640  Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_);
641  std::vector<std::pair<size_t, GcRoot<mirror::Class>>> new_class_roots_;
642
643  // Do we need to search dex caches to find image classes?
644  bool dex_cache_image_class_lookup_required_;
645  // Number of times we've searched dex caches for a class. After a certain number of misses we move
646  // the classes into the class_table_ to avoid dex cache based searches.
647  Atomic<uint32_t> failed_dex_cache_class_lookups_;
648
649  mirror::Class* LookupClassFromTableLocked(const char* descriptor,
650                                            const mirror::ClassLoader* class_loader,
651                                            size_t hash)
652      SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_);
653
654  mirror::Class* UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash)
655      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
656      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
657
658  void MoveImageClassesToClassTable() LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
659      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
660  mirror::Class* LookupClassFromImage(const char* descriptor)
661      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
662
663  // EnsureResolved is called to make sure that a class in the class_table_ has been resolved
664  // before returning it to the caller. Its the responsibility of the thread that placed the class
665  // in the table to make it resolved. The thread doing resolution must notify on the class' lock
666  // when resolution has occurred. This happens in mirror::Class::SetStatus. As resolution may
667  // retire a class, the version of the class in the table is returned and this may differ from
668  // the class passed in.
669  mirror::Class* EnsureResolved(Thread* self, const char* descriptor, mirror::Class* klass)
670      WARN_UNUSED SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
671
672  void FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror::Class* new_class)
673      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
674
675  // indexes into class_roots_.
676  // needs to be kept in sync with class_roots_descriptors_.
677  enum ClassRoot {
678    kJavaLangClass,
679    kJavaLangObject,
680    kClassArrayClass,
681    kObjectArrayClass,
682    kJavaLangString,
683    kJavaLangDexCache,
684    kJavaLangRefReference,
685    kJavaLangReflectArtField,
686    kJavaLangReflectArtMethod,
687    kJavaLangReflectProxy,
688    kJavaLangStringArrayClass,
689    kJavaLangReflectArtFieldArrayClass,
690    kJavaLangReflectArtMethodArrayClass,
691    kJavaLangClassLoader,
692    kJavaLangThrowable,
693    kJavaLangClassNotFoundException,
694    kJavaLangStackTraceElement,
695    kPrimitiveBoolean,
696    kPrimitiveByte,
697    kPrimitiveChar,
698    kPrimitiveDouble,
699    kPrimitiveFloat,
700    kPrimitiveInt,
701    kPrimitiveLong,
702    kPrimitiveShort,
703    kPrimitiveVoid,
704    kBooleanArrayClass,
705    kByteArrayClass,
706    kCharArrayClass,
707    kDoubleArrayClass,
708    kFloatArrayClass,
709    kIntArrayClass,
710    kLongArrayClass,
711    kShortArrayClass,
712    kJavaLangStackTraceElementArrayClass,
713    kClassRootsMax,
714  };
715  GcRoot<mirror::ObjectArray<mirror::Class>> class_roots_;
716
717  mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
718
719  void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
720      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
721
722  static const char* class_roots_descriptors_[];
723
724  const char* GetClassRootDescriptor(ClassRoot class_root) {
725    const char* descriptor = class_roots_descriptors_[class_root];
726    CHECK(descriptor != NULL);
727    return descriptor;
728  }
729
730  // The interface table used by all arrays.
731  GcRoot<mirror::IfTable> array_iftable_;
732
733  // A cache of the last FindArrayClass results. The cache serves to avoid creating array class
734  // descriptors for the sake of performing FindClass.
735  static constexpr size_t kFindArrayCacheSize = 16;
736  GcRoot<mirror::Class> find_array_class_cache_[kFindArrayCacheSize];
737  size_t find_array_class_cache_next_victim_;
738
739  bool init_done_;
740  bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_);
741  bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_);
742
743  InternTable* intern_table_;
744
745  // Trampolines within the image the bounce to runtime entrypoints. Done so that there is a single
746  // patch point within the image. TODO: make these proper relocations.
747  const void* portable_resolution_trampoline_;
748  const void* quick_resolution_trampoline_;
749  const void* portable_imt_conflict_trampoline_;
750  const void* quick_imt_conflict_trampoline_;
751  const void* quick_generic_jni_trampoline_;
752  const void* quick_to_interpreter_bridge_trampoline_;
753
754  friend class ImageWriter;  // for GetClassRoots
755  friend class ImageDumper;  // for FindOpenedOatFileFromOatLocation
756  friend class ElfPatcher;  // for FindOpenedOatFileForDexFile & FindOpenedOatFileFromOatLocation
757  friend class NoDex2OatTest;  // for FindOpenedOatFileForDexFile
758  friend class NoPatchoatTest;  // for FindOpenedOatFileForDexFile
759  FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors);
760  FRIEND_TEST(mirror::DexCacheTest, Open);
761  FRIEND_TEST(ExceptionTest, FindExceptionHandler);
762  FRIEND_TEST(ObjectTest, AllocObjectArray);
763  DISALLOW_COPY_AND_ASSIGN(ClassLinker);
764};
765
766}  // namespace art
767
768#endif  // ART_RUNTIME_CLASS_LINKER_H_
769