Make failures caused by unimplemented entry points much clearer.
Before:
F 32344 32344 runtime_linux.cc:183] *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
F 32344 32344 runtime_linux.cc:183] Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) fault addr (nil)
F 32344 32344 libartd.so:-1] #00 ??+0x3adc15 [0x5592ac15]
F 32344 32344 libartd.so:-1] #01 ??+0x3ae5b9 [0x5592b5b9]
F 32344 32344 ??:-1] #02 [0x55573410]
F 32344 32344 libartd.so:-1] #03 ??+0x24cb86 [0x557c9b86]
F 32344 32344 libartd.so:-1] #04 ??+0x24d0c3 [0x557ca0c3]
F 32344 32344 libartd.so:-1] #05 art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, char*)+0x48 [0x557d76e8]
F 32344 32344 libartd.so:-1] #06 art::CheckJNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, char*)+0xce [0x556e5cee]
F 32344 32344 oatexecd:-1] #07 _JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+0x29 [0x8085739]
F 32344 32344 oatexecd:-1] #08 ?? [0x8073c35]
F 32344 32344 oatexecd:-1] #09 ?? [0x8073fd7]
F 32344 32344 libc.so.6:-1] #10 __libc_start_main()+0xe6 [0x55afcbd6]
F 32344 32344 oatexecd:-1] #11 ?? [0x8071fc1]
After:
F 5527 5527 thread.cc:81] void art::UnimplementedEntryPoint() unimplemented
F 5527 5527 runtime.cc:160] Runtime aborting...
F 5527 5527 runtime.cc:160] "main" prio=5 tid=1 Runnable
F 5527 5527 runtime.cc:160] | group="main" sCount=0 dsCount=0 obj=0x6121e928 self=0x8c0c618
F 5527 5527 runtime.cc:160] | sysTid=5527 nice=0 sched=0/0 cgrp=default handle=1439185696
F 5527 5527 runtime.cc:160] | schedstat=( 66360090 54151 15 ) utm=6 stm=0 core=20 HZ=100
F 5527 5527 runtime.cc:160] at java.lang.Math.ceil(Native method)
F 5527 5527 runtime.cc:160] at java.lang.RealToString.longDigitGenerator(RealToString.java:269)
F 5527 5527 runtime.cc:160] at java.lang.RealToString.convertDouble(RealToString.java:111)
F 5527 5527 runtime.cc:160] at java.lang.RealToString.doubleToString(RealToString.java:59)
F 5527 5527 runtime.cc:160] at java.lang.Double.toString(Double.java:317)
F 5527 5527 runtime.cc:160] at java.lang.String.valueOf(String.java:1676)
F 5527 5527 runtime.cc:160] at java.io.PrintStream.println(PrintStream.java:479)
F 5527 5527 runtime.cc:160] at ReflectionTest.testFieldReflection(ReflectionTest.java:40)
F 5527 5527 runtime.cc:160] at ReflectionTest.main(ReflectionTest.java:269)
F 5527 5527 runtime.cc:160]
F 5527 5527 libartd.so:-1] #00 ??+0x3adcb5 [0x5592acb5]
F 5527 5527 libartd.so:-1] #01 art::Runtime::Abort(char const*, int)+0x99 [0x558a1439]
F 5527 5527 libartd.so:-1] #02 art::LogMessage::~LogMessage()+0x3d0 [0x557dc060]
F 5527 5527 libartd.so:-1] #03 ??+0x33f644 [0x558bc644]
F 5527 5527 ??:-1] #04 [0x60735b9a]
F 5527 5527 libartd.so:-1] #05 ??+0x24cb86 [0x557c9b86]
F 5527 5527 libartd.so:-1] #06 ??+0x24d0c3 [0x557ca0c3]
F 5527 5527 libartd.so:-1] #07 art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, char*)+0x48 [0x557d76e8]
F 5527 5527 libartd.so:-1] #08 art::CheckJNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, char*)+0xce [0x556e5cee]
F 5527 5527 oatexecd:-1] #09 _JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+0x29 [0x8085739]
F 5527 5527 oatexecd:-1] #10 ?? [0x8073c35]
F 5527 5527 oatexecd:-1] #11 ?? [0x8073fd7]
F 5527 5527 libc.so.6:-1] #12 __libc_start_main()+0xe6 [0x55afcbd6]
F 5527 5527 oatexecd:-1] #13 ?? [0x8071fc1]
Change-Id: Id55f10f910ace94de3c985fabfd9a0fe15c3c8bf
diff --git a/src/oat/runtime/x86/oat_support_entrypoints_x86.cc b/src/oat/runtime/x86/oat_support_entrypoints_x86.cc
index 3fe7640..6720e3e 100644
--- a/src/oat/runtime/x86/oat_support_entrypoints_x86.cc
+++ b/src/oat/runtime/x86/oat_support_entrypoints_x86.cc
@@ -163,31 +163,31 @@
points->pCmpgFloat = CmpgFloat;
points->pCmplDouble = CmplDouble;
points->pCmplFloat = CmplFloat;
- points->pDadd = NULL;
- points->pDdiv = NULL;
- points->pDmul = NULL;
- points->pDsub = NULL;
- points->pF2d = NULL;
- points->pFmod = NULL;
- points->pI2d = NULL;
- points->pL2d = NULL;
- points->pD2f = NULL;
- points->pFadd = NULL;
- points->pFdiv = NULL;
- points->pFmodf = NULL;
- points->pFmul = NULL;
- points->pFsub = NULL;
- points->pI2f = NULL;
- points->pL2f = NULL;
- points->pD2iz = NULL;
- points->pF2iz = NULL;
+ //points->pDadd = NULL;
+ //points->pDdiv = NULL;
+ //points->pDmul = NULL;
+ //points->pDsub = NULL;
+ //points->pF2d = NULL;
+ //points->pFmod = NULL;
+ //points->pI2d = NULL;
+ //points->pL2d = NULL;
+ //points->pD2f = NULL;
+ //points->pFadd = NULL;
+ //points->pFdiv = NULL;
+ //points->pFmodf = NULL;
+ //points->pFmul = NULL;
+ //points->pFsub = NULL;
+ //points->pI2f = NULL;
+ //points->pL2f = NULL;
+ //points->pD2iz = NULL;
+ //points->pF2iz = NULL;
points->pIdiv = art_idiv_from_code;
points->pIdivmod = art_idivmod_from_code;
points->pD2l = D2L;
points->pF2l = F2L;
points->pLdiv = art_ldiv_from_code;
points->pLdivmod = art_ldivmod_from_code;
- points->pLmul = NULL;
+ //points->pLmul = NULL;
points->pShlLong = art_lshl_from_code;
points->pShrLong = art_lshr_from_code;
points->pUshrLong = art_lushr_from_code;
diff --git a/src/thread.cc b/src/thread.cc
index dc66319..fbf2390 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -77,10 +77,20 @@
card_table_ = Runtime::Current()->GetHeap()->GetCardTable()->GetBiasedBegin();
}
+static void UnimplementedEntryPoint() {
+ UNIMPLEMENTED(FATAL);
+}
+
void Thread::InitFunctionPointers() {
#if defined(ART_USE_LLVM_COMPILER)
memset(&entrypoints_, 0, sizeof(entrypoints_));
#else
+ // Insert a placeholder so we can easily tell if we call an unimplemented entry point.
+ uintptr_t* begin = reinterpret_cast<uintptr_t*>(&entrypoints_);
+ uintptr_t* end = reinterpret_cast<uintptr_t*>(reinterpret_cast<uint8_t*>(begin) + sizeof(entrypoints_));
+ for (uintptr_t* it = begin; it != end; ++it) {
+ *it = reinterpret_cast<uintptr_t>(UnimplementedEntryPoint);
+ }
InitEntryPoints(&entrypoints_);
#endif
}