Mercurial > pub > dyncall > dyncall
diff doc/disas_examples/ppc.darwin.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.darwin.disas Mon Mar 21 18:11:38 2022 +0100 +++ b/doc/disas_examples/ppc.darwin.disas Wed Mar 23 15:24:31 2022 +0100 @@ -952,5 +952,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 darwin-8.0.1-ppc w/ gcc 3.3 + +_f1: +00000000 stmw r30,0xfff8(r1) +00000004 stwu r1,0xffd0(r1) +00000008 or r30,r1,r1 +0000000c stw r3,0x48(r30) +00000010 lwz r1,_f1(r1) +00000014 lmw r30,0xfff8(r1) +00000018 blr +_f2: +0000001c stmw r30,0xfff8(r1) +00000020 stwu r1,0xffd0(r1) +00000024 or r30,r1,r1 +00000028 lwz r1,_f1(r1) +0000002c lmw r30,0xfff8(r1) +00000030 blr +_f: +00000034 mfspr r0,lr ; +00000038 stmw r30,0xfff8(r1) ; +0000003c stw r0,0x8(r1) ; +00000040 stwu r1,0xff70(r1) ; +00000044 or r30,r1,r1 ; +00000048 addi r0,r30,0x50 ; +0000004c or r3,r0,r0 ; +00000050 bl 0x140 ; __ZN10NonTrivialC1Ev ; NonTrivial::NonTrivial() / ctor +00000054 li r0,0x1 ; +00000058 stw r0,0x60(r30) ; +0000005c lwz r2,0x60(r30) ; +00000060 addi r0,r2,0x7b ; +00000064 stw r0,0x60(r30) ; +00000068 lwz r0,0x40(r30) ; +0000006c or r3,r0,r0 ; +00000070 bl _f1 ; call f1(struct Trivial) +00000074 lwz r2,0x60(r30) ; +00000078 addi r0,r2,0xff85 ; +0000007c stw r0,0x60(r30) ; +00000080 addi r0,r30,0x70 ; +00000084 addi r2,r30,0x50 ; +00000088 or r3,r0,r0 ; | ptr to dest of copy of n +0000008c or r4,r2,r2 ; | copy n ptr to n +00000090 bl 0x120 ; __ZN10NonTrivialC1ERKS_ ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor +00000094 addi r0,r30,0x70 ; \ +00000098 or r3,r0,r0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial +0000009c bl _f2 ; call f2(struct NonTrivial) +000000a0 lwz r2,0x60(r30) ; +000000a4 addi r0,r2,0xfff4 ; +000000a8 stw r0,0x60(r30) ; +000000ac lwz r1,_f1(r1) ; +000000b0 lwz r0,0x8(r1) ; +000000b4 mtspr lr,r0 ; +000000b8 lmw r30,0xfff8(r1) ; +000000bc blr ; + + ; ... snip, removed code of ctor and copy ctor ... + + + ; vim: ft=asm