Dwarf Exception Handling question

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Mon Nov 23 13:05:33 PST 2015


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 :-)



More information about the Digitalmars-d mailing list