I've moved this discussion over to hotspot-dev as this seems no longer a build issue but a C1 soft-float issue.

David

On 2/03/2017 12:35 PM, Zhu Yong wrote:
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





Reply via email to