ART: Remove VERIFY_ERROR_UNRESOLVED_CATCH
Replace with a more generic SKIP_COMPILER, mark the Fail() calls as not
throwing, and replace the standard occurrence with NO_CLASS.
Bug: 121245951
Test: m test-art-host
Test: art/test/testrunner/testrunner.py -b --host -t 800 --jit-on-first-use
Change-Id: I9f601702f27d815840538c04b332a52bf1c58c54
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index 02b1cbd..8d9176a 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -3829,12 +3829,13 @@
// We need to post a failure. The compiler currently does not handle unreachable
// code correctly.
- Fail(VERIFY_ERROR_UNRESOLVED_CATCH) << "Unresolved catch handler, fail for compiler";
+ Fail(VERIFY_ERROR_SKIP_COMPILER, /*pending_exc=*/ false)
+ << "Unresolved catch handler, fail for compiler";
return std::make_pair(false, unresolved);
}
// Soft-fail, but do not handle this with a synthetic throw.
- Fail(VERIFY_ERROR_UNRESOLVED_CATCH) << "Unresolved catch handler";
+ Fail(VERIFY_ERROR_NO_CLASS, /*pending_exc=*/ false) << "Unresolved catch handler";
if (common_super != nullptr) {
unresolved = &unresolved->Merge(*common_super, ®_types_, this);
}
@@ -5574,7 +5575,7 @@
break;
}
- case VERIFY_ERROR_UNRESOLVED_CATCH:
+ case VERIFY_ERROR_SKIP_COMPILER:
// Nothing to do, just remember the failure type.
break;
}
diff --git a/runtime/verifier/verifier_enums.h b/runtime/verifier/verifier_enums.h
index 0e96882..b445e94 100644
--- a/runtime/verifier/verifier_enums.h
+++ b/runtime/verifier/verifier_enums.h
@@ -94,9 +94,11 @@
// (sets a soft fail at compile time).
VERIFY_ERROR_LOCKING = 1 << 11, // Could not guarantee balanced locking. This should be
// punted to the interpreter with access checks.
- VERIFY_ERROR_UNRESOLVED_CATCH = 1 << 12, // Error code necessary to have a synthetic soft fail
- // that is not an exception, to let the compiler know
- // that there is (unreachable) unverified code.
+ VERIFY_ERROR_SKIP_COMPILER = 1u << 31, // Flag to note that the failure should preclude
+ // optimization. Meant as a signal from the verifier
+ // to the compiler that there is unreachable unverified
+ // code. May be removed once the compiler handles
+ // unreachable code correctly.
};
std::ostream& operator<<(std::ostream& os, const VerifyError& rhs);