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