If run with -Xint, it works. I have created simplified FP test by remove all non-related code from Whetstone test code. The test code is here: https://gist.github.com/yongzhy/d65c26d39fe5d549d1b406c7c84eacd4
I am not sure if the test code can help or not. The behaviour is weird : - If I print both itime and q, program will run OK - inside condition block if(q<1.0f), if I use exit code 2,3,4,5, problem appears, however, if I use exit code >=6, program run OK. I always get exit code 5, the line q = (double)itime is wrong? public static double getTime() { double q; long itime; itime = System.currentTimeMillis(); if(itime<1000000) { System.exit(1); } //System.out.printf("time long value %d\n", itime); q = (double) itime; if(q < 1.0f) { System.exit(5); // I always get exit code 5 } //System.out.printf("time float value %f\n", q); return q / 1000.0; } On Wed, Mar 1, 2017 at 5:31 PM, David Holmes <david.hol...@oracle.com> wrote: > On 1/03/2017 6:45 PM, Zhu Yong wrote: > >> OK, for the Whetstone Benchmark, I added debug printing and found it's >> due to function getTime(), it only get good value on 1st call, all >> following calls get 0s. >> Debug printing of itime value is correct. So reason should be the return >> division line. Could it because toolchain's floating point operation??? >> But why server VM Ok? >> > > Server and client implement FP logic differently, and particularly as this > is soft-fp, they may well not be in sync. Does -Xint work? > > Can you isolate to a simple FP test? > > David > > public static double getTime() >> { >> double q; >> long itime; >> itime = System.currentTimeMillis(); >> q = (double) itime; >> return q / 1000.0; >> } >> >> On Wed, Mar 1, 2017 at 3:14 PM, David Holmes <david.hol...@oracle.com >> <mailto:david.hol...@oracle.com>> wrote: >> >> On 1/03/2017 4:26 PM, Zhu Yong wrote: >> >> We use armv7-marvell-linux-gnueabi-softfp toolchain >> >> gcc version 4.6.4 (Marvell GCC release 20150204-c4af733b 64K >> MAXPAGESIZE >> ALIGN CVE-2015-0235) >> >> Is this toolchain too old? I am asking because I saw other strange >> issues as well: >> >> >> We last used gcc 4.7.2. I can't really say if 4.6.4 is "too old". >> >> I have successfully build server, client and minimal VM, when I >> run >> Dhrystone benchmark file (the same jar file from >> http://www.okayan.jp/DhrystoneApplet/ >> <http://www.okayan.jp/DhrystoneApplet/>), the performance from >> server VM >> is much better than client and minimal VM. >> (minimal: 1629852, client: 1615508, server: 2338871 ) >> >> >> That's expected. The server VM is high performance. >> >> And when run Whetstone Benchmark >> from http://www.roylongbottom.org.uk/online/whetjava2.html >> <http://www.roylongbottom.org.uk/online/whetjava2.html>, server >> VM >> finished with good result, client and minimal VM not able to >> finish >> (program stuck there forever after print 1st line of output). >> >> >> That needs investigating. You need to try and generate a stackdump >> to see where things are stuck. >> >> David >> >> >> On Wed, Mar 1, 2017 at 1:56 PM, David Holmes >> <david.hol...@oracle.com <mailto:david.hol...@oracle.com> >> <mailto:david.hol...@oracle.com >> <mailto:david.hol...@oracle.com>>> wrote: >> >> On 1/03/2017 3:39 PM, Zhu Yong wrote: >> >> Thank you for the information, I managed to make minimal >> build >> pass now. >> >> Initially I though JVM_EXCLUDE_FILES need to add >> additional 3 >> generated >> files (they appeared >> in _BUILD_LIBJVM_objectfilenames.txt) : >> bytecodeInterpreterWithChecks.cpp jvmtiEnter.cpp >> jvmtiEnterTrace.cpp >> But build still fail with same error message. >> >> Finally I figured out it's due to those 8 doit() functions >> implementation in jvmtiEnvBase.hpp file. After move all >> those 8 >> doit() >> implementations to jvmtiEnvBase.cpp, build of minimal VM >> passed >> without >> any issue. >> >> >> That seems to be a compiler issue. jvmtiEnvBase.hpp is >> unconditionally included in a couple of places because we >> have to >> have enough of the JVMTI code to say JVMTI is not available. >> Those >> doit() implementations, though arguably could be conditional >> on >> INCLUDE_JVMTI, are not referenced by any called code and so >> should >> not linked in. But in your case it seems they are. >> >> What toolchain are you using? >> >> David >> ----- >> >> Changes appended >> ============= >> >> --- >> .../src/share/vm/prims/jvmtiEnvBase.cpp | 74 >> ++++++++++++++++++++++ >> .../src/share/vm/prims/jvmtiEnvBase.hpp | 68 >> +++----------------- >> 2 files changed, 82 insertions(+), 60 deletions(-) >> mode change 100644 => 100755 >> hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.cpp >> mode change 100644 => 100755 >> hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.hpp >> >> diff --git >> a/hotspot-9211c2e89c1c/src/sha >> re/vm/prims/jvmtiEnvBase.cpp >> b/hotspot-9211c2e89c1c/src/sha >> re/vm/prims/jvmtiEnvBase.cpp >> old mode 100644 >> new mode 100755 >> index dd241a0..e5832ba >> --- >> a/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.cpp >> +++ >> b/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.cpp >> @@ -1283,6 +1283,80 @@ >> VM_GetMultipleStackTraces::allocate_and_fill_stacks(jint >> thread_count) { >> "the last copied frame info must be the last >> record"); >> } >> >> +void >> +VM_UpdateForPopTopFrame::doit() { >> + JavaThread* jt = _state->get_thread(); >> + if (Threads::includes(jt) && !jt->is_exiting() && >> jt->threadObj() != >> NULL) { >> + _state->update_for_pop_top_frame(); >> + } else { >> + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> + } >> +} >> + >> +void >> +VM_SetFramePop::doit() { >> + JavaThread* jt = _state->get_thread(); >> + if (Threads::includes(jt) && !jt->is_exiting() && >> jt->threadObj() != >> NULL) { >> + int frame_number = _state->count_frames() - _depth; >> + >> >> _state->env_thread_state((JvmtiEnvBase*)_env)->set_frame_ >> pop(frame_number); >> + } else { >> + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> + } >> +} >> + >> +void >> +VM_GetOwnedMonitorInfo::doit() { >> + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> + if (Threads::includes(_java_thread) && >> !_java_thread->is_exiting() >> + && >> _java_thread->threadObj() != >> NULL) { >> + _result = ((JvmtiEnvBase >> *)_env)->get_owned_monitors(_calling_thread, >> _java_thread, >> + >> _owned_monitors_list); >> + } >> +} >> + >> +void >> +VM_GetObjectMonitorUsage::doit() { >> + _result = ((JvmtiEnvBase*) >> _env)->get_object_monitor_usage(_calling_thread, _object, >> _info_ptr); >> +} >> + >> +void >> +VM_GetCurrentContendedMonitor::doit() { >> + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> + if (Threads::includes(_java_thread) && >> !_java_thread->is_exiting() && >> + _java_thread->threadObj() != NULL) { >> + _result = ((JvmtiEnvBase >> >> *)_env)->get_current_contended_monitor(_calling_thread,_ >> java_thread,_owned_monitor_ptr); >> + } >> +} >> + >> +void >> +VM_GetStackTrace::doit() { >> + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> + if (Threads::includes(_java_thread) && >> !_java_thread->is_exiting() >> + && >> _java_thread->threadObj() != >> NULL) { >> + _result = ((JvmtiEnvBase >> *)_env)->get_stack_trace(_java_thread, >> + >> _start_depth, >> _max_count, >> + >> _frame_buffer, >> _count_ptr); >> + } >> +} >> + >> +void >> +VM_GetFrameCount::doit() { >> + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> + JavaThread* jt = _state->get_thread(); >> + if (Threads::includes(jt) && !jt->is_exiting() && >> jt->threadObj() != >> NULL) { >> + _result = >> ((JvmtiEnvBase*)_env)->get_frame_count(_state, >> _count_ptr); >> + } >> +} >> + >> +void >> +VM_GetFrameLocation::doit() { >> + _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> + if (Threads::includes(_java_thread) && >> !_java_thread->is_exiting() && >> + _java_thread->threadObj() != NULL) { >> + _result = >> ((JvmtiEnvBase*)_env)->get_frame_location(_java_thread, >> _depth, >> + >> _method_ptr, >> _location_ptr); >> + } >> +} >> >> void >> VM_GetThreadListStackTraces::doit() { >> diff --git >> a/hotspot-9211c2e89c1c/src/sha >> re/vm/prims/jvmtiEnvBase.hpp >> b/hotspot-9211c2e89c1c/src/sha >> re/vm/prims/jvmtiEnvBase.hpp >> old mode 100644 >> new mode 100755 >> index 04e6869..00b9890 >> --- >> a/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.hpp >> +++ >> b/hotspot-9211c2e89c1c/src/share/vm/prims/jvmtiEnvBase.hpp >> @@ -359,14 +359,7 @@ public: >> } >> VMOp_Type type() const { return >> VMOp_UpdateForPopTopFrame; } >> jvmtiError result() { return _result; } >> - void doit() { >> - JavaThread* jt = _state->get_thread(); >> - if (Threads::includes(jt) && !jt->is_exiting() && >> jt->threadObj() >> != NULL) { >> - _state->update_for_pop_top_frame(); >> - } else { >> - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> - } >> - } >> + void doit(); >> }; >> >> // VM operation to set frame pop. >> @@ -389,15 +382,7 @@ public: >> bool allow_nested_vm_operations() const { return true; >> } >> VMOp_Type type() const { return VMOp_SetFramePop; } >> jvmtiError result() { return _result; } >> - void doit() { >> - JavaThread* jt = _state->get_thread(); >> - if (Threads::includes(jt) && !jt->is_exiting() && >> jt->threadObj() >> != NULL) { >> - int frame_number = _state->count_frames() - _depth; >> - >> >> _state->env_thread_state((JvmtiEnvBase*)_env)->set_frame_ >> pop(frame_number); >> - } else { >> - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> - } >> - } >> + void doit(); >> }; >> >> >> @@ -421,14 +406,7 @@ public: >> _result = JVMTI_ERROR_NONE; >> } >> VMOp_Type type() const { return >> VMOp_GetOwnedMonitorInfo; } >> - void doit() { >> - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> - if (Threads::includes(_java_thread) && >> !_java_thread->is_exiting() >> - && >> _java_thread->threadObj() != >> NULL) { >> - _result = ((JvmtiEnvBase >> *)_env)->get_owned_monitors(_calling_thread, >> _java_thread, >> - >> _owned_monitors_list); >> - } >> - } >> + void doit(); >> jvmtiError result() { return _result; } >> }; >> >> @@ -451,10 +429,7 @@ public: >> } >> VMOp_Type type() const { return >> VMOp_GetObjectMonitorUsage; } >> jvmtiError result() { return _result; } >> - void doit() { >> - _result = ((JvmtiEnvBase*) >> _env)->get_object_monitor_usage(_calling_thread, _object, >> _info_ptr); >> - } >> - >> + void doit(); >> }; >> >> // VM operation to get current contended monitor. >> @@ -475,13 +450,7 @@ public: >> } >> VMOp_Type type() const { return >> VMOp_GetCurrentContendedMonitor; } >> jvmtiError result() { return _result; } >> - void doit() { >> - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> - if (Threads::includes(_java_thread) && >> !_java_thread->is_exiting() && >> - _java_thread->threadObj() != NULL) { >> - _result = ((JvmtiEnvBase >> >> *)_env)->get_current_contended_monitor(_calling_thread,_ >> java_thread,_owned_monitor_ptr); >> - } >> - } >> + void doit(); >> }; >> >> // VM operation to get stack trace at safepoint. >> @@ -508,15 +477,7 @@ public: >> } >> jvmtiError result() { return _result; } >> VMOp_Type type() const { return VMOp_GetStackTrace; } >> - void doit() { >> - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> - if (Threads::includes(_java_thread) && >> !_java_thread->is_exiting() >> - && >> _java_thread->threadObj() != >> NULL) { >> - _result = ((JvmtiEnvBase >> *)_env)->get_stack_trace(_java_thread, >> - >> _start_depth, >> _max_count, >> - >> _frame_buffer, >> _count_ptr); >> - } >> - } >> + void doit(); >> }; >> >> // forward declaration >> @@ -606,13 +567,7 @@ public: >> } >> VMOp_Type type() const { return VMOp_GetFrameCount; } >> jvmtiError result() { return _result; } >> - void doit() { >> - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> - JavaThread* jt = _state->get_thread(); >> - if (Threads::includes(jt) && !jt->is_exiting() && >> jt->threadObj() >> != NULL) { >> - _result = >> ((JvmtiEnvBase*)_env)->get_frame_count(_state, >> _count_ptr); >> - } >> - } >> + void doit(); >> }; >> >> // VM operation to frame location at safepoint. >> @@ -636,14 +591,7 @@ public: >> } >> VMOp_Type type() const { return VMOp_GetFrameLocation; >> } >> jvmtiError result() { return _result; } >> - void doit() { >> - _result = JVMTI_ERROR_THREAD_NOT_ALIVE; >> - if (Threads::includes(_java_thread) && >> !_java_thread->is_exiting() && >> - _java_thread->threadObj() != NULL) { >> - _result = >> ((JvmtiEnvBase*)_env)->get_frame_location(_java_thread, >> _depth, >> - >> _method_ptr, >> _location_ptr); >> - } >> - } >> + void doit(); >> }; >> >> >> -- >> 2.1.4 >> >> >> On Tue, Feb 28, 2017 at 6:11 PM, David Holmes >> <david.hol...@oracle.com >> <mailto:david.hol...@oracle.com> <mailto:david.hol...@oracle.com >> <mailto:david.hol...@oracle.com>> >> <mailto:david.hol...@oracle.com >> <mailto:david.hol...@oracle.com> >> >> <mailto:david.hol...@oracle.com >> <mailto:david.hol...@oracle.com>>>> wrote: >> >> On 28/02/2017 7:35 PM, David Holmes wrote: >> >> On 28/02/2017 6:51 PM, Zhu Yong wrote: >> >> Dear All, >> >> I am testing cross compile OpenJDK-9+158 for >> our >> embedded >> system using >> buildroot, I can build server and client >> variants >> successfully, but the >> output compact1 profile file size is too >> big, then I >> tried >> to build >> minimal >> variant, failed when linking libjvm.so. >> >> I checked >> >> >> build/linux-arm-normal-minimal-release/hotspot/variant-minimal/ >> libjvm/objs/_BUILD_LIBJVM_obje >> ctfilenames.txt, >> jvmtiEnvBase.o >> and jvmtiEnvThreadState.o are not listed in >> the file >> (which >> is required >> from the error message below). >> >> >> Right - JVM TI is not part of the Minimal VM. At >> the >> moment it looks >> like some service has either been enabled when >> it should not >> have been, >> or has not been correctly if'def in the source. >> >> >> As far as I can see your error messages are >> complaining about >> missing functions that are called from the same >> sources as the >> functions that are missing! ie. >> >> undefined reference to >> >> `JvmtiEnvBase::get_current_contended_monitor(JavaThread*, >> JavaThread*, >> _jobject**)' >> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >> `VM_GetOwnedMonitorInfo::doit() >> >> but VM_GetOwnedMonitorInfo is defined in >> jvmtiEnv.cpp which >> should >> be included or excluded the same as jvmtiEnBase.cpp. >> Here's the >> logic in the makefile that controls this: >> >> ifneq ($(call check-jvm-feature, jvmti), true) >> JVM_CFLAGS_FEATURES += -DINCLUDE_JVMTI=0 >> JVM_EXCLUDE_FILES += jvmtiGetLoadedClasses.cpp >> jvmtiThreadState.cpp jvmtiExtensions.cpp \ >> jvmtiImpl.cpp jvmtiManageCapabilities.cpp >> jvmtiRawMonitor.cpp >> jvmtiUtil.cpp jvmtiTrace.cpp \ >> jvmtiCodeBlobEvents.cpp jvmtiEnv.cpp >> jvmtiRedefineClasses.cpp >> jvmtiEnvBase.cpp jvmtiEnvThreadState.cpp \ >> jvmtiTagMap.cpp jvmtiEventController.cpp >> evmCompat.cpp >> jvmtiEnter.xsl jvmtiExport.cpp \ >> jvmtiClassFileReconstituter.cpp >> endif >> >> Can you run with LOG=trace so that each compiled file >> is >> listed in >> the build log, then see if there are any jvmti* >> files listed >> there. >> >> Thanks, >> David >> >> >> >> >> Can you provide the lines from your spec.gmk >> that define the >> JVM_FEATURES_* variables please. >> >> Thanks, >> David >> ------ >> >> >> === Output from failing command(s) repeated >> here === >> * For target >> >> hotspot_variant-minimal_libjvm_objs_BUILD_LIBJVM_link: >> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >> `VM_GetStackTrace::doit() >> [clone .local.640]': >> cc27HS5M.ltrans0.o:(.text+0xce5e): undefined >> reference to >> `JvmtiEnvBase::get_stack_trace(JavaThread*, >> int, int, >> _jvmtiFrameInfo*, >> int*)' >> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >> `VM_GetCurrentContendedMonitor::doit() >> [clone .local.639]': >> cc27HS5M.ltrans0.o:(.text+0xcec2): undefined >> reference to >> >> `JvmtiEnvBase::get_current_contended_monitor(JavaThread*, >> JavaThread*, >> _jobject**)' >> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >> `VM_GetOwnedMonitorInfo::doit() >> [clone .local.638]': >> cc27HS5M.ltrans0.o:(.text+0xcf26): undefined >> reference to >> `JvmtiEnvBase::get_owned_monit >> ors(JavaThread*, >> JavaThread*, >> GrowableArray<_ >> jvmtiMonitorStackDepthInfo*>*)' >> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >> `VM_GetFrameCount::doit() >> [clone .local.637]': >> cc27HS5M.ltrans0.o:(.text+0xcf8a): undefined >> reference to >> >> `JvmtiEnvBase::get_frame_count(JvmtiThreadState*, int*)' >> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >> `VM_SetFramePop::doit() >> [clone >> .local.636]': >> cc27HS5M.ltrans0.o:(.text+0xcfea): undefined >> reference to >> `JvmtiThreadState::count_frames()' >> cc27HS5M.ltrans0.o:(.text+0xd030): undefined >> reference to >> `JvmtiEnvThreadState::set_frame_pop(int)' >> /tmp/cc27HS5M.ltrans0.ltrans.o: In function >> `VM_GetFrameLocation::doit() >> [clone .local.641]': >> ... (rest of output omitted) >> >> >> My configuration: >> >> --with-jdk-variant=normal \ >> --with-jvm-variants=minimal \ >> --with-debug-level=release \ >> --disable-warnings-as-errors \ >> --disable-hotspot-gtest \ >> --with-abi-profile=arm-vfp-sflt \ >> --openjdk-target=$(GNU_TARGET_NAME) \ >> --with-sys-root=$(STAGING_DIR) \ >> --with-tools-dir=$(HOST_DIR) \ >> >> --with-freetype-include=$(STAGING_DIR)/usr/include \ >> --with-freetype-lib=$(STAGING_DIR)/usr/lib \ >> --with-freetype=$(STAGING_DIR)/usr/ \ >> --with-alsa-include=$(STAGING_DIR)/usr/include >> \ >> --with-alsa-lib=$(STAGING_DIR)/usr/lib \ >> --with-alsa=$(STAGING_DIR)/usr/ \ >> --with-cups=$(STAGING_DIR)/usr/ \ >> --with-x=$(STAGING_DIR)/usr/include \ >> --with-extra-ldflags=--sysroot=$(STAGING_DIR) >> \ >> --enable-headless-only \ >> --disable-freetype-bundling \ >> --enable-unlimited-crypto \ >> --with-boot-jdk=/opt/java/jdk1.8.0_102 >> >> >> >> >>