GDC Explorer - an online disassembler for D

IntegratedDimensions IntegratedDimensions at gmail.com
Sun May 20 17:31:22 UTC 2018


On Friday, 21 September 2012 at 03:46:12 UTC, Andrei Alexandrescu 
wrote:
> I've met Matt Goldbolt, the author of the GCC Explorer at 
> http://gcc.godbolt.org - a very handy online disassembler for 
> GCC.
>
> We got to talk a bit about D and he hacked together support for 
> D by using gdc. Take a look at http://d.godbolt.org, I think 
> it's pretty darn cool! I'm talking to him about integrating his 
> work with our servers.
>
>
> Andrei

Compare a simple C++ to D and the C++ output is far better:

class C
{
     int x = 12;
     public:
         int foo(int y) { return y*x; }
};

int main()
{
    C* c = new C();
    return c->foo(2);
}



VS




class C
{
     int x = 12;
     public:
         int foo(int y) { return y*x; }
};

int main()
{
    C c = new C();
    return c.foo(2);
}








operator new(unsigned long)@plt:
  jmp    QWORD PTR [rip+0x200baa]        # 601020 <operator 
new(unsigned long)@GLIBCXX_3.4>
  push   0x1
  jmp    400450 <.plt>
main:
  push   rbp
  mov    rbp,rsp
  push   rbx
  sub    rsp,0x18
  mov    edi,0x4
  call   400470 <operator new(unsigned long)@plt>
  mov    rbx,rax
  mov    DWORD PTR [rbx],0x0
  mov    rdi,rbx
  call   4005bc <C::C()>
  mov    QWORD PTR [rbp-0x18],rbx
  mov    rax,QWORD PTR [rbp-0x18]
  mov    esi,0x2
  mov    rdi,rax
  call   4005a4 <C::foo(int)>
  nop
  add    rsp,0x18
  pop    rbx
  pop    rbp
  ret
  nop
C::foo(int):
  push   rbp
  mov    rbp,rsp
  mov    QWORD PTR [rbp-0x8],rdi
  mov    DWORD PTR [rbp-0xc],esi
  mov    rax,QWORD PTR [rbp-0x8]
  mov    eax,DWORD PTR [rax]
  imul   eax,DWORD PTR [rbp-0xc]
  pop    rbp
  ret
  nop
C::C():
  push   rbp
  mov    rbp,rsp
  mov    QWORD PTR [rbp-0x8],rdi
  mov    rax,QWORD PTR [rbp-0x8]
  mov    DWORD PTR [rax],0xc
  nop
  pop    rbp
  ret
  nop    WORD PTR cs:[rax+rax*1+0x0]
  nop    DWORD PTR [rax+rax*1+0x0]




VS










_Dmain:
  push   rbp
  mov    rbp,rsp
  sub    rsp,0x10
  mov    rdi,QWORD PTR [rip+0x0]        # f <_Dmain+0xf>
  call   14 <_Dmain+0x14>
  mov    QWORD PTR [rbp-0x8],rax
  mov    esi,0x2
  mov    rdi,rax
  mov    rax,QWORD PTR [rax]
  rex.W call QWORD PTR [rax+0x28]
  leave
  ret
  add    BYTE PTR [rax],al
main:
  push   rbp
  mov    rbp,rsp
  sub    rsp,0x10
  mov    DWORD PTR [rbp-0x10],edi
  mov    QWORD PTR [rbp-0x8],rsi
  mov    rdx,QWORD PTR [rip+0x0]        # 16 <main+0x16>
  mov    rsi,QWORD PTR [rbp-0x8]
  mov    edi,DWORD PTR [rbp-0x10]
  call   22 <main+0x22>
  leave
  ret
.text.d_dso_init:
  push   rbp
  mov    rbp,rsp
  lea    rax,[rip+0x0]        # b <.text.d_dso_init+0xb>
  push   rax
  lea    rax,[rip+0x0]        # 13 <.text.d_dso_init+0x13>
  push   rax
  lea    rax,[rip+0x0]        # 1b <.text.d_dso_init+0x1b>
  push   rax
  push   0x1
  mov    rdi,rsp
  call   26 <.text.d_dso_init+0x26>
  leave
  ret


the C++ version is more verbose, gives explicit references to 
functions and methods while the D version requires you to hunt 
and peck.



More information about the Digitalmars-d mailing list