Artifact
7f420ef8c44192aab00f1425f85e745e9f18dceb:
0000: 2f 2a 20 76 61 63 61 6c 6c 20 66 75 6e 63 74 69 /* vacall functi
0010: 6f 6e 20 66 6f 72 20 69 33 38 36 20 43 50 55 20 on for i386 CPU
0020: 2a 2f 0a 0a 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 */../*. * Copyri
0030: 67 68 74 20 31 39 39 35 2d 32 30 30 34 20 42 72 ght 1995-2004 Br
0040: 75 6e 6f 20 48 61 69 62 6c 65 2c 20 3c 62 72 75 uno Haible, <bru
0050: 6e 6f 40 63 6c 69 73 70 2e 6f 72 67 3e 0a 20 2a no@clisp.org>. *
0060: 0a 20 2a 20 54 68 69 73 20 69 73 20 66 72 65 65 . * This is free
0070: 20 73 6f 66 74 77 61 72 65 20 64 69 73 74 72 69 software distri
0080: 62 75 74 65 64 20 75 6e 64 65 72 20 74 68 65 20 buted under the
0090: 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c GNU General Publ
00a0: 69 63 20 4c 69 63 65 6e 63 65 0a 20 2a 20 64 65 ic Licence. * de
00b0: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 66 scribed in the f
00c0: 69 6c 65 20 43 4f 50 59 49 4e 47 2e 20 43 6f 6e ile COPYING. Con
00d0: 74 61 63 74 20 74 68 65 20 61 75 74 68 6f 72 20 tact the author
00e0: 69 66 20 79 6f 75 20 64 6f 6e 27 74 20 68 61 76 if you don't hav
00f0: 65 20 74 68 69 73 0a 20 2a 20 6f 72 20 63 61 6e e this. * or can
0100: 27 74 20 6c 69 76 65 20 77 69 74 68 20 69 74 2e 't live with it.
0110: 20 54 68 65 72 65 20 69 73 20 41 42 53 4f 4c 55 There is ABSOLU
0120: 54 45 4c 59 20 4e 4f 20 57 41 52 52 41 4e 54 59 TELY NO WARRANTY
0130: 2c 20 65 78 70 6c 69 63 69 74 20 6f 72 20 69 6d , explicit or im
0140: 70 6c 69 65 64 2c 0a 20 2a 20 6f 6e 20 74 68 69 plied,. * on thi
0150: 73 20 73 6f 66 74 77 61 72 65 2e 0a 20 2a 2f 0a s software.. */.
0160: 0a 23 69 66 6e 64 65 66 20 52 45 45 4e 54 52 41 .#ifndef REENTRA
0170: 4e 54 0a 23 69 6e 63 6c 75 64 65 20 22 76 61 63 NT.#include "vac
0180: 61 6c 6c 2e 68 2e 69 6e 22 0a 23 65 6c 73 65 20 all.h.in".#else
0190: 2f 2a 20 52 45 45 4e 54 52 41 4e 54 20 2a 2f 0a /* REENTRANT */.
01a0: 23 69 6e 63 6c 75 64 65 20 22 76 61 63 61 6c 6c #include "vacall
01b0: 5f 72 2e 68 2e 69 6e 22 0a 23 65 6e 64 69 66 0a _r.h.in".#endif.
01c0: 0a 23 69 66 64 65 66 20 52 45 45 4e 54 52 41 4e .#ifdef REENTRAN
01d0: 54 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 T.typedef struct
01e0: 20 7b 20 76 6f 69 64 20 28 2a 76 61 63 61 6c 6c { void (*vacall
01f0: 5f 66 75 6e 63 74 69 6f 6e 29 20 28 76 6f 69 64 _function) (void
0200: 2a 2c 76 61 5f 61 6c 69 73 74 29 3b 20 76 6f 69 *,va_alist); voi
0210: 64 2a 20 61 72 67 3b 20 7d 20 65 6e 76 5f 74 3b d* arg; } env_t;
0220: 0a 23 65 6e 64 69 66 0a 72 65 67 69 73 74 65 72 .#endif.register
0230: 20 76 6f 69 64 2a 09 73 70 09 5f 5f 61 73 6d 5f void*.sp.__asm_
0240: 5f 28 22 25 65 73 70 22 29 3b 0a 72 65 67 69 73 _("%esp");.regis
0250: 74 65 72 20 76 6f 69 64 2a 09 73 72 65 74 09 5f ter void*.sret._
0260: 5f 61 73 6d 5f 5f 28 22 25 65 62 78 22 29 3b 0a _asm__("%ebx");.
0270: 72 65 67 69 73 74 65 72 20 69 6e 74 09 69 72 65 register int.ire
0280: 74 09 5f 5f 61 73 6d 5f 5f 28 22 25 65 61 78 22 t.__asm__("%eax"
0290: 29 3b 0a 2f 2a 0a 20 2a 20 54 65 6c 6c 20 67 63 );./*. * Tell gc
02a0: 63 20 74 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 c to not use the
02b0: 20 63 61 6c 6c 2d 73 61 76 65 64 20 72 65 67 69 call-saved regi
02c0: 73 74 65 72 73 20 25 65 73 69 2c 20 25 65 64 69 sters %esi, %edi
02d0: 2c 20 25 65 62 70 2e 0a 20 2a 20 54 68 69 73 20 , %ebp.. * This
02e0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 ensures that the
02f0: 20 72 65 74 75 72 6e 20 73 65 71 75 65 6e 63 65 return sequence
0300: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 does not need t
0310: 6f 20 72 65 73 74 6f 72 65 20 72 65 67 69 73 74 o restore regist
0320: 65 72 73 0a 20 2a 20 66 72 6f 6d 20 74 68 65 20 ers. * from the
0330: 73 74 61 63 6b 2e 0a 20 2a 2f 0a 72 65 67 69 73 stack.. */.regis
0340: 74 65 72 20 76 6f 69 64 2a 09 64 75 6d 6d 79 31 ter void*.dummy1
0350: 09 5f 5f 61 73 6d 5f 5f 28 22 25 65 73 69 22 29 .__asm__("%esi")
0360: 3b 0a 72 65 67 69 73 74 65 72 20 76 6f 69 64 2a ;.register void*
0370: 09 64 75 6d 6d 79 32 09 5f 5f 61 73 6d 5f 5f 28 .dummy2.__asm__(
0380: 22 25 65 64 69 22 29 3b 0a 72 65 67 69 73 74 65 "%edi");.registe
0390: 72 20 76 6f 69 64 2a 09 64 75 6d 6d 79 33 09 5f r void*.dummy3._
03a0: 5f 61 73 6d 5f 5f 28 22 25 65 62 70 22 29 3b 0a _asm__("%ebp");.
03b0: 0a 76 6f 69 64 20 2f 2a 20 74 68 65 20 72 65 74 .void /* the ret
03c0: 75 72 6e 20 74 79 70 65 20 69 73 20 76 61 72 69 urn type is vari
03d0: 61 62 6c 65 2c 20 6e 6f 74 20 76 6f 69 64 21 20 able, not void!
03e0: 2a 2f 0a 23 69 66 64 65 66 20 52 45 45 4e 54 52 */.#ifdef REENTR
03f0: 41 4e 54 0a 5f 5f 76 61 63 61 6c 6c 5f 72 20 28 ANT.__vacall_r (
0400: 65 6e 76 5f 74 20 2a 20 65 6e 76 2c 20 5f 5f 76 env_t * env, __v
0410: 61 77 6f 72 64 20 66 69 72 73 74 77 6f 72 64 29 aword firstword)
0420: 0a 23 65 6c 73 65 0a 5f 5f 76 61 63 61 6c 6c 20 .#else.__vacall
0430: 28 5f 5f 76 61 77 6f 72 64 20 66 69 72 73 74 77 (__vaword firstw
0440: 6f 72 64 29 0a 23 65 6e 64 69 66 0a 7b 0a 20 20 ord).#endif.{.
0450: 5f 5f 76 61 5f 61 6c 69 73 74 20 6c 69 73 74 3b __va_alist list;
0460: 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 . /* Prepare th
0470: 65 20 76 61 5f 61 6c 69 73 74 2e 20 2a 2f 0a 20 e va_alist. */.
0480: 20 6c 69 73 74 2e 66 6c 61 67 73 20 3d 20 30 3b list.flags = 0;
0490: 0a 20 20 6c 69 73 74 2e 61 70 74 72 20 3d 20 28 . list.aptr = (
04a0: 6c 6f 6e 67 29 26 66 69 72 73 74 77 6f 72 64 3b long)&firstword;
04b0: 0a 20 20 6c 69 73 74 2e 72 61 64 64 72 20 3d 20 . list.raddr =
04c0: 28 76 6f 69 64 2a 29 30 3b 0a 20 20 6c 69 73 74 (void*)0;. list
04d0: 2e 72 74 79 70 65 20 3d 20 5f 5f 56 41 76 6f 69 .rtype = __VAvoi
04e0: 64 3b 0a 20 20 6c 69 73 74 2e 73 74 72 75 63 74 d;. list.struct
04f0: 72 61 64 64 72 20 3d 20 73 72 65 74 3b 0a 20 20 raddr = sret;.
0500: 2f 2a 20 43 61 6c 6c 20 76 61 63 61 6c 6c 5f 66 /* Call vacall_f
0510: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6d 61 63 unction. The mac
0520: 72 6f 73 20 64 6f 20 61 6c 6c 20 74 68 65 20 72 ros do all the r
0530: 65 73 74 2e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 est. */.#ifndef
0540: 52 45 45 4e 54 52 41 4e 54 0a 20 20 28 2a 76 61 REENTRANT. (*va
0550: 63 61 6c 6c 5f 66 75 6e 63 74 69 6f 6e 29 20 28 call_function) (
0560: 26 6c 69 73 74 29 3b 0a 23 65 6c 73 65 20 2f 2a &list);.#else /*
0570: 20 52 45 45 4e 54 52 41 4e 54 20 2a 2f 0a 20 20 REENTRANT */.
0580: 28 2a 65 6e 76 2d 3e 76 61 63 61 6c 6c 5f 66 75 (*env->vacall_fu
0590: 6e 63 74 69 6f 6e 29 20 28 65 6e 76 2d 3e 61 72 nction) (env->ar
05a0: 67 2c 26 6c 69 73 74 29 3b 0a 23 65 6e 64 69 66 g,&list);.#endif
05b0: 0a 20 20 2f 2a 20 50 75 74 20 72 65 74 75 72 6e . /* Put return
05c0: 20 76 61 6c 75 65 20 69 6e 74 6f 20 70 72 6f 70 value into prop
05d0: 65 72 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a er register. */.
05e0: 20 20 69 66 20 28 6c 69 73 74 2e 72 74 79 70 65 if (list.rtype
05f0: 20 3d 3d 20 5f 5f 56 41 76 6f 69 64 29 20 7b 0a == __VAvoid) {.
0600: 20 20 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c } else. if (l
0610: 69 73 74 2e 72 74 79 70 65 20 3d 3d 20 5f 5f 56 ist.rtype == __V
0620: 41 63 68 61 72 29 20 7b 0a 20 20 20 20 69 72 65 Achar) {. ire
0630: 74 20 3d 20 6c 69 73 74 2e 74 6d 70 2e 5f 63 68 t = list.tmp._ch
0640: 61 72 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69 ar;. } else. i
0650: 66 20 28 6c 69 73 74 2e 72 74 79 70 65 20 3d 3d f (list.rtype ==
0660: 20 5f 5f 56 41 73 63 68 61 72 29 20 7b 0a 20 20 __VAschar) {.
0670: 20 20 69 72 65 74 20 3d 20 6c 69 73 74 2e 74 6d iret = list.tm
0680: 70 2e 5f 73 63 68 61 72 3b 0a 20 20 7d 20 65 6c p._schar;. } el
0690: 73 65 0a 20 20 69 66 20 28 6c 69 73 74 2e 72 74 se. if (list.rt
06a0: 79 70 65 20 3d 3d 20 5f 5f 56 41 75 63 68 61 72 ype == __VAuchar
06b0: 29 20 7b 0a 20 20 20 20 69 72 65 74 20 3d 20 6c ) {. iret = l
06c0: 69 73 74 2e 74 6d 70 2e 5f 75 63 68 61 72 3b 0a ist.tmp._uchar;.
06d0: 20 20 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c } else. if (l
06e0: 69 73 74 2e 72 74 79 70 65 20 3d 3d 20 5f 5f 56 ist.rtype == __V
06f0: 41 73 68 6f 72 74 29 20 7b 0a 20 20 20 20 69 72 Ashort) {. ir
0700: 65 74 20 3d 20 6c 69 73 74 2e 74 6d 70 2e 5f 73 et = list.tmp._s
0710: 68 6f 72 74 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 hort;. } else.
0720: 20 69 66 20 28 6c 69 73 74 2e 72 74 79 70 65 20 if (list.rtype
0730: 3d 3d 20 5f 5f 56 41 75 73 68 6f 72 74 29 20 7b == __VAushort) {
0740: 0a 20 20 20 20 69 72 65 74 20 3d 20 6c 69 73 74 . iret = list
0750: 2e 74 6d 70 2e 5f 75 73 68 6f 72 74 3b 0a 20 20 .tmp._ushort;.
0760: 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 69 73 } else. if (lis
0770: 74 2e 72 74 79 70 65 20 3d 3d 20 5f 5f 56 41 69 t.rtype == __VAi
0780: 6e 74 29 20 7b 0a 20 20 20 20 69 72 65 74 20 3d nt) {. iret =
0790: 20 6c 69 73 74 2e 74 6d 70 2e 5f 69 6e 74 3b 0a list.tmp._int;.
07a0: 20 20 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c } else. if (l
07b0: 69 73 74 2e 72 74 79 70 65 20 3d 3d 20 5f 5f 56 ist.rtype == __V
07c0: 41 75 69 6e 74 29 20 7b 0a 20 20 20 20 69 72 65 Auint) {. ire
07d0: 74 20 3d 20 6c 69 73 74 2e 74 6d 70 2e 5f 75 69 t = list.tmp._ui
07e0: 6e 74 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69 nt;. } else. i
07f0: 66 20 28 6c 69 73 74 2e 72 74 79 70 65 20 3d 3d f (list.rtype ==
0800: 20 5f 5f 56 41 6c 6f 6e 67 29 20 7b 0a 20 20 20 __VAlong) {.
0810: 20 69 72 65 74 20 3d 20 6c 69 73 74 2e 74 6d 70 iret = list.tmp
0820: 2e 5f 6c 6f 6e 67 3b 0a 20 20 7d 20 65 6c 73 65 ._long;. } else
0830: 0a 20 20 69 66 20 28 6c 69 73 74 2e 72 74 79 70 . if (list.rtyp
0840: 65 20 3d 3d 20 5f 5f 56 41 75 6c 6f 6e 67 29 20 e == __VAulong)
0850: 7b 0a 20 20 20 20 69 72 65 74 20 3d 20 6c 69 73 {. iret = lis
0860: 74 2e 74 6d 70 2e 5f 75 6c 6f 6e 67 3b 0a 20 20 t.tmp._ulong;.
0870: 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 69 73 } else. if (lis
0880: 74 2e 72 74 79 70 65 20 3d 3d 20 5f 5f 56 41 6c t.rtype == __VAl
0890: 6f 6e 67 6c 6f 6e 67 20 7c 7c 20 6c 69 73 74 2e onglong || list.
08a0: 72 74 79 70 65 20 3d 3d 20 5f 5f 56 41 75 6c 6f rtype == __VAulo
08b0: 6e 67 6c 6f 6e 67 29 20 7b 0a 20 20 20 20 2f 2a nglong) {. /*
08c0: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 45 58 This code is EX
08d0: 54 52 45 4d 45 4c 59 20 66 72 61 67 69 6c 65 21 TREMELY fragile!
08e0: 21 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 !
08f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20 */. /*
0900: 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 It depends on th
0910: 65 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 e register alloc
0920: 61 74 69 6f 6e 20 63 68 6f 73 65 6e 20 62 79 20 ation chosen by
0930: 67 63 63 2e 20 2a 2f 0a 20 20 20 20 69 72 65 74 gcc. */. iret
0940: 20 3d 20 28 28 5f 5f 76 61 77 6f 72 64 20 2a 29 = ((__vaword *)
0950: 20 26 6c 69 73 74 2e 74 6d 70 2e 5f 6c 6f 6e 67 &list.tmp._long
0960: 6c 6f 6e 67 29 5b 30 5d 3b 0a 20 20 20 20 61 73 long)[0];. as
0970: 6d 20 76 6f 6c 61 74 69 6c 65 20 28 22 6d 6f 76 m volatile ("mov
0980: 6c 20 25 30 2c 25 25 65 64 78 22 20 3a 20 3a 20 l %0,%%edx" : :
0990: 22 67 22 28 28 28 5f 5f 76 61 77 6f 72 64 20 2a "g"(((__vaword *
09a0: 29 20 26 6c 69 73 74 2e 74 6d 70 2e 5f 6c 6f 6e ) &list.tmp._lon
09b0: 67 6c 6f 6e 67 29 5b 31 5d 29 29 3b 0a 20 20 7d glong)[1]));. }
09c0: 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 69 73 74 else. if (list
09d0: 2e 72 74 79 70 65 20 3d 3d 20 5f 5f 56 41 66 6c .rtype == __VAfl
09e0: 6f 61 74 29 20 7b 0a 20 20 20 20 61 73 6d 20 76 oat) {. asm v
09f0: 6f 6c 61 74 69 6c 65 20 28 22 66 6c 64 73 20 25 olatile ("flds %
0a00: 30 22 3a 20 3a 20 22 6d 22 28 6c 69 73 74 2e 74 0": : "m"(list.t
0a10: 6d 70 2e 5f 66 6c 6f 61 74 29 29 3b 0a 20 20 7d mp._float));. }
0a20: 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 69 73 74 else. if (list
0a30: 2e 72 74 79 70 65 20 3d 3d 20 5f 5f 56 41 64 6f .rtype == __VAdo
0a40: 75 62 6c 65 29 20 7b 0a 20 20 20 20 61 73 6d 20 uble) {. asm
0a50: 76 6f 6c 61 74 69 6c 65 20 28 22 66 6c 64 6c 20 volatile ("fldl
0a60: 25 30 22 3a 20 3a 20 22 6d 22 28 6c 69 73 74 2e %0": : "m"(list.
0a70: 74 6d 70 2e 5f 64 6f 75 62 6c 65 29 29 3b 0a 20 tmp._double));.
0a80: 20 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 69 } else. if (li
0a90: 73 74 2e 72 74 79 70 65 20 3d 3d 20 5f 5f 56 41 st.rtype == __VA
0aa0: 76 6f 69 64 70 29 20 7b 0a 20 20 20 20 69 72 65 voidp) {. ire
0ab0: 74 20 3d 20 28 6c 6f 6e 67 29 6c 69 73 74 2e 74 t = (long)list.t
0ac0: 6d 70 2e 5f 70 74 72 3b 0a 20 20 7d 20 65 6c 73 mp._ptr;. } els
0ad0: 65 0a 20 20 69 66 20 28 6c 69 73 74 2e 72 74 79 e. if (list.rty
0ae0: 70 65 20 3d 3d 20 5f 5f 56 41 73 74 72 75 63 74 pe == __VAstruct
0af0: 29 20 7b 0a 20 20 20 20 69 66 20 28 6c 69 73 74 ) {. if (list
0b00: 2e 66 6c 61 67 73 20 26 20 5f 5f 56 41 5f 50 43 .flags & __VA_PC
0b10: 43 5f 53 54 52 55 43 54 5f 52 45 54 55 52 4e 29 C_STRUCT_RETURN)
0b20: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 70 63 63 20 {. /* pcc
0b30: 73 74 72 75 63 74 20 72 65 74 75 72 6e 20 63 6f struct return co
0b40: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 nvention */.
0b50: 20 20 69 72 65 74 20 3d 20 28 6c 6f 6e 67 29 20 iret = (long)
0b60: 6c 69 73 74 2e 72 61 64 64 72 3b 0a 20 20 20 20 list.raddr;.
0b70: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f } else {. /
0b80: 2a 20 6e 6f 72 6d 61 6c 20 73 74 72 75 63 74 20 * normal struct
0b90: 72 65 74 75 72 6e 20 63 6f 6e 76 65 6e 74 69 6f return conventio
0ba0: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 6c n */. if (l
0bb0: 69 73 74 2e 66 6c 61 67 73 20 26 20 5f 5f 56 41 ist.flags & __VA
0bc0: 5f 52 45 47 49 53 54 45 52 5f 53 54 52 55 43 54 _REGISTER_STRUCT
0bd0: 5f 52 45 54 55 52 4e 29 20 7b 0a 20 20 20 20 20 _RETURN) {.
0be0: 20 20 20 69 66 20 28 6c 69 73 74 2e 72 73 69 7a if (list.rsiz
0bf0: 65 20 3d 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 e == sizeof(char
0c00: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 )) {. i
0c10: 72 65 74 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64 ret = *(unsigned
0c20: 20 63 68 61 72 20 2a 29 20 6c 69 73 74 2e 72 61 char *) list.ra
0c30: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 ddr;. g
0c40: 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 20 20 oto done;.
0c50: 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20 20 20 } else.
0c60: 20 69 66 20 28 6c 69 73 74 2e 72 73 69 7a 65 20 if (list.rsize
0c70: 3d 3d 20 73 69 7a 65 6f 66 28 73 68 6f 72 74 29 == sizeof(short)
0c80: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 72 ) {. ir
0c90: 65 74 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20 et = *(unsigned
0ca0: 73 68 6f 72 74 20 2a 29 20 6c 69 73 74 2e 72 61 short *) list.ra
0cb0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 ddr;. g
0cc0: 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 20 20 oto done;.
0cd0: 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20 20 20 } else.
0ce0: 20 69 66 20 28 6c 69 73 74 2e 72 73 69 7a 65 20 if (list.rsize
0cf0: 3d 3d 20 73 69 7a 65 6f 66 28 69 6e 74 29 29 20 == sizeof(int))
0d00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 72 65 74 {. iret
0d10: 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e = *(unsigned in
0d20: 74 20 2a 29 20 6c 69 73 74 2e 72 61 64 64 72 3b t *) list.raddr;
0d30: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 . goto
0d40: 64 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 done;. }
0d50: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 20 else. if
0d60: 28 6c 69 73 74 2e 72 73 69 7a 65 20 3d 3d 20 32 (list.rsize == 2
0d70: 2a 73 69 7a 65 6f 66 28 5f 5f 76 61 77 6f 72 64 *sizeof(__vaword
0d80: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f )) {. /
0d90: 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 45 * This code is E
0da0: 58 54 52 45 4d 45 4c 59 20 66 72 61 67 69 6c 65 XTREMELY fragile
0db0: 21 21 20 20 20 20 20 20 20 20 20 20 20 20 20 20 !!
0dc0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 */.
0dd0: 20 20 20 20 2f 2a 20 49 74 20 64 65 70 65 6e 64 /* It depend
0de0: 73 20 6f 6e 20 74 68 65 20 72 65 67 69 73 74 65 s on the registe
0df0: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 68 6f r allocation cho
0e00: 73 65 6e 20 62 79 20 67 63 63 2e 20 2a 2f 0a 20 sen by gcc. */.
0e10: 20 20 20 20 20 20 20 20 20 69 72 65 74 20 3d 20 iret =
0e20: 28 28 5f 5f 76 61 77 6f 72 64 20 2a 29 20 6c 69 ((__vaword *) li
0e30: 73 74 2e 72 61 64 64 72 29 5b 30 5d 3b 0a 20 20 st.raddr)[0];.
0e40: 20 20 20 20 20 20 20 20 61 73 6d 20 76 6f 6c 61 asm vola
0e50: 74 69 6c 65 20 28 22 6d 6f 76 6c 20 25 30 2c 25 tile ("movl %0,%
0e60: 25 65 64 78 22 20 3a 20 3a 20 22 67 22 28 28 28 %edx" : : "g"(((
0e70: 5f 5f 76 61 77 6f 72 64 20 2a 29 20 6c 69 73 74 __vaword *) list
0e80: 2e 72 61 64 64 72 29 5b 31 5d 29 29 3b 0a 20 20 .raddr)[1]));.
0e90: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 6f 6e goto don
0ea0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 e;. }.
0eb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 21 }. if (!
0ec0: 28 6c 69 73 74 2e 66 6c 61 67 73 20 26 20 28 5f (list.flags & (_
0ed0: 5f 56 41 5f 4e 45 58 54 47 43 43 5f 53 54 52 55 _VA_NEXTGCC_STRU
0ee0: 43 54 5f 52 45 54 55 52 4e 20 7c 20 5f 5f 56 41 CT_RETURN | __VA
0ef0: 5f 4d 53 56 43 5f 53 54 52 55 43 54 5f 52 45 54 _MSVC_STRUCT_RET
0f00: 55 52 4e 29 29 29 20 7b 0a 20 20 20 20 20 20 20 URN))) {.
0f10: 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 70 /* We have to p
0f20: 6f 70 20 74 68 65 20 73 74 72 75 63 74 20 72 65 op the struct re
0f30: 74 75 72 6e 20 61 64 64 72 65 73 73 20 6f 66 66 turn address off
0f40: 20 74 68 65 20 73 74 61 63 6b 2e 20 2a 2f 0a 20 the stack. */.
0f50: 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 72 /* Caller
0f60: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 s compiled with
0f70: 2d 66 6f 6d 69 74 2d 66 72 61 6d 65 2d 70 6f 69 -fomit-frame-poi
0f80: 6e 74 65 72 20 65 78 70 65 63 74 20 74 68 69 73 nter expect this
0f90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 . */. /*
0fa0: 52 65 74 75 72 6e 20 76 69 61 20 61 20 22 72 65 Return via a "re
0fb0: 74 20 24 34 22 20 69 6e 73 74 72 75 63 74 69 6f t $4" instructio
0fc0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a n. */. /*
0fd0: 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 45 NOTE: This is E
0fe0: 58 54 52 45 4d 45 4c 59 20 66 72 61 67 69 6c 65 XTREMELY fragile
0ff0: 2e 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 . It depends on
1000: 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 the fact that.
1010: 20 20 20 20 20 20 20 2a 20 6e 6f 20 72 65 67 69 * no regi
1020: 73 74 65 72 73 20 68 61 76 65 20 74 6f 20 62 65 sters have to be
1030: 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 restored from t
1040: 68 65 20 73 74 61 63 6b 2e 20 4c 6f 6f 6b 20 61 he stack. Look a
1050: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 2a t the. *
1060: 20 61 73 73 65 6d 62 6c 79 20 63 6f 64 65 21 0a assembly code!.
1070: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 */.
1080: 20 20 20 20 73 70 20 3d 20 5f 5f 62 75 69 6c 74 sp = __built
1090: 69 6e 5f 66 72 61 6d 65 5f 61 64 64 72 65 73 73 in_frame_address
10a0: 28 30 29 3b 0a 23 69 66 6e 64 65 66 20 52 45 45 (0);.#ifndef REE
10b0: 4e 54 52 41 4e 54 0a 20 20 20 20 20 20 20 20 61 NTRANT. a
10c0: 73 6d 20 76 6f 6c 61 74 69 6c 65 20 28 22 72 65 sm volatile ("re
10d0: 74 20 24 34 22 29 3b 0a 23 65 6c 73 65 0a 20 20 t $4");.#else.
10e0: 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 70 6f /* Also po
10f0: 70 20 65 6e 76 20 6f 66 66 20 74 68 65 20 73 74 p env off the st
1100: 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 ack. */.
1110: 61 73 6d 20 76 6f 6c 61 74 69 6c 65 20 28 22 72 asm volatile ("r
1120: 65 74 20 24 38 22 29 3b 0a 23 65 6e 64 69 66 0a et $8");.#endif.
1130: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 54 52 45 41 /*NOTREA
1140: 43 48 45 44 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 CHED*/. }.
1150: 20 20 20 20 20 69 66 20 28 6c 69 73 74 2e 66 6c if (list.fl
1160: 61 67 73 20 26 20 5f 5f 56 41 5f 4d 53 56 43 5f ags & __VA_MSVC_
1170: 53 54 52 55 43 54 5f 52 45 54 55 52 4e 29 20 7b STRUCT_RETURN) {
1180: 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 20 4d . /* on M
1190: 53 56 43 2c 20 6d 75 73 74 20 70 75 74 20 74 68 SVC, must put th
11a0: 65 20 73 74 72 75 63 74 75 72 65 20 61 64 64 72 e structure addr
11b0: 65 73 73 20 69 6e 74 6f 20 25 65 61 78 20 2a 2f ess into %eax */
11c0: 0a 20 20 20 20 20 20 20 20 69 72 65 74 20 3d 20 . iret =
11d0: 28 6c 6f 6e 67 29 20 6c 69 73 74 2e 72 61 64 64 (long) list.radd
11e0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 r;. }.
11f0: 20 64 6f 6e 65 3a 20 3b 0a 20 20 20 20 7d 0a 20 done: ;. }.
1200: 20 7d 0a 20 20 69 66 20 28 6c 69 73 74 2e 66 6c }. if (list.fl
1210: 61 67 73 20 26 20 5f 5f 56 41 5f 53 54 44 43 41 ags & __VA_STDCA
1220: 4c 4c 5f 43 4c 45 41 4e 55 50 29 20 7b 0a 20 20 LL_CLEANUP) {.
1230: 20 20 2f 2a 20 52 65 74 75 72 6e 2c 20 61 6e 64 /* Return, and
1240: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d at the same tim
1250: 65 20 70 6f 70 20 74 68 65 20 61 72 67 75 6d 65 e pop the argume
1260: 6e 74 73 20 6f 66 66 20 74 68 65 20 73 74 61 63 nts off the stac
1270: 6b 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 4e 6f 72 k. */. /* Nor
1280: 6d 61 6c 6c 79 20 64 6f 6e 65 20 74 68 72 6f 75 mally done throu
1290: 67 68 20 61 20 22 72 65 74 20 24 6e 22 20 69 6e gh a "ret $n" in
12a0: 73 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 struction. */.
12b0: 20 20 2f 2a 20 42 65 20 63 61 72 65 66 75 6c 20 /* Be careful
12c0: 6e 6f 74 20 74 6f 20 63 6c 6f 62 62 65 72 20 25 not to clobber %
12d0: 65 61 78 20 61 6e 64 20 25 65 64 78 2e 20 4f 6e eax and %edx. On
12e0: 6c 79 20 25 65 63 78 20 63 61 6e 20 62 65 20 75 ly %ecx can be u
12f0: 73 65 64 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 sed. */. /* U
1300: 73 65 20 2a 5f 5f 62 75 69 6c 74 69 6e 5f 66 72 se *__builtin_fr
1310: 61 6d 65 5f 61 64 64 72 65 73 73 28 30 29 2c 20 ame_address(0),
1320: 73 69 6e 63 65 20 5f 5f 62 75 69 6c 74 69 6e 5f since __builtin_
1330: 72 65 74 75 72 6e 5f 61 64 64 72 65 73 73 28 30 return_address(0
1340: 29 0a 20 20 20 20 20 2a 20 69 73 20 62 75 67 67 ). * is bugg
1350: 79 20 69 6e 20 67 63 63 2d 32 2e 37 2e 32 2e 20 y in gcc-2.7.2.
1360: 2a 2f 0a 20 20 20 20 61 73 6d 20 76 6f 6c 61 74 */. asm volat
1370: 69 6c 65 20 28 22 6d 6f 76 6c 20 25 30 2c 25 25 ile ("movl %0,%%
1380: 65 63 78 22 20 3a 20 3a 20 22 67 22 20 28 2a 28 ecx" : : "g" (*(
1390: 76 6f 69 64 2a 2a 29 5f 5f 62 75 69 6c 74 69 6e void**)__builtin
13a0: 5f 66 72 61 6d 65 5f 61 64 64 72 65 73 73 28 30 _frame_address(0
13b0: 29 29 29 3b 0a 20 20 20 20 73 70 20 3d 20 28 76 )));. sp = (v
13c0: 6f 69 64 2a 29 6c 69 73 74 2e 61 70 74 72 3b 0a oid*)list.aptr;.
13d0: 20 20 20 20 61 73 6d 20 76 6f 6c 61 74 69 6c 65 asm volatile
13e0: 20 28 22 6a 6d 70 20 2a 25 65 63 78 22 29 3b 0a ("jmp *%ecx");.
13f0: 20 20 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 /*NOTREACHED
1400: 2a 2f 0a 20 20 7d 0a 23 69 66 64 65 66 20 52 45 */. }.#ifdef RE
1410: 45 4e 54 52 41 4e 54 0a 20 20 2f 2a 20 50 6f 70 ENTRANT. /* Pop
1420: 20 65 6e 76 20 6f 66 66 20 74 68 65 20 73 74 61 env off the sta
1430: 63 6b 2e 20 2a 2f 0a 20 20 2f 2a 20 43 61 6c 6c ck. */. /* Call
1440: 65 72 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 ers compiled wit
1450: 68 20 2d 66 6f 6d 69 74 2d 66 72 61 6d 65 2d 70 h -fomit-frame-p
1460: 6f 69 6e 74 65 72 20 65 78 70 65 63 74 20 74 68 ointer expect th
1470: 69 73 2e 20 2a 2f 0a 20 20 73 70 20 3d 20 5f 5f is. */. sp = __
1480: 62 75 69 6c 74 69 6e 5f 66 72 61 6d 65 5f 61 64 builtin_frame_ad
1490: 64 72 65 73 73 28 30 29 3b 0a 20 20 61 73 6d 20 dress(0);. asm
14a0: 76 6f 6c 61 74 69 6c 65 20 28 22 72 65 74 20 24 volatile ("ret $
14b0: 34 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 4");.#endif.}.