Gtest-init.cxx revision 587bba5c1f8491f852ef531d6266bec490a45f15
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>
34a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
35587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidmint verbose, errors;
36a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
37a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#define panic(args...)					\
38a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm	{ ++errors; fprintf (stderr, args); return; }
39a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
40a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmclass Test_Class {
41a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  public:
42a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  Test_Class (void);
43a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm};
44a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
45a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic Test_Class t;
46a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
47a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void
48a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmbacktrace (void)
49a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
50a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  char name[128], off[32];
51a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_word_t ip, offset;
52a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_cursor_t cursor;
53a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_context_t uc;
54a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  int ret, count = 0;
55a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
56a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_getcontext (&uc);
57a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  unw_init_local (&cursor, &uc);
58a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
59a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  do
60a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm    {
61a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      unw_get_reg (&cursor, UNW_REG_IP, &ip);
62a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      name[0] = '\0';
63a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      off[0] = '\0';
64a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      if (unw_get_proc_name (&cursor, name, sizeof (name), &offset) == 0
65a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm	  && off > 0)
66a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm	snprintf (off, sizeof (off), "+0x%lx", (long) offset);
67587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm      if (verbose)
68587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm	printf ("  [%lx] <%s%s>\n", (long) ip, name, off);
69a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm      if (++count > 32)
70a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm	panic ("FAILURE: didn't reach beginning of unwind-chain\n");
71a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm    }
72a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  while ((ret = unw_step (&cursor)) > 0);
73a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
74a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  if (ret < 0)
75a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm    panic ("FAILURE: unw_step() returned %d\n", ret);
76a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
77a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
78a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void
79a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmb (void)
80a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
81a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  backtrace();
82a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
83a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
84a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void
85a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidma (void)
86a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
87587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm  if (verbose)
88587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm    printf ("backtrace() from atexit()-handler:\n");
89a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  b();
90a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  if (errors)
91a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm    abort ();	/* cannot portably call exit() from an atexit() handler */
92a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
93a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
94a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmTest_Class::Test_Class (void)
95a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
96587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm  if (verbose)
97587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm    printf ("backtrace() from constructor:\n");
98a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  b();
99a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
100a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm
101a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmint
102a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmmain (int argc, char **argv)
103a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{
104587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm  verbose = argc > 1;
105a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm  return atexit (a);
106a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}
107