Allow late lookup for @FastNative methods.
Avoid failing a runtime state assertion.
Test: Enable tests in 178-app-image-native-method
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Test: aosp_taimen-userdebug boots.
Test: run-gtests.sh
Test: testrunner.py --target --optimizing
Bug: 112189621
Change-Id: I3eb5c9fd239743732866e8ea0863a84bf85f7b20
diff --git a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
index 1cc4d24..3c65500 100644
--- a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
+++ b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
@@ -2300,37 +2300,6 @@
}
}
-extern "C" const void* artFindNativeMethod(Thread* self);
-
-static uint64_t artQuickGenericJniEndJNIRef(Thread* self,
- uint32_t cookie,
- bool fast_native ATTRIBUTE_UNUSED,
- jobject l,
- jobject lock) {
- // TODO: add entrypoints for @FastNative returning objects.
- if (lock != nullptr) {
- return reinterpret_cast<uint64_t>(JniMethodEndWithReferenceSynchronized(l, cookie, lock, self));
- } else {
- return reinterpret_cast<uint64_t>(JniMethodEndWithReference(l, cookie, self));
- }
-}
-
-static void artQuickGenericJniEndJNINonRef(Thread* self,
- uint32_t cookie,
- bool fast_native,
- jobject lock) {
- if (lock != nullptr) {
- JniMethodEndSynchronized(cookie, lock, self);
- // Ignore "fast_native" here because synchronized functions aren't very fast.
- } else {
- if (UNLIKELY(fast_native)) {
- JniMethodFastEnd(cookie, self);
- } else {
- JniMethodEnd(cookie, self);
- }
- }
-}
-
/*
* Initializes an alloca region assumed to be directly below sp for a native call:
* Create a HandleScope and call stack and fill a mini stack with values to be pushed to registers.
@@ -2424,40 +2393,11 @@
}
// Retrieve the stored native code.
+ // Note that it may point to the lookup stub or trampoline.
+ // FIXME: This is broken for @CriticalNative as the art_jni_dlsym_lookup_stub
+ // does not handle that case. Calls from compiled stubs are also broken.
void const* nativeCode = called->GetEntryPointFromJni();
- // There are two cases for the content of nativeCode:
- // 1) Pointer to the native function.
- // 2) Pointer to the trampoline for native code binding.
- // In the second case, we need to execute the binding and continue with the actual native function
- // pointer.
- DCHECK(nativeCode != nullptr);
- if (runtime->GetClassLinker()->IsJniDlsymLookupStub(nativeCode)) {
- // FIXME: This is broken for @FastNative and @CriticalNative as we're still runnable.
- // Calls from compiled stubs are also broken.
- // TODO: We could just let the GenericJNI stub call the ArtFindNativeMethod()
- // rather than calling it explicitly here.
- nativeCode = artFindNativeMethod(self);
-
- if (nativeCode == nullptr) {
- DCHECK(self->IsExceptionPending()); // There should be an exception pending now.
-
- // @CriticalNative calls do not need to call back into JniMethodEnd.
- if (LIKELY(!critical_native)) {
- // End JNI, as the assembly will move to deliver the exception.
- jobject lock = called->IsSynchronized() ? visitor.GetFirstHandleScopeJObject() : nullptr;
- if (shorty[0] == 'L') {
- artQuickGenericJniEndJNIRef(self, cookie, fast_native, nullptr, lock);
- } else {
- artQuickGenericJniEndJNINonRef(self, cookie, fast_native, lock);
- }
- }
-
- return GetTwoWordFailureValue();
- }
- // Note that the native code pointer will be automatically set by artFindNativeMethod().
- }
-
#if defined(__mips__) && !defined(__LP64__)
// On MIPS32 if the first two arguments are floating-point, we need to know their types
// so that art_quick_generic_jni_trampoline can correctly extract them from the stack