195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm/* libunwind - a platform-independent unwind library
295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm   Copyright (C) 2004 Hewlett-Packard Co
395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmThis file is part of libunwind.
695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmCopyright (c) 2002 Hewlett-Packard Co.
895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining
1095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidma copy of this software and associated documentation files (the
1195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm"Software"), to deal in the Software without restriction, including
1295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish,
1395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to
1495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to
1595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmthe following conditions:
1695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
1795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmThe above copyright notice and this permission notice shall be
1895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmincluded in all copies or substantial portions of the Software.
1995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
2095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
2395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
2495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
2795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
2895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm/* This test simply verifies that unw_init_remote() can be used in
2995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm   lieu of unw_init_local().  This was broken for a while on ia64.  */
3095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
3195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#ifdef HAVE_CONFIG_H
3295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm# include "config.h"
3395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#endif
3495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
356b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantala#include "compiler.h"
366b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantala
3795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#include <stdio.h>
3895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#include <stdlib.h>
3995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#include <string.h>
4095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#include <libunwind.h>
4195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
4295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#define panic(args...)				\
4395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	{ fprintf (stderr, args); exit (-1); }
4495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
4595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmint verbose;
4695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
4795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmstatic int
4895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmdo_backtrace (void)
4995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm{
5095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  char buf[512], name[256];
5195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  unw_word_t ip, sp, off;
5295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  unw_cursor_t cursor;
5395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  unw_context_t uc;
5495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  int ret;
5595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
5695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  unw_getcontext (&uc);
5795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  if (unw_init_remote (&cursor, unw_local_addr_space, &uc) < 0)
5895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm    panic ("unw_init_remote failed!\n");
5995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
6095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  do
6195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm    {
6295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm      unw_get_reg (&cursor, UNW_REG_IP, &ip);
6395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm      unw_get_reg (&cursor, UNW_REG_SP, &sp);
6495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm      buf[0] = '\0';
6595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm      if (unw_get_proc_name (&cursor, name, sizeof (name), &off) == 0)
6695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	{
6795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	  if (off)
6895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	    snprintf (buf, sizeof (buf), "<%s+0x%lx>", name, (long) off);
6995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	  else
7095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	    snprintf (buf, sizeof (buf), "<%s>", name);
7195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	}
7295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm      if (verbose)
7395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	printf ("%016lx %-32s (sp=%016lx)\n", (long) ip, buf, (long) sp);
7495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
7595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm      ret = unw_step (&cursor);
7695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm      if (ret < 0)
7795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	{
7895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	  unw_get_reg (&cursor, UNW_REG_IP, &ip);
7995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	  printf ("FAILURE: unw_step() returned %d for ip=%lx\n",
8095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm		  ret, (long) ip);
8195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	  return -1;
8295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm	}
8395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm    }
8495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  while (ret > 0);
8595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
8695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  return 0;
8795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm}
8895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
8995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmstatic int
9095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmfoo (void)
9195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm{
9295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  return do_backtrace ();
9395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm}
9495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
9595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmint
966b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantalamain (int argc, char **argv UNUSED)
9795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm{
9895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  verbose = (argc > 1);
9995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm
10095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  if (verbose)
10195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm    printf ("Normal backtrace:\n");
10295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm  return foo ();
10395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm}
104