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
<mailto: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>
<mailto: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/>
<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>
<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>>
<mailto: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/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>>
<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
<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_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