class_linker.h revision 56d947fbc9bc2992e2f93112fafb73e50d2aaa7a
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_SRC_CLASS_LINKER_H_ 18#define ART_SRC_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 "root_visitor.h" 29#include "oat_file.h" 30 31namespace art { 32namespace gc { 33namespace space { 34 class ImageSpace; 35} // namespace space 36} // namespace gc 37namespace mirror { 38 class ClassLoader; 39 class DexCache; 40 class DexCacheTest_Open_Test; 41 class IfTable; 42 template<class T> class ObjectArray; 43 class StackTraceElement; 44} // namespace mirror 45 46class InternTable; 47class ObjectLock; 48template<class T> class SirtRef; 49 50typedef bool (ClassVisitor)(mirror::Class* c, void* arg); 51 52class ClassLinker { 53 public: 54 // Creates the class linker by bootstrapping from dex files. 55 static ClassLinker* CreateFromCompiler(const std::vector<const DexFile*>& boot_class_path, 56 InternTable* intern_table) 57 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 58 59 // Creates the class linker from an image. 60 static ClassLinker* CreateFromImage(InternTable* intern_table) 61 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 62 63 ~ClassLinker(); 64 65 // Finds a class by its descriptor, loading it if necessary. 66 // If class_loader is null, searches boot_class_path_. 67 mirror::Class* FindClass(const char* descriptor, mirror::ClassLoader* class_loader) 68 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 69 70 mirror::Class* FindSystemClass(const char* descriptor) 71 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 72 73 // Define a new a class based on a ClassDef from a DexFile 74 mirror::Class* DefineClass(const StringPiece& descriptor, mirror::ClassLoader* class_loader, 75 const DexFile& dex_file, const DexFile::ClassDef& dex_class_def) 76 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 77 78 // Finds a class by its descriptor, returning NULL if it isn't wasn't loaded 79 // by the given 'class_loader'. 80 mirror::Class* LookupClass(const char* descriptor, const mirror::ClassLoader* class_loader) 81 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 82 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 83 84 // Finds all the classes with the given descriptor, regardless of ClassLoader. 85 void LookupClasses(const char* descriptor, std::vector<mirror::Class*>& classes) 86 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 87 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 88 89 mirror::Class* FindPrimitiveClass(char type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 90 91 // General class unloading is not supported, this is used to prune 92 // unwanted classes during image writing. 93 bool RemoveClass(const char* descriptor, const mirror::ClassLoader* class_loader) 94 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 95 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 96 97 void DumpAllClasses(int flags) const 98 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 99 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 100 101 void DumpForSigQuit(std::ostream& os) const 102 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_); 103 104 size_t NumLoadedClasses() const LOCKS_EXCLUDED(Locks::classlinker_classes_lock_); 105 106 // Resolve a String with the given index from the DexFile, storing the 107 // result in the DexCache. The referrer is used to identify the 108 // target DexCache and ClassLoader to use for resolution. 109 mirror::String* ResolveString(uint32_t string_idx, const mirror::AbstractMethod* referrer) 110 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 111 112 // Resolve a String with the given index from the DexFile, storing the 113 // result in the DexCache. 114 mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx, 115 mirror::DexCache* dex_cache) 116 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 117 118 // Resolve a Type with the given index from the DexFile, storing the 119 // result in the DexCache. The referrer is used to identity the 120 // target DexCache and ClassLoader to use for resolution. 121 mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, 122 const mirror::Class* referrer) 123 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 124 return ResolveType(dex_file, 125 type_idx, 126 referrer->GetDexCache(), 127 referrer->GetClassLoader()); 128 } 129 130 // Resolve a Type 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::Class* ResolveType(uint16_t type_idx, const mirror::AbstractMethod* referrer) 134 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 135 136 mirror::Class* ResolveType(uint16_t type_idx, const mirror::Field* referrer) 137 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 138 139 // Resolve a type with the given ID from the DexFile, storing the 140 // result in DexCache. The ClassLoader is used to search for the 141 // type, since it may be referenced from but not contained within 142 // the given DexFile. 143 mirror::Class* ResolveType(const DexFile& dex_file, 144 uint16_t type_idx, 145 mirror::DexCache* dex_cache, 146 mirror::ClassLoader* class_loader) 147 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 148 149 // Resolve a method with a given ID from the DexFile, storing the 150 // result in DexCache. The ClassLinker and ClassLoader are used as 151 // in ResolveType. What is unique is the method type argument which 152 // is used to determine if this method is a direct, static, or 153 // virtual method. 154 mirror::AbstractMethod* ResolveMethod(const DexFile& dex_file, 155 uint32_t method_idx, 156 mirror::DexCache* dex_cache, 157 mirror::ClassLoader* class_loader, 158 const mirror::AbstractMethod* referrer, 159 InvokeType type) 160 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 161 162 mirror::AbstractMethod* ResolveMethod(uint32_t method_idx, const mirror::AbstractMethod* referrer, 163 InvokeType type) 164 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 165 166 mirror::Field* ResolveField(uint32_t field_idx, const mirror::AbstractMethod* referrer, 167 bool is_static) 168 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 169 170 // Resolve a field with a given ID from the DexFile, storing the 171 // result in DexCache. The ClassLinker and ClassLoader are used as 172 // in ResolveType. What is unique is the is_static argument which is 173 // used to determine if we are resolving a static or non-static 174 // field. 175 mirror::Field* ResolveField(const DexFile& dex_file, 176 uint32_t field_idx, 177 mirror::DexCache* dex_cache, 178 mirror::ClassLoader* class_loader, 179 bool is_static) 180 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 181 182 // Resolve a field with a given ID from the DexFile, storing the 183 // result in DexCache. The ClassLinker and ClassLoader are used as 184 // in ResolveType. No is_static argument is provided so that Java 185 // field resolution semantics are followed. 186 mirror::Field* ResolveFieldJLS(const DexFile& dex_file, 187 uint32_t field_idx, 188 mirror::DexCache* dex_cache, 189 mirror::ClassLoader* class_loader) 190 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 191 192 // Get shorty from method index without resolution. Used to do handlerization. 193 const char* MethodShorty(uint32_t method_idx, mirror::AbstractMethod* referrer, uint32_t* length) 194 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 195 196 // Returns true on success, false if there's an exception pending. 197 // can_run_clinit=false allows the compiler to attempt to init a class, 198 // given the restriction that no <clinit> execution is possible. 199 bool EnsureInitialized(mirror::Class* c, bool can_run_clinit, bool can_init_fields) 200 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 201 202 // Initializes classes that have instances in the image but that have 203 // <clinit> methods so they could not be initialized by the compiler. 204 void RunRootClinits() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 205 206 void RegisterDexFile(const DexFile& dex_file) 207 LOCKS_EXCLUDED(dex_lock_) 208 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 209 void RegisterDexFile(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) 210 LOCKS_EXCLUDED(dex_lock_) 211 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 212 213 void RegisterOatFile(const OatFile& oat_file) 214 LOCKS_EXCLUDED(dex_lock_); 215 216 const std::vector<const DexFile*>& GetBootClassPath() { 217 return boot_class_path_; 218 } 219 220 void VisitClasses(ClassVisitor* visitor, void* arg) const 221 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_); 222 // Less efficient variant of VisitClasses that doesn't hold the classlinker_classes_lock_ 223 // when calling the visitor. 224 void VisitClassesWithoutClassesLock(ClassVisitor* visitor, void* arg) const 225 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_); 226 227 void VisitRoots(RootVisitor* visitor, void* arg, bool clean_dirty) 228 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_, dex_lock_); 229 230 mirror::DexCache* FindDexCache(const DexFile& dex_file) const 231 LOCKS_EXCLUDED(dex_lock_) 232 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 233 bool IsDexFileRegistered(const DexFile& dex_file) const 234 LOCKS_EXCLUDED(dex_lock_); 235 void FixupDexCaches(mirror::AbstractMethod* resolution_method) const 236 LOCKS_EXCLUDED(dex_lock_) 237 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 238 239 // Generate an oat file from a dex file 240 bool GenerateOatFile(const std::string& dex_filename, 241 int oat_fd, 242 const std::string& oat_cache_filename); 243 244 const OatFile* FindOatFileFromOatLocation(const std::string& location) 245 LOCKS_EXCLUDED(dex_lock_); 246 247 const OatFile* FindOatFileFromOatLocationLocked(const std::string& location) 248 SHARED_LOCKS_REQUIRED(dex_lock_); 249 250 // Finds the oat file for a dex location, generating the oat file if 251 // it is missing or out of date. Returns the DexFile from within the 252 // created oat file. 253 const DexFile* FindOrCreateOatFileForDexLocation(const std::string& dex_location, 254 const std::string& oat_location) 255 LOCKS_EXCLUDED(dex_lock_) 256 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 257 const DexFile* FindOrCreateOatFileForDexLocationLocked(const std::string& dex_location, 258 const std::string& oat_location) 259 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 260 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 261 // Find a DexFile within an OatFile given a DexFile location. Note 262 // that this returns null if the location checksum of the DexFile 263 // does not match the OatFile. 264 const DexFile* FindDexFileInOatFileFromDexLocation(const std::string& location) 265 LOCKS_EXCLUDED(dex_lock_) 266 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 267 268 269 // Returns true if oat file contains the dex file with the given location and checksum. 270 static bool VerifyOatFileChecksums(const OatFile* oat_file, 271 const std::string& dex_location, 272 uint32_t dex_location_checksum) 273 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 274 275 // TODO: replace this with multiple methods that allocate the correct managed type. 276 template <class T> 277 mirror::ObjectArray<T>* AllocObjectArray(Thread* self, size_t length) 278 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 279 280 mirror::ObjectArray<mirror::Class>* AllocClassArray(Thread* self, size_t length) 281 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 282 283 mirror::ObjectArray<mirror::String>* AllocStringArray(Thread* self, size_t length) 284 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 285 286 mirror::ObjectArray<mirror::AbstractMethod>* AllocAbstractMethodArray(Thread* self, size_t length) 287 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 288 289 mirror::ObjectArray<mirror::AbstractMethod>* AllocMethodArray(Thread* self, size_t length) 290 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 291 292 mirror::IfTable* AllocIfTable(Thread* self, size_t ifcount) 293 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 294 295 mirror::ObjectArray<mirror::Field>* AllocFieldArray(Thread* self, size_t length) 296 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 297 298 mirror::ObjectArray<mirror::StackTraceElement>* AllocStackTraceElementArray(Thread* self, 299 size_t length) 300 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 301 302 void VerifyClass(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 303 bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass, 304 mirror::Class::Status& oat_file_class_status) 305 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 306 void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, mirror::Class* klass) 307 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 308 void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::AbstractMethod* klass) 309 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 310 311 mirror::Class* CreateProxyClass(mirror::String* name, mirror::ObjectArray<mirror::Class>* interfaces, 312 mirror::ClassLoader* loader, 313 mirror::ObjectArray<mirror::AbstractMethod>* methods, 314 mirror::ObjectArray<mirror::ObjectArray<mirror::Class> >* throws) 315 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 316 std::string GetDescriptorForProxy(const mirror::Class* proxy_class) 317 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 318 mirror::AbstractMethod* FindMethodForProxy(const mirror::Class* proxy_class, 319 const mirror::AbstractMethod* proxy_method) 320 LOCKS_EXCLUDED(dex_lock_) 321 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 322 323 // Get the oat code for a method when its class isn't yet initialized 324 const void* GetOatCodeFor(const mirror::AbstractMethod* method) 325 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 326 327 // Get the oat code for a method from a method index. 328 const void* GetOatCodeFor(const DexFile& dex_file, uint32_t method_idx) 329 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 330 331 pid_t GetClassesLockOwner(); // For SignalCatcher. 332 pid_t GetDexLockOwner(); // For SignalCatcher. 333 334 bool IsDirty() const { 335 return is_dirty_; 336 } 337 338 void Dirty() { 339 is_dirty_ = true; 340 } 341 342 const void* GetPortableResolutionTrampoline() const { 343 return portable_resolution_trampoline_; 344 } 345 346 const void* GetQuickResolutionTrampoline() const { 347 return quick_resolution_trampoline_; 348 } 349 350 private: 351 explicit ClassLinker(InternTable*); 352 353 const OatFile::OatMethod GetOatMethodFor(const mirror::AbstractMethod* method) 354 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 355 356 // Initialize class linker by bootstraping from dex files 357 void InitFromCompiler(const std::vector<const DexFile*>& boot_class_path) 358 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 359 360 // Initialize class linker from one or more images. 361 void InitFromImage() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 362 OatFile& GetImageOatFile(gc::space::ImageSpace* space) 363 LOCKS_EXCLUDED(dex_lock_) 364 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 365 static void InitFromImageCallback(mirror::Object* obj, void* arg) 366 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 367 368 void FinishInit() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 369 370 // For early bootstrapping by Init 371 mirror::Class* AllocClass(Thread* self, mirror::Class* java_lang_Class, size_t class_size) 372 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 373 374 // Alloc* convenience functions to avoid needing to pass in mirror::Class* 375 // values that are known to the ClassLinker such as 376 // kObjectArrayClass and kJavaLangString etc. 377 mirror::Class* AllocClass(Thread* self, size_t class_size) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 378 mirror::DexCache* AllocDexCache(Thread* self, const DexFile& dex_file) 379 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 380 mirror::Field* AllocField(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 381 mirror::Method* AllocMethod(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 382 mirror::Constructor* AllocConstructor(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 383 384 mirror::Class* CreatePrimitiveClass(Thread* self, Primitive::Type type) 385 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 386 mirror::Class* InitializePrimitiveClass(mirror::Class* primitive_class, Primitive::Type type) 387 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 388 389 390 mirror::Class* CreateArrayClass(const std::string& descriptor, mirror::ClassLoader* class_loader) 391 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 392 393 void AppendToBootClassPath(const DexFile& dex_file) 394 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 395 void AppendToBootClassPath(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) 396 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 397 398 void ConstructFieldMap(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, 399 mirror::Class* c, SafeMap<uint32_t, mirror::Field*>& field_map) 400 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 401 402 size_t SizeOfClass(const DexFile& dex_file, 403 const DexFile::ClassDef& dex_class_def); 404 405 void LoadClass(const DexFile& dex_file, 406 const DexFile::ClassDef& dex_class_def, 407 SirtRef<mirror::Class>& klass, 408 mirror::ClassLoader* class_loader) 409 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 410 411 void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it, 412 SirtRef<mirror::Class>& klass, SirtRef<mirror::Field>& dst) 413 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 414 415 mirror::AbstractMethod* LoadMethod(Thread* self, const DexFile& dex_file, 416 const ClassDataItemIterator& dex_method, 417 SirtRef<mirror::Class>& klass) 418 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 419 420 void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 421 422 // Finds the associated oat class for a dex_file and descriptor 423 const OatFile::OatClass* GetOatClass(const DexFile& dex_file, const char* descriptor) 424 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 425 426 // Attempts to insert a class into a class table. Returns NULL if 427 // the class was inserted, otherwise returns an existing class with 428 // the same descriptor and ClassLoader. 429 mirror::Class* InsertClass(const StringPiece& descriptor, mirror::Class* klass, bool image_class) 430 LOCKS_EXCLUDED(Locks::classlinker_classes_lock_) 431 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 432 433 void RegisterDexFileLocked(const DexFile& dex_file, SirtRef<mirror::DexCache>& dex_cache) 434 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 435 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 436 bool IsDexFileRegisteredLocked(const DexFile& dex_file) const SHARED_LOCKS_REQUIRED(dex_lock_); 437 void RegisterOatFileLocked(const OatFile& oat_file) EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 438 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_); 439 440 bool InitializeClass(mirror::Class* klass, bool can_run_clinit, bool can_init_statics) 441 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 442 bool WaitForInitializeClass(mirror::Class* klass, Thread* self, ObjectLock& lock); 443 bool ValidateSuperClassDescriptors(const mirror::Class* klass) 444 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 445 bool InitializeSuperClass(mirror::Class* klass, bool can_run_clinit, bool can_init_fields) 446 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 447 // Initialize static fields, returns true if fields were initialized. 448 bool InitializeStaticFields(mirror::Class* klass) 449 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 450 451 bool IsSameDescriptorInDifferentClassContexts(const char* descriptor, 452 const mirror::Class* klass1, 453 const mirror::Class* klass2) 454 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 455 456 bool IsSameMethodSignatureInDifferentClassContexts(const mirror::AbstractMethod* method, 457 const mirror::Class* klass1, 458 const mirror::Class* klass2) 459 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 460 461 bool LinkClass(SirtRef<mirror::Class>& klass, mirror::ObjectArray<mirror::Class>* interfaces) 462 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 463 464 bool LinkSuperClass(SirtRef<mirror::Class>& klass) 465 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 466 467 bool LoadSuperAndInterfaces(SirtRef<mirror::Class>& klass, const DexFile& dex_file) 468 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 469 470 bool LinkMethods(SirtRef<mirror::Class>& klass, mirror::ObjectArray<mirror::Class>* interfaces) 471 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 472 473 bool LinkVirtualMethods(SirtRef<mirror::Class>& klass) 474 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 475 476 bool LinkInterfaceMethods(SirtRef<mirror::Class>& klass, 477 mirror::ObjectArray<mirror::Class>* interfaces) 478 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 479 480 bool LinkStaticFields(SirtRef<mirror::Class>& klass) 481 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 482 bool LinkInstanceFields(SirtRef<mirror::Class>& klass) 483 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 484 bool LinkFields(SirtRef<mirror::Class>& klass, bool is_static) 485 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 486 487 488 void CreateReferenceInstanceOffsets(SirtRef<mirror::Class>& klass) 489 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 490 void CreateReferenceStaticOffsets(SirtRef<mirror::Class>& klass) 491 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 492 void CreateReferenceOffsets(SirtRef<mirror::Class>& klass, bool is_static, 493 uint32_t reference_offsets) 494 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 495 496 // For use by ImageWriter to find DexCaches for its roots 497 const std::vector<mirror::DexCache*>& GetDexCaches() { 498 return dex_caches_; 499 } 500 501 const OatFile* FindOpenedOatFileForDexFile(const DexFile& dex_file) 502 LOCKS_EXCLUDED(dex_lock_) 503 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 504 const OatFile* FindOpenedOatFileFromDexLocation(const std::string& dex_location) 505 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, dex_lock_); 506 const OatFile* FindOpenedOatFileFromOatLocation(const std::string& oat_location) 507 SHARED_LOCKS_REQUIRED(dex_lock_); 508 const DexFile* FindDexFileInOatLocation(const std::string& dex_location, 509 uint32_t dex_location_checksum, 510 const std::string& oat_location) 511 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 512 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 513 514 const DexFile* VerifyAndOpenDexFileFromOatFile(const OatFile* oat_file, 515 const std::string& dex_location, 516 uint32_t dex_location_checksum) 517 EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) 518 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 519 520 mirror::AbstractMethod* CreateProxyConstructor(Thread* self, SirtRef<mirror::Class>& klass, 521 mirror::Class* proxy_class) 522 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 523 mirror::AbstractMethod* CreateProxyMethod(Thread* self, SirtRef<mirror::Class>& klass, 524 SirtRef<mirror::AbstractMethod>& prototype) 525 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 526 527 std::vector<const DexFile*> boot_class_path_; 528 529 mutable ReaderWriterMutex dex_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 530 std::vector<mirror::DexCache*> dex_caches_ GUARDED_BY(dex_lock_); 531 std::vector<const OatFile*> oat_files_ GUARDED_BY(dex_lock_); 532 533 534 // multimap from a string hash code of a class descriptor to 535 // mirror::Class* instances. Results should be compared for a matching 536 // Class::descriptor_ and Class::class_loader_. 537 typedef std::multimap<size_t, mirror::Class*> Table; 538 Table image_classes_ GUARDED_BY(Locks::classlinker_classes_lock_); 539 Table classes_ GUARDED_BY(Locks::classlinker_classes_lock_); 540 541 mirror::Class* LookupClassLocked(const char* descriptor, const mirror::ClassLoader* class_loader, 542 size_t hash, const Table& classes) 543 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_, Locks::classlinker_classes_lock_); 544 545 // indexes into class_roots_. 546 // needs to be kept in sync with class_roots_descriptors_. 547 enum ClassRoot { 548 kJavaLangClass, 549 kJavaLangObject, 550 kClassArrayClass, 551 kObjectArrayClass, 552 kJavaLangString, 553 kJavaLangDexCache, 554 kJavaLangRefReference, 555 kJavaLangReflectConstructor, 556 kJavaLangReflectField, 557 kJavaLangReflectAbstractMethod, 558 kJavaLangReflectMethod, 559 kJavaLangReflectProxy, 560 kJavaLangStringArrayClass, 561 kJavaLangReflectAbstractMethodArrayClass, 562 kJavaLangReflectFieldArrayClass, 563 kJavaLangReflectMethodArrayClass, 564 kJavaLangClassLoader, 565 kJavaLangThrowable, 566 kJavaLangClassNotFoundException, 567 kJavaLangStackTraceElement, 568 kPrimitiveBoolean, 569 kPrimitiveByte, 570 kPrimitiveChar, 571 kPrimitiveDouble, 572 kPrimitiveFloat, 573 kPrimitiveInt, 574 kPrimitiveLong, 575 kPrimitiveShort, 576 kPrimitiveVoid, 577 kBooleanArrayClass, 578 kByteArrayClass, 579 kCharArrayClass, 580 kDoubleArrayClass, 581 kFloatArrayClass, 582 kIntArrayClass, 583 kLongArrayClass, 584 kShortArrayClass, 585 kJavaLangStackTraceElementArrayClass, 586 kClassRootsMax, 587 }; 588 mirror::ObjectArray<mirror::Class>* class_roots_; 589 590 mirror::Class* GetClassRoot(ClassRoot class_root) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 591 592 void SetClassRoot(ClassRoot class_root, mirror::Class* klass) 593 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 594 595 mirror::ObjectArray<mirror::Class>* GetClassRoots() { 596 DCHECK(class_roots_ != NULL); 597 return class_roots_; 598 } 599 600 static const char* class_roots_descriptors_[]; 601 602 const char* GetClassRootDescriptor(ClassRoot class_root) { 603 const char* descriptor = class_roots_descriptors_[class_root]; 604 CHECK(descriptor != NULL); 605 return descriptor; 606 } 607 608 mirror::IfTable* array_iftable_; 609 610 bool init_done_; 611 bool is_dirty_; 612 613 InternTable* intern_table_; 614 615 const void* portable_resolution_trampoline_; 616 const void* quick_resolution_trampoline_; 617 618 friend class CommonTest; 619 friend class ImageWriter; // for GetClassRoots 620 friend class ObjectTest; 621 FRIEND_TEST(ClassLinkerTest, ClassRootDescriptors); 622 FRIEND_TEST(mirror::DexCacheTest, Open); 623 FRIEND_TEST(ExceptionTest, FindExceptionHandler); 624 FRIEND_TEST(ObjectTest, AllocObjectArray); 625 DISALLOW_COPY_AND_ASSIGN(ClassLinker); 626}; 627 628} // namespace art 629 630#endif // ART_SRC_CLASS_LINKER_H_ 631