X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdwarf2-frame-tailcall.c;h=9c167c1d96fb261f6635c2acc524251fe2f7b58d;hb=991fb595e34598291a52b533fdc8005e1ead0799;hp=dd69d94a2a171ef993888acd57597cade3e285eb;hpb=ecd75fc8eed3bde86036141228074a20e55dcfc9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c index dd69d94a2a..9c167c1d96 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-2014 Free Software Foundation, Inc. + Copyright (C) 2010-2020 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,7 +370,6 @@ 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); @@ -379,7 +378,7 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame, this_pc = get_frame_address_in_block (this_frame); /* Catch any unwinding errors. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + try { int sp_regnum; @@ -391,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); @@ -434,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); } @@ -446,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); } @@ -466,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) {