Fwd: cross compile OpenJDK-9+158 minimal variant failed when link libjvm.so
Zhu Yong
zhuyong.me at gmail.com
Thu Mar 2 02:35:45 UTC 2017
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.holmes at 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.holmes at oracle.com
>> <mailto:david.holmes at 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.holmes at oracle.com <mailto:david.holmes at oracle.com>
>> <mailto:david.holmes at oracle.com
>> <mailto:david.holmes at 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.holmes at oracle.com
>> <mailto:david.holmes at oracle.com> <mailto:david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>>
>> <mailto:david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>
>>
>> <mailto:david.holmes at oracle.com
>> <mailto:david.holmes at 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
>>
>>
>>
>>
>>
More information about the build-dev
mailing list