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