[squirrelfish] cti functions and emit_op_new_array

wingoog moon wingoog91 at gmail.com
Tue Apr 3 08:25:02 PDT 2012


I've tried to debug DEFINE_STUB_FUNCTION(JSObject*, op_new_array) function,
and here  what my disassemble showed when I tried to go up and see who
called this function.

Dump of assembler code from 0x7fffb5c98349 to 0x7fffb5c98389:

   0x00007fffb5c98349: add    %al,(%rax)

   0x00007fffb5c9834b: mov    %rax,0x0(%r13)

   0x00007fffb5c9834f: movl   $0x0,0x8(%rsp)

   0x00007fffb5c98357: movl   $0x1,0x10(%rsp)

   0x00007fffb5c9835f: mov    %rsp,%rdi

   0x00007fffb5c98362: mov    %r13,0x58(%rsp)

   0x00007fffb5c98367: movl   $0x5,-0x2c(%r13)

   0x00007fffb5c9836f: movabs $0xc60d60,%r11

   0x00007fffb5c98379: mov    %r13,(%r11)

   0x00007fffb5c9837c: movabs $0x5bfda6,%r11

   0x00007fffb5c98386: callq  *%r11

This code is generated by emit_op_new_array. Everything is
understandable except "movabs $0x5bfda6,%r11".
Let's look to the Call function in MacroAssemblerx86_64.h which generates
 call instruction.

Call call()
    {
        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0),
scratchRegister);
        Call result = Call(m_assembler.call(scratchRegister),
Call::Linkable);
        ASSERT_UNUSED(label, differenceBetween(label, result) ==
REPTACH_OFFSET_CALL_R11);
        return result;
    }

And here we move TrustedImmPtr(0) to scratchRegister(%r11).
So the question is how movabs $0x5bfda6,%r11 generated? Is it kind a magic
??))

Thanks!


On Sat, Mar 31, 2012 at 8:56 PM, Gavin Barraclough <barraclough at apple.com>wrote:

> On Mar 31, 2012, at 6:13 AM, wingoog moon <wingoog91 at gmail.com> wrote:
>
> > stubCall.call(currentInstruction[1].u.operand)  calls function
> DEFINE_STUB_FUNCTION(JSObject*, op_new_array) from JITStubs.cpp. And at
> this point execution of our JS programm is "interputing" and here C
> functions starting  to work to "create array".
>
> Just to be clear, this line of code does not directly call the cti helper
> stub, this is compiling JIT code, that when run will call the helper stub.
> Local variables & temporary values between operations are stored in the
> VM's register file, indexed by virtual register numbers. For the new_array
> opcode (and most opcodes) the virtual register indicating where to store
> the result in is stored in the bytecode instruction stream immediately
> after the opcode - and is being accessed here by the expression
> "currentInstruction[1].u.operand". The argument to the call method here is
> the virtual register number to store the result back to.
>
> G.
>
> Sent from my iPhone
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/squirrelfish-dev/attachments/20120403/6045fa3d/attachment.html>


More information about the squirrelfish-dev mailing list