Mercurial > pub > dyncall > dyncall
comparison 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 |
comparison
equal
deleted
inserted
replaced
498:fd9ba3a6d348 | 499:fc614cb865c6 |
---|---|
586 | 586 |
587 ; ... snip, removed code of ctor and copy ctor ... | 587 ; ... snip, removed code of ctor and copy ctor ... |
588 | 588 |
589 | 589 |
590 | 590 |
591 ; ---------- C++ trivial and non-trivial aggrs as return values ----------> | |
592 ; | |
593 ; struct Trivial { int a; }; | |
594 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; | |
595 ; | |
596 ; extern "C" { | |
597 ; struct Trivial f1() { return Trivial(); } | |
598 ; } | |
599 ; | |
600 ; struct NonTrivial f2() { return NonTrivial(); } | |
601 ; | |
602 ; extern "C" { | |
603 ; void f() | |
604 ; { | |
605 ; int a=1; | |
606 ; a += 123; | |
607 ; struct Trivial t = f1(); | |
608 ; a -= 123; | |
609 ; struct NonTrivial n = f2(); | |
610 ; a -= 12; | |
611 ; } | |
612 ; } | |
613 | |
614 | |
615 | |
616 ; output from freebsd-12.2-x64 w/ clang 10.0.1 | |
617 | |
618 00000000002019c0 <f1>: | |
619 2019c0: 55 push %rbp | |
620 2019c1: 48 89 e5 mov %rsp,%rbp | |
621 2019c4: 48 83 ec 10 sub $0x10,%rsp | |
622 2019c8: 31 f6 xor %esi,%esi | |
623 2019ca: 48 8d 45 f8 lea -0x8(%rbp),%rax | |
624 2019ce: 48 89 c7 mov %rax,%rdi | |
625 2019d1: ba 04 00 00 00 mov $0x4,%edx | |
626 2019d6: e8 75 01 00 00 callq 201b50 <memset@plt> | |
627 2019db: 8b 45 f8 mov -0x8(%rbp),%eax | |
628 2019de: 48 83 c4 10 add $0x10,%rsp | |
629 2019e2: 5d pop %rbp | |
630 2019e3: c3 retq | |
631 | |
632 00000000002019f0 <_Z2f2v>: | |
633 2019f0: 55 push %rbp | |
634 2019f1: 48 89 e5 mov %rsp,%rbp | |
635 2019f4: 48 83 ec 10 sub $0x10,%rsp | |
636 2019f8: 48 89 f8 mov %rdi,%rax | |
637 2019fb: 48 89 f9 mov %rdi,%rcx | |
638 2019fe: 48 89 4d f8 mov %rcx,-0x8(%rbp) | |
639 201a02: 48 89 45 f0 mov %rax,-0x10(%rbp) | |
640 201a06: e8 85 00 00 00 callq 201a90 <_ZN10NonTrivialC2Ev> | |
641 201a0b: 48 8b 45 f0 mov -0x10(%rbp),%rax | |
642 201a0f: 48 83 c4 10 add $0x10,%rsp | |
643 201a13: 5d pop %rbp | |
644 201a14: c3 retq | |
645 | |
646 0000000000201a20 <f>: | |
647 201a20: 55 push %rbp ; | | |
648 201a21: 48 89 e5 mov %rsp,%rbp ; | prolog | |
649 201a24: 48 83 ec 10 sub $0x10,%rsp ; | | |
650 201a28: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%rbp) ; a = 1 | |
651 201a2f: 8b 45 fc mov -0x4(%rbp),%eax ; | | |
652 201a32: 83 c0 7b add $0x7b,%eax ; | a += 123 | |
653 201a35: 89 45 fc mov %eax,-0x4(%rbp) ; | | |
654 201a38: e8 83 ff ff ff callq 2019c0 <f1> ; call f1() | |
655 201a3d: 89 45 f8 mov %eax,-0x8(%rbp) ; retval via reg, as small struct | |
656 201a40: 8b 45 fc mov -0x4(%rbp),%eax ; | | |
657 201a43: 83 e8 7b sub $0x7b,%eax ; | a -= 123 | |
658 201a46: 89 45 fc mov %eax,-0x4(%rbp) ; | | |
659 201a49: 48 8d 7d f0 lea -0x10(%rbp),%rdi ; ptr to space to hold non-triv retval | |
660 201a4d: e8 9e ff ff ff callq 2019f0 <_Z2f2v> ; call f2() | |
661 201a52: 8b 45 fc mov -0x4(%rbp),%eax ; | | |
662 201a55: 83 e8 0c sub $0xc,%eax ; | a-= 12 | |
663 201a58: 89 45 fc mov %eax,-0x4(%rbp) ; / | |
664 201a5b: 48 83 c4 10 add $0x10,%rsp ; \ | |
665 201a5f: 5d pop %rbp ; | epilog | |
666 201a60: c3 retq ; | | |
667 | |
668 | |
669 | |
591 ; vim: ft=asm | 670 ; vim: ft=asm |
592 | 671 |