On 11/23/2015 10:32 AM, David Nadlinger wrote:
This is how the function looks in LDC (on OS X, but the libunwind "client"-side
code is very similar):

---
0000000100000a40 <__D5test24foo1FZv>:
    100000a40:   53                      push   rbx
    100000a41:   e8 ca fe ff ff          call   100000910 <__D4test3abcFZv>
    100000a46:   e8 d5 fe ff ff          call   100000920 <__D4test3defFZv>
    100000a4b:   5b                      pop    rbx
    100000a4c:   e9 ef fe ff ff          jmp    100000940 <__D4test3jklFZv>
    100000a51:   48 89 c3                mov    rbx,rax
    100000a54:   83 fa 03                cmp    edx,0x3
    100000a57:   74 05                   je     100000a5e 
<__D5test24foo1FZv+0x1e>
    100000a59:   83 fa 02                cmp    edx,0x2
    100000a5c:   75 0f                   jne    100000a6d 
<__D5test24foo1FZv+0x2d>
    100000a5e:   e8 5d ff 00 00          call   1000109c0 <__d_eh_enter_catch>
    100000a63:   48 8b 3b                mov    rdi,QWORD PTR [rbx]
    100000a66:   e8 c5 fe ff ff          call   100000930
<__D4test3ghiFC4test2CCZv>
    100000a6b:   eb de                   jmp    100000a4b 
<__D5test24foo1FZv+0xb>
    100000a6d:   83 fa 01                cmp    edx,0x1
    100000a70:   75 10                   jne    100000a82 
<__D5test24foo1FZv+0x42>
    100000a72:   e8 49 ff 00 00          call   1000109c0 <__d_eh_enter_catch>
    100000a77:   e8 d4 fe ff ff          call   100000950 <__D4test3mnoFZv>
    100000a7c:   5b                      pop    rbx
    100000a7d:   e9 be fe ff ff          jmp    100000940 <__D4test3jklFZv>
    100000a82:   48 89 df                mov    rdi,rbx
    100000a85:   e8 16 ff 00 00          call   1000109a0 <__d_eh_resume_unwind>
---

The code looks quite good. I've been trying to adjust things, however, so there are no pushes and pops in the code, trying to preallocate everything needed in the function prolog.


And why is there a 'default' call to _Unwind_Resume if RDX isn't an expected
value? Shouldn't the personality routine simply not jump to the landing pad if
none of the catch types are satisfied?

The reason LDC emits the __d_eh_resume_unwind call all the time is because it is
needed as soon as there is a cleanup involved anyway, and so far I was just too
lazy to optimize the extra branch away in the special case that there are no
cleanups.

dmd rewrites try-catch-finally into try-{try-catch}-finally, which makes it easier to generate code, because fewer special cases and fewer bugs. I've become a big fan of that technique :-)

Reply via email to