comparison doc/disas_examples/arm.armhf.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
611 5c: e24bd004 sub sp, fp, #4 611 5c: e24bd004 sub sp, fp, #4
612 60: e8bd8800 pop {fp, pc} 612 60: e8bd8800 pop {fp, pc}
613 613
614 614
615 615
616 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
617 ;
618 ; struct Trivial { int a; };
619 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
620 ;
621 ; extern "C" {
622 ;
623 ; void f1(struct Trivial s) { }
624 ; void f2(struct NonTrivial s) { }
625 ;
626 ; void f()
627 ; {
628 ; struct Trivial t;
629 ; struct NonTrivial n;
630 ; int a=1;
631 ; a += 123;
632 ; f1(t);
633 ; a -= 123;
634 ; f2(n);
635 ; a -= 12;
636 ; }
637 ; }
638
639
640
641 ; output from raspbian-11-armelhf w/ gcc 10.2.1
642
643 00000000 <f1>:
644 0: e52db004 push {fp}
645 4: e28db000 add fp, sp, #0
646 8: e24dd00c sub sp, sp, #12
647 c: e50b0008 str r0, [fp, #-8]
648 10: e1a00000 nop
649 14: e28bd000 add sp, fp, #0
650 18: e49db004 pop {fp}
651 1c: e12fff1e bx lr
652
653 00000020 <f2>:
654 20: e52db004 push {fp}
655 24: e28db000 add fp, sp, #0
656 28: e24dd00c sub sp, sp, #12
657 2c: e50b0008 str r0, [fp, #-8]
658 30: e1a00000 nop
659 34: e28bd000 add sp, fp, #0
660 38: e49db004 pop {fp}
661 3c: e12fff1e bx lr
662
663 00000040 <f>:
664 40: e92d4800 push {fp, lr} ; |
665 44: e28db004 add fp, sp, #4 ; | prolog
666 48: e24dd010 sub sp, sp, #16 ; /
667 4c: e24b3014 sub r3, fp, #20 ; \
668 50: e1a00003 mov r0, r3 ; | this ptr (ptr to n's (NonTrivial) space)
669 54: ebfffffe bl 0 <_ZN10NonTrivialC1Ev> ; | NonTrivial::NonTrivial() / ctor
670 58: e3a03001 mov r3, #1 ; a = 1
671 5c: e50b3008 str r3, [fp, #-8] ; |
672 60: e51b3008 ldr r3, [fp, #-8] ; | a += 123
673 64: e283307b add r3, r3, #123 ; |
674 68: e50b3008 str r3, [fp, #-8] ; |
675 6c: e51b0010 ldr r0, [fp, #-16] ; f1 arg 0 (struct Trivial), via reg as small struct
676 70: ebfffffe bl 0 <f1> ; call f1(struct Trivial)
677 74: e51b3008 ldr r3, [fp, #-8] ; |
678 78: e243307b sub r3, r3, #123 ; | a -= 123
679 7c: e50b3008 str r3, [fp, #-8] ; /
680 80: e24b2014 sub r2, fp, #20 ; \
681 84: e24b300c sub r3, fp, #12 ; |
682 88: e1a01002 mov r1, r2 ; | ptr to n
683 8c: e1a00003 mov r0, r3 ; | copy n ptr to dest of copy of n
684 90: ebfffffe bl 0 <_ZN10NonTrivialC1ERKS_> ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
685 94: e24b300c sub r3, fp, #12 ; \
686 98: e1a00003 mov r0, r3 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
687 9c: ebfffffe bl 20 <f2> ; call f2(struct NonTrivial)
688 a0: e51b3008 ldr r3, [fp, #-8] ; |
689 a4: e243300c sub r3, r3, #12 ; | a -= 12
690 a8: e50b3008 str r3, [fp, #-8] ; /
691 ac: e1a00000 nop ; \
692 b0: e24bd004 sub sp, fp, #4 ; | epilog
693 b4: e8bd8800 pop {fp, pc} ; |
694
695 ; ... snip, removed code of ctor and copy ctor ...
696
697
698
616 ; vim: ft=asm68k 699 ; vim: ft=asm68k
617 700