Leslie Zhai via llvm-dev
2018-Sep-11 01:38 UTC
[llvm-dev] OpenJDK8 failed to work after compiled by LLVM 8 for X86
Hi Dimitry, Thanks for your kind response! Thanks for the commit message of Jung's patch, I found that the bug had been fixed in OpenJDK 12 by Zhengyu https://bugs.openjdk.java.net/browse/JDK-8205965 But only backported to 11. So Jung could backport it for OpenJDK 8, thanks a lot! But I argue that the root cause might be in the compiler side, why clang-3.9.1, gcc-6.4.1 couldn't reproduce the bug? And it might be work for clang-4.0 https://bugs.openjdk.java.net/browse/JDK-8208494 I will test LLVM 5 to check out whether or not reproducible. 在 2018年09月11日 00:59, Dimitry Andric 写道:> Hi Leslie, > > This is likely the same problem as was reported in https://bugs.freebsd.org/225054#c8, and fixed by the following patch: > > https://svnweb.freebsd.org/ports/head/java/openjdk8/files/patch-hotspot_src_share_vm_services_memTracker.cpp?view=markup&pathrev=459368 > > Can you please try that out, and see if it fixes it for you too? > > -Dimitry > >> On 10 Sep 2018, at 18:20, Leslie Zhai via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> >> Hi all, >> >> OpenJDK8 jdk8u-dev[1] is just able to work after compiled with LLVM 3.9.1 for X86: >> >> $ ./build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/java -version >> openjdk version "1.8.0-internal-debug" >> OpenJDK Runtime Environment (build 1.8.0-internal-debug-xiangzhai_2018_09_09_21_08-b00) >> OpenJDK 64-Bit Server VM (build 25.71-b00-debug, mixed mode) >> >> $ strings ./build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/java | grep clang >> clang version 3.9.1 (tags/RELEASE_391/final) >> >> But it failed to work after compiled with LLVM 8 for X86: >> >> $ ./build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >> Segmentation fault >> >> $ gdb --ex run --args ./build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >> GNU gdb (GDB) Fedora 7.12.1-48.fc25 >> ... >> Starting program: /home/xiangzhai/project/jdk8u-llvm/build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >> [Thread debugging using libthread_db enabled] >> Using host libthread_db library "/lib64/libthread_db.so.1". >> >> Program received signal SIGSEGV, Segmentation fault. >> [ Legend: Modified register | Code | Heap | Stack | String ] >> ───────────────────────────────────────────────────────────────────────────────────────────────[ registers ]──── >> $rax : 0x0 >> $rbx : 0x0 >> $rcx : 0x7ffff7315eb0 → 0x00007ffff6ae30a0 → <NativeCallStack::print_on(outputStream*)+0> xor edx, edx >> $rdx : 0x0 >> $rsp : 0x7fffffff9328 → 0x00007ffff6a76822 → <MemTracker::init_tracking_level()+178> mov edi, ebx >> $rbp : 0x7fffffff93c0 → 0x00007fffffff94f0 → 0x00007fffffff9510 → 0x0000000000000002 >> $rsi : 0x0 >> $rdi : 0x7ffff7315e70 → 0x00007ffff7315eb0 → 0x00007ffff6ae30a0 → <NativeCallStack::print_on(outputStream*)+0> xor edx, edx >> $rip : 0x7ffff6ae2f5b → <NativeCallStack::NativeCallStack(int,+0> mov QWORD PTR [rdi], rcx >> $r8 : 0x1 >> $r9 : 0xf >> $r10 : 0x64 >> $r11 : 0x0 >> $r12 : 0x7fffffffdc88 → 0x00007fffffffe04c → "/home/xiangzhai/project/jdk8u-llvm/build/linux-x86[...]" >> $r13 : 0x7fffffffdca0 → 0x00007fffffffe0bf → "XDG_VTNR=1" >> $r14 : 0x7fffffff9330 → "NMT_LEVEL_10535" >> $r15 : 0x6 >> $eflags: [carry parity adjust zero sign trap INTERRUPT direction overflow RESUME virtualx86 identification] >> $ss: 0x002b $ds: 0x0000 $cs: 0x0033 $es: 0x0000 $gs: 0x0000 $fs: 0x0000 >> ───────────────────────────────────────────────────────────────────────────────────────────────────[ stack ]──── >> 0x00007fffffff9328│+0x00: 0x00007ffff6a76822 → <MemTracker::init_tracking_level()+178> mov edi, ebx ← $rsp >> 0x00007fffffff9330│+0x08: "NMT_LEVEL_10535" ← $r14 >> 0x00007fffffff9338│+0x10: 0x0035333530315f4c ("L_10535"?) >> 0x00007fffffff9340│+0x18: 0x0000000000000001 >> 0x00007fffffff9348│+0x20: 0x0000000000602190 → 0x00007ffff5eb7000 → 0x00010102464c457f >> 0x00007fffffff9350│+0x28: 0x0000000000000004 >> 0x00007fffffff9358│+0x30: 0x000000066474e551 >> 0x00007fffffff9360│+0x38: 0x0000000000000000 >> ────────────────────────────────────────────────────────────────────────────────────────[ code:i386:x86-64 ]──── >> 0x7ffff6ae2f4b <print_owned_locks_on_error(outputStream*)+187> add eax, 0x1f0f00 >> 0x7ffff6ae2f50 <NativeCallStack::NativeCallStack(int,+0> mov rcx, QWORD PTR [rip+0x842781] # 0x7ffff73256d8 >> 0x7ffff6ae2f57 <NativeCallStack::NativeCallStack(int,+0> add rcx, 0x10 >> → 0x7ffff6ae2f5b <NativeCallStack::NativeCallStack(int,+0> mov QWORD PTR [rdi], rcx >> 0x7ffff6ae2f5e <NativeCallStack::NativeCallStack(int,+0> mov DWORD PTR [rdi+0x28], 0x0 >> 0x7ffff6ae2f65 <NativeCallStack::NativeCallStack(int,+0> add rdi, 0x8 >> 0x7ffff6ae2f69 <NativeCallStack::NativeCallStack(int,+0> test edx, edx >> 0x7ffff6ae2f6b <NativeCallStack::NativeCallStack(int,+0> je 0x7ffff6ae2f7b <NativeCallStack::NativeCallStack(int, bool)+43> >> 0x7ffff6ae2f6d <NativeCallStack::NativeCallStack(int,+0> mov eax, esi >> ─────────[ source:/home/xiangzhai/project/jdk8u-llvm/hotspot/src/share/vm/utilities/nativeCallStack.cpp+33 ]──── >> 28 #include "utilities/nativeCallStack.hpp" >> 29 >> 30 const NativeCallStack NativeCallStack::EMPTY_STACK(0, false); >> 31 >> 32 NativeCallStack::NativeCallStack(int toSkip, bool fillStack) : >> → 33 _hash_value(0) { >> 34 >> 35 #if !PLATFORM_NATIVE_STACK_WALKING_SUPPORTED >> 36 fillStack = false; >> 37 #endif >> 38 >> ─────────────────────────────────────────────────────────────────────────────────────────────────[ threads ]──── >> [#0] Id 1, Name: "java", stopped, reason: SIGSEGV >> ───────────────────────────────────────────────────────────────────────────────────────────────────[ trace ]──── >> [#0] 0x7ffff6ae2f5b → Name: NativeCallStack::NativeCallStack(this=0x7ffff7315e70 <NativeCallStack::EMPTY_STACK>, toSkip=0x0, fillStack=0x0) >> [#1] 0x7ffff6a76822 → Name: MemTracker::init_tracking_level() >> [#2] 0x7ffff62eff49 → Name: MemTracker::tracking_level() >> [#3] 0x7ffff62eff49 → Name: ResourceObj::operator new(size=0x20, type=ResourceObj::STACK_OR_EMBEDDED, flags=<optimized out>) >> [#4] 0x7ffff61369ec → Name: _GLOBAL__sub_I_c1_Greedy.cpp() >> [#5] 0x7ffff7de7d9a → Name: call_init(l=<optimized out>, argc=0x2, argv=0x7fffffffdc88, env=0x7fffffffdca0) >> [#6] 0x7ffff7de7eab → Name: call_init(env=0x7fffffffdca0, argv=0x7fffffffdc88, argc=0x2, l=<optimized out>) >> [#7] 0x7ffff7de7eab → Name: _dl_init(main_map=0x602190, argc=0x2, argv=0x7fffffffdc88, env=0x7fffffffdca0) >> [#8] 0x7ffff7dece46 → Name: dl_open_worker(a=0x7fffffff97e0) >> [#9] 0x7ffff7de7c44 → Name: _dl_catch_error(objname=0x7fffffff97d0, errstring=0x7fffffff97d8, mallocedp=0x7fffffff97cf, operate=0x7ffff7decae0 <dl_open_worker>, args=0x7fffffff97e0) >> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────── >> 0x00007ffff6ae2f5b in NativeCallStack::NativeCallStack (this=0x7ffff7315e70 <NativeCallStack::EMPTY_STACK>, toSkip=0x0, fillStack=0x0) at /home/xiangzhai/project/jdk8u-llvm/hotspot/src/share/vm/utilities/nativeCallStack.cpp:33 >> 33 _hash_value(0) { >> gef➤ c >> Continuing. >> >> Program terminated with signal SIGSEGV, Segmentation fault. >> The program no longer exists. >> gef➤ >> >> ----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< --- >> >> I started to use and contribute clang static analyzer[2] just for finding the bugs for open source software from LLVM 3.x, perhaps it is a bug of LLVM 8, because jdk8u is just able to print out '-version' after compiled with llvm-3.9.1, I will rebuild the LLVM 8 again, then rebuild jdk8u for triple check. >> >> 1. Workaround-compile-with-llvm.patch https://raw.githubusercontent.com/xiangzhai/jdk8u-dev/master/Workaround-compile-with-llvm.patch >> >> 2. https://github.com/llvm-mirror/clang/commit/a530e823ed2793ac149de7a984014e242a787682#diff-ff9160d4628cb9b6186559837c2c8668 >> >> 3. The build option of LLVM 8 (bootstrap with LLVM 3.9.1): >> >> cmake .. -DCMAKE_BUILD_TYPE=Release \ >> -DCMAKE_C_COMPILER=clang \ >> -DCMAKE_CXX_COMPILER=clang++ \ >> -DCMAKE_C_FLAGS="-fPIC" \ >> -DCMAKE_CXX_FLAGS="-std=c++11 -fPIC" \ >> -DLLVM_BUILD_LLVM_DYLIB=ON \ >> -DLLVM_LINK_LLVM_DYLIB=ON \ >> -DLLVM_INSTALL_UTILS=ON \ >> -DLLVM_ENABLE_RTTI=ON \ >> -DLLVM_ENABLE_FFI=ON \ >> -DLLVM_ENABLE_EH=ON \ >> -DLLVM_BUILD_TESTS=ON \ >> -DLLVM_BUILD_DOCS=OFF \ >> -DLLVM_ENABLE_SPHINX=OFF \ >> -DLLVM_ENABLE_DOXYGEN=OFF \ >> -DLLDB_DISABLE_LIBEDIT=1 \ >> -DSPHINX_WARNINGS_AS_ERRORS=OFF \ >> -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ >> -DFFI_LIBRARY_DIR:PATH="$(pkg-config --variable=libdir libffi)" \ >> -DLLVM_BINUTILS_INCDIR=/usr/include \ >> -DLLVM_LIBDIR_SUFFIX=64 \ >> -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=ON \ >> -DLIBUNWIND_ENABLE_SHARED=ON \ >> -DLIBCXXABI_USE_LLVM_UNWINDER=ON \ >> -DLLDB_TEST_C_COMPILER=clang \ >> -DLLDB_TEST_CXX_COMPILER=clang++ \ >> -DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-redhat-linux" \ >> -DCLANG_VENDOR="LLVM China" >> >> 4. $ clang -v >> LLVM China clang version 8.0.0 (git at github.com:llvm-mirror/clang.git 81ef98628ebf5186d746c0986dcbf5073e842043) (git at github.com:llvm-mirror/llvm.git e1aac9723d55497e74d83d216329f08d9842e494) (based on LLVM 8.0.0svn) >> Target: x86_64-redhat-linux >> Thread model: posix >> InstalledDir: /usr/bin >> Found candidate GCC installation: /usr/bin/../lib/gcc/i686-redhat-linux/6.4.1 >> Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-redhat-linux/6.4.1 >> Found candidate GCC installation: /usr/lib/gcc/i686-redhat-linux/6.4.1 >> Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/6.4.1 >> Selected GCC installation: /usr/bin/../lib/gcc/x86_64-redhat-linux/6.4.1 >> Candidate multilib: .;@m64 >> Candidate multilib: 32;@m32 >> Selected multilib: .;@m64 >> >> -- >> Regards, >> Leslie Zhai >> >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-- Regards, Leslie Zhai
Dimitry Andric via llvm-dev
2018-Sep-11 08:55 UTC
[llvm-dev] OpenJDK8 failed to work after compiled by LLVM 8 for X86
Hi Leslie,
The problem really lies in the OpenJDK code, as it is attempting to
write to a const object. If this seems to work with certain compiler(s)
and optimization settings, it is just luck. :-)
Here is a reduced example, which shows the issue:
=====================================================================#include
<new>
class NativeCallStack {
public:
static const NativeCallStack EMPTY_STACK;
private:
enum { DEPTH = 4 };
void* stack[DEPTH];
public:
NativeCallStack() {
for (int i = 0; i < DEPTH; ++i) {
stack[i] = nullptr;
}
}
};
const NativeCallStack NativeCallStack::EMPTY_STACK;
int main(void)
{
// The following should segfault, if EMPTY_STACK was placed into .rodata.
::new ((void*)&NativeCallStack::EMPTY_STACK) NativeCallStack();
return 0;
}
=====================================================================
clang 7.0.0 rc2 produces this assembly:
.globl main # -- Begin function main
.p2align 4, 0x90
.type main, at function
main: # @main
.cfi_startproc
# %bb.0: # %entry
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
xorps %xmm0, %xmm0
movups %xmm0, NativeCallStack::EMPTY_STACK+16(%rip)
movups %xmm0, NativeCallStack::EMPTY_STACK(%rip)
xorl %eax, %eax
popq %rbp
.cfi_def_cfa %rsp, 8
retq
.Lfunc_end0:
.size main, .Lfunc_end0-main
.cfi_endproc
# -- End function
.type NativeCallStack::EMPTY_STACK, at object #
@NativeCallStack::EMPTY_STACK
.section .rodata,"a", at progbits
.globl NativeCallStack::EMPTY_STACK
.p2align 3
NativeCallStack::EMPTY_STACK:
.zero 32
.size NativeCallStack::EMPTY_STACK, 32
The whole constructor has been optimized out, and EMPTY_STACK has been
replaced by .zero 32, placed in the .rodata segment, which is a
perfectly valid transformation.
Then, in main(), an attempt is made to write to that read-only segment,
which will usually segfault, depending on how strictly the underlying
operating system enforces these protections.
In contrast, gcc 8.2.0 produces:
.globl main
.type main, @function
main:
.LFB74:
.cfi_startproc
movq $0, NativeCallStack::EMPTY_STACK(%rip)
xorl %eax, %eax
movq $0, NativeCallStack::EMPTY_STACK+8(%rip)
movq $0, NativeCallStack::EMPTY_STACK+16(%rip)
movq $0, NativeCallStack::EMPTY_STACK+24(%rip)
ret
.cfi_endproc
.LFE74:
.size main, .-main
.p2align 4,,15
.type _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE, @function
_GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE:
.LFB76:
.cfi_startproc
movq $0, NativeCallStack::EMPTY_STACK(%rip)
movq $0, NativeCallStack::EMPTY_STACK+8(%rip)
movq $0, NativeCallStack::EMPTY_STACK+16(%rip)
movq $0, NativeCallStack::EMPTY_STACK+24(%rip)
ret
.cfi_endproc
.LFE76:
.size _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE,
.-_GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE
.section .ctors,"aw", at progbits
.align 8
.quad _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE
.globl NativeCallStack::EMPTY_STACK
.bss
.align 32
.type NativeCallStack::EMPTY_STACK, @object
.size NativeCallStack::EMPTY_STACK, 32
NativeCallStack::EMPTY_STACK:
.zero 32
Here you can see that gcc decided to not place EMPTY_STACK in .rodata,
but in .bss, which is read/write. It adds the global constructor to
the .ctors section, so the dynamic linker is made responsible for
calling it.
Note that now the EMPTY_STACK object is unnecessarily initialized twice,
once by the global constructor, and once in main.
-Dimitry
> On 11 Sep 2018, at 03:38, Leslie Zhai <zhaixiang at loongson.cn>
wrote:
>
> Hi Dimitry,
>
> Thanks for your kind response!
>
> Thanks for the commit message of Jung's patch, I found that the bug
had been fixed in OpenJDK 12 by Zhengyu
https://bugs.openjdk.java.net/browse/JDK-8205965 But only backported to 11. So
Jung could backport it for OpenJDK 8, thanks a lot!
>
> But I argue that the root cause might be in the compiler side, why
clang-3.9.1, gcc-6.4.1 couldn't reproduce the bug? And it might be work for
clang-4.0 https://bugs.openjdk.java.net/browse/JDK-8208494 I will test LLVM 5
to check out whether or not reproducible.
>
>
> 在 2018年09月11日 00:59, Dimitry Andric 写道:
>> Hi Leslie,
>>
>> This is likely the same problem as was reported in
https://bugs.freebsd.org/225054#c8, and fixed by the following patch:
>>
>>
https://svnweb.freebsd.org/ports/head/java/openjdk8/files/patch-hotspot_src_share_vm_services_memTracker.cpp?view=markup&pathrev=459368
>>
>> Can you please try that out, and see if it fixes it for you too?
>>
>> -Dimitry
>>
>>> On 10 Sep 2018, at 18:20, Leslie Zhai via llvm-dev <llvm-dev at
lists.llvm.org> wrote:
>>>
>>> Hi all,
>>>
>>> OpenJDK8 jdk8u-dev[1] is just able to work after compiled with LLVM
3.9.1 for X86:
>>>
>>> $
./build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/java
-version
>>> openjdk version "1.8.0-internal-debug"
>>> OpenJDK Runtime Environment (build
1.8.0-internal-debug-xiangzhai_2018_09_09_21_08-b00)
>>> OpenJDK 64-Bit Server VM (build 25.71-b00-debug, mixed mode)
>>>
>>> $ strings
./build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/java | grep
clang
>>> clang version 3.9.1 (tags/RELEASE_391/final)
>>>
>>> But it failed to work after compiled with LLVM 8 for X86:
>>>
>>> $
./build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java
-version
>>> Segmentation fault
>>>
>>> $ gdb --ex run --args
./build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java
-version
>>> GNU gdb (GDB) Fedora 7.12.1-48.fc25
>>> ...
>>> Starting program:
/home/xiangzhai/project/jdk8u-llvm/build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java
-version
>>> [Thread debugging using libthread_db enabled]
>>> Using host libthread_db library
"/lib64/libthread_db.so.1".
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> [ Legend: Modified register | Code | Heap | Stack | String ]
>>>
───────────────────────────────────────────────────────────────────────────────────────────────[
registers ]────
>>> $rax : 0x0
>>> $rbx : 0x0
>>> $rcx : 0x7ffff7315eb0 → 0x00007ffff6ae30a0 →
<NativeCallStack::print_on(outputStream*)+0> xor edx, edx
>>> $rdx : 0x0
>>> $rsp : 0x7fffffff9328 → 0x00007ffff6a76822 →
<MemTracker::init_tracking_level()+178> mov edi, ebx
>>> $rbp : 0x7fffffff93c0 → 0x00007fffffff94f0 →
0x00007fffffff9510 → 0x0000000000000002
>>> $rsi : 0x0
>>> $rdi : 0x7ffff7315e70 → 0x00007ffff7315eb0 →
0x00007ffff6ae30a0 → <NativeCallStack::print_on(outputStream*)+0> xor
edx, edx
>>> $rip : 0x7ffff6ae2f5b →
<NativeCallStack::NativeCallStack(int,+0> mov QWORD PTR [rdi], rcx
>>> $r8 : 0x1
>>> $r9 : 0xf
>>> $r10 : 0x64
>>> $r11 : 0x0
>>> $r12 : 0x7fffffffdc88 → 0x00007fffffffe04c →
"/home/xiangzhai/project/jdk8u-llvm/build/linux-x86[...]"
>>> $r13 : 0x7fffffffdca0 → 0x00007fffffffe0bf →
"XDG_VTNR=1"
>>> $r14 : 0x7fffffff9330 → "NMT_LEVEL_10535"
>>> $r15 : 0x6
>>> $eflags: [carry parity adjust zero sign trap INTERRUPT direction
overflow RESUME virtualx86 identification]
>>> $ss: 0x002b $ds: 0x0000 $cs: 0x0033 $es: 0x0000 $gs: 0x0000
$fs: 0x0000
>>>
───────────────────────────────────────────────────────────────────────────────────────────────────[
stack ]────
>>> 0x00007fffffff9328│+0x00: 0x00007ffff6a76822 →
<MemTracker::init_tracking_level()+178> mov edi, ebx ← $rsp
>>> 0x00007fffffff9330│+0x08: "NMT_LEVEL_10535" ← $r14
>>> 0x00007fffffff9338│+0x10: 0x0035333530315f4c ("L_10535"?)
>>> 0x00007fffffff9340│+0x18: 0x0000000000000001
>>> 0x00007fffffff9348│+0x20: 0x0000000000602190 → 0x00007ffff5eb7000
→ 0x00010102464c457f
>>> 0x00007fffffff9350│+0x28: 0x0000000000000004
>>> 0x00007fffffff9358│+0x30: 0x000000066474e551
>>> 0x00007fffffff9360│+0x38: 0x0000000000000000
>>>
────────────────────────────────────────────────────────────────────────────────────────[
code:i386:x86-64 ]────
>>> 0x7ffff6ae2f4b
<print_owned_locks_on_error(outputStream*)+187> add eax, 0x1f0f00
>>> 0x7ffff6ae2f50 <NativeCallStack::NativeCallStack(int,+0>
mov rcx, QWORD PTR [rip+0x842781] # 0x7ffff73256d8
>>> 0x7ffff6ae2f57 <NativeCallStack::NativeCallStack(int,+0>
add rcx, 0x10
>>> → 0x7ffff6ae2f5b <NativeCallStack::NativeCallStack(int,+0>
mov QWORD PTR [rdi], rcx
>>> 0x7ffff6ae2f5e <NativeCallStack::NativeCallStack(int,+0>
mov DWORD PTR [rdi+0x28], 0x0
>>> 0x7ffff6ae2f65 <NativeCallStack::NativeCallStack(int,+0>
add rdi, 0x8
>>> 0x7ffff6ae2f69 <NativeCallStack::NativeCallStack(int,+0>
test edx, edx
>>> 0x7ffff6ae2f6b <NativeCallStack::NativeCallStack(int,+0>
je 0x7ffff6ae2f7b <NativeCallStack::NativeCallStack(int, bool)+43>
>>> 0x7ffff6ae2f6d <NativeCallStack::NativeCallStack(int,+0>
mov eax, esi
>>> ─────────[
source:/home/xiangzhai/project/jdk8u-llvm/hotspot/src/share/vm/utilities/nativeCallStack.cpp+33
]────
>>> 28 #include "utilities/nativeCallStack.hpp"
>>> 29
>>> 30 const NativeCallStack NativeCallStack::EMPTY_STACK(0,
false);
>>> 31
>>> 32 NativeCallStack::NativeCallStack(int toSkip, bool
fillStack) :
>>> → 33 _hash_value(0) {
>>> 34
>>> 35 #if !PLATFORM_NATIVE_STACK_WALKING_SUPPORTED
>>> 36 fillStack = false;
>>> 37 #endif
>>> 38
>>>
─────────────────────────────────────────────────────────────────────────────────────────────────[
threads ]────
>>> [#0] Id 1, Name: "java", stopped, reason: SIGSEGV
>>>
───────────────────────────────────────────────────────────────────────────────────────────────────[
trace ]────
>>> [#0] 0x7ffff6ae2f5b → Name:
NativeCallStack::NativeCallStack(this=0x7ffff7315e70
<NativeCallStack::EMPTY_STACK>, toSkip=0x0, fillStack=0x0)
>>> [#1] 0x7ffff6a76822 → Name: MemTracker::init_tracking_level()
>>> [#2] 0x7ffff62eff49 → Name: MemTracker::tracking_level()
>>> [#3] 0x7ffff62eff49 → Name: ResourceObj::operator new(size=0x20,
type=ResourceObj::STACK_OR_EMBEDDED, flags=<optimized out>)
>>> [#4] 0x7ffff61369ec → Name: _GLOBAL__sub_I_c1_Greedy.cpp()
>>> [#5] 0x7ffff7de7d9a → Name: call_init(l=<optimized out>,
argc=0x2, argv=0x7fffffffdc88, env=0x7fffffffdca0)
>>> [#6] 0x7ffff7de7eab → Name: call_init(env=0x7fffffffdca0,
argv=0x7fffffffdc88, argc=0x2, l=<optimized out>)
>>> [#7] 0x7ffff7de7eab → Name: _dl_init(main_map=0x602190, argc=0x2,
argv=0x7fffffffdc88, env=0x7fffffffdca0)
>>> [#8] 0x7ffff7dece46 → Name: dl_open_worker(a=0x7fffffff97e0)
>>> [#9] 0x7ffff7de7c44 → Name: _dl_catch_error(objname=0x7fffffff97d0,
errstring=0x7fffffff97d8, mallocedp=0x7fffffff97cf, operate=0x7ffff7decae0
<dl_open_worker>, args=0x7fffffff97e0)
>>>
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
>>> 0x00007ffff6ae2f5b in NativeCallStack::NativeCallStack
(this=0x7ffff7315e70 <NativeCallStack::EMPTY_STACK>, toSkip=0x0,
fillStack=0x0) at
/home/xiangzhai/project/jdk8u-llvm/hotspot/src/share/vm/utilities/nativeCallStack.cpp:33
>>> 33 _hash_value(0) {
>>> gef➤ c
>>> Continuing.
>>>
>>> Program terminated with signal SIGSEGV, Segmentation fault.
>>> The program no longer exists.
>>> gef➤
>>>
>>> ----- 8< -------- 8< -------- 8< -------- 8< --------
8< -------- 8< ---
>>>
>>> I started to use and contribute clang static analyzer[2] just for
finding the bugs for open source software from LLVM 3.x, perhaps it is a bug of
LLVM 8, because jdk8u is just able to print out '-version' after
compiled with llvm-3.9.1, I will rebuild the LLVM 8 again, then rebuild jdk8u
for triple check.
>>>
>>> 1. Workaround-compile-with-llvm.patch
https://raw.githubusercontent.com/xiangzhai/jdk8u-dev/master/Workaround-compile-with-llvm.patch
>>>
>>> 2.
https://github.com/llvm-mirror/clang/commit/a530e823ed2793ac149de7a984014e242a787682#diff-ff9160d4628cb9b6186559837c2c8668
>>>
>>> 3. The build option of LLVM 8 (bootstrap with LLVM 3.9.1):
>>>
>>> cmake .. -DCMAKE_BUILD_TYPE=Release \
>>> -DCMAKE_C_COMPILER=clang \
>>> -DCMAKE_CXX_COMPILER=clang++ \
>>> -DCMAKE_C_FLAGS="-fPIC" \
>>> -DCMAKE_CXX_FLAGS="-std=c++11 -fPIC" \
>>> -DLLVM_BUILD_LLVM_DYLIB=ON \
>>> -DLLVM_LINK_LLVM_DYLIB=ON \
>>> -DLLVM_INSTALL_UTILS=ON \
>>> -DLLVM_ENABLE_RTTI=ON \
>>> -DLLVM_ENABLE_FFI=ON \
>>> -DLLVM_ENABLE_EH=ON \
>>> -DLLVM_BUILD_TESTS=ON \
>>> -DLLVM_BUILD_DOCS=OFF \
>>> -DLLVM_ENABLE_SPHINX=OFF \
>>> -DLLVM_ENABLE_DOXYGEN=OFF \
>>> -DLLDB_DISABLE_LIBEDIT=1 \
>>> -DSPHINX_WARNINGS_AS_ERRORS=OFF \
>>> -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \
>>> -DFFI_LIBRARY_DIR:PATH="$(pkg-config --variable=libdir
libffi)" \
>>> -DLLVM_BINUTILS_INCDIR=/usr/include \
>>> -DLLVM_LIBDIR_SUFFIX=64 \
>>> -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=ON \
>>> -DLIBUNWIND_ENABLE_SHARED=ON \
>>> -DLIBCXXABI_USE_LLVM_UNWINDER=ON \
>>> -DLLDB_TEST_C_COMPILER=clang \
>>> -DLLDB_TEST_CXX_COMPILER=clang++ \
>>> -DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-redhat-linux" \
>>> -DCLANG_VENDOR="LLVM China"
>>>
>>> 4. $ clang -v
>>> LLVM China clang version 8.0.0 (git at
github.com:llvm-mirror/clang.git 81ef98628ebf5186d746c0986dcbf5073e842043) (git
at github.com:llvm-mirror/llvm.git e1aac9723d55497e74d83d216329f08d9842e494)
(based on LLVM 8.0.0svn)
>>> Target: x86_64-redhat-linux
>>> Thread model: posix
>>> InstalledDir: /usr/bin
>>> Found candidate GCC installation:
/usr/bin/../lib/gcc/i686-redhat-linux/6.4.1
>>> Found candidate GCC installation:
/usr/bin/../lib/gcc/x86_64-redhat-linux/6.4.1
>>> Found candidate GCC installation:
/usr/lib/gcc/i686-redhat-linux/6.4.1
>>> Found candidate GCC installation:
/usr/lib/gcc/x86_64-redhat-linux/6.4.1
>>> Selected GCC installation:
/usr/bin/../lib/gcc/x86_64-redhat-linux/6.4.1
>>> Candidate multilib: .;@m64
>>> Candidate multilib: 32;@m32
>>> Selected multilib: .;@m64
>>>
>>> --
>>> Regards,
>>> Leslie Zhai
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
> --
> Regards,
> Leslie Zhai
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 223 bytes
Desc: Message signed with OpenPGP
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20180911/4e9e532d/attachment.sig>
Leslie Zhai via llvm-dev
2018-Sep-11 16:09 UTC
[llvm-dev] OpenJDK8 failed to work after compiled by LLVM 8 for X86
Hi Dimitry, Thank you so much for the reduced testcase! It is able to reproduce after compiled with clang-8 optimized for X86: $ clang++ -O3 -S -c JDK-8205969.cpp -o JDK-8205969-opt-8.0.s $ clang++ -O3 -c JDK-8205969.cpp -o JDK-8205969-opt-8.0.o $ clang++ -o JDK-8205969-opt-8.0.out JDK-8205969-opt-8.0.o $ ./JDK-8205969-opt-8.0.out Segmentation fault $ cat JDK-8205969-opt-8.0.s .text .file "JDK-8205969.cpp" .globl main # -- Begin function main .p2align 4, 0x90 .type main, at function main: # @main .cfi_startproc # %bb.0: xorps %xmm0, %xmm0 movups %xmm0, _ZN15NativeCallStack11EMPTY_STACKE+16(%rip) movups %xmm0, _ZN15NativeCallStack11EMPTY_STACKE(%rip) xorl %eax, %eax retq .Lfunc_end0: .size main, .Lfunc_end0-main .cfi_endproc # -- End function .type _ZN15NativeCallStack11EMPTY_STACKE, at object # @_ZN15NativeCallStack11EMPTY_STACKE .section .rodata,"a", at progbits ^--- READ-ONLY segment .globl _ZN15NativeCallStack11EMPTY_STACKE .p2align 3 _ZN15NativeCallStack11EMPTY_STACKE: .zero 32 .size _ZN15NativeCallStack11EMPTY_STACKE, 32 .ident "LLVM China clang version 8.0.0 (git at github.com:llvm-mirror/clang.git 81ef98628ebf5186d746c0986dcbf5073e842043) (git at github.com:llvm-mirror/llvm.git e1aac9723d55497e74d83d216329f08d9842e494) (based on LLVM 8.0.0svn)" .section ".note.GNU-stack","", at progbits .addrsig But it is *not* able to reproduce with clang-8 not optimized for X86: $ clang++ -O0 -S -c JDK-8205969.cpp -o JDK-8205969-unopt-8.0.s $ clang++ -O0 -c JDK-8205969.cpp -o JDK-8205969-unopt-8.0.o $ clang++ -o JDK-8205969-unopt-8.0.out JDK-8205969-unopt-8.0.o $ ./JDK-8205969-unopt-8.0.out No segfault $ cat JDK-8205969-unopt-8.0.s .text .file "JDK-8205969.cpp" .section .text.startup,"ax", at progbits .p2align 4, 0x90 # -- Begin function __cxx_global_var_init .type __cxx_global_var_init, at function __cxx_global_var_init: # @__cxx_global_var_init .cfi_startproc # %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp movabsq $_ZN15NativeCallStack11EMPTY_STACKE, %rdi callq _ZN15NativeCallStackC2Ev popq %rbp .cfi_def_cfa %rsp, 8 retq .Lfunc_end0: .size __cxx_global_var_init, .Lfunc_end0-__cxx_global_var_init .cfi_endproc # -- End function .section .text._ZN15NativeCallStackC2Ev,"axG", at progbits,_ZN15NativeCallStackC2Ev,comdat .weak _ZN15NativeCallStackC2Ev # -- Begin function _ZN15NativeCallStackC2Ev .p2align 4, 0x90 .type _ZN15NativeCallStackC2Ev, at function _ZN15NativeCallStackC2Ev: # @_ZN15NativeCallStackC2Ev .cfi_startproc # %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp movq %rdi, -8(%rbp) movq -8(%rbp), %rdi movl $0, -12(%rbp) movq %rdi, -24(%rbp) # 8-byte Spill .LBB1_1: # =>This Inner Loop Header: Depth=1 cmpl $4, -12(%rbp) jge .LBB1_4 # %bb.2: # in Loop: Header=BB1_1 Depth=1 movslq -12(%rbp), %rax movq -24(%rbp), %rcx # 8-byte Reload movq $0, (%rcx,%rax,8) # %bb.3: # in Loop: Header=BB1_1 Depth=1 movl -12(%rbp), %eax addl $1, %eax movl %eax, -12(%rbp) jmp .LBB1_1 .LBB1_4: popq %rbp .cfi_def_cfa %rsp, 8 retq .Lfunc_end1: .size _ZN15NativeCallStackC2Ev, .Lfunc_end1-_ZN15NativeCallStackC2Ev .cfi_endproc # -- End function .text .globl main # -- Begin function main .p2align 4, 0x90 .type main, at function main: # @main .cfi_startproc # %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp subq $16, %rsp movl $0, -4(%rbp) movabsq $_ZN15NativeCallStack11EMPTY_STACKE, %rdi callq _ZN15NativeCallStackC2Ev xorl %eax, %eax addq $16, %rsp popq %rbp .cfi_def_cfa %rsp, 8 retq .Lfunc_end2: .size main, .Lfunc_end2-main .cfi_endproc # -- End function .section .text.startup,"ax", at progbits .p2align 4, 0x90 # -- Begin function _GLOBAL__sub_I_JDK_8205969.cpp .type _GLOBAL__sub_I_JDK_8205969.cpp, at function _GLOBAL__sub_I_JDK_8205969.cpp: # @_GLOBAL__sub_I_JDK_8205969.cpp .cfi_startproc # %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp callq __cxx_global_var_init popq %rbp .cfi_def_cfa %rsp, 8 retq .Lfunc_end3: .size _GLOBAL__sub_I_JDK_8205969.cpp, .Lfunc_end3-_GLOBAL__sub_I_JDK_8205969.cpp .cfi_endproc # -- End function .type _ZN15NativeCallStack11EMPTY_STACKE, at object # @_ZN15NativeCallStack11EMPTY_STACKE .bss ^--- R/W segment .globl _ZN15NativeCallStack11EMPTY_STACKE .p2align 3 _ZN15NativeCallStack11EMPTY_STACKE: .zero 32 .size _ZN15NativeCallStack11EMPTY_STACKE, 32 .section .init_array,"aw", at init_array .p2align 3 .quad _GLOBAL__sub_I_JDK_8205969.cpp .ident "LLVM China clang version 8.0.0 (git at github.com:llvm-mirror/clang.git 81ef98628ebf5186d746c0986dcbf5073e842043) (git at github.com:llvm-mirror/llvm.git e1aac9723d55497e74d83d216329f08d9842e494) (based on LLVM 8.0.0svn)" .section ".note.GNU-stack","", at progbits .addrsig .addrsig_sym __cxx_global_var_init .addrsig_sym _GLOBAL__sub_I_JDK_8205969.cpp .addrsig_sym _ZN15NativeCallStack11EMPTY_STACKE ----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< --- Furthermore clang-3.9.1 *optimized* for X86 is *not* able to reproduce the issue neither. It behaviors like gcc-6.4.1 and gcc-8. But I will also check out clang-8 -O3/-O0 for mips64el. And I am building LLVM 5.0.2 for X86, if still *not* able to reproduce, it might be reduced the issue to [6, +∞) version range. I will dig deep-into which commit/review bring in the issue. 在 2018年09月11日 16:55, Dimitry Andric 写道:> Hi Leslie, > > The problem really lies in the OpenJDK code, as it is attempting to > write to a const object. If this seems to work with certain compiler(s) > and optimization settings, it is just luck. :-) > > Here is a reduced example, which shows the issue: > > =====================================================================> #include <new> > > class NativeCallStack { > public: > static const NativeCallStack EMPTY_STACK; > > private: > enum { DEPTH = 4 }; > void* stack[DEPTH]; > > public: > NativeCallStack() { > for (int i = 0; i < DEPTH; ++i) { > stack[i] = nullptr; > } > } > }; > > const NativeCallStack NativeCallStack::EMPTY_STACK; > > int main(void) > { > // The following should segfault, if EMPTY_STACK was placed into .rodata. > ::new ((void*)&NativeCallStack::EMPTY_STACK) NativeCallStack(); > return 0; > } > =====================================================================> > clang 7.0.0 rc2 produces this assembly: > > .globl main # -- Begin function main > .p2align 4, 0x90 > .type main, at function > main: # @main > .cfi_startproc > # %bb.0: # %entry > pushq %rbp > .cfi_def_cfa_offset 16 > .cfi_offset %rbp, -16 > movq %rsp, %rbp > .cfi_def_cfa_register %rbp > xorps %xmm0, %xmm0 > movups %xmm0, NativeCallStack::EMPTY_STACK+16(%rip) > movups %xmm0, NativeCallStack::EMPTY_STACK(%rip) > xorl %eax, %eax > popq %rbp > .cfi_def_cfa %rsp, 8 > retq > .Lfunc_end0: > .size main, .Lfunc_end0-main > .cfi_endproc > # -- End function > .type NativeCallStack::EMPTY_STACK, at object # @NativeCallStack::EMPTY_STACK > .section .rodata,"a", at progbits > .globl NativeCallStack::EMPTY_STACK > .p2align 3 > NativeCallStack::EMPTY_STACK: > .zero 32 > .size NativeCallStack::EMPTY_STACK, 32 > > The whole constructor has been optimized out, and EMPTY_STACK has been > replaced by .zero 32, placed in the .rodata segment, which is a > perfectly valid transformation. > > Then, in main(), an attempt is made to write to that read-only segment, > which will usually segfault, depending on how strictly the underlying > operating system enforces these protections. > > In contrast, gcc 8.2.0 produces: > > .globl main > .type main, @function > main: > .LFB74: > .cfi_startproc > movq $0, NativeCallStack::EMPTY_STACK(%rip) > xorl %eax, %eax > movq $0, NativeCallStack::EMPTY_STACK+8(%rip) > movq $0, NativeCallStack::EMPTY_STACK+16(%rip) > movq $0, NativeCallStack::EMPTY_STACK+24(%rip) > ret > .cfi_endproc > .LFE74: > .size main, .-main > .p2align 4,,15 > .type _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE, @function > _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE: > .LFB76: > .cfi_startproc > movq $0, NativeCallStack::EMPTY_STACK(%rip) > movq $0, NativeCallStack::EMPTY_STACK+8(%rip) > movq $0, NativeCallStack::EMPTY_STACK+16(%rip) > movq $0, NativeCallStack::EMPTY_STACK+24(%rip) > ret > .cfi_endproc > .LFE76: > .size _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE, .-_GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE > .section .ctors,"aw", at progbits > .align 8 > .quad _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE > .globl NativeCallStack::EMPTY_STACK > .bss > .align 32 > .type NativeCallStack::EMPTY_STACK, @object > .size NativeCallStack::EMPTY_STACK, 32 > NativeCallStack::EMPTY_STACK: > .zero 32 > > Here you can see that gcc decided to not place EMPTY_STACK in .rodata, > but in .bss, which is read/write. It adds the global constructor to > the .ctors section, so the dynamic linker is made responsible for > calling it. > > Note that now the EMPTY_STACK object is unnecessarily initialized twice, > once by the global constructor, and once in main. > > -Dimitry > >> On 11 Sep 2018, at 03:38, Leslie Zhai <zhaixiang at loongson.cn> wrote: >> >> Hi Dimitry, >> >> Thanks for your kind response! >> >> Thanks for the commit message of Jung's patch, I found that the bug had been fixed in OpenJDK 12 by Zhengyu https://bugs.openjdk.java.net/browse/JDK-8205965 But only backported to 11. So Jung could backport it for OpenJDK 8, thanks a lot! >> >> But I argue that the root cause might be in the compiler side, why clang-3.9.1, gcc-6.4.1 couldn't reproduce the bug? And it might be work for clang-4.0 https://bugs.openjdk.java.net/browse/JDK-8208494 I will test LLVM 5 to check out whether or not reproducible. >> >> >> 在 2018年09月11日 00:59, Dimitry Andric 写道: >>> Hi Leslie, >>> >>> This is likely the same problem as was reported in https://bugs.freebsd.org/225054#c8, and fixed by the following patch: >>> >>> https://svnweb.freebsd.org/ports/head/java/openjdk8/files/patch-hotspot_src_share_vm_services_memTracker.cpp?view=markup&pathrev=459368 >>> >>> Can you please try that out, and see if it fixes it for you too? >>> >>> -Dimitry >>> >>>> On 10 Sep 2018, at 18:20, Leslie Zhai via llvm-dev <llvm-dev at lists.llvm.org> wrote: >>>> >>>> Hi all, >>>> >>>> OpenJDK8 jdk8u-dev[1] is just able to work after compiled with LLVM 3.9.1 for X86: >>>> >>>> $ ./build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/java -version >>>> openjdk version "1.8.0-internal-debug" >>>> OpenJDK Runtime Environment (build 1.8.0-internal-debug-xiangzhai_2018_09_09_21_08-b00) >>>> OpenJDK 64-Bit Server VM (build 25.71-b00-debug, mixed mode) >>>> >>>> $ strings ./build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/java | grep clang >>>> clang version 3.9.1 (tags/RELEASE_391/final) >>>> >>>> But it failed to work after compiled with LLVM 8 for X86: >>>> >>>> $ ./build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >>>> Segmentation fault >>>> >>>> $ gdb --ex run --args ./build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >>>> GNU gdb (GDB) Fedora 7.12.1-48.fc25 >>>> ... >>>> Starting program: /home/xiangzhai/project/jdk8u-llvm/build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >>>> [Thread debugging using libthread_db enabled] >>>> Using host libthread_db library "/lib64/libthread_db.so.1". >>>> >>>> Program received signal SIGSEGV, Segmentation fault. >>>> [ Legend: Modified register | Code | Heap | Stack | String ] >>>> ───────────────────────────────────────────────────────────────────────────────────────────────[ registers ]──── >>>> $rax : 0x0 >>>> $rbx : 0x0 >>>> $rcx : 0x7ffff7315eb0 → 0x00007ffff6ae30a0 → <NativeCallStack::print_on(outputStream*)+0> xor edx, edx >>>> $rdx : 0x0 >>>> $rsp : 0x7fffffff9328 → 0x00007ffff6a76822 → <MemTracker::init_tracking_level()+178> mov edi, ebx >>>> $rbp : 0x7fffffff93c0 → 0x00007fffffff94f0 → 0x00007fffffff9510 → 0x0000000000000002 >>>> $rsi : 0x0 >>>> $rdi : 0x7ffff7315e70 → 0x00007ffff7315eb0 → 0x00007ffff6ae30a0 → <NativeCallStack::print_on(outputStream*)+0> xor edx, edx >>>> $rip : 0x7ffff6ae2f5b → <NativeCallStack::NativeCallStack(int,+0> mov QWORD PTR [rdi], rcx >>>> $r8 : 0x1 >>>> $r9 : 0xf >>>> $r10 : 0x64 >>>> $r11 : 0x0 >>>> $r12 : 0x7fffffffdc88 → 0x00007fffffffe04c → "/home/xiangzhai/project/jdk8u-llvm/build/linux-x86[...]" >>>> $r13 : 0x7fffffffdca0 → 0x00007fffffffe0bf → "XDG_VTNR=1" >>>> $r14 : 0x7fffffff9330 → "NMT_LEVEL_10535" >>>> $r15 : 0x6 >>>> $eflags: [carry parity adjust zero sign trap INTERRUPT direction overflow RESUME virtualx86 identification] >>>> $ss: 0x002b $ds: 0x0000 $cs: 0x0033 $es: 0x0000 $gs: 0x0000 $fs: 0x0000 >>>> ───────────────────────────────────────────────────────────────────────────────────────────────────[ stack ]──── >>>> 0x00007fffffff9328│+0x00: 0x00007ffff6a76822 → <MemTracker::init_tracking_level()+178> mov edi, ebx ← $rsp >>>> 0x00007fffffff9330│+0x08: "NMT_LEVEL_10535" ← $r14 >>>> 0x00007fffffff9338│+0x10: 0x0035333530315f4c ("L_10535"?) >>>> 0x00007fffffff9340│+0x18: 0x0000000000000001 >>>> 0x00007fffffff9348│+0x20: 0x0000000000602190 → 0x00007ffff5eb7000 → 0x00010102464c457f >>>> 0x00007fffffff9350│+0x28: 0x0000000000000004 >>>> 0x00007fffffff9358│+0x30: 0x000000066474e551 >>>> 0x00007fffffff9360│+0x38: 0x0000000000000000 >>>> ────────────────────────────────────────────────────────────────────────────────────────[ code:i386:x86-64 ]──── >>>> 0x7ffff6ae2f4b <print_owned_locks_on_error(outputStream*)+187> add eax, 0x1f0f00 >>>> 0x7ffff6ae2f50 <NativeCallStack::NativeCallStack(int,+0> mov rcx, QWORD PTR [rip+0x842781] # 0x7ffff73256d8 >>>> 0x7ffff6ae2f57 <NativeCallStack::NativeCallStack(int,+0> add rcx, 0x10 >>>> → 0x7ffff6ae2f5b <NativeCallStack::NativeCallStack(int,+0> mov QWORD PTR [rdi], rcx >>>> 0x7ffff6ae2f5e <NativeCallStack::NativeCallStack(int,+0> mov DWORD PTR [rdi+0x28], 0x0 >>>> 0x7ffff6ae2f65 <NativeCallStack::NativeCallStack(int,+0> add rdi, 0x8 >>>> 0x7ffff6ae2f69 <NativeCallStack::NativeCallStack(int,+0> test edx, edx >>>> 0x7ffff6ae2f6b <NativeCallStack::NativeCallStack(int,+0> je 0x7ffff6ae2f7b <NativeCallStack::NativeCallStack(int, bool)+43> >>>> 0x7ffff6ae2f6d <NativeCallStack::NativeCallStack(int,+0> mov eax, esi >>>> ─────────[ source:/home/xiangzhai/project/jdk8u-llvm/hotspot/src/share/vm/utilities/nativeCallStack.cpp+33 ]──── >>>> 28 #include "utilities/nativeCallStack.hpp" >>>> 29 >>>> 30 const NativeCallStack NativeCallStack::EMPTY_STACK(0, false); >>>> 31 >>>> 32 NativeCallStack::NativeCallStack(int toSkip, bool fillStack) : >>>> → 33 _hash_value(0) { >>>> 34 >>>> 35 #if !PLATFORM_NATIVE_STACK_WALKING_SUPPORTED >>>> 36 fillStack = false; >>>> 37 #endif >>>> 38 >>>> ─────────────────────────────────────────────────────────────────────────────────────────────────[ threads ]──── >>>> [#0] Id 1, Name: "java", stopped, reason: SIGSEGV >>>> ───────────────────────────────────────────────────────────────────────────────────────────────────[ trace ]──── >>>> [#0] 0x7ffff6ae2f5b → Name: NativeCallStack::NativeCallStack(this=0x7ffff7315e70 <NativeCallStack::EMPTY_STACK>, toSkip=0x0, fillStack=0x0) >>>> [#1] 0x7ffff6a76822 → Name: MemTracker::init_tracking_level() >>>> [#2] 0x7ffff62eff49 → Name: MemTracker::tracking_level() >>>> [#3] 0x7ffff62eff49 → Name: ResourceObj::operator new(size=0x20, type=ResourceObj::STACK_OR_EMBEDDED, flags=<optimized out>) >>>> [#4] 0x7ffff61369ec → Name: _GLOBAL__sub_I_c1_Greedy.cpp() >>>> [#5] 0x7ffff7de7d9a → Name: call_init(l=<optimized out>, argc=0x2, argv=0x7fffffffdc88, env=0x7fffffffdca0) >>>> [#6] 0x7ffff7de7eab → Name: call_init(env=0x7fffffffdca0, argv=0x7fffffffdc88, argc=0x2, l=<optimized out>) >>>> [#7] 0x7ffff7de7eab → Name: _dl_init(main_map=0x602190, argc=0x2, argv=0x7fffffffdc88, env=0x7fffffffdca0) >>>> [#8] 0x7ffff7dece46 → Name: dl_open_worker(a=0x7fffffff97e0) >>>> [#9] 0x7ffff7de7c44 → Name: _dl_catch_error(objname=0x7fffffff97d0, errstring=0x7fffffff97d8, mallocedp=0x7fffffff97cf, operate=0x7ffff7decae0 <dl_open_worker>, args=0x7fffffff97e0) >>>> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────── >>>> 0x00007ffff6ae2f5b in NativeCallStack::NativeCallStack (this=0x7ffff7315e70 <NativeCallStack::EMPTY_STACK>, toSkip=0x0, fillStack=0x0) at /home/xiangzhai/project/jdk8u-llvm/hotspot/src/share/vm/utilities/nativeCallStack.cpp:33 >>>> 33 _hash_value(0) { >>>> gef➤ c >>>> Continuing. >>>> >>>> Program terminated with signal SIGSEGV, Segmentation fault. >>>> The program no longer exists. >>>> gef➤ >>>> >>>> ----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< --- >>>> >>>> I started to use and contribute clang static analyzer[2] just for finding the bugs for open source software from LLVM 3.x, perhaps it is a bug of LLVM 8, because jdk8u is just able to print out '-version' after compiled with llvm-3.9.1, I will rebuild the LLVM 8 again, then rebuild jdk8u for triple check. >>>> >>>> 1. Workaround-compile-with-llvm.patch https://raw.githubusercontent.com/xiangzhai/jdk8u-dev/master/Workaround-compile-with-llvm.patch >>>> >>>> 2. https://github.com/llvm-mirror/clang/commit/a530e823ed2793ac149de7a984014e242a787682#diff-ff9160d4628cb9b6186559837c2c8668 >>>> >>>> 3. The build option of LLVM 8 (bootstrap with LLVM 3.9.1): >>>> >>>> cmake .. -DCMAKE_BUILD_TYPE=Release \ >>>> -DCMAKE_C_COMPILER=clang \ >>>> -DCMAKE_CXX_COMPILER=clang++ \ >>>> -DCMAKE_C_FLAGS="-fPIC" \ >>>> -DCMAKE_CXX_FLAGS="-std=c++11 -fPIC" \ >>>> -DLLVM_BUILD_LLVM_DYLIB=ON \ >>>> -DLLVM_LINK_LLVM_DYLIB=ON \ >>>> -DLLVM_INSTALL_UTILS=ON \ >>>> -DLLVM_ENABLE_RTTI=ON \ >>>> -DLLVM_ENABLE_FFI=ON \ >>>> -DLLVM_ENABLE_EH=ON \ >>>> -DLLVM_BUILD_TESTS=ON \ >>>> -DLLVM_BUILD_DOCS=OFF \ >>>> -DLLVM_ENABLE_SPHINX=OFF \ >>>> -DLLVM_ENABLE_DOXYGEN=OFF \ >>>> -DLLDB_DISABLE_LIBEDIT=1 \ >>>> -DSPHINX_WARNINGS_AS_ERRORS=OFF \ >>>> -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ >>>> -DFFI_LIBRARY_DIR:PATH="$(pkg-config --variable=libdir libffi)" \ >>>> -DLLVM_BINUTILS_INCDIR=/usr/include \ >>>> -DLLVM_LIBDIR_SUFFIX=64 \ >>>> -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=ON \ >>>> -DLIBUNWIND_ENABLE_SHARED=ON \ >>>> -DLIBCXXABI_USE_LLVM_UNWINDER=ON \ >>>> -DLLDB_TEST_C_COMPILER=clang \ >>>> -DLLDB_TEST_CXX_COMPILER=clang++ \ >>>> -DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-redhat-linux" \ >>>> -DCLANG_VENDOR="LLVM China" >>>> >>>> 4. $ clang -v >>>> LLVM China clang version 8.0.0 (git at github.com:llvm-mirror/clang.git 81ef98628ebf5186d746c0986dcbf5073e842043) (git at github.com:llvm-mirror/llvm.git e1aac9723d55497e74d83d216329f08d9842e494) (based on LLVM 8.0.0svn) >>>> Target: x86_64-redhat-linux >>>> Thread model: posix >>>> InstalledDir: /usr/bin >>>> Found candidate GCC installation: /usr/bin/../lib/gcc/i686-redhat-linux/6.4.1 >>>> Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-redhat-linux/6.4.1 >>>> Found candidate GCC installation: /usr/lib/gcc/i686-redhat-linux/6.4.1 >>>> Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/6.4.1 >>>> Selected GCC installation: /usr/bin/../lib/gcc/x86_64-redhat-linux/6.4.1 >>>> Candidate multilib: .;@m64 >>>> Candidate multilib: 32;@m32 >>>> Selected multilib: .;@m64 >>>> >>>> -- >>>> Regards, >>>> Leslie Zhai >>>> >>>> >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> llvm-dev at lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> -- >> Regards, >> Leslie Zhai >> >>-- Regards, Leslie Zhai
Leslie Zhai via llvm-dev
2018-Sep-12 11:10 UTC
[llvm-dev] OpenJDK8 failed to work after compiled by LLVM 8 for X86
Reported https://bugs.llvm.org/show_bug.cgi?id=38911 Thanks, Leslie Zhai 在 2018年09月11日 16:55, Dimitry Andric 写道:> Hi Leslie, > > The problem really lies in the OpenJDK code, as it is attempting to > write to a const object. If this seems to work with certain compiler(s) > and optimization settings, it is just luck. :-) > > Here is a reduced example, which shows the issue: > > =====================================================================> #include <new> > > class NativeCallStack { > public: > static const NativeCallStack EMPTY_STACK; > > private: > enum { DEPTH = 4 }; > void* stack[DEPTH]; > > public: > NativeCallStack() { > for (int i = 0; i < DEPTH; ++i) { > stack[i] = nullptr; > } > } > }; > > const NativeCallStack NativeCallStack::EMPTY_STACK; > > int main(void) > { > // The following should segfault, if EMPTY_STACK was placed into .rodata. > ::new ((void*)&NativeCallStack::EMPTY_STACK) NativeCallStack(); > return 0; > } > =====================================================================> > clang 7.0.0 rc2 produces this assembly: > > .globl main # -- Begin function main > .p2align 4, 0x90 > .type main, at function > main: # @main > .cfi_startproc > # %bb.0: # %entry > pushq %rbp > .cfi_def_cfa_offset 16 > .cfi_offset %rbp, -16 > movq %rsp, %rbp > .cfi_def_cfa_register %rbp > xorps %xmm0, %xmm0 > movups %xmm0, NativeCallStack::EMPTY_STACK+16(%rip) > movups %xmm0, NativeCallStack::EMPTY_STACK(%rip) > xorl %eax, %eax > popq %rbp > .cfi_def_cfa %rsp, 8 > retq > .Lfunc_end0: > .size main, .Lfunc_end0-main > .cfi_endproc > # -- End function > .type NativeCallStack::EMPTY_STACK, at object # @NativeCallStack::EMPTY_STACK > .section .rodata,"a", at progbits > .globl NativeCallStack::EMPTY_STACK > .p2align 3 > NativeCallStack::EMPTY_STACK: > .zero 32 > .size NativeCallStack::EMPTY_STACK, 32 > > The whole constructor has been optimized out, and EMPTY_STACK has been > replaced by .zero 32, placed in the .rodata segment, which is a > perfectly valid transformation. > > Then, in main(), an attempt is made to write to that read-only segment, > which will usually segfault, depending on how strictly the underlying > operating system enforces these protections. > > In contrast, gcc 8.2.0 produces: > > .globl main > .type main, @function > main: > .LFB74: > .cfi_startproc > movq $0, NativeCallStack::EMPTY_STACK(%rip) > xorl %eax, %eax > movq $0, NativeCallStack::EMPTY_STACK+8(%rip) > movq $0, NativeCallStack::EMPTY_STACK+16(%rip) > movq $0, NativeCallStack::EMPTY_STACK+24(%rip) > ret > .cfi_endproc > .LFE74: > .size main, .-main > .p2align 4,,15 > .type _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE, @function > _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE: > .LFB76: > .cfi_startproc > movq $0, NativeCallStack::EMPTY_STACK(%rip) > movq $0, NativeCallStack::EMPTY_STACK+8(%rip) > movq $0, NativeCallStack::EMPTY_STACK+16(%rip) > movq $0, NativeCallStack::EMPTY_STACK+24(%rip) > ret > .cfi_endproc > .LFE76: > .size _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE, .-_GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE > .section .ctors,"aw", at progbits > .align 8 > .quad _GLOBAL__sub_I__ZN15NativeCallStack11EMPTY_STACKE > .globl NativeCallStack::EMPTY_STACK > .bss > .align 32 > .type NativeCallStack::EMPTY_STACK, @object > .size NativeCallStack::EMPTY_STACK, 32 > NativeCallStack::EMPTY_STACK: > .zero 32 > > Here you can see that gcc decided to not place EMPTY_STACK in .rodata, > but in .bss, which is read/write. It adds the global constructor to > the .ctors section, so the dynamic linker is made responsible for > calling it. > > Note that now the EMPTY_STACK object is unnecessarily initialized twice, > once by the global constructor, and once in main. > > -Dimitry > >> On 11 Sep 2018, at 03:38, Leslie Zhai <zhaixiang at loongson.cn> wrote: >> >> Hi Dimitry, >> >> Thanks for your kind response! >> >> Thanks for the commit message of Jung's patch, I found that the bug had been fixed in OpenJDK 12 by Zhengyu https://bugs.openjdk.java.net/browse/JDK-8205965 But only backported to 11. So Jung could backport it for OpenJDK 8, thanks a lot! >> >> But I argue that the root cause might be in the compiler side, why clang-3.9.1, gcc-6.4.1 couldn't reproduce the bug? And it might be work for clang-4.0 https://bugs.openjdk.java.net/browse/JDK-8208494 I will test LLVM 5 to check out whether or not reproducible. >> >> >> 在 2018年09月11日 00:59, Dimitry Andric 写道: >>> Hi Leslie, >>> >>> This is likely the same problem as was reported in https://bugs.freebsd.org/225054#c8, and fixed by the following patch: >>> >>> https://svnweb.freebsd.org/ports/head/java/openjdk8/files/patch-hotspot_src_share_vm_services_memTracker.cpp?view=markup&pathrev=459368 >>> >>> Can you please try that out, and see if it fixes it for you too? >>> >>> -Dimitry >>> >>>> On 10 Sep 2018, at 18:20, Leslie Zhai via llvm-dev <llvm-dev at lists.llvm.org> wrote: >>>> >>>> Hi all, >>>> >>>> OpenJDK8 jdk8u-dev[1] is just able to work after compiled with LLVM 3.9.1 for X86: >>>> >>>> $ ./build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/java -version >>>> openjdk version "1.8.0-internal-debug" >>>> OpenJDK Runtime Environment (build 1.8.0-internal-debug-xiangzhai_2018_09_09_21_08-b00) >>>> OpenJDK 64-Bit Server VM (build 25.71-b00-debug, mixed mode) >>>> >>>> $ strings ./build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/java | grep clang >>>> clang version 3.9.1 (tags/RELEASE_391/final) >>>> >>>> But it failed to work after compiled with LLVM 8 for X86: >>>> >>>> $ ./build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >>>> Segmentation fault >>>> >>>> $ gdb --ex run --args ./build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >>>> GNU gdb (GDB) Fedora 7.12.1-48.fc25 >>>> ... >>>> Starting program: /home/xiangzhai/project/jdk8u-llvm/build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin/java -version >>>> [Thread debugging using libthread_db enabled] >>>> Using host libthread_db library "/lib64/libthread_db.so.1". >>>> >>>> Program received signal SIGSEGV, Segmentation fault. >>>> [ Legend: Modified register | Code | Heap | Stack | String ] >>>> ───────────────────────────────────────────────────────────────────────────────────────────────[ registers ]──── >>>> $rax : 0x0 >>>> $rbx : 0x0 >>>> $rcx : 0x7ffff7315eb0 → 0x00007ffff6ae30a0 → <NativeCallStack::print_on(outputStream*)+0> xor edx, edx >>>> $rdx : 0x0 >>>> $rsp : 0x7fffffff9328 → 0x00007ffff6a76822 → <MemTracker::init_tracking_level()+178> mov edi, ebx >>>> $rbp : 0x7fffffff93c0 → 0x00007fffffff94f0 → 0x00007fffffff9510 → 0x0000000000000002 >>>> $rsi : 0x0 >>>> $rdi : 0x7ffff7315e70 → 0x00007ffff7315eb0 → 0x00007ffff6ae30a0 → <NativeCallStack::print_on(outputStream*)+0> xor edx, edx >>>> $rip : 0x7ffff6ae2f5b → <NativeCallStack::NativeCallStack(int,+0> mov QWORD PTR [rdi], rcx >>>> $r8 : 0x1 >>>> $r9 : 0xf >>>> $r10 : 0x64 >>>> $r11 : 0x0 >>>> $r12 : 0x7fffffffdc88 → 0x00007fffffffe04c → "/home/xiangzhai/project/jdk8u-llvm/build/linux-x86[...]" >>>> $r13 : 0x7fffffffdca0 → 0x00007fffffffe0bf → "XDG_VTNR=1" >>>> $r14 : 0x7fffffff9330 → "NMT_LEVEL_10535" >>>> $r15 : 0x6 >>>> $eflags: [carry parity adjust zero sign trap INTERRUPT direction overflow RESUME virtualx86 identification] >>>> $ss: 0x002b $ds: 0x0000 $cs: 0x0033 $es: 0x0000 $gs: 0x0000 $fs: 0x0000 >>>> ───────────────────────────────────────────────────────────────────────────────────────────────────[ stack ]──── >>>> 0x00007fffffff9328│+0x00: 0x00007ffff6a76822 → <MemTracker::init_tracking_level()+178> mov edi, ebx ← $rsp >>>> 0x00007fffffff9330│+0x08: "NMT_LEVEL_10535" ← $r14 >>>> 0x00007fffffff9338│+0x10: 0x0035333530315f4c ("L_10535"?) >>>> 0x00007fffffff9340│+0x18: 0x0000000000000001 >>>> 0x00007fffffff9348│+0x20: 0x0000000000602190 → 0x00007ffff5eb7000 → 0x00010102464c457f >>>> 0x00007fffffff9350│+0x28: 0x0000000000000004 >>>> 0x00007fffffff9358│+0x30: 0x000000066474e551 >>>> 0x00007fffffff9360│+0x38: 0x0000000000000000 >>>> ────────────────────────────────────────────────────────────────────────────────────────[ code:i386:x86-64 ]──── >>>> 0x7ffff6ae2f4b <print_owned_locks_on_error(outputStream*)+187> add eax, 0x1f0f00 >>>> 0x7ffff6ae2f50 <NativeCallStack::NativeCallStack(int,+0> mov rcx, QWORD PTR [rip+0x842781] # 0x7ffff73256d8 >>>> 0x7ffff6ae2f57 <NativeCallStack::NativeCallStack(int,+0> add rcx, 0x10 >>>> → 0x7ffff6ae2f5b <NativeCallStack::NativeCallStack(int,+0> mov QWORD PTR [rdi], rcx >>>> 0x7ffff6ae2f5e <NativeCallStack::NativeCallStack(int,+0> mov DWORD PTR [rdi+0x28], 0x0 >>>> 0x7ffff6ae2f65 <NativeCallStack::NativeCallStack(int,+0> add rdi, 0x8 >>>> 0x7ffff6ae2f69 <NativeCallStack::NativeCallStack(int,+0> test edx, edx >>>> 0x7ffff6ae2f6b <NativeCallStack::NativeCallStack(int,+0> je 0x7ffff6ae2f7b <NativeCallStack::NativeCallStack(int, bool)+43> >>>> 0x7ffff6ae2f6d <NativeCallStack::NativeCallStack(int,+0> mov eax, esi >>>> ─────────[ source:/home/xiangzhai/project/jdk8u-llvm/hotspot/src/share/vm/utilities/nativeCallStack.cpp+33 ]──── >>>> 28 #include "utilities/nativeCallStack.hpp" >>>> 29 >>>> 30 const NativeCallStack NativeCallStack::EMPTY_STACK(0, false); >>>> 31 >>>> 32 NativeCallStack::NativeCallStack(int toSkip, bool fillStack) : >>>> → 33 _hash_value(0) { >>>> 34 >>>> 35 #if !PLATFORM_NATIVE_STACK_WALKING_SUPPORTED >>>> 36 fillStack = false; >>>> 37 #endif >>>> 38 >>>> ─────────────────────────────────────────────────────────────────────────────────────────────────[ threads ]──── >>>> [#0] Id 1, Name: "java", stopped, reason: SIGSEGV >>>> ───────────────────────────────────────────────────────────────────────────────────────────────────[ trace ]──── >>>> [#0] 0x7ffff6ae2f5b → Name: NativeCallStack::NativeCallStack(this=0x7ffff7315e70 <NativeCallStack::EMPTY_STACK>, toSkip=0x0, fillStack=0x0) >>>> [#1] 0x7ffff6a76822 → Name: MemTracker::init_tracking_level() >>>> [#2] 0x7ffff62eff49 → Name: MemTracker::tracking_level() >>>> [#3] 0x7ffff62eff49 → Name: ResourceObj::operator new(size=0x20, type=ResourceObj::STACK_OR_EMBEDDED, flags=<optimized out>) >>>> [#4] 0x7ffff61369ec → Name: _GLOBAL__sub_I_c1_Greedy.cpp() >>>> [#5] 0x7ffff7de7d9a → Name: call_init(l=<optimized out>, argc=0x2, argv=0x7fffffffdc88, env=0x7fffffffdca0) >>>> [#6] 0x7ffff7de7eab → Name: call_init(env=0x7fffffffdca0, argv=0x7fffffffdc88, argc=0x2, l=<optimized out>) >>>> [#7] 0x7ffff7de7eab → Name: _dl_init(main_map=0x602190, argc=0x2, argv=0x7fffffffdc88, env=0x7fffffffdca0) >>>> [#8] 0x7ffff7dece46 → Name: dl_open_worker(a=0x7fffffff97e0) >>>> [#9] 0x7ffff7de7c44 → Name: _dl_catch_error(objname=0x7fffffff97d0, errstring=0x7fffffff97d8, mallocedp=0x7fffffff97cf, operate=0x7ffff7decae0 <dl_open_worker>, args=0x7fffffff97e0) >>>> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────── >>>> 0x00007ffff6ae2f5b in NativeCallStack::NativeCallStack (this=0x7ffff7315e70 <NativeCallStack::EMPTY_STACK>, toSkip=0x0, fillStack=0x0) at /home/xiangzhai/project/jdk8u-llvm/hotspot/src/share/vm/utilities/nativeCallStack.cpp:33 >>>> 33 _hash_value(0) { >>>> gef➤ c >>>> Continuing. >>>> >>>> Program terminated with signal SIGSEGV, Segmentation fault. >>>> The program no longer exists. >>>> gef➤ >>>> >>>> ----- 8< -------- 8< -------- 8< -------- 8< -------- 8< -------- 8< --- >>>> >>>> I started to use and contribute clang static analyzer[2] just for finding the bugs for open source software from LLVM 3.x, perhaps it is a bug of LLVM 8, because jdk8u is just able to print out '-version' after compiled with llvm-3.9.1, I will rebuild the LLVM 8 again, then rebuild jdk8u for triple check. >>>> >>>> 1. Workaround-compile-with-llvm.patch https://raw.githubusercontent.com/xiangzhai/jdk8u-dev/master/Workaround-compile-with-llvm.patch >>>> >>>> 2. https://github.com/llvm-mirror/clang/commit/a530e823ed2793ac149de7a984014e242a787682#diff-ff9160d4628cb9b6186559837c2c8668 >>>> >>>> 3. The build option of LLVM 8 (bootstrap with LLVM 3.9.1): >>>> >>>> cmake .. -DCMAKE_BUILD_TYPE=Release \ >>>> -DCMAKE_C_COMPILER=clang \ >>>> -DCMAKE_CXX_COMPILER=clang++ \ >>>> -DCMAKE_C_FLAGS="-fPIC" \ >>>> -DCMAKE_CXX_FLAGS="-std=c++11 -fPIC" \ >>>> -DLLVM_BUILD_LLVM_DYLIB=ON \ >>>> -DLLVM_LINK_LLVM_DYLIB=ON \ >>>> -DLLVM_INSTALL_UTILS=ON \ >>>> -DLLVM_ENABLE_RTTI=ON \ >>>> -DLLVM_ENABLE_FFI=ON \ >>>> -DLLVM_ENABLE_EH=ON \ >>>> -DLLVM_BUILD_TESTS=ON \ >>>> -DLLVM_BUILD_DOCS=OFF \ >>>> -DLLVM_ENABLE_SPHINX=OFF \ >>>> -DLLVM_ENABLE_DOXYGEN=OFF \ >>>> -DLLDB_DISABLE_LIBEDIT=1 \ >>>> -DSPHINX_WARNINGS_AS_ERRORS=OFF \ >>>> -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ >>>> -DFFI_LIBRARY_DIR:PATH="$(pkg-config --variable=libdir libffi)" \ >>>> -DLLVM_BINUTILS_INCDIR=/usr/include \ >>>> -DLLVM_LIBDIR_SUFFIX=64 \ >>>> -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=ON \ >>>> -DLIBUNWIND_ENABLE_SHARED=ON \ >>>> -DLIBCXXABI_USE_LLVM_UNWINDER=ON \ >>>> -DLLDB_TEST_C_COMPILER=clang \ >>>> -DLLDB_TEST_CXX_COMPILER=clang++ \ >>>> -DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-redhat-linux" \ >>>> -DCLANG_VENDOR="LLVM China" >>>> >>>> 4. $ clang -v >>>> LLVM China clang version 8.0.0 (git at github.com:llvm-mirror/clang.git 81ef98628ebf5186d746c0986dcbf5073e842043) (git at github.com:llvm-mirror/llvm.git e1aac9723d55497e74d83d216329f08d9842e494) (based on LLVM 8.0.0svn) >>>> Target: x86_64-redhat-linux >>>> Thread model: posix >>>> InstalledDir: /usr/bin >>>> Found candidate GCC installation: /usr/bin/../lib/gcc/i686-redhat-linux/6.4.1 >>>> Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-redhat-linux/6.4.1 >>>> Found candidate GCC installation: /usr/lib/gcc/i686-redhat-linux/6.4.1 >>>> Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/6.4.1 >>>> Selected GCC installation: /usr/bin/../lib/gcc/x86_64-redhat-linux/6.4.1 >>>> Candidate multilib: .;@m64 >>>> Candidate multilib: 32;@m32 >>>> Selected multilib: .;@m64 >>>> >>>> -- >>>> Regards, >>>> Leslie Zhai >>>> >>>> >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> llvm-dev at lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> -- >> Regards, >> Leslie Zhai >> >>