Fwd: cross compile OpenJDK-9+158 minimal variant failed when link libjvm.so
Zhu Yong
zhuyong.me at gmail.com
Wed Mar 1 08:45:06 UTC 2017
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?
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>
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/), 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, 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>> 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/share/vm/prims/jvmtiEnvBase.cpp
>> b/hotspot-9211c2e89c1c/src/share/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/share/vm/prims/jvmtiEnvBase.hpp
>> b/hotspot-9211c2e89c1c/src/share/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>>> 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_objectfilenames.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_monitors(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