Mercurial > pub > dyncall > dyncall
diff doc/disas_examples/ppc.sysv.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 | ead041d93e36 |
children | fc614cb865c6 |
line wrap: on
line diff
--- a/doc/disas_examples/ppc.sysv.disas Mon Mar 21 18:11:38 2022 +0100 +++ b/doc/disas_examples/ppc.sysv.disas Wed Mar 23 15:24:31 2022 +0100 @@ -1114,5 +1114,95 @@ +; ---------- 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 debian-4.1.1-21-ppc w/ gcc 4.1.2 + +100003e0 <f1>: +100003e0: 94 21 ff f0 stwu r1,-16(r1) +100003e4: 93 e1 00 0c stw r31,12(r1) +100003e8: 7c 3f 0b 78 mr r31,r1 +100003ec: 81 61 00 00 lwz r11,0(r1) +100003f0: 83 eb ff fc lwz r31,-4(r11) +100003f4: 7d 61 5b 78 mr r1,r11 +100003f8: 4e 80 00 20 blr + +100003fc <f2>: +100003fc: 94 21 ff e0 stwu r1,-32(r1) +10000400: 93 e1 00 1c stw r31,28(r1) +10000404: 7c 3f 0b 78 mr r31,r1 +10000408: 90 7f 00 08 stw r3,8(r31) +1000040c: 81 61 00 00 lwz r11,0(r1) +10000410: 83 eb ff fc lwz r31,-4(r11) +10000414: 7d 61 5b 78 mr r1,r11 +10000418: 4e 80 00 20 blr + +1000041c <f>: +1000041c: 94 21 ff d0 stwu r1,-48(r1) ; +10000420: 7c 08 02 a6 mflr r0 ; +10000424: 93 e1 00 2c stw r31,44(r1) ; +10000428: 90 01 00 34 stw r0,52(r1) ; +1000042c: 7c 3f 0b 78 mr r31,r1 ; +10000430: 38 1f 00 14 addi r0,r31,20 ; +10000434: 7c 03 03 78 mr r3,r0 ; +10000438: 48 00 00 a1 bl 100004d8 <_ZN10NonTrivialC1Ev> ; NonTrivial::NonTrivial() / ctor +1000043c: 38 00 00 01 li r0,1 ; +10000440: 90 1f 00 08 stw r0,8(r31) ; +10000444: 81 3f 00 08 lwz r9,8(r31) ; +10000448: 38 09 00 7b addi r0,r9,123 ; +1000044c: 90 1f 00 08 stw r0,8(r31) ; +10000450: 80 1f 00 10 lwz r0,16(r31) ; +10000454: 90 1f 00 18 stw r0,24(r31) ; +10000458: 38 1f 00 18 addi r0,r31,24 ; +1000045c: 7c 03 03 78 mr r3,r0 ; +10000460: 4b ff ff 81 bl 100003e0 <f1> ; call f1(struct Trivial) +10000464: 81 3f 00 08 lwz r9,8(r31) ; +10000468: 38 09 ff 85 addi r0,r9,-123 ; +1000046c: 90 1f 00 08 stw r0,8(r31) ; +10000470: 38 1f 00 0c addi r0,r31,12 ; +10000474: 39 3f 00 14 addi r9,r31,20 ; +10000478: 7c 03 03 78 mr r3,r0 ; | ptr to dest of copy of n +1000047c: 7d 24 4b 78 mr r4,r9 ; | copy n ptr to n +10000480: 48 00 00 85 bl 10000504 <_ZN10NonTrivialC1ERKS_> ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor +10000484: 38 1f 00 0c addi r0,r31,12 ; \ +10000488: 7c 03 03 78 mr r3,r0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial +1000048c: 4b ff ff 71 bl 100003fc <f2> ; call f2(struct NonTrivial) +10000490: 81 3f 00 08 lwz r9,8(r31) ; +10000494: 38 09 ff f4 addi r0,r9,-12 ; +10000498: 90 1f 00 08 stw r0,8(r31) ; +1000049c: 81 61 00 00 lwz r11,0(r1) ; +100004a0: 80 0b 00 04 lwz r0,4(r11) ; +100004a4: 7c 08 03 a6 mtlr r0 ; +100004a8: 83 eb ff fc lwz r31,-4(r11) ; +100004ac: 7d 61 5b 78 mr r1,r11 ; +100004b0: 4e 80 00 20 blr ; + + ; ... snip, removed code of ctor and copy ctor ... + + + ; vim: ft=asm68k