Home | History | Annotate | Download | only in runtime
      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 #include "class_linker.h"
     18 
     19 #include <fcntl.h>
     20 #include <sys/file.h>
     21 #include <sys/stat.h>
     22 #include <sys/types.h>
     23 #include <sys/wait.h>
     24 
     25 #include <deque>
     26 #include <string>
     27 #include <utility>
     28 #include <vector>
     29 
     30 #include "base/casts.h"
     31 #include "base/logging.h"
     32 #include "base/stl_util.h"
     33 #include "base/unix_file/fd_file.h"
     34 #include "class_linker-inl.h"
     35 #include "debugger.h"
     36 #include "dex_file-inl.h"
     37 #include "gc/accounting/card_table-inl.h"
     38 #include "gc/accounting/heap_bitmap.h"
     39 #include "gc/heap.h"
     40 #include "gc/space/image_space.h"
     41 #include "intern_table.h"
     42 #include "interpreter/interpreter.h"
     43 #include "leb128.h"
     44 #include "oat.h"
     45 #include "oat_file.h"
     46 #include "mirror/art_field-inl.h"
     47 #include "mirror/art_method-inl.h"
     48 #include "mirror/class.h"
     49 #include "mirror/class-inl.h"
     50 #include "mirror/class_loader.h"
     51 #include "mirror/dex_cache-inl.h"
     52 #include "mirror/iftable-inl.h"
     53 #include "mirror/object-inl.h"
     54 #include "mirror/object_array-inl.h"
     55 #include "mirror/proxy.h"
     56 #include "mirror/stack_trace_element.h"
     57 #include "object_utils.h"
     58 #include "os.h"
     59 #include "runtime.h"
     60 #include "entrypoints/entrypoint_utils.h"
     61 #include "ScopedLocalRef.h"
     62 #include "scoped_thread_state_change.h"
     63 #include "sirt_ref.h"
     64 #include "stack_indirect_reference_table.h"
     65 #include "thread.h"
     66 #include "UniquePtr.h"
     67 #include "utils.h"
     68 #include "verifier/method_verifier.h"
     69 #include "well_known_classes.h"
     70 
     71 namespace art {
     72 
     73 static void ThrowNoClassDefFoundError(const char* fmt, ...)
     74     __attribute__((__format__(__printf__, 1, 2)))
     75     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
     76 static void ThrowNoClassDefFoundError(const char* fmt, ...) {
     77   va_list args;
     78   va_start(args, fmt);
     79   Thread* self = Thread::Current();
     80   ThrowLocation throw_location = self->GetCurrentLocationForThrow();
     81   self->ThrowNewExceptionV(throw_location, "Ljava/lang/NoClassDefFoundError;", fmt, args);
     82   va_end(args);
     83 }
     84 
     85 static void ThrowEarlierClassFailure(mirror::Class* c)
     86     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
     87   // The class failed to initialize on a previous attempt, so we want to throw
     88   // a NoClassDefFoundError (v2 2.17.5).  The exception to this rule is if we
     89   // failed in verification, in which case v2 5.4.1 says we need to re-throw
     90   // the previous error.
     91   if (!Runtime::Current()->IsCompiler()) {  // Give info if this occurs at runtime.
     92     LOG(INFO) << "Rejecting re-init on previously-failed class " << PrettyClass(c);
     93   }
     94 
     95   CHECK(c->IsErroneous()) << PrettyClass(c) << " " << c->GetStatus();
     96   Thread* self = Thread::Current();
     97   ThrowLocation throw_location = self->GetCurrentLocationForThrow();
     98   if (c->GetVerifyErrorClass() != NULL) {
     99     // TODO: change the verifier to store an _instance_, with a useful detail message?
    100     ClassHelper ve_ch(c->GetVerifyErrorClass());
    101     self->ThrowNewException(throw_location, ve_ch.GetDescriptor(), PrettyDescriptor(c).c_str());
    102   } else {
    103     self->ThrowNewException(throw_location, "Ljava/lang/NoClassDefFoundError;",
    104                             PrettyDescriptor(c).c_str());
    105   }
    106 }
    107 
    108 static void WrapExceptionInInitializer() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    109   Thread* self = Thread::Current();
    110   JNIEnv* env = self->GetJniEnv();
    111 
    112   ScopedLocalRef<jthrowable> cause(env, env->ExceptionOccurred());
    113   CHECK(cause.get() != NULL);
    114 
    115   env->ExceptionClear();
    116   bool is_error = env->IsInstanceOf(cause.get(), WellKnownClasses::java_lang_Error);
    117   env->Throw(cause.get());
    118 
    119   // We only wrap non-Error exceptions; an Error can just be used as-is.
    120   if (!is_error) {
    121     ThrowLocation throw_location = self->GetCurrentLocationForThrow();
    122     self->ThrowNewWrappedException(throw_location, "Ljava/lang/ExceptionInInitializerError;", NULL);
    123   }
    124 }
    125 
    126 static size_t Hash(const char* s) {
    127   // This is the java.lang.String hashcode for convenience, not interoperability.
    128   size_t hash = 0;
    129   for (; *s != '\0'; ++s) {
    130     hash = hash * 31 + *s;
    131   }
    132   return hash;
    133 }
    134 
    135 const char* ClassLinker::class_roots_descriptors_[] = {
    136   "Ljava/lang/Class;",
    137   "Ljava/lang/Object;",
    138   "[Ljava/lang/Class;",
    139   "[Ljava/lang/Object;",
    140   "Ljava/lang/String;",
    141   "Ljava/lang/DexCache;",
    142   "Ljava/lang/ref/Reference;",
    143   "Ljava/lang/reflect/ArtField;",
    144   "Ljava/lang/reflect/ArtMethod;",
    145   "Ljava/lang/reflect/Proxy;",
    146   "[Ljava/lang/String;",
    147   "[Ljava/lang/reflect/ArtField;",
    148   "[Ljava/lang/reflect/ArtMethod;",
    149   "Ljava/lang/ClassLoader;",
    150   "Ljava/lang/Throwable;",
    151   "Ljava/lang/ClassNotFoundException;",
    152   "Ljava/lang/StackTraceElement;",
    153   "Z",
    154   "B",
    155   "C",
    156   "D",
    157   "F",
    158   "I",
    159   "J",
    160   "S",
    161   "V",
    162   "[Z",
    163   "[B",
    164   "[C",
    165   "[D",
    166   "[F",
    167   "[I",
    168   "[J",
    169   "[S",
    170   "[Ljava/lang/StackTraceElement;",
    171 };
    172 
    173 ClassLinker* ClassLinker::CreateFromCompiler(const std::vector<const DexFile*>& boot_class_path,
    174                                              InternTable* intern_table) {
    175   CHECK_NE(boot_class_path.size(), 0U);
    176   UniquePtr<ClassLinker> class_linker(new ClassLinker(intern_table));
    177   class_linker->InitFromCompiler(boot_class_path);
    178   return class_linker.release();
    179 }
    180 
    181 ClassLinker* ClassLinker::CreateFromImage(InternTable* intern_table) {
    182   UniquePtr<ClassLinker> class_linker(new ClassLinker(intern_table));
    183   class_linker->InitFromImage();
    184   return class_linker.release();
    185 }
    186 
    187 ClassLinker::ClassLinker(InternTable* intern_table)
    188     // dex_lock_ is recursive as it may be used in stack dumping.
    189     : dex_lock_("ClassLinker dex lock", kDefaultMutexLevel),
    190       dex_cache_image_class_lookup_required_(false),
    191       failed_dex_cache_class_lookups_(0),
    192       class_roots_(NULL),
    193       array_iftable_(NULL),
    194       init_done_(false),
    195       dex_caches_dirty_(false),
    196       class_table_dirty_(false),
    197       intern_table_(intern_table),
    198       portable_resolution_trampoline_(NULL),
    199       quick_resolution_trampoline_(NULL) {
    200   CHECK_EQ(arraysize(class_roots_descriptors_), size_t(kClassRootsMax));
    201 }
    202 
    203 void ClassLinker::InitFromCompiler(const std::vector<const DexFile*>& boot_class_path) {
    204   VLOG(startup) << "ClassLinker::Init";
    205   CHECK(Runtime::Current()->IsCompiler());
    206 
    207   CHECK(!init_done_);
    208 
    209   // java_lang_Class comes first, it's needed for AllocClass
    210   Thread* self = Thread::Current();
    211   gc::Heap* heap = Runtime::Current()->GetHeap();
    212   SirtRef<mirror::Class>
    213       java_lang_Class(self,
    214                       down_cast<mirror::Class*>(heap->AllocObject(self, NULL,
    215                                                                   sizeof(mirror::ClassClass))));
    216   CHECK(java_lang_Class.get() != NULL);
    217   mirror::Class::SetClassClass(java_lang_Class.get());
    218   java_lang_Class->SetClass(java_lang_Class.get());
    219   java_lang_Class->SetClassSize(sizeof(mirror::ClassClass));
    220   // AllocClass(mirror::Class*) can now be used
    221 
    222   // Class[] is used for reflection support.
    223   SirtRef<mirror::Class> class_array_class(self, AllocClass(self, java_lang_Class.get(), sizeof(mirror::Class)));
    224   class_array_class->SetComponentType(java_lang_Class.get());
    225 
    226   // java_lang_Object comes next so that object_array_class can be created.
    227   SirtRef<mirror::Class> java_lang_Object(self, AllocClass(self, java_lang_Class.get(), sizeof(mirror::Class)));
    228   CHECK(java_lang_Object.get() != NULL);
    229   // backfill Object as the super class of Class.
    230   java_lang_Class->SetSuperClass(java_lang_Object.get());
    231   java_lang_Object->SetStatus(mirror::Class::kStatusLoaded, self);
    232 
    233   // Object[] next to hold class roots.
    234   SirtRef<mirror::Class> object_array_class(self, AllocClass(self, java_lang_Class.get(), sizeof(mirror::Class)));
    235   object_array_class->SetComponentType(java_lang_Object.get());
    236 
    237   // Setup the char class to be used for char[].
    238   SirtRef<mirror::Class> char_class(self, AllocClass(self, java_lang_Class.get(), sizeof(mirror::Class)));
    239 
    240   // Setup the char[] class to be used for String.
    241   SirtRef<mirror::Class> char_array_class(self, AllocClass(self, java_lang_Class.get(), sizeof(mirror::Class)));
    242   char_array_class->SetComponentType(char_class.get());
    243   mirror::CharArray::SetArrayClass(char_array_class.get());
    244 
    245   // Setup String.
    246   SirtRef<mirror::Class> java_lang_String(self, AllocClass(self, java_lang_Class.get(), sizeof(mirror::StringClass)));
    247   mirror::String::SetClass(java_lang_String.get());
    248   java_lang_String->SetObjectSize(sizeof(mirror::String));
    249   java_lang_String->SetStatus(mirror::Class::kStatusResolved, self);
    250 
    251   // Create storage for root classes, save away our work so far (requires descriptors).
    252   class_roots_ = mirror::ObjectArray<mirror::Class>::Alloc(self, object_array_class.get(), kClassRootsMax);
    253   CHECK(class_roots_ != NULL);
    254   SetClassRoot(kJavaLangClass, java_lang_Class.get());
    255   SetClassRoot(kJavaLangObject, java_lang_Object.get());
    256   SetClassRoot(kClassArrayClass, class_array_class.get());
    257   SetClassRoot(kObjectArrayClass, object_array_class.get());
    258   SetClassRoot(kCharArrayClass, char_array_class.get());
    259   SetClassRoot(kJavaLangString, java_lang_String.get());
    260 
    261   // Setup the primitive type classes.
    262   SetClassRoot(kPrimitiveBoolean, CreatePrimitiveClass(self, Primitive::kPrimBoolean));
    263   SetClassRoot(kPrimitiveByte, CreatePrimitiveClass(self, Primitive::kPrimByte));
    264   SetClassRoot(kPrimitiveShort, CreatePrimitiveClass(self, Primitive::kPrimShort));
    265   SetClassRoot(kPrimitiveInt, CreatePrimitiveClass(self, Primitive::kPrimInt));
    266   SetClassRoot(kPrimitiveLong, CreatePrimitiveClass(self, Primitive::kPrimLong));
    267   SetClassRoot(kPrimitiveFloat, CreatePrimitiveClass(self, Primitive::kPrimFloat));
    268   SetClassRoot(kPrimitiveDouble, CreatePrimitiveClass(self, Primitive::kPrimDouble));
    269   SetClassRoot(kPrimitiveVoid, CreatePrimitiveClass(self, Primitive::kPrimVoid));
    270 
    271   // Create array interface entries to populate once we can load system classes.
    272   array_iftable_ = AllocIfTable(self, 2);
    273 
    274   // Create int array type for AllocDexCache (done in AppendToBootClassPath).
    275   SirtRef<mirror::Class> int_array_class(self, AllocClass(self, java_lang_Class.get(), sizeof(mirror::Class)));
    276   int_array_class->SetComponentType(GetClassRoot(kPrimitiveInt));
    277   mirror::IntArray::SetArrayClass(int_array_class.get());
    278   SetClassRoot(kIntArrayClass, int_array_class.get());
    279 
    280   // now that these are registered, we can use AllocClass() and AllocObjectArray
    281 
    282   // Set up DexCache. This cannot be done later since AppendToBootClassPath calls AllocDexCache.
    283   SirtRef<mirror::Class>
    284       java_lang_DexCache(self, AllocClass(self, java_lang_Class.get(), sizeof(mirror::DexCacheClass)));
    285   SetClassRoot(kJavaLangDexCache, java_lang_DexCache.get());
    286   java_lang_DexCache->SetObjectSize(sizeof(mirror::DexCacheClass));
    287   java_lang_DexCache->SetStatus(mirror::Class::kStatusResolved, self);
    288 
    289   // Constructor, Field, Method, and AbstractMethod are necessary so that FindClass can link members.
    290   SirtRef<mirror::Class> java_lang_reflect_ArtField(self, AllocClass(self, java_lang_Class.get(),
    291                                                                      sizeof(mirror::ArtFieldClass)));
    292   CHECK(java_lang_reflect_ArtField.get() != NULL);
    293   java_lang_reflect_ArtField->SetObjectSize(sizeof(mirror::ArtField));
    294   SetClassRoot(kJavaLangReflectArtField, java_lang_reflect_ArtField.get());
    295   java_lang_reflect_ArtField->SetStatus(mirror::Class::kStatusResolved, self);
    296   mirror::ArtField::SetClass(java_lang_reflect_ArtField.get());
    297 
    298   SirtRef<mirror::Class> java_lang_reflect_ArtMethod(self, AllocClass(self, java_lang_Class.get(),
    299                                                                       sizeof(mirror::ArtMethodClass)));
    300   CHECK(java_lang_reflect_ArtMethod.get() != NULL);
    301   java_lang_reflect_ArtMethod->SetObjectSize(sizeof(mirror::ArtMethod));
    302   SetClassRoot(kJavaLangReflectArtMethod, java_lang_reflect_ArtMethod.get());
    303   java_lang_reflect_ArtMethod->SetStatus(mirror::Class::kStatusResolved, self);
    304 
    305   mirror::ArtMethod::SetClass(java_lang_reflect_ArtMethod.get());
    306 
    307   // Set up array classes for string, field, method
    308   SirtRef<mirror::Class> object_array_string(self, AllocClass(self, java_lang_Class.get(),
    309                                                               sizeof(mirror::Class)));
    310   object_array_string->SetComponentType(java_lang_String.get());
    311   SetClassRoot(kJavaLangStringArrayClass, object_array_string.get());
    312 
    313   SirtRef<mirror::Class> object_array_art_method(self, AllocClass(self, java_lang_Class.get(),
    314                                                                   sizeof(mirror::Class)));
    315   object_array_art_method->SetComponentType(java_lang_reflect_ArtMethod.get());
    316   SetClassRoot(kJavaLangReflectArtMethodArrayClass, object_array_art_method.get());
    317 
    318   SirtRef<mirror::Class> object_array_art_field(self, AllocClass(self, java_lang_Class.get(),
    319                                                                  sizeof(mirror::Class)));
    320   object_array_art_field->SetComponentType(java_lang_reflect_ArtField.get());
    321   SetClassRoot(kJavaLangReflectArtFieldArrayClass, object_array_art_field.get());
    322 
    323   // Setup boot_class_path_ and register class_path now that we can use AllocObjectArray to create
    324   // DexCache instances. Needs to be after String, Field, Method arrays since AllocDexCache uses
    325   // these roots.
    326   CHECK_NE(0U, boot_class_path.size());
    327   for (size_t i = 0; i != boot_class_path.size(); ++i) {
    328     const DexFile* dex_file = boot_class_path[i];
    329     CHECK(dex_file != NULL);
    330     AppendToBootClassPath(*dex_file);
    331   }
    332 
    333   // now we can use FindSystemClass
    334 
    335   // run char class through InitializePrimitiveClass to finish init
    336   InitializePrimitiveClass(char_class.get(), Primitive::kPrimChar);
    337   SetClassRoot(kPrimitiveChar, char_class.get());  // needs descriptor
    338 
    339   // Object, String and DexCache need to be rerun through FindSystemClass to finish init
    340   java_lang_Object->SetStatus(mirror::Class::kStatusNotReady, self);
    341   mirror::Class* Object_class = FindSystemClass("Ljava/lang/Object;");
    342   CHECK_EQ(java_lang_Object.get(), Object_class);
    343   CHECK_EQ(java_lang_Object->GetObjectSize(), sizeof(mirror::Object));
    344   java_lang_String->SetStatus(mirror::Class::kStatusNotReady, self);
    345   mirror::Class* String_class = FindSystemClass("Ljava/lang/String;");
    346   CHECK_EQ(java_lang_String.get(), String_class);
    347   CHECK_EQ(java_lang_String->GetObjectSize(), sizeof(mirror::String));
    348   java_lang_DexCache->SetStatus(mirror::Class::kStatusNotReady, self);
    349   mirror::Class* DexCache_class = FindSystemClass("Ljava/lang/DexCache;");
    350   CHECK_EQ(java_lang_String.get(), String_class);
    351   CHECK_EQ(java_lang_DexCache.get(), DexCache_class);
    352   CHECK_EQ(java_lang_DexCache->GetObjectSize(), sizeof(mirror::DexCache));
    353 
    354   // Setup the primitive array type classes - can't be done until Object has a vtable.
    355   SetClassRoot(kBooleanArrayClass, FindSystemClass("[Z"));
    356   mirror::BooleanArray::SetArrayClass(GetClassRoot(kBooleanArrayClass));
    357 
    358   SetClassRoot(kByteArrayClass, FindSystemClass("[B"));
    359   mirror::ByteArray::SetArrayClass(GetClassRoot(kByteArrayClass));
    360 
    361   mirror::Class* found_char_array_class = FindSystemClass("[C");
    362   CHECK_EQ(char_array_class.get(), found_char_array_class);
    363 
    364   SetClassRoot(kShortArrayClass, FindSystemClass("[S"));
    365   mirror::ShortArray::SetArrayClass(GetClassRoot(kShortArrayClass));
    366 
    367   mirror::Class* found_int_array_class = FindSystemClass("[I");
    368   CHECK_EQ(int_array_class.get(), found_int_array_class);
    369 
    370   SetClassRoot(kLongArrayClass, FindSystemClass("[J"));
    371   mirror::LongArray::SetArrayClass(GetClassRoot(kLongArrayClass));
    372 
    373   SetClassRoot(kFloatArrayClass, FindSystemClass("[F"));
    374   mirror::FloatArray::SetArrayClass(GetClassRoot(kFloatArrayClass));
    375 
    376   SetClassRoot(kDoubleArrayClass, FindSystemClass("[D"));
    377   mirror::DoubleArray::SetArrayClass(GetClassRoot(kDoubleArrayClass));
    378 
    379   mirror::Class* found_class_array_class = FindSystemClass("[Ljava/lang/Class;");
    380   CHECK_EQ(class_array_class.get(), found_class_array_class);
    381 
    382   mirror::Class* found_object_array_class = FindSystemClass("[Ljava/lang/Object;");
    383   CHECK_EQ(object_array_class.get(), found_object_array_class);
    384 
    385   // Setup the single, global copy of "iftable".
    386   mirror::Class* java_lang_Cloneable = FindSystemClass("Ljava/lang/Cloneable;");
    387   CHECK(java_lang_Cloneable != NULL);
    388   mirror::Class* java_io_Serializable = FindSystemClass("Ljava/io/Serializable;");
    389   CHECK(java_io_Serializable != NULL);
    390   // We assume that Cloneable/Serializable don't have superinterfaces -- normally we'd have to
    391   // crawl up and explicitly list all of the supers as well.
    392   array_iftable_->SetInterface(0, java_lang_Cloneable);
    393   array_iftable_->SetInterface(1, java_io_Serializable);
    394 
    395   // Sanity check Class[] and Object[]'s interfaces.
    396   ClassHelper kh(class_array_class.get(), this);
    397   CHECK_EQ(java_lang_Cloneable, kh.GetDirectInterface(0));
    398   CHECK_EQ(java_io_Serializable, kh.GetDirectInterface(1));
    399   kh.ChangeClass(object_array_class.get());
    400   CHECK_EQ(java_lang_Cloneable, kh.GetDirectInterface(0));
    401   CHECK_EQ(java_io_Serializable, kh.GetDirectInterface(1));
    402   // Run Class, ArtField, and ArtMethod through FindSystemClass. This initializes their
    403   // dex_cache_ fields and register them in class_table_.
    404   mirror::Class* Class_class = FindSystemClass("Ljava/lang/Class;");
    405   CHECK_EQ(java_lang_Class.get(), Class_class);
    406 
    407   java_lang_reflect_ArtMethod->SetStatus(mirror::Class::kStatusNotReady, self);
    408   mirror::Class* Art_method_class = FindSystemClass("Ljava/lang/reflect/ArtMethod;");
    409   CHECK_EQ(java_lang_reflect_ArtMethod.get(), Art_method_class);
    410 
    411   java_lang_reflect_ArtField->SetStatus(mirror::Class::kStatusNotReady, self);
    412   mirror::Class* Art_field_class = FindSystemClass("Ljava/lang/reflect/ArtField;");
    413   CHECK_EQ(java_lang_reflect_ArtField.get(), Art_field_class);
    414 
    415   mirror::Class* String_array_class = FindSystemClass(class_roots_descriptors_[kJavaLangStringArrayClass]);
    416   CHECK_EQ(object_array_string.get(), String_array_class);
    417 
    418   mirror::Class* Art_method_array_class =
    419       FindSystemClass(class_roots_descriptors_[kJavaLangReflectArtMethodArrayClass]);
    420   CHECK_EQ(object_array_art_method.get(), Art_method_array_class);
    421 
    422   mirror::Class* Art_field_array_class =
    423       FindSystemClass(class_roots_descriptors_[kJavaLangReflectArtFieldArrayClass]);
    424   CHECK_EQ(object_array_art_field.get(), Art_field_array_class);
    425 
    426   // End of special init trickery, subsequent classes may be loaded via FindSystemClass.
    427 
    428   // Create java.lang.reflect.Proxy root.
    429   mirror::Class* java_lang_reflect_Proxy = FindSystemClass("Ljava/lang/reflect/Proxy;");
    430   SetClassRoot(kJavaLangReflectProxy, java_lang_reflect_Proxy);
    431 
    432   // java.lang.ref classes need to be specially flagged, but otherwise are normal classes
    433   mirror::Class* java_lang_ref_Reference = FindSystemClass("Ljava/lang/ref/Reference;");
    434   SetClassRoot(kJavaLangRefReference, java_lang_ref_Reference);
    435   mirror::Class* java_lang_ref_FinalizerReference = FindSystemClass("Ljava/lang/ref/FinalizerReference;");
    436   java_lang_ref_FinalizerReference->SetAccessFlags(
    437       java_lang_ref_FinalizerReference->GetAccessFlags() |
    438           kAccClassIsReference | kAccClassIsFinalizerReference);
    439   mirror::Class* java_lang_ref_PhantomReference = FindSystemClass("Ljava/lang/ref/PhantomReference;");
    440   java_lang_ref_PhantomReference->SetAccessFlags(
    441       java_lang_ref_PhantomReference->GetAccessFlags() |
    442           kAccClassIsReference | kAccClassIsPhantomReference);
    443   mirror::Class* java_lang_ref_SoftReference = FindSystemClass("Ljava/lang/ref/SoftReference;");
    444   java_lang_ref_SoftReference->SetAccessFlags(
    445       java_lang_ref_SoftReference->GetAccessFlags() | kAccClassIsReference);
    446   mirror::Class* java_lang_ref_WeakReference = FindSystemClass("Ljava/lang/ref/WeakReference;");
    447   java_lang_ref_WeakReference->SetAccessFlags(
    448       java_lang_ref_WeakReference->GetAccessFlags() |
    449           kAccClassIsReference | kAccClassIsWeakReference);
    450 
    451   // Setup the ClassLoader, verifying the object_size_.
    452   mirror::Class* java_lang_ClassLoader = FindSystemClass("Ljava/lang/ClassLoader;");
    453   CHECK_EQ(java_lang_ClassLoader->GetObjectSize(), sizeof(mirror::ClassLoader));
    454   SetClassRoot(kJavaLangClassLoader, java_lang_ClassLoader);
    455 
    456   // Set up java.lang.Throwable, java.lang.ClassNotFoundException, and
    457   // java.lang.StackTraceElement as a convenience.
    458   SetClassRoot(kJavaLangThrowable, FindSystemClass("Ljava/lang/Throwable;"));
    459   mirror::Throwable::SetClass(GetClassRoot(kJavaLangThrowable));
    460   SetClassRoot(kJavaLangClassNotFoundException, FindSystemClass("Ljava/lang/ClassNotFoundException;"));
    461   SetClassRoot(kJavaLangStackTraceElement, FindSystemClass("Ljava/lang/StackTraceElement;"));
    462   SetClassRoot(kJavaLangStackTraceElementArrayClass, FindSystemClass("[Ljava/lang/StackTraceElement;"));
    463   mirror::StackTraceElement::SetClass(GetClassRoot(kJavaLangStackTraceElement));
    464 
    465   FinishInit();
    466 
    467   VLOG(startup) << "ClassLinker::InitFromCompiler exiting";
    468 }
    469 
    470 void ClassLinker::FinishInit() {
    471   VLOG(startup) << "ClassLinker::FinishInit entering";
    472 
    473   // Let the heap know some key offsets into java.lang.ref instances
    474   // Note: we hard code the field indexes here rather than using FindInstanceField
    475   // as the types of the field can't be resolved prior to the runtime being
    476   // fully initialized
    477   mirror::Class* java_lang_ref_Reference = GetClassRoot(kJavaLangRefReference);
    478   mirror::Class* java_lang_ref_FinalizerReference =
    479       FindSystemClass("Ljava/lang/ref/FinalizerReference;");
    480 
    481   mirror::ArtField* pendingNext = java_lang_ref_Reference->GetInstanceField(0);
    482   FieldHelper fh(pendingNext, this);
    483   CHECK_STREQ(fh.GetName(), "pendingNext");
    484   CHECK_STREQ(fh.GetTypeDescriptor(), "Ljava/lang/ref/Reference;");
    485 
    486   mirror::ArtField* queue = java_lang_ref_Reference->GetInstanceField(1);
    487   fh.ChangeField(queue);
    488   CHECK_STREQ(fh.GetName(), "queue");
    489   CHECK_STREQ(fh.GetTypeDescriptor(), "Ljava/lang/ref/ReferenceQueue;");
    490 
    491   mirror::ArtField* queueNext = java_lang_ref_Reference->GetInstanceField(2);
    492   fh.ChangeField(queueNext);
    493   CHECK_STREQ(fh.GetName(), "queueNext");
    494   CHECK_STREQ(fh.GetTypeDescriptor(), "Ljava/lang/ref/Reference;");
    495 
    496   mirror::ArtField* referent = java_lang_ref_Reference->GetInstanceField(3);
    497   fh.ChangeField(referent);
    498   CHECK_STREQ(fh.GetName(), "referent");
    499   CHECK_STREQ(fh.GetTypeDescriptor(), "Ljava/lang/Object;");
    500 
    501   mirror::ArtField* zombie = java_lang_ref_FinalizerReference->GetInstanceField(2);
    502   fh.ChangeField(zombie);
    503   CHECK_STREQ(fh.GetName(), "zombie");
    504   CHECK_STREQ(fh.GetTypeDescriptor(), "Ljava/lang/Object;");
    505 
    506   gc::Heap* heap = Runtime::Current()->GetHeap();
    507   heap->SetReferenceOffsets(referent->GetOffset(),
    508                             queue->GetOffset(),
    509                             queueNext->GetOffset(),
    510                             pendingNext->GetOffset(),
    511                             zombie->GetOffset());
    512 
    513   // ensure all class_roots_ are initialized
    514   for (size_t i = 0; i < kClassRootsMax; i++) {
    515     ClassRoot class_root = static_cast<ClassRoot>(i);
    516     mirror::Class* klass = GetClassRoot(class_root);
    517     CHECK(klass != NULL);
    518     DCHECK(klass->IsArrayClass() || klass->IsPrimitive() || klass->GetDexCache() != NULL);
    519     // note SetClassRoot does additional validation.
    520     // if possible add new checks there to catch errors early
    521   }
    522 
    523   CHECK(array_iftable_ != NULL);
    524 
    525   // disable the slow paths in FindClass and CreatePrimitiveClass now
    526   // that Object, Class, and Object[] are setup
    527   init_done_ = true;
    528 
    529   VLOG(startup) << "ClassLinker::FinishInit exiting";
    530 }
    531 
    532 void ClassLinker::RunRootClinits() {
    533   Thread* self = Thread::Current();
    534   for (size_t i = 0; i < ClassLinker::kClassRootsMax; ++i) {
    535     mirror::Class* c = GetClassRoot(ClassRoot(i));
    536     if (!c->IsArrayClass() && !c->IsPrimitive()) {
    537       EnsureInitialized(GetClassRoot(ClassRoot(i)), true, true);
    538       self->AssertNoPendingException();
    539     }
    540   }
    541 }
    542 
    543 bool ClassLinker::GenerateOatFile(const std::string& dex_filename,
    544                                   int oat_fd,
    545                                   const std::string& oat_cache_filename) {
    546   std::string dex2oat_string(GetAndroidRoot());
    547   dex2oat_string += (kIsDebugBuild ? "/bin/dex2oatd" : "/bin/dex2oat");
    548   const char* dex2oat = dex2oat_string.c_str();
    549 
    550   const char* class_path = Runtime::Current()->GetClassPathString().c_str();
    551 
    552   gc::Heap* heap = Runtime::Current()->GetHeap();
    553   std::string boot_image_option_string("--boot-image=");
    554   boot_image_option_string += heap->GetImageSpace()->GetImageFilename();
    555   const char* boot_image_option = boot_image_option_string.c_str();
    556 
    557   std::string dex_file_option_string("--dex-file=");
    558   dex_file_option_string += dex_filename;
    559   const char* dex_file_option = dex_file_option_string.c_str();
    560 
    561   std::string oat_fd_option_string("--oat-fd=");
    562   StringAppendF(&oat_fd_option_string, "%d", oat_fd);
    563   const char* oat_fd_option = oat_fd_option_string.c_str();
    564 
    565   std::string oat_location_option_string("--oat-location=");
    566   oat_location_option_string += oat_cache_filename;
    567   const char* oat_location_option = oat_location_option_string.c_str();
    568 
    569   std::string oat_compiler_filter_string("-compiler-filter:");
    570   switch (Runtime::Current()->GetCompilerFilter()) {
    571     case Runtime::kInterpretOnly:
    572       oat_compiler_filter_string += "interpret-only";
    573       break;
    574     case Runtime::kSpace:
    575       oat_compiler_filter_string += "space";
    576       break;
    577     case Runtime::kBalanced:
    578       oat_compiler_filter_string += "balanced";
    579       break;
    580     case Runtime::kSpeed:
    581       oat_compiler_filter_string += "speed";
    582       break;
    583     case Runtime::kEverything:
    584       oat_compiler_filter_string += "everything";
    585       break;
    586     default:
    587       LOG(FATAL) << "Unexpected case.";
    588   }
    589   const char* oat_compiler_filter_option = oat_compiler_filter_string.c_str();
    590 
    591   // fork and exec dex2oat
    592   pid_t pid = fork();
    593   if (pid == 0) {
    594     // no allocation allowed between fork and exec
    595 
    596     // change process groups, so we don't get reaped by ProcessManager
    597     setpgid(0, 0);
    598 
    599     // gLogVerbosity.class_linker = true;
    600     VLOG(class_linker) << dex2oat
    601                        << " --runtime-arg -Xms64m"
    602                        << " --runtime-arg -Xmx64m"
    603                        << " --runtime-arg -classpath"
    604                        << " --runtime-arg " << class_path
    605                        << " --runtime-arg " << oat_compiler_filter_option
    606 #if !defined(ART_TARGET)
    607                        << " --host"
    608 #endif
    609                        << " " << boot_image_option
    610                        << " " << dex_file_option
    611                        << " " << oat_fd_option
    612                        << " " << oat_location_option;
    613 
    614     execl(dex2oat, dex2oat,
    615           "--runtime-arg", "-Xms64m",
    616           "--runtime-arg", "-Xmx64m",
    617           "--runtime-arg", "-classpath",
    618           "--runtime-arg", class_path,
    619           "--runtime-arg", oat_compiler_filter_option,
    620 #if !defined(ART_TARGET)
    621           "--host",
    622 #endif
    623           boot_image_option,
    624           dex_file_option,
    625           oat_fd_option,
    626           oat_location_option,
    627           NULL);
    628 
    629     PLOG(FATAL) << "execl(" << dex2oat << ") failed";
    630     return false;
    631   } else {
    632     // wait for dex2oat to finish
    633     int status;
    634     pid_t got_pid = TEMP_FAILURE_RETRY(waitpid(pid, &status, 0));
    635     if (got_pid != pid) {
    636       PLOG(ERROR) << "waitpid failed: wanted " << pid << ", got " << got_pid;
    637       return false;
    638     }
    639     if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
    640       LOG(ERROR) << dex2oat << " failed with dex-file=" << dex_filename;
    641       return false;
    642     }
    643   }
    644   return true;
    645 }
    646 
    647 void ClassLinker::RegisterOatFile(const OatFile& oat_file) {
    648   WriterMutexLock mu(Thread::Current(), dex_lock_);
    649   RegisterOatFileLocked(oat_file);
    650 }
    651 
    652 void ClassLinker::RegisterOatFileLocked(const OatFile& oat_file) {
    653   dex_lock_.AssertExclusiveHeld(Thread::Current());
    654   if (kIsDebugBuild) {
    655     for (size_t i = 0; i < oat_files_.size(); ++i) {
    656       CHECK_NE(&oat_file, oat_files_[i]) << oat_file.GetLocation();
    657     }
    658   }
    659   VLOG(class_linker) << "Registering " << oat_file.GetLocation();
    660   oat_files_.push_back(&oat_file);
    661 }
    662 
    663 OatFile& ClassLinker::GetImageOatFile(gc::space::ImageSpace* space) {
    664   VLOG(startup) << "ClassLinker::GetImageOatFile entering";
    665   OatFile& oat_file = space->ReleaseOatFile();
    666   WriterMutexLock mu(Thread::Current(), dex_lock_);
    667   RegisterOatFileLocked(oat_file);
    668   VLOG(startup) << "ClassLinker::GetImageOatFile exiting";
    669   return oat_file;
    670 }
    671 
    672 const OatFile* ClassLinker::FindOpenedOatFileForDexFile(const DexFile& dex_file) {
    673   ReaderMutexLock mu(Thread::Current(), dex_lock_);
    674   return FindOpenedOatFileFromDexLocation(dex_file.GetLocation(), dex_file.GetLocationChecksum());
    675 }
    676 
    677 const OatFile* ClassLinker::FindOpenedOatFileFromDexLocation(const std::string& dex_location,
    678                                                              uint32_t dex_location_checksum) {
    679   for (size_t i = 0; i < oat_files_.size(); i++) {
    680     const OatFile* oat_file = oat_files_[i];
    681     DCHECK(oat_file != NULL);
    682     const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_location,
    683                                                                       &dex_location_checksum,
    684                                                                       false);
    685     if (oat_dex_file != NULL) {
    686       return oat_file;
    687     }
    688   }
    689   return NULL;
    690 }
    691 
    692 const DexFile* ClassLinker::FindDexFileInOatLocation(const std::string& dex_location,
    693                                                      uint32_t dex_location_checksum,
    694                                                      const std::string& oat_location) {
    695   UniquePtr<OatFile> oat_file(OatFile::Open(oat_location, oat_location, NULL,
    696                                             !Runtime::Current()->IsCompiler()));
    697   if (oat_file.get() == NULL) {
    698     VLOG(class_linker) << "Failed to find existing oat file at " << oat_location;
    699     return NULL;
    700   }
    701   Runtime* runtime = Runtime::Current();
    702   const ImageHeader& image_header = runtime->GetHeap()->GetImageSpace()->GetImageHeader();
    703   uint32_t expected_image_oat_checksum = image_header.GetOatChecksum();
    704   uint32_t actual_image_oat_checksum = oat_file->GetOatHeader().GetImageFileLocationOatChecksum();
    705   if (expected_image_oat_checksum != actual_image_oat_checksum) {
    706     VLOG(class_linker) << "Failed to find oat file at " << oat_location
    707                        << " with expected image oat checksum of " << expected_image_oat_checksum
    708                        << ", found " << actual_image_oat_checksum;
    709     return NULL;
    710   }
    711 
    712   uint32_t expected_image_oat_offset = reinterpret_cast<uint32_t>(image_header.GetOatDataBegin());
    713   uint32_t actual_image_oat_offset = oat_file->GetOatHeader().GetImageFileLocationOatDataBegin();
    714   if (expected_image_oat_offset != actual_image_oat_offset) {
    715     VLOG(class_linker) << "Failed to find oat file at " << oat_location
    716                        << " with expected image oat offset " << expected_image_oat_offset
    717                        << ", found " << actual_image_oat_offset;
    718     return NULL;
    719   }
    720   const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_location, &dex_location_checksum);
    721   if (oat_dex_file == NULL) {
    722     VLOG(class_linker) << "Failed to find oat file at " << oat_location << " containing " << dex_location;
    723     return NULL;
    724   }
    725   uint32_t expected_dex_checksum = dex_location_checksum;
    726   uint32_t actual_dex_checksum = oat_dex_file->GetDexFileLocationChecksum();
    727   if (expected_dex_checksum != actual_dex_checksum) {
    728     VLOG(class_linker) << "Failed to find oat file at " << oat_location
    729                        << " with expected dex checksum of " << expected_dex_checksum
    730                        << ", found " << actual_dex_checksum;
    731     return NULL;
    732   }
    733   RegisterOatFileLocked(*oat_file.release());
    734   return oat_dex_file->OpenDexFile();
    735 }
    736 
    737 const DexFile* ClassLinker::FindOrCreateOatFileForDexLocation(const std::string& dex_location,
    738                                                               uint32_t dex_location_checksum,
    739                                                               const std::string& oat_location) {
    740   WriterMutexLock mu(Thread::Current(), dex_lock_);
    741   return FindOrCreateOatFileForDexLocationLocked(dex_location, dex_location_checksum, oat_location);
    742 }
    743 
    744 class ScopedFlock {
    745  public:
    746   ScopedFlock() {}
    747 
    748   bool Init(const std::string& filename) {
    749     while (true) {
    750       file_.reset(OS::OpenFileWithFlags(filename.c_str(), O_CREAT | O_RDWR));
    751       if (file_.get() == NULL) {
    752         LOG(ERROR) << "Failed to open file: " << filename;
    753         return false;
    754       }
    755       int flock_result = TEMP_FAILURE_RETRY(flock(file_->Fd(), LOCK_EX));
    756       if (flock_result != 0) {
    757         PLOG(ERROR) << "Failed to lock file: " << filename;
    758         return false;
    759       }
    760       struct stat fstat_stat;
    761       int fstat_result = TEMP_FAILURE_RETRY(fstat(file_->Fd(), &fstat_stat));
    762       if (fstat_result != 0) {
    763         PLOG(ERROR) << "Failed to fstat: " << filename;
    764         return false;
    765       }
    766       struct stat stat_stat;
    767       int stat_result = TEMP_FAILURE_RETRY(stat(filename.c_str(), &stat_stat));
    768       if (stat_result != 0) {
    769         PLOG(WARNING) << "Failed to stat, will retry: " << filename;
    770         // ENOENT can happen if someone racing with us unlinks the file we created so just retry.
    771         continue;
    772       }
    773       if (fstat_stat.st_dev != stat_stat.st_dev || fstat_stat.st_ino != stat_stat.st_ino) {
    774         LOG(WARNING) << "File changed while locking, will retry: " << filename;
    775         continue;
    776       }
    777       return true;
    778     }
    779   }
    780 
    781   File& GetFile() {
    782     return *file_;
    783   }
    784 
    785   ~ScopedFlock() {
    786     if (file_.get() != NULL) {
    787       int flock_result = TEMP_FAILURE_RETRY(flock(file_->Fd(), LOCK_UN));
    788       CHECK_EQ(0, flock_result);
    789     }
    790   }
    791 
    792  private:
    793   UniquePtr<File> file_;
    794 
    795   DISALLOW_COPY_AND_ASSIGN(ScopedFlock);
    796 };
    797 
    798 const DexFile* ClassLinker::FindOrCreateOatFileForDexLocationLocked(const std::string& dex_location,
    799                                                                     uint32_t dex_location_checksum,
    800                                                                     const std::string& oat_location) {
    801   // We play a locking game here so that if two different processes
    802   // race to generate (or worse, one tries to open a partial generated
    803   // file) we will be okay. This is actually common with apps that use
    804   // DexClassLoader to work around the dex method reference limit and
    805   // that have a background service running in a separate process.
    806   ScopedFlock scoped_flock;
    807   if (!scoped_flock.Init(oat_location)) {
    808     LOG(ERROR) << "Failed to open locked oat file: " << oat_location;
    809     return NULL;
    810   }
    811 
    812   // Check if we already have an up-to-date output file
    813   const DexFile* dex_file = FindDexFileInOatLocation(dex_location,
    814                                                      dex_location_checksum,
    815                                                      oat_location);
    816   if (dex_file != NULL) {
    817     return dex_file;
    818   }
    819 
    820   // Generate the output oat file for the dex file
    821   VLOG(class_linker) << "Generating oat file " << oat_location << " for " << dex_location;
    822   if (!GenerateOatFile(dex_location, scoped_flock.GetFile().Fd(), oat_location)) {
    823     LOG(ERROR) << "Failed to generate oat file: " << oat_location;
    824     return NULL;
    825   }
    826   const OatFile* oat_file = OatFile::Open(oat_location, oat_location, NULL,
    827                                           !Runtime::Current()->IsCompiler());
    828   if (oat_file == NULL) {
    829     LOG(ERROR) << "Failed to open generated oat file: " << oat_location;
    830     return NULL;
    831   }
    832   RegisterOatFileLocked(*oat_file);
    833   const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_location, &dex_location_checksum);
    834   if (oat_dex_file == NULL) {
    835     LOG(ERROR) << "Failed to find dex file " << dex_location
    836                << " (checksum " << dex_location_checksum
    837                << ") in generated oat file: " << oat_location;
    838     return NULL;
    839   }
    840   const DexFile* result = oat_dex_file->OpenDexFile();
    841   CHECK_EQ(dex_location_checksum, result->GetLocationChecksum())
    842           << "dex_location=" << dex_location << " oat_location=" << oat_location << std::hex
    843           << " dex_location_checksum=" << dex_location_checksum
    844           << " DexFile::GetLocationChecksum()=" << result->GetLocationChecksum();
    845   return result;
    846 }
    847 
    848 bool ClassLinker::VerifyOatFileChecksums(const OatFile* oat_file,
    849                                          const std::string& dex_location,
    850                                          uint32_t dex_location_checksum) {
    851   Runtime* runtime = Runtime::Current();
    852   const ImageHeader& image_header = runtime->GetHeap()->GetImageSpace()->GetImageHeader();
    853   uint32_t image_oat_checksum = image_header.GetOatChecksum();
    854   uint32_t image_oat_data_begin = reinterpret_cast<uint32_t>(image_header.GetOatDataBegin());
    855   bool image_check = ((oat_file->GetOatHeader().GetImageFileLocationOatChecksum() == image_oat_checksum)
    856                       && (oat_file->GetOatHeader().GetImageFileLocationOatDataBegin() == image_oat_data_begin));
    857 
    858   const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_location, &dex_location_checksum);
    859   if (oat_dex_file == NULL) {
    860     LOG(ERROR) << "oat file " << oat_file->GetLocation()
    861                << " does not contain contents for " << dex_location
    862                << " with checksum " << dex_location_checksum;
    863     std::vector<const OatFile::OatDexFile*> oat_dex_files = oat_file->GetOatDexFiles();
    864     for (size_t i = 0; i < oat_dex_files.size(); i++) {
    865       const OatFile::OatDexFile* oat_dex_file = oat_dex_files[i];
    866       LOG(ERROR) << "oat file " << oat_file->GetLocation()
    867                  << " contains contents for " << oat_dex_file->GetDexFileLocation();
    868     }
    869     return false;
    870   }
    871   bool dex_check = dex_location_checksum == oat_dex_file->GetDexFileLocationChecksum();
    872 
    873   if (image_check && dex_check) {
    874     return true;
    875   }
    876 
    877   if (!image_check) {
    878     std::string image_file(image_header.GetImageRoot(
    879         ImageHeader::kOatLocation)->AsString()->ToModifiedUtf8());
    880     LOG(WARNING) << "oat file " << oat_file->GetLocation()
    881                  << " mismatch (" << std::hex << oat_file->GetOatHeader().GetImageFileLocationOatChecksum()
    882                  << ", " << oat_file->GetOatHeader().GetImageFileLocationOatDataBegin()
    883                  << ") with " << image_file
    884                  << " (" << image_oat_checksum << ", " << std::hex << image_oat_data_begin << ")";
    885   }
    886   if (!dex_check) {
    887     LOG(WARNING) << "oat file " << oat_file->GetLocation()
    888                  << " mismatch (" << std::hex << oat_dex_file->GetDexFileLocationChecksum()
    889                  << ") with " << dex_location
    890                  << " (" << std::hex << dex_location_checksum << ")";
    891   }
    892   return false;
    893 }
    894 
    895 const DexFile* ClassLinker::VerifyAndOpenDexFileFromOatFile(const OatFile* oat_file,
    896                                                             const std::string& dex_location,
    897                                                             uint32_t dex_location_checksum) {
    898   bool verified = VerifyOatFileChecksums(oat_file, dex_location, dex_location_checksum);
    899   if (!verified) {
    900     delete oat_file;
    901     return NULL;
    902   }
    903   RegisterOatFileLocked(*oat_file);
    904   return oat_file->GetOatDexFile(dex_location, &dex_location_checksum)->OpenDexFile();
    905 }
    906 
    907 const DexFile* ClassLinker::FindDexFileInOatFileFromDexLocation(const std::string& dex_location,
    908                                                                 uint32_t dex_location_checksum) {
    909   WriterMutexLock mu(Thread::Current(), dex_lock_);
    910 
    911   const OatFile* open_oat_file = FindOpenedOatFileFromDexLocation(dex_location,
    912                                                                   dex_location_checksum);
    913   if (open_oat_file != NULL) {
    914     return open_oat_file->GetOatDexFile(dex_location, &dex_location_checksum)->OpenDexFile();
    915   }
    916 
    917   // Look for an existing file next to dex. for example, for
    918   // /foo/bar/baz.jar, look for /foo/bar/baz.odex.
    919   std::string odex_filename(OatFile::DexFilenameToOdexFilename(dex_location));
    920   UniquePtr<const OatFile> oat_file(FindOatFileFromOatLocationLocked(odex_filename));
    921   if (oat_file.get() != NULL) {
    922     uint32_t dex_location_checksum;
    923     if (!DexFile::GetChecksum(dex_location, &dex_location_checksum)) {
    924       // If no classes.dex found in dex_location, it has been stripped, assume oat is up-to-date.
    925       // This is the common case in user builds for jar's and apk's in the /system directory.
    926       const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_location, NULL);
    927       CHECK(oat_dex_file != NULL) << odex_filename << " " << dex_location;
    928       RegisterOatFileLocked(*oat_file);
    929       return oat_dex_file->OpenDexFile();
    930     }
    931     const DexFile* dex_file = VerifyAndOpenDexFileFromOatFile(oat_file.release(),
    932                                                               dex_location,
    933                                                               dex_location_checksum);
    934     if (dex_file != NULL) {
    935       return dex_file;
    936     }
    937   }
    938   // Look for an existing file in the dalvik-cache, validating the result if found
    939   // not found in /foo/bar/baz.odex? try /data/dalvik-cache/foo@bar (at) baz.jar@classes.dex
    940   std::string cache_location(GetDalvikCacheFilenameOrDie(dex_location));
    941   oat_file.reset(FindOatFileFromOatLocationLocked(cache_location));
    942   if (oat_file.get() != NULL) {
    943     uint32_t dex_location_checksum;
    944     if (!DexFile::GetChecksum(dex_location, &dex_location_checksum)) {
    945       LOG(WARNING) << "Failed to compute checksum: " << dex_location;
    946       return NULL;
    947     }
    948     const DexFile* dex_file = VerifyAndOpenDexFileFromOatFile(oat_file.release(),
    949                                                               dex_location,
    950                                                               dex_location_checksum);
    951     if (dex_file != NULL) {
    952       return dex_file;
    953     }
    954     if (TEMP_FAILURE_RETRY(unlink(cache_location.c_str())) != 0) {
    955       PLOG(FATAL) << "Failed to remove obsolete oat file from " << cache_location;
    956     }
    957   }
    958   LOG(INFO) << "Failed to open oat file from " << odex_filename << " or " << cache_location << ".";
    959 
    960   // Try to generate oat file if it wasn't found or was obsolete.
    961   std::string oat_cache_filename(GetDalvikCacheFilenameOrDie(dex_location));
    962   return FindOrCreateOatFileForDexLocationLocked(dex_location, dex_location_checksum, oat_cache_filename);
    963 }
    964 
    965 const OatFile* ClassLinker::FindOpenedOatFileFromOatLocation(const std::string& oat_location) {
    966   for (size_t i = 0; i < oat_files_.size(); i++) {
    967     const OatFile* oat_file = oat_files_[i];
    968     DCHECK(oat_file != NULL);
    969     if (oat_file->GetLocation() == oat_location) {
    970       return oat_file;
    971     }
    972   }
    973   return NULL;
    974 }
    975 
    976 const OatFile* ClassLinker::FindOatFileFromOatLocation(const std::string& oat_location) {
    977   ReaderMutexLock mu(Thread::Current(), dex_lock_);
    978   return FindOatFileFromOatLocationLocked(oat_location);
    979 }
    980 
    981 const OatFile* ClassLinker::FindOatFileFromOatLocationLocked(const std::string& oat_location) {
    982   const OatFile* oat_file = FindOpenedOatFileFromOatLocation(oat_location);
    983   if (oat_file != NULL) {
    984     return oat_file;
    985   }
    986 
    987   oat_file = OatFile::Open(oat_location, oat_location, NULL, !Runtime::Current()->IsCompiler());
    988   if (oat_file == NULL) {
    989     return NULL;
    990   }
    991   return oat_file;
    992 }
    993 
    994 static void InitFromImageInterpretOnlyCallback(mirror::Object* obj, void* arg)
    995     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    996   ClassLinker* class_linker = reinterpret_cast<ClassLinker*>(arg);
    997 
    998   DCHECK(obj != NULL);
    999   DCHECK(class_linker != NULL);
   1000 
   1001   if (obj->IsArtMethod()) {
   1002     mirror::ArtMethod* method = obj->AsArtMethod();
   1003     if (!method->IsNative()) {
   1004       method->SetEntryPointFromInterpreter(interpreter::artInterpreterToInterpreterBridge);
   1005       if (method != Runtime::Current()->GetResolutionMethod()) {
   1006         method->SetEntryPointFromCompiledCode(GetCompiledCodeToInterpreterBridge());
   1007       }
   1008     }
   1009   }
   1010 }
   1011 
   1012 void ClassLinker::InitFromImage() {
   1013   VLOG(startup) << "ClassLinker::InitFromImage entering";
   1014   CHECK(!init_done_);
   1015 
   1016   gc::Heap* heap = Runtime::Current()->GetHeap();
   1017   gc::space::ImageSpace* space = heap->GetImageSpace();
   1018   dex_cache_image_class_lookup_required_ = true;
   1019   CHECK(space != NULL);
   1020   OatFile& oat_file = GetImageOatFile(space);
   1021   CHECK_EQ(oat_file.GetOatHeader().GetImageFileLocationOatChecksum(), 0U);
   1022   CHECK_EQ(oat_file.GetOatHeader().GetImageFileLocationOatDataBegin(), 0U);
   1023   CHECK(oat_file.GetOatHeader().GetImageFileLocation().empty());
   1024   portable_resolution_trampoline_ = oat_file.GetOatHeader().GetPortableResolutionTrampoline();
   1025   quick_resolution_trampoline_ = oat_file.GetOatHeader().GetQuickResolutionTrampoline();
   1026   mirror::Object* dex_caches_object = space->GetImageHeader().GetImageRoot(ImageHeader::kDexCaches);
   1027   mirror::ObjectArray<mirror::DexCache>* dex_caches =
   1028       dex_caches_object->AsObjectArray<mirror::DexCache>();
   1029 
   1030   mirror::ObjectArray<mirror::Class>* class_roots =
   1031       space->GetImageHeader().GetImageRoot(ImageHeader::kClassRoots)->AsObjectArray<mirror::Class>();
   1032   class_roots_ = class_roots;
   1033 
   1034   // Special case of setting up the String class early so that we can test arbitrary objects
   1035   // as being Strings or not
   1036   mirror::String::SetClass(GetClassRoot(kJavaLangString));
   1037 
   1038   CHECK_EQ(oat_file.GetOatHeader().GetDexFileCount(),
   1039            static_cast<uint32_t>(dex_caches->GetLength()));
   1040   Thread* self = Thread::Current();
   1041   for (int32_t i = 0; i < dex_caches->GetLength(); i++) {
   1042     SirtRef<mirror::DexCache> dex_cache(self, dex_caches->Get(i));
   1043     const std::string& dex_file_location(dex_cache->GetLocation()->ToModifiedUtf8());
   1044     const OatFile::OatDexFile* oat_dex_file = oat_file.GetOatDexFile(dex_file_location, NULL);
   1045     CHECK(oat_dex_file != NULL) << oat_file.GetLocation() << " " << dex_file_location;
   1046     const DexFile* dex_file = oat_dex_file->OpenDexFile();
   1047     if (dex_file == NULL) {
   1048       LOG(FATAL) << "Failed to open dex file " << dex_file_location
   1049                  << " from within oat file " << oat_file.GetLocation();
   1050     }
   1051 
   1052     CHECK_EQ(dex_file->GetLocationChecksum(), oat_dex_file->GetDexFileLocationChecksum());
   1053 
   1054     AppendToBootClassPath(*dex_file, dex_cache);
   1055   }
   1056 
   1057   // Set classes on AbstractMethod early so that IsMethod tests can be performed during the live
   1058   // bitmap walk.
   1059   mirror::ArtMethod::SetClass(GetClassRoot(kJavaLangReflectArtMethod));
   1060 
   1061   // Set entry point to interpreter if in InterpretOnly mode.
   1062   if (Runtime::Current()->GetInstrumentation()->InterpretOnly()) {
   1063     ReaderMutexLock mu(self, *Locks::heap_bitmap_lock_);
   1064     heap->FlushAllocStack();
   1065     heap->GetLiveBitmap()->Walk(InitFromImageInterpretOnlyCallback, this);
   1066   }
   1067 
   1068   // reinit class_roots_
   1069   mirror::Class::SetClassClass(class_roots->Get(kJavaLangClass));
   1070   class_roots_ = class_roots;
   1071 
   1072   // reinit array_iftable_ from any array class instance, they should be ==
   1073   array_iftable_ = GetClassRoot(kObjectArrayClass)->GetIfTable();
   1074   DCHECK(array_iftable_ == GetClassRoot(kBooleanArrayClass)->GetIfTable());
   1075   // String class root was set above
   1076   mirror::ArtField::SetClass(GetClassRoot(kJavaLangReflectArtField));
   1077   mirror::BooleanArray::SetArrayClass(GetClassRoot(kBooleanArrayClass));
   1078   mirror::ByteArray::SetArrayClass(GetClassRoot(kByteArrayClass));
   1079   mirror::CharArray::SetArrayClass(GetClassRoot(kCharArrayClass));
   1080   mirror::DoubleArray::SetArrayClass(GetClassRoot(kDoubleArrayClass));
   1081   mirror::FloatArray::SetArrayClass(GetClassRoot(kFloatArrayClass));
   1082   mirror::IntArray::SetArrayClass(GetClassRoot(kIntArrayClass));
   1083   mirror::LongArray::SetArrayClass(GetClassRoot(kLongArrayClass));
   1084   mirror::ShortArray::SetArrayClass(GetClassRoot(kShortArrayClass));
   1085   mirror::Throwable::SetClass(GetClassRoot(kJavaLangThrowable));
   1086   mirror::StackTraceElement::SetClass(GetClassRoot(kJavaLangStackTraceElement));
   1087 
   1088   FinishInit();
   1089 
   1090   VLOG(startup) << "ClassLinker::InitFromImage exiting";
   1091 }
   1092 
   1093 // Keep in sync with InitCallback. Anything we visit, we need to
   1094 // reinit references to when reinitializing a ClassLinker from a
   1095 // mapped image.
   1096 void ClassLinker::VisitRoots(RootVisitor* visitor, void* arg, bool only_dirty, bool clean_dirty) {
   1097   visitor(class_roots_, arg);
   1098   Thread* self = Thread::Current();
   1099   {
   1100     ReaderMutexLock mu(self, dex_lock_);
   1101     if (!only_dirty || dex_caches_dirty_) {
   1102       for (mirror::DexCache* dex_cache : dex_caches_) {
   1103         visitor(dex_cache, arg);
   1104       }
   1105       if (clean_dirty) {
   1106         dex_caches_dirty_ = false;
   1107       }
   1108     }
   1109   }
   1110 
   1111   {
   1112     ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_);
   1113     if (!only_dirty || class_table_dirty_) {
   1114       for (const std::pair<size_t, mirror::Class*>& it : class_table_) {
   1115         visitor(it.second, arg);
   1116       }
   1117       if (clean_dirty) {
   1118         class_table_dirty_ = false;
   1119       }
   1120     }
   1121 
   1122     // We deliberately ignore the class roots in the image since we
   1123     // handle image roots by using the MS/CMS rescanning of dirty cards.
   1124   }
   1125 
   1126   visitor(array_iftable_, arg);
   1127 }
   1128 
   1129 void ClassLinker::VisitClasses(ClassVisitor* visitor, void* arg) {
   1130   if (dex_cache_image_class_lookup_required_) {
   1131     MoveImageClassesToClassTable();
   1132   }
   1133   ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
   1134   for (const std::pair<size_t, mirror::Class*>& it : class_table_) {
   1135     if (!visitor(it.second, arg)) {
   1136       return;
   1137     }
   1138   }
   1139 }
   1140 
   1141 static bool GetClassesVisitor(mirror::Class* c, void* arg) {
   1142   std::set<mirror::Class*>* classes = reinterpret_cast<std::set<mirror::Class*>*>(arg);
   1143   classes->insert(c);
   1144   return true;
   1145 }
   1146 
   1147 void ClassLinker::VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) {
   1148   std::set<mirror::Class*> classes;
   1149   VisitClasses(GetClassesVisitor, &classes);
   1150   for (mirror::Class* klass : classes) {
   1151     if (!visitor(klass, arg)) {
   1152       return;
   1153     }
   1154   }
   1155 }
   1156 
   1157 
   1158 ClassLinker::~ClassLinker() {
   1159   mirror::Class::ResetClass();
   1160   mirror::String::ResetClass();
   1161   mirror::ArtField::ResetClass();
   1162   mirror::ArtMethod::ResetClass();
   1163   mirror::BooleanArray::ResetArrayClass();
   1164   mirror::ByteArray::ResetArrayClass();
   1165   mirror::CharArray::ResetArrayClass();
   1166   mirror::DoubleArray::ResetArrayClass();
   1167   mirror::FloatArray::ResetArrayClass();
   1168   mirror::IntArray::ResetArrayClass();
   1169   mirror::LongArray::ResetArrayClass();
   1170   mirror::ShortArray::ResetArrayClass();
   1171   mirror::Throwable::ResetClass();
   1172   mirror::StackTraceElement::ResetClass();
   1173   STLDeleteElements(&boot_class_path_);
   1174   STLDeleteElements(&oat_files_);
   1175 }
   1176 
   1177 mirror::DexCache* ClassLinker::AllocDexCache(Thread* self, const DexFile& dex_file) {
   1178   gc::Heap* heap = Runtime::Current()->GetHeap();
   1179   mirror::Class* dex_cache_class = GetClassRoot(kJavaLangDexCache);
   1180   SirtRef<mirror::DexCache> dex_cache(self,
   1181                               down_cast<mirror::DexCache*>(heap->AllocObject(self, dex_cache_class,
   1182                                                                 dex_cache_class->GetObjectSize())));
   1183   if (dex_cache.get() == NULL) {
   1184     return NULL;
   1185   }
   1186   SirtRef<mirror::String>
   1187       location(self, intern_table_->InternStrong(dex_file.GetLocation().c_str()));
   1188   if (location.get() == NULL) {
   1189     return NULL;
   1190   }
   1191   SirtRef<mirror::ObjectArray<mirror::String> >
   1192       strings(self, AllocStringArray(self, dex_file.NumStringIds()));
   1193   if (strings.get() == NULL) {
   1194     return NULL;
   1195   }
   1196   SirtRef<mirror::ObjectArray<mirror::Class> >
   1197       types(self, AllocClassArray(self, dex_file.NumTypeIds()));
   1198   if (types.get() == NULL) {
   1199     return NULL;
   1200   }
   1201   SirtRef<mirror::ObjectArray<mirror::ArtMethod> >
   1202       methods(self, AllocArtMethodArray(self, dex_file.NumMethodIds()));
   1203   if (methods.get() == NULL) {
   1204     return NULL;
   1205   }
   1206   SirtRef<mirror::ObjectArray<mirror::ArtField> >
   1207       fields(self, AllocArtFieldArray(self, dex_file.NumFieldIds()));
   1208   if (fields.get() == NULL) {
   1209     return NULL;
   1210   }
   1211   SirtRef<mirror::ObjectArray<mirror::StaticStorageBase> >
   1212       initialized_static_storage(self,
   1213                           AllocObjectArray<mirror::StaticStorageBase>(self, dex_file.NumTypeIds()));
   1214   if (initialized_static_storage.get() == NULL) {
   1215     return NULL;
   1216   }
   1217 
   1218   dex_cache->Init(&dex_file,
   1219                   location.get(),
   1220                   strings.get(),
   1221                   types.get(),
   1222                   methods.get(),
   1223                   fields.get(),
   1224                   initialized_static_storage.get());
   1225   return dex_cache.get();
   1226 }
   1227 
   1228 mirror::Class* ClassLinker::AllocClass(Thread* self, mirror::Class* java_lang_Class,
   1229                                        size_t class_size) {
   1230   DCHECK_GE(class_size, sizeof(mirror::Class));
   1231   gc::Heap* heap = Runtime::Current()->GetHeap();
   1232   mirror::Object* k = heap->AllocObject(self, java_lang_Class, class_size);
   1233   if (UNLIKELY(k == NULL)) {
   1234     CHECK(self->IsExceptionPending());  // OOME.
   1235     return NULL;
   1236   }
   1237   mirror::Class* klass = k->AsClass();
   1238   klass->SetPrimitiveType(Primitive::kPrimNot);  // Default to not being primitive.
   1239   klass->SetClassSize(class_size);
   1240   klass->SetDexClassDefIndex(DexFile::kDexNoIndex16);  // Default to no valid class def index.
   1241   klass->SetDexTypeIndex(DexFile::kDexNoIndex16);  // Default to no valid type index.
   1242   return klass;
   1243 }
   1244 
   1245 mirror::Class* ClassLinker::AllocClass(Thread* self, size_t class_size) {
   1246   return AllocClass(self, GetClassRoot(kJavaLangClass), class_size);
   1247 }
   1248 
   1249 mirror::ArtField* ClassLinker::AllocArtField(Thread* self) {
   1250   return down_cast<mirror::ArtField*>(GetClassRoot(kJavaLangReflectArtField)->AllocObject(self));
   1251 }
   1252 
   1253 mirror::ArtMethod* ClassLinker::AllocArtMethod(Thread* self) {
   1254   return down_cast<mirror::ArtMethod*>(GetClassRoot(kJavaLangReflectArtMethod)->AllocObject(self));
   1255 }
   1256 
   1257 mirror::ObjectArray<mirror::StackTraceElement>* ClassLinker::AllocStackTraceElementArray(Thread* self,
   1258                                                                                          size_t length) {
   1259   return mirror::ObjectArray<mirror::StackTraceElement>::Alloc(self,
   1260                                                                GetClassRoot(kJavaLangStackTraceElementArrayClass),
   1261                                                                length);
   1262 }
   1263 
   1264 static mirror::Class* EnsureResolved(Thread* self, mirror::Class* klass)
   1265     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   1266   DCHECK(klass != NULL);
   1267   // Wait for the class if it has not already been linked.
   1268   if (!klass->IsResolved() && !klass->IsErroneous()) {
   1269     ObjectLock lock(self, klass);
   1270     // Check for circular dependencies between classes.
   1271     if (!klass->IsResolved() && klass->GetClinitThreadId() == self->GetTid()) {
   1272       ThrowClassCircularityError(klass);
   1273       klass->SetStatus(mirror::Class::kStatusError, self);
   1274       return NULL;
   1275     }
   1276     // Wait for the pending initialization to complete.
   1277     while (!klass->IsResolved() && !klass->IsErroneous()) {
   1278       lock.WaitIgnoringInterrupts();
   1279     }
   1280   }
   1281   if (klass->IsErroneous()) {
   1282     ThrowEarlierClassFailure(klass);
   1283     return NULL;
   1284   }
   1285   // Return the loaded class.  No exceptions should be pending.
   1286   CHECK(klass->IsResolved()) << PrettyClass(klass);
   1287   self->AssertNoPendingException();
   1288   return klass;
   1289 }
   1290 
   1291 bool ClassLinker::IsInBootClassPath(const char* descriptor) {
   1292   DexFile::ClassPathEntry pair = DexFile::FindInClassPath(descriptor, boot_class_path_);
   1293   return pair.second != NULL;
   1294 }
   1295 
   1296 mirror::Class* ClassLinker::FindSystemClass(const char* descriptor) {
   1297   return FindClass(descriptor, NULL);
   1298 }
   1299 
   1300 mirror::Class* ClassLinker::FindClass(const char* descriptor, mirror::ClassLoader* class_loader) {
   1301   DCHECK_NE(*descriptor, '\0') << "descriptor is empty string";
   1302   Thread* self = Thread::Current();
   1303   DCHECK(self != NULL);
   1304   self->AssertNoPendingException();
   1305   if (descriptor[1] == '\0') {
   1306     // only the descriptors of primitive types should be 1 character long, also avoid class lookup
   1307     // for primitive classes that aren't backed by dex files.
   1308     return FindPrimitiveClass(descriptor[0]);
   1309   }
   1310   // Find the class in the loaded classes table.
   1311   mirror::Class* klass = LookupClass(descriptor, class_loader);
   1312   if (klass != NULL) {
   1313     return EnsureResolved(self, klass);
   1314   }
   1315   // Class is not yet loaded.
   1316   if (descriptor[0] == '[') {
   1317     return CreateArrayClass(descriptor, class_loader);
   1318 
   1319   } else if (class_loader == NULL) {
   1320     DexFile::ClassPathEntry pair = DexFile::FindInClassPath(descriptor, boot_class_path_);
   1321     if (pair.second != NULL) {
   1322       return DefineClass(descriptor, NULL, *pair.first, *pair.second);
   1323     }
   1324 
   1325   } else if (Runtime::Current()->UseCompileTimeClassPath()) {
   1326     // First try the boot class path, we check the descriptor first to avoid an unnecessary
   1327     // throw of a NoClassDefFoundError.
   1328     if (IsInBootClassPath(descriptor)) {
   1329       mirror::Class* system_class = FindSystemClass(descriptor);
   1330       CHECK(system_class != NULL);
   1331       return system_class;
   1332     }
   1333     // Next try the compile time class path.
   1334     const std::vector<const DexFile*>* class_path;
   1335     {
   1336       ScopedObjectAccessUnchecked soa(self);
   1337       ScopedLocalRef<jobject> jclass_loader(soa.Env(), soa.AddLocalReference<jobject>(class_loader));
   1338       class_path = &Runtime::Current()->GetCompileTimeClassPath(jclass_loader.get());
   1339     }
   1340 
   1341     DexFile::ClassPathEntry pair = DexFile::FindInClassPath(descriptor, *class_path);
   1342     if (pair.second != NULL) {
   1343       return DefineClass(descriptor, class_loader, *pair.first, *pair.second);
   1344     }
   1345 
   1346   } else {
   1347     ScopedObjectAccessUnchecked soa(self->GetJniEnv());
   1348     ScopedLocalRef<jobject> class_loader_object(soa.Env(),
   1349                                                 soa.AddLocalReference<jobject>(class_loader));
   1350     std::string class_name_string(DescriptorToDot(descriptor));
   1351     ScopedLocalRef<jobject> result(soa.Env(), NULL);
   1352     {
   1353       ScopedThreadStateChange tsc(self, kNative);
   1354       ScopedLocalRef<jobject> class_name_object(soa.Env(),
   1355                                                 soa.Env()->NewStringUTF(class_name_string.c_str()));
   1356       if (class_name_object.get() == NULL) {
   1357         return NULL;
   1358       }
   1359       CHECK(class_loader_object.get() != NULL);
   1360       result.reset(soa.Env()->CallObjectMethod(class_loader_object.get(),
   1361                                                WellKnownClasses::java_lang_ClassLoader_loadClass,
   1362                                                class_name_object.get()));
   1363     }
   1364     if (soa.Self()->IsExceptionPending()) {
   1365       // If the ClassLoader threw, pass that exception up.
   1366       return NULL;
   1367     } else if (result.get() == NULL) {
   1368       // broken loader - throw NPE to be compatible with Dalvik
   1369       ThrowNullPointerException(NULL, StringPrintf("ClassLoader.loadClass returned null for %s",
   1370                                                    class_name_string.c_str()).c_str());
   1371       return NULL;
   1372     } else {
   1373       // success, return mirror::Class*
   1374       return soa.Decode<mirror::Class*>(result.get());
   1375     }
   1376   }
   1377 
   1378   ThrowNoClassDefFoundError("Class %s not found", PrintableString(descriptor).c_str());
   1379   return NULL;
   1380 }
   1381 
   1382 mirror::Class* ClassLinker::DefineClass(const char* descriptor,
   1383                                         mirror::ClassLoader* class_loader,
   1384                                         const DexFile& dex_file,
   1385                                         const DexFile::ClassDef& dex_class_def) {
   1386   Thread* self = Thread::Current();
   1387   SirtRef<mirror::Class> klass(self, NULL);
   1388   // Load the class from the dex file.
   1389   if (UNLIKELY(!init_done_)) {
   1390     // finish up init of hand crafted class_roots_
   1391     if (strcmp(descriptor, "Ljava/lang/Object;") == 0) {
   1392       klass.reset(GetClassRoot(kJavaLangObject));
   1393     } else if (strcmp(descriptor, "Ljava/lang/Class;") == 0) {
   1394       klass.reset(GetClassRoot(kJavaLangClass));
   1395     } else if (strcmp(descriptor, "Ljava/lang/String;") == 0) {
   1396       klass.reset(GetClassRoot(kJavaLangString));
   1397     } else if (strcmp(descriptor, "Ljava/lang/DexCache;") == 0) {
   1398       klass.reset(GetClassRoot(kJavaLangDexCache));
   1399     } else if (strcmp(descriptor, "Ljava/lang/reflect/ArtField;") == 0) {
   1400       klass.reset(GetClassRoot(kJavaLangReflectArtField));
   1401     } else if (strcmp(descriptor, "Ljava/lang/reflect/ArtMethod;") == 0) {
   1402       klass.reset(GetClassRoot(kJavaLangReflectArtMethod));
   1403     } else {
   1404       klass.reset(AllocClass(self, SizeOfClass(dex_file, dex_class_def)));
   1405     }
   1406   } else {
   1407     klass.reset(AllocClass(self, SizeOfClass(dex_file, dex_class_def)));
   1408   }
   1409   if (UNLIKELY(klass.get() == NULL)) {
   1410     CHECK(self->IsExceptionPending());  // Expect an OOME.
   1411     return NULL;
   1412   }
   1413   klass->SetDexCache(FindDexCache(dex_file));
   1414   LoadClass(dex_file, dex_class_def, klass, class_loader);
   1415   // Check for a pending exception during load
   1416   if (self->IsExceptionPending()) {
   1417     klass->SetStatus(mirror::Class::kStatusError, self);
   1418     return NULL;
   1419   }
   1420   ObjectLock lock(self, klass.get());
   1421   klass->SetClinitThreadId(self->GetTid());
   1422   {
   1423     // Add the newly loaded class to the loaded classes table.
   1424     mirror::Class* existing = InsertClass(descriptor, klass.get(), Hash(descriptor));
   1425     if (existing != NULL) {
   1426       // We failed to insert because we raced with another thread. Calling EnsureResolved may cause
   1427       // this thread to block.
   1428       return EnsureResolved(self, existing);
   1429     }
   1430   }
   1431   // Finish loading (if necessary) by finding parents
   1432   CHECK(!klass->IsLoaded());
   1433   if (!LoadSuperAndInterfaces(klass, dex_file)) {
   1434     // Loading failed.
   1435     klass->SetStatus(mirror::Class::kStatusError, self);
   1436     return NULL;
   1437   }
   1438   CHECK(klass->IsLoaded());
   1439   // Link the class (if necessary)
   1440   CHECK(!klass->IsResolved());
   1441   if (!LinkClass(klass, NULL, self)) {
   1442     // Linking failed.
   1443     klass->SetStatus(mirror::Class::kStatusError, self);
   1444     return NULL;
   1445   }
   1446   CHECK(klass->IsResolved());
   1447 
   1448   /*
   1449    * We send CLASS_PREPARE events to the debugger from here.  The
   1450    * definition of "preparation" is creating the static fields for a
   1451    * class and initializing them to the standard default values, but not
   1452    * executing any code (that comes later, during "initialization").
   1453    *
   1454    * We did the static preparation in LinkClass.
   1455    *
   1456    * The class has been prepared and resolved but possibly not yet verified
   1457    * at this point.
   1458    */
   1459   Dbg::PostClassPrepare(klass.get());
   1460 
   1461   return klass.get();
   1462 }
   1463 
   1464 // Precomputes size that will be needed for Class, matching LinkStaticFields
   1465 size_t ClassLinker::SizeOfClass(const DexFile& dex_file,
   1466                                 const DexFile::ClassDef& dex_class_def) {
   1467   const byte* class_data = dex_file.GetClassData(dex_class_def);
   1468   size_t num_ref = 0;
   1469   size_t num_32 = 0;
   1470   size_t num_64 = 0;
   1471   if (class_data != NULL) {
   1472     for (ClassDataItemIterator it(dex_file, class_data); it.HasNextStaticField(); it.Next()) {
   1473       const DexFile::FieldId& field_id = dex_file.GetFieldId(it.GetMemberIndex());
   1474       const char* descriptor = dex_file.GetFieldTypeDescriptor(field_id);
   1475       char c = descriptor[0];
   1476       if (c == 'L' || c == '[') {
   1477         num_ref++;
   1478       } else if (c == 'J' || c == 'D') {
   1479         num_64++;
   1480       } else {
   1481         num_32++;
   1482       }
   1483     }
   1484   }
   1485   // start with generic class data
   1486   size_t size = sizeof(mirror::Class);
   1487   // follow with reference fields which must be contiguous at start
   1488   size += (num_ref * sizeof(uint32_t));
   1489   // if there are 64-bit fields to add, make sure they are aligned
   1490   if (num_64 != 0 && size != RoundUp(size, 8)) {  // for 64-bit alignment
   1491     if (num_32 != 0) {
   1492       // use an available 32-bit field for padding
   1493       num_32--;
   1494     }
   1495     size += sizeof(uint32_t);  // either way, we are adding a word
   1496     DCHECK_EQ(size, RoundUp(size, 8));
   1497   }
   1498   // tack on any 64-bit fields now that alignment is assured
   1499   size += (num_64 * sizeof(uint64_t));
   1500   // tack on any remaining 32-bit fields
   1501   size += (num_32 * sizeof(uint32_t));
   1502   return size;
   1503 }
   1504 
   1505 const OatFile::OatClass* ClassLinker::GetOatClass(const DexFile& dex_file, uint16_t class_def_idx) {
   1506   DCHECK_NE(class_def_idx, DexFile::kDexNoIndex16);
   1507   const OatFile* oat_file = FindOpenedOatFileForDexFile(dex_file);
   1508   CHECK(oat_file != NULL) << dex_file.GetLocation();
   1509   uint dex_location_checksum = dex_file.GetLocationChecksum();
   1510   const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_file.GetLocation(),
   1511                                                                     &dex_location_checksum);
   1512   CHECK(oat_dex_file != NULL) << dex_file.GetLocation();
   1513   const OatFile::OatClass* oat_class = oat_dex_file->GetOatClass(class_def_idx);
   1514   CHECK(oat_class != NULL) << dex_file.GetLocation() << " " << class_def_idx;
   1515   return oat_class;
   1516 }
   1517 
   1518 static uint32_t GetOatMethodIndexFromMethodIndex(const DexFile& dex_file, uint16_t class_def_idx,
   1519                                                  uint32_t method_idx) {
   1520   const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_idx);
   1521   const byte* class_data = dex_file.GetClassData(class_def);
   1522   CHECK(class_data != NULL);
   1523   ClassDataItemIterator it(dex_file, class_data);
   1524   // Skip fields
   1525   while (it.HasNextStaticField()) {
   1526     it.Next();
   1527   }
   1528   while (it.HasNextInstanceField()) {
   1529     it.Next();
   1530   }
   1531   // Process methods
   1532   size_t class_def_method_index = 0;
   1533   while (it.HasNextDirectMethod()) {
   1534     if (it.GetMemberIndex() == method_idx) {
   1535       return class_def_method_index;
   1536     }
   1537     class_def_method_index++;
   1538     it.Next();
   1539   }
   1540   while (it.HasNextVirtualMethod()) {
   1541     if (it.GetMemberIndex() == method_idx) {
   1542       return class_def_method_index;
   1543     }
   1544     class_def_method_index++;
   1545     it.Next();
   1546   }
   1547   DCHECK(!it.HasNext());
   1548   LOG(FATAL) << "Failed to find method index " << method_idx << " in " << dex_file.GetLocation();
   1549   return 0;
   1550 }
   1551 
   1552 const OatFile::OatMethod ClassLinker::GetOatMethodFor(const mirror::ArtMethod* method) {
   1553   // Although we overwrite the trampoline of non-static methods, we may get here via the resolution
   1554   // method for direct methods (or virtual methods made direct).
   1555   mirror::Class* declaring_class = method->GetDeclaringClass();
   1556   size_t oat_method_index;
   1557   if (method->IsStatic() || method->IsDirect()) {
   1558     // Simple case where the oat method index was stashed at load time.
   1559     oat_method_index = method->GetMethodIndex();
   1560   } else {
   1561     // We're invoking a virtual method directly (thanks to sharpening), compute the oat_method_index
   1562     // by search for its position in the declared virtual methods.
   1563     oat_method_index = declaring_class->NumDirectMethods();
   1564     size_t end = declaring_class->NumVirtualMethods();
   1565     bool found = false;
   1566     for (size_t i = 0; i < end; i++) {
   1567       if (declaring_class->GetVirtualMethod(i) == method) {
   1568         found = true;
   1569         break;
   1570       }
   1571       oat_method_index++;
   1572     }
   1573     CHECK(found) << "Didn't find oat method index for virtual method: " << PrettyMethod(method);
   1574   }
   1575   UniquePtr<const OatFile::OatClass>
   1576       oat_class(GetOatClass(*declaring_class->GetDexCache()->GetDexFile(),
   1577                             declaring_class->GetDexClassDefIndex()));
   1578   CHECK(oat_class.get() != NULL);
   1579   DCHECK_EQ(oat_method_index,
   1580             GetOatMethodIndexFromMethodIndex(*declaring_class->GetDexCache()->GetDexFile(),
   1581                                              method->GetDeclaringClass()->GetDexClassDefIndex(),
   1582                                              method->GetDexMethodIndex()));
   1583 
   1584   return oat_class->GetOatMethod(oat_method_index);
   1585 }
   1586 
   1587 // Special case to get oat code without overwriting a trampoline.
   1588 const void* ClassLinker::GetOatCodeFor(const mirror::ArtMethod* method) {
   1589   CHECK(!method->IsAbstract()) << PrettyMethod(method);
   1590   if (method->IsProxyMethod()) {
   1591 #if !defined(ART_USE_PORTABLE_COMPILER)
   1592     return reinterpret_cast<void*>(art_quick_proxy_invoke_handler);
   1593 #else
   1594     return reinterpret_cast<void*>(art_portable_proxy_invoke_handler);
   1595 #endif
   1596   }
   1597   const void* result = GetOatMethodFor(method).GetCode();
   1598   if (result == NULL) {
   1599     // No code? You must mean to go into the interpreter.
   1600     result = GetCompiledCodeToInterpreterBridge();
   1601   }
   1602   return result;
   1603 }
   1604 
   1605 const void* ClassLinker::GetOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx,
   1606                                        uint32_t method_idx) {
   1607   UniquePtr<const OatFile::OatClass> oat_class(GetOatClass(dex_file, class_def_idx));
   1608   CHECK(oat_class.get() != nullptr);
   1609   uint32_t oat_method_idx = GetOatMethodIndexFromMethodIndex(dex_file, class_def_idx, method_idx);
   1610   return oat_class->GetOatMethod(oat_method_idx).GetCode();
   1611 }
   1612 
   1613 // Returns true if the method must run with interpreter, false otherwise.
   1614 static bool NeedsInterpreter(const mirror::ArtMethod* method, const void* code) {
   1615   if (code == NULL) {
   1616     // No code: need interpreter.
   1617     return true;
   1618   }
   1619 #ifdef ART_SEA_IR_MODE
   1620   ScopedObjectAccess soa(Thread::Current());
   1621   if (std::string::npos != PrettyMethod(method).find("fibonacci")) {
   1622     LOG(INFO) << "Found " << PrettyMethod(method);
   1623     return false;
   1624   }
   1625 #endif
   1626   // If interpreter mode is enabled, every method (except native and proxy) must
   1627   // be run with interpreter.
   1628   return Runtime::Current()->GetInstrumentation()->InterpretOnly() &&
   1629          !method->IsNative() && !method->IsProxyMethod();
   1630 }
   1631 
   1632 void ClassLinker::FixupStaticTrampolines(mirror::Class* klass) {
   1633   ClassHelper kh(klass);
   1634   const DexFile::ClassDef* dex_class_def = kh.GetClassDef();
   1635   CHECK(dex_class_def != NULL);
   1636   const DexFile& dex_file = kh.GetDexFile();
   1637   const byte* class_data = dex_file.GetClassData(*dex_class_def);
   1638   if (class_data == NULL) {
   1639     return;  // no fields or methods - for example a marker interface
   1640   }
   1641   Runtime* runtime = Runtime::Current();
   1642   if (!runtime->IsStarted() || runtime->UseCompileTimeClassPath()) {
   1643     // OAT file unavailable
   1644     return;
   1645   }
   1646   UniquePtr<const OatFile::OatClass> oat_class(GetOatClass(dex_file, klass->GetDexClassDefIndex()));
   1647   CHECK(oat_class.get() != NULL);
   1648   ClassDataItemIterator it(dex_file, class_data);
   1649   // Skip fields
   1650   while (it.HasNextStaticField()) {
   1651     it.Next();
   1652   }
   1653   while (it.HasNextInstanceField()) {
   1654     it.Next();
   1655   }
   1656   // Link the code of methods skipped by LinkCode
   1657   for (size_t method_index = 0; it.HasNextDirectMethod(); ++method_index, it.Next()) {
   1658     mirror::ArtMethod* method = klass->GetDirectMethod(method_index);
   1659     if (!method->IsStatic()) {
   1660       // Only update static methods.
   1661       continue;
   1662     }
   1663     const void* code = oat_class->GetOatMethod(method_index).GetCode();
   1664     const bool enter_interpreter = NeedsInterpreter(method, code);
   1665     if (enter_interpreter) {
   1666       // Use interpreter entry point.
   1667       code = GetCompiledCodeToInterpreterBridge();
   1668     }
   1669     runtime->GetInstrumentation()->UpdateMethodsCode(method, code);
   1670   }
   1671   // Ignore virtual methods on the iterator.
   1672 }
   1673 
   1674 static void LinkCode(SirtRef<mirror::ArtMethod>& method, const OatFile::OatClass* oat_class,
   1675                      uint32_t method_index)
   1676     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   1677   // Method shouldn't have already been linked.
   1678   DCHECK(method->GetEntryPointFromCompiledCode() == NULL);
   1679   // Every kind of method should at least get an invoke stub from the oat_method.
   1680   // non-abstract methods also get their code pointers.
   1681   const OatFile::OatMethod oat_method = oat_class->GetOatMethod(method_index);
   1682   oat_method.LinkMethod(method.get());
   1683 
   1684   // Install entry point from interpreter.
   1685   Runtime* runtime = Runtime::Current();
   1686   bool enter_interpreter = NeedsInterpreter(method.get(), method->GetEntryPointFromCompiledCode());
   1687   if (enter_interpreter) {
   1688     method->SetEntryPointFromInterpreter(interpreter::artInterpreterToInterpreterBridge);
   1689   } else {
   1690     method->SetEntryPointFromInterpreter(artInterpreterToCompiledCodeBridge);
   1691   }
   1692 
   1693   if (method->IsAbstract()) {
   1694     method->SetEntryPointFromCompiledCode(GetCompiledCodeToInterpreterBridge());
   1695     return;
   1696   }
   1697 
   1698   if (method->IsStatic() && !method->IsConstructor()) {
   1699     // For static methods excluding the class initializer, install the trampoline.
   1700     // It will be replaced by the proper entry point by ClassLinker::FixupStaticTrampolines
   1701     // after initializing class (see ClassLinker::InitializeClass method).
   1702     method->SetEntryPointFromCompiledCode(GetResolutionTrampoline(runtime->GetClassLinker()));
   1703   } else if (enter_interpreter) {
   1704     // Set entry point from compiled code if there's no code or in interpreter only mode.
   1705     method->SetEntryPointFromCompiledCode(GetCompiledCodeToInterpreterBridge());
   1706   }
   1707 
   1708   if (method->IsNative()) {
   1709     // Unregistering restores the dlsym lookup stub.
   1710     method->UnregisterNative(Thread::Current());
   1711   }
   1712 
   1713   // Allow instrumentation its chance to hijack code.
   1714   runtime->GetInstrumentation()->UpdateMethodsCode(method.get(),
   1715                                                    method->GetEntryPointFromCompiledCode());
   1716 }
   1717 
   1718 void ClassLinker::LoadClass(const DexFile& dex_file,
   1719                             const DexFile::ClassDef& dex_class_def,
   1720                             SirtRef<mirror::Class>& klass,
   1721                             mirror::ClassLoader* class_loader) {
   1722   CHECK(klass.get() != NULL);
   1723   CHECK(klass->GetDexCache() != NULL);
   1724   CHECK_EQ(mirror::Class::kStatusNotReady, klass->GetStatus());
   1725   const char* descriptor = dex_file.GetClassDescriptor(dex_class_def);
   1726   CHECK(descriptor != NULL);
   1727 
   1728   klass->SetClass(GetClassRoot(kJavaLangClass));
   1729   uint32_t access_flags = dex_class_def.access_flags_;
   1730   // Make sure that none of our runtime-only flags are set.
   1731   CHECK_EQ(access_flags & ~kAccJavaFlagsMask, 0U);
   1732   klass->SetAccessFlags(access_flags);
   1733   klass->SetClassLoader(class_loader);
   1734   DCHECK_EQ(klass->GetPrimitiveType(), Primitive::kPrimNot);
   1735   klass->SetStatus(mirror::Class::kStatusIdx, NULL);
   1736 
   1737   klass->SetDexClassDefIndex(dex_file.GetIndexForClassDef(dex_class_def));
   1738   klass->SetDexTypeIndex(dex_class_def.class_idx_);
   1739 
   1740   // Load fields fields.
   1741   const byte* class_data = dex_file.GetClassData(dex_class_def);
   1742   if (class_data == NULL) {
   1743     return;  // no fields or methods - for example a marker interface
   1744   }
   1745   ClassDataItemIterator it(dex_file, class_data);
   1746   Thread* self = Thread::Current();
   1747   if (it.NumStaticFields() != 0) {
   1748     mirror::ObjectArray<mirror::ArtField>* statics = AllocArtFieldArray(self, it.NumStaticFields());
   1749     if (UNLIKELY(statics == NULL)) {
   1750       CHECK(self->IsExceptionPending());  // OOME.
   1751       return;
   1752     }
   1753     klass->SetSFields(statics);
   1754   }
   1755   if (it.NumInstanceFields() != 0) {
   1756     mirror::ObjectArray<mirror::ArtField>* fields =
   1757         AllocArtFieldArray(self, it.NumInstanceFields());
   1758     if (UNLIKELY(fields == NULL)) {
   1759       CHECK(self->IsExceptionPending());  // OOME.
   1760       return;
   1761     }
   1762     klass->SetIFields(fields);
   1763   }
   1764   for (size_t i = 0; it.HasNextStaticField(); i++, it.Next()) {
   1765     SirtRef<mirror::ArtField> sfield(self, AllocArtField(self));
   1766     if (UNLIKELY(sfield.get() == NULL)) {
   1767       CHECK(self->IsExceptionPending());  // OOME.
   1768       return;
   1769     }
   1770     klass->SetStaticField(i, sfield.get());
   1771     LoadField(dex_file, it, klass, sfield);
   1772   }
   1773   for (size_t i = 0; it.HasNextInstanceField(); i++, it.Next()) {
   1774     SirtRef<mirror::ArtField> ifield(self, AllocArtField(self));
   1775     if (UNLIKELY(ifield.get() == NULL)) {
   1776       CHECK(self->IsExceptionPending());  // OOME.
   1777       return;
   1778     }
   1779     klass->SetInstanceField(i, ifield.get());
   1780     LoadField(dex_file, it, klass, ifield);
   1781   }
   1782 
   1783   UniquePtr<const OatFile::OatClass> oat_class;
   1784   if (Runtime::Current()->IsStarted() && !Runtime::Current()->UseCompileTimeClassPath()) {
   1785     oat_class.reset(GetOatClass(dex_file, klass->GetDexClassDefIndex()));
   1786   }
   1787 
   1788   // Load methods.
   1789   if (it.NumDirectMethods() != 0) {
   1790     // TODO: append direct methods to class object
   1791     mirror::ObjectArray<mirror::ArtMethod>* directs =
   1792          AllocArtMethodArray(self, it.NumDirectMethods());
   1793     if (UNLIKELY(directs == NULL)) {
   1794       CHECK(self->IsExceptionPending());  // OOME.
   1795       return;
   1796     }
   1797     klass->SetDirectMethods(directs);
   1798   }
   1799   if (it.NumVirtualMethods() != 0) {
   1800     // TODO: append direct methods to class object
   1801     mirror::ObjectArray<mirror::ArtMethod>* virtuals =
   1802         AllocArtMethodArray(self, it.NumVirtualMethods());
   1803     if (UNLIKELY(virtuals == NULL)) {
   1804       CHECK(self->IsExceptionPending());  // OOME.
   1805       return;
   1806     }
   1807     klass->SetVirtualMethods(virtuals);
   1808   }
   1809   size_t class_def_method_index = 0;
   1810   for (size_t i = 0; it.HasNextDirectMethod(); i++, it.Next()) {
   1811     SirtRef<mirror::ArtMethod> method(self, LoadMethod(self, dex_file, it, klass));
   1812     if (UNLIKELY(method.get() == NULL)) {
   1813       CHECK(self->IsExceptionPending());  // OOME.
   1814       return;
   1815     }
   1816     klass->SetDirectMethod(i, method.get());
   1817     if (oat_class.get() != NULL) {
   1818       LinkCode(method, oat_class.get(), class_def_method_index);
   1819     }
   1820     method->SetMethodIndex(class_def_method_index);
   1821     class_def_method_index++;
   1822   }
   1823   for (size_t i = 0; it.HasNextVirtualMethod(); i++, it.Next()) {
   1824     SirtRef<mirror::ArtMethod> method(self, LoadMethod(self, dex_file, it, klass));
   1825     if (UNLIKELY(method.get() == NULL)) {
   1826       CHECK(self->IsExceptionPending());  // OOME.
   1827       return;
   1828     }
   1829     klass->SetVirtualMethod(i, method.get());
   1830     DCHECK_EQ(class_def_method_index, it.NumDirectMethods() + i);
   1831     if (oat_class.get() != NULL) {
   1832       LinkCode(method, oat_class.get(), class_def_method_index);
   1833     }
   1834     class_def_method_index++;
   1835   }
   1836   DCHECK(!it.HasNext());
   1837 }
   1838 
   1839 void ClassLinker::LoadField(const DexFile& /*dex_file*/, const ClassDataItemIterator& it,
   1840                             SirtRef<mirror::Class>& klass, SirtRef<mirror::ArtField>& dst) {
   1841   uint32_t field_idx = it.GetMemberIndex();
   1842   dst->SetDexFieldIndex(field_idx);
   1843   dst->SetDeclaringClass(klass.get());
   1844   dst->SetAccessFlags(it.GetMemberAccessFlags());
   1845 }
   1846 
   1847 mirror::ArtMethod* ClassLinker::LoadMethod(Thread* self, const DexFile& dex_file,
   1848                                            const ClassDataItemIterator& it,
   1849                                            SirtRef<mirror::Class>& klass) {
   1850   uint32_t dex_method_idx = it.GetMemberIndex();
   1851   const DexFile::MethodId& method_id = dex_file.GetMethodId(dex_method_idx);
   1852   StringPiece method_name(dex_file.GetMethodName(method_id));
   1853 
   1854   mirror::ArtMethod* dst = AllocArtMethod(self);
   1855   if (UNLIKELY(dst == NULL)) {
   1856     CHECK(self->IsExceptionPending());  // OOME.
   1857     return NULL;
   1858   }
   1859   DCHECK(dst->IsArtMethod()) << PrettyDescriptor(dst->GetClass());
   1860 
   1861   const char* old_cause = self->StartAssertNoThreadSuspension("LoadMethod");
   1862   dst->SetDexMethodIndex(dex_method_idx);
   1863   dst->SetDeclaringClass(klass.get());
   1864 
   1865   if (method_name == "finalize") {
   1866     // Create the prototype for a signature of "()V"
   1867     const DexFile::StringId* void_string_id = dex_file.FindStringId("V");
   1868     if (void_string_id != NULL) {
   1869       const DexFile::TypeId* void_type_id =
   1870           dex_file.FindTypeId(dex_file.GetIndexForStringId(*void_string_id));
   1871       if (void_type_id != NULL) {
   1872         std::vector<uint16_t> no_args;
   1873         const DexFile::ProtoId* finalizer_proto =
   1874             dex_file.FindProtoId(dex_file.GetIndexForTypeId(*void_type_id), no_args);
   1875         if (finalizer_proto != NULL) {
   1876           // We have the prototype in the dex file
   1877           if (klass->GetClassLoader() != NULL) {  // All non-boot finalizer methods are flagged
   1878             klass->SetFinalizable();
   1879           } else {
   1880             ClassHelper kh(klass.get());
   1881             StringPiece klass_descriptor(kh.GetDescriptor());
   1882             // The Enum class declares a "final" finalize() method to prevent subclasses from
   1883             // introducing a finalizer. We don't want to set the finalizable flag for Enum or its
   1884             // subclasses, so we exclude it here.
   1885             // We also want to avoid setting the flag on Object, where we know that finalize() is
   1886             // empty.
   1887             if (klass_descriptor != "Ljava/lang/Object;" &&
   1888                 klass_descriptor != "Ljava/lang/Enum;") {
   1889               klass->SetFinalizable();
   1890             }
   1891           }
   1892         }
   1893       }
   1894     }
   1895   }
   1896   dst->SetCodeItemOffset(it.GetMethodCodeItemOffset());
   1897   dst->SetAccessFlags(it.GetMemberAccessFlags());
   1898 
   1899   dst->SetDexCacheStrings(klass->GetDexCache()->GetStrings());
   1900   dst->SetDexCacheResolvedMethods(klass->GetDexCache()->GetResolvedMethods());
   1901   dst->SetDexCacheResolvedTypes(klass->GetDexCache()->GetResolvedTypes());
   1902   dst->SetDexCacheInitializedStaticStorage(klass->GetDexCache()->GetInitializedStaticStorage());
   1903 
   1904   CHECK(dst->IsArtMethod());
   1905 
   1906   self->EndAssertNoThreadSuspension(old_cause);
   1907   return dst;
   1908 }
   1909 
   1910 void ClassLinker::AppendToBootClassPath(const DexFile& dex_file) {
   1911   Thread* self = Thread::Current();
   1912   SirtRef<mirror::DexCache> dex_cache(self, AllocDexCache(self, dex_file));
   1913   CHECK(dex_cache.get() != NULL) << "Failed to allocate dex cache for " << dex_file.GetLocation();
   1914   AppendToBootClassPath(dex_file, dex_cache);
   1915 }
   1916 
   1917 void ClassLinker::AppendToBootClassPath(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) {
   1918   CHECK(dex_cache.get() != NULL) << dex_file.GetLocation();
   1919   boot_class_path_.push_back(&dex_file);
   1920   RegisterDexFile(dex_file, dex_cache);
   1921 }
   1922 
   1923 bool ClassLinker::IsDexFileRegisteredLocked(const DexFile& dex_file) const {
   1924   dex_lock_.AssertSharedHeld(Thread::Current());
   1925   for (size_t i = 0; i != dex_caches_.size(); ++i) {
   1926     if (dex_caches_[i]->GetDexFile() == &dex_file) {
   1927       return true;
   1928     }
   1929   }
   1930   return false;
   1931 }
   1932 
   1933 bool ClassLinker::IsDexFileRegistered(const DexFile& dex_file) const {
   1934   ReaderMutexLock mu(Thread::Current(), dex_lock_);
   1935   return IsDexFileRegisteredLocked(dex_file);
   1936 }
   1937 
   1938 void ClassLinker::RegisterDexFileLocked(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) {
   1939   dex_lock_.AssertExclusiveHeld(Thread::Current());
   1940   CHECK(dex_cache.get() != NULL) << dex_file.GetLocation();
   1941   CHECK(dex_cache->GetLocation()->Equals(dex_file.GetLocation()))
   1942       << dex_cache->GetLocation()->ToModifiedUtf8() << " " << dex_file.GetLocation();
   1943   dex_caches_.push_back(dex_cache.get());
   1944   dex_cache->SetDexFile(&dex_file);
   1945   dex_caches_dirty_ = true;
   1946 }
   1947 
   1948 void ClassLinker::RegisterDexFile(const DexFile& dex_file) {
   1949   Thread* self = Thread::Current();
   1950   {
   1951     ReaderMutexLock mu(self, dex_lock_);
   1952     if (IsDexFileRegisteredLocked(dex_file)) {
   1953       return;
   1954     }
   1955   }
   1956   // Don't alloc while holding the lock, since allocation may need to
   1957   // suspend all threads and another thread may need the dex_lock_ to
   1958   // get to a suspend point.
   1959   SirtRef<mirror::DexCache> dex_cache(self, AllocDexCache(self, dex_file));
   1960   CHECK(dex_cache.get() != NULL) << "Failed to allocate dex cache for " << dex_file.GetLocation();
   1961   {
   1962     WriterMutexLock mu(self, dex_lock_);
   1963     if (IsDexFileRegisteredLocked(dex_file)) {
   1964       return;
   1965     }
   1966     RegisterDexFileLocked(dex_file, dex_cache);
   1967   }
   1968 }
   1969 
   1970 void ClassLinker::RegisterDexFile(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) {
   1971   WriterMutexLock mu(Thread::Current(), dex_lock_);
   1972   RegisterDexFileLocked(dex_file, dex_cache);
   1973 }
   1974 
   1975 mirror::DexCache* ClassLinker::FindDexCache(const DexFile& dex_file) const {
   1976   ReaderMutexLock mu(Thread::Current(), dex_lock_);
   1977   // Search assuming unique-ness of dex file.
   1978   for (size_t i = 0; i != dex_caches_.size(); ++i) {
   1979     mirror::DexCache* dex_cache = dex_caches_[i];
   1980     if (dex_cache->GetDexFile() == &dex_file) {
   1981       return dex_cache;
   1982     }
   1983   }
   1984   // Search matching by location name.
   1985   std::string location(dex_file.GetLocation());
   1986   for (size_t i = 0; i != dex_caches_.size(); ++i) {
   1987     mirror::DexCache* dex_cache = dex_caches_[i];
   1988     if (dex_cache->GetDexFile()->GetLocation() == location) {
   1989       return dex_cache;
   1990     }
   1991   }
   1992   // Failure, dump diagnostic and abort.
   1993   for (size_t i = 0; i != dex_caches_.size(); ++i) {
   1994     mirror::DexCache* dex_cache = dex_caches_[i];
   1995     LOG(ERROR) << "Registered dex file " << i << " = " << dex_cache->GetDexFile()->GetLocation();
   1996   }
   1997   LOG(FATAL) << "Failed to find DexCache for DexFile " << location;
   1998   return NULL;
   1999 }
   2000 
   2001 void ClassLinker::FixupDexCaches(mirror::ArtMethod* resolution_method) const {
   2002   ReaderMutexLock mu(Thread::Current(), dex_lock_);
   2003   for (size_t i = 0; i != dex_caches_.size(); ++i) {
   2004     dex_caches_[i]->Fixup(resolution_method);
   2005   }
   2006 }
   2007 
   2008 mirror::Class* ClassLinker::CreatePrimitiveClass(Thread* self, Primitive::Type type) {
   2009   mirror::Class* klass = AllocClass(self, sizeof(mirror::Class));
   2010   if (UNLIKELY(klass == NULL)) {
   2011     return NULL;
   2012   }
   2013   return InitializePrimitiveClass(klass, type);
   2014 }
   2015 
   2016 mirror::Class* ClassLinker::InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type) {
   2017   CHECK(primitive_class != NULL);
   2018   // Must hold lock on object when initializing.
   2019   Thread* self = Thread::Current();
   2020   ObjectLock lock(self, primitive_class);
   2021   primitive_class->SetAccessFlags(kAccPublic | kAccFinal | kAccAbstract);
   2022   primitive_class->SetPrimitiveType(type);
   2023   primitive_class->SetStatus(mirror::Class::kStatusInitialized, self);
   2024   const char* descriptor = Primitive::Descriptor(type);
   2025   mirror::Class* existing = InsertClass(descriptor, primitive_class, Hash(descriptor));
   2026   CHECK(existing == NULL) << "InitPrimitiveClass(" << type << ") failed";
   2027   return primitive_class;
   2028 }
   2029 
   2030 // Create an array class (i.e. the class object for the array, not the
   2031 // array itself).  "descriptor" looks like "[C" or "[[[[B" or
   2032 // "[Ljava/lang/String;".
   2033 //
   2034 // If "descriptor" refers to an array of primitives, look up the
   2035 // primitive type's internally-generated class object.
   2036 //
   2037 // "class_loader" is the class loader of the class that's referring to
   2038 // us.  It's used to ensure that we're looking for the element type in
   2039 // the right context.  It does NOT become the class loader for the
   2040 // array class; that always comes from the base element class.
   2041 //
   2042 // Returns NULL with an exception raised on failure.
   2043 mirror::Class* ClassLinker::CreateArrayClass(const char* descriptor,
   2044                                              mirror::ClassLoader* class_loader) {
   2045   // Identify the underlying component type
   2046   CHECK_EQ('[', descriptor[0]);
   2047   mirror::Class* component_type = FindClass(descriptor + 1, class_loader);
   2048   if (component_type == NULL) {
   2049     DCHECK(Thread::Current()->IsExceptionPending());
   2050     return NULL;
   2051   }
   2052 
   2053   // See if the component type is already loaded.  Array classes are
   2054   // always associated with the class loader of their underlying
   2055   // element type -- an array of Strings goes with the loader for
   2056   // java/lang/String -- so we need to look for it there.  (The
   2057   // caller should have checked for the existence of the class
   2058   // before calling here, but they did so with *their* class loader,
   2059   // not the component type's loader.)
   2060   //
   2061   // If we find it, the caller adds "loader" to the class' initiating
   2062   // loader list, which should prevent us from going through this again.
   2063   //
   2064   // This call is unnecessary if "loader" and "component_type->GetClassLoader()"
   2065   // are the same, because our caller (FindClass) just did the
   2066   // lookup.  (Even if we get this wrong we still have correct behavior,
   2067   // because we effectively do this lookup again when we add the new
   2068   // class to the hash table --- necessary because of possible races with
   2069   // other threads.)
   2070   if (class_loader != component_type->GetClassLoader()) {
   2071     mirror::Class* new_class = LookupClass(descriptor, component_type->GetClassLoader());
   2072     if (new_class != NULL) {
   2073       return new_class;
   2074     }
   2075   }
   2076 
   2077   // Fill out the fields in the Class.
   2078   //
   2079   // It is possible to execute some methods against arrays, because
   2080   // all arrays are subclasses of java_lang_Object_, so we need to set
   2081   // up a vtable.  We can just point at the one in java_lang_Object_.
   2082   //
   2083   // Array classes are simple enough that we don't need to do a full
   2084   // link step.
   2085   Thread* self = Thread::Current();
   2086   SirtRef<mirror::Class> new_class(self, NULL);
   2087   if (UNLIKELY(!init_done_)) {
   2088     // Classes that were hand created, ie not by FindSystemClass
   2089     if (strcmp(descriptor, "[Ljava/lang/Class;") == 0) {
   2090       new_class.reset(GetClassRoot(kClassArrayClass));
   2091     } else if (strcmp(descriptor, "[Ljava/lang/Object;") == 0) {
   2092       new_class.reset(GetClassRoot(kObjectArrayClass));
   2093     } else if (strcmp(descriptor, class_roots_descriptors_[kJavaLangStringArrayClass]) == 0) {
   2094       new_class.reset(GetClassRoot(kJavaLangStringArrayClass));
   2095     } else if (strcmp(descriptor,
   2096                       class_roots_descriptors_[kJavaLangReflectArtMethodArrayClass]) == 0) {
   2097       new_class.reset(GetClassRoot(kJavaLangReflectArtMethodArrayClass));
   2098     } else if (strcmp(descriptor,
   2099                       class_roots_descriptors_[kJavaLangReflectArtFieldArrayClass]) == 0) {
   2100       new_class.reset(GetClassRoot(kJavaLangReflectArtFieldArrayClass));
   2101     } else if (strcmp(descriptor, "[C") == 0) {
   2102       new_class.reset(GetClassRoot(kCharArrayClass));
   2103     } else if (strcmp(descriptor, "[I") == 0) {
   2104       new_class.reset(GetClassRoot(kIntArrayClass));
   2105     }
   2106   }
   2107   if (new_class.get() == NULL) {
   2108     new_class.reset(AllocClass(self, sizeof(mirror::Class)));
   2109     if (new_class.get() == NULL) {
   2110       return NULL;
   2111     }
   2112     new_class->SetComponentType(component_type);
   2113   }
   2114   ObjectLock lock(self, new_class.get());  // Must hold lock on object when initializing.
   2115   DCHECK(new_class->GetComponentType() != NULL);
   2116   mirror::Class* java_lang_Object = GetClassRoot(kJavaLangObject);
   2117   new_class->SetSuperClass(java_lang_Object);
   2118   new_class->SetVTable(java_lang_Object->GetVTable());
   2119   new_class->SetPrimitiveType(Primitive::kPrimNot);
   2120   new_class->SetClassLoader(component_type->GetClassLoader());
   2121   new_class->SetStatus(mirror::Class::kStatusInitialized, self);
   2122   // don't need to set new_class->SetObjectSize(..)
   2123   // because Object::SizeOf delegates to Array::SizeOf
   2124 
   2125 
   2126   // All arrays have java/lang/Cloneable and java/io/Serializable as
   2127   // interfaces.  We need to set that up here, so that stuff like
   2128   // "instanceof" works right.
   2129   //
   2130   // Note: The GC could run during the call to FindSystemClass,
   2131   // so we need to make sure the class object is GC-valid while we're in
   2132   // there.  Do this by clearing the interface list so the GC will just
   2133   // think that the entries are null.
   2134 
   2135 
   2136   // Use the single, global copies of "interfaces" and "iftable"
   2137   // (remember not to free them for arrays).
   2138   CHECK(array_iftable_ != NULL);
   2139   new_class->SetIfTable(array_iftable_);
   2140 
   2141   // Inherit access flags from the component type.
   2142   int access_flags = new_class->GetComponentType()->GetAccessFlags();
   2143   // Lose any implementation detail flags; in particular, arrays aren't finalizable.
   2144   access_flags &= kAccJavaFlagsMask;
   2145   // Arrays can't be used as a superclass or interface, so we want to add "abstract final"
   2146   // and remove "interface".
   2147   access_flags |= kAccAbstract | kAccFinal;
   2148   access_flags &= ~kAccInterface;
   2149 
   2150   new_class->SetAccessFlags(access_flags);
   2151 
   2152   mirror::Class* existing = InsertClass(descriptor, new_class.get(), Hash(descriptor));
   2153   if (existing == NULL) {
   2154     return new_class.get();
   2155   }
   2156   // Another thread must have loaded the class after we
   2157   // started but before we finished.  Abandon what we've
   2158   // done.
   2159   //
   2160   // (Yes, this happens.)
   2161 
   2162   return existing;
   2163 }
   2164 
   2165 mirror::Class* ClassLinker::FindPrimitiveClass(char type) {
   2166   switch (Primitive::GetType(type)) {
   2167     case Primitive::kPrimByte:
   2168       return GetClassRoot(kPrimitiveByte);
   2169     case Primitive::kPrimChar:
   2170       return GetClassRoot(kPrimitiveChar);
   2171     case Primitive::kPrimDouble:
   2172       return GetClassRoot(kPrimitiveDouble);
   2173     case Primitive::kPrimFloat:
   2174       return GetClassRoot(kPrimitiveFloat);
   2175     case Primitive::kPrimInt:
   2176       return GetClassRoot(kPrimitiveInt);
   2177     case Primitive::kPrimLong:
   2178       return GetClassRoot(kPrimitiveLong);
   2179     case Primitive::kPrimShort:
   2180       return GetClassRoot(kPrimitiveShort);
   2181     case Primitive::kPrimBoolean:
   2182       return GetClassRoot(kPrimitiveBoolean);
   2183     case Primitive::kPrimVoid:
   2184       return GetClassRoot(kPrimitiveVoid);
   2185     case Primitive::kPrimNot:
   2186       break;
   2187   }
   2188   std::string printable_type(PrintableChar(type));
   2189   ThrowNoClassDefFoundError("Not a primitive type: %s", printable_type.c_str());
   2190   return NULL;
   2191 }
   2192 
   2193 mirror::Class* ClassLinker::InsertClass(const char* descriptor, mirror::Class* klass,
   2194                                         size_t hash) {
   2195   if (VLOG_IS_ON(class_linker)) {
   2196     mirror::DexCache* dex_cache = klass->GetDexCache();
   2197     std::string source;
   2198     if (dex_cache != NULL) {
   2199       source += " from ";
   2200       source += dex_cache->GetLocation()->ToModifiedUtf8();
   2201     }
   2202     LOG(INFO) << "Loaded class " << descriptor << source;
   2203   }
   2204   WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
   2205   mirror::Class* existing =
   2206       LookupClassFromTableLocked(descriptor, klass->GetClassLoader(), hash);
   2207   if (existing != NULL) {
   2208     return existing;
   2209   }
   2210   if (kIsDebugBuild && klass->GetClassLoader() == NULL && dex_cache_image_class_lookup_required_) {
   2211     // Check a class loaded with the system class loader matches one in the image if the class
   2212     // is in the image.
   2213     existing = LookupClassFromImage(descriptor);
   2214     if (existing != NULL) {
   2215       CHECK(klass == existing);
   2216     }
   2217   }
   2218   Runtime::Current()->GetHeap()->VerifyObject(klass);
   2219   class_table_.insert(std::make_pair(hash, klass));
   2220   class_table_dirty_ = true;
   2221   return NULL;
   2222 }
   2223 
   2224 bool ClassLinker::RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader) {
   2225   size_t hash = Hash(descriptor);
   2226   WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
   2227   ClassHelper kh;
   2228   for (auto it = class_table_.lower_bound(hash), end = class_table_.end(); it != end && it->first == hash;
   2229        ++it) {
   2230     mirror::Class* klass = it->second;
   2231     kh.ChangeClass(klass);
   2232     if (strcmp(kh.GetDescriptor(), descriptor) == 0 && klass->GetClassLoader() == class_loader) {
   2233       class_table_.erase(it);
   2234       return true;
   2235     }
   2236   }
   2237   return false;
   2238 }
   2239 
   2240 mirror::Class* ClassLinker::LookupClass(const char* descriptor,
   2241                                         const mirror::ClassLoader* class_loader) {
   2242   size_t hash = Hash(descriptor);
   2243   {
   2244     ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
   2245     mirror::Class* result = LookupClassFromTableLocked(descriptor, class_loader, hash);
   2246     if (result != NULL) {
   2247       return result;
   2248     }
   2249   }
   2250   if (class_loader != NULL || !dex_cache_image_class_lookup_required_) {
   2251     return NULL;
   2252   } else {
   2253     // Lookup failed but need to search dex_caches_.
   2254     mirror::Class* result = LookupClassFromImage(descriptor);
   2255     if (result != NULL) {
   2256       InsertClass(descriptor, result, hash);
   2257     } else {
   2258       // Searching the image dex files/caches failed, we don't want to get into this situation
   2259       // often as map searches are faster, so after kMaxFailedDexCacheLookups move all image
   2260       // classes into the class table.
   2261       const int32_t kMaxFailedDexCacheLookups = 1000;
   2262       if (++failed_dex_cache_class_lookups_ > kMaxFailedDexCacheLookups) {
   2263         MoveImageClassesToClassTable();
   2264       }
   2265     }
   2266     return result;
   2267   }
   2268 }
   2269 
   2270 mirror::Class* ClassLinker::LookupClassFromTableLocked(const char* descriptor,
   2271                                                        const mirror::ClassLoader* class_loader,
   2272                                                        size_t hash) {
   2273   ClassHelper kh(NULL, this);
   2274   auto end = class_table_.end();
   2275   for (auto it = class_table_.lower_bound(hash); it != end && it->first == hash; ++it) {
   2276     mirror::Class* klass = it->second;
   2277     kh.ChangeClass(klass);
   2278     if (klass->GetClassLoader() == class_loader && strcmp(descriptor, kh.GetDescriptor()) == 0) {
   2279       if (kIsDebugBuild) {
   2280         // Check for duplicates in the table.
   2281         for (++it; it != end && it->first == hash; ++it) {
   2282           mirror::Class* klass2 = it->second;
   2283           kh.ChangeClass(klass2);
   2284           CHECK(!(strcmp(descriptor, kh.GetDescriptor()) == 0 && klass2->GetClassLoader() == class_loader))
   2285           << PrettyClass(klass) << " " << klass << " " << klass->GetClassLoader() << " "
   2286           << PrettyClass(klass2) << " " << klass2 << " " << klass2->GetClassLoader();
   2287         }
   2288       }
   2289       return klass;
   2290     }
   2291   }
   2292   return NULL;
   2293 }
   2294 
   2295 static mirror::ObjectArray<mirror::DexCache>* GetImageDexCaches()
   2296     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   2297   gc::space::ImageSpace* image = Runtime::Current()->GetHeap()->GetImageSpace();
   2298   CHECK(image != NULL);
   2299   mirror::Object* root = image->GetImageHeader().GetImageRoot(ImageHeader::kDexCaches);
   2300   return root->AsObjectArray<mirror::DexCache>();
   2301 }
   2302 
   2303 void ClassLinker::MoveImageClassesToClassTable() {
   2304   Thread* self = Thread::Current();
   2305   WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
   2306   if (!dex_cache_image_class_lookup_required_) {
   2307     return;  // All dex cache classes are already in the class table.
   2308   }
   2309   const char* old_no_suspend_cause =
   2310       self->StartAssertNoThreadSuspension("Moving image classes to class table");
   2311   mirror::ObjectArray<mirror::DexCache>* dex_caches = GetImageDexCaches();
   2312   ClassHelper kh(NULL, this);
   2313   for (int32_t i = 0; i < dex_caches->GetLength(); i++) {
   2314     mirror::DexCache* dex_cache = dex_caches->Get(i);
   2315     mirror::ObjectArray<mirror::Class>* types = dex_cache->GetResolvedTypes();
   2316     for (int32_t j = 0; j < types->GetLength(); j++) {
   2317       mirror::Class* klass = types->Get(j);
   2318       if (klass != NULL) {
   2319         kh.ChangeClass(klass);
   2320         DCHECK(klass->GetClassLoader() == NULL);
   2321         const char* descriptor = kh.GetDescriptor();
   2322         size_t hash = Hash(descriptor);
   2323         mirror::Class* existing = LookupClassFromTableLocked(descriptor, NULL, hash);
   2324         if (existing != NULL) {
   2325           CHECK(existing == klass) << PrettyClassAndClassLoader(existing) << " != "
   2326               << PrettyClassAndClassLoader(klass);
   2327         } else {
   2328           class_table_.insert(std::make_pair(hash, klass));
   2329         }
   2330       }
   2331     }
   2332   }
   2333   class_table_dirty_ = true;
   2334   dex_cache_image_class_lookup_required_ = false;
   2335   self->EndAssertNoThreadSuspension(old_no_suspend_cause);
   2336 }
   2337 
   2338 mirror::Class* ClassLinker::LookupClassFromImage(const char* descriptor) {
   2339   Thread* self = Thread::Current();
   2340   const char* old_no_suspend_cause =
   2341       self->StartAssertNoThreadSuspension("Image class lookup");
   2342   mirror::ObjectArray<mirror::DexCache>* dex_caches = GetImageDexCaches();
   2343   for (int32_t i = 0; i < dex_caches->GetLength(); ++i) {
   2344     mirror::DexCache* dex_cache = dex_caches->Get(i);
   2345     const DexFile* dex_file = dex_cache->GetDexFile();
   2346     // First search using the class def map, but don't bother for non-class types.
   2347     if (descriptor[0] == 'L') {
   2348       const DexFile::StringId* descriptor_string_id = dex_file->FindStringId(descriptor);
   2349       if (descriptor_string_id != NULL) {
   2350         const DexFile::TypeId* type_id =
   2351             dex_file->FindTypeId(dex_file->GetIndexForStringId(*descriptor_string_id));
   2352         if (type_id != NULL) {
   2353           mirror::Class* klass = dex_cache->GetResolvedType(dex_file->GetIndexForTypeId(*type_id));
   2354           if (klass != NULL) {
   2355             self->EndAssertNoThreadSuspension(old_no_suspend_cause);
   2356             return klass;
   2357           }
   2358         }
   2359       }
   2360     }
   2361     // Now try binary searching the string/type index.
   2362     const DexFile::StringId* string_id = dex_file->FindStringId(descriptor);
   2363     if (string_id != NULL) {
   2364       const DexFile::TypeId* type_id =
   2365           dex_file->FindTypeId(dex_file->GetIndexForStringId(*string_id));
   2366       if (type_id != NULL) {
   2367         uint16_t type_idx = dex_file->GetIndexForTypeId(*type_id);
   2368         mirror::Class* klass = dex_cache->GetResolvedType(type_idx);
   2369         if (klass != NULL) {
   2370           self->EndAssertNoThreadSuspension(old_no_suspend_cause);
   2371           return klass;
   2372         }
   2373       }
   2374     }
   2375   }
   2376   self->EndAssertNoThreadSuspension(old_no_suspend_cause);
   2377   return NULL;
   2378 }
   2379 
   2380 void ClassLinker::LookupClasses(const char* descriptor, std::vector<mirror::Class*>& result) {
   2381   result.clear();
   2382   if (dex_cache_image_class_lookup_required_) {
   2383     MoveImageClassesToClassTable();
   2384   }
   2385   size_t hash = Hash(descriptor);
   2386   ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
   2387   ClassHelper kh(NULL, this);
   2388   for (auto it = class_table_.lower_bound(hash), end = class_table_.end();
   2389       it != end && it->first == hash; ++it) {
   2390     mirror::Class* klass = it->second;
   2391     kh.ChangeClass(klass);
   2392     if (strcmp(descriptor, kh.GetDescriptor()) == 0) {
   2393       result.push_back(klass);
   2394     }
   2395   }
   2396 }
   2397 
   2398 void ClassLinker::VerifyClass(mirror::Class* klass) {
   2399   // TODO: assert that the monitor on the Class is held
   2400   Thread* self = Thread::Current();
   2401   ObjectLock lock(self, klass);
   2402 
   2403   // Don't attempt to re-verify if already sufficiently verified.
   2404   if (klass->IsVerified() ||
   2405       (klass->IsCompileTimeVerified() && Runtime::Current()->IsCompiler())) {
   2406     return;
   2407   }
   2408 
   2409   // The class might already be erroneous, for example at compile time if we attempted to verify
   2410   // this class as a parent to another.
   2411   if (klass->IsErroneous()) {
   2412     ThrowEarlierClassFailure(klass);
   2413     return;
   2414   }
   2415 
   2416   if (klass->GetStatus() == mirror::Class::kStatusResolved) {
   2417     klass->SetStatus(mirror::Class::kStatusVerifying, self);
   2418   } else {
   2419     CHECK_EQ(klass->GetStatus(), mirror::Class::kStatusRetryVerificationAtRuntime)
   2420         << PrettyClass(klass);
   2421     CHECK(!Runtime::Current()->IsCompiler());
   2422     klass->SetStatus(mirror::Class::kStatusVerifyingAtRuntime, self);
   2423   }
   2424 
   2425   // Verify super class.
   2426   SirtRef<mirror::Class> super(self, klass->GetSuperClass());
   2427   if (super.get() != NULL) {
   2428     // Acquire lock to prevent races on verifying the super class.
   2429     ObjectLock lock(self, super.get());
   2430 
   2431     if (!super->IsVerified() && !super->IsErroneous()) {
   2432       VerifyClass(super.get());
   2433     }
   2434     if (!super->IsCompileTimeVerified()) {
   2435       std::string error_msg(StringPrintf("Rejecting class %s that attempts to sub-class erroneous class %s",
   2436                                          PrettyDescriptor(klass).c_str(),
   2437                                          PrettyDescriptor(super.get()).c_str()));
   2438       LOG(ERROR) << error_msg  << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8();
   2439       SirtRef<mirror::Throwable> cause(self, self->GetException(NULL));
   2440       if (cause.get() != NULL) {
   2441         self->ClearException();
   2442       }
   2443       ThrowVerifyError(klass, "%s", error_msg.c_str());
   2444       if (cause.get() != NULL) {
   2445         self->GetException(NULL)->SetCause(cause.get());
   2446       }
   2447       klass->SetStatus(mirror::Class::kStatusError, self);
   2448       return;
   2449     }
   2450   }
   2451 
   2452   // Try to use verification information from the oat file, otherwise do runtime verification.
   2453   const DexFile& dex_file = *klass->GetDexCache()->GetDexFile();
   2454   mirror::Class::Status oat_file_class_status(mirror::Class::kStatusNotReady);
   2455   bool preverified = VerifyClassUsingOatFile(dex_file, klass, oat_file_class_status);
   2456   if (oat_file_class_status == mirror::Class::kStatusError) {
   2457     VLOG(class_linker) << "Skipping runtime verification of erroneous class "
   2458         << PrettyDescriptor(klass) << " in "
   2459         << klass->GetDexCache()->GetLocation()->ToModifiedUtf8();
   2460     ThrowVerifyError(klass, "Rejecting class %s because it failed compile-time verification",
   2461                      PrettyDescriptor(klass).c_str());
   2462     klass->SetStatus(mirror::Class::kStatusError, self);
   2463     return;
   2464   }
   2465   verifier::MethodVerifier::FailureKind verifier_failure = verifier::MethodVerifier::kNoFailure;
   2466   std::string error_msg;
   2467   if (!preverified) {
   2468     verifier_failure = verifier::MethodVerifier::VerifyClass(klass,
   2469                                                              Runtime::Current()->IsCompiler(),
   2470                                                              &error_msg);
   2471   }
   2472   if (preverified || verifier_failure != verifier::MethodVerifier::kHardFailure) {
   2473     if (!preverified && verifier_failure != verifier::MethodVerifier::kNoFailure) {
   2474       VLOG(class_linker) << "Soft verification failure in class " << PrettyDescriptor(klass)
   2475           << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8()
   2476           << " because: " << error_msg;
   2477     }
   2478     self->AssertNoPendingException();
   2479     // Make sure all classes referenced by catch blocks are resolved.
   2480     ResolveClassExceptionHandlerTypes(dex_file, klass);
   2481     if (verifier_failure == verifier::MethodVerifier::kNoFailure) {
   2482       // Even though there were no verifier failures we need to respect whether the super-class
   2483       // was verified or requiring runtime reverification.
   2484       if (super.get() == NULL || super->IsVerified()) {
   2485         klass->SetStatus(mirror::Class::kStatusVerified, self);
   2486       } else {
   2487         CHECK_EQ(super->GetStatus(), mirror::Class::kStatusRetryVerificationAtRuntime);
   2488         klass->SetStatus(mirror::Class::kStatusRetryVerificationAtRuntime, self);
   2489         // Pretend a soft failure occured so that we don't consider the class verified below.
   2490         verifier_failure = verifier::MethodVerifier::kSoftFailure;
   2491       }
   2492     } else {
   2493       CHECK_EQ(verifier_failure, verifier::MethodVerifier::kSoftFailure);
   2494       // Soft failures at compile time should be retried at runtime. Soft
   2495       // failures at runtime will be handled by slow paths in the generated
   2496       // code. Set status accordingly.
   2497       if (Runtime::Current()->IsCompiler()) {
   2498         klass->SetStatus(mirror::Class::kStatusRetryVerificationAtRuntime, self);
   2499       } else {
   2500         klass->SetStatus(mirror::Class::kStatusVerified, self);
   2501       }
   2502     }
   2503   } else {
   2504     LOG(ERROR) << "Verification failed on class " << PrettyDescriptor(klass)
   2505         << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8()
   2506         << " because: " << error_msg;
   2507     self->AssertNoPendingException();
   2508     ThrowVerifyError(klass, "%s", error_msg.c_str());
   2509     klass->SetStatus(mirror::Class::kStatusError, self);
   2510   }
   2511   if (preverified || verifier_failure == verifier::MethodVerifier::kNoFailure) {
   2512     // Class is verified so we don't need to do any access check on its methods.
   2513     // Let the interpreter know it by setting the kAccPreverified flag onto each
   2514     // method.
   2515     // Note: we're going here during compilation and at runtime. When we set the
   2516     // kAccPreverified flag when compiling image classes, the flag is recorded
   2517     // in the image and is set when loading the image.
   2518     klass->SetPreverifiedFlagOnAllMethods();
   2519   }
   2520 }
   2521 
   2522 bool ClassLinker::VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
   2523                                           mirror::Class::Status& oat_file_class_status) {
   2524   // If we're compiling, we can only verify the class using the oat file if
   2525   // we are not compiling the image or if the class we're verifying is not part of
   2526   // the app.  In other words, we will only check for preverification of bootclasspath
   2527   // classes.
   2528   if (Runtime::Current()->IsCompiler()) {
   2529     // Are we compiling the bootclasspath?
   2530     if (!Runtime::Current()->UseCompileTimeClassPath()) {
   2531       return false;
   2532     }
   2533     // We are compiling an app (not the image).
   2534 
   2535     // Is this an app class? (I.e. not a bootclasspath class)
   2536     if (klass->GetClassLoader() != NULL) {
   2537       return false;
   2538     }
   2539   }
   2540 
   2541   const OatFile* oat_file = FindOpenedOatFileForDexFile(dex_file);
   2542   // Make this work with gtests, which do not set up the image properly.
   2543   // TODO: we should clean up gtests to set up the image path properly.
   2544   if (Runtime::Current()->IsCompiler() && (oat_file == NULL)) {
   2545     return false;
   2546   }
   2547 
   2548   CHECK(oat_file != NULL) << dex_file.GetLocation() << " " << PrettyClass(klass);
   2549   uint dex_location_checksum = dex_file.GetLocationChecksum();
   2550   const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_file.GetLocation(),
   2551                                                                     &dex_location_checksum);
   2552   CHECK(oat_dex_file != NULL) << dex_file.GetLocation() << " " << PrettyClass(klass);
   2553   const char* descriptor = ClassHelper(klass).GetDescriptor();
   2554   uint16_t class_def_index = klass->GetDexClassDefIndex();
   2555   UniquePtr<const OatFile::OatClass> oat_class(oat_dex_file->GetOatClass(class_def_index));
   2556   CHECK(oat_class.get() != NULL)
   2557           << dex_file.GetLocation() << " " << PrettyClass(klass) << " " << descriptor;
   2558   oat_file_class_status = oat_class->GetStatus();
   2559   if (oat_file_class_status == mirror::Class::kStatusVerified ||
   2560       oat_file_class_status == mirror::Class::kStatusInitialized) {
   2561       return true;
   2562   }
   2563   if (oat_file_class_status == mirror::Class::kStatusRetryVerificationAtRuntime) {
   2564     // Compile time verification failed with a soft error. Compile time verification can fail
   2565     // because we have incomplete type information. Consider the following:
   2566     // class ... {
   2567     //   Foo x;
   2568     //   .... () {
   2569     //     if (...) {
   2570     //       v1 gets assigned a type of resolved class Foo
   2571     //     } else {
   2572     //       v1 gets assigned a type of unresolved class Bar
   2573     //     }
   2574     //     iput x = v1
   2575     // } }
   2576     // when we merge v1 following the if-the-else it results in Conflict
   2577     // (see verifier::RegType::Merge) as we can't know the type of Bar and we could possibly be
   2578     // allowing an unsafe assignment to the field x in the iput (javac may have compiled this as
   2579     // it knew Bar was a sub-class of Foo, but for us this may have been moved into a separate apk
   2580     // at compile time).
   2581     return false;
   2582   }
   2583   if (oat_file_class_status == mirror::Class::kStatusError) {
   2584     // Compile time verification failed with a hard error. This is caused by invalid instructions
   2585     // in the class. These errors are unrecoverable.
   2586     return false;
   2587   }
   2588   if (oat_file_class_status == mirror::Class::kStatusNotReady) {
   2589     // Status is uninitialized if we couldn't determine the status at compile time, for example,
   2590     // not loading the class.
   2591     // TODO: when the verifier doesn't rely on Class-es failing to resolve/load the type hierarchy
   2592     // isn't a problem and this case shouldn't occur
   2593     return false;
   2594   }
   2595   LOG(FATAL) << "Unexpected class status: " << oat_file_class_status
   2596              << " " << dex_file.GetLocation() << " " << PrettyClass(klass) << " " << descriptor;
   2597 
   2598   return false;
   2599 }
   2600 
   2601 void ClassLinker::ResolveClassExceptionHandlerTypes(const DexFile& dex_file, mirror::Class* klass) {
   2602   for (size_t i = 0; i < klass->NumDirectMethods(); i++) {
   2603     ResolveMethodExceptionHandlerTypes(dex_file, klass->GetDirectMethod(i));
   2604   }
   2605   for (size_t i = 0; i < klass->NumVirtualMethods(); i++) {
   2606     ResolveMethodExceptionHandlerTypes(dex_file, klass->GetVirtualMethod(i));
   2607   }
   2608 }
   2609 
   2610 void ClassLinker::ResolveMethodExceptionHandlerTypes(const DexFile& dex_file,
   2611                                                      mirror::ArtMethod* method) {
   2612   // similar to DexVerifier::ScanTryCatchBlocks and dex2oat's ResolveExceptionsForMethod.
   2613   const DexFile::CodeItem* code_item = dex_file.GetCodeItem(method->GetCodeItemOffset());
   2614   if (code_item == NULL) {
   2615     return;  // native or abstract method
   2616   }
   2617   if (code_item->tries_size_ == 0) {
   2618     return;  // nothing to process
   2619   }
   2620   const byte* handlers_ptr = DexFile::GetCatchHandlerData(*code_item, 0);
   2621   uint32_t handlers_size = DecodeUnsignedLeb128(&handlers_ptr);
   2622   ClassLinker* linker = Runtime::Current()->GetClassLinker();
   2623   for (uint32_t idx = 0; idx < handlers_size; idx++) {
   2624     CatchHandlerIterator iterator(handlers_ptr);
   2625     for (; iterator.HasNext(); iterator.Next()) {
   2626       // Ensure exception types are resolved so that they don't need resolution to be delivered,
   2627       // unresolved exception types will be ignored by exception delivery
   2628       if (iterator.GetHandlerTypeIndex() != DexFile::kDexNoIndex16) {
   2629         mirror::Class* exception_type = linker->ResolveType(iterator.GetHandlerTypeIndex(), method);
   2630         if (exception_type == NULL) {
   2631           DCHECK(Thread::Current()->IsExceptionPending());
   2632           Thread::Current()->ClearException();
   2633         }
   2634       }
   2635     }
   2636     handlers_ptr = iterator.EndDataPointer();
   2637   }
   2638 }
   2639 
   2640 static void CheckProxyConstructor(mirror::ArtMethod* constructor);
   2641 static void CheckProxyMethod(mirror::ArtMethod* method,
   2642                              SirtRef<mirror::ArtMethod>& prototype);
   2643 
   2644 mirror::Class* ClassLinker::CreateProxyClass(mirror::String* name,
   2645                                              mirror::ObjectArray<mirror::Class>* interfaces,
   2646                                              mirror::ClassLoader* loader,
   2647                                              mirror::ObjectArray<mirror::ArtMethod>* methods,
   2648                                              mirror::ObjectArray<mirror::ObjectArray<mirror::Class> >* throws) {
   2649   Thread* self = Thread::Current();
   2650   SirtRef<mirror::Class> klass(self, AllocClass(self, GetClassRoot(kJavaLangClass),
   2651                                                 sizeof(mirror::SynthesizedProxyClass)));
   2652   if (klass.get() == NULL) {
   2653     CHECK(self->IsExceptionPending());  // OOME.
   2654     return NULL;
   2655   }
   2656   DCHECK(klass->GetClass() != NULL);
   2657   klass->SetObjectSize(sizeof(mirror::Proxy));
   2658   klass->SetAccessFlags(kAccClassIsProxy | kAccPublic | kAccFinal);
   2659   klass->SetClassLoader(loader);
   2660   DCHECK_EQ(klass->GetPrimitiveType(), Primitive::kPrimNot);
   2661   klass->SetName(name);
   2662   mirror::Class* proxy_class = GetClassRoot(kJavaLangReflectProxy);
   2663   klass->SetDexCache(proxy_class->GetDexCache());
   2664   klass->SetStatus(mirror::Class::kStatusIdx, self);
   2665 
   2666   // Instance fields are inherited, but we add a couple of static fields...
   2667   {
   2668     mirror::ObjectArray<mirror::ArtField>* sfields = AllocArtFieldArray(self, 2);
   2669     if (UNLIKELY(sfields == NULL)) {
   2670       CHECK(self->IsExceptionPending());  // OOME.
   2671       return NULL;
   2672     }
   2673     klass->SetSFields(sfields);
   2674   }
   2675   // 1. Create a static field 'interfaces' that holds the _declared_ interfaces implemented by
   2676   // our proxy, so Class.getInterfaces doesn't return the flattened set.
   2677   SirtRef<mirror::ArtField> interfaces_sfield(self, AllocArtField(self));
   2678   if (UNLIKELY(interfaces_sfield.get() == NULL)) {
   2679     CHECK(self->IsExceptionPending());  // OOME.
   2680     return NULL;
   2681   }
   2682   klass->SetStaticField(0, interfaces_sfield.get());
   2683   interfaces_sfield->SetDexFieldIndex(0);
   2684   interfaces_sfield->SetDeclaringClass(klass.get());
   2685   interfaces_sfield->SetAccessFlags(kAccStatic | kAccPublic | kAccFinal);
   2686   // 2. Create a static field 'throws' that holds exceptions thrown by our methods.
   2687   SirtRef<mirror::ArtField> throws_sfield(self, AllocArtField(self));
   2688   if (UNLIKELY(throws_sfield.get() == NULL)) {
   2689     CHECK(self->IsExceptionPending());  // OOME.
   2690     return NULL;
   2691   }
   2692   klass->SetStaticField(1, throws_sfield.get());
   2693   throws_sfield->SetDexFieldIndex(1);
   2694   throws_sfield->SetDeclaringClass(klass.get());
   2695   throws_sfield->SetAccessFlags(kAccStatic | kAccPublic | kAccFinal);
   2696 
   2697   // Proxies have 1 direct method, the constructor
   2698   {
   2699     mirror::ObjectArray<mirror::ArtMethod>* directs =
   2700       AllocArtMethodArray(self, 1);
   2701     if (UNLIKELY(directs == NULL)) {
   2702       CHECK(self->IsExceptionPending());  // OOME.
   2703       return NULL;
   2704     }
   2705     klass->SetDirectMethods(directs);
   2706     mirror::ArtMethod* constructor = CreateProxyConstructor(self, klass, proxy_class);
   2707     if (UNLIKELY(constructor == NULL)) {
   2708       CHECK(self->IsExceptionPending());  // OOME.
   2709       return NULL;
   2710     }
   2711     klass->SetDirectMethod(0, constructor);
   2712   }
   2713 
   2714   // Create virtual method using specified prototypes
   2715   size_t num_virtual_methods = methods->GetLength();
   2716   {
   2717     mirror::ObjectArray<mirror::ArtMethod>* virtuals =
   2718         AllocArtMethodArray(self, num_virtual_methods);
   2719     if (UNLIKELY(virtuals == NULL)) {
   2720       CHECK(self->IsExceptionPending());  // OOME.
   2721       return NULL;
   2722     }
   2723     klass->SetVirtualMethods(virtuals);
   2724   }
   2725   for (size_t i = 0; i < num_virtual_methods; ++i) {
   2726     SirtRef<mirror::ArtMethod> prototype(self, methods->Get(i));
   2727     mirror::ArtMethod* clone = CreateProxyMethod(self, klass, prototype);
   2728     if (UNLIKELY(clone == NULL)) {
   2729       CHECK(self->IsExceptionPending());  // OOME.
   2730       return NULL;
   2731     }
   2732     klass->SetVirtualMethod(i, clone);
   2733   }
   2734 
   2735   klass->SetSuperClass(proxy_class);  // The super class is java.lang.reflect.Proxy
   2736   klass->SetStatus(mirror::Class::kStatusLoaded, self);  // Class is now effectively in the loaded state
   2737   self->AssertNoPendingException();
   2738 
   2739   {
   2740     ObjectLock lock(self, klass.get());  // Must hold lock on object when resolved.
   2741     // Link the fields and virtual methods, creating vtable and iftables
   2742     if (!LinkClass(klass, interfaces, self)) {
   2743       klass->SetStatus(mirror::Class::kStatusError, self);
   2744       return NULL;
   2745     }
   2746 
   2747     interfaces_sfield->SetObject(klass.get(), interfaces);
   2748     throws_sfield->SetObject(klass.get(), throws);
   2749     klass->SetStatus(mirror::Class::kStatusInitialized, self);
   2750   }
   2751 
   2752   // sanity checks
   2753   if (kIsDebugBuild) {
   2754     CHECK(klass->GetIFields() == NULL);
   2755     CheckProxyConstructor(klass->GetDirectMethod(0));
   2756     for (size_t i = 0; i < num_virtual_methods; ++i) {
   2757       SirtRef<mirror::ArtMethod> prototype(self, methods->Get(i));
   2758       CheckProxyMethod(klass->GetVirtualMethod(i), prototype);
   2759     }
   2760 
   2761     std::string interfaces_field_name(StringPrintf("java.lang.Class[] %s.interfaces",
   2762                                                    name->ToModifiedUtf8().c_str()));
   2763     CHECK_EQ(PrettyField(klass->GetStaticField(0)), interfaces_field_name);
   2764 
   2765     std::string throws_field_name(StringPrintf("java.lang.Class[][] %s.throws",
   2766                                                name->ToModifiedUtf8().c_str()));
   2767     CHECK_EQ(PrettyField(klass->GetStaticField(1)), throws_field_name);
   2768 
   2769     mirror::SynthesizedProxyClass* synth_proxy_class =
   2770         down_cast<mirror::SynthesizedProxyClass*>(klass.get());
   2771     CHECK_EQ(synth_proxy_class->GetInterfaces(), interfaces);
   2772     CHECK_EQ(synth_proxy_class->GetThrows(), throws);
   2773   }
   2774   std::string descriptor(GetDescriptorForProxy(klass.get()));
   2775   mirror::Class* existing = InsertClass(descriptor.c_str(), klass.get(), Hash(descriptor.c_str()));
   2776   CHECK(existing == nullptr);
   2777   return klass.get();
   2778 }
   2779 
   2780 std::string ClassLinker::GetDescriptorForProxy(const mirror::Class* proxy_class) {
   2781   DCHECK(proxy_class->IsProxyClass());
   2782   mirror::String* name = proxy_class->GetName();
   2783   DCHECK(name != NULL);
   2784   return DotToDescriptor(name->ToModifiedUtf8().c_str());
   2785 }
   2786 
   2787 mirror::ArtMethod* ClassLinker::FindMethodForProxy(const mirror::Class* proxy_class,
   2788                                                         const mirror::ArtMethod* proxy_method) {
   2789   DCHECK(proxy_class->IsProxyClass());
   2790   DCHECK(proxy_method->IsProxyMethod());
   2791   // Locate the dex cache of the original interface/Object
   2792   mirror::DexCache* dex_cache = NULL;
   2793   {
   2794     mirror::ObjectArray<mirror::Class>* resolved_types = proxy_method->GetDexCacheResolvedTypes();
   2795     ReaderMutexLock mu(Thread::Current(), dex_lock_);
   2796     for (size_t i = 0; i != dex_caches_.size(); ++i) {
   2797       if (dex_caches_[i]->GetResolvedTypes() == resolved_types) {
   2798         dex_cache = dex_caches_[i];
   2799         break;
   2800       }
   2801     }
   2802   }
   2803   CHECK(dex_cache != NULL);
   2804   uint32_t method_idx = proxy_method->GetDexMethodIndex();
   2805   mirror::ArtMethod* resolved_method = dex_cache->GetResolvedMethod(method_idx);
   2806   CHECK(resolved_method != NULL);
   2807   return resolved_method;
   2808 }
   2809 
   2810 
   2811 mirror::ArtMethod* ClassLinker::CreateProxyConstructor(Thread* self,
   2812                                                        SirtRef<mirror::Class>& klass,
   2813                                                        mirror::Class* proxy_class) {
   2814   // Create constructor for Proxy that must initialize h
   2815   mirror::ObjectArray<mirror::ArtMethod>* proxy_direct_methods =
   2816       proxy_class->GetDirectMethods();
   2817   CHECK_EQ(proxy_direct_methods->GetLength(), 16);
   2818   mirror::ArtMethod* proxy_constructor = proxy_direct_methods->Get(2);
   2819   // Clone the existing constructor of Proxy (our constructor would just invoke it so steal its
   2820   // code_ too)
   2821   mirror::ArtMethod* constructor =
   2822       down_cast<mirror::ArtMethod*>(proxy_constructor->Clone(self));
   2823   if (constructor == NULL) {
   2824     CHECK(self->IsExceptionPending());  // OOME.
   2825     return NULL;
   2826   }
   2827   // Make this constructor public and fix the class to be our Proxy version
   2828   constructor->SetAccessFlags((constructor->GetAccessFlags() & ~kAccProtected) | kAccPublic);
   2829   constructor->SetDeclaringClass(klass.get());
   2830   return constructor;
   2831 }
   2832 
   2833 static void CheckProxyConstructor(mirror::ArtMethod* constructor)
   2834     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   2835   CHECK(constructor->IsConstructor());
   2836   MethodHelper mh(constructor);
   2837   CHECK_STREQ(mh.GetName(), "<init>");
   2838   CHECK_EQ(mh.GetSignature(), std::string("(Ljava/lang/reflect/InvocationHandler;)V"));
   2839   DCHECK(constructor->IsPublic());
   2840 }
   2841 
   2842 mirror::ArtMethod* ClassLinker::CreateProxyMethod(Thread* self, SirtRef<mirror::Class>& klass,
   2843                                                        SirtRef<mirror::ArtMethod>& prototype) {
   2844   // Ensure prototype is in dex cache so that we can use the dex cache to look up the overridden
   2845   // prototype method
   2846   prototype->GetDeclaringClass()->GetDexCache()->SetResolvedMethod(prototype->GetDexMethodIndex(),
   2847                                                                    prototype.get());
   2848   // We steal everything from the prototype (such as DexCache, invoke stub, etc.) then specialize
   2849   // as necessary
   2850   mirror::ArtMethod* method = down_cast<mirror::ArtMethod*>(prototype->Clone(self));
   2851   if (UNLIKELY(method == NULL)) {
   2852     CHECK(self->IsExceptionPending());  // OOME.
   2853     return NULL;
   2854   }
   2855 
   2856   // Set class to be the concrete proxy class and clear the abstract flag, modify exceptions to
   2857   // the intersection of throw exceptions as defined in Proxy
   2858   method->SetDeclaringClass(klass.get());
   2859   method->SetAccessFlags((method->GetAccessFlags() & ~kAccAbstract) | kAccFinal);
   2860 
   2861   // At runtime the method looks like a reference and argument saving method, clone the code
   2862   // related parameters from this method.
   2863   mirror::ArtMethod* refs_and_args =
   2864       Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsAndArgs);
   2865   method->SetCoreSpillMask(refs_and_args->GetCoreSpillMask());
   2866   method->SetFpSpillMask(refs_and_args->GetFpSpillMask());
   2867   method->SetFrameSizeInBytes(refs_and_args->GetFrameSizeInBytes());
   2868   method->SetEntryPointFromCompiledCode(GetProxyInvokeHandler());
   2869   method->SetEntryPointFromInterpreter(artInterpreterToCompiledCodeBridge);
   2870 
   2871   return method;
   2872 }
   2873 
   2874 static void CheckProxyMethod(mirror::ArtMethod* method,
   2875                              SirtRef<mirror::ArtMethod>& prototype)
   2876     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   2877   // Basic sanity
   2878   CHECK(!prototype->IsFinal());
   2879   CHECK(method->IsFinal());
   2880   CHECK(!method->IsAbstract());
   2881 
   2882   // The proxy method doesn't have its own dex cache or dex file and so it steals those of its
   2883   // interface prototype. The exception to this are Constructors and the Class of the Proxy itself.
   2884   CHECK_EQ(prototype->GetDexCacheStrings(), method->GetDexCacheStrings());
   2885   CHECK_EQ(prototype->GetDexCacheResolvedMethods(), method->GetDexCacheResolvedMethods());
   2886   CHECK_EQ(prototype->GetDexCacheResolvedTypes(), method->GetDexCacheResolvedTypes());
   2887   CHECK_EQ(prototype->GetDexCacheInitializedStaticStorage(),
   2888            method->GetDexCacheInitializedStaticStorage());
   2889   CHECK_EQ(prototype->GetDexMethodIndex(), method->GetDexMethodIndex());
   2890 
   2891   MethodHelper mh(method);
   2892   MethodHelper mh2(prototype.get());
   2893   CHECK_STREQ(mh.GetName(), mh2.GetName());
   2894   CHECK_STREQ(mh.GetShorty(), mh2.GetShorty());
   2895   // More complex sanity - via dex cache
   2896   CHECK_EQ(mh.GetReturnType(), mh2.GetReturnType());
   2897 }
   2898 
   2899 static bool CanWeInitializeClass(mirror::Class* klass, bool can_init_statics,
   2900                                  bool can_init_parents)
   2901     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   2902   if (can_init_statics && can_init_statics) {
   2903     return true;
   2904   }
   2905   if (!can_init_statics) {
   2906     // Check if there's a class initializer.
   2907     mirror::ArtMethod* clinit = klass->FindDeclaredDirectMethod("<clinit>", "()V");
   2908     if (clinit != NULL) {
   2909       return false;
   2910     }
   2911     // Check if there are encoded static values needing initialization.
   2912     if (klass->NumStaticFields() != 0) {
   2913       ClassHelper kh(klass);
   2914       const DexFile::ClassDef* dex_class_def = kh.GetClassDef();
   2915       DCHECK(dex_class_def != NULL);
   2916       if (dex_class_def->static_values_off_ != 0) {
   2917         return false;
   2918       }
   2919     }
   2920   }
   2921   if (!klass->IsInterface() && klass->HasSuperClass()) {
   2922     mirror::Class* super_class = klass->GetSuperClass();
   2923     if (!can_init_parents && !super_class->IsInitialized()) {
   2924       return false;
   2925     } else {
   2926       if (!CanWeInitializeClass(super_class, can_init_statics, true)) {
   2927         return false;
   2928       }
   2929     }
   2930   }
   2931   return true;
   2932 }
   2933 
   2934 bool ClassLinker::InitializeClass(mirror::Class* klass, bool can_init_statics,
   2935                                   bool can_init_parents) {
   2936   // see JLS 3rd edition, 12.4.2 "Detailed Initialization Procedure" for the locking protocol
   2937 
   2938   // Are we already initialized and therefore done?
   2939   // Note: we differ from the JLS here as we don't do this under the lock, this is benign as
   2940   // an initialized class will never change its state.
   2941   if (klass->IsInitialized()) {
   2942     return true;
   2943   }
   2944 
   2945   // Fast fail if initialization requires a full runtime. Not part of the JLS.
   2946   if (!CanWeInitializeClass(klass, can_init_statics, can_init_parents)) {
   2947     return false;
   2948   }
   2949 
   2950   Thread* self = Thread::Current();
   2951   uint64_t t0;
   2952   {
   2953     ObjectLock lock(self, klass);
   2954 
   2955     // Re-check under the lock in case another thread initialized ahead of us.
   2956     if (klass->IsInitialized()) {
   2957       return true;
   2958     }
   2959 
   2960     // Was the class already found to be erroneous? Done under the lock to match the JLS.
   2961     if (klass->IsErroneous()) {
   2962       ThrowEarlierClassFailure(klass);
   2963       return false;
   2964     }
   2965 
   2966     CHECK(klass->IsResolved()) << PrettyClass(klass) << ": state=" << klass->GetStatus();
   2967 
   2968     if (!klass->IsVerified()) {
   2969       VerifyClass(klass);
   2970       if (!klass->IsVerified()) {
   2971         // We failed to verify, expect either the klass to be erroneous or verification failed at
   2972         // compile time.
   2973         if (klass->IsErroneous()) {
   2974           CHECK(self->IsExceptionPending());
   2975         } else {
   2976           CHECK(Runtime::Current()->IsCompiler());
   2977           CHECK_EQ(klass->GetStatus(), mirror::Class::kStatusRetryVerificationAtRuntime);
   2978         }
   2979         return false;
   2980       }
   2981     }
   2982 
   2983     // If the class is kStatusInitializing, either this thread is
   2984     // initializing higher up the stack or another thread has beat us
   2985     // to initializing and we need to wait. Either way, this
   2986     // invocation of InitializeClass will not be responsible for
   2987     // running <clinit> and will return.
   2988     if (klass->GetStatus() == mirror::Class::kStatusInitializing) {
   2989       // We caught somebody else in the act; was it us?
   2990       if (klass->GetClinitThreadId() == self->GetTid()) {
   2991         // Yes. That's fine. Return so we can continue initializing.
   2992         return true;
   2993       }
   2994       // No. That's fine. Wait for another thread to finish initializing.
   2995       return WaitForInitializeClass(klass, self, lock);
   2996     }
   2997 
   2998     if (!ValidateSuperClassDescriptors(klass)) {
   2999       klass->SetStatus(mirror::Class::kStatusError, self);
   3000       return false;
   3001     }
   3002 
   3003     CHECK_EQ(klass->GetStatus(), mirror::Class::kStatusVerified) << PrettyClass(klass);
   3004 
   3005     // From here out other threads may observe that we're initializing and so changes of state
   3006     // require the a notification.
   3007     klass->SetClinitThreadId(self->GetTid());
   3008     klass->SetStatus(mirror::Class::kStatusInitializing, self);
   3009 
   3010     t0 = NanoTime();
   3011   }
   3012 
   3013   // Initialize super classes, must be done while initializing for the JLS.
   3014   if (!klass->IsInterface() && klass->HasSuperClass()) {
   3015     mirror::Class* super_class = klass->GetSuperClass();
   3016     if (!super_class->IsInitialized()) {
   3017       CHECK(!super_class->IsInterface());
   3018       CHECK(can_init_parents);
   3019       bool super_initialized = InitializeClass(super_class, can_init_statics, true);
   3020       if (!super_initialized) {
   3021         // The super class was verified ahead of entering initializing, we should only be here if
   3022         // the super class became erroneous due to initialization.
   3023         CHECK(super_class->IsErroneous() && self->IsExceptionPending())
   3024             << "Super class initialization failed for " << PrettyDescriptor(super_class)
   3025             << " that has unexpected status " << super_class->GetStatus()
   3026             << "\nPending exception:\n"
   3027             << (self->GetException(NULL) != NULL ? self->GetException(NULL)->Dump() : "");
   3028         ObjectLock lock(self, klass);
   3029         // Initialization failed because the super-class is erroneous.
   3030         klass->SetStatus(mirror::Class::kStatusError, self);
   3031         return false;
   3032       }
   3033     }
   3034   }
   3035 
   3036   if (klass->NumStaticFields() > 0) {
   3037     ClassHelper kh(klass);
   3038     const DexFile::ClassDef* dex_class_def = kh.GetClassDef();
   3039     CHECK(dex_class_def != NULL);
   3040     const DexFile& dex_file = kh.GetDexFile();
   3041     EncodedStaticFieldValueIterator it(dex_file, kh.GetDexCache(), klass->GetClassLoader(),
   3042                                        this, *dex_class_def);
   3043     if (it.HasNext()) {
   3044       CHECK(can_init_statics);
   3045       // We reordered the fields, so we need to be able to map the field indexes to the right fields.
   3046       SafeMap<uint32_t, mirror::ArtField*> field_map;
   3047       ConstructFieldMap(dex_file, *dex_class_def, klass, field_map);
   3048       for (size_t i = 0; it.HasNext(); i++, it.Next()) {
   3049         it.ReadValueToField(field_map.Get(i));
   3050       }
   3051     }
   3052   }
   3053 
   3054   mirror::ArtMethod* clinit = klass->FindDeclaredDirectMethod("<clinit>", "()V");
   3055   if (clinit != NULL) {
   3056     CHECK(can_init_statics);
   3057     if (LIKELY(Runtime::Current()->IsStarted())) {
   3058       JValue result;
   3059       clinit->Invoke(self, NULL, 0, &result, 'V');
   3060     } else {
   3061       art::interpreter::EnterInterpreterFromInvoke(self, clinit, NULL, NULL, NULL);
   3062     }
   3063   }
   3064 
   3065   // Opportunistically set static method trampolines to their destination.
   3066   FixupStaticTrampolines(klass);
   3067 
   3068   uint64_t t1 = NanoTime();
   3069 
   3070   bool success = true;
   3071   {
   3072     ObjectLock lock(self, klass);
   3073 
   3074     if (self->IsExceptionPending()) {
   3075       WrapExceptionInInitializer();
   3076       klass->SetStatus(mirror::Class::kStatusError, self);
   3077       success = false;
   3078     } else {
   3079       RuntimeStats* global_stats = Runtime::Current()->GetStats();
   3080       RuntimeStats* thread_stats = self->GetStats();
   3081       ++global_stats->class_init_count;
   3082       ++thread_stats->class_init_count;
   3083       global_stats->class_init_time_ns += (t1 - t0);
   3084       thread_stats->class_init_time_ns += (t1 - t0);
   3085       // Set the class as initialized except if failed to initialize static fields.
   3086       klass->SetStatus(mirror::Class::kStatusInitialized, self);
   3087       if (VLOG_IS_ON(class_linker)) {
   3088         ClassHelper kh(klass);
   3089         LOG(INFO) << "Initialized class " << kh.GetDescriptor() << " from " << kh.GetLocation();
   3090       }
   3091     }
   3092   }
   3093   return success;
   3094 }
   3095 
   3096 bool ClassLinker::WaitForInitializeClass(mirror::Class* klass, Thread* self, ObjectLock& lock)
   3097     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   3098   while (true) {
   3099     self->AssertNoPendingException();
   3100     CHECK(!klass->IsInitialized());
   3101     lock.WaitIgnoringInterrupts();
   3102 
   3103     // When we wake up, repeat the test for init-in-progress.  If
   3104     // there's an exception pending (only possible if
   3105     // "interruptShouldThrow" was set), bail out.
   3106     if (self->IsExceptionPending()) {
   3107       WrapExceptionInInitializer();
   3108       klass->SetStatus(mirror::Class::kStatusError, self);
   3109       return false;
   3110     }
   3111     // Spurious wakeup? Go back to waiting.
   3112     if (klass->GetStatus() == mirror::Class::kStatusInitializing) {
   3113       continue;
   3114     }
   3115     if (klass->GetStatus() == mirror::Class::kStatusVerified && Runtime::Current()->IsCompiler()) {
   3116       // Compile time initialization failed.
   3117       return false;
   3118     }
   3119     if (klass->IsErroneous()) {
   3120       // The caller wants an exception, but it was thrown in a
   3121       // different thread.  Synthesize one here.
   3122       ThrowNoClassDefFoundError("<clinit> failed for class %s; see exception in other thread",
   3123                                 PrettyDescriptor(klass).c_str());
   3124       return false;
   3125     }
   3126     if (klass->IsInitialized()) {
   3127       return true;
   3128     }
   3129     LOG(FATAL) << "Unexpected class status. " << PrettyClass(klass) << " is " << klass->GetStatus();
   3130   }
   3131   LOG(FATAL) << "Not Reached" << PrettyClass(klass);
   3132 }
   3133 
   3134 bool ClassLinker::ValidateSuperClassDescriptors(const mirror::Class* klass) {
   3135   if (klass->IsInterface()) {
   3136     return true;
   3137   }
   3138   // begin with the methods local to the superclass
   3139   if (klass->HasSuperClass() &&
   3140       klass->GetClassLoader() != klass->GetSuperClass()->GetClassLoader()) {
   3141     const mirror::Class* super = klass->GetSuperClass();
   3142     for (int i = super->GetVTable()->GetLength() - 1; i >= 0; --i) {
   3143       const mirror::ArtMethod* method = klass->GetVTable()->Get(i);
   3144       if (method != super->GetVTable()->Get(i) &&
   3145           !IsSameMethodSignatureInDifferentClassContexts(method, super, klass)) {
   3146         ThrowLinkageError(klass, "Class %s method %s resolves differently in superclass %s",
   3147                           PrettyDescriptor(klass).c_str(), PrettyMethod(method).c_str(),
   3148                           PrettyDescriptor(super).c_str());
   3149         return false;
   3150       }
   3151     }
   3152   }
   3153   mirror::IfTable* iftable = klass->GetIfTable();
   3154   for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) {
   3155     mirror::Class* interface = iftable->GetInterface(i);
   3156     if (klass->GetClassLoader() != interface->GetClassLoader()) {
   3157       for (size_t j = 0; j < interface->NumVirtualMethods(); ++j) {
   3158         const mirror::ArtMethod* method = iftable->GetMethodArray(i)->Get(j);
   3159         if (!IsSameMethodSignatureInDifferentClassContexts(method, interface,
   3160                                                            method->GetDeclaringClass())) {
   3161           ThrowLinkageError(klass, "Class %s method %s resolves differently in interface %s",
   3162                             PrettyDescriptor(method->GetDeclaringClass()).c_str(),
   3163                             PrettyMethod(method).c_str(),
   3164                             PrettyDescriptor(interface).c_str());
   3165           return false;
   3166         }
   3167       }
   3168     }
   3169   }
   3170   return true;
   3171 }
   3172 
   3173 // Returns true if classes referenced by the signature of the method are the
   3174 // same classes in klass1 as they are in klass2.
   3175 bool ClassLinker::IsSameMethodSignatureInDifferentClassContexts(const mirror::ArtMethod* method,
   3176                                                                 const mirror::Class* klass1,
   3177                                                                 const mirror::Class* klass2) {
   3178   if (klass1 == klass2) {
   3179     return true;
   3180   }
   3181   const DexFile& dex_file = *method->GetDeclaringClass()->GetDexCache()->GetDexFile();
   3182   const DexFile::ProtoId& proto_id =
   3183       dex_file.GetMethodPrototype(dex_file.GetMethodId(method->GetDexMethodIndex()));
   3184   for (DexFileParameterIterator it(dex_file, proto_id); it.HasNext(); it.Next()) {
   3185     const char* descriptor = it.GetDescriptor();
   3186     if (descriptor == NULL) {
   3187       break;
   3188     }
   3189     if (descriptor[0] == 'L' || descriptor[0] == '[') {
   3190       // Found a non-primitive type.
   3191       if (!IsSameDescriptorInDifferentClassContexts(descriptor, klass1, klass2)) {
   3192         return false;
   3193       }
   3194     }
   3195   }
   3196   // Check the return type
   3197   const char* descriptor = dex_file.GetReturnTypeDescriptor(proto_id);
   3198   if (descriptor[0] == 'L' || descriptor[0] == '[') {
   3199     if (!IsSameDescriptorInDifferentClassContexts(descriptor, klass1, klass2)) {
   3200       return false;
   3201     }
   3202   }
   3203   return true;
   3204 }
   3205 
   3206 // Returns true if the descriptor resolves to the same class in the context of klass1 and klass2.
   3207 bool ClassLinker::IsSameDescriptorInDifferentClassContexts(const char* descriptor,
   3208                                                            const mirror::Class* klass1,
   3209                                                            const mirror::Class* klass2) {
   3210   CHECK(descriptor != NULL);
   3211   CHECK(klass1 != NULL);
   3212   CHECK(klass2 != NULL);
   3213   if (klass1 == klass2) {
   3214     return true;
   3215   }
   3216   mirror::Class* found1 = FindClass(descriptor, klass1->GetClassLoader());
   3217   if (found1 == NULL) {
   3218     Thread::Current()->ClearException();
   3219   }
   3220   mirror::Class* found2 = FindClass(descriptor, klass2->GetClassLoader());
   3221   if (found2 == NULL) {
   3222     Thread::Current()->ClearException();
   3223   }
   3224   return found1 == found2;
   3225 }
   3226 
   3227 bool ClassLinker::EnsureInitialized(mirror::Class* c, bool can_init_fields, bool can_init_parents) {
   3228   DCHECK(c != NULL);
   3229   if (c->IsInitialized()) {
   3230     return true;
   3231   }
   3232 
   3233   bool success = InitializeClass(c, can_init_fields, can_init_parents);
   3234   if (!success) {
   3235     Thread* self = Thread::Current();
   3236     CHECK(self->IsExceptionPending() || !can_init_fields || !can_init_parents) << PrettyClass(c);
   3237   }
   3238   return success;
   3239 }
   3240 
   3241 void ClassLinker::ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
   3242                                     mirror::Class* c, SafeMap<uint32_t, mirror::ArtField*>& field_map) {
   3243   mirror::ClassLoader* cl = c->GetClassLoader();
   3244   const byte* class_data = dex_file.GetClassData(dex_class_def);
   3245   ClassDataItemIterator it(dex_file, class_data);
   3246   for (size_t i = 0; it.HasNextStaticField(); i++, it.Next()) {
   3247     field_map.Put(i, ResolveField(dex_file, it.GetMemberIndex(), c->GetDexCache(), cl, true));
   3248   }
   3249 }
   3250 
   3251 bool ClassLinker::LinkClass(SirtRef<mirror::Class>& klass,
   3252                             mirror::ObjectArray<mirror::Class>* interfaces, Thread* self) {
   3253   CHECK_EQ(mirror::Class::kStatusLoaded, klass->GetStatus());
   3254   if (!LinkSuperClass(klass)) {
   3255     return false;
   3256   }
   3257   if (!LinkMethods(klass, interfaces)) {
   3258     return false;
   3259   }
   3260   if (!LinkInstanceFields(klass)) {
   3261     return false;
   3262   }
   3263   if (!LinkStaticFields(klass)) {
   3264     return false;
   3265   }
   3266   CreateReferenceInstanceOffsets(klass);
   3267   CreateReferenceStaticOffsets(klass);
   3268   CHECK_EQ(mirror::Class::kStatusLoaded, klass->GetStatus());
   3269   klass->SetStatus(mirror::Class::kStatusResolved, self);
   3270   return true;
   3271 }
   3272 
   3273 bool ClassLinker::LoadSuperAndInterfaces(SirtRef<mirror::Class>& klass, const DexFile& dex_file) {
   3274   CHECK_EQ(mirror::Class::kStatusIdx, klass->GetStatus());
   3275   const DexFile::ClassDef& class_def = dex_file.GetClassDef(klass->GetDexClassDefIndex());
   3276   uint16_t super_class_idx = class_def.superclass_idx_;
   3277   if (super_class_idx != DexFile::kDexNoIndex16) {
   3278     mirror::Class* super_class = ResolveType(dex_file, super_class_idx, klass.get());
   3279     if (super_class == NULL) {
   3280       DCHECK(Thread::Current()->IsExceptionPending());
   3281       return false;
   3282     }
   3283     // Verify
   3284     if (!klass->CanAccess(super_class)) {
   3285       ThrowIllegalAccessError(klass.get(), "Class %s extended by class %s is inaccessible",
   3286                               PrettyDescriptor(super_class).c_str(),
   3287                               PrettyDescriptor(klass.get()).c_str());
   3288       return false;
   3289     }
   3290     klass->SetSuperClass(super_class);
   3291   }
   3292   const DexFile::TypeList* interfaces = dex_file.GetInterfacesList(class_def);
   3293   if (interfaces != NULL) {
   3294     for (size_t i = 0; i < interfaces->Size(); i++) {
   3295       uint16_t idx = interfaces->GetTypeItem(i).type_idx_;
   3296       mirror::Class* interface = ResolveType(dex_file, idx, klass.get());
   3297       if (interface == NULL) {
   3298         DCHECK(Thread::Current()->IsExceptionPending());
   3299         return false;
   3300       }
   3301       // Verify
   3302       if (!klass->CanAccess(interface)) {
   3303         // TODO: the RI seemed to ignore this in my testing.
   3304         ThrowIllegalAccessError(klass.get(), "Interface %s implemented by class %s is inaccessible",
   3305                                 PrettyDescriptor(interface).c_str(),
   3306                                 PrettyDescriptor(klass.get()).c_str());
   3307         return false;
   3308       }
   3309     }
   3310   }
   3311   // Mark the class as loaded.
   3312   klass->SetStatus(mirror::Class::kStatusLoaded, NULL);
   3313   return true;
   3314 }
   3315 
   3316 bool ClassLinker::LinkSuperClass(SirtRef<mirror::Class>& klass) {
   3317   CHECK(!klass->IsPrimitive());
   3318   mirror::Class* super = klass->GetSuperClass();
   3319   if (klass.get() == GetClassRoot(kJavaLangObject)) {
   3320     if (super != NULL) {
   3321       ThrowClassFormatError(klass.get(), "java.lang.Object must not have a superclass");
   3322       return false;
   3323     }
   3324     return true;
   3325   }
   3326   if (super == NULL) {
   3327     ThrowLinkageError(klass.get(), "No superclass defined for class %s",
   3328                       PrettyDescriptor(klass.get()).c_str());
   3329     return false;
   3330   }
   3331   // Verify
   3332   if (super->IsFinal() || super->IsInterface()) {
   3333     ThrowIncompatibleClassChangeError(klass.get(), "Superclass %s of %s is %s",
   3334                                       PrettyDescriptor(super).c_str(),
   3335                                       PrettyDescriptor(klass.get()).c_str(),
   3336                                       super->IsFinal() ? "declared final" : "an interface");
   3337     return false;
   3338   }
   3339   if (!klass->CanAccess(super)) {
   3340     ThrowIllegalAccessError(klass.get(), "Superclass %s is inaccessible to class %s",
   3341                             PrettyDescriptor(super).c_str(),
   3342                             PrettyDescriptor(klass.get()).c_str());
   3343     return false;
   3344   }
   3345 
   3346   // Inherit kAccClassIsFinalizable from the superclass in case this class doesn't override finalize.
   3347   if (super->IsFinalizable()) {
   3348     klass->SetFinalizable();
   3349   }
   3350 
   3351   // Inherit reference flags (if any) from the superclass.
   3352   int reference_flags = (super->GetAccessFlags() & kAccReferenceFlagsMask);
   3353   if (reference_flags != 0) {
   3354     klass->SetAccessFlags(klass->GetAccessFlags() | reference_flags);
   3355   }
   3356   // Disallow custom direct subclasses of java.lang.ref.Reference.
   3357   if (init_done_ && super == GetClassRoot(kJavaLangRefReference)) {
   3358     ThrowLinkageError(klass.get(),
   3359                       "Class %s attempts to subclass java.lang.ref.Reference, which is not allowed",
   3360                       PrettyDescriptor(klass.get()).c_str());
   3361     return false;
   3362   }
   3363 
   3364   if (kIsDebugBuild) {
   3365     // Ensure super classes are fully resolved prior to resolving fields..
   3366     while (super != NULL) {
   3367       CHECK(super->IsResolved());
   3368       super = super->GetSuperClass();
   3369     }
   3370   }
   3371   return true;
   3372 }
   3373 
   3374 // Populate the class vtable and itable. Compute return type indices.
   3375 bool ClassLinker::LinkMethods(SirtRef<mirror::Class>& klass,
   3376                               mirror::ObjectArray<mirror::Class>* interfaces) {
   3377   if (klass->IsInterface()) {
   3378     // No vtable.
   3379     size_t count = klass->NumVirtualMethods();
   3380     if (!IsUint(16, count)) {
   3381       ThrowClassFormatError(klass.get(), "Too many methods on interface: %zd", count);
   3382       return false;
   3383     }
   3384     for (size_t i = 0; i < count; ++i) {
   3385       klass->GetVirtualMethodDuringLinking(i)->SetMethodIndex(i);
   3386     }
   3387     // Link interface method tables
   3388     return LinkInterfaceMethods(klass, interfaces);
   3389   } else {
   3390     // Link virtual and interface method tables
   3391     return LinkVirtualMethods(klass) && LinkInterfaceMethods(klass, interfaces);
   3392   }
   3393   return true;
   3394 }
   3395 
   3396 bool ClassLinker::LinkVirtualMethods(SirtRef<mirror::Class>& klass) {
   3397   Thread* self = Thread::Current();
   3398   if (klass->HasSuperClass()) {
   3399     uint32_t max_count = klass->NumVirtualMethods() + klass->GetSuperClass()->GetVTable()->GetLength();
   3400     size_t actual_count = klass->GetSuperClass()->GetVTable()->GetLength();
   3401     CHECK_LE(actual_count, max_count);
   3402     // TODO: do not assign to the vtable field until it is fully constructed.
   3403     SirtRef<mirror::ObjectArray<mirror::ArtMethod> >
   3404       vtable(self, klass->GetSuperClass()->GetVTable()->CopyOf(self, max_count));
   3405     if (UNLIKELY(vtable.get() == NULL)) {
   3406       CHECK(self->IsExceptionPending());  // OOME.
   3407       return false;
   3408     }
   3409     // See if any of our virtual methods override the superclass.
   3410     MethodHelper local_mh(NULL, this);
   3411     MethodHelper super_mh(NULL, this);
   3412     for (size_t i = 0; i < klass->NumVirtualMethods(); ++i) {
   3413       mirror::ArtMethod* local_method = klass->GetVirtualMethodDuringLinking(i);
   3414       local_mh.ChangeMethod(local_method);
   3415       size_t j = 0;
   3416       for (; j < actual_count; ++j) {
   3417         mirror::ArtMethod* super_method = vtable->Get(j);
   3418         super_mh.ChangeMethod(super_method);
   3419         if (local_mh.HasSameNameAndSignature(&super_mh)) {
   3420           if (klass->CanAccessMember(super_method->GetDeclaringClass(), super_method->GetAccessFlags())) {
   3421             if (super_method->IsFinal()) {
   3422               ThrowLinkageError(klass.get(), "Method %s overrides final method in class %s",
   3423                                 PrettyMethod(local_method).c_str(),
   3424                                 super_mh.GetDeclaringClassDescriptor());
   3425               return false;
   3426             }
   3427             vtable->Set(j, local_method);
   3428             local_method->SetMethodIndex(j);
   3429             break;
   3430           } else {
   3431             LOG(WARNING) << "Before Android 4.1, method " << PrettyMethod(local_method)
   3432                          << " would have incorrectly overridden the package-private method in "
   3433                          << PrettyDescriptor(super_mh.GetDeclaringClassDescriptor());
   3434           }
   3435         }
   3436       }
   3437       if (j == actual_count) {
   3438         // Not overriding, append.
   3439         vtable->Set(actual_count, local_method);
   3440         local_method->SetMethodIndex(actual_count);
   3441         actual_count += 1;
   3442       }
   3443     }
   3444     if (!IsUint(16, actual_count)) {
   3445       ThrowClassFormatError(klass.get(), "Too many methods defined on class: %zd", actual_count);
   3446       return false;
   3447     }
   3448     // Shrink vtable if possible
   3449     CHECK_LE(actual_count, max_count);
   3450     if (actual_count < max_count) {
   3451       vtable.reset(vtable->CopyOf(self, actual_count));
   3452       if (UNLIKELY(vtable.get() == NULL)) {
   3453         CHECK(self->IsExceptionPending());  // OOME.
   3454         return false;
   3455       }
   3456     }
   3457     klass->SetVTable(vtable.get());
   3458   } else {
   3459     CHECK(klass.get() == GetClassRoot(kJavaLangObject));
   3460     uint32_t num_virtual_methods = klass->NumVirtualMethods();
   3461     if (!IsUint(16, num_virtual_methods)) {
   3462       ThrowClassFormatError(klass.get(), "Too many methods: %d", num_virtual_methods);
   3463       return false;
   3464     }
   3465     SirtRef<mirror::ObjectArray<mirror::ArtMethod> >
   3466         vtable(self, AllocArtMethodArray(self, num_virtual_methods));
   3467     if (UNLIKELY(vtable.get() == NULL)) {
   3468       CHECK(self->IsExceptionPending());  // OOME.
   3469       return false;
   3470     }
   3471     for (size_t i = 0; i < num_virtual_methods; ++i) {
   3472       mirror::ArtMethod* virtual_method = klass->GetVirtualMethodDuringLinking(i);
   3473       vtable->Set(i, virtual_method);
   3474       virtual_method->SetMethodIndex(i & 0xFFFF);
   3475     }
   3476     klass->SetVTable(vtable.get());
   3477   }
   3478   return true;
   3479 }
   3480 
   3481 bool ClassLinker::LinkInterfaceMethods(SirtRef<mirror::Class>& klass,
   3482                                        mirror::ObjectArray<mirror::Class>* interfaces) {
   3483   size_t super_ifcount;
   3484   if (klass->HasSuperClass()) {
   3485     super_ifcount = klass->GetSuperClass()->GetIfTableCount();
   3486   } else {
   3487     super_ifcount = 0;
   3488   }
   3489   size_t ifcount = super_ifcount;
   3490   ClassHelper kh(klass.get(), this);
   3491   uint32_t num_interfaces = interfaces == NULL ? kh.NumDirectInterfaces() : interfaces->GetLength();
   3492   ifcount += num_interfaces;
   3493   for (size_t i = 0; i < num_interfaces; i++) {
   3494     mirror::Class* interface = interfaces == NULL ? kh.GetDirectInterface(i) : interfaces->Get(i);
   3495     ifcount += interface->GetIfTableCount();
   3496   }
   3497   if (ifcount == 0) {
   3498     // Class implements no interfaces.
   3499     DCHECK_EQ(klass->GetIfTableCount(), 0);
   3500     DCHECK(klass->GetIfTable() == NULL);
   3501     return true;
   3502   }
   3503   if (ifcount == super_ifcount) {
   3504     // Class implements same interfaces as parent, are any of these not marker interfaces?
   3505     bool has_non_marker_interface = false;
   3506     mirror::IfTable* super_iftable = klass->GetSuperClass()->GetIfTable();
   3507     for (size_t i = 0; i < ifcount; ++i) {
   3508       if (super_iftable->GetMethodArrayCount(i) > 0) {
   3509         has_non_marker_interface = true;
   3510         break;
   3511       }
   3512     }
   3513     if (!has_non_marker_interface) {
   3514       // Class just inherits marker interfaces from parent so recycle parent's iftable.
   3515       klass->SetIfTable(super_iftable);
   3516       return true;
   3517     }
   3518   }
   3519   Thread* self = Thread::Current();
   3520   SirtRef<mirror::IfTable> iftable(self, AllocIfTable(self, ifcount));
   3521   if (UNLIKELY(iftable.get() == NULL)) {
   3522     CHECK(self->IsExceptionPending());  // OOME.
   3523     return false;
   3524   }
   3525   if (super_ifcount != 0) {
   3526     mirror::IfTable* super_iftable = klass->GetSuperClass()->GetIfTable();
   3527     for (size_t i = 0; i < super_ifcount; i++) {
   3528       mirror::Class* super_interface = super_iftable->GetInterface(i);
   3529       iftable->SetInterface(i, super_interface);
   3530     }
   3531   }
   3532   // Flatten the interface inheritance hierarchy.
   3533   size_t idx = super_ifcount;
   3534   for (size_t i = 0; i < num_interfaces; i++) {
   3535     mirror::Class* interface = interfaces == NULL ? kh.GetDirectInterface(i) : interfaces->Get(i);
   3536     DCHECK(interface != NULL);
   3537     if (!interface->IsInterface()) {
   3538       ClassHelper ih(interface);
   3539       ThrowIncompatibleClassChangeError(klass.get(), "Class %s implements non-interface class %s",
   3540                                         PrettyDescriptor(klass.get()).c_str(),
   3541                                         PrettyDescriptor(ih.GetDescriptor()).c_str());
   3542       return false;
   3543     }
   3544     // Check if interface is already in iftable
   3545     bool duplicate = false;
   3546     for (size_t j = 0; j < idx; j++) {
   3547       mirror::Class* existing_interface = iftable->GetInterface(j);
   3548       if (existing_interface == interface) {
   3549         duplicate = true;
   3550         break;
   3551       }
   3552     }
   3553     if (!duplicate) {
   3554       // Add this non-duplicate interface.
   3555       iftable->SetInterface(idx++, interface);
   3556       // Add this interface's non-duplicate super-interfaces.
   3557       for (int32_t j = 0; j < interface->GetIfTableCount(); j++) {
   3558         mirror::Class* super_interface = interface->GetIfTable()->GetInterface(j);
   3559         bool super_duplicate = false;
   3560         for (size_t k = 0; k < idx; k++) {
   3561           mirror::Class* existing_interface = iftable->GetInterface(k);
   3562           if (existing_interface == super_interface) {
   3563             super_duplicate = true;
   3564             break;
   3565           }
   3566         }
   3567         if (!super_duplicate) {
   3568           iftable->SetInterface(idx++, super_interface);
   3569         }
   3570       }
   3571     }
   3572   }
   3573   // Shrink iftable in case duplicates were found
   3574   if (idx < ifcount) {
   3575     iftable.reset(down_cast<mirror::IfTable*>(iftable->CopyOf(self, idx * mirror::IfTable::kMax)));
   3576     if (UNLIKELY(iftable.get() == NULL)) {
   3577       CHECK(self->IsExceptionPending());  // OOME.
   3578       return false;
   3579     }
   3580     ifcount = idx;
   3581   } else {
   3582     CHECK_EQ(idx, ifcount);
   3583   }
   3584   klass->SetIfTable(iftable.get());
   3585 
   3586   // If we're an interface, we don't need the vtable pointers, so we're done.
   3587   if (klass->IsInterface()) {
   3588     return true;
   3589   }
   3590   std::vector<mirror::ArtMethod*> miranda_list;
   3591   MethodHelper vtable_mh(NULL, this);
   3592   MethodHelper interface_mh(NULL, this);
   3593   for (size_t i = 0; i < ifcount; ++i) {
   3594     mirror::Class* interface = iftable->GetInterface(i);
   3595     size_t num_methods = interface->NumVirtualMethods();
   3596     if (num_methods > 0) {
   3597       mirror::ObjectArray<mirror::ArtMethod>* method_array =
   3598           AllocArtMethodArray(self, num_methods);
   3599       if (UNLIKELY(method_array == NULL)) {
   3600         CHECK(self->IsExceptionPending());  // OOME.
   3601         return false;
   3602       }
   3603       iftable->SetMethodArray(i, method_array);
   3604       mirror::ObjectArray<mirror::ArtMethod>* vtable = klass->GetVTableDuringLinking();
   3605       for (size_t j = 0; j < num_methods; ++j) {
   3606         mirror::ArtMethod* interface_method = interface->GetVirtualMethod(j);
   3607         interface_mh.ChangeMethod(interface_method);
   3608         int32_t k;
   3609         // For each method listed in the interface's method list, find the
   3610         // matching method in our class's method list.  We want to favor the
   3611         // subclass over the superclass, which just requires walking
   3612         // back from the end of the vtable.  (This only matters if the
   3613         // superclass defines a private method and this class redefines
   3614         // it -- otherwise it would use the same vtable slot.  In .dex files
   3615         // those don't end up in the virtual method table, so it shouldn't
   3616         // matter which direction we go.  We walk it backward anyway.)
   3617         for (k = vtable->GetLength() - 1; k >= 0; --k) {
   3618           mirror::ArtMethod* vtable_method = vtable->Get(k);
   3619           vtable_mh.ChangeMethod(vtable_method);
   3620           if (interface_mh.HasSameNameAndSignature(&vtable_mh)) {
   3621             if (!vtable_method->IsAbstract() && !vtable_method->IsPublic()) {
   3622               ThrowIllegalAccessError(klass.get(),
   3623                                       "Method '%s' implementing interface method '%s' is not public",
   3624                                       PrettyMethod(vtable_method).c_str(),
   3625                                       PrettyMethod(interface_method).c_str());
   3626               return false;
   3627             }
   3628             method_array->Set(j, vtable_method);
   3629             break;
   3630           }
   3631         }
   3632         if (k < 0) {
   3633           SirtRef<mirror::ArtMethod> miranda_method(self, NULL);
   3634           for (size_t mir = 0; mir < miranda_list.size(); mir++) {
   3635             mirror::ArtMethod* mir_method = miranda_list[mir];
   3636             vtable_mh.ChangeMethod(mir_method);
   3637             if (interface_mh.HasSameNameAndSignature(&vtable_mh)) {
   3638               miranda_method.reset(miranda_list[mir]);
   3639               break;
   3640             }
   3641           }
   3642           if (miranda_method.get() == NULL) {
   3643             // Point the interface table at a phantom slot.
   3644             miranda_method.reset(down_cast<mirror::ArtMethod*>(interface_method->Clone(self)));
   3645             if (UNLIKELY(miranda_method.get() == NULL)) {
   3646               CHECK(self->IsExceptionPending());  // OOME.
   3647               return false;
   3648             }
   3649 #ifdef MOVING_GARBAGE_COLLECTOR
   3650             // TODO: If a methods move then the miranda_list may hold stale references.
   3651             UNIMPLEMENTED(FATAL);
   3652 #endif
   3653             miranda_list.push_back(miranda_method.get());
   3654           }
   3655           method_array->Set(j, miranda_method.get());
   3656         }
   3657       }
   3658     }
   3659   }
   3660   if (!miranda_list.empty()) {
   3661     int old_method_count = klass->NumVirtualMethods();
   3662     int new_method_count = old_method_count + miranda_list.size();
   3663     mirror::ObjectArray<mirror::ArtMethod>* virtuals;
   3664     if (old_method_count == 0) {
   3665       virtuals = AllocArtMethodArray(self, new_method_count);
   3666     } else {
   3667       virtuals = klass->GetVirtualMethods()->CopyOf(self, new_method_count);
   3668     }
   3669     if (UNLIKELY(virtuals == NULL)) {
   3670       CHECK(self->IsExceptionPending());  // OOME.
   3671       return false;
   3672     }
   3673     klass->SetVirtualMethods(virtuals);
   3674 
   3675     SirtRef<mirror::ObjectArray<mirror::ArtMethod> >
   3676         vtable(self, klass->GetVTableDuringLinking());
   3677     CHECK(vtable.get() != NULL);
   3678     int old_vtable_count = vtable->GetLength();
   3679     int new_vtable_count = old_vtable_count + miranda_list.size();
   3680     vtable.reset(vtable->CopyOf(self, new_vtable_count));
   3681     if (UNLIKELY(vtable.get() == NULL)) {
   3682       CHECK(self->IsExceptionPending());  // OOME.
   3683       return false;
   3684     }
   3685     for (size_t i = 0; i < miranda_list.size(); ++i) {
   3686       mirror::ArtMethod* method = miranda_list[i];
   3687       // Leave the declaring class alone as type indices are relative to it
   3688       method->SetAccessFlags(method->GetAccessFlags() | kAccMiranda);
   3689       method->SetMethodIndex(0xFFFF & (old_vtable_count + i));
   3690       klass->SetVirtualMethod(old_method_count + i, method);
   3691       vtable->Set(old_vtable_count + i, method);
   3692     }
   3693     // TODO: do not assign to the vtable field until it is fully constructed.
   3694     klass->SetVTable(vtable.get());
   3695   }
   3696 
   3697   mirror::ObjectArray<mirror::ArtMethod>* vtable = klass->GetVTableDuringLinking();
   3698   for (int i = 0; i < vtable->GetLength(); ++i) {
   3699     CHECK(vtable->Get(i) != NULL);
   3700   }
   3701 
   3702 //  klass->DumpClass(std::cerr, Class::kDumpClassFullDetail);
   3703 
   3704   return true;
   3705 }
   3706 
   3707 bool ClassLinker::LinkInstanceFields(SirtRef<mirror::Class>& klass) {
   3708   CHECK(klass.get() != NULL);
   3709   return LinkFields(klass, false);
   3710 }
   3711 
   3712 bool ClassLinker::LinkStaticFields(SirtRef<mirror::Class>& klass) {
   3713   CHECK(klass.get() != NULL);
   3714   size_t allocated_class_size = klass->GetClassSize();
   3715   bool success = LinkFields(klass, true);
   3716   CHECK_EQ(allocated_class_size, klass->GetClassSize());
   3717   return success;
   3718 }
   3719 
   3720 struct LinkFieldsComparator {
   3721   explicit LinkFieldsComparator(FieldHelper* fh)
   3722       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
   3723       : fh_(fh) {}
   3724   // No thread safety analysis as will be called from STL. Checked lock held in constructor.
   3725   bool operator()(const mirror::ArtField* field1, const mirror::ArtField* field2)
   3726       NO_THREAD_SAFETY_ANALYSIS {
   3727     // First come reference fields, then 64-bit, and finally 32-bit
   3728     fh_->ChangeField(field1);
   3729     Primitive::Type type1 = fh_->GetTypeAsPrimitiveType();
   3730     fh_->ChangeField(field2);
   3731     Primitive::Type type2 = fh_->GetTypeAsPrimitiveType();
   3732     bool isPrimitive1 = type1 != Primitive::kPrimNot;
   3733     bool isPrimitive2 = type2 != Primitive::kPrimNot;
   3734     bool is64bit1 = isPrimitive1 && (type1 == Primitive::kPrimLong || type1 == Primitive::kPrimDouble);
   3735     bool is64bit2 = isPrimitive2 && (type2 == Primitive::kPrimLong || type2 == Primitive::kPrimDouble);
   3736     int order1 = (!isPrimitive1 ? 0 : (is64bit1 ? 1 : 2));
   3737     int order2 = (!isPrimitive2 ? 0 : (is64bit2 ? 1 : 2));
   3738     if (order1 != order2) {
   3739       return order1 < order2;
   3740     }
   3741 
   3742     // same basic group? then sort by string.
   3743     fh_->ChangeField(field1);
   3744     StringPiece name1(fh_->GetName());
   3745     fh_->ChangeField(field2);
   3746     StringPiece name2(fh_->GetName());
   3747     return name1 < name2;
   3748   }
   3749 
   3750   FieldHelper* fh_;
   3751 };
   3752 
   3753 bool ClassLinker::LinkFields(SirtRef<mirror::Class>& klass, bool is_static) {
   3754   size_t num_fields =
   3755       is_static ? klass->NumStaticFields() : klass->NumInstanceFields();
   3756 
   3757   mirror::ObjectArray<mirror::ArtField>* fields =
   3758       is_static ? klass->GetSFields() : klass->GetIFields();
   3759 
   3760   // Initialize size and field_offset
   3761   size_t size;
   3762   MemberOffset field_offset(0);
   3763   if (is_static) {
   3764     size = klass->GetClassSize();
   3765     field_offset = mirror::Class::FieldsOffset();
   3766   } else {
   3767     mirror::Class* super_class = klass->GetSuperClass();
   3768     if (super_class != NULL) {
   3769       CHECK(super_class->IsResolved());
   3770       field_offset = MemberOffset(super_class->GetObjectSize());
   3771     }
   3772     size = field_offset.Uint32Value();
   3773   }
   3774 
   3775   CHECK_EQ(num_fields == 0, fields == NULL);
   3776 
   3777   // we want a relatively stable order so that adding new fields
   3778   // minimizes disruption of C++ version such as Class and Method.
   3779   std::deque<mirror::ArtField*> grouped_and_sorted_fields;
   3780   for (size_t i = 0; i < num_fields; i++) {
   3781     grouped_and_sorted_fields.push_back(fields->Get(i));
   3782   }
   3783   FieldHelper fh(NULL, this);
   3784   std::sort(grouped_and_sorted_fields.begin(),
   3785             grouped_and_sorted_fields.end(),
   3786             LinkFieldsComparator(&fh));
   3787 
   3788   // References should be at the front.
   3789   size_t current_field = 0;
   3790   size_t num_reference_fields = 0;
   3791   for (; current_field < num_fields; current_field++) {
   3792     mirror::ArtField* field = grouped_and_sorted_fields.front();
   3793     fh.ChangeField(field);
   3794     Primitive::Type type = fh.GetTypeAsPrimitiveType();
   3795     bool isPrimitive = type != Primitive::kPrimNot;
   3796     if (isPrimitive) {
   3797       break;  // past last reference, move on to the next phase
   3798     }
   3799     grouped_and_sorted_fields.pop_front();
   3800     num_reference_fields++;
   3801     fields->Set(current_field, field);
   3802     field->SetOffset(field_offset);
   3803     field_offset = MemberOffset(field_offset.Uint32Value() + sizeof(uint32_t));
   3804   }
   3805 
   3806   // Now we want to pack all of the double-wide fields together.  If
   3807   // we're not aligned, though, we want to shuffle one 32-bit field
   3808   // into place.  If we can't find one, we'll have to pad it.
   3809   if (current_field != num_fields && !IsAligned<8>(field_offset.Uint32Value())) {
   3810     for (size_t i = 0; i < grouped_and_sorted_fields.size(); i++) {
   3811       mirror::ArtField* field = grouped_and_sorted_fields[i];
   3812       fh.ChangeField(field);
   3813       Primitive::Type type = fh.GetTypeAsPrimitiveType();
   3814       CHECK(type != Primitive::kPrimNot);  // should only be working on primitive types
   3815       if (type == Primitive::kPrimLong || type == Primitive::kPrimDouble) {
   3816         continue;
   3817       }
   3818       fields->Set(current_field++, field);
   3819       field->SetOffset(field_offset);
   3820       // drop the consumed field
   3821       grouped_and_sorted_fields.erase(grouped_and_sorted_fields.begin() + i);
   3822       break;
   3823     }
   3824     // whether we found a 32-bit field for padding or not, we advance
   3825     field_offset = MemberOffset(field_offset.Uint32Value() + sizeof(uint32_t));
   3826   }
   3827 
   3828   // Alignment is good, shuffle any double-wide fields forward, and
   3829   // finish assigning field offsets to all fields.
   3830   DCHECK(current_field == num_fields || IsAligned<8>(field_offset.Uint32Value()));
   3831   while (!grouped_and_sorted_fields.empty()) {
   3832     mirror::ArtField* field = grouped_and_sorted_fields.front();
   3833     grouped_and_sorted_fields.pop_front();
   3834     fh.ChangeField(field);
   3835     Primitive::Type type = fh.GetTypeAsPrimitiveType();
   3836     CHECK(type != Primitive::kPrimNot);  // should only be working on primitive types
   3837     fields->Set(current_field, field);
   3838     field->SetOffset(field_offset);
   3839     field_offset = MemberOffset(field_offset.Uint32Value() +
   3840                                 ((type == Primitive::kPrimLong || type == Primitive::kPrimDouble)
   3841                                  ? sizeof(uint64_t)
   3842                                  : sizeof(uint32_t)));
   3843     current_field++;
   3844   }
   3845 
   3846   // We lie to the GC about the java.lang.ref.Reference.referent field, so it doesn't scan it.
   3847   if (!is_static &&
   3848       StringPiece(ClassHelper(klass.get(), this).GetDescriptor()) == "Ljava/lang/ref/Reference;") {
   3849     // We know there are no non-reference fields in the Reference classes, and we know
   3850     // that 'referent' is alphabetically last, so this is easy...
   3851     CHECK_EQ(num_reference_fields, num_fields);
   3852     fh.ChangeField(fields->Get(num_fields - 1));
   3853     CHECK_STREQ(fh.GetName(), "referent");
   3854     --num_reference_fields;
   3855   }
   3856 
   3857 #ifndef NDEBUG
   3858   // Make sure that all reference fields appear before
   3859   // non-reference fields, and all double-wide fields are aligned.
   3860   bool seen_non_ref = false;
   3861   for (size_t i = 0; i < num_fields; i++) {
   3862     mirror::ArtField* field = fields->Get(i);
   3863     if (false) {  // enable to debug field layout
   3864       LOG(INFO) << "LinkFields: " << (is_static ? "static" : "instance")
   3865                 << " class=" << PrettyClass(klass.get())
   3866                 << " field=" << PrettyField(field)
   3867                 << " offset=" << field->GetField32(MemberOffset(mirror::ArtField::OffsetOffset()),
   3868                                                    false);
   3869     }
   3870     fh.ChangeField(field);
   3871     Primitive::Type type = fh.GetTypeAsPrimitiveType();
   3872     bool is_primitive = type != Primitive::kPrimNot;
   3873     if (StringPiece(ClassHelper(klass.get(), this).GetDescriptor()) == "Ljava/lang/ref/Reference;" &&
   3874         StringPiece(fh.GetName()) == "referent") {
   3875       is_primitive = true;  // We lied above, so we have to expect a lie here.
   3876     }
   3877     if (is_primitive) {
   3878       if (!seen_non_ref) {
   3879         seen_non_ref = true;
   3880         DCHECK_EQ(num_reference_fields, i);
   3881       }
   3882     } else {
   3883       DCHECK(!seen_non_ref);
   3884     }
   3885   }
   3886   if (!seen_non_ref) {
   3887     DCHECK_EQ(num_fields, num_reference_fields);
   3888   }
   3889 #endif
   3890   size = field_offset.Uint32Value();
   3891   // Update klass
   3892   if (is_static) {
   3893     klass->SetNumReferenceStaticFields(num_reference_fields);
   3894     klass->SetClassSize(size);
   3895   } else {
   3896     klass->SetNumReferenceInstanceFields(num_reference_fields);
   3897     if (!klass->IsVariableSize()) {
   3898       DCHECK_GE(size, sizeof(mirror::Object)) << ClassHelper(klass.get(), this).GetDescriptor();
   3899       klass->SetObjectSize(size);
   3900     }
   3901   }
   3902   return true;
   3903 }
   3904 
   3905 //  Set the bitmap of reference offsets, refOffsets, from the ifields
   3906 //  list.
   3907 void ClassLinker::CreateReferenceInstanceOffsets(SirtRef<mirror::Class>& klass) {
   3908   uint32_t reference_offsets = 0;
   3909   mirror::Class* super_class = klass->GetSuperClass();
   3910   if (super_class != NULL) {
   3911     reference_offsets = super_class->GetReferenceInstanceOffsets();
   3912     // If our superclass overflowed, we don't stand a chance.
   3913     if (reference_offsets == CLASS_WALK_SUPER) {
   3914       klass->SetReferenceInstanceOffsets(reference_offsets);
   3915       return;
   3916     }
   3917   }
   3918   CreateReferenceOffsets(klass, false, reference_offsets);
   3919 }
   3920 
   3921 void ClassLinker::CreateReferenceStaticOffsets(SirtRef<mirror::Class>& klass) {
   3922   CreateReferenceOffsets(klass, true, 0);
   3923 }
   3924 
   3925 void ClassLinker::CreateReferenceOffsets(SirtRef<mirror::Class>& klass, bool is_static,
   3926                                          uint32_t reference_offsets) {
   3927   size_t num_reference_fields =
   3928       is_static ? klass->NumReferenceStaticFieldsDuringLinking()
   3929                 : klass->NumReferenceInstanceFieldsDuringLinking();
   3930   const mirror::ObjectArray<mirror::ArtField>* fields =
   3931       is_static ? klass->GetSFields() : klass->GetIFields();
   3932   // All of the fields that contain object references are guaranteed
   3933   // to be at the beginning of the fields list.
   3934   for (size_t i = 0; i < num_reference_fields; ++i) {
   3935     // Note that byte_offset is the offset from the beginning of
   3936     // object, not the offset into instance data
   3937     const mirror::ArtField* field = fields->Get(i);
   3938     MemberOffset byte_offset = field->GetOffsetDuringLinking();
   3939     CHECK_EQ(byte_offset.Uint32Value() & (CLASS_OFFSET_ALIGNMENT - 1), 0U);
   3940     if (CLASS_CAN_ENCODE_OFFSET(byte_offset.Uint32Value())) {
   3941       uint32_t new_bit = CLASS_BIT_FROM_OFFSET(byte_offset.Uint32Value());
   3942       CHECK_NE(new_bit, 0U);
   3943       reference_offsets |= new_bit;
   3944     } else {
   3945       reference_offsets = CLASS_WALK_SUPER;
   3946       break;
   3947     }
   3948   }
   3949   // Update fields in klass
   3950   if (is_static) {
   3951     klass->SetReferenceStaticOffsets(reference_offsets);
   3952   } else {
   3953     klass->SetReferenceInstanceOffsets(reference_offsets);
   3954   }
   3955 }
   3956 
   3957 mirror::String* ClassLinker::ResolveString(const DexFile& dex_file,
   3958                                            uint32_t string_idx, mirror::DexCache* dex_cache) {
   3959   DCHECK(dex_cache != NULL);
   3960   mirror::String* resolved = dex_cache->GetResolvedString(string_idx);
   3961   if (resolved != NULL) {
   3962     return resolved;
   3963   }
   3964   const DexFile::StringId& string_id = dex_file.GetStringId(string_idx);
   3965   int32_t utf16_length = dex_file.GetStringLength(string_id);
   3966   const char* utf8_data = dex_file.GetStringData(string_id);
   3967   mirror::String* string = intern_table_->InternStrong(utf16_length, utf8_data);
   3968   dex_cache->SetResolvedString(string_idx, string);
   3969   return string;
   3970 }
   3971 
   3972 mirror::Class* ClassLinker::ResolveType(const DexFile& dex_file,
   3973                                         uint16_t type_idx,
   3974                                         mirror::DexCache* dex_cache,
   3975                                         mirror::ClassLoader* class_loader) {
   3976   DCHECK(dex_cache != NULL);
   3977   mirror::Class* resolved = dex_cache->GetResolvedType(type_idx);
   3978   if (resolved == NULL) {
   3979     const char* descriptor = dex_file.StringByTypeIdx(type_idx);
   3980     resolved = FindClass(descriptor, class_loader);
   3981     if (resolved != NULL) {
   3982       // TODO: we used to throw here if resolved's class loader was not the
   3983       //       boot class loader. This was to permit different classes with the
   3984       //       same name to be loaded simultaneously by different loaders
   3985       dex_cache->SetResolvedType(type_idx, resolved);
   3986     } else {
   3987       Thread* self = Thread::Current();
   3988       CHECK(self->IsExceptionPending())
   3989           << "Expected pending exception for failed resolution of: " << descriptor;
   3990       // Convert a ClassNotFoundException to a NoClassDefFoundError.
   3991       SirtRef<mirror::Throwable> cause(self, self->GetException(NULL));
   3992       if (cause->InstanceOf(GetClassRoot(kJavaLangClassNotFoundException))) {
   3993         Thread::Current()->ClearException();
   3994         ThrowNoClassDefFoundError("Failed resolution of: %s", descriptor);
   3995         self->GetException(NULL)->SetCause(cause.get());
   3996       }
   3997     }
   3998   }
   3999   DCHECK((resolved == NULL) || resolved->IsResolved() || resolved->IsErroneous())
   4000           << PrettyDescriptor(resolved) << " " << resolved->GetStatus();
   4001   return resolved;
   4002 }
   4003 
   4004 mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file,
   4005                                                    uint32_t method_idx,
   4006                                                    mirror::DexCache* dex_cache,
   4007                                                    mirror::ClassLoader* class_loader,
   4008                                                    const mirror::ArtMethod* referrer,
   4009                                                    InvokeType type) {
   4010   DCHECK(dex_cache != NULL);
   4011   // Check for hit in the dex cache.
   4012   mirror::ArtMethod* resolved = dex_cache->GetResolvedMethod(method_idx);
   4013   if (resolved != NULL) {
   4014     return resolved;
   4015   }
   4016   // Fail, get the declaring class.
   4017   const DexFile::MethodId& method_id = dex_file.GetMethodId(method_idx);
   4018   mirror::Class* klass = ResolveType(dex_file, method_id.class_idx_, dex_cache, class_loader);
   4019   if (klass == NULL) {
   4020     DCHECK(Thread::Current()->IsExceptionPending());
   4021     return NULL;
   4022   }
   4023   // Scan using method_idx, this saves string compares but will only hit for matching dex
   4024   // caches/files.
   4025   switch (type) {
   4026     case kDirect:  // Fall-through.
   4027     case kStatic:
   4028       resolved = klass->FindDirectMethod(dex_cache, method_idx);
   4029       break;
   4030     case kInterface:
   4031       resolved = klass->FindInterfaceMethod(dex_cache, method_idx);
   4032       DCHECK(resolved == NULL || resolved->GetDeclaringClass()->IsInterface());
   4033       break;
   4034     case kSuper:  // Fall-through.
   4035     case kVirtual:
   4036       resolved = klass->FindVirtualMethod(dex_cache, method_idx);
   4037       break;
   4038     default:
   4039       LOG(FATAL) << "Unreachable - invocation type: " << type;
   4040   }
   4041   if (resolved == NULL) {
   4042     // Search by name, which works across dex files.
   4043     const char* name = dex_file.StringDataByIdx(method_id.name_idx_);
   4044     std::string signature(dex_file.CreateMethodSignature(method_id.proto_idx_, NULL));
   4045     switch (type) {
   4046       case kDirect:  // Fall-through.
   4047       case kStatic:
   4048         resolved = klass->FindDirectMethod(name, signature);
   4049         break;
   4050       case kInterface:
   4051         resolved = klass->FindInterfaceMethod(name, signature);
   4052         DCHECK(resolved == NULL || resolved->GetDeclaringClass()->IsInterface());
   4053         break;
   4054       case kSuper:  // Fall-through.
   4055       case kVirtual:
   4056         resolved = klass->FindVirtualMethod(name, signature);
   4057         break;
   4058     }
   4059   }
   4060   if (resolved != NULL) {
   4061     // We found a method, check for incompatible class changes.
   4062     if (resolved->CheckIncompatibleClassChange(type)) {
   4063       resolved = NULL;
   4064     }
   4065   }
   4066   if (resolved != NULL) {
   4067     // Be a good citizen and update the dex cache to speed subsequent calls.
   4068     dex_cache->SetResolvedMethod(method_idx, resolved);
   4069     return resolved;
   4070   } else {
   4071     // We failed to find the method which means either an access error, an incompatible class
   4072     // change, or no such method. First try to find the method among direct and virtual methods.
   4073     const char* name = dex_file.StringDataByIdx(method_id.name_idx_);
   4074     std::string signature(dex_file.CreateMethodSignature(method_id.proto_idx_, NULL));
   4075     switch (type) {
   4076       case kDirect:
   4077       case kStatic:
   4078         resolved = klass->FindVirtualMethod(name, signature);
   4079         break;
   4080       case kInterface:
   4081       case kVirtual:
   4082       case kSuper:
   4083         resolved = klass->FindDirectMethod(name, signature);
   4084         break;
   4085     }
   4086 
   4087     // If we found something, check that it can be accessed by the referrer.
   4088     if (resolved != NULL && referrer != NULL) {
   4089       mirror::Class* methods_class = resolved->GetDeclaringClass();
   4090       mirror::Class* referring_class = referrer->GetDeclaringClass();
   4091       if (!referring_class->CanAccess(methods_class)) {
   4092         ThrowIllegalAccessErrorClassForMethodDispatch(referring_class, methods_class,
   4093                                                       referrer, resolved, type);
   4094         return NULL;
   4095       } else if (!referring_class->CanAccessMember(methods_class,
   4096                                                    resolved->GetAccessFlags())) {
   4097         ThrowIllegalAccessErrorMethod(referring_class, resolved);
   4098         return NULL;
   4099       }
   4100     }
   4101 
   4102     // Otherwise, throw an IncompatibleClassChangeError if we found something, and check interface
   4103     // methods and throw if we find the method there. If we find nothing, throw a NoSuchMethodError.
   4104     switch (type) {
   4105       case kDirect:
   4106       case kStatic:
   4107         if (resolved != NULL) {
   4108           ThrowIncompatibleClassChangeError(type, kVirtual, resolved, referrer);
   4109         } else {
   4110           resolved = klass->FindInterfaceMethod(name, signature);
   4111           if (resolved != NULL) {
   4112             ThrowIncompatibleClassChangeError(type, kInterface, resolved, referrer);
   4113           } else {
   4114             ThrowNoSuchMethodError(type, klass, name, signature);
   4115           }
   4116         }
   4117         break;
   4118       case kInterface:
   4119         if (resolved != NULL) {
   4120           ThrowIncompatibleClassChangeError(type, kDirect, resolved, referrer);
   4121         } else {
   4122           resolved = klass->FindVirtualMethod(name, signature);
   4123           if (resolved != NULL) {
   4124             ThrowIncompatibleClassChangeError(type, kVirtual, resolved, referrer);
   4125           } else {
   4126             ThrowNoSuchMethodError(type, klass, name, signature);
   4127           }
   4128         }
   4129         break;
   4130       case kSuper:
   4131         ThrowNoSuchMethodError(type, klass, name, signature);
   4132         break;
   4133       case kVirtual:
   4134         if (resolved != NULL) {
   4135           ThrowIncompatibleClassChangeError(type, kDirect, resolved, referrer);
   4136         } else {
   4137           resolved = klass->FindInterfaceMethod(name, signature);
   4138           if (resolved != NULL) {
   4139             ThrowIncompatibleClassChangeError(type, kInterface, resolved, referrer);
   4140           } else {
   4141             ThrowNoSuchMethodError(type, klass, name, signature);
   4142           }
   4143         }
   4144         break;
   4145     }
   4146     DCHECK(Thread::Current()->IsExceptionPending());
   4147     return NULL;
   4148   }
   4149 }
   4150 
   4151 mirror::ArtField* ClassLinker::ResolveField(const DexFile& dex_file,
   4152                                          uint32_t field_idx,
   4153                                          mirror::DexCache* dex_cache,
   4154                                          mirror::ClassLoader* class_loader,
   4155                                          bool is_static) {
   4156   DCHECK(dex_cache != NULL);
   4157   mirror::ArtField* resolved = dex_cache->GetResolvedField(field_idx);
   4158   if (resolved != NULL) {
   4159     return resolved;
   4160   }
   4161   const DexFile::FieldId& field_id = dex_file.GetFieldId(field_idx);
   4162   mirror::Class* klass = ResolveType(dex_file, field_id.class_idx_, dex_cache, class_loader);
   4163   if (klass == NULL) {
   4164     DCHECK(Thread::Current()->IsExceptionPending());
   4165     return NULL;
   4166   }
   4167 
   4168   if (is_static) {
   4169     resolved = klass->FindStaticField(dex_cache, field_idx);
   4170   } else {
   4171     resolved = klass->FindInstanceField(dex_cache, field_idx);
   4172   }
   4173 
   4174   if (resolved == NULL) {
   4175     const char* name = dex_file.GetFieldName(field_id);
   4176     const char* type = dex_file.GetFieldTypeDescriptor(field_id);
   4177     if (is_static) {
   4178       resolved = klass->FindStaticField(name, type);
   4179     } else {
   4180       resolved = klass->FindInstanceField(name, type);
   4181     }
   4182     if (resolved == NULL) {
   4183       ThrowNoSuchFieldError(is_static ? "static " : "instance ", klass, type, name);
   4184       return NULL;
   4185     }
   4186   }
   4187   dex_cache->SetResolvedField(field_idx, resolved);
   4188   return resolved;
   4189 }
   4190 
   4191 mirror::ArtField* ClassLinker::ResolveFieldJLS(const DexFile& dex_file,
   4192                                             uint32_t field_idx,
   4193                                             mirror::DexCache* dex_cache,
   4194                                             mirror::ClassLoader* class_loader) {
   4195   DCHECK(dex_cache != NULL);
   4196   mirror::ArtField* resolved = dex_cache->GetResolvedField(field_idx);
   4197   if (resolved != NULL) {
   4198     return resolved;
   4199   }
   4200   const DexFile::FieldId& field_id = dex_file.GetFieldId(field_idx);
   4201   mirror::Class* klass = ResolveType(dex_file, field_id.class_idx_, dex_cache, class_loader);
   4202   if (klass == NULL) {
   4203     DCHECK(Thread::Current()->IsExceptionPending());
   4204     return NULL;
   4205   }
   4206 
   4207   const char* name = dex_file.GetFieldName(field_id);
   4208   const char* type = dex_file.GetFieldTypeDescriptor(field_id);
   4209   resolved = klass->FindField(name, type);
   4210   if (resolved != NULL) {
   4211     dex_cache->SetResolvedField(field_idx, resolved);
   4212   } else {
   4213     ThrowNoSuchFieldError("", klass, type, name);
   4214   }
   4215   return resolved;
   4216 }
   4217 
   4218 const char* ClassLinker::MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer,
   4219                                       uint32_t* length) {
   4220   mirror::Class* declaring_class = referrer->GetDeclaringClass();
   4221   mirror::DexCache* dex_cache = declaring_class->GetDexCache();
   4222   const DexFile& dex_file = *dex_cache->GetDexFile();
   4223   const DexFile::MethodId& method_id = dex_file.GetMethodId(method_idx);
   4224   return dex_file.GetMethodShorty(method_id, length);
   4225 }
   4226 
   4227 void ClassLinker::DumpAllClasses(int flags) {
   4228   if (dex_cache_image_class_lookup_required_) {
   4229     MoveImageClassesToClassTable();
   4230   }
   4231   // TODO: at the time this was written, it wasn't safe to call PrettyField with the ClassLinker
   4232   // lock held, because it might need to resolve a field's type, which would try to take the lock.
   4233   std::vector<mirror::Class*> all_classes;
   4234   {
   4235     ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
   4236     for (const std::pair<size_t, mirror::Class*>& it : class_table_) {
   4237       all_classes.push_back(it.second);
   4238     }
   4239   }
   4240 
   4241   for (size_t i = 0; i < all_classes.size(); ++i) {
   4242     all_classes[i]->DumpClass(std::cerr, flags);
   4243   }
   4244 }
   4245 
   4246 void ClassLinker::DumpForSigQuit(std::ostream& os) {
   4247   if (dex_cache_image_class_lookup_required_) {
   4248     MoveImageClassesToClassTable();
   4249   }
   4250   ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
   4251   os << "Loaded classes: " << class_table_.size() << " allocated classes\n";
   4252 }
   4253 
   4254 size_t ClassLinker::NumLoadedClasses() {
   4255   if (dex_cache_image_class_lookup_required_) {
   4256     MoveImageClassesToClassTable();
   4257   }
   4258   ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
   4259   return class_table_.size();
   4260 }
   4261 
   4262 pid_t ClassLinker::GetClassesLockOwner() {
   4263   return Locks::classlinker_classes_lock_->GetExclusiveOwnerTid();
   4264 }
   4265 
   4266 pid_t ClassLinker::GetDexLockOwner() {
   4267   return dex_lock_.GetExclusiveOwnerTid();
   4268 }
   4269 
   4270 void ClassLinker::SetClassRoot(ClassRoot class_root, mirror::Class* klass) {
   4271   DCHECK(!init_done_);
   4272 
   4273   DCHECK(klass != NULL);
   4274   DCHECK(klass->GetClassLoader() == NULL);
   4275 
   4276   DCHECK(class_roots_ != NULL);
   4277   DCHECK(class_roots_->Get(class_root) == NULL);
   4278   class_roots_->Set(class_root, klass);
   4279 }
   4280 
   4281 }  // namespace art
   4282