Disable virtual call sharpening.
A regression in voice search was seen. Disable for now. Add a few
assertions to aid future diagnostics.
Change-Id: I635b1126b3e45293489b6b7ad54d838773ae7030
diff --git a/src/compiler.cc b/src/compiler.cc
index 2ba89d4..332ea25 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -597,7 +597,9 @@
referrer_class->CanAccessMember(methods_class,
resolved_method->GetAccessFlags())) {
vtable_idx = resolved_method->GetMethodIndex();
- if (type == kVirtual && (resolved_method->IsFinal() || methods_class->IsFinal())) {
+ const bool kEnableSharpening = false;
+ if (kEnableSharpening && type == kVirtual &&
+ (resolved_method->IsFinal() || methods_class->IsFinal())) {
stats_->ResolvedMethod(kVirtual);
// Sharpen a virtual call into a direct call. The method_idx is into referrer's
// dex cache, check that this resolved method is where we expect it.
diff --git a/src/thread.cc b/src/thread.cc
index 2f3ce6a..48b8645 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -1174,7 +1174,8 @@
// TODO: remove this.
uintptr_t DemanglePc(uintptr_t pc) {
// Revert mangling for the case where we need the PC to return to the upcall
- return pc + 2;
+ if (pc > 0) { pc += 2; }
+ return pc;
}
void Thread::PushSirt(StackIndirectReferenceTable* sirt) {
@@ -1532,9 +1533,11 @@
}
}
SetException(exception);
+ CHECK_NE(catch_native_pc, 0u);
long_jump_context->SetSP(reinterpret_cast<uintptr_t>(catch_finder.handler_frame_.GetSP()));
- long_jump_context->SetPC(catch_finder.handler_pc_);
+ long_jump_context->SetPC(catch_native_pc);
long_jump_context->DoLongJump();
+ LOG(FATAL) << "UNREACHABLE";
}
Context* Thread::GetLongJumpContext() {