Mercurial > pub > dyncall > dyncall
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 |