1*a45ae5f8SJohn Marino /* Virtual tail call frames unwinder for GDB. 2*a45ae5f8SJohn Marino 3*a45ae5f8SJohn Marino Copyright (C) 2010-2012 Free Software Foundation, Inc. 4*a45ae5f8SJohn Marino 5*a45ae5f8SJohn Marino This file is part of GDB. 6*a45ae5f8SJohn Marino 7*a45ae5f8SJohn Marino This program is free software; you can redistribute it and/or modify 8*a45ae5f8SJohn Marino it under the terms of the GNU General Public License as published by 9*a45ae5f8SJohn Marino the Free Software Foundation; either version 3 of the License, or 10*a45ae5f8SJohn Marino (at your option) any later version. 11*a45ae5f8SJohn Marino 12*a45ae5f8SJohn Marino This program is distributed in the hope that it will be useful, 13*a45ae5f8SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of 14*a45ae5f8SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*a45ae5f8SJohn Marino GNU General Public License for more details. 16*a45ae5f8SJohn Marino 17*a45ae5f8SJohn Marino You should have received a copy of the GNU General Public License 18*a45ae5f8SJohn Marino along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19*a45ae5f8SJohn Marino 20*a45ae5f8SJohn Marino #include "defs.h" 21*a45ae5f8SJohn Marino #include "gdb_assert.h" 22*a45ae5f8SJohn Marino #include "frame.h" 23*a45ae5f8SJohn Marino #include "dwarf2-frame-tailcall.h" 24*a45ae5f8SJohn Marino #include "dwarf2loc.h" 25*a45ae5f8SJohn Marino #include "frame-unwind.h" 26*a45ae5f8SJohn Marino #include "block.h" 27*a45ae5f8SJohn Marino #include "hashtab.h" 28*a45ae5f8SJohn Marino #include "exceptions.h" 29*a45ae5f8SJohn Marino #include "gdbtypes.h" 30*a45ae5f8SJohn Marino #include "regcache.h" 31*a45ae5f8SJohn Marino #include "value.h" 32*a45ae5f8SJohn Marino #include "dwarf2-frame.h" 33*a45ae5f8SJohn Marino 34*a45ae5f8SJohn Marino /* Contains struct tailcall_cache indexed by next_bottom_frame. */ 35*a45ae5f8SJohn Marino static htab_t cache_htab; 36*a45ae5f8SJohn Marino 37*a45ae5f8SJohn Marino /* Associate structure of the unwinder to call_site_chain. Lifetime of this 38*a45ae5f8SJohn Marino structure is maintained by REFC decremented by dealloc_cache, all of them 39*a45ae5f8SJohn Marino get deleted during reinit_frame_cache. */ 40*a45ae5f8SJohn Marino struct tailcall_cache 41*a45ae5f8SJohn Marino { 42*a45ae5f8SJohn Marino /* It must be the first one of this struct. It is the furthest callee. */ 43*a45ae5f8SJohn Marino struct frame_info *next_bottom_frame; 44*a45ae5f8SJohn Marino 45*a45ae5f8SJohn Marino /* Reference count. The whole chain of virtual tail call frames shares one 46*a45ae5f8SJohn Marino tailcall_cache. */ 47*a45ae5f8SJohn Marino int refc; 48*a45ae5f8SJohn Marino 49*a45ae5f8SJohn Marino /* Associated found virtual taill call frames chain, it is never NULL. */ 50*a45ae5f8SJohn Marino struct call_site_chain *chain; 51*a45ae5f8SJohn Marino 52*a45ae5f8SJohn Marino /* Cached pretended_chain_levels result. */ 53*a45ae5f8SJohn Marino int chain_levels; 54*a45ae5f8SJohn Marino 55*a45ae5f8SJohn Marino /* Unwound PC from the top (caller) frame, as it is not contained 56*a45ae5f8SJohn Marino in CHAIN. */ 57*a45ae5f8SJohn Marino CORE_ADDR prev_pc; 58*a45ae5f8SJohn Marino 59*a45ae5f8SJohn Marino /* Compensate SP in caller frames appropriately. prev_sp and 60*a45ae5f8SJohn Marino entry_cfa_sp_offset are valid only if PREV_SP_P. PREV_SP is SP at the top 61*a45ae5f8SJohn Marino (caller) frame. ENTRY_CFA_SP_OFFSET is shift of SP in tail call frames 62*a45ae5f8SJohn Marino against next_bottom_frame SP. */ 63*a45ae5f8SJohn Marino unsigned prev_sp_p : 1; 64*a45ae5f8SJohn Marino CORE_ADDR prev_sp; 65*a45ae5f8SJohn Marino LONGEST entry_cfa_sp_offset; 66*a45ae5f8SJohn Marino }; 67*a45ae5f8SJohn Marino 68*a45ae5f8SJohn Marino /* hash_f for htab_create_alloc of cache_htab. */ 69*a45ae5f8SJohn Marino 70*a45ae5f8SJohn Marino static hashval_t 71*a45ae5f8SJohn Marino cache_hash (const void *arg) 72*a45ae5f8SJohn Marino { 73*a45ae5f8SJohn Marino const struct tailcall_cache *cache = arg; 74*a45ae5f8SJohn Marino 75*a45ae5f8SJohn Marino return htab_hash_pointer (cache->next_bottom_frame); 76*a45ae5f8SJohn Marino } 77*a45ae5f8SJohn Marino 78*a45ae5f8SJohn Marino /* eq_f for htab_create_alloc of cache_htab. */ 79*a45ae5f8SJohn Marino 80*a45ae5f8SJohn Marino static int 81*a45ae5f8SJohn Marino cache_eq (const void *arg1, const void *arg2) 82*a45ae5f8SJohn Marino { 83*a45ae5f8SJohn Marino const struct tailcall_cache *cache1 = arg1; 84*a45ae5f8SJohn Marino const struct tailcall_cache *cache2 = arg2; 85*a45ae5f8SJohn Marino 86*a45ae5f8SJohn Marino return cache1->next_bottom_frame == cache2->next_bottom_frame; 87*a45ae5f8SJohn Marino } 88*a45ae5f8SJohn Marino 89*a45ae5f8SJohn Marino /* Create new tailcall_cache for NEXT_BOTTOM_FRAME, NEXT_BOTTOM_FRAME must not 90*a45ae5f8SJohn Marino yet have been indexed by cache_htab. Caller holds one reference of the new 91*a45ae5f8SJohn Marino tailcall_cache. */ 92*a45ae5f8SJohn Marino 93*a45ae5f8SJohn Marino static struct tailcall_cache * 94*a45ae5f8SJohn Marino cache_new_ref1 (struct frame_info *next_bottom_frame) 95*a45ae5f8SJohn Marino { 96*a45ae5f8SJohn Marino struct tailcall_cache *cache; 97*a45ae5f8SJohn Marino void **slot; 98*a45ae5f8SJohn Marino 99*a45ae5f8SJohn Marino cache = xzalloc (sizeof (*cache)); 100*a45ae5f8SJohn Marino 101*a45ae5f8SJohn Marino cache->next_bottom_frame = next_bottom_frame; 102*a45ae5f8SJohn Marino cache->refc = 1; 103*a45ae5f8SJohn Marino 104*a45ae5f8SJohn Marino slot = htab_find_slot (cache_htab, cache, INSERT); 105*a45ae5f8SJohn Marino gdb_assert (*slot == NULL); 106*a45ae5f8SJohn Marino *slot = cache; 107*a45ae5f8SJohn Marino 108*a45ae5f8SJohn Marino return cache; 109*a45ae5f8SJohn Marino } 110*a45ae5f8SJohn Marino 111*a45ae5f8SJohn Marino /* Create new reference to CACHE. */ 112*a45ae5f8SJohn Marino 113*a45ae5f8SJohn Marino static void 114*a45ae5f8SJohn Marino cache_ref (struct tailcall_cache *cache) 115*a45ae5f8SJohn Marino { 116*a45ae5f8SJohn Marino gdb_assert (cache->refc > 0); 117*a45ae5f8SJohn Marino 118*a45ae5f8SJohn Marino cache->refc++; 119*a45ae5f8SJohn Marino } 120*a45ae5f8SJohn Marino 121*a45ae5f8SJohn Marino /* Drop reference to CACHE, possibly fully freeing it and unregistering it from 122*a45ae5f8SJohn Marino cache_htab. */ 123*a45ae5f8SJohn Marino 124*a45ae5f8SJohn Marino static void 125*a45ae5f8SJohn Marino cache_unref (struct tailcall_cache *cache) 126*a45ae5f8SJohn Marino { 127*a45ae5f8SJohn Marino gdb_assert (cache->refc > 0); 128*a45ae5f8SJohn Marino 129*a45ae5f8SJohn Marino if (!--cache->refc) 130*a45ae5f8SJohn Marino { 131*a45ae5f8SJohn Marino gdb_assert (htab_find_slot (cache_htab, cache, NO_INSERT) != NULL); 132*a45ae5f8SJohn Marino htab_remove_elt (cache_htab, cache); 133*a45ae5f8SJohn Marino 134*a45ae5f8SJohn Marino xfree (cache->chain); 135*a45ae5f8SJohn Marino xfree (cache); 136*a45ae5f8SJohn Marino } 137*a45ae5f8SJohn Marino } 138*a45ae5f8SJohn Marino 139*a45ae5f8SJohn Marino /* Return 1 if FI is a non-bottom (not the callee) tail call frame. Otherwise 140*a45ae5f8SJohn Marino return 0. */ 141*a45ae5f8SJohn Marino 142*a45ae5f8SJohn Marino static int 143*a45ae5f8SJohn Marino frame_is_tailcall (struct frame_info *fi) 144*a45ae5f8SJohn Marino { 145*a45ae5f8SJohn Marino return frame_unwinder_is (fi, &dwarf2_tailcall_frame_unwind); 146*a45ae5f8SJohn Marino } 147*a45ae5f8SJohn Marino 148*a45ae5f8SJohn Marino /* Try to find tailcall_cache in cache_htab if FI is a part of its virtual tail 149*a45ae5f8SJohn Marino call chain. Otherwise return NULL. No new reference is created. */ 150*a45ae5f8SJohn Marino 151*a45ae5f8SJohn Marino static struct tailcall_cache * 152*a45ae5f8SJohn Marino cache_find (struct frame_info *fi) 153*a45ae5f8SJohn Marino { 154*a45ae5f8SJohn Marino struct tailcall_cache *cache; 155*a45ae5f8SJohn Marino void **slot; 156*a45ae5f8SJohn Marino 157*a45ae5f8SJohn Marino while (frame_is_tailcall (fi)) 158*a45ae5f8SJohn Marino { 159*a45ae5f8SJohn Marino fi = get_next_frame (fi); 160*a45ae5f8SJohn Marino gdb_assert (fi != NULL); 161*a45ae5f8SJohn Marino } 162*a45ae5f8SJohn Marino 163*a45ae5f8SJohn Marino slot = htab_find_slot (cache_htab, &fi, NO_INSERT); 164*a45ae5f8SJohn Marino if (slot == NULL) 165*a45ae5f8SJohn Marino return NULL; 166*a45ae5f8SJohn Marino 167*a45ae5f8SJohn Marino cache = *slot; 168*a45ae5f8SJohn Marino gdb_assert (cache != NULL); 169*a45ae5f8SJohn Marino return cache; 170*a45ae5f8SJohn Marino } 171*a45ae5f8SJohn Marino 172*a45ae5f8SJohn Marino /* Number of virtual frames between THIS_FRAME and CACHE->NEXT_BOTTOM_FRAME. 173*a45ae5f8SJohn Marino If THIS_FRAME is CACHE-> NEXT_BOTTOM_FRAME return -1. */ 174*a45ae5f8SJohn Marino 175*a45ae5f8SJohn Marino static int 176*a45ae5f8SJohn Marino existing_next_levels (struct frame_info *this_frame, 177*a45ae5f8SJohn Marino struct tailcall_cache *cache) 178*a45ae5f8SJohn Marino { 179*a45ae5f8SJohn Marino int retval = (frame_relative_level (this_frame) 180*a45ae5f8SJohn Marino - frame_relative_level (cache->next_bottom_frame) - 1); 181*a45ae5f8SJohn Marino 182*a45ae5f8SJohn Marino gdb_assert (retval >= -1); 183*a45ae5f8SJohn Marino 184*a45ae5f8SJohn Marino return retval; 185*a45ae5f8SJohn Marino } 186*a45ae5f8SJohn Marino 187*a45ae5f8SJohn Marino /* The number of virtual tail call frames in CHAIN. With no virtual tail call 188*a45ae5f8SJohn Marino frames the function would return 0 (but CHAIN does not exist in such 189*a45ae5f8SJohn Marino case). */ 190*a45ae5f8SJohn Marino 191*a45ae5f8SJohn Marino static int 192*a45ae5f8SJohn Marino pretended_chain_levels (struct call_site_chain *chain) 193*a45ae5f8SJohn Marino { 194*a45ae5f8SJohn Marino int chain_levels; 195*a45ae5f8SJohn Marino 196*a45ae5f8SJohn Marino gdb_assert (chain != NULL); 197*a45ae5f8SJohn Marino 198*a45ae5f8SJohn Marino if (chain->callers == chain->length && chain->callees == chain->length) 199*a45ae5f8SJohn Marino return chain->length; 200*a45ae5f8SJohn Marino 201*a45ae5f8SJohn Marino chain_levels = chain->callers + chain->callees; 202*a45ae5f8SJohn Marino gdb_assert (chain_levels < chain->length); 203*a45ae5f8SJohn Marino 204*a45ae5f8SJohn Marino return chain_levels; 205*a45ae5f8SJohn Marino } 206*a45ae5f8SJohn Marino 207*a45ae5f8SJohn Marino /* Implementation of frame_this_id_ftype. THIS_CACHE must be already 208*a45ae5f8SJohn Marino initialized with tailcall_cache, THIS_FRAME must be a part of THIS_CACHE. 209*a45ae5f8SJohn Marino 210*a45ae5f8SJohn Marino Specific virtual tail call frames are tracked by INLINE_DEPTH. */ 211*a45ae5f8SJohn Marino 212*a45ae5f8SJohn Marino static void 213*a45ae5f8SJohn Marino tailcall_frame_this_id (struct frame_info *this_frame, void **this_cache, 214*a45ae5f8SJohn Marino struct frame_id *this_id) 215*a45ae5f8SJohn Marino { 216*a45ae5f8SJohn Marino struct tailcall_cache *cache = *this_cache; 217*a45ae5f8SJohn Marino struct frame_info *next_frame; 218*a45ae5f8SJohn Marino 219*a45ae5f8SJohn Marino /* Tail call does not make sense for a sentinel frame. */ 220*a45ae5f8SJohn Marino next_frame = get_next_frame (this_frame); 221*a45ae5f8SJohn Marino gdb_assert (next_frame != NULL); 222*a45ae5f8SJohn Marino 223*a45ae5f8SJohn Marino *this_id = get_frame_id (next_frame); 224*a45ae5f8SJohn Marino (*this_id).code_addr = get_frame_pc (this_frame); 225*a45ae5f8SJohn Marino (*this_id).code_addr_p = 1; 226*a45ae5f8SJohn Marino (*this_id).inline_depth = (cache->chain_levels 227*a45ae5f8SJohn Marino - existing_next_levels (this_frame, cache)); 228*a45ae5f8SJohn Marino gdb_assert ((*this_id).inline_depth > 0); 229*a45ae5f8SJohn Marino } 230*a45ae5f8SJohn Marino 231*a45ae5f8SJohn Marino /* Find PC to be unwound from THIS_FRAME. THIS_FRAME must be a part of 232*a45ae5f8SJohn Marino CACHE. */ 233*a45ae5f8SJohn Marino 234*a45ae5f8SJohn Marino static CORE_ADDR 235*a45ae5f8SJohn Marino pretend_pc (struct frame_info *this_frame, struct tailcall_cache *cache) 236*a45ae5f8SJohn Marino { 237*a45ae5f8SJohn Marino int next_levels = existing_next_levels (this_frame, cache); 238*a45ae5f8SJohn Marino struct call_site_chain *chain = cache->chain; 239*a45ae5f8SJohn Marino int caller_no; 240*a45ae5f8SJohn Marino 241*a45ae5f8SJohn Marino gdb_assert (chain != NULL); 242*a45ae5f8SJohn Marino 243*a45ae5f8SJohn Marino next_levels++; 244*a45ae5f8SJohn Marino gdb_assert (next_levels >= 0); 245*a45ae5f8SJohn Marino 246*a45ae5f8SJohn Marino if (next_levels < chain->callees) 247*a45ae5f8SJohn Marino return chain->call_site[chain->length - next_levels - 1]->pc; 248*a45ae5f8SJohn Marino next_levels -= chain->callees; 249*a45ae5f8SJohn Marino 250*a45ae5f8SJohn Marino /* Otherwise CHAIN->CALLEES are already covered by CHAIN->CALLERS. */ 251*a45ae5f8SJohn Marino if (chain->callees != chain->length) 252*a45ae5f8SJohn Marino { 253*a45ae5f8SJohn Marino if (next_levels < chain->callers) 254*a45ae5f8SJohn Marino return chain->call_site[chain->callers - next_levels - 1]->pc; 255*a45ae5f8SJohn Marino next_levels -= chain->callers; 256*a45ae5f8SJohn Marino } 257*a45ae5f8SJohn Marino 258*a45ae5f8SJohn Marino gdb_assert (next_levels == 0); 259*a45ae5f8SJohn Marino return cache->prev_pc; 260*a45ae5f8SJohn Marino } 261*a45ae5f8SJohn Marino 262*a45ae5f8SJohn Marino /* Implementation of frame_prev_register_ftype. If no specific register 263*a45ae5f8SJohn Marino override is supplied NULL is returned (this is incompatible with 264*a45ae5f8SJohn Marino frame_prev_register_ftype semantics). next_bottom_frame and tail call 265*a45ae5f8SJohn Marino frames unwind the NULL case differently. */ 266*a45ae5f8SJohn Marino 267*a45ae5f8SJohn Marino struct value * 268*a45ae5f8SJohn Marino dwarf2_tailcall_prev_register_first (struct frame_info *this_frame, 269*a45ae5f8SJohn Marino void **tailcall_cachep, int regnum) 270*a45ae5f8SJohn Marino { 271*a45ae5f8SJohn Marino struct gdbarch *this_gdbarch = get_frame_arch (this_frame); 272*a45ae5f8SJohn Marino struct tailcall_cache *cache = *tailcall_cachep; 273*a45ae5f8SJohn Marino CORE_ADDR addr; 274*a45ae5f8SJohn Marino 275*a45ae5f8SJohn Marino if (regnum == gdbarch_pc_regnum (this_gdbarch)) 276*a45ae5f8SJohn Marino addr = pretend_pc (this_frame, cache); 277*a45ae5f8SJohn Marino else if (cache->prev_sp_p && regnum == gdbarch_sp_regnum (this_gdbarch)) 278*a45ae5f8SJohn Marino { 279*a45ae5f8SJohn Marino int next_levels = existing_next_levels (this_frame, cache); 280*a45ae5f8SJohn Marino 281*a45ae5f8SJohn Marino if (next_levels == cache->chain_levels - 1) 282*a45ae5f8SJohn Marino addr = cache->prev_sp; 283*a45ae5f8SJohn Marino else 284*a45ae5f8SJohn Marino addr = dwarf2_frame_cfa (this_frame) - cache->entry_cfa_sp_offset; 285*a45ae5f8SJohn Marino } 286*a45ae5f8SJohn Marino else 287*a45ae5f8SJohn Marino return NULL; 288*a45ae5f8SJohn Marino 289*a45ae5f8SJohn Marino return frame_unwind_got_address (this_frame, regnum, addr); 290*a45ae5f8SJohn Marino } 291*a45ae5f8SJohn Marino 292*a45ae5f8SJohn Marino /* Implementation of frame_prev_register_ftype for tail call frames. Register 293*a45ae5f8SJohn Marino set of virtual tail call frames is assumed to be the one of the top (caller) 294*a45ae5f8SJohn Marino frame - assume unchanged register value for NULL from 295*a45ae5f8SJohn Marino dwarf2_tailcall_prev_register_first. */ 296*a45ae5f8SJohn Marino 297*a45ae5f8SJohn Marino static struct value * 298*a45ae5f8SJohn Marino tailcall_frame_prev_register (struct frame_info *this_frame, 299*a45ae5f8SJohn Marino void **this_cache, int regnum) 300*a45ae5f8SJohn Marino { 301*a45ae5f8SJohn Marino struct tailcall_cache *cache = *this_cache; 302*a45ae5f8SJohn Marino struct value *val; 303*a45ae5f8SJohn Marino 304*a45ae5f8SJohn Marino gdb_assert (this_frame != cache->next_bottom_frame); 305*a45ae5f8SJohn Marino 306*a45ae5f8SJohn Marino val = dwarf2_tailcall_prev_register_first (this_frame, this_cache, regnum); 307*a45ae5f8SJohn Marino if (val) 308*a45ae5f8SJohn Marino return val; 309*a45ae5f8SJohn Marino 310*a45ae5f8SJohn Marino return frame_unwind_got_register (this_frame, regnum, regnum); 311*a45ae5f8SJohn Marino } 312*a45ae5f8SJohn Marino 313*a45ae5f8SJohn Marino /* Implementation of frame_sniffer_ftype. It will never find a new chain, use 314*a45ae5f8SJohn Marino dwarf2_tailcall_sniffer_first for the bottom (callee) frame. It will find 315*a45ae5f8SJohn Marino all the predecessing virtual tail call frames, it will return false when 316*a45ae5f8SJohn Marino there exist no more tail call frames in this chain. */ 317*a45ae5f8SJohn Marino 318*a45ae5f8SJohn Marino static int 319*a45ae5f8SJohn Marino tailcall_frame_sniffer (const struct frame_unwind *self, 320*a45ae5f8SJohn Marino struct frame_info *this_frame, void **this_cache) 321*a45ae5f8SJohn Marino { 322*a45ae5f8SJohn Marino struct frame_info *next_frame; 323*a45ae5f8SJohn Marino int next_levels; 324*a45ae5f8SJohn Marino struct tailcall_cache *cache; 325*a45ae5f8SJohn Marino 326*a45ae5f8SJohn Marino /* Inner tail call element does not make sense for a sentinel frame. */ 327*a45ae5f8SJohn Marino next_frame = get_next_frame (this_frame); 328*a45ae5f8SJohn Marino if (next_frame == NULL) 329*a45ae5f8SJohn Marino return 0; 330*a45ae5f8SJohn Marino 331*a45ae5f8SJohn Marino cache = cache_find (next_frame); 332*a45ae5f8SJohn Marino if (cache == NULL) 333*a45ae5f8SJohn Marino return 0; 334*a45ae5f8SJohn Marino 335*a45ae5f8SJohn Marino cache_ref (cache); 336*a45ae5f8SJohn Marino 337*a45ae5f8SJohn Marino next_levels = existing_next_levels (this_frame, cache); 338*a45ae5f8SJohn Marino 339*a45ae5f8SJohn Marino /* NEXT_LEVELS is -1 only in dwarf2_tailcall_sniffer_first. */ 340*a45ae5f8SJohn Marino gdb_assert (next_levels >= 0); 341*a45ae5f8SJohn Marino gdb_assert (next_levels <= cache->chain_levels); 342*a45ae5f8SJohn Marino 343*a45ae5f8SJohn Marino if (next_levels == cache->chain_levels) 344*a45ae5f8SJohn Marino { 345*a45ae5f8SJohn Marino cache_unref (cache); 346*a45ae5f8SJohn Marino return 0; 347*a45ae5f8SJohn Marino } 348*a45ae5f8SJohn Marino 349*a45ae5f8SJohn Marino *this_cache = cache; 350*a45ae5f8SJohn Marino return 1; 351*a45ae5f8SJohn Marino } 352*a45ae5f8SJohn Marino 353*a45ae5f8SJohn Marino /* The initial "sniffer" whether THIS_FRAME is a bottom (callee) frame of a new 354*a45ae5f8SJohn Marino chain to create. Keep TAILCALL_CACHEP NULL if it did not find any chain, 355*a45ae5f8SJohn Marino initialize it otherwise. No tail call chain is created if there are no 356*a45ae5f8SJohn Marino unambiguous virtual tail call frames to report. 357*a45ae5f8SJohn Marino 358*a45ae5f8SJohn Marino ENTRY_CFA_SP_OFFSETP is NULL if no special SP handling is possible, 359*a45ae5f8SJohn Marino otherwise *ENTRY_CFA_SP_OFFSETP is the number of bytes to subtract from tail 360*a45ae5f8SJohn Marino call frames frame base to get the SP value there - to simulate return 361*a45ae5f8SJohn Marino address pushed on the stack. */ 362*a45ae5f8SJohn Marino 363*a45ae5f8SJohn Marino void 364*a45ae5f8SJohn Marino dwarf2_tailcall_sniffer_first (struct frame_info *this_frame, 365*a45ae5f8SJohn Marino void **tailcall_cachep, 366*a45ae5f8SJohn Marino const LONGEST *entry_cfa_sp_offsetp) 367*a45ae5f8SJohn Marino { 368*a45ae5f8SJohn Marino CORE_ADDR prev_pc = 0, prev_sp = 0; /* GCC warning. */ 369*a45ae5f8SJohn Marino int prev_sp_p = 0; 370*a45ae5f8SJohn Marino CORE_ADDR this_pc, pc; 371*a45ae5f8SJohn Marino struct gdbarch *prev_gdbarch; 372*a45ae5f8SJohn Marino struct call_site_chain *chain = NULL; 373*a45ae5f8SJohn Marino struct frame_info *fi; 374*a45ae5f8SJohn Marino struct tailcall_cache *cache; 375*a45ae5f8SJohn Marino volatile struct gdb_exception except; 376*a45ae5f8SJohn Marino 377*a45ae5f8SJohn Marino gdb_assert (*tailcall_cachep == NULL); 378*a45ae5f8SJohn Marino 379*a45ae5f8SJohn Marino this_pc = get_frame_pc (this_frame); 380*a45ae5f8SJohn Marino 381*a45ae5f8SJohn Marino /* Catch any unwinding errors. */ 382*a45ae5f8SJohn Marino TRY_CATCH (except, RETURN_MASK_ERROR) 383*a45ae5f8SJohn Marino { 384*a45ae5f8SJohn Marino int sp_regnum; 385*a45ae5f8SJohn Marino 386*a45ae5f8SJohn Marino prev_gdbarch = frame_unwind_arch (this_frame); 387*a45ae5f8SJohn Marino 388*a45ae5f8SJohn Marino /* Simulate frame_unwind_pc without setting this_frame->prev_pc.p. */ 389*a45ae5f8SJohn Marino prev_pc = gdbarch_unwind_pc (prev_gdbarch, this_frame); 390*a45ae5f8SJohn Marino 391*a45ae5f8SJohn Marino /* call_site_find_chain can throw an exception. */ 392*a45ae5f8SJohn Marino chain = call_site_find_chain (prev_gdbarch, prev_pc, this_pc); 393*a45ae5f8SJohn Marino 394*a45ae5f8SJohn Marino if (entry_cfa_sp_offsetp == NULL) 395*a45ae5f8SJohn Marino break; 396*a45ae5f8SJohn Marino sp_regnum = gdbarch_sp_regnum (prev_gdbarch); 397*a45ae5f8SJohn Marino if (sp_regnum == -1) 398*a45ae5f8SJohn Marino break; 399*a45ae5f8SJohn Marino prev_sp = frame_unwind_register_unsigned (this_frame, sp_regnum); 400*a45ae5f8SJohn Marino prev_sp_p = 1; 401*a45ae5f8SJohn Marino } 402*a45ae5f8SJohn Marino if (except.reason < 0) 403*a45ae5f8SJohn Marino { 404*a45ae5f8SJohn Marino if (entry_values_debug) 405*a45ae5f8SJohn Marino exception_print (gdb_stdout, except); 406*a45ae5f8SJohn Marino return; 407*a45ae5f8SJohn Marino } 408*a45ae5f8SJohn Marino 409*a45ae5f8SJohn Marino /* Ambiguous unwind or unambiguous unwind verified as matching. */ 410*a45ae5f8SJohn Marino if (chain == NULL || chain->length == 0) 411*a45ae5f8SJohn Marino { 412*a45ae5f8SJohn Marino xfree (chain); 413*a45ae5f8SJohn Marino return; 414*a45ae5f8SJohn Marino } 415*a45ae5f8SJohn Marino 416*a45ae5f8SJohn Marino cache = cache_new_ref1 (this_frame); 417*a45ae5f8SJohn Marino *tailcall_cachep = cache; 418*a45ae5f8SJohn Marino cache->chain = chain; 419*a45ae5f8SJohn Marino cache->prev_pc = prev_pc; 420*a45ae5f8SJohn Marino cache->chain_levels = pretended_chain_levels (chain); 421*a45ae5f8SJohn Marino cache->prev_sp_p = prev_sp_p; 422*a45ae5f8SJohn Marino if (cache->prev_sp_p) 423*a45ae5f8SJohn Marino { 424*a45ae5f8SJohn Marino cache->prev_sp = prev_sp; 425*a45ae5f8SJohn Marino cache->entry_cfa_sp_offset = *entry_cfa_sp_offsetp; 426*a45ae5f8SJohn Marino } 427*a45ae5f8SJohn Marino gdb_assert (cache->chain_levels > 0); 428*a45ae5f8SJohn Marino } 429*a45ae5f8SJohn Marino 430*a45ae5f8SJohn Marino /* Implementation of frame_dealloc_cache_ftype. It can be called even for the 431*a45ae5f8SJohn Marino bottom chain frame from dwarf2_frame_dealloc_cache which is not a real 432*a45ae5f8SJohn Marino TAILCALL_FRAME. */ 433*a45ae5f8SJohn Marino 434*a45ae5f8SJohn Marino static void 435*a45ae5f8SJohn Marino tailcall_frame_dealloc_cache (struct frame_info *self, void *this_cache) 436*a45ae5f8SJohn Marino { 437*a45ae5f8SJohn Marino struct tailcall_cache *cache = this_cache; 438*a45ae5f8SJohn Marino 439*a45ae5f8SJohn Marino cache_unref (cache); 440*a45ae5f8SJohn Marino } 441*a45ae5f8SJohn Marino 442*a45ae5f8SJohn Marino /* Implementation of frame_prev_arch_ftype. We assume all the virtual tail 443*a45ae5f8SJohn Marino call frames have gdbarch of the bottom (callee) frame. */ 444*a45ae5f8SJohn Marino 445*a45ae5f8SJohn Marino static struct gdbarch * 446*a45ae5f8SJohn Marino tailcall_frame_prev_arch (struct frame_info *this_frame, 447*a45ae5f8SJohn Marino void **this_prologue_cache) 448*a45ae5f8SJohn Marino { 449*a45ae5f8SJohn Marino struct tailcall_cache *cache = *this_prologue_cache; 450*a45ae5f8SJohn Marino 451*a45ae5f8SJohn Marino return get_frame_arch (cache->next_bottom_frame); 452*a45ae5f8SJohn Marino } 453*a45ae5f8SJohn Marino 454*a45ae5f8SJohn Marino /* Virtual tail call frame unwinder if dwarf2_tailcall_sniffer_first finds 455*a45ae5f8SJohn Marino a chain to create. */ 456*a45ae5f8SJohn Marino 457*a45ae5f8SJohn Marino const struct frame_unwind dwarf2_tailcall_frame_unwind = 458*a45ae5f8SJohn Marino { 459*a45ae5f8SJohn Marino TAILCALL_FRAME, 460*a45ae5f8SJohn Marino default_frame_unwind_stop_reason, 461*a45ae5f8SJohn Marino tailcall_frame_this_id, 462*a45ae5f8SJohn Marino tailcall_frame_prev_register, 463*a45ae5f8SJohn Marino NULL, 464*a45ae5f8SJohn Marino tailcall_frame_sniffer, 465*a45ae5f8SJohn Marino tailcall_frame_dealloc_cache, 466*a45ae5f8SJohn Marino tailcall_frame_prev_arch 467*a45ae5f8SJohn Marino }; 468*a45ae5f8SJohn Marino 469*a45ae5f8SJohn Marino /* Provide a prototype to silence -Wmissing-prototypes. */ 470*a45ae5f8SJohn Marino extern initialize_file_ftype _initialize_tailcall_frame; 471*a45ae5f8SJohn Marino 472*a45ae5f8SJohn Marino void 473*a45ae5f8SJohn Marino _initialize_tailcall_frame (void) 474*a45ae5f8SJohn Marino { 475*a45ae5f8SJohn Marino cache_htab = htab_create_alloc (50, cache_hash, cache_eq, NULL, xcalloc, 476*a45ae5f8SJohn Marino xfree); 477*a45ae5f8SJohn Marino } 478