Dwarf Exception Handling question

David Nadlinger via Digitalmars-d digitalmars-d at puremagic.com
Mon Nov 23 10:32:20 PST 2015


On Monday, 23 November 2015 at 17:31:51 UTC, Walter Bright wrote:
> The calls to _d_dynamic cast appear to be redundant - shouldn't 
> the value in RDX be sufficient?

This is indeed the case, but of course you need to know in which 
order the compiler backend wrote the type info entries to the 
tables. Maybe at the time there didn't exist an intrinsic for 
that in GDC or something like that.

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

> 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.

  — David


More information about the Digitalmars-d mailing list