Mercurial > pub > dyncall > dyncall
diff doc/disas_examples/x64.sysv.disas @ 499:fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
author | Tassilo Philipp |
---|---|
date | Mon, 04 Apr 2022 15:50:52 +0200 |
parents | 75cb8f79d725 |
children | f1810b5dbb3b |
line wrap: on
line diff
--- a/doc/disas_examples/x64.sysv.disas Wed Mar 23 15:33:09 2022 +0100 +++ b/doc/disas_examples/x64.sysv.disas Mon Apr 04 15:50:52 2022 +0200 @@ -588,5 +588,84 @@ +; ---------- C++ trivial and non-trivial aggrs as return values ----------> +; +; struct Trivial { int a; }; +; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; +; +; extern "C" { +; struct Trivial f1() { return Trivial(); } +; } +; +; struct NonTrivial f2() { return NonTrivial(); } +; +; extern "C" { +; void f() +; { +; int a=1; +; a += 123; +; struct Trivial t = f1(); +; a -= 123; +; struct NonTrivial n = f2(); +; a -= 12; +; } +; } + + + +; output from freebsd-12.2-x64 w/ clang 10.0.1 + +00000000002019c0 <f1>: + 2019c0: 55 push %rbp + 2019c1: 48 89 e5 mov %rsp,%rbp + 2019c4: 48 83 ec 10 sub $0x10,%rsp + 2019c8: 31 f6 xor %esi,%esi + 2019ca: 48 8d 45 f8 lea -0x8(%rbp),%rax + 2019ce: 48 89 c7 mov %rax,%rdi + 2019d1: ba 04 00 00 00 mov $0x4,%edx + 2019d6: e8 75 01 00 00 callq 201b50 <memset@plt> + 2019db: 8b 45 f8 mov -0x8(%rbp),%eax + 2019de: 48 83 c4 10 add $0x10,%rsp + 2019e2: 5d pop %rbp + 2019e3: c3 retq + +00000000002019f0 <_Z2f2v>: + 2019f0: 55 push %rbp + 2019f1: 48 89 e5 mov %rsp,%rbp + 2019f4: 48 83 ec 10 sub $0x10,%rsp + 2019f8: 48 89 f8 mov %rdi,%rax + 2019fb: 48 89 f9 mov %rdi,%rcx + 2019fe: 48 89 4d f8 mov %rcx,-0x8(%rbp) + 201a02: 48 89 45 f0 mov %rax,-0x10(%rbp) + 201a06: e8 85 00 00 00 callq 201a90 <_ZN10NonTrivialC2Ev> + 201a0b: 48 8b 45 f0 mov -0x10(%rbp),%rax + 201a0f: 48 83 c4 10 add $0x10,%rsp + 201a13: 5d pop %rbp + 201a14: c3 retq + +0000000000201a20 <f>: + 201a20: 55 push %rbp ; | + 201a21: 48 89 e5 mov %rsp,%rbp ; | prolog + 201a24: 48 83 ec 10 sub $0x10,%rsp ; | + 201a28: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%rbp) ; a = 1 + 201a2f: 8b 45 fc mov -0x4(%rbp),%eax ; | + 201a32: 83 c0 7b add $0x7b,%eax ; | a += 123 + 201a35: 89 45 fc mov %eax,-0x4(%rbp) ; | + 201a38: e8 83 ff ff ff callq 2019c0 <f1> ; call f1() + 201a3d: 89 45 f8 mov %eax,-0x8(%rbp) ; retval via reg, as small struct + 201a40: 8b 45 fc mov -0x4(%rbp),%eax ; | + 201a43: 83 e8 7b sub $0x7b,%eax ; | a -= 123 + 201a46: 89 45 fc mov %eax,-0x4(%rbp) ; | + 201a49: 48 8d 7d f0 lea -0x10(%rbp),%rdi ; ptr to space to hold non-triv retval + 201a4d: e8 9e ff ff ff callq 2019f0 <_Z2f2v> ; call f2() + 201a52: 8b 45 fc mov -0x4(%rbp),%eax ; | + 201a55: 83 e8 0c sub $0xc,%eax ; | a-= 12 + 201a58: 89 45 fc mov %eax,-0x4(%rbp) ; / + 201a5b: 48 83 c4 10 add $0x10,%rsp ; \ + 201a5f: 5d pop %rbp ; | epilog + 201a60: c3 retq ; | + + + ; vim: ft=asm