diff options
| author | 2018-01-14 00:22:04 +0000 | |
|---|---|---|
| committer | 2018-01-14 00:29:51 +0000 | |
| commit | c971f6e06a43e70a2d86cb4b3ad0e13a9ae9a06c (patch) | |
| tree | 9fa6be931e7bc8d0f47b0eb2d91a683ffcf1c3f1 /runtime/class_linker.cc | |
| parent | 94730ef9ca432b5ede81e928cffc4006911aa650 (diff) | |
Revert "Ensure that methods requiring interpreter entrypoint always have it."
This reverts commit 94730ef9ca432b5ede81e928cffc4006911aa650.
Debug tests failing.
Ran: test/run-test --always-clean --prebuild --compact-dex-level none --optimizing --no-relocate --runtime-option -Xcheck:jni --64 --build-with-javac-dx 067-preemptive-unpark
Bug: 62821960
Change-Id: Ia4fb7b7b3a60879662dea50ce32b1cfb5e0a3eff
Diffstat (limited to 'runtime/class_linker.cc')
| -rw-r--r-- | runtime/class_linker.cc | 54 |
1 files changed, 20 insertions, 34 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index c487808161..877654247c 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -1296,32 +1296,22 @@ void AppImageClassLoadersAndDexCachesHelper::Update( } for (ArtMethod& m : klass->GetDirectMethods(kRuntimePointerSize)) { const void* code = m.GetEntryPointFromQuickCompiledCode(); - if (!m.IsProxyMethod() && - !m.IsNative() && - !class_linker->IsQuickResolutionStub(code) && + const void* oat_code = m.IsInvokable() ? class_linker->GetQuickOatCodeFor(&m) : code; + if (!class_linker->IsQuickResolutionStub(code) && + !class_linker->IsQuickGenericJniStub(code) && !class_linker->IsQuickToInterpreterBridge(code) && - m.IsInvokable()) { - // Since this is just a sanity check it's okay to get the oat code here regardless - // of whether it's usable. - const void* oat_code = m.GetOatMethodQuickCode(class_linker->GetImagePointerSize()); - if (oat_code != nullptr) { - DCHECK_EQ(code, oat_code) << m.PrettyMethod(); - } + !m.IsNative()) { + DCHECK_EQ(code, oat_code) << m.PrettyMethod(); } } for (ArtMethod& m : klass->GetVirtualMethods(kRuntimePointerSize)) { const void* code = m.GetEntryPointFromQuickCompiledCode(); - if (!m.IsProxyMethod() && - !m.IsNative() && - !class_linker->IsQuickResolutionStub(code) && + const void* oat_code = m.IsInvokable() ? class_linker->GetQuickOatCodeFor(&m) : code; + if (!class_linker->IsQuickResolutionStub(code) && + !class_linker->IsQuickGenericJniStub(code) && !class_linker->IsQuickToInterpreterBridge(code) && - m.IsInvokable()) { - // Since this is just a sanity check it's okay to get the oat code here regardless - // of whether it's usable. - const void* oat_code = m.GetOatMethodQuickCode(class_linker->GetImagePointerSize()); - if (oat_code != nullptr) { - DCHECK_EQ(code, oat_code) << m.PrettyMethod(); - } + !m.IsNative()) { + DCHECK_EQ(code, oat_code) << m.PrettyMethod(); } } } @@ -2909,25 +2899,21 @@ uint32_t ClassLinker::SizeOfClassWithoutEmbeddedTables(const DexFile& dex_file, image_pointer_size_); } -const void* ClassLinker::GetQuickEntrypointFor(ArtMethod* method) { +// Special case to get oat code without overwriting a trampoline. +const void* ClassLinker::GetQuickOatCodeFor(ArtMethod* method) { CHECK(method->IsInvokable()) << method->PrettyMethod(); if (method->IsProxyMethod()) { return GetQuickProxyInvokeHandler(); } - const void* oat_code = method->GetOatMethodQuickCode(GetImagePointerSize()); - if (oat_code == nullptr) { - // We need either the generic jni or interpreter bridge. - if (method->IsNative()) { - return GetQuickGenericJniStub(); - } else { - return GetQuickToInterpreterBridge(); - } - } else if (ClassLinker::ShouldUseInterpreterEntrypoint(method, oat_code)) { - // We have oat code but we cannot use it for some reason. - return GetQuickToInterpreterBridge(); - } else { - return oat_code; + auto* code = method->GetOatMethodQuickCode(GetImagePointerSize()); + if (code != nullptr) { + return code; + } + if (method->IsNative()) { + // No code and native? Use generic trampoline. + return GetQuickGenericJniStub(); } + return GetQuickToInterpreterBridge(); } bool ClassLinker::ShouldUseInterpreterEntrypoint(ArtMethod* method, const void* quick_code) { |