Mercurial > pub > dyncall > dyncall
diff doc/disas_examples/x86.cdecl.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 | cb19b2fe2422 |
children | 585dcb68f55d |
line wrap: on
line diff
--- a/doc/disas_examples/x86.cdecl.disas Wed Mar 23 15:33:09 2022 +0100 +++ b/doc/disas_examples/x86.cdecl.disas Mon Apr 04 15:50:52 2022 +0200 @@ -715,5 +715,80 @@ +; ---------- 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 openbsd-4.0-x86 w/ gcc 3.3.5 (propolice) + +1c000920 <f1>: +1c000920: 55 push %ebp +1c000921: 89 e5 mov %esp,%ebp +1c000923: 83 ec 04 sub $0x4,%esp +1c000926: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp) +1c00092d: 8b 45 fc mov 0xfffffffc(%ebp),%eax +1c000930: c9 leave +1c000931: c3 ret + +1c000932 <_Z2f2v>: +1c000932: 55 push %ebp +1c000933: 89 e5 mov %esp,%ebp +1c000935: 53 push %ebx +1c000936: 83 ec 04 sub $0x4,%esp +1c000939: 8b 5d 08 mov 0x8(%ebp),%ebx +1c00093c: 83 ec 0c sub $0xc,%esp +1c00093f: 53 push %ebx +1c000940: e8 87 00 00 00 call 1c0009cc <_ZN10NonTrivialC1Ev> +1c000945: 83 c4 10 add $0x10,%esp +1c000948: 89 d8 mov %ebx,%eax +1c00094a: 8b 5d fc mov 0xfffffffc(%ebp),%ebx +1c00094d: c9 leave +1c00094e: c2 04 00 ret $0x4 +1c000951: 90 nop + +1c000952 <f>: +1c000952: 55 push %ebp ; +1c000953: 89 e5 mov %esp,%ebp ; +1c000955: 83 ec 28 sub $0x28,%esp ; +1c000958: c7 45 f4 01 00 00 00 movl $0x1,0xfffffff4(%ebp) ; a = 1 +1c00095f: 8d 45 f4 lea 0xfffffff4(%ebp),%eax ; | +1c000962: 83 00 7b addl $0x7b,(%eax) ; | a += 12 +1c000965: e8 b6 ff ff ff call 1c000920 <f1> ; call f1() +1c00096a: 89 45 f0 mov %eax,0xfffffff0(%ebp) ; +1c00096d: 8d 45 f4 lea 0xfffffff4(%ebp),%eax ; | +1c000970: 83 28 7b subl $0x7b,(%eax) ; | a -= 123 +1c000973: 8d 45 d8 lea 0xffffffd8(%ebp),%eax ; space (at top of stack) to hold non-triv retval -> eax +1c000976: 83 ec 0c sub $0xc,%esp ; grow stack by 12 +1c000979: 50 push %eax ; hidden first arg: ptr to space for retval +1c00097a: e8 b3 ff ff ff call 1c000932 <_Z2f2v> ; call f2() +1c00097f: 83 c4 0c add $0xc,%esp ; shrink stack back by 12 +1c000982: 8d 45 f4 lea 0xfffffff4(%ebp),%eax ; | +1c000985: 83 28 0c subl $0xc,(%eax) ; | a -= 12 +1c000988: c9 leave ; +1c000989: c3 ret ; + + + ; vim: ft=asm