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