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.}.