diff doc/disas_examples/arm.armhf.disas @ 499:fc614cb865c6

- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
author Tassilo Philipp
date Mon, 04 Apr 2022 15:50:52 +0200
parents cb19b2fe2422
children
line wrap: on
line diff
--- a/doc/disas_examples/arm.armhf.disas	Wed Mar 23 15:33:09 2022 +0100
+++ b/doc/disas_examples/arm.armhf.disas	Mon Apr 04 15:50:52 2022 +0200
@@ -696,5 +696,79 @@
 
 
 
+; ---------- C++ trivial and non-trivial aggrs as return values ---------->
+;
+; struct Trivial { int a; };
+; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
+; 
+; extern "C" {
+;     struct Trivial    f1() { return Trivial(); }
+; }
+; 
+;     struct NonTrivial f2() { return NonTrivial(); }
+; 
+; extern "C" {
+;     void f()
+;     {
+;         int a=1;
+;         a += 123;
+;         struct Trivial t = f1();
+;         a -= 123;
+;         struct NonTrivial n = f2();
+;         a -= 12;
+;     }
+; }
+
+
+
+; output from raspbian-11-armelhf w/ gcc 10.2.1
+
+000103d0 <f1>:
+   103d0:       e52db004        push    {fp}
+   103d4:       e28db000        add     fp, sp, #0
+   103d8:       e3a03000        mov     r3, #0
+   103dc:       e1a00003        mov     r0, r3
+   103e0:       e28bd000        add     sp, fp, #0
+   103e4:       e49db004        pop     {fp}
+   103e8:       e12fff1e        bx      lr
+
+000103ec <_Z2f2v>:
+   103ec:       e92d4800        push    {fp, lr}
+   103f0:       e28db004        add     fp, sp, #4
+   103f4:       e24dd008        sub     sp, sp, #8
+   103f8:       e50b0008        str     r0, [fp, #-8]
+   103fc:       e51b0008        ldr     r0, [fp, #-8]
+   10400:       eb00001f        bl      10484 <_ZN10NonTrivialC1Ev>
+   10404:       e51b0008        ldr     r0, [fp, #-8]  ; ptr to retval space -> r0
+   10408:       e24bd004        sub     sp, fp, #4
+   1040c:       e8bd8800        pop     {fp, pc}
+
+00010410 <f>:
+   10410:       e92d4800        push    {fp, lr}       ; |
+   10414:       e28db004        add     fp, sp, #4     ; | prolog
+   10418:       e24dd010        sub     sp, sp, #16    ; /
+   1041c:       e3a03001        mov     r3, #1         ; \ a = 1
+   10420:       e50b3008        str     r3, [fp, #-8]  ; /
+   10424:       e51b3008        ldr     r3, [fp, #-8]  ; \
+   10428:       e283307b        add     r3, r3, #123   ; | a += 123
+   1042c:       e50b3008        str     r3, [fp, #-8]  ; |
+   10430:       ebffffe6        bl      103d0 <f1>     ; call f1()
+   10434:       e1a03000        mov     r3, r0         ; | retval via r0, as small struct
+   10438:       e50b300c        str     r3, [fp, #-12] ; /
+   1043c:       e51b3008        ldr     r3, [fp, #-8]  ; \
+   10440:       e243307b        sub     r3, r3, #123   ; | a -= 123
+   10444:       e50b3008        str     r3, [fp, #-8]  ; |
+   10448:       e24b3010        sub     r3, fp, #16    ; space to hold non-triv retval -> eax ...
+   1044c:       e1a00003        mov     r0, r3         ; ... as hidden first arg (r0)
+   10450:       ebffffe5        bl      103ec <_Z2f2v> ; call f2()
+   10454:       e51b3008        ldr     r3, [fp, #-8]  ; |
+   10458:       e243300c        sub     r3, r3, #12    ; | a -= 12
+   1045c:       e50b3008        str     r3, [fp, #-8]  ; /
+   10460:       e1a00000        nop                    ; \
+   10464:       e24bd004        sub     sp, fp, #4     ; | epilog
+   10468:       e8bd8800        pop     {fp, pc}       ; |
+
+
+
 ; vim: ft=asm68k