Mercurial > pub > dyncall > dyncall
comparison doc/disas_examples/ppc64.elfabi.disas @ 497:cb19b2fe2422
- more disas examples to check behaviour of passing C++ non-trivial aggregates by value; they all behave the same, calling the copy ctor first, passing a pointer then
author | Tassilo Philipp |
---|---|
date | Wed, 23 Mar 2022 15:24:31 +0100 |
parents | ead041d93e36 |
children | fc614cb865c6 |
comparison
equal
deleted
inserted
replaced
496:da5232da6270 | 497:cb19b2fe2422 |
---|---|
732 f0: 00 00 00 01 .long 0x1 | 732 f0: 00 00 00 01 .long 0x1 |
733 f4: 80 01 00 01 lwz r0,1(r1) | 733 f4: 80 01 00 01 lwz r0,1(r1) |
734 | 734 |
735 | 735 |
736 | 736 |
737 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ----------> | |
738 ; | |
739 ; struct Trivial { int a; }; | |
740 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; | |
741 ; | |
742 ; extern "C" { | |
743 ; | |
744 ; void f1(struct Trivial s) { } | |
745 ; void f2(struct NonTrivial s) { } | |
746 ; | |
747 ; void f() | |
748 ; { | |
749 ; struct Trivial t; | |
750 ; struct NonTrivial n; | |
751 ; int a=1; | |
752 ; a += 123; | |
753 ; f1(t); | |
754 ; a -= 123; | |
755 ; f2(n); | |
756 ; a -= 12; | |
757 ; } | |
758 ; } | |
759 | |
760 | |
761 | |
762 ; output from freebsd-11.0-ppc64 w/ gcc 4.2.1 | |
763 | |
764 0000000010000828 <.f1>: | |
765 10000828: fb e1 ff f8 std r31,-8(r1) | |
766 1000082c: f8 21 ff c1 stdu r1,-64(r1) | |
767 10000830: 7c 3f 0b 78 mr r31,r1 | |
768 10000834: 90 7f 00 70 stw r3,112(r31) | |
769 10000838: e8 21 00 00 ld r1,0(r1) | |
770 1000083c: eb e1 ff f8 ld r31,-8(r1) | |
771 10000840: 4e 80 00 20 blr | |
772 10000844: 00 00 00 00 .long 0x0 | |
773 10000848: 00 09 00 00 .long 0x90000 | |
774 1000084c: 80 01 00 01 lwz r0,1(r1) | |
775 | |
776 0000000010000850 <.f2>: | |
777 10000850: fb e1 ff f8 std r31,-8(r1) | |
778 10000854: f8 21 ff c1 stdu r1,-64(r1) | |
779 10000858: 7c 3f 0b 78 mr r31,r1 | |
780 1000085c: f8 7f 00 70 std r3,112(r31) | |
781 10000860: e8 21 00 00 ld r1,0(r1) | |
782 10000864: eb e1 ff f8 ld r31,-8(r1) | |
783 10000868: 4e 80 00 20 blr | |
784 1000086c: 00 00 00 00 .long 0x0 | |
785 10000870: 00 09 00 00 .long 0x90000 | |
786 10000874: 80 01 00 01 lwz r0,1(r1) | |
787 | |
788 0000000010000878 <.f>: | |
789 10000878: 7c 08 02 a6 mflr r0 ; | |
790 1000087c: fb e1 ff f8 std r31,-8(r1) ; | |
791 10000880: f8 01 00 10 std r0,16(r1) ; | |
792 10000884: f8 21 ff 71 stdu r1,-144(r1) ; | |
793 10000888: 7c 3f 0b 78 mr r31,r1 ; | |
794 1000088c: 38 1f 00 7c addi r0,r31,124 ; | |
795 10000890: 7c 03 03 78 mr r3,r0 ; | |
796 10000894: 48 00 00 ad bl 10000940 <._ZN10NonTrivialC1Ev> ; NonTrivial::NonTrivial() / ctor | |
797 10000898: 4f ff fb 82 crmove 4*cr7+so,4*cr7+so ; | |
798 1000089c: 38 00 00 01 li r0,1 ; | |
799 100008a0: 90 1f 00 70 stw r0,112(r31) ; | |
800 100008a4: 81 3f 00 70 lwz r9,112(r31) ; | |
801 100008a8: 38 09 00 7b addi r0,r9,123 ; | |
802 100008ac: 90 1f 00 70 stw r0,112(r31) ; | |
803 100008b0: 80 7f 00 78 lwz r3,120(r31) ; | |
804 100008b4: 4b ff ff 75 bl 10000828 <.f1> ; call f1(struct Trivial) | |
805 100008b8: 81 3f 00 70 lwz r9,112(r31) ; | |
806 100008bc: 38 09 ff 85 addi r0,r9,-123 ; | |
807 100008c0: 90 1f 00 70 stw r0,112(r31) ; | |
808 100008c4: 38 1f 00 74 addi r0,r31,116 ; | |
809 100008c8: 39 3f 00 7c addi r9,r31,124 ; | |
810 100008cc: 7c 03 03 78 mr r3,r0 ; | ptr to dest of copy of n | |
811 100008d0: 7d 24 4b 78 mr r4,r9 ; | copy n ptr to n | |
812 100008d4: 48 00 00 a1 bl 10000974 <._ZN10NonTrivialC1ERKS_> ; | NonTrivial::NonTrivial(const NonTrivial&) / copy ctor | |
813 100008d8: 4f ff fb 82 crmove 4*cr7+so,4*cr7+so ; | |
814 100008dc: 38 1f 00 74 addi r0,r31,116 ; | | |
815 100008e0: 7c 03 03 78 mr r3,r0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial | |
816 100008e4: 4b ff ff 6d bl 10000850 <.f2> ; call f2(struct NonTrivial) | |
817 100008e8: 81 3f 00 70 lwz r9,112(r31) ; | |
818 100008ec: 38 09 ff f4 addi r0,r9,-12 ; | |
819 100008f0: 90 1f 00 70 stw r0,112(r31) ; | |
820 100008f4: e8 21 00 00 ld r1,0(r1) ; | |
821 100008f8: e8 01 00 10 ld r0,16(r1) ; | |
822 100008fc: 7c 08 03 a6 mtlr r0 ; | |
823 10000900: eb e1 ff f8 ld r31,-8(r1) ; | |
824 10000904: 4e 80 00 20 blr ; | |
825 10000908: 00 00 00 00 .long 0x0 ; | |
826 1000090c: 00 09 00 01 .long 0x90001 ; | |
827 10000910: 80 01 00 01 lwz r0,1(r1) ; | |
828 | |
829 ; ... snip, removed code of ctor and copy ctor ... | |
830 | |
831 | |
832 | |
737 ; vim: ft=asm | 833 ; vim: ft=asm |
738 | 834 |