https://issues.dlang.org/show_bug.cgi?id=22170

--- Comment #1 from Iain Buclaw <[email protected]> ---
It looks like what DMD is doing is loading the GOT into EBX before every
function call.

i.e: Abridged version of objdump
---
push   %ebp
mov    %esp,%ebp
sub    $0x28,%esp
mov    %ebx,-0x28(%ebp)
mov    %esi,-0x24(%ebp)

mov    -0x1c(%ebp),%ebx
call   147c8 <_D5mydll10multiply10FiZi@plt>
mov    -0x1c(%ebp),%ebx
call   *%esi
mov    -0x1c(%ebp),%ebx
call   145b0 <_D5mydll1S3addMFiZi@plt>
mov    -0x1c(%ebp),%ebx
call   145b0 <_D5mydll1S3addMFiZi@plt>
mov    -0x1c(%ebp),%ebx
call   14560 <_D5mydll1I6createFZCQs1C@plt>
mov    -0x1c(%ebp),%ebx
mov    (%eax),%ecx
call   *0x4(%ecx)

xor    %eax,%eax
mov    -0x28(%ebp),%ebx
mov    -0x24(%ebp),%esi
leave
ret
---

Surely it'd be more efficient to load GOT in the prologue, then restore the
previous in the epilogue.

i.e: The above rewritten:
---
push   %ebp
mov    %esp,%ebp
sub    $0x28,%esp
mov    %ebx,-0x28(%ebp) # <- looks like a save (better push %ebx?)
mov    %esi,-0x24(%ebp)
mov    -0x1c(%ebp),%ebx # <- Added load GOT here

call   147c8 <_D5mydll10multiply10FiZi@plt>
call   *%esi
call   145b0 <_D5mydll1S3addMFiZi@plt>
call   145b0 <_D5mydll1S3addMFiZi@plt>
call   14560 <_D5mydll1I6createFZCQs1C@plt>
mov    (%eax),%ecx
call   *0x4(%ecx)

xor    %eax,%eax
mov    -0x28(%ebp),%ebx # <- looks like a restore (better pop %ebx?)
mov    -0x24(%ebp),%esi
leave
ret
---

So it seems that the save/restore is already being done for normal functions,
but this isn't being done for thunks.

--

Reply via email to