diff options
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r-- | compiler/driver/compiler_driver.cc | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 98abc18118..d1291fa719 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -358,6 +358,7 @@ CompilerDriver::CompilerDriver(const CompilerOptions* compiler_options, image_(image), image_classes_(image_classes), classes_to_compile_(compiled_classes), + had_hard_verifier_failure_(false), thread_count_(thread_count), stats_(new AOTCompilationStats), dedupe_enabled_(true), @@ -616,6 +617,11 @@ void CompilerDriver::PreCompile(jobject class_loader, const std::vector<const De Verify(class_loader, dex_files, thread_pool, timings); VLOG(compiler) << "Verify: " << GetMemoryUsageString(false); + if (had_hard_verifier_failure_ && GetCompilerOptions().AbortOnHardVerifierFailure()) { + LOG(FATAL) << "Had a hard failure verifying all classes, and was asked to abort in such " + << "situations. Please check the log."; + } + InitializeClasses(class_loader, dex_files, thread_pool, timings); VLOG(compiler) << "InitializeClasses: " << GetMemoryUsageString(false); @@ -871,6 +877,11 @@ class ClinitImageUpdate { const char* name = klass->GetDescriptor(&temp); if (data->image_class_descriptors_->find(name) != data->image_class_descriptors_->end()) { data->image_classes_.push_back(klass); + } else { + // Check whether it is initialized and has a clinit. They must be kept, too. + if (klass->IsInitialized() && klass->FindClassInitializer() != nullptr) { + data->image_classes_.push_back(klass); + } } return true; @@ -1834,6 +1845,7 @@ static void VerifyClass(const ParallelCompilationManager* manager, size_t class_ verifier::MethodVerifier::kHardFailure) { LOG(ERROR) << "Verification failed on class " << PrettyDescriptor(descriptor) << " because: " << error_msg; + manager->GetCompiler()->SetHadHardVerifierFailure(); } } else if (!SkipClass(jclass_loader, dex_file, klass.Get())) { CHECK(klass->IsResolved()) << PrettyClass(klass.Get()); @@ -1843,6 +1855,7 @@ static void VerifyClass(const ParallelCompilationManager* manager, size_t class_ // ClassLinker::VerifyClass throws, which isn't useful in the compiler. CHECK(soa.Self()->IsExceptionPending()); soa.Self()->ClearException(); + manager->GetCompiler()->SetHadHardVerifierFailure(); } CHECK(klass->IsCompileTimeVerified() || klass->IsErroneous()) @@ -2171,8 +2184,10 @@ void CompilerDriver::CompileMethod(Thread* self, const DexFile::CodeItem* code_i InstructionSetHasGenericJniStub(instruction_set_)) { // Leaving this empty will trigger the generic JNI version } else { - compiled_method = compiler_->JniCompile(access_flags, method_idx, dex_file); - CHECK(compiled_method != nullptr); + if (instruction_set_ != kMips64) { // Use generic JNI for Mips64 (temporarily). + compiled_method = compiler_->JniCompile(access_flags, method_idx, dex_file); + CHECK(compiled_method != nullptr); + } } } else if ((access_flags & kAccAbstract) != 0) { // Abstract methods don't have code. |