view doc/disas_examples/arm.darwin_arm.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 c0390dc85a07
children
line wrap: on
line source

; void leaf_call(int b, int c, int d, int e, int f, int g, int h)
; {
; }
; 
; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h)
; {
; 	/* use some local data */
; 	char x = 'L';
; 	leaf_call(b, c, d, e, f, g, h);
; }
; 
; int main()
; {
; 	nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7);
; 	return 0;
; }



; output from iOS 6 w/ clang 3.7.1, dumped with llvm-objdump -triple armv7-unknown-unknown-macho ...

_leaf_call:
       0:       80 40 2d e9     push    {r7, lr}
       4:       0d 70 a0 e1     mov     r7, sp
       8:       1c d0 4d e2     sub     sp, sp, #28
       c:       10 90 97 e5     ldr     r9, [r7, #16]
      10:       0c c0 97 e5     ldr     r12, [r7, #12]
      14:       08 e0 97 e5     ldr     lr, [r7, #8]
      18:       04 00 07 e5     str     r0, [r7, #-4]
      1c:       08 10 07 e5     str     r1, [r7, #-8]
      20:       0c 20 07 e5     str     r2, [r7, #-12]
      24:       0c 30 8d e5     str     r3, [sp, #12]
      28:       08 e0 8d e5     str     lr, [sp, #8]
      2c:       04 c0 8d e5     str     r12, [sp, #4]
      30:       00 90 8d e5     str     r9, [sp]
      34:       07 d0 a0 e1     mov     sp, r7
      38:       80 80 bd e8     pop     {r7, pc}

_nonleaf_call:
      3c:       b0 40 2d e9     push    {r4, r5, r7, lr}      ; |
      40:       08 70 8d e2     add     r7, sp, #8            ; | prolog
      44:       30 d0 4d e2     sub     sp, sp, #48           ; /
      48:       14 90 97 e5     ldr     r9, [r7, #20]         ; \
      4c:       10 c0 97 e5     ldr     r12, [r7, #16]        ; |
      50:       0c e0 97 e5     ldr     lr, [r7, #12]         ; | in args 4,5,6,7 from prev frame's param area -> regs ...
      54:       08 40 97 e5     ldr     r4, [r7, #8]          ; |
      58:       4c 50 00 e3     movw    r5, #76               ; 'L' -> r5
      5c:       0c 00 07 e5     str     r0, [r7, #-12]        ; in arg 0 -> temp space in local area
      60:       10 10 07 e5     str     r1, [r7, #-16]        ; in arg 1 -> temp space in local area
      64:       14 20 07 e5     str     r2, [r7, #-20]        ; in arg 2 -> temp space in local area
      68:       18 30 07 e5     str     r3, [r7, #-24]        ; in arg 3 -> temp space in local area
      6c:       1c 40 8d e5     str     r4, [sp, #28]         ; |
      70:       18 e0 8d e5     str     lr, [sp, #24]         ; |
      74:       14 c0 8d e5     str     r12, [sp, #20]        ; | ... in args 4,5,6,7 in regs -> local area ...
      78:       10 90 8d e5     str     r9, [sp, #16]         ; |
      7c:       0f 50 cd e5     strb    r5, [sp, #15]         ; 'L' (in r5) -> local area
      80:       10 00 17 e5     ldr     r0, [r7, #-16]        ; arg 0
      84:       14 10 17 e5     ldr     r1, [r7, #-20]        ; arg 1
      88:       18 20 17 e5     ldr     r2, [r7, #-24]        ; arg 2
      8c:       1c 30 9d e5     ldr     r3, [sp, #28]         ; arg 3 (fetched from local area previously copied to)
      90:       18 90 9d e5     ldr     r9, [sp, #24]         ; |
      94:       14 c0 9d e5     ldr     r12, [sp, #20]        ; | args 4,5,6 (fetched from local area previously copied to) -> regs, and ...
      98:       10 e0 9d e5     ldr     lr, [sp, #16]         ; /
      9c:       00 90 8d e5     str     r9, [sp]              ; \
      a0:       04 c0 8d e5     str     r12, [sp, #4]         ; | ... "pushed" onto stack
      a4:       08 e0 8d e5     str     lr, [sp, #8]          ; |
      a8:       d4 ff ff eb     bl      #-176 <_leaf_call>    ; return address -> r14/lr, and call
      ac:       08 d0 47 e2     sub     sp, r7, #8            ; |
      b0:       b0 80 bd e8     pop     {r4, r5, r7, pc}      ; | epilog

_main:
      b4:       90 40 2d e9     push    {r4, r7, lr}          ; |
      b8:       04 70 8d e2     add     r7, sp, #4            ; | prolog
      bc:       14 d0 4d e2     sub     sp, sp, #20           ; |
      c0:       00 00 00 e3     movw    r0, #0                ; arg 0
      c4:       01 10 00 e3     movw    r1, #1                ; arg 1
      c8:       02 20 00 e3     movw    r2, #2                ; arg 2
      cc:       03 30 00 e3     movw    r3, #3                ; arg 3
      d0:       04 90 00 e3     movw    r9, #4                ; |
      d4:       05 c0 00 e3     movw    r12, #5               ; |
      d8:       06 e0 00 e3     movw    lr, #6                ; | args 4,5,6,7 in regs ...
      dc:       07 40 00 e3     movw    r4, #7                ; |
      e0:       08 00 07 e5     str     r0, [r7, #-8]         ; unsure... why place arg 0 in local area? @@@
      e4:       00 90 8d e5     str     r9, [sp]              ; |
      e8:       04 c0 8d e5     str     r12, [sp, #4]         ; |
      ec:       08 e0 8d e5     str     lr, [sp, #8]          ; | ... "push" args 4,5,6,7 onto stack
      f0:       0c 40 8d e5     str     r4, [sp, #12]         ; |
      f4:       d0 ff ff eb     bl      #-192 <_nonleaf_call> ; return address -> r14/lr, and call
      f8:       00 00 00 e3     movw    r0, #0                ; return value
      fc:       04 d0 47 e2     sub     sp, r7, #4            ; |
     100:       90 80 bd e8     pop     {r4, r7, pc}          ; | epilog



; ----------------- with spilling ------------->

; #include <stdarg.h>
;
; void leaf_call(int b, int c, int d, int e, int f, int g, int h)
; {
; }
;
; void nonleaf_call(int a, ...)
; {
; 	int b,c,d,e,f,g,h;
; 	va_list ap;
; 	va_start(ap,a);
; 	b = va_arg(ap,int);
; 	c = va_arg(ap,int);
; 	d = va_arg(ap,int);
; 	e = va_arg(ap,int);
; 	f = va_arg(ap,int);
; 	g = va_arg(ap,int);
; 	h = va_arg(ap,int);
; 	/* use some local data */
; 	char x = 'L';
; 	leaf_call(b,c,d,e,f,g,h);
; }
;
; int main()
; {
; 	nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7);
; 	return 0;
; }



; output from iOS 6 w/ clang 3.7.1, dumped with llvm-objdump -triple armv7-unknown-unknown-macho ...

_leaf_call:
       0:       80 40 2d e9     push    {r7, lr}
       4:       0d 70 a0 e1     mov     r7, sp
       8:       1c d0 4d e2     sub     sp, sp, #28
       c:       10 90 97 e5     ldr     r9, [r7, #16]
      10:       0c c0 97 e5     ldr     r12, [r7, #12]
      14:       08 e0 97 e5     ldr     lr, [r7, #8]
      18:       04 00 07 e5     str     r0, [r7, #-4]
      1c:       08 10 07 e5     str     r1, [r7, #-8]
      20:       0c 20 07 e5     str     r2, [r7, #-12]
      24:       0c 30 8d e5     str     r3, [sp, #12]
      28:       08 e0 8d e5     str     lr, [sp, #8]
      2c:       04 c0 8d e5     str     r12, [sp, #4]
      30:       00 90 8d e5     str     r9, [sp]
      34:       07 d0 a0 e1     mov     sp, r7
      38:       80 80 bd e8     pop     {r7, pc}

_nonleaf_call:
      3c:       0c d0 4d e2     sub     sp, sp, #12
      40:       80 40 2d e9     push    {r7, lr}
      44:       0d 70 a0 e1     mov     r7, sp
      48:       34 d0 4d e2     sub     sp, sp, #52
      4c:       10 30 87 e5     str     r3, [r7, #16]
      50:       0c 20 87 e5     str     r2, [r7, #12]
      54:       08 10 87 e5     str     r1, [r7, #8]
      58:       4c 10 00 e3     movw    r1, #76
      5c:       08 20 47 e2     sub     r2, r7, #8
      60:       04 00 07 e5     str     r0, [r7, #-4]
      64:       08 00 87 e2     add     r0, r7, #8
      68:       00 00 82 e5     str     r0, [r2]
      6c:       08 00 17 e5     ldr     r0, [r7, #-8]
      70:       04 20 80 e2     add     r2, r0, #4
      74:       08 20 07 e5     str     r2, [r7, #-8]
      78:       00 00 90 e5     ldr     r0, [r0]
      7c:       0c 00 07 e5     str     r0, [r7, #-12]
      80:       08 00 17 e5     ldr     r0, [r7, #-8]
      84:       04 20 80 e2     add     r2, r0, #4
      88:       08 20 07 e5     str     r2, [r7, #-8]
      8c:       00 00 90 e5     ldr     r0, [r0]
      90:       10 00 07 e5     str     r0, [r7, #-16]
      94:       08 00 17 e5     ldr     r0, [r7, #-8]
      98:       04 20 80 e2     add     r2, r0, #4
      9c:       08 20 07 e5     str     r2, [r7, #-8]
      a0:       00 00 90 e5     ldr     r0, [r0]
      a4:       14 00 07 e5     str     r0, [r7, #-20]
      a8:       08 00 17 e5     ldr     r0, [r7, #-8]
      ac:       04 20 80 e2     add     r2, r0, #4
      b0:       08 20 07 e5     str     r2, [r7, #-8]
      b4:       00 00 90 e5     ldr     r0, [r0]
      b8:       18 00 07 e5     str     r0, [r7, #-24]
      bc:       08 00 17 e5     ldr     r0, [r7, #-8]
      c0:       04 20 80 e2     add     r2, r0, #4
      c4:       08 20 07 e5     str     r2, [r7, #-8]
      c8:       00 00 90 e5     ldr     r0, [r0]
      cc:       18 00 8d e5     str     r0, [sp, #24]
      d0:       08 00 17 e5     ldr     r0, [r7, #-8]
      d4:       04 20 80 e2     add     r2, r0, #4
      d8:       08 20 07 e5     str     r2, [r7, #-8]
      dc:       00 00 90 e5     ldr     r0, [r0]
      e0:       14 00 8d e5     str     r0, [sp, #20]
      e4:       08 00 17 e5     ldr     r0, [r7, #-8]
      e8:       04 20 80 e2     add     r2, r0, #4
      ec:       08 20 07 e5     str     r2, [r7, #-8]
      f0:       00 00 90 e5     ldr     r0, [r0]
      f4:       10 00 8d e5     str     r0, [sp, #16]
      f8:       0f 10 cd e5     strb    r1, [sp, #15]
      fc:       0c 00 17 e5     ldr     r0, [r7, #-12]
     100:       10 10 17 e5     ldr     r1, [r7, #-16]
     104:       14 20 17 e5     ldr     r2, [r7, #-20]
     108:       18 30 17 e5     ldr     r3, [r7, #-24]
     10c:       18 90 9d e5     ldr     r9, [sp, #24]
     110:       14 c0 9d e5     ldr     r12, [sp, #20]
     114:       10 e0 9d e5     ldr     lr, [sp, #16]
     118:       00 90 8d e5     str     r9, [sp]
     11c:       04 c0 8d e5     str     r12, [sp, #4]
     120:       08 e0 8d e5     str     lr, [sp, #8]
     124:       b5 ff ff eb     bl      #-300 <_leaf_call>
     128:       07 d0 a0 e1     mov     sp, r7
     12c:       80 40 bd e8     pop     {r7, lr}
     130:       0c d0 8d e2     add     sp, sp, #12
     134:       1e ff 2f e1     bx      lr

_main:
     138:       90 40 2d e9     push    {r4, r7, lr}
     13c:       04 70 8d e2     add     r7, sp, #4
     140:       14 d0 4d e2     sub     sp, sp, #20
     144:       00 00 00 e3     movw    r0, #0
     148:       01 10 00 e3     movw    r1, #1
     14c:       02 20 00 e3     movw    r2, #2
     150:       03 30 00 e3     movw    r3, #3
     154:       04 90 00 e3     movw    r9, #4
     158:       05 c0 00 e3     movw    r12, #5
     15c:       06 e0 00 e3     movw    lr, #6
     160:       07 40 00 e3     movw    r4, #7
     164:       08 00 07 e5     str     r0, [r7, #-8]
     168:       00 90 8d e5     str     r9, [sp]
     16c:       04 c0 8d e5     str     r12, [sp, #4]
     170:       08 e0 8d e5     str     lr, [sp, #8]
     174:       0c 40 8d e5     str     r4, [sp, #12]
     178:       af ff ff eb     bl      #-324 <_nonleaf_call>
     17c:       00 00 00 e3     movw    r0, #0
     180:       04 d0 47 e2     sub     sp, r7, #4
     184:       90 80 bd e8     pop     {r4, r7, pc}

; vim: ft=asm68k