mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-11-22 15:47:37 +01:00
(Logical change 1.95)
This commit is contained in:
parent
b36317df37
commit
9339de49da
1 changed files with 109 additions and 0 deletions
|
@ -0,0 +1,109 @@
|
|||
/* This test program checks whether proc_info lookup failures are
|
||||
cached. They must NOT be cached because it could otherwise turn
|
||||
temporary failures into permanent ones. Furthermore, we allow apps
|
||||
to return -UNW_ESTOPUNWIND to terminate unwinding (though this
|
||||
feature is deprecated and dynamic unwind info should be used
|
||||
instead). */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <libunwind.h>
|
||||
|
||||
int errors;
|
||||
|
||||
#define panic(args...) \
|
||||
{ ++errors; fprintf (stderr, args); return -1; }
|
||||
|
||||
static int
|
||||
find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pip,
|
||||
int need_unwind_info, void *arg)
|
||||
{
|
||||
return -UNW_ESTOPUNWIND;
|
||||
}
|
||||
|
||||
static int
|
||||
access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *valp,
|
||||
int write, void *arg)
|
||||
{
|
||||
if (!write)
|
||||
*valp = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
access_reg (unw_addr_space_t as, unw_regnum_t regnum, unw_word_t *valp,
|
||||
int write, void *arg)
|
||||
{
|
||||
if (!write)
|
||||
*valp = 32;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
access_fpreg (unw_addr_space_t as, unw_regnum_t regnum, unw_fpreg_t *valp,
|
||||
int write, void *arg)
|
||||
{
|
||||
if (!write)
|
||||
memset (valp, 0, sizeof (valp));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dilap, void *arg)
|
||||
{
|
||||
return -UNW_ENOINFO;
|
||||
}
|
||||
|
||||
static int
|
||||
nop (void)
|
||||
{
|
||||
panic ("nop() got called!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
unw_accessors_t acc;
|
||||
unw_addr_space_t as;
|
||||
int ret, verbose = 0;
|
||||
unw_cursor_t c;
|
||||
|
||||
if (argc > 1 && strcmp (argv[0], "-v") == 0)
|
||||
verbose = 1;
|
||||
|
||||
memset (&acc, 0, sizeof (acc));
|
||||
acc.find_proc_info = find_proc_info;
|
||||
acc.put_unwind_info = (void *) nop;
|
||||
acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
|
||||
acc.access_mem = access_mem;
|
||||
acc.access_reg = access_reg;
|
||||
acc.access_fpreg = access_fpreg;
|
||||
acc.resume = (void *) nop;
|
||||
acc.get_proc_name = (void *) nop;
|
||||
|
||||
as = unw_create_addr_space (&acc, 0);
|
||||
if (!as)
|
||||
panic ("unw_create_addr_space() failed\n");
|
||||
|
||||
unw_set_caching_policy (as, UNW_CACHE_GLOBAL);
|
||||
|
||||
ret = unw_init_remote (&c, as, NULL);
|
||||
if (ret < 0)
|
||||
panic ("unw_init_remote() returned %d instead of 0\n", ret);
|
||||
|
||||
ret = unw_step (&c);
|
||||
if (ret != -UNW_ESTOPUNWIND)
|
||||
panic ("First call to unw_step() returned %d instead of %d\n",
|
||||
ret, -UNW_ESTOPUNWIND);
|
||||
|
||||
ret = unw_step (&c);
|
||||
if (ret != -UNW_ESTOPUNWIND)
|
||||
panic ("Second call to unw_step() returned %d instead of %d\n",
|
||||
ret, -UNW_ESTOPUNWIND);
|
||||
|
||||
if (verbose)
|
||||
printf ("SUCCESS\n");
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue