The cause details are below: 1. original C funtion: JSValueEncodedAsPointer* JITStubs::cti_op_mod(STUB_ARGS) { BEGIN_STUB_FUNCTION(); //causes seg fault
JSValuePtr dividendValue = ARG_src1; JSValuePtr divisorValue = ARG_src2; CallFrame* callFrame = ARG_callFrame; double d = dividendValue.toNumber(callFrame); JSValuePtr result = jsNumber(ARG_globalData, fmod(d, divisorValue.toNumber(callFrame))); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result); } 2. On X86: Dump of assembler code for function _ZN3JSC8JITStubs10cti_op_modEPvz: 0x08141b12 <_ZN3JSC8JITStubs10cti_op_modEPvz+0>: push %ebp 0x08141b13 <_ZN3JSC8JITStubs10cti_op_modEPvz+1>: mov %esp,%ebp 0x08141b15 <_ZN3JSC8JITStubs10cti_op_modEPvz+3>: push %esi 0x08141b16 <_ZN3JSC8JITStubs10cti_op_modEPvz+4>: push %ebx 0x08141b17 <_ZN3JSC8JITStubs10cti_op_modEPvz+5>: sub $0x70,%esp 0x08141b1a <_ZN3JSC8JITStubs10cti_op_modEPvz+8>: call 0x80577bc <__i686.get_pc_thunk.bx> //this system call is not exist in MIPS compiled code 0x08141b1f <_ZN3JSC8JITStubs10cti_op_modEPvz+13>: add $0xee049,%ebx 0x08141b25 <_ZN3JSC8JITStubs10cti_op_modEPvz+19>: lea 0xc(%ebp),%eax //1677 BEGIN_STUB_FUNCTION(); 0x08141b28 <_ZN3JSC8JITStubs10cti_op_modEPvz+22>: mov %eax,-0x1c(%ebp) 0x08141b2b <_ZN3JSC8JITStubs10cti_op_modEPvz+25>: mov -0x1c(%ebp),%eax 0x08141b2e <_ZN3JSC8JITStubs10cti_op_modEPvz+28>: sub $0x8,%eax 0x08141b31 <_ZN3JSC8JITStubs10cti_op_modEPvz+31>: mov %eax,0x4(%esp) 0x08141b35 <_ZN3JSC8JITStubs10cti_op_modEPvz+35>: lea -0x24(%ebp),%eax 0x08141b38 <_ZN3JSC8JITStubs10cti_op_modEPvz+38>: mov %eax,(%esp) 0x08141b3b <_ZN3JSC8JITStubs10cti_op_modEPvz+41>: call 0x8148e76 <StackHack> //242 ALWAYS_INLINE StackHack(void** location), MIPS disasm has no symbols at all 3. On MIPS Dump of assembler code for function _ZN3JSC8JITStubs10cti_op_modEPvz: 0x006abdb8 <_ZN3JSC8JITStubs10cti_op_modEPvz+0>: lui gp,0xf96 //this segment used on other routines and works 0x006abdbc <_ZN3JSC8JITStubs10cti_op_modEPvz+4>: addiu gp,gp,6776 0x006abdc0 <_ZN3JSC8JITStubs10cti_op_modEPvz+8>: addu gp,gp,t9 0x006abdc4 <_ZN3JSC8JITStubs10cti_op_modEPvz+12>: addiu sp,sp,-88 0x006abdc8 <_ZN3JSC8JITStubs10cti_op_modEPvz+16>: sw ra,80(sp) 0x006abdcc <_ZN3JSC8JITStubs10cti_op_modEPvz+20>: sw s8,76(sp) 0x006abdd0 <_ZN3JSC8JITStubs10cti_op_modEPvz+24>: sw s0,72(sp) 0x006abdd4 <_ZN3JSC8JITStubs10cti_op_modEPvz+28>: move s8,sp 0x006abdd8 <_ZN3JSC8JITStubs10cti_op_modEPvz+32>: sw gp,16(sp) 0x006abddc <_ZN3JSC8JITStubs10cti_op_modEPvz+36>: sw a1,92(s8) 0x006abde0 <_ZN3JSC8JITStubs10cti_op_modEPvz+40>: sw a2,96(s8) 0x006abde4 <_ZN3JSC8JITStubs10cti_op_modEPvz+44>: sw a3,100(s8) 0x006abde8 <_ZN3JSC8JITStubs10cti_op_modEPvz+48>: sw a0,88(s8) 0x006abdec <_ZN3JSC8JITStubs10cti_op_modEPvz+52>: addiu v0,s8,92 0x006abdf0 <_ZN3JSC8JITStubs10cti_op_modEPvz+56>: sw v0,24(s8) 0x006abdf4 <_ZN3JSC8JITStubs10cti_op_modEPvz+60>: addiu v1,s8,32 0x006abdf8 <_ZN3JSC8JITStubs10cti_op_modEPvz+64>: lw v0,24(s8) 0x006abdfc <_ZN3JSC8JITStubs10cti_op_modEPvz+68>: addiu v0,v0,-8 0x006abe00 <_ZN3JSC8JITStubs10cti_op_modEPvz+72>: move a0,v1 0x006abe04 <_ZN3JSC8JITStubs10cti_op_modEPvz+76>: move a1,v0 0x006abe08 <_ZN3JSC8JITStubs10cti_op_modEPvz+80>: lw t9,-19028(gp) //seg fault here, -19028(gp) not accesible 0x006abe0c <_ZN3JSC8JITStubs10cti_op_modEPvz+84>: jalr t9 ... no label in MIPS. <StackHack> label shown on X86 but on mips are all xxx(gp), may be compiler/gdb not as good as X86 version? thanks for look at it, joe --- On Wed, 4/22/09, x yz <last...@yahoo.com> wrote: > From: x yz <last...@yahoo.com> > Subject: Re: [webkit-dev] want to port JIT to MIPS - cti_op_mod(STUB_ARGS) > seg fault > To: "WebKit Development" <webkit-dev@lists.webkit.org>, "Gavin Barraclough" > <barraclo...@apple.com> > Date: Wednesday, April 22, 2009, 8:31 AM > I use MIPS32EL, VA_LIST call, MIPS pushes function argument > from left to right. I wrote a simple VA_LIST test it works > on my box. > > BEGIN_STUB_FUNCTION() cause seg fault due to MIPS uses gp > reg to read sth. > I treied to rewrite the code like that: > JSObject* JITStubs::cti_op_new_func_exp(STUB_ARGS) > { > va_list vl_args; > va_start(vl_args, args); > StackHack stackHack(&STUB_RETURN_ADDRESS_SLOT); > JSValuePtr dividendValue = va_arg(vl_args, JSC::JSCell* > ); > JSValuePtr divisorValue = va_arg(vl_args, JSC::JSCell* > ); > ... > } > > Still fail in stackHack(), if I comment out stackHack() > then fails at va_arg. > > gp is a global register for common/public variables, the > same usage before I call cti_op_mod() works fine. > > I also tried not use VA_LIST but REGISTER calling > convention, still fail: > (gdb) x/2i $at > 0x6ab500 > <_ZN3JSC8JITStubs10cti_op_modEPPv>: lui gp,0xf96 > 0x6ab504 > <_ZN3JSC8JITStubs10cti_op_modEPPv+4>: addiu gp,gp,9008 > (gdb) x/20i $at > 0x6ab500 > <_ZN3JSC8JITStubs10cti_op_modEPPv>: lui gp,0xf96 > 0x6ab504 > <_ZN3JSC8JITStubs10cti_op_modEPPv+4>: addiu gp,gp,9008 > 0x6ab508 > <_ZN3JSC8JITStubs10cti_op_modEPPv+8>: addu gp,gp,t9 > 0x6ab50c > <_ZN3JSC8JITStubs10cti_op_modEPPv+12>: addiu sp,sp,-80 > 0x6ab510 > <_ZN3JSC8JITStubs10cti_op_modEPPv+16>: sw ra,72(sp) > 0x6ab514 > <_ZN3JSC8JITStubs10cti_op_modEPPv+20>: sw s8,68(sp) > 0x6ab518 > <_ZN3JSC8JITStubs10cti_op_modEPPv+24>: sw s0,64(sp) > 0x6ab51c > <_ZN3JSC8JITStubs10cti_op_modEPPv+28>: move s8,sp > 0x6ab520 > <_ZN3JSC8JITStubs10cti_op_modEPPv+32>: sw gp,16(sp) > 0x6ab524 > <_ZN3JSC8JITStubs10cti_op_modEPPv+36>: sw a0,80(s8) > 0x6ab528 > <_ZN3JSC8JITStubs10cti_op_modEPPv+40>: lw v0,80(s8) > 0x6ab52c > <_ZN3JSC8JITStubs10cti_op_modEPPv+44>: addiu v0,v0,-4 > 0x6ab530 > <_ZN3JSC8JITStubs10cti_op_modEPPv+48>: addiu a0,s8,24 > 0x6ab534 > <_ZN3JSC8JITStubs10cti_op_modEPPv+52>: move a1,v0 > 0x6ab538 > <_ZN3JSC8JITStubs10cti_op_modEPPv+56>: lw t9,-19012(gp) > 0x6ab53c > <_ZN3JSC8JITStubs10cti_op_modEPPv+60>: jalr t9 > 0x6ab540 <_ZN3JSC8JITStubs10cti_op_modEPPv+64>: nop > 0x6ab544 > <_ZN3JSC8JITStubs10cti_op_modEPPv+68>: lw gp,16(s8) > 0x6ab548 > <_ZN3JSC8JITStubs10cti_op_modEPPv+72>: addiu v0,s8,32 > 0x6ab54c > <_ZN3JSC8JITStubs10cti_op_modEPPv+76>: lw v1,80(s8) > (gdb) stepi 14 > > Program received signal SIGSEGV, Segmentation fault. > 0x006ab538 in JSC::JITStubs::cti_op_mod (args=0x2aac9500) > at > /home/jdai/depot/mp/mediabase/head/libs/webkit-1.1.1/JavaScriptCore/jit/JITStubs.cpp:1685 > 1685 BEGIN_STUB_FUNCTION(); > > another question is that there is no matched va_end() and > it is a bug. > thanks a lot for help, > joe _______________________________________________ webkit-dev mailing list webkit-dev@lists.webkit.org http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev