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