Mercurial > pub > dyncall > dyncall
comparison doc/disas_examples/ppc64.elfabi.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 |
comparison
equal
deleted
inserted
replaced
498:fd9ba3a6d348 | 499:fc614cb865c6 |
---|---|
828 | 828 |
829 ; ... snip, removed code of ctor and copy ctor ... | 829 ; ... snip, removed code of ctor and copy ctor ... |
830 | 830 |
831 | 831 |
832 | 832 |
833 ; ---------- C++ trivial and non-trivial aggrs as return values ----------> | |
834 ; | |
835 ; struct Trivial { int a; }; | |
836 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; | |
837 ; | |
838 ; extern "C" { | |
839 ; struct Trivial f1() { return Trivial(); } | |
840 ; } | |
841 ; | |
842 ; struct NonTrivial f2() { return NonTrivial(); } | |
843 ; | |
844 ; extern "C" { | |
845 ; void f() | |
846 ; { | |
847 ; int a=1; | |
848 ; a += 123; | |
849 ; struct Trivial t = f1(); | |
850 ; a -= 123; | |
851 ; struct NonTrivial n = f2(); | |
852 ; a -= 12; | |
853 ; } | |
854 ; } | |
855 | |
856 | |
857 | |
858 ; output from freebsd-11.0-ppc64 w/ gcc 4.2.1 | |
859 | |
860 0000000010000828 <.f1>: | |
861 10000828: fb e1 ff f8 std r31,-8(r1) ; | | |
862 1000082c: f8 21 ff c1 stdu r1,-64(r1) ; | prolog | |
863 10000830: 7c 3f 0b 78 mr r31,r1 ; use gpr31 as sort of frame pointer, below | |
864 10000834: 90 7f 00 70 stw r3,112(r31) ; | |
865 10000838: e8 21 00 00 ld r1,0(r1) ; | | |
866 1000083c: eb e1 ff f8 ld r31,-8(r1) ; | epilog | |
867 10000840: 4e 80 00 20 blr ; | | |
868 10000844: 00 00 00 00 .long 0x0 ; data | |
869 10000848: 00 09 00 00 .long 0x90000 ; data | |
870 1000084c: 80 01 00 01 lwz r0,1(r1) ; unsure@@@. data? | |
871 | |
872 0000000010000850 <.f2>: | |
873 10000850: fb e1 ff f8 std r31,-8(r1) ; | | |
874 10000854: f8 21 ff c1 stdu r1,-64(r1) ; | prolog | |
875 10000858: 7c 3f 0b 78 mr r31,r1 ; use gpr31 as sort of frame pointer, below | |
876 1000085c: f8 7f 00 70 std r3,112(r31) ; | |
877 10000860: e8 21 00 00 ld r1,0(r1) ; | | |
878 10000864: eb e1 ff f8 ld r31,-8(r1) ; | epilog | |
879 10000868: 4e 80 00 20 blr ; | | |
880 1000086c: 00 00 00 00 .long 0x0 ; data | |
881 10000870: 00 09 00 00 .long 0x90000 ; data | |
882 10000874: 80 01 00 01 lwz r0,1(r1) ; unsure@@@. data? | |
883 | |
884 0000000010000878 <.f>: | |
885 10000878: 7c 08 02 a6 mflr r0 ; | |
886 1000087c: fb e1 ff f8 std r31,-8(r1) ; | |
887 10000880: f8 01 00 10 std r0,16(r1) ; | |
888 10000884: f8 21 ff 71 stdu r1,-144(r1) ; | |
889 10000888: 7c 3f 0b 78 mr r31,r1 ; | |
890 1000088c: 38 1f 00 7c addi r0,r31,124 ; | |
891 10000890: 7c 03 03 78 mr r3,r0 ; | |
892 10000894: 48 00 00 ad bl 10000940 <._ZN10NonTrivialC1Ev> ; ctor | |
893 10000898: 4f ff fb 82 crmove 4*cr7+so,4*cr7+so ; | |
894 1000089c: 38 00 00 01 li r0,1 ; | a = 1 | |
895 100008a0: 90 1f 00 70 stw r0,112(r31) ; / | |
896 100008a4: 81 3f 00 70 lwz r9,112(r31) ; \ | |
897 100008a8: 38 09 00 7b addi r0,r9,123 ; | a += 123 | |
898 100008ac: 90 1f 00 70 stw r0,112(r31) ; | | |
899 100008b0: 80 7f 00 78 lwz r3,120(r31) ; hidden first arg (ptr to space to hold Trivial retval) @@@ fetches addr from 120(r31)? | |
900 100008b4: 4b ff ff 75 bl 10000828 <.f1> ; call f1() | |
901 100008b8: 81 3f 00 70 lwz r9,112(r31) ; | | |
902 100008bc: 38 09 ff 85 addi r0,r9,-123 ; | a -= 123 | |
903 100008c0: 90 1f 00 70 stw r0,112(r31) ; | | |
904 100008c4: 38 1f 00 74 addi r0,r31,116 ; | |
905 100008c8: 39 3f 00 7c addi r9,r31,124 ; | |
906 100008cc: 7c 03 03 78 mr r3,r0 ; | |
907 100008d0: 7d 24 4b 78 mr r4,r9 ; | |
908 100008d4: 48 00 00 a1 bl 10000974 <._ZN10NonTrivialC1ERKS_> ; copy ctor | |
909 100008d8: 4f ff fb 82 crmove 4*cr7+so,4*cr7+so ; | |
910 100008dc: 38 1f 00 74 addi r0,r31,116 ; | |
911 100008e0: 7c 03 03 78 mr r3,r0 ; hidden first arg (ptr to space to hold NonTrivial retval) | |
912 100008e4: 4b ff ff 6d bl 10000850 <.f2> ; call f2() | |
913 100008e8: 81 3f 00 70 lwz r9,112(r31) ; | | |
914 100008ec: 38 09 ff f4 addi r0,r9,-12 ; | a -= 12 | |
915 100008f0: 90 1f 00 70 stw r0,112(r31) ; | | |
916 100008f4: e8 21 00 00 ld r1,0(r1) ; | |
917 100008f8: e8 01 00 10 ld r0,16(r1) ; | |
918 100008fc: 7c 08 03 a6 mtlr r0 ; | |
919 10000900: eb e1 ff f8 ld r31,-8(r1) ; | |
920 10000904: 4e 80 00 20 blr ; | |
921 10000908: 00 00 00 00 .long 0x0 ; | |
922 1000090c: 00 09 00 01 .long 0x90001 ; | |
923 10000910: 80 01 00 01 lwz r0,1(r1) ; | |
924 | |
925 | |
926 | |
833 ; vim: ft=asm | 927 ; vim: ft=asm |
834 | 928 |