summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hiroshi Yamauchi <yamauchi@google.com> 2014-02-28 17:18:37 -0800
committer Hiroshi Yamauchi <yamauchi@google.com> 2014-02-28 17:34:30 -0800
commit563b47cc142e477da244539b1d63070425e7fd78 (patch)
tree3da2bb5ccdcd16f7104211855d47ece3f1d24767
parente58d0203351d9740a8f74a140fdee342168e6552 (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.cc14
-rw-r--r--runtime/instrumentation.h4
-rw-r--r--runtime/interpreter/interpreter_common.cc5
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);