1a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm/* libunwind - a platform-independent unwind library
2a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm   Copyright (C) 2002-2003 Hewlett-Packard Co
3a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
5a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmThis file is part of libunwind.
6a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
7a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmPermission is hereby granted, free of charge, to any person obtaining
8a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidma copy of this software and associated documentation files (the
9a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm"Software"), to deal in the Software without restriction, including
10a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmwithout limitation the rights to use, copy, modify, merge, publish,
11a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to
12a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmpermit persons to whom the Software is furnished to do so, subject to
13a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmthe following conditions:
14a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
15a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmThe above copyright notice and this permission notice shall be
16a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmincluded in all copies or substantial portions of the Software.
17a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
18a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
25a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
26a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm/* This file tests unwinding from a constructor from within an
27a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm   atexit() handler.  */
28a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
29a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#include <stdio.h>
30a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#include <stdlib.h>
31a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#include <unistd.h>
32a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
33a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#include <libunwind.h>
346b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantala#include "compiler.h"
35a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
36587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidmint verbose, errors;
37a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
38a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#define panic(args...)					\
39a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm	{ ++errors; fprintf (stderr, args); return; }
40a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
41a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmclass Test_Class {
42a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  public:
43a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  Test_Class (void);
44a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm};
45a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
46a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic Test_Class t;
47a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
48a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void
496470a67461bfea2334404368e295ad09ad9b21f4Tommi Rantalado_backtrace (void)
50a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
51a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  char name[128], off[32];
52a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_word_t ip, offset;
53a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_cursor_t cursor;
54a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_context_t uc;
55a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  int ret, count = 0;
56a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
57a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_getcontext (&uc);
58a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_init_local (&cursor, &uc);
59a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
60a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  do
61a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm    {
62a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      unw_get_reg (&cursor, UNW_REG_IP, &ip);
63a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      name[0] = '\0';
64a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      off[0] = '\0';
65a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      if (unw_get_proc_name (&cursor, name, sizeof (name), &offset) == 0
66ffbe29940e04461ad4916cd60fccf695e397bf45Tommi Rantala	  && offset > 0)
67a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm	snprintf (off, sizeof (off), "+0x%lx", (long) offset);
68587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm      if (verbose)
69587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm	printf ("  [%lx] <%s%s>\n", (long) ip, name, off);
70a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      if (++count > 32)
71a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm	panic ("FAILURE: didn't reach beginning of unwind-chain\n");
72a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm    }
73a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  while ((ret = unw_step (&cursor)) > 0);
74a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
75a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  if (ret < 0)
76a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm    panic ("FAILURE: unw_step() returned %d\n", ret);
77a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
78a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
79a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void
80a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmb (void)
81a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
826470a67461bfea2334404368e295ad09ad9b21f4Tommi Rantala  do_backtrace();
83a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
84a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
85a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void
86a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidma (void)
87a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
88587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm  if (verbose)
896470a67461bfea2334404368e295ad09ad9b21f4Tommi Rantala    printf ("do_backtrace() from atexit()-handler:\n");
90a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  b();
91a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  if (errors)
92a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm    abort ();	/* cannot portably call exit() from an atexit() handler */
93a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
94a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
95a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmTest_Class::Test_Class (void)
96a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
97587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm  if (verbose)
986470a67461bfea2334404368e295ad09ad9b21f4Tommi Rantala    printf ("do_backtrace() from constructor:\n");
99a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  b();
100a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
101a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
102a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmint
1036b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantalamain (int argc, char **argv UNUSED)
104a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
105587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm  verbose = argc > 1;
106a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  return atexit (a);
107a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
108