1  /* The purpose of this test is to catch edge cases when arguments are passed
       2     in regs and on the stack.  We test 16 cases, trying to catch multiple
       3     targets (some use 3 regs for argument passing, some use 12, etc.).
       4     We test both the arguments and the `lastarg' (the argument to va_start).  */
       5  
       6  #include <stdarg.h>
       7  
       8  extern __SIZE_TYPE__ strlen ();
       9  
      10  int
      11  to_hex (unsigned int a)
      12  {
      13    static char hex[] = "0123456789abcdef";
      14  
      15    if (a > 15)
      16      abort ();
      17    return hex[a];
      18  }
      19  
      20  void
      21  f0 (char* format, ...)
      22  {
      23    va_list ap;
      24  
      25    va_start (ap, format);
      26    if (strlen (format) != 16 - 0)
      27      abort ();
      28    while (*format)
      29      if (*format++ != to_hex (va_arg (ap, int)))
      30        abort ();
      31    va_end(ap);
      32  }
      33  
      34  void
      35  f1 (int a1, char* format, ...)
      36  {
      37    va_list ap;
      38  
      39    va_start(ap, format);
      40    if (strlen (format) != 16 - 1)
      41      abort ();
      42    while (*format)
      43      if (*format++ != to_hex (va_arg (ap, int)))
      44        abort ();
      45    va_end(ap);
      46  }
      47  
      48  void
      49  f2 (int a1, int a2, char* format, ...)
      50  {
      51    va_list ap;
      52  
      53    va_start(ap, format);
      54    if (strlen (format) != 16 - 2)
      55      abort ();
      56    while (*format)
      57      if (*format++ != to_hex (va_arg (ap, int)))
      58        abort ();
      59    va_end(ap);
      60  }
      61  
      62  void
      63  f3 (int a1, int a2, int a3, char* format, ...)
      64  {
      65    va_list ap;
      66  
      67    va_start(ap, format);
      68    if (strlen (format) != 16 - 3)
      69      abort ();
      70    while (*format)
      71      if (*format++ != to_hex (va_arg (ap, int)))
      72        abort ();
      73    va_end(ap);
      74  }
      75  
      76  void
      77  f4 (int a1, int a2, int a3, int a4, char* format, ...)
      78  {
      79    va_list ap;
      80  
      81    va_start(ap, format);
      82    if (strlen (format) != 16 - 4)
      83      abort ();
      84    while (*format)
      85      if (*format++ != to_hex (va_arg (ap, int)))
      86        abort ();
      87    va_end(ap);
      88  }
      89  
      90  void
      91  f5 (int a1, int a2, int a3, int a4, int a5,
      92      char* format, ...)
      93  {
      94    va_list ap;
      95  
      96    va_start(ap, format);
      97    if (strlen (format) != 16 - 5)
      98      abort ();
      99    while (*format)
     100      if (*format++ != to_hex (va_arg (ap, int)))
     101        abort ();
     102    va_end(ap);
     103  }
     104  
     105  void
     106  f6 (int a1, int a2, int a3, int a4, int a5,
     107      int a6,
     108      char* format, ...)
     109  {
     110    va_list ap;
     111  
     112    va_start(ap, format);
     113    if (strlen (format) != 16 - 6)
     114      abort ();
     115    while (*format)
     116      if (*format++ != to_hex (va_arg (ap, int)))
     117        abort ();
     118    va_end(ap);
     119  }
     120  
     121  void
     122  f7 (int a1, int a2, int a3, int a4, int a5,
     123      int a6, int a7,
     124      char* format, ...)
     125  {
     126    va_list ap;
     127  
     128    va_start(ap, format);
     129    if (strlen (format) != 16 - 7)
     130      abort ();
     131    while (*format)
     132      if (*format++ != to_hex (va_arg (ap, int)))
     133        abort ();
     134    va_end(ap);
     135  }
     136  
     137  void
     138  f8 (int a1, int a2, int a3, int a4, int a5,
     139      int a6, int a7, int a8,
     140      char* format, ...)
     141  {
     142    va_list ap;
     143  
     144    va_start(ap, format);
     145    if (strlen (format) != 16 - 8)
     146      abort ();
     147    while (*format)
     148      if (*format++ != to_hex (va_arg (ap, int)))
     149        abort ();
     150    va_end(ap);
     151  }
     152  
     153  void
     154  f9 (int a1, int a2, int a3, int a4, int a5,
     155       int a6, int a7, int a8, int a9,
     156       char* format, ...)
     157  {
     158    va_list ap;
     159  
     160    va_start(ap, format);
     161    if (strlen (format) != 16 - 9)
     162      abort ();
     163    while (*format)
     164      if (*format++ != to_hex (va_arg (ap, int)))
     165        abort ();
     166    va_end(ap);
     167  }
     168  
     169  void
     170  f10 (int a1, int a2, int a3, int a4, int a5,
     171       int a6, int a7, int a8, int a9, int a10,
     172       char* format, ...)
     173  {
     174    va_list ap;
     175  
     176    va_start(ap, format);
     177    if (strlen (format) != 16 - 10)
     178      abort ();
     179    while (*format)
     180      if (*format++ != to_hex (va_arg (ap, int)))
     181        abort ();
     182    va_end(ap);
     183  }
     184  
     185  void
     186  f11 (int a1, int a2, int a3, int a4, int a5,
     187       int a6, int a7, int a8, int a9, int a10,
     188       int a11,
     189       char* format, ...)
     190  {
     191    va_list ap;
     192  
     193    va_start(ap, format);
     194    if (strlen (format) != 16 - 11)
     195      abort ();
     196    while (*format)
     197      if (*format++ != to_hex (va_arg (ap, int)))
     198        abort ();
     199    va_end(ap);
     200  }
     201  
     202  void
     203  f12 (int a1, int a2, int a3, int a4, int a5,
     204       int a6, int a7, int a8, int a9, int a10,
     205       int a11, int a12,
     206       char* format, ...)
     207  {
     208    va_list ap;
     209  
     210    va_start(ap, format);
     211    if (strlen (format) != 16 - 12)
     212      abort ();
     213    while (*format)
     214      if (*format++ != to_hex (va_arg (ap, int)))
     215        abort ();
     216    va_end(ap);
     217  }
     218  
     219  void
     220  f13 (int a1, int a2, int a3, int a4, int a5,
     221       int a6, int a7, int a8, int a9, int a10,
     222       int a11, int a12, int a13,
     223       char* format, ...)
     224  {
     225    va_list ap;
     226  
     227    va_start(ap, format);
     228    if (strlen (format) != 16 - 13)
     229      abort ();
     230    while (*format)
     231      if (*format++ != to_hex (va_arg (ap, int)))
     232        abort ();
     233    va_end(ap);
     234  }
     235  
     236  void
     237  f14 (int a1, int a2, int a3, int a4, int a5,
     238       int a6, int a7, int a8, int a9, int a10,
     239       int a11, int a12, int a13, int a14,
     240       char* format, ...)
     241  {
     242    va_list ap;
     243  
     244    va_start(ap, format);
     245    if (strlen (format) != 16 - 14)
     246      abort ();
     247    while (*format)
     248      if (*format++ != to_hex (va_arg (ap, int)))
     249        abort ();
     250    va_end(ap);
     251  }
     252  
     253  void
     254  f15 (int a1, int a2, int a3, int a4, int a5,
     255       int a6, int a7, int a8, int a9, int a10,
     256       int a11, int a12, int a13, int a14, int a15,
     257       char* format, ...)
     258  {
     259    va_list ap;
     260  
     261    va_start(ap, format);
     262    if (strlen (format) != 16 - 15)
     263      abort ();
     264    while (*format)
     265      if (*format++ != to_hex (va_arg (ap, int)))
     266        abort ();
     267    va_end(ap);
     268  }
     269  
     270  main ()
     271  {
     272    char *f = "0123456789abcdef";
     273  
     274    f0 (f+0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
     275    f1 (0, f+1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
     276    f2 (0, 1, f+2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
     277    f3 (0, 1, 2, f+3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
     278    f4 (0, 1, 2, 3, f+4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
     279    f5 (0, 1, 2, 3, 4, f+5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
     280    f6 (0, 1, 2, 3, 4, 5, f+6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
     281    f7 (0, 1, 2, 3, 4, 5, 6, f+7, 7, 8, 9, 10, 11, 12, 13, 14, 15);
     282    f8 (0, 1, 2, 3, 4, 5, 6, 7, f+8, 8, 9, 10, 11, 12, 13, 14, 15);
     283    f9 (0, 1, 2, 3, 4, 5, 6, 7, 8, f+9, 9, 10, 11, 12, 13, 14, 15);
     284    f10 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, f+10, 10, 11, 12, 13, 14, 15);
     285    f11 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, f+11, 11, 12, 13, 14, 15);
     286    f12 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, f+12, 12, 13, 14, 15);
     287    f13 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, f+13, 13, 14, 15);
     288    f14 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, f+14, 14, 15);
     289    f15 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, f+15, 15);
     290  
     291    exit (0);
     292  }