summaryrefslogtreecommitdiff
path: root/runtime/verifier/class_verifier.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/verifier/class_verifier.cc')
-rw-r--r--runtime/verifier/class_verifier.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/runtime/verifier/class_verifier.cc b/runtime/verifier/class_verifier.cc
index 1c8142b642..6a189a29c7 100644
--- a/runtime/verifier/class_verifier.cc
+++ b/runtime/verifier/class_verifier.cc
@@ -54,8 +54,13 @@ static bool gPrintedDxMonitorText = false;
static void UpdateMethodFlags(uint32_t method_index,
Handle<mirror::Class> klass,
Handle<mirror::DexCache> dex_cache,
+ CompilerCallbacks* callbacks,
int error_types)
REQUIRES_SHARED(Locks::mutator_lock_) {
+ if (callbacks != nullptr && !CanCompilerHandleVerificationFailure(error_types)) {
+ MethodReference ref(dex_cache->GetDexFile(), method_index);
+ callbacks->AddUncompilableMethod(ref);
+ }
if (klass == nullptr) {
DCHECK(Runtime::Current()->IsAotCompiler());
// Flags will be set at runtime.
@@ -130,7 +135,6 @@ FailureKind ClassVerifier::VerifyClass(Thread* self,
class_def,
method.GetCodeItem(),
method.GetAccessFlags(),
- callbacks,
allow_soft_failures,
log_level,
/*need_precise_constants=*/ false,
@@ -150,7 +154,7 @@ FailureKind ClassVerifier::VerifyClass(Thread* self,
*error += " ";
*error += hard_failure_msg;
} else if (result.kind != FailureKind::kNoFailure) {
- UpdateMethodFlags(method.GetIndex(), klass, dex_cache, result.types);
+ UpdateMethodFlags(method.GetIndex(), klass, dex_cache, callbacks, result.types);
if ((result.types & VerifyError::VERIFY_ERROR_LOCKING) != 0) {
// Print a warning about expected slow-down.
// Use a string temporary to print one contiguous warning.
@@ -174,6 +178,12 @@ FailureKind ClassVerifier::VerifyClass(Thread* self,
<< ", class: " << PrettyDescriptor(dex_file->GetClassDescriptor(class_def));
GetMetrics()->ClassVerificationCount()->AddOne();
+
+ if (failure_data.kind == verifier::FailureKind::kHardFailure && callbacks != nullptr) {
+ ClassReference ref(dex_file, dex_file->GetIndexForClassDef(class_def));
+ callbacks->ClassRejected(ref);
+ }
+
return failure_data.kind;
}