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