mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2025-01-25 01:30:30 +01:00
Remove next field from dwarf_reg_state. Create new struct
that includes next field and dwarf_reg_state, and use that strictly for stack push/pop in run_cfi_program.
This commit is contained in:
parent
bfb246a499
commit
a7c65f5c3e
3 changed files with 15 additions and 9 deletions
|
@ -258,13 +258,19 @@ dwarf_save_loc_t;
|
||||||
|
|
||||||
typedef struct dwarf_reg_state
|
typedef struct dwarf_reg_state
|
||||||
{
|
{
|
||||||
struct dwarf_reg_state *next; /* for rs_stack */
|
|
||||||
dwarf_save_loc_t reg[DWARF_NUM_PRESERVED_REGS + 2];
|
dwarf_save_loc_t reg[DWARF_NUM_PRESERVED_REGS + 2];
|
||||||
unw_word_t ret_addr_column; /* indicates which column in the rule table represents return address */
|
unw_word_t ret_addr_column; /* indicates which column in the rule table represents return address */
|
||||||
unsigned short signal_frame : 1; /* optional machine-dependent signal info */
|
unsigned short signal_frame : 1; /* optional machine-dependent signal info */
|
||||||
}
|
}
|
||||||
dwarf_reg_state_t;
|
dwarf_reg_state_t;
|
||||||
|
|
||||||
|
typedef struct dwarf_stackable_reg_state
|
||||||
|
{
|
||||||
|
struct dwarf_stackable_reg_state *next; /* for rs_stack */
|
||||||
|
dwarf_reg_state_t state;
|
||||||
|
}
|
||||||
|
dwarf_stackable_reg_state_t;
|
||||||
|
|
||||||
typedef struct dwarf_reg_cache_entry
|
typedef struct dwarf_reg_cache_entry
|
||||||
{
|
{
|
||||||
unw_word_t ip; /* ip this rs is for */
|
unw_word_t ip; /* ip this rs is for */
|
||||||
|
|
|
@ -60,9 +60,9 @@ set_reg (dwarf_state_record_t *sr, unw_word_t regnum, dwarf_where_t where,
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
push_rstate_stack(dwarf_reg_state_t **rs_stack)
|
push_rstate_stack(dwarf_stackable_reg_state_t **rs_stack)
|
||||||
{
|
{
|
||||||
dwarf_reg_state_t *old_rs = *rs_stack;
|
dwarf_stackable_reg_state_t *old_rs = *rs_stack;
|
||||||
if (NULL == (*rs_stack = alloc_reg_state ()))
|
if (NULL == (*rs_stack = alloc_reg_state ()))
|
||||||
{
|
{
|
||||||
*rs_stack = old_rs;
|
*rs_stack = old_rs;
|
||||||
|
@ -73,9 +73,9 @@ push_rstate_stack(dwarf_reg_state_t **rs_stack)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
pop_rstate_stack(dwarf_reg_state_t **rs_stack)
|
pop_rstate_stack(dwarf_stackable_reg_state_t **rs_stack)
|
||||||
{
|
{
|
||||||
dwarf_reg_state_t *old_rs = *rs_stack;
|
dwarf_stackable_reg_state_t *old_rs = *rs_stack;
|
||||||
*rs_stack = old_rs->next;
|
*rs_stack = old_rs->next;
|
||||||
free_reg_state (old_rs);
|
free_reg_state (old_rs);
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ run_cfi_program (struct dwarf_cursor *c, dwarf_state_record_t *sr,
|
||||||
unw_word_t *addr, unw_word_t end_addr,
|
unw_word_t *addr, unw_word_t end_addr,
|
||||||
struct dwarf_cie_info *dci)
|
struct dwarf_cie_info *dci)
|
||||||
{
|
{
|
||||||
dwarf_reg_state_t *rs_stack = NULL;
|
dwarf_stackable_reg_state_t *rs_stack = NULL;
|
||||||
unw_addr_space_t as;
|
unw_addr_space_t as;
|
||||||
void *arg;
|
void *arg;
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ run_cfi_program (struct dwarf_cursor *c, dwarf_state_record_t *sr,
|
||||||
ret = -UNW_ENOMEM;
|
ret = -UNW_ENOMEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy (rs_stack->reg, sr->rs_current.reg, sizeof (rs_stack->reg));
|
memcpy (rs_stack->state.reg, sr->rs_current.reg, sizeof (rs_stack->state.reg));
|
||||||
Debug (15, "CFA_remember_state\n");
|
Debug (15, "CFA_remember_state\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -280,7 +280,7 @@ run_cfi_program (struct dwarf_cursor *c, dwarf_state_record_t *sr,
|
||||||
ret = -UNW_EINVAL;
|
ret = -UNW_EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy (&sr->rs_current.reg, &rs_stack->reg, sizeof (rs_stack->reg));
|
memcpy (&sr->rs_current.reg, &rs_stack->state.reg, sizeof (rs_stack->state.reg));
|
||||||
pop_rstate_stack(&rs_stack);
|
pop_rstate_stack(&rs_stack);
|
||||||
Debug (15, "CFA_restore_state\n");
|
Debug (15, "CFA_restore_state\n");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -31,7 +31,7 @@ HIDDEN struct mempool dwarf_cie_info_pool;
|
||||||
HIDDEN int
|
HIDDEN int
|
||||||
dwarf_init (void)
|
dwarf_init (void)
|
||||||
{
|
{
|
||||||
mempool_init (&dwarf_reg_state_pool, sizeof (dwarf_reg_state_t), 0);
|
mempool_init (&dwarf_reg_state_pool, sizeof (dwarf_stackable_reg_state_t), 0);
|
||||||
mempool_init (&dwarf_cie_info_pool, sizeof (struct dwarf_cie_info), 0);
|
mempool_init (&dwarf_cie_info_pool, sizeof (struct dwarf_cie_info), 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue