Dwarf Exception Handling question

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Mon Nov 23 09:31:55 PST 2015


I'm struggling to understand dwarf EH, and figure it's a good idea to try and 
make it binary compatible with what gdc does, or at least not gratuitously 
different. If I use gdc to compile this:

void foo1() {
         abc();
         try {
                 def();
         }
         catch(DD t) {
                 ghi(t);
         }
         catch(CC t) {
                 ghi(t);
         }
         catch {
                 mno();
         }
         jkl();
}

the code generated looks like this:

_D3eh54foo1FZv:
                 push    RBP
                 mov     RBP,RSP
                 sub     RSP,010h
                 call      abc
                 call      def
L12:            call      jkl
                 jmp short       L86
                 cmp     RDX,2
                 je      L59
                 cmp     RDX,3
                 je      L7F
                 cmp     RDX,1
                 je      L33
                 mov     RDI,RAX
                 call    _Unwind_Resume
L33:            sub     RAX,8
                 mov     RAX,[RAX]
                 mov     ESI,offset _D3eh52DD7__ClassZ
                 mov     RDI,RAX
                 call    _d_dynamic_cast
                 mov     -8[RBP],RAX
                 mov     RAX,-8[RBP]
                 mov     RDI,RAX
                 call      ghi
                 jmp short       L12
L59:            sub     RAX,8
                 mov     RAX,[RAX]
                 mov     ESI,offset _D3eh52CC7__ClassZ
                 mov     RDI,RAX
                 call    _d_dynamic_cast
                 mov     -010h[RBP],RAX
                 mov     RAX,-010h[RBP]
                 mov     RDI,RAX
                 call      ghi
                 jmp short       L12
L7F:            call      mno
                 jmp short       L12
L86:            leave
                 ret

The calls to _d_dynamic cast appear to be redundant - shouldn't the value in RDX 
be sufficient? 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?


More information about the Digitalmars-d mailing list