compiler_driver.cc revision fb6adba0d5d5505610fbd325e7911db700a2f1e8
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 "compiler.h" 18 19#include <vector> 20 21#include <sys/mman.h> 22#include <unistd.h> 23 24#include "assembler.h" 25#include "class_linker.h" 26#include "class_loader.h" 27#include "dex_cache.h" 28#include "jni_compiler.h" 29#include "jni_internal.h" 30#include "oat_compilation_unit.h" 31#include "oat_file.h" 32#include "object_utils.h" 33#include "runtime.h" 34#include "stl_util.h" 35#include "timing_logger.h" 36 37#if defined(ART_USE_LLVM_COMPILER) 38#include "compiler_llvm/compiler_llvm.h" 39#endif 40 41namespace art { 42 43#if !defined(ART_USE_LLVM_COMPILER) 44CompiledMethod* oatCompileMethod(Compiler& compiler, const DexFile::CodeItem* code_item, 45 uint32_t access_flags, uint32_t method_idx, 46 const ClassLoader* class_loader, 47 const DexFile& dex_file, InstructionSet); 48#endif 49 50namespace arm { 51 ByteArray* CreateAbstractMethodErrorStub(); 52 CompiledInvokeStub* ArmCreateInvokeStub(bool is_static, const char* shorty, uint32_t shorty_len); 53 ByteArray* ArmCreateResolutionTrampoline(Runtime::TrampolineType type); 54 ByteArray* CreateJniDlsymLookupStub(); 55} 56namespace x86 { 57 ByteArray* CreateAbstractMethodErrorStub(); 58 CompiledInvokeStub* X86CreateInvokeStub(bool is_static, const char* shorty, uint32_t shorty_len); 59 ByteArray* X86CreateResolutionTrampoline(Runtime::TrampolineType type); 60 ByteArray* CreateJniDlsymLookupStub(); 61} 62 63namespace verifier { 64 class DexVerifier { 65 public: 66 static const std::vector<uint8_t>* GetGcMap(Compiler::MethodReference ref); 67 static bool IsClassRejected(Compiler::ClassReference ref); 68 }; 69} 70 71static double Percentage(size_t x, size_t y) { 72 return 100.0 * ((double)x) / ((double)(x + y)); 73} 74 75static void DumpStat(size_t x, size_t y, const char* str) { 76 if (x == 0 && y == 0) { 77 return; 78 } 79 LOG(INFO) << Percentage(x, y) << "% of " << str << " for " << (x + y) << " cases"; 80} 81 82class AOTCompilationStats { 83 public: 84 AOTCompilationStats() : stats_lock_("AOT compilation statistics lock"), 85 types_in_dex_cache_(0), types_not_in_dex_cache_(0), 86 strings_in_dex_cache_(0), strings_not_in_dex_cache_(0), 87 resolved_types_(0), unresolved_types_(0), 88 resolved_instance_fields_(0), unresolved_instance_fields_(0), 89 resolved_local_static_fields_(0), resolved_static_fields_(0), unresolved_static_fields_(0), 90 virtual_made_direct_(0) { 91 for (size_t i = 0; i < kMaxInvokeType; i++) { 92 resolved_methods_[i] = 0; 93 unresolved_methods_[i] = 0; 94 } 95 } 96 97 void Dump() { 98 DumpStat(types_in_dex_cache_, types_not_in_dex_cache_, "types known to be in dex cache"); 99 DumpStat(strings_in_dex_cache_, strings_not_in_dex_cache_, "strings known to be in dex cache"); 100 DumpStat(resolved_types_, unresolved_types_, "types resolved"); 101 DumpStat(resolved_instance_fields_, unresolved_instance_fields_, "instance fields resolved"); 102 DumpStat(resolved_local_static_fields_ + resolved_static_fields_, unresolved_static_fields_, 103 "static fields resolved"); 104 DumpStat(resolved_local_static_fields_, resolved_static_fields_ + unresolved_static_fields_, 105 "static fields local to a class"); 106 107 for (size_t i = 0; i < kMaxInvokeType; i++) { 108 std::ostringstream oss; 109 oss << "resolved " << static_cast<InvokeType>(i) << " methods"; 110 DumpStat(resolved_methods_[i], unresolved_methods_[i], oss.str().c_str()); 111 } 112 DumpStat(virtual_made_direct_, resolved_methods_[kVirtual] + unresolved_methods_[kVirtual], 113 "made direct from virtual"); 114 } 115 116// Allow lossy statistics in non-debug builds 117#ifndef NDEBUG 118#define STATS_LOCK() MutexLock mu(stats_lock_) 119#else 120#define STATS_LOCK() 121#endif 122 123 void TypeInDexCache() { 124 STATS_LOCK(); 125 types_in_dex_cache_++; 126 } 127 128 void TypeNotInDexCache() { 129 STATS_LOCK(); 130 types_not_in_dex_cache_++; 131 } 132 133 void StringInDexCache() { 134 STATS_LOCK(); 135 strings_in_dex_cache_++; 136 } 137 138 void StringNotInDexCache() { 139 STATS_LOCK(); 140 strings_not_in_dex_cache_++; 141 } 142 143 void TypeDoesntNeedAccessCheck() { 144 STATS_LOCK(); 145 resolved_types_++; 146 } 147 148 void TypeNeedsAccessCheck() { 149 STATS_LOCK(); 150 unresolved_types_++; 151 } 152 153 void ResolvedInstanceField() { 154 STATS_LOCK(); 155 resolved_instance_fields_++; 156 } 157 158 void UnresolvedInstanceField(){ 159 STATS_LOCK(); 160 unresolved_instance_fields_++; 161 } 162 163 void ResolvedLocalStaticField() { 164 STATS_LOCK(); 165 resolved_local_static_fields_++; 166 } 167 168 void ResolvedStaticField() { 169 STATS_LOCK(); 170 resolved_static_fields_++; 171 } 172 173 void UnresolvedStaticField() { 174 STATS_LOCK(); 175 unresolved_static_fields_++; 176 } 177 178 void ResolvedMethod(InvokeType type) { 179 DCHECK_LE(type, kMaxInvokeType); 180 STATS_LOCK(); 181 resolved_methods_[type]++; 182 } 183 184 void UnresolvedMethod(InvokeType type) { 185 DCHECK_LE(type, kMaxInvokeType); 186 STATS_LOCK(); 187 unresolved_methods_[type]++; 188 } 189 190 void VirtualMadeDirect() { 191 STATS_LOCK(); 192 virtual_made_direct_++; 193 } 194 private: 195 Mutex stats_lock_; 196 197 size_t types_in_dex_cache_; 198 size_t types_not_in_dex_cache_; 199 200 size_t strings_in_dex_cache_; 201 size_t strings_not_in_dex_cache_; 202 203 size_t resolved_types_; 204 size_t unresolved_types_; 205 206 size_t resolved_instance_fields_; 207 size_t unresolved_instance_fields_; 208 209 size_t resolved_local_static_fields_; 210 size_t resolved_static_fields_; 211 size_t unresolved_static_fields_; 212 213 size_t resolved_methods_[kMaxInvokeType + 1]; 214 size_t unresolved_methods_[kMaxInvokeType + 1]; 215 size_t virtual_made_direct_; 216 217 DISALLOW_COPY_AND_ASSIGN(AOTCompilationStats);; 218}; 219 220Compiler::Compiler(InstructionSet instruction_set, bool image, size_t thread_count, 221 bool support_debugging, const std::set<std::string>* image_classes) 222 : instruction_set_(instruction_set), 223 jni_compiler_(instruction_set), 224 compiled_classes_lock_("compiled classes lock"), 225 compiled_methods_lock_("compiled method lock"), 226 compiled_invoke_stubs_lock_("compiled invoke stubs lock"), 227 image_(image), 228 thread_count_(thread_count), 229 support_debugging_(support_debugging), 230 stats_(new AOTCompilationStats), 231 image_classes_(image_classes) 232#if defined(ART_USE_LLVM_COMPILER) 233 , 234 compiler_llvm_(new compiler_llvm::CompilerLLVM(this, instruction_set)) 235#endif 236 { 237 CHECK(!Runtime::Current()->IsStarted()); 238 if (!image_) { 239 CHECK(image_classes_ == NULL); 240 } 241} 242 243Compiler::~Compiler() { 244 { 245 MutexLock mu(compiled_classes_lock_); 246 STLDeleteValues(&compiled_classes_); 247 } 248 { 249 MutexLock mu(compiled_methods_lock_); 250 STLDeleteValues(&compiled_methods_); 251 } 252 { 253 MutexLock mu(compiled_invoke_stubs_lock_); 254 STLDeleteValues(&compiled_invoke_stubs_); 255 } 256} 257 258ByteArray* Compiler::CreateResolutionStub(InstructionSet instruction_set, 259 Runtime::TrampolineType type) { 260 if (instruction_set == kX86) { 261 return x86::X86CreateResolutionTrampoline(type); 262 } else { 263 CHECK(instruction_set == kArm || instruction_set == kThumb2); 264 // Generates resolution stub using ARM instruction set 265 return arm::ArmCreateResolutionTrampoline(type); 266 } 267} 268 269ByteArray* Compiler::CreateJniDlsymLookupStub(InstructionSet instruction_set) { 270 switch (instruction_set) { 271 case kArm: 272 case kThumb2: 273 return arm::CreateJniDlsymLookupStub(); 274 case kX86: 275 return x86::CreateJniDlsymLookupStub(); 276 default: 277 LOG(FATAL) << "Unknown InstructionSet: " << static_cast<int>(instruction_set); 278 return NULL; 279 } 280} 281 282ByteArray* Compiler::CreateAbstractMethodErrorStub(InstructionSet instruction_set) { 283 if (instruction_set == kX86) { 284 return x86::CreateAbstractMethodErrorStub(); 285 } else { 286 CHECK(instruction_set == kArm || instruction_set == kThumb2); 287 // Generates resolution stub using ARM instruction set 288 return arm::CreateAbstractMethodErrorStub(); 289 } 290} 291 292void Compiler::CompileAll(const ClassLoader* class_loader, 293 const std::vector<const DexFile*>& dex_files) { 294 DCHECK(!Runtime::Current()->IsStarted()); 295 296 TimingLogger timings("compiler"); 297 298 PreCompile(class_loader, dex_files, timings); 299 300 Compile(class_loader, dex_files); 301 timings.AddSplit("Compile"); 302 303 PostCompile(class_loader, dex_files); 304 timings.AddSplit("PostCompile"); 305 306 if (timings.GetTotalNs() > MsToNs(1000)) { 307 timings.Dump(); 308 } 309 310 stats_->Dump(); 311} 312 313void Compiler::CompileOne(const Method* method) { 314 DCHECK(!Runtime::Current()->IsStarted()); 315 316 const ClassLoader* class_loader = method->GetDeclaringClass()->GetClassLoader(); 317 318 // Find the dex_file 319 const DexCache* dex_cache = method->GetDeclaringClass()->GetDexCache(); 320 const DexFile& dex_file = Runtime::Current()->GetClassLinker()->FindDexFile(dex_cache); 321 std::vector<const DexFile*> dex_files; 322 dex_files.push_back(&dex_file); 323 324 TimingLogger timings("CompileOne"); 325 PreCompile(class_loader, dex_files, timings); 326 327 uint32_t method_idx = method->GetDexMethodIndex(); 328 const DexFile::CodeItem* code_item = dex_file.GetCodeItem(method->GetCodeItemOffset()); 329 CompileMethod(code_item, method->GetAccessFlags(), method_idx, class_loader, dex_file); 330 331 PostCompile(class_loader, dex_files); 332} 333 334void Compiler::Resolve(const ClassLoader* class_loader, 335 const std::vector<const DexFile*>& dex_files, TimingLogger& timings) { 336 for (size_t i = 0; i != dex_files.size(); ++i) { 337 const DexFile* dex_file = dex_files[i]; 338 CHECK(dex_file != NULL); 339 ResolveDexFile(class_loader, *dex_file, timings); 340 } 341} 342 343void Compiler::PreCompile(const ClassLoader* class_loader, 344 const std::vector<const DexFile*>& dex_files, TimingLogger& timings) { 345 Resolve(class_loader, dex_files, timings); 346 347 Verify(class_loader, dex_files); 348 timings.AddSplit("PreCompile.Verify"); 349 350 InitializeClassesWithoutClinit(class_loader, dex_files); 351 timings.AddSplit("PreCompile.InitializeClassesWithoutClinit"); 352} 353 354void Compiler::PostCompile(const ClassLoader* class_loader, 355 const std::vector<const DexFile*>& dex_files) { 356 SetGcMaps(class_loader, dex_files); 357#if defined(ART_USE_LLVM_COMPILER) 358 compiler_llvm_->MaterializeRemainder(); 359#endif 360} 361 362bool Compiler::IsImageClass(const std::string& descriptor) const { 363 if (image_classes_ == NULL) { 364 return true; 365 } 366 return image_classes_->find(descriptor) != image_classes_->end(); 367} 368 369bool Compiler::CanAssumeTypeIsPresentInDexCache(const DexCache* dex_cache, 370 uint32_t type_idx) { 371 if (!IsImage()) { 372 stats_->TypeNotInDexCache(); 373 return false; 374 } 375 Class* resolved_class = dex_cache->GetResolvedType(type_idx); 376 if (resolved_class == NULL) { 377 stats_->TypeNotInDexCache(); 378 return false; 379 } 380 bool result = IsImageClass(ClassHelper(resolved_class).GetDescriptor()); 381 if (result) { 382 stats_->TypeInDexCache(); 383 } else { 384 stats_->TypeNotInDexCache(); 385 } 386 return result; 387} 388 389bool Compiler::CanAssumeStringIsPresentInDexCache(const DexCache* dex_cache, 390 uint32_t string_idx) { 391 // TODO: Add support for loading strings referenced by image_classes_ 392 // See also Compiler::ResolveDexFile 393 394 // The following is a test saying that if we're building the image without a restricted set of 395 // image classes then we can assume the string is present in the dex cache if it is there now 396 bool result = IsImage() && image_classes_ == NULL && dex_cache->GetResolvedString(string_idx) != NULL; 397 if (result) { 398 stats_->StringInDexCache(); 399 } else { 400 stats_->StringNotInDexCache(); 401 } 402 return result; 403} 404 405bool Compiler::CanAccessTypeWithoutChecks(uint32_t referrer_idx, const DexCache* dex_cache, 406 const DexFile& dex_file, uint32_t type_idx) { 407 // Get type from dex cache assuming it was populated by the verifier 408 Class* resolved_class = dex_cache->GetResolvedType(type_idx); 409 if (resolved_class == NULL) { 410 stats_->TypeNeedsAccessCheck(); 411 return false; // Unknown class needs access checks. 412 } 413 const DexFile::MethodId& method_id = dex_file.GetMethodId(referrer_idx); 414 Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_); 415 if (referrer_class == NULL) { 416 stats_->TypeNeedsAccessCheck(); 417 return false; // Incomplete referrer knowledge needs access check. 418 } 419 // Perform access check, will return true if access is ok or false if we're going to have to 420 // check this at runtime (for example for class loaders). 421 bool result = referrer_class->CanAccess(resolved_class); 422 if (result) { 423 stats_->TypeDoesntNeedAccessCheck(); 424 } else { 425 stats_->TypeNeedsAccessCheck(); 426 } 427 return result; 428} 429 430bool Compiler::CanAccessInstantiableTypeWithoutChecks(uint32_t referrer_idx, 431 const DexCache* dex_cache, 432 const DexFile& dex_file, 433 uint32_t type_idx) { 434 // Get type from dex cache assuming it was populated by the verifier. 435 Class* resolved_class = dex_cache->GetResolvedType(type_idx); 436 if (resolved_class == NULL) { 437 stats_->TypeNeedsAccessCheck(); 438 return false; // Unknown class needs access checks. 439 } 440 const DexFile::MethodId& method_id = dex_file.GetMethodId(referrer_idx); 441 Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_); 442 if (referrer_class == NULL) { 443 stats_->TypeNeedsAccessCheck(); 444 return false; // Incomplete referrer knowledge needs access check. 445 } 446 // Perform access and instantiable checks, will return true if access is ok or false if we're 447 // going to have to check this at runtime (for example for class loaders). 448 bool result = referrer_class->CanAccess(resolved_class) && resolved_class->IsInstantiable(); 449 if (result) { 450 stats_->TypeDoesntNeedAccessCheck(); 451 } else { 452 stats_->TypeNeedsAccessCheck(); 453 } 454 return result; 455} 456 457static Class* ComputeReferrerClass(OatCompilationUnit* mUnit) { 458 const DexFile::MethodId& referrer_method_id = 459 mUnit->dex_file_->GetMethodId(mUnit->method_idx_); 460 461 return mUnit->class_linker_->ResolveType( 462 *mUnit->dex_file_, referrer_method_id.class_idx_, 463 mUnit->dex_cache_, mUnit->class_loader_); 464} 465 466static Field* ComputeReferrerField(OatCompilationUnit* mUnit, uint32_t field_idx) { 467 return mUnit->class_linker_->ResolveField( 468 *mUnit->dex_file_, field_idx, mUnit->dex_cache_, 469 mUnit->class_loader_, false); 470} 471 472static Method* ComputeReferrerMethod(OatCompilationUnit* mUnit, uint32_t method_idx) { 473 return mUnit->class_linker_->ResolveMethod( 474 *mUnit->dex_file_, method_idx, mUnit->dex_cache_, 475 mUnit->class_loader_, true); 476} 477 478bool Compiler::ComputeInstanceFieldInfo(uint32_t field_idx, OatCompilationUnit* mUnit, 479 int& field_offset, bool& is_volatile, bool is_put) { 480 // Conservative defaults 481 field_offset = -1; 482 is_volatile = true; 483 // Try to resolve field 484 Field* resolved_field = ComputeReferrerField(mUnit, field_idx); 485 if (resolved_field != NULL) { 486 Class* referrer_class = ComputeReferrerClass(mUnit); 487 // Try to resolve referring class then access check, failure to pass the 488 Class* fields_class = resolved_field->GetDeclaringClass(); 489 bool is_write_to_final_from_wrong_class = is_put && resolved_field->IsFinal() && 490 fields_class != referrer_class; 491 if (referrer_class != NULL && referrer_class->CanAccess(fields_class) && 492 referrer_class->CanAccessMember(fields_class, resolved_field->GetAccessFlags()) && 493 !is_write_to_final_from_wrong_class) { 494 field_offset = resolved_field->GetOffset().Int32Value(); 495 is_volatile = resolved_field->IsVolatile(); 496 stats_->ResolvedInstanceField(); 497 return true; // Fast path. 498 } 499 } 500 // Clean up any exception left by field/type resolution 501 Thread* thread = Thread::Current(); 502 if (thread->IsExceptionPending()) { 503 thread->ClearException(); 504 } 505 stats_->UnresolvedInstanceField(); 506 return false; // Incomplete knowledge needs slow path. 507} 508 509bool Compiler::ComputeStaticFieldInfo(uint32_t field_idx, OatCompilationUnit* mUnit, 510 int& field_offset, int& ssb_index, 511 bool& is_referrers_class, bool& is_volatile, bool is_put) { 512 // Conservative defaults 513 field_offset = -1; 514 ssb_index = -1; 515 is_referrers_class = false; 516 is_volatile = true; 517 // Try to resolve field 518 Field* resolved_field = ComputeReferrerField(mUnit, field_idx); 519 if (resolved_field != NULL) { 520 DCHECK(resolved_field->IsStatic()); 521 Class* referrer_class = ComputeReferrerClass(mUnit); 522 if (referrer_class != NULL) { 523 Class* fields_class = resolved_field->GetDeclaringClass(); 524 if (fields_class == referrer_class) { 525 is_referrers_class = true; // implies no worrying about class initialization 526 field_offset = resolved_field->GetOffset().Int32Value(); 527 is_volatile = resolved_field->IsVolatile(); 528 stats_->ResolvedLocalStaticField(); 529 return true; // fast path 530 } else { 531 bool is_write_to_final_from_wrong_class = is_put && resolved_field->IsFinal(); 532 if (referrer_class->CanAccess(fields_class) && 533 referrer_class->CanAccessMember(fields_class, resolved_field->GetAccessFlags()) && 534 !is_write_to_final_from_wrong_class) { 535 // We have the resolved field, we must make it into a ssbIndex for the referrer 536 // in its static storage base (which may fail if it doesn't have a slot for it) 537 // TODO: for images we can elide the static storage base null check 538 // if we know there's a non-null entry in the image 539 if (fields_class->GetDexCache() == mUnit->dex_cache_) { 540 // common case where the dex cache of both the referrer and the field are the same, 541 // no need to search the dex file 542 ssb_index = fields_class->GetDexTypeIndex(); 543 field_offset = resolved_field->GetOffset().Int32Value(); 544 is_volatile = resolved_field->IsVolatile(); 545 stats_->ResolvedStaticField(); 546 return true; 547 } 548 // Search dex file for localized ssb index 549 std::string descriptor(FieldHelper(resolved_field).GetDeclaringClassDescriptor()); 550 const DexFile::StringId* string_id = 551 mUnit->dex_file_->FindStringId(descriptor); 552 if (string_id != NULL) { 553 const DexFile::TypeId* type_id = 554 mUnit->dex_file_->FindTypeId(mUnit->dex_file_->GetIndexForStringId(*string_id)); 555 if(type_id != NULL) { 556 // medium path, needs check of static storage base being initialized 557 ssb_index = mUnit->dex_file_->GetIndexForTypeId(*type_id); 558 field_offset = resolved_field->GetOffset().Int32Value(); 559 is_volatile = resolved_field->IsVolatile(); 560 stats_->ResolvedStaticField(); 561 return true; 562 } 563 } 564 } 565 } 566 } 567 } 568 // Clean up any exception left by field/type resolution 569 Thread* thread = Thread::Current(); 570 if (thread->IsExceptionPending()) { 571 thread->ClearException(); 572 } 573 stats_->UnresolvedStaticField(); 574 return false; // Incomplete knowledge needs slow path. 575} 576 577bool Compiler::ComputeInvokeInfo(uint32_t method_idx, OatCompilationUnit* mUnit, InvokeType& type, 578 int& vtable_idx) { 579 vtable_idx = -1; 580 Method* resolved_method = ComputeReferrerMethod(mUnit, method_idx); 581 if (resolved_method != NULL) { 582 Class* referrer_class = ComputeReferrerClass(mUnit); 583 if (referrer_class != NULL) { 584 Class* methods_class = resolved_method->GetDeclaringClass(); 585 if (!referrer_class->CanAccess(methods_class) || 586 !referrer_class->CanAccessMember(methods_class, 587 resolved_method->GetAccessFlags())) { 588 // The referring class can't access the resolved method, this may occur as a result of a 589 // protected method being made public by implementing an interface that re-declares the 590 // method public. Resort to the dex file to determine the correct class for the access check 591 const DexFile& dex_file = mUnit->class_linker_->FindDexFile(referrer_class->GetDexCache()); 592 methods_class = 593 mUnit->class_linker_->ResolveType(dex_file, 594 dex_file.GetMethodId(method_idx).class_idx_, 595 referrer_class); 596 597 } 598 if (referrer_class->CanAccess(methods_class) && 599 referrer_class->CanAccessMember(methods_class, 600 resolved_method->GetAccessFlags())) { 601 vtable_idx = resolved_method->GetMethodIndex(); 602 if (type == kVirtual && (resolved_method->IsFinal() || methods_class->IsFinal())) { 603 stats_->ResolvedMethod(kVirtual); 604 // Sharpen a virtual call into a direct call. The method_idx is into referrer's 605 // dex cache, check that this resolved method is where we expect it. 606 CHECK(referrer_class->GetDexCache()->GetResolvedMethod(method_idx) == resolved_method) 607 << PrettyMethod(resolved_method); 608 type = kDirect; 609 stats_->VirtualMadeDirect(); 610 return true; 611 } else if (type != kSuper) { 612 // nothing left to do for static/direct/virtual/interface dispatch 613 stats_->ResolvedMethod(type); 614 return true; 615 } else { 616 // ensure the vtable index will be correct to dispatch in the vtable of the super class 617 if (referrer_class->IsSubClass(methods_class) && 618 vtable_idx < methods_class->GetVTable()->GetLength()) { 619 stats_->ResolvedMethod(type); 620 return true; 621 } 622 } 623 } 624 } 625 } 626 // Clean up any exception left by method/type resolution 627 Thread* thread = Thread::Current(); 628 if (thread->IsExceptionPending()) { 629 thread->ClearException(); 630 } 631 stats_->UnresolvedMethod(type); 632 return false; // Incomplete knowledge needs slow path. 633} 634 635// Return true if the class should be skipped during compilation. We 636// never skip classes in the boot class loader. However, if we have a 637// non-boot class loader and we can resolve the class in the boot 638// class loader, we do skip the class. This happens if an app bundles 639// classes found in the boot classpath. Since at runtime we will 640// select the class from the boot classpath, do not attempt to resolve 641// or compile it now. 642static bool SkipClass(const ClassLoader* class_loader, 643 const DexFile& dex_file, 644 const DexFile::ClassDef& class_def) { 645 if (class_loader == NULL) { 646 return false; 647 } 648 const char* descriptor = dex_file.GetClassDescriptor(class_def); 649 ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 650 Class* klass = class_linker->FindClass(descriptor, NULL); 651 if (klass == NULL) { 652 Thread* self = Thread::Current(); 653 CHECK(self->IsExceptionPending()); 654 self->ClearException(); 655 return false; 656 } 657 return true; 658} 659 660struct Context { 661 ClassLinker* class_linker; 662 const ClassLoader* class_loader; 663 Compiler* compiler; 664 DexCache* dex_cache; 665 const DexFile* dex_file; 666}; 667 668typedef void Callback(Context* context, size_t index); 669 670class WorkerThread { 671 public: 672 WorkerThread(Context* context, size_t begin, size_t end, Callback callback, size_t stripe, bool spawn) 673 : spawn_(spawn), context_(context), begin_(begin), end_(end), callback_(callback), stripe_(stripe) { 674 if (spawn_) { 675 CHECK_PTHREAD_CALL(pthread_create, (&pthread_, NULL, &Go, this), "compiler worker thread"); 676 } 677 } 678 679 ~WorkerThread() { 680 if (spawn_) { 681 CHECK_PTHREAD_CALL(pthread_join, (pthread_, NULL), "compiler worker shutdown"); 682 } 683 } 684 685 private: 686 static void* Go(void* arg) { 687 WorkerThread* worker = reinterpret_cast<WorkerThread*>(arg); 688 Runtime* runtime = Runtime::Current(); 689 if (worker->spawn_) { 690 runtime->AttachCurrentThread("Compiler Worker", true); 691 } 692 Thread::Current()->SetState(Thread::kRunnable); 693 worker->Run(); 694 if (worker->spawn_) { 695 Thread::Current()->SetState(Thread::kNative); 696 runtime->DetachCurrentThread(); 697 } 698 return NULL; 699 } 700 701 void Go() { 702 Go(this); 703 } 704 705 void Run() { 706 for (size_t i = begin_; i < end_; i += stripe_) { 707 callback_(context_, i); 708 } 709 } 710 711 pthread_t pthread_; 712 bool spawn_; 713 714 Context* context_; 715 size_t begin_; 716 size_t end_; 717 Callback* callback_; 718 size_t stripe_; 719 720 friend void ForAll(Context*, size_t, size_t, Callback, size_t); 721}; 722 723void ForAll(Context* context, size_t begin, size_t end, Callback callback, size_t thread_count) { 724 CHECK_GT(thread_count, 0U); 725 726 std::vector<WorkerThread*> threads; 727 for (size_t i = 0; i < thread_count; ++i) { 728 threads.push_back(new WorkerThread(context, begin + i, end, callback, thread_count, (i != 0))); 729 } 730 threads[0]->Go(); 731 732 // Switch to kVmWait while we're blocked waiting for the other threads to finish. 733 ScopedThreadStateChange tsc(Thread::Current(), Thread::kVmWait); 734 STLDeleteElements(&threads); 735} 736 737static void ResolveClassFieldsAndMethods(Context* context, size_t class_def_index) { 738 const DexFile& dex_file = *context->dex_file; 739 740 // Method and Field are the worst. We can't resolve without either 741 // context from the code use (to disambiguate virtual vs direct 742 // method and instance vs static field) or from class 743 // definitions. While the compiler will resolve what it can as it 744 // needs it, here we try to resolve fields and methods used in class 745 // definitions, since many of them many never be referenced by 746 // generated code. 747 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index); 748 if (SkipClass(context->class_loader, dex_file, class_def)) { 749 return; 750 } 751 752 // Note the class_data pointer advances through the headers, 753 // static fields, instance fields, direct methods, and virtual 754 // methods. 755 const byte* class_data = dex_file.GetClassData(class_def); 756 if (class_data == NULL) { 757 // empty class such as a marker interface 758 return; 759 } 760 Thread* self = Thread::Current(); 761 ClassLinker* class_linker = context->class_linker; 762 DexCache* dex_cache = class_linker->FindDexCache(dex_file); 763 ClassDataItemIterator it(dex_file, class_data); 764 while (it.HasNextStaticField()) { 765 Field* field = class_linker->ResolveField(dex_file, it.GetMemberIndex(), dex_cache, 766 context->class_loader, true); 767 if (field == NULL) { 768 CHECK(self->IsExceptionPending()); 769 self->ClearException(); 770 } 771 it.Next(); 772 } 773 while (it.HasNextInstanceField()) { 774 Field* field = class_linker->ResolveField(dex_file, it.GetMemberIndex(), dex_cache, 775 context->class_loader, false); 776 if (field == NULL) { 777 CHECK(self->IsExceptionPending()); 778 self->ClearException(); 779 } 780 it.Next(); 781 } 782 while (it.HasNextDirectMethod()) { 783 Method* method = class_linker->ResolveMethod(dex_file, it.GetMemberIndex(), dex_cache, 784 context->class_loader, true); 785 if (method == NULL) { 786 CHECK(self->IsExceptionPending()); 787 self->ClearException(); 788 } 789 it.Next(); 790 } 791 while (it.HasNextVirtualMethod()) { 792 Method* method = class_linker->ResolveMethod(dex_file, it.GetMemberIndex(), dex_cache, 793 context->class_loader, false); 794 if (method == NULL) { 795 CHECK(self->IsExceptionPending()); 796 self->ClearException(); 797 } 798 it.Next(); 799 } 800 DCHECK(!it.HasNext()); 801} 802 803static void ResolveType(Context* context, size_t type_idx) { 804 // Class derived values are more complicated, they require the linker and loader. 805 Thread* self = Thread::Current(); 806 ClassLinker* class_linker = context->class_linker; 807 const DexFile& dex_file = *context->dex_file; 808 Class* klass = class_linker->ResolveType(dex_file, type_idx, context->dex_cache, context->class_loader); 809 if (klass == NULL) { 810 CHECK(self->IsExceptionPending()); 811 Thread::Current()->ClearException(); 812 } 813} 814 815void Compiler::ResolveDexFile(const ClassLoader* class_loader, const DexFile& dex_file, TimingLogger& timings) { 816 ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 817 DexCache* dex_cache = class_linker->FindDexCache(dex_file); 818 819 // Strings are easy in that they always are simply resolved to literals in the same file 820 if (image_ && image_classes_ == NULL) { 821 // TODO: Add support for loading strings referenced by image_classes_ 822 // See also Compiler::CanAssumeTypeIsPresentInDexCache. 823 for (size_t string_idx = 0; string_idx < dex_cache->NumStrings(); string_idx++) { 824 class_linker->ResolveString(dex_file, string_idx, dex_cache); 825 } 826 timings.AddSplit("Resolve " + dex_file.GetLocation() + " Strings"); 827 } 828 829 Context context; 830 context.class_linker = class_linker; 831 context.class_loader = class_loader; 832 context.dex_cache = dex_cache; 833 context.dex_file = &dex_file; 834 835 ForAll(&context, 0, dex_cache->NumResolvedTypes(), ResolveType, thread_count_); 836 timings.AddSplit("Resolve " + dex_file.GetLocation() + " Types"); 837 838 ForAll(&context, 0, dex_file.NumClassDefs(), ResolveClassFieldsAndMethods, thread_count_); 839 timings.AddSplit("Resolve " + dex_file.GetLocation() + " MethodsAndFields"); 840} 841 842void Compiler::Verify(const ClassLoader* class_loader, 843 const std::vector<const DexFile*>& dex_files) { 844 for (size_t i = 0; i != dex_files.size(); ++i) { 845 const DexFile* dex_file = dex_files[i]; 846 CHECK(dex_file != NULL); 847 VerifyDexFile(class_loader, *dex_file); 848 } 849} 850 851static void VerifyClass(Context* context, size_t class_def_index) { 852 const DexFile::ClassDef& class_def = context->dex_file->GetClassDef(class_def_index); 853 const char* descriptor = context->dex_file->GetClassDescriptor(class_def); 854 Class* klass = context->class_linker->FindClass(descriptor, context->class_loader); 855 if (klass == NULL) { 856 Thread* self = Thread::Current(); 857 CHECK(self->IsExceptionPending()); 858 self->ClearException(); 859 return; 860 } 861 CHECK(klass->IsResolved()) << PrettyClass(klass); 862 context->class_linker->VerifyClass(klass); 863 864 if (klass->IsErroneous()) { 865 // ClassLinker::VerifyClass throws, which isn't useful in the compiler. 866 CHECK(Thread::Current()->IsExceptionPending()); 867 Thread::Current()->ClearException(); 868 // We want to try verification again at run-time, so move back into the resolved state. 869 klass->SetStatus(Class::kStatusResolved); 870 } 871 872 CHECK(klass->IsVerified() || klass->IsResolved()) << PrettyClass(klass); 873 CHECK(!Thread::Current()->IsExceptionPending()) << PrettyTypeOf(Thread::Current()->GetException()); 874} 875 876void Compiler::VerifyDexFile(const ClassLoader* class_loader, const DexFile& dex_file) { 877 dex_file.ChangePermissions(PROT_READ | PROT_WRITE); 878 879 Context context; 880 context.class_linker = Runtime::Current()->GetClassLinker(); 881 context.class_loader = class_loader; 882 context.dex_file = &dex_file; 883 ForAll(&context, 0, dex_file.NumClassDefs(), VerifyClass, thread_count_); 884 885 dex_file.ChangePermissions(PROT_READ); 886} 887 888void Compiler::InitializeClassesWithoutClinit(const ClassLoader* class_loader, 889 const std::vector<const DexFile*>& dex_files) { 890 for (size_t i = 0; i != dex_files.size(); ++i) { 891 const DexFile* dex_file = dex_files[i]; 892 CHECK(dex_file != NULL); 893 InitializeClassesWithoutClinit(class_loader, *dex_file); 894 } 895} 896 897void Compiler::InitializeClassesWithoutClinit(const ClassLoader* class_loader, const DexFile& dex_file) { 898 ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 899 for (size_t class_def_index = 0; class_def_index < dex_file.NumClassDefs(); class_def_index++) { 900 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index); 901 const char* descriptor = dex_file.GetClassDescriptor(class_def); 902 Class* klass = class_linker->FindClass(descriptor, class_loader); 903 if (klass != NULL) { 904 class_linker->EnsureInitialized(klass, false); 905 // record the final class status if necessary 906 Class::Status status = klass->GetStatus(); 907 ClassReference ref(&dex_file, class_def_index); 908 MutexLock mu(compiled_classes_lock_); 909 CompiledClass* compiled_class = GetCompiledClass(ref); 910 if (compiled_class == NULL) { 911 compiled_class = new CompiledClass(status); 912 compiled_classes_[ref] = compiled_class; 913 } else { 914 DCHECK_EQ(status, compiled_class->GetStatus()); 915 } 916 } 917 // clear any class not found or verification exceptions 918 Thread::Current()->ClearException(); 919 } 920 921 DexCache* dex_cache = class_linker->FindDexCache(dex_file); 922 for (size_t type_idx = 0; type_idx < dex_cache->NumResolvedTypes(); type_idx++) { 923 Class* klass = class_linker->ResolveType(dex_file, type_idx, dex_cache, class_loader); 924 if (klass == NULL) { 925 Thread::Current()->ClearException(); 926 } else if (klass->IsInitialized()) { 927 dex_cache->GetInitializedStaticStorage()->Set(type_idx, klass); 928 } 929 } 930} 931 932void Compiler::Compile(const ClassLoader* class_loader, 933 const std::vector<const DexFile*>& dex_files) { 934 for (size_t i = 0; i != dex_files.size(); ++i) { 935 const DexFile* dex_file = dex_files[i]; 936 CHECK(dex_file != NULL); 937 CompileDexFile(class_loader, *dex_file); 938 } 939} 940 941void Compiler::CompileClass(Context* context, size_t class_def_index) { 942 const ClassLoader* class_loader = context->class_loader; 943 const DexFile& dex_file = *context->dex_file; 944 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index); 945 946#if defined(ART_USE_LLVM_COMPILER) 947 compiler_llvm::CompilerLLVM* compiler_llvm = context->compiler->GetCompilerLLVM(); 948 949 MutexLock GUARD(compiler_llvm->compiler_lock_); 950 // TODO: Remove this. We should not lock the compiler_lock_ in CompileClass() 951 // However, without this mutex lock, we will get segmentation fault. 952#endif 953 954 if (SkipClass(class_loader, dex_file, class_def)) { 955 return; 956 } 957 ClassReference ref(&dex_file, class_def_index); 958 // Skip compiling classes with generic verifier failures since they will still fail at runtime 959 if (verifier::DexVerifier::IsClassRejected(ref)) { 960 return; 961 } 962 const byte* class_data = dex_file.GetClassData(class_def); 963 if (class_data == NULL) { 964 // empty class, probably a marker interface 965 return; 966 } 967 ClassDataItemIterator it(dex_file, class_data); 968 // Skip fields 969 while (it.HasNextStaticField()) { 970 it.Next(); 971 } 972 while (it.HasNextInstanceField()) { 973 it.Next(); 974 } 975 // Compile direct methods 976 while (it.HasNextDirectMethod()) { 977 context->compiler->CompileMethod(it.GetMethodCodeItem(), it.GetMemberAccessFlags(), 978 it.GetMemberIndex(), class_loader, dex_file); 979 it.Next(); 980 } 981 // Compile virtual methods 982 while (it.HasNextVirtualMethod()) { 983 context->compiler->CompileMethod(it.GetMethodCodeItem(), it.GetMemberAccessFlags(), 984 it.GetMemberIndex(), class_loader, dex_file); 985 it.Next(); 986 } 987 DCHECK(!it.HasNext()); 988 989#if defined(ART_USE_LLVM_COMPILER) 990 compiler_llvm->MaterializeIfThresholdReached(); 991#endif 992} 993 994void Compiler::CompileDexFile(const ClassLoader* class_loader, const DexFile& dex_file) { 995 Context context; 996 context.class_loader = class_loader; 997 context.compiler = this; 998 context.dex_file = &dex_file; 999 ForAll(&context, 0, dex_file.NumClassDefs(), Compiler::CompileClass, thread_count_); 1000} 1001 1002void Compiler::CompileMethod(const DexFile::CodeItem* code_item, uint32_t access_flags, 1003 uint32_t method_idx, const ClassLoader* class_loader, 1004 const DexFile& dex_file) { 1005 CompiledMethod* compiled_method = NULL; 1006 uint64_t start_ns = NanoTime(); 1007 1008#if defined(ART_USE_LLVM_COMPILER) 1009 ClassLinker *class_linker = Runtime::Current()->GetClassLinker(); 1010 DexCache *dex_cache = class_linker->FindDexCache(dex_file); 1011 1012 OatCompilationUnit oat_compilation_unit( 1013 class_loader, class_linker, dex_file, *dex_cache, code_item, 1014 method_idx, access_flags); 1015#endif 1016 1017 if ((access_flags & kAccNative) != 0) { 1018#if defined(ART_USE_LLVM_COMPILER) 1019 compiled_method = compiler_llvm_->CompileNativeMethod(&oat_compilation_unit); 1020#else 1021 compiled_method = jni_compiler_.Compile(access_flags, method_idx, class_loader, dex_file); 1022#endif 1023 CHECK(compiled_method != NULL); 1024 } else if ((access_flags & kAccAbstract) != 0) { 1025 } else { 1026#if defined(ART_USE_LLVM_COMPILER) 1027 compiled_method = compiler_llvm_->CompileDexMethod(&oat_compilation_unit); 1028#else 1029 compiled_method = oatCompileMethod(*this, code_item, access_flags, method_idx, class_loader, 1030 dex_file, kThumb2); 1031#endif 1032 CHECK(compiled_method != NULL) << PrettyMethod(method_idx, dex_file); 1033 } 1034 uint64_t duration_ns = NanoTime() - start_ns; 1035 if (duration_ns > MsToNs(100)) { 1036 LOG(WARNING) << "Compilation of " << PrettyMethod(method_idx, dex_file) 1037 << " took " << PrettyDuration(duration_ns); 1038 } 1039 1040 if (compiled_method != NULL) { 1041 MethodReference ref(&dex_file, method_idx); 1042 CHECK(GetCompiledMethod(ref) == NULL) << PrettyMethod(method_idx, dex_file); 1043 MutexLock mu(compiled_methods_lock_); 1044 compiled_methods_[ref] = compiled_method; 1045 DCHECK(GetCompiledMethod(ref) != NULL) << PrettyMethod(method_idx, dex_file); 1046 } 1047 1048 uint32_t shorty_len; 1049 const char* shorty = dex_file.GetMethodShorty(dex_file.GetMethodId(method_idx), &shorty_len); 1050 bool is_static = (access_flags & kAccStatic) != 0; 1051 const CompiledInvokeStub* compiled_invoke_stub = FindInvokeStub(is_static, shorty); 1052 if (compiled_invoke_stub == NULL) { 1053#if defined(ART_USE_LLVM_COMPILER) 1054 compiled_invoke_stub = compiler_llvm_->CreateInvokeStub(is_static, shorty); 1055#else 1056 if (instruction_set_ == kX86) { 1057 compiled_invoke_stub = ::art::x86::X86CreateInvokeStub(is_static, shorty, shorty_len); 1058 } else { 1059 CHECK(instruction_set_ == kArm || instruction_set_ == kThumb2); 1060 // Generates invocation stub using ARM instruction set 1061 compiled_invoke_stub = ::art::arm::ArmCreateInvokeStub(is_static, shorty, shorty_len); 1062 } 1063#endif 1064 1065 CHECK(compiled_invoke_stub != NULL); 1066 InsertInvokeStub(is_static, shorty, compiled_invoke_stub); 1067 } 1068 CHECK(!Thread::Current()->IsExceptionPending()) << PrettyMethod(method_idx, dex_file); 1069} 1070 1071static std::string MakeInvokeStubKey(bool is_static, const char* shorty) { 1072 std::string key(shorty); 1073 if (is_static) { 1074 key += "$"; // Must not be a shorty type character. 1075 } 1076 return key; 1077} 1078 1079const CompiledInvokeStub* Compiler::FindInvokeStub(bool is_static, const char* shorty) const { 1080 MutexLock mu(compiled_invoke_stubs_lock_); 1081 const std::string key(MakeInvokeStubKey(is_static, shorty)); 1082 InvokeStubTable::const_iterator it = compiled_invoke_stubs_.find(key); 1083 if (it == compiled_invoke_stubs_.end()) { 1084 return NULL; 1085 } else { 1086 DCHECK(it->second != NULL); 1087 return it->second; 1088 } 1089} 1090 1091void Compiler::InsertInvokeStub(bool is_static, const char* shorty, 1092 const CompiledInvokeStub* compiled_invoke_stub) { 1093 MutexLock mu(compiled_invoke_stubs_lock_); 1094 std::string key(MakeInvokeStubKey(is_static, shorty)); 1095 compiled_invoke_stubs_[key] = compiled_invoke_stub; 1096} 1097 1098CompiledClass* Compiler::GetCompiledClass(ClassReference ref) const { 1099 MutexLock mu(compiled_classes_lock_); 1100 ClassTable::const_iterator it = compiled_classes_.find(ref); 1101 if (it == compiled_classes_.end()) { 1102 return NULL; 1103 } 1104 CHECK(it->second != NULL); 1105 return it->second; 1106} 1107 1108CompiledMethod* Compiler::GetCompiledMethod(MethodReference ref) const { 1109 MutexLock mu(compiled_methods_lock_); 1110 MethodTable::const_iterator it = compiled_methods_.find(ref); 1111 if (it == compiled_methods_.end()) { 1112 return NULL; 1113 } 1114 CHECK(it->second != NULL); 1115 return it->second; 1116} 1117 1118void Compiler::SetGcMaps(const ClassLoader* class_loader, const std::vector<const DexFile*>& dex_files) { 1119 for (size_t i = 0; i != dex_files.size(); ++i) { 1120 const DexFile* dex_file = dex_files[i]; 1121 CHECK(dex_file != NULL); 1122 SetGcMapsDexFile(class_loader, *dex_file); 1123 } 1124} 1125 1126void Compiler::SetGcMapsDexFile(const ClassLoader* class_loader, const DexFile& dex_file) { 1127 ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 1128 DexCache* dex_cache = class_linker->FindDexCache(dex_file); 1129 for (size_t class_def_index = 0; class_def_index < dex_file.NumClassDefs(); class_def_index++) { 1130 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index); 1131 const char* descriptor = dex_file.GetClassDescriptor(class_def); 1132 Class* klass = class_linker->FindClass(descriptor, class_loader); 1133 if (klass == NULL || !klass->IsVerified()) { 1134 Thread::Current()->ClearException(); 1135 continue; 1136 } 1137 const byte* class_data = dex_file.GetClassData(class_def); 1138 if (class_data == NULL) { 1139 // empty class such as a marker interface 1140 continue; 1141 } 1142 ClassDataItemIterator it(dex_file, class_data); 1143 while (it.HasNextStaticField()) { 1144 it.Next(); 1145 } 1146 while (it.HasNextInstanceField()) { 1147 it.Next(); 1148 } 1149 while (it.HasNextDirectMethod()) { 1150 Method* method = class_linker->ResolveMethod(dex_file, it.GetMemberIndex(), dex_cache, 1151 class_loader, true); 1152 SetGcMapsMethod(dex_file, method); 1153 it.Next(); 1154 } 1155 while (it.HasNextVirtualMethod()) { 1156 Method* method = class_linker->ResolveMethod(dex_file, it.GetMemberIndex(), dex_cache, 1157 class_loader, false); 1158 SetGcMapsMethod(dex_file, method); 1159 it.Next(); 1160 } 1161 } 1162} 1163 1164void Compiler::SetGcMapsMethod(const DexFile& dex_file, Method* method) { 1165 if (method == NULL) { 1166 Thread::Current()->ClearException(); 1167 return; 1168 } 1169 uint16_t method_idx = method->GetDexMethodIndex(); 1170 MethodReference ref(&dex_file, method_idx); 1171 CompiledMethod* compiled_method = GetCompiledMethod(ref); 1172 if (compiled_method == NULL) { 1173 return; 1174 } 1175 const std::vector<uint8_t>* gc_map = verifier::DexVerifier::GetGcMap(ref); 1176 if (gc_map == NULL) { 1177 return; 1178 } 1179 compiled_method->SetGcMap(*gc_map); 1180} 1181 1182#if defined(ART_USE_LLVM_COMPILER) 1183void Compiler::SetElfFileName(std::string const& filename) { 1184 compiler_llvm_->SetElfFileName(filename); 1185} 1186 1187void Compiler::SetBitcodeFileName(std::string const& filename) { 1188 compiler_llvm_->SetBitcodeFileName(filename); 1189} 1190#endif 1191 1192} // namespace art 1193