class_linker.cc revision 756ee4e090bc1e1812b41fb7b4661df601a32ef9
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
71namespace art {
72
73static void ThrowNoClassDefFoundError(const char* fmt, ...)
74    __attribute__((__format__(__printf__, 1, 2)))
75    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
76static 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
85static 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
108static 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
126static 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
135const 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
173ClassLinker* 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
181ClassLinker* 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
187ClassLinker::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
203void 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
470void 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
532void 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
543bool 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
647void ClassLinker::RegisterOatFile(const OatFile& oat_file) {
648  WriterMutexLock mu(Thread::Current(), dex_lock_);
649  RegisterOatFileLocked(oat_file);
650}
651
652void 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
663OatFile& 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
672const 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
677const 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
692const 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
737const 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
744class 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
798const 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
848bool 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
895const 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
907const 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@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
965const 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
976const OatFile* ClassLinker::FindOatFileFromOatLocation(const std::string& oat_location) {
977  ReaderMutexLock mu(Thread::Current(), dex_lock_);
978  return FindOatFileFromOatLocationLocked(oat_location);
979}
980
981const 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
994static 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
1012void 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.
1096void 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
1129void 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
1141static 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
1147void 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
1158ClassLinker::~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
1177mirror::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
1228mirror::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
1245mirror::Class* ClassLinker::AllocClass(Thread* self, size_t class_size) {
1246  return AllocClass(self, GetClassRoot(kJavaLangClass), class_size);
1247}
1248
1249mirror::ArtField* ClassLinker::AllocArtField(Thread* self) {
1250  return down_cast<mirror::ArtField*>(GetClassRoot(kJavaLangReflectArtField)->AllocObject(self));
1251}
1252
1253mirror::ArtMethod* ClassLinker::AllocArtMethod(Thread* self) {
1254  return down_cast<mirror::ArtMethod*>(GetClassRoot(kJavaLangReflectArtMethod)->AllocObject(self));
1255}
1256
1257mirror::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
1264static 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
1291bool ClassLinker::IsInBootClassPath(const char* descriptor) {
1292  DexFile::ClassPathEntry pair = DexFile::FindInClassPath(descriptor, boot_class_path_);
1293  return pair.second != NULL;
1294}
1295
1296mirror::Class* ClassLinker::FindSystemClass(const char* descriptor) {
1297  return FindClass(descriptor, NULL);
1298}
1299
1300mirror::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
1382mirror::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
1465size_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
1505const 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
1518static 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
1552const 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.
1588const 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
1605const 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.
1614static 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
1632void 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
1674static 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
1718void 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  // TODO: JACK CLASS ACCESS (HACK TO BE REMOVED)
1732  CHECK_EQ(access_flags & ~(kAccJavaFlagsMask | kAccClassJack), 0U);
1733  klass->SetAccessFlags(access_flags);
1734  klass->SetClassLoader(class_loader);
1735  DCHECK_EQ(klass->GetPrimitiveType(), Primitive::kPrimNot);
1736  klass->SetStatus(mirror::Class::kStatusIdx, NULL);
1737
1738  klass->SetDexClassDefIndex(dex_file.GetIndexForClassDef(dex_class_def));
1739  klass->SetDexTypeIndex(dex_class_def.class_idx_);
1740
1741  // Load fields fields.
1742  const byte* class_data = dex_file.GetClassData(dex_class_def);
1743  if (class_data == NULL) {
1744    return;  // no fields or methods - for example a marker interface
1745  }
1746  ClassDataItemIterator it(dex_file, class_data);
1747  Thread* self = Thread::Current();
1748  if (it.NumStaticFields() != 0) {
1749    mirror::ObjectArray<mirror::ArtField>* statics = AllocArtFieldArray(self, it.NumStaticFields());
1750    if (UNLIKELY(statics == NULL)) {
1751      CHECK(self->IsExceptionPending());  // OOME.
1752      return;
1753    }
1754    klass->SetSFields(statics);
1755  }
1756  if (it.NumInstanceFields() != 0) {
1757    mirror::ObjectArray<mirror::ArtField>* fields =
1758        AllocArtFieldArray(self, it.NumInstanceFields());
1759    if (UNLIKELY(fields == NULL)) {
1760      CHECK(self->IsExceptionPending());  // OOME.
1761      return;
1762    }
1763    klass->SetIFields(fields);
1764  }
1765  for (size_t i = 0; it.HasNextStaticField(); i++, it.Next()) {
1766    SirtRef<mirror::ArtField> sfield(self, AllocArtField(self));
1767    if (UNLIKELY(sfield.get() == NULL)) {
1768      CHECK(self->IsExceptionPending());  // OOME.
1769      return;
1770    }
1771    klass->SetStaticField(i, sfield.get());
1772    LoadField(dex_file, it, klass, sfield);
1773  }
1774  for (size_t i = 0; it.HasNextInstanceField(); i++, it.Next()) {
1775    SirtRef<mirror::ArtField> ifield(self, AllocArtField(self));
1776    if (UNLIKELY(ifield.get() == NULL)) {
1777      CHECK(self->IsExceptionPending());  // OOME.
1778      return;
1779    }
1780    klass->SetInstanceField(i, ifield.get());
1781    LoadField(dex_file, it, klass, ifield);
1782  }
1783
1784  UniquePtr<const OatFile::OatClass> oat_class;
1785  if (Runtime::Current()->IsStarted() && !Runtime::Current()->UseCompileTimeClassPath()) {
1786    oat_class.reset(GetOatClass(dex_file, klass->GetDexClassDefIndex()));
1787  }
1788
1789  // Load methods.
1790  if (it.NumDirectMethods() != 0) {
1791    // TODO: append direct methods to class object
1792    mirror::ObjectArray<mirror::ArtMethod>* directs =
1793         AllocArtMethodArray(self, it.NumDirectMethods());
1794    if (UNLIKELY(directs == NULL)) {
1795      CHECK(self->IsExceptionPending());  // OOME.
1796      return;
1797    }
1798    klass->SetDirectMethods(directs);
1799  }
1800  if (it.NumVirtualMethods() != 0) {
1801    // TODO: append direct methods to class object
1802    mirror::ObjectArray<mirror::ArtMethod>* virtuals =
1803        AllocArtMethodArray(self, it.NumVirtualMethods());
1804    if (UNLIKELY(virtuals == NULL)) {
1805      CHECK(self->IsExceptionPending());  // OOME.
1806      return;
1807    }
1808    klass->SetVirtualMethods(virtuals);
1809  }
1810  size_t class_def_method_index = 0;
1811  for (size_t i = 0; it.HasNextDirectMethod(); i++, it.Next()) {
1812    SirtRef<mirror::ArtMethod> method(self, LoadMethod(self, dex_file, it, klass));
1813    if (UNLIKELY(method.get() == NULL)) {
1814      CHECK(self->IsExceptionPending());  // OOME.
1815      return;
1816    }
1817    klass->SetDirectMethod(i, method.get());
1818    if (oat_class.get() != NULL) {
1819      LinkCode(method, oat_class.get(), class_def_method_index);
1820    }
1821    method->SetMethodIndex(class_def_method_index);
1822    class_def_method_index++;
1823  }
1824  for (size_t i = 0; it.HasNextVirtualMethod(); i++, it.Next()) {
1825    SirtRef<mirror::ArtMethod> method(self, LoadMethod(self, dex_file, it, klass));
1826    if (UNLIKELY(method.get() == NULL)) {
1827      CHECK(self->IsExceptionPending());  // OOME.
1828      return;
1829    }
1830    klass->SetVirtualMethod(i, method.get());
1831    DCHECK_EQ(class_def_method_index, it.NumDirectMethods() + i);
1832    if (oat_class.get() != NULL) {
1833      LinkCode(method, oat_class.get(), class_def_method_index);
1834    }
1835    class_def_method_index++;
1836  }
1837  DCHECK(!it.HasNext());
1838}
1839
1840void ClassLinker::LoadField(const DexFile& /*dex_file*/, const ClassDataItemIterator& it,
1841                            SirtRef<mirror::Class>& klass, SirtRef<mirror::ArtField>& dst) {
1842  uint32_t field_idx = it.GetMemberIndex();
1843  dst->SetDexFieldIndex(field_idx);
1844  dst->SetDeclaringClass(klass.get());
1845  dst->SetAccessFlags(it.GetMemberAccessFlags());
1846}
1847
1848mirror::ArtMethod* ClassLinker::LoadMethod(Thread* self, const DexFile& dex_file,
1849                                           const ClassDataItemIterator& it,
1850                                           SirtRef<mirror::Class>& klass) {
1851  uint32_t dex_method_idx = it.GetMemberIndex();
1852  const DexFile::MethodId& method_id = dex_file.GetMethodId(dex_method_idx);
1853  StringPiece method_name(dex_file.GetMethodName(method_id));
1854
1855  mirror::ArtMethod* dst = AllocArtMethod(self);
1856  if (UNLIKELY(dst == NULL)) {
1857    CHECK(self->IsExceptionPending());  // OOME.
1858    return NULL;
1859  }
1860  DCHECK(dst->IsArtMethod()) << PrettyDescriptor(dst->GetClass());
1861
1862  const char* old_cause = self->StartAssertNoThreadSuspension("LoadMethod");
1863  dst->SetDexMethodIndex(dex_method_idx);
1864  dst->SetDeclaringClass(klass.get());
1865
1866  if (method_name == "finalize") {
1867    // Create the prototype for a signature of "()V"
1868    const DexFile::StringId* void_string_id = dex_file.FindStringId("V");
1869    if (void_string_id != NULL) {
1870      const DexFile::TypeId* void_type_id =
1871          dex_file.FindTypeId(dex_file.GetIndexForStringId(*void_string_id));
1872      if (void_type_id != NULL) {
1873        std::vector<uint16_t> no_args;
1874        const DexFile::ProtoId* finalizer_proto =
1875            dex_file.FindProtoId(dex_file.GetIndexForTypeId(*void_type_id), no_args);
1876        if (finalizer_proto != NULL) {
1877          // We have the prototype in the dex file
1878          if (klass->GetClassLoader() != NULL) {  // All non-boot finalizer methods are flagged
1879            klass->SetFinalizable();
1880          } else {
1881            ClassHelper kh(klass.get());
1882            StringPiece klass_descriptor(kh.GetDescriptor());
1883            // The Enum class declares a "final" finalize() method to prevent subclasses from
1884            // introducing a finalizer. We don't want to set the finalizable flag for Enum or its
1885            // subclasses, so we exclude it here.
1886            // We also want to avoid setting the flag on Object, where we know that finalize() is
1887            // empty.
1888            if (klass_descriptor != "Ljava/lang/Object;" &&
1889                klass_descriptor != "Ljava/lang/Enum;") {
1890              klass->SetFinalizable();
1891            }
1892          }
1893        }
1894      }
1895    }
1896  }
1897  dst->SetCodeItemOffset(it.GetMethodCodeItemOffset());
1898  dst->SetAccessFlags(it.GetMemberAccessFlags());
1899
1900  dst->SetDexCacheStrings(klass->GetDexCache()->GetStrings());
1901  dst->SetDexCacheResolvedMethods(klass->GetDexCache()->GetResolvedMethods());
1902  dst->SetDexCacheResolvedTypes(klass->GetDexCache()->GetResolvedTypes());
1903  dst->SetDexCacheInitializedStaticStorage(klass->GetDexCache()->GetInitializedStaticStorage());
1904
1905  CHECK(dst->IsArtMethod());
1906
1907  self->EndAssertNoThreadSuspension(old_cause);
1908  return dst;
1909}
1910
1911void ClassLinker::AppendToBootClassPath(const DexFile& dex_file) {
1912  Thread* self = Thread::Current();
1913  SirtRef<mirror::DexCache> dex_cache(self, AllocDexCache(self, dex_file));
1914  CHECK(dex_cache.get() != NULL) << "Failed to allocate dex cache for " << dex_file.GetLocation();
1915  AppendToBootClassPath(dex_file, dex_cache);
1916}
1917
1918void ClassLinker::AppendToBootClassPath(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) {
1919  CHECK(dex_cache.get() != NULL) << dex_file.GetLocation();
1920  boot_class_path_.push_back(&dex_file);
1921  RegisterDexFile(dex_file, dex_cache);
1922}
1923
1924bool ClassLinker::IsDexFileRegisteredLocked(const DexFile& dex_file) const {
1925  dex_lock_.AssertSharedHeld(Thread::Current());
1926  for (size_t i = 0; i != dex_caches_.size(); ++i) {
1927    if (dex_caches_[i]->GetDexFile() == &dex_file) {
1928      return true;
1929    }
1930  }
1931  return false;
1932}
1933
1934bool ClassLinker::IsDexFileRegistered(const DexFile& dex_file) const {
1935  ReaderMutexLock mu(Thread::Current(), dex_lock_);
1936  return IsDexFileRegisteredLocked(dex_file);
1937}
1938
1939void ClassLinker::RegisterDexFileLocked(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) {
1940  dex_lock_.AssertExclusiveHeld(Thread::Current());
1941  CHECK(dex_cache.get() != NULL) << dex_file.GetLocation();
1942  CHECK(dex_cache->GetLocation()->Equals(dex_file.GetLocation()))
1943      << dex_cache->GetLocation()->ToModifiedUtf8() << " " << dex_file.GetLocation();
1944  dex_caches_.push_back(dex_cache.get());
1945  dex_cache->SetDexFile(&dex_file);
1946  dex_caches_dirty_ = true;
1947}
1948
1949void ClassLinker::RegisterDexFile(const DexFile& dex_file) {
1950  Thread* self = Thread::Current();
1951  {
1952    ReaderMutexLock mu(self, dex_lock_);
1953    if (IsDexFileRegisteredLocked(dex_file)) {
1954      return;
1955    }
1956  }
1957  // Don't alloc while holding the lock, since allocation may need to
1958  // suspend all threads and another thread may need the dex_lock_ to
1959  // get to a suspend point.
1960  SirtRef<mirror::DexCache> dex_cache(self, AllocDexCache(self, dex_file));
1961  CHECK(dex_cache.get() != NULL) << "Failed to allocate dex cache for " << dex_file.GetLocation();
1962  {
1963    WriterMutexLock mu(self, dex_lock_);
1964    if (IsDexFileRegisteredLocked(dex_file)) {
1965      return;
1966    }
1967    RegisterDexFileLocked(dex_file, dex_cache);
1968  }
1969}
1970
1971void ClassLinker::RegisterDexFile(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) {
1972  WriterMutexLock mu(Thread::Current(), dex_lock_);
1973  RegisterDexFileLocked(dex_file, dex_cache);
1974}
1975
1976mirror::DexCache* ClassLinker::FindDexCache(const DexFile& dex_file) const {
1977  ReaderMutexLock mu(Thread::Current(), dex_lock_);
1978  // Search assuming unique-ness of dex file.
1979  for (size_t i = 0; i != dex_caches_.size(); ++i) {
1980    mirror::DexCache* dex_cache = dex_caches_[i];
1981    if (dex_cache->GetDexFile() == &dex_file) {
1982      return dex_cache;
1983    }
1984  }
1985  // Search matching by location name.
1986  std::string location(dex_file.GetLocation());
1987  for (size_t i = 0; i != dex_caches_.size(); ++i) {
1988    mirror::DexCache* dex_cache = dex_caches_[i];
1989    if (dex_cache->GetDexFile()->GetLocation() == location) {
1990      return dex_cache;
1991    }
1992  }
1993  // Failure, dump diagnostic and abort.
1994  for (size_t i = 0; i != dex_caches_.size(); ++i) {
1995    mirror::DexCache* dex_cache = dex_caches_[i];
1996    LOG(ERROR) << "Registered dex file " << i << " = " << dex_cache->GetDexFile()->GetLocation();
1997  }
1998  LOG(FATAL) << "Failed to find DexCache for DexFile " << location;
1999  return NULL;
2000}
2001
2002void ClassLinker::FixupDexCaches(mirror::ArtMethod* resolution_method) const {
2003  ReaderMutexLock mu(Thread::Current(), dex_lock_);
2004  for (size_t i = 0; i != dex_caches_.size(); ++i) {
2005    dex_caches_[i]->Fixup(resolution_method);
2006  }
2007}
2008
2009mirror::Class* ClassLinker::CreatePrimitiveClass(Thread* self, Primitive::Type type) {
2010  mirror::Class* klass = AllocClass(self, sizeof(mirror::Class));
2011  if (UNLIKELY(klass == NULL)) {
2012    return NULL;
2013  }
2014  return InitializePrimitiveClass(klass, type);
2015}
2016
2017mirror::Class* ClassLinker::InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type) {
2018  CHECK(primitive_class != NULL);
2019  // Must hold lock on object when initializing.
2020  Thread* self = Thread::Current();
2021  ObjectLock lock(self, primitive_class);
2022  primitive_class->SetAccessFlags(kAccPublic | kAccFinal | kAccAbstract);
2023  primitive_class->SetPrimitiveType(type);
2024  primitive_class->SetStatus(mirror::Class::kStatusInitialized, self);
2025  const char* descriptor = Primitive::Descriptor(type);
2026  mirror::Class* existing = InsertClass(descriptor, primitive_class, Hash(descriptor));
2027  CHECK(existing == NULL) << "InitPrimitiveClass(" << type << ") failed";
2028  return primitive_class;
2029}
2030
2031// Create an array class (i.e. the class object for the array, not the
2032// array itself).  "descriptor" looks like "[C" or "[[[[B" or
2033// "[Ljava/lang/String;".
2034//
2035// If "descriptor" refers to an array of primitives, look up the
2036// primitive type's internally-generated class object.
2037//
2038// "class_loader" is the class loader of the class that's referring to
2039// us.  It's used to ensure that we're looking for the element type in
2040// the right context.  It does NOT become the class loader for the
2041// array class; that always comes from the base element class.
2042//
2043// Returns NULL with an exception raised on failure.
2044mirror::Class* ClassLinker::CreateArrayClass(const char* descriptor,
2045                                             mirror::ClassLoader* class_loader) {
2046  // Identify the underlying component type
2047  CHECK_EQ('[', descriptor[0]);
2048  mirror::Class* component_type = FindClass(descriptor + 1, class_loader);
2049  if (component_type == NULL) {
2050    DCHECK(Thread::Current()->IsExceptionPending());
2051    return NULL;
2052  }
2053
2054  // See if the component type is already loaded.  Array classes are
2055  // always associated with the class loader of their underlying
2056  // element type -- an array of Strings goes with the loader for
2057  // java/lang/String -- so we need to look for it there.  (The
2058  // caller should have checked for the existence of the class
2059  // before calling here, but they did so with *their* class loader,
2060  // not the component type's loader.)
2061  //
2062  // If we find it, the caller adds "loader" to the class' initiating
2063  // loader list, which should prevent us from going through this again.
2064  //
2065  // This call is unnecessary if "loader" and "component_type->GetClassLoader()"
2066  // are the same, because our caller (FindClass) just did the
2067  // lookup.  (Even if we get this wrong we still have correct behavior,
2068  // because we effectively do this lookup again when we add the new
2069  // class to the hash table --- necessary because of possible races with
2070  // other threads.)
2071  if (class_loader != component_type->GetClassLoader()) {
2072    mirror::Class* new_class = LookupClass(descriptor, component_type->GetClassLoader());
2073    if (new_class != NULL) {
2074      return new_class;
2075    }
2076  }
2077
2078  // Fill out the fields in the Class.
2079  //
2080  // It is possible to execute some methods against arrays, because
2081  // all arrays are subclasses of java_lang_Object_, so we need to set
2082  // up a vtable.  We can just point at the one in java_lang_Object_.
2083  //
2084  // Array classes are simple enough that we don't need to do a full
2085  // link step.
2086  Thread* self = Thread::Current();
2087  SirtRef<mirror::Class> new_class(self, NULL);
2088  if (UNLIKELY(!init_done_)) {
2089    // Classes that were hand created, ie not by FindSystemClass
2090    if (strcmp(descriptor, "[Ljava/lang/Class;") == 0) {
2091      new_class.reset(GetClassRoot(kClassArrayClass));
2092    } else if (strcmp(descriptor, "[Ljava/lang/Object;") == 0) {
2093      new_class.reset(GetClassRoot(kObjectArrayClass));
2094    } else if (strcmp(descriptor, class_roots_descriptors_[kJavaLangStringArrayClass]) == 0) {
2095      new_class.reset(GetClassRoot(kJavaLangStringArrayClass));
2096    } else if (strcmp(descriptor,
2097                      class_roots_descriptors_[kJavaLangReflectArtMethodArrayClass]) == 0) {
2098      new_class.reset(GetClassRoot(kJavaLangReflectArtMethodArrayClass));
2099    } else if (strcmp(descriptor,
2100                      class_roots_descriptors_[kJavaLangReflectArtFieldArrayClass]) == 0) {
2101      new_class.reset(GetClassRoot(kJavaLangReflectArtFieldArrayClass));
2102    } else if (strcmp(descriptor, "[C") == 0) {
2103      new_class.reset(GetClassRoot(kCharArrayClass));
2104    } else if (strcmp(descriptor, "[I") == 0) {
2105      new_class.reset(GetClassRoot(kIntArrayClass));
2106    }
2107  }
2108  if (new_class.get() == NULL) {
2109    new_class.reset(AllocClass(self, sizeof(mirror::Class)));
2110    if (new_class.get() == NULL) {
2111      return NULL;
2112    }
2113    new_class->SetComponentType(component_type);
2114  }
2115  ObjectLock lock(self, new_class.get());  // Must hold lock on object when initializing.
2116  DCHECK(new_class->GetComponentType() != NULL);
2117  mirror::Class* java_lang_Object = GetClassRoot(kJavaLangObject);
2118  new_class->SetSuperClass(java_lang_Object);
2119  new_class->SetVTable(java_lang_Object->GetVTable());
2120  new_class->SetPrimitiveType(Primitive::kPrimNot);
2121  new_class->SetClassLoader(component_type->GetClassLoader());
2122  new_class->SetStatus(mirror::Class::kStatusInitialized, self);
2123  // don't need to set new_class->SetObjectSize(..)
2124  // because Object::SizeOf delegates to Array::SizeOf
2125
2126
2127  // All arrays have java/lang/Cloneable and java/io/Serializable as
2128  // interfaces.  We need to set that up here, so that stuff like
2129  // "instanceof" works right.
2130  //
2131  // Note: The GC could run during the call to FindSystemClass,
2132  // so we need to make sure the class object is GC-valid while we're in
2133  // there.  Do this by clearing the interface list so the GC will just
2134  // think that the entries are null.
2135
2136
2137  // Use the single, global copies of "interfaces" and "iftable"
2138  // (remember not to free them for arrays).
2139  CHECK(array_iftable_ != NULL);
2140  new_class->SetIfTable(array_iftable_);
2141
2142  // Inherit access flags from the component type.
2143  int access_flags = new_class->GetComponentType()->GetAccessFlags();
2144  // Lose any implementation detail flags; in particular, arrays aren't finalizable.
2145  access_flags &= kAccJavaFlagsMask;
2146  // Arrays can't be used as a superclass or interface, so we want to add "abstract final"
2147  // and remove "interface".
2148  access_flags |= kAccAbstract | kAccFinal;
2149  access_flags &= ~kAccInterface;
2150
2151  new_class->SetAccessFlags(access_flags);
2152
2153  mirror::Class* existing = InsertClass(descriptor, new_class.get(), Hash(descriptor));
2154  if (existing == NULL) {
2155    return new_class.get();
2156  }
2157  // Another thread must have loaded the class after we
2158  // started but before we finished.  Abandon what we've
2159  // done.
2160  //
2161  // (Yes, this happens.)
2162
2163  return existing;
2164}
2165
2166mirror::Class* ClassLinker::FindPrimitiveClass(char type) {
2167  switch (Primitive::GetType(type)) {
2168    case Primitive::kPrimByte:
2169      return GetClassRoot(kPrimitiveByte);
2170    case Primitive::kPrimChar:
2171      return GetClassRoot(kPrimitiveChar);
2172    case Primitive::kPrimDouble:
2173      return GetClassRoot(kPrimitiveDouble);
2174    case Primitive::kPrimFloat:
2175      return GetClassRoot(kPrimitiveFloat);
2176    case Primitive::kPrimInt:
2177      return GetClassRoot(kPrimitiveInt);
2178    case Primitive::kPrimLong:
2179      return GetClassRoot(kPrimitiveLong);
2180    case Primitive::kPrimShort:
2181      return GetClassRoot(kPrimitiveShort);
2182    case Primitive::kPrimBoolean:
2183      return GetClassRoot(kPrimitiveBoolean);
2184    case Primitive::kPrimVoid:
2185      return GetClassRoot(kPrimitiveVoid);
2186    case Primitive::kPrimNot:
2187      break;
2188  }
2189  std::string printable_type(PrintableChar(type));
2190  ThrowNoClassDefFoundError("Not a primitive type: %s", printable_type.c_str());
2191  return NULL;
2192}
2193
2194mirror::Class* ClassLinker::InsertClass(const char* descriptor, mirror::Class* klass,
2195                                        size_t hash) {
2196  if (VLOG_IS_ON(class_linker)) {
2197    mirror::DexCache* dex_cache = klass->GetDexCache();
2198    std::string source;
2199    if (dex_cache != NULL) {
2200      source += " from ";
2201      source += dex_cache->GetLocation()->ToModifiedUtf8();
2202    }
2203    LOG(INFO) << "Loaded class " << descriptor << source;
2204  }
2205  WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
2206  mirror::Class* existing =
2207      LookupClassFromTableLocked(descriptor, klass->GetClassLoader(), hash);
2208  if (existing != NULL) {
2209    return existing;
2210  }
2211  if (kIsDebugBuild && klass->GetClassLoader() == NULL && dex_cache_image_class_lookup_required_) {
2212    // Check a class loaded with the system class loader matches one in the image if the class
2213    // is in the image.
2214    existing = LookupClassFromImage(descriptor);
2215    if (existing != NULL) {
2216      CHECK(klass == existing);
2217    }
2218  }
2219  Runtime::Current()->GetHeap()->VerifyObject(klass);
2220  class_table_.insert(std::make_pair(hash, klass));
2221  class_table_dirty_ = true;
2222  return NULL;
2223}
2224
2225bool ClassLinker::RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader) {
2226  size_t hash = Hash(descriptor);
2227  WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
2228  ClassHelper kh;
2229  for (auto it = class_table_.lower_bound(hash), end = class_table_.end(); it != end && it->first == hash;
2230       ++it) {
2231    mirror::Class* klass = it->second;
2232    kh.ChangeClass(klass);
2233    if (strcmp(kh.GetDescriptor(), descriptor) == 0 && klass->GetClassLoader() == class_loader) {
2234      class_table_.erase(it);
2235      return true;
2236    }
2237  }
2238  return false;
2239}
2240
2241mirror::Class* ClassLinker::LookupClass(const char* descriptor,
2242                                        const mirror::ClassLoader* class_loader) {
2243  size_t hash = Hash(descriptor);
2244  {
2245    ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
2246    mirror::Class* result = LookupClassFromTableLocked(descriptor, class_loader, hash);
2247    if (result != NULL) {
2248      return result;
2249    }
2250  }
2251  if (class_loader != NULL || !dex_cache_image_class_lookup_required_) {
2252    return NULL;
2253  } else {
2254    // Lookup failed but need to search dex_caches_.
2255    mirror::Class* result = LookupClassFromImage(descriptor);
2256    if (result != NULL) {
2257      InsertClass(descriptor, result, hash);
2258    } else {
2259      // Searching the image dex files/caches failed, we don't want to get into this situation
2260      // often as map searches are faster, so after kMaxFailedDexCacheLookups move all image
2261      // classes into the class table.
2262      const int32_t kMaxFailedDexCacheLookups = 1000;
2263      if (++failed_dex_cache_class_lookups_ > kMaxFailedDexCacheLookups) {
2264        MoveImageClassesToClassTable();
2265      }
2266    }
2267    return result;
2268  }
2269}
2270
2271mirror::Class* ClassLinker::LookupClassFromTableLocked(const char* descriptor,
2272                                                       const mirror::ClassLoader* class_loader,
2273                                                       size_t hash) {
2274  ClassHelper kh(NULL, this);
2275  auto end = class_table_.end();
2276  for (auto it = class_table_.lower_bound(hash); it != end && it->first == hash; ++it) {
2277    mirror::Class* klass = it->second;
2278    kh.ChangeClass(klass);
2279    if (klass->GetClassLoader() == class_loader && strcmp(descriptor, kh.GetDescriptor()) == 0) {
2280      if (kIsDebugBuild) {
2281        // Check for duplicates in the table.
2282        for (++it; it != end && it->first == hash; ++it) {
2283          mirror::Class* klass2 = it->second;
2284          kh.ChangeClass(klass2);
2285          CHECK(!(strcmp(descriptor, kh.GetDescriptor()) == 0 && klass2->GetClassLoader() == class_loader))
2286          << PrettyClass(klass) << " " << klass << " " << klass->GetClassLoader() << " "
2287          << PrettyClass(klass2) << " " << klass2 << " " << klass2->GetClassLoader();
2288        }
2289      }
2290      return klass;
2291    }
2292  }
2293  return NULL;
2294}
2295
2296static mirror::ObjectArray<mirror::DexCache>* GetImageDexCaches()
2297    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2298  gc::space::ImageSpace* image = Runtime::Current()->GetHeap()->GetImageSpace();
2299  CHECK(image != NULL);
2300  mirror::Object* root = image->GetImageHeader().GetImageRoot(ImageHeader::kDexCaches);
2301  return root->AsObjectArray<mirror::DexCache>();
2302}
2303
2304void ClassLinker::MoveImageClassesToClassTable() {
2305  Thread* self = Thread::Current();
2306  WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
2307  if (!dex_cache_image_class_lookup_required_) {
2308    return;  // All dex cache classes are already in the class table.
2309  }
2310  const char* old_no_suspend_cause =
2311      self->StartAssertNoThreadSuspension("Moving image classes to class table");
2312  mirror::ObjectArray<mirror::DexCache>* dex_caches = GetImageDexCaches();
2313  ClassHelper kh(NULL, this);
2314  for (int32_t i = 0; i < dex_caches->GetLength(); i++) {
2315    mirror::DexCache* dex_cache = dex_caches->Get(i);
2316    mirror::ObjectArray<mirror::Class>* types = dex_cache->GetResolvedTypes();
2317    for (int32_t j = 0; j < types->GetLength(); j++) {
2318      mirror::Class* klass = types->Get(j);
2319      if (klass != NULL) {
2320        kh.ChangeClass(klass);
2321        DCHECK(klass->GetClassLoader() == NULL);
2322        const char* descriptor = kh.GetDescriptor();
2323        size_t hash = Hash(descriptor);
2324        mirror::Class* existing = LookupClassFromTableLocked(descriptor, NULL, hash);
2325        if (existing != NULL) {
2326          CHECK(existing == klass) << PrettyClassAndClassLoader(existing) << " != "
2327              << PrettyClassAndClassLoader(klass);
2328        } else {
2329          class_table_.insert(std::make_pair(hash, klass));
2330        }
2331      }
2332    }
2333  }
2334  class_table_dirty_ = true;
2335  dex_cache_image_class_lookup_required_ = false;
2336  self->EndAssertNoThreadSuspension(old_no_suspend_cause);
2337}
2338
2339mirror::Class* ClassLinker::LookupClassFromImage(const char* descriptor) {
2340  Thread* self = Thread::Current();
2341  const char* old_no_suspend_cause =
2342      self->StartAssertNoThreadSuspension("Image class lookup");
2343  mirror::ObjectArray<mirror::DexCache>* dex_caches = GetImageDexCaches();
2344  for (int32_t i = 0; i < dex_caches->GetLength(); ++i) {
2345    mirror::DexCache* dex_cache = dex_caches->Get(i);
2346    const DexFile* dex_file = dex_cache->GetDexFile();
2347    // First search using the class def map, but don't bother for non-class types.
2348    if (descriptor[0] == 'L') {
2349      const DexFile::StringId* descriptor_string_id = dex_file->FindStringId(descriptor);
2350      if (descriptor_string_id != NULL) {
2351        const DexFile::TypeId* type_id =
2352            dex_file->FindTypeId(dex_file->GetIndexForStringId(*descriptor_string_id));
2353        if (type_id != NULL) {
2354          mirror::Class* klass = dex_cache->GetResolvedType(dex_file->GetIndexForTypeId(*type_id));
2355          if (klass != NULL) {
2356            self->EndAssertNoThreadSuspension(old_no_suspend_cause);
2357            return klass;
2358          }
2359        }
2360      }
2361    }
2362    // Now try binary searching the string/type index.
2363    const DexFile::StringId* string_id = dex_file->FindStringId(descriptor);
2364    if (string_id != NULL) {
2365      const DexFile::TypeId* type_id =
2366          dex_file->FindTypeId(dex_file->GetIndexForStringId(*string_id));
2367      if (type_id != NULL) {
2368        uint16_t type_idx = dex_file->GetIndexForTypeId(*type_id);
2369        mirror::Class* klass = dex_cache->GetResolvedType(type_idx);
2370        if (klass != NULL) {
2371          self->EndAssertNoThreadSuspension(old_no_suspend_cause);
2372          return klass;
2373        }
2374      }
2375    }
2376  }
2377  self->EndAssertNoThreadSuspension(old_no_suspend_cause);
2378  return NULL;
2379}
2380
2381void ClassLinker::LookupClasses(const char* descriptor, std::vector<mirror::Class*>& result) {
2382  result.clear();
2383  if (dex_cache_image_class_lookup_required_) {
2384    MoveImageClassesToClassTable();
2385  }
2386  size_t hash = Hash(descriptor);
2387  ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
2388  ClassHelper kh(NULL, this);
2389  for (auto it = class_table_.lower_bound(hash), end = class_table_.end();
2390      it != end && it->first == hash; ++it) {
2391    mirror::Class* klass = it->second;
2392    kh.ChangeClass(klass);
2393    if (strcmp(descriptor, kh.GetDescriptor()) == 0) {
2394      result.push_back(klass);
2395    }
2396  }
2397}
2398
2399void ClassLinker::VerifyClass(mirror::Class* klass) {
2400  // TODO: assert that the monitor on the Class is held
2401  Thread* self = Thread::Current();
2402  ObjectLock lock(self, klass);
2403
2404  // Don't attempt to re-verify if already sufficiently verified.
2405  if (klass->IsVerified() ||
2406      (klass->IsCompileTimeVerified() && Runtime::Current()->IsCompiler())) {
2407    return;
2408  }
2409
2410  // The class might already be erroneous, for example at compile time if we attempted to verify
2411  // this class as a parent to another.
2412  if (klass->IsErroneous()) {
2413    ThrowEarlierClassFailure(klass);
2414    return;
2415  }
2416
2417  if (klass->GetStatus() == mirror::Class::kStatusResolved) {
2418    klass->SetStatus(mirror::Class::kStatusVerifying, self);
2419  } else {
2420    CHECK_EQ(klass->GetStatus(), mirror::Class::kStatusRetryVerificationAtRuntime)
2421        << PrettyClass(klass);
2422    CHECK(!Runtime::Current()->IsCompiler());
2423    klass->SetStatus(mirror::Class::kStatusVerifyingAtRuntime, self);
2424  }
2425
2426  // Verify super class.
2427  SirtRef<mirror::Class> super(self, klass->GetSuperClass());
2428  if (super.get() != NULL) {
2429    // Acquire lock to prevent races on verifying the super class.
2430    ObjectLock lock(self, super.get());
2431
2432    if (!super->IsVerified() && !super->IsErroneous()) {
2433      VerifyClass(super.get());
2434    }
2435    if (!super->IsCompileTimeVerified()) {
2436      std::string error_msg(StringPrintf("Rejecting class %s that attempts to sub-class erroneous class %s",
2437                                         PrettyDescriptor(klass).c_str(),
2438                                         PrettyDescriptor(super.get()).c_str()));
2439      LOG(ERROR) << error_msg  << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8();
2440      SirtRef<mirror::Throwable> cause(self, self->GetException(NULL));
2441      if (cause.get() != NULL) {
2442        self->ClearException();
2443      }
2444      ThrowVerifyError(klass, "%s", error_msg.c_str());
2445      if (cause.get() != NULL) {
2446        self->GetException(NULL)->SetCause(cause.get());
2447      }
2448      klass->SetStatus(mirror::Class::kStatusError, self);
2449      return;
2450    }
2451  }
2452
2453  // Try to use verification information from the oat file, otherwise do runtime verification.
2454  const DexFile& dex_file = *klass->GetDexCache()->GetDexFile();
2455  mirror::Class::Status oat_file_class_status(mirror::Class::kStatusNotReady);
2456  bool preverified = VerifyClassUsingOatFile(dex_file, klass, oat_file_class_status);
2457  if (oat_file_class_status == mirror::Class::kStatusError) {
2458    VLOG(class_linker) << "Skipping runtime verification of erroneous class "
2459        << PrettyDescriptor(klass) << " in "
2460        << klass->GetDexCache()->GetLocation()->ToModifiedUtf8();
2461    ThrowVerifyError(klass, "Rejecting class %s because it failed compile-time verification",
2462                     PrettyDescriptor(klass).c_str());
2463    klass->SetStatus(mirror::Class::kStatusError, self);
2464    return;
2465  }
2466  verifier::MethodVerifier::FailureKind verifier_failure = verifier::MethodVerifier::kNoFailure;
2467  std::string error_msg;
2468  if (!preverified) {
2469    verifier_failure = verifier::MethodVerifier::VerifyClass(klass,
2470                                                             Runtime::Current()->IsCompiler(),
2471                                                             &error_msg);
2472  }
2473  if (preverified || verifier_failure != verifier::MethodVerifier::kHardFailure) {
2474    if (!preverified && verifier_failure != verifier::MethodVerifier::kNoFailure) {
2475      VLOG(class_linker) << "Soft verification failure in class " << PrettyDescriptor(klass)
2476          << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8()
2477          << " because: " << error_msg;
2478    }
2479    self->AssertNoPendingException();
2480    // Make sure all classes referenced by catch blocks are resolved.
2481    ResolveClassExceptionHandlerTypes(dex_file, klass);
2482    if (verifier_failure == verifier::MethodVerifier::kNoFailure) {
2483      // Even though there were no verifier failures we need to respect whether the super-class
2484      // was verified or requiring runtime reverification.
2485      if (super.get() == NULL || super->IsVerified()) {
2486        klass->SetStatus(mirror::Class::kStatusVerified, self);
2487      } else {
2488        CHECK_EQ(super->GetStatus(), mirror::Class::kStatusRetryVerificationAtRuntime);
2489        klass->SetStatus(mirror::Class::kStatusRetryVerificationAtRuntime, self);
2490        // Pretend a soft failure occured so that we don't consider the class verified below.
2491        verifier_failure = verifier::MethodVerifier::kSoftFailure;
2492      }
2493    } else {
2494      CHECK_EQ(verifier_failure, verifier::MethodVerifier::kSoftFailure);
2495      // Soft failures at compile time should be retried at runtime. Soft
2496      // failures at runtime will be handled by slow paths in the generated
2497      // code. Set status accordingly.
2498      if (Runtime::Current()->IsCompiler()) {
2499        klass->SetStatus(mirror::Class::kStatusRetryVerificationAtRuntime, self);
2500      } else {
2501        klass->SetStatus(mirror::Class::kStatusVerified, self);
2502      }
2503    }
2504  } else {
2505    LOG(ERROR) << "Verification failed on class " << PrettyDescriptor(klass)
2506        << " in " << klass->GetDexCache()->GetLocation()->ToModifiedUtf8()
2507        << " because: " << error_msg;
2508    self->AssertNoPendingException();
2509    ThrowVerifyError(klass, "%s", error_msg.c_str());
2510    klass->SetStatus(mirror::Class::kStatusError, self);
2511  }
2512  if (preverified || verifier_failure == verifier::MethodVerifier::kNoFailure) {
2513    // Class is verified so we don't need to do any access check on its methods.
2514    // Let the interpreter know it by setting the kAccPreverified flag onto each
2515    // method.
2516    // Note: we're going here during compilation and at runtime. When we set the
2517    // kAccPreverified flag when compiling image classes, the flag is recorded
2518    // in the image and is set when loading the image.
2519    klass->SetPreverifiedFlagOnAllMethods();
2520  }
2521}
2522
2523bool ClassLinker::VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass,
2524                                          mirror::Class::Status& oat_file_class_status) {
2525  // If we're compiling, we can only verify the class using the oat file if
2526  // we are not compiling the image or if the class we're verifying is not part of
2527  // the app.  In other words, we will only check for preverification of bootclasspath
2528  // classes.
2529  if (Runtime::Current()->IsCompiler()) {
2530    // Are we compiling the bootclasspath?
2531    if (!Runtime::Current()->UseCompileTimeClassPath()) {
2532      return false;
2533    }
2534    // We are compiling an app (not the image).
2535
2536    // Is this an app class? (I.e. not a bootclasspath class)
2537    if (klass->GetClassLoader() != NULL) {
2538      return false;
2539    }
2540  }
2541
2542  const OatFile* oat_file = FindOpenedOatFileForDexFile(dex_file);
2543  // Make this work with gtests, which do not set up the image properly.
2544  // TODO: we should clean up gtests to set up the image path properly.
2545  if (Runtime::Current()->IsCompiler() && (oat_file == NULL)) {
2546    return false;
2547  }
2548
2549  CHECK(oat_file != NULL) << dex_file.GetLocation() << " " << PrettyClass(klass);
2550  uint dex_location_checksum = dex_file.GetLocationChecksum();
2551  const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_file.GetLocation(),
2552                                                                    &dex_location_checksum);
2553  CHECK(oat_dex_file != NULL) << dex_file.GetLocation() << " " << PrettyClass(klass);
2554  const char* descriptor = ClassHelper(klass).GetDescriptor();
2555  uint16_t class_def_index = klass->GetDexClassDefIndex();
2556  UniquePtr<const OatFile::OatClass> oat_class(oat_dex_file->GetOatClass(class_def_index));
2557  CHECK(oat_class.get() != NULL)
2558          << dex_file.GetLocation() << " " << PrettyClass(klass) << " " << descriptor;
2559  oat_file_class_status = oat_class->GetStatus();
2560  if (oat_file_class_status == mirror::Class::kStatusVerified ||
2561      oat_file_class_status == mirror::Class::kStatusInitialized) {
2562      return true;
2563  }
2564  if (oat_file_class_status == mirror::Class::kStatusRetryVerificationAtRuntime) {
2565    // Compile time verification failed with a soft error. Compile time verification can fail
2566    // because we have incomplete type information. Consider the following:
2567    // class ... {
2568    //   Foo x;
2569    //   .... () {
2570    //     if (...) {
2571    //       v1 gets assigned a type of resolved class Foo
2572    //     } else {
2573    //       v1 gets assigned a type of unresolved class Bar
2574    //     }
2575    //     iput x = v1
2576    // } }
2577    // when we merge v1 following the if-the-else it results in Conflict
2578    // (see verifier::RegType::Merge) as we can't know the type of Bar and we could possibly be
2579    // allowing an unsafe assignment to the field x in the iput (javac may have compiled this as
2580    // it knew Bar was a sub-class of Foo, but for us this may have been moved into a separate apk
2581    // at compile time).
2582    return false;
2583  }
2584  if (oat_file_class_status == mirror::Class::kStatusError) {
2585    // Compile time verification failed with a hard error. This is caused by invalid instructions
2586    // in the class. These errors are unrecoverable.
2587    return false;
2588  }
2589  if (oat_file_class_status == mirror::Class::kStatusNotReady) {
2590    // Status is uninitialized if we couldn't determine the status at compile time, for example,
2591    // not loading the class.
2592    // TODO: when the verifier doesn't rely on Class-es failing to resolve/load the type hierarchy
2593    // isn't a problem and this case shouldn't occur
2594    return false;
2595  }
2596  LOG(FATAL) << "Unexpected class status: " << oat_file_class_status
2597             << " " << dex_file.GetLocation() << " " << PrettyClass(klass) << " " << descriptor;
2598
2599  return false;
2600}
2601
2602void ClassLinker::ResolveClassExceptionHandlerTypes(const DexFile& dex_file, mirror::Class* klass) {
2603  for (size_t i = 0; i < klass->NumDirectMethods(); i++) {
2604    ResolveMethodExceptionHandlerTypes(dex_file, klass->GetDirectMethod(i));
2605  }
2606  for (size_t i = 0; i < klass->NumVirtualMethods(); i++) {
2607    ResolveMethodExceptionHandlerTypes(dex_file, klass->GetVirtualMethod(i));
2608  }
2609}
2610
2611void ClassLinker::ResolveMethodExceptionHandlerTypes(const DexFile& dex_file,
2612                                                     mirror::ArtMethod* method) {
2613  // similar to DexVerifier::ScanTryCatchBlocks and dex2oat's ResolveExceptionsForMethod.
2614  const DexFile::CodeItem* code_item = dex_file.GetCodeItem(method->GetCodeItemOffset());
2615  if (code_item == NULL) {
2616    return;  // native or abstract method
2617  }
2618  if (code_item->tries_size_ == 0) {
2619    return;  // nothing to process
2620  }
2621  const byte* handlers_ptr = DexFile::GetCatchHandlerData(*code_item, 0);
2622  uint32_t handlers_size = DecodeUnsignedLeb128(&handlers_ptr);
2623  ClassLinker* linker = Runtime::Current()->GetClassLinker();
2624  for (uint32_t idx = 0; idx < handlers_size; idx++) {
2625    CatchHandlerIterator iterator(handlers_ptr);
2626    for (; iterator.HasNext(); iterator.Next()) {
2627      // Ensure exception types are resolved so that they don't need resolution to be delivered,
2628      // unresolved exception types will be ignored by exception delivery
2629      if (iterator.GetHandlerTypeIndex() != DexFile::kDexNoIndex16) {
2630        mirror::Class* exception_type = linker->ResolveType(iterator.GetHandlerTypeIndex(), method);
2631        if (exception_type == NULL) {
2632          DCHECK(Thread::Current()->IsExceptionPending());
2633          Thread::Current()->ClearException();
2634        }
2635      }
2636    }
2637    handlers_ptr = iterator.EndDataPointer();
2638  }
2639}
2640
2641static void CheckProxyConstructor(mirror::ArtMethod* constructor);
2642static void CheckProxyMethod(mirror::ArtMethod* method,
2643                             SirtRef<mirror::ArtMethod>& prototype);
2644
2645mirror::Class* ClassLinker::CreateProxyClass(mirror::String* name,
2646                                             mirror::ObjectArray<mirror::Class>* interfaces,
2647                                             mirror::ClassLoader* loader,
2648                                             mirror::ObjectArray<mirror::ArtMethod>* methods,
2649                                             mirror::ObjectArray<mirror::ObjectArray<mirror::Class> >* throws) {
2650  Thread* self = Thread::Current();
2651  SirtRef<mirror::Class> klass(self, AllocClass(self, GetClassRoot(kJavaLangClass),
2652                                                sizeof(mirror::SynthesizedProxyClass)));
2653  if (klass.get() == NULL) {
2654    CHECK(self->IsExceptionPending());  // OOME.
2655    return NULL;
2656  }
2657  DCHECK(klass->GetClass() != NULL);
2658  klass->SetObjectSize(sizeof(mirror::Proxy));
2659  klass->SetAccessFlags(kAccClassIsProxy | kAccPublic | kAccFinal);
2660  klass->SetClassLoader(loader);
2661  DCHECK_EQ(klass->GetPrimitiveType(), Primitive::kPrimNot);
2662  klass->SetName(name);
2663  mirror::Class* proxy_class = GetClassRoot(kJavaLangReflectProxy);
2664  klass->SetDexCache(proxy_class->GetDexCache());
2665
2666  klass->SetStatus(mirror::Class::kStatusIdx, self);
2667
2668  // Instance fields are inherited, but we add a couple of static fields...
2669  {
2670    mirror::ObjectArray<mirror::ArtField>* sfields = AllocArtFieldArray(self, 2);
2671    if (UNLIKELY(sfields == NULL)) {
2672      CHECK(self->IsExceptionPending());  // OOME.
2673      return NULL;
2674    }
2675    klass->SetSFields(sfields);
2676  }
2677  // 1. Create a static field 'interfaces' that holds the _declared_ interfaces implemented by
2678  // our proxy, so Class.getInterfaces doesn't return the flattened set.
2679  SirtRef<mirror::ArtField> interfaces_sfield(self, AllocArtField(self));
2680  if (UNLIKELY(interfaces_sfield.get() == NULL)) {
2681    CHECK(self->IsExceptionPending());  // OOME.
2682    return NULL;
2683  }
2684  klass->SetStaticField(0, interfaces_sfield.get());
2685  interfaces_sfield->SetDexFieldIndex(0);
2686  interfaces_sfield->SetDeclaringClass(klass.get());
2687  interfaces_sfield->SetAccessFlags(kAccStatic | kAccPublic | kAccFinal);
2688  // 2. Create a static field 'throws' that holds exceptions thrown by our methods.
2689  SirtRef<mirror::ArtField> throws_sfield(self, AllocArtField(self));
2690  if (UNLIKELY(throws_sfield.get() == NULL)) {
2691    CHECK(self->IsExceptionPending());  // OOME.
2692    return NULL;
2693  }
2694  klass->SetStaticField(1, throws_sfield.get());
2695  throws_sfield->SetDexFieldIndex(1);
2696  throws_sfield->SetDeclaringClass(klass.get());
2697  throws_sfield->SetAccessFlags(kAccStatic | kAccPublic | kAccFinal);
2698
2699  // Proxies have 1 direct method, the constructor
2700  {
2701    mirror::ObjectArray<mirror::ArtMethod>* directs =
2702      AllocArtMethodArray(self, 1);
2703    if (UNLIKELY(directs == NULL)) {
2704      CHECK(self->IsExceptionPending());  // OOME.
2705      return NULL;
2706    }
2707    klass->SetDirectMethods(directs);
2708    mirror::ArtMethod* constructor = CreateProxyConstructor(self, klass, proxy_class);
2709    if (UNLIKELY(constructor == NULL)) {
2710      CHECK(self->IsExceptionPending());  // OOME.
2711      return NULL;
2712    }
2713    klass->SetDirectMethod(0, constructor);
2714  }
2715
2716  // Create virtual method using specified prototypes
2717  size_t num_virtual_methods = methods->GetLength();
2718  {
2719    mirror::ObjectArray<mirror::ArtMethod>* virtuals =
2720        AllocArtMethodArray(self, num_virtual_methods);
2721    if (UNLIKELY(virtuals == NULL)) {
2722      CHECK(self->IsExceptionPending());  // OOME.
2723      return NULL;
2724    }
2725    klass->SetVirtualMethods(virtuals);
2726  }
2727  for (size_t i = 0; i < num_virtual_methods; ++i) {
2728    SirtRef<mirror::ArtMethod> prototype(self, methods->Get(i));
2729    mirror::ArtMethod* clone = CreateProxyMethod(self, klass, prototype);
2730    if (UNLIKELY(clone == NULL)) {
2731      CHECK(self->IsExceptionPending());  // OOME.
2732      return NULL;
2733    }
2734    klass->SetVirtualMethod(i, clone);
2735  }
2736
2737  klass->SetSuperClass(proxy_class);  // The super class is java.lang.reflect.Proxy
2738  klass->SetStatus(mirror::Class::kStatusLoaded, self);  // Class is now effectively in the loaded state
2739  self->AssertNoPendingException();
2740
2741  {
2742    ObjectLock lock(self, klass.get());  // Must hold lock on object when resolved.
2743    // Link the fields and virtual methods, creating vtable and iftables
2744    if (!LinkClass(klass, interfaces, self)) {
2745      klass->SetStatus(mirror::Class::kStatusError, self);
2746      return NULL;
2747    }
2748
2749    interfaces_sfield->SetObject(klass.get(), interfaces);
2750    throws_sfield->SetObject(klass.get(), throws);
2751    klass->SetStatus(mirror::Class::kStatusInitialized, self);
2752  }
2753
2754  // sanity checks
2755  if (kIsDebugBuild) {
2756    CHECK(klass->GetIFields() == NULL);
2757    CheckProxyConstructor(klass->GetDirectMethod(0));
2758    for (size_t i = 0; i < num_virtual_methods; ++i) {
2759      SirtRef<mirror::ArtMethod> prototype(self, methods->Get(i));
2760      CheckProxyMethod(klass->GetVirtualMethod(i), prototype);
2761    }
2762
2763    std::string interfaces_field_name(StringPrintf("java.lang.Class[] %s.interfaces",
2764                                                   name->ToModifiedUtf8().c_str()));
2765    CHECK_EQ(PrettyField(klass->GetStaticField(0)), interfaces_field_name);
2766
2767    std::string throws_field_name(StringPrintf("java.lang.Class[][] %s.throws",
2768                                               name->ToModifiedUtf8().c_str()));
2769    CHECK_EQ(PrettyField(klass->GetStaticField(1)), throws_field_name);
2770
2771    mirror::SynthesizedProxyClass* synth_proxy_class =
2772        down_cast<mirror::SynthesizedProxyClass*>(klass.get());
2773    CHECK_EQ(synth_proxy_class->GetInterfaces(), interfaces);
2774    CHECK_EQ(synth_proxy_class->GetThrows(), throws);
2775  }
2776  return klass.get();
2777}
2778
2779std::string ClassLinker::GetDescriptorForProxy(const mirror::Class* proxy_class) {
2780  DCHECK(proxy_class->IsProxyClass());
2781  mirror::String* name = proxy_class->GetName();
2782  DCHECK(name != NULL);
2783  return DotToDescriptor(name->ToModifiedUtf8().c_str());
2784}
2785
2786mirror::ArtMethod* ClassLinker::FindMethodForProxy(const mirror::Class* proxy_class,
2787                                                        const mirror::ArtMethod* proxy_method) {
2788  DCHECK(proxy_class->IsProxyClass());
2789  DCHECK(proxy_method->IsProxyMethod());
2790  // Locate the dex cache of the original interface/Object
2791  mirror::DexCache* dex_cache = NULL;
2792  {
2793    mirror::ObjectArray<mirror::Class>* resolved_types = proxy_method->GetDexCacheResolvedTypes();
2794    ReaderMutexLock mu(Thread::Current(), dex_lock_);
2795    for (size_t i = 0; i != dex_caches_.size(); ++i) {
2796      if (dex_caches_[i]->GetResolvedTypes() == resolved_types) {
2797        dex_cache = dex_caches_[i];
2798        break;
2799      }
2800    }
2801  }
2802  CHECK(dex_cache != NULL);
2803  uint32_t method_idx = proxy_method->GetDexMethodIndex();
2804  mirror::ArtMethod* resolved_method = dex_cache->GetResolvedMethod(method_idx);
2805  CHECK(resolved_method != NULL);
2806  return resolved_method;
2807}
2808
2809
2810mirror::ArtMethod* ClassLinker::CreateProxyConstructor(Thread* self,
2811                                                       SirtRef<mirror::Class>& klass,
2812                                                       mirror::Class* proxy_class) {
2813  // Create constructor for Proxy that must initialize h
2814  mirror::ObjectArray<mirror::ArtMethod>* proxy_direct_methods =
2815      proxy_class->GetDirectMethods();
2816  CHECK_EQ(proxy_direct_methods->GetLength(), 16);
2817  mirror::ArtMethod* proxy_constructor = proxy_direct_methods->Get(2);
2818  // Clone the existing constructor of Proxy (our constructor would just invoke it so steal its
2819  // code_ too)
2820  mirror::ArtMethod* constructor =
2821      down_cast<mirror::ArtMethod*>(proxy_constructor->Clone(self));
2822  if (constructor == NULL) {
2823    CHECK(self->IsExceptionPending());  // OOME.
2824    return NULL;
2825  }
2826  // Make this constructor public and fix the class to be our Proxy version
2827  constructor->SetAccessFlags((constructor->GetAccessFlags() & ~kAccProtected) | kAccPublic);
2828  constructor->SetDeclaringClass(klass.get());
2829  return constructor;
2830}
2831
2832static void CheckProxyConstructor(mirror::ArtMethod* constructor)
2833    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2834  CHECK(constructor->IsConstructor());
2835  MethodHelper mh(constructor);
2836  CHECK_STREQ(mh.GetName(), "<init>");
2837  CHECK_EQ(mh.GetSignature(), std::string("(Ljava/lang/reflect/InvocationHandler;)V"));
2838  DCHECK(constructor->IsPublic());
2839}
2840
2841mirror::ArtMethod* ClassLinker::CreateProxyMethod(Thread* self, SirtRef<mirror::Class>& klass,
2842                                                       SirtRef<mirror::ArtMethod>& prototype) {
2843  // Ensure prototype is in dex cache so that we can use the dex cache to look up the overridden
2844  // prototype method
2845  prototype->GetDeclaringClass()->GetDexCache()->SetResolvedMethod(prototype->GetDexMethodIndex(),
2846                                                                   prototype.get());
2847  // We steal everything from the prototype (such as DexCache, invoke stub, etc.) then specialize
2848  // as necessary
2849  mirror::ArtMethod* method = down_cast<mirror::ArtMethod*>(prototype->Clone(self));
2850  if (UNLIKELY(method == NULL)) {
2851    CHECK(self->IsExceptionPending());  // OOME.
2852    return NULL;
2853  }
2854
2855  // Set class to be the concrete proxy class and clear the abstract flag, modify exceptions to
2856  // the intersection of throw exceptions as defined in Proxy
2857  method->SetDeclaringClass(klass.get());
2858  method->SetAccessFlags((method->GetAccessFlags() & ~kAccAbstract) | kAccFinal);
2859
2860  // At runtime the method looks like a reference and argument saving method, clone the code
2861  // related parameters from this method.
2862  mirror::ArtMethod* refs_and_args =
2863      Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsAndArgs);
2864  method->SetCoreSpillMask(refs_and_args->GetCoreSpillMask());
2865  method->SetFpSpillMask(refs_and_args->GetFpSpillMask());
2866  method->SetFrameSizeInBytes(refs_and_args->GetFrameSizeInBytes());
2867  method->SetEntryPointFromCompiledCode(GetProxyInvokeHandler());
2868  method->SetEntryPointFromInterpreter(artInterpreterToCompiledCodeBridge);
2869
2870  return method;
2871}
2872
2873static void CheckProxyMethod(mirror::ArtMethod* method,
2874                             SirtRef<mirror::ArtMethod>& prototype)
2875    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2876  // Basic sanity
2877  CHECK(!prototype->IsFinal());
2878  CHECK(method->IsFinal());
2879  CHECK(!method->IsAbstract());
2880
2881  // The proxy method doesn't have its own dex cache or dex file and so it steals those of its
2882  // interface prototype. The exception to this are Constructors and the Class of the Proxy itself.
2883  CHECK_EQ(prototype->GetDexCacheStrings(), method->GetDexCacheStrings());
2884  CHECK_EQ(prototype->GetDexCacheResolvedMethods(), method->GetDexCacheResolvedMethods());
2885  CHECK_EQ(prototype->GetDexCacheResolvedTypes(), method->GetDexCacheResolvedTypes());
2886  CHECK_EQ(prototype->GetDexCacheInitializedStaticStorage(),
2887           method->GetDexCacheInitializedStaticStorage());
2888  CHECK_EQ(prototype->GetDexMethodIndex(), method->GetDexMethodIndex());
2889
2890  MethodHelper mh(method);
2891  MethodHelper mh2(prototype.get());
2892  CHECK_STREQ(mh.GetName(), mh2.GetName());
2893  CHECK_STREQ(mh.GetShorty(), mh2.GetShorty());
2894  // More complex sanity - via dex cache
2895  CHECK_EQ(mh.GetReturnType(), mh2.GetReturnType());
2896}
2897
2898static bool CanWeInitializeClass(mirror::Class* klass, bool can_init_statics,
2899                                 bool can_init_parents)
2900    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2901  if (can_init_statics && can_init_statics) {
2902    return true;
2903  }
2904  if (!can_init_statics) {
2905    // Check if there's a class initializer.
2906    mirror::ArtMethod* clinit = klass->FindDeclaredDirectMethod("<clinit>", "()V");
2907    if (clinit != NULL) {
2908      return false;
2909    }
2910    // Check if there are encoded static values needing initialization.
2911    if (klass->NumStaticFields() != 0) {
2912      ClassHelper kh(klass);
2913      const DexFile::ClassDef* dex_class_def = kh.GetClassDef();
2914      DCHECK(dex_class_def != NULL);
2915      if (dex_class_def->static_values_off_ != 0) {
2916        return false;
2917      }
2918    }
2919  }
2920  if (!klass->IsInterface() && klass->HasSuperClass()) {
2921    mirror::Class* super_class = klass->GetSuperClass();
2922    if (!can_init_parents && !super_class->IsInitialized()) {
2923      return false;
2924    } else {
2925      if (!CanWeInitializeClass(super_class, can_init_statics, true)) {
2926        return false;
2927      }
2928    }
2929  }
2930  return true;
2931}
2932
2933bool ClassLinker::InitializeClass(mirror::Class* klass, bool can_init_statics,
2934                                  bool can_init_parents) {
2935  // see JLS 3rd edition, 12.4.2 "Detailed Initialization Procedure" for the locking protocol
2936
2937  // Are we already initialized and therefore done?
2938  // Note: we differ from the JLS here as we don't do this under the lock, this is benign as
2939  // an initialized class will never change its state.
2940  if (klass->IsInitialized()) {
2941    return true;
2942  }
2943
2944  // Fast fail if initialization requires a full runtime. Not part of the JLS.
2945  if (!CanWeInitializeClass(klass, can_init_statics, can_init_parents)) {
2946    return false;
2947  }
2948
2949  Thread* self = Thread::Current();
2950  uint64_t t0;
2951  {
2952    ObjectLock lock(self, klass);
2953
2954    // Re-check under the lock in case another thread initialized ahead of us.
2955    if (klass->IsInitialized()) {
2956      return true;
2957    }
2958
2959    // Was the class already found to be erroneous? Done under the lock to match the JLS.
2960    if (klass->IsErroneous()) {
2961      ThrowEarlierClassFailure(klass);
2962      return false;
2963    }
2964
2965    CHECK(klass->IsResolved()) << PrettyClass(klass) << ": state=" << klass->GetStatus();
2966
2967    if (!klass->IsVerified()) {
2968      VerifyClass(klass);
2969      if (!klass->IsVerified()) {
2970        // We failed to verify, expect either the klass to be erroneous or verification failed at
2971        // compile time.
2972        if (klass->IsErroneous()) {
2973          CHECK(self->IsExceptionPending());
2974        } else {
2975          CHECK(Runtime::Current()->IsCompiler());
2976          CHECK_EQ(klass->GetStatus(), mirror::Class::kStatusRetryVerificationAtRuntime);
2977        }
2978        return false;
2979      }
2980    }
2981
2982    // If the class is kStatusInitializing, either this thread is
2983    // initializing higher up the stack or another thread has beat us
2984    // to initializing and we need to wait. Either way, this
2985    // invocation of InitializeClass will not be responsible for
2986    // running <clinit> and will return.
2987    if (klass->GetStatus() == mirror::Class::kStatusInitializing) {
2988      // We caught somebody else in the act; was it us?
2989      if (klass->GetClinitThreadId() == self->GetTid()) {
2990        // Yes. That's fine. Return so we can continue initializing.
2991        return true;
2992      }
2993      // No. That's fine. Wait for another thread to finish initializing.
2994      return WaitForInitializeClass(klass, self, lock);
2995    }
2996
2997    if (!ValidateSuperClassDescriptors(klass)) {
2998      klass->SetStatus(mirror::Class::kStatusError, self);
2999      return false;
3000    }
3001
3002    CHECK_EQ(klass->GetStatus(), mirror::Class::kStatusVerified) << PrettyClass(klass);
3003
3004    // From here out other threads may observe that we're initializing and so changes of state
3005    // require the a notification.
3006    klass->SetClinitThreadId(self->GetTid());
3007    klass->SetStatus(mirror::Class::kStatusInitializing, self);
3008
3009    t0 = NanoTime();
3010  }
3011
3012  // Initialize super classes, must be done while initializing for the JLS.
3013  if (!klass->IsInterface() && klass->HasSuperClass()) {
3014    mirror::Class* super_class = klass->GetSuperClass();
3015    if (!super_class->IsInitialized()) {
3016      CHECK(!super_class->IsInterface());
3017      CHECK(can_init_parents);
3018      bool super_initialized = InitializeClass(super_class, can_init_statics, true);
3019      if (!super_initialized) {
3020        // The super class was verified ahead of entering initializing, we should only be here if
3021        // the super class became erroneous due to initialization.
3022        CHECK(super_class->IsErroneous() && self->IsExceptionPending())
3023            << "Super class initialization failed for " << PrettyDescriptor(super_class)
3024            << " that has unexpected status " << super_class->GetStatus()
3025            << "\nPending exception:\n"
3026            << (self->GetException(NULL) != NULL ? self->GetException(NULL)->Dump() : "");
3027        ObjectLock lock(self, klass);
3028        // Initialization failed because the super-class is erroneous.
3029        klass->SetStatus(mirror::Class::kStatusError, self);
3030        return false;
3031      }
3032    }
3033  }
3034
3035  if (klass->NumStaticFields() > 0) {
3036    ClassHelper kh(klass);
3037    const DexFile::ClassDef* dex_class_def = kh.GetClassDef();
3038    CHECK(dex_class_def != NULL);
3039    const DexFile& dex_file = kh.GetDexFile();
3040    EncodedStaticFieldValueIterator it(dex_file, kh.GetDexCache(), klass->GetClassLoader(),
3041                                       this, *dex_class_def);
3042    if (it.HasNext()) {
3043      CHECK(can_init_statics);
3044      // We reordered the fields, so we need to be able to map the field indexes to the right fields.
3045      SafeMap<uint32_t, mirror::ArtField*> field_map;
3046      ConstructFieldMap(dex_file, *dex_class_def, klass, field_map);
3047      for (size_t i = 0; it.HasNext(); i++, it.Next()) {
3048        it.ReadValueToField(field_map.Get(i));
3049      }
3050    }
3051  }
3052
3053  mirror::ArtMethod* clinit = klass->FindDeclaredDirectMethod("<clinit>", "()V");
3054  if (clinit != NULL) {
3055    CHECK(can_init_statics);
3056    if (LIKELY(Runtime::Current()->IsStarted())) {
3057      JValue result;
3058      clinit->Invoke(self, NULL, 0, &result, 'V');
3059    } else {
3060      art::interpreter::EnterInterpreterFromInvoke(self, clinit, NULL, NULL, NULL);
3061    }
3062  }
3063
3064  // Opportunistically set static method trampolines to their destination.
3065  FixupStaticTrampolines(klass);
3066
3067  uint64_t t1 = NanoTime();
3068
3069  bool success = true;
3070  {
3071    ObjectLock lock(self, klass);
3072
3073    if (self->IsExceptionPending()) {
3074      WrapExceptionInInitializer();
3075      klass->SetStatus(mirror::Class::kStatusError, self);
3076      success = false;
3077    } else {
3078      RuntimeStats* global_stats = Runtime::Current()->GetStats();
3079      RuntimeStats* thread_stats = self->GetStats();
3080      ++global_stats->class_init_count;
3081      ++thread_stats->class_init_count;
3082      global_stats->class_init_time_ns += (t1 - t0);
3083      thread_stats->class_init_time_ns += (t1 - t0);
3084      // Set the class as initialized except if failed to initialize static fields.
3085      klass->SetStatus(mirror::Class::kStatusInitialized, self);
3086      if (VLOG_IS_ON(class_linker)) {
3087        ClassHelper kh(klass);
3088        LOG(INFO) << "Initialized class " << kh.GetDescriptor() << " from " << kh.GetLocation();
3089      }
3090    }
3091  }
3092  return success;
3093}
3094
3095bool ClassLinker::WaitForInitializeClass(mirror::Class* klass, Thread* self, ObjectLock& lock)
3096    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
3097  while (true) {
3098    self->AssertNoPendingException();
3099    CHECK(!klass->IsInitialized());
3100    lock.WaitIgnoringInterrupts();
3101
3102    // When we wake up, repeat the test for init-in-progress.  If
3103    // there's an exception pending (only possible if
3104    // "interruptShouldThrow" was set), bail out.
3105    if (self->IsExceptionPending()) {
3106      WrapExceptionInInitializer();
3107      klass->SetStatus(mirror::Class::kStatusError, self);
3108      return false;
3109    }
3110    // Spurious wakeup? Go back to waiting.
3111    if (klass->GetStatus() == mirror::Class::kStatusInitializing) {
3112      continue;
3113    }
3114    if (klass->GetStatus() == mirror::Class::kStatusVerified && Runtime::Current()->IsCompiler()) {
3115      // Compile time initialization failed.
3116      return false;
3117    }
3118    if (klass->IsErroneous()) {
3119      // The caller wants an exception, but it was thrown in a
3120      // different thread.  Synthesize one here.
3121      ThrowNoClassDefFoundError("<clinit> failed for class %s; see exception in other thread",
3122                                PrettyDescriptor(klass).c_str());
3123      return false;
3124    }
3125    if (klass->IsInitialized()) {
3126      return true;
3127    }
3128    LOG(FATAL) << "Unexpected class status. " << PrettyClass(klass) << " is " << klass->GetStatus();
3129  }
3130  LOG(FATAL) << "Not Reached" << PrettyClass(klass);
3131}
3132
3133bool ClassLinker::ValidateSuperClassDescriptors(const mirror::Class* klass) {
3134  if (klass->IsInterface()) {
3135    return true;
3136  }
3137  // begin with the methods local to the superclass
3138  if (klass->HasSuperClass() &&
3139      klass->GetClassLoader() != klass->GetSuperClass()->GetClassLoader()) {
3140    const mirror::Class* super = klass->GetSuperClass();
3141    for (int i = super->GetVTable()->GetLength() - 1; i >= 0; --i) {
3142      const mirror::ArtMethod* method = klass->GetVTable()->Get(i);
3143      if (method != super->GetVTable()->Get(i) &&
3144          !IsSameMethodSignatureInDifferentClassContexts(method, super, klass)) {
3145        ThrowLinkageError(klass, "Class %s method %s resolves differently in superclass %s",
3146                          PrettyDescriptor(klass).c_str(), PrettyMethod(method).c_str(),
3147                          PrettyDescriptor(super).c_str());
3148        return false;
3149      }
3150    }
3151  }
3152  mirror::IfTable* iftable = klass->GetIfTable();
3153  for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) {
3154    mirror::Class* interface = iftable->GetInterface(i);
3155    if (klass->GetClassLoader() != interface->GetClassLoader()) {
3156      for (size_t j = 0; j < interface->NumVirtualMethods(); ++j) {
3157        const mirror::ArtMethod* method = iftable->GetMethodArray(i)->Get(j);
3158        if (!IsSameMethodSignatureInDifferentClassContexts(method, interface,
3159                                                           method->GetDeclaringClass())) {
3160          ThrowLinkageError(klass, "Class %s method %s resolves differently in interface %s",
3161                            PrettyDescriptor(method->GetDeclaringClass()).c_str(),
3162                            PrettyMethod(method).c_str(),
3163                            PrettyDescriptor(interface).c_str());
3164          return false;
3165        }
3166      }
3167    }
3168  }
3169  return true;
3170}
3171
3172// Returns true if classes referenced by the signature of the method are the
3173// same classes in klass1 as they are in klass2.
3174bool ClassLinker::IsSameMethodSignatureInDifferentClassContexts(const mirror::ArtMethod* method,
3175                                                                const mirror::Class* klass1,
3176                                                                const mirror::Class* klass2) {
3177  if (klass1 == klass2) {
3178    return true;
3179  }
3180  const DexFile& dex_file = *method->GetDeclaringClass()->GetDexCache()->GetDexFile();
3181  const DexFile::ProtoId& proto_id =
3182      dex_file.GetMethodPrototype(dex_file.GetMethodId(method->GetDexMethodIndex()));
3183  for (DexFileParameterIterator it(dex_file, proto_id); it.HasNext(); it.Next()) {
3184    const char* descriptor = it.GetDescriptor();
3185    if (descriptor == NULL) {
3186      break;
3187    }
3188    if (descriptor[0] == 'L' || descriptor[0] == '[') {
3189      // Found a non-primitive type.
3190      if (!IsSameDescriptorInDifferentClassContexts(descriptor, klass1, klass2)) {
3191        return false;
3192      }
3193    }
3194  }
3195  // Check the return type
3196  const char* descriptor = dex_file.GetReturnTypeDescriptor(proto_id);
3197  if (descriptor[0] == 'L' || descriptor[0] == '[') {
3198    if (!IsSameDescriptorInDifferentClassContexts(descriptor, klass1, klass2)) {
3199      return false;
3200    }
3201  }
3202  return true;
3203}
3204
3205// Returns true if the descriptor resolves to the same class in the context of klass1 and klass2.
3206bool ClassLinker::IsSameDescriptorInDifferentClassContexts(const char* descriptor,
3207                                                           const mirror::Class* klass1,
3208                                                           const mirror::Class* klass2) {
3209  CHECK(descriptor != NULL);
3210  CHECK(klass1 != NULL);
3211  CHECK(klass2 != NULL);
3212  if (klass1 == klass2) {
3213    return true;
3214  }
3215  mirror::Class* found1 = FindClass(descriptor, klass1->GetClassLoader());
3216  if (found1 == NULL) {
3217    Thread::Current()->ClearException();
3218  }
3219  mirror::Class* found2 = FindClass(descriptor, klass2->GetClassLoader());
3220  if (found2 == NULL) {
3221    Thread::Current()->ClearException();
3222  }
3223  return found1 == found2;
3224}
3225
3226bool ClassLinker::EnsureInitialized(mirror::Class* c, bool can_init_fields, bool can_init_parents) {
3227  DCHECK(c != NULL);
3228  if (c->IsInitialized()) {
3229    return true;
3230  }
3231
3232  bool success = InitializeClass(c, can_init_fields, can_init_parents);
3233  if (!success) {
3234    Thread* self = Thread::Current();
3235    CHECK(self->IsExceptionPending() || !can_init_fields || !can_init_parents) << PrettyClass(c);
3236  }
3237  return success;
3238}
3239
3240void ClassLinker::ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def,
3241                                    mirror::Class* c, SafeMap<uint32_t, mirror::ArtField*>& field_map) {
3242  mirror::ClassLoader* cl = c->GetClassLoader();
3243  const byte* class_data = dex_file.GetClassData(dex_class_def);
3244  ClassDataItemIterator it(dex_file, class_data);
3245  for (size_t i = 0; it.HasNextStaticField(); i++, it.Next()) {
3246    field_map.Put(i, ResolveField(dex_file, it.GetMemberIndex(), c->GetDexCache(), cl, true));
3247  }
3248}
3249
3250bool ClassLinker::LinkClass(SirtRef<mirror::Class>& klass,
3251                            mirror::ObjectArray<mirror::Class>* interfaces, Thread* self) {
3252  CHECK_EQ(mirror::Class::kStatusLoaded, klass->GetStatus());
3253  if (!LinkSuperClass(klass)) {
3254    return false;
3255  }
3256  if (!LinkMethods(klass, interfaces)) {
3257    return false;
3258  }
3259  if (!LinkInstanceFields(klass)) {
3260    return false;
3261  }
3262  if (!LinkStaticFields(klass)) {
3263    return false;
3264  }
3265  CreateReferenceInstanceOffsets(klass);
3266  CreateReferenceStaticOffsets(klass);
3267  CHECK_EQ(mirror::Class::kStatusLoaded, klass->GetStatus());
3268  klass->SetStatus(mirror::Class::kStatusResolved, self);
3269  return true;
3270}
3271
3272bool ClassLinker::LoadSuperAndInterfaces(SirtRef<mirror::Class>& klass, const DexFile& dex_file) {
3273  CHECK_EQ(mirror::Class::kStatusIdx, klass->GetStatus());
3274  const DexFile::ClassDef& class_def = dex_file.GetClassDef(klass->GetDexClassDefIndex());
3275  uint16_t super_class_idx = class_def.superclass_idx_;
3276  if (super_class_idx != DexFile::kDexNoIndex16) {
3277    mirror::Class* super_class = ResolveType(dex_file, super_class_idx, klass.get());
3278    if (super_class == NULL) {
3279      DCHECK(Thread::Current()->IsExceptionPending());
3280      return false;
3281    }
3282    // Verify
3283    if (!klass->CanAccess(super_class)) {
3284      ThrowIllegalAccessError(klass.get(), "Class %s extended by class %s is inaccessible",
3285                              PrettyDescriptor(super_class).c_str(),
3286                              PrettyDescriptor(klass.get()).c_str());
3287      return false;
3288    }
3289    klass->SetSuperClass(super_class);
3290  }
3291  const DexFile::TypeList* interfaces = dex_file.GetInterfacesList(class_def);
3292  if (interfaces != NULL) {
3293    for (size_t i = 0; i < interfaces->Size(); i++) {
3294      uint16_t idx = interfaces->GetTypeItem(i).type_idx_;
3295      mirror::Class* interface = ResolveType(dex_file, idx, klass.get());
3296      if (interface == NULL) {
3297        DCHECK(Thread::Current()->IsExceptionPending());
3298        return false;
3299      }
3300      // Verify
3301      if (!klass->CanAccess(interface)) {
3302        // TODO: the RI seemed to ignore this in my testing.
3303        ThrowIllegalAccessError(klass.get(), "Interface %s implemented by class %s is inaccessible",
3304                                PrettyDescriptor(interface).c_str(),
3305                                PrettyDescriptor(klass.get()).c_str());
3306        return false;
3307      }
3308    }
3309  }
3310  // Mark the class as loaded.
3311  klass->SetStatus(mirror::Class::kStatusLoaded, NULL);
3312  return true;
3313}
3314
3315bool ClassLinker::LinkSuperClass(SirtRef<mirror::Class>& klass) {
3316  CHECK(!klass->IsPrimitive());
3317  mirror::Class* super = klass->GetSuperClass();
3318  if (klass.get() == GetClassRoot(kJavaLangObject)) {
3319    if (super != NULL) {
3320      ThrowClassFormatError(klass.get(), "java.lang.Object must not have a superclass");
3321      return false;
3322    }
3323    return true;
3324  }
3325  if (super == NULL) {
3326    ThrowLinkageError(klass.get(), "No superclass defined for class %s",
3327                      PrettyDescriptor(klass.get()).c_str());
3328    return false;
3329  }
3330  // Verify
3331  if (super->IsFinal() || super->IsInterface()) {
3332    ThrowIncompatibleClassChangeError(klass.get(), "Superclass %s of %s is %s",
3333                                      PrettyDescriptor(super).c_str(),
3334                                      PrettyDescriptor(klass.get()).c_str(),
3335                                      super->IsFinal() ? "declared final" : "an interface");
3336    return false;
3337  }
3338  if (!klass->CanAccess(super)) {
3339    ThrowIllegalAccessError(klass.get(), "Superclass %s is inaccessible to class %s",
3340                            PrettyDescriptor(super).c_str(),
3341                            PrettyDescriptor(klass.get()).c_str());
3342    return false;
3343  }
3344
3345  // Inherit kAccClassIsFinalizable from the superclass in case this class doesn't override finalize.
3346  if (super->IsFinalizable()) {
3347    klass->SetFinalizable();
3348  }
3349
3350  // Inherit reference flags (if any) from the superclass.
3351  int reference_flags = (super->GetAccessFlags() & kAccReferenceFlagsMask);
3352  if (reference_flags != 0) {
3353    klass->SetAccessFlags(klass->GetAccessFlags() | reference_flags);
3354  }
3355  // Disallow custom direct subclasses of java.lang.ref.Reference.
3356  if (init_done_ && super == GetClassRoot(kJavaLangRefReference)) {
3357    ThrowLinkageError(klass.get(),
3358                      "Class %s attempts to subclass java.lang.ref.Reference, which is not allowed",
3359                      PrettyDescriptor(klass.get()).c_str());
3360    return false;
3361  }
3362
3363  if (kIsDebugBuild) {
3364    // Ensure super classes are fully resolved prior to resolving fields..
3365    while (super != NULL) {
3366      CHECK(super->IsResolved());
3367      super = super->GetSuperClass();
3368    }
3369  }
3370  return true;
3371}
3372
3373// Populate the class vtable and itable. Compute return type indices.
3374bool ClassLinker::LinkMethods(SirtRef<mirror::Class>& klass,
3375                              mirror::ObjectArray<mirror::Class>* interfaces) {
3376  if (klass->IsInterface()) {
3377    // No vtable.
3378    size_t count = klass->NumVirtualMethods();
3379    if (!IsUint(16, count)) {
3380      ThrowClassFormatError(klass.get(), "Too many methods on interface: %zd", count);
3381      return false;
3382    }
3383    for (size_t i = 0; i < count; ++i) {
3384      klass->GetVirtualMethodDuringLinking(i)->SetMethodIndex(i);
3385    }
3386    // Link interface method tables
3387    return LinkInterfaceMethods(klass, interfaces);
3388  } else {
3389    // Link virtual and interface method tables
3390    return LinkVirtualMethods(klass) && LinkInterfaceMethods(klass, interfaces);
3391  }
3392  return true;
3393}
3394
3395bool ClassLinker::LinkVirtualMethods(SirtRef<mirror::Class>& klass) {
3396  Thread* self = Thread::Current();
3397  if (klass->HasSuperClass()) {
3398    uint32_t max_count = klass->NumVirtualMethods() + klass->GetSuperClass()->GetVTable()->GetLength();
3399    size_t actual_count = klass->GetSuperClass()->GetVTable()->GetLength();
3400    CHECK_LE(actual_count, max_count);
3401    // TODO: do not assign to the vtable field until it is fully constructed.
3402    SirtRef<mirror::ObjectArray<mirror::ArtMethod> >
3403      vtable(self, klass->GetSuperClass()->GetVTable()->CopyOf(self, max_count));
3404    if (UNLIKELY(vtable.get() == NULL)) {
3405      CHECK(self->IsExceptionPending());  // OOME.
3406      return false;
3407    }
3408    // See if any of our virtual methods override the superclass.
3409    MethodHelper local_mh(NULL, this);
3410    MethodHelper super_mh(NULL, this);
3411    for (size_t i = 0; i < klass->NumVirtualMethods(); ++i) {
3412      mirror::ArtMethod* local_method = klass->GetVirtualMethodDuringLinking(i);
3413      local_mh.ChangeMethod(local_method);
3414      size_t j = 0;
3415      for (; j < actual_count; ++j) {
3416        mirror::ArtMethod* super_method = vtable->Get(j);
3417        super_mh.ChangeMethod(super_method);
3418        if (local_mh.HasSameNameAndSignature(&super_mh)) {
3419          if (klass->CanAccessMember(super_method->GetDeclaringClass(), super_method->GetAccessFlags())) {
3420            if (super_method->IsFinal()) {
3421              ThrowLinkageError(klass.get(), "Method %s overrides final method in class %s",
3422                                PrettyMethod(local_method).c_str(),
3423                                super_mh.GetDeclaringClassDescriptor());
3424              return false;
3425            }
3426            vtable->Set(j, local_method);
3427            local_method->SetMethodIndex(j);
3428            break;
3429          } else {
3430            LOG(WARNING) << "Before Android 4.1, method " << PrettyMethod(local_method)
3431                         << " would have incorrectly overridden the package-private method in "
3432                         << PrettyDescriptor(super_mh.GetDeclaringClassDescriptor());
3433          }
3434        }
3435      }
3436      if (j == actual_count) {
3437        // Not overriding, append.
3438        vtable->Set(actual_count, local_method);
3439        local_method->SetMethodIndex(actual_count);
3440        actual_count += 1;
3441      }
3442    }
3443    if (!IsUint(16, actual_count)) {
3444      ThrowClassFormatError(klass.get(), "Too many methods defined on class: %zd", actual_count);
3445      return false;
3446    }
3447    // Shrink vtable if possible
3448    CHECK_LE(actual_count, max_count);
3449    if (actual_count < max_count) {
3450      vtable.reset(vtable->CopyOf(self, actual_count));
3451      if (UNLIKELY(vtable.get() == NULL)) {
3452        CHECK(self->IsExceptionPending());  // OOME.
3453        return false;
3454      }
3455    }
3456    klass->SetVTable(vtable.get());
3457  } else {
3458    CHECK(klass.get() == GetClassRoot(kJavaLangObject));
3459    uint32_t num_virtual_methods = klass->NumVirtualMethods();
3460    if (!IsUint(16, num_virtual_methods)) {
3461      ThrowClassFormatError(klass.get(), "Too many methods: %d", num_virtual_methods);
3462      return false;
3463    }
3464    SirtRef<mirror::ObjectArray<mirror::ArtMethod> >
3465        vtable(self, AllocArtMethodArray(self, num_virtual_methods));
3466    if (UNLIKELY(vtable.get() == NULL)) {
3467      CHECK(self->IsExceptionPending());  // OOME.
3468      return false;
3469    }
3470    for (size_t i = 0; i < num_virtual_methods; ++i) {
3471      mirror::ArtMethod* virtual_method = klass->GetVirtualMethodDuringLinking(i);
3472      vtable->Set(i, virtual_method);
3473      virtual_method->SetMethodIndex(i & 0xFFFF);
3474    }
3475    klass->SetVTable(vtable.get());
3476  }
3477  return true;
3478}
3479
3480bool ClassLinker::LinkInterfaceMethods(SirtRef<mirror::Class>& klass,
3481                                       mirror::ObjectArray<mirror::Class>* interfaces) {
3482  size_t super_ifcount;
3483  if (klass->HasSuperClass()) {
3484    super_ifcount = klass->GetSuperClass()->GetIfTableCount();
3485  } else {
3486    super_ifcount = 0;
3487  }
3488  size_t ifcount = super_ifcount;
3489  ClassHelper kh(klass.get(), this);
3490  uint32_t num_interfaces = interfaces == NULL ? kh.NumDirectInterfaces() : interfaces->GetLength();
3491  ifcount += num_interfaces;
3492  for (size_t i = 0; i < num_interfaces; i++) {
3493    mirror::Class* interface = interfaces == NULL ? kh.GetDirectInterface(i) : interfaces->Get(i);
3494    ifcount += interface->GetIfTableCount();
3495  }
3496  if (ifcount == 0) {
3497    // Class implements no interfaces.
3498    DCHECK_EQ(klass->GetIfTableCount(), 0);
3499    DCHECK(klass->GetIfTable() == NULL);
3500    return true;
3501  }
3502  if (ifcount == super_ifcount) {
3503    // Class implements same interfaces as parent, are any of these not marker interfaces?
3504    bool has_non_marker_interface = false;
3505    mirror::IfTable* super_iftable = klass->GetSuperClass()->GetIfTable();
3506    for (size_t i = 0; i < ifcount; ++i) {
3507      if (super_iftable->GetMethodArrayCount(i) > 0) {
3508        has_non_marker_interface = true;
3509        break;
3510      }
3511    }
3512    if (!has_non_marker_interface) {
3513      // Class just inherits marker interfaces from parent so recycle parent's iftable.
3514      klass->SetIfTable(super_iftable);
3515      return true;
3516    }
3517  }
3518  Thread* self = Thread::Current();
3519  SirtRef<mirror::IfTable> iftable(self, AllocIfTable(self, ifcount));
3520  if (UNLIKELY(iftable.get() == NULL)) {
3521    CHECK(self->IsExceptionPending());  // OOME.
3522    return false;
3523  }
3524  if (super_ifcount != 0) {
3525    mirror::IfTable* super_iftable = klass->GetSuperClass()->GetIfTable();
3526    for (size_t i = 0; i < super_ifcount; i++) {
3527      mirror::Class* super_interface = super_iftable->GetInterface(i);
3528      iftable->SetInterface(i, super_interface);
3529    }
3530  }
3531  // Flatten the interface inheritance hierarchy.
3532  size_t idx = super_ifcount;
3533  for (size_t i = 0; i < num_interfaces; i++) {
3534    mirror::Class* interface = interfaces == NULL ? kh.GetDirectInterface(i) : interfaces->Get(i);
3535    DCHECK(interface != NULL);
3536    if (!interface->IsInterface()) {
3537      ClassHelper ih(interface);
3538      ThrowIncompatibleClassChangeError(klass.get(), "Class %s implements non-interface class %s",
3539                                        PrettyDescriptor(klass.get()).c_str(),
3540                                        PrettyDescriptor(ih.GetDescriptor()).c_str());
3541      return false;
3542    }
3543    // Check if interface is already in iftable
3544    bool duplicate = false;
3545    for (size_t j = 0; j < idx; j++) {
3546      mirror::Class* existing_interface = iftable->GetInterface(j);
3547      if (existing_interface == interface) {
3548        duplicate = true;
3549        break;
3550      }
3551    }
3552    if (!duplicate) {
3553      // Add this non-duplicate interface.
3554      iftable->SetInterface(idx++, interface);
3555      // Add this interface's non-duplicate super-interfaces.
3556      for (int32_t j = 0; j < interface->GetIfTableCount(); j++) {
3557        mirror::Class* super_interface = interface->GetIfTable()->GetInterface(j);
3558        bool super_duplicate = false;
3559        for (size_t k = 0; k < idx; k++) {
3560          mirror::Class* existing_interface = iftable->GetInterface(k);
3561          if (existing_interface == super_interface) {
3562            super_duplicate = true;
3563            break;
3564          }
3565        }
3566        if (!super_duplicate) {
3567          iftable->SetInterface(idx++, super_interface);
3568        }
3569      }
3570    }
3571  }
3572  // Shrink iftable in case duplicates were found
3573  if (idx < ifcount) {
3574    iftable.reset(down_cast<mirror::IfTable*>(iftable->CopyOf(self, idx * mirror::IfTable::kMax)));
3575    if (UNLIKELY(iftable.get() == NULL)) {
3576      CHECK(self->IsExceptionPending());  // OOME.
3577      return false;
3578    }
3579    ifcount = idx;
3580  } else {
3581    CHECK_EQ(idx, ifcount);
3582  }
3583  klass->SetIfTable(iftable.get());
3584
3585  // If we're an interface, we don't need the vtable pointers, so we're done.
3586  if (klass->IsInterface()) {
3587    return true;
3588  }
3589  std::vector<mirror::ArtMethod*> miranda_list;
3590  MethodHelper vtable_mh(NULL, this);
3591  MethodHelper interface_mh(NULL, this);
3592  for (size_t i = 0; i < ifcount; ++i) {
3593    mirror::Class* interface = iftable->GetInterface(i);
3594    size_t num_methods = interface->NumVirtualMethods();
3595    if (num_methods > 0) {
3596      mirror::ObjectArray<mirror::ArtMethod>* method_array =
3597          AllocArtMethodArray(self, num_methods);
3598      if (UNLIKELY(method_array == NULL)) {
3599        CHECK(self->IsExceptionPending());  // OOME.
3600        return false;
3601      }
3602      iftable->SetMethodArray(i, method_array);
3603      mirror::ObjectArray<mirror::ArtMethod>* vtable = klass->GetVTableDuringLinking();
3604      for (size_t j = 0; j < num_methods; ++j) {
3605        mirror::ArtMethod* interface_method = interface->GetVirtualMethod(j);
3606        interface_mh.ChangeMethod(interface_method);
3607        int32_t k;
3608        // For each method listed in the interface's method list, find the
3609        // matching method in our class's method list.  We want to favor the
3610        // subclass over the superclass, which just requires walking
3611        // back from the end of the vtable.  (This only matters if the
3612        // superclass defines a private method and this class redefines
3613        // it -- otherwise it would use the same vtable slot.  In .dex files
3614        // those don't end up in the virtual method table, so it shouldn't
3615        // matter which direction we go.  We walk it backward anyway.)
3616        for (k = vtable->GetLength() - 1; k >= 0; --k) {
3617          mirror::ArtMethod* vtable_method = vtable->Get(k);
3618          vtable_mh.ChangeMethod(vtable_method);
3619          if (interface_mh.HasSameNameAndSignature(&vtable_mh)) {
3620            if (!vtable_method->IsAbstract() && !vtable_method->IsPublic()) {
3621              ThrowIllegalAccessError(klass.get(),
3622                                      "Method '%s' implementing interface method '%s' is not public",
3623                                      PrettyMethod(vtable_method).c_str(),
3624                                      PrettyMethod(interface_method).c_str());
3625              return false;
3626            }
3627            method_array->Set(j, vtable_method);
3628            break;
3629          }
3630        }
3631        if (k < 0) {
3632          SirtRef<mirror::ArtMethod> miranda_method(self, NULL);
3633          for (size_t mir = 0; mir < miranda_list.size(); mir++) {
3634            mirror::ArtMethod* mir_method = miranda_list[mir];
3635            vtable_mh.ChangeMethod(mir_method);
3636            if (interface_mh.HasSameNameAndSignature(&vtable_mh)) {
3637              miranda_method.reset(miranda_list[mir]);
3638              break;
3639            }
3640          }
3641          if (miranda_method.get() == NULL) {
3642            // Point the interface table at a phantom slot.
3643            miranda_method.reset(down_cast<mirror::ArtMethod*>(interface_method->Clone(self)));
3644            if (UNLIKELY(miranda_method.get() == NULL)) {
3645              CHECK(self->IsExceptionPending());  // OOME.
3646              return false;
3647            }
3648#ifdef MOVING_GARBAGE_COLLECTOR
3649            // TODO: If a methods move then the miranda_list may hold stale references.
3650            UNIMPLEMENTED(FATAL);
3651#endif
3652            miranda_list.push_back(miranda_method.get());
3653          }
3654          method_array->Set(j, miranda_method.get());
3655        }
3656      }
3657    }
3658  }
3659  if (!miranda_list.empty()) {
3660    int old_method_count = klass->NumVirtualMethods();
3661    int new_method_count = old_method_count + miranda_list.size();
3662    mirror::ObjectArray<mirror::ArtMethod>* virtuals;
3663    if (old_method_count == 0) {
3664      virtuals = AllocArtMethodArray(self, new_method_count);
3665    } else {
3666      virtuals = klass->GetVirtualMethods()->CopyOf(self, new_method_count);
3667    }
3668    if (UNLIKELY(virtuals == NULL)) {
3669      CHECK(self->IsExceptionPending());  // OOME.
3670      return false;
3671    }
3672    klass->SetVirtualMethods(virtuals);
3673
3674    SirtRef<mirror::ObjectArray<mirror::ArtMethod> >
3675        vtable(self, klass->GetVTableDuringLinking());
3676    CHECK(vtable.get() != NULL);
3677    int old_vtable_count = vtable->GetLength();
3678    int new_vtable_count = old_vtable_count + miranda_list.size();
3679    vtable.reset(vtable->CopyOf(self, new_vtable_count));
3680    if (UNLIKELY(vtable.get() == NULL)) {
3681      CHECK(self->IsExceptionPending());  // OOME.
3682      return false;
3683    }
3684    for (size_t i = 0; i < miranda_list.size(); ++i) {
3685      mirror::ArtMethod* method = miranda_list[i];
3686      // Leave the declaring class alone as type indices are relative to it
3687      method->SetAccessFlags(method->GetAccessFlags() | kAccMiranda);
3688      method->SetMethodIndex(0xFFFF & (old_vtable_count + i));
3689      klass->SetVirtualMethod(old_method_count + i, method);
3690      vtable->Set(old_vtable_count + i, method);
3691    }
3692    // TODO: do not assign to the vtable field until it is fully constructed.
3693    klass->SetVTable(vtable.get());
3694  }
3695
3696  mirror::ObjectArray<mirror::ArtMethod>* vtable = klass->GetVTableDuringLinking();
3697  for (int i = 0; i < vtable->GetLength(); ++i) {
3698    CHECK(vtable->Get(i) != NULL);
3699  }
3700
3701//  klass->DumpClass(std::cerr, Class::kDumpClassFullDetail);
3702
3703  return true;
3704}
3705
3706bool ClassLinker::LinkInstanceFields(SirtRef<mirror::Class>& klass) {
3707  CHECK(klass.get() != NULL);
3708  return LinkFields(klass, false);
3709}
3710
3711bool ClassLinker::LinkStaticFields(SirtRef<mirror::Class>& klass) {
3712  CHECK(klass.get() != NULL);
3713  size_t allocated_class_size = klass->GetClassSize();
3714  bool success = LinkFields(klass, true);
3715  CHECK_EQ(allocated_class_size, klass->GetClassSize());
3716  return success;
3717}
3718
3719struct LinkFieldsComparator {
3720  explicit LinkFieldsComparator(FieldHelper* fh)
3721      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
3722      : fh_(fh) {}
3723  // No thread safety analysis as will be called from STL. Checked lock held in constructor.
3724  bool operator()(const mirror::ArtField* field1, const mirror::ArtField* field2)
3725      NO_THREAD_SAFETY_ANALYSIS {
3726    // First come reference fields, then 64-bit, and finally 32-bit
3727    fh_->ChangeField(field1);
3728    Primitive::Type type1 = fh_->GetTypeAsPrimitiveType();
3729    fh_->ChangeField(field2);
3730    Primitive::Type type2 = fh_->GetTypeAsPrimitiveType();
3731    bool isPrimitive1 = type1 != Primitive::kPrimNot;
3732    bool isPrimitive2 = type2 != Primitive::kPrimNot;
3733    bool is64bit1 = isPrimitive1 && (type1 == Primitive::kPrimLong || type1 == Primitive::kPrimDouble);
3734    bool is64bit2 = isPrimitive2 && (type2 == Primitive::kPrimLong || type2 == Primitive::kPrimDouble);
3735    int order1 = (!isPrimitive1 ? 0 : (is64bit1 ? 1 : 2));
3736    int order2 = (!isPrimitive2 ? 0 : (is64bit2 ? 1 : 2));
3737    if (order1 != order2) {
3738      return order1 < order2;
3739    }
3740
3741    // same basic group? then sort by string.
3742    fh_->ChangeField(field1);
3743    StringPiece name1(fh_->GetName());
3744    fh_->ChangeField(field2);
3745    StringPiece name2(fh_->GetName());
3746    return name1 < name2;
3747  }
3748
3749  FieldHelper* fh_;
3750};
3751
3752bool ClassLinker::LinkFields(SirtRef<mirror::Class>& klass, bool is_static) {
3753  size_t num_fields =
3754      is_static ? klass->NumStaticFields() : klass->NumInstanceFields();
3755
3756  mirror::ObjectArray<mirror::ArtField>* fields =
3757      is_static ? klass->GetSFields() : klass->GetIFields();
3758
3759  // Initialize size and field_offset
3760  size_t size;
3761  MemberOffset field_offset(0);
3762  if (is_static) {
3763    size = klass->GetClassSize();
3764    field_offset = mirror::Class::FieldsOffset();
3765  } else {
3766    mirror::Class* super_class = klass->GetSuperClass();
3767    if (super_class != NULL) {
3768      CHECK(super_class->IsResolved());
3769      field_offset = MemberOffset(super_class->GetObjectSize());
3770    }
3771    size = field_offset.Uint32Value();
3772  }
3773
3774  CHECK_EQ(num_fields == 0, fields == NULL);
3775
3776  // we want a relatively stable order so that adding new fields
3777  // minimizes disruption of C++ version such as Class and Method.
3778  std::deque<mirror::ArtField*> grouped_and_sorted_fields;
3779  for (size_t i = 0; i < num_fields; i++) {
3780    grouped_and_sorted_fields.push_back(fields->Get(i));
3781  }
3782  FieldHelper fh(NULL, this);
3783  std::sort(grouped_and_sorted_fields.begin(),
3784            grouped_and_sorted_fields.end(),
3785            LinkFieldsComparator(&fh));
3786
3787  // References should be at the front.
3788  size_t current_field = 0;
3789  size_t num_reference_fields = 0;
3790  for (; current_field < num_fields; current_field++) {
3791    mirror::ArtField* field = grouped_and_sorted_fields.front();
3792    fh.ChangeField(field);
3793    Primitive::Type type = fh.GetTypeAsPrimitiveType();
3794    bool isPrimitive = type != Primitive::kPrimNot;
3795    if (isPrimitive) {
3796      break;  // past last reference, move on to the next phase
3797    }
3798    grouped_and_sorted_fields.pop_front();
3799    num_reference_fields++;
3800    fields->Set(current_field, field);
3801    field->SetOffset(field_offset);
3802    field_offset = MemberOffset(field_offset.Uint32Value() + sizeof(uint32_t));
3803  }
3804
3805  // Now we want to pack all of the double-wide fields together.  If
3806  // we're not aligned, though, we want to shuffle one 32-bit field
3807  // into place.  If we can't find one, we'll have to pad it.
3808  if (current_field != num_fields && !IsAligned<8>(field_offset.Uint32Value())) {
3809    for (size_t i = 0; i < grouped_and_sorted_fields.size(); i++) {
3810      mirror::ArtField* field = grouped_and_sorted_fields[i];
3811      fh.ChangeField(field);
3812      Primitive::Type type = fh.GetTypeAsPrimitiveType();
3813      CHECK(type != Primitive::kPrimNot);  // should only be working on primitive types
3814      if (type == Primitive::kPrimLong || type == Primitive::kPrimDouble) {
3815        continue;
3816      }
3817      fields->Set(current_field++, field);
3818      field->SetOffset(field_offset);
3819      // drop the consumed field
3820      grouped_and_sorted_fields.erase(grouped_and_sorted_fields.begin() + i);
3821      break;
3822    }
3823    // whether we found a 32-bit field for padding or not, we advance
3824    field_offset = MemberOffset(field_offset.Uint32Value() + sizeof(uint32_t));
3825  }
3826
3827  // Alignment is good, shuffle any double-wide fields forward, and
3828  // finish assigning field offsets to all fields.
3829  DCHECK(current_field == num_fields || IsAligned<8>(field_offset.Uint32Value()));
3830  while (!grouped_and_sorted_fields.empty()) {
3831    mirror::ArtField* field = grouped_and_sorted_fields.front();
3832    grouped_and_sorted_fields.pop_front();
3833    fh.ChangeField(field);
3834    Primitive::Type type = fh.GetTypeAsPrimitiveType();
3835    CHECK(type != Primitive::kPrimNot);  // should only be working on primitive types
3836    fields->Set(current_field, field);
3837    field->SetOffset(field_offset);
3838    field_offset = MemberOffset(field_offset.Uint32Value() +
3839                                ((type == Primitive::kPrimLong || type == Primitive::kPrimDouble)
3840                                 ? sizeof(uint64_t)
3841                                 : sizeof(uint32_t)));
3842    current_field++;
3843  }
3844
3845  // We lie to the GC about the java.lang.ref.Reference.referent field, so it doesn't scan it.
3846  if (!is_static &&
3847      StringPiece(ClassHelper(klass.get(), this).GetDescriptor()) == "Ljava/lang/ref/Reference;") {
3848    // We know there are no non-reference fields in the Reference classes, and we know
3849    // that 'referent' is alphabetically last, so this is easy...
3850    CHECK_EQ(num_reference_fields, num_fields);
3851    fh.ChangeField(fields->Get(num_fields - 1));
3852    CHECK_STREQ(fh.GetName(), "referent");
3853    --num_reference_fields;
3854  }
3855
3856#ifndef NDEBUG
3857  // Make sure that all reference fields appear before
3858  // non-reference fields, and all double-wide fields are aligned.
3859  bool seen_non_ref = false;
3860  for (size_t i = 0; i < num_fields; i++) {
3861    mirror::ArtField* field = fields->Get(i);
3862    if (false) {  // enable to debug field layout
3863      LOG(INFO) << "LinkFields: " << (is_static ? "static" : "instance")
3864                << " class=" << PrettyClass(klass.get())
3865                << " field=" << PrettyField(field)
3866                << " offset=" << field->GetField32(MemberOffset(mirror::ArtField::OffsetOffset()),
3867                                                   false);
3868    }
3869    fh.ChangeField(field);
3870    Primitive::Type type = fh.GetTypeAsPrimitiveType();
3871    bool is_primitive = type != Primitive::kPrimNot;
3872    if (StringPiece(ClassHelper(klass.get(), this).GetDescriptor()) == "Ljava/lang/ref/Reference;" &&
3873        StringPiece(fh.GetName()) == "referent") {
3874      is_primitive = true;  // We lied above, so we have to expect a lie here.
3875    }
3876    if (is_primitive) {
3877      if (!seen_non_ref) {
3878        seen_non_ref = true;
3879        DCHECK_EQ(num_reference_fields, i);
3880      }
3881    } else {
3882      DCHECK(!seen_non_ref);
3883    }
3884  }
3885  if (!seen_non_ref) {
3886    DCHECK_EQ(num_fields, num_reference_fields);
3887  }
3888#endif
3889  size = field_offset.Uint32Value();
3890  // Update klass
3891  if (is_static) {
3892    klass->SetNumReferenceStaticFields(num_reference_fields);
3893    klass->SetClassSize(size);
3894  } else {
3895    klass->SetNumReferenceInstanceFields(num_reference_fields);
3896    if (!klass->IsVariableSize()) {
3897      DCHECK_GE(size, sizeof(mirror::Object)) << ClassHelper(klass.get(), this).GetDescriptor();
3898      klass->SetObjectSize(size);
3899    }
3900  }
3901  return true;
3902}
3903
3904//  Set the bitmap of reference offsets, refOffsets, from the ifields
3905//  list.
3906void ClassLinker::CreateReferenceInstanceOffsets(SirtRef<mirror::Class>& klass) {
3907  uint32_t reference_offsets = 0;
3908  mirror::Class* super_class = klass->GetSuperClass();
3909  if (super_class != NULL) {
3910    reference_offsets = super_class->GetReferenceInstanceOffsets();
3911    // If our superclass overflowed, we don't stand a chance.
3912    if (reference_offsets == CLASS_WALK_SUPER) {
3913      klass->SetReferenceInstanceOffsets(reference_offsets);
3914      return;
3915    }
3916  }
3917  CreateReferenceOffsets(klass, false, reference_offsets);
3918}
3919
3920void ClassLinker::CreateReferenceStaticOffsets(SirtRef<mirror::Class>& klass) {
3921  CreateReferenceOffsets(klass, true, 0);
3922}
3923
3924void ClassLinker::CreateReferenceOffsets(SirtRef<mirror::Class>& klass, bool is_static,
3925                                         uint32_t reference_offsets) {
3926  size_t num_reference_fields =
3927      is_static ? klass->NumReferenceStaticFieldsDuringLinking()
3928                : klass->NumReferenceInstanceFieldsDuringLinking();
3929  const mirror::ObjectArray<mirror::ArtField>* fields =
3930      is_static ? klass->GetSFields() : klass->GetIFields();
3931  // All of the fields that contain object references are guaranteed
3932  // to be at the beginning of the fields list.
3933  for (size_t i = 0; i < num_reference_fields; ++i) {
3934    // Note that byte_offset is the offset from the beginning of
3935    // object, not the offset into instance data
3936    const mirror::ArtField* field = fields->Get(i);
3937    MemberOffset byte_offset = field->GetOffsetDuringLinking();
3938    CHECK_EQ(byte_offset.Uint32Value() & (CLASS_OFFSET_ALIGNMENT - 1), 0U);
3939    if (CLASS_CAN_ENCODE_OFFSET(byte_offset.Uint32Value())) {
3940      uint32_t new_bit = CLASS_BIT_FROM_OFFSET(byte_offset.Uint32Value());
3941      CHECK_NE(new_bit, 0U);
3942      reference_offsets |= new_bit;
3943    } else {
3944      reference_offsets = CLASS_WALK_SUPER;
3945      break;
3946    }
3947  }
3948  // Update fields in klass
3949  if (is_static) {
3950    klass->SetReferenceStaticOffsets(reference_offsets);
3951  } else {
3952    klass->SetReferenceInstanceOffsets(reference_offsets);
3953  }
3954}
3955
3956mirror::String* ClassLinker::ResolveString(const DexFile& dex_file,
3957                                           uint32_t string_idx, mirror::DexCache* dex_cache) {
3958  DCHECK(dex_cache != NULL);
3959  mirror::String* resolved = dex_cache->GetResolvedString(string_idx);
3960  if (resolved != NULL) {
3961    return resolved;
3962  }
3963  const DexFile::StringId& string_id = dex_file.GetStringId(string_idx);
3964  int32_t utf16_length = dex_file.GetStringLength(string_id);
3965  const char* utf8_data = dex_file.GetStringData(string_id);
3966  mirror::String* string = intern_table_->InternStrong(utf16_length, utf8_data);
3967  dex_cache->SetResolvedString(string_idx, string);
3968  return string;
3969}
3970
3971mirror::Class* ClassLinker::ResolveType(const DexFile& dex_file,
3972                                        uint16_t type_idx,
3973                                        mirror::DexCache* dex_cache,
3974                                        mirror::ClassLoader* class_loader) {
3975  DCHECK(dex_cache != NULL);
3976  mirror::Class* resolved = dex_cache->GetResolvedType(type_idx);
3977  if (resolved == NULL) {
3978    const char* descriptor = dex_file.StringByTypeIdx(type_idx);
3979    resolved = FindClass(descriptor, class_loader);
3980    if (resolved != NULL) {
3981      // TODO: we used to throw here if resolved's class loader was not the
3982      //       boot class loader. This was to permit different classes with the
3983      //       same name to be loaded simultaneously by different loaders
3984      dex_cache->SetResolvedType(type_idx, resolved);
3985    } else {
3986      Thread* self = Thread::Current();
3987      CHECK(self->IsExceptionPending())
3988          << "Expected pending exception for failed resolution of: " << descriptor;
3989      // Convert a ClassNotFoundException to a NoClassDefFoundError.
3990      SirtRef<mirror::Throwable> cause(self, self->GetException(NULL));
3991      if (cause->InstanceOf(GetClassRoot(kJavaLangClassNotFoundException))) {
3992        Thread::Current()->ClearException();
3993        ThrowNoClassDefFoundError("Failed resolution of: %s", descriptor);
3994        self->GetException(NULL)->SetCause(cause.get());
3995      }
3996    }
3997  }
3998  DCHECK((resolved == NULL) || resolved->IsResolved() || resolved->IsErroneous())
3999          << PrettyDescriptor(resolved) << " " << resolved->GetStatus();
4000  return resolved;
4001}
4002
4003mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file,
4004                                                   uint32_t method_idx,
4005                                                   mirror::DexCache* dex_cache,
4006                                                   mirror::ClassLoader* class_loader,
4007                                                   const mirror::ArtMethod* referrer,
4008                                                   InvokeType type) {
4009  DCHECK(dex_cache != NULL);
4010  // Check for hit in the dex cache.
4011  mirror::ArtMethod* resolved = dex_cache->GetResolvedMethod(method_idx);
4012  if (resolved != NULL) {
4013    return resolved;
4014  }
4015  // Fail, get the declaring class.
4016  const DexFile::MethodId& method_id = dex_file.GetMethodId(method_idx);
4017  mirror::Class* klass = ResolveType(dex_file, method_id.class_idx_, dex_cache, class_loader);
4018  if (klass == NULL) {
4019    DCHECK(Thread::Current()->IsExceptionPending());
4020    return NULL;
4021  }
4022  // Scan using method_idx, this saves string compares but will only hit for matching dex
4023  // caches/files.
4024  switch (type) {
4025    case kDirect:  // Fall-through.
4026    case kStatic:
4027      resolved = klass->FindDirectMethod(dex_cache, method_idx);
4028      break;
4029    case kInterface:
4030      resolved = klass->FindInterfaceMethod(dex_cache, method_idx);
4031      DCHECK(resolved == NULL || resolved->GetDeclaringClass()->IsInterface());
4032      break;
4033    case kSuper:  // Fall-through.
4034    case kVirtual:
4035      resolved = klass->FindVirtualMethod(dex_cache, method_idx);
4036      break;
4037    default:
4038      LOG(FATAL) << "Unreachable - invocation type: " << type;
4039  }
4040  if (resolved == NULL) {
4041    // Search by name, which works across dex files.
4042    const char* name = dex_file.StringDataByIdx(method_id.name_idx_);
4043    std::string signature(dex_file.CreateMethodSignature(method_id.proto_idx_, NULL));
4044    switch (type) {
4045      case kDirect:  // Fall-through.
4046      case kStatic:
4047        resolved = klass->FindDirectMethod(name, signature);
4048        break;
4049      case kInterface:
4050        resolved = klass->FindInterfaceMethod(name, signature);
4051        DCHECK(resolved == NULL || resolved->GetDeclaringClass()->IsInterface());
4052        break;
4053      case kSuper:  // Fall-through.
4054      case kVirtual:
4055        resolved = klass->FindVirtualMethod(name, signature);
4056        break;
4057    }
4058  }
4059  if (resolved != NULL) {
4060    // We found a method, check for incompatible class changes.
4061    if (resolved->CheckIncompatibleClassChange(type)) {
4062      resolved = NULL;
4063    }
4064  }
4065  if (resolved != NULL) {
4066    // Be a good citizen and update the dex cache to speed subsequent calls.
4067    dex_cache->SetResolvedMethod(method_idx, resolved);
4068    return resolved;
4069  } else {
4070    // We failed to find the method which means either an access error, an incompatible class
4071    // change, or no such method. First try to find the method among direct and virtual methods.
4072    const char* name = dex_file.StringDataByIdx(method_id.name_idx_);
4073    std::string signature(dex_file.CreateMethodSignature(method_id.proto_idx_, NULL));
4074    switch (type) {
4075      case kDirect:
4076      case kStatic:
4077        resolved = klass->FindVirtualMethod(name, signature);
4078        break;
4079      case kInterface:
4080      case kVirtual:
4081      case kSuper:
4082        resolved = klass->FindDirectMethod(name, signature);
4083        break;
4084    }
4085
4086    // If we found something, check that it can be accessed by the referrer.
4087    if (resolved != NULL && referrer != NULL) {
4088      mirror::Class* methods_class = resolved->GetDeclaringClass();
4089      mirror::Class* referring_class = referrer->GetDeclaringClass();
4090      if (!referring_class->CanAccess(methods_class)) {
4091        ThrowIllegalAccessErrorClassForMethodDispatch(referring_class, methods_class,
4092                                                      referrer, resolved, type);
4093        return NULL;
4094      } else if (!referring_class->CanAccessMember(methods_class,
4095                                                   resolved->GetAccessFlags())) {
4096        ThrowIllegalAccessErrorMethod(referring_class, resolved);
4097        return NULL;
4098      }
4099    }
4100
4101    // Otherwise, throw an IncompatibleClassChangeError if we found something, and check interface
4102    // methods and throw if we find the method there. If we find nothing, throw a NoSuchMethodError.
4103    switch (type) {
4104      case kDirect:
4105      case kStatic:
4106        if (resolved != NULL) {
4107          ThrowIncompatibleClassChangeError(type, kVirtual, resolved, referrer);
4108        } else {
4109          resolved = klass->FindInterfaceMethod(name, signature);
4110          if (resolved != NULL) {
4111            ThrowIncompatibleClassChangeError(type, kInterface, resolved, referrer);
4112          } else {
4113            ThrowNoSuchMethodError(type, klass, name, signature);
4114          }
4115        }
4116        break;
4117      case kInterface:
4118        if (resolved != NULL) {
4119          ThrowIncompatibleClassChangeError(type, kDirect, resolved, referrer);
4120        } else {
4121          resolved = klass->FindVirtualMethod(name, signature);
4122          if (resolved != NULL) {
4123            ThrowIncompatibleClassChangeError(type, kVirtual, resolved, referrer);
4124          } else {
4125            ThrowNoSuchMethodError(type, klass, name, signature);
4126          }
4127        }
4128        break;
4129      case kSuper:
4130        ThrowNoSuchMethodError(type, klass, name, signature);
4131        break;
4132      case kVirtual:
4133        if (resolved != NULL) {
4134          ThrowIncompatibleClassChangeError(type, kDirect, resolved, referrer);
4135        } else {
4136          resolved = klass->FindInterfaceMethod(name, signature);
4137          if (resolved != NULL) {
4138            ThrowIncompatibleClassChangeError(type, kInterface, resolved, referrer);
4139          } else {
4140            ThrowNoSuchMethodError(type, klass, name, signature);
4141          }
4142        }
4143        break;
4144    }
4145    DCHECK(Thread::Current()->IsExceptionPending());
4146    return NULL;
4147  }
4148}
4149
4150mirror::ArtField* ClassLinker::ResolveField(const DexFile& dex_file,
4151                                         uint32_t field_idx,
4152                                         mirror::DexCache* dex_cache,
4153                                         mirror::ClassLoader* class_loader,
4154                                         bool is_static) {
4155  DCHECK(dex_cache != NULL);
4156  mirror::ArtField* resolved = dex_cache->GetResolvedField(field_idx);
4157  if (resolved != NULL) {
4158    return resolved;
4159  }
4160  const DexFile::FieldId& field_id = dex_file.GetFieldId(field_idx);
4161  mirror::Class* klass = ResolveType(dex_file, field_id.class_idx_, dex_cache, class_loader);
4162  if (klass == NULL) {
4163    DCHECK(Thread::Current()->IsExceptionPending());
4164    return NULL;
4165  }
4166
4167  if (is_static) {
4168    resolved = klass->FindStaticField(dex_cache, field_idx);
4169  } else {
4170    resolved = klass->FindInstanceField(dex_cache, field_idx);
4171  }
4172
4173  if (resolved == NULL) {
4174    const char* name = dex_file.GetFieldName(field_id);
4175    const char* type = dex_file.GetFieldTypeDescriptor(field_id);
4176    if (is_static) {
4177      resolved = klass->FindStaticField(name, type);
4178    } else {
4179      resolved = klass->FindInstanceField(name, type);
4180    }
4181    if (resolved == NULL) {
4182      ThrowNoSuchFieldError(is_static ? "static " : "instance ", klass, type, name);
4183      return NULL;
4184    }
4185  }
4186  dex_cache->SetResolvedField(field_idx, resolved);
4187  return resolved;
4188}
4189
4190mirror::ArtField* ClassLinker::ResolveFieldJLS(const DexFile& dex_file,
4191                                            uint32_t field_idx,
4192                                            mirror::DexCache* dex_cache,
4193                                            mirror::ClassLoader* class_loader) {
4194  DCHECK(dex_cache != NULL);
4195  mirror::ArtField* resolved = dex_cache->GetResolvedField(field_idx);
4196  if (resolved != NULL) {
4197    return resolved;
4198  }
4199  const DexFile::FieldId& field_id = dex_file.GetFieldId(field_idx);
4200  mirror::Class* klass = ResolveType(dex_file, field_id.class_idx_, dex_cache, class_loader);
4201  if (klass == NULL) {
4202    DCHECK(Thread::Current()->IsExceptionPending());
4203    return NULL;
4204  }
4205
4206  const char* name = dex_file.GetFieldName(field_id);
4207  const char* type = dex_file.GetFieldTypeDescriptor(field_id);
4208  resolved = klass->FindField(name, type);
4209  if (resolved != NULL) {
4210    dex_cache->SetResolvedField(field_idx, resolved);
4211  } else {
4212    ThrowNoSuchFieldError("", klass, type, name);
4213  }
4214  return resolved;
4215}
4216
4217const char* ClassLinker::MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer,
4218                                      uint32_t* length) {
4219  mirror::Class* declaring_class = referrer->GetDeclaringClass();
4220  mirror::DexCache* dex_cache = declaring_class->GetDexCache();
4221  const DexFile& dex_file = *dex_cache->GetDexFile();
4222  const DexFile::MethodId& method_id = dex_file.GetMethodId(method_idx);
4223  return dex_file.GetMethodShorty(method_id, length);
4224}
4225
4226void ClassLinker::DumpAllClasses(int flags) {
4227  if (dex_cache_image_class_lookup_required_) {
4228    MoveImageClassesToClassTable();
4229  }
4230  // TODO: at the time this was written, it wasn't safe to call PrettyField with the ClassLinker
4231  // lock held, because it might need to resolve a field's type, which would try to take the lock.
4232  std::vector<mirror::Class*> all_classes;
4233  {
4234    ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
4235    for (const std::pair<size_t, mirror::Class*>& it : class_table_) {
4236      all_classes.push_back(it.second);
4237    }
4238  }
4239
4240  for (size_t i = 0; i < all_classes.size(); ++i) {
4241    all_classes[i]->DumpClass(std::cerr, flags);
4242  }
4243}
4244
4245void ClassLinker::DumpForSigQuit(std::ostream& os) {
4246  if (dex_cache_image_class_lookup_required_) {
4247    MoveImageClassesToClassTable();
4248  }
4249  ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
4250  os << "Loaded classes: " << class_table_.size() << " allocated classes\n";
4251}
4252
4253size_t ClassLinker::NumLoadedClasses() {
4254  if (dex_cache_image_class_lookup_required_) {
4255    MoveImageClassesToClassTable();
4256  }
4257  ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
4258  return class_table_.size();
4259}
4260
4261pid_t ClassLinker::GetClassesLockOwner() {
4262  return Locks::classlinker_classes_lock_->GetExclusiveOwnerTid();
4263}
4264
4265pid_t ClassLinker::GetDexLockOwner() {
4266  return dex_lock_.GetExclusiveOwnerTid();
4267}
4268
4269void ClassLinker::SetClassRoot(ClassRoot class_root, mirror::Class* klass) {
4270  DCHECK(!init_done_);
4271
4272  DCHECK(klass != NULL);
4273  DCHECK(klass->GetClassLoader() == NULL);
4274
4275  DCHECK(class_roots_ != NULL);
4276  DCHECK(class_roots_->Get(class_root) == NULL);
4277  class_roots_->Set(class_root, klass);
4278}
4279
4280}  // namespace art
4281