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