Mercurial > pub > dyncall > dyncall
comparison 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 |
comparison
equal
deleted
inserted
replaced
496:da5232da6270 | 497:cb19b2fe2422 |
---|---|
950 000000f0 lmw r30,0xfff8(r1) | 950 000000f0 lmw r30,0xfff8(r1) |
951 000000f4 blr | 951 000000f4 blr |
952 | 952 |
953 | 953 |
954 | 954 |
955 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ----------> | |
956 ; | |
957 ; struct Trivial { int a; }; | |
958 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; | |
959 ; | |
960 ; extern "C" { | |
961 ; | |
962 ; void f1(struct Trivial s) { } | |
963 ; void f2(struct NonTrivial s) { } | |
964 ; | |
965 ; void f() | |
966 ; { | |
967 ; struct Trivial t; | |
968 ; struct NonTrivial n; | |
969 ; int a=1; | |
970 ; a += 123; | |
971 ; f1(t); | |
972 ; a -= 123; | |
973 ; f2(n); | |
974 ; a -= 12; | |
975 ; } | |
976 ; } | |
977 | |
978 | |
979 | |
980 ; output from darwin-8.0.1-ppc w/ gcc 3.3 | |
981 | |
982 _f1: | |
983 00000000 stmw r30,0xfff8(r1) | |
984 00000004 stwu r1,0xffd0(r1) | |
985 00000008 or r30,r1,r1 | |
986 0000000c stw r3,0x48(r30) | |
987 00000010 lwz r1,_f1(r1) | |
988 00000014 lmw r30,0xfff8(r1) | |
989 00000018 blr | |
990 _f2: | |
991 0000001c stmw r30,0xfff8(r1) | |
992 00000020 stwu r1,0xffd0(r1) | |
993 00000024 or r30,r1,r1 | |
994 00000028 lwz r1,_f1(r1) | |
995 0000002c lmw r30,0xfff8(r1) | |
996 00000030 blr | |
997 _f: | |
998 00000034 mfspr r0,lr ; | |
999 00000038 stmw r30,0xfff8(r1) ; | |
1000 0000003c stw r0,0x8(r1) ; | |
1001 00000040 stwu r1,0xff70(r1) ; | |
1002 00000044 or r30,r1,r1 ; | |
1003 00000048 addi r0,r30,0x50 ; | |
1004 0000004c or r3,r0,r0 ; | |
1005 00000050 bl 0x140 ; __ZN10NonTrivialC1Ev ; NonTrivial::NonTrivial() / ctor | |
1006 00000054 li r0,0x1 ; | |
1007 00000058 stw r0,0x60(r30) ; | |
1008 0000005c lwz r2,0x60(r30) ; | |
1009 00000060 addi r0,r2,0x7b ; | |
1010 00000064 stw r0,0x60(r30) ; | |
1011 00000068 lwz r0,0x40(r30) ; | |
1012 0000006c or r3,r0,r0 ; | |
1013 00000070 bl _f1 ; call f1(struct Trivial) | |
1014 00000074 lwz r2,0x60(r30) ; | |
1015 00000078 addi r0,r2,0xff85 ; | |
1016 0000007c stw r0,0x60(r30) ; | |
1017 00000080 addi r0,r30,0x70 ; | |
1018 00000084 addi r2,r30,0x50 ; | |
1019 00000088 or r3,r0,r0 ; | ptr to dest of copy of n | |
1020 0000008c or r4,r2,r2 ; | copy n ptr to n | |
1021 00000090 bl 0x120 ; __ZN10NonTrivialC1ERKS_ ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor | |
1022 00000094 addi r0,r30,0x70 ; \ | |
1023 00000098 or r3,r0,r0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial | |
1024 0000009c bl _f2 ; call f2(struct NonTrivial) | |
1025 000000a0 lwz r2,0x60(r30) ; | |
1026 000000a4 addi r0,r2,0xfff4 ; | |
1027 000000a8 stw r0,0x60(r30) ; | |
1028 000000ac lwz r1,_f1(r1) ; | |
1029 000000b0 lwz r0,0x8(r1) ; | |
1030 000000b4 mtspr lr,r0 ; | |
1031 000000b8 lmw r30,0xfff8(r1) ; | |
1032 000000bc blr ; | |
1033 | |
1034 ; ... snip, removed code of ctor and copy ctor ... | |
1035 | |
1036 | |
1037 | |
955 ; vim: ft=asm | 1038 ; vim: ft=asm |
956 | 1039 |