I’m trying to generate code using the dl_* functions in DMD. The corresponding 
D code would be the following:

struct TLS
{
    int* function (TLS*) thunk;
    size_t key;
    size_t offset;
}

extern (C) __gshared TLS bar;

extern (C) int main (int i, char**)
{
    auto foo = *bar.thunk(&bar);

    return 0;
}

The code that DMD is generating, for the above “main” functions, is:

pushq   %rbp
movq    %rsp, %rbp
movq    _bar(%rip), %rdi
movq    %rdi, %rax
callq           *_main(%rax)
movl    _main(%rax), %ecx
xorl            %eax, %eax
popq    %rbp
retq

What I’ve got so far is the following code below, instead of [1]:

switch (op * 2 + x)
{
    case OPvar * 2 + 1:
        e = el_una(OPind, TYnptr, e);
        e = el_una(OPind, TYnptr, e);
        break;
    case OPvar * 2 + 0:
    case OPrelconst * 2 + 1:
        e = el_una(OPind, TYnptr, e);
        break;
    case OPrelconst * 2 + 0:
        break;
    default:
        assert(0);
        break;
}

e = el_una(OPaddr, TYnptr, e);
e = doptelem(e, GOALvalue | GOALflags);
e = el_una(OPind, TYnptr, e);
e = el_bin(OPcallns, TYnptr, e, e);
e = el_una(OPind, TYnptr, e);

With the above code DMD and for this example:

extern (C) int main (int i, char**)
{
    auto foo = bar;
    return 0;
}

DMD generates the following:

pushq   %rbp
movq    %rsp, %rbp
movq    _bar(%rip), %rax
movq    _main(%rax), %rdi
callq           *_bar(%rip)
movl    _main(%rax), %ecx
xorl            %eax, %eax
popq    %rbp
retq

Basically I have no idea what I’m doing and I don’t really understand how these 
el_* functions are working. Anyone could give me some help with this?

[1] 
https://github.com/D-Programming-Language/dmd/blob/master/src/backend/el.c#L1259-L1263

-- 
/Jacob Carlborg


_______________________________________________
dmd-internals mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/dmd-internals

Reply via email to