class_linker.h revision 2afe49450f2e018f18b5de45428b9174bfd6f196
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ART_RUNTIME_CLASS_LINKER_H_ 18#define ART_RUNTIME_CLASS_LINKER_H_ 19 20#include <string> 21#include <utility> 22#include <vector> 23 24#include "base/macros.h" 25#include "base/mutex.h" 26#include "dex_file.h" 27#include "gtest/gtest.h" 28#include "jni.h" 29#include "oat_file.h" 30#include "object_callbacks.h" 31 32namespace art { 33namespace gc { 34namespace space { 35 class ImageSpace; 36} // namespace space 37} // namespace gc 38namespace mirror { 39 class ClassLoader; 40 class DexCache; 41 class DexCacheTest_Open_Test; 42 class IfTable; 43 template<class T> class ObjectArray; 44 class StackTraceElement; 45} // namespace mirror 46 47class InternTable; 48template<class T> class ObjectLock; 49class ScopedObjectAccess; 50template<class T> class Handle; 51 52typedef bool (ClassVisitor)(mirror::Class* c, void* arg); 53 54enum VisitRootFlags : uint8_t; 55 56class ClassLinker { 57 public: 58 // Interface method table size. Increasing this value reduces the chance of two interface methods 59 // colliding in the interface method table but increases the size of classes that implement 60 // (non-marker) interfaces. 61 static constexpr size_t kImtSize = 64; 62 63 explicit ClassLinker(InternTable* intern_table); 64 ~ClassLinker(); 65 66 // Initialize class linker by bootstraping from dex files 67 void InitFromCompiler(const std::vector<const DexFile*>& boot_class_path) 68 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 69 70 // Initialize class linker from one or more images. 71 void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 72 73 bool IsInBootClassPath(const char* descriptor); 74 75 // Finds a class by its descriptor, loading it if necessary. 76 // If class_loader is null, searches boot_class_path_. 77 mirror::Class* FindClass(Thread* self, const char* descriptor, 78 const Handle<mirror::ClassLoader>& class_loader) 79 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 80 81 // Finds a class by its descriptor using the "system" class loader, ie by searching the 82 // boot_class_path_. 83 mirror::Class* FindSystemClass(Thread* self, const char* descriptor) 84 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 85 86 // Finds the array class given for the element class. 87 mirror::Class* FindArrayClass(Thread* self, mirror::Class* element_class) 88 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 89 90 // Reutrns true if the class linker is initialized. 91 bool IsInitialized() const; 92 93 // Define a new a class based on a ClassDef from a DexFile 94 mirror::Class* DefineClass(const char* descriptor, 95 const Handle<mirror::ClassLoader>& class_loader, 96 const DexFile& dex_file, const DexFile::ClassDef& dex_class_def) 97 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 98 99 // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded 100 // by the given 'class_loader'. 101 mirror::Class* LookupClass(const char* descriptor, const mirror::ClassLoader* class_loader) 102 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 103 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 104 105 // Finds all the classes with the given descriptor, regardless of ClassLoader. 106 void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes) 107 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 108 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 109 110 mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 111 112 // General class unloading is not supported, this is used to prune 113 // unwanted classes during image writing. 114 bool RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader) 115 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 116 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 117 118 void DumpAllClasses(int flags) 119 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 120 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 121 122 void DumpForSigQuit(std::ostream& os) 123 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 124 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 125 126 size_t NumLoadedClasses() 127 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 128 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 129 130 // Resolve a String with the given index from the DexFile, storing the 131 // result in the DexCache. The referrer is used to identify the 132 // target DexCache and ClassLoader to use for resolution. 133 mirror::String* ResolveString(uint32_t string_idx, mirror::ArtMethod* referrer) 134 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 135 136 // Resolve a String with the given index from the DexFile, storing the 137 // result in the DexCache. 138 mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx, 139 const Handle<mirror::DexCache>& dex_cache) 140 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 141 142 // Resolve a Type with the given index from the DexFile, storing the 143 // result in the DexCache. The referrer is used to identity the 144 // target DexCache and ClassLoader to use for resolution. 145 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, mirror::Class* referrer) 146 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 147 148 // Resolve a Type with the given index from the DexFile, storing the 149 // result in the DexCache. The referrer is used to identify the 150 // target DexCache and ClassLoader to use for resolution. 151 mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtMethod* referrer) 152 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 153 154 mirror::Class* ResolveType(uint16_t type_idx, mirror::ArtField* referrer) 155 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 156 157 // Resolve a type with the given ID from the DexFile, storing the 158 // result in DexCache. The ClassLoader is used to search for the 159 // type, since it may be referenced from but not contained within 160 // the given DexFile. 161 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, 162 const Handle<mirror::DexCache>& dex_cache, 163 const Handle<mirror::ClassLoader>& class_loader) 164 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 165 166 // Resolve a method with a given ID from the DexFile, storing the 167 // result in DexCache. The ClassLinker and ClassLoader are used as 168 // in ResolveType. What is unique is the method type argument which 169 // is used to determine if this method is a direct, static, or 170 // virtual method. 171 mirror::ArtMethod* ResolveMethod(const DexFile& dex_file, 172 uint32_t method_idx, 173 const Handle<mirror::DexCache>& dex_cache, 174 const Handle<mirror::ClassLoader>& class_loader, 175 mirror::ArtMethod* referrer, 176 InvokeType type) 177 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 178 179 mirror::ArtMethod* ResolveMethod(uint32_t method_idx, mirror::ArtMethod* referrer, 180 InvokeType type) 181 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 182 183 mirror::ArtField* ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer, 184 bool is_static) 185 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 186 187 // Resolve a field with a given ID from the DexFile, storing the 188 // result in DexCache. The ClassLinker and ClassLoader are used as 189 // in ResolveType. What is unique is the is_static argument which is 190 // used to determine if we are resolving a static or non-static 191 // field. 192 mirror::ArtField* ResolveField(const DexFile& dex_file, 193 uint32_t field_idx, 194 const Handle<mirror::DexCache>& dex_cache, 195 const Handle<mirror::ClassLoader>& class_loader, 196 bool is_static) 197 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 198 199 // Resolve a field with a given ID from the DexFile, storing the 200 // result in DexCache. The ClassLinker and ClassLoader are used as 201 // in ResolveType. No is_static argument is provided so that Java 202 // field resolution semantics are followed. 203 mirror::ArtField* ResolveFieldJLS(const DexFile& dex_file, 204 uint32_t field_idx, 205 const Handle<mirror::DexCache>& dex_cache, 206 const Handle<mirror::ClassLoader>& class_loader) 207 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 208 209 // Get shorty from method index without resolution. Used to do handlerization. 210 const char* MethodShorty(uint32_t method_idx, mirror::ArtMethod* referrer, uint32_t* length) 211 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 212 213 // Returns true on success, false if there's an exception pending. 214 // can_run_clinit=false allows the compiler to attempt to init a class, 215 // given the restriction that no <clinit> execution is possible. 216 bool EnsureInitialized(const Handle<mirror::Class>& c, 217 bool can_init_fields, bool can_init_parents) 218 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 219 220 // Initializes classes that have instances in the image but that have 221 // <clinit> methods so they could not be initialized by the compiler. 222 void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 223 224 void RegisterDexFile(const DexFile& dex_file) 225 LOCKS_EXCLUDED(dex_lock_) 226 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 227 void RegisterDexFile(const DexFile& dex_file, const Handle<mirror::DexCache>& dex_cache) 228 LOCKS_EXCLUDED(dex_lock_) 229 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 230 231 const OatFile* RegisterOatFile(const OatFile* oat_file) 232 LOCKS_EXCLUDED(dex_lock_); 233 234 const std::vector<const DexFile*>& GetBootClassPath() { 235 return boot_class_path_; 236 } 237 238 void VisitClasses(ClassVisitor* visitor, void* arg) 239 LOCKS_EXCLUDED(dex_lock_) 240 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 241 // Less efficient variant of VisitClasses that doesn't hold the classlinker_classes_lock_ 242 // when calling the visitor. 243 void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) 244 LOCKS_EXCLUDED(dex_lock_) 245 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 246 247 void VisitRoots(RootCallback* callback, void* arg, VisitRootFlags flags) 248 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_, dex_lock_); 249 250 mirror::DexCache* FindDexCache(const DexFile& dex_file) const 251 LOCKS_EXCLUDED(dex_lock_) 252 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 253 bool IsDexFileRegistered(const DexFile& dex_file) const 254 LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 255 void FixupDexCaches(mirror::ArtMethod* resolution_method) const 256 LOCKS_EXCLUDED(dex_lock_) 257 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 258 259 // Generate an oat file from a dex file 260 bool GenerateOatFile(const char* dex_filename, 261 int oat_fd, 262 const char* oat_cache_filename, 263 std::string* error_msg) 264 LOCKS_EXCLUDED(Locks::mutator_lock_); 265 266 const OatFile* FindOatFileFromOatLocation(const std::string& location, 267 std::string* error_msg) 268 LOCKS_EXCLUDED(dex_lock_); 269 270 // Finds the oat file for a dex location, generating the oat file if 271 // it is missing or out of date. Returns the DexFile from within the 272 // created oat file. 273 const DexFile* FindOrCreateOatFileForDexLocation(const char* dex_location, 274 uint32_t dex_location_checksum, 275 const char* oat_location, 276 std::vector<std::string>* error_msgs) 277 LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 278 // Find a DexFile within an OatFile given a DexFile location. Note 279 // that this returns null if the location checksum of the DexFile 280 // does not match the OatFile. 281 const DexFile* FindDexFileInOatFileFromDexLocation(const char* location, 282 const uint32_t* const location_checksum, 283 InstructionSet isa, 284 std::vector<std::string>* error_msgs) 285 LOCKS_EXCLUDED(dex_lock_, Locks::mutator_lock_); 286 287 288 // Returns true if oat file contains the dex file with the given location and checksum. 289 static bool VerifyOatFileChecksums(const OatFile* oat_file, 290 const char* dex_location, 291 uint32_t dex_location_checksum, 292 InstructionSet instruction_set, 293 std::string* error_msg); 294 295 // TODO: replace this with multiple methods that allocate the correct managed type. 296 template <class T> 297 mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length) 298 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 299 300 mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length) 301 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 302 303 mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length) 304 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 305 306 mirror::ObjectArray<mirror::ArtMethod>* AllocArtMethodArray(Thread* self, size_t length) 307 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 308 309 mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount) 310 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 311 312 mirror::ObjectArray<mirror::ArtField>* AllocArtFieldArray(Thread* self, size_t length) 313 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 314 315 mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self, 316 size_t length) 317 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 318 319 void VerifyClass(const Handle<mirror::Class>& klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 320 bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass, 321 mirror::Class::Status& oat_file_class_status) 322 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 323 void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, 324 const Handle<mirror::Class>& klass) 325 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 326 void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass) 327 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 328 329 mirror::Class* CreateProxyClass(ScopedObjectAccess& soa, jstring name, jobjectArray interfaces, 330 jobject loader, jobjectArray methods, jobjectArray throws) 331 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 332 std::string GetDescriptorForProxy(mirror::Class* proxy_class) 333 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 334 mirror::ArtMethod* FindMethodForProxy(mirror::Class* proxy_class, 335 mirror::ArtMethod* proxy_method) 336 LOCKS_EXCLUDED(dex_lock_) 337 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 338 339 // Get the oat code for a method when its class isn't yet initialized 340 const void* GetQuickOatCodeFor(mirror::ArtMethod* method) 341 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 342 const void* GetPortableOatCodeFor(mirror::ArtMethod* method, bool* have_portable_code) 343 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 344 345 // Get the oat code for a method from a method index. 346 const void* GetQuickOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) 347 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 348 const void* GetPortableOatCodeFor(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) 349 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 350 351 pid_t GetClassesLockOwner(); // For SignalCatcher. 352 pid_t GetDexLockOwner(); // For SignalCatcher. 353 354 const void* GetPortableResolutionTrampoline() const { 355 return portable_resolution_trampoline_; 356 } 357 358 const void* GetQuickGenericJniTrampoline() const { 359 return quick_generic_jni_trampoline_; 360 } 361 362 const void* GetQuickResolutionTrampoline() const { 363 return quick_resolution_trampoline_; 364 } 365 366 const void* GetPortableImtConflictTrampoline() const { 367 return portable_imt_conflict_trampoline_; 368 } 369 370 const void* GetQuickImtConflictTrampoline() const { 371 return quick_imt_conflict_trampoline_; 372 } 373 374 const void* GetQuickToInterpreterBridgeTrampoline() const { 375 return quick_to_interpreter_bridge_trampoline_; 376 } 377 378 InternTable* GetInternTable() const { 379 return intern_table_; 380 } 381 382 // Attempts to insert a class into a class table. Returns NULL if 383 // the class was inserted, otherwise returns an existing class with 384 // the same descriptor and ClassLoader. 385 mirror::Class* InsertClass(const char* descriptor, mirror::Class* klass, size_t hash) 386 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 387 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 388 389 // Special code to allocate an art method, use this instead of class->AllocObject. 390 mirror::ArtMethod* AllocArtMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 391 392 private: 393 const OatFile::OatMethod GetOatMethodFor(mirror::ArtMethod* method) 394 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 395 396 OatFile& GetImageOatFile(gc::space::ImageSpace* space) 397 LOCKS_EXCLUDED(dex_lock_) 398 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 399 400 void FinishInit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 401 402 // For early bootstrapping by Init 403 mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, uint32_t class_size) 404 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 405 406 // Alloc* convenience functions to avoid needing to pass in mirror::Class* 407 // values that are known to the ClassLinker such as 408 // kObjectArrayClass and kJavaLangString etc. 409 mirror::Class* AllocClass(Thread* self, uint32_t class_size) 410 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 411 mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file) 412 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 413 mirror::ArtField* AllocArtField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 414 415 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type) 416 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 417 mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type) 418 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 419 420 421 mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, 422 const Handle<mirror::ClassLoader>& class_loader) 423 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 424 425 void AppendToBootClassPath(const DexFile& dex_file) 426 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 427 void AppendToBootClassPath(const DexFile& dex_file, const Handle<mirror::DexCache>& dex_cache) 428 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 429 430 void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, 431 mirror::Class* c, SafeMap<uint32_t, mirror::ArtField*>& field_map) 432 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 433 434 uint32_t SizeOfClass(const DexFile& dex_file, 435 const DexFile::ClassDef& dex_class_def); 436 437 void LoadClass(const DexFile& dex_file, 438 const DexFile::ClassDef& dex_class_def, 439 const Handle<mirror::Class>& klass, 440 mirror::ClassLoader* class_loader) 441 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 442 void LoadClassMembers(const DexFile& dex_file, 443 const byte* class_data, 444 const Handle<mirror::Class>& klass, 445 mirror::ClassLoader* class_loader, 446 const OatFile::OatClass* oat_class) 447 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 448 449 void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it, 450 const Handle<mirror::Class>& klass, const Handle<mirror::ArtField>& dst) 451 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 452 453 mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file, 454 const ClassDataItemIterator& dex_method, 455 const Handle<mirror::Class>& klass) 456 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 457 458 void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 459 460 // Finds the associated oat class for a dex_file and descriptor 461 OatFile::OatClass GetOatClass(const DexFile& dex_file, uint16_t class_def_idx) 462 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 463 464 void RegisterDexFileLocked(const DexFile& dex_file, const Handle<mirror::DexCache>& dex_cache) 465 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 466 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 467 bool IsDexFileRegisteredLocked(const DexFile& dex_file) const 468 SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_); 469 470 bool InitializeClass(const Handle<mirror::Class>& klass, bool can_run_clinit, 471 bool can_init_parents) 472 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 473 bool WaitForInitializeClass(const Handle<mirror::Class>& klass, Thread* self, 474 ObjectLock<mirror::Class>& lock); 475 bool ValidateSuperClassDescriptors(const Handle<mirror::Class>& klass) 476 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 477 478 bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor, 479 Handle<mirror::ClassLoader>& class_loader1, 480 Handle<mirror::ClassLoader>& class_loader2) 481 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 482 483 bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method, 484 mirror::Class* klass1, 485 mirror::Class* klass2) 486 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 487 488 bool LinkClass(Thread* self, const Handle<mirror::Class>& klass, 489 const Handle<mirror::ObjectArray<mirror::Class> >& interfaces) 490 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 491 492 bool LinkSuperClass(const Handle<mirror::Class>& klass) 493 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 494 495 bool LoadSuperAndInterfaces(const Handle<mirror::Class>& klass, const DexFile& dex_file) 496 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 497 498 bool LinkMethods(const Handle<mirror::Class>& klass, 499 const Handle<mirror::ObjectArray<mirror::Class> >& interfaces) 500 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 501 502 bool LinkVirtualMethods(const Handle<mirror::Class>& klass) 503 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 504 505 bool LinkInterfaceMethods(const Handle<mirror::Class>& klass, 506 const Handle<mirror::ObjectArray<mirror::Class> >& interfaces) 507 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 508 509 bool LinkStaticFields(const Handle<mirror::Class>& klass) 510 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 511 bool LinkInstanceFields(const Handle<mirror::Class>& klass) 512 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 513 bool LinkFields(const Handle<mirror::Class>& klass, bool is_static) 514 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 515 void LinkCode(const Handle<mirror::ArtMethod>& method, const OatFile::OatClass* oat_class, 516 const DexFile& dex_file, uint32_t dex_method_index, uint32_t method_index) 517 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 518 519 520 void CreateReferenceInstanceOffsets(const Handle<mirror::Class>& klass) 521 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 522 void CreateReferenceStaticOffsets(const Handle<mirror::Class>& klass) 523 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 524 void CreateReferenceOffsets(const Handle<mirror::Class>& klass, bool is_static, 525 uint32_t reference_offsets) 526 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 527 528 // For use by ImageWriter to find DexCaches for its roots 529 const std::vector<mirror::DexCache*>& GetDexCaches() { 530 return dex_caches_; 531 } 532 533 const OatFile* FindOpenedOatFileForDexFile(const DexFile& dex_file) 534 LOCKS_EXCLUDED(dex_lock_) 535 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 536 const OatFile* FindOpenedOatFileFromDexLocation(const char* dex_location, 537 const uint32_t* const dex_location_checksum) 538 LOCKS_EXCLUDED(dex_lock_); 539 const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location) 540 LOCKS_EXCLUDED(dex_lock_); 541 const DexFile* FindDexFileInOatLocation(const char* dex_location, 542 uint32_t dex_location_checksum, 543 const char* oat_location, 544 std::string* error_msg) 545 LOCKS_EXCLUDED(dex_lock_); 546 547 const DexFile* VerifyAndOpenDexFileFromOatFile(const std::string& oat_file_location, 548 const char* dex_location, 549 std::string* error_msg, 550 bool* open_failed) 551 LOCKS_EXCLUDED(dex_lock_); 552 553 mirror::ArtMethod* CreateProxyConstructor(Thread* self, const Handle<mirror::Class>& klass, 554 mirror::Class* proxy_class) 555 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 556 mirror::ArtMethod* CreateProxyMethod(Thread* self, const Handle<mirror::Class>& klass, 557 const Handle<mirror::ArtMethod>& prototype) 558 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 559 560 std::vector<const DexFile*> boot_class_path_; 561 562 mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 563 std::vector<size_t> new_dex_cache_roots_ GUARDED_BY(dex_lock_);; 564 std::vector<mirror::DexCache*> dex_caches_ GUARDED_BY(dex_lock_); 565 std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_); 566 567 568 // multimap from a string hash code of a class descriptor to 569 // mirror::Class* instances. Results should be compared for a matching 570 // Class::descriptor_ and Class::class_loader_. 571 typedef std::multimap<size_t, mirror::Class*> Table; 572 Table class_table_ GUARDED_BY(Locks::classlinker_classes_lock_); 573 std::vector<std::pair<size_t, mirror::Class*> > new_class_roots_; 574 575 // Do we need to search dex caches to find image classes? 576 bool dex_cache_image_class_lookup_required_; 577 // Number of times we've searched dex caches for a class. After a certain number of misses we move 578 // the classes into the class_table_ to avoid dex cache based searches. 579 AtomicInteger failed_dex_cache_class_lookups_; 580 581 mirror::Class* LookupClassFromTableLocked(const char* descriptor, 582 const mirror::ClassLoader* class_loader, 583 size_t hash) 584 SHARED_LOCKS_REQUIRED(Locks::classlinker_classes_lock_, Locks::mutator_lock_); 585 586 void MoveImageClassesToClassTable() LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 587 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 588 mirror::Class* LookupClassFromImage(const char* descriptor) 589 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 590 591 // indexes into class_roots_. 592 // needs to be kept in sync with class_roots_descriptors_. 593 enum ClassRoot { 594 kJavaLangClass, 595 kJavaLangObject, 596 kClassArrayClass, 597 kObjectArrayClass, 598 kJavaLangString, 599 kJavaLangDexCache, 600 kJavaLangRefReference, 601 kJavaLangReflectArtField, 602 kJavaLangReflectArtMethod, 603 kJavaLangReflectProxy, 604 kJavaLangStringArrayClass, 605 kJavaLangReflectArtFieldArrayClass, 606 kJavaLangReflectArtMethodArrayClass, 607 kJavaLangClassLoader, 608 kJavaLangThrowable, 609 kJavaLangClassNotFoundException, 610 kJavaLangStackTraceElement, 611 kPrimitiveBoolean, 612 kPrimitiveByte, 613 kPrimitiveChar, 614 kPrimitiveDouble, 615 kPrimitiveFloat, 616 kPrimitiveInt, 617 kPrimitiveLong, 618 kPrimitiveShort, 619 kPrimitiveVoid, 620 kBooleanArrayClass, 621 kByteArrayClass, 622 kCharArrayClass, 623 kDoubleArrayClass, 624 kFloatArrayClass, 625 kIntArrayClass, 626 kLongArrayClass, 627 kShortArrayClass, 628 kJavaLangStackTraceElementArrayClass, 629 kClassRootsMax, 630 }; 631 mirror::ObjectArray<mirror::Class>* class_roots_; 632 633 mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 634 635 void SetClassRoot(ClassRoot class_root, mirror::Class* klass) 636 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 637 638 mirror::ObjectArray<mirror::Class>* GetClassRoots() { 639 DCHECK(class_roots_ != NULL); 640 return class_roots_; 641 } 642 643 static const char* class_roots_descriptors_[]; 644 645 const char* GetClassRootDescriptor(ClassRoot class_root) { 646 const char* descriptor = class_roots_descriptors_[class_root]; 647 CHECK(descriptor != NULL); 648 return descriptor; 649 } 650 651 // The interface table used by all arrays. 652 mirror::IfTable* array_iftable_; 653 654 // A cache of the last FindArrayClass results. The cache serves to avoid creating array class 655 // descriptors for the sake of performing FindClass. 656 static constexpr size_t kFindArrayCacheSize = 16; 657 mirror::Class* find_array_class_cache_[kFindArrayCacheSize]; 658 size_t find_array_class_cache_next_victim_; 659 660 bool init_done_; 661 bool log_new_dex_caches_roots_ GUARDED_BY(dex_lock_); 662 bool log_new_class_table_roots_ GUARDED_BY(Locks::classlinker_classes_lock_); 663 664 InternTable* intern_table_; 665 666 const void* portable_resolution_trampoline_; 667 const void* quick_resolution_trampoline_; 668 const void* portable_imt_conflict_trampoline_; 669 const void* quick_imt_conflict_trampoline_; 670 const void* quick_generic_jni_trampoline_; 671 const void* quick_to_interpreter_bridge_trampoline_; 672 673 friend class ImageWriter; // for GetClassRoots 674 FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors); 675 FRIEND_TEST(mirror::DexCacheTest, Open); 676 FRIEND_TEST(ExceptionTest, FindExceptionHandler); 677 FRIEND_TEST(ObjectTest, AllocObjectArray); 678 DISALLOW_COPY_AND_ASSIGN(ClassLinker); 679}; 680 681} // namespace art 682 683#endif // ART_RUNTIME_CLASS_LINKER_H_ 684