diff 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
line wrap: on
line diff
--- a/doc/disas_examples/arm.armhf.disas	Mon Mar 21 18:11:38 2022 +0100
+++ b/doc/disas_examples/arm.armhf.disas	Wed Mar 23 15:24:31 2022 +0100
@@ -613,5 +613,88 @@
 
 
 
+; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
+;
+; struct Trivial { int a; };
+; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
+;
+; extern "C" {
+; 
+;     void f1(struct Trivial s)    { }
+;     void f2(struct NonTrivial s) { }
+;
+;     void f()
+;     {
+;         struct Trivial t;
+;         struct NonTrivial n;
+;         int a=1;
+;         a += 123;
+;         f1(t);
+;         a -= 123;
+;         f2(n);
+;         a -= 12;
+;     }
+; }
+
+
+
+; output from raspbian-11-armelhf w/ gcc 10.2.1
+
+00000000 <f1>:
+   0:   e52db004        push    {fp}
+   4:   e28db000        add     fp, sp, #0
+   8:   e24dd00c        sub     sp, sp, #12
+   c:   e50b0008        str     r0, [fp, #-8]
+  10:   e1a00000        nop
+  14:   e28bd000        add     sp, fp, #0
+  18:   e49db004        pop     {fp}
+  1c:   e12fff1e        bx      lr
+
+00000020 <f2>:
+  20:   e52db004        push    {fp}
+  24:   e28db000        add     fp, sp, #0
+  28:   e24dd00c        sub     sp, sp, #12
+  2c:   e50b0008        str     r0, [fp, #-8]
+  30:   e1a00000        nop
+  34:   e28bd000        add     sp, fp, #0
+  38:   e49db004        pop     {fp}
+  3c:   e12fff1e        bx      lr
+
+00000040 <f>:
+  40:   e92d4800        push    {fp, lr}                   ; |
+  44:   e28db004        add     fp, sp, #4                 ; | prolog
+  48:   e24dd010        sub     sp, sp, #16                ; /
+  4c:   e24b3014        sub     r3, fp, #20                ; \
+  50:   e1a00003        mov     r0, r3                     ; | this ptr (ptr to n's (NonTrivial) space)
+  54:   ebfffffe        bl      0 <_ZN10NonTrivialC1Ev>    ; | NonTrivial::NonTrivial() / ctor
+  58:   e3a03001        mov     r3, #1                     ; a = 1
+  5c:   e50b3008        str     r3, [fp, #-8]              ; |
+  60:   e51b3008        ldr     r3, [fp, #-8]              ; | a += 123
+  64:   e283307b        add     r3, r3, #123               ; |
+  68:   e50b3008        str     r3, [fp, #-8]              ; |
+  6c:   e51b0010        ldr     r0, [fp, #-16]             ; f1 arg 0 (struct Trivial), via reg as small struct
+  70:   ebfffffe        bl      0 <f1>                     ; call f1(struct Trivial)
+  74:   e51b3008        ldr     r3, [fp, #-8]              ; |
+  78:   e243307b        sub     r3, r3, #123               ; | a -= 123
+  7c:   e50b3008        str     r3, [fp, #-8]              ; /
+  80:   e24b2014        sub     r2, fp, #20                ; \
+  84:   e24b300c        sub     r3, fp, #12                ; |
+  88:   e1a01002        mov     r1, r2                     ; |               ptr to n
+  8c:   e1a00003        mov     r0, r3                     ; | copy n        ptr to dest of copy of n
+  90:   ebfffffe        bl      0 <_ZN10NonTrivialC1ERKS_> ; /               NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
+  94:   e24b300c        sub     r3, fp, #12                ; \
+  98:   e1a00003        mov     r0, r3                     ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
+  9c:   ebfffffe        bl      20 <f2>                    ; call f2(struct NonTrivial)
+  a0:   e51b3008        ldr     r3, [fp, #-8]              ; |
+  a4:   e243300c        sub     r3, r3, #12                ; | a -= 12
+  a8:   e50b3008        str     r3, [fp, #-8]              ; /
+  ac:   e1a00000        nop                                ; \
+  b0:   e24bd004        sub     sp, fp, #4                 ; | epilog
+  b4:   e8bd8800        pop     {fp, pc}                   ; |
+
+  ; ... snip, removed code of ctor and copy ctor ...
+
+
+
 ; vim: ft=asm68k