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.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/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.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_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