From fef5de6c4558fddabac68a2bb1b66154d7f711be Mon Sep 17 00:00:00 2001 From: Doug Moore Date: Wed, 10 May 2017 21:26:02 -0500 Subject: [PATCH] Move ret_addr_column and signal_frame from dwarf_reg_state to dwarf_reg_cache_entry, leaving in dwarf_reg_state only what apply_reg_state needs. --- include/dwarf.h | 4 ++-- include/tdep-aarch64/libunwind_i.h | 4 ++-- include/tdep-arm/libunwind_i.h | 4 ++-- include/tdep-hppa/libunwind_i.h | 4 ++-- include/tdep-ia64/libunwind_i.h | 4 ++-- include/tdep-mips/libunwind_i.h | 4 ++-- include/tdep-ppc32/libunwind_i.h | 4 ++-- include/tdep-ppc64/libunwind_i.h | 4 ++-- include/tdep-sh/libunwind_i.h | 4 ++-- include/tdep-tilegx/libunwind_i.h | 4 ++-- include/tdep-x86/libunwind_i.h | 4 ++-- include/tdep-x86_64/libunwind_i.h | 9 ++++----- src/dwarf/Gparser.c | 22 ++++++++++------------ src/x86_64/Gos-linux.c | 10 +++++----- 14 files changed, 41 insertions(+), 44 deletions(-) diff --git a/include/dwarf.h b/include/dwarf.h index 2dac0986..fd060c69 100644 --- a/include/dwarf.h +++ b/include/dwarf.h @@ -259,8 +259,6 @@ dwarf_save_loc_t; typedef struct dwarf_reg_state { 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 */ - unsigned short signal_frame : 1; /* optional machine-dependent signal info */ } dwarf_reg_state_t; @@ -277,7 +275,9 @@ typedef struct dwarf_reg_cache_entry unsigned short lru_chain; /* used for least-recently-used chain */ unsigned short coll_chain; /* used for hash collisions */ unsigned short hint; /* hint for next rs to try (or -1) */ + unw_word_t ret_addr_column; /* indicates which column in the rule table represents return address */ unsigned short valid : 1; /* optional machine-dependent signal info */ + unsigned short signal_frame : 1; /* optional machine-dependent signal info */ } dwarf_reg_cache_entry_t; diff --git a/include/tdep-aarch64/libunwind_i.h b/include/tdep-aarch64/libunwind_i.h index ca26180d..b91273fa 100644 --- a/include/tdep-aarch64/libunwind_i.h +++ b/include/tdep-aarch64/libunwind_i.h @@ -273,8 +273,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame UNW_OBJ(tdep_stash_frame) #define tdep_trace UNW_OBJ(tdep_trace) diff --git a/include/tdep-arm/libunwind_i.h b/include/tdep-arm/libunwind_i.h index 21b8363f..9996b2f2 100644 --- a/include/tdep-arm/libunwind_i.h +++ b/include/tdep-arm/libunwind_i.h @@ -261,8 +261,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame UNW_OBJ(tdep_stash_frame) #define tdep_trace UNW_OBJ(tdep_trace) diff --git a/include/tdep-hppa/libunwind_i.h b/include/tdep-hppa/libunwind_i.h index 0f96b45d..72649aa3 100644 --- a/include/tdep-hppa/libunwind_i.h +++ b/include/tdep-hppa/libunwind_i.h @@ -236,8 +236,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame(c,rs) do {} while(0) #define tdep_trace(cur,addr,n) (-UNW_ENOINFO) diff --git a/include/tdep-ia64/libunwind_i.h b/include/tdep-ia64/libunwind_i.h index 2d9908ed..f2cf258e 100644 --- a/include/tdep-ia64/libunwind_i.h +++ b/include/tdep-ia64/libunwind_i.h @@ -230,8 +230,8 @@ struct ia64_global_unwind_state #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame(c,rs) do {} while(0) #define tdep_trace(cur,addr,n) (-UNW_ENOINFO) #define tdep_get_as(c) ((c)->as) diff --git a/include/tdep-mips/libunwind_i.h b/include/tdep-mips/libunwind_i.h index 56e0f3c0..3fe40c0c 100644 --- a/include/tdep-mips/libunwind_i.h +++ b/include/tdep-mips/libunwind_i.h @@ -289,8 +289,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame(c,rs) do {} while(0) #define tdep_trace(cur,addr,n) (-UNW_ENOINFO) diff --git a/include/tdep-ppc32/libunwind_i.h b/include/tdep-ppc32/libunwind_i.h index b1796bb8..4cf6d135 100644 --- a/include/tdep-ppc32/libunwind_i.h +++ b/include/tdep-ppc32/libunwind_i.h @@ -264,8 +264,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame(c,rs) do {} while(0) #define tdep_trace(cur,addr,n) (-UNW_ENOINFO) #define tdep_get_func_addr UNW_OBJ(get_func_addr) diff --git a/include/tdep-ppc64/libunwind_i.h b/include/tdep-ppc64/libunwind_i.h index 51cca9e9..975f3bb3 100644 --- a/include/tdep-ppc64/libunwind_i.h +++ b/include/tdep-ppc64/libunwind_i.h @@ -319,8 +319,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame(c,rs) do {} while(0) #define tdep_trace(cur,addr,n) (-UNW_ENOINFO) #define tdep_get_func_addr UNW_OBJ(get_func_addr) diff --git a/include/tdep-sh/libunwind_i.h b/include/tdep-sh/libunwind_i.h index 5e040894..8ced4910 100644 --- a/include/tdep-sh/libunwind_i.h +++ b/include/tdep-sh/libunwind_i.h @@ -237,8 +237,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame(c,rs) do {} while(0) #define tdep_trace(cur,addr,n) (-UNW_ENOINFO) diff --git a/include/tdep-tilegx/libunwind_i.h b/include/tdep-tilegx/libunwind_i.h index 66a3b2cb..4a598f84 100644 --- a/include/tdep-tilegx/libunwind_i.h +++ b/include/tdep-tilegx/libunwind_i.h @@ -216,8 +216,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame(c,rs) do {} while(0) #define tdep_trace(cur,addr,n) (-UNW_ENOINFO) diff --git a/include/tdep-x86/libunwind_i.h b/include/tdep-x86/libunwind_i.h index 10993c6f..5231189a 100644 --- a/include/tdep-x86/libunwind_i.h +++ b/include/tdep-x86/libunwind_i.h @@ -250,8 +250,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) #define tdep_access_reg UNW_OBJ(access_reg) #define tdep_access_fpreg UNW_OBJ(access_fpreg) #define tdep_fetch_frame(c,ip,n) do {} while(0) -#define tdep_cache_frame(c,rs) do {} while(0) -#define tdep_reuse_frame(c,rs) do {} while(0) +#define tdep_cache_frame(c) 0 +#define tdep_reuse_frame(c,frame) do {} while(0) #define tdep_stash_frame(c,rs) do {} while(0) #define tdep_trace(cur,addr,n) (-UNW_ENOINFO) diff --git a/include/tdep-x86_64/libunwind_i.h b/include/tdep-x86_64/libunwind_i.h index 73e3879d..283525c1 100644 --- a/include/tdep-x86_64/libunwind_i.h +++ b/include/tdep-x86_64/libunwind_i.h @@ -206,8 +206,8 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) # define tdep_reuse_frame UNW_OBJ(reuse_frame) #else # define tdep_fetch_frame(c,ip,n) do {} while(0) -# define tdep_cache_frame(c,rs) do {} while(0) -# define tdep_reuse_frame(c,rs) do {} while(0) +# define tdep_cache_frame(c) 0 +# define tdep_reuse_frame(c,frame) do {} while(0) #endif #define tdep_stash_frame UNW_OBJ(stash_frame) #define tdep_trace UNW_OBJ(tdep_trace) @@ -251,10 +251,9 @@ extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, #if __linux__ extern void tdep_fetch_frame (struct dwarf_cursor *c, unw_word_t ip, int need_unwind_info); -extern void tdep_cache_frame (struct dwarf_cursor *c, - struct dwarf_reg_state *rs); +extern int tdep_cache_frame (struct dwarf_cursor *c); extern void tdep_reuse_frame (struct dwarf_cursor *c, - struct dwarf_reg_state *rs); + int frame); extern void tdep_stash_frame (struct dwarf_cursor *c, struct dwarf_reg_state *rs); #endif diff --git a/src/dwarf/Gparser.c b/src/dwarf/Gparser.c index 3e36f9b2..72547902 100644 --- a/src/dwarf/Gparser.c +++ b/src/dwarf/Gparser.c @@ -668,7 +668,6 @@ rs_lookup (struct dwarf_rs_cache *cache, struct dwarf_cursor *c) static inline dwarf_reg_state_t * rs_new (struct dwarf_rs_cache *cache, struct dwarf_cursor * c) { - dwarf_reg_state_t *rs; unw_hash_index_t index; unsigned short head; @@ -702,12 +701,9 @@ rs_new (struct dwarf_rs_cache *cache, struct dwarf_cursor * c) cache->links[head].ip = c->ip; cache->links[head].valid = 1; - rs = cache->buckets + head; - rs->ret_addr_column = c->ret_addr_column; - rs->signal_frame = 0; - tdep_cache_frame (c, rs); - - return rs; + cache->links[head].ret_addr_column = c->ret_addr_column; + cache->links[head].signal_frame = tdep_cache_frame(c); + return cache->buckets + head; } static int @@ -887,8 +883,9 @@ find_reg_state (struct dwarf_cursor *c, dwarf_state_record_t *sr) (rs = rs_lookup(cache, c))) { /* update hint; no locking needed: single-word writes are atomic */ - c->ret_addr_column = rs->ret_addr_column; - c->use_prev_instr = ! rs->signal_frame; + unsigned short index = rs - cache->buckets; + c->ret_addr_column = cache->links[index].ret_addr_column; + c->use_prev_instr = ! cache->links[index].signal_frame; memcpy (&sr->rs_current, rs, sizeof (*rs)); } else @@ -902,16 +899,17 @@ find_reg_state (struct dwarf_cursor *c, dwarf_state_record_t *sr) { rs = rs_new (cache, c); cache->links[rs - cache->buckets].hint = 0; - memcpy(rs, &sr->rs_current, offsetof(struct dwarf_reg_state, ret_addr_column)); + memcpy(rs, &sr->rs_current, sizeof(*rs)); } } + unsigned short index = -1; if (cache) { put_rs_cache (c->as, cache, &saved_mask); if (rs) { - unsigned short index = rs - cache->buckets; + index = rs - cache->buckets; c->hint = cache->links[index].hint; cache->links[c->prev_rs].hint = index + 1; c->prev_rs = index; @@ -920,7 +918,7 @@ find_reg_state (struct dwarf_cursor *c, dwarf_state_record_t *sr) if (ret < 0) return ret; if (cache) - tdep_reuse_frame (c, rs); + tdep_reuse_frame (c, cache->links[index].signal_frame); return 0; } diff --git a/src/x86_64/Gos-linux.c b/src/x86_64/Gos-linux.c index 6f70d3ff..a4f80cad 100644 --- a/src/x86_64/Gos-linux.c +++ b/src/x86_64/Gos-linux.c @@ -47,21 +47,21 @@ tdep_fetch_frame (struct dwarf_cursor *dw, unw_word_t ip, int need_unwind_info) dw->ip, dw->cfa, c->sigcontext_format); } -HIDDEN void -tdep_cache_frame (struct dwarf_cursor *dw, struct dwarf_reg_state *rs) +HIDDEN int +tdep_cache_frame (struct dwarf_cursor *dw) { struct cursor *c = (struct cursor *) dw; - rs->signal_frame = c->sigcontext_format; Debug(5, "cache frame ip=0x%lx cfa=0x%lx format=%d\n", dw->ip, dw->cfa, c->sigcontext_format); + return c->sigcontext_format; } HIDDEN void -tdep_reuse_frame (struct dwarf_cursor *dw, struct dwarf_reg_state *rs) +tdep_reuse_frame (struct dwarf_cursor *dw, int frame) { struct cursor *c = (struct cursor *) dw; - c->sigcontext_format = rs->signal_frame; + c->sigcontext_format = frame; if (c->sigcontext_format == X86_64_SCF_LINUX_RT_SIGFRAME) { c->frame_info.frame_type = UNW_X86_64_FRAME_SIGRETURN;