comparison doc/disas_examples/arm.atpcs_arm.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 0fc22b5feac7
children fc614cb865c6
comparison
equal deleted inserted replaced
496:da5232da6270 497:cb19b2fe2422
747 f0: 40a00000 .word 0x40a00000 747 f0: 40a00000 .word 0x40a00000
748 f4: 00000000 .word 0x00000000 748 f4: 00000000 .word 0x00000000
749 749
750 750
751 751
752 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
753 ;
754 ; struct Trivial { int a; };
755 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
756 ;
757 ; extern "C" {
758 ;
759 ; void f1(struct Trivial s) { }
760 ; void f2(struct NonTrivial s) { }
761 ;
762 ; void f()
763 ; {
764 ; struct Trivial t;
765 ; struct NonTrivial n;
766 ; int a=1;
767 ; a += 123;
768 ; f1(t);
769 ; a -= 123;
770 ; f2(n);
771 ; a -= 12;
772 ; }
773 ; }
774
775
776
777 ; output from debian-6.0.8-armel w/ gcc 4.4.5
778
779 00000000 <f1>:
780 0: e52db004 push {fp}
781 4: e28db000 add fp, sp, #0
782 8: e24dd00c sub sp, sp, #12
783 c: e50b0008 str r0, [fp, #-8]
784 10: e28bd000 add sp, fp, #0
785 14: e8bd0800 pop {fp}
786 18: e12fff1e bx lr
787
788 0000001c <f2>:
789 1c: e52db004 push {fp}
790 20: e28db000 add fp, sp, #0
791 24: e24dd00c sub sp, sp, #12
792 28: e50b0008 str r0, [fp, #-8]
793 2c: e28bd000 add sp, fp, #0
794 30: e8bd0800 pop {fp}
795 34: e12fff1e bx lr
796
797 00000038 <f>:
798 38: e92d4800 push {fp, lr} ; |
799 3c: e28db004 add fp, sp, #4 ; | prolog
800 40: e24dd010 sub sp, sp, #16 ; /
801 44: e24b3014 sub r3, fp, #20 ; \
802 48: e1a00003 mov r0, r3 ; | this ptr (ptr to n's (NonTrivial) space)
803 4c: ebfffffe bl 0 <_ZN10NonTrivialC1Ev> ; | NonTrivial::NonTrivial() / ctor
804 50: e3a03001 mov r3, #1 ; a = 1
805 54: e50b3008 str r3, [fp, #-8] ; |
806 58: e51b3008 ldr r3, [fp, #-8] ; | a += 123
807 5c: e283307b add r3, r3, #123 ; |
808 60: e50b3008 str r3, [fp, #-8] ; |
809 64: e51b0010 ldr r0, [fp, #-16] ; f1 arg 0 (struct Trivial), via reg as small struct
810 68: ebfffffe bl 0 <f1> ; call f1(struct Trivial)
811 6c: e51b3008 ldr r3, [fp, #-8] ; |
812 70: e243307b sub r3, r3, #123 ; | a -= 123
813 74: e50b3008 str r3, [fp, #-8] ; /
814 78: e24b200c sub r2, fp, #12 ; \
815 7c: e24b3014 sub r3, fp, #20 ; |
816 80: e1a00002 mov r0, r2 ; | ptr to dest of copy of n
817 84: e1a01003 mov r1, r3 ; | copy n ptr to n
818 88: ebfffffe bl 0 <_ZN10NonTrivialC1ERKS_> ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
819 8c: e24b300c sub r3, fp, #12 ; \
820 90: e1a00003 mov r0, r3 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
821 94: ebfffffe bl 1c <f2> ; call f2(struct NonTrivial)
822 98: e51b3008 ldr r3, [fp, #-8] ; |
823 9c: e243300c sub r3, r3, #12 ; | a -= 12
824 a0: e50b3008 str r3, [fp, #-8] ; /
825 a4: e24bd004 sub sp, fp, #4 ; \
826 a8: e8bd4800 pop {fp, lr} ; | epilog
827 ac: e12fff1e bx lr ; |
828
829 ; ... snip, removed code of ctor and copy ctor ...
830
831
832
752 ; vim: ft=asm68k 833 ; vim: ft=asm68k
753 834