Remove interpreter entrypoint in ArtMethod.
Saves 4/8 bytes for each ArtMethod.
Change-Id: I110ecdddf8516b0759a31fa157609643e6d60b15
diff --git a/runtime/interpreter/interpreter_common.cc b/runtime/interpreter/interpreter_common.cc
index fa103b1..0980ea1 100644
--- a/runtime/interpreter/interpreter_common.cc
+++ b/runtime/interpreter/interpreter_common.cc
@@ -19,6 +19,7 @@
#include <cmath>
#include "debugger.h"
+#include "entrypoints/runtime_asm_entrypoints.h"
#include "mirror/array-inl.h"
#include "unstarted_runtime.h"
#include "verifier/method_verifier.h"
@@ -490,6 +491,23 @@
uint32_t arg[Instruction::kMaxVarArgRegs],
uint32_t vregC) ALWAYS_INLINE;
+SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
+static inline bool NeedsInterpreter(Thread* self, ShadowFrame* new_shadow_frame) ALWAYS_INLINE;
+
+static inline bool NeedsInterpreter(Thread* self, ShadowFrame* new_shadow_frame) {
+ ArtMethod* target = new_shadow_frame->GetMethod();
+ if (UNLIKELY(target->IsNative() || target->IsProxyMethod())) {
+ return false;
+ }
+ Runtime* runtime = Runtime::Current();
+ ClassLinker* class_linker = runtime->GetClassLinker();
+ return runtime->GetInstrumentation()->IsForcedInterpretOnly() ||
+ // Doing this check avoids doing compiled/interpreter transitions.
+ class_linker->IsQuickToInterpreterBridge(target->GetEntryPointFromQuickCompiledCode()) ||
+ // Force the use of interpreter when it is required by the debugger.
+ Dbg::IsForcedInterpreterNeededForCalling(self, target);
+}
+
template<bool is_range, bool do_assignability_check>
static inline bool DoCallCommon(ArtMethod* called_method,
Thread* self,
@@ -660,28 +678,11 @@
// Do the call now.
if (LIKELY(Runtime::Current()->IsStarted())) {
- if (kIsDebugBuild && new_shadow_frame->GetMethod()->GetEntryPointFromInterpreter() == nullptr) {
- LOG(FATAL) << "Attempt to invoke non-executable method: "
- << PrettyMethod(new_shadow_frame->GetMethod());
- UNREACHABLE();
- }
- if (kIsDebugBuild && Runtime::Current()->GetInstrumentation()->IsForcedInterpretOnly() &&
- !new_shadow_frame->GetMethod()->IsNative() &&
- !new_shadow_frame->GetMethod()->IsProxyMethod() &&
- new_shadow_frame->GetMethod()->GetEntryPointFromInterpreter()
- == artInterpreterToCompiledCodeBridge) {
- LOG(FATAL) << "Attempt to call compiled code when -Xint: "
- << PrettyMethod(new_shadow_frame->GetMethod());
- UNREACHABLE();
- }
- // Force the use of interpreter when it is required by the debugger.
- EntryPointFromInterpreter* entry;
- if (UNLIKELY(Dbg::IsForcedInterpreterNeededForCalling(self, new_shadow_frame->GetMethod()))) {
- entry = &art::artInterpreterToInterpreterBridge;
+ if (NeedsInterpreter(self, new_shadow_frame)) {
+ artInterpreterToInterpreterBridge(self, code_item, new_shadow_frame, result);
} else {
- entry = new_shadow_frame->GetMethod()->GetEntryPointFromInterpreter();
+ artInterpreterToCompiledCodeBridge(self, code_item, new_shadow_frame, result);
}
- entry(self, code_item, new_shadow_frame, result);
} else {
UnstartedRuntime::Invoke(self, code_item, new_shadow_frame, result, first_dest_reg);
}