1be230add88815880a41f826ba22d4fcd96547459Tommi Rantala#define UNW_LOCAL_ONLY
28203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala#include <libunwind.h>
3e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantala#include "compiler.h"
4e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantala
5dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm#include <stdarg.h>
6dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm#include <stdio.h>
7dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm#include <stdlib.h>
8dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm#include <unistd.h>
9dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
108203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalaint ok;
118203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantalaint verbose;
12dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
138203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 3)
14e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalavoid a (int, ...) __attribute__((optimize(0)));
15e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalavoid b (void) __attribute__((optimize(0)));
16e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalavoid c (void) __attribute__((optimize(0)));
178203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala#endif
188203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
19e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalavoid NOINLINE
20dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidmb (void)
21dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm{
22dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  void *v[20];
23dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  int i, n;
24dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
258203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  n = unw_backtrace(v, 20);
268203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
278203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  /* Check that the number of addresses given by unw_backtrace() looks
288203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala   * reasonable. If the compiler inlined everything, then this check will also
298203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala   * break. */
308203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (n >= 7)
318203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    ok = 1;
328203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
338203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (verbose)
348203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    for (i = 0; i < n; ++i)
358203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala      printf ("[%d] %p\n", i, v[i]);
36dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm}
37dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
38e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalavoid NOINLINE
39dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidmc (void)
40dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm{
41dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    b ();
42dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm}
43dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
44e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalavoid NOINLINE
45dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidma (int d, ...)
46dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm{
47dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  switch (d)
48dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    {
49dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 5:
50dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      a (4, 2,4);
51dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      break;
52dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 4:
53dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      a (3, 1,3,5);
54dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      break;
55dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 3:
56dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      a (2, 11, 13, 17, 23);
57dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      break;
58dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 2:
59dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      a (1);
60dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      break;
61dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    case 1:
62dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm      c ();
63dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm    }
64dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm}
65dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm
66dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidmint
676b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantalamain (int argc, char **argv UNUSED)
68dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm{
698203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (argc > 1)
708203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    verbose = 1;
718203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
72dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  a (5, 3, 4, 5, 6);
738203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
748203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (!ok)
758203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    {
768203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala      fprintf (stderr, "FAILURE: expected deeper backtrace.\n");
778203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala      return 1;
788203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    }
798203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
808203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala  if (verbose)
818203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala    printf ("SUCCESS.\n");
828203c955c8bde94bba609d20abb39c576acf3e38Tommi Rantala
83dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm  return 0;
84dee2508b2c1390f4279acfc4215559bf9c4056f3mostang.com!davidm}
85