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