X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdwarf2-frame-tailcall.c;h=1b614ad8f1a8d8bc989bd85601d2480b5417af79;hb=e46d79a76ea748165a3ecd1102dd10498d089a49;hp=b5f95c37349f890b8906c6a2b4ca612eb3cafdc1;hpb=28e7fd62340426746f9c896cbc40c5d374ec47aa;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c index b5f95c3734..1b614ad8f1 100644 --- a/gdb/dwarf2-frame-tailcall.c +++ b/gdb/dwarf2-frame-tailcall.c @@ -1,6 +1,6 @@ /* Virtual tail call frames unwinder for GDB. - Copyright (C) 2010-2013 Free Software Foundation, Inc. + Copyright (C) 2010-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -18,18 +18,17 @@ along with this program. If not, see . */ #include "defs.h" -#include "gdb_assert.h" #include "frame.h" #include "dwarf2-frame-tailcall.h" #include "dwarf2loc.h" #include "frame-unwind.h" #include "block.h" #include "hashtab.h" -#include "exceptions.h" #include "gdbtypes.h" #include "regcache.h" #include "value.h" #include "dwarf2-frame.h" +#include "gdbarch.h" /* Contains struct tailcall_cache indexed by next_bottom_frame. */ static htab_t cache_htab; @@ -46,7 +45,7 @@ struct tailcall_cache tailcall_cache. */ int refc; - /* Associated found virtual taill call frames chain, it is never NULL. */ + /* Associated found virtual tail call frames chain, it is never NULL. */ struct call_site_chain *chain; /* Cached pretended_chain_levels result. */ @@ -70,7 +69,7 @@ struct tailcall_cache static hashval_t cache_hash (const void *arg) { - const struct tailcall_cache *cache = arg; + const struct tailcall_cache *cache = (const struct tailcall_cache *) arg; return htab_hash_pointer (cache->next_bottom_frame); } @@ -80,8 +79,8 @@ cache_hash (const void *arg) static int cache_eq (const void *arg1, const void *arg2) { - const struct tailcall_cache *cache1 = arg1; - const struct tailcall_cache *cache2 = arg2; + const struct tailcall_cache *cache1 = (const struct tailcall_cache *) arg1; + const struct tailcall_cache *cache2 = (const struct tailcall_cache *) arg2; return cache1->next_bottom_frame == cache2->next_bottom_frame; } @@ -93,11 +92,9 @@ cache_eq (const void *arg1, const void *arg2) static struct tailcall_cache * cache_new_ref1 (struct frame_info *next_bottom_frame) { - struct tailcall_cache *cache; + struct tailcall_cache *cache = XCNEW (struct tailcall_cache); void **slot; - cache = xzalloc (sizeof (*cache)); - cache->next_bottom_frame = next_bottom_frame; cache->refc = 1; @@ -164,7 +161,7 @@ cache_find (struct frame_info *fi) if (slot == NULL) return NULL; - cache = *slot; + cache = (struct tailcall_cache *) *slot; gdb_assert (cache != NULL); return cache; } @@ -199,7 +196,7 @@ pretended_chain_levels (struct call_site_chain *chain) return chain->length; chain_levels = chain->callers + chain->callees; - gdb_assert (chain_levels < chain->length); + gdb_assert (chain_levels <= chain->length); return chain_levels; } @@ -213,7 +210,7 @@ static void tailcall_frame_this_id (struct frame_info *this_frame, void **this_cache, struct frame_id *this_id) { - struct tailcall_cache *cache = *this_cache; + struct tailcall_cache *cache = (struct tailcall_cache *) *this_cache; struct frame_info *next_frame; /* Tail call does not make sense for a sentinel frame. */ @@ -268,7 +265,7 @@ dwarf2_tailcall_prev_register_first (struct frame_info *this_frame, void **tailcall_cachep, int regnum) { struct gdbarch *this_gdbarch = get_frame_arch (this_frame); - struct tailcall_cache *cache = *tailcall_cachep; + struct tailcall_cache *cache = (struct tailcall_cache *) *tailcall_cachep; CORE_ADDR addr; if (regnum == gdbarch_pc_regnum (this_gdbarch)) @@ -297,7 +294,7 @@ static struct value * tailcall_frame_prev_register (struct frame_info *this_frame, void **this_cache, int regnum) { - struct tailcall_cache *cache = *this_cache; + struct tailcall_cache *cache = (struct tailcall_cache *) *this_cache; struct value *val; gdb_assert (this_frame != cache->next_bottom_frame); @@ -322,6 +319,9 @@ tailcall_frame_sniffer (const struct frame_unwind *self, int next_levels; struct tailcall_cache *cache; + if (!dwarf2_frame_unwinders_enabled_p) + return 0; + /* Inner tail call element does not make sense for a sentinel frame. */ next_frame = get_next_frame (this_frame); if (next_frame == NULL) @@ -370,14 +370,15 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame, struct gdbarch *prev_gdbarch; struct call_site_chain *chain = NULL; struct tailcall_cache *cache; - volatile struct gdb_exception except; gdb_assert (*tailcall_cachep == NULL); - this_pc = get_frame_pc (this_frame); + /* PC may be after the function if THIS_FRAME calls noreturn function, + get_frame_address_in_block will decrease it by 1 in such case. */ + this_pc = get_frame_address_in_block (this_frame); /* Catch any unwinding errors. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + try { int sp_regnum; @@ -389,15 +390,17 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame, /* call_site_find_chain can throw an exception. */ chain = call_site_find_chain (prev_gdbarch, prev_pc, this_pc); - if (entry_cfa_sp_offsetp == NULL) - break; - sp_regnum = gdbarch_sp_regnum (prev_gdbarch); - if (sp_regnum == -1) - break; - prev_sp = frame_unwind_register_unsigned (this_frame, sp_regnum); - prev_sp_p = 1; + if (entry_cfa_sp_offsetp != NULL) + { + sp_regnum = gdbarch_sp_regnum (prev_gdbarch); + if (sp_regnum != -1) + { + prev_sp = frame_unwind_register_unsigned (this_frame, sp_regnum); + prev_sp_p = 1; + } + } } - if (except.reason < 0) + catch (const gdb_exception_error &except) { if (entry_values_debug) exception_print (gdb_stdout, except); @@ -432,7 +435,7 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame, static void tailcall_frame_dealloc_cache (struct frame_info *self, void *this_cache) { - struct tailcall_cache *cache = this_cache; + struct tailcall_cache *cache = (struct tailcall_cache *) this_cache; cache_unref (cache); } @@ -444,7 +447,7 @@ static struct gdbarch * tailcall_frame_prev_arch (struct frame_info *this_frame, void **this_prologue_cache) { - struct tailcall_cache *cache = *this_prologue_cache; + struct tailcall_cache *cache = (struct tailcall_cache *) *this_prologue_cache; return get_frame_arch (cache->next_bottom_frame); } @@ -464,9 +467,6 @@ const struct frame_unwind dwarf2_tailcall_frame_unwind = tailcall_frame_prev_arch }; -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_tailcall_frame; - void _initialize_tailcall_frame (void) {