Hi,
I am working with llvm 1.3 on a sparcv9 machine. I have successfully built
llvm and llvm-gcc frontend. I can run many tools including llvmgcc,
llvm-dis, and llc. After using /opt/SUNWspro/bin/cc to assemble .s file
into a program binary, I can run the binary correctly as well.
I am interested in the JIT compiler (lli). When I directly run the
LLVM bytecode using interpretation ("lli -force-interpreter=true test.bc),
it works fine. But if I use the JIT compiler ("lli
-force-interpreter=false test.bc"), I got a Segmentation Fault error,
even for a small program like helloworld.
If running with gdb, the error looks like
---------------------
(gdb) r test2.bc
Starting program: /a/athena/uf24/zhou/research/llvm/src/tools/Debug/lli
test2.bc
Program received signal SIGSEGV, Segmentation fault.
0xff18505c in _doprnt () from /usr/lib/libc.so.1
(gdb) bt
#0 0xff18505c in _doprnt () from /usr/lib/libc.so.1
#1 0xff1885fc in printf () from /usr/lib/libc.so.1
#2 0xfe07ffe4 in ?? ()
#3 0xfe07ffe4 in ?? ()
Previous frame identical to this frame (corrupt stack?)
---------------------
I think the error comes because there is a system call (printf) in the
test program. I wrote another small program which explicitly uses
three system calls (fopen, fwrite, and fclose). And I also got a
segmentation fault, as:
----------------------
(gdb) r test3.bc
Starting program: /a/athena/uf24/zhou/research/llvm/src/tools/Debug/lli
test3.bc
Program received signal SIGSEGV, Segmentation fault.
0xff370730 in memcpy () from
/usr/platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
(gdb) bt
#0 0xff370730 in memcpy ()
from /usr/platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
#1 0xfe07ffe4 in ?? ()
#2 0xfe07ffe4 in ?? ()
Previous frame identical to this frame (corrupt stack?)
----------------------
However, if the program doesn't do anything (i.e., an empty main()
function). The lli won't crash.
I traced lli using gdb, and found that it crashes within
JIT::runFunction(). In particular, the problem is in line 70 of JIT.cpp:
int ExitCode = PF(ArgValues[0].IntVal, (char **) GVTOP (ArgValues[1]),
(const char **) GVTOP (ArgValues[2]));
Is anybody having any idea about this? Thanks a lot.
Shukang Zhou