RFR (XL): 8152664 - Support non-continuous CodeBlobs in HotSpot

Volker Simonis volker.simonis at gmail.com
Mon Apr 18 09:34:45 UTC 2016


Hi Rickard,

are you fine if we are fixing the issue about non-initialized nmethods
independently under "8151956 : CodeBlob ctor virtual call on partially
constructed subclass"? In that case I'll submit an extra RFR today
with that fix only. Anyway you or Dean will have to sponsor it because
it is in shared code.

Or do you want to fix the issue together with your change for 8152664?

Anyway, after we've fixed the problem with the partially constructed
classes I think we should make is_compiled() and is_nmethod() virtual
again and get rid of the "subtype()" hack:

http://cr.openjdk.java.net/~simonis/webrevs/2016/8152664_addon/

(This is relatively to your webrev.)

Regards,
Volker


On Fri, Apr 15, 2016 at 11:19 PM, Dean Long <dean.long at oracle.com> wrote:
>
> On 4/15/2016 11:28 AM, Volker Simonis wrote:
>>
>> Hi,
>>
>> this one was a real puzzler :)
>> But I finally found some quiet hours in the office today and came up
>> with this rather simple solution:
>>
>> http://cr.openjdk.java.net/~simonis/webrevs/2016/8151956/
>>
>> First I've tried to only move the relocation handling out of the
>> CodeBlob constructor into the derived constructors but that didn't
>> work very well and was quite complicated. So finally, I've just moved
>> the call to CodeBuffer::copy_code_and_locs_to() from the CodeBlob
>> constructor into the nmethod and RuntimeBlob constructors
>> respectively. I couldn't find a reason why we shouldn't do this. The
>> change is minimal and makes the whole handling more robust. I've
>> compiled and smoke tested with JVM 98 on Linux/x86_64, Linux/ppc64le
>> and Solaris/SPARC.
>>
>> I will run some more tests on Monday, but it would be great if you
>> (i.e. Andrew) could verify this fix on ARM and if you (i.e.
>> Rickard/Dean) could run some of your internal tests.
>
>
> Hi Volker.  This looks like what I was trying to accomplish with my patch,
> but I introduced a new function CodeBlob::initialize(), and I called it too
> early (in CompiledMethod instead of nmethod).
>

Yes, now I see. Initially I just patched your changes in and saw that
they don't work so I didn't looked at the actual changes in more
detail. I think I'll add the various casts/type changes from your
version (they are a nice clean-up) into my patch if Rickard agrees to
fix this independently of his change.

>> I'd also like to ask if I should submit an extra RFR for 8151956 with
>> my fix or if we should close 8151956 and fix it as part of Rickard's
>> change for 8152664. I'd be happy with both solutions :)
>
>
> Either way is fine with me.
>

OK, let's wait for Rickard's opinion.

> dl
>
>
>> A nice weekend everybody,
>> Volker
>>
>>
>> On Wed, Apr 13, 2016 at 3:31 PM, Rickard Bäckman
>> <rickard.backman at oracle.com> wrote:
>>>
>>> Volker,
>>>
>>> yes, I didn't realize at first that the nmethod was casted to a
>>> CompiledMethod before the call to consts_begin(). Otherwise it would
>>> have used the non-virtual consts_begin of nmethod that didn't have any
>>> virtual calls.
>>>
>>> The entire code chain and looking up itself from the CodeCache before
>>> fully constructed seems quite problematic. Even before the changes I
>>> made. Previous to my changes the calls would have succeeded but returned
>>> header_begin() or this for all the consts_begin, consts_end, etc... ?
>>>
>>> /R
>>>
>>> On 04/11, Volker Simonis wrote:
>>>>
>>>> Rickard, Dean,
>>>>
>>>> I'm afraid all this hacks can not work. It doesn't help to make
>>>> CompiledMethod::consts_begin() non-virtual and then calling a virtual
>>>> function from it. The problem ist that at the point where you call
>>>> consts_begin_v(), the vtable of 'this' is still the one of CodeBlob and
>>>> this results in calling yet another arbitrary function:
>>>>
>>>> #0  CodeBlob::is_locked_by_vm (this=0x3fff607d0c10) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/codeBlob.hpp:168
>>>> #1  0x00003fffb6e38048 in CompiledMethod::consts_begin
>>>> (this=0x3fff607d0c10) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/compiledMethod.hpp:255
>>>> #2  0x00003fffb758d658 in RelocIterator::initialize
>>>> (this=0x3ffdfd3fc9a8,
>>>> nm=0x3fff607d0c10, begin=0x3fff607d0fac "\001", limit=0x0) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/relocInfo.cpp:142
>>>> #3  0x00003fffb6ace56c in RelocIterator::RelocIterator
>>>> (this=0x3ffdfd3fc9a8, nm=0x3fff607d0c10, begin=0x3fff607d0fac "\001",
>>>> limit=0x0) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/relocInfo.hpp:1378
>>>> #4  0x00003fffb7591afc in trampoline_stub_Relocation::get_trampoline_for
>>>> (call=0x3fff607d0fac "\001", code=0x3fff607d0c10) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/relocInfo.cpp:849
>>>> #5  0x00003fffb741ba4c in NativeCall::get_trampoline
>>>> (this=0x3fff607d0fac)
>>>> at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp:146
>>>> #6  0x00003fffb7596a34 in Relocation::pd_call_destination
>>>> (this=0x3ffdfd3fcd10, orig_addr=0x3fff6033482c "\001") at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/cpu/ppc/vm/relocInfo_ppc.cpp:87
>>>> #7  0x00003fffb758f71c in CallRelocation::fix_relocation_after_move
>>>> (this=0x3ffdfd3fcd10, src=0x3ffdfd3fdbc0, dest=0x3ffdfd3fcdd8) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/relocInfo.cpp:506
>>>> #8  0x00003fffb6c48914 in CodeBuffer::relocate_code_to
>>>> (this=0x3ffdfd3fdbc0, dest=0x3ffdfd3fcdd8) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/asm/codeBuffer.cpp:812
>>>> #9  0x00003fffb6c48480 in CodeBuffer::copy_code_to (this=0x3ffdfd3fdbc0,
>>>> dest_blob=0x3fff607d0c10) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/asm/codeBuffer.cpp:748
>>>> #10 0x00003fffb6c426ec in CodeBuffer::copy_code_and_locs_to
>>>> (this=0x3ffdfd3fdbc0, blob=0x3fff607d0c10) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/asm/codeBuffer.hpp:607
>>>> #11 0x00003fffb6c3f8b0 in CodeBlob::CodeBlob (this=0x3fff607d0c10,
>>>> name=0x3fffb7a760f8 "nmethod", layout=..., cb=0x3ffdfd3fdbc0,
>>>> frame_complete_offset=20, frame_size=14, oop_maps=0x3ffe0001ed00,
>>>> caller_must_gc_arguments=false, subtype=8) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/codeBlob.cpp:117
>>>> #12 0x00003fffb6ce5360 in CompiledMethod::CompiledMethod
>>>> (this=0x3fff607d0c10, method=0x3ffe1ddce568, name=0x3fffb7a760f8
>>>> "nmethod",
>>>> size=1768, header_size=392, cb=0x3ffdfd3fdbc0, frame_complete_offset=20,
>>>> frame_size=14, oop_maps=0x3ffe0001ed00, caller_must_gc_arguments=false)
>>>> at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/compiledMethod.cpp:42
>>>> #13 0x00003fffb7422198 in nmethod::nmethod (this=0x3fff607d0c10,
>>>> method=0x3ffe1ddce568, nmethod_size=1768, compile_id=4, entry_bci=-1,
>>>> offsets=0x3ffdfd3fdb98, orig_pc_offset=104, debug_info=0x3fffb03f2dc0,
>>>> dependencies=0x3ffe0001ed70, code_buffer=0x3ffdfd3fdbc0, frame_size=14,
>>>> oop_maps=0x3ffe0001ed00, handler_table=0x3ffdfd3fdb50,
>>>> nul_chk_table=0x3ffdfd3fdb70, compiler=0x3fffb03d0cd0, comp_level=3) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/nmethod.cpp:706
>>>> #14 0x00003fffb7421850 in nmethod::new_nmethod (method=...,
>>>> compile_id=4,
>>>> entry_bci=-1, offsets=0x3ffdfd3fdb98, orig_pc_offset=104,
>>>> debug_info=0x3fffb03f2dc0, dependencies=0x3ffe0001ed70,
>>>> code_buffer=0x3ffdfd3fdbc0, frame_size=14, oop_maps=0x3ffe0001ed00,
>>>> handler_table=0x3ffdfd3fdb50, nul_chk_table=0x3ffdfd3fdb70,
>>>> compiler=0x3fffb03d0cd0, comp_level=3) at
>>>>
>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/nmethod.cpp:548
>>>>
>>>> I think we really need to rework this as proposed by Andrew in his last
>>>> mail. I'm working on such a fix.
>>>>
>>>> Regards,
>>>> Volker
>>>>
>>>>
>>>> On Mon, Apr 11, 2016 at 1:55 PM, Rickard Bäckman
>>>> <rickard.backman at oracle.com
>>>>>
>>>>> wrote:
>>>>> Volker,
>>>>>
>>>>> here is the patch if you want to try it.
>>>>> http://cr.openjdk.java.net/~rbackman/8152664/virtual.patch
>>>>>
>>>>> /R
>>>>>
>>>>> On 04/11, Rickard Bäckman wrote:
>>>>>>
>>>>>> Volker,
>>>>>>
>>>>>> thanks for finding this issue.
>>>>>>
>>>>>> I think that maybe the easiest fix is as follows:
>>>>>>
>>>>>> create new virtual methods in CompiledMethod:
>>>>>>
>>>>>> virtual address stub_begin_v() = 0;
>>>>>>
>>>>>> make the now virtual stub_begin non-virtual like:
>>>>>>
>>>>>> address stub_begin() { return stub_begin_v(); }
>>>>>>
>>>>>> in nmethod we override the stub_begin() with the normal this + offset
>>>>>> compuation and implement stub_begin_v() to call stub_begin().
>>>>>>
>>>>>> That will avoid all virtual calls in the case were we are not working
>>>>>> on
>>>>>> a CompiledMethod.
>>>>>>
>>>>>> It adds a couple of methods though. What do you think?
>>>>>>
>>>>>> /R
>>>>>>
>>>>>> On 04/08, Volker Simonis wrote:
>>>>>>>
>>>>>>> Hi Rickard,
>>>>>>>
>>>>>>> I found the problem why your change crashes the VM on ppc (and I'm
>>>>>
>>>>> pretty
>>>>>>>
>>>>>>> sure it will also crash on ARM - @Andrew, maybe you can try it out?).
>>>>>
>>>>> It is
>>>>>>>
>>>>>>> caused by the following code in address NativeCall::get_trampoline()
>>>>>
>>>>> which
>>>>>>>
>>>>>>> is also present on arm64:
>>>>>>>
>>>>>>> address NativeCall::get_trampoline() {
>>>>>>>    address call_addr = addr_at(0);
>>>>>>>    CodeBlob *code = CodeCache::find_blob(call_addr);
>>>>>>> ...
>>>>>>>    // If the codeBlob is not a nmethod, this is because we get here
>>>>>
>>>>> from the
>>>>>>>
>>>>>>>    // CodeBlob constructor, which is called within the nmethod
>>>>>
>>>>> constructor.
>>>>>>>
>>>>>>>    return trampoline_stub_Relocation::get_trampoline_for(call_addr,
>>>>>>> (nmethod*)code);
>>>>>>> }
>>>>>>>
>>>>>>> The comment explains the situation quite well: we're in the CodeBlob
>>>>>>> constructor which was called by the CompiledMethod constructor which
>>>>>
>>>>> was
>>>>>>>
>>>>>>> called from the nmethod constructor:
>>>>>>>
>>>>>>> #3  0x00003fffb741b80c in NativeCall::get_trampoline
>>>>>
>>>>> (this=0x3fff607d0fac)
>>>>>>>
>>>>>>> at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp:146
>>>>>>>
>>>>>>> #4  0x00003fffb7596914 in Relocation::pd_call_destination
>>>>>>> (this=0x3ffdfe3fcc90, orig_addr=0x3fff603b8a2c "\001") at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/cpu/ppc/vm/relocInfo_ppc.cpp:87
>>>>>>>
>>>>>>> #5  0x00003fffb758f5fc in CallRelocation::fix_relocation_after_move
>>>>>>> (this=0x3ffdfe3fcc90, src=0x3ffdfe3fdb40, dest=0x3ffdfe3fcd58) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/relocInfo.cpp:506
>>>>>>>
>>>>>>> #6  0x00003fffb6c48898 in CodeBuffer::relocate_code_to
>>>>>>> (this=0x3ffdfe3fdb40, dest=0x3ffdfe3fcd58) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/asm/codeBuffer.cpp:812
>>>>>>>
>>>>>>> #7  0x00003fffb6c48404 in CodeBuffer::copy_code_to
>>>>>
>>>>> (this=0x3ffdfe3fdb40,
>>>>>>>
>>>>>>> dest_blob=0x3fff607d0c10) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/asm/codeBuffer.cpp:748
>>>>>>>
>>>>>>> #8  0x00003fffb6c42670 in CodeBuffer::copy_code_and_locs_to
>>>>>>> (this=0x3ffdfe3fdb40, blob=0x3fff607d0c10) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/asm/codeBuffer.hpp:607
>>>>>>>
>>>>>>> #9  0x00003fffb6c3f834 in CodeBlob::CodeBlob (this=0x3fff607d0c10,
>>>>>>> name=0x3fffb7a75fd8 "nmethod", layout=..., cb=0x3ffdfe3fdb40,
>>>>>>> frame_complete_offset=20, frame_size=14, oop_maps=0x3ffe00049620,
>>>>>>> caller_must_gc_arguments=false, subtype=8) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/codeBlob.cpp:117
>>>>>>>
>>>>>>> #10 0x00003fffb6ce52c8 in CompiledMethod::CompiledMethod
>>>>>>> (this=0x3fff607d0c10, method=0x3ffe1ddce568, name=0x3fffb7a75fd8
>>>>>
>>>>> "nmethod",
>>>>>>>
>>>>>>> size=1768, header_size=392, cb=0x3ffdfe3fdb40,
>>>>>
>>>>> frame_complete_offset=20,
>>>>>>>
>>>>>>> frame_size=14, oop_maps=0x3ffe00049620,
>>>>>
>>>>> caller_must_gc_arguments=false) at
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/compiledMethod.cpp:42
>>>>>>>
>>>>>>> #11 0x00003fffb7421f58 in nmethod::nmethod (this=0x3fff607d0c10,
>>>>>>> method=0x3ffe1ddce568, nmethod_size=1768, compile_id=4, entry_bci=-1,
>>>>>>> offsets=0x3ffdfe3fdb18, orig_pc_offset=104,
>>>>>>> debug_info=0x3fffb03d55f0,
>>>>>>> dependencies=0x3ffe00049690, code_buffer=0x3ffdfe3fdb40,
>>>>>>> frame_size=14,
>>>>>>> oop_maps=0x3ffe00049620, handler_table=0x3ffdfe3fdad0,
>>>>>>> nul_chk_table=0x3ffdfe3fdaf0, compiler=0x3fffb03bc270, comp_level=3)
>>>>>>> at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/nmethod.cpp:706
>>>>>>>
>>>>>>> Now we cast 'code' to 'nmethod' but at this point in time 'code' is
>>>>>
>>>>> still a
>>>>>>>
>>>>>>> CodeBlob from the C++ point of view (i.e. it still has a CodeBlob
>>>>>
>>>>> vtable
>>>>>>>
>>>>>>> (see [1] for an explanation)).
>>>>>>>
>>>>>>> Later on, in RelocIterator::initialize() we call virtual methods on
>>>>>>> the
>>>>>>> nmethod which still has the vtable of a "CodeBlob" and this fails
>>>>>
>>>>> badly:
>>>>>>>
>>>>>>> #0  SingletonBlob::print_on (this=0x3fff607d0c10, st=0x0) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/codeBlob.cpp:584
>>>>>>>
>>>>>>> #1  0x00003fffb758d51c in RelocIterator::initialize
>>>>>
>>>>> (this=0x3ffdfe3fc928,
>>>>>>>
>>>>>>> nm=0x3fff607d0c10, begin=0x3fff607d0fac "\001", limit=0x0) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/relocInfo.cpp:144
>>>>>>>
>>>>>>> #2  0x00003fffb6ace56c in RelocIterator::RelocIterator
>>>>>>> (this=0x3ffdfe3fc928, nm=0x3fff607d0c10, begin=0x3fff607d0fac "\001",
>>>>>>> limit=0x0) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/relocInfo.hpp:1378
>>>>>>>
>>>>>>> #3  0x00003fffb75919dc in
>>>>>
>>>>> trampoline_stub_Relocation::get_trampoline_for
>>>>>>>
>>>>>>> (call=0x3fff607d0fac "\001", code=0x3fff607d0c10) at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/share/vm/code/relocInfo.cpp:849
>>>>>>>
>>>>>>> #4  0x00003fffb741b80c in NativeCall::get_trampoline
>>>>>
>>>>> (this=0x3fff607d0fac)
>>>>>>>
>>>>>>> at
>>>>>>>
>>>>>
>>>>> /usr/work/d046063/OpenJDK/jdk9-hs-comp/hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp:146
>>>>>>>
>>>>>>> As you can see, we actually want to call nmethod::stub_begin() at
>>>>>>> relocInfo.cpp:144
>>>>>>>
>>>>>>> 142  _section_start[CodeBuffer::SECT_CONSTS] = nm->consts_begin();
>>>>>>> 143  _section_start[CodeBuffer::SECT_INSTS ] = nm->insts_begin() ;
>>>>>>> 144  _section_start[CodeBuffer::SECT_STUBS ] = nm->stub_begin()  ;
>>>>>>>
>>>>>>> but we actually end up in SingletonBlob::print_on() which is a
>>>>>
>>>>> completely
>>>>>>>
>>>>>>> different method. Notice that the call to nm->consts_begin() before
>>>>>
>>>>> also
>>>>>>>
>>>>>>> fails, but it doesn't crash the VM because it happens to call
>>>>>>> SingletonBlob::verify() which has no bad side effect. The call to
>>>>>>> nm->insts_begin() in line 143 is non-virtual and thus works fine.
>>>>>>> Here
>>>>>
>>>>> are
>>>>>>>
>>>>>>> the corresponding vtable slots in the CodeBlob vtable for
>>>>>
>>>>> consts_begin()
>>>>>>>
>>>>>>> and stub_begin()
>>>>>>>
>>>>>>> (gdb) p &nmethod::consts_begin
>>>>>>> $76 = &virtual table offset 42
>>>>>>> (gdb) p &nmethod::stub_begin
>>>>>>> $77 = &virtual table offset 44
>>>>>>> (gdb) p  ((*(void ***)nm) + 1)[42]
>>>>>>> $86 = (void *) 0x3fffb6c41df8 <SingletonBlob::verify()>
>>>>>>> (gdb) p  ((*(void ***)nm) + 1)[44]
>>>>>>> $87 = (void *) 0x3fffb6c41e64 <SingletonBlob::print_on(outputStream*)
>>>>>
>>>>> const>
>>>>>>>
>>>>>>> As you can see, 'nm' is indeed a "CodeBlob" at this point:
>>>>>>>
>>>>>>> (gdb) p *(void ***)nm
>>>>>>> $91 = (void **) 0x3fffb7befa00 <vtable for CodeBlob+16>
>>>>>>> (gdb) p nm->print()
>>>>>>> [CodeBlob (0x00003fff607d1090)]
>>>>>>> Framesize: 14
>>>>>>>
>>>>>>> The offending calls succeeded before your change, because they where
>>>>>
>>>>> not
>>>>>>>
>>>>>>> virtual. Any idea how we can fix this with the new class hierarchy?
>>>>>>>
>>>>>>> Regards,
>>>>>>> Volker
>>>>>>>
>>>>>>> [1]
>>>>>>>
>>>>>
>>>>> http://stackoverflow.com/questions/6591859/when-does-the-vptr-pointing-to-vtable-get-initialized-for-a-polymorphic-class
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Apr 7, 2016 at 5:50 PM, Volker Simonis <
>>>>>
>>>>> volker.simonis at gmail.com>
>>>>>>>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi Rickard,
>>>>>>>>
>>>>>>>> I'd also like to know what's the rational behind this quite large
>>>>>>>> change. Do you expect some performance or memory consumption
>>>>>>>> improvements or is this a prerequisite for another change which is
>>>>>>>> still to come?
>>>>>>>>
>>>>>>>> The change itself currently doesn't work on ppc64 (neither on Linux
>>>>>>>> nor on AIX). I get the following crash during the build when the
>>>>>
>>>>> newly
>>>>>>>>
>>>>>>>> built Hotspot is JIT-compiling java.lang.String::charAt on C1 :
>>>>>>>>
>>>>>>>> #
>>>>>>>> # A fatal error has been detected by the Java Runtime Environment:
>>>>>>>> #
>>>>>>>> #  SIGSEGV (0xb) at pc=0x00001000012a44d0, pid=35331, tid=35404
>>>>>>>> #
>>>>>>>> # JRE version: OpenJDK Runtime Environment (9.0) (slowdebug build
>>>>>>>> 9-internal+0-2016-04-07-162501.d046063.jdk9-hs-comp)
>>>>>>>> # Java VM: OpenJDK 64-Bit Server VM (slowdebug
>>>>>>>> 9-internal+0-2016-04-07-162501.d046063.jdk9-hs-comp, mixed mode,
>>>>>>>> tiered, compressed oo
>>>>>>>> ps, serial gc, linux-ppc64le)
>>>>>>>> # Problematic frame:
>>>>>>>> # V  [libjvm.so+0xf744d0]  outputStream::do_vsnprintf_and_write(char
>>>>>>>> const*, char*, bool)+0x40
>>>>>>>> #
>>>>>>>> # No core dump will be written. Core dumps have been disabled. To
>>>>>>>> enable core dumping, try "ulimit -c unlimited" before starting Java
>>>>>>>>   again
>>>>>>>> #
>>>>>>>> # If you would like to submit a bug report, please visit:
>>>>>>>> #   http://bugreport.java.com/bugreport/crash.jsp
>>>>>>>> #
>>>>>>>>
>>>>>>>> ---------------  S U M M A R Y ------------
>>>>>>>>
>>>>>>>> Command Line:
>>>>>>>>
>>>>> -Dapplication.home=/sapmnt/ld9510/a/d046063/output-jdk9-hs-comp-dbg/jdk
>>>>>>>>
>>>>>>>> -Xms8m -XX:+UseSerialGC -Xms32M -Xmx512M -Djdk.
>>>>>>>> module.main=jdk.jlink jdk.jlink/jdk.tools.jmod.Main create
>>>>>>>> --module-version 9-internal --os-name Linux --os-arch ppc64le
>>>>>>>> --os-version
>>>>>>>>   2.6 --modulepath
>>>>>>>> /priv/d046063/output-jdk9-hs-comp-dbg/images/jmods
>>>>>>>> --hash-dependencies .* --exclude **_the.* --libs
>>>>>>>>
>>>>>>>>
>>>>>
>>>>> /priv/d046063/output-jdk9-hs-comp-dbg/support/modules_libs-stripped/java.base
>>>>>>>>
>>>>>>>> --cmds
>>>>>>>>
>>>>>
>>>>> /priv/d046063/output-jdk9-hs-comp-dbg/support/modules_cmds-stripped/java.base
>>>>>>>>
>>>>>>>> --config
>>>>>>>> /priv/d046063/output-jdk9-hs-comp-dbg/support/modules_conf/java.base
>>>>>>>> --class-path
>>>>>
>>>>> /priv/d046063/output-jdk9-hs-comp-dbg/jdk/modules/java.base
>>>>>>>>
>>>>>>>> /priv/d046063/output-jdk9-hs-comp-dbg/support/jmods/java.base.jmod
>>>>>>>>
>>>>>>>> Host: ld9510, POWER8E (raw), altivec supported, 48 cores, 61G, #
>>>>>>>> Please check /etc/os-release for details about this release.
>>>>>>>> Time: Thu Apr  7 16:28:55 2016 CEST elapsed time: 0 seconds (0d 0h
>>>>>
>>>>> 0m 0s)
>>>>>>>>
>>>>>>>> ---------------  T H R E A D  ---------------
>>>>>>>>
>>>>>>>> Current thread (0x000010000429c800):  JavaThread "C1
>>>>>
>>>>> CompilerThread10"
>>>>>>>>
>>>>>>>> daemon [_thread_in_vm, id=35404,
>>>>>>>> stack(0x000010006a800000,0x000010006ac00000)]
>>>>>>>>
>>>>>>>>
>>>>>>>> Current CompileTask:
>>>>>>>> C1:    761    3       3       java.lang.String::charAt (25 bytes)
>>>>>>>>
>>>>>>>> Stack: [0x000010006a800000,0x000010006ac00000],
>>>>>>>> sp=0x000010006abfc6c0,  free space=4081k
>>>>>>>> Native frames: (J=compiled Java code, j=interpreted, Vv=VM code,
>>>>>
>>>>> C=native
>>>>>>>>
>>>>>>>> code)
>>>>>>>> V  [libjvm.so+0xf744d0]  outputStream::do_vsnprintf_and_write(char
>>>>>>>> const*, char*, bool)+0x40
>>>>>>>> V  [libjvm.so+0xf74668]  outputStream::print_cr(char const*,
>>>>>
>>>>> ...)+0x68
>>>>>>>>
>>>>>>>> V  [libjvm.so+0x72189c]  CodeBlob::print_on(outputStream*)
>>>>>>>> const+0x50
>>>>>>>> V  [libjvm.so+0x723bdc]  RuntimeBlob::print_on(outputStream*)
>>>>>
>>>>> const+0x40
>>>>>>>>
>>>>>>>> V  [libjvm.so+0x721eb0]  SingletonBlob::print_on(outputStream*)
>>>>>
>>>>> const+0x4c
>>>>>>>>
>>>>>>>> V  [libjvm.so+0x106d51c]  RelocIterator::initialize(CompiledMethod*,
>>>>>>>> unsigned char*, unsigned char*)+0x170
>>>>>>>> V  [libjvm.so+0x5ae56c]
>>>>>
>>>>> RelocIterator::RelocIterator(CompiledMethod*,
>>>>>>>>
>>>>>>>> unsigned char*, unsigned char*)+0x78
>>>>>>>> V  [libjvm.so+0x10719dc]
>>>>>>>> trampoline_stub_Relocation::get_trampoline_for(unsigned char*,
>>>>>>>> nmethod*)+0x78
>>>>>>>> V  [libjvm.so+0xefb80c]  NativeCall::get_trampoline()+0x110
>>>>>>>> V  [libjvm.so+0x1076914]  Relocation::pd_call_destination(unsigned
>>>>>>>> char*)+0x150
>>>>>>>> V  [libjvm.so+0x106f5fc]
>>>>>>>> CallRelocation::fix_relocation_after_move(CodeBuffer const*,
>>>>>>>> CodeBuffer*)+0x74
>>>>>>>> V  [libjvm.so+0x728898]  CodeBuffer::relocate_code_to(CodeBuffer*)
>>>>>>>> const+0x390
>>>>>>>> V  [libjvm.so+0x728404]  CodeBuffer::copy_code_to(CodeBlob*)+0x134
>>>>>>>> V  [libjvm.so+0x722670]
>>>>>
>>>>> CodeBuffer::copy_code_and_locs_to(CodeBlob*)+0x84
>>>>>>>>
>>>>>>>> V  [libjvm.so+0x71f834]  CodeBlob::CodeBlob(char const*,
>>>>>>>> CodeBlobLayout const&, CodeBuffer*, int, int, OopMapSet*, bool,
>>>>>>>> int)+0x320
>>>>>>>> V  [libjvm.so+0x7c52c8]  CompiledMethod::CompiledMethod(Method*,
>>>>>>>> char
>>>>>>>> const*, int, int, CodeBuffer*, int, int, OopMapSet*, bool)+0xd8
>>>>>>>> V  [libjvm.so+0xf01f58]  nmethod::nmethod(Method*, int, int, int,
>>>>>>>> CodeOffsets*, int, DebugInformationRecorder*, Dependencies*,
>>>>>>>> CodeBuffer*, int, OopMapSet*, ExceptionHandlerTable*,
>>>>>>>> ImplicitExceptionTable*, AbstractCompiler*, int)+0xe0
>>>>>>>> V  [libjvm.so+0xf01610]  nmethod::new_nmethod(methodHandle const&,
>>>>>>>> int, int, CodeOffsets*, int, DebugInformationRecorder*,
>>>>>
>>>>> Dependencies*,
>>>>>>>>
>>>>>>>> CodeBuffer*, int, OopMapSet*, ExceptionHandlerTable*,
>>>>>>>> ImplicitExceptionTable*, AbstractCompiler*, int)+0x2c4
>>>>>>>> V  [libjvm.so+0x632970]  ciEnv::register_method(ciMethod*, int,
>>>>>>>> CodeOffsets*, int, CodeBuffer*, int, OopMapSet*,
>>>>>>>> ExceptionHandlerTable*, ImplicitExceptionTable*, AbstractCompiler*,
>>>>>>>> bool, bool, RTMState)+0x560
>>>>>>>> V  [libjvm.so+0x48ee00]  Compilation::install_code(int)+0x264
>>>>>>>> V  [libjvm.so+0x48eff8]  Compilation::compile_method()+0x184
>>>>>>>> V  [libjvm.so+0x48f7a8]  Compilation::Compilation(AbstractCompiler*,
>>>>>>>> ciEnv*, ciMethod*, int, BufferBlob*, DirectiveSet*)+0x288
>>>>>>>> V  [libjvm.so+0x4980d0]  Compiler::compile_method(ciEnv*, ciMethod*,
>>>>>>>> int, DirectiveSet*)+0xc8
>>>>>>>> V  [libjvm.so+0x7b188c]
>>>>>>>> CompileBroker::invoke_compiler_on_method(CompileTask*)+0x590
>>>>>>>> V  [libjvm.so+0x7b07bc]  CompileBroker::compiler_thread_loop()+0x310
>>>>>>>> V  [libjvm.so+0x11a614c]  compiler_thread_entry(JavaThread*,
>>>>>
>>>>> Thread*)+0xa0
>>>>>>>>
>>>>>>>> V  [libjvm.so+0x119f3a8]  JavaThread::thread_main_inner()+0x1b4
>>>>>>>> V  [libjvm.so+0x119f1a4]  JavaThread::run()+0x1b8
>>>>>>>> V  [libjvm.so+0xf53d90]  java_start(Thread*)+0x204
>>>>>>>> C  [libpthread.so.0+0x8a64]  start_thread+0xf4
>>>>>>>> C  [libc.so.6+0x1032a0]  clone+0x98
>>>>>>>>
>>>>>>>> I haven't identified the exact cause (will analyze it tomorrow) but
>>>>>>>> the stack trace indicates that it is indeed related to your changes.
>>>>>>>>
>>>>>>>> Besides that I have some comments:
>>>>>>>>
>>>>>>>> codeBuffer.hpp:
>>>>>>>>
>>>>>>>> 472   CodeSection* insts() { return &_insts; }
>>>>>>>> 475   const CodeSection* insts() const { return &_insts; }
>>>>>>>>
>>>>>>>> - do we really need both versions?
>>>>>>>>
>>>>>>>> codeBlob.hpp:
>>>>>>>>
>>>>>>>>   135   nmethod* as_nmethod_or_null() const                { return
>>>>>>>> is_nmethod() ? (nmethod*) this : NULL; }
>>>>>>>>   136   nmethod* as_nmethod() const                        {
>>>>>>>> assert(is_nmethod(), "must be nmethod"); return (nmethod*) this; }
>>>>>>>>   137   CompiledMethod* as_compiled_method_or_null() const { return
>>>>>>>> is_compiled() ? (CompiledMethod*) this : NULL; }
>>>>>>>>   138   CompiledMethod* as_compiled_method() const         {
>>>>>>>> assert(is_compiled(), "must be compiled"); return (CompiledMethod*)
>>>>>>>> this; }
>>>>>>>>   139   CodeBlob* as_codeblob_or_null() const              { return
>>>>>>>> (CodeBlob*) this; }
>>>>>>>>
>>>>>>>> - I don't like this code. You make the getters 'const' which
>>>>>>>> implicitely makes 'this' a "pointer to const" but then the returned
>>>>>>>> pointer is a normal pointer to a non-const object and therefore you
>>>>>>>> have to statically cast away the "pointer to const" (that's why you
>>>>>>>> need the cast even in the case where you return a CodeBlob*). So
>>>>>>>> either remove the const qualifier from the method declarations or
>>>>>
>>>>> make
>>>>>>>>
>>>>>>>> them return "pointers to const". And by the way,
>>>>>
>>>>> as_codeblob_or_null()
>>>>>>>>
>>>>>>>> doesn't seemed to be used anywhere in the code, why do we need it at
>>>>>>>> all?
>>>>>>>>
>>>>>>>> - Why do we need the non-virtual methods is_nmethod() and
>>>>>>>> is_compiled() to manually simulate virtual behavior. Why can't we
>>>>>>>> simply make them virtual and implement them accordingly in nmathod
>>>>>
>>>>> and
>>>>>>>>
>>>>>>>> CompiledMethod?
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Volker
>>>>>>>>
>>>>>>>> On Thu, Apr 7, 2016 at 2:12 PM, Rickard Bäckman
>>>>>>>> <rickard.backman at oracle.com> wrote:
>>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> can I please have review for this patch please?
>>>>>>>>>
>>>>>>>>> So far CodeBlobs have required all the data (metadata, oops, code,
>>>>>
>>>>> etc)
>>>>>>>>>
>>>>>>>>> to be in one continuous blob With this patch we are looking to
>>>>>
>>>>> change
>>>>>>>>>
>>>>>>>>> that. It's been done by changing offsets in CodeBlob to addresses,
>>>>>>>>> making some methods virtual to allow different behavior and also
>>>>>>>>> creating a couple of new classes. CompiledMethod now sits inbetween
>>>>>>>>> CodeBlob and nmethod.
>>>>>>>>>
>>>>>>>>> CR: https://bugs.openjdk.java.net/browse/JDK-8152664
>>>>>>>>> Webrev: http://cr.openjdk.java.net/~rbackman/8152664/
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>> /R
>
>


More information about the hotspot-dev mailing list