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