class_linker.h revision 848871b4d8481229c32e0d048a9856e5a9a17ef9
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 <string>
21#include <utility>
22#include <vector>
23
24#include "base/macros.h"
25#include "base/mutex.h"
26#include "dex_file.h"
27#include "gtest/gtest.h"
28#include "root_visitor.h"
29#include "oat_file.h"
30
31namespace art {
32namespace gc {
33namespace space {
34  class ImageSpace;
35}  // namespace space
36}  // namespace gc
37namespace mirror {
38  class ClassLoader;
39  class DexCache;
40  class DexCacheTest_Open_Test;
41  class IfTable;
42  template<class T> class ObjectArray;
43  class StackTraceElement;
44}  // namespace mirror
45
46class InternTable;
47class ObjectLock;
48template<class T> class SirtRef;
49
50typedef bool (ClassVisitor)(mirror::Class* c, void* arg);
51
52class ClassLinker {
53 public:
54  // Creates the class linker by bootstrapping from dex files.
55  static ClassLinker* CreateFromCompiler(const std::vector<const DexFile*>& boot_class_path,
56                                         InternTable* intern_table)
57      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
58
59  // Creates the class linker from an image.
60  static ClassLinker* CreateFromImage(InternTable* intern_table)
61      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
62
63  ~ClassLinker();
64
65  // Finds a class by its descriptor, loading it if necessary.
66  // If class_loader is null, searches boot_class_path_.
67  mirror::Class* FindClass(const char* descriptor, mirror::ClassLoader* class_loader)
68      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
69
70  mirror::Class* FindSystemClass(const char* descriptor)
71      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
72
73  // Define a new a class based on a ClassDef from a DexFile
74  mirror::Class* DefineClass(const StringPiece& descriptor, mirror::ClassLoader* class_loader,
75                             const DexFile& dex_file, const DexFile::ClassDef& dex_class_def)
76      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
77
78  // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded
79  // by the given 'class_loader'.
80  mirror::Class* LookupClass(const char* descriptor, const mirror::ClassLoader* class_loader)
81      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
82      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
83
84  // Finds all the classes with the given descriptor, regardless of ClassLoader.
85  void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes)
86      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
87      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
88
89  mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
90
91  // General class unloading is not supported, this is used to prune
92  // unwanted classes during image writing.
93  bool RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader)
94      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
95      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
96
97  void DumpAllClasses(int flags) const
98      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
99      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
100
101  void DumpForSigQuit(std::ostream& os) const
102      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
103
104  size_t NumLoadedClasses() const LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
105
106  // Resolve a String with the given index from the DexFile, storing the
107  // result in the DexCache. The referrer is used to identify the
108  // target DexCache and ClassLoader to use for resolution.
109  mirror::String* ResolveString(uint32_t string_idx, const mirror::AbstractMethod* referrer)
110      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
111
112  // Resolve a String with the given index from the DexFile, storing the
113  // result in the DexCache.
114  mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx,
115                                mirror::DexCache* dex_cache)
116      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
117
118  // Resolve a Type with the given index from the DexFile, storing the
119  // result in the DexCache. The referrer is used to identity the
120  // target DexCache and ClassLoader to use for resolution.
121  mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx,
122                             const mirror::Class* referrer)
123      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
124    return ResolveType(dex_file,
125                       type_idx,
126                       referrer->GetDexCache(),
127                       referrer->GetClassLoader());
128  }
129
130  // Resolve a Type with the given index from the DexFile, storing the
131  // result in the DexCache. The referrer is used to identify the
132  // target DexCache and ClassLoader to use for resolution.
133  mirror::Class* ResolveType(uint16_t type_idx, const mirror::AbstractMethod* referrer)
134      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
135
136  mirror::Class* ResolveType(uint16_t type_idx, const mirror::Field* referrer)
137      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
138
139  // Resolve a type with the given ID from the DexFile, storing the
140  // result in DexCache. The ClassLoader is used to search for the
141  // type, since it may be referenced from but not contained within
142  // the given DexFile.
143  mirror::Class* ResolveType(const DexFile& dex_file,
144                             uint16_t type_idx,
145                             mirror::DexCache* dex_cache,
146                             mirror::ClassLoader* class_loader)
147      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
148
149  // Resolve a method with a given ID from the DexFile, storing the
150  // result in DexCache. The ClassLinker and ClassLoader are used as
151  // in ResolveType. What is unique is the method type argument which
152  // is used to determine if this method is a direct, static, or
153  // virtual method.
154  mirror::AbstractMethod* ResolveMethod(const DexFile& dex_file,
155                                        uint32_t method_idx,
156                                        mirror::DexCache* dex_cache,
157                                        mirror::ClassLoader* class_loader,
158                                        const mirror::AbstractMethod* referrer,
159                                        InvokeType type)
160      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
161
162  mirror::AbstractMethod* ResolveMethod(uint32_t method_idx, const mirror::AbstractMethod* referrer,
163                                        InvokeType type)
164      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
165
166  mirror::Field* ResolveField(uint32_t field_idx, const mirror::AbstractMethod* referrer,
167                              bool is_static)
168      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
169
170  // Resolve a field with a given ID from the DexFile, storing the
171  // result in DexCache. The ClassLinker and ClassLoader are used as
172  // in ResolveType. What is unique is the is_static argument which is
173  // used to determine if we are resolving a static or non-static
174  // field.
175  mirror::Field* ResolveField(const DexFile& dex_file,
176                      uint32_t field_idx,
177                      mirror::DexCache* dex_cache,
178                      mirror::ClassLoader* class_loader,
179                      bool is_static)
180      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
181
182  // Resolve a field with a given ID from the DexFile, storing the
183  // result in DexCache. The ClassLinker and ClassLoader are used as
184  // in ResolveType. No is_static argument is provided so that Java
185  // field resolution semantics are followed.
186  mirror::Field* ResolveFieldJLS(const DexFile& dex_file,
187                                 uint32_t field_idx,
188                                 mirror::DexCache* dex_cache,
189                                 mirror::ClassLoader* class_loader)
190      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
191
192  // Get shorty from method index without resolution. Used to do handlerization.
193  const char* MethodShorty(uint32_t method_idx, mirror::AbstractMethod* referrer, uint32_t* length)
194      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
195
196  // Returns true on success, false if there's an exception pending.
197  // can_run_clinit=false allows the compiler to attempt to init a class,
198  // given the restriction that no <clinit> execution is possible.
199  bool EnsureInitialized(mirror::Class* c, bool can_run_clinit, bool can_init_fields)
200      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
201
202  // Initializes classes that have instances in the image but that have
203  // <clinit> methods so they could not be initialized by the compiler.
204  void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
205
206  void RegisterDexFile(const DexFile& dex_file)
207      LOCKS_EXCLUDED(dex_lock_)
208      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
209  void RegisterDexFile(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache)
210      LOCKS_EXCLUDED(dex_lock_)
211      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
212
213  void RegisterOatFile(const OatFile& oat_file)
214      LOCKS_EXCLUDED(dex_lock_);
215
216  const std::vector<const DexFile*>& GetBootClassPath() {
217    return boot_class_path_;
218  }
219
220  void VisitClasses(ClassVisitor* visitor, void* arg) const
221      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
222  // Less efficient variant of VisitClasses that doesn't hold the classlinker_classes_lock_
223  // when calling the visitor.
224  void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) const
225      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_);
226
227  void VisitRoots(RootVisitor* visitor, void* arg, bool clean_dirty)
228      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_, dex_lock_);
229
230  mirror::DexCache* FindDexCache(const DexFile& dex_file) const
231      LOCKS_EXCLUDED(dex_lock_)
232      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
233  bool IsDexFileRegistered(const DexFile& dex_file) const
234      LOCKS_EXCLUDED(dex_lock_);
235  void FixupDexCaches(mirror::AbstractMethod* resolution_method) const
236      LOCKS_EXCLUDED(dex_lock_)
237      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
238
239  // Generate an oat file from a dex file
240  bool GenerateOatFile(const std::string& dex_filename,
241                       int oat_fd,
242                       const std::string& oat_cache_filename);
243
244  const OatFile* FindOatFileFromOatLocation(const std::string& location)
245      LOCKS_EXCLUDED(dex_lock_);
246
247  const OatFile* FindOatFileFromOatLocationLocked(const std::string& location)
248      SHARED_LOCKS_REQUIRED(dex_lock_);
249
250  // Finds the oat file for a dex location, generating the oat file if
251  // it is missing or out of date. Returns the DexFile from within the
252  // created oat file.
253  const DexFile* FindOrCreateOatFileForDexLocation(const std::string& dex_location,
254                                                   const std::string& oat_location)
255      LOCKS_EXCLUDED(dex_lock_)
256      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
257  const DexFile* FindOrCreateOatFileForDexLocationLocked(const std::string& dex_location,
258                                                         const std::string& oat_location)
259      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
260      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
261  // Find a DexFile within an OatFile given a DexFile location. Note
262  // that this returns null if the location checksum of the DexFile
263  // does not match the OatFile.
264  const DexFile* FindDexFileInOatFileFromDexLocation(const std::string& location)
265      LOCKS_EXCLUDED(dex_lock_)
266      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
267
268
269  // Returns true if oat file contains the dex file with the given location and checksum.
270  static bool VerifyOatFileChecksums(const OatFile* oat_file,
271                                     const std::string& dex_location,
272                                     uint32_t dex_location_checksum)
273      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
274
275  // TODO: replace this with multiple methods that allocate the correct managed type.
276  template <class T>
277  mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length)
278      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
279
280  mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length)
281      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
282
283  mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length)
284      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
285
286  mirror::ObjectArray<mirror::AbstractMethod>* AllocAbstractMethodArray(Thread* self, size_t length)
287      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
288
289  mirror::ObjectArray<mirror::AbstractMethod>* AllocMethodArray(Thread* self, size_t length)
290      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
291
292  mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount)
293      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
294
295  mirror::ObjectArray<mirror::Field>* AllocFieldArray(Thread* self, size_t length)
296      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
297
298  mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self,
299                                                                              size_t length)
300      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
301
302  void VerifyClass(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
303  bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
304                               mirror::Class::Status& oat_file_class_status)
305      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
306  void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, mirror::Class* klass)
307      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
308  void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::AbstractMethod* klass)
309      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
310
311  mirror::Class* CreateProxyClass(mirror::String* name, mirror::ObjectArray<mirror::Class>* interfaces,
312                                  mirror::ClassLoader* loader,
313                                  mirror::ObjectArray<mirror::AbstractMethod>* methods,
314                                  mirror::ObjectArray<mirror::ObjectArray<mirror::Class> >* throws)
315      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
316  std::string GetDescriptorForProxy(const mirror::Class* proxy_class)
317      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
318  mirror::AbstractMethod* FindMethodForProxy(const mirror::Class* proxy_class,
319                                             const mirror::AbstractMethod* proxy_method)
320      LOCKS_EXCLUDED(dex_lock_)
321      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
322
323  // Get the oat code for a method when its class isn't yet initialized
324  const void* GetOatCodeFor(const mirror::AbstractMethod* method)
325      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
326
327  // Get the oat code for a method from a method index.
328  const void* GetOatCodeFor(const DexFile& dex_file, uint32_t method_idx)
329      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
330
331  pid_t GetClassesLockOwner();  // For SignalCatcher.
332  pid_t GetDexLockOwner();  // For SignalCatcher.
333
334  bool IsDirty() const {
335    return is_dirty_;
336  }
337
338  void Dirty() {
339    is_dirty_ = true;
340  }
341
342  const void* GetPortableResolutionTrampoline() const {
343    return portable_resolution_trampoline_;
344  }
345
346  const void* GetQuickResolutionTrampoline() const {
347    return quick_resolution_trampoline_;
348  }
349
350  InternTable* GetInternTable() const {
351    return intern_table_;
352  }
353
354  // Attempts to insert a class into a class table.  Returns NULL if
355  // the class was inserted, otherwise returns an existing class with
356  // the same descriptor and ClassLoader.
357  mirror::Class* InsertClass(const StringPiece& descriptor, mirror::Class* klass, bool image_class)
358      LOCKS_EXCLUDED(Locks::classlinker_classes_lock_)
359      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
360
361 private:
362  explicit ClassLinker(InternTable*);
363
364  const OatFile::OatMethod GetOatMethodFor(const mirror::AbstractMethod* method)
365      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
366
367  // Initialize class linker by bootstraping from dex files
368  void InitFromCompiler(const std::vector<const DexFile*>& boot_class_path)
369      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
370
371  // Initialize class linker from one or more images.
372  void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
373  OatFile& GetImageOatFile(gc::space::ImageSpace* space)
374      LOCKS_EXCLUDED(dex_lock_)
375      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
376
377  void FinishInit() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
378
379  // For early bootstrapping by Init
380  mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, size_t class_size)
381      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
382
383  // Alloc* convenience functions to avoid needing to pass in mirror::Class*
384  // values that are known to the ClassLinker such as
385  // kObjectArrayClass and kJavaLangString etc.
386  mirror::Class* AllocClass(Thread* self, size_t class_size) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
387  mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file)
388      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
389  mirror::Field* AllocField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
390  mirror::Method* AllocMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
391  mirror::Constructor* AllocConstructor(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
392
393  mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type)
394      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
395  mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type)
396      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
397
398
399  mirror::Class* CreateArrayClass(const std::string& descriptor, mirror::ClassLoader* class_loader)
400      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
401
402  void AppendToBootClassPath(const DexFile& dex_file)
403      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
404  void AppendToBootClassPath(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache)
405      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
406
407  void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
408                         mirror::Class* c, SafeMap<uint32_t, mirror::Field*>& field_map)
409      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
410
411  size_t SizeOfClass(const DexFile& dex_file,
412                     const DexFile::ClassDef& dex_class_def);
413
414  void LoadClass(const DexFile& dex_file,
415                 const DexFile::ClassDef& dex_class_def,
416                 SirtRef<mirror::Class>& klass,
417                 mirror::ClassLoader* class_loader)
418      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
419
420  void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it,
421                 SirtRef<mirror::Class>& klass, SirtRef<mirror::Field>& dst)
422      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
423
424  mirror::AbstractMethod* LoadMethod(Thread* self, const DexFile& dex_file,
425                                     const ClassDataItemIterator& dex_method,
426                                     SirtRef<mirror::Class>& klass)
427      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
428
429  void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
430
431  // Finds the associated oat class for a dex_file and descriptor
432  const OatFile::OatClass* GetOatClass(const DexFile& dex_file, const char* descriptor)
433      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
434
435  void RegisterDexFileLocked(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache)
436      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
437      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
438  bool IsDexFileRegisteredLocked(const DexFile& dex_file) const SHARED_LOCKS_REQUIRED(dex_lock_);
439  void RegisterOatFileLocked(const OatFile& oat_file) EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
440      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_);
441
442  bool InitializeClass(mirror::Class* klass, bool can_run_clinit, bool can_init_statics)
443      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
444  bool WaitForInitializeClass(mirror::Class* klass, Thread* self, ObjectLock& lock);
445  bool ValidateSuperClassDescriptors(const mirror::Class* klass)
446      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
447  bool InitializeSuperClass(mirror::Class* klass, bool can_run_clinit, bool can_init_fields)
448      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
449  // Initialize static fields, returns true if fields were initialized.
450  bool InitializeStaticFields(mirror::Class* klass)
451      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
452
453  bool IsSameDescriptorInDifferentClassContexts(const char* descriptor,
454                                                const mirror::Class* klass1,
455                                                const mirror::Class* klass2)
456      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
457
458  bool IsSameMethodSignatureInDifferentClassContexts(const mirror::AbstractMethod* method,
459                                                     const mirror::Class* klass1,
460                                                     const mirror::Class* klass2)
461      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
462
463  bool LinkClass(SirtRef<mirror::Class>& klass, mirror::ObjectArray<mirror::Class>* interfaces)
464      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
465
466  bool LinkSuperClass(SirtRef<mirror::Class>& klass)
467      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
468
469  bool LoadSuperAndInterfaces(SirtRef<mirror::Class>& klass, const DexFile& dex_file)
470      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
471
472  bool LinkMethods(SirtRef<mirror::Class>& klass, mirror::ObjectArray<mirror::Class>* interfaces)
473      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
474
475  bool LinkVirtualMethods(SirtRef<mirror::Class>& klass)
476      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
477
478  bool LinkInterfaceMethods(SirtRef<mirror::Class>& klass,
479                            mirror::ObjectArray<mirror::Class>* interfaces)
480      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
481
482  bool LinkStaticFields(SirtRef<mirror::Class>& klass)
483      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
484  bool LinkInstanceFields(SirtRef<mirror::Class>& klass)
485      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
486  bool LinkFields(SirtRef<mirror::Class>& klass, bool is_static)
487      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
488
489
490  void CreateReferenceInstanceOffsets(SirtRef<mirror::Class>& klass)
491      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
492  void CreateReferenceStaticOffsets(SirtRef<mirror::Class>& klass)
493      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
494  void CreateReferenceOffsets(SirtRef<mirror::Class>& klass, bool is_static,
495                              uint32_t reference_offsets)
496      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
497
498  // For use by ImageWriter to find DexCaches for its roots
499  const std::vector<mirror::DexCache*>& GetDexCaches() {
500    return dex_caches_;
501  }
502
503  const OatFile* FindOpenedOatFileForDexFile(const DexFile& dex_file)
504      LOCKS_EXCLUDED(dex_lock_)
505      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
506  const OatFile* FindOpenedOatFileFromDexLocation(const std::string& dex_location)
507      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_);
508  const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location)
509      SHARED_LOCKS_REQUIRED(dex_lock_);
510  const DexFile* FindDexFileInOatLocation(const std::string& dex_location,
511                                          uint32_t dex_location_checksum,
512                                          const std::string& oat_location)
513      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
514      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
515
516  const DexFile* VerifyAndOpenDexFileFromOatFile(const OatFile* oat_file,
517                                                 const std::string& dex_location,
518                                                 uint32_t dex_location_checksum)
519      EXCLUSIVE_LOCKS_REQUIRED(dex_lock_)
520      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
521
522  mirror::AbstractMethod* CreateProxyConstructor(Thread* self, SirtRef<mirror::Class>& klass,
523                                                 mirror::Class* proxy_class)
524      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
525  mirror::AbstractMethod* CreateProxyMethod(Thread* self, SirtRef<mirror::Class>& klass,
526                                            SirtRef<mirror::AbstractMethod>& prototype)
527      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
528
529  std::vector<const DexFile*> boot_class_path_;
530
531  mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
532  std::vector<mirror::DexCache*> dex_caches_ GUARDED_BY(dex_lock_);
533  std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_);
534
535
536  // multimap from a string hash code of a class descriptor to
537  // mirror::Class* instances. Results should be compared for a matching
538  // Class::descriptor_ and Class::class_loader_.
539  typedef std::multimap<size_t, mirror::Class*> Table;
540  Table image_classes_ GUARDED_BY(Locks::classlinker_classes_lock_);
541  Table classes_ GUARDED_BY(Locks::classlinker_classes_lock_);
542
543  mirror::Class* LookupClassLocked(const char* descriptor, const mirror::ClassLoader* class_loader,
544                                   size_t hash, const Table& classes)
545      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, Locks::classlinker_classes_lock_);
546
547  // indexes into class_roots_.
548  // needs to be kept in sync with class_roots_descriptors_.
549  enum ClassRoot {
550    kJavaLangClass,
551    kJavaLangObject,
552    kClassArrayClass,
553    kObjectArrayClass,
554    kJavaLangString,
555    kJavaLangDexCache,
556    kJavaLangRefReference,
557    kJavaLangReflectConstructor,
558    kJavaLangReflectField,
559    kJavaLangReflectAbstractMethod,
560    kJavaLangReflectMethod,
561    kJavaLangReflectProxy,
562    kJavaLangStringArrayClass,
563    kJavaLangReflectAbstractMethodArrayClass,
564    kJavaLangReflectFieldArrayClass,
565    kJavaLangReflectMethodArrayClass,
566    kJavaLangClassLoader,
567    kJavaLangThrowable,
568    kJavaLangClassNotFoundException,
569    kJavaLangStackTraceElement,
570    kPrimitiveBoolean,
571    kPrimitiveByte,
572    kPrimitiveChar,
573    kPrimitiveDouble,
574    kPrimitiveFloat,
575    kPrimitiveInt,
576    kPrimitiveLong,
577    kPrimitiveShort,
578    kPrimitiveVoid,
579    kBooleanArrayClass,
580    kByteArrayClass,
581    kCharArrayClass,
582    kDoubleArrayClass,
583    kFloatArrayClass,
584    kIntArrayClass,
585    kLongArrayClass,
586    kShortArrayClass,
587    kJavaLangStackTraceElementArrayClass,
588    kClassRootsMax,
589  };
590  mirror::ObjectArray<mirror::Class>* class_roots_;
591
592  mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
593
594  void SetClassRoot(ClassRoot class_root, mirror::Class* klass)
595      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
596
597  mirror::ObjectArray<mirror::Class>* GetClassRoots() {
598    DCHECK(class_roots_ != NULL);
599    return class_roots_;
600  }
601
602  static const char* class_roots_descriptors_[];
603
604  const char* GetClassRootDescriptor(ClassRoot class_root) {
605    const char* descriptor = class_roots_descriptors_[class_root];
606    CHECK(descriptor != NULL);
607    return descriptor;
608  }
609
610  mirror::IfTable* array_iftable_;
611
612  bool init_done_;
613  bool is_dirty_;
614
615  InternTable* intern_table_;
616
617  const void* portable_resolution_trampoline_;
618  const void* quick_resolution_trampoline_;
619
620  friend class CommonTest;
621  friend class ImageWriter;  // for GetClassRoots
622  friend class ObjectTest;
623  FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors);
624  FRIEND_TEST(mirror::DexCacheTest, Open);
625  FRIEND_TEST(ExceptionTest, FindExceptionHandler);
626  FRIEND_TEST(ObjectTest, AllocObjectArray);
627  DISALLOW_COPY_AND_ASSIGN(ClassLinker);
628};
629
630}  // namespace art
631
632#endif  // ART_RUNTIME_CLASS_LINKER_H_
633