Ltest-varargs.c revision be230add88815880a41f826ba22d4fcd96547459
1be230add88815880a41f826ba22d4fcd96547459Tommi Rantala#define UNW_LOCAL_ONLY
28203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala#include <libunwind.h>
3dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm#include <stdarg.h>
4dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm#include <stdio.h>
5dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm#include <stdlib.h>
6dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm#include <unistd.h>
7dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
88203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalaint ok;
98203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalaint verbose;
10dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
118203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 3)
128203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalavoid a (int, ...) __attribute__((noinline, optimize(0)));
138203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalavoid b (void) __attribute__((noinline, optimize(0)));
148203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalavoid c (void) __attribute__((noinline, optimize(0)));
158203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala#endif
168203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
178203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalavoid
18dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidmb (void)
19dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm{
20dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  void *v[20];
21dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  int i, n;
22dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
238203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  n = unw_backtrace(v, 20);
248203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
258203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  /* Check that the number of addresses given by unw_backtrace() looks
268203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala   * reasonable. If the compiler inlined everything, then this check will also
278203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala   * break. */
288203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (n >= 7)
298203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    ok = 1;
308203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
318203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (verbose)
328203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    for (i = 0; i < n; ++i)
338203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala      printf ("[%d] %p\n", i, v[i]);
34dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm}
35dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
368203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalavoid
37dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidmc (void)
38dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm{
39dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    b ();
40dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm}
41dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
428203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalavoid
43dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidma (int d, ...)
44dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm{
45dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  switch (d)
46dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    {
47dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 5:
48dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      a (4, 2,4);
49dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      break;
50dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 4:
51dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      a (3, 1,3,5);
52dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      break;
53dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 3:
54dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      a (2, 11, 13, 17, 23);
55dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      break;
56dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 2:
57dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      a (1);
58dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      break;
59dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 1:
60dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      c ();
61dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    }
62dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm}
63dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
64dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidmint
658203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalamain (int argc, char **argv __attribute__((unused)))
66dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm{
678203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (argc > 1)
688203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    verbose = 1;
698203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
70dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  a (5, 3, 4, 5, 6);
718203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
728203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (!ok)
738203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    {
748203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala      fprintf (stderr, "FAILURE: expected deeper backtrace.\n");
758203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala      return 1;
768203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    }
778203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
788203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (verbose)
798203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    printf ("SUCCESS.\n");
808203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
81dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  return 0;
82dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm}
83