diff options
| author | 2014-02-28 17:18:37 -0800 | |
|---|---|---|
| committer | 2014-02-28 17:34:30 -0800 | |
| commit | 563b47cc142e477da244539b1d63070425e7fd78 (patch) | |
| tree | 3da2bb5ccdcd16f7104211855d47ece3f1d24767 | |
| parent | e58d0203351d9740a8f74a140fdee342168e6552 (diff) | |
Fix the bug that some compiled code was invoked with -Xint.
Some compiled code (probably static methods) is still being invoked
with -Xint. Added an assert to detect this case.
Bug: 13250375
Change-Id: Iecfe8ef40c6c326962593db78e6e1d9f1c93842e
| -rw-r--r-- | runtime/instrumentation.cc | 14 | ||||
| -rw-r--r-- | runtime/instrumentation.h | 4 | ||||
| -rw-r--r-- | runtime/interpreter/interpreter_common.cc | 5 |
3 files changed, 21 insertions, 2 deletions
diff --git a/runtime/instrumentation.cc b/runtime/instrumentation.cc index 9d051694b9..01ad46da8b 100644 --- a/runtime/instrumentation.cc +++ b/runtime/instrumentation.cc @@ -80,9 +80,19 @@ static void UpdateEntrypoints(mirror::ArtMethod* method, const void* quick_code, method->ClearIsPortableCompiled(); } if (!method->IsResolutionMethod()) { - if (quick_code == GetQuickToInterpreterBridge()) { - DCHECK(portable_code == GetPortableToInterpreterBridge()); + if (quick_code == GetQuickToInterpreterBridge() || + (quick_code == GetQuickResolutionTrampoline(Runtime::Current()->GetClassLinker()) && + Runtime::Current()->GetInstrumentation()->IsForcedInterpretOnly() + && !method->IsNative() && !method->IsProxyMethod())) { + if (kIsDebugBuild) { + if (quick_code == GetQuickToInterpreterBridge()) { + DCHECK(portable_code == GetPortableToInterpreterBridge()); + } else if (quick_code == GetQuickResolutionTrampoline(Runtime::Current()->GetClassLinker())) { + DCHECK(portable_code == GetPortableResolutionTrampoline(Runtime::Current()->GetClassLinker())); + } + } DCHECK(!method->IsNative()) << PrettyMethod(method); + DCHECK(!method->IsProxyMethod()) << PrettyMethod(method); method->SetEntryPointFromInterpreter(art::interpreter::artInterpreterToInterpreterBridge); } else { method->SetEntryPointFromInterpreter(art::artInterpreterToCompiledCodeBridge); diff --git a/runtime/instrumentation.h b/runtime/instrumentation.h index 1ce72bd6a6..017573a756 100644 --- a/runtime/instrumentation.h +++ b/runtime/instrumentation.h @@ -192,6 +192,10 @@ class Instrumentation { return interpret_only_; } + bool IsForcedInterpretOnly() const { + return forced_interpret_only_; + } + bool ShouldPortableCodeDeoptimize() const { return instrumentation_stubs_installed_; } diff --git a/runtime/interpreter/interpreter_common.cc b/runtime/interpreter/interpreter_common.cc index f76d50c873..e8cea9d833 100644 --- a/runtime/interpreter/interpreter_common.cc +++ b/runtime/interpreter/interpreter_common.cc @@ -155,6 +155,11 @@ bool DoCall(ArtMethod* method, Thread* self, ShadowFrame& shadow_frame, if (kIsDebugBuild && method->GetEntryPointFromInterpreter() == nullptr) { LOG(FATAL) << "Attempt to invoke non-executable method: " << PrettyMethod(method); } + if (kIsDebugBuild && Runtime::Current()->GetInstrumentation()->IsForcedInterpretOnly() && + !method->IsNative() && !method->IsProxyMethod() && + method->GetEntryPointFromInterpreter() == artInterpreterToCompiledCodeBridge) { + LOG(FATAL) << "Attempt to call compiled code when -Xint: " << PrettyMethod(method); + } (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); } else { UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, first_dest_reg); |